• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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