From 43d7d97b13a6fd70aae410e7d168200269b1a7eb Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Fri, 28 Nov 2025 08:54:46 +0100 Subject: [PATCH] radv/meta: inject image view usage info This will be used to initialize color/depth-stencil descriptors earlier when the image view is created. Signed-off-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/meta/radv_meta_astc_decode.c | 19 ++++++++++---- src/amd/vulkan/meta/radv_meta_blit.c | 14 +++++++++++ src/amd/vulkan/meta/radv_meta_blit2d.c | 26 +++++++++++++++----- src/amd/vulkan/meta/radv_meta_bufimage.c | 18 +++++++++----- src/amd/vulkan/meta/radv_meta_clear.c | 19 ++++++++++++++ src/amd/vulkan/meta/radv_meta_decompress.c | 19 ++++++++++++++ src/amd/vulkan/meta/radv_meta_etc_decode.c | 14 +++++++++++ src/amd/vulkan/meta/radv_meta_fast_clear.c | 20 +++++++++++++++ src/amd/vulkan/meta/radv_meta_fmask_copy.c | 12 +++++++++ src/amd/vulkan/meta/radv_meta_fmask_expand.c | 6 +++++ src/amd/vulkan/meta/radv_meta_resolve.c | 12 +++++++++ src/amd/vulkan/meta/radv_meta_resolve_cs.c | 23 +++++++++++++++++ src/amd/vulkan/meta/radv_meta_resolve_fs.c | 24 ++++++++++++++++++ 13 files changed, 209 insertions(+), 17 deletions(-) diff --git a/src/amd/vulkan/meta/radv_meta_astc_decode.c b/src/amd/vulkan/meta/radv_meta_astc_decode.c index 02fc76cc3ea..e7873afbbf7 100644 --- a/src/amd/vulkan/meta/radv_meta_astc_decode.c +++ b/src/amd/vulkan/meta/radv_meta_astc_decode.c @@ -73,10 +73,17 @@ get_view_type(const struct radv_image *image) static void image_view_init(struct radv_device *device, struct radv_image *image, VkFormat format, VkImageAspectFlags aspectMask, - uint32_t baseMipLevel, uint32_t baseArrayLayer, uint32_t layerCount, struct radv_image_view *iview) + VkImageUsageFlags usage, uint32_t baseMipLevel, uint32_t baseArrayLayer, uint32_t layerCount, + struct radv_image_view *iview) { + const VkImageViewUsageCreateInfo iview_usage_info = { + .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO, + .usage = usage, + }; + VkImageViewCreateInfo iview_create_info = { .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, + .pNext = &iview_usage_info, .flags = VK_IMAGE_VIEW_CREATE_DRIVER_INTERNAL_BIT_MESA, .image = radv_image_to_handle(image), .viewType = get_view_type(image), @@ -111,10 +118,12 @@ radv_meta_decode_astc(struct radv_cmd_buffer *cmd_buffer, struct radv_image *ima offset = vk_image_sanitize_offset(&image->vk, offset); struct radv_image_view src_iview, dst_iview; - image_view_init(device, image, VK_FORMAT_R32G32B32A32_UINT, VK_IMAGE_ASPECT_COLOR_BIT, subresource->mipLevel, - subresource->baseArrayLayer, vk_image_subresource_layer_count(&image->vk, subresource), &src_iview); - image_view_init(device, image, VK_FORMAT_R8G8B8A8_UINT, VK_IMAGE_ASPECT_PLANE_1_BIT, subresource->mipLevel, - subresource->baseArrayLayer, vk_image_subresource_layer_count(&image->vk, subresource), &dst_iview); + image_view_init(device, image, VK_FORMAT_R32G32B32A32_UINT, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_USAGE_SAMPLED_BIT, + subresource->mipLevel, subresource->baseArrayLayer, + vk_image_subresource_layer_count(&image->vk, subresource), &src_iview); + image_view_init(device, image, VK_FORMAT_R8G8B8A8_UINT, VK_IMAGE_ASPECT_PLANE_1_BIT, VK_IMAGE_USAGE_STORAGE_BIT, + subresource->mipLevel, subresource->baseArrayLayer, + vk_image_subresource_layer_count(&image->vk, subresource), &dst_iview); VkExtent3D extent_copy = { .width = extent.width, diff --git a/src/amd/vulkan/meta/radv_meta_blit.c b/src/amd/vulkan/meta/radv_meta_blit.c index b36bbf51180..08a9bc0289a 100644 --- a/src/amd/vulkan/meta/radv_meta_blit.c +++ b/src/amd/vulkan/meta/radv_meta_blit.c @@ -488,9 +488,16 @@ blit_image(struct radv_cmd_buffer *cmd_buffer, struct radv_image *src_image, VkI /* 3D images have just 1 layer */ const uint32_t src_array_slice = src_image->vk.image_type == VK_IMAGE_TYPE_3D ? 0 : src_start + i; + const VkImageViewUsageCreateInfo dst_iview_usage_info = { + .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO, + .usage = vk_format_is_color(dst_image->vk.format) ? VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT + : VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, + }; + radv_image_view_init(&dst_iview, device, &(VkImageViewCreateInfo){ .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, + .pNext = &dst_iview_usage_info, .flags = VK_IMAGE_VIEW_CREATE_DRIVER_INTERNAL_BIT_MESA, .image = radv_image_to_handle(dst_image), .viewType = radv_meta_get_view_type(dst_image), @@ -502,9 +509,16 @@ blit_image(struct radv_cmd_buffer *cmd_buffer, struct radv_image *src_image, VkI .layerCount = 1}, }, NULL); + + const VkImageViewUsageCreateInfo src_iview_usage_info = { + .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO, + .usage = VK_IMAGE_USAGE_SAMPLED_BIT, + }; + radv_image_view_init(&src_iview, device, &(VkImageViewCreateInfo){ .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, + .pNext = &src_iview_usage_info, .flags = VK_IMAGE_VIEW_CREATE_DRIVER_INTERNAL_BIT_MESA, .image = radv_image_to_handle(src_image), .viewType = radv_meta_get_view_type(src_image), diff --git a/src/amd/vulkan/meta/radv_meta_blit2d.c b/src/amd/vulkan/meta/radv_meta_blit2d.c index 04c7622b30f..6c84a5cfc54 100644 --- a/src/amd/vulkan/meta/radv_meta_blit2d.c +++ b/src/amd/vulkan/meta/radv_meta_blit2d.c @@ -36,9 +36,10 @@ static VkResult get_depth_stencil_pipeline(struct radv_device *device, enum blit static void create_iview(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_blit2d_surf *surf, struct radv_image_view *iview, - VkFormat depth_format, VkImageAspectFlagBits aspects) + VkFormat depth_format, VkImageAspectFlagBits aspects, bool is_dst) { struct radv_device *device = radv_cmd_buffer_device(cmd_buffer); + VkImageUsageFlags usage; VkFormat format; if (depth_format) @@ -46,9 +47,22 @@ create_iview(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_blit2d_surf *s else format = surf->format; + if (is_dst) { + usage = (vk_format_is_color(format) ? VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT + : VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT); + } else { + usage = VK_IMAGE_USAGE_SAMPLED_BIT; + } + + const VkImageViewUsageCreateInfo iview_usage_info = { + .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO, + .usage = usage, + }; + radv_image_view_init(iview, device, &(VkImageViewCreateInfo){ .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, + .pNext = &iview_usage_info, .flags = VK_IMAGE_VIEW_CREATE_DRIVER_INTERNAL_BIT_MESA, .image = radv_image_to_handle(surf->image), .viewType = radv_meta_get_view_type(surf->image), @@ -96,7 +110,7 @@ radv_gfx_copy_memory_to_image(struct radv_cmd_buffer *cmd_buffer, struct radv_me } struct radv_image_view dst_iview; - create_iview(cmd_buffer, dst, &dst_iview, format, dst->aspect_mask); + create_iview(cmd_buffer, dst, &dst_iview, format, dst->aspect_mask, true); const VkRenderingAttachmentInfo att_info = { .sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO, @@ -268,7 +282,7 @@ radv_gfx_copy_image(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_blit2d_ } struct radv_image_view dst_iview; - create_iview(cmd_buffer, dst, &dst_iview, dst_format, dst->aspect_mask); + create_iview(cmd_buffer, dst, &dst_iview, dst_format, dst->aspect_mask, true); const VkRenderingAttachmentInfo att_info = { .sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO, @@ -375,8 +389,8 @@ radv_gfx_copy_image(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_blit2d_ VkFormat depth_format = vk_format_depth_only(dst->image->vk.format); VkFormat stencil_format = vk_format_stencil_only(dst->image->vk.format); - create_iview(cmd_buffer, src, &src_iview_depth, depth_format, VK_IMAGE_ASPECT_DEPTH_BIT); - create_iview(cmd_buffer, src, &src_iview_stencil, stencil_format, VK_IMAGE_ASPECT_STENCIL_BIT); + create_iview(cmd_buffer, src, &src_iview_depth, depth_format, VK_IMAGE_ASPECT_DEPTH_BIT, false); + create_iview(cmd_buffer, src, &src_iview_stencil, stencil_format, VK_IMAGE_ASPECT_STENCIL_BIT, false); radv_meta_bind_descriptors( cmd_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, layout, 2, @@ -396,7 +410,7 @@ radv_gfx_copy_image(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_blit2d_ .imageLayout = VK_IMAGE_LAYOUT_GENERAL}, }}}); } else { - create_iview(cmd_buffer, src, &src_iview, src_format, src->aspect_mask); + create_iview(cmd_buffer, src, &src_iview, src_format, src->aspect_mask, false); radv_meta_bind_descriptors(cmd_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, layout, 1, (VkDescriptorGetInfoEXT[]){{.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_GET_INFO_EXT, diff --git a/src/amd/vulkan/meta/radv_meta_bufimage.c b/src/amd/vulkan/meta/radv_meta_bufimage.c index f9bb2319d95..2c67dae2792 100644 --- a/src/amd/vulkan/meta/radv_meta_bufimage.c +++ b/src/amd/vulkan/meta/radv_meta_bufimage.c @@ -559,16 +559,22 @@ get_cleari_r32g32b32_pipeline(struct radv_device *device, VkPipeline *pipeline_o static void create_iview(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_blit2d_surf *surf, struct radv_image_view *iview, - VkFormat format, VkImageAspectFlagBits aspects) + VkFormat format, VkImageAspectFlagBits aspects, VkImageUsageFlags usage) { struct radv_device *device = radv_cmd_buffer_device(cmd_buffer); if (format == VK_FORMAT_UNDEFINED) format = surf->format; + const VkImageViewUsageCreateInfo iview_usage_info = { + .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO, + .usage = usage, + }; + radv_image_view_init(iview, device, &(VkImageViewCreateInfo){ .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, + .pNext = &iview_usage_info, .flags = VK_IMAGE_VIEW_CREATE_DRIVER_INTERNAL_BIT_MESA, .image = radv_image_to_handle(surf->image), .viewType = radv_meta_get_view_type(surf->image), @@ -705,7 +711,7 @@ radv_meta_image_to_buffer(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_b return; } - create_iview(cmd_buffer, src, &src_view, VK_FORMAT_UNDEFINED, src->aspect_mask); + create_iview(cmd_buffer, src, &src_view, VK_FORMAT_UNDEFINED, src->aspect_mask, VK_IMAGE_USAGE_SAMPLED_BIT); radv_meta_bind_descriptors( cmd_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, layout, 2, @@ -840,7 +846,7 @@ radv_meta_buffer_to_image_cs(struct radv_cmd_buffer *cmd_buffer, struct radv_met return; } - create_iview(cmd_buffer, dst, &dst_view, VK_FORMAT_UNDEFINED, dst->aspect_mask); + create_iview(cmd_buffer, dst, &dst_view, VK_FORMAT_UNDEFINED, dst->aspect_mask, VK_IMAGE_USAGE_STORAGE_BIT); radv_meta_bind_descriptors( cmd_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, layout, 2, @@ -1016,10 +1022,10 @@ radv_meta_image_to_image_cs(struct radv_cmd_buffer *cmd_buffer, struct radv_meta create_iview(cmd_buffer, src, &src_view, (src_aspect_mask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) ? depth_format : 0, - src_aspect_mask); + src_aspect_mask, VK_IMAGE_USAGE_SAMPLED_BIT); create_iview(cmd_buffer, dst, &dst_view, dst_aspect_mask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT) ? depth_format : 0, - dst_aspect_mask); + dst_aspect_mask, VK_IMAGE_USAGE_STORAGE_BIT); radv_meta_bind_descriptors(cmd_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, layout, 2, (VkDescriptorGetInfoEXT[]){{.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_GET_INFO_EXT, @@ -1144,7 +1150,7 @@ radv_meta_clear_image_cs(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_bl return; } - create_iview(cmd_buffer, dst, &dst_iview, VK_FORMAT_UNDEFINED, dst->aspect_mask); + create_iview(cmd_buffer, dst, &dst_iview, VK_FORMAT_UNDEFINED, dst->aspect_mask, VK_IMAGE_USAGE_STORAGE_BIT); radv_meta_bind_descriptors(cmd_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, layout, 1, (VkDescriptorGetInfoEXT[]){ diff --git a/src/amd/vulkan/meta/radv_meta_clear.c b/src/amd/vulkan/meta/radv_meta_clear.c index 78d86aa1214..c9e08d9c7ed 100644 --- a/src/amd/vulkan/meta/radv_meta_clear.c +++ b/src/amd/vulkan/meta/radv_meta_clear.c @@ -1067,9 +1067,15 @@ radv_clear_dcc_comp_to_single(struct radv_cmd_buffer *cmd_buffer, struct radv_im width = u_minify(image->vk.extent.width, range->baseMipLevel + l); height = u_minify(image->vk.extent.height, range->baseMipLevel + l); + const VkImageViewUsageCreateInfo iview_usage_info = { + .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO, + .usage = VK_IMAGE_USAGE_STORAGE_BIT, + }; + radv_image_view_init(&iview, device, &(VkImageViewCreateInfo){ .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, + .pNext = &iview_usage_info, .flags = VK_IMAGE_VIEW_CREATE_DRIVER_INTERNAL_BIT_MESA, .image = radv_image_to_handle(image), .viewType = VK_IMAGE_VIEW_TYPE_2D, @@ -1729,9 +1735,16 @@ radv_clear_image_layer(struct radv_cmd_buffer *cmd_buffer, struct radv_image *im uint32_t width = u_minify(image->vk.extent.width, range->baseMipLevel + level); uint32_t height = u_minify(image->vk.extent.height, range->baseMipLevel + level); + const VkImageViewUsageCreateInfo iview_usage_info = { + .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO, + .usage = (vk_format_is_color(format) ? VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT + : VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT), + }; + radv_image_view_init(&iview, device, &(VkImageViewCreateInfo){ .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, + .pNext = &iview_usage_info, .flags = VK_IMAGE_VIEW_CREATE_DRIVER_INTERNAL_BIT_MESA, .image = radv_image_to_handle(image), .viewType = radv_meta_get_view_type(image), @@ -1812,9 +1825,15 @@ radv_fast_clear_range(struct radv_cmd_buffer *cmd_buffer, struct radv_image *ima struct radv_image_view iview; bool fast_cleared = false; + const VkImageViewUsageCreateInfo iview_usage_info = { + .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO, + .usage = VK_IMAGE_USAGE_STORAGE_BIT, + }; + radv_image_view_init(&iview, device, &(VkImageViewCreateInfo){ .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, + .pNext = &iview_usage_info, .flags = VK_IMAGE_VIEW_CREATE_DRIVER_INTERNAL_BIT_MESA, .image = radv_image_to_handle(image), .viewType = radv_meta_get_view_type(image), diff --git a/src/amd/vulkan/meta/radv_meta_decompress.c b/src/amd/vulkan/meta/radv_meta_decompress.c index 4fbe908654b..b2c2b44c07a 100644 --- a/src/amd/vulkan/meta/radv_meta_decompress.c +++ b/src/amd/vulkan/meta/radv_meta_decompress.c @@ -162,9 +162,15 @@ radv_process_depth_image_layer(struct radv_cmd_buffer *cmd_buffer, struct radv_i width = u_minify(image->vk.extent.width, range->baseMipLevel + level); height = u_minify(image->vk.extent.height, range->baseMipLevel + level); + const VkImageViewUsageCreateInfo iview_usage_info = { + .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO, + .usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, + }; + radv_image_view_init(&iview, device, &(VkImageViewCreateInfo){ .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, + .pNext = &iview_usage_info, .flags = VK_IMAGE_VIEW_CREATE_DRIVER_INTERNAL_BIT_MESA, .image = radv_image_to_handle(image), .viewType = radv_meta_get_view_type(image), @@ -381,9 +387,15 @@ radv_expand_depth_stencil_compute(struct radv_cmd_buffer *cmd_buffer, struct rad height = u_minify(image->vk.extent.height, subresourceRange->baseMipLevel + l); for (uint32_t s = 0; s < vk_image_subresource_layer_count(&image->vk, subresourceRange); s++) { + const VkImageViewUsageCreateInfo src_iview_usage_info = { + .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO, + .usage = VK_IMAGE_USAGE_STORAGE_BIT, + }; + radv_image_view_init(&load_iview, device, &(VkImageViewCreateInfo){ .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, + .pNext = &src_iview_usage_info, .flags = VK_IMAGE_VIEW_CREATE_DRIVER_INTERNAL_BIT_MESA, .image = radv_image_to_handle(image), .viewType = VK_IMAGE_VIEW_TYPE_2D, @@ -395,9 +407,16 @@ radv_expand_depth_stencil_compute(struct radv_cmd_buffer *cmd_buffer, struct rad .layerCount = 1}, }, &(struct radv_image_view_extra_create_info){.enable_compression = true}); + + const VkImageViewUsageCreateInfo dst_iview_usage_info = { + .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO, + .usage = VK_IMAGE_USAGE_STORAGE_BIT, + }; + radv_image_view_init(&store_iview, device, &(VkImageViewCreateInfo){ .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, + .pNext = &dst_iview_usage_info, .flags = VK_IMAGE_VIEW_CREATE_DRIVER_INTERNAL_BIT_MESA, .image = radv_image_to_handle(image), .viewType = VK_IMAGE_VIEW_TYPE_2D, diff --git a/src/amd/vulkan/meta/radv_meta_etc_decode.c b/src/amd/vulkan/meta/radv_meta_etc_decode.c index ebc1a29df91..78f624ac30b 100644 --- a/src/amd/vulkan/meta/radv_meta_etc_decode.c +++ b/src/amd/vulkan/meta/radv_meta_etc_decode.c @@ -92,11 +92,18 @@ radv_meta_decode_etc(struct radv_cmd_buffer *cmd_buffer, struct radv_image *imag offset = vk_image_sanitize_offset(&image->vk, offset); VkFormat load_format = vk_texcompress_etc2_load_format(image->vk.format); + + const VkImageViewUsageCreateInfo src_iview_usage_info = { + .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO, + .usage = VK_IMAGE_USAGE_SAMPLED_BIT, + }; + struct radv_image_view src_iview; radv_image_view_init( &src_iview, device, &(VkImageViewCreateInfo){ .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, + .pNext = &src_iview_usage_info, .flags = VK_IMAGE_VIEW_CREATE_DRIVER_INTERNAL_BIT_MESA, .image = radv_image_to_handle(image), .viewType = vk_texcompress_etc2_image_view_type(image->vk.image_type), @@ -113,11 +120,18 @@ radv_meta_decode_etc(struct radv_cmd_buffer *cmd_buffer, struct radv_image *imag NULL); VkFormat store_format = vk_texcompress_etc2_store_format(image->vk.format); + + const VkImageViewUsageCreateInfo dst_iview_usage_info = { + .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO, + .usage = VK_IMAGE_USAGE_STORAGE_BIT, + }; + struct radv_image_view dst_iview; radv_image_view_init( &dst_iview, device, &(VkImageViewCreateInfo){ .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, + .pNext = &dst_iview_usage_info, .flags = VK_IMAGE_VIEW_CREATE_DRIVER_INTERNAL_BIT_MESA, .image = radv_image_to_handle(image), .viewType = vk_texcompress_etc2_image_view_type(image->vk.image_type), diff --git a/src/amd/vulkan/meta/radv_meta_fast_clear.c b/src/amd/vulkan/meta/radv_meta_fast_clear.c index 6fc807cf495..b4462fa2f7c 100644 --- a/src/amd/vulkan/meta/radv_meta_fast_clear.c +++ b/src/amd/vulkan/meta/radv_meta_fast_clear.c @@ -252,10 +252,16 @@ radv_process_color_image_layer(struct radv_cmd_buffer *cmd_buffer, struct radv_i */ const bool disable_tc_compat_cmask_mrt = op == FMASK_DECOMPRESS || op == DCC_DECOMPRESS; + const VkImageViewUsageCreateInfo iview_usage_info = { + .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO, + .usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, + }; + radv_image_view_init( &iview, device, &(VkImageViewCreateInfo){ .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, + .pNext = &iview_usage_info, .flags = VK_IMAGE_VIEW_CREATE_DRIVER_INTERNAL_BIT_MESA, .image = radv_image_to_handle(image), .viewType = radv_meta_get_view_type(image), @@ -488,9 +494,16 @@ radv_decompress_dcc_compute(struct radv_cmd_buffer *cmd_buffer, struct radv_imag height = u_minify(image->vk.extent.height, subresourceRange->baseMipLevel + l); for (uint32_t s = 0; s < vk_image_subresource_layer_count(&image->vk, subresourceRange); s++) { + + const VkImageViewUsageCreateInfo load_iview_usage_info = { + .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO, + .usage = VK_IMAGE_USAGE_STORAGE_BIT, + }; + radv_image_view_init(&load_iview, device, &(VkImageViewCreateInfo){ .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, + .pNext = &load_iview_usage_info, .flags = VK_IMAGE_VIEW_CREATE_DRIVER_INTERNAL_BIT_MESA, .image = radv_image_to_handle(image), .viewType = VK_IMAGE_VIEW_TYPE_2D, @@ -502,9 +515,16 @@ radv_decompress_dcc_compute(struct radv_cmd_buffer *cmd_buffer, struct radv_imag .layerCount = 1}, }, &(struct radv_image_view_extra_create_info){.enable_compression = true}); + + const VkImageViewUsageCreateInfo store_iview_usage_info = { + .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO, + .usage = VK_IMAGE_USAGE_STORAGE_BIT, + }; + radv_image_view_init(&store_iview, device, &(VkImageViewCreateInfo){ .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, + .pNext = &store_iview_usage_info, .flags = VK_IMAGE_VIEW_CREATE_DRIVER_INTERNAL_BIT_MESA, .image = radv_image_to_handle(image), .viewType = VK_IMAGE_VIEW_TYPE_2D, diff --git a/src/amd/vulkan/meta/radv_meta_fmask_copy.c b/src/amd/vulkan/meta/radv_meta_fmask_copy.c index 48fb43a5929..fca1e0ecf0b 100644 --- a/src/amd/vulkan/meta/radv_meta_fmask_copy.c +++ b/src/amd/vulkan/meta/radv_meta_fmask_copy.c @@ -179,9 +179,15 @@ radv_fmask_copy(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_blit2d_surf radv_CmdBindPipeline(radv_cmd_buffer_to_handle(cmd_buffer), VK_PIPELINE_BIND_POINT_COMPUTE, pipeline); + const VkImageViewUsageCreateInfo src_iview_usage_info = { + .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO, + .usage = VK_IMAGE_USAGE_SAMPLED_BIT, + }; + radv_image_view_init(&src_iview, device, &(VkImageViewCreateInfo){ .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, + .pNext = &src_iview_usage_info, .flags = VK_IMAGE_VIEW_CREATE_DRIVER_INTERNAL_BIT_MESA, .image = radv_image_to_handle(src->image), .viewType = radv_meta_get_view_type(src->image), @@ -197,9 +203,15 @@ radv_fmask_copy(struct radv_cmd_buffer *cmd_buffer, struct radv_meta_blit2d_surf }, NULL); + const VkImageViewUsageCreateInfo dst_iview_usage_info = { + .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO, + .usage = VK_IMAGE_USAGE_STORAGE_BIT, + }; + radv_image_view_init(&dst_iview, device, &(VkImageViewCreateInfo){ .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, + .pNext = &dst_iview_usage_info, .flags = VK_IMAGE_VIEW_CREATE_DRIVER_INTERNAL_BIT_MESA, .image = radv_image_to_handle(dst->image), .viewType = radv_meta_get_view_type(dst->image), diff --git a/src/amd/vulkan/meta/radv_meta_fmask_expand.c b/src/amd/vulkan/meta/radv_meta_fmask_expand.c index 2915083897a..7722ed41dda 100644 --- a/src/amd/vulkan/meta/radv_meta_fmask_expand.c +++ b/src/amd/vulkan/meta/radv_meta_fmask_expand.c @@ -117,9 +117,15 @@ radv_process_color_image(struct radv_cmd_buffer *cmd_buffer, struct radv_image * radv_CmdBindPipeline(radv_cmd_buffer_to_handle(cmd_buffer), VK_PIPELINE_BIND_POINT_COMPUTE, pipeline); + const VkImageViewUsageCreateInfo view_usage_info = { + .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO, + .usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT, + }; + radv_image_view_init(&iview, device, &(VkImageViewCreateInfo){ .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, + .pNext = &view_usage_info, .flags = VK_IMAGE_VIEW_CREATE_DRIVER_INTERNAL_BIT_MESA, .image = radv_image_to_handle(image), .viewType = radv_meta_get_view_type(image), diff --git a/src/amd/vulkan/meta/radv_meta_resolve.c b/src/amd/vulkan/meta/radv_meta_resolve.c index 6a3df083519..87dee7bdd17 100644 --- a/src/amd/vulkan/meta/radv_meta_resolve.c +++ b/src/amd/vulkan/meta/radv_meta_resolve.c @@ -297,10 +297,16 @@ 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); + const VkImageViewUsageCreateInfo src_iview_usage_info = { + .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO, + .usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, + }; + struct radv_image_view src_iview; radv_image_view_init(&src_iview, device, &(VkImageViewCreateInfo){ .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, + .pNext = &src_iview_usage_info, .flags = VK_IMAGE_VIEW_CREATE_DRIVER_INTERNAL_BIT_MESA, .image = radv_image_to_handle(src_image), .viewType = VK_IMAGE_VIEW_TYPE_2D, @@ -316,10 +322,16 @@ radv_meta_resolve_hardware_image(struct radv_cmd_buffer *cmd_buffer, struct radv }, NULL); + const VkImageViewUsageCreateInfo dst_iview_usage_info = { + .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO, + .usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, + }; + struct radv_image_view dst_iview; radv_image_view_init(&dst_iview, device, &(VkImageViewCreateInfo){ .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, + .pNext = &dst_iview_usage_info, .flags = VK_IMAGE_VIEW_CREATE_DRIVER_INTERNAL_BIT_MESA, .image = radv_image_to_handle(dst_image), .viewType = radv_meta_get_view_type(dst_image), diff --git a/src/amd/vulkan/meta/radv_meta_resolve_cs.c b/src/amd/vulkan/meta/radv_meta_resolve_cs.c index 718bc3201d4..72328389798 100644 --- a/src/amd/vulkan/meta/radv_meta_resolve_cs.c +++ b/src/amd/vulkan/meta/radv_meta_resolve_cs.c @@ -288,11 +288,16 @@ radv_meta_resolve_compute_image(struct radv_cmd_buffer *cmd_buffer, struct radv_ 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) { + const VkImageViewUsageCreateInfo src_iview_usage_info = { + .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO, + .usage = VK_IMAGE_USAGE_SAMPLED_BIT, + }; struct radv_image_view src_iview; radv_image_view_init(&src_iview, device, &(VkImageViewCreateInfo){ .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, + .pNext = &src_iview_usage_info, .flags = VK_IMAGE_VIEW_CREATE_DRIVER_INTERNAL_BIT_MESA, .image = radv_image_to_handle(src_image), .viewType = VK_IMAGE_VIEW_TYPE_2D, @@ -308,10 +313,16 @@ radv_meta_resolve_compute_image(struct radv_cmd_buffer *cmd_buffer, struct radv_ }, NULL); + const VkImageViewUsageCreateInfo dst_iview_usage_info = { + .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO, + .usage = VK_IMAGE_USAGE_STORAGE_BIT, + }; + struct radv_image_view dst_iview; radv_image_view_init(&dst_iview, device, &(VkImageViewCreateInfo){ .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, + .pNext = &dst_iview_usage_info, .flags = VK_IMAGE_VIEW_CREATE_DRIVER_INTERNAL_BIT_MESA, .image = radv_image_to_handle(dst_image), .viewType = radv_meta_get_view_type(dst_image), @@ -377,10 +388,16 @@ radv_meta_resolve_depth_stencil_cs(struct radv_cmd_buffer *cmd_buffer, struct ra radv_meta_save(&saved_state, cmd_buffer, RADV_META_SAVE_COMPUTE_PIPELINE | RADV_META_SAVE_DESCRIPTORS | RADV_META_SAVE_CONSTANTS); + const VkImageViewUsageCreateInfo src_iview_usage_info = { + .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO, + .usage = VK_IMAGE_USAGE_SAMPLED_BIT, + }; + struct radv_image_view src_iview; radv_image_view_init(&src_iview, device, &(VkImageViewCreateInfo){ .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, + .pNext = &src_iview_usage_info, .flags = VK_IMAGE_VIEW_CREATE_DRIVER_INTERNAL_BIT_MESA, .image = radv_image_to_handle(src_image), .viewType = VK_IMAGE_VIEW_TYPE_2D, @@ -396,10 +413,16 @@ radv_meta_resolve_depth_stencil_cs(struct radv_cmd_buffer *cmd_buffer, struct ra }, NULL); + const VkImageViewUsageCreateInfo dst_iview_usage_info = { + .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO, + .usage = VK_IMAGE_USAGE_STORAGE_BIT, + }; + struct radv_image_view dst_iview; radv_image_view_init(&dst_iview, device, &(VkImageViewCreateInfo){ .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, + .pNext = &dst_iview_usage_info, .flags = VK_IMAGE_VIEW_CREATE_DRIVER_INTERNAL_BIT_MESA, .image = radv_image_to_handle(dst_image), .viewType = radv_meta_get_view_type(dst_image), diff --git a/src/amd/vulkan/meta/radv_meta_resolve_fs.c b/src/amd/vulkan/meta/radv_meta_resolve_fs.c index ed2e712cd81..c07aa8193b9 100644 --- a/src/amd/vulkan/meta/radv_meta_resolve_fs.c +++ b/src/amd/vulkan/meta/radv_meta_resolve_fs.c @@ -467,10 +467,16 @@ 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); + const VkImageViewUsageCreateInfo src_iview_usage_info = { + .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO, + .usage = VK_IMAGE_USAGE_SAMPLED_BIT, + }; + struct radv_image_view src_iview; radv_image_view_init(&src_iview, device, &(VkImageViewCreateInfo){ .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, + .pNext = &src_iview_usage_info, .flags = VK_IMAGE_VIEW_CREATE_DRIVER_INTERNAL_BIT_MESA, .image = radv_image_to_handle(src_image), .viewType = VK_IMAGE_VIEW_TYPE_2D, @@ -486,10 +492,16 @@ radv_meta_resolve_fragment_image(struct radv_cmd_buffer *cmd_buffer, struct radv }, NULL); + const VkImageViewUsageCreateInfo dst_iview_usage_info = { + .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO, + .usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, + }; + struct radv_image_view dst_iview; radv_image_view_init(&dst_iview, device, &(VkImageViewCreateInfo){ .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, + .pNext = &dst_iview_usage_info, .flags = VK_IMAGE_VIEW_CREATE_DRIVER_INTERNAL_BIT_MESA, .image = radv_image_to_handle(dst_image), .viewType = radv_meta_get_view_type(dst_image), @@ -564,10 +576,16 @@ radv_meta_resolve_depth_stencil_fs(struct radv_cmd_buffer *cmd_buffer, struct ra radv_meta_save(&saved_state, cmd_buffer, RADV_META_SAVE_GRAPHICS_PIPELINE | RADV_META_SAVE_DESCRIPTORS | RADV_META_SAVE_RENDER); + const VkImageViewUsageCreateInfo src_iview_usage_info = { + .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO, + .usage = VK_IMAGE_USAGE_SAMPLED_BIT, + }; + struct radv_image_view src_iview; radv_image_view_init(&src_iview, device, &(VkImageViewCreateInfo){ .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, + .pNext = &src_iview_usage_info, .flags = VK_IMAGE_VIEW_CREATE_DRIVER_INTERNAL_BIT_MESA, .image = radv_image_to_handle(src_image), .viewType = VK_IMAGE_VIEW_TYPE_2D, @@ -583,10 +601,16 @@ radv_meta_resolve_depth_stencil_fs(struct radv_cmd_buffer *cmd_buffer, struct ra }, NULL); + const VkImageViewUsageCreateInfo dst_iview_usage_info = { + .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO, + .usage = dst_image->vk.usage | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, + }; + struct radv_image_view dst_iview; radv_image_view_init(&dst_iview, device, &(VkImageViewCreateInfo){ .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, + .pNext = &dst_iview_usage_info, .flags = VK_IMAGE_VIEW_CREATE_DRIVER_INTERNAL_BIT_MESA, .image = radv_image_to_handle(dst_image), .viewType = radv_meta_get_view_type(dst_image),