From cc88530a722cc2ce7a09f2a39dadeeb504e2f221 Mon Sep 17 00:00:00 2001 From: Jay Kwak <82421531+jkwak-work@users.noreply.github.com> Date: Tue, 14 May 2024 20:28:28 -0700 Subject: Support combined textures for Metal target (#4169) --- source/slang/hlsl.meta.slang | 106 +++++++++++++++++++++++++++++++++---------- source/slang/slang-emit.cpp | 11 ++++- 2 files changed, 92 insertions(+), 25 deletions(-) (limited to 'source') diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang index f318eb79e..176c7c0e4 100644 --- a/source/slang/hlsl.meta.slang +++ b/source/slang/hlsl.meta.slang @@ -529,13 +529,14 @@ extension __TextureImpl [__readNone] [ForceInline] - [require(glsl_hlsl_spirv, texture_querylod)] + [require(glsl_hlsl_metal_spirv, texture_querylod)] float CalculateLevelOfDetail(TextureCoord location) { __requireComputeDerivative(); __target_switch { case hlsl: + case metal: { return __getTexture().CalculateLevelOfDetail(__getSampler(), location); } @@ -551,13 +552,14 @@ extension __TextureImpl [__readNone] [ForceInline] - [require(glsl_hlsl_spirv, texture_querylod)] + [require(glsl_hlsl_metal_spirv, texture_querylod)] float CalculateLevelOfDetailUnclamped(TextureCoord location) { __requireComputeDerivative(); __target_switch { case hlsl: + case metal: { return __getTexture().CalculateLevelOfDetailUnclamped(__getSampler(), location); } @@ -573,7 +575,7 @@ extension __TextureImpl [__readNone] [ForceInline] - [require(cpp_cuda_glsl_hlsl_spirv, texture_sm_4_1_fragment)] + [require(cpp_cuda_glsl_hlsl_metal_spirv, texture_sm_4_1_fragment)] T Sample(vector location) { __requireComputeDerivative(); @@ -581,6 +583,7 @@ extension __TextureImpl { case cpp: case hlsl: + case metal: return __getTexture().Sample(__getSampler(), location); case glsl: __intrinsic_asm "$ctexture($0, $1)$z"; @@ -622,10 +625,34 @@ extension __TextureImpl } } + [__readNone] + [ForceInline] + [require(cpp_glsl_hlsl_metal_spirv, texture_sm_4_1_fragment)] + T Sample(vector location, constexpr vector offset) + { + __requireComputeDerivative(); + __target_switch + { + case cpp: + case hlsl: + case metal: + return __getTexture().Sample(__getSampler(), location, offset); + case glsl: + __intrinsic_asm "$ctextureOffsetClampARB($0, $1, $2)$z"; + case spirv: + return spirv_asm + { + OpCapability MinLod; + %sampled : __sampledType(T) = OpImageSampleImplicitLod $this $location None|ConstOffset $offset; + __truncate $$T result __sampledType(T) %sampled; + }; + } + } + [__readNone] [ForceInline] __glsl_extension(GL_ARB_sparse_texture_clamp) - [require(cpp_glsl_hlsl_spirv, texture_sm_4_1_fragment)] + [require(cpp_glsl_hlsl_metal_spirv, texture_sm_4_1_fragment)] T Sample(vector location, vector offset, float clamp) { __requireComputeDerivative(); @@ -633,6 +660,7 @@ extension __TextureImpl { case cpp: case hlsl: + case metal: return __getTexture().Sample(__getSampler(), location, offset, clamp); case glsl: __intrinsic_asm "$ctextureOffsetClampARB($0, $1, $2, $3)$z"; @@ -648,7 +676,7 @@ extension __TextureImpl [__readNone] [ForceInline] - [require(cpp_glsl_hlsl_spirv, texture_sm_4_1_fragment)] + [require(cpp_glsl_hlsl_metal_spirv, texture_sm_4_1_fragment)] T Sample(vector location, vector offset, float clamp, out uint status) { __target_switch @@ -662,7 +690,7 @@ extension __TextureImpl [__readNone] [ForceInline] - [require(cpp_glsl_hlsl_spirv, texture_sm_4_1_fragment)] + [require(cpp_glsl_hlsl_metal_spirv, texture_sm_4_1_fragment)] T SampleBias(vector location, float bias) { __requireComputeDerivative(); @@ -670,6 +698,7 @@ extension __TextureImpl { case cpp: case hlsl: + case metal: return __getTexture().SampleBias(__getSampler(), location, bias); case glsl: __intrinsic_asm "$ctexture($0, $1, $2)$z"; @@ -685,7 +714,7 @@ extension __TextureImpl [__readNone] [ForceInline] - [require(cpp_glsl_hlsl_spirv, texture_sm_4_1_fragment)] + [require(cpp_glsl_hlsl_metal_spirv, texture_sm_4_1_fragment)] T SampleBias(vector location, float bias, constexpr vector offset) { __requireComputeDerivative(); @@ -693,6 +722,7 @@ extension __TextureImpl { case cpp: case hlsl: + case metal: return __getTexture().SampleBias(__getSampler(), location, bias, offset); case glsl: __intrinsic_asm "$ctextureOffset($0, $1, $3, $2)$z"; @@ -707,7 +737,7 @@ extension __TextureImpl [__readNone] [ForceInline] - [require(glsl_hlsl_spirv, texture_shadowlod)] + [require(glsl_hlsl_metal_spirv, texture_shadowlod)] float SampleCmp(vector location, float compareValue) { __target_switch @@ -726,6 +756,7 @@ extension __TextureImpl return __glsl_texture(this, __makeVector(location, compareValue)); } case hlsl: + case metal: return __getTexture().SampleCmp(__getComparisonSampler(), location, compareValue); case spirv: return spirv_asm @@ -737,7 +768,7 @@ extension __TextureImpl [__readNone] [ForceInline] - [require(glsl_hlsl_spirv, texture_shadowlod)] + [require(glsl_hlsl_metal_spirv, texture_shadowlod)] float SampleCmpLevelZero(vector location, float compareValue) { __target_switch @@ -752,6 +783,7 @@ extension __TextureImpl return __glsl_texture_level_zero(this, __makeVector(location, compareValue)); } case hlsl: + case metal: return __getTexture().SampleCmpLevelZero(__getComparisonSampler(), location, compareValue); case spirv: const float zeroFloat = 0.0f; @@ -764,7 +796,7 @@ extension __TextureImpl [__readNone] [ForceInline] - [require(glsl_hlsl_spirv, texture_shadowlod)] + [require(glsl_hlsl_metal_spirv, texture_shadowlod)] float SampleCmp(vector location, float compareValue, constexpr vector offset) { __target_switch @@ -779,6 +811,7 @@ extension __TextureImpl return __glsl_texture_offset(this, __makeVector(location, compareValue), offset); } case hlsl: + case metal: return __getTexture().SampleCmp(__getComparisonSampler(), location, compareValue, offset); case spirv: return spirv_asm @@ -790,7 +823,7 @@ extension __TextureImpl [__readNone] [ForceInline] - [require(glsl_hlsl_spirv, texture_shadowlod)] + [require(glsl_hlsl_metal_spirv, texture_shadowlod)] float SampleCmpLevelZero(vector location, float compareValue, constexpr vector offset) { __target_switch @@ -805,6 +838,7 @@ extension __TextureImpl return __glsl_texture_offset_level_zero(this, __makeVector(location, compareValue), offset); } case hlsl: + case metal: return __getTexture().SampleCmpLevelZero(__getComparisonSampler(), location, compareValue, offset); case spirv: const float zeroFloat = 0.0f; @@ -817,13 +851,14 @@ extension __TextureImpl [__readNone] [ForceInline] - [require(cpp_glsl_hlsl_spirv, texture_sm_4_1)] + [require(cpp_glsl_hlsl_metal_spirv, texture_sm_4_1)] T SampleGrad(vector location, vector gradX, vector gradY) { __target_switch { case cpp: case hlsl: + case metal: return __getTexture().SampleGrad(__getSampler(), location, gradX, gradY); case glsl: @@ -839,13 +874,14 @@ extension __TextureImpl [__readNone] [ForceInline] - [require(cpp_glsl_hlsl_spirv, texture_sm_4_1)] + [require(cpp_glsl_hlsl_metal_spirv, texture_sm_4_1)] T SampleGrad(vector location, vector gradX, vector gradY, constexpr vector offset) { __target_switch { case cpp: case hlsl: + case metal: return __getTexture().SampleGrad(__getSampler(), location, gradX, gradY, offset); case glsl: __intrinsic_asm "$ctextureGradOffset($0, $1, $2, $3, $4)$z"; @@ -861,13 +897,14 @@ extension __TextureImpl [__readNone] [ForceInline] __glsl_extension(GL_ARB_sparse_texture_clamp) - [require(cpp_glsl_hlsl_spirv, texture_sm_4_1)] + [require(cpp_glsl_hlsl_metal_spirv, texture_sm_4_1)] T SampleGrad(vector location, vector gradX, vector gradY, constexpr vector offset, float lodClamp) { __target_switch { case cpp: case hlsl: + case metal: return __getTexture().SampleGrad(__getSampler(), location, gradX, gradY, offset, lodClamp); case glsl: __intrinsic_asm "$ctextureGradOffsetClampARB($0, $1, $2, $3, $4, $5)$z"; @@ -883,13 +920,14 @@ extension __TextureImpl [__readNone] [ForceInline] - [require(cpp_cuda_glsl_hlsl_spirv, texture_sm_4_1)] + [require(cpp_cuda_glsl_hlsl_metal_spirv, texture_sm_4_1)] T SampleLevel(vector location, float level) { __target_switch { case cpp: case hlsl: + case metal: return __getTexture().SampleLevel(__getSampler(), location, level); case glsl: __intrinsic_asm "$ctextureLod($0, $1, $2)$z"; @@ -935,13 +973,14 @@ extension __TextureImpl [__readNone] [ForceInline] - [require(cpp_glsl_hlsl_spirv, texture_sm_4_1)] + [require(cpp_glsl_hlsl_metal_spirv, texture_sm_4_1)] T SampleLevel(vector location, float level, constexpr vector offset) { __target_switch { case cpp: case hlsl: + case metal: return __getTexture().SampleLevel(__getSampler(), location, level, offset); case glsl: @@ -2109,15 +2148,29 @@ for (int isScalarTexture = 0; isScalarTexture <= 1; isScalarTexture++) { }}}} { // begin extension for gather ${{{{ + if (isCombined) + { +}}}} + __intrinsic_op($(kIROp_CombinedTextureSamplerGetTexture)) + __TextureImpl __getTexture(); + + __intrinsic_op($(kIROp_CombinedTextureSamplerGetSampler)) + SamplerState __getSampler(); + + __intrinsic_op($(kIROp_CombinedTextureSamplerGetSampler)) + SamplerComparisonState __getComparisonSampler(); +${{{{ + } + // Gather component const char* samplerStateParam = isCombined ? "" : " s,"; - const char* metalSupport = isCombined ? "" : "metal_"; - const char* caseMetal = isCombined ? "" : "case metal:"; + const char* getTexture = isCombined ? "__getTexture()" : "this"; for (int isCmp = 0; isCmp < 2; ++isCmp) { const char* cmp = isCmp ? "Cmp" : ""; const char* cmpParam = isCmp ? ", T compareValue" : ""; const char* compareArg = isCmp ? ", compareValue" : ""; const char* samplerStateType = isCombined ? "" : (isCmp ? "SamplerComparisonState" : "SamplerState"); + const char* getSampler = isCombined ? (isCmp ? " __getComparisonSampler()," : " __getSampler(),") : samplerStateParam; const char* componentNames[] = { "", "Red", "Green", "Blue", "Alpha"}; const char* glslComponentNames[] = { ", 0", ", 1", ", 2", ", 3" }; @@ -2126,26 +2179,28 @@ ${{{{ auto glslComponent = (isCmp ? "" :glslComponentNames[componentId == 0 ? 0 : componentId - 1]); }}}} [ForceInline] - [require(glsl_hlsl_$(metalSupport)spirv, texture_gather)] + [require(glsl_hlsl_metal_spirv, texture_gather)] vector Gather$(cmp)$(componentName)($(samplerStateType)$(samplerStateParam) vector location $(cmpParam)) { __target_switch { case hlsl: __intrinsic_asm ".Gather$(cmp)$(componentName)"; - $(caseMetal) + case metal: + return __texture_gather$(cmp)($(getTexture),$(getSampler) location $(compareArg) $(glslComponent)); case glsl: case spirv: return __texture_gather$(cmp)(this,$(samplerStateParam) location $(compareArg) $(glslComponent)); } } [ForceInline] - [require(glsl_hlsl_$(metalSupport)spirv, texture_gather)] + [require(glsl_hlsl_metal_spirv, texture_gather)] vector Gather$(cmp)$(componentName)($(samplerStateType)$(samplerStateParam) vector location $(cmpParam), constexpr vector offset) { __target_switch { case hlsl: __intrinsic_asm ".Gather$(cmp)$(componentName)"; - $(caseMetal) + 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)); @@ -2347,7 +2402,7 @@ extension __TextureImpl