diff --git a/WickedEngine/wiGraphicsDevice_DX12.cpp b/WickedEngine/wiGraphicsDevice_DX12.cpp index 4766f8021..0ee80814d 100644 --- a/WickedEngine/wiGraphicsDevice_DX12.cpp +++ b/WickedEngine/wiGraphicsDevice_DX12.cpp @@ -2589,7 +2589,7 @@ std::mutex queue_locker; { for (int queue = 0; queue < QUEUE_COUNT; ++queue) { - hr = dx12_check(device->CreateFence(0, D3D12_FENCE_FLAG_NONE, PPV_ARGS(frame_fence[buffer][queue]))); + hr = dx12_check(device->CreateFence(0, D3D12_FENCE_FLAG_NONE, PPV_ARGS(frame_fence_cpu[buffer][queue]))); if (FAILED(hr)) { wilog_messagebox("ID3D12Device::CreateFence[FRAME] failed! ERROR: %s", wi::helper::GetPlatformErrorString(hr).c_str()); @@ -2598,16 +2598,38 @@ std::mutex queue_locker; switch (queue) { case QUEUE_GRAPHICS: - dx12_check(frame_fence[buffer][queue]->SetName(L"frame_fence[QUEUE_GRAPHICS]")); + dx12_check(frame_fence_cpu[buffer][queue]->SetName(L"frame_fence_cpu[QUEUE_GRAPHICS]")); break; case QUEUE_COMPUTE: - dx12_check(frame_fence[buffer][queue]->SetName(L"frame_fence[QUEUE_COMPUTE]")); + dx12_check(frame_fence_cpu[buffer][queue]->SetName(L"frame_fence_cpu[QUEUE_COMPUTE]")); break; case QUEUE_COPY: - dx12_check(frame_fence[buffer][queue]->SetName(L"frame_fence[QUEUE_COPY]")); + dx12_check(frame_fence_cpu[buffer][queue]->SetName(L"frame_fence_cpu[QUEUE_COPY]")); break; case QUEUE_VIDEO_DECODE: - dx12_check(frame_fence[buffer][queue]->SetName(L"frame_fence[QUEUE_VIDEO_DECODE]")); + dx12_check(frame_fence_cpu[buffer][queue]->SetName(L"frame_fence_cpu[QUEUE_VIDEO_DECODE]")); + break; + }; + + hr = dx12_check(device->CreateFence(0, D3D12_FENCE_FLAG_NONE, PPV_ARGS(frame_fence_gpu[buffer][queue]))); + if (FAILED(hr)) + { + wilog_messagebox("ID3D12Device::CreateFence[FRAME] failed! ERROR: %s", wi::helper::GetPlatformErrorString(hr).c_str()); + wi::platform::Exit(); + } + switch (queue) + { + case QUEUE_GRAPHICS: + dx12_check(frame_fence_gpu[buffer][queue]->SetName(L"frame_fence_gpu[QUEUE_GRAPHICS]")); + break; + case QUEUE_COMPUTE: + dx12_check(frame_fence_gpu[buffer][queue]->SetName(L"frame_fence_gpu[QUEUE_COMPUTE]")); + break; + case QUEUE_COPY: + dx12_check(frame_fence_gpu[buffer][queue]->SetName(L"frame_fence_gpu[QUEUE_COPY]")); + break; + case QUEUE_VIDEO_DECODE: + dx12_check(frame_fence_gpu[buffer][queue]->SetName(L"frame_fence_gpu[QUEUE_VIDEO_DECODE]")); break; }; } @@ -5347,7 +5369,8 @@ std::mutex queue_locker; queue.submit(); - dx12_check(queue.queue->Signal(frame_fence[GetBufferIndex()][q].Get(), 1)); + dx12_check(queue.queue->Signal(frame_fence_cpu[GetBufferIndex()][q].Get(), 1)); + dx12_check(queue.queue->Signal(frame_fence_gpu[GetBufferIndex()][q].Get(), FRAMECOUNT)); } for (uint32_t cmd = 0; cmd < cmd_last; ++cmd) @@ -5406,8 +5429,8 @@ std::mutex queue_locker; continue; if (queues[queue2].queue == nullptr) continue; - ID3D12Fence* fence = frame_fence[GetBufferIndex()][queue2].Get(); - queues[queue1].queue->Wait(fence, 1); + ID3D12Fence* fence = frame_fence_gpu[GetBufferIndex()][queue2].Get(); + queues[queue1].queue->Wait(fence, FRAMECOUNT); } } @@ -5423,7 +5446,7 @@ std::mutex queue_locker; { if (queues[queue].queue == nullptr) continue; - ID3D12Fence* fence = frame_fence[bufferindex][queue].Get(); + ID3D12Fence* fence = frame_fence_cpu[bufferindex][queue].Get(); if (FRAMECOUNT >= BUFFERCOUNT) { if (fence->GetCompletedValue() < 1) diff --git a/WickedEngine/wiGraphicsDevice_DX12.h b/WickedEngine/wiGraphicsDevice_DX12.h index 8f3adf5d1..cfbc4826a 100644 --- a/WickedEngine/wiGraphicsDevice_DX12.h +++ b/WickedEngine/wiGraphicsDevice_DX12.h @@ -116,7 +116,8 @@ namespace wi::graphics }; mutable CopyAllocator copyAllocator; - Microsoft::WRL::ComPtr frame_fence[BUFFERCOUNT][QUEUE_COUNT]; + Microsoft::WRL::ComPtr frame_fence_cpu[BUFFERCOUNT][QUEUE_COUNT]; + Microsoft::WRL::ComPtr frame_fence_gpu[BUFFERCOUNT][QUEUE_COUNT]; struct DescriptorBinder { diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index c99055db6..80f9a1def 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -9,7 +9,7 @@ namespace wi::version // minor features, major updates, breaking compatibility changes const int minor = 71; // minor bug fixes, alterations, refactors, updates - const int revision = 710; + const int revision = 711; const std::string version_string = std::to_string(major) + "." + std::to_string(minor) + "." + std::to_string(revision);