mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-03 00:40:09 +01:00
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:
parent
2ed52ca578
commit
6861c5275b
6 changed files with 80 additions and 69 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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, ®ion->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, ®ion->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, ®ion->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, ®ion->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, ®ion->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, ®ion->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, ®ion->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, ®ion->dstSubresource),
|
||||
};
|
||||
|
||||
uint32_t htile_value = radv_get_htile_initial_value(cmd_buffer->device, dst_image);
|
||||
|
|
|
|||
|
|
@ -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});
|
||||
|
|
|
|||
|
|
@ -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, ®ion->srcSubresource) ==
|
||||
vk_image_subresource_layer_count(&dst_image->vk, ®ion->dstSubresource));
|
||||
|
||||
const uint32_t src_base_layer = radv_meta_get_iview_layer(src_image, ®ion->srcSubresource, ®ion->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, ®ion->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, ®ion->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, ®ion->srcSubresource),
|
||||
}};
|
||||
|
||||
VkSampleLocationsInfoEXT sample_loc_info;
|
||||
if (src_image->vk.create_flags & VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT) {
|
||||
|
|
|
|||
|
|
@ -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, ®ion->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, ®ion->srcSubresource) ==
|
||||
vk_image_subresource_layer_count(&dst_image->vk, ®ion->dstSubresource));
|
||||
|
||||
const uint32_t src_base_layer = radv_meta_get_iview_layer(src_image, ®ion->srcSubresource, ®ion->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, ®ion->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, ®ion->dstSubresource),
|
||||
};
|
||||
|
||||
cmd_buffer->state.flush_bits |= radv_init_dcc(cmd_buffer, dst_image, &range, 0xffffffff);
|
||||
|
|
|
|||
|
|
@ -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, ®ion->srcSubresource) ==
|
||||
vk_image_subresource_layer_count(&dst_image->vk, ®ion->dstSubresource));
|
||||
|
||||
const uint32_t src_base_layer = radv_meta_get_iview_layer(src_image, ®ion->srcSubresource, ®ion->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, ®ion->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,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue