start dx12 executeindirect impl

This commit is contained in:
turanszkij
2018-01-19 18:42:18 +00:00
parent 1d19dbeb14
commit e2ecd5f5a3
4 changed files with 56 additions and 2 deletions
+6
View File
@@ -325,12 +325,18 @@ void wiEmittedParticle::UpdateRenderData(GRAPHICSTHREAD threadID)
};
device->BindResources(CS, resources, TEXSLOT_ONDEMAND0, ARRAYSIZE(resources), threadID);
GPUResource* indres[] = {
indirectBuffers
};
device->TransitionBarrier(indres, 1, RESOURCE_STATE_INDIRECT_ARGUMENT, RESOURCE_STATE_UNORDERED_ACCESS, threadID);
// kick off updating, set up state
device->BindComputePSO(&CPSO_kickoffUpdate, threadID);
device->Dispatch(1, 1, 1, threadID);
device->UAVBarrier(uavs, ARRAYSIZE(uavs), threadID);
device->TransitionBarrier(indres, 1, RESOURCE_STATE_UNORDERED_ACCESS, RESOURCE_STATE_INDIRECT_ARGUMENT, threadID);
// emit the required amount if there are free slots in dead list
device->BindComputePSO(&CPSO_emit, threadID);
device->DispatchIndirect(indirectBuffers, ARGUMENTBUFFER_OFFSET_DISPATCHEMIT, threadID);
+43
View File
@@ -1839,6 +1839,42 @@ namespace wiGraphicsTypes
}
// Create common indirect command signatures:
D3D12_COMMAND_SIGNATURE_DESC cmd_desc = {};
D3D12_INDIRECT_ARGUMENT_DESC dispatchArgs;
dispatchArgs.Type = D3D12_INDIRECT_ARGUMENT_TYPE_DISPATCH;
D3D12_INDIRECT_ARGUMENT_DESC drawInstancedArgs;
drawInstancedArgs.Type = D3D12_INDIRECT_ARGUMENT_TYPE_DRAW;
D3D12_INDIRECT_ARGUMENT_DESC drawIndexedInstancedArgs;
drawIndexedInstancedArgs.Type = D3D12_INDIRECT_ARGUMENT_TYPE_DRAW_INDEXED;
cmd_desc.ByteStride = sizeof(IndirectDispatchArgs);
cmd_desc.NumArgumentDescs = 1;
cmd_desc.pArgumentDescs = &dispatchArgs;
hr = device->CreateCommandSignature(&cmd_desc, nullptr, __uuidof(ID3D12CommandSignature), (void**)&dispatchIndirectCommandSignature);
assert(SUCCEEDED(hr));
cmd_desc.ByteStride = sizeof(IndirectDrawArgsInstanced);
cmd_desc.NumArgumentDescs = 1;
cmd_desc.pArgumentDescs = &drawInstancedArgs;
hr = device->CreateCommandSignature(&cmd_desc, nullptr, __uuidof(ID3D12CommandSignature), (void**)&drawInstancedIndirectCommandSignature);
assert(SUCCEEDED(hr));
cmd_desc.ByteStride = sizeof(IndirectDrawArgsIndexedInstanced);
cmd_desc.NumArgumentDescs = 1;
cmd_desc.pArgumentDescs = &drawIndexedInstancedArgs;
hr = device->CreateCommandSignature(&cmd_desc, nullptr, __uuidof(ID3D12CommandSignature), (void**)&drawIndexedInstancedIndirectCommandSignature);
assert(SUCCEEDED(hr));
// Set the starting device state:
hr = GetFrameResources().commandAllocators[GRAPHICSTHREAD_IMMEDIATE]->Reset();
hr = GetDirectCommandList(GRAPHICSTHREAD_IMMEDIATE)->Reset(GetFrameResources().commandAllocators[GRAPHICSTHREAD_IMMEDIATE], nullptr);
@@ -1904,6 +1940,10 @@ namespace wiGraphicsTypes
SAFE_RELEASE(graphicsRootSig);
SAFE_RELEASE(computeRootSig);
SAFE_RELEASE(dispatchIndirectCommandSignature);
SAFE_RELEASE(drawInstancedIndirectCommandSignature);
SAFE_RELEASE(drawIndexedInstancedIndirectCommandSignature);
SAFE_DELETE(RTAllocator);
SAFE_DELETE(DSAllocator);
SAFE_DELETE(ResourceAllocator);
@@ -3342,9 +3382,11 @@ namespace wiGraphicsTypes
}
void GraphicsDevice_DX12::DrawInstancedIndirect(GPUBuffer* args, UINT args_offset, GRAPHICSTHREAD threadID)
{
GetDirectCommandList(threadID)->ExecuteIndirect(drawInstancedIndirectCommandSignature, 1, args->resource_DX12, args_offset, nullptr, 0);
}
void GraphicsDevice_DX12::DrawIndexedInstancedIndirect(GPUBuffer* args, UINT args_offset, GRAPHICSTHREAD threadID)
{
GetDirectCommandList(threadID)->ExecuteIndirect(drawIndexedInstancedIndirectCommandSignature, 1, args->resource_DX12, args_offset, nullptr, 0);
}
void GraphicsDevice_DX12::Dispatch(UINT threadGroupCountX, UINT threadGroupCountY, UINT threadGroupCountZ, GRAPHICSTHREAD threadID)
{
@@ -3354,6 +3396,7 @@ namespace wiGraphicsTypes
}
void GraphicsDevice_DX12::DispatchIndirect(GPUBuffer* args, UINT args_offset, GRAPHICSTHREAD threadID)
{
GetDirectCommandList(threadID)->ExecuteIndirect(dispatchIndirectCommandSignature, 1, args->resource_DX12, args_offset, nullptr, 0);
}
void GraphicsDevice_DX12::GenerateMips(Texture* texture, GRAPHICSTHREAD threadID)
{
+5
View File
@@ -18,6 +18,7 @@ struct ID3D12Fence;
struct ID3D12DescriptorHeap;
struct ID3D12CommandQueue;
struct ID3D12RootSignature;
struct ID3D12CommandSignature;
namespace wiGraphicsTypes
{
@@ -41,6 +42,10 @@ namespace wiGraphicsTypes
ID3D12RootSignature* graphicsRootSig;
ID3D12RootSignature* computeRootSig;
ID3D12CommandSignature* dispatchIndirectCommandSignature;
ID3D12CommandSignature* drawInstancedIndirectCommandSignature;
ID3D12CommandSignature* drawIndexedInstancedIndirectCommandSignature;
struct DescriptorAllocator
{
ID3D12DescriptorHeap* heap;
+2 -2
View File
@@ -123,8 +123,8 @@ wiRenderer::wiRenderer()
void wiRenderer::InitDevice(wiWindowRegistration::window_type window, bool fullscreen)
{
SAFE_DELETE(graphicsDevice);
graphicsDevice = new GraphicsDevice_DX11(window, fullscreen);
//graphicsDevice = new GraphicsDevice_DX12(window, fullscreen);
//graphicsDevice = new GraphicsDevice_DX11(window, fullscreen);
graphicsDevice = new GraphicsDevice_DX12(window, fullscreen);
}
void wiRenderer::Present(function<void()> drawToScreen1,function<void()> drawToScreen2,function<void()> drawToScreen3)