From 59343c18928e476b7949a8700c5a792820da8656 Mon Sep 17 00:00:00 2001 From: Jay Kwak <82421531+jkwak-work@users.noreply.github.com> Date: Wed, 10 Jul 2024 10:55:07 -0700 Subject: Support status argument for GatherXXX (#4490) * Support status argument for GatherXXX This commit adds an argument to all texture GatherXXX functions. The new argument is for "status" as described in SM5.0 definision. Close #4466 Limit Gather with status to HLSL Exclude Gather-status test from VK * Fix capability errors --------- Co-authored-by: Yong He --- source/slang/hlsl.meta.slang | 51 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 42 insertions(+), 9 deletions(-) (limited to 'source') diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang index 5564094db..17e2822a3 100644 --- a/source/slang/hlsl.meta.slang +++ b/source/slang/hlsl.meta.slang @@ -2328,55 +2328,88 @@ ${{{{ { auto componentName = componentNames[componentId]; auto glslComponent = (isCmp ? "" :glslComponentNames[componentId == 0 ? 0 : componentId - 1]); - }}}} + + for (bool isStatus : { false, true }) + { + const char* statusDecl = isStatus ? ", out uint status" : ""; + const char* statusInit = isStatus ? " status = 0;\n" : ""; + const char* statusCapWithMetal = isStatus ? "hlsl" : "glsl_hlsl_metal_spirv"; + const char* statusCapWithoutMetal = isStatus ? "hlsl" : "glsl_hlsl_spirv"; +}}}} [ForceInline] - [require(glsl_hlsl_metal_spirv, texture_gather)] - vector Gather$(cmp)$(componentName)($(samplerStateType)$(samplerStateParam) vector location $(cmpParam)) + [require($(statusCapWithMetal), texture_gather)] + vector Gather$(cmp)$(componentName)($(samplerStateType)$(samplerStateParam) vector location $(cmpParam) $(statusDecl)) { + $(statusInit) __target_switch { case hlsl: __intrinsic_asm ".Gather$(cmp)$(componentName)"; +${{{{ + if (!isStatus) + { +}}}} case metal: return __texture_gather$(cmp)($(getTexture),$(getSampler) location $(compareArg) $(glslComponent)); case glsl: case spirv: return __texture_gather$(cmp)(this,$(samplerStateParam) location $(compareArg) $(glslComponent)); +${{{{ + } // if(!isStatus) +}}}} } } [ForceInline] - [require(glsl_hlsl_metal_spirv, texture_gather)] - vector Gather$(cmp)$(componentName)($(samplerStateType)$(samplerStateParam) vector location $(cmpParam), constexpr vector offset) + [require($(statusCapWithMetal), texture_gather)] + vector Gather$(cmp)$(componentName)($(samplerStateType)$(samplerStateParam) vector location $(cmpParam), constexpr vector offset $(statusDecl)) { + $(statusInit) __target_switch { case hlsl: __intrinsic_asm ".Gather$(cmp)$(componentName)"; +${{{{ + if (!isStatus) + { +}}}} case metal: return __texture_gather$(cmp)_offset($(getTexture),$(getSampler) location $(compareArg), offset $(glslComponent)); case glsl: case spirv: return __texture_gather$(cmp)_offset(this,$(samplerStateParam) location $(compareArg), offset $(glslComponent)); +${{{{ + } // if(!isStatus) +}}}} } } [ForceInline] - [require(glsl_hlsl_spirv, texture_gather)] + [require($(statusCapWithoutMetal), texture_gather)] vector Gather$(cmp)$(componentName)($(samplerStateType)$(samplerStateParam) vector location $(cmpParam), constexpr vector offset1, constexpr vector offset2, constexpr vector offset3, - constexpr vector offset4) + constexpr vector offset4 + $(statusDecl)) { + $(statusInit) __target_switch { case hlsl: __intrinsic_asm ".Gather$(cmp)$(componentName)"; +${{{{ + if (!isStatus) + { +}}}} case glsl: case spirv: return __texture_gather$(cmp)_offsets(this,$(samplerStateParam) location $(compareArg), offset1,offset2,offset3,offset4 $(glslComponent)); +${{{{ + } // if(!isStatus) +}}}} } } - ${{{{ +${{{{ + } // for (isStatus) } // for (componentId) } // for (isCmp) - }}}} +}}}} } // end extension for gather ${{{{ -- cgit v1.2.3