diff --git a/WickedEngine/wiEmittedParticle.cpp b/WickedEngine/wiEmittedParticle.cpp index 4db6c99e6..b7b692d78 100644 --- a/WickedEngine/wiEmittedParticle.cpp +++ b/WickedEngine/wiEmittedParticle.cpp @@ -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); diff --git a/WickedEngine/wiGraphicsDevice_DX12.cpp b/WickedEngine/wiGraphicsDevice_DX12.cpp index 2f7bccb3e..0043e0345 100644 --- a/WickedEngine/wiGraphicsDevice_DX12.cpp +++ b/WickedEngine/wiGraphicsDevice_DX12.cpp @@ -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) { diff --git a/WickedEngine/wiGraphicsDevice_DX12.h b/WickedEngine/wiGraphicsDevice_DX12.h index c48f86fd1..d3f4f4028 100644 --- a/WickedEngine/wiGraphicsDevice_DX12.h +++ b/WickedEngine/wiGraphicsDevice_DX12.h @@ -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; diff --git a/WickedEngine/wiRenderer.cpp b/WickedEngine/wiRenderer.cpp index bfc035c75..675377096 100644 --- a/WickedEngine/wiRenderer.cpp +++ b/WickedEngine/wiRenderer.cpp @@ -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 drawToScreen1,function drawToScreen2,function drawToScreen3)