From 3c51db3f217095233d28ff60dc43162899d6704e Mon Sep 17 00:00:00 2001 From: Antonio Gomes Date: Tue, 6 Dec 2022 18:39:59 -0300 Subject: [PATCH] rusticl: Enabling image fill for images created from buffers Part-of: --- src/gallium/frontends/rusticl/core/memory.rs | 18 ++++++++--- src/gallium/frontends/rusticl/mesa/pipe/context.rs | 35 ++++++++++++++++++++++ 2 files changed, 49 insertions(+), 4 deletions(-) diff --git a/src/gallium/frontends/rusticl/core/memory.rs b/src/gallium/frontends/rusticl/core/memory.rs index 9e140a8..b9c1209 100644 --- a/src/gallium/frontends/rusticl/core/memory.rs +++ b/src/gallium/frontends/rusticl/core/memory.rs @@ -762,12 +762,11 @@ impl Mem { assert!(!self.is_buffer()); let res = self.get_res()?.get(&q.device).unwrap(); - let bx = create_box(origin, region, self.mem_type)?; // make sure we allocate multiples of 4 bytes so drivers don't read out of bounds or // unaligned. // TODO: use div_ceil once it's available - let size = align(self.pixel_size().unwrap() as usize, size_of::()); - let mut new_pattern: Vec = vec![0; size / size_of::()]; + let pixel_size = align(self.pixel_size().unwrap() as usize, size_of::()); + let mut new_pattern: Vec = vec![0; pixel_size / size_of::()]; // we don't support CL_DEPTH for now assert!(pattern.len() == 4); @@ -787,7 +786,18 @@ impl Mem { ); } - ctx.clear_texture(res, &new_pattern, &bx); + // If image is created from a buffer, use clear_image_buffer instead + // for each row + if self.is_parent_buffer() { + let strides = ( + self.image_desc.row_pitch()? as usize, + self.image_desc.slice_pitch()? as usize, + ); + ctx.clear_image_buffer(res, &new_pattern, origin, region, strides, pixel_size); + } else { + let bx = create_box(origin, region, self.mem_type)?; + ctx.clear_texture(res, &new_pattern, &bx); + } Ok(()) } diff --git a/src/gallium/frontends/rusticl/mesa/pipe/context.rs b/src/gallium/frontends/rusticl/mesa/pipe/context.rs index 06bbe3d..835fff1 100644 --- a/src/gallium/frontends/rusticl/mesa/pipe/context.rs +++ b/src/gallium/frontends/rusticl/mesa/pipe/context.rs @@ -123,6 +123,41 @@ impl PipeContext { } } + pub fn clear_image_buffer( + &self, + res: &PipeResource, + pattern: &[u32], + origin: &[usize; 3], + region: &[usize; 3], + strides: (usize, usize), + pixel_size: usize, + ) { + let (row_pitch, slice_pitch) = strides; + for z in 0..region[2] { + for y in 0..region[1] { + let pitch = [pixel_size, row_pitch, slice_pitch]; + // Convoluted way of doing (origin + [0, y, z]) * pitch + let offset = (0..3) + .map(|i| ((origin[i] + [0, y, z][i]) * pitch[i]) as u32) + .sum(); + + // SAFETY: clear_buffer arguments are specified + // in bytes, so pattern.len() dimension value + // should be multiplied by pixel_size + unsafe { + self.pipe.as_ref().clear_buffer.unwrap()( + self.pipe.as_ptr(), + res.pipe(), + offset, + (region[0] * pixel_size) as u32, + pattern.as_ptr().cast(), + (pattern.len() * pixel_size) as i32, + ) + }; + } + } + } + pub fn clear_texture(&self, res: &PipeResource, pattern: &[u32], bx: &pipe_box) { unsafe { self.pipe.as_ref().clear_texture.unwrap()( -- 2.7.4