rusticl/mem: move map methods into concrete types

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/27376>
This commit is contained in:
Karol Herbst 2024-01-29 21:03:23 +01:00 committed by Marge Bot
parent 219d8e0dae
commit 553a9e38bd
2 changed files with 63 additions and 74 deletions

View file

@ -1664,7 +1664,7 @@ fn enqueue_map_buffer(
return Err(CL_INVALID_CONTEXT);
}
let ptr = b.map_buffer(q.device, offset, size)?;
let ptr = b.map(q.device, offset)?;
create_and_queue(
q,
CL_COMMAND_MAP_BUFFER,
@ -2143,10 +2143,9 @@ fn enqueue_map_image(
unsafe { image_slice_pitch.as_mut().unwrap() }
};
let ptr = i.map_image(
let ptr = i.map(
q.device,
&origin,
&region,
unsafe { image_row_pitch.as_mut().unwrap() },
image_slice_pitch,
)?;

View file

@ -808,7 +808,7 @@ impl MemBase {
}
fn has_user_shadow_buffer(&self, d: &Device) -> CLResult<bool> {
let r = self.get_res()?.get(d).unwrap();
let r = self.get_res_of_dev(d)?;
Ok(!r.is_user && bit_check(self.flags, CL_MEM_USE_HOST_PTR))
}
@ -1233,76 +1233,6 @@ impl MemBase {
Ok(&lock.tx.get_mut(dev).unwrap().tx)
}
pub fn map_buffer(
&self,
dev: &'static Device,
offset: usize,
_size: usize,
) -> CLResult<*mut c_void> {
assert!(self.is_buffer());
let mut lock = self.maps.lock().unwrap();
let ptr = if self.has_user_shadow_buffer(dev)? {
self.host_ptr
} else {
let tx = self.map(dev, &mut lock, RWFlags::RW)?;
tx.ptr()
};
let ptr = unsafe { ptr.add(offset) };
Ok(ptr)
}
pub fn map_image(
&self,
dev: &'static Device,
origin: &CLVec<usize>,
_region: &CLVec<usize>,
row_pitch: &mut usize,
slice_pitch: &mut usize,
) -> CLResult<*mut c_void> {
assert!(!self.is_buffer());
let mut lock = self.maps.lock().unwrap();
// we might have a host_ptr shadow buffer or image created from buffer
let ptr = if self.has_user_shadow_buffer(dev)? || self.is_parent_buffer() {
*row_pitch = self.image_desc.image_row_pitch;
*slice_pitch = self.image_desc.image_slice_pitch;
if let Some(src) = &self.parent {
let tx = src.map(dev, &mut lock, RWFlags::RW)?;
tx.ptr()
} else {
self.host_ptr
}
} else {
let tx = self.map(dev, &mut lock, RWFlags::RW)?;
if self.image_desc.dims() > 1 {
*row_pitch = tx.row_pitch() as usize;
}
if self.image_desc.dims() > 2 || self.image_desc.is_array() {
*slice_pitch = tx.slice_pitch();
}
tx.ptr()
};
let ptr = unsafe {
ptr.add(
*origin
* [
self.pixel_size().unwrap() as usize,
*row_pitch,
*slice_pitch,
],
)
};
Ok(ptr)
}
pub fn is_mapped_ptr(&self, ptr: *mut c_void) -> bool {
self.maps.lock().unwrap().contains_ptr(ptr)
}
@ -1407,6 +1337,19 @@ impl Buffer {
);
Ok(())
}
pub fn map(&self, dev: &'static Device, offset: usize) -> CLResult<*mut c_void> {
let ptr = if self.has_user_shadow_buffer(dev)? {
self.host_ptr
} else {
let mut lock = self.maps.lock().unwrap();
let tx = self.base.map(dev, &mut lock, RWFlags::RW)?;
tx.ptr()
};
let ptr = unsafe { ptr.add(offset) };
Ok(ptr)
}
}
impl Image {
@ -1461,6 +1404,53 @@ impl Image {
Ok(())
}
pub fn map(
&self,
dev: &'static Device,
origin: &CLVec<usize>,
row_pitch: &mut usize,
slice_pitch: &mut usize,
) -> CLResult<*mut c_void> {
let mut lock = self.maps.lock().unwrap();
// we might have a host_ptr shadow buffer or image created from buffer
let ptr = if self.has_user_shadow_buffer(dev)? || self.is_parent_buffer() {
*row_pitch = self.image_desc.image_row_pitch;
*slice_pitch = self.image_desc.image_slice_pitch;
if let Some(src) = &self.parent {
let tx = src.map(dev, &mut lock, RWFlags::RW)?;
tx.ptr()
} else {
self.host_ptr
}
} else {
let tx = self.base.map(dev, &mut lock, RWFlags::RW)?;
if self.image_desc.dims() > 1 {
*row_pitch = tx.row_pitch() as usize;
}
if self.image_desc.dims() > 2 || self.image_desc.is_array() {
*slice_pitch = tx.slice_pitch();
}
tx.ptr()
};
let ptr = unsafe {
ptr.add(
*origin
* [
self.image_format.pixel_size().unwrap().into(),
*row_pitch,
*slice_pitch,
],
)
};
Ok(ptr)
}
}
pub struct Sampler {