From aa3b44c02ba1cf8ecc5ec1fed0c05dd4f432e213 Mon Sep 17 00:00:00 2001 From: Karol Herbst Date: Wed, 21 Feb 2024 14:50:32 +0100 Subject: [PATCH] rusticl/memory: store host_ptr as usize Part-of: --- src/gallium/frontends/rusticl/api/memory.rs | 2 +- src/gallium/frontends/rusticl/core/memory.rs | 40 +++++++++++--------- 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/src/gallium/frontends/rusticl/api/memory.rs b/src/gallium/frontends/rusticl/api/memory.rs index 783f38e7630..146ac020c8b 100644 --- a/src/gallium/frontends/rusticl/api/memory.rs +++ b/src/gallium/frontends/rusticl/api/memory.rs @@ -234,7 +234,7 @@ impl CLInfo for cl_mem { CL_MEM_FLAGS => cl_prop::(mem.flags), // TODO debugging feature CL_MEM_MAP_COUNT => cl_prop::(0), - CL_MEM_HOST_PTR => cl_prop::<*mut c_void>(mem.host_ptr), + CL_MEM_HOST_PTR => cl_prop::<*mut c_void>(mem.host_ptr()), CL_MEM_OFFSET => cl_prop::(if mem.is_buffer() { Buffer::ref_from_raw(*self)?.offset } else { diff --git a/src/gallium/frontends/rusticl/core/memory.rs b/src/gallium/frontends/rusticl/core/memory.rs index ee3bd932a97..d4cd52c188e 100644 --- a/src/gallium/frontends/rusticl/core/memory.rs +++ b/src/gallium/frontends/rusticl/core/memory.rs @@ -168,7 +168,9 @@ pub struct MemBase { pub mem_type: cl_mem_object_type, pub flags: cl_mem_flags, pub size: usize, - pub host_ptr: *mut c_void, + // it's a bit hacky, but storing the pointer as `usize` gives us `Send` and `Sync`. The + // application is required to ensure no data races exist on the memory anyway. + pub host_ptr: usize, pub props: Vec, pub cbs: Mutex>, pub gl_obj: Option, @@ -372,9 +374,9 @@ impl MemBase { )?; let host_ptr = if bit_check(flags, CL_MEM_USE_HOST_PTR) { - host_ptr + host_ptr as usize } else { - ptr::null_mut() + 0 }; Ok(Arc::new(Buffer { @@ -402,10 +404,10 @@ impl MemBase { offset: usize, size: usize, ) -> Arc { - let host_ptr = if parent.host_ptr.is_null() { - ptr::null_mut() + let host_ptr = if parent.host_ptr().is_null() { + 0 } else { - unsafe { parent.host_ptr.add(offset) } + unsafe { parent.host_ptr().add(offset) as usize } }; Arc::new(Buffer { @@ -485,9 +487,9 @@ impl MemBase { }; let host_ptr = if bit_check(flags, CL_MEM_USE_HOST_PTR) { - host_ptr + host_ptr as usize } else { - ptr::null_mut() + 0 }; let pipe_format = image_format.to_pipe_format().unwrap(); @@ -600,7 +602,7 @@ impl MemBase { mem_type: mem_type, flags: flags, size: gl_mem_props.size(), - host_ptr: ptr::null_mut(), + host_ptr: 0, props: Vec::new(), gl_obj: Some(GLObject { gl_object_target: gl_export_manager.export_in.target, @@ -654,9 +656,7 @@ impl MemBase { // implement this. pub fn is_svm(&self) -> bool { let mem = self.get_parent(); - self.context - .find_svm_alloc(mem.host_ptr as usize) - .is_some() + self.context.find_svm_alloc(mem.host_ptr).is_some() && bit_check(mem.flags, CL_MEM_USE_HOST_PTR) } @@ -681,6 +681,10 @@ impl MemBase { Ok(!r.is_user && bit_check(self.flags, CL_MEM_USE_HOST_PTR)) } + pub fn host_ptr(&self) -> *mut c_void { + self.host_ptr as *mut c_void + } + pub fn is_mapped_ptr(&self, ptr: *mut c_void) -> bool { self.maps.lock().unwrap().contains_ptr(ptr) } @@ -849,7 +853,7 @@ impl Buffer { 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 + self.host_ptr() } else { let mut lock = self.maps.lock().unwrap(); @@ -925,7 +929,7 @@ impl Buffer { } if self.has_user_shadow_buffer(q.device)? { - self.read(q, ctx, 0, self.host_ptr, self.size) + self.read(q, ctx, 0, self.host_ptr(), self.size) } else { if let Some(shadow) = lock.tx.get(&q.device).and_then(|tx| tx.shadow.as_ref()) { let res = self.get_res_of_dev(q.device)?; @@ -1013,7 +1017,7 @@ impl Buffer { ctx.resource_copy_region(shadow, res, &[offset, 0, 0], &bx); } else if self.has_user_shadow_buffer(q.device)? { - self.write(q, ctx, 0, self.host_ptr, self.size)?; + self.write(q, ctx, 0, self.host_ptr(), self.size)?; } } @@ -1294,7 +1298,7 @@ impl Image { let ptr = if self.has_user_shadow_buffer(dev)? { *row_pitch = self.image_desc.image_row_pitch; *slice_pitch = self.image_desc.image_slice_pitch; - self.host_ptr + self.host_ptr() } else if let Some(Mem::Buffer(buffer)) = &self.parent { *row_pitch = self.image_desc.image_row_pitch; *slice_pitch = self.image_desc.image_slice_pitch; @@ -1407,7 +1411,7 @@ impl Image { if self.has_user_shadow_buffer(q.device)? { self.read( - self.host_ptr, + self.host_ptr(), q, ctx, &self.image_desc.size(), @@ -1492,7 +1496,7 @@ impl Image { ctx.resource_copy_region(shadow, res, &[0, 0, 0], &bx); } else if self.has_user_shadow_buffer(q.device)? { self.write( - self.host_ptr, + self.host_ptr(), q, ctx, &self.image_desc.size(),