rusticl/device: add unsynchronized mapping functions to helper context

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/32581>
This commit is contained in:
Karol Herbst
2025-01-01 17:46:51 +01:00
committed by Marge Bot
parent 0cf29bf0ce
commit e74ad38204
2 changed files with 64 additions and 4 deletions
@@ -13,6 +13,7 @@ use mesa_rust::pipe::device::load_screens;
use mesa_rust::pipe::fence::*;
use mesa_rust::pipe::resource::*;
use mesa_rust::pipe::screen::*;
use mesa_rust::pipe::transfer::PipeTransfer;
use mesa_rust_gen::*;
use mesa_rust_util::math::SetBitIndices;
use mesa_rust_util::static_assert;
@@ -109,6 +110,21 @@ pub trait HelperContextWrapper {
fn compute_state_info(&self, state: *mut c_void) -> pipe_compute_state_object_info;
fn compute_state_subgroup_size(&self, state: *mut c_void, block: &[u32; 3]) -> u32;
fn map_buffer_unsynchronized(
&self,
res: &PipeResource,
offset: i32,
size: i32,
rw: RWFlags,
) -> Option<PipeTransfer>;
fn map_texture_unsynchronized(
&self,
res: &PipeResource,
bx: &pipe_box,
rw: RWFlags,
) -> Option<PipeTransfer>;
fn is_create_fence_fd_supported(&self) -> bool;
fn import_fence(&self, fence_fd: &FenceFd) -> PipeFence;
}
@@ -166,6 +182,31 @@ impl HelperContextWrapper for HelperContext<'_> {
self.lock.compute_state_subgroup_size(state, block)
}
fn map_buffer_unsynchronized(
&self,
res: &PipeResource,
offset: i32,
size: i32,
rw: RWFlags,
) -> Option<PipeTransfer> {
self.lock.buffer_map_flags(
res,
offset,
size,
pipe_map_flags::PIPE_MAP_UNSYNCHRONIZED | rw.into(),
)
}
fn map_texture_unsynchronized(
&self,
res: &PipeResource,
bx: &pipe_box,
rw: RWFlags,
) -> Option<PipeTransfer> {
self.lock
.texture_map_flags(res, bx, pipe_map_flags::PIPE_MAP_UNSYNCHRONIZED | rw.into())
}
fn is_create_fence_fd_supported(&self) -> bool {
self.lock.is_create_fence_fd_supported()
}
@@ -210,12 +210,12 @@ impl PipeContext {
}
}
pub fn buffer_map(
pub fn buffer_map_flags(
&self,
res: &PipeResource,
offset: i32,
size: i32,
rw: RWFlags,
flags: pipe_map_flags,
) -> Option<PipeTransfer> {
let b = pipe_box {
x: offset,
@@ -225,20 +225,39 @@ impl PipeContext {
..Default::default()
};
self.resource_map(res, &b, rw.into(), true)
self.resource_map(res, &b, flags, true)
}
pub fn buffer_map(
&self,
res: &PipeResource,
offset: i32,
size: i32,
rw: RWFlags,
) -> Option<PipeTransfer> {
self.buffer_map_flags(res, offset, size, rw.into())
}
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_flags(
&self,
res: &PipeResource,
bx: &pipe_box,
flags: pipe_map_flags,
) -> Option<PipeTransfer> {
self.resource_map(res, bx, flags, false)
}
pub fn texture_map(
&self,
res: &PipeResource,
bx: &pipe_box,
rw: RWFlags,
) -> Option<PipeTransfer> {
self.resource_map(res, bx, rw.into(), false)
self.texture_map_flags(res, bx, rw.into())
}
pub(super) fn texture_unmap(&self, tx: *mut pipe_transfer) {