-void
-anv_cmd_buffer_resolve_subpass(struct anv_cmd_buffer *cmd_buffer)
-{
- struct anv_framebuffer *fb = cmd_buffer->state.framebuffer;
- struct anv_subpass *subpass = cmd_buffer->state.subpass;
-
- if (subpass->has_resolve) {
- struct blorp_batch batch;
- blorp_batch_init(&cmd_buffer->device->blorp, &batch, cmd_buffer, 0);
-
- /* We are about to do some MSAA resolves. We need to flush so that the
- * result of writes to the MSAA color attachments show up in the sampler
- * when we blit to the single-sampled resolve target.
- */
- cmd_buffer->state.pending_pipe_bits |=
- ANV_PIPE_TEXTURE_CACHE_INVALIDATE_BIT |
- ANV_PIPE_RENDER_TARGET_CACHE_FLUSH_BIT;
-
- for (uint32_t i = 0; i < subpass->color_count; ++i) {
- uint32_t src_att = subpass->color_attachments[i].attachment;
- uint32_t dst_att = subpass->resolve_attachments[i].attachment;
-
- if (dst_att == VK_ATTACHMENT_UNUSED)
- continue;
-
- assert(src_att < cmd_buffer->state.pass->attachment_count);
- assert(dst_att < cmd_buffer->state.pass->attachment_count);
-
- if (cmd_buffer->state.attachments[dst_att].pending_clear_aspects) {
- /* From the Vulkan 1.0 spec:
- *
- * If the first use of an attachment in a render pass is as a
- * resolve attachment, then the loadOp is effectively ignored
- * as the resolve is guaranteed to overwrite all pixels in the
- * render area.
- */
- cmd_buffer->state.attachments[dst_att].pending_clear_aspects = 0;
- }
-
- struct anv_image_view *src_iview = fb->attachments[src_att];
- struct anv_image_view *dst_iview = fb->attachments[dst_att];
-
- enum isl_aux_usage src_aux_usage =
- cmd_buffer->state.attachments[src_att].aux_usage;
- enum isl_aux_usage dst_aux_usage =
- cmd_buffer->state.attachments[dst_att].aux_usage;
-
- const VkRect2D render_area = cmd_buffer->state.render_area;
-
- assert(src_iview->aspect_mask == VK_IMAGE_ASPECT_COLOR_BIT &&
- dst_iview->aspect_mask == VK_IMAGE_ASPECT_COLOR_BIT);
-
- enum blorp_filter filter;
- if (isl_format_has_int_channel(src_iview->planes[0].isl.format)) {
- filter = BLORP_FILTER_SAMPLE_0;
- } else {
- filter = BLORP_FILTER_AVERAGE;
- }
-
- struct blorp_surf src_surf, dst_surf;
- get_blorp_surf_for_anv_image(cmd_buffer->device, src_iview->image,
- VK_IMAGE_ASPECT_COLOR_BIT,
- ANV_IMAGE_LAYOUT_EXPLICIT_AUX,
- src_aux_usage, &src_surf);
- if (src_aux_usage == ISL_AUX_USAGE_MCS) {
- src_surf.clear_color_addr = anv_to_blorp_address(
- anv_image_get_clear_color_addr(cmd_buffer->device,
- src_iview->image,
- VK_IMAGE_ASPECT_COLOR_BIT));
- }
- get_blorp_surf_for_anv_image(cmd_buffer->device, dst_iview->image,
- VK_IMAGE_ASPECT_COLOR_BIT,
- ANV_IMAGE_LAYOUT_EXPLICIT_AUX,
- dst_aux_usage, &dst_surf);
-
- uint32_t base_src_layer = src_iview->planes[0].isl.base_array_layer;
- uint32_t base_dst_layer = dst_iview->planes[0].isl.base_array_layer;
-
- assert(src_iview->planes[0].isl.array_len >= fb->layers);
- assert(dst_iview->planes[0].isl.array_len >= fb->layers);
-
- anv_cmd_buffer_mark_image_written(cmd_buffer, dst_iview->image,
- VK_IMAGE_ASPECT_COLOR_BIT,
- dst_surf.aux_usage,
- dst_iview->planes[0].isl.base_level,
- base_dst_layer, fb->layers);
-
- assert(!src_iview->image->format->can_ycbcr);
- assert(!dst_iview->image->format->can_ycbcr);
-
- for (uint32_t i = 0; i < fb->layers; i++) {
- resolve_surface(&batch,
- &src_surf,
- src_iview->planes[0].isl.base_level,
- base_src_layer + i,
- &dst_surf,
- dst_iview->planes[0].isl.base_level,
- base_dst_layer + i,
- render_area.offset.x, render_area.offset.y,
- render_area.offset.x, render_area.offset.y,
- render_area.extent.width, render_area.extent.height,
- filter);
- }
- }
-
- blorp_batch_finish(&batch);
- }
-}
-