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

Jason Ekstrand jason at jlekstrand.net
Fri May 13 20:48:09 UTC 2016


On Mon, May 9, 2016 at 12:26 PM, Nanley Chery <nanleychery at gmail.com> wrote:

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

As I commented on IRC, I think this would be better as
"pRegions[r].bufferRowLength ? pRegions[r].BufferRowLength :
pRegions[r].imageExtent.width"

With that,

Reviewed-by: Jason Ekstrand <jason at jlekstrand.net>


> +         .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
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20160513/1a7ea9e7/attachment.html>


More information about the mesa-dev mailing list