From 40215c80848c445a8b86b7ea8dc465fae138f2a7 Mon Sep 17 00:00:00 2001 From: Karol Herbst Date: Tue, 12 Apr 2022 00:51:29 +0200 Subject: [PATCH] rusticl/memory: don't map more than necessary for copy operations Signed-off-by: Karol Herbst Acked-by: Alyssa Rosenzweig Part-of: --- src/gallium/frontends/rusticl/core/memory.rs | 34 +++++++++++++++----- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/src/gallium/frontends/rusticl/core/memory.rs b/src/gallium/frontends/rusticl/core/memory.rs index 1e842b97bfd..cb8067dd3b2 100644 --- a/src/gallium/frontends/rusticl/core/memory.rs +++ b/src/gallium/frontends/rusticl/core/memory.rs @@ -203,6 +203,16 @@ fn create_box( }) } +fn buffer_offset_size( + origin: &CLVec, + region: &CLVec, + row_pitch: usize, + slice_pitch: usize, +) -> (usize, usize) { + let pitch = [1, row_pitch, slice_pitch]; + (*origin * pitch, *region * pitch) +} + impl Mem { pub fn new_buffer( context: Arc, @@ -603,7 +613,10 @@ impl Mem { dst_slice_pitch: usize, ) -> CLResult<()> { if self.is_buffer() { - let tx = self.tx(q, ctx, 0, self.size)?; + let (offset, size) = + buffer_offset_size(dst_origin, region, dst_row_pitch, dst_slice_pitch); + let tx = self.tx(q, ctx, offset, size)?; + sw_copy( src, tx.ptr(), @@ -611,7 +624,7 @@ impl Mem { src_origin, src_row_pitch, src_slice_pitch, - dst_origin, + &CLVec::default(), dst_row_pitch, dst_slice_pitch, 1, @@ -660,7 +673,9 @@ impl Mem { let pixel_size; if self.is_buffer() { - tx = self.tx(q, ctx, 0, self.size)?; + let (offset, size) = + buffer_offset_size(src_origin, region, src_row_pitch, src_slice_pitch); + tx = self.tx(q, ctx, offset, size)?; pixel_size = 1; } else { assert!(dst_origin == &CLVec::default()); @@ -677,7 +692,7 @@ impl Mem { tx.ptr(), dst, region, - src_origin, + &CLVec::default(), src_row_pitch, src_slice_pitch, dst_origin, @@ -705,18 +720,21 @@ impl Mem { assert!(self.is_buffer()); assert!(dst.is_buffer()); - let tx_src = self.tx(q, ctx, 0, self.size)?; - let tx_dst = dst.tx(q, ctx, 0, self.size)?; + let (offset, size) = buffer_offset_size(src_origin, region, src_row_pitch, src_slice_pitch); + let tx_src = self.tx(q, ctx, offset, size)?; + + let (offset, size) = buffer_offset_size(dst_origin, region, dst_row_pitch, dst_slice_pitch); + let tx_dst = dst.tx(q, ctx, offset, size)?; // TODO check to use hw accelerated paths (e.g. resource_copy_region or blits) sw_copy( tx_src.ptr(), tx_dst.ptr(), region, - src_origin, + &CLVec::default(), src_row_pitch, src_slice_pitch, - dst_origin, + &CLVec::default(), dst_row_pitch, dst_slice_pitch, 1,