From 8c98c2dddbf75eba14c8abdae0632b02d19a8109 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 20 Nov 2025 19:38:46 +0000 Subject: [PATCH 1/5] Initial plan From 525cd371d47811edfaa640377d418b2362cea8c2 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 20 Nov 2025 20:10:21 +0000 Subject: [PATCH 2/5] Add GLSL support for SampleCmpBias and SampleCmpGrad, fix TODOs in glsl.meta.slang Co-authored-by: davli-nv <219758217+davli-nv@users.noreply.github.com> --- source/slang/glsl.meta.slang | 47 +++++++++++++++--------------------- source/slang/hlsl.meta.slang | 16 +++++++++--- 2 files changed, 31 insertions(+), 32 deletions(-) diff --git a/source/slang/glsl.meta.slang b/source/slang/glsl.meta.slang index 1096004de5..a6ba030935 100644 --- a/source/slang/glsl.meta.slang +++ b/source/slang/glsl.meta.slang @@ -1913,7 +1913,7 @@ public float texture(sampler1DShadow sampler, vec3 p) } [ForceInline] -[require(glsl_hlsl_spirv, texture_shadowlod)] +[require(glsl_hlsl_spirv, texture_shadowgrad)] public float texture(sampler1DShadow sampler, vec3 p, float bias) { float location = p.x; @@ -1932,8 +1932,7 @@ public float texture(sampler1DShadow sampler, vec3 p, float bias) result:$$float = OpImageSampleDrefImplicitLod $sampler $location $compareValue Bias $bias; }; default: - // TODO: Need to apply bias - return sampler.SampleCmp(location, compareValue); + return sampler.SampleCmpBias(location, compareValue, bias); } } @@ -1948,7 +1947,7 @@ public float texture(sampler2DShadow sampler, vec3 p) } [ForceInline] -[require(glsl_hlsl_spirv, texture_shadowlod)] +[require(glsl_hlsl_spirv, texture_shadowgrad)] public float texture(sampler2DShadow sampler, vec3 p, float bias) { vec2 location = p.xy; @@ -1967,8 +1966,7 @@ public float texture(sampler2DShadow sampler, vec3 p, float bias) result:$$float = OpImageSampleDrefImplicitLod $sampler $location $compareValue Bias $bias; }; default: - // TODO: Need to apply bias - return sampler.SampleCmp(location, compareValue); + return sampler.SampleCmpBias(location, compareValue, bias); } } @@ -1982,7 +1980,7 @@ public float texture(samplerCubeShadow sampler, vec4 p) return sampler.SampleCmpLevelZero(p.xyz, p.w); } -[require(glsl_hlsl_spirv, texture_shadowlod)] +[require(glsl_hlsl_spirv, texture_shadowgrad)] [ForceInline] public float texture(samplerCubeShadow sampler, vec4 p, float bias) { @@ -2002,8 +2000,7 @@ public float texture(samplerCubeShadow sampler, vec4 p, float bias) result:$$float = OpImageSampleDrefImplicitLod $sampler $location $compareValue Bias $bias; }; default: - // TODO: Need to apply bias - return sampler.SampleCmp(location, compareValue); + return sampler.SampleCmpBias(location, compareValue, bias); } } @@ -2018,7 +2015,7 @@ public float texture(sampler1DArrayShadow sampler, vec3 p) } [ForceInline] -[require(glsl_hlsl_spirv, texture_shadowlod)] +[require(glsl_hlsl_spirv, texture_shadowgrad)] public float texture(sampler1DArrayShadow sampler, vec3 p, float bias) { vec2 location = p.xy; @@ -2037,8 +2034,7 @@ public float texture(sampler1DArrayShadow sampler, vec3 p, float bias) result:$$float = OpImageSampleDrefImplicitLod $sampler $location $compareValue Bias $bias; }; default: - // TODO: Need to apply bias - return sampler.SampleCmp(location, compareValue); + return sampler.SampleCmpBias(location, compareValue, bias); } } @@ -2291,7 +2287,7 @@ public float textureProj(sampler1DShadow sampler, vec4 p) } [ForceInline] -[require(glsl_hlsl_spirv, texture_shadowlod)] +[require(glsl_hlsl_spirv, texture_shadowgrad)] public float textureProj(sampler1DShadow sampler, vec4 p, float bias) { if (!__targetHasImplicitDerivatives()) @@ -2339,7 +2335,7 @@ public float textureProj(sampler2DShadow sampler, vec4 p) } [ForceInline] -[require(glsl_hlsl_spirv, texture_shadowlod)] +[require(glsl_hlsl_spirv, texture_shadowgrad)] public float textureProj(sampler2DShadow sampler, vec4 p, float bias) { if (!__targetHasImplicitDerivatives()) @@ -2506,7 +2502,7 @@ public vector textureOffset(Sampler3D sampler, vec3 p, constexpr } [ForceInline] -[require(glsl_hlsl_spirv, texture_shadowlod)] +[require(glsl_hlsl_spirv, texture_shadowgrad)] public float textureOffset(sampler2DShadow sampler, vec3 p, constexpr ivec2 offset, float bias = 0.0) { vec2 location = p.xy; @@ -2525,8 +2521,7 @@ public float textureOffset(sampler2DShadow sampler, vec3 p, constexpr ivec2 offs result:$$float = OpImageSampleDrefImplicitLod $sampler $location $compareValue Bias|ConstOffset $bias $offset; }; default: - // TODO: Need to apply bias - return sampler.SampleCmp(location, compareValue, offset); + return sampler.SampleCmpBias(location, compareValue, bias, offset); } } @@ -2550,13 +2545,12 @@ public float textureOffset(sampler1DShadow sampler, vec3 p, constexpr int offset result:$$float = OpImageSampleDrefImplicitLod $sampler $location $compareValue ConstOffset $offset; }; default: - // TODO: Need to apply bias return sampler.SampleCmp(location, compareValue, offset); } } [ForceInline] -[require(glsl_hlsl_spirv, texture_shadowlod)] +[require(glsl_hlsl_spirv, texture_shadowgrad)] public float textureOffset(sampler1DShadow sampler, vec3 p, constexpr int offset, float bias) { float location = p.x; @@ -2575,8 +2569,7 @@ public float textureOffset(sampler1DShadow sampler, vec3 p, constexpr int offset result:$$float = OpImageSampleDrefImplicitLod $sampler $location $compareValue Bias|ConstOffset $bias $offset; }; default: - // TODO: Need to apply bias - return sampler.SampleCmp(location, compareValue, offset); + return sampler.SampleCmpBias(location, compareValue, bias, offset); } } @@ -2623,13 +2616,12 @@ public float textureOffset(sampler1DArrayShadow sampler, vec3 p, constexpr int o result:$$float = OpImageSampleDrefImplicitLod $sampler $location $compareValue ConstOffset $offset; }; default: - // TODO: Need to apply bias return sampler.SampleCmp(location, compareValue, vector(offset)); } } [ForceInline] -[require(glsl_hlsl_spirv, texture_shadowlod)] +[require(glsl_hlsl_spirv, texture_shadowgrad)] public float textureOffset(sampler1DArrayShadow sampler, vec3 p, constexpr int offset, float bias) { vec2 location = p.xy; @@ -2648,8 +2640,7 @@ public float textureOffset(sampler1DArrayShadow sampler, vec3 p, constexpr int o result:$$float = OpImageSampleDrefImplicitLod $sampler $location $compareValue Bias|ConstOffset $bias $offset; }; default: - // TODO: Need to apply bias - return sampler.SampleCmp(location, compareValue, vector(offset)); + return sampler.SampleCmpBias(location, compareValue, bias, vector(offset)); } } @@ -3016,7 +3007,7 @@ public float textureProjOffset(sampler1DShadow sampler, vec4 p, constexpr int of } [ForceInline] -[require(glsl_hlsl_spirv, texture_shadowlod)] +[require(glsl_hlsl_spirv, texture_shadowgrad)] public float textureProjOffset(sampler1DShadow sampler, vec4 p, constexpr int offset, float bias) { if (!__targetHasImplicitDerivatives()) @@ -3040,7 +3031,7 @@ public float textureProjOffset(sampler1DShadow sampler, vec4 p, constexpr int of } [ForceInline] -[require(glsl_hlsl_spirv, texture_shadowlod)] +[require(glsl_hlsl_spirv, texture_shadowgrad)] public float textureProjOffset(sampler2DShadow sampler, vec4 p, constexpr ivec2 offset) { if (!__targetHasImplicitDerivatives()) @@ -3064,7 +3055,7 @@ public float textureProjOffset(sampler2DShadow sampler, vec4 p, constexpr ivec2 } [ForceInline] -[require(glsl_hlsl_spirv, texture_shadowlod)] +[require(glsl_hlsl_spirv, texture_shadowgrad)] public float textureProjOffset(sampler2DShadow sampler, vec4 p, constexpr ivec2 offset, float bias) { if (!__targetHasImplicitDerivatives()) diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang index f517b8f641..0c5b2e1d11 100644 --- a/source/slang/hlsl.meta.slang +++ b/source/slang/hlsl.meta.slang @@ -1586,12 +1586,14 @@ extension _Texture [__readNone] [ForceInline] - [require(hlsl_spirv, texture_shadowgrad)] + [require(glsl_hlsl_spirv, texture_shadowgrad)] float SampleCmpGrad(vector location, float compareValue, vector gradX, vector gradY) { static_assert(!(Shape is __ShapeCube && isArray != 0), "SampleCmpGrad is not supported for TextureCubeArray"); __target_switch { + case glsl: + __intrinsic_asm "textureGrad"; case hlsl: static_assert(T is float || T is vector || T is vector || T is vector || T is half || T is vector || T is vector || T is vector @@ -1607,13 +1609,15 @@ extension _Texture [__readNone] [ForceInline] - [require(hlsl_spirv, texture_shadowgrad)] + [require(glsl_hlsl_spirv, texture_shadowgrad)] float SampleCmpGrad(vector location, float compareValue, vector gradX, vector gradY, constexpr vector offset) { static_assert(!(Shape is __ShapeCube && isArray != 0), "SampleCmpGrad is not supported for TextureCubeArray"); static_assert(!(Shape is __ShapeCube), "SampleCmpGrad with offset is not supported for TextureCube or TextureCubeArray"); __target_switch { + case glsl: + __intrinsic_asm "textureGradOffset"; case hlsl: static_assert(T is float || T is vector || T is vector || T is vector || T is half || T is vector || T is vector || T is vector @@ -1658,12 +1662,14 @@ extension _Texture [__readNone] [ForceInline] - [require(hlsl_spirv, texture_shadowgrad)] + [require(glsl_hlsl_spirv, texture_shadowgrad)] float SampleCmpBias(vector location, float compareValue, float bias) { __requireComputeDerivative(); __target_switch { + case glsl: + __intrinsic_asm "texture"; case hlsl: static_assert(T is float || T is vector || T is vector || T is vector || T is half || T is vector || T is vector || T is vector @@ -1679,13 +1685,15 @@ extension _Texture [__readNone] [ForceInline] - [require(hlsl_spirv, texture_shadowgrad)] + [require(glsl_hlsl_spirv, texture_shadowgrad)] float SampleCmpBias(vector location, float compareValue, float bias, constexpr vector offset) { static_assert(!(Shape is __ShapeCube), "SampleCmpBias with offset is not supported for TextureCube or TextureCubeArray"); __requireComputeDerivative(); __target_switch { + case glsl: + __intrinsic_asm "textureOffset"; case hlsl: static_assert(T is float || T is vector || T is vector || T is vector || T is half || T is vector || T is vector || T is vector From d2e9727a07da0edfa4f6836faad50bc41359fc49 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 20 Nov 2025 20:14:16 +0000 Subject: [PATCH 3/5] Add test for GLSL SampleCmpBias and SampleCmpGrad output Co-authored-by: davli-nv <219758217+davli-nv@users.noreply.github.com> --- .../texture-shadow-bias-grad.slang | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 tests/glsl-intrinsic/texture-shadow-bias-grad.slang diff --git a/tests/glsl-intrinsic/texture-shadow-bias-grad.slang b/tests/glsl-intrinsic/texture-shadow-bias-grad.slang new file mode 100644 index 0000000000..938ef93e6f --- /dev/null +++ b/tests/glsl-intrinsic/texture-shadow-bias-grad.slang @@ -0,0 +1,81 @@ +// Test GLSL output for SampleCmpBias and SampleCmpGrad functions +//TEST:SIMPLE(filecheck=CHECK_GLSL): -stage fragment -entry fragmentMain -target glsl -allow-glsl + +sampler1DShadow shadowSampler1D; +sampler2DShadow shadowSampler2D; +samplerCubeShadow shadowSamplerCube; +sampler1DArrayShadow shadowSampler1DArray; +sampler2DArrayShadow shadowSampler2DArray; + +struct PSInput +{ + float4 position : SV_Position; + float2 texCoord : TEXCOORD0; + float depth : DEPTH; +}; + +struct PSOutput +{ + float4 color : SV_Target0; +}; + +PSOutput fragmentMain(PSInput input) +{ + PSOutput output; + + float ddx1 = 0.001; + float ddy1 = 0.001; + float2 ddx2 = float2(0.001, 0.0); + float2 ddy2 = float2(0.0, 0.001); + float3 ddx3 = float3(0.001, 0.0, 0.0); + float3 ddy3 = float3(0.0, 0.001, 0.0); + + int offset1 = 1; + int2 offset2 = int2(1, 0); + + float bias = 0.5; + float shadow = 0; + + // Test SampleCmpBias - should generate texture() with bias parameter + //CHECK_GLSL: texture(shadowSampler1D + shadow += shadowSampler1D.SampleCmpBias(input.texCoord.x, input.depth, bias); + + //CHECK_GLSL: textureOffset(shadowSampler1D + shadow += shadowSampler1D.SampleCmpBias(input.texCoord.x, input.depth, bias, offset1); + + //CHECK_GLSL: texture(shadowSampler2D + shadow += shadowSampler2D.SampleCmpBias(input.texCoord, input.depth, bias); + + //CHECK_GLSL: textureOffset(shadowSampler2D + shadow += shadowSampler2D.SampleCmpBias(input.texCoord, input.depth, bias, offset2); + + //CHECK_GLSL: texture(shadowSamplerCube + shadow += shadowSamplerCube.SampleCmpBias(float3(input.texCoord, 1.0), input.depth, bias); + + // Test SampleCmpGrad - should generate textureGrad() calls + //CHECK_GLSL: textureGrad(shadowSampler1D + shadow += shadowSampler1D.SampleCmpGrad(input.texCoord.x, input.depth, ddx1, ddy1); + + //CHECK_GLSL: textureGradOffset(shadowSampler1D + shadow += shadowSampler1D.SampleCmpGrad(input.texCoord.x, input.depth, ddx1, ddy1, offset1); + + //CHECK_GLSL: textureGrad(shadowSampler2D + shadow += shadowSampler2D.SampleCmpGrad(input.texCoord, input.depth, ddx2, ddy2); + + //CHECK_GLSL: textureGradOffset(shadowSampler2D + shadow += shadowSampler2D.SampleCmpGrad(input.texCoord, input.depth, ddx2, ddy2, offset2); + + //CHECK_GLSL: textureGrad(shadowSamplerCube + shadow += shadowSamplerCube.SampleCmpGrad(float3(input.texCoord, 1.0), input.depth, ddx3, ddy3); + + //CHECK_GLSL: textureGrad(shadowSampler1DArray + shadow += shadowSampler1DArray.SampleCmpGrad(float2(input.texCoord.x, 0), input.depth, ddx1, ddy1); + + //CHECK_GLSL: textureGrad(shadowSampler2DArray + shadow += shadowSampler2DArray.SampleCmpGrad(float3(input.texCoord, 0), input.depth, ddx2, ddy2); + + float finalShadow = shadow / 13.0; + + output.color = float4(finalShadow, finalShadow, finalShadow, 1.0); + return output; +} From 26fe9901ca0c87de13264a6b4e15321caf31b121 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 20 Nov 2025 21:53:10 +0000 Subject: [PATCH 4/5] Address review comments: use GLSL wrappers, simplify texture functions, fix capability requirements Co-authored-by: davli-nv <219758217+davli-nv@users.noreply.github.com> --- source/slang/glsl.meta.slang | 84 +++--------------------------------- source/slang/hlsl.meta.slang | 24 ++++++++++- 2 files changed, 29 insertions(+), 79 deletions(-) diff --git a/source/slang/glsl.meta.slang b/source/slang/glsl.meta.slang index a6ba030935..e9d5dfa22c 100644 --- a/source/slang/glsl.meta.slang +++ b/source/slang/glsl.meta.slang @@ -1923,17 +1923,7 @@ public float texture(sampler1DShadow sampler, vec3 p, float bias) return sampler.SampleCmpLevelZero(location, compareValue); __requireComputeDerivative(); - __target_switch - { - case glsl: __intrinsic_asm "texture"; - case spirv: - return spirv_asm - { - result:$$float = OpImageSampleDrefImplicitLod $sampler $location $compareValue Bias $bias; - }; - default: - return sampler.SampleCmpBias(location, compareValue, bias); - } + return sampler.SampleCmpBias(location, compareValue, bias); } [ForceInline] @@ -1957,17 +1947,7 @@ public float texture(sampler2DShadow sampler, vec3 p, float bias) return sampler.SampleCmpLevelZero(location, compareValue); __requireComputeDerivative(); - __target_switch - { - case glsl: __intrinsic_asm "texture"; - case spirv: - return spirv_asm - { - result:$$float = OpImageSampleDrefImplicitLod $sampler $location $compareValue Bias $bias; - }; - default: - return sampler.SampleCmpBias(location, compareValue, bias); - } + return sampler.SampleCmpBias(location, compareValue, bias); } [require(glsl_hlsl_spirv, texture_shadowlod)] @@ -1991,17 +1971,7 @@ public float texture(samplerCubeShadow sampler, vec4 p, float bias) return sampler.SampleCmpLevelZero(location, compareValue); __requireComputeDerivative(); - __target_switch - { - case glsl: __intrinsic_asm "texture"; - case spirv: - return spirv_asm - { - result:$$float = OpImageSampleDrefImplicitLod $sampler $location $compareValue Bias $bias; - }; - default: - return sampler.SampleCmpBias(location, compareValue, bias); - } + return sampler.SampleCmpBias(location, compareValue, bias); } [ForceInline] @@ -2025,17 +1995,7 @@ public float texture(sampler1DArrayShadow sampler, vec3 p, float bias) return sampler.SampleCmpLevelZero(location, compareValue); __requireComputeDerivative(); - __target_switch - { - case glsl: __intrinsic_asm "texture"; - case spirv: - return spirv_asm - { - result:$$float = OpImageSampleDrefImplicitLod $sampler $location $compareValue Bias $bias; - }; - default: - return sampler.SampleCmpBias(location, compareValue, bias); - } + return sampler.SampleCmpBias(location, compareValue, bias); } [ForceInline] @@ -2512,17 +2472,7 @@ public float textureOffset(sampler2DShadow sampler, vec3 p, constexpr ivec2 offs return sampler.SampleCmpLevelZero(location, compareValue, offset); __requireComputeDerivative(); - __target_switch - { - case glsl: __intrinsic_asm "textureOffset"; - case spirv: - return spirv_asm - { - result:$$float = OpImageSampleDrefImplicitLod $sampler $location $compareValue Bias|ConstOffset $bias $offset; - }; - default: - return sampler.SampleCmpBias(location, compareValue, bias, offset); - } + return sampler.SampleCmpBias(location, compareValue, bias, offset); } [ForceInline] @@ -2560,17 +2510,7 @@ public float textureOffset(sampler1DShadow sampler, vec3 p, constexpr int offset return sampler.SampleCmpLevelZero(location, compareValue, offset); __requireComputeDerivative(); - __target_switch - { - case glsl: __intrinsic_asm "textureOffset"; - case spirv: - return spirv_asm - { - result:$$float = OpImageSampleDrefImplicitLod $sampler $location $compareValue Bias|ConstOffset $bias $offset; - }; - default: - return sampler.SampleCmpBias(location, compareValue, bias, offset); - } + return sampler.SampleCmpBias(location, compareValue, bias, offset); } __generic @@ -2631,17 +2571,7 @@ public float textureOffset(sampler1DArrayShadow sampler, vec3 p, constexpr int o return sampler.SampleCmpLevelZero(location, compareValue, vector(offset)); __requireComputeDerivative(); - __target_switch - { - case glsl: __intrinsic_asm "textureOffset"; - case spirv: - return spirv_asm - { - result:$$float = OpImageSampleDrefImplicitLod $sampler $location $compareValue Bias|ConstOffset $bias $offset; - }; - default: - return sampler.SampleCmpBias(location, compareValue, bias, vector(offset)); - } + return sampler.SampleCmpBias(location, compareValue, bias, vector(offset)); } [ForceInline] diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang index 0c5b2e1d11..98b55ad446 100644 --- a/source/slang/hlsl.meta.slang +++ b/source/slang/hlsl.meta.slang @@ -829,6 +829,26 @@ float __glsl_texture_level_offset_1d_shadow(TSampler } } +__glsl_extension(GL_EXT_texture_shadow_lod) +[require(glsl, texture_shadowgrad)] +float __glsl_texture_grad_shadow(TSampler s, TCoord value, TGrad gradX, TGrad gradY) +{ + __target_switch + { + case glsl: __intrinsic_asm "textureGrad($0, $1, $2, $3)"; + } +} + +__glsl_extension(GL_EXT_texture_shadow_lod) +[require(glsl, texture_shadowgrad)] +float __glsl_texture_grad_offset_shadow(TSampler s, TCoord value, TGrad gradX, TGrad gradY, constexpr TOffset offset) +{ + __target_switch + { + case glsl: __intrinsic_asm "textureGradOffset($0, $1, $2, $3, $4)"; + } +} + [require(glsl, texture_sm_4_1)] float __glsl_texture(TTexture t, SamplerComparisonState s, TCoord value) { @@ -1593,7 +1613,7 @@ extension _Texture __target_switch { case glsl: - __intrinsic_asm "textureGrad"; + return __glsl_texture_grad_shadow(this, __makeVector(location, compareValue), gradX, gradY); case hlsl: static_assert(T is float || T is vector || T is vector || T is vector || T is half || T is vector || T is vector || T is vector @@ -1617,7 +1637,7 @@ extension _Texture __target_switch { case glsl: - __intrinsic_asm "textureGradOffset"; + return __glsl_texture_grad_offset_shadow(this, __makeVector(location, compareValue), gradX, gradY, offset); case hlsl: static_assert(T is float || T is vector || T is vector || T is vector || T is half || T is vector || T is vector || T is vector From 0b68ed91f2a24c43902043bee5b3d67e4d470b39 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 20 Nov 2025 23:10:56 +0000 Subject: [PATCH 5/5] Fix SampleCmpBias GLSL wrappers, add GLSL checks to existing test, remove redundant test file Co-authored-by: davli-nv <219758217+davli-nv@users.noreply.github.com> --- source/slang/hlsl.meta.slang | 24 +++++- .../texture-shadow-bias-grad.slang | 81 ------------------- tests/hlsl-intrinsic/texture/sample-cmp.slang | 8 ++ 3 files changed, 30 insertions(+), 83 deletions(-) delete mode 100644 tests/glsl-intrinsic/texture-shadow-bias-grad.slang diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang index 98b55ad446..943e74a161 100644 --- a/source/slang/hlsl.meta.slang +++ b/source/slang/hlsl.meta.slang @@ -829,6 +829,26 @@ float __glsl_texture_level_offset_1d_shadow(TSampler } } +__glsl_extension(GL_EXT_texture_shadow_lod) +[require(glsl, texture_shadowgrad)] +float __glsl_texture_bias_shadow(TSampler s, TCoord value, float bias) +{ + __target_switch + { + case glsl: __intrinsic_asm "texture($0, $1, $2)"; + } +} + +__glsl_extension(GL_EXT_texture_shadow_lod) +[require(glsl, texture_shadowgrad)] +float __glsl_texture_bias_offset_shadow(TSampler s, TCoord value, float bias, constexpr TOffset offset) +{ + __target_switch + { + case glsl: __intrinsic_asm "textureOffset($0, $1, $2, $3)"; + } +} + __glsl_extension(GL_EXT_texture_shadow_lod) [require(glsl, texture_shadowgrad)] float __glsl_texture_grad_shadow(TSampler s, TCoord value, TGrad gradX, TGrad gradY) @@ -1689,7 +1709,7 @@ extension _Texture __target_switch { case glsl: - __intrinsic_asm "texture"; + return __glsl_texture_bias_shadow(this, __makeVector(location, compareValue), bias); case hlsl: static_assert(T is float || T is vector || T is vector || T is vector || T is half || T is vector || T is vector || T is vector @@ -1713,7 +1733,7 @@ extension _Texture __target_switch { case glsl: - __intrinsic_asm "textureOffset"; + return __glsl_texture_bias_offset_shadow(this, __makeVector(location, compareValue), bias, offset); case hlsl: static_assert(T is float || T is vector || T is vector || T is vector || T is half || T is vector || T is vector || T is vector diff --git a/tests/glsl-intrinsic/texture-shadow-bias-grad.slang b/tests/glsl-intrinsic/texture-shadow-bias-grad.slang deleted file mode 100644 index 938ef93e6f..0000000000 --- a/tests/glsl-intrinsic/texture-shadow-bias-grad.slang +++ /dev/null @@ -1,81 +0,0 @@ -// Test GLSL output for SampleCmpBias and SampleCmpGrad functions -//TEST:SIMPLE(filecheck=CHECK_GLSL): -stage fragment -entry fragmentMain -target glsl -allow-glsl - -sampler1DShadow shadowSampler1D; -sampler2DShadow shadowSampler2D; -samplerCubeShadow shadowSamplerCube; -sampler1DArrayShadow shadowSampler1DArray; -sampler2DArrayShadow shadowSampler2DArray; - -struct PSInput -{ - float4 position : SV_Position; - float2 texCoord : TEXCOORD0; - float depth : DEPTH; -}; - -struct PSOutput -{ - float4 color : SV_Target0; -}; - -PSOutput fragmentMain(PSInput input) -{ - PSOutput output; - - float ddx1 = 0.001; - float ddy1 = 0.001; - float2 ddx2 = float2(0.001, 0.0); - float2 ddy2 = float2(0.0, 0.001); - float3 ddx3 = float3(0.001, 0.0, 0.0); - float3 ddy3 = float3(0.0, 0.001, 0.0); - - int offset1 = 1; - int2 offset2 = int2(1, 0); - - float bias = 0.5; - float shadow = 0; - - // Test SampleCmpBias - should generate texture() with bias parameter - //CHECK_GLSL: texture(shadowSampler1D - shadow += shadowSampler1D.SampleCmpBias(input.texCoord.x, input.depth, bias); - - //CHECK_GLSL: textureOffset(shadowSampler1D - shadow += shadowSampler1D.SampleCmpBias(input.texCoord.x, input.depth, bias, offset1); - - //CHECK_GLSL: texture(shadowSampler2D - shadow += shadowSampler2D.SampleCmpBias(input.texCoord, input.depth, bias); - - //CHECK_GLSL: textureOffset(shadowSampler2D - shadow += shadowSampler2D.SampleCmpBias(input.texCoord, input.depth, bias, offset2); - - //CHECK_GLSL: texture(shadowSamplerCube - shadow += shadowSamplerCube.SampleCmpBias(float3(input.texCoord, 1.0), input.depth, bias); - - // Test SampleCmpGrad - should generate textureGrad() calls - //CHECK_GLSL: textureGrad(shadowSampler1D - shadow += shadowSampler1D.SampleCmpGrad(input.texCoord.x, input.depth, ddx1, ddy1); - - //CHECK_GLSL: textureGradOffset(shadowSampler1D - shadow += shadowSampler1D.SampleCmpGrad(input.texCoord.x, input.depth, ddx1, ddy1, offset1); - - //CHECK_GLSL: textureGrad(shadowSampler2D - shadow += shadowSampler2D.SampleCmpGrad(input.texCoord, input.depth, ddx2, ddy2); - - //CHECK_GLSL: textureGradOffset(shadowSampler2D - shadow += shadowSampler2D.SampleCmpGrad(input.texCoord, input.depth, ddx2, ddy2, offset2); - - //CHECK_GLSL: textureGrad(shadowSamplerCube - shadow += shadowSamplerCube.SampleCmpGrad(float3(input.texCoord, 1.0), input.depth, ddx3, ddy3); - - //CHECK_GLSL: textureGrad(shadowSampler1DArray - shadow += shadowSampler1DArray.SampleCmpGrad(float2(input.texCoord.x, 0), input.depth, ddx1, ddy1); - - //CHECK_GLSL: textureGrad(shadowSampler2DArray - shadow += shadowSampler2DArray.SampleCmpGrad(float3(input.texCoord, 0), input.depth, ddx2, ddy2); - - float finalShadow = shadow / 13.0; - - output.color = float4(finalShadow, finalShadow, finalShadow, 1.0); - return output; -} diff --git a/tests/hlsl-intrinsic/texture/sample-cmp.slang b/tests/hlsl-intrinsic/texture/sample-cmp.slang index 64612362b4..934ba5932e 100644 --- a/tests/hlsl-intrinsic/texture/sample-cmp.slang +++ b/tests/hlsl-intrinsic/texture/sample-cmp.slang @@ -54,10 +54,12 @@ PSOutput fragmentMain(PSInput input) //CHECK_HLSL: SampleCmpGrad //CHECK_DXIL: dx.op.sampleCmpGrad.f32 //CHECK_SPIRV: OpImageSampleDrefExplicitLod {{.*}} Grad + //CHECK_GLSL: textureGrad( shadow += shadowMap1D.SampleCmpGrad(shadowSampler, input.texCoord.x, input.depth, ddx1, ddy1); //CHECK_HLSL: SampleCmpGrad //CHECK_DXIL: dx.op.sampleCmpGrad.f32 //CHECK_SPIRV: OpImageSampleDrefExplicitLod {{.*}} Grad|ConstOffset + //CHECK_GLSL: textureGradOffset( shadow += shadowMap1D.SampleCmpGrad(shadowSampler, input.texCoord.x, input.depth, ddx1, ddy1, offset1); #ifdef USE_SPARSE //CHECK_HLSL: SampleCmpGrad @@ -69,10 +71,12 @@ PSOutput fragmentMain(PSInput input) //CHECK_HLSL: SampleCmpGrad //CHECK_DXIL: dx.op.sampleCmpGrad.f32 //CHECK_SPIRV: OpImageSampleDrefExplicitLod {{.*}} Grad + //CHECK_GLSL: textureGrad( shadow += sampler1DShadow.SampleCmpGrad(input.texCoord.x, input.depth, ddx1, ddy1); //CHECK_HLSL: SampleCmpGrad //CHECK_DXIL: dx.op.sampleCmpGrad.f32 //CHECK_SPIRV: OpImageSampleDrefExplicitLod {{.*}} Grad|ConstOffset + //CHECK_GLSL: textureGradOffset( shadow += sampler1DShadow.SampleCmpGrad(input.texCoord.x, input.depth, ddx1, ddy1, offset1); #ifdef USE_SPARSE //CHECK_HLSL: SampleCmpGrad @@ -84,11 +88,13 @@ PSOutput fragmentMain(PSInput input) //CHECK_HLSL: SampleCmpBias //CHECK_DXIL: dx.op.sampleCmpBias.f32 //CHECK_SPIRV: OpImageSampleDrefImplicitLod {{.*}} Bias + //CHECK_GLSL: texture( shadow += shadowMap1D.SampleCmpBias(shadowSampler, input.texCoord.x, input.depth, bias); //CHECK_HLSL: SampleCmpBias //CHECK_DXIL: dx.op.sampleCmpBias.f32 //CHECK_SPIRV: OpImageSampleDrefImplicitLod {{.*}} Bias|ConstOffset + //CHECK_GLSL: textureOffset( shadow += shadowMap1D.SampleCmpBias(shadowSampler, input.texCoord.x, input.depth, bias, offset1); #ifdef USE_SPARSE //CHECK_HLSL: SampleCmpBias @@ -100,10 +106,12 @@ PSOutput fragmentMain(PSInput input) //CHECK_HLSL: SampleCmpBias //CHECK_DXIL: dx.op.sampleCmpBias.f32 //CHECK_SPIRV: OpImageSampleDrefImplicitLod {{.*}} Bias + //CHECK_GLSL: texture( shadow += sampler1DShadow.SampleCmpBias(input.texCoord.x, input.depth, bias); //CHECK_HLSL: SampleCmpBias //CHECK_DXIL: dx.op.sampleCmpBias.f32 //CHECK_SPIRV: OpImageSampleDrefImplicitLod {{.*}} Bias|ConstOffset + //CHECK_GLSL: textureOffset( shadow += sampler1DShadow.SampleCmpBias(input.texCoord.x, input.depth, bias, offset1); #ifdef USE_SPARSE //CHECK_HLSL: SampleCmpBias