1#include "Foundation/Logging/Logger.h"
2#include "SyncObjectsD3D12.h"
3#include "GraphicsDeviceD3D12.h"
10void Cogs::SyncObjectsD3D12::setDevice(ResourcePointer<ID3D12Device>& device)
12 this->device = device;
18 if (HRESULT hr = device->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(fence.fence.internalPointer())); SUCCEEDED(hr)) {
19 return fences.addResource(fence);
26 if (HandleIsValid(fenceHandle)) {
29 CloseHandle(fence.event);
31 fences.removeResource(fenceHandle);
37 if (HandleIsValid(fenceHandle)) {
45 if (!HandleIsValid(fenceHandle)) {
46 LOG_WARNING_ONCE(logger,
"isFenceSignalled: fenceHandle is invalid.");
51 return fence.value == fence.fence->GetCompletedValue();
56 if (!HandleIsValid(fenceHandle)) {
57 LOG_WARNING_ONCE(logger,
"waitFence: fenceHandle is invalid.");
63 if (fence.value == fence.fence->GetCompletedValue()) {
68 if (fence.event ==
nullptr) {
69 fence.event = CreateEvent(
nullptr, TRUE, FALSE,
nullptr);
72 else if (ResetEvent(fence.event) == 0) {
73 LOG_WARNING(logger,
"ResetEvent failed: 0x%x", GetLastError());
76 fence.fence->SetEventOnCompletion(fence.value, fence.event);
79 DWORD result = WaitForSingleObject(fence.event, timeout_ms);
88 LOG_WARNING(logger,
"WaitForSingleObject failed: 0x%x", GetLastError());
Log implementation class.
constexpr Log getLogger(const char(&name)[LEN]) noexcept
Handle template class used to provide opaque, non-converting handles.
static const Handle_t NoHandle
Represents a handle to nothing.
void releaseFence(FenceHandle fenceHandle) override
Release an existing fence object.
void resetFence(FenceHandle fenceHandle) override
Explicitly set fence into unsignalled state unsignalled.
bool isFenceSignalled(FenceHandle fenceHandle) override
Poll to see if a fence has been signalled.
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.