From 553a9e38bd13318c36c52a279041f0a77817b19d Mon Sep 17 00:00:00 2001 From: Karol Herbst Date: Mon, 29 Jan 2024 21:03:23 +0100 Subject: [PATCH] rusticl/mem: move map methods into concrete types Part-of: --- src/gallium/frontends/rusticl/api/memory.rs | 5 +- src/gallium/frontends/rusticl/core/memory.rs | 132 +++++++++---------- 2 files changed, 63 insertions(+), 74 deletions(-) diff --git a/src/gallium/frontends/rusticl/api/memory.rs b/src/gallium/frontends/rusticl/api/memory.rs index fb73b91d7d4..7010c706eed 100644 --- a/src/gallium/frontends/rusticl/api/memory.rs +++ b/src/gallium/frontends/rusticl/api/memory.rs @@ -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, - ®ion, unsafe { image_row_pitch.as_mut().unwrap() }, image_slice_pitch, )?; diff --git a/src/gallium/frontends/rusticl/core/memory.rs b/src/gallium/frontends/rusticl/core/memory.rs index a26dd438017..5843758b78a 100644 --- a/src/gallium/frontends/rusticl/core/memory.rs +++ b/src/gallium/frontends/rusticl/core/memory.rs @@ -808,7 +808,7 @@ impl MemBase { } fn has_user_shadow_buffer(&self, d: &Device) -> CLResult { - 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, - _region: &CLVec, - 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, + 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 {