1 use crate::pipe::context::*; 2 3 use mesa_rust_gen::*; 4 5 use std::os::raw::c_void; 6 use std::ptr; 7 8 pub struct PipeTransfer<'a> { 9 pipe: *mut pipe_transfer, 10 res: *mut pipe_resource, 11 ptr: *mut c_void, 12 is_buffer: bool, 13 ctx: &'a PipeContext, 14 } 15 16 // SAFETY: Transfers are safe to send between threads 17 unsafe impl Send for PipeTransfer<'_> {} 18 19 impl<'a> Drop for PipeTransfer<'a> { drop(&mut self)20 fn drop(&mut self) { 21 if self.is_buffer { 22 self.ctx.buffer_unmap(self.pipe); 23 } else { 24 self.ctx.texture_unmap(self.pipe); 25 } 26 unsafe { pipe_resource_reference(&mut self.res, ptr::null_mut()) }; 27 } 28 } 29 30 impl<'a> PipeTransfer<'a> { new( ctx: &'a PipeContext, is_buffer: bool, pipe: *mut pipe_transfer, ptr: *mut c_void, ) -> Self31 pub(super) fn new( 32 ctx: &'a PipeContext, 33 is_buffer: bool, 34 pipe: *mut pipe_transfer, 35 ptr: *mut c_void, 36 ) -> Self { 37 let mut res: *mut pipe_resource = ptr::null_mut(); 38 unsafe { pipe_resource_reference(&mut res, (*pipe).resource) } 39 40 Self { 41 pipe: pipe, 42 res: res, 43 ptr: ptr, 44 is_buffer: is_buffer, 45 ctx: ctx, 46 } 47 } 48 ptr(&self) -> *mut c_void49 pub fn ptr(&self) -> *mut c_void { 50 self.ptr 51 } 52 row_pitch(&self) -> u3253 pub fn row_pitch(&self) -> u32 { 54 unsafe { (*self.pipe).stride } 55 } 56 slice_pitch(&self) -> usize57 pub fn slice_pitch(&self) -> usize { 58 unsafe { (*self.pipe).layer_stride } 59 } 60 bx(&self) -> &pipe_box61 pub fn bx(&self) -> &pipe_box { 62 unsafe { &(*self.pipe).box_ } 63 } 64 } 65