diff --git a/source/slang/glsl.meta.slang b/source/slang/glsl.meta.slang index 1096004de5..e9d5dfa22c 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; @@ -1923,18 +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: - // TODO: Need to apply bias - return sampler.SampleCmp(location, compareValue); - } + return sampler.SampleCmpBias(location, compareValue, bias); } [ForceInline] @@ -1948,7 +1937,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; @@ -1958,18 +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: - // TODO: Need to apply bias - return sampler.SampleCmp(location, compareValue); - } + return sampler.SampleCmpBias(location, compareValue, bias); } [require(glsl_hlsl_spirv, texture_shadowlod)] @@ -1982,7 +1960,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) { @@ -1993,18 +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: - // TODO: Need to apply bias - return sampler.SampleCmp(location, compareValue); - } + return sampler.SampleCmpBias(location, compareValue, bias); } [ForceInline] @@ -2018,7 +1985,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; @@ -2028,18 +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: - // TODO: Need to apply bias - return sampler.SampleCmp(location, compareValue); - } + return sampler.SampleCmpBias(location, compareValue, bias); } [ForceInline] @@ -2291,7 +2247,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 +2295,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 +2462,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; @@ -2516,18 +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: - // TODO: Need to apply bias - return sampler.SampleCmp(location, compareValue, offset); - } + return sampler.SampleCmpBias(location, compareValue, bias, offset); } [ForceInline] @@ -2550,13 +2495,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; @@ -2566,18 +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: - // TODO: Need to apply bias - return sampler.SampleCmp(location, compareValue, offset); - } + return sampler.SampleCmpBias(location, compareValue, bias, offset); } __generic @@ -2623,13 +2556,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; @@ -2639,18 +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: - // TODO: Need to apply bias - return sampler.SampleCmp(location, compareValue, vector(offset)); - } + return sampler.SampleCmpBias(location, compareValue, bias, vector(offset)); } [ForceInline] @@ -3016,7 +2937,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 +2961,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 +2985,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..943e74a161 100644 --- a/source/slang/hlsl.meta.slang +++ b/source/slang/hlsl.meta.slang @@ -829,6 +829,46 @@ 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) +{ + __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) { @@ -1586,12 +1626,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: + 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 @@ -1607,13 +1649,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: + 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 @@ -1658,12 +1702,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: + 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 @@ -1679,13 +1725,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: + 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/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