diff --git a/src/front/glsl/builtins.rs b/src/front/glsl/builtins.rs index ea56c54f7a..dedaf93dc1 100644 --- a/src/front/glsl/builtins.rs +++ b/src/front/glsl/builtins.rs @@ -306,7 +306,8 @@ pub fn inject_builtin( f, ) } - "texelFetch" => { + "texelFetch" | "texelFetchOffset" => { + let offset = "texelFetchOffset" == name; let f = |kind, dim, arrayed, multi, _shadow| { // Cube images aren't supported if let Dim::Cube = dim { @@ -322,7 +323,7 @@ pub fn inject_builtin( let dim_value = image_dims_to_coords_size(dim); let coordinates = make_coords_arg(dim_value + arrayed as usize, Sk::Sint); - let args = vec![ + let mut args = vec![ image, coordinates, TypeInner::Scalar { @@ -331,6 +332,10 @@ pub fn inject_builtin( }, ]; + if offset { + args.push(make_coords_arg(dim_value, Sk::Sint)); + } + declaration .overloads .push(module.add_builtin(args, MacroCall::ImageLoad { multi })) diff --git a/tests/in/glsl/samplers.frag b/tests/in/glsl/samplers.frag index 1a34216009..a1a438db9a 100644 --- a/tests/in/glsl/samplers.frag +++ b/tests/in/glsl/samplers.frag @@ -64,7 +64,7 @@ void testTex1D(in float coord) { c = textureProjOffset(sampler1D(tex1D, samp), vec2(coord, 6.0), 5, 2.0); c = textureProjOffset(sampler1D(tex1D, samp), vec4(coord, 0.0, 0.0, 6.0), 5, 2.0); c = texelFetch(sampler1D(tex1D, samp), int(coord), 3); - // c = texelFetchOffset(sampler1D(tex1D, samp), int(coord), 3, 5); + c = texelFetchOffset(sampler1D(tex1D, samp), int(coord), 3, 5); } #if HAS_1D_DEPTH_TEXTURES @@ -102,7 +102,7 @@ void testTex1DArray(in vec2 coord) { c = textureOffset(sampler1DArray(tex1DArray, samp), coord, 5); c = textureOffset(sampler1DArray(tex1DArray, samp), coord, 5, 2.0); c = texelFetch(sampler1DArray(tex1DArray, samp), ivec2(coord), 3); - // c = texelFetchOffset(sampler1DArray(tex1DArray, samp), ivec2(coord), 3, 5); + c = texelFetchOffset(sampler1DArray(tex1DArray, samp), ivec2(coord), 3, 5); } #if HAS_1D_DEPTH_TEXTURES @@ -147,7 +147,7 @@ void testTex2D(in vec2 coord) { c = textureProjOffset(sampler2D(tex2D, samp), vec3(coord, 6.0), ivec2(5), 2.0); c = textureProjOffset(sampler2D(tex2D, samp), vec4(coord, 0.0, 6.0), ivec2(5), 2.0); c = texelFetch(sampler2D(tex2D, samp), ivec2(coord), 3); - // c = texelFetchOffset(sampler2D(tex2D, samp), ivec2(coord), 3, ivec2(5)); + c = texelFetchOffset(sampler2D(tex2D, samp), ivec2(coord), 3, ivec2(5)); } void testTex2DShadow(vec2 coord) { @@ -183,7 +183,7 @@ void testTex2DArray(in vec3 coord) { c = textureOffset(sampler2DArray(tex2DArray, samp), coord, ivec2(5)); c = textureOffset(sampler2DArray(tex2DArray, samp), coord, ivec2(5), 2.0); c = texelFetch(sampler2DArray(tex2DArray, samp), ivec3(coord), 3); - // c = texelFetchOffset(sampler2DArray(tex2DArray, samp), ivec3(coord), 3, ivec2(5)); + c = texelFetchOffset(sampler2DArray(tex2DArray, samp), ivec3(coord), 3, ivec2(5)); } void testTex2DArrayShadow(in vec3 coord) { @@ -247,7 +247,7 @@ void testTex3D(in vec3 coord) { c = textureOffset(sampler3D(tex3D, samp), coord, ivec3(5)); c = textureOffset(sampler3D(tex3D, samp), coord, ivec3(5), 2.0); c = texelFetch(sampler3D(tex3D, samp), ivec3(coord), 3); - // c = texelFetchOffset(sampler3D(tex3D, samp), ivec3(coord), 3, ivec3(5)); + c = texelFetchOffset(sampler3D(tex3D, samp), ivec3(coord), 3, ivec3(5)); } void testTex2DMS(in vec2 coord) { diff --git a/tests/out/wgsl/samplers-frag.wgsl b/tests/out/wgsl/samplers-frag.wgsl index 3e5eb59551..3b967fe7a9 100644 --- a/tests/out/wgsl/samplers-frag.wgsl +++ b/tests/out/wgsl/samplers-frag.wgsl @@ -147,6 +147,10 @@ fn testTex1D(coord: f32) { let _e330 = coord_1; let _e333 = textureLoad(tex1D, i32(_e330), 3); c = _e333; + let _e334 = coord_1; + let _e338 = coord_1; + let _e342 = textureLoad(tex1D, i32(_e338), 3); + c = _e342; return; } @@ -188,6 +192,11 @@ fn testTex1DArray(coord_2: vec2) { let _e101 = vec2(_e100); let _e105 = textureLoad(tex1DArray, _e101.x, _e101.y, 3); c_1 = _e105; + let _e106 = coord_3; + let _e110 = coord_3; + let _e111 = vec2(_e110); + let _e116 = textureLoad(tex1DArray, _e111.x, _e111.y, 3); + c_1 = _e116; return; } @@ -307,6 +316,10 @@ fn testTex2D(coord_4: vec2) { let _e434 = coord_5; let _e437 = textureLoad(tex2D, vec2(_e434), 3); c_2 = _e437; + let _e438 = coord_5; + let _e443 = coord_5; + let _e448 = textureLoad(tex2D, vec2(_e443), 3); + c_2 = _e448; return; } @@ -425,6 +438,11 @@ fn testTex2DArray(coord_8: vec3) { let _e119 = vec3(_e118); let _e123 = textureLoad(tex2DArray, _e119.xy, _e119.z, 3); c_3 = _e123; + let _e124 = coord_9; + let _e129 = coord_9; + let _e130 = vec3(_e129); + let _e136 = textureLoad(tex2DArray, _e130.xy, _e130.z, 3); + c_3 = _e136; return; } @@ -619,6 +637,10 @@ fn testTex3D(coord_20: vec3) { let _e266 = coord_21; let _e269 = textureLoad(tex3D, vec3(_e266), 3); c_6 = _e269; + let _e270 = coord_21; + let _e275 = coord_21; + let _e280 = textureLoad(tex3D, vec3(_e275), 3); + c_6 = _e280; return; }