Skip to content

Commit 8d55ed9

Browse files
authored
dxil disassembly: update check convention, add entry point properties on topology for mesh shaders (#4491)
* update check convention, add entry point properties on topology for mesh shaders * test all possible output topologies for mesh / geometry shaders
1 parent ae943bc commit 8d55ed9

9 files changed

Lines changed: 195 additions & 35 deletions

File tree

tools/clang/test/HLSLFileCheck/disassembler/amplificationtest.hlsl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// RUN: %dxc /T as_6_6 /E ASMain %s | FileCheck %s
22
// CHECK: Amplification Shader
3-
// CHECK: Numthreads: (2,4,1)
3+
// CHECK: NumThreads=(2,4,1)
44

55

66
struct payloadStruct

tools/clang/test/HLSLFileCheck/disassembler/computetest.hlsl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// RUN: %dxc /T cs_6_0 /E main %s | FileCheck %s
22
// CHECK: Compute Shader
3-
// CHECK: Numthreads: (2,2,1)
3+
// CHECK: NumThreads=(2,2,1)
44

55
[NumThreads(2,2,1)]
66
void main() {
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
// RUN: %dxc -E main1 -T gs_6_0 %s | FileCheck %s -check-prefix=CHECK1
2+
// CHECK1: OutputTopology=point
3+
// RUN: %dxc -E main2 -T gs_6_0 %s | FileCheck %s -check-prefix=CHECK2
4+
// CHECK2: OutputTopology=line
5+
// RUN: %dxc -E main3 -T gs_6_0 %s | FileCheck %s -check-prefix=CHECK3
6+
// CHECK3: OutputTopology=triangle
7+
// RUN: %dxc -E main4 -T gs_6_0 %s | FileCheck %s -check-prefix=CHECK4
8+
// CHECK4: OutputTopology=line
9+
// RUN: %dxc -E main5 -T gs_6_0 %s | FileCheck %s -check-prefix=CHECK5
10+
// CHECK5: OutputTopology=triangle
11+
12+
13+
14+
15+
16+
struct MyStruct
17+
{
18+
precise float4 pos : SV_Position;
19+
};
20+
21+
22+
[maxvertexcount(12)]
23+
void main1(point float4 array[1] : COORD, inout PointStream<MyStruct> OutputStream0)
24+
{
25+
float4 r = array[0];
26+
MyStruct a = (MyStruct)0;
27+
28+
a.pos = array[r.x] + 1;
29+
30+
OutputStream0.Append(a);
31+
OutputStream0.RestartStrip();
32+
33+
}
34+
35+
[maxvertexcount(12)]
36+
void main2(line float4 array[2] : COORD, inout LineStream<MyStruct> OutputStream0)
37+
{
38+
float4 r = array[0];
39+
MyStruct a = (MyStruct)0;
40+
41+
a.pos = array[r.x] + 1;
42+
43+
OutputStream0.Append(a);
44+
OutputStream0.RestartStrip();
45+
}
46+
47+
[maxvertexcount(12)]
48+
void main3(triangle float4 array[3] : COORD, inout TriangleStream<MyStruct> OutputStream0)
49+
{
50+
float4 r = array[0];
51+
MyStruct a = (MyStruct)0;
52+
53+
a.pos = array[r.x] + 1;
54+
55+
OutputStream0.Append(a);
56+
OutputStream0.RestartStrip();
57+
}
58+
59+
[maxvertexcount(12)]
60+
void main4(lineadj float4 array[4] : COORD, inout LineStream<MyStruct> OutputStream0)
61+
{
62+
float4 r = array[0];
63+
MyStruct a = (MyStruct)0;
64+
65+
a.pos = array[r.x] + 1;
66+
67+
OutputStream0.Append(a);
68+
OutputStream0.RestartStrip();
69+
}
70+
71+
[maxvertexcount(12)]
72+
void main5(triangleadj float4 array[6] : COORD, inout TriangleStream<MyStruct> OutputStream0)
73+
{
74+
float4 r = array[0];
75+
MyStruct a = (MyStruct)0;
76+
77+
a.pos = array[r.x] + 1;
78+
79+
OutputStream0.Append(a);
80+
OutputStream0.RestartStrip();
81+
}
82+
83+
Lines changed: 53 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,59 @@
1-
// RUN: %dxc /T ms_6_6 /E MSMain %s | FileCheck %s
2-
// CHECK: Mesh Shader
3-
// CHECK: Numthreads: (2,3,1)
1+
// RUN: %dxc /T ms_6_6 /E MSMain1 %s | FileCheck %s -check-prefix=CHECK1
2+
// CHECK1: Mesh Shader
3+
// CHECK1: MeshOutputTopology=triangle
4+
// CHECK1: NumThreads=(2,3,1)
5+
6+
// RUN: %dxc /T ms_6_6 /E MSMain2 %s | FileCheck %s -check-prefix=CHECK2
7+
// CHECK2: Mesh Shader
8+
// CHECK2: MeshOutputTopology=line
9+
// CHECK2: NumThreads=(2,2,1)
10+
11+
// RUN: %dxc /T ms_6_6 /E MSMain3 %s | FileCheck %s -check-prefix=CHECK3
12+
// CHECK3: Mesh Shader
13+
// CHECK3: MeshOutputTopology=undefined
14+
// CHECK3: NumThreads=(2,8,1)
15+
16+
// RUN: %dxc /T ms_6_6 /E MSMain4 %s | FileCheck %s -check-prefix=CHECK4
17+
// CHECK4: Mesh Shader
18+
// CHECK4: MeshOutputTopology=undefined
19+
// CHECK4: NumThreads=(2,8,2)
20+
21+
// RUN: %dxc /T ms_6_6 /E MSMain5 %s | FileCheck %s -check-prefix=CHECK5
22+
// CHECK5: Mesh Shader
23+
// CHECK5: MeshOutputTopology=undefined
24+
// CHECK5: NumThreads=(2,8,2)
25+
426

527

628
[NumThreads(2,3,1)]
729
[OutputTopology("triangle")]
8-
void MSMain() {
30+
void MSMain1() {
31+
int x = 2;
32+
}
33+
34+
[NumThreads(2,2,1)]
35+
[OutputTopology("line")]
36+
void MSMain2() {
37+
int x = 2;
38+
}
39+
40+
[NumThreads(2,8,1)]
41+
[OutputTopology("point")]
42+
void MSMain3() {
43+
int x = 2;
44+
}
45+
46+
[NumThreads(2,8,2)]
47+
[OutputTopology("triangle_cw")]
48+
void MSMain4() {
49+
int x = 2;
50+
}
51+
52+
[NumThreads(2,8,2)]
53+
[OutputTopology("triangle_ccw")]
54+
void MSMain5() {
955
int x = 2;
1056
}
57+
58+
59+

tools/clang/test/HLSLFileCheck/hlsl/intrinsics/atomic/atomic.hlsl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
// RUN: %dxc -E main -DTYPE=int64_t -T cs_6_6 %s | FileCheck %s
55

66
// CHECK: Compute Shader
7-
// CHECK: Numthreads: (8,8,1)
7+
// CHECK: NumThreads=(8,8,1)
88
// CHECK: atomicrmw add
99
// CHECK: atomicrmw add
1010
// CHECK: cmpxchg

tools/clang/test/HLSLFileCheck/shader_targets/geometry/gs_precise_output.hlsl

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// RUN: %dxc -E main -T gs_6_0 %s | FileCheck %s
22

33
// Make sure load input has precise.
4+
// CHECK: OutputTopology=point
45
// CHECK:loadInput.f32(i32 4, i32 0, i32 0, i8 0, i32 {{.*}}), !dx.precise
56
// Make sure fadd not have fast.
67
// CHECK:fadd float %3, 1.000000e+00
@@ -14,12 +15,12 @@ struct MyStruct
1415
[maxvertexcount(12)]
1516
void main(point float4 array[1] : COORD, inout PointStream<MyStruct> OutputStream0)
1617
{
17-
float4 r = array[0];
18+
float4 r = array[0];
1819
MyStruct a = (MyStruct)0;
1920

2021
a.pos = array[r.x] + 1;
2122

22-
OutputStream0.Append(a);
23-
OutputStream0.RestartStrip();
23+
OutputStream0.Append(a);
24+
OutputStream0.RestartStrip();
2425

2526
}

tools/clang/test/HLSLFileCheck/shader_targets/mesh/amplification.hlsl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// RUN: %dxc -E main -T as_6_5 %s | %D3DReflect %s | FileCheck -check-prefix=REFL %s
33

44
// CHECK: Amplification Shader
5-
// CHECK: Numthreads: (32,1,1)
5+
// CHECK: NumThreads=(32,1,1)
66
// CHECK: dx.op.dispatchMesh.struct.Payload
77

88
#define NUM_THREADS 32

tools/clang/test/HLSLFileCheck/shader_targets/mesh/mesh.hlsl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
// RUN: %dxc -E main -T ms_6_5 %s | %D3DReflect %s | FileCheck -check-prefix=REFL %s
33

44
// CHECK: Mesh Shader
5-
// CHECK: Numthreads: (32,1,1)
5+
// CHECK: MeshOutputTopology=triangle
6+
// CHECK: NumThreads=(32,1,1)
67
// CHECK: dx.op.getMeshPayload.struct.MeshPayload(i32 170)
78
// CHECK: dx.op.setMeshOutputCounts(i32 168, i32 32, i32 16)
89
// CHECK: dx.op.emitIndices(i32 169,

tools/clang/tools/dxcompiler/dxcdisassembler.cpp

Lines changed: 49 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1284,30 +1284,32 @@ class DxcAssemblyAnnotationWriter : public llvm::AssemblyAnnotationWriter {
12841284
}
12851285
};
12861286

1287-
void PrintPipelineStateValidationRuntimeInfo(const char *pBuffer,
1287+
void PrintPipelineStateValidationRuntimeInfo(const char *pBuffer, const uint32_t uBufferSize,
12881288
DXIL::ShaderKind shaderKind,
12891289
raw_string_ostream &OS,
12901290
StringRef comment) {
12911291
OS << comment << "\n"
12921292
<< comment << " Pipeline Runtime Information: \n"
12931293
<< comment << "\n";
12941294

1295-
const unsigned offset = sizeof(unsigned);
1296-
const PSVRuntimeInfo0 *pInfo = (const PSVRuntimeInfo0 *)(pBuffer + offset);
1297-
const PSVRuntimeInfo2 *pInfo2 = (const PSVRuntimeInfo2 *)(pBuffer + offset);
1295+
DxilPipelineStateValidation PSV;
1296+
PSV.InitFromPSV0(pBuffer, uBufferSize);
1297+
const PSVRuntimeInfo0 *pInfo0 = PSV.GetPSVRuntimeInfo0();
1298+
const PSVRuntimeInfo1 *pInfo1 = PSV.GetPSVRuntimeInfo1();
1299+
const PSVRuntimeInfo2 *pInfo2 = PSV.GetPSVRuntimeInfo2();
12981300

12991301
switch (shaderKind) {
13001302
case DXIL::ShaderKind::Hull: {
13011303
OS << comment << " Hull Shader\n";
13021304
OS << comment
1303-
<< " InputControlPointCount=" << pInfo->HS.InputControlPointCount
1305+
<< " InputControlPointCount=" << pInfo0->HS.InputControlPointCount
13041306
<< "\n";
13051307
OS << comment
1306-
<< " OutputControlPointCount=" << pInfo->HS.OutputControlPointCount
1308+
<< " OutputControlPointCount=" << pInfo0->HS.OutputControlPointCount
13071309
<< "\n";
13081310
OS << comment << " Domain=";
13091311
DXIL::TessellatorDomain domain =
1310-
static_cast<DXIL::TessellatorDomain>(pInfo->HS.TessellatorDomain);
1312+
static_cast<DXIL::TessellatorDomain>(pInfo0->HS.TessellatorDomain);
13111313
switch (domain) {
13121314
case DXIL::TessellatorDomain::IsoLine:
13131315
OS << "isoline\n";
@@ -1325,7 +1327,7 @@ void PrintPipelineStateValidationRuntimeInfo(const char *pBuffer,
13251327
OS << comment << " OutputPrimitive=";
13261328
DXIL::TessellatorOutputPrimitive primitive =
13271329
static_cast<DXIL::TessellatorOutputPrimitive>(
1328-
pInfo->HS.TessellatorOutputPrimitive);
1330+
pInfo0->HS.TessellatorOutputPrimitive);
13291331
switch (primitive) {
13301332
case DXIL::TessellatorOutputPrimitive::Point:
13311333
OS << "point\n";
@@ -1347,17 +1349,17 @@ void PrintPipelineStateValidationRuntimeInfo(const char *pBuffer,
13471349
case DXIL::ShaderKind::Domain:
13481350
OS << comment << " Domain Shader\n";
13491351
OS << comment
1350-
<< " InputControlPointCount=" << pInfo->DS.InputControlPointCount
1352+
<< " InputControlPointCount=" << pInfo0->DS.InputControlPointCount
13511353
<< "\n";
13521354
OS << comment
1353-
<< " OutputPositionPresent=" << (bool)pInfo->DS.OutputPositionPresent
1355+
<< " OutputPositionPresent=" << (bool)pInfo0->DS.OutputPositionPresent
13541356
<< "\n";
13551357
break;
13561358
case DXIL::ShaderKind::Geometry: {
13571359
OS << comment << " Geometry Shader\n";
13581360
OS << comment << " InputPrimitive=";
13591361
DXIL::InputPrimitive primitive =
1360-
static_cast<DXIL::InputPrimitive>(pInfo->GS.InputPrimitive);
1362+
static_cast<DXIL::InputPrimitive>(pInfo0->GS.InputPrimitive);
13611363
switch (primitive) {
13621364
case DXIL::InputPrimitive::Point:
13631365
OS << "point\n";
@@ -1476,7 +1478,7 @@ void PrintPipelineStateValidationRuntimeInfo(const char *pBuffer,
14761478
}
14771479
OS << comment << " OutputTopology=";
14781480
DXIL::PrimitiveTopology topology =
1479-
static_cast<DXIL::PrimitiveTopology>(pInfo->GS.OutputTopology);
1481+
static_cast<DXIL::PrimitiveTopology>(pInfo0->GS.OutputTopology);
14801482
switch (topology) {
14811483
case DXIL::PrimitiveTopology::PointList:
14821484
OS << "point\n";
@@ -1491,43 +1493,67 @@ void PrintPipelineStateValidationRuntimeInfo(const char *pBuffer,
14911493
OS << "invalid\n";
14921494
break;
14931495
}
1494-
OS << comment << " OutputStreamMask=" << pInfo->GS.OutputStreamMask << "\n";
1496+
OS << comment << " OutputStreamMask=" << pInfo0->GS.OutputStreamMask << "\n";
14951497
OS << comment
1496-
<< " OutputPositionPresent=" << (bool)pInfo->GS.OutputPositionPresent
1498+
<< " OutputPositionPresent=" << (bool)pInfo0->GS.OutputPositionPresent
14971499
<< "\n";
14981500
} break;
14991501
case DXIL::ShaderKind::Vertex:
15001502
OS << comment << " Vertex Shader\n";
15011503
OS << comment
1502-
<< " OutputPositionPresent=" << (bool)pInfo->VS.OutputPositionPresent
1504+
<< " OutputPositionPresent=" << (bool)pInfo0->VS.OutputPositionPresent
15031505
<< "\n";
15041506
break;
15051507
case DXIL::ShaderKind::Pixel:
15061508
OS << comment << " Pixel Shader\n";
1507-
OS << comment << " DepthOutput=" << (bool)pInfo->PS.DepthOutput << "\n";
1508-
OS << comment << " SampleFrequency=" << (bool)pInfo->PS.SampleFrequency
1509+
OS << comment << " DepthOutput=" << (bool)pInfo0->PS.DepthOutput << "\n";
1510+
OS << comment << " SampleFrequency=" << (bool)pInfo0->PS.SampleFrequency
15091511
<< "\n";
15101512
break;
15111513
case DXIL::ShaderKind::Compute:
15121514
OS << comment << " Compute Shader\n";
1513-
OS << comment << " Numthreads: (" << pInfo2->NumThreadsX << "," << pInfo2->NumThreadsY << "," << pInfo2->NumThreadsZ << ")\n";
1515+
if (pInfo2) {
1516+
OS << comment << " NumThreads=(" << pInfo2->NumThreadsX << "," << pInfo2->NumThreadsY << "," << pInfo2->NumThreadsZ << ")\n";
1517+
}
15141518
break;
15151519
case DXIL::ShaderKind::Amplification:
15161520
OS << comment << " Amplification Shader\n";
1517-
OS << comment << " Numthreads: (" << pInfo2->NumThreadsX << "," << pInfo2->NumThreadsY << "," << pInfo2->NumThreadsZ << ")\n";
1521+
if (pInfo2) {
1522+
OS << comment << " NumThreads=(" << pInfo2->NumThreadsX << "," << pInfo2->NumThreadsY << "," << pInfo2->NumThreadsZ << ")\n";
1523+
}
15181524
break;
15191525
case DXIL::ShaderKind::Mesh:
15201526
OS << comment << " Mesh Shader\n";
1521-
OS << comment << " Numthreads: (" << pInfo2->NumThreadsX << "," << pInfo2->NumThreadsY << "," << pInfo2->NumThreadsZ << ")\n";
1527+
if (pInfo1) {
1528+
OS << comment << " MeshOutputTopology=";
1529+
DXIL::MeshOutputTopology topology = static_cast<DXIL::MeshOutputTopology>(pInfo1->MS1.MeshOutputTopology);
1530+
switch (topology) {
1531+
case DXIL::MeshOutputTopology::Undefined:
1532+
OS << "undefined\n";
1533+
break;
1534+
case DXIL::MeshOutputTopology::Line:
1535+
OS << "line\n";
1536+
break;
1537+
case DXIL::MeshOutputTopology::Triangle:
1538+
OS << "triangle\n";
1539+
break;
1540+
default:
1541+
OS << "invalid\n";
1542+
break;
1543+
}
1544+
}
1545+
if (pInfo2) {
1546+
OS << comment << " NumThreads=(" << pInfo2->NumThreadsX << "," << pInfo2->NumThreadsY << "," << pInfo2->NumThreadsZ << ")\n";
1547+
}
15221548
break;
15231549
case DXIL::ShaderKind::Library:
15241550
case DXIL::ShaderKind::Invalid:
15251551
// Nothing to print for these shader kinds.
15261552
break;
15271553
}
15281554

1529-
if (pInfo->MinimumExpectedWaveLaneCount == pInfo->MaximumExpectedWaveLaneCount) {
1530-
OS << comment << " WaveSize=" << pInfo->MinimumExpectedWaveLaneCount << "\n";
1555+
if (pInfo0->MinimumExpectedWaveLaneCount == pInfo0->MaximumExpectedWaveLaneCount) {
1556+
OS << comment << " WaveSize=" << pInfo0->MinimumExpectedWaveLaneCount << "\n";
15311557
}
15321558

15331559
OS << comment << "\n";
@@ -1639,7 +1665,7 @@ HRESULT Disassemble(IDxcBlob *pProgram, raw_string_ostream &Stream) {
16391665
DxilPartIsType(DFCC_PipelineStateValidation));
16401666
if (it != end(pContainer)) {
16411667
PrintPipelineStateValidationRuntimeInfo(
1642-
GetDxilPartData(*it),
1668+
GetDxilPartData(*it), (*it)->PartSize,
16431669
GetVersionShaderType(pProgramHeader->ProgramVersion), Stream,
16441670
/*comment*/ ";");
16451671
}

0 commit comments

Comments
 (0)