From b0d9cfba231e8b8e63cc4de35214281512252204 Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 30 May 2025 14:12:36 +0200 Subject: [PATCH 1/2] Transition backbuffer to present after copy --- .../cauldron/framework/src/render/dx12/swapchain_dx12.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/framework/cauldron/framework/src/render/dx12/swapchain_dx12.cpp b/framework/cauldron/framework/src/render/dx12/swapchain_dx12.cpp index 7e4ab194..910c57b5 100644 --- a/framework/cauldron/framework/src/render/dx12/swapchain_dx12.cpp +++ b/framework/cauldron/framework/src/render/dx12/swapchain_dx12.cpp @@ -220,6 +220,9 @@ namespace cauldron CD3DX12_TEXTURE_COPY_LOCATION copySrc(m_pRenderTarget->GetCurrentResource()->GetImpl()->DX12Resource(), 0); pCmdList->GetImpl()->DX12CmdList()->CopyTextureRegion(©Dest, 0, 0, 0, ©Src, nullptr); + barrier = Barrier::Transition(m_pRenderTarget->GetCurrentResource(), ResourceState::CopySource, ResourceState::Present); + ResourceBarrier(pCmdList, 1, &barrier); + ID3D12Fence* pFence; CauldronThrowOnFail(GetDevice()->GetImpl()->DX12Device()->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&pFence))); CauldronThrowOnFail(GetDevice()->GetImpl()->DX12CmdQueue(CommandQueue::Graphics)->Signal(pFence, 1)); From 600b30f170953842742f066defd2c51281fa3c56 Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 30 May 2025 16:17:20 +0200 Subject: [PATCH 2/2] Fixed synchronization issue --- .../src/render/dx12/swapchain_dx12.cpp | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/framework/cauldron/framework/src/render/dx12/swapchain_dx12.cpp b/framework/cauldron/framework/src/render/dx12/swapchain_dx12.cpp index 910c57b5..5031d8e1 100644 --- a/framework/cauldron/framework/src/render/dx12/swapchain_dx12.cpp +++ b/framework/cauldron/framework/src/render/dx12/swapchain_dx12.cpp @@ -223,20 +223,11 @@ namespace cauldron barrier = Barrier::Transition(m_pRenderTarget->GetCurrentResource(), ResourceState::CopySource, ResourceState::Present); ResourceBarrier(pCmdList, 1, &barrier); - ID3D12Fence* pFence; - CauldronThrowOnFail(GetDevice()->GetImpl()->DX12Device()->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&pFence))); - CauldronThrowOnFail(GetDevice()->GetImpl()->DX12CmdQueue(CommandQueue::Graphics)->Signal(pFence, 1)); CauldronThrowOnFail(pCmdList->GetImpl()->DX12CmdList()->Close()); - ID3D12CommandList* CmdListList[] = { pCmdList->GetImpl()->DX12CmdList() }; - GetDevice()->GetImpl()->DX12CmdQueue(CommandQueue::Graphics)->ExecuteCommandLists(1, CmdListList); - - // Wait for fence - HANDLE mHandleFenceEvent = CreateEvent(nullptr, FALSE, FALSE, nullptr); - pFence->SetEventOnCompletion(1, mHandleFenceEvent); - WaitForSingleObject(mHandleFenceEvent, INFINITE); - CloseHandle(mHandleFenceEvent); - pFence->Release(); + std::vector lists(1); + lists[0] = pCmdList; + GetDevice()->ExecuteCommandListsImmediate(lists, CommandQueue::Graphics); UINT64* pTimingsBuffer = NULL; D3D12_RANGE range; @@ -246,8 +237,6 @@ namespace cauldron stbi_write_jpg(WStringToString(filePath.c_str()).c_str(), (int)fromDesc.Width, (int)fromDesc.Height, 4, pTimingsBuffer, 100); pResourceReadBack->Unmap(0, NULL); - GetDevice()->FlushAllCommandQueues(); - // Release pResourceReadBack->Release(); pResourceReadBack = nullptr;