radv: cleanup the compute resolve path for subpass
This makes use of radv_meta_resolve_compute_image() by filling a VkImageResolve region instead of duplicating code. Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
This commit is contained in:
@@ -489,7 +489,6 @@ radv_cmd_buffer_resolve_subpass_cs(struct radv_cmd_buffer *cmd_buffer)
|
||||
{
|
||||
struct radv_framebuffer *fb = cmd_buffer->state.framebuffer;
|
||||
const struct radv_subpass *subpass = cmd_buffer->state.subpass;
|
||||
struct radv_meta_saved_state saved_state;
|
||||
struct radv_subpass_barrier barrier;
|
||||
|
||||
/* Resolves happen before the end-of-subpass barriers get executed, so
|
||||
@@ -500,67 +499,41 @@ radv_cmd_buffer_resolve_subpass_cs(struct radv_cmd_buffer *cmd_buffer)
|
||||
barrier.dst_access_mask = VK_ACCESS_INPUT_ATTACHMENT_READ_BIT;
|
||||
radv_subpass_barrier(cmd_buffer, &barrier);
|
||||
|
||||
radv_decompress_resolve_subpass_src(cmd_buffer);
|
||||
|
||||
radv_meta_save(&saved_state, cmd_buffer,
|
||||
RADV_META_SAVE_COMPUTE_PIPELINE |
|
||||
RADV_META_SAVE_CONSTANTS |
|
||||
RADV_META_SAVE_DESCRIPTORS);
|
||||
|
||||
for (uint32_t i = 0; i < subpass->color_count; ++i) {
|
||||
struct radv_subpass_attachment src_att = subpass->color_attachments[i];
|
||||
struct radv_subpass_attachment dest_att = subpass->resolve_attachments[i];
|
||||
struct radv_image_view *src_iview = cmd_buffer->state.framebuffer->attachments[src_att.attachment].attachment;
|
||||
struct radv_image_view *dst_iview = cmd_buffer->state.framebuffer->attachments[dest_att.attachment].attachment;
|
||||
if (dest_att.attachment == VK_ATTACHMENT_UNUSED)
|
||||
struct radv_subpass_attachment dst_att = subpass->resolve_attachments[i];
|
||||
struct radv_image_view *src_iview = fb->attachments[src_att.attachment].attachment;
|
||||
struct radv_image_view *dst_iview = fb->attachments[dst_att.attachment].attachment;
|
||||
|
||||
if (dst_att.attachment == VK_ATTACHMENT_UNUSED)
|
||||
continue;
|
||||
|
||||
struct radv_image *src_image = src_iview->image;
|
||||
struct radv_image *dst_image = dst_iview->image;
|
||||
for (uint32_t layer = 0; layer < src_image->info.array_size; layer++) {
|
||||
VkImageResolve region = {
|
||||
.extent = (VkExtent3D){ fb->width, fb->height, 0 },
|
||||
.srcSubresource = (VkImageSubresourceLayers) {
|
||||
.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
|
||||
.mipLevel = src_iview->base_mip,
|
||||
.baseArrayLayer = 0,
|
||||
.layerCount = src_iview->image->info.array_size
|
||||
},
|
||||
.dstSubresource = (VkImageSubresourceLayers) {
|
||||
.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
|
||||
.mipLevel = dst_iview->base_mip,
|
||||
.baseArrayLayer = 0,
|
||||
.layerCount = dst_iview->image->info.array_size
|
||||
},
|
||||
.srcOffset = (VkOffset3D){ 0, 0, 0 },
|
||||
.dstOffset = (VkOffset3D){ 0, 0, 0 },
|
||||
};
|
||||
|
||||
struct radv_image_view tsrc_iview;
|
||||
radv_image_view_init(&tsrc_iview, cmd_buffer->device,
|
||||
&(VkImageViewCreateInfo) {
|
||||
.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
|
||||
.image = radv_image_to_handle(src_image),
|
||||
.viewType = radv_meta_get_view_type(src_image),
|
||||
.format = src_image->vk_format,
|
||||
.subresourceRange = {
|
||||
.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
|
||||
.baseMipLevel = src_iview->base_mip,
|
||||
.levelCount = 1,
|
||||
.baseArrayLayer = layer,
|
||||
.layerCount = 1,
|
||||
},
|
||||
});
|
||||
|
||||
struct radv_image_view tdst_iview;
|
||||
radv_image_view_init(&tdst_iview, cmd_buffer->device,
|
||||
&(VkImageViewCreateInfo) {
|
||||
.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
|
||||
.image = radv_image_to_handle(dst_image),
|
||||
.viewType = radv_meta_get_view_type(dst_image),
|
||||
.format = vk_to_non_srgb_format(dst_image->vk_format),
|
||||
.subresourceRange = {
|
||||
.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
|
||||
.baseMipLevel = dst_iview->base_mip,
|
||||
.levelCount = 1,
|
||||
.baseArrayLayer = layer,
|
||||
.layerCount = 1,
|
||||
},
|
||||
});
|
||||
emit_resolve(cmd_buffer,
|
||||
&tsrc_iview,
|
||||
&tdst_iview,
|
||||
&(VkOffset2D) { 0, 0 },
|
||||
&(VkOffset2D) { 0, 0 },
|
||||
&(VkExtent2D) { fb->width, fb->height });
|
||||
}
|
||||
radv_meta_resolve_compute_image(cmd_buffer,
|
||||
src_iview->image,
|
||||
src_att.layout,
|
||||
dst_iview->image,
|
||||
dst_att.layout,
|
||||
1, ®ion);
|
||||
}
|
||||
|
||||
cmd_buffer->state.flush_bits |= RADV_CMD_FLAG_CS_PARTIAL_FLUSH |
|
||||
RADV_CMD_FLAG_INV_VMEM_L1;
|
||||
|
||||
radv_meta_restore(&saved_state, cmd_buffer);
|
||||
}
|
||||
|
Reference in New Issue
Block a user