rusticl/mesa: support mapping textures

Signed-off-by: Karol Herbst <kherbst@redhat.com>
Acked-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15439>
This commit is contained in:
Karol Herbst 2022-03-22 18:25:22 +01:00 committed by Marge Bot
parent 2639cff15c
commit d1e5f86e95
2 changed files with 37 additions and 3 deletions

View file

@ -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()
}

View file

@ -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,
}
}