Sfoglia il codice sorgente

Fix validation failure for 16-bit float resource types (#2524)

Fix validation failure for 16-bit float resource types, add fp16 test coverage for Texture2D.Sample*
Helena Kotas 6 anni fa
parent
commit
57a8a6c8db

+ 3 - 0
lib/HLSL/DxilValidation.cpp

@@ -1297,6 +1297,9 @@ static void ValidateSampleInst(CallInst *CI, Value *srvHandle, Value *samplerHan
   bool isSampleCompTy = compTy == DXIL::ComponentType::F32;
   isSampleCompTy |= compTy == DXIL::ComponentType::SNormF32;
   isSampleCompTy |= compTy == DXIL::ComponentType::UNormF32;
+  isSampleCompTy |= compTy == DXIL::ComponentType::F16;
+  isSampleCompTy |= compTy == DXIL::ComponentType::SNormF16;
+  isSampleCompTy |= compTy == DXIL::ComponentType::UNormF16;
   if (!isSampleCompTy) {
     ValCtx.EmitInstrError(CI, ValidationRule::InstrSampleCompType);
   }

+ 24 - 6
tools/clang/test/HLSLFileCheck/hlsl/objects/Texture/sample3.hlsl

@@ -1,17 +1,35 @@
-// RUN: %dxc -E main -T ps_6_0 %s | FileCheck %s
+// RUN: %dxc -E main -T ps_6_0 -DTYPE=float4 %s                            | FileCheck %s -check-prefix=CHK_FLOAT
+// RUN: %dxc -E main -T ps_6_2 -DTYPE=half4       -enable-16bit-types %s   | FileCheck %s -check-prefix=CHK_HALF
+// RUN: %dxc -E main -T ps_6_2 -DTYPE=min16float4 -enable-16bit-types %s   | FileCheck %s -check-prefix=CHK_HALF
+
 
 // CHECK: @main
 SamplerState samp1 : register(s5);
-Texture2D<float4> text1 : register(t3);
+Texture2D<TYPE> text1 : register(t3);
 
-float4 main(float2 a : A) : SV_Target
-{
+TYPE main(float2 a
+          : A) : SV_Target {
   uint status;
-  float4 r = 0;
+  TYPE r = 0;
+  // CHK_FLOAT:  call %dx.types.ResRet.f32 @dx.op.sample.f32(i32 60, 
+  // CHK_HALF:   call %dx.types.ResRet.f16 @dx.op.sample.f16(i32 60,
   r += text1.Sample(samp1, a);
+
+  // CHK_FLOAT:  call %dx.types.ResRet.f32 @dx.op.sample.f32(i32 60,
+  // CHK_HALF:   call %dx.types.ResRet.f16 @dx.op.sample.f16(i32 60,
   r += text1.Sample(samp1, a, uint2(-5, 7));
+
+  // CHK_FLOAT:  call %dx.types.ResRet.f32 @dx.op.sample.f32(i32 60,
+  // CHK_HALF:   call %dx.types.ResRet.f16 @dx.op.sample.f16(i32 60,
   r += text1.Sample(samp1, a, uint2(-4, 1), 0.5f);
-  r += text1.Sample(samp1, a, uint2(-3, 2), 0.f, status); r += status;
+
+  // CHK_FLOAT:  call %dx.types.ResRet.f32 @dx.op.sample.f32(i32 60,
+  // CHK_HALF:   call %dx.types.ResRet.f16 @dx.op.sample.f16(i32 60,
+  r += text1.Sample(samp1, a, uint2(-3, 2), 0.f, status);
+
+  // CHK_FLOAT:  call %dx.types.ResRet.f32 @dx.op.sample.f32(i32 60,
+  // CHK_HALF:   call %dx.types.ResRet.f16 @dx.op.sample.f16(i32 60,
+  r += status;
   r += text1.Sample(samp1, a, uint2(-3, 2), a.x, status); r += status;
   return r;
 }

+ 22 - 9
tools/clang/test/HLSLFileCheck/hlsl/objects/Texture/sampleBias.hlsl

@@ -1,18 +1,31 @@
-// RUN: %dxc -E main -T ps_6_0 %s  | FileCheck %s
-
-// CHECK: sampleBias
+// RUN: %dxc -E main -T ps_6_0 -DTYPE=float4 %s                            | FileCheck %s -check-prefix=CHK_FLOAT
+// RUN: %dxc -E main -T ps_6_2 -DTYPE=half4       -enable-16bit-types %s   | FileCheck %s -check-prefix=CHK_HALF
+// RUN: %dxc -E main -T ps_6_2 -DTYPE=min16float4 -enable-16bit-types %s   | FileCheck %s -check-prefix=CHK_HALF
 
 SamplerState samp1 : register(s5);
-Texture2D<float4> text1 : register(t3);
+Texture2D<TYPE> text1 : register(t3);
 float bias;
-float4 main(float2 a : A) : SV_Target
-{
+TYPE main(float2 a
+          : A) : SV_Target {
   uint status;
-  float4 r = 0;
+  TYPE r = 0;
+
+  // CHK_FLOAT:  call %dx.types.ResRet.f32 @dx.op.sampleBias.f32(i32 61,
+  // CHK_HALF:   call %dx.types.ResRet.f16 @dx.op.sampleBias.f16(i32 61,
   r += text1.SampleBias(samp1, a, -999);
+  // CHK_FLOAT:  call %dx.types.ResRet.f32 @dx.op.sampleBias.f32(i32 61,
+  // CHK_HALF:   call %dx.types.ResRet.f16 @dx.op.sampleBias.f16(i32 61,
   r += text1.SampleBias(samp1, a, bias, uint2(-5, 7));
+  // CHK_FLOAT:  call %dx.types.ResRet.f32 @dx.op.sampleBias.f32(i32 61,
+  // CHK_HALF:   call %dx.types.ResRet.f16 @dx.op.sampleBias.f16(i32 61,
   r += text1.SampleBias(samp1, a, bias, uint2(-4, 1), 0.5f);
-  r += text1.SampleBias(samp1, a, bias, uint2(-3, 2), 0.f, status); r += status;
-  r += text1.SampleBias(samp1, a, bias, uint2(-3, 2), a.x, status); r += status;
+  // CHK_FLOAT:  call %dx.types.ResRet.f32 @dx.op.sampleBias.f32(i32 61,
+  // CHK_HALF:   call %dx.types.ResRet.f16 @dx.op.sampleBias.f16(i32 61,
+  r += text1.SampleBias(samp1, a, bias, uint2(-3, 2), 0.f, status);
+  // CHK_FLOAT:  call %dx.types.ResRet.f32 @dx.op.sampleBias.f32(i32 61,
+  // CHK_HALF:   call %dx.types.ResRet.f16 @dx.op.sampleBias.f16(i32 61,
+  r += status;
+  r += text1.SampleBias(samp1, a, bias, uint2(-3, 2), a.x, status);
+  r += status;
   return r;
 }

+ 14 - 9
tools/clang/test/HLSLFileCheck/hlsl/objects/Texture/sampleCmp.hlsl

@@ -1,17 +1,22 @@
-// RUN: %dxc -E main -T ps_6_0 %s  | FileCheck %s
-
-// CHECK: sampleCmp
+// RUN: %dxc -E main -T ps_6_0 -DTYPE=float4 %s                            | FileCheck %s -check-prefix=CHECK
+// RUN: %dxc -E main -T ps_6_2 -DTYPE=half4       -enable-16bit-types %s   | FileCheck %s -check-prefix=CHECK
+// RUN: %dxc -E main -T ps_6_2 -DTYPE=min16float4 -enable-16bit-types %s   | FileCheck %s -check-prefix=CHECK
 
 SamplerComparisonState samp1 : register(s5);
-Texture2D<float4> text1 : register(t3);
-float cmpVal;
-float4 main(float2 a : A) : SV_Target
-{
+Texture2D<TYPE> text1 : register(t3);
+half cmpVal;
+float main(float2 a
+          : A) : SV_Target {
   uint status;
-  float4 r = 0;
+  float r = 0;
+  // CHECK:  call %dx.types.ResRet.f32 @dx.op.sampleCmp.f32(i32 64,
   r += text1.SampleCmp(samp1, a, cmpVal);
+  // CHECK:  call %dx.types.ResRet.f32 @dx.op.sampleCmp.f32(i32 64,
   r += text1.SampleCmp(samp1, a, cmpVal, uint2(-5, 7));
+  // CHECK:  call %dx.types.ResRet.f32 @dx.op.sampleCmp.f32(i32 64,
   r += text1.SampleCmp(samp1, a, cmpVal, uint2(-5, 7), a.x);
-  r += text1.SampleCmp(samp1, a, cmpVal, uint2(-3, 2), a.y, status); r += status;
+  // CHECK:  call %dx.types.ResRet.f32 @dx.op.sampleCmp.f32(i32 64,
+  r += text1.SampleCmp(samp1, a, cmpVal, uint2(-3, 2), a.y, status);
+  r += status;
   return r;
 }

+ 12 - 8
tools/clang/test/HLSLFileCheck/hlsl/objects/Texture/sampleCmpLZ.hlsl

@@ -1,16 +1,20 @@
-// RUN: %dxc -E main -T ps_6_0 %s  | FileCheck %s
-
-// CHECK: sampleCmpLevelZero
+// RUN: %dxc -E main -T ps_6_0 -DTYPE=float4 %s                            | FileCheck %s -check-prefix=CHECK
+// RUN: %dxc -E main -T ps_6_2 -DTYPE=half4       -enable-16bit-types %s   | FileCheck %s -check-prefix=CHECK
+// RUN: %dxc -E main -T ps_6_2 -DTYPE=min16float4 -enable-16bit-types %s   | FileCheck %s -check-prefix=CHECK
 
 SamplerComparisonState samp1 : register(s5);
-Texture2D<float4> text1 : register(t3);
+Texture2D<TYPE> text1 : register(t3);
 float cmpVal;
-float4 main(float2 a : A) : SV_Target
-{
+float main(float2 a
+          : A) : SV_Target {
   uint status;
-  float4 r = 0;
+  float r = 0;
+  // CHECK:  call %dx.types.ResRet.f32 @dx.op.sampleCmpLevelZero.f32(i32 65,
   r += text1.SampleCmpLevelZero(samp1, a, cmpVal);
+  // CHECK:  call %dx.types.ResRet.f32 @dx.op.sampleCmpLevelZero.f32(i32 65,
   r += text1.SampleCmpLevelZero(samp1, a, cmpVal, uint2(-5, 7));
-  r += text1.SampleCmpLevelZero(samp1, a, cmpVal, uint2(-3, 2), status); r += status;
+  // CHECK:  call %dx.types.ResRet.f32 @dx.op.sampleCmpLevelZero.f32(i32 65,
+  r += text1.SampleCmpLevelZero(samp1, a, cmpVal, uint2(-3, 2), status);
+  r += status;
   return r;
 }

+ 11 - 7
tools/clang/test/HLSLFileCheck/hlsl/objects/Texture/sampleCmpLZ2.hlsl

@@ -1,20 +1,24 @@
-// RUN: %dxc -E main -T cs_6_0 %s  | FileCheck %s
-
-// CHECK: sampleCmpLevelZero
+// RUN: %dxc -E main -T cs_6_0 -DTYPE=float4 %s                            | FileCheck %s -check-prefix=CHECK
+// RUN: %dxc -E main -T cs_6_2 -DTYPE=half4       -enable-16bit-types %s   | FileCheck %s -check-prefix=CHECK
+// RUN: %dxc -E main -T cs_6_2 -DTYPE=min16float4 -enable-16bit-types %s   | FileCheck %s -check-prefix=CHECK
 
 SamplerComparisonState samp1 : register(s5);
-Texture2D<float4> text1 : register(t3);
+Texture2D<TYPE> text1 : register(t3);
 float cmpVal;
-RWBuffer<float4> buf1;
+RWBuffer<TYPE> buf1;
 
 [numthreads(8, 8, 8)]
 void main(uint dtID : SV_DispatchThreadID)
 {
   uint status;
   float2 a = buf1[dtID].xy;
-  float4 r = 0;
+  TYPE r = 0;
+  // CHECK:  call %dx.types.ResRet.f32 @dx.op.sampleCmpLevelZero.f32(i32 65,
   r += text1.SampleCmpLevelZero(samp1, a, cmpVal);
+  // CHECK:  call %dx.types.ResRet.f32 @dx.op.sampleCmpLevelZero.f32(i32 65,
   r += text1.SampleCmpLevelZero(samp1, a, cmpVal, uint2(-5, 7));
-  r += text1.SampleCmpLevelZero(samp1, a, cmpVal, uint2(-3, 2), status); r += status;
+  // CHECK:  call %dx.types.ResRet.f32 @dx.op.sampleCmpLevelZero.f32(i32 65,
+  r += text1.SampleCmpLevelZero(samp1, a, cmpVal, uint2(-3, 2), status);
+  r += status;
   buf1[dtID] = r;
 }

+ 22 - 10
tools/clang/test/HLSLFileCheck/hlsl/objects/Texture/sampleGrad.hlsl

@@ -1,21 +1,33 @@
-// RUN: %dxc -E main -T ps_6_0 %s  | FileCheck %s
-
-// CHECK: sampleGrad
+// RUN: %dxc -E main -T ps_6_0 -DTYPE=float4 %s                            | FileCheck %s -check-prefix=CHK_FLOAT
+// RUN: %dxc -E main -T ps_6_2 -DTYPE=half4       -enable-16bit-types %s   | FileCheck %s -check-prefix=CHK_HALF
+// RUN: %dxc -E main -T ps_6_2 -DTYPE=min16float4 -enable-16bit-types %s   | FileCheck %s -check-prefix=CHK_HALF
 
 SamplerState samp1 : register(s5);
-Texture2D<float4> text1 : register(t3);
+Texture2D<TYPE> text1 : register(t3);
 
 float2 ddx;
 float2 ddy;
 
-float4 main(float2 a : A) : SV_Target
-{
+TYPE main(float2 a
+          : A) : SV_Target {
   uint status;
-  float4 r = 0;
-  r += text1.SampleGrad(samp1, a,ddx, ddy);
+  TYPE r = 0;
+  // CHK_FLOAT:  call %dx.types.ResRet.f32 @dx.op.sampleGrad.f32(i32 63,
+  // CHK_HALF:   call %dx.types.ResRet.f16 @dx.op.sampleGrad.f16(i32 63,
+  r += text1.SampleGrad(samp1, a, ddx, ddy);
+  // CHK_FLOAT:  call %dx.types.ResRet.f32 @dx.op.sampleGrad.f32(i32 63,
+  // CHK_HALF:   call %dx.types.ResRet.f16 @dx.op.sampleGrad.f16(i32 63,
   r += text1.SampleGrad(samp1, a, ddx, ddy, uint2(-5, 7));
+  // CHK_FLOAT:  call %dx.types.ResRet.f32 @dx.op.sampleGrad.f32(i32 63,
+  // CHK_HALF:   call %dx.types.ResRet.f16 @dx.op.sampleGrad.f16(i32 63,
   r += text1.SampleGrad(samp1, a, ddx, ddy, uint2(-4, 1), 0.5f);
-  r += text1.SampleGrad(samp1, a, ddx, ddy, uint2(-3, 2), 0.f, status); r += status;
-  r += text1.SampleGrad(samp1, a, ddx, ddy, uint2(-3, 2), a.x, status); r += status;
+  // CHK_FLOAT:  call %dx.types.ResRet.f32 @dx.op.sampleGrad.f32(i32 63,
+  // CHK_HALF:   call %dx.types.ResRet.f16 @dx.op.sampleGrad.f16(i32 63,
+  r += text1.SampleGrad(samp1, a, ddx, ddy, uint2(-3, 2), 0.f, status);
+  r += status;
+  // CHK_FLOAT:  call %dx.types.ResRet.f32 @dx.op.sampleGrad.f32(i32 63,
+  // CHK_HALF:   call %dx.types.ResRet.f16 @dx.op.sampleGrad.f16(i32 63,
+  r += text1.SampleGrad(samp1, a, ddx, ddy, uint2(-3, 2), a.x, status);
+  r += status;
   return r;
 }

+ 28 - 15
tools/clang/test/HLSLFileCheck/hlsl/objects/Texture/sampleL.hlsl

@@ -1,25 +1,38 @@
-// RUN: %dxc -E main -T ps_6_0 %s   | FileCheck %s
+// RUN: %dxc -E main -T ps_6_0 -DTYPE=float4 %s                            | FileCheck %s -check-prefix=CHK_FLOAT
+// RUN: %dxc -E main -T ps_6_2 -DTYPE=half4       -enable-16bit-types %s   | FileCheck %s -check-prefix=CHK_HALF
+// RUN: %dxc -E main -T ps_6_2 -DTYPE=min16float4 -enable-16bit-types %s   | FileCheck %s -check-prefix=CHK_HALF
 
 SamplerState samp1 : register(s5);
-Texture2D<float4> text1 : register(t3);
-TextureCubeArray<float4> text2 : register(t5);
+Texture2D<TYPE> text1 : register(t3);
+TextureCubeArray<TYPE> text2 : register(t5);
+
 int LOD;
-float4 main(float2 a : A) : SV_Target
-{
+TYPE main(float2 a
+            : A) : SV_Target {
   uint status;
-  float4 r = 0;
+  TYPE r = 0;
 
-  // CHECK: call %dx.types.ResRet.f32 @dx.op.sampleLevel.f32(i32 62,
+  // CHK_FLOAT:  call %dx.types.ResRet.f32 @dx.op.sampleLevel.f32(i32 62,
+  // CHK_HALF:   call %dx.types.ResRet.f16 @dx.op.sampleLevel.f16(i32 62,
   r += text1.SampleLevel(samp1, a, LOD);
-  // CHECK: call %dx.types.ResRet.f32 @dx.op.sampleLevel.f32(i32 62,
+  // CHK_FLOAT:  call %dx.types.ResRet.f32 @dx.op.sampleLevel.f32(i32 62,
+  // CHK_HALF:   call %dx.types.ResRet.f16 @dx.op.sampleLevel.f16(i32 62,
   r += text1.SampleLevel(samp1, a, LOD, uint2(-5, 7));
-  // CHECK: call %dx.types.ResRet.f32 @dx.op.sampleLevel.f32(i32 62,
-  // CHECK: call i1 @dx.op.checkAccessFullyMapped.i32(i32 71,
-  r += text1.SampleLevel(samp1, a, LOD, uint2(-3, 2), status); r += CheckAccessFullyMapped(status);
-  // CHECK: call %dx.types.ResRet.f32 @dx.op.sampleLevel.f32(i32 62,
+  // CHK_FLOAT:  call %dx.types.ResRet.f32 @dx.op.sampleLevel.f32(i32 62,
+  // CHK_HALF:   call %dx.types.ResRet.f16 @dx.op.sampleLevel.f16(i32 62,
+  // CHK_FLOAT:  call i1 @dx.op.checkAccessFullyMapped.i32(i32 71,
+  // CHK_HALF:   call i1 @dx.op.checkAccessFullyMapped.i32(i32 71,
+  r += text1.SampleLevel(samp1, a, LOD, uint2(-3, 2), status);
+  r += CheckAccessFullyMapped(status);
+  // CHK_FLOAT:  call %dx.types.ResRet.f32 @dx.op.sampleLevel.f32(i32 62,
+  // CHK_HALF:   call %dx.types.ResRet.f16 @dx.op.sampleLevel.f16(i32 62,
   r += text2.SampleLevel(samp1, a.xyxy, LOD);
-  // CHECK: call %dx.types.ResRet.f32 @dx.op.sampleLevel.f32(i32 62,
-  // CHECK: call i1 @dx.op.checkAccessFullyMapped.i32(i32 71,
-  r += text2.SampleLevel(samp1, a.xyxy, LOD * 0.5, status); r += CheckAccessFullyMapped(status);
+  // CHK_FLOAT:  call %dx.types.ResRet.f32 @dx.op.sampleLevel.f32(i32 62,
+  // CHK_HALF:   call %dx.types.ResRet.f16 @dx.op.sampleLevel.f16(i32 62,
+  // CHK_FLOAT:  call i1 @dx.op.checkAccessFullyMapped.i32(i32 71,
+  // CHK_HALF:   call i1 @dx.op.checkAccessFullyMapped.i32(i32 71,
+  r += text2.SampleLevel(samp1, a.xyxy, LOD * 0.5, status);
+  r += CheckAccessFullyMapped(status);
+
   return r;
 }