radv: allow VK_REMAINING_ARRAY_LAYERS with VkImageSubresourceLayers

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24392>
This commit is contained in:
Samuel Pitoiset 2023-07-28 09:20:11 +02:00 committed by Marge Bot
parent 2ed52ca578
commit 6861c5275b
6 changed files with 80 additions and 69 deletions

View file

@ -427,7 +427,7 @@ blit_image(struct radv_cmd_buffer *cmd_buffer, struct radv_image *src_image, VkI
dst_end = region->dstOffsets[1].z;
} else {
dst_start = dst_res->baseArrayLayer;
dst_end = dst_start + dst_res->layerCount;
dst_end = dst_start + vk_image_subresource_layer_count(&dst_image->vk, dst_res);
}
unsigned src_start, src_end;
@ -437,7 +437,7 @@ blit_image(struct radv_cmd_buffer *cmd_buffer, struct radv_image *src_image, VkI
src_end = region->srcOffsets[1].z;
} else {
src_start = src_res->baseArrayLayer;
src_end = src_start + src_res->layerCount;
src_end = src_start + vk_image_subresource_layer_count(&src_image->vk, src_res);
}
bool flip_z = flip_coords(&src_start, &src_end, &dst_start, &dst_end);

View file

@ -142,7 +142,7 @@ copy_buffer_to_image(struct radv_cmd_buffer *cmd_buffer, struct radv_buffer *buf
.baseMipLevel = region->imageSubresource.mipLevel,
.levelCount = 1,
.baseArrayLayer = region->imageSubresource.baseArrayLayer,
.layerCount = region->imageSubresource.layerCount,
.layerCount = vk_image_subresource_layer_count(&image->vk, &region->imageSubresource),
});
img_bsurf.disable_compression = true;
@ -164,7 +164,7 @@ copy_buffer_to_image(struct radv_cmd_buffer *cmd_buffer, struct radv_buffer *buf
img_bsurf.layer = img_offset_el.z;
/* Loop through each 3D or array slice */
unsigned num_slices_3d = img_extent_el.depth;
unsigned num_slices_array = region->imageSubresource.layerCount;
unsigned num_slices_array = vk_image_subresource_layer_count(&image->vk, &region->imageSubresource);
unsigned slice_3d = 0;
unsigned slice_array = 0;
while (slice_3d < num_slices_3d && slice_array < num_slices_array) {
@ -291,7 +291,7 @@ copy_image_to_buffer(struct radv_cmd_buffer *cmd_buffer, struct radv_buffer *buf
.baseMipLevel = region->imageSubresource.mipLevel,
.levelCount = 1,
.baseArrayLayer = region->imageSubresource.baseArrayLayer,
.layerCount = region->imageSubresource.layerCount,
.layerCount = vk_image_subresource_layer_count(&image->vk, &region->imageSubresource),
});
img_info.disable_compression = true;
@ -312,7 +312,7 @@ copy_image_to_buffer(struct radv_cmd_buffer *cmd_buffer, struct radv_buffer *buf
img_info.layer = img_offset_el.z;
/* Loop through each 3D or array slice */
unsigned num_slices_3d = img_extent_el.depth;
unsigned num_slices_array = region->imageSubresource.layerCount;
unsigned num_slices_array = vk_image_subresource_layer_count(&image->vk, &region->imageSubresource);
unsigned slice_3d = 0;
unsigned slice_array = 0;
while (slice_3d < num_slices_3d && slice_array < num_slices_array) {
@ -384,15 +384,16 @@ copy_image(struct radv_cmd_buffer *cmd_buffer, struct radv_image *src_image, VkI
u_foreach_bit (i, region->dstSubresource.aspectMask) {
unsigned aspect_mask = 1u << i;
radv_expand_depth_stencil(cmd_buffer, dst_image,
&(VkImageSubresourceRange){
.aspectMask = aspect_mask,
.baseMipLevel = region->dstSubresource.mipLevel,
.levelCount = 1,
.baseArrayLayer = region->dstSubresource.baseArrayLayer,
.layerCount = region->dstSubresource.layerCount,
},
NULL);
radv_expand_depth_stencil(
cmd_buffer, dst_image,
&(VkImageSubresourceRange){
.aspectMask = aspect_mask,
.baseMipLevel = region->dstSubresource.mipLevel,
.levelCount = 1,
.baseArrayLayer = region->dstSubresource.baseArrayLayer,
.layerCount = vk_image_subresource_layer_count(&dst_image->vk, &region->dstSubresource),
},
NULL);
}
radv_describe_barrier_end(cmd_buffer);
@ -445,7 +446,7 @@ copy_image(struct radv_cmd_buffer *cmd_buffer, struct radv_image *src_image, VkI
.baseMipLevel = region->dstSubresource.mipLevel,
.levelCount = 1,
.baseArrayLayer = region->dstSubresource.baseArrayLayer,
.layerCount = region->dstSubresource.layerCount,
.layerCount = vk_image_subresource_layer_count(&dst_image->vk, &region->dstSubresource),
});
b_dst.format = b_src.format;
b_dst.disable_compression = true;
@ -482,7 +483,7 @@ copy_image(struct radv_cmd_buffer *cmd_buffer, struct radv_image *src_image, VkI
.height = img_extent_el.height,
};
unsigned num_slices = region->srcSubresource.layerCount;
unsigned num_slices = vk_image_subresource_layer_count(&src_image->vk, &region->srcSubresource);
if (src_image->vk.image_type == VK_IMAGE_TYPE_3D) {
b_src.layer = src_offset_el.z;
@ -527,7 +528,7 @@ copy_image(struct radv_cmd_buffer *cmd_buffer, struct radv_image *src_image, VkI
.baseMipLevel = region->dstSubresource.mipLevel,
.levelCount = 1,
.baseArrayLayer = region->dstSubresource.baseArrayLayer,
.layerCount = region->dstSubresource.layerCount,
.layerCount = vk_image_subresource_layer_count(&dst_image->vk, &region->dstSubresource),
};
uint32_t htile_value = radv_get_htile_initial_value(cmd_buffer->device, dst_image);

View file

@ -632,7 +632,9 @@ radv_meta_decode_etc(struct radv_cmd_buffer *cmd_buffer, struct radv_image *imag
RADV_META_SUSPEND_PREDICATING);
uint32_t base_slice = radv_meta_get_iview_layer(image, subresource, &offset);
uint32_t slice_count = image->vk.image_type == VK_IMAGE_TYPE_3D ? extent.depth : subresource->layerCount;
uint32_t slice_count = image->vk.image_type == VK_IMAGE_TYPE_3D
? extent.depth
: vk_image_subresource_layer_count(&image->vk, subresource);
extent = vk_image_sanitize_extent(&image->vk, extent);
offset = vk_image_sanitize_offset(&image->vk, offset);
@ -640,22 +642,23 @@ radv_meta_decode_etc(struct radv_cmd_buffer *cmd_buffer, struct radv_image *imag
VkFormat load_format =
vk_format_get_blocksize(image->vk.format) == 16 ? VK_FORMAT_R32G32B32A32_UINT : VK_FORMAT_R32G32_UINT;
struct radv_image_view src_iview;
radv_image_view_init(&src_iview, cmd_buffer->device,
&(VkImageViewCreateInfo){
.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
.image = radv_image_to_handle(image),
.viewType = radv_meta_get_view_type(image),
.format = load_format,
.subresourceRange =
{
.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
.baseMipLevel = subresource->mipLevel,
.levelCount = 1,
.baseArrayLayer = 0,
.layerCount = subresource->baseArrayLayer + subresource->layerCount,
},
},
0, NULL);
radv_image_view_init(
&src_iview, cmd_buffer->device,
&(VkImageViewCreateInfo){
.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
.image = radv_image_to_handle(image),
.viewType = radv_meta_get_view_type(image),
.format = load_format,
.subresourceRange =
{
.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
.baseMipLevel = subresource->mipLevel,
.levelCount = 1,
.baseArrayLayer = 0,
.layerCount = subresource->baseArrayLayer + vk_image_subresource_layer_count(&image->vk, subresource),
},
},
0, NULL);
VkFormat store_format;
switch (image->vk.format) {
@ -675,22 +678,23 @@ radv_meta_decode_etc(struct radv_cmd_buffer *cmd_buffer, struct radv_image *imag
store_format = VK_FORMAT_R8G8B8A8_UNORM;
}
struct radv_image_view dst_iview;
radv_image_view_init(&dst_iview, cmd_buffer->device,
&(VkImageViewCreateInfo){
.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
.image = radv_image_to_handle(image),
.viewType = radv_meta_get_view_type(image),
.format = store_format,
.subresourceRange =
{
.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT,
.baseMipLevel = subresource->mipLevel,
.levelCount = 1,
.baseArrayLayer = 0,
.layerCount = subresource->baseArrayLayer + subresource->layerCount,
},
},
0, NULL);
radv_image_view_init(
&dst_iview, cmd_buffer->device,
&(VkImageViewCreateInfo){
.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
.image = radv_image_to_handle(image),
.viewType = radv_meta_get_view_type(image),
.format = store_format,
.subresourceRange =
{
.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT,
.baseMipLevel = subresource->mipLevel,
.levelCount = 1,
.baseArrayLayer = 0,
.layerCount = subresource->baseArrayLayer + vk_image_subresource_layer_count(&image->vk, subresource),
},
},
0, NULL);
decode_etc(cmd_buffer, &src_iview, &dst_iview, &(VkOffset3D){offset.x, offset.y, base_slice},
&(VkExtent3D){extent.width, extent.height, slice_count});

View file

@ -350,7 +350,8 @@ radv_meta_resolve_hardware_image(struct radv_cmd_buffer *cmd_buffer, struct radv
*/
assert(region->srcSubresource.aspectMask == VK_IMAGE_ASPECT_COLOR_BIT);
assert(region->dstSubresource.aspectMask == VK_IMAGE_ASPECT_COLOR_BIT);
assert(region->srcSubresource.layerCount == region->dstSubresource.layerCount);
assert(vk_image_subresource_layer_count(&src_image->vk, &region->srcSubresource) ==
vk_image_subresource_layer_count(&dst_image->vk, &region->dstSubresource));
const uint32_t src_base_layer = radv_meta_get_iview_layer(src_image, &region->srcSubresource, &region->srcOffset);
@ -381,7 +382,7 @@ radv_meta_resolve_hardware_image(struct radv_cmd_buffer *cmd_buffer, struct radv
.baseMipLevel = region->dstSubresource.mipLevel,
.levelCount = 1,
.baseArrayLayer = dst_base_layer,
.layerCount = region->dstSubresource.layerCount,
.layerCount = vk_image_subresource_layer_count(&dst_image->vk, &region->dstSubresource),
};
cmd_buffer->state.flush_bits |= radv_init_dcc(cmd_buffer, dst_image, &range, 0xffffffff);
@ -402,7 +403,9 @@ radv_meta_resolve_hardware_image(struct radv_cmd_buffer *cmd_buffer, struct radv
radv_CmdSetScissor(radv_cmd_buffer_to_handle(cmd_buffer), 0, 1, &resolve_area);
for (uint32_t layer = 0; layer < region->srcSubresource.layerCount; ++layer) {
const unsigned src_layer_count = vk_image_subresource_layer_count(&src_image->vk, &region->srcSubresource);
for (uint32_t layer = 0; layer < src_layer_count; ++layer) {
VkResult ret = build_resolve_pipeline(device, fs_key);
if (ret != VK_SUCCESS) {
@ -836,15 +839,13 @@ radv_decompress_resolve_src(struct radv_cmd_buffer *cmd_buffer, struct radv_imag
.oldLayout = src_image_layout,
.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
.image = radv_image_to_handle(src_image),
.subresourceRange =
(VkImageSubresourceRange){
.aspectMask = region->srcSubresource.aspectMask,
.baseMipLevel = region->srcSubresource.mipLevel,
.levelCount = 1,
.baseArrayLayer = src_base_layer,
.layerCount = region->srcSubresource.layerCount,
},
};
.subresourceRange = (VkImageSubresourceRange){
.aspectMask = region->srcSubresource.aspectMask,
.baseMipLevel = region->srcSubresource.mipLevel,
.levelCount = 1,
.baseArrayLayer = src_base_layer,
.layerCount = vk_image_subresource_layer_count(&src_image->vk, &region->srcSubresource),
}};
VkSampleLocationsInfoEXT sample_loc_info;
if (src_image->vk.create_flags & VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT) {

View file

@ -599,7 +599,7 @@ radv_meta_resolve_compute_image(struct radv_cmd_buffer *cmd_buffer, struct radv_
.baseMipLevel = region->dstSubresource.mipLevel,
.levelCount = 1,
.baseArrayLayer = region->dstSubresource.baseArrayLayer,
.layerCount = region->dstSubresource.layerCount,
.layerCount = vk_image_subresource_layer_count(&dst_image->vk, &region->dstSubresource),
});
}
@ -608,7 +608,8 @@ radv_meta_resolve_compute_image(struct radv_cmd_buffer *cmd_buffer, struct radv_
assert(region->srcSubresource.aspectMask == VK_IMAGE_ASPECT_COLOR_BIT);
assert(region->dstSubresource.aspectMask == VK_IMAGE_ASPECT_COLOR_BIT);
assert(region->srcSubresource.layerCount == region->dstSubresource.layerCount);
assert(vk_image_subresource_layer_count(&src_image->vk, &region->srcSubresource) ==
vk_image_subresource_layer_count(&dst_image->vk, &region->dstSubresource));
const uint32_t src_base_layer = radv_meta_get_iview_layer(src_image, &region->srcSubresource, &region->srcOffset);
@ -617,8 +618,9 @@ radv_meta_resolve_compute_image(struct radv_cmd_buffer *cmd_buffer, struct radv_
const struct VkExtent3D extent = vk_image_sanitize_extent(&src_image->vk, region->extent);
const struct VkOffset3D srcOffset = vk_image_sanitize_offset(&src_image->vk, region->srcOffset);
const struct VkOffset3D dstOffset = vk_image_sanitize_offset(&dst_image->vk, region->dstOffset);
const unsigned src_layer_count = vk_image_subresource_layer_count(&src_image->vk, &region->srcSubresource);
for (uint32_t layer = 0; layer < region->srcSubresource.layerCount; ++layer) {
for (uint32_t layer = 0; layer < src_layer_count; ++layer) {
struct radv_image_view src_iview;
radv_image_view_init(&src_iview, cmd_buffer->device,
@ -676,7 +678,7 @@ radv_meta_resolve_compute_image(struct radv_cmd_buffer *cmd_buffer, struct radv_
.baseMipLevel = region->dstSubresource.mipLevel,
.levelCount = 1,
.baseArrayLayer = dst_base_layer,
.layerCount = region->dstSubresource.layerCount,
.layerCount = vk_image_subresource_layer_count(&dst_image->vk, &region->dstSubresource),
};
cmd_buffer->state.flush_bits |= radv_init_dcc(cmd_buffer, dst_image, &range, 0xffffffff);

View file

@ -726,7 +726,8 @@ radv_meta_resolve_fragment_image(struct radv_cmd_buffer *cmd_buffer, struct radv
assert(region->srcSubresource.aspectMask == VK_IMAGE_ASPECT_COLOR_BIT);
assert(region->dstSubresource.aspectMask == VK_IMAGE_ASPECT_COLOR_BIT);
assert(region->srcSubresource.layerCount == region->dstSubresource.layerCount);
assert(vk_image_subresource_layer_count(&src_image->vk, &region->srcSubresource) ==
vk_image_subresource_layer_count(&dst_image->vk, &region->dstSubresource));
const uint32_t src_base_layer = radv_meta_get_iview_layer(src_image, &region->srcSubresource, &region->srcOffset);
@ -751,7 +752,9 @@ radv_meta_resolve_fragment_image(struct radv_cmd_buffer *cmd_buffer, struct radv
radv_CmdSetScissor(radv_cmd_buffer_to_handle(cmd_buffer), 0, 1, &resolve_area);
for (uint32_t layer = 0; layer < region->srcSubresource.layerCount; ++layer) {
const unsigned src_layer_count = vk_image_subresource_layer_count(&src_image->vk, &region->srcSubresource);
for (uint32_t layer = 0; layer < src_layer_count; ++layer) {
struct radv_image_view src_iview;
radv_image_view_init(&src_iview, cmd_buffer->device,