Fix opcodes in tests and metadata versioning to handle early serialization

- Fix metadata version logic to handle no shader model for early HLModule.
- Modify validation tests that change validator version to 1.3 to also
  modify the struct annotation to conform to that version of the type
  annotation metadata.
- Fix opcodes from merge.
- Add CHECKs for RayQuery intrinsics in tryAllOps, disabled until handle
  alloca can be properly eliminated.
This commit is contained in:
Tex Riddell 2019-07-11 21:04:32 -07:00
Родитель 6b4c3b4710
Коммит afb0482332
8 изменённых файлов: 91 добавлений и 43 удалений

Просмотреть файл

@ -805,8 +805,9 @@ void DxilMDHelper::LoadDxilTemplateArgAnnotation(const llvm::MDOperand &MDO, Dxi
}
Metadata *DxilMDHelper::EmitDxilStructAnnotation(const DxilStructAnnotation &SA) {
unsigned valMajor, valMinor;
m_pSM->GetMinValidatorVersion(valMajor, valMinor);
unsigned valMajor = 0, valMinor = 0;
if (m_pSM)
m_pSM->GetMinValidatorVersion(valMajor, valMinor);
bool bSupportExtended = !(valMajor == 1 && valMinor < 5);
vector<Metadata *> MDVals;
@ -840,8 +841,9 @@ void DxilMDHelper::LoadDxilStructAnnotation(const MDOperand &MDO, DxilStructAnno
if (pTupleMD->getNumOperands() == 1) {
SA.MarkEmptyStruct();
}
unsigned valMajor, valMinor;
m_pSM->GetMinValidatorVersion(valMajor, valMinor);
unsigned valMajor = 0, valMinor = 0;
if (m_pSM)
m_pSM->GetMinValidatorVersion(valMajor, valMinor);
if (!(valMajor == 1 && valMinor < 5) &&
(pTupleMD->getNumOperands() == SA.GetNumFields()+2)) {
// Load template args from extended operand

Просмотреть файл

@ -2,7 +2,7 @@
// CHECK: main
// After lowering, these would turn into multiple abs calls rather than a 4 x float
// CHECK: call <4 x float> @"dx.hl.op..<4 x float> (i32, <4 x float>)"(i32 93,
// CHECK: call <4 x float> @"dx.hl.op..<4 x float> (i32, <4 x float>)"(i32 94,
float4 main(float4 a : A) : SV_TARGET {
return abs(a*a.yxxx);

Просмотреть файл

@ -1,9 +1,9 @@
// RUN: %dxc -T vs_6_5 -E main %s | FileCheck %s
// CHECK: %[[RTAS:[^ ]+]] = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 0, i32 0, i32 0, i1 false)
// CHECK: %[[RQ:[^ ]+]] = call i32 @dx.op.allocateRayQuery(i32 168, i32 1)
// CHECK: call void @dx.op.rayQuery_TraceRayInline(i32 169, i32 %[[RQ]], %dx.types.Handle %[[RTAS]], i32 0, i32 1,
// CHECK: call void @dx.op.rayQuery_TraceRayInline(i32 169, i32 %[[RQ]], %dx.types.Handle %[[RTAS]], i32 1, i32 2,
// CHECK: %[[RQ:[^ ]+]] = call i32 @dx.op.allocateRayQuery(i32 178, i32 1)
// CHECK: call void @dx.op.rayQuery_TraceRayInline(i32 179, i32 %[[RQ]], %dx.types.Handle %[[RTAS]], i32 0, i32 1,
// CHECK: call void @dx.op.rayQuery_TraceRayInline(i32 179, i32 %[[RQ]], %dx.types.Handle %[[RTAS]], i32 1, i32 2,
RaytracingAccelerationStructure RTAS;

Просмотреть файл

@ -1,6 +1,49 @@
// RUN: %dxc -T cs_6_5 -E CS %s | FileCheck %s
// RUN: %dxc -T cs_6_5 -E CS %s
// TODO: Eliminate ray query handle alloca and phis, then add: | FileCheck %s
// CHECK: define void @CS()
// CHECK: define void @CS()
// RayQuery alloca should have been dead-code eliminated
// CHECK-NOT: alloca
// %[[hAccelerationStructure:[^ ]+]] = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 0, i32 0, i32 0, i1 false)
// CHECK: %[[hRayQuery:[^ ]+]] = call i32 @dx.op.allocateRayQuery(i32 178, i32 5)
// CHECK: call void @dx.op.rayQuery_TraceRayInline(i32 179, i32 %[[hRayQuery]], %dx.types.Handle %[[hAccelerationStructure]], i32 0, i32 255, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float 1.000000e+00, float 0.000000e+00, float 0.000000e+00, float 9.999000e+03)
// CHECK: call i1 @dx.op.rayQuery_Proceed.i1(i32 180, i32 %[[hRayQuery]])
// CHECK: call i32 @dx.op.rayQuery_StateScalar.i32(i32 185, i32 %[[hRayQuery]])
// CHECK: call void @dx.op.rayQuery_Abort(i32 181, i32 %[[hRayQuery]])
// CHECK: call float @dx.op.rayQuery_StateMatrix.f32(i32 186, i32 %[[hRayQuery]], i32 0, i8 0)
// CHECK: call void @dx.op.rayQuery_CommitNonOpaqueTriangleHit(i32 182, i32 %[[hRayQuery]])
// CHECK: call i1 @dx.op.rayQuery_StateScalar.i1(i32 191, i32 %[[hRayQuery]])
// CHECK: call float @dx.op.rayQuery_StateVector.f32(i32 193, i32 %[[hRayQuery]], i8 0)
// CHECK: call i32 @dx.op.rayQuery_StateScalar.i32(i32 203, i32 %[[hRayQuery]])
// CHECK: call i32 @dx.op.rayQuery_StateScalar.i32(i32 202, i32 %[[hRayQuery]])
// CHECK: call i32 @dx.op.rayQuery_StateScalar.i32(i32 201, i32 %[[hRayQuery]])
// CHECK: call float @dx.op.rayQuery_StateVector.f32(i32 206, i32 %[[hRayQuery]], i8 0)
// CHECK: call float @dx.op.rayQuery_StateVector.f32(i32 205, i32 %[[hRayQuery]], i8 1)
// CHECK: call i32 @dx.op.rayQuery_StateScalar.i32(i32 204, i32 %[[hRayQuery]])
// CHECK: call float @dx.op.rayQuery_StateScalar.f32(i32 199, i32 %[[hRayQuery]])
// CHECK: call i1 @dx.op.rayQuery_Proceed.i1(i32 180, i32 %[[hRayQuery]])
// CHECK: call float @dx.op.rayQuery_StateMatrix.f32(i32 187, i32 %[[hRayQuery]], i32 0, i8 0)
// CHECK: call i1 @dx.op.rayQuery_StateScalar.i1(i32 190, i32 %[[hRayQuery]])
// CHECK: call void @dx.op.rayQuery_CommitProceduralPrimitiveHit(i32 183, i32 %[[hRayQuery]], float 5.000000e-01)
// CHECK: call void @dx.op.rayQuery_Abort(i32 181, i32 %[[hRayQuery]])
// CHECK: call i32 @dx.op.rayQuery_StateScalar.i32(i32 184, i32 %[[hRayQuery]])
// CHECK: call float @dx.op.rayQuery_StateMatrix.f32(i32 188, i32 %[[hRayQuery]], i32 0, i8 0)
// CHECK: call float @dx.op.rayQuery_StateMatrix.f32(i32 189, i32 %[[hRayQuery]], i32 0, i8 0)
// CHECK: call i1 @dx.op.rayQuery_StateScalar.i1(i32 192, i32 %[[hRayQuery]])
// CHECK: call float @dx.op.rayQuery_StateVector.f32(i32 194, i32 %[[hRayQuery]], i8 1)
// CHECK: call i32 @dx.op.rayQuery_StateScalar.i32(i32 209, i32 %[[hRayQuery]])
// CHECK: call i32 @dx.op.rayQuery_StateScalar.i32(i32 208, i32 %[[hRayQuery]])
// CHECK: call i32 @dx.op.rayQuery_StateScalar.i32(i32 207, i32 %[[hRayQuery]])
// CHECK: call float @dx.op.rayQuery_StateVector.f32(i32 212, i32 %[[hRayQuery]], i8 2)
// CHECK: call float @dx.op.rayQuery_StateVector.f32(i32 211, i32 %[[hRayQuery]], i8 0)
// CHECK: call i32 @dx.op.rayQuery_StateScalar.i32(i32 210, i32 %[[hRayQuery]])
// CHECK: call float @dx.op.rayQuery_StateScalar.f32(i32 200, i32 %[[hRayQuery]])
// CHECK: call i32 @dx.op.rayQuery_StateScalar.i32(i32 195, i32 %[[hRayQuery]])
// CHECK: call float @dx.op.rayQuery_StateScalar.f32(i32 198, i32 %[[hRayQuery]])
// CHECK: call float @dx.op.rayQuery_StateVector.f32(i32 197, i32 %[[hRayQuery]], i8 0)
// CHECK: call float @dx.op.rayQuery_StateVector.f32(i32 196, i32 %[[hRayQuery]], i8 2)
RaytracingAccelerationStructure AccelerationStructure : register(t0);
RWByteAddressBuffer log : register(u0);

Просмотреть файл

@ -6,7 +6,8 @@
// CHECK: call float @dx.op.rayTCurrent.f32(i32 154)
// CHECK: call void @dx.op.acceptHitAndEndSearch(i32 156)
// CHECK: call void @dx.op.ignoreHit(i32 155)
// CHECK: [[GeometryIndex:%[^ ]+]] = call i32 @dx.op.geometryIndex.i32(i32 203)
// CHECK: [[GeometryIndex:%[^ ]+]] = call i32 @dx.op.geometryIndex.i32(i32 213)
// CHECK: icmp eq i32 [[GeometryIndex]], 0
// CHECK: %[[color:[^ ]+]] = getelementptr inbounds %struct.MyPayload, %struct.MyPayload* %payload, i32 0, i32 0
// CHECK: store <4 x float> {{.*}}, <4 x float>* %[[color]], align 4
// CHECK: ret void

Просмотреть файл

@ -1,7 +1,8 @@
// RUN: %dxc -T lib_6_5 -auto-binding-space 11 %s | FileCheck %s
// CHECK: define void [[closesthit1:@"\\01\?closesthit1@[^\"]+"]](%struct.MyPayload* noalias nocapture %payload, %struct.BuiltInTriangleIntersectionAttributes* nocapture readonly %attr) #0 {
// CHECK: [[GeometryIndex:%[^ ]+]] = call i32 @dx.op.geometryIndex.i32(i32 203)
// CHECK: [[GeometryIndex:%[^ ]+]] = call i32 @dx.op.geometryIndex.i32(i32 213)
// CHECK: icmp eq i32 [[GeometryIndex]], 0
// CHECK: call void @dx.op.callShader.struct.MyParam(i32 159, i32 {{.*}}, %struct.MyParam* nonnull {{.*}})
// CHECK: %[[color:[^ ]+]] = getelementptr inbounds %struct.MyPayload, %struct.MyPayload* %payload, i32 0, i32 0
// CHECK: store <4 x float> {{.*}}, <4 x float>* %[[color]], align 4

Просмотреть файл

@ -2,7 +2,8 @@
// CHECK: define void [[intersection1:@"\\01\?intersection1@[^\"]+"]]() #0 {
// CHECK: [[rayTCurrent:%[^ ]+]] = call float @dx.op.rayTCurrent.f32(i32 154)
// CHECK: [[GeometryIndex:%[^ ]+]] = call i32 @dx.op.geometryIndex.i32(i32 203)
// CHECK: [[GeometryIndex:%[^ ]+]] = call i32 @dx.op.geometryIndex.i32(i32 213)
// CHECK: icmp eq i32 [[GeometryIndex]], 0
// CHECK: call i1 @dx.op.reportHit.struct.MyAttributes(i32 158, float [[rayTCurrent]], i32 0, %struct.MyAttributes* nonnull {{.*}})
// CHECK: ret void

Просмотреть файл

@ -3250,16 +3250,16 @@ TEST_F(ValidationTest, LibFunctionResInSig) {
"float fnStreamInArg(float f, inout PointStream<Data> S1) : SV_Target {\n"
" S1.Append((Data)f); return 1.0; }\n"
, "lib_6_x",
{ "!{!\"lib\", i32 6, i32 15}", "!dx.valver = !{!2}" },
{ "!{!\"lib\", i32 6, i32 3}", "!dx.valver = !{!1002}\n!1002 = !{i32 1, i32 3}" },
{ "Function '\\01?fnResInReturn@@YA?AUResStructInStruct@@M@Z' uses resource in function signature"
,"Function '\\01?fnResInArg@@YAMUResStructInStruct@@@Z' uses resource in function signature"
,"Function '\\01?fnStreamInArg@@YAMMV?$PointStream@UData@@@@@Z' uses resource in function signature"
{ "!{!\"lib\", i32 6, i32 15}", "!dx.valver = !{!([0-9]+)}", "= !{i32 20, !([0-9]+), !([0-9]+), !([0-9]+)}" },
{ "!{!\"lib\", i32 6, i32 3}", "!dx.valver = !{!100\\1}\n!1002 = !{i32 1, i32 3}", "= !{i32 20, !\\1, !\\2}" },
{ "Function '\\\\01\\?fnResInReturn@@YA\\?AUResStructInStruct@@M@Z' uses resource in function signature"
,"Function '\\\\01\\?fnResInArg@@YAMUResStructInStruct@@@Z' uses resource in function signature"
,"Function '\\\\01\\?fnStreamInArg@@YAMMV\\?\\$PointStream@UData@@@@@Z' uses resource in function signature"
// TODO: Unable to lower stream append, since it's used in a non-GS function.
// Should we fail to compile earlier (even on lib_6_x), or add lowering to linker?
,"Function 'dx.hl.op..void (i32, %\"class.PointStream<Data>\"*, float*)' uses resource in function signature"
,"Function 'dx\\.hl\\.op\\.\\.void \\(i32, %\"class\\.PointStream<Data>\"\\*, float\\*\\)' uses resource in function signature"
},
false);
/*bRegex*/ true);
}
TEST_F(ValidationTest, RayPayloadIsStruct) {
@ -3394,32 +3394,32 @@ TEST_F(ValidationTest, ResInShaderStruct) {
"[shader(\"callable\")] void CallableProto(inout Param p) { p.f += 1.0; }\n"
"export void BadCallable(inout ResStructInStruct p) { p.f += 1.0; }\n"
, "lib_6_x",
{ "!{!\"lib\", i32 6, i32 15}", "!dx.valver = !{!2}",
"!{void (%struct.Payload*, %struct.Attributes*)* @\"\\01?AnyHitProto@@YAXUPayload@@UAttributes@@@Z\", "
"!\"\\01?AnyHitProto@@YAXUPayload@@UAttributes@@@Z\",",
"!{void (%struct.Payload*, %struct.Attributes*)* @\"\\01?ClosestHitProto@@YAXUPayload@@UAttributes@@@Z\", "
"!\"\\01?ClosestHitProto@@YAXUPayload@@UAttributes@@@Z\",",
"!{void (%struct.Payload*)* @\"\\01?MissProto@@YAXUPayload@@@Z\", "
"!\"\\01?MissProto@@YAXUPayload@@@Z\",",
"!{void (%struct.Param*)* @\"\\01?CallableProto@@YAXUParam@@@Z\", "
"!\"\\01?CallableProto@@YAXUParam@@@Z\","
{ "!{!\"lib\", i32 6, i32 15}", "!dx.valver = !{!([0-9]+)}", "= !{i32 20, !([0-9]+), !([0-9]+), !([0-9]+)}",
"!{void \\(%struct\\.Payload\\*, %struct\\.Attributes\\*\\)\\* @\"\\\\01\\?AnyHitProto@@YAXUPayload@@UAttributes@@@Z\", "
"!\"\\\\01\\?AnyHitProto@@YAXUPayload@@UAttributes@@@Z\",",
"!{void \\(%struct\\.Payload\\*, %struct\\.Attributes\\*\\)\\* @\"\\\\01\\?ClosestHitProto@@YAXUPayload@@UAttributes@@@Z\", "
"!\"\\\\01\\?ClosestHitProto@@YAXUPayload@@UAttributes@@@Z\",",
"!{void \\(%struct\\.Payload\\*\\)\\* @\"\\\\01\\?MissProto@@YAXUPayload@@@Z\", "
"!\"\\\\01\\?MissProto@@YAXUPayload@@@Z\",",
"!{void \\(%struct\\.Param\\*\\)\\* @\"\\\\01\\?CallableProto@@YAXUParam@@@Z\", "
"!\"\\\\01\\?CallableProto@@YAXUParam@@@Z\","
},
{ "!{!\"lib\", i32 6, i32 3}", "!dx.valver = !{!1002}\n!1002 = !{i32 1, i32 3}",
"!{void (%struct.ResStructInStruct*, %struct.Attributes*)* @\"\\01?BadAnyHit@@YAXUResStructInStruct@@UAttributes@@@Z\", "
"!\"\\01?BadAnyHit@@YAXUResStructInStruct@@UAttributes@@@Z\",",
"!{void (%struct.ResStructInStruct*, %struct.Attributes*)* @\"\\01?BadClosestHit@@YAXUResStructInStruct@@UAttributes@@@Z\", "
"!\"\\01?BadClosestHit@@YAXUResStructInStruct@@UAttributes@@@Z\",",
"!{void (%struct.ResStructInStruct*)* @\"\\01?BadMiss@@YAXUResStructInStruct@@@Z\", "
"!\"\\01?BadMiss@@YAXUResStructInStruct@@@Z\",",
"!{void (%struct.ResStructInStruct*)* @\"\\01?BadCallable@@YAXUResStructInStruct@@@Z\", "
"!\"\\01?BadCallable@@YAXUResStructInStruct@@@Z\",",
{ "!{!\"lib\", i32 6, i32 3}", "!dx.valver = !{!100\\1}\n!1002 = !{i32 1, i32 3}", "= !{i32 20, !\\1, !\\2}",
"!{void (%struct.ResStructInStruct*, %struct.Attributes*)* @\"\\\\01?BadAnyHit@@YAXUResStructInStruct@@UAttributes@@@Z\", "
"!\"\\\\01?BadAnyHit@@YAXUResStructInStruct@@UAttributes@@@Z\",",
"!{void (%struct.ResStructInStruct*, %struct.Attributes*)* @\"\\\\01?BadClosestHit@@YAXUResStructInStruct@@UAttributes@@@Z\", "
"!\"\\\\01?BadClosestHit@@YAXUResStructInStruct@@UAttributes@@@Z\",",
"!{void (%struct.ResStructInStruct*)* @\"\\\\01?BadMiss@@YAXUResStructInStruct@@@Z\", "
"!\"\\\\01?BadMiss@@YAXUResStructInStruct@@@Z\",",
"!{void (%struct.ResStructInStruct*)* @\"\\\\01?BadCallable@@YAXUResStructInStruct@@@Z\", "
"!\"\\\\01?BadCallable@@YAXUResStructInStruct@@@Z\",",
},
{ "Function '\\01?BadAnyHit@@YAXUResStructInStruct@@UAttributes@@@Z' uses resource in function signature"
,"Function '\\01?BadClosestHit@@YAXUResStructInStruct@@UAttributes@@@Z' uses resource in function signature"
,"Function '\\01?BadMiss@@YAXUResStructInStruct@@@Z' uses resource in function signature"
,"Function '\\01?BadCallable@@YAXUResStructInStruct@@@Z' uses resource in function signature"
{ "Function '\\\\01\\?BadAnyHit@@YAXUResStructInStruct@@UAttributes@@@Z' uses resource in function signature"
,"Function '\\\\01\\?BadClosestHit@@YAXUResStructInStruct@@UAttributes@@@Z' uses resource in function signature"
,"Function '\\\\01\\?BadMiss@@YAXUResStructInStruct@@@Z' uses resource in function signature"
,"Function '\\\\01\\?BadCallable@@YAXUResStructInStruct@@@Z' uses resource in function signature"
},
false);
/*bRegex*/ true);
}
TEST_F(ValidationTest, WhenPayloadSizeTooSmallThenFail) {