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