From 16623f654f369ee58f6b4727b96833ae097b1e9a Mon Sep 17 00:00:00 2001 From: Karol Herbst Date: Mon, 26 Aug 2024 15:44:30 +0200 Subject: [PATCH] rusticl/mesa: add buffer and texture variant for resource_copy_region We'll add mipmap parameters to it, so it's better to split it up, so it's easier to use the interface. Reviewed-by: Adam Jackson Part-of: --- src/gallium/frontends/rusticl/core/gl.rs | 4 +- src/gallium/frontends/rusticl/core/memory.rs | 20 +++++----- .../frontends/rusticl/mesa/pipe/context.rs | 37 ++++++++++++++++++- 3 files changed, 47 insertions(+), 14 deletions(-) diff --git a/src/gallium/frontends/rusticl/core/gl.rs b/src/gallium/frontends/rusticl/core/gl.rs index fbf9b461672..b11cfbaf168 100644 --- a/src/gallium/frontends/rusticl/core/gl.rs +++ b/src/gallium/frontends/rusticl/core/gl.rs @@ -477,7 +477,7 @@ pub fn copy_cube_to_slice(ctx: &QueueContext, mem_objects: &[Mem]) -> CLResult<( let cl_res = image.get_res_for_access(ctx, RWFlags::WR)?; let gl_res = gl_obj.shadow_map.as_ref().unwrap().get(cl_res).unwrap(); - ctx.resource_copy_region(gl_res.as_ref(), cl_res.as_ref(), &dst_offset, &src_bx); + ctx.resource_copy_texture(gl_res.as_ref(), cl_res.as_ref(), &dst_offset, &src_bx); } Ok(()) @@ -505,7 +505,7 @@ pub fn copy_slice_to_cube(ctx: &QueueContext, mem_objects: &[Mem]) -> CLResult<( let cl_res = image.get_res_for_access(ctx, RWFlags::WR)?; let gl_res = gl_obj.shadow_map.as_ref().unwrap().get(cl_res).unwrap(); - ctx.resource_copy_region(cl_res.as_ref(), gl_res.as_ref(), &dst_offset, &src_bx); + ctx.resource_copy_texture(cl_res.as_ref(), gl_res.as_ref(), &dst_offset, &src_bx); } Ok(()) diff --git a/src/gallium/frontends/rusticl/core/memory.rs b/src/gallium/frontends/rusticl/core/memory.rs index ae60aee0e8b..e267aa00928 100644 --- a/src/gallium/frontends/rusticl/core/memory.rs +++ b/src/gallium/frontends/rusticl/core/memory.rs @@ -1172,19 +1172,17 @@ impl Buffer { dst_offset: usize, size: usize, ) -> CLResult<()> { - let src_offset = self.apply_offset(src_offset)?; - let dst_offset = dst.apply_offset(dst_offset)?; let src_res = self.get_res_for_access(ctx, RWFlags::RD)?; let dst_res = dst.get_res_for_access(ctx, RWFlags::WR)?; + let size = size.try_into().map_err(|_| CL_OUT_OF_HOST_MEMORY)?; + let src_offset = self + .apply_offset(src_offset)? + .try_into_with_err(CL_OUT_OF_HOST_MEMORY)?; + let dst_offset = dst + .apply_offset(dst_offset)? + .try_into_with_err(CL_OUT_OF_HOST_MEMORY)?; - let bx = create_pipe_box( - [src_offset, 0, 0].into(), - [size, 1, 1].into(), - CL_MEM_OBJECT_BUFFER, - )?; - let dst_origin: [u32; 3] = [dst_offset.try_into_with_err(CL_OUT_OF_HOST_MEMORY)?, 0, 0]; - - ctx.resource_copy_region(src_res, dst_res, &dst_origin, &bx); + ctx.resource_copy_buffer(src_res, src_offset, dst_res, dst_offset, size); Ok(()) } @@ -1620,7 +1618,7 @@ impl Image { (dst_origin[1], dst_origin[2]) = (dst_origin[2], dst_origin[1]); } - ctx.resource_copy_region(src_res, dst_res, &dst_origin, &bx); + ctx.resource_copy_texture(src_res, dst_res, &dst_origin, &bx); } Ok(()) } diff --git a/src/gallium/frontends/rusticl/mesa/pipe/context.rs b/src/gallium/frontends/rusticl/mesa/pipe/context.rs index c1717faa39d..dae76659a76 100644 --- a/src/gallium/frontends/rusticl/mesa/pipe/context.rs +++ b/src/gallium/frontends/rusticl/mesa/pipe/context.rs @@ -162,7 +162,7 @@ impl PipeContext { } } - pub fn resource_copy_region( + fn resource_copy_region( &self, src: &PipeResource, dst: &PipeResource, @@ -184,6 +184,41 @@ impl PipeContext { } } + pub fn resource_copy_buffer( + &self, + src: &PipeResource, + src_offset: i32, + dst: &PipeResource, + dst_offset: u32, + width: i32, + ) { + debug_assert!(src.is_buffer()); + debug_assert!(dst.is_buffer()); + + let bx = pipe_box { + x: src_offset, + width: width, + height: 1, + depth: 1, + ..Default::default() + }; + + self.resource_copy_region(src, dst, &[dst_offset, 0, 0], &bx) + } + + pub fn resource_copy_texture( + &self, + src: &PipeResource, + dst: &PipeResource, + dst_offset: &[u32; 3], + bx: &pipe_box, + ) { + debug_assert!(!src.is_buffer()); + debug_assert!(!dst.is_buffer()); + + self.resource_copy_region(src, dst, dst_offset, bx) + } + fn resource_map( &self, res: &PipeResource,