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 ptr: *mut c_void, 11 is_buffer: bool, 12 ctx: &'a PipeContext, 13 } 14 15 // SAFETY: Transfers are safe to send between threads 16 unsafe impl Send for PipeTransfer<'_> {} 17 18 impl Drop for PipeTransfer<'_> { drop(&mut self)19 fn drop(&mut self) { 20 // we need to copy the pointer here as the driver frees the pipe_transfer object. 21 let mut res = unsafe { (*self.pipe).resource }; 22 if self.is_buffer { 23 self.ctx.buffer_unmap(self.pipe); 24 } else { 25 self.ctx.texture_unmap(self.pipe); 26 } 27 unsafe { pipe_resource_reference(&mut res, ptr::null_mut()) }; 28 } 29 } 30 31 impl<'a> PipeTransfer<'a> { new( ctx: &'a PipeContext, is_buffer: bool, pipe: *mut pipe_transfer, ptr: *mut c_void, ) -> Self32 pub(super) fn new( 33 ctx: &'a PipeContext, 34 is_buffer: bool, 35 pipe: *mut pipe_transfer, 36 ptr: *mut c_void, 37 ) -> Self { 38 unsafe { pipe_resource_reference(&mut ptr::null_mut(), (*pipe).resource) } 39 40 Self { 41 pipe: pipe, 42 ptr: ptr, 43 is_buffer: is_buffer, 44 ctx: ctx, 45 } 46 } 47 ptr(&self) -> *mut c_void48 pub fn ptr(&self) -> *mut c_void { 49 self.ptr 50 } 51 row_pitch(&self) -> u3252 pub fn row_pitch(&self) -> u32 { 53 unsafe { (*self.pipe).stride } 54 } 55 slice_pitch(&self) -> usize56 pub fn slice_pitch(&self) -> usize { 57 unsafe { (*self.pipe).layer_stride } 58 } 59 bx(&self) -> &pipe_box60 pub fn bx(&self) -> &pipe_box { 61 unsafe { &(*self.pipe).box_ } 62 } 63 } 64