Cogs.Core
SyncObjectsD3D11.cpp
1#include "Foundation/Logging/Logger.h"
2#include "SyncObjectsD3D11.h"
3#include "GraphicsDeviceD3D11.h"
4
5namespace {
6 Cogs::Logging::Log logger = Cogs::Logging::getLogger("SyncObjectsD3D11");
7}
8
9
10void Cogs::SyncObjectsD3D11::setDevice(ResourcePointer<ID3D11Device5>& device5)
11{
12 this->device5 = device5;
13}
14
16{
17 if (device5) {
18 FenceD3D11 fence{};
19 if (HRESULT hr = device5->CreateFence(0, D3D11_FENCE_FLAG_NONE, IID_PPV_ARGS(fence.fence.internalPointer())); SUCCEEDED(hr)) {
20 return fences.addResource(fence);
21 }
22 }
24}
25
27{
28 if (HandleIsValid(fenceHandle)) {
29 FenceD3D11& fence = fences[fenceHandle];
30 if (fence.event) {
31 CloseHandle(fence.event);
32 }
33 fences.removeResource(fenceHandle);
34 }
35}
36
38{
39 if (HandleIsValid(fenceHandle)) {
40 FenceD3D11& fence = fences[fenceHandle];
41 fence.value++;
42 }
43}
44
46{
47 if (!HandleIsValid(fenceHandle)) {
48 LOG_WARNING_ONCE(logger, "isFenceSignalled: fenceHandle is invalid.");
49 return false;
50 }
51
52 FenceD3D11& fence = fences[fenceHandle];
53 return fence.value == fence.fence->GetCompletedValue();
54}
55
56bool Cogs::SyncObjectsD3D11::waitFence(FenceHandle fenceHandle, uint32_t timeout_ms)
57{
58 if (!HandleIsValid(fenceHandle)) {
59 LOG_WARNING_ONCE(logger, "waitFence: fenceHandle is invalid.");
60 return false;
61 }
62
63 // First, try early exit by checking if fence is already signalled.
64 FenceD3D11& fence = fences[fenceHandle];
65 if (fence.value == fence.fence->GetCompletedValue()) {
66 return true;
67 }
68
69 // Make sure we have an unsignalled event and tie this to the fence
70 if (fence.event == nullptr) {
71 fence.event = CreateEvent(nullptr, TRUE, FALSE, nullptr);
72 assert(fence.event);
73 }
74 else if (ResetEvent(fence.event) == 0) {
75 LOG_WARNING(logger, "ResetEvent failed: 0x%x", GetLastError());
76 return false;
77 }
78 fence.fence->SetEventOnCompletion(fence.value, fence.event);
79
80 // Wait
81 DWORD result = WaitForSingleObject(fence.event, timeout_ms);
82 switch (result) {
83 case WAIT_OBJECT_0:
84 return true;
85
86 case WAIT_TIMEOUT:
87 return false;
88
89 default:
90 LOG_WARNING(logger, "WaitForSingleObject failed: 0x%x", GetLastError());
91 return false;
92 }
93}
Log implementation class.
Definition: LogManager.h:139
constexpr Log getLogger(const char(&name)[LEN]) noexcept
Definition: LogManager.h:180
Handle template class used to provide opaque, non-converting handles.
Definition: Common.h:22
static const Handle_t NoHandle
Represents a handle to nothing.
Definition: Common.h:77
bool isFenceSignalled(FenceHandle fenceHandle) override
Poll to see if a fence has been signalled.
void releaseFence(FenceHandle fenceHandle) override
Release an existing fence object.
FenceHandle createFence() override
Create a new fence object.
bool waitFence(FenceHandle fenceHandle, uint32_t timeout_ms) override
Try to let CPU wait for a fence to be signalled.
void resetFence(FenceHandle fenceHandle) override
Explicitly set fence into unsignalled state unsignalled.