Fix crash caused by precise on gs output. (#2650)
This commit is contained in:
Родитель
80ec7c6bc7
Коммит
0532d8cd08
|
@ -952,7 +952,7 @@ void GenerateInputOutputUserCall(InputOutputAccessInfo &info, Value *undefVertex
|
||||||
} else if (CallInst *CI = dyn_cast<CallInst>(info.user)) {
|
} else if (CallInst *CI = dyn_cast<CallInst>(info.user)) {
|
||||||
HLOpcodeGroup group = GetHLOpcodeGroupByName(CI->getCalledFunction());
|
HLOpcodeGroup group = GetHLOpcodeGroupByName(CI->getCalledFunction());
|
||||||
// Intrinsic will be translated later.
|
// Intrinsic will be translated later.
|
||||||
if (group == HLOpcodeGroup::HLIntrinsic)
|
if (group == HLOpcodeGroup::HLIntrinsic || group == HLOpcodeGroup::NotHL)
|
||||||
return;
|
return;
|
||||||
unsigned opcode = GetHLOpcode(CI);
|
unsigned opcode = GetHLOpcode(CI);
|
||||||
DXASSERT_NOMSG(group == HLOpcodeGroup::HLMatLoadStore);
|
DXASSERT_NOMSG(group == HLOpcodeGroup::HLMatLoadStore);
|
||||||
|
@ -1549,6 +1549,9 @@ void HLSignatureLower::GenerateStreamOutputOperation(Value *streamVal, unsigned
|
||||||
// Should only used by append, restartStrip .
|
// Should only used by append, restartStrip .
|
||||||
CallInst *CI = cast<CallInst>(user);
|
CallInst *CI = cast<CallInst>(user);
|
||||||
HLOpcodeGroup group = GetHLOpcodeGroupByName(CI->getCalledFunction());
|
HLOpcodeGroup group = GetHLOpcodeGroupByName(CI->getCalledFunction());
|
||||||
|
// Ignore user functions.
|
||||||
|
if (group == HLOpcodeGroup::NotHL)
|
||||||
|
continue;
|
||||||
unsigned opcode = GetHLOpcode(CI);
|
unsigned opcode = GetHLOpcode(CI);
|
||||||
DXASSERT_LOCALVAR(group, group == HLOpcodeGroup::HLIntrinsic, "Must be HLIntrinsic here");
|
DXASSERT_LOCALVAR(group, group == HLOpcodeGroup::HLIntrinsic, "Must be HLIntrinsic here");
|
||||||
IntrinsicOp IOP = static_cast<IntrinsicOp>(opcode);
|
IntrinsicOp IOP = static_cast<IntrinsicOp>(opcode);
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
}
|
Загрузка…
Ссылка в новой задаче