From efca3eda6fcf522e9c5ff9fd91482bbdf3d7acf8 Mon Sep 17 00:00:00 2001 From: Minmin Gong Date: Fri, 13 Nov 2020 21:31:25 -0800 Subject: [PATCH 1/8] Remove nonsense vertexData.empty() calls --- .../D3D12VariableRateShading/src/VariableRateShadingScene.h | 1 - .../UWP/D3D12VariableRateShading/src/VariableRateShadingScene.h | 1 - 2 files changed, 2 deletions(-) diff --git a/Samples/Desktop/D3D12VariableRateShading/src/VariableRateShadingScene.h b/Samples/Desktop/D3D12VariableRateShading/src/VariableRateShadingScene.h index 0108be339..f38041882 100644 --- a/Samples/Desktop/D3D12VariableRateShading/src/VariableRateShadingScene.h +++ b/Samples/Desktop/D3D12VariableRateShading/src/VariableRateShadingScene.h @@ -62,7 +62,6 @@ namespace SampleAssets const float width = 266.66f * scale; const float height = 150.0f * scale; - vertexData.empty(); vertexData.resize(4); vertexData[0].position = { x, y, z }; diff --git a/Samples/UWP/D3D12VariableRateShading/src/VariableRateShadingScene.h b/Samples/UWP/D3D12VariableRateShading/src/VariableRateShadingScene.h index 0108be339..f38041882 100644 --- a/Samples/UWP/D3D12VariableRateShading/src/VariableRateShadingScene.h +++ b/Samples/UWP/D3D12VariableRateShading/src/VariableRateShadingScene.h @@ -62,7 +62,6 @@ namespace SampleAssets const float width = 266.66f * scale; const float height = 150.0f * scale; - vertexData.empty(); vertexData.resize(4); vertexData[0].position = { x, y, z }; From 287324fbfd8a3068f9631670ab130cd2102ee40d Mon Sep 17 00:00:00 2001 From: Sherief Farouk Date: Fri, 27 Nov 2020 04:11:01 -0800 Subject: [PATCH 2/8] Fixed the DXR samples so they can run on (I'm wheezing) Surface Book 3 and other MSHybrid systems. --- .../src/D3D12RaytracingHelloWorld/DeviceResources.cpp | 10 ++++++++-- .../DeviceResources.cpp | 10 ++++++++-- .../util/DeviceResources.cpp | 10 ++++++++-- .../D3D12RaytracingSimpleLighting/DeviceResources.cpp | 10 ++++++++-- 4 files changed, 32 insertions(+), 8 deletions(-) diff --git a/Samples/Desktop/D3D12Raytracing/src/D3D12RaytracingHelloWorld/DeviceResources.cpp b/Samples/Desktop/D3D12Raytracing/src/D3D12RaytracingHelloWorld/DeviceResources.cpp index 6e89c11fc..6ec18c4b2 100644 --- a/Samples/Desktop/D3D12Raytracing/src/D3D12RaytracingHelloWorld/DeviceResources.cpp +++ b/Samples/Desktop/D3D12Raytracing/src/D3D12RaytracingHelloWorld/DeviceResources.cpp @@ -597,14 +597,20 @@ void DeviceResources::MoveToNextFrame() m_fenceValues[m_backBufferIndex] = currentFenceValue + 1; } -// This method acquires the first available hardware adapter that supports Direct3D 12. +// This method acquires the first high-performance hardware adapter that supports Direct3D 12. // If no such adapter can be found, try WARP. Otherwise throw an exception. void DeviceResources::InitializeAdapter(IDXGIAdapter1** ppAdapter) { *ppAdapter = nullptr; ComPtr adapter; - for (UINT adapterID = 0; DXGI_ERROR_NOT_FOUND != m_dxgiFactory->EnumAdapters1(adapterID, &adapter); ++adapterID) + ComPtr factory6; + HRESULT hr = m_dxgiFactory.As(&factory6); + if (FAILED(hr)) + { + throw exception("DXGI 1.6 not supported"); + } + for (UINT adapterID = 0; DXGI_ERROR_NOT_FOUND != factory6->EnumAdapterByGpuPreference(adapterID, DXGI_GPU_PREFERENCE_HIGH_PERFORMANCE, IID_PPV_ARGS(&adapter)); ++adapterID) { if (m_adapterIDoverride != UINT_MAX && adapterID != m_adapterIDoverride) { diff --git a/Samples/Desktop/D3D12Raytracing/src/D3D12RaytracingLibrarySubobjects/DeviceResources.cpp b/Samples/Desktop/D3D12Raytracing/src/D3D12RaytracingLibrarySubobjects/DeviceResources.cpp index 6e89c11fc..6ec18c4b2 100644 --- a/Samples/Desktop/D3D12Raytracing/src/D3D12RaytracingLibrarySubobjects/DeviceResources.cpp +++ b/Samples/Desktop/D3D12Raytracing/src/D3D12RaytracingLibrarySubobjects/DeviceResources.cpp @@ -597,14 +597,20 @@ void DeviceResources::MoveToNextFrame() m_fenceValues[m_backBufferIndex] = currentFenceValue + 1; } -// This method acquires the first available hardware adapter that supports Direct3D 12. +// This method acquires the first high-performance hardware adapter that supports Direct3D 12. // If no such adapter can be found, try WARP. Otherwise throw an exception. void DeviceResources::InitializeAdapter(IDXGIAdapter1** ppAdapter) { *ppAdapter = nullptr; ComPtr adapter; - for (UINT adapterID = 0; DXGI_ERROR_NOT_FOUND != m_dxgiFactory->EnumAdapters1(adapterID, &adapter); ++adapterID) + ComPtr factory6; + HRESULT hr = m_dxgiFactory.As(&factory6); + if (FAILED(hr)) + { + throw exception("DXGI 1.6 not supported"); + } + for (UINT adapterID = 0; DXGI_ERROR_NOT_FOUND != factory6->EnumAdapterByGpuPreference(adapterID, DXGI_GPU_PREFERENCE_HIGH_PERFORMANCE, IID_PPV_ARGS(&adapter)); ++adapterID) { if (m_adapterIDoverride != UINT_MAX && adapterID != m_adapterIDoverride) { diff --git a/Samples/Desktop/D3D12Raytracing/src/D3D12RaytracingProceduralGeometry/util/DeviceResources.cpp b/Samples/Desktop/D3D12Raytracing/src/D3D12RaytracingProceduralGeometry/util/DeviceResources.cpp index 6e89c11fc..6ec18c4b2 100644 --- a/Samples/Desktop/D3D12Raytracing/src/D3D12RaytracingProceduralGeometry/util/DeviceResources.cpp +++ b/Samples/Desktop/D3D12Raytracing/src/D3D12RaytracingProceduralGeometry/util/DeviceResources.cpp @@ -597,14 +597,20 @@ void DeviceResources::MoveToNextFrame() m_fenceValues[m_backBufferIndex] = currentFenceValue + 1; } -// This method acquires the first available hardware adapter that supports Direct3D 12. +// This method acquires the first high-performance hardware adapter that supports Direct3D 12. // If no such adapter can be found, try WARP. Otherwise throw an exception. void DeviceResources::InitializeAdapter(IDXGIAdapter1** ppAdapter) { *ppAdapter = nullptr; ComPtr adapter; - for (UINT adapterID = 0; DXGI_ERROR_NOT_FOUND != m_dxgiFactory->EnumAdapters1(adapterID, &adapter); ++adapterID) + ComPtr factory6; + HRESULT hr = m_dxgiFactory.As(&factory6); + if (FAILED(hr)) + { + throw exception("DXGI 1.6 not supported"); + } + for (UINT adapterID = 0; DXGI_ERROR_NOT_FOUND != factory6->EnumAdapterByGpuPreference(adapterID, DXGI_GPU_PREFERENCE_HIGH_PERFORMANCE, IID_PPV_ARGS(&adapter)); ++adapterID) { if (m_adapterIDoverride != UINT_MAX && adapterID != m_adapterIDoverride) { diff --git a/Samples/Desktop/D3D12Raytracing/src/D3D12RaytracingSimpleLighting/DeviceResources.cpp b/Samples/Desktop/D3D12Raytracing/src/D3D12RaytracingSimpleLighting/DeviceResources.cpp index 6e89c11fc..6ec18c4b2 100644 --- a/Samples/Desktop/D3D12Raytracing/src/D3D12RaytracingSimpleLighting/DeviceResources.cpp +++ b/Samples/Desktop/D3D12Raytracing/src/D3D12RaytracingSimpleLighting/DeviceResources.cpp @@ -597,14 +597,20 @@ void DeviceResources::MoveToNextFrame() m_fenceValues[m_backBufferIndex] = currentFenceValue + 1; } -// This method acquires the first available hardware adapter that supports Direct3D 12. +// This method acquires the first high-performance hardware adapter that supports Direct3D 12. // If no such adapter can be found, try WARP. Otherwise throw an exception. void DeviceResources::InitializeAdapter(IDXGIAdapter1** ppAdapter) { *ppAdapter = nullptr; ComPtr adapter; - for (UINT adapterID = 0; DXGI_ERROR_NOT_FOUND != m_dxgiFactory->EnumAdapters1(adapterID, &adapter); ++adapterID) + ComPtr factory6; + HRESULT hr = m_dxgiFactory.As(&factory6); + if (FAILED(hr)) + { + throw exception("DXGI 1.6 not supported"); + } + for (UINT adapterID = 0; DXGI_ERROR_NOT_FOUND != factory6->EnumAdapterByGpuPreference(adapterID, DXGI_GPU_PREFERENCE_HIGH_PERFORMANCE, IID_PPV_ARGS(&adapter)); ++adapterID) { if (m_adapterIDoverride != UINT_MAX && adapterID != m_adapterIDoverride) { From 2da83ab85c7364e8695fd5e258398ad5f976ed3b Mon Sep 17 00:00:00 2001 From: Robert Sriniasiah Date: Mon, 21 Dec 2020 12:08:17 -0800 Subject: [PATCH 3/8] D3D12MeshletRender: First pass to get stuff working Just throwing structures into temporaries, might be better ways to do this --- .../src/MeshletRender/D3D12MeshletRender.cpp | 26 +++++++++--- .../src/MeshletRender/Model.cpp | 40 +++++++++++++++---- 2 files changed, 53 insertions(+), 13 deletions(-) diff --git a/Samples/Desktop/D3D12MeshShaders/src/MeshletRender/D3D12MeshletRender.cpp b/Samples/Desktop/D3D12MeshShaders/src/MeshletRender/D3D12MeshletRender.cpp index aab01424c..d0fdfff3b 100644 --- a/Samples/Desktop/D3D12MeshShaders/src/MeshletRender/D3D12MeshletRender.cpp +++ b/Samples/Desktop/D3D12MeshShaders/src/MeshletRender/D3D12MeshletRender.cpp @@ -183,10 +183,15 @@ void D3D12MeshletRender::LoadPipeline() depthOptimizedClearValue.DepthStencil.Depth = 1.0f; depthOptimizedClearValue.DepthStencil.Stencil = 0; + const CD3DX12_HEAP_PROPERTIES depthStencilHeapProps(D3D12_HEAP_TYPE_DEFAULT); + const CD3DX12_RESOURCE_DESC depthStencilResDesc = CD3DX12_RESOURCE_DESC::Tex2D(DXGI_FORMAT_D32_FLOAT, m_width, m_height, 1, 0, 1, 0, D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL); + ThrowIfFailed(m_device->CreateCommittedResource( - &CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT), + //&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT), + &depthStencilHeapProps, D3D12_HEAP_FLAG_NONE, - &CD3DX12_RESOURCE_DESC::Tex2D(DXGI_FORMAT_D32_FLOAT, m_width, m_height, 1, 0, 1, 0, D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL), + //&CD3DX12_RESOURCE_DESC::Tex2D(DXGI_FORMAT_D32_FLOAT, m_width, m_height, 1, 0, 1, 0, D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL), + &depthStencilResDesc, D3D12_RESOURCE_STATE_DEPTH_WRITE, &depthOptimizedClearValue, IID_PPV_ARGS(&m_depthStencil) @@ -201,10 +206,15 @@ void D3D12MeshletRender::LoadPipeline() { const UINT64 constantBufferSize = sizeof(SceneConstantBuffer) * FrameCount; + const CD3DX12_HEAP_PROPERTIES constantBufferHeapProps(D3D12_HEAP_TYPE_UPLOAD); + const CD3DX12_RESOURCE_DESC constantBufferResDesc = CD3DX12_RESOURCE_DESC::Buffer(constantBufferSize); + ThrowIfFailed(m_device->CreateCommittedResource( - &CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_UPLOAD), + //&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_UPLOAD), + &constantBufferHeapProps, D3D12_HEAP_FLAG_NONE, - &CD3DX12_RESOURCE_DESC::Buffer(constantBufferSize), + //&CD3DX12_RESOURCE_DESC::Buffer(constantBufferSize), + &constantBufferResDesc, D3D12_RESOURCE_STATE_GENERIC_READ, nullptr, IID_PPV_ARGS(&m_constantBuffer))); @@ -386,7 +396,9 @@ void D3D12MeshletRender::PopulateCommandList() m_commandList->RSSetScissorRects(1, &m_scissorRect); // Indicate that the back buffer will be used as a render target. - m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_renderTargets[m_frameIndex].Get(), D3D12_RESOURCE_STATE_PRESENT, D3D12_RESOURCE_STATE_RENDER_TARGET)); + const auto toRenderTargetBarrier = CD3DX12_RESOURCE_BARRIER::Transition(m_renderTargets[m_frameIndex].Get(), D3D12_RESOURCE_STATE_PRESENT, D3D12_RESOURCE_STATE_RENDER_TARGET); + //m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_renderTargets[m_frameIndex].Get(), D3D12_RESOURCE_STATE_PRESENT, D3D12_RESOURCE_STATE_RENDER_TARGET)); + m_commandList->ResourceBarrier(1, &toRenderTargetBarrier); CD3DX12_CPU_DESCRIPTOR_HANDLE rtvHandle(m_rtvHeap->GetCPUDescriptorHandleForHeapStart(), m_frameIndex, m_rtvDescriptorSize); CD3DX12_CPU_DESCRIPTOR_HANDLE dsvHandle(m_dsvHeap->GetCPUDescriptorHandleForHeapStart()); @@ -415,7 +427,9 @@ void D3D12MeshletRender::PopulateCommandList() } // Indicate that the back buffer will now be used to present. - m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_renderTargets[m_frameIndex].Get(), D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_PRESENT)); + const auto toPresentBarrier = CD3DX12_RESOURCE_BARRIER::Transition(m_renderTargets[m_frameIndex].Get(), D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_PRESENT); + //m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_renderTargets[m_frameIndex].Get(), D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_PRESENT)); + m_commandList->ResourceBarrier(1, &toPresentBarrier); ThrowIfFailed(m_commandList->Close()); } diff --git a/Samples/Desktop/D3D12MeshShaders/src/MeshletRender/Model.cpp b/Samples/Desktop/D3D12MeshShaders/src/MeshletRender/Model.cpp index b587abcfd..f359a001b 100644 --- a/Samples/Desktop/D3D12MeshShaders/src/MeshletRender/Model.cpp +++ b/Samples/Desktop/D3D12MeshShaders/src/MeshletRender/Model.cpp @@ -452,26 +452,52 @@ HRESULT Model::UploadGpuResources(ID3D12Device* device, ID3D12CommandQueue* cmdQ for (uint32_t j = 0; j < m.Vertices.size(); ++j) { cmdList->CopyResource(m.VertexResources[j].Get(), vertexUploads[j].Get()); - cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.VertexResources[j].Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE)); + const auto barrier = CD3DX12_RESOURCE_BARRIER::Transition(m.VertexResources[j].Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); + cmdList->ResourceBarrier(1, &barrier); + //cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.VertexResources[j].Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE)); } cmdList->CopyResource(m.IndexResource.Get(), indexUpload.Get()); - cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.IndexResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE)); + { + const auto barrier = CD3DX12_RESOURCE_BARRIER::Transition(m.IndexResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); + cmdList->ResourceBarrier(1, &barrier); + } + //cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.IndexResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE)); cmdList->CopyResource(m.MeshletResource.Get(), meshletUpload.Get()); - cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.MeshletResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE)); + { + const auto barrier = CD3DX12_RESOURCE_BARRIER::Transition(m.MeshletResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); + cmdList->ResourceBarrier(1, &barrier); + } + //cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.MeshletResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE)); cmdList->CopyResource(m.CullDataResource.Get(), cullDataUpload.Get()); - cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.CullDataResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE)); + { + const auto barrier = CD3DX12_RESOURCE_BARRIER::Transition(m.CullDataResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); + cmdList->ResourceBarrier(1, &barrier); + } + //cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.CullDataResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE)); cmdList->CopyResource(m.UniqueVertexIndexResource.Get(), uniqueVertexIndexUpload.Get()); - cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.UniqueVertexIndexResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE)); + { + const auto barrier = CD3DX12_RESOURCE_BARRIER::Transition(m.UniqueVertexIndexResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); + cmdList->ResourceBarrier(1, &barrier); + } + //cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.UniqueVertexIndexResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE)); cmdList->CopyResource(m.PrimitiveIndexResource.Get(), primitiveIndexUpload.Get()); - cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.PrimitiveIndexResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE)); + { + const auto barrier = CD3DX12_RESOURCE_BARRIER::Transition(m.PrimitiveIndexResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); + cmdList->ResourceBarrier(1, &barrier); + } + //cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.PrimitiveIndexResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE)); cmdList->CopyResource(m.MeshInfoResource.Get(), meshInfoUpload.Get()); - cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.MeshInfoResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER)); + { + const auto barrier = CD3DX12_RESOURCE_BARRIER::Transition(m.MeshInfoResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); + cmdList->ResourceBarrier(1, &barrier); + } + //cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.MeshInfoResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER)); ThrowIfFailed(cmdList->Close()); From 0fe6234d2acdfb81c9d694ab13c703c36d2358f4 Mon Sep 17 00:00:00 2001 From: Robert Sriniasiah Date: Mon, 21 Dec 2020 12:38:37 -0800 Subject: [PATCH 4/8] D3D12MeshletRender: cleaned up This seems relatively decent, besides the loop for vertex resource barriers Fixed a bug where I set the wrong end state --- .../src/MeshletRender/D3D12MeshletRender.cpp | 14 ++----- .../src/MeshletRender/Model.cpp | 41 +++++-------------- 2 files changed, 14 insertions(+), 41 deletions(-) diff --git a/Samples/Desktop/D3D12MeshShaders/src/MeshletRender/D3D12MeshletRender.cpp b/Samples/Desktop/D3D12MeshShaders/src/MeshletRender/D3D12MeshletRender.cpp index d0fdfff3b..e78c5c745 100644 --- a/Samples/Desktop/D3D12MeshShaders/src/MeshletRender/D3D12MeshletRender.cpp +++ b/Samples/Desktop/D3D12MeshShaders/src/MeshletRender/D3D12MeshletRender.cpp @@ -184,14 +184,12 @@ void D3D12MeshletRender::LoadPipeline() depthOptimizedClearValue.DepthStencil.Stencil = 0; const CD3DX12_HEAP_PROPERTIES depthStencilHeapProps(D3D12_HEAP_TYPE_DEFAULT); - const CD3DX12_RESOURCE_DESC depthStencilResDesc = CD3DX12_RESOURCE_DESC::Tex2D(DXGI_FORMAT_D32_FLOAT, m_width, m_height, 1, 0, 1, 0, D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL); + const CD3DX12_RESOURCE_DESC depthStencilTextureDesc = CD3DX12_RESOURCE_DESC::Tex2D(DXGI_FORMAT_D32_FLOAT, m_width, m_height, 1, 0, 1, 0, D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL); ThrowIfFailed(m_device->CreateCommittedResource( - //&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT), &depthStencilHeapProps, D3D12_HEAP_FLAG_NONE, - //&CD3DX12_RESOURCE_DESC::Tex2D(DXGI_FORMAT_D32_FLOAT, m_width, m_height, 1, 0, 1, 0, D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL), - &depthStencilResDesc, + &depthStencilTextureDesc, D3D12_RESOURCE_STATE_DEPTH_WRITE, &depthOptimizedClearValue, IID_PPV_ARGS(&m_depthStencil) @@ -207,14 +205,12 @@ void D3D12MeshletRender::LoadPipeline() const UINT64 constantBufferSize = sizeof(SceneConstantBuffer) * FrameCount; const CD3DX12_HEAP_PROPERTIES constantBufferHeapProps(D3D12_HEAP_TYPE_UPLOAD); - const CD3DX12_RESOURCE_DESC constantBufferResDesc = CD3DX12_RESOURCE_DESC::Buffer(constantBufferSize); + const CD3DX12_RESOURCE_DESC constantBufferDesc = CD3DX12_RESOURCE_DESC::Buffer(constantBufferSize); ThrowIfFailed(m_device->CreateCommittedResource( - //&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_UPLOAD), &constantBufferHeapProps, D3D12_HEAP_FLAG_NONE, - //&CD3DX12_RESOURCE_DESC::Buffer(constantBufferSize), - &constantBufferResDesc, + &constantBufferDesc, D3D12_RESOURCE_STATE_GENERIC_READ, nullptr, IID_PPV_ARGS(&m_constantBuffer))); @@ -397,7 +393,6 @@ void D3D12MeshletRender::PopulateCommandList() // Indicate that the back buffer will be used as a render target. const auto toRenderTargetBarrier = CD3DX12_RESOURCE_BARRIER::Transition(m_renderTargets[m_frameIndex].Get(), D3D12_RESOURCE_STATE_PRESENT, D3D12_RESOURCE_STATE_RENDER_TARGET); - //m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_renderTargets[m_frameIndex].Get(), D3D12_RESOURCE_STATE_PRESENT, D3D12_RESOURCE_STATE_RENDER_TARGET)); m_commandList->ResourceBarrier(1, &toRenderTargetBarrier); CD3DX12_CPU_DESCRIPTOR_HANDLE rtvHandle(m_rtvHeap->GetCPUDescriptorHandleForHeapStart(), m_frameIndex, m_rtvDescriptorSize); @@ -428,7 +423,6 @@ void D3D12MeshletRender::PopulateCommandList() // Indicate that the back buffer will now be used to present. const auto toPresentBarrier = CD3DX12_RESOURCE_BARRIER::Transition(m_renderTargets[m_frameIndex].Get(), D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_PRESENT); - //m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_renderTargets[m_frameIndex].Get(), D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_PRESENT)); m_commandList->ResourceBarrier(1, &toPresentBarrier); ThrowIfFailed(m_commandList->Close()); diff --git a/Samples/Desktop/D3D12MeshShaders/src/MeshletRender/Model.cpp b/Samples/Desktop/D3D12MeshShaders/src/MeshletRender/Model.cpp index f359a001b..686a9f022 100644 --- a/Samples/Desktop/D3D12MeshShaders/src/MeshletRender/Model.cpp +++ b/Samples/Desktop/D3D12MeshShaders/src/MeshletRender/Model.cpp @@ -454,50 +454,29 @@ HRESULT Model::UploadGpuResources(ID3D12Device* device, ID3D12CommandQueue* cmdQ cmdList->CopyResource(m.VertexResources[j].Get(), vertexUploads[j].Get()); const auto barrier = CD3DX12_RESOURCE_BARRIER::Transition(m.VertexResources[j].Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); cmdList->ResourceBarrier(1, &barrier); - //cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.VertexResources[j].Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE)); } + D3D12_RESOURCE_BARRIER postCopyBarriers[6]; + cmdList->CopyResource(m.IndexResource.Get(), indexUpload.Get()); - { - const auto barrier = CD3DX12_RESOURCE_BARRIER::Transition(m.IndexResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); - cmdList->ResourceBarrier(1, &barrier); - } - //cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.IndexResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE)); + postCopyBarriers[0] = CD3DX12_RESOURCE_BARRIER::Transition(m.IndexResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); cmdList->CopyResource(m.MeshletResource.Get(), meshletUpload.Get()); - { - const auto barrier = CD3DX12_RESOURCE_BARRIER::Transition(m.MeshletResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); - cmdList->ResourceBarrier(1, &barrier); - } - //cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.MeshletResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE)); + postCopyBarriers[1] = CD3DX12_RESOURCE_BARRIER::Transition(m.MeshletResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); cmdList->CopyResource(m.CullDataResource.Get(), cullDataUpload.Get()); - { - const auto barrier = CD3DX12_RESOURCE_BARRIER::Transition(m.CullDataResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); - cmdList->ResourceBarrier(1, &barrier); - } - //cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.CullDataResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE)); + postCopyBarriers[2] = CD3DX12_RESOURCE_BARRIER::Transition(m.CullDataResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); cmdList->CopyResource(m.UniqueVertexIndexResource.Get(), uniqueVertexIndexUpload.Get()); - { - const auto barrier = CD3DX12_RESOURCE_BARRIER::Transition(m.UniqueVertexIndexResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); - cmdList->ResourceBarrier(1, &barrier); - } - //cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.UniqueVertexIndexResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE)); + postCopyBarriers[3] = CD3DX12_RESOURCE_BARRIER::Transition(m.UniqueVertexIndexResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); cmdList->CopyResource(m.PrimitiveIndexResource.Get(), primitiveIndexUpload.Get()); - { - const auto barrier = CD3DX12_RESOURCE_BARRIER::Transition(m.PrimitiveIndexResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); - cmdList->ResourceBarrier(1, &barrier); - } - //cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.PrimitiveIndexResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE)); + postCopyBarriers[4] = CD3DX12_RESOURCE_BARRIER::Transition(m.PrimitiveIndexResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); cmdList->CopyResource(m.MeshInfoResource.Get(), meshInfoUpload.Get()); - { - const auto barrier = CD3DX12_RESOURCE_BARRIER::Transition(m.MeshInfoResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); - cmdList->ResourceBarrier(1, &barrier); - } - //cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.MeshInfoResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER)); + postCopyBarriers[5] = CD3DX12_RESOURCE_BARRIER::Transition(m.MeshInfoResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER); + + cmdList->ResourceBarrier(ARRAYSIZE(postCopyBarriers), postCopyBarriers); ThrowIfFailed(cmdList->Close()); From 8972962d43837918aa432caaf066a97ca9255e76 Mon Sep 17 00:00:00 2001 From: Robert Sriniasiah Date: Mon, 21 Dec 2020 14:27:55 -0800 Subject: [PATCH 5/8] D3D12DynamicLOD: sample fixes --- .../src/DynamicLOD/D3D12DynamicLOD.cpp | 39 +++++++++++++------ .../D3D12MeshShaders/src/DynamicLOD/Model.cpp | 19 +++++---- 2 files changed, 39 insertions(+), 19 deletions(-) diff --git a/Samples/Desktop/D3D12MeshShaders/src/DynamicLOD/D3D12DynamicLOD.cpp b/Samples/Desktop/D3D12MeshShaders/src/DynamicLOD/D3D12DynamicLOD.cpp index 331d520d3..c2902b525 100644 --- a/Samples/Desktop/D3D12MeshShaders/src/DynamicLOD/D3D12DynamicLOD.cpp +++ b/Samples/Desktop/D3D12MeshShaders/src/DynamicLOD/D3D12DynamicLOD.cpp @@ -243,10 +243,13 @@ void D3D12DynamicLOD::LoadPipeline() depthOptimizedClearValue.DepthStencil.Depth = 1.0f; depthOptimizedClearValue.DepthStencil.Stencil = 0; + const CD3DX12_HEAP_PROPERTIES depthStencilHeapProps(D3D12_HEAP_TYPE_DEFAULT); + const CD3DX12_RESOURCE_DESC depthStencilTextureDesc = CD3DX12_RESOURCE_DESC::Tex2D(DXGI_FORMAT_D32_FLOAT, m_width, m_height, 1, 0, 1, 0, D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL); + ThrowIfFailed(m_device->CreateCommittedResource( - &CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT), + &depthStencilHeapProps, D3D12_HEAP_FLAG_NONE, - &CD3DX12_RESOURCE_DESC::Tex2D(DXGI_FORMAT_D32_FLOAT, m_width, m_height, 1, 0, 1, 0, D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL), + &depthStencilTextureDesc, D3D12_RESOURCE_STATE_DEPTH_WRITE, &depthOptimizedClearValue, IID_PPV_ARGS(&m_depthStencil) @@ -259,10 +262,13 @@ void D3D12DynamicLOD::LoadPipeline() { const UINT64 constantBufferSize = sizeof(Constants) * FrameCount; + const CD3DX12_HEAP_PROPERTIES constantBufferHeapProps(D3D12_HEAP_TYPE_UPLOAD); + const CD3DX12_RESOURCE_DESC constantBufferDesc = CD3DX12_RESOURCE_DESC::Buffer(constantBufferSize); + ThrowIfFailed(m_device->CreateCommittedResource( - &CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_UPLOAD), + &constantBufferHeapProps, D3D12_HEAP_FLAG_NONE, - &CD3DX12_RESOURCE_DESC::Buffer(constantBufferSize), + &constantBufferDesc, D3D12_RESOURCE_STATE_GENERIC_READ, nullptr, IID_PPV_ARGS(&m_constantBuffer) @@ -561,9 +567,11 @@ void D3D12DynamicLOD::PopulateCommandList() // Only upload instance data if we've had a change if (m_updateInstances) { - m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_instanceBuffer.Get(), D3D12_RESOURCE_STATE_GENERIC_READ, D3D12_RESOURCE_STATE_COPY_DEST)); + const auto toCopyBarrier = CD3DX12_RESOURCE_BARRIER::Transition(m_instanceBuffer.Get(), D3D12_RESOURCE_STATE_GENERIC_READ, D3D12_RESOURCE_STATE_COPY_DEST); + m_commandList->ResourceBarrier(1, &toCopyBarrier); m_commandList->CopyResource(m_instanceBuffer.Get(), m_instanceUpload.Get()); - m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_instanceBuffer.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_GENERIC_READ)); + const auto toGenericBarrier = CD3DX12_RESOURCE_BARRIER::Transition(m_instanceBuffer.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_GENERIC_READ); + m_commandList->ResourceBarrier(1, &toGenericBarrier); m_updateInstances = false; } @@ -578,7 +586,8 @@ void D3D12DynamicLOD::PopulateCommandList() m_commandList->RSSetScissorRects(1, &m_scissorRect); // Indicate that the back buffer will be used as a render target. - m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_renderTargets[m_frameIndex].Get(), D3D12_RESOURCE_STATE_PRESENT, D3D12_RESOURCE_STATE_RENDER_TARGET)); + const auto toRenderTargetBarrier = CD3DX12_RESOURCE_BARRIER::Transition(m_renderTargets[m_frameIndex].Get(), D3D12_RESOURCE_STATE_PRESENT, D3D12_RESOURCE_STATE_RENDER_TARGET); + m_commandList->ResourceBarrier(1, &toRenderTargetBarrier); CD3DX12_CPU_DESCRIPTOR_HANDLE rtvHandle(m_rtvHeap->GetCPUDescriptorHandleForHeapStart(), m_frameIndex, m_rtvDescriptorSize); CD3DX12_CPU_DESCRIPTOR_HANDLE dsvHandle(m_dsvHeap->GetCPUDescriptorHandleForHeapStart()); @@ -608,7 +617,8 @@ void D3D12DynamicLOD::PopulateCommandList() } // Indicate that the back buffer will now be used to present. - m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_renderTargets[m_frameIndex].Get(), D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_PRESENT)); + const auto toPresentBarrier = CD3DX12_RESOURCE_BARRIER::Transition(m_renderTargets[m_frameIndex].Get(), D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_PRESENT); + m_commandList->ResourceBarrier(1, &toPresentBarrier); ThrowIfFailed(m_commandList->Close()); } @@ -669,21 +679,26 @@ void D3D12DynamicLOD::RegenerateInstances() { WaitForGpu(); + const CD3DX12_HEAP_PROPERTIES instanceBufferDefaultHeapProps(D3D12_HEAP_TYPE_DEFAULT); + const CD3DX12_RESOURCE_DESC instanceBufferDesc = CD3DX12_RESOURCE_DESC::Buffer(instanceBufferSize); + // Create/re-create the instance buffer ThrowIfFailed(m_device->CreateCommittedResource( - &CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT), + &instanceBufferDefaultHeapProps, D3D12_HEAP_FLAG_NONE, - &CD3DX12_RESOURCE_DESC::Buffer(instanceBufferSize), + &instanceBufferDesc, D3D12_RESOURCE_STATE_GENERIC_READ, nullptr, IID_PPV_ARGS(&m_instanceBuffer) )); + const CD3DX12_HEAP_PROPERTIES instanceBufferUploadHeapProps(D3D12_HEAP_TYPE_UPLOAD); + // Create/re-create the instance buffer ThrowIfFailed(m_device->CreateCommittedResource( - &CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_UPLOAD), + &instanceBufferUploadHeapProps, D3D12_HEAP_FLAG_NONE, - &CD3DX12_RESOURCE_DESC::Buffer(instanceBufferSize), + &instanceBufferDesc, D3D12_RESOURCE_STATE_GENERIC_READ, nullptr, IID_PPV_ARGS(&m_instanceUpload) diff --git a/Samples/Desktop/D3D12MeshShaders/src/DynamicLOD/Model.cpp b/Samples/Desktop/D3D12MeshShaders/src/DynamicLOD/Model.cpp index b587abcfd..686a9f022 100644 --- a/Samples/Desktop/D3D12MeshShaders/src/DynamicLOD/Model.cpp +++ b/Samples/Desktop/D3D12MeshShaders/src/DynamicLOD/Model.cpp @@ -452,26 +452,31 @@ HRESULT Model::UploadGpuResources(ID3D12Device* device, ID3D12CommandQueue* cmdQ for (uint32_t j = 0; j < m.Vertices.size(); ++j) { cmdList->CopyResource(m.VertexResources[j].Get(), vertexUploads[j].Get()); - cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.VertexResources[j].Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE)); + const auto barrier = CD3DX12_RESOURCE_BARRIER::Transition(m.VertexResources[j].Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); + cmdList->ResourceBarrier(1, &barrier); } + D3D12_RESOURCE_BARRIER postCopyBarriers[6]; + cmdList->CopyResource(m.IndexResource.Get(), indexUpload.Get()); - cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.IndexResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE)); + postCopyBarriers[0] = CD3DX12_RESOURCE_BARRIER::Transition(m.IndexResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); cmdList->CopyResource(m.MeshletResource.Get(), meshletUpload.Get()); - cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.MeshletResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE)); + postCopyBarriers[1] = CD3DX12_RESOURCE_BARRIER::Transition(m.MeshletResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); cmdList->CopyResource(m.CullDataResource.Get(), cullDataUpload.Get()); - cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.CullDataResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE)); + postCopyBarriers[2] = CD3DX12_RESOURCE_BARRIER::Transition(m.CullDataResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); cmdList->CopyResource(m.UniqueVertexIndexResource.Get(), uniqueVertexIndexUpload.Get()); - cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.UniqueVertexIndexResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE)); + postCopyBarriers[3] = CD3DX12_RESOURCE_BARRIER::Transition(m.UniqueVertexIndexResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); cmdList->CopyResource(m.PrimitiveIndexResource.Get(), primitiveIndexUpload.Get()); - cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.PrimitiveIndexResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE)); + postCopyBarriers[4] = CD3DX12_RESOURCE_BARRIER::Transition(m.PrimitiveIndexResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); cmdList->CopyResource(m.MeshInfoResource.Get(), meshInfoUpload.Get()); - cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.MeshInfoResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER)); + postCopyBarriers[5] = CD3DX12_RESOURCE_BARRIER::Transition(m.MeshInfoResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER); + + cmdList->ResourceBarrier(ARRAYSIZE(postCopyBarriers), postCopyBarriers); ThrowIfFailed(cmdList->Close()); From 84b63525367f4db4e6f91b855378c1bf95bd9411 Mon Sep 17 00:00:00 2001 From: Robert Sriniasiah Date: Mon, 21 Dec 2020 14:51:23 -0800 Subject: [PATCH 6/8] D3D12MeshletCull --- .../src/MeshletCull/CullDataVisualizer.cpp | 7 +++-- .../src/MeshletCull/D3D12MeshletCull.cpp | 29 +++++++++++++------ .../src/MeshletCull/FrustumVisualizer.cpp | 7 +++-- .../src/MeshletCull/Model.cpp | 19 +++++++----- 4 files changed, 42 insertions(+), 20 deletions(-) diff --git a/Samples/Desktop/D3D12MeshShaders/src/MeshletCull/CullDataVisualizer.cpp b/Samples/Desktop/D3D12MeshShaders/src/MeshletCull/CullDataVisualizer.cpp index 219d03b3a..7d5df0d66 100644 --- a/Samples/Desktop/D3D12MeshShaders/src/MeshletCull/CullDataVisualizer.cpp +++ b/Samples/Desktop/D3D12MeshShaders/src/MeshletCull/CullDataVisualizer.cpp @@ -114,11 +114,14 @@ void CullDataVisualizer::CreateDeviceResources(ID3D12Device2* device, DXGI_FORMA ThrowIfFailed(device->CreatePipelineState(&streamDesc, IID_PPV_ARGS(&m_boundingSpherePso))); } + const CD3DX12_HEAP_PROPERTIES constantBufferHeapProps(D3D12_HEAP_TYPE_UPLOAD); + const CD3DX12_RESOURCE_DESC constantBufferDesc = CD3DX12_RESOURCE_DESC::Buffer(sizeof(Constants) * 2); + // Create shared constant buffer ThrowIfFailed(device->CreateCommittedResource( - &CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_UPLOAD), + &constantBufferHeapProps, D3D12_HEAP_FLAG_NONE, - &CD3DX12_RESOURCE_DESC::Buffer(sizeof(Constants) * 2), + &constantBufferDesc, D3D12_RESOURCE_STATE_GENERIC_READ, nullptr, IID_PPV_ARGS(&m_constantResource) diff --git a/Samples/Desktop/D3D12MeshShaders/src/MeshletCull/D3D12MeshletCull.cpp b/Samples/Desktop/D3D12MeshShaders/src/MeshletCull/D3D12MeshletCull.cpp index 91f6d4d33..2f6c7d2dc 100644 --- a/Samples/Desktop/D3D12MeshShaders/src/MeshletCull/D3D12MeshletCull.cpp +++ b/Samples/Desktop/D3D12MeshShaders/src/MeshletCull/D3D12MeshletCull.cpp @@ -311,10 +311,13 @@ void D3D12MeshletCull::LoadPipeline() depthOptimizedClearValue.DepthStencil.Depth = 1.0f; depthOptimizedClearValue.DepthStencil.Stencil = 0; + const CD3DX12_HEAP_PROPERTIES depthStencilHeapProps(D3D12_HEAP_TYPE_DEFAULT); + const CD3DX12_RESOURCE_DESC depthStencilTextureDesc = CD3DX12_RESOURCE_DESC::Tex2D(DXGI_FORMAT_D32_FLOAT, m_width, m_height, 1, 0, 1, 0, D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL); + ThrowIfFailed(m_device->CreateCommittedResource( - &CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT), + &depthStencilHeapProps, D3D12_HEAP_FLAG_NONE, - &CD3DX12_RESOURCE_DESC::Tex2D(DXGI_FORMAT_D32_FLOAT, m_width, m_height, 1, 0, 1, 0, D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL), + &depthStencilTextureDesc, D3D12_RESOURCE_STATE_DEPTH_WRITE, &depthOptimizedClearValue, IID_PPV_ARGS(&m_depthStencil) @@ -329,10 +332,13 @@ void D3D12MeshletCull::LoadPipeline() { const UINT64 constantBufferSize = sizeof(Constants) * FrameCount; + const CD3DX12_HEAP_PROPERTIES constantBufferHeapProps(D3D12_HEAP_TYPE_UPLOAD); + const CD3DX12_RESOURCE_DESC constantBufferDesc = CD3DX12_RESOURCE_DESC::Buffer(constantBufferSize); + ThrowIfFailed(m_device->CreateCommittedResource( - &CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_UPLOAD), + &constantBufferHeapProps, D3D12_HEAP_FLAG_NONE, - &CD3DX12_RESOURCE_DESC::Buffer(constantBufferSize), + &constantBufferDesc, D3D12_RESOURCE_STATE_GENERIC_READ, nullptr, IID_PPV_ARGS(&m_constantBuffer))); @@ -426,12 +432,15 @@ void D3D12MeshletCull::LoadAssets() // For per-frame uploads consider using the D3D12_COMMAND_LIST_TYPE_COPY command queue. obj.Model.LoadFromFile(c_modelFilenames[def.ModelIndex]); obj.Model.UploadGpuResources(m_device.Get(), m_commandQueue.Get(), m_commandAllocators[m_frameIndex].Get(), m_commandList.Get()); - + + const CD3DX12_HEAP_PROPERTIES instanceBufferHeapProps(D3D12_HEAP_TYPE_UPLOAD); + const CD3DX12_RESOURCE_DESC instanceBufferDesc = CD3DX12_RESOURCE_DESC::Buffer(sizeof(Instance) * 2); + // Create the per-object instance data buffer ThrowIfFailed(m_device->CreateCommittedResource( - &CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_UPLOAD), + &instanceBufferHeapProps, D3D12_HEAP_FLAG_NONE, - &CD3DX12_RESOURCE_DESC::Buffer(sizeof(Instance) * 2), + &instanceBufferDesc, D3D12_RESOURCE_STATE_GENERIC_READ, nullptr, IID_PPV_ARGS(&obj.InstanceResource) @@ -657,7 +666,8 @@ void D3D12MeshletCull::PopulateCommandList() m_commandList->RSSetScissorRects(1, &m_scissorRect); // Indicate that the back buffer will be used as a render target. - m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_renderTargets[m_frameIndex].Get(), D3D12_RESOURCE_STATE_PRESENT, D3D12_RESOURCE_STATE_RENDER_TARGET)); + const auto toRenderTargetBarrier = CD3DX12_RESOURCE_BARRIER::Transition(m_renderTargets[m_frameIndex].Get(), D3D12_RESOURCE_STATE_PRESENT, D3D12_RESOURCE_STATE_RENDER_TARGET); + m_commandList->ResourceBarrier(1, &toRenderTargetBarrier); CD3DX12_CPU_DESCRIPTOR_HANDLE rtvHandle(m_rtvHeap->GetCPUDescriptorHandleForHeapStart(), m_frameIndex, m_rtvDescriptorSize); CD3DX12_CPU_DESCRIPTOR_HANDLE dsvHandle(m_dsvHeap->GetCPUDescriptorHandleForHeapStart()); @@ -712,7 +722,8 @@ void D3D12MeshletCull::PopulateCommandList() } // Indicate that the back buffer will now be used to present. - m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_renderTargets[m_frameIndex].Get(), D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_PRESENT)); + const auto toPresentBarrier = CD3DX12_RESOURCE_BARRIER::Transition(m_renderTargets[m_frameIndex].Get(), D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_PRESENT); + m_commandList->ResourceBarrier(1, &toPresentBarrier); ThrowIfFailed(m_commandList->Close()); } diff --git a/Samples/Desktop/D3D12MeshShaders/src/MeshletCull/FrustumVisualizer.cpp b/Samples/Desktop/D3D12MeshShaders/src/MeshletCull/FrustumVisualizer.cpp index cc87e6d7e..59a8d75a0 100644 --- a/Samples/Desktop/D3D12MeshShaders/src/MeshletCull/FrustumVisualizer.cpp +++ b/Samples/Desktop/D3D12MeshShaders/src/MeshletCull/FrustumVisualizer.cpp @@ -72,11 +72,14 @@ void FrustumVisualizer::CreateDeviceResources(ID3D12Device2* device, DXGI_FORMAT // Create the MS PSO ThrowIfFailed(device->CreatePipelineState(&streamDesc, IID_PPV_ARGS(&m_pso))); + const CD3DX12_HEAP_PROPERTIES constantBufferHeapProps(D3D12_HEAP_TYPE_UPLOAD); + const CD3DX12_RESOURCE_DESC constantBufferDesc = CD3DX12_RESOURCE_DESC::Buffer(sizeof(Constants) * 2); + // Create the constant buffer ThrowIfFailed(device->CreateCommittedResource( - &CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_UPLOAD), + &constantBufferHeapProps, D3D12_HEAP_FLAG_NONE, - &CD3DX12_RESOURCE_DESC::Buffer(sizeof(Constants) * 2), + &constantBufferDesc, D3D12_RESOURCE_STATE_GENERIC_READ, nullptr, IID_PPV_ARGS(&m_constantResource) diff --git a/Samples/Desktop/D3D12MeshShaders/src/MeshletCull/Model.cpp b/Samples/Desktop/D3D12MeshShaders/src/MeshletCull/Model.cpp index b587abcfd..686a9f022 100644 --- a/Samples/Desktop/D3D12MeshShaders/src/MeshletCull/Model.cpp +++ b/Samples/Desktop/D3D12MeshShaders/src/MeshletCull/Model.cpp @@ -452,26 +452,31 @@ HRESULT Model::UploadGpuResources(ID3D12Device* device, ID3D12CommandQueue* cmdQ for (uint32_t j = 0; j < m.Vertices.size(); ++j) { cmdList->CopyResource(m.VertexResources[j].Get(), vertexUploads[j].Get()); - cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.VertexResources[j].Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE)); + const auto barrier = CD3DX12_RESOURCE_BARRIER::Transition(m.VertexResources[j].Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); + cmdList->ResourceBarrier(1, &barrier); } + D3D12_RESOURCE_BARRIER postCopyBarriers[6]; + cmdList->CopyResource(m.IndexResource.Get(), indexUpload.Get()); - cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.IndexResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE)); + postCopyBarriers[0] = CD3DX12_RESOURCE_BARRIER::Transition(m.IndexResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); cmdList->CopyResource(m.MeshletResource.Get(), meshletUpload.Get()); - cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.MeshletResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE)); + postCopyBarriers[1] = CD3DX12_RESOURCE_BARRIER::Transition(m.MeshletResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); cmdList->CopyResource(m.CullDataResource.Get(), cullDataUpload.Get()); - cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.CullDataResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE)); + postCopyBarriers[2] = CD3DX12_RESOURCE_BARRIER::Transition(m.CullDataResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); cmdList->CopyResource(m.UniqueVertexIndexResource.Get(), uniqueVertexIndexUpload.Get()); - cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.UniqueVertexIndexResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE)); + postCopyBarriers[3] = CD3DX12_RESOURCE_BARRIER::Transition(m.UniqueVertexIndexResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); cmdList->CopyResource(m.PrimitiveIndexResource.Get(), primitiveIndexUpload.Get()); - cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.PrimitiveIndexResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE)); + postCopyBarriers[4] = CD3DX12_RESOURCE_BARRIER::Transition(m.PrimitiveIndexResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); cmdList->CopyResource(m.MeshInfoResource.Get(), meshInfoUpload.Get()); - cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.MeshInfoResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER)); + postCopyBarriers[5] = CD3DX12_RESOURCE_BARRIER::Transition(m.MeshInfoResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER); + + cmdList->ResourceBarrier(ARRAYSIZE(postCopyBarriers), postCopyBarriers); ThrowIfFailed(cmdList->Close()); From e9cdfdff37a0d2d03d24be6eebb13591559fa20d Mon Sep 17 00:00:00 2001 From: Robert Sriniasiah Date: Mon, 21 Dec 2020 15:03:47 -0800 Subject: [PATCH 7/8] D3D12MeshletInstancing --- .../D3D12MeshletInstancing.cpp | 39 +++++++++++++------ .../src/MeshletInstancing/Model.cpp | 21 ++++++---- 2 files changed, 40 insertions(+), 20 deletions(-) diff --git a/Samples/Desktop/D3D12MeshShaders/src/MeshletInstancing/D3D12MeshletInstancing.cpp b/Samples/Desktop/D3D12MeshShaders/src/MeshletInstancing/D3D12MeshletInstancing.cpp index 481f33491..ed01ce379 100644 --- a/Samples/Desktop/D3D12MeshShaders/src/MeshletInstancing/D3D12MeshletInstancing.cpp +++ b/Samples/Desktop/D3D12MeshShaders/src/MeshletInstancing/D3D12MeshletInstancing.cpp @@ -211,10 +211,13 @@ void D3D12MeshletInstancing::LoadPipeline() depthOptimizedClearValue.DepthStencil.Depth = 1.0f; depthOptimizedClearValue.DepthStencil.Stencil = 0; + const CD3DX12_HEAP_PROPERTIES depthStencilHeapProps(D3D12_HEAP_TYPE_DEFAULT); + const CD3DX12_RESOURCE_DESC depthStencilTextureDesc = CD3DX12_RESOURCE_DESC::Tex2D(DXGI_FORMAT_D32_FLOAT, m_width, m_height, 1, 0, 1, 0, D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL); + ThrowIfFailed(m_device->CreateCommittedResource( - &CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT), + &depthStencilHeapProps, D3D12_HEAP_FLAG_NONE, - &CD3DX12_RESOURCE_DESC::Tex2D(DXGI_FORMAT_D32_FLOAT, m_width, m_height, 1, 0, 1, 0, D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL), + &depthStencilTextureDesc, D3D12_RESOURCE_STATE_DEPTH_WRITE, &depthOptimizedClearValue, IID_PPV_ARGS(&m_depthStencil) @@ -229,10 +232,13 @@ void D3D12MeshletInstancing::LoadPipeline() { const UINT64 constantBufferSize = sizeof(SceneConstantBuffer) * FrameCount; + const CD3DX12_HEAP_PROPERTIES constantBufferHeapProps(D3D12_HEAP_TYPE_UPLOAD); + const CD3DX12_RESOURCE_DESC constantBufferDesc = CD3DX12_RESOURCE_DESC::Buffer(constantBufferSize); + ThrowIfFailed(m_device->CreateCommittedResource( - &CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_UPLOAD), + &constantBufferHeapProps, D3D12_HEAP_FLAG_NONE, - &CD3DX12_RESOURCE_DESC::Buffer(constantBufferSize), + &constantBufferDesc, D3D12_RESOURCE_STATE_GENERIC_READ, nullptr, IID_PPV_ARGS(&m_constantBuffer))); @@ -432,9 +438,11 @@ void D3D12MeshletInstancing::PopulateCommandList() // Only upload instance data if we've had a change if (m_updateInstances) { - m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_instanceBuffer.Get(), D3D12_RESOURCE_STATE_GENERIC_READ, D3D12_RESOURCE_STATE_COPY_DEST)); + const auto toCopyBarrier = CD3DX12_RESOURCE_BARRIER::Transition(m_instanceBuffer.Get(), D3D12_RESOURCE_STATE_GENERIC_READ, D3D12_RESOURCE_STATE_COPY_DEST); + m_commandList->ResourceBarrier(1, &toCopyBarrier); m_commandList->CopyResource(m_instanceBuffer.Get(), m_instanceUpload.Get()); - m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_instanceBuffer.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_GENERIC_READ)); + const auto toGenericBarrier = CD3DX12_RESOURCE_BARRIER::Transition(m_instanceBuffer.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_GENERIC_READ); + m_commandList->ResourceBarrier(1, &toGenericBarrier); m_updateInstances = false; } @@ -445,7 +453,8 @@ void D3D12MeshletInstancing::PopulateCommandList() m_commandList->RSSetScissorRects(1, &m_scissorRect); // Indicate that the back buffer will be used as a render target. - m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_renderTargets[m_frameIndex].Get(), D3D12_RESOURCE_STATE_PRESENT, D3D12_RESOURCE_STATE_RENDER_TARGET)); + const auto toRenderTargetBarrier = CD3DX12_RESOURCE_BARRIER::Transition(m_renderTargets[m_frameIndex].Get(), D3D12_RESOURCE_STATE_PRESENT, D3D12_RESOURCE_STATE_RENDER_TARGET); + m_commandList->ResourceBarrier(1, &toRenderTargetBarrier); CD3DX12_CPU_DESCRIPTOR_HANDLE rtvHandle(m_rtvHeap->GetCPUDescriptorHandleForHeapStart(), m_frameIndex, m_rtvDescriptorSize); CD3DX12_CPU_DESCRIPTOR_HANDLE dsvHandle(m_dsvHeap->GetCPUDescriptorHandleForHeapStart()); @@ -494,7 +503,8 @@ void D3D12MeshletInstancing::PopulateCommandList() } // Indicate that the back buffer will now be used to present. - m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_renderTargets[m_frameIndex].Get(), D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_PRESENT)); + const auto toPresentBarrier = CD3DX12_RESOURCE_BARRIER::Transition(m_renderTargets[m_frameIndex].Get(), D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_PRESENT); + m_commandList->ResourceBarrier(1, &toPresentBarrier); ThrowIfFailed(m_commandList->Close()); } @@ -555,21 +565,26 @@ void D3D12MeshletInstancing::RegenerateInstances() { WaitForGpu(); + const CD3DX12_HEAP_PROPERTIES instanceBufferDefaultHeapProps(D3D12_HEAP_TYPE_DEFAULT); + const CD3DX12_RESOURCE_DESC instanceBufferDesc = CD3DX12_RESOURCE_DESC::Buffer(instanceBufferSize); + // Create/re-create the instance buffer ThrowIfFailed(m_device->CreateCommittedResource( - &CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT), + &instanceBufferDefaultHeapProps, D3D12_HEAP_FLAG_NONE, - &CD3DX12_RESOURCE_DESC::Buffer(instanceBufferSize), + &instanceBufferDesc, D3D12_RESOURCE_STATE_GENERIC_READ, nullptr, IID_PPV_ARGS(&m_instanceBuffer) )); + const CD3DX12_HEAP_PROPERTIES instanceBufferUploadHeapProps(D3D12_HEAP_TYPE_UPLOAD); + // Create/re-create the instance buffer ThrowIfFailed(m_device->CreateCommittedResource( - &CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_UPLOAD), + &instanceBufferUploadHeapProps, D3D12_HEAP_FLAG_NONE, - &CD3DX12_RESOURCE_DESC::Buffer(instanceBufferSize), + &instanceBufferDesc, D3D12_RESOURCE_STATE_GENERIC_READ, nullptr, IID_PPV_ARGS(&m_instanceUpload) diff --git a/Samples/Desktop/D3D12MeshShaders/src/MeshletInstancing/Model.cpp b/Samples/Desktop/D3D12MeshShaders/src/MeshletInstancing/Model.cpp index b587abcfd..89c417188 100644 --- a/Samples/Desktop/D3D12MeshShaders/src/MeshletInstancing/Model.cpp +++ b/Samples/Desktop/D3D12MeshShaders/src/MeshletInstancing/Model.cpp @@ -451,27 +451,32 @@ HRESULT Model::UploadGpuResources(ID3D12Device* device, ID3D12CommandQueue* cmdQ for (uint32_t j = 0; j < m.Vertices.size(); ++j) { - cmdList->CopyResource(m.VertexResources[j].Get(), vertexUploads[j].Get()); - cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.VertexResources[j].Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE)); + cmdList->CopyResource(m.VertexResources[j].Get(), vertexUploads[j].Get()); + const auto barrier = CD3DX12_RESOURCE_BARRIER::Transition(m.VertexResources[j].Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); + cmdList->ResourceBarrier(1, &barrier); } + D3D12_RESOURCE_BARRIER postCopyBarriers[6]; + cmdList->CopyResource(m.IndexResource.Get(), indexUpload.Get()); - cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.IndexResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE)); + postCopyBarriers[0] = CD3DX12_RESOURCE_BARRIER::Transition(m.IndexResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); cmdList->CopyResource(m.MeshletResource.Get(), meshletUpload.Get()); - cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.MeshletResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE)); + postCopyBarriers[1] = CD3DX12_RESOURCE_BARRIER::Transition(m.MeshletResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); cmdList->CopyResource(m.CullDataResource.Get(), cullDataUpload.Get()); - cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.CullDataResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE)); + postCopyBarriers[2] = CD3DX12_RESOURCE_BARRIER::Transition(m.CullDataResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); cmdList->CopyResource(m.UniqueVertexIndexResource.Get(), uniqueVertexIndexUpload.Get()); - cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.UniqueVertexIndexResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE)); + postCopyBarriers[3] = CD3DX12_RESOURCE_BARRIER::Transition(m.UniqueVertexIndexResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); cmdList->CopyResource(m.PrimitiveIndexResource.Get(), primitiveIndexUpload.Get()); - cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.PrimitiveIndexResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE)); + postCopyBarriers[4] = CD3DX12_RESOURCE_BARRIER::Transition(m.PrimitiveIndexResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); cmdList->CopyResource(m.MeshInfoResource.Get(), meshInfoUpload.Get()); - cmdList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m.MeshInfoResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER)); + postCopyBarriers[5] = CD3DX12_RESOURCE_BARRIER::Transition(m.MeshInfoResource.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER); + + cmdList->ResourceBarrier(ARRAYSIZE(postCopyBarriers), postCopyBarriers); ThrowIfFailed(cmdList->Close()); From fe2d91dc2604a35e5d14edfab8cecb1f64f8e493 Mon Sep 17 00:00:00 2001 From: Chuck Walbourn Date: Sun, 3 Jan 2021 14:55:03 -0800 Subject: [PATCH 8/8] Fixed -Wsign-conversion warning with x86 clang/LLVM --- Libraries/D3DX12/d3dx12.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Libraries/D3DX12/d3dx12.h b/Libraries/D3DX12/d3dx12.h index 74d48d6e3..f40e767bd 100644 --- a/Libraries/D3DX12/d3dx12.h +++ b/Libraries/D3DX12/d3dx12.h @@ -2013,11 +2013,11 @@ inline void MemcpySubresource( for (UINT z = 0; z < NumSlices; ++z) { auto pDestSlice = static_cast(pDest->pData) + pDest->SlicePitch * z; - auto pSrcSlice = (static_cast(pResourceData) + pSrc->Offset) + pSrc->DepthPitch * LONG_PTR(z); + auto pSrcSlice = (static_cast(pResourceData) + pSrc->Offset) + pSrc->DepthPitch * ULONG_PTR(z); for (UINT y = 0; y < NumRows; ++y) { memcpy(pDestSlice + pDest->RowPitch * y, - pSrcSlice + pSrc->RowPitch * LONG_PTR(y), + pSrcSlice + pSrc->RowPitch * ULONG_PTR(y), RowSizeInBytes); } }