start dx12 executeindirect impl
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user