.preserveAttachmentCount = 0,
.pPreserveAttachments = NULL,
},
- .dependencyCount = 0,
+ .dependencyCount = 2,
+ .pDependencies = (VkSubpassDependency[]) {
+ {
+ .srcSubpass = VK_SUBPASS_EXTERNAL,
+ .dstSubpass = 0,
+ .srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+ .dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
+ .srcAccessMask = 0,
+ .dstAccessMask = 0,
+ .dependencyFlags = 0
+ },
+ {
+ .srcSubpass = 0,
+ .dstSubpass = VK_SUBPASS_EXTERNAL,
+ .srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+ .dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
+ .srcAccessMask = 0,
+ .dstAccessMask = 0,
+ .dependencyFlags = 0
+ }
+ },
},
alloc,
pass);
RESOLVE_FRAGMENT,
};
-static void radv_pick_resolve_method_images(struct radv_image *src_image,
+static void radv_pick_resolve_method_images(struct radv_device *device,
+ struct radv_image *src_image,
VkFormat src_format,
struct radv_image *dest_image,
VkImageLayout dest_image_layout,
dest_image->info.array_size > 1)
*method = RESOLVE_COMPUTE;
- if (radv_layout_dcc_compressed(dest_image, dest_image_layout,
+ if (radv_layout_dcc_compressed(device, dest_image, dest_image_layout,
dest_render_loop, queue_mask)) {
*method = RESOLVE_FRAGMENT;
} else if (dest_image->planes[0].surface.micro_tile_mode !=
} else
resolve_method = RESOLVE_COMPUTE;
- radv_pick_resolve_method_images(src_image, src_image->vk_format,
- dest_image, dest_image_layout,
- false, cmd_buffer, &resolve_method);
+ radv_pick_resolve_method_images(cmd_buffer->device, src_image,
+ src_image->vk_format, dest_image,
+ dest_image_layout, false, cmd_buffer,
+ &resolve_method);
if (resolve_method == RESOLVE_FRAGMENT) {
radv_meta_resolve_fragment_image(cmd_buffer,
.baseArrayLayer = src_base_layer + layer,
.layerCount = 1,
},
- });
+ }, NULL);
struct radv_image_view dest_iview;
radv_image_view_init(&dest_iview, cmd_buffer->device,
.baseArrayLayer = dest_base_layer + layer,
.layerCount = 1,
},
- });
+ }, NULL);
VkFramebuffer fb_h;
radv_CreateFramebuffer(device_h,
&cmd_buffer->pool->alloc,
&fb_h);
- radv_CmdBeginRenderPass(cmd_buffer_h,
- &(VkRenderPassBeginInfo) {
- .sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
- .renderPass = device->meta_state.resolve.pass[fs_key],
- .framebuffer = fb_h,
- .renderArea = {
- .offset = {
- dstOffset.x,
- dstOffset.y,
- },
- .extent = {
- extent.width,
- extent.height,
+ radv_cmd_buffer_begin_render_pass(cmd_buffer,
+ &(VkRenderPassBeginInfo) {
+ .sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
+ .renderPass = device->meta_state.resolve.pass[fs_key],
+ .framebuffer = fb_h,
+ .renderArea = {
+ .offset = {
+ dstOffset.x,
+ dstOffset.y,
+ },
+ .extent = {
+ extent.width,
+ extent.height,
}
- },
- .clearValueCount = 0,
- .pClearValues = NULL,
- },
- VK_SUBPASS_CONTENTS_INLINE);
+ },
+ .clearValueCount = 0,
+ .pClearValues = NULL,
+ });
+
+ radv_cmd_buffer_set_subpass(cmd_buffer,
+ &cmd_buffer->state.pass->subpasses[0]);
emit_resolve(cmd_buffer,
dest_iview.vk_format,
.height = extent.height,
});
- radv_CmdEndRenderPass(cmd_buffer_h);
+ radv_cmd_buffer_end_render_pass(cmd_buffer);
radv_DestroyFramebuffer(device_h, fb_h,
&cmd_buffer->pool->alloc);
struct radv_image_view *dst_iview =
cmd_buffer->state.attachments[dst_att.attachment].iview;
- radv_pick_resolve_method_images(src_iview->image,
+ /* Make sure to not clear the depth/stencil attachment after resolves. */
+ cmd_buffer->state.attachments[dst_att.attachment].pending_clear_aspects = 0;
+
+ radv_pick_resolve_method_images(cmd_buffer->device,
+ src_iview->image,
src_iview->vk_format,
dst_iview->image,
dst_att.layout,
struct radv_image_view *src_iview= cmd_buffer->state.attachments[src_att.attachment].iview;
struct radv_image *src_img = src_iview->image;
- radv_pick_resolve_method_images(src_img, src_iview->vk_format,
- dst_img, dest_att.layout,
+ radv_pick_resolve_method_images(cmd_buffer->device, src_img,
+ src_iview->vk_format, dst_img,
+ dest_att.layout,
dest_att.in_render_loop,
cmd_buffer, &resolve_method);
struct radv_image *src_image = src_iview->image;
VkImageResolve region = {};
- region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+ region.srcSubresource.aspectMask = src_iview->aspect_mask;
region.srcSubresource.mipLevel = 0;
region.srcSubresource.baseArrayLayer = src_iview->base_layer;
region.srcSubresource.layerCount = layer_count;
struct radv_image *src_image = src_iview->image;
VkImageResolve region = {};
- region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
+ region.srcSubresource.aspectMask = src_iview->aspect_mask;
region.srcSubresource.mipLevel = 0;
region.srcSubresource.baseArrayLayer = src_iview->base_layer;
region.srcSubresource.layerCount = layer_count;