Extend D3D12_Draw_Zoo to SM6 & SM6.6

To test the DXIL debugger
This commit is contained in:
Jake Turner
2025-03-17 07:34:54 +00:00
parent ac2da339ae
commit dae198b39e
3 changed files with 248 additions and 172 deletions
+220 -168
View File
@@ -87,6 +87,14 @@ float4 main(v2f IN) : SV_Target0
ID3DBlobPtr vsblob = Compile(common + vertex, "main", "vs_5_0");
ID3DBlobPtr psblob = Compile(common + pixel, "main", "ps_5_0");
bool supportSM60 = (m_HighestShaderModel >= D3D_SHADER_MODEL_6_0) && m_DXILSupport;
bool supportSM66 = (m_HighestShaderModel >= D3D_SHADER_MODEL_6_6) && m_DXILSupport;
ID3DBlobPtr vs_6_0_blob = supportSM60 ? Compile(common + vertex, "main", "vs_6_0") : NULL;
ID3DBlobPtr ps_6_0_blob = supportSM60 ? Compile(common + pixel, "main", "ps_6_0") : NULL;
ID3DBlobPtr vs_6_6_blob = supportSM66 ? Compile(common + vertex, "main", "vs_6_6") : NULL;
ID3DBlobPtr ps_6_6_blob = supportSM66 ? Compile(common + pixel, "main", "ps_6_6") : NULL;
D3D12_INPUT_CLASSIFICATION perVertex = D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA;
std::vector<D3D12_INPUT_ELEMENT_DESC> layoutdesc = {
@@ -97,25 +105,65 @@ float4 main(v2f IN) : SV_Target0
ID3D12RootSignaturePtr sig = MakeSig({});
ID3D12PipelineStatePtr pso = MakePSO()
.RootSig(sig)
.InputLayout(layoutdesc)
.StripRestart(D3D12_INDEX_BUFFER_STRIP_CUT_VALUE_0xFFFF)
.VS(vsblob)
.PS(psblob)
.RTVs({DXGI_FORMAT_R32G32B32A32_FLOAT});
ID3D12PipelineStatePtr psos[3];
size_t countPSOs = 0;
psos[countPSOs++] = MakePSO()
.RootSig(sig)
.InputLayout(layoutdesc)
.StripRestart(D3D12_INDEX_BUFFER_STRIP_CUT_VALUE_0xFFFF)
.VS(vsblob)
.PS(psblob)
.RTVs({DXGI_FORMAT_R32G32B32A32_FLOAT});
if(vs_6_0_blob && ps_6_0_blob)
psos[countPSOs++] = MakePSO()
.RootSig(sig)
.InputLayout()
.StripRestart(D3D12_INDEX_BUFFER_STRIP_CUT_VALUE_0xFFFF)
.VS(vs_6_0_blob)
.PS(ps_6_0_blob)
.RTVs({DXGI_FORMAT_R32G32B32A32_FLOAT});
if(vs_6_6_blob && ps_6_6_blob)
psos[countPSOs++] = MakePSO()
.RootSig(sig)
.InputLayout()
.StripRestart(D3D12_INDEX_BUFFER_STRIP_CUT_VALUE_0xFFFF)
.VS(vs_6_6_blob)
.PS(ps_6_6_blob)
.RTVs({DXGI_FORMAT_R32G32B32A32_FLOAT});
layoutdesc[1].AlignedByteOffset = 0;
layoutdesc[1].InputSlot = 1;
layoutdesc[1].InputSlotClass = D3D12_INPUT_CLASSIFICATION_PER_INSTANCE_DATA;
layoutdesc[1].InstanceDataStepRate = 1;
ID3D12PipelineStatePtr instpso = MakePSO()
.RootSig(sig)
.InputLayout(layoutdesc)
.VS(vsblob)
.PS(psblob)
.RTVs({DXGI_FORMAT_R32G32B32A32_FLOAT});
size_t countInstPSOs = 0;
ID3D12PipelineStatePtr instpsos[3];
instpsos[countInstPSOs++] = MakePSO()
.RootSig(sig)
.InputLayout(layoutdesc)
.VS(vsblob)
.PS(psblob)
.RTVs({DXGI_FORMAT_R32G32B32A32_FLOAT});
if(vs_6_0_blob && ps_6_0_blob)
instpsos[countInstPSOs++] = MakePSO()
.RootSig(sig)
.InputLayout(layoutdesc)
.VS(vs_6_0_blob)
.PS(ps_6_0_blob)
.RTVs({DXGI_FORMAT_R32G32B32A32_FLOAT});
if(vs_6_6_blob && ps_6_6_blob)
instpsos[countInstPSOs++] = MakePSO()
.RootSig(sig)
.InputLayout(layoutdesc)
.VS(vs_6_6_blob)
.PS(ps_6_6_blob)
.RTVs({DXGI_FORMAT_R32G32B32A32_FLOAT});
TEST_ASSERT(countPSOs == countInstPSOs, "Mismatched number of PSOs");
DefaultA2V triangle[] = {
// 0
@@ -238,7 +286,7 @@ float4 main(v2f IN) : SV_Target0
instData[14] = Vec4f(0.5f, 0.9f, 0.1f, 0.5f);
}
ID3D12ResourcePtr instvb = MakeBuffer().Data(instData).Size(4096);
ID3D12ResourcePtr instvb = MakeBuffer().Data(instData).Size(8192);
std::vector<uint16_t> idxData;
idxData.resize(2048);
@@ -319,194 +367,198 @@ float4 main(v2f IN) : SV_Target0
ClearRenderTargetView(cmd, bbrtv, {0.2f, 0.2f, 0.2f, 1.0f});
ClearRenderTargetView(cmd, offrtv, {0.2f, 0.2f, 0.2f, 1.0f});
const char *markers[] = {"SM5.0", "SM6.0", "SM6.6"};
for(size_t i = 0; i < countPSOs; ++i)
{
ClearRenderTargetView(cmd, offrtv, {0.2f, 0.2f, 0.2f, 1.0f});
cmd->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
cmd->SetGraphicsRootSignature(sig);
cmd->SetGraphicsRootSignature(sig);
D3D12_VIEWPORT view = {0.0f, 0.0f, 48.0f, 48.0f, 0.0f, 1.0f};
D3D12_VIEWPORT view = {0.0f, 0.0f, 48.0f, 48.0f, 0.0f, 1.0f};
RSSetViewport(cmd, view);
RSSetScissorRect(cmd, {0, 0, screenWidth, screenHeight});
RSSetViewport(cmd, view);
RSSetScissorRect(cmd, {0, 0, screenWidth, screenHeight});
setMarker(cmd, markers[i]);
D3D12_VERTEX_BUFFER_VIEW vbs[2] = {};
vbs[0].BufferLocation = vb->GetGPUVirtualAddress();
vbs[0].SizeInBytes = 4096;
vbs[0].StrideInBytes = sizeof(DefaultA2V);
vbs[1].BufferLocation = instvb->GetGPUVirtualAddress();
vbs[1].StrideInBytes = sizeof(Vec4f);
vbs[1].SizeInBytes = 4096;
cmd->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
D3D12_INDEX_BUFFER_VIEW ibv = {};
ibv.BufferLocation = ib->GetGPUVirtualAddress();
ibv.Format = DXGI_FORMAT_R16_UINT;
ibv.SizeInBytes = 1024;
D3D12_VERTEX_BUFFER_VIEW vbs[2] = {};
vbs[0].BufferLocation = vb->GetGPUVirtualAddress();
vbs[0].SizeInBytes = 4096;
vbs[0].StrideInBytes = sizeof(DefaultA2V);
vbs[1].BufferLocation = instvb->GetGPUVirtualAddress();
vbs[1].StrideInBytes = sizeof(Vec4f);
vbs[1].SizeInBytes = 4096;
cmd->SetPipelineState(pso);
D3D12_INDEX_BUFFER_VIEW ibv = {};
ibv.BufferLocation = ib->GetGPUVirtualAddress();
ibv.Format = DXGI_FORMAT_R16_UINT;
ibv.SizeInBytes = 1024;
setMarker(cmd, "Test Begin");
cmd->SetPipelineState(psos[i]);
///////////////////////////////////////////////////
// non-indexed, non-instanced
///////////////////////////////////////////////////
// non-indexed, non-instanced
// basic test
RSSetViewport(cmd, view);
vbs[0].BufferLocation = vb->GetGPUVirtualAddress() + 0;
cmd->IASetVertexBuffers(0, 2, vbs);
cmd->DrawInstanced(3, 1, 0, 0);
view.TopLeftX += view.Width;
// basic test
RSSetViewport(cmd, view);
vbs[0].BufferLocation = vb->GetGPUVirtualAddress() + 0;
cmd->IASetVertexBuffers(0, 2, vbs);
cmd->DrawInstanced(3, 1, 0, 0);
view.TopLeftX += view.Width;
// test with vertex offset
RSSetViewport(cmd, view);
vbs[0].BufferLocation = vb->GetGPUVirtualAddress() + 0;
cmd->IASetVertexBuffers(0, 2, vbs);
cmd->DrawInstanced(3, 1, 5, 0);
view.TopLeftX += view.Width;
// test with vertex offset
RSSetViewport(cmd, view);
vbs[0].BufferLocation = vb->GetGPUVirtualAddress() + 0;
cmd->IASetVertexBuffers(0, 2, vbs);
cmd->DrawInstanced(3, 1, 5, 0);
view.TopLeftX += view.Width;
// test with vertex offset and vbuffer offset
RSSetViewport(cmd, view);
vbs[0].BufferLocation = vb->GetGPUVirtualAddress() + 5 * sizeof(DefaultA2V);
cmd->IASetVertexBuffers(0, 2, vbs);
cmd->DrawInstanced(3, 1, 8, 0);
view.TopLeftX += view.Width;
// test with vertex offset and vbuffer offset
RSSetViewport(cmd, view);
vbs[0].BufferLocation = vb->GetGPUVirtualAddress() + 5 * sizeof(DefaultA2V);
cmd->IASetVertexBuffers(0, 2, vbs);
cmd->DrawInstanced(3, 1, 8, 0);
view.TopLeftX += view.Width;
// adjust to next row
view.TopLeftX = 0.0f;
view.TopLeftY += view.Height;
// adjust to next row
view.TopLeftX = 0.0f;
view.TopLeftY += view.Height;
///////////////////////////////////////////////////
// indexed, non-instanced
///////////////////////////////////////////////////
// indexed, non-instanced
ibv.BufferLocation = ib->GetGPUVirtualAddress();
ibv.BufferLocation = ib->GetGPUVirtualAddress();
// basic test
RSSetViewport(cmd, view);
vbs[0].BufferLocation = vb->GetGPUVirtualAddress() + 0;
cmd->IASetVertexBuffers(0, 2, vbs);
cmd->IASetIndexBuffer(&ibv);
cmd->DrawIndexedInstanced(3, 1, 0, 0, 0);
view.TopLeftX += view.Width;
// basic test
RSSetViewport(cmd, view);
vbs[0].BufferLocation = vb->GetGPUVirtualAddress() + 0;
cmd->IASetVertexBuffers(0, 2, vbs);
cmd->IASetIndexBuffer(&ibv);
cmd->DrawIndexedInstanced(3, 1, 0, 0, 0);
view.TopLeftX += view.Width;
// test with first index
RSSetViewport(cmd, view);
vbs[0].BufferLocation = vb->GetGPUVirtualAddress() + 0;
cmd->IASetVertexBuffers(0, 2, vbs);
cmd->IASetIndexBuffer(&ibv);
cmd->DrawIndexedInstanced(3, 1, 5, 0, 0);
view.TopLeftX += view.Width;
// test with first index
RSSetViewport(cmd, view);
vbs[0].BufferLocation = vb->GetGPUVirtualAddress() + 0;
cmd->IASetVertexBuffers(0, 2, vbs);
cmd->IASetIndexBuffer(&ibv);
cmd->DrawIndexedInstanced(3, 1, 5, 0, 0);
view.TopLeftX += view.Width;
// test with first index and vertex offset
RSSetViewport(cmd, view);
vbs[0].BufferLocation = vb->GetGPUVirtualAddress() + 0;
cmd->IASetVertexBuffers(0, 2, vbs);
cmd->IASetIndexBuffer(&ibv);
cmd->DrawIndexedInstanced(3, 1, 13, -50, 0);
view.TopLeftX += view.Width;
// test with first index and vertex offset
RSSetViewport(cmd, view);
vbs[0].BufferLocation = vb->GetGPUVirtualAddress() + 0;
cmd->IASetVertexBuffers(0, 2, vbs);
cmd->IASetIndexBuffer(&ibv);
cmd->DrawIndexedInstanced(3, 1, 13, -50, 0);
view.TopLeftX += view.Width;
// test with first index and vertex offset and vbuffer offset
RSSetViewport(cmd, view);
vbs[0].BufferLocation = vb->GetGPUVirtualAddress() + 10 * sizeof(DefaultA2V);
cmd->IASetVertexBuffers(0, 2, vbs);
cmd->IASetIndexBuffer(&ibv);
cmd->DrawIndexedInstanced(3, 1, 23, -100, 0);
view.TopLeftX += view.Width;
// test with first index and vertex offset and vbuffer offset
RSSetViewport(cmd, view);
vbs[0].BufferLocation = vb->GetGPUVirtualAddress() + 10 * sizeof(DefaultA2V);
cmd->IASetVertexBuffers(0, 2, vbs);
cmd->IASetIndexBuffer(&ibv);
cmd->DrawIndexedInstanced(3, 1, 23, -100, 0);
view.TopLeftX += view.Width;
// test with first index and vertex offset and vbuffer offset and ibuffer offset
RSSetViewport(cmd, view);
vbs[0].BufferLocation = vb->GetGPUVirtualAddress() + 19 * sizeof(DefaultA2V);
ibv.BufferLocation = ib->GetGPUVirtualAddress() + 14 * sizeof(uint16_t);
cmd->IASetVertexBuffers(0, 2, vbs);
cmd->IASetIndexBuffer(&ibv);
cmd->DrawIndexedInstanced(3, 1, 23, -100, 0);
view.TopLeftX += view.Width;
// test with first index and vertex offset and vbuffer offset and ibuffer offset
RSSetViewport(cmd, view);
vbs[0].BufferLocation = vb->GetGPUVirtualAddress() + 19 * sizeof(DefaultA2V);
ibv.BufferLocation = ib->GetGPUVirtualAddress() + 14 * sizeof(uint16_t);
cmd->IASetVertexBuffers(0, 2, vbs);
cmd->IASetIndexBuffer(&ibv);
cmd->DrawIndexedInstanced(3, 1, 23, -100, 0);
view.TopLeftX += view.Width;
cmd->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
cmd->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
// indexed strip with primitive restart
vbs[0].BufferLocation = vb->GetGPUVirtualAddress();
ibv.BufferLocation = ib->GetGPUVirtualAddress();
RSSetViewport(cmd, view);
cmd->IASetVertexBuffers(0, 2, vbs);
cmd->IASetIndexBuffer(&ibv);
cmd->DrawIndexedInstanced(12, 1, 42, 0, 0);
view.TopLeftX += view.Width;
// indexed strip with primitive restart
vbs[0].BufferLocation = vb->GetGPUVirtualAddress();
ibv.BufferLocation = ib->GetGPUVirtualAddress();
RSSetViewport(cmd, view);
cmd->IASetVertexBuffers(0, 2, vbs);
cmd->IASetIndexBuffer(&ibv);
cmd->DrawIndexedInstanced(12, 1, 42, 0, 0);
view.TopLeftX += view.Width;
// indexed strip with primitive restart and vertex offset
RSSetViewport(cmd, view);
cmd->IASetVertexBuffers(0, 2, vbs);
cmd->IASetIndexBuffer(&ibv);
cmd->DrawIndexedInstanced(12, 1, 54, -100, 0);
view.TopLeftX += view.Width;
// indexed strip with primitive restart and vertex offset
RSSetViewport(cmd, view);
cmd->IASetVertexBuffers(0, 2, vbs);
cmd->IASetIndexBuffer(&ibv);
cmd->DrawIndexedInstanced(12, 1, 54, -100, 0);
view.TopLeftX += view.Width;
// adjust to next row
view.TopLeftX = 0.0f;
view.TopLeftY += view.Height;
// adjust to next row
view.TopLeftX = 0.0f;
view.TopLeftY += view.Height;
cmd->SetPipelineState(instpso);
cmd->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
cmd->SetPipelineState(instpsos[i]);
cmd->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
///////////////////////////////////////////////////
// non-indexed, instanced
///////////////////////////////////////////////////
// non-indexed, instanced
// basic test
RSSetViewport(cmd, view);
vbs[0].BufferLocation = vb->GetGPUVirtualAddress() + 0;
vbs[1].BufferLocation = instvb->GetGPUVirtualAddress() + 0;
cmd->IASetVertexBuffers(0, 2, vbs);
cmd->DrawInstanced(3, 2, 0, 0);
view.TopLeftX += view.Width;
// basic test
RSSetViewport(cmd, view);
vbs[0].BufferLocation = vb->GetGPUVirtualAddress() + 0;
vbs[1].BufferLocation = instvb->GetGPUVirtualAddress() + 0;
cmd->IASetVertexBuffers(0, 2, vbs);
cmd->DrawInstanced(3, 2, 0, 0);
view.TopLeftX += view.Width;
// basic test with first instance
RSSetViewport(cmd, view);
vbs[0].BufferLocation = vb->GetGPUVirtualAddress() + 5 * sizeof(DefaultA2V);
vbs[1].BufferLocation = instvb->GetGPUVirtualAddress() + 0;
cmd->IASetVertexBuffers(0, 2, vbs);
cmd->DrawInstanced(3, 2, 0, 5);
view.TopLeftX += view.Width;
// basic test with first instance
RSSetViewport(cmd, view);
vbs[0].BufferLocation = vb->GetGPUVirtualAddress() + 5 * sizeof(DefaultA2V);
vbs[1].BufferLocation = instvb->GetGPUVirtualAddress() + 0;
cmd->IASetVertexBuffers(0, 2, vbs);
cmd->DrawInstanced(3, 2, 0, 5);
view.TopLeftX += view.Width;
// basic test with first instance and instance buffer offset
RSSetViewport(cmd, view);
vbs[0].BufferLocation = vb->GetGPUVirtualAddress() + 13 * sizeof(DefaultA2V);
vbs[1].BufferLocation = instvb->GetGPUVirtualAddress() + 8 * sizeof(Vec4f);
cmd->IASetVertexBuffers(0, 2, vbs);
cmd->DrawInstanced(3, 2, 0, 5);
view.TopLeftX += view.Width;
// basic test with first instance and instance buffer offset
RSSetViewport(cmd, view);
vbs[0].BufferLocation = vb->GetGPUVirtualAddress() + 13 * sizeof(DefaultA2V);
vbs[1].BufferLocation = instvb->GetGPUVirtualAddress() + 8 * sizeof(Vec4f);
cmd->IASetVertexBuffers(0, 2, vbs);
cmd->DrawInstanced(3, 2, 0, 5);
view.TopLeftX += view.Width;
// adjust to next row
view.TopLeftX = 0.0f;
view.TopLeftY += view.Height;
// adjust to next row
view.TopLeftX = 0.0f;
view.TopLeftY += view.Height;
///////////////////////////////////////////////////
// indexed, instanced
///////////////////////////////////////////////////
// indexed, instanced
ibv.BufferLocation = ib->GetGPUVirtualAddress();
ibv.BufferLocation = ib->GetGPUVirtualAddress();
// basic test
RSSetViewport(cmd, view);
vbs[0].BufferLocation = vb->GetGPUVirtualAddress() + 0;
vbs[1].BufferLocation = instvb->GetGPUVirtualAddress() + 0;
cmd->IASetVertexBuffers(0, 2, vbs);
cmd->IASetIndexBuffer(&ibv);
cmd->DrawIndexedInstanced(3, 2, 5, 0, 0);
view.TopLeftX += view.Width;
// basic test
RSSetViewport(cmd, view);
vbs[0].BufferLocation = vb->GetGPUVirtualAddress() + 0;
vbs[1].BufferLocation = instvb->GetGPUVirtualAddress() + 0;
cmd->IASetVertexBuffers(0, 2, vbs);
cmd->IASetIndexBuffer(&ibv);
cmd->DrawIndexedInstanced(3, 2, 5, 0, 0);
view.TopLeftX += view.Width;
// basic test with first instance
RSSetViewport(cmd, view);
vbs[0].BufferLocation = vb->GetGPUVirtualAddress() + 0;
vbs[1].BufferLocation = instvb->GetGPUVirtualAddress() + 0;
cmd->IASetVertexBuffers(0, 2, vbs);
cmd->IASetIndexBuffer(&ibv);
cmd->DrawIndexedInstanced(3, 2, 13, -50, 5);
view.TopLeftX += view.Width;
// basic test with first instance
RSSetViewport(cmd, view);
vbs[0].BufferLocation = vb->GetGPUVirtualAddress() + 0;
vbs[1].BufferLocation = instvb->GetGPUVirtualAddress() + 0;
cmd->IASetVertexBuffers(0, 2, vbs);
cmd->IASetIndexBuffer(&ibv);
cmd->DrawIndexedInstanced(3, 2, 13, -50, 5);
view.TopLeftX += view.Width;
// basic test with first instance and instance buffer offset
RSSetViewport(cmd, view);
vbs[0].BufferLocation = vb->GetGPUVirtualAddress() + 0;
vbs[1].BufferLocation = instvb->GetGPUVirtualAddress() + 8 * sizeof(Vec4f);
cmd->IASetVertexBuffers(0, 2, vbs);
cmd->IASetIndexBuffer(&ibv);
cmd->DrawIndexedInstanced(3, 2, 23, -80, 5);
view.TopLeftX += view.Width;
// basic test with first instance and instance buffer offset
RSSetViewport(cmd, view);
vbs[0].BufferLocation = vb->GetGPUVirtualAddress() + 0;
vbs[1].BufferLocation = instvb->GetGPUVirtualAddress() + 8 * sizeof(Vec4f);
cmd->IASetVertexBuffers(0, 2, vbs);
cmd->IASetIndexBuffer(&ibv);
cmd->DrawIndexedInstanced(3, 2, 23, -80, 5);
view.TopLeftX += view.Width;
}
ResourceBarrier(cmd, rtvtex, D3D12_RESOURCE_STATE_RENDER_TARGET,
D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);
+5 -3
View File
@@ -172,11 +172,13 @@ class Draw_Zoo(rdtest.TestCase):
.format(vtx, inst))
def check_capture(self):
test_marker: rd.ActionDescription = self.find_action("Test")
self.check_capture_action(test_marker)
def check_capture_action(self, marker: rd.ActionDescription):
self.props: rd.APIProperties = self.controller.GetAPIProperties()
test_marker: rd.ActionDescription = self.find_action("Test")
action: rd.ActionDescription = test_marker.next
action: rd.ActionDescription = marker.next
rdtest.log.begin_section("Non-indexed, non-instanced cases")
+23 -1
View File
@@ -4,4 +4,26 @@ import renderdoc as rd
class D3D12_Draw_Zoo(rdtest.Draw_Zoo):
demos_test_name = 'D3D12_Draw_Zoo'
internal = False
internal = False
def check_capture(self):
rdtest.log.begin_section("SM5.0")
marker: rd.ActionDescription = self.find_action("SM5.0")
self.check_capture_action(marker)
rdtest.log.end_section("SM5.0")
rdtest.log.begin_section("SM6.0")
marker: rd.ActionDescription = self.find_action("SM6.0")
if marker is None:
rdtest.log.print("No SM6.0 action to test")
return
self.check_capture_action(marker)
rdtest.log.end_section("SM6.0")
rdtest.log.begin_section("SM6.6")
marker: rd.ActionDescription = self.find_action("SM6.6")
if marker is None:
rdtest.log.print("No SM6.6 action to test")
return
self.check_capture_action(marker)
rdtest.log.end_section("SM6.6")