diff --git a/src/intel/vulkan/anv_blorp.c b/src/intel/vulkan/anv_blorp.c index 67b55a9caff..4fc15bec380 100644 --- a/src/intel/vulkan/anv_blorp.c +++ b/src/intel/vulkan/anv_blorp.c @@ -2111,12 +2111,14 @@ void anv_CmdClearAttachments( anv_blorp_batch_finish(&batch); } -void +static void anv_image_msaa_resolve(struct anv_cmd_buffer *cmd_buffer, const struct anv_image *src_image, + enum isl_format src_format_override, enum isl_aux_usage src_aux_usage, uint32_t src_level, uint32_t src_base_layer, const struct anv_image *dst_image, + enum isl_format dst_format_override, enum isl_aux_usage dst_aux_usage, uint32_t dst_level, uint32_t dst_base_layer, VkImageAspectFlagBits aspect, @@ -2169,9 +2171,9 @@ anv_image_msaa_resolve(struct anv_cmd_buffer *cmd_buffer, for (uint32_t l = 0; l < layer_count; l++) { blorp_blit(&batch, &src_surf, src_level, src_base_layer + l, - ISL_FORMAT_UNSUPPORTED, ISL_SWIZZLE_IDENTITY, + src_format_override, ISL_SWIZZLE_IDENTITY, &dst_surf, dst_level, dst_base_layer + l, - ISL_FORMAT_UNSUPPORTED, ISL_SWIZZLE_IDENTITY, + dst_format_override, ISL_SWIZZLE_IDENTITY, src_x, src_y, src_x + width, src_y + height, dst_x, dst_y, dst_x + width, dst_y + height, filter, false, false); @@ -2180,6 +2182,96 @@ anv_image_msaa_resolve(struct anv_cmd_buffer *cmd_buffer, anv_blorp_batch_finish(&batch); } +static enum blorp_filter +vk_to_blorp_resolve_mode(VkResolveModeFlagBits vk_mode) +{ + switch (vk_mode) { + case VK_RESOLVE_MODE_SAMPLE_ZERO_BIT: + return BLORP_FILTER_SAMPLE_0; + case VK_RESOLVE_MODE_AVERAGE_BIT: + return BLORP_FILTER_AVERAGE; + case VK_RESOLVE_MODE_MIN_BIT: + return BLORP_FILTER_MIN_SAMPLE; + case VK_RESOLVE_MODE_MAX_BIT: + return BLORP_FILTER_MAX_SAMPLE; + default: + return BLORP_FILTER_NONE; + } +} + +void +anv_attachment_msaa_resolve(struct anv_cmd_buffer *cmd_buffer, + const struct anv_attachment *att, + VkImageLayout layout, + VkImageAspectFlagBits aspect) +{ + struct anv_cmd_graphics_state *gfx = &cmd_buffer->state.gfx; + const struct anv_image_view *src_iview = att->iview; + const struct anv_image_view *dst_iview = att->resolve_iview; + + enum isl_aux_usage src_aux_usage = + anv_layout_to_aux_usage(cmd_buffer->device->info, + src_iview->image, aspect, + VK_IMAGE_USAGE_TRANSFER_SRC_BIT, + layout, + cmd_buffer->queue_family->queueFlags); + + enum isl_aux_usage dst_aux_usage = + anv_layout_to_aux_usage(cmd_buffer->device->info, + dst_iview->image, aspect, + VK_IMAGE_USAGE_TRANSFER_DST_BIT, + att->resolve_layout, + cmd_buffer->queue_family->queueFlags); + + enum blorp_filter filter = vk_to_blorp_resolve_mode(att->resolve_mode); + + /* Depth/stencil should not use their view format for resolve because they + * go in pairs. + */ + enum isl_format src_format = ISL_FORMAT_UNSUPPORTED; + enum isl_format dst_format = ISL_FORMAT_UNSUPPORTED; + if (!(aspect & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT))) { + src_format = src_iview->planes[0].isl.format; + dst_format = dst_iview->planes[0].isl.format; + } + + const VkRect2D render_area = gfx->render_area; + if (gfx->view_mask == 0) { + anv_image_msaa_resolve(cmd_buffer, + src_iview->image, src_format, src_aux_usage, + src_iview->planes[0].isl.base_level, + src_iview->planes[0].isl.base_array_layer, + dst_iview->image, dst_format, dst_aux_usage, + dst_iview->planes[0].isl.base_level, + dst_iview->planes[0].isl.base_array_layer, + aspect, + render_area.offset.x, render_area.offset.y, + render_area.offset.x, render_area.offset.y, + render_area.extent.width, + render_area.extent.height, + gfx->layer_count, filter); + } else { + uint32_t res_view_mask = gfx->view_mask; + while (res_view_mask) { + int i = u_bit_scan(&res_view_mask); + + anv_image_msaa_resolve(cmd_buffer, + src_iview->image, src_format, src_aux_usage, + src_iview->planes[0].isl.base_level, + src_iview->planes[0].isl.base_array_layer + i, + dst_iview->image, dst_format, dst_aux_usage, + dst_iview->planes[0].isl.base_level, + dst_iview->planes[0].isl.base_array_layer + i, + aspect, + render_area.offset.x, render_area.offset.y, + render_area.offset.x, render_area.offset.y, + render_area.extent.width, + render_area.extent.height, + 1, filter); + } + } +} + static void resolve_image(struct anv_cmd_buffer *cmd_buffer, struct anv_image *src_image, @@ -2211,10 +2303,10 @@ resolve_image(struct anv_cmd_buffer *cmd_buffer, cmd_buffer->queue_family->queueFlags); anv_image_msaa_resolve(cmd_buffer, - src_image, src_aux_usage, + src_image, ISL_FORMAT_UNSUPPORTED, src_aux_usage, region->srcSubresource.mipLevel, region->srcSubresource.baseArrayLayer, - dst_image, dst_aux_usage, + dst_image, ISL_FORMAT_UNSUPPORTED, dst_aux_usage, region->dstSubresource.mipLevel, region->dstSubresource.baseArrayLayer, (1 << aspect_bit), diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index 4c347986b1d..779b3f481e4 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -5392,19 +5392,10 @@ anv_image_clear_depth_stencil(struct anv_cmd_buffer *cmd_buffer, VkRect2D area, float depth_value, uint8_t stencil_value); void -anv_image_msaa_resolve(struct anv_cmd_buffer *cmd_buffer, - const struct anv_image *src_image, - enum isl_aux_usage src_aux_usage, - uint32_t src_level, uint32_t src_base_layer, - const struct anv_image *dst_image, - enum isl_aux_usage dst_aux_usage, - uint32_t dst_level, uint32_t dst_base_layer, - VkImageAspectFlagBits aspect, - uint32_t src_x, uint32_t src_y, - uint32_t dst_x, uint32_t dst_y, - uint32_t width, uint32_t height, - uint32_t layer_count, - enum blorp_filter filter); +anv_attachment_msaa_resolve(struct anv_cmd_buffer *cmd_buffer, + const struct anv_attachment *att, + VkImageLayout layout, + VkImageAspectFlagBits aspect); void anv_image_hiz_op(struct anv_cmd_buffer *cmd_buffer, const struct anv_image *image, diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c index 85118c914d6..929e6d69cdb 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -5202,86 +5202,6 @@ cmd_buffer_mark_attachment_written(struct anv_cmd_buffer *cmd_buffer, } } -static enum blorp_filter -vk_to_blorp_resolve_mode(VkResolveModeFlagBits vk_mode) -{ - switch (vk_mode) { - case VK_RESOLVE_MODE_SAMPLE_ZERO_BIT: - return BLORP_FILTER_SAMPLE_0; - case VK_RESOLVE_MODE_AVERAGE_BIT: - return BLORP_FILTER_AVERAGE; - case VK_RESOLVE_MODE_MIN_BIT: - return BLORP_FILTER_MIN_SAMPLE; - case VK_RESOLVE_MODE_MAX_BIT: - return BLORP_FILTER_MAX_SAMPLE; - default: - return BLORP_FILTER_NONE; - } -} - -static void -cmd_buffer_resolve_msaa_attachment(struct anv_cmd_buffer *cmd_buffer, - const struct anv_attachment *att, - VkImageLayout layout, - VkImageAspectFlagBits aspect) -{ - struct anv_cmd_graphics_state *gfx = &cmd_buffer->state.gfx; - const struct anv_image_view *src_iview = att->iview; - const struct anv_image_view *dst_iview = att->resolve_iview; - - enum isl_aux_usage src_aux_usage = - anv_layout_to_aux_usage(cmd_buffer->device->info, - src_iview->image, aspect, - VK_IMAGE_USAGE_TRANSFER_SRC_BIT, - layout, - cmd_buffer->queue_family->queueFlags); - - enum isl_aux_usage dst_aux_usage = - anv_layout_to_aux_usage(cmd_buffer->device->info, - dst_iview->image, aspect, - VK_IMAGE_USAGE_TRANSFER_DST_BIT, - att->resolve_layout, - cmd_buffer->queue_family->queueFlags); - - enum blorp_filter filter = vk_to_blorp_resolve_mode(att->resolve_mode); - - const VkRect2D render_area = gfx->render_area; - if (gfx->view_mask == 0) { - anv_image_msaa_resolve(cmd_buffer, - src_iview->image, src_aux_usage, - src_iview->planes[0].isl.base_level, - src_iview->planes[0].isl.base_array_layer, - dst_iview->image, dst_aux_usage, - dst_iview->planes[0].isl.base_level, - dst_iview->planes[0].isl.base_array_layer, - aspect, - render_area.offset.x, render_area.offset.y, - render_area.offset.x, render_area.offset.y, - render_area.extent.width, - render_area.extent.height, - gfx->layer_count, filter); - } else { - uint32_t res_view_mask = gfx->view_mask; - while (res_view_mask) { - int i = u_bit_scan(&res_view_mask); - - anv_image_msaa_resolve(cmd_buffer, - src_iview->image, src_aux_usage, - src_iview->planes[0].isl.base_level, - src_iview->planes[0].isl.base_array_layer + i, - dst_iview->image, dst_aux_usage, - dst_iview->planes[0].isl.base_level, - dst_iview->planes[0].isl.base_array_layer + i, - aspect, - render_area.offset.x, render_area.offset.y, - render_area.offset.x, render_area.offset.y, - render_area.extent.width, - render_area.extent.height, - 1, filter); - } - } -} - void genX(CmdEndRendering)( VkCommandBuffer commandBuffer) { @@ -5342,8 +5262,8 @@ void genX(CmdEndRendering)( (gfx->rendering_flags & VK_RENDERING_SUSPENDING_BIT)) continue; - cmd_buffer_resolve_msaa_attachment(cmd_buffer, att, att->layout, - VK_IMAGE_ASPECT_COLOR_BIT); + anv_attachment_msaa_resolve(cmd_buffer, att, att->layout, + VK_IMAGE_ASPECT_COLOR_BIT); } if (gfx->depth_att.resolve_mode != VK_RESOLVE_MODE_NONE && @@ -5361,9 +5281,9 @@ void genX(CmdEndRendering)( VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, false /* will_full_fast_clear */); - cmd_buffer_resolve_msaa_attachment(cmd_buffer, &gfx->depth_att, - VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, - VK_IMAGE_ASPECT_DEPTH_BIT); + anv_attachment_msaa_resolve(cmd_buffer, &gfx->depth_att, + VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, + VK_IMAGE_ASPECT_DEPTH_BIT); /* Transition the source back to the original layout. This seems a bit * inefficient but, since HiZ resolves aren't destructive, going from @@ -5379,9 +5299,9 @@ void genX(CmdEndRendering)( if (gfx->stencil_att.resolve_mode != VK_RESOLVE_MODE_NONE && !(gfx->rendering_flags & VK_RENDERING_SUSPENDING_BIT)) { - cmd_buffer_resolve_msaa_attachment(cmd_buffer, &gfx->stencil_att, - gfx->stencil_att.layout, - VK_IMAGE_ASPECT_STENCIL_BIT); + anv_attachment_msaa_resolve(cmd_buffer, &gfx->stencil_att, + gfx->stencil_att.layout, + VK_IMAGE_ASPECT_STENCIL_BIT); }