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 = ®ion->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 = ®ion->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 = ®ion->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 = ®ion->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 = ®ion->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