mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 16:08:04 +02:00
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:
parent
ec88e83796
commit
f543b36178
2 changed files with 21 additions and 15 deletions
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue