rusticl/mesa: port PipeFence to use ThreadSafeCPtr

Acked-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/36780>
This commit is contained in:
Karol Herbst 2025-08-14 16:05:36 +02:00 committed by Marge Bot
parent ec88e83796
commit f543b36178
2 changed files with 21 additions and 15 deletions

View file

@ -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)
}
}

View file

@ -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<pipe_fence_handle>,
screen: Arc<PipeScreen>,
}
unsafe impl Send for PipeFence {}
impl PipeFence {
pub fn new(fence: *mut pipe_fence_handle, screen: &Arc<PipeScreen>) -> Self {
Self {
fence: fence,
pub fn new(fence: *mut pipe_fence_handle, screen: &Arc<PipeScreen>) -> Option<Self> {
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());
}
}