diff --git a/src/gallium/frontends/rusticl/mesa/pipe/context.rs b/src/gallium/frontends/rusticl/mesa/pipe/context.rs index c99f3150266..f709636ff40 100644 --- a/src/gallium/frontends/rusticl/mesa/pipe/context.rs +++ b/src/gallium/frontends/rusticl/mesa/pipe/context.rs @@ -632,7 +632,8 @@ impl PipeContext { unsafe { let mut fence = ptr::null_mut(); self.pipe.as_ref().flush.unwrap()(self.pipe.as_ptr(), &mut fence, 0); - PipeFence::new(fence, &self.screen) + // TODO: handle properly + PipeFence::new(fence, &self.screen).unwrap() } } @@ -645,11 +646,7 @@ impl PipeContext { fence_fd.fd, PIPE_FD_TYPE_NATIVE_SYNC, ); - if fence.is_null() { - None - } else { - Some(PipeFence::new(fence, &self.screen)) - } + PipeFence::new(fence, &self.screen) } } diff --git a/src/gallium/frontends/rusticl/mesa/pipe/fence.rs b/src/gallium/frontends/rusticl/mesa/pipe/fence.rs index 29a30215956..fe3cb3a61dc 100644 --- a/src/gallium/frontends/rusticl/mesa/pipe/fence.rs +++ b/src/gallium/frontends/rusticl/mesa/pipe/fence.rs @@ -2,6 +2,7 @@ use crate::pipe::{context::PipeContext, screen::*}; use libc_rust_gen::close; use mesa_rust_gen::*; +use mesa_rust_util::ptr::ThreadSafeCPtr; use std::sync::Arc; @@ -18,31 +19,39 @@ impl Drop for FenceFd { } pub struct PipeFence { - fence: *mut pipe_fence_handle, + fence: ThreadSafeCPtr, screen: Arc, } unsafe impl Send for PipeFence {} impl PipeFence { - pub fn new(fence: *mut pipe_fence_handle, screen: &Arc) -> Self { - Self { - fence: fence, + pub fn new(fence: *mut pipe_fence_handle, screen: &Arc) -> Option { + Some(Self { + fence: unsafe { ThreadSafeCPtr::new(fence)? }, screen: Arc::clone(screen), - } + }) } pub fn gpu_signal(&self, ctx: &PipeContext) { debug_assert!(ctx.has_fence_server()); unsafe { - ctx.pipe().as_ref().fence_server_signal.unwrap()(ctx.pipe().as_ptr(), self.fence, 0); + ctx.pipe().as_ref().fence_server_signal.unwrap()( + ctx.pipe().as_ptr(), + self.fence.as_ptr(), + 0, + ); } } pub fn gpu_wait(&self, ctx: &PipeContext) { debug_assert!(ctx.has_fence_server()); unsafe { - ctx.pipe().as_ref().fence_server_sync.unwrap()(ctx.pipe().as_ptr(), self.fence, 0); + ctx.pipe().as_ref().fence_server_sync.unwrap()( + ctx.pipe().as_ptr(), + self.fence.as_ptr(), + 0, + ); } } @@ -50,12 +59,12 @@ impl PipeFence { /// /// TODO: should be a Result. pub fn wait(&self) -> bool { - self.screen.fence_finish(self.fence) + self.screen.fence_finish(self.fence.as_ptr()) } } impl Drop for PipeFence { fn drop(&mut self) { - self.screen.unref_fence(self.fence); + self.screen.unref_fence(self.fence.as_ptr()); } }