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

MethodDescription
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.