Cogs.Core
SyncObjects.cpp
1#include "SyncObjects.h"
2
3#include "Foundation/Logging/Logger.h"
4
5namespace {
6 Cogs::Logging::Log logger = Cogs::Logging::getLogger("GLSyncObjects");
7}
8
10{
11 return fences.addResource(GLFence{});
12}
13
15{
16 if (HandleIsValid(fenceHandle)) {
17 GLFence& fence = fences[fenceHandle];
18 if (fence.sync) {
19 glDeleteSync(fence.sync);
20 fence.sync = 0;
21 }
22 fences.removeResource(fenceHandle);
23 }
24}
25
27{
28 if (HandleIsValid(fenceHandle)) {
29 GLFence& fence = fences[fenceHandle];
30 if (fence.sync) {
31 glDeleteSync(fence.sync);
32 fence.sync = 0;
33 }
34 }
35}
36
38{
39 if (!HandleIsValid(fenceHandle)) {
40 LOG_WARNING_ONCE(logger, "isFenceSignalled: fenceHandle is invalid.");
41 return false;
42 }
43
44 return waitFence(fenceHandle, 0);
45}
46
47bool Cogs::GLSyncObjects::waitFence(FenceHandle fenceHandle, uint32_t timeout_ms)
48{
49 if (!HandleIsValid(fenceHandle)) {
50 LOG_WARNING_ONCE(logger, "waitFence: fenceHandle is invalid.");
51 return false;
52 }
53
54 GLFence& fence = fences[fenceHandle];
55 if (fence.sync) {
56#ifdef __EMSCRIPTEN__
57 GLuint64 timeout_ns = 0;
58 (void)timeout_ms;
59#else
60 GLuint64 timeout_ns = 1000000 * GLuint64(timeout_ms);
61#endif
62 GLenum status = glClientWaitSync(fence.sync, GL_SYNC_FLUSH_COMMANDS_BIT, timeout_ns);
63 switch (status) {
64 case GL_ALREADY_SIGNALED:
65 case GL_CONDITION_SATISFIED:
66 return true;
67 case GL_TIMEOUT_EXPIRED:
68 break;
69 case GL_WAIT_FAILED:
70 LOG_ERROR_ONCE(logger, "glClientWaitSync returned GL_WAIT_FAILED");
71 break;
72 default:
73 LOG_ERROR_ONCE(logger, "glClientWaitSync returned 0x%04x", status);
74 break;
75 }
76 }
77 return false;
78}
79
80void Cogs::GLSyncObjects::signal(FenceHandle fenceHandle)
81{
82 if (HandleIsValid(fenceHandle)) {
83 GLFence& fence = fences[fenceHandle];
84 if (fence.sync != 0) {
85 glDeleteSync(fence.sync);
86 fence.sync = 0;
87 }
88 fence.sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
89 }
90}
Log implementation class.
Definition: LogManager.h:139
constexpr Log getLogger(const char(&name)[LEN]) noexcept
Definition: LogManager.h:180
FenceHandle createFence() override
Create a new fence object.
Definition: SyncObjects.cpp:9
void resetFence(FenceHandle fenceHandle) override
Explicitly set fence into unsignalled state unsignalled.
Definition: SyncObjects.cpp:26
bool isFenceSignalled(FenceHandle fenceHandle) override
Poll to see if a fence has been signalled.
Definition: SyncObjects.cpp:37
bool waitFence(FenceHandle fenceHandle, uint32_t timeout_ms) override
Try to let CPU wait for a fence to be signalled.
Definition: SyncObjects.cpp:47
void releaseFence(FenceHandle fenceHandle) override
Release an existing fence object.
Definition: SyncObjects.cpp:14
Handle template class used to provide opaque, non-converting handles.
Definition: Common.h:22