[Mesa-dev] [PATCH] anv/copy: Fix Copying between Buffers and Images of different dimensions

Nanley Chery nanleychery at gmail.com
Mon May 9 19:26:32 UTC 2016


From: Nanley Chery <nanley.g.chery at intel.com>

This function previously assumed that the Buffer and Image had matching
dimensions. However, it is possible to copy from a buffer with larger
dimensions than the image. Modify the copy function to enable this.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=95292
Signed-off-by: Nanley Chery <nanley.g.chery at intel.com>
---
 src/intel/vulkan/anv_meta_copy.c | 19 +++++++++++--------
 1 file changed, 11 insertions(+), 8 deletions(-)

diff --git a/src/intel/vulkan/anv_meta_copy.c b/src/intel/vulkan/anv_meta_copy.c
index 982fa7e..1d131d3 100644
--- a/src/intel/vulkan/anv_meta_copy.c
+++ b/src/intel/vulkan/anv_meta_copy.c
@@ -128,18 +128,20 @@ meta_copy_buffer_to_image(struct anv_cmd_buffer *cmd_buffer,
       const VkOffset3D img_offset_el =
          meta_region_offset_el(image, &pRegions[r].imageOffset);
       const VkExtent3D bufferExtent = {
-         .width = pRegions[r].bufferRowLength,
-         .height = pRegions[r].bufferImageHeight,
+         .width  = MAX(pRegions[r].bufferRowLength,
+                       pRegions[r].imageExtent.width),
+         .height = MAX(pRegions[r].bufferImageHeight,
+                       pRegions[r].imageExtent.height),
       };
-
-      /* Start creating blit rect */
       const VkExtent3D buf_extent_el =
          meta_region_extent_el(image, &bufferExtent);
+
+      /* Start creating blit rect */
       const VkExtent3D img_extent_el =
          meta_region_extent_el(image, &pRegions[r].imageExtent);
       struct anv_meta_blit2d_rect rect = {
-         .width = MAX2(buf_extent_el.width, img_extent_el.width),
-         .height = MAX2(buf_extent_el.height, img_extent_el.height),
+         .width = img_extent_el.width,
+         .height =  img_extent_el.height,
       };
 
       /* Create blit surfaces */
@@ -153,7 +155,7 @@ meta_copy_buffer_to_image(struct anv_cmd_buffer *cmd_buffer,
          .tiling = ISL_TILING_LINEAR,
          .base_offset = buffer->offset + pRegions[r].bufferOffset,
          .bs = forward ? image->format->isl_layout->bs : img_bsurf.bs,
-         .pitch = rect.width * buf_bsurf.bs,
+         .pitch = buf_extent_el.width * buf_bsurf.bs,
       };
 
       /* Set direction-dependent variables */
@@ -188,7 +190,8 @@ meta_copy_buffer_to_image(struct anv_cmd_buffer *cmd_buffer,
           * increment the offset directly in the image effectively
           * re-binding it to different backing memory.
           */
-         buf_bsurf.base_offset += rect.width * rect.height * buf_bsurf.bs;
+         buf_bsurf.base_offset += buf_extent_el.width *
+                                  buf_extent_el.height * buf_bsurf.bs;
 
          if (image->type == VK_IMAGE_TYPE_3D)
             slice_3d++;
-- 
2.8.2



More information about the mesa-dev mailing list