Skip to content

Commit 93ebdaa

Browse files
committed
dx12 separated cpu and gpu fences for improved safety
1 parent 3984741 commit 93ebdaa

File tree

3 files changed

+35
-11
lines changed

3 files changed

+35
-11
lines changed

WickedEngine/wiGraphicsDevice_DX12.cpp

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2589,7 +2589,7 @@ std::mutex queue_locker;
25892589
{
25902590
for (int queue = 0; queue < QUEUE_COUNT; ++queue)
25912591
{
2592-
hr = dx12_check(device->CreateFence(0, D3D12_FENCE_FLAG_NONE, PPV_ARGS(frame_fence[buffer][queue])));
2592+
hr = dx12_check(device->CreateFence(0, D3D12_FENCE_FLAG_NONE, PPV_ARGS(frame_fence_cpu[buffer][queue])));
25932593
if (FAILED(hr))
25942594
{
25952595
wilog_messagebox("ID3D12Device::CreateFence[FRAME] failed! ERROR: %s", wi::helper::GetPlatformErrorString(hr).c_str());
@@ -2598,16 +2598,38 @@ std::mutex queue_locker;
25982598
switch (queue)
25992599
{
26002600
case QUEUE_GRAPHICS:
2601-
dx12_check(frame_fence[buffer][queue]->SetName(L"frame_fence[QUEUE_GRAPHICS]"));
2601+
dx12_check(frame_fence_cpu[buffer][queue]->SetName(L"frame_fence_cpu[QUEUE_GRAPHICS]"));
26022602
break;
26032603
case QUEUE_COMPUTE:
2604-
dx12_check(frame_fence[buffer][queue]->SetName(L"frame_fence[QUEUE_COMPUTE]"));
2604+
dx12_check(frame_fence_cpu[buffer][queue]->SetName(L"frame_fence_cpu[QUEUE_COMPUTE]"));
26052605
break;
26062606
case QUEUE_COPY:
2607-
dx12_check(frame_fence[buffer][queue]->SetName(L"frame_fence[QUEUE_COPY]"));
2607+
dx12_check(frame_fence_cpu[buffer][queue]->SetName(L"frame_fence_cpu[QUEUE_COPY]"));
26082608
break;
26092609
case QUEUE_VIDEO_DECODE:
2610-
dx12_check(frame_fence[buffer][queue]->SetName(L"frame_fence[QUEUE_VIDEO_DECODE]"));
2610+
dx12_check(frame_fence_cpu[buffer][queue]->SetName(L"frame_fence_cpu[QUEUE_VIDEO_DECODE]"));
2611+
break;
2612+
};
2613+
2614+
hr = dx12_check(device->CreateFence(0, D3D12_FENCE_FLAG_NONE, PPV_ARGS(frame_fence_gpu[buffer][queue])));
2615+
if (FAILED(hr))
2616+
{
2617+
wilog_messagebox("ID3D12Device::CreateFence[FRAME] failed! ERROR: %s", wi::helper::GetPlatformErrorString(hr).c_str());
2618+
wi::platform::Exit();
2619+
}
2620+
switch (queue)
2621+
{
2622+
case QUEUE_GRAPHICS:
2623+
dx12_check(frame_fence_gpu[buffer][queue]->SetName(L"frame_fence_gpu[QUEUE_GRAPHICS]"));
2624+
break;
2625+
case QUEUE_COMPUTE:
2626+
dx12_check(frame_fence_gpu[buffer][queue]->SetName(L"frame_fence_gpu[QUEUE_COMPUTE]"));
2627+
break;
2628+
case QUEUE_COPY:
2629+
dx12_check(frame_fence_gpu[buffer][queue]->SetName(L"frame_fence_gpu[QUEUE_COPY]"));
2630+
break;
2631+
case QUEUE_VIDEO_DECODE:
2632+
dx12_check(frame_fence_gpu[buffer][queue]->SetName(L"frame_fence_gpu[QUEUE_VIDEO_DECODE]"));
26112633
break;
26122634
};
26132635
}
@@ -5347,7 +5369,8 @@ std::mutex queue_locker;
53475369

53485370
queue.submit();
53495371

5350-
dx12_check(queue.queue->Signal(frame_fence[GetBufferIndex()][q].Get(), 1));
5372+
dx12_check(queue.queue->Signal(frame_fence_cpu[GetBufferIndex()][q].Get(), 1));
5373+
dx12_check(queue.queue->Signal(frame_fence_gpu[GetBufferIndex()][q].Get(), FRAMECOUNT));
53515374
}
53525375

53535376
for (uint32_t cmd = 0; cmd < cmd_last; ++cmd)
@@ -5406,8 +5429,8 @@ std::mutex queue_locker;
54065429
continue;
54075430
if (queues[queue2].queue == nullptr)
54085431
continue;
5409-
ID3D12Fence* fence = frame_fence[GetBufferIndex()][queue2].Get();
5410-
queues[queue1].queue->Wait(fence, 1);
5432+
ID3D12Fence* fence = frame_fence_gpu[GetBufferIndex()][queue2].Get();
5433+
queues[queue1].queue->Wait(fence, FRAMECOUNT);
54115434
}
54125435
}
54135436

@@ -5423,7 +5446,7 @@ std::mutex queue_locker;
54235446
{
54245447
if (queues[queue].queue == nullptr)
54255448
continue;
5426-
ID3D12Fence* fence = frame_fence[bufferindex][queue].Get();
5449+
ID3D12Fence* fence = frame_fence_cpu[bufferindex][queue].Get();
54275450
if (FRAMECOUNT >= BUFFERCOUNT)
54285451
{
54295452
if (fence->GetCompletedValue() < 1)

WickedEngine/wiGraphicsDevice_DX12.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,8 @@ namespace wi::graphics
116116
};
117117
mutable CopyAllocator copyAllocator;
118118

119-
Microsoft::WRL::ComPtr<ID3D12Fence> frame_fence[BUFFERCOUNT][QUEUE_COUNT];
119+
Microsoft::WRL::ComPtr<ID3D12Fence> frame_fence_cpu[BUFFERCOUNT][QUEUE_COUNT];
120+
Microsoft::WRL::ComPtr<ID3D12Fence> frame_fence_gpu[BUFFERCOUNT][QUEUE_COUNT];
120121

121122
struct DescriptorBinder
122123
{

WickedEngine/wiVersion.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ namespace wi::version
99
// minor features, major updates, breaking compatibility changes
1010
const int minor = 71;
1111
// minor bug fixes, alterations, refactors, updates
12-
const int revision = 710;
12+
const int revision = 711;
1313

1414
const std::string version_string = std::to_string(major) + "." + std::to_string(minor) + "." + std::to_string(revision);
1515

0 commit comments

Comments
 (0)