From be4c3575aa6a82328850d7aa67151fbf74cd73cd Mon Sep 17 00:00:00 2001 From: Dmitry Stepanov Date: Sat, 31 Aug 2024 22:15:37 +0300 Subject: [PATCH] use `glClientWaitSync` with timeout=0 instead of `glGetSynciv` - fixes GPU stalls when transferring data from GPU to CPU --- fyrox-impl/src/renderer/framework/pixel_buffer.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/fyrox-impl/src/renderer/framework/pixel_buffer.rs b/fyrox-impl/src/renderer/framework/pixel_buffer.rs index 3307c024f..79513b181 100644 --- a/fyrox-impl/src/renderer/framework/pixel_buffer.rs +++ b/fyrox-impl/src/renderer/framework/pixel_buffer.rs @@ -157,6 +157,8 @@ impl PixelBuffer { PixelPackData::BufferOffset(0), ); + state.gl.bind_buffer(glow::PIXEL_PACK_BUFFER, None); + self.request = Some(ReadRequest { fence: state .gl @@ -164,8 +166,6 @@ impl PixelBuffer { .unwrap(), }); - state.gl.bind_buffer(glow::PIXEL_PACK_BUFFER, None); - Ok(()) } } @@ -183,7 +183,10 @@ impl PixelBuffer { let mut buffer = vec![T::default(); self.pixel_count]; unsafe { - if state.gl.get_sync_status(request.fence) == glow::SIGNALED { + // For some reason, glGetSynciv still blocks execution and produces GPU stall, ruining + // the performance. glClientWaitSync with timeout=0 does not have this issue. + let fence_state = state.gl.client_wait_sync(request.fence, 0, 0); + if fence_state != glow::TIMEOUT_EXPIRED && fence_state != glow::WAIT_FAILED { self.read_internal(state, &mut buffer); state.gl.delete_sync(request.fence);