xref: /aosp_15_r20/external/mesa3d/src/gallium/frontends/rusticl/mesa/pipe/transfer.rs (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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