Mesa (master): v3dv: fix base slice selection for copies involving 3D images

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Nov 2 08:42:40 UTC 2020


Module: Mesa
Branch: master
Commit: e4988e6affe5f04013043d75c21bae1d4aa84956
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=e4988e6affe5f04013043d75c21bae1d4aa84956

Author: Iago Toral Quiroga <itoral at igalia.com>
Date:   Wed Oct 28 09:06:02 2020 +0100

v3dv: fix base slice selection for copies involving 3D images

For 3D images we should take the slice to copy from or to, from
the Z coordinate of the corresponding offset, not the base array
layer.

Fixes VK_KHR_maintenance1 tests:
dEQP-VK.api.copy_and_blit.core.image_to_image.3d_images.3d_to_2d_by_slices
dEQP-VK.api.copy_and_blit.core.image_to_image.3d_images.2d_to_3d_by_layers

Reviewed-by: Alejandro Piñeiro <apinheiro at igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7364>

---

 src/broadcom/vulkan/v3dv_meta_copy.c | 100 +++++++++++++++++++++++------------
 1 file changed, 66 insertions(+), 34 deletions(-)

diff --git a/src/broadcom/vulkan/v3dv_meta_copy.c b/src/broadcom/vulkan/v3dv_meta_copy.c
index 8961ab36ea6..72fb8926dc1 100644
--- a/src/broadcom/vulkan/v3dv_meta_copy.c
+++ b/src/broadcom/vulkan/v3dv_meta_copy.c
@@ -610,7 +610,7 @@ emit_copy_layer_to_buffer_per_tile_list(struct v3dv_job *job,
                                         struct framebuffer_data *framebuffer,
                                         struct v3dv_buffer *buffer,
                                         struct v3dv_image *image,
-                                        uint32_t layer,
+                                        uint32_t layer_offset,
                                         const VkBufferImageCopy *region)
 {
    struct v3dv_cl *cl = &job->indirect;
@@ -621,13 +621,19 @@ emit_copy_layer_to_buffer_per_tile_list(struct v3dv_job *job,
 
    cl_emit(cl, TILE_COORDINATES_IMPLICIT, coords);
 
-   const VkImageSubresourceLayers *imgrsc = &region->imageSubresource;
-   assert((image->type != VK_IMAGE_TYPE_3D && layer < imgrsc->layerCount) ||
-          layer < image->extent.depth);
-
    /* Load image to TLB */
-   emit_image_load(cl, framebuffer, image, imgrsc->aspectMask,
-                   imgrsc->baseArrayLayer + layer, imgrsc->mipLevel,
+   assert((image->type != VK_IMAGE_TYPE_3D &&
+           layer_offset < region->imageSubresource.layerCount) ||
+          layer_offset < image->extent.depth);
+
+   const uint32_t image_layer = image->type != VK_IMAGE_TYPE_3D ?
+      region->imageSubresource.baseArrayLayer + layer_offset :
+      region->imageOffset.z + layer_offset;
+
+   emit_image_load(cl, framebuffer, image,
+                   region->imageSubresource.aspectMask,
+                   image_layer,
+                   region->imageSubresource.mipLevel,
                    true, false);
 
    cl_emit(cl, END_OF_LOADS, end);
@@ -654,13 +660,15 @@ emit_copy_layer_to_buffer_per_tile_list(struct v3dv_job *job,
     * Vulkan spec states that the output buffer must have packed stencil
     * values, where each stencil value is 1 byte.
     */
-   uint32_t cpp = imgrsc->aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT ?
-                  1 : image->cpp;
+   uint32_t cpp =
+      region->imageSubresource.aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT ?
+         1 : image->cpp;
    uint32_t buffer_stride = width * cpp;
-   uint32_t buffer_offset =
-      buffer->mem_offset + region->bufferOffset + height * buffer_stride * layer;
+   uint32_t buffer_offset = buffer->mem_offset + region->bufferOffset +
+                            height * buffer_stride * layer_offset;
 
-   uint32_t format = choose_tlb_format(framebuffer, imgrsc->aspectMask,
+   uint32_t format = choose_tlb_format(framebuffer,
+                                       region->imageSubresource.aspectMask,
                                        true, true, false);
    bool msaa = image->samples > VK_SAMPLE_COUNT_1_BIT;
 
@@ -1177,7 +1185,7 @@ emit_copy_image_layer_per_tile_list(struct v3dv_job *job,
                                     struct framebuffer_data *framebuffer,
                                     struct v3dv_image *dst,
                                     struct v3dv_image *src,
-                                    uint32_t layer,
+                                    uint32_t layer_offset,
                                     const VkImageCopy *region)
 {
    struct v3dv_cl *cl = &job->indirect;
@@ -1188,24 +1196,36 @@ emit_copy_image_layer_per_tile_list(struct v3dv_job *job,
 
    cl_emit(cl, TILE_COORDINATES_IMPLICIT, coords);
 
-   const VkImageSubresourceLayers *srcrsc = &region->srcSubresource;
-   assert((src->type != VK_IMAGE_TYPE_3D && layer < srcrsc->layerCount) ||
-          layer < src->extent.depth);
+   assert((src->type != VK_IMAGE_TYPE_3D &&
+           layer_offset < region->srcSubresource.layerCount) ||
+          layer_offset < src->extent.depth);
+
+   const uint32_t src_layer = src->type != VK_IMAGE_TYPE_3D ?
+      region->srcSubresource.baseArrayLayer + layer_offset :
+      region->srcOffset.z + layer_offset;
 
-   emit_image_load(cl, framebuffer, src, srcrsc->aspectMask,
-                   srcrsc->baseArrayLayer + layer, srcrsc->mipLevel,
+   emit_image_load(cl, framebuffer, src,
+                   region->srcSubresource.aspectMask,
+                   src_layer,
+                   region->srcSubresource.mipLevel,
                    false, false);
 
    cl_emit(cl, END_OF_LOADS, end);
 
    cl_emit(cl, BRANCH_TO_IMPLICIT_TILE_LIST, branch);
 
-   const VkImageSubresourceLayers *dstrsc = &region->dstSubresource;
-   assert((dst->type != VK_IMAGE_TYPE_3D && layer < dstrsc->layerCount) ||
-          layer < dst->extent.depth);
+   assert((dst->type != VK_IMAGE_TYPE_3D &&
+           layer_offset < region->dstSubresource.layerCount) ||
+          layer_offset < dst->extent.depth);
 
-   emit_image_store(cl, framebuffer, dst, dstrsc->aspectMask,
-                    dstrsc->baseArrayLayer + layer, dstrsc->mipLevel,
+   const uint32_t dst_layer = dst->type != VK_IMAGE_TYPE_3D ?
+      region->dstSubresource.baseArrayLayer + layer_offset :
+      region->dstOffset.z + layer_offset;
+
+   emit_image_store(cl, framebuffer, dst,
+                    region->dstSubresource.aspectMask,
+                    dst_layer,
+                    region->dstSubresource.mipLevel,
                     false, false, false);
 
    cl_emit(cl, END_OF_TILE_MARKER, end);
@@ -4457,7 +4477,7 @@ emit_resolve_image_layer_per_tile_list(struct v3dv_job *job,
                                        struct framebuffer_data *framebuffer,
                                        struct v3dv_image *dst,
                                        struct v3dv_image *src,
-                                       uint32_t layer,
+                                       uint32_t layer_offset,
                                        const VkImageResolve *region)
 {
    struct v3dv_cl *cl = &job->indirect;
@@ -4468,24 +4488,36 @@ emit_resolve_image_layer_per_tile_list(struct v3dv_job *job,
 
    cl_emit(cl, TILE_COORDINATES_IMPLICIT, coords);
 
-   const VkImageSubresourceLayers *srcrsc = &region->srcSubresource;
-   assert((src->type != VK_IMAGE_TYPE_3D && layer < srcrsc->layerCount) ||
-          layer < src->extent.depth);
+   assert((src->type != VK_IMAGE_TYPE_3D &&
+           layer_offset < region->srcSubresource.layerCount) ||
+          layer_offset < src->extent.depth);
+
+   const uint32_t src_layer = src->type != VK_IMAGE_TYPE_3D ?
+      region->srcSubresource.baseArrayLayer + layer_offset :
+      region->srcOffset.z + layer_offset;
 
-   emit_image_load(cl, framebuffer, src, srcrsc->aspectMask,
-                   srcrsc->baseArrayLayer + layer, srcrsc->mipLevel,
+   emit_image_load(cl, framebuffer, src,
+                   region->srcSubresource.aspectMask,
+                   src_layer,
+                   region->srcSubresource.mipLevel,
                    false, false);
 
    cl_emit(cl, END_OF_LOADS, end);
 
    cl_emit(cl, BRANCH_TO_IMPLICIT_TILE_LIST, branch);
 
-   const VkImageSubresourceLayers *dstrsc = &region->dstSubresource;
-   assert((dst->type != VK_IMAGE_TYPE_3D && layer < dstrsc->layerCount) ||
-          layer < dst->extent.depth);
+   assert((dst->type != VK_IMAGE_TYPE_3D &&
+           layer_offset < region->dstSubresource.layerCount) ||
+          layer_offset < dst->extent.depth);
+
+   const uint32_t dst_layer = dst->type != VK_IMAGE_TYPE_3D ?
+      region->dstSubresource.baseArrayLayer + layer_offset :
+      region->dstOffset.z + layer_offset;
 
-   emit_image_store(cl, framebuffer, dst, dstrsc->aspectMask,
-                    dstrsc->baseArrayLayer + layer, dstrsc->mipLevel,
+   emit_image_store(cl, framebuffer, dst,
+                    region->dstSubresource.aspectMask,
+                    dst_layer,
+                    region->dstSubresource.mipLevel,
                     false, false, true);
 
    cl_emit(cl, END_OF_TILE_MARKER, end);



More information about the mesa-commit mailing list