diff --git a/src/gallium/frontends/rusticl/mesa/pipe/context.rs b/src/gallium/frontends/rusticl/mesa/pipe/context.rs index bdcb898f980..0204c78d8e5 100644 --- a/src/gallium/frontends/rusticl/mesa/pipe/context.rs +++ b/src/gallium/frontends/rusticl/mesa/pipe/context.rs @@ -130,13 +130,39 @@ impl PipeContext { ) }; - PipeTransfer::new(out, ptr) + PipeTransfer::new(true, out, ptr) } pub(super) fn buffer_unmap(&self, tx: *mut pipe_transfer) { unsafe { self.pipe.as_ref().buffer_unmap.unwrap()(self.pipe.as_ptr(), tx) }; } + pub fn texture_map(&self, res: &PipeResource, bx: &pipe_box, block: bool) -> PipeTransfer { + let mut out: *mut pipe_transfer = ptr::null_mut(); + + let flags = match block { + false => pipe_map_flags::PIPE_MAP_UNSYNCHRONIZED, + true => pipe_map_flags(0), + } | pipe_map_flags::PIPE_MAP_READ_WRITE; + + let ptr = unsafe { + self.pipe.as_ref().texture_map.unwrap()( + self.pipe.as_ptr(), + res.pipe(), + 0, + flags.0, + bx, + &mut out, + ) + }; + + PipeTransfer::new(false, out, ptr) + } + + pub(super) fn texture_unmap(&self, tx: *mut pipe_transfer) { + unsafe { self.pipe.as_ref().texture_unmap.unwrap()(self.pipe.as_ptr(), tx) }; + } + pub fn blit(&self, src: &PipeResource, dst: &PipeResource) { let mut blit_info = pipe_blit_info::default(); blit_info.src.resource = src.pipe(); @@ -250,4 +276,6 @@ fn has_required_cbs(c: &pipe_context) -> bool { && c.memory_barrier.is_some() && c.resource_copy_region.is_some() && c.set_global_binding.is_some() + && c.texture_map.is_some() + && c.texture_unmap.is_some() } diff --git a/src/gallium/frontends/rusticl/mesa/pipe/transfer.rs b/src/gallium/frontends/rusticl/mesa/pipe/transfer.rs index 258a1657938..8c9b223808b 100644 --- a/src/gallium/frontends/rusticl/mesa/pipe/transfer.rs +++ b/src/gallium/frontends/rusticl/mesa/pipe/transfer.rs @@ -12,6 +12,7 @@ pub struct PipeTransfer { pipe: *mut pipe_transfer, res: *mut pipe_resource, ptr: *mut c_void, + is_buffer: bool, } pub struct GuardedPipeTransfer<'a> { @@ -29,13 +30,17 @@ impl<'a> Deref for GuardedPipeTransfer<'a> { impl<'a> Drop for GuardedPipeTransfer<'a> { fn drop(&mut self) { - self.ctx.buffer_unmap(self.inner.pipe); + if self.is_buffer { + self.ctx.buffer_unmap(self.inner.pipe); + } else { + self.ctx.texture_unmap(self.inner.pipe); + } unsafe { pipe_resource_reference(&mut self.inner.res, ptr::null_mut()) }; } } impl PipeTransfer { - pub(super) fn new(pipe: *mut pipe_transfer, ptr: *mut c_void) -> Self { + pub(super) fn new(is_buffer: bool, pipe: *mut pipe_transfer, ptr: *mut c_void) -> Self { let mut res: *mut pipe_resource = ptr::null_mut(); unsafe { pipe_resource_reference(&mut res, (*pipe).resource) } @@ -43,6 +48,7 @@ impl PipeTransfer { pipe: pipe, res: res, ptr: ptr, + is_buffer: is_buffer, } }