ソースを参照

No sinking coord calc for sample in libs (#3658)

Amidst catching the CS/AS/MS cases where convergent markers weren't
getting generated, it was pointed out that libs may need these too.
Greg Roth 4 年 前
コミット
cac37e6890

+ 1 - 1
lib/HLSL/DxilConvergent.cpp

@@ -48,7 +48,7 @@ public:
   bool runOnModule(Module &M) override {
     if (M.HasHLModule()) {
       const ShaderModel *SM = M.GetHLModule().GetShaderModel();
-      if (!SM->IsPS() && (!SM->IsSM66Plus() || (!SM->IsCS() && !SM->IsMS() && !SM->IsAS())))
+      if (!SM->IsPS() && !SM->IsLib() && (!SM->IsSM66Plus() || (!SM->IsCS() && !SM->IsMS() && !SM->IsAS())))
         return false;
     }
     bool bUpdated = false;

+ 21 - 12
tools/clang/test/HLSLFileCheck/hlsl/objects/Texture/convergent_cs.hlsl

@@ -1,13 +1,15 @@
+// RUN: %dxc -E MainPS -T ps_6_6 %s | FileCheck %s
 // RUN: %dxc -E MainCS -T cs_6_6 %s | FileCheck %s
 // RUN: %dxc -E MainAS -T as_6_6 %s | FileCheck %s
 // RUN: %dxc -E MainMS -T ms_6_6 %s | FileCheck %s
+// RUN: %dxc -T lib_6_6 %s | FileCheck %s
 
 // Make sure add is not sunk into if.
 // Compute shader variant of convergent.hlsl
 
-// CHECK: add
-// CHECK: add
-// CHECK: icmp
+// CHECK: fadd
+// CHECK: fadd
+// CHECK: fcmp
 // CHECK-NEXT: br
 
 
@@ -15,34 +17,41 @@ Texture2D<float4> tex;
 RWBuffer<float4> output;
 SamplerState s;
 
-void doit(uint ix, uint3 id){
+float4 doit(float2 a, float b){
 
-  float2 coord = id.xy + id.z;
-  float4 c = id.z;
-  if (id.z > 2) {
+  float2 coord = a + b;
+  float4 c = b;
+  if (b > 2) {
     c += tex.Sample(s, coord);
   }
-  output[ix] = c;
-
+  return c;
 }
 
+[shader("compute")]
 [numthreads(4,4,4)]
 void MainCS(uint ix : SV_GroupIndex, uint3 id : SV_GroupThreadID) {
-  doit(ix, id);
+  output[ix] = doit(id.xy, id.z);
 }
 
 struct Payload { int nothing; };
 
+[shader("amplification")]
 [numthreads(4,4,4)]
 void MainAS(uint ix : SV_GroupIndex, uint3 id : SV_GroupThreadID) {
-  doit(ix, id);
+  output[ix] = doit(id.xy, id.z);
   Payload pld = (Payload)0;
   DispatchMesh(1,1,1,pld);
 }
 
 
+[shader("mesh")]
 [numthreads(4,4,4)]
 [outputtopology("triangle")]
 void MainMS(uint ix : SV_GroupIndex, uint3 id : SV_GroupThreadID) {
-  doit(ix, id);
+  output[ix] = doit(id.xy, id.z);
+}
+
+[shader("pixel")]
+float4 MainPS(float2 a:A, float b:B) : SV_Target {
+  return doit(a, b);
 }