Browse Source

Fix crash caused by precise on gs output. (#2650)

Xiang Li 5 years ago
parent
commit
0532d8cd08

+ 4 - 1
lib/HLSL/HLSignatureLower.cpp

@@ -952,7 +952,7 @@ void GenerateInputOutputUserCall(InputOutputAccessInfo &info, Value *undefVertex
   } else if (CallInst *CI = dyn_cast<CallInst>(info.user)) {
     HLOpcodeGroup group = GetHLOpcodeGroupByName(CI->getCalledFunction());
     // Intrinsic will be translated later.
-    if (group == HLOpcodeGroup::HLIntrinsic)
+    if (group == HLOpcodeGroup::HLIntrinsic || group == HLOpcodeGroup::NotHL)
       return;
     unsigned opcode = GetHLOpcode(CI);
     DXASSERT_NOMSG(group == HLOpcodeGroup::HLMatLoadStore);
@@ -1549,6 +1549,9 @@ void HLSignatureLower::GenerateStreamOutputOperation(Value *streamVal, unsigned
     // Should only used by append, restartStrip .
     CallInst *CI = cast<CallInst>(user);
     HLOpcodeGroup group = GetHLOpcodeGroupByName(CI->getCalledFunction());
+    // Ignore user functions.
+    if (group == HLOpcodeGroup::NotHL)
+      continue;
     unsigned opcode = GetHLOpcode(CI);
     DXASSERT_LOCALVAR(group, group == HLOpcodeGroup::HLIntrinsic, "Must be HLIntrinsic here");
     IntrinsicOp IOP = static_cast<IntrinsicOp>(opcode);

+ 25 - 0
tools/clang/test/HLSLFileCheck/shader_targets/geometry/gs_precise_output.hlsl

@@ -0,0 +1,25 @@
+// RUN: %dxc -E main -T gs_6_0 %s | FileCheck %s
+
+// Make sure load input has precise.
+// CHECK:loadInput.f32(i32 4, i32 0, i32 0, i8 0, i32 {{.*}}), !dx.precise
+// Make sure fadd not have fast.
+// CHECK:fadd float %3, 1.000000e+00
+
+struct MyStruct
+{
+  precise  float4 pos : SV_Position;
+};
+
+
+[maxvertexcount(12)]
+void main(point float4 array[1] : COORD, inout PointStream<MyStruct> OutputStream0)
+{
+ float4 r = array[0];
+  MyStruct a = (MyStruct)0;
+
+  a.pos = array[r.x] + 1;
+
+    OutputStream0.Append(a);
+    OutputStream0.RestartStrip();
+
+}