v3dv: allow VK_REMAINING_ARRAY_LAYERS in VkImageSubresourceLayers
This is allowed with VK_KHR_maintenance5. There are helpers in Mesa to help with this. Reviewed-by: Alejandro Piñeiro <apinheiro@igalia.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/29544>
This commit is contained in:

committed by
Marge Bot

parent
5b6495a953
commit
50e5067be7
@@ -454,10 +454,12 @@ copy_image_to_buffer_tlb(struct v3dv_cmd_buffer *cmd_buffer,
|
||||
&internal_type, &internal_bpp);
|
||||
|
||||
uint32_t num_layers;
|
||||
if (image->vk.image_type != VK_IMAGE_TYPE_3D)
|
||||
num_layers = region->imageSubresource.layerCount;
|
||||
else
|
||||
if (image->vk.image_type != VK_IMAGE_TYPE_3D) {
|
||||
num_layers = vk_image_subresource_layer_count(&image->vk,
|
||||
®ion->imageSubresource);
|
||||
} else {
|
||||
num_layers = region->imageExtent.depth;
|
||||
}
|
||||
assert(num_layers > 0);
|
||||
|
||||
struct v3dv_job *job =
|
||||
@@ -913,10 +915,12 @@ copy_image_to_buffer_blit(struct v3dv_cmd_buffer *cmd_buffer,
|
||||
|
||||
/* Compute layers to copy */
|
||||
uint32_t num_layers;
|
||||
if (image->vk.image_type != VK_IMAGE_TYPE_3D)
|
||||
num_layers = region->imageSubresource.layerCount;
|
||||
else
|
||||
if (image->vk.image_type != VK_IMAGE_TYPE_3D) {
|
||||
num_layers = vk_image_subresource_layer_count(&image->vk,
|
||||
®ion->imageSubresource);
|
||||
} else {
|
||||
num_layers = region->imageExtent.depth;
|
||||
}
|
||||
assert(num_layers > 0);
|
||||
|
||||
/* Copy requested layers */
|
||||
@@ -1072,10 +1076,12 @@ copy_image_to_buffer_texel_buffer(struct v3dv_cmd_buffer *cmd_buffer,
|
||||
handled = true;
|
||||
|
||||
uint32_t num_layers;
|
||||
if (src_image->vk.image_type != VK_IMAGE_TYPE_3D)
|
||||
num_layers = region->imageSubresource.layerCount;
|
||||
else
|
||||
if (src_image->vk.image_type != VK_IMAGE_TYPE_3D) {
|
||||
num_layers = vk_image_subresource_layer_count(&src_image->vk,
|
||||
®ion->imageSubresource);
|
||||
} else {
|
||||
num_layers = region->imageExtent.depth;
|
||||
}
|
||||
assert(num_layers > 0);
|
||||
|
||||
VkResult result;
|
||||
@@ -1233,7 +1239,7 @@ copy_image_tfu(struct v3dv_cmd_buffer *cmd_buffer,
|
||||
|
||||
/* Emit a TFU job for each layer to blit */
|
||||
const uint32_t layer_count = dst->vk.image_type != VK_IMAGE_TYPE_3D ?
|
||||
region->dstSubresource.layerCount :
|
||||
vk_image_subresource_layer_count(&dst->vk, ®ion->dstSubresource) :
|
||||
region->extent.depth;
|
||||
const uint32_t src_mip_level = region->srcSubresource.mipLevel;
|
||||
|
||||
@@ -1329,14 +1335,18 @@ copy_image_tlb(struct v3dv_cmd_buffer *cmd_buffer,
|
||||
* extent (for 3D) or layers of the dstSubresource (for non-3D)."
|
||||
*/
|
||||
assert((src->vk.image_type != VK_IMAGE_TYPE_3D ?
|
||||
region->srcSubresource.layerCount : region->extent.depth) ==
|
||||
vk_image_subresource_layer_count(&src->vk, ®ion->srcSubresource) :
|
||||
region->extent.depth) ==
|
||||
(dst->vk.image_type != VK_IMAGE_TYPE_3D ?
|
||||
region->dstSubresource.layerCount : region->extent.depth));
|
||||
vk_image_subresource_layer_count(&dst->vk, ®ion->dstSubresource) :
|
||||
region->extent.depth));
|
||||
uint32_t num_layers;
|
||||
if (dst->vk.image_type != VK_IMAGE_TYPE_3D)
|
||||
num_layers = region->dstSubresource.layerCount;
|
||||
else
|
||||
if (dst->vk.image_type != VK_IMAGE_TYPE_3D) {
|
||||
num_layers = vk_image_subresource_layer_count(&dst->vk,
|
||||
®ion->dstSubresource);
|
||||
} else {
|
||||
num_layers = region->extent.depth;
|
||||
}
|
||||
assert(num_layers > 0);
|
||||
|
||||
struct v3dv_job *job =
|
||||
@@ -1914,10 +1924,12 @@ copy_buffer_to_image_tfu(struct v3dv_cmd_buffer *cmd_buffer,
|
||||
const struct v3dv_format_plane *format_plane = &format->planes[0];
|
||||
|
||||
uint32_t num_layers;
|
||||
if (image->vk.image_type != VK_IMAGE_TYPE_3D)
|
||||
num_layers = region->imageSubresource.layerCount;
|
||||
else
|
||||
if (image->vk.image_type != VK_IMAGE_TYPE_3D) {
|
||||
num_layers = vk_image_subresource_layer_count(&image->vk,
|
||||
®ion->imageSubresource);
|
||||
} else {
|
||||
num_layers = region->imageExtent.depth;
|
||||
}
|
||||
assert(num_layers > 0);
|
||||
|
||||
assert(image->planes[plane].mem && image->planes[plane].mem->bo);
|
||||
@@ -1987,10 +1999,12 @@ copy_buffer_to_image_tlb(struct v3dv_cmd_buffer *cmd_buffer,
|
||||
&internal_type, &internal_bpp);
|
||||
|
||||
uint32_t num_layers;
|
||||
if (image->vk.image_type != VK_IMAGE_TYPE_3D)
|
||||
num_layers = region->imageSubresource.layerCount;
|
||||
else
|
||||
if (image->vk.image_type != VK_IMAGE_TYPE_3D) {
|
||||
num_layers = vk_image_subresource_layer_count(&image->vk,
|
||||
®ion->imageSubresource);
|
||||
} else {
|
||||
num_layers = region->imageExtent.depth;
|
||||
}
|
||||
assert(num_layers > 0);
|
||||
|
||||
struct v3dv_job *job =
|
||||
@@ -2595,7 +2609,7 @@ texel_buffer_shader_copy(struct v3dv_cmd_buffer *cmd_buffer,
|
||||
const VkImageSubresourceLayers *resource = ®ions[0].imageSubresource;
|
||||
uint32_t num_layers;
|
||||
if (image->vk.image_type != VK_IMAGE_TYPE_3D) {
|
||||
num_layers = resource->layerCount;
|
||||
num_layers = vk_image_subresource_layer_count(&image->vk, resource);
|
||||
} else {
|
||||
assert(region_count == 1);
|
||||
num_layers = regions[0].imageExtent.depth;
|
||||
@@ -2928,10 +2942,12 @@ copy_buffer_to_image_blit(struct v3dv_cmd_buffer *cmd_buffer,
|
||||
* image subresource so we can take this from the first region.
|
||||
*/
|
||||
uint32_t num_layers;
|
||||
if (image->vk.image_type != VK_IMAGE_TYPE_3D)
|
||||
num_layers = regions[0].imageSubresource.layerCount;
|
||||
else
|
||||
if (image->vk.image_type != VK_IMAGE_TYPE_3D) {
|
||||
num_layers = vk_image_subresource_layer_count(&image->vk,
|
||||
®ions[0].imageSubresource);
|
||||
} else {
|
||||
num_layers = regions[0].imageExtent.depth;
|
||||
}
|
||||
assert(num_layers > 0);
|
||||
|
||||
/* Sanity check: we can only batch multiple regions together if they have
|
||||
@@ -3398,8 +3414,8 @@ blit_tfu(struct v3dv_cmd_buffer *cmd_buffer,
|
||||
dst->planes[0].cpp, NULL);
|
||||
|
||||
/* Emit a TFU job for each layer to blit */
|
||||
assert(region->dstSubresource.layerCount ==
|
||||
region->srcSubresource.layerCount);
|
||||
assert(vk_image_subresource_layer_count(&dst->vk, ®ion->dstSubresource) ==
|
||||
vk_image_subresource_layer_count(&src->vk, ®ion->srcSubresource));
|
||||
|
||||
uint32_t min_dst_layer;
|
||||
uint32_t max_dst_layer;
|
||||
@@ -3410,7 +3426,9 @@ blit_tfu(struct v3dv_cmd_buffer *cmd_buffer,
|
||||
&dst_mirror_z);
|
||||
} else {
|
||||
min_dst_layer = region->dstSubresource.baseArrayLayer;
|
||||
max_dst_layer = min_dst_layer + region->dstSubresource.layerCount;
|
||||
max_dst_layer = min_dst_layer +
|
||||
vk_image_subresource_layer_count(&dst->vk,
|
||||
®ion->dstSubresource);
|
||||
}
|
||||
|
||||
uint32_t min_src_layer;
|
||||
@@ -3422,7 +3440,9 @@ blit_tfu(struct v3dv_cmd_buffer *cmd_buffer,
|
||||
&src_mirror_z);
|
||||
} else {
|
||||
min_src_layer = region->srcSubresource.baseArrayLayer;
|
||||
max_src_layer = min_src_layer + region->srcSubresource.layerCount;
|
||||
max_src_layer = min_src_layer +
|
||||
vk_image_subresource_layer_count(&src->vk,
|
||||
®ion->srcSubresource);
|
||||
}
|
||||
|
||||
/* No Z scaling for 3D images (for non-3D images both src and dst must
|
||||
@@ -4454,7 +4474,9 @@ blit_shader(struct v3dv_cmd_buffer *cmd_buffer,
|
||||
bool dst_mirror_z = false;
|
||||
if (dst->vk.image_type != VK_IMAGE_TYPE_3D) {
|
||||
min_dst_layer = region->dstSubresource.baseArrayLayer;
|
||||
max_dst_layer = min_dst_layer + region->dstSubresource.layerCount;
|
||||
max_dst_layer = min_dst_layer +
|
||||
vk_image_subresource_layer_count(&dst->vk,
|
||||
®ion->dstSubresource);
|
||||
} else {
|
||||
compute_blit_3d_layers(region->dstOffsets,
|
||||
&min_dst_layer, &max_dst_layer,
|
||||
@@ -4466,7 +4488,9 @@ blit_shader(struct v3dv_cmd_buffer *cmd_buffer,
|
||||
bool src_mirror_z = false;
|
||||
if (src->vk.image_type != VK_IMAGE_TYPE_3D) {
|
||||
min_src_layer = region->srcSubresource.baseArrayLayer;
|
||||
max_src_layer = min_src_layer + region->srcSubresource.layerCount;
|
||||
max_src_layer = min_src_layer +
|
||||
vk_image_subresource_layer_count(&src->vk,
|
||||
®ion->srcSubresource);
|
||||
} else {
|
||||
compute_blit_3d_layers(region->srcOffsets,
|
||||
&min_src_layer, &max_src_layer,
|
||||
@@ -4832,10 +4856,12 @@ resolve_image_tlb(struct v3dv_cmd_buffer *cmd_buffer,
|
||||
const VkFormat fb_format = src->vk.format;
|
||||
|
||||
uint32_t num_layers;
|
||||
if (dst->vk.image_type != VK_IMAGE_TYPE_3D)
|
||||
num_layers = region->dstSubresource.layerCount;
|
||||
else
|
||||
if (dst->vk.image_type != VK_IMAGE_TYPE_3D) {
|
||||
num_layers = vk_image_subresource_layer_count(&dst->vk,
|
||||
®ion->dstSubresource);
|
||||
} else {
|
||||
num_layers = region->extent.depth;
|
||||
}
|
||||
assert(num_layers > 0);
|
||||
|
||||
struct v3dv_job *job =
|
||||
|
Reference in New Issue
Block a user