From c1ba062a30669aa57e371440fca4bfa00a1b45c3 Mon Sep 17 00:00:00 2001 From: Karol Herbst Date: Sat, 28 Jun 2025 23:34:14 +0200 Subject: [PATCH] rusticl: use image_copy_buffer Part-of: --- src/gallium/frontends/rusticl/core/memory.rs | 24 +++++++++++++++ .../frontends/rusticl/mesa/pipe/context.rs | 29 +++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/src/gallium/frontends/rusticl/core/memory.rs b/src/gallium/frontends/rusticl/core/memory.rs index ffa5979c273..99040d36004 100644 --- a/src/gallium/frontends/rusticl/core/memory.rs +++ b/src/gallium/frontends/rusticl/core/memory.rs @@ -1359,6 +1359,18 @@ impl Buffer { ); } + if ctx.has_buffer_texture_copies() { + let src_res = self.get_res_for_access(ctx, RWFlags::RD)?; + let dst_res = dst.get_res_for_access(ctx, RWFlags::WR)?; + + let src_offset = self + .apply_offset(src_offset)? + .try_into_with_err(CL_OUT_OF_HOST_MEMORY)?; + let bx = create_pipe_box(dst_origin, *region, dst.mem_type)?; + ctx.resource_copy_buffer_texture(src_res, dst_res, src_offset, &bx); + return Ok(()); + } + let size = CLVec::calc_size(region, src_pitch); let src_offset = self.apply_offset(src_offset)?; let tx_src = self.tx(ctx, src_offset, size, RWFlags::RD)?; @@ -1695,6 +1707,18 @@ impl Image { ); } + if ctx.has_buffer_texture_copies() { + let src_res = self.get_res_for_access(ctx, RWFlags::RD)?; + let dst_res = dst.get_res_for_access(ctx, RWFlags::WR)?; + + let dst_offset = dst + .apply_offset(dst_offset)? + .try_into_with_err(CL_OUT_OF_HOST_MEMORY)?; + let bx = create_pipe_box(src_origin, *region, self.mem_type)?; + ctx.resource_copy_buffer_texture(src_res, dst_res, dst_offset, &bx); + return Ok(()); + } + let tx_src = self.tx_image( ctx, &create_pipe_box(src_origin, *region, self.mem_type)?, diff --git a/src/gallium/frontends/rusticl/mesa/pipe/context.rs b/src/gallium/frontends/rusticl/mesa/pipe/context.rs index 083fca34215..0528b4a7fde 100644 --- a/src/gallium/frontends/rusticl/mesa/pipe/context.rs +++ b/src/gallium/frontends/rusticl/mesa/pipe/context.rs @@ -235,6 +235,35 @@ impl PipeContext { self.resource_copy_region(src, dst, dst_offset, bx) } + pub fn has_buffer_texture_copies(&self) -> bool { + unsafe { self.pipe.as_ref() }.image_copy_buffer.is_some() + } + + /// Copies between a buffer and a texture if supported by the context + /// ([Self::has_buffer_texture_copies]). + pub fn resource_copy_buffer_texture( + &self, + src: &PipeResource, + dst: &PipeResource, + buffer_offset: u32, + bx: &pipe_box, + ) { + debug_assert_ne!(src.is_buffer(), dst.is_buffer()); + + unsafe { + self.pipe.as_ref().image_copy_buffer.unwrap()( + self.pipe.as_ptr(), + dst.pipe(), + src.pipe(), + buffer_offset, + 0, + 0, + 0, + bx, + ); + } + } + fn resource_map( &self, res: &PipeResource,