rusticl: use image_copy_buffer

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/35809>
This commit is contained in:
Karol Herbst 2025-06-28 23:34:14 +02:00 committed by Marge Bot
parent 0003e16fc6
commit c1ba062a30
2 changed files with 53 additions and 0 deletions

View file

@ -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)?,

View file

@ -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,