easy-gl › Sync
Sync
Manages a GL sync object (fence). Used to synchronise the CPU with GPU command completion, or to insert GPU-side barriers between contexts. Non-copyable, movable, RAII.
CPU wait for GPU completion
easygl::Sync fence;
// Insert fence into the command stream after current commands
fence.fence(); // default condition: GpuCommandsComplete
// CPU waits up to 5 seconds for the fence to be signalled
easygl::SyncWaitResult result =
fence.client_wait(easygl::SyncFlushMask::FlushCommands,
5'000'000'000); // 5 seconds in nanoseconds
switch (result) {
case easygl::SyncWaitResult::AlreadySignaled:
case easygl::SyncWaitResult::ConditionSatisfied:
// GPU is done — safe to read mapped buffer, etc.
break;
case easygl::SyncWaitResult::TimeoutExpired:
std::cerr << "GPU timeout!\n";
break;
default:
break;
}
GPU-side barrier (server wait)
Insert a barrier visible only on the GPU — useful for cross-context synchronisation:
fence.fence();
fence.server_wait(0); // timeout = 0 means "wait indefinitely" on server side
Typical use case: persistent mapped buffers
// Upload to persistently mapped buffer
std::memcpy(mappedPtr, newData, dataSize);
// Insert fence — GPU must finish reading before next write
fences[frameIndex].fence();
// Next time we use frameIndex, wait for GPU to finish reading last frame
if (fences[frameIndex].is_created()) {
fences[frameIndex].client_wait(easygl::SyncFlushMask::FlushCommands,
1'000'000'000);
fences[frameIndex].destroy();
}
Method reference
| Method | Description |
|---|---|
fence(condition) | Insert a fence sync into the command stream. Default condition: GpuCommandsComplete. |
destroy() | Delete the sync object. Noexcept. |
client_wait(flags, timeout_ns) | CPU waits for the sync. Returns a SyncWaitResult. |
server_wait(timeout_ns) | GPU-side wait — subsequent commands stall until sync is signalled. |
is_created() | True if sync handle is set. |
native_handle() | Returns raw __GLsync* pointer. |
reset_handle_no_gl() | Context-loss recovery — clear without deleting. |