summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
authorDarren Wihandi <65404740+fairywreath@users.noreply.github.com>2025-03-01 01:46:09 -0500
committerGitHub <noreply@github.com>2025-02-28 22:46:09 -0800
commit700c38ae7c16a49de7f720ae3b1940df5b2b4b33 (patch)
tree96e338255d830cee5b65fc5e881c4d04bebbd168 /source
parentbca772ca02bbe9c0f1201c7ae177a10ccff84958 (diff)
Implement sparse texture Sample* intrinsics for SPIRV (#6377)
* implement sparse residency samples for spirv * udpate test * separate tests to non-combined and combined sampler * remove expected failure * add expected failure for dx12 combined sampler test * remove expected failure * fix submodule merge * add back dx12 test failure --------- Co-authored-by: Yong He <yonghe@outlook.com>
Diffstat (limited to 'source')
-rw-r--r--source/slang/hlsl.meta.slang263
1 files changed, 220 insertions, 43 deletions
diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang
index a671a3dc4..d2abfc7fe 100644
--- a/source/slang/hlsl.meta.slang
+++ b/source/slang/hlsl.meta.slang
@@ -1079,6 +1079,7 @@ extension _Texture<T,Shape,isArray,isMS,sampleCount,0,isShadow,1,format>
[ForceInline]
T Sample(vector<float, Shape.dimensions+isArray> location, vector<int, Shape.planeDimensions> offset, float clamp, out uint status)
{
+ __requireComputeDerivative();
__target_switch
{
case hlsl:
@@ -1086,6 +1087,20 @@ extension _Texture<T,Shape,isArray,isMS,sampleCount,0,isShadow,1,format>
|| T is half || T is vector<half,2> || T is vector<half,3> || T is vector<half,4>
, "HLSL supports only float and half type textures");
__intrinsic_asm ".Sample";
+ case spirv:
+ return spirv_asm
+ {
+ OpCapability MinLod;
+ OpCapability SparseResidency;
+ %sparseResultType = OpTypeStruct $$uint __sampledType(T);
+
+ %sparseResult:%sparseResultType = OpImageSparseSampleImplicitLod $this $location ConstOffset|MinLod $offset $clamp;
+ %residentCode:$$uint = OpCompositeExtract %sparseResult 0;
+ %sampled:__sampledType(T) = OpCompositeExtract %sparseResult 1;
+
+ OpStore &status %residentCode;
+ __truncate $$T result __sampledType(T) %sampled;
+ };
default:
status = 0;
return Sample(location, offset, clamp);
@@ -1153,17 +1168,30 @@ extension _Texture<T,Shape,isArray,isMS,sampleCount,0,isShadow,1,format>
[__readNone]
[ForceInline]
- [require(hlsl, sm_5_0)]
+ [require(hlsl_spirv, sm_5_0)]
T SampleBias(vector<float, Shape.dimensions+isArray> location, float bias, constexpr vector<int, Shape.planeDimensions> offset, float clamp, out uint status)
{
__requireComputeDerivative();
__target_switch
{
- case hlsl:
- static_assert(T is float || T is vector<float,2> || T is vector<float,3> || T is vector<float,4>
- || T is half || T is vector<half,2> || T is vector<half,3> || T is vector<half,4>
- , "HLSL supports only float and half type textures");
- return __getTexture().SampleBias(__getSampler(), location, bias, offset, clamp, status);
+ case hlsl:
+ static_assert(T is float || T is vector<float,2> || T is vector<float,3> || T is vector<float,4>
+ || T is half || T is vector<half,2> || T is vector<half,3> || T is vector<half,4>
+ , "HLSL supports only float and half type textures");
+ return __getTexture().SampleBias(__getSampler(), location, bias, offset, clamp, status);
+ case spirv:
+ return spirv_asm
+ {
+ OpCapability SparseResidency;
+ %sparseResultType = OpTypeStruct $$uint __sampledType(T);
+
+ %sparseResult:%sparseResultType = OpImageSparseSampleImplicitLod $this $location Bias|ConstOffset $bias $offset;
+ %residentCode:$$uint = OpCompositeExtract %sparseResult 0;
+ %sampled:__sampledType(T) = OpCompositeExtract %sparseResult 1;
+
+ OpStore &status %residentCode;
+ __truncate $$T result __sampledType(T) %sampled;
+ };
}
}
@@ -1261,7 +1289,7 @@ extension _Texture<T,Shape,isArray,isMS,sampleCount,0,isShadow,1,format>
[__readNone]
[ForceInline]
- [require(hlsl, sm_5_0)]
+ [require(hlsl_spirv, sm_5_0)]
float SampleCmp(vector<float, Shape.dimensions+isArray> location, float compareValue, constexpr vector<int, Shape.planeDimensions> offset, float clamp, out uint status)
{
__requireComputeDerivative();
@@ -1272,6 +1300,19 @@ extension _Texture<T,Shape,isArray,isMS,sampleCount,0,isShadow,1,format>
|| T is half || T is vector<half,2> || T is vector<half,3> || T is vector<half,4>
, "HLSL supports only float and half type textures");
return __getTexture().SampleCmp(__getComparisonSampler(), location, compareValue, offset, clamp, status);
+ case spirv:
+ return spirv_asm
+ {
+ OpCapability MinLod;
+ OpCapability SparseResidency;
+ %sparseResultType = OpTypeStruct $$uint $$float;
+
+ %sparseResult:%sparseResultType = OpImageSparseSampleDrefImplicitLod $this $location $compareValue ConstOffset|MinLod $offset $clamp;
+
+ %residentCode:$$uint = OpCompositeExtract %sparseResult 0;
+ OpStore &status %residentCode;
+ result:$$float = OpCompositeExtract %sparseResult 1;
+ };
}
}
@@ -1296,7 +1337,7 @@ extension _Texture<T,Shape,isArray,isMS,sampleCount,0,isShadow,1,format>
[__readNone]
[ForceInline]
- [require(hlsl, sm_5_0)]
+ [require(hlsl_spirv, sm_5_0)]
float SampleCmpLevelZero(vector<float, Shape.dimensions+isArray> location, float compareValue, constexpr vector<int, Shape.planeDimensions> offset, out uint status)
{
__target_switch
@@ -1306,6 +1347,8 @@ extension _Texture<T,Shape,isArray,isMS,sampleCount,0,isShadow,1,format>
|| T is half || T is vector<half,2> || T is vector<half,3> || T is vector<half,4>
, "HLSL supports only float and half type textures");
return __getTexture().SampleCmpLevelZero(__getComparisonSampler(), location, compareValue, offset, status);
+ case spirv:
+ return SampleCmpLevel(location, compareValue, 0.0, offset, status);
}
}
@@ -1373,7 +1416,7 @@ extension _Texture<T,Shape,isArray,isMS,sampleCount,0,isShadow,1,format>
[__readNone]
[ForceInline]
- [require(hlsl, texture_shadowlod)]
+ [require(hlsl_spirv, texture_shadowlod)]
float SampleCmpLevel(vector<float, Shape.dimensions+isArray> location, float compareValue, float level, constexpr vector<int, Shape.planeDimensions> offset, out uint status)
{
__target_switch
@@ -1383,6 +1426,18 @@ extension _Texture<T,Shape,isArray,isMS,sampleCount,0,isShadow,1,format>
|| T is half || T is vector<half,2> || T is vector<half,3> || T is vector<half,4>
, "HLSL supports only float and half type textures");
return __getTexture().SampleCmpLevel(__getComparisonSampler(), location, compareValue, level, offset, status);
+ case spirv:
+ return spirv_asm
+ {
+ OpCapability SparseResidency;
+ %sparseResultType = OpTypeStruct $$uint $$float;
+
+ %sparseResult:%sparseResultType = OpImageSparseSampleDrefExplicitLod $this $location $compareValue Lod|ConstOffset $level $offset;
+
+ %residentCode:$$uint = OpCompositeExtract %sparseResult 0;
+ OpStore &status %residentCode;
+ result:$$float = OpCompositeExtract %sparseResult 1;
+ };
}
}
@@ -1472,16 +1527,30 @@ extension _Texture<T,Shape,isArray,isMS,sampleCount,0,isShadow,1,format>
[__readNone]
[ForceInline]
- [require(hlsl, sm_5_0)]
+ [require(hlsl_spirv, sm_5_0)]
T SampleGrad(vector<float, Shape.dimensions+isArray> location, vector<float, Shape.dimensions> gradX, vector<float, Shape.dimensions> gradY, constexpr vector<int, Shape.dimensions> offset, float lodClamp, out uint status)
{
__target_switch
{
- case hlsl:
- static_assert(T is float || T is vector<float,2> || T is vector<float,3> || T is vector<float,4>
- || T is half || T is vector<half,2> || T is vector<half,3> || T is vector<half,4>
- , "HLSL supports only float and half type textures");
- return __getTexture().SampleGrad(__getSampler(), location, gradX, gradY, offset, lodClamp, status);
+ case hlsl:
+ static_assert(T is float || T is vector<float,2> || T is vector<float,3> || T is vector<float,4>
+ || T is half || T is vector<half,2> || T is vector<half,3> || T is vector<half,4>
+ , "HLSL supports only float and half type textures");
+ return __getTexture().SampleGrad(__getSampler(), location, gradX, gradY, offset, lodClamp, status);
+ case spirv:
+ return spirv_asm
+ {
+ OpCapability MinLod;
+ OpCapability SparseResidency;
+ %sparseResultType = OpTypeStruct $$uint __sampledType(T);
+
+ %sparseResult:%sparseResultType = OpImageSparseSampleExplicitLod $this $location Grad|ConstOffset|MinLod $gradX $gradY $offset $lodClamp;
+ %residentCode:$$uint = OpCompositeExtract %sparseResult 0;
+ %sampled:__sampledType(T) = OpCompositeExtract %sparseResult 1;
+
+ OpStore &status %residentCode;
+ __truncate $$T result __sampledType(T) %sampled;
+ };
}
}
@@ -1574,16 +1643,29 @@ extension _Texture<T,Shape,isArray,isMS,sampleCount,0,isShadow,1,format>
[__readNone]
[ForceInline]
- [require(hlsl, sm_5_0)]
+ [require(hlsl_spirv, sm_5_0)]
T SampleLevel(vector<float, Shape.dimensions+isArray> location, float level, constexpr vector<int, Shape.planeDimensions> offset, out uint status)
{
__target_switch
{
- case hlsl:
- static_assert(T is float || T is vector<float,2> || T is vector<float,3> || T is vector<float,4>
- || T is half || T is vector<half,2> || T is vector<half,3> || T is vector<half,4>
- , "HLSL supports only float and half type textures");
- return __getTexture().SampleLevel(__getSampler(), location, level, offset, status);
+ case hlsl:
+ static_assert(T is float || T is vector<float,2> || T is vector<float,3> || T is vector<float,4>
+ || T is half || T is vector<half,2> || T is vector<half,3> || T is vector<half,4>
+ , "HLSL supports only float and half type textures");
+ return __getTexture().SampleLevel(__getSampler(), location, level, offset, status);
+ case spirv:
+ return spirv_asm
+ {
+ OpCapability SparseResidency;
+ %sparseResultType = OpTypeStruct $$uint __sampledType(T);
+
+ %sparseResult:%sparseResultType = OpImageSparseSampleExplicitLod $this $location Lod|ConstOffset $level $offset;
+ %residentCode:$$uint = OpCompositeExtract %sparseResult 0;
+ %sampled:__sampledType(T) = OpCompositeExtract %sparseResult 1;
+
+ OpStore &status %residentCode;
+ __truncate $$T result __sampledType(T) %sampled;
+ };
}
}
}
@@ -1998,6 +2080,7 @@ extension _Texture<T,Shape,isArray,isMS,sampleCount,0,isShadow,0,format>
[ForceInline]
T Sample(SamplerState s, vector<float, Shape.dimensions+isArray> location, constexpr vector<int, Shape.planeDimensions> offset, float clamp, out uint status)
{
+ __requireComputeDerivative();
__target_switch
{
case hlsl:
@@ -2005,6 +2088,21 @@ extension _Texture<T,Shape,isArray,isMS,sampleCount,0,isShadow,0,format>
|| T is half || T is vector<half,2> || T is vector<half,3> || T is vector<half,4>
, "HLSL supports only float and half type textures");
__intrinsic_asm ".Sample";
+ case spirv:
+ return spirv_asm
+ {
+ OpCapability MinLod;
+ OpCapability SparseResidency;
+ %sparseResultType = OpTypeStruct $$uint __sampledType(T);
+ %sampledImage:__sampledImageType(this) = OpSampledImage $this $s;
+
+ %sparseResult:%sparseResultType = OpImageSparseSampleImplicitLod %sampledImage $location ConstOffset|MinLod $offset $clamp;
+ %residentCode:$$uint = OpCompositeExtract %sparseResult 0;
+ %sampled:__sampledType(T) = OpCompositeExtract %sparseResult 1;
+
+ OpStore &status %residentCode;
+ __truncate $$T result __sampledType(T) %sampled;
+ };
default:
status = 0;
return Sample(s, location, offset, clamp);
@@ -2142,17 +2240,32 @@ extension _Texture<T,Shape,isArray,isMS,sampleCount,0,isShadow,0,format>
[__readNone]
[ForceInline]
- [require(hlsl, sm_5_0)]
+ [require(hlsl_spirv, sm_5_0)]
T SampleBias(SamplerState s, vector<float, Shape.dimensions+isArray> location, float bias, constexpr vector<int, Shape.planeDimensions> offset, float clamp, out uint status)
{
__requireComputeDerivative();
__target_switch
{
- case hlsl:
- static_assert(T is float || T is vector<float,2> || T is vector<float,3> || T is vector<float,4>
- || T is half || T is vector<half,2> || T is vector<half,3> || T is vector<half,4>
- , "HLSL supports only float and half type textures");
- __intrinsic_asm ".SampleBias";
+ case hlsl:
+ static_assert(T is float || T is vector<float,2> || T is vector<float,3> || T is vector<float,4>
+ || T is half || T is vector<half,2> || T is vector<half,3> || T is vector<half,4>
+ , "HLSL supports only float and half type textures");
+ __intrinsic_asm ".SampleBias";
+ case spirv:
+ return spirv_asm
+ {
+ OpCapability MinLod;
+ OpCapability SparseResidency;
+ %sparseResultType = OpTypeStruct $$uint __sampledType(T);
+ %sampledImage:__sampledImageType(this) = OpSampledImage $this $s;
+
+ %sparseResult:%sparseResultType = OpImageSparseSampleImplicitLod %sampledImage $location Bias|ConstOffset|MinLod $bias $offset $clamp;
+ %residentCode:$$uint = OpCompositeExtract %sparseResult 0;
+ %sampled:__sampledType(T) = OpCompositeExtract %sparseResult 1;
+
+ OpStore &status %residentCode;
+ __truncate $$T result __sampledType(T) %sampled;
+ };
}
}
@@ -2293,7 +2406,7 @@ extension _Texture<T,Shape,isArray,isMS,sampleCount,0,isShadow,0,format>
[__readNone]
[ForceInline]
- [require(hlsl, sm_5_0)]
+ [require(hlsl_spirv, sm_5_0)]
float SampleCmp(SamplerComparisonState s, vector<float, Shape.dimensions+isArray> location, float compareValue, constexpr vector<int, Shape.planeDimensions> offset, float clamp, out uint status)
{
__requireComputeDerivative();
@@ -2304,6 +2417,20 @@ extension _Texture<T,Shape,isArray,isMS,sampleCount,0,isShadow,0,format>
|| T is half || T is vector<half,2> || T is vector<half,3> || T is vector<half,4>
, "HLSL supports only float and half type textures");
__intrinsic_asm ".SampleCmp";
+ case spirv:
+ return spirv_asm
+ {
+ OpCapability MinLod;
+ OpCapability SparseResidency;
+ %sparseResultType = OpTypeStruct $$uint $$float;
+ %sampledImage:__sampledImageType(this) = OpSampledImage $this $s;
+
+ %sparseResult:%sparseResultType = OpImageSparseSampleDrefImplicitLod %sampledImage $location $compareValue ConstOffset|MinLod $offset $clamp;
+
+ %residentCode:$$uint = OpCompositeExtract %sparseResult 0;
+ OpStore &status %residentCode;
+ result:$$float = OpCompositeExtract %sparseResult 1;
+ };
}
}
@@ -2342,7 +2469,7 @@ extension _Texture<T,Shape,isArray,isMS,sampleCount,0,isShadow,0,format>
[__readNone]
[ForceInline]
- [require(hlsl, sm_5_0)]
+ [require(hlsl_spirv, sm_5_0)]
float SampleCmpLevelZero(SamplerComparisonState s, vector<float, Shape.dimensions+isArray> location, float compareValue, constexpr vector<int, Shape.planeDimensions> offset, out uint status)
{
__target_switch
@@ -2352,6 +2479,8 @@ extension _Texture<T,Shape,isArray,isMS,sampleCount,0,isShadow,0,format>
|| T is half || T is vector<half,2> || T is vector<half,3> || T is vector<half,4>
, "HLSL supports only float and half type textures");
__intrinsic_asm ".SampleCmpLevelZero";
+ case spirv:
+ return SampleCmpLevel(s, location, compareValue, 0.0, offset, status);
}
}
@@ -2421,7 +2550,7 @@ extension _Texture<T,Shape,isArray,isMS,sampleCount,0,isShadow,0,format>
[__readNone]
[ForceInline]
- [require(hlsl, texture_shadowlod)]
+ [require(hlsl_spirv, texture_shadowlod)]
float SampleCmpLevel(SamplerComparisonState s, vector<float, Shape.dimensions+isArray> location, float compareValue, float level, constexpr vector<int, Shape.planeDimensions> offset, out uint status)
{
__target_switch
@@ -2431,6 +2560,19 @@ extension _Texture<T,Shape,isArray,isMS,sampleCount,0,isShadow,0,format>
|| T is half || T is vector<half,2> || T is vector<half,3> || T is vector<half,4>
, "HLSL supports only float and half type textures");
__intrinsic_asm ".SampleCmpLevel";
+ case spirv:
+ return spirv_asm
+ {
+ OpCapability SparseResidency;
+ %sparseResultType = OpTypeStruct $$uint $$float;
+ %sampledImage:__sampledImageType(this) = OpSampledImage $this $s;
+
+ %sparseResult:%sparseResultType = OpImageSparseSampleDrefExplicitLod %sampledImage $location $compareValue Lod|ConstOffset $level $offset;
+
+ %residentCode:$$uint = OpCompositeExtract %sparseResult 0;
+ OpStore &status %residentCode;
+ result:$$float = OpCompositeExtract %sparseResult 1;
+ };
}
}
@@ -2616,16 +2758,31 @@ extension _Texture<T,Shape,isArray,isMS,sampleCount,0,isShadow,0,format>
[__readNone]
[ForceInline]
- [require(hlsl, sm_5_0)]
+ [require(hlsl_spirv, sm_5_0)]
T SampleGrad(SamplerState s, vector<float, Shape.dimensions+isArray> location, vector<float, Shape.dimensions> gradX, vector<float, Shape.dimensions> gradY, constexpr vector<int, Shape.dimensions> offset, float lodClamp, out uint status)
{
__target_switch
{
- case hlsl:
- static_assert(T is float || T is vector<float,2> || T is vector<float,3> || T is vector<float,4>
- || T is half || T is vector<half,2> || T is vector<half,3> || T is vector<half,4>
- , "HLSL supports only float and half type textures");
- __intrinsic_asm ".SampleGrad";
+ case hlsl:
+ static_assert(T is float || T is vector<float,2> || T is vector<float,3> || T is vector<float,4>
+ || T is half || T is vector<half,2> || T is vector<half,3> || T is vector<half,4>
+ , "HLSL supports only float and half type textures");
+ __intrinsic_asm ".SampleGrad";
+ case spirv:
+ return spirv_asm
+ {
+ OpCapability MinLod;
+ OpCapability SparseResidency;
+ %sparseResultType = OpTypeStruct $$uint __sampledType(T);
+ %sampledImage:__sampledImageType(this) = OpSampledImage $this $s;
+
+ %sparseResult:%sparseResultType = OpImageSparseSampleExplicitLod %sampledImage $location Grad|ConstOffset|MinLod $gradX $gradY $offset $lodClamp;
+ %residentCode:$$uint = OpCompositeExtract %sparseResult 0;
+ %sampled:__sampledType(T) = OpCompositeExtract %sparseResult 1;
+
+ OpStore &status %residentCode;
+ __truncate $$T result __sampledType(T) %sampled;
+ };
}
}
@@ -2795,16 +2952,30 @@ extension _Texture<T,Shape,isArray,isMS,sampleCount,0,isShadow,0,format>
[__readNone]
[ForceInline]
- [require(hlsl, sm_5_0)]
+ [require(hlsl_spirv, sm_5_0)]
T SampleLevel(SamplerState s, vector<float, Shape.dimensions+isArray> location, float level, constexpr vector<int, Shape.planeDimensions> offset, out uint status)
{
__target_switch
{
case hlsl:
- static_assert(T is float || T is vector<float,2> || T is vector<float,3> || T is vector<float,4>
- || T is half || T is vector<half,2> || T is vector<half,3> || T is vector<half,4>
- , "HLSL supports only float and half type textures");
- __intrinsic_asm ".SampleLevel";
+ static_assert(T is float || T is vector<float,2> || T is vector<float,3> || T is vector<float,4>
+ || T is half || T is vector<half,2> || T is vector<half,3> || T is vector<half,4>
+ , "HLSL supports only float and half type textures");
+ __intrinsic_asm ".SampleLevel";
+ case spirv:
+ return spirv_asm
+ {
+ OpCapability SparseResidency;
+ %sparseResultType = OpTypeStruct $$uint __sampledType(T);
+ %sampledImage:__sampledImageType(this) = OpSampledImage $this $s;
+
+ %sparseResult:%sparseResultType = OpImageSparseSampleExplicitLod %sampledImage $location Lod|ConstOffset $level $offset;
+ %residentCode:$$uint = OpCompositeExtract %sparseResult 0;
+ %sampled:__sampledType(T) = OpCompositeExtract %sparseResult 1;
+
+ OpStore &status %residentCode;
+ __truncate $$T result __sampledType(T) %sampled;
+ };
}
}
}
@@ -7469,12 +7640,18 @@ T copysign(T x, T y)
// Check access status to tiled resource
[ForceInline]
-[require(hlsl, sm_5_0)]
-bool CheckAccessFullyMapped(out uint status)
+[require(hlsl_spirv, sm_5_0)]
+bool CheckAccessFullyMapped(uint status)
{
__target_switch
{
case hlsl: __intrinsic_asm "CheckAccessFullyMapped";
+ case spirv:
+ return spirv_asm
+ {
+ OpCapability SparseResidency;
+ result:$$bool = OpImageSparseTexelsResident $status;
+ };
}
}