• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 use crate::pipe::context::*;
2 
3 use mesa_rust_gen::*;
4 
5 use std::ops::Deref;
6 use std::os::raw::c_void;
7 use std::ptr;
8 
9 pub struct PipeTransfer {
10     pipe: *mut pipe_transfer,
11     res: *mut pipe_resource,
12     ptr: *mut c_void,
13     is_buffer: bool,
14 }
15 
16 // SAFETY: Transfers are safe to send between threads
17 unsafe impl Send for PipeTransfer {}
18 
19 pub struct GuardedPipeTransfer<'a> {
20     inner: PipeTransfer,
21     ctx: &'a PipeContext,
22 }
23 
24 impl<'a> Deref for GuardedPipeTransfer<'a> {
25     type Target = PipeTransfer;
26 
deref(&self) -> &Self::Target27     fn deref(&self) -> &Self::Target {
28         &self.inner
29     }
30 }
31 
32 impl<'a> Drop for GuardedPipeTransfer<'a> {
drop(&mut self)33     fn drop(&mut self) {
34         if self.is_buffer {
35             self.ctx.buffer_unmap(self.inner.pipe);
36         } else {
37             self.ctx.texture_unmap(self.inner.pipe);
38         }
39         unsafe { pipe_resource_reference(&mut self.inner.res, ptr::null_mut()) };
40     }
41 }
42 
43 impl PipeTransfer {
new(is_buffer: bool, pipe: *mut pipe_transfer, ptr: *mut c_void) -> Self44     pub(super) fn new(is_buffer: bool, pipe: *mut pipe_transfer, ptr: *mut c_void) -> Self {
45         let mut res: *mut pipe_resource = ptr::null_mut();
46         unsafe { pipe_resource_reference(&mut res, (*pipe).resource) }
47 
48         Self {
49             pipe: pipe,
50             res: res,
51             ptr: ptr,
52             is_buffer: is_buffer,
53         }
54     }
55 
ptr(&self) -> *mut c_void56     pub fn ptr(&self) -> *mut c_void {
57         self.ptr
58     }
59 
row_pitch(&self) -> u3260     pub fn row_pitch(&self) -> u32 {
61         unsafe { (*self.pipe).stride }
62     }
63 
slice_pitch(&self) -> usize64     pub fn slice_pitch(&self) -> usize {
65         unsafe { (*self.pipe).layer_stride }
66     }
67 
bx(&self) -> &pipe_box68     pub fn bx(&self) -> &pipe_box {
69         unsafe { &(*self.pipe).box_ }
70     }
71 
with_ctx(self, ctx: &PipeContext) -> GuardedPipeTransfer72     pub fn with_ctx(self, ctx: &PipeContext) -> GuardedPipeTransfer {
73         GuardedPipeTransfer {
74             inner: self,
75             ctx: ctx,
76         }
77     }
78 }
79 
80 // use set_ctx before operating on the PipeTransfer inside a block where it gets droped
81 impl Drop for PipeTransfer {
drop(&mut self)82     fn drop(&mut self) {
83         assert_eq!(ptr::null_mut(), self.res);
84     }
85 }
86