mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-25 06:30:10 +01:00
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:
parent
2639cff15c
commit
d1e5f86e95
2 changed files with 37 additions and 3 deletions
|
|
@ -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()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue