Add test that different list/queue types are handled in D3D12

This commit is contained in:
baldurk
2020-10-29 12:51:29 +00:00
parent 810e57e6ac
commit 3465809447
4 changed files with 260 additions and 0 deletions
+214
View File
@@ -0,0 +1,214 @@
/******************************************************************************
* The MIT License (MIT)
*
* Copyright (c) 2019-2020 Baldur Karlsson
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
******************************************************************************/
#include "d3d12_test.h"
RD_TEST(D3D12_List_Types, D3D12GraphicsTest)
{
static constexpr const char *Description =
"Uses command lists of different types to ensure all are captured and replayed properly.";
std::string compute = R"EOSHADER(
struct A2V
{
float3 pos;
float4 col;
float2 uv;
};
RWStructuredBuffer<A2V> verts : register(u0);
[numthreads(3,1,1)]
void main(uint3 tid : SV_GroupThreadID)
{
verts[tid.x].uv = float2(1234.0f, 5678.0f);
verts[tid.x].col.b += 1.0f;
}
)EOSHADER";
int main()
{
// initialise, create window, create device, etc
if(!Init())
return 3;
ID3DBlobPtr vsblob = Compile(D3DDefaultVertex, "main", "vs_4_0");
ID3DBlobPtr psblob = Compile(D3DDefaultPixel, "main", "ps_4_0");
ID3D12ResourcePtr vb_src = MakeBuffer().Data(DefaultTri);
ID3D12RootSignaturePtr sig = MakeSig({
tableParam(D3D12_SHADER_VISIBILITY_ALL, D3D12_DESCRIPTOR_RANGE_TYPE_UAV, 0, 0, 1, 0),
});
ID3D12PipelineStatePtr pso = MakePSO().RootSig(sig).InputLayout().VS(vsblob).PS(psblob);
ID3DBlobPtr csblob = Compile(compute, "main", "cs_5_0");
ID3D12PipelineStatePtr comppso = MakePSO().RootSig(sig).CS(csblob);
ResourceBarrier(vb_src, D3D12_RESOURCE_STATE_COMMON, D3D12_RESOURCE_STATE_COPY_SOURCE);
ID3D12CommandAllocatorPtr computeAlloc;
CHECK_HR(dev->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_COMPUTE,
__uuidof(ID3D12CommandAllocator), (void **)&computeAlloc));
ID3D12CommandAllocatorPtr copyAlloc;
CHECK_HR(dev->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_COPY,
__uuidof(ID3D12CommandAllocator), (void **)&copyAlloc));
ID3D12GraphicsCommandListPtr computeList = NULL;
CHECK_HR(dev->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_COMPUTE, computeAlloc, NULL,
__uuidof(ID3D12GraphicsCommandList), (void **)&computeList));
computeList->Close();
ID3D12GraphicsCommandListPtr copyList = NULL;
// where supported, use the new way that doesn't need an extra close
if(dev4)
{
CHECK_HR(dev4->CreateCommandList1(0, D3D12_COMMAND_LIST_TYPE_COPY, D3D12_COMMAND_LIST_FLAG_NONE,
__uuidof(ID3D12GraphicsCommandList), (void **)&copyList));
}
else
{
CHECK_HR(dev->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_COPY, copyAlloc, NULL,
__uuidof(ID3D12GraphicsCommandList), (void **)&copyList));
copyList->Close();
}
ID3D12CommandQueuePtr computeQueue;
{
D3D12_COMMAND_QUEUE_DESC desc = {};
desc.Type = D3D12_COMMAND_LIST_TYPE_COMPUTE;
dev->CreateCommandQueue(&desc, __uuidof(ID3D12CommandQueue), (void **)&computeQueue);
}
ID3D12CommandQueuePtr copyQueue;
{
D3D12_COMMAND_QUEUE_DESC desc = {};
desc.Type = D3D12_COMMAND_LIST_TYPE_COPY;
dev->CreateCommandQueue(&desc, __uuidof(ID3D12CommandQueue), (void **)&copyQueue);
}
while(Running())
{
ID3D12ResourcePtr vb = MakeBuffer().UAV().Size(sizeof(DefaultTri));
MakeUAV(vb).NumElements(3).StructureStride(sizeof(DefaultA2V)).CreateGPU(0);
// first copy the VB as-is
{
copyList->Reset(copyAlloc, NULL);
copyList->CopyResource(vb, vb_src);
copyList->Close();
ID3D12CommandList *copySubmit = copyList.GetInterfacePtr();
copyQueue->ExecuteCommandLists(1, &copySubmit);
copyQueue->Signal(m_GPUSyncFence, ++m_GPUSyncCounter);
}
// then invoke compute shader to change color
{
computeList->Reset(computeAlloc, NULL);
D3D12_RESOURCE_BARRIER barrier = {};
barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
barrier.Transition.pResource = vb;
barrier.Transition.Subresource = 0;
barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_COPY_DEST;
barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_UNORDERED_ACCESS;
computeList->ResourceBarrier(1, &barrier);
computeList->SetComputeRootSignature(sig);
computeList->SetPipelineState(comppso);
computeList->SetDescriptorHeaps(1, &m_CBVUAVSRV.GetInterfacePtr());
computeList->SetComputeRootDescriptorTable(
0, m_CBVUAVSRV->GetGPUDescriptorHandleForHeapStart());
computeList->Dispatch(1, 1, 1);
computeList->Close();
ID3D12CommandList *computeSubmit = computeList.GetInterfacePtr();
computeQueue->Wait(m_GPUSyncFence, m_GPUSyncCounter);
computeQueue->ExecuteCommandLists(1, &computeSubmit);
computeQueue->Signal(m_GPUSyncFence, ++m_GPUSyncCounter);
}
// then draw
ID3D12GraphicsCommandListPtr cmd = GetCommandBuffer();
Reset(cmd);
D3D12_RESOURCE_BARRIER barrier = {};
barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
barrier.Transition.pResource = vb;
barrier.Transition.Subresource = 0;
barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_UNORDERED_ACCESS;
barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER;
cmd->ResourceBarrier(1, &barrier);
ID3D12ResourcePtr bb = StartUsingBackbuffer(cmd, D3D12_RESOURCE_STATE_RENDER_TARGET);
D3D12_CPU_DESCRIPTOR_HANDLE rtv =
MakeRTV(bb).Format(DXGI_FORMAT_R8G8B8A8_UNORM_SRGB).CreateCPU(0);
ClearRenderTargetView(cmd, rtv, {0.2f, 0.2f, 0.2f, 1.0f});
cmd->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
IASetVertexBuffer(cmd, vb, sizeof(DefaultA2V), 0);
cmd->SetPipelineState(pso);
cmd->SetGraphicsRootSignature(sig);
RSSetViewport(cmd, {0.0f, 0.0f, (float)screenWidth, (float)screenHeight, 0.0f, 1.0f});
RSSetScissorRect(cmd, {0, 0, screenWidth, screenHeight});
OMSetRenderTargets(cmd, {rtv}, {});
cmd->DrawInstanced(3, 1, 0, 0);
FinishUsingBackbuffer(cmd, D3D12_RESOURCE_STATE_RENDER_TARGET);
cmd->Close();
queue->Wait(m_GPUSyncFence, m_GPUSyncCounter);
Submit({cmd});
// sync so we can release the buffer
GPUSync();
Present();
}
return 0;
}
};
REGISTER_TEST();
+1
View File
@@ -181,6 +181,7 @@
<ClCompile Include="d3d12\d3d12_existing_heap.cpp" />
<ClCompile Include="d3d12\d3d12_helpers.cpp" />
<ClCompile Include="d3d12\d3d12_large_buffer.cpp" />
<ClCompile Include="d3d12\d3d12_list_types.cpp" />
<ClCompile Include="d3d12\d3d12_mesh_zoo.cpp" />
<ClCompile Include="d3d12\d3d12_overlay_test.cpp" />
<ClCompile Include="d3d12\d3d12_parameter_zoo.cpp" />
+3
View File
@@ -559,6 +559,9 @@
<ClCompile Include="vk\vk_large_descriptor_sets.cpp">
<Filter>Vulkan\demos</Filter>
</ClCompile>
<ClCompile Include="d3d12\d3d12_list_types.cpp">
<Filter>D3D12\demos</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<Filter Include="D3D11">
+42
View File
@@ -0,0 +1,42 @@
import renderdoc as rd
import rdtest
class D3D12_List_Types(rdtest.TestCase):
demos_test_name = 'D3D12_List_Types'
def check_capture(self):
draw = self.find_draw("Draw")
self.controller.SetFrameEvent(draw.eventId, False)
self.check_triangle(out=draw.outputs[0], fore=[0.0, 1.0, 1.0, 1.0])
postvs_data = self.get_postvs(draw, rd.MeshDataStage.VSOut, 0, draw.numIndices)
postvs_ref = {
0: {
'vtx': 0,
'idx': 0,
'SV_POSITION': [-0.5, -0.5, 0.0, 1.0],
'COLOR': [0.0, 1.0, 1.0, 1.0],
'TEXCOORD': [1234.0, 5678.0],
},
1: {
'vtx': 1,
'idx': 1,
'SV_POSITION': [0.0, 0.5, 0.0, 1.0],
'COLOR': [0.0, 1.0, 1.0, 1.0],
'TEXCOORD': [1234.0, 5678.0],
},
2: {
'vtx': 2,
'idx': 2,
'SV_POSITION': [0.5, -0.5, 0.0, 1.0],
'COLOR': [0.0, 1.0, 1.0, 1.0],
'TEXCOORD': [1234.0, 5678.0],
},
}
self.check_mesh_data(postvs_ref, postvs_data)