1#include "SyncObjects.h"
3#include "Foundation/Logging/Logger.h"
11 return fences.addResource(
GLFence{});
16 if (HandleIsValid(fenceHandle)) {
17 GLFence& fence = fences[fenceHandle];
19 glDeleteSync(fence.sync);
22 fences.removeResource(fenceHandle);
28 if (HandleIsValid(fenceHandle)) {
29 GLFence& fence = fences[fenceHandle];
31 glDeleteSync(fence.sync);
39 if (!HandleIsValid(fenceHandle)) {
40 LOG_WARNING_ONCE(logger,
"isFenceSignalled: fenceHandle is invalid.");
44 return waitFence(fenceHandle, 0);
49 if (!HandleIsValid(fenceHandle)) {
50 LOG_WARNING_ONCE(logger,
"waitFence: fenceHandle is invalid.");
54 GLFence& fence = fences[fenceHandle];
57 GLuint64 timeout_ns = 0;
60 GLuint64 timeout_ns = 1000000 * GLuint64(timeout_ms);
62 GLenum status = glClientWaitSync(fence.sync, GL_SYNC_FLUSH_COMMANDS_BIT, timeout_ns);
64 case GL_ALREADY_SIGNALED:
65 case GL_CONDITION_SATISFIED:
67 case GL_TIMEOUT_EXPIRED:
70 LOG_ERROR_ONCE(logger,
"glClientWaitSync returned GL_WAIT_FAILED");
73 LOG_ERROR_ONCE(logger,
"glClientWaitSync returned 0x%04x", status);
80void Cogs::GLSyncObjects::signal(
FenceHandle fenceHandle)
82 if (HandleIsValid(fenceHandle)) {
83 GLFence& fence = fences[fenceHandle];
84 if (fence.sync != 0) {
85 glDeleteSync(fence.sync);
88 fence.sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
Log implementation class.
constexpr Log getLogger(const char(&name)[LEN]) noexcept
FenceHandle createFence() override
Create a new 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.
bool waitFence(FenceHandle fenceHandle, uint32_t timeout_ms) override
Try to let CPU wait for a fence to be signalled.
void releaseFence(FenceHandle fenceHandle) override
Release an existing fence object.
Handle template class used to provide opaque, non-converting handles.