mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-01 18:58:10 +02:00
radv/meta: re-use radv_meta_resolve_{fragment,hardware}_image() for subpass resolves
Similar to compute. Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/37792>
This commit is contained in:
parent
ac3c21f130
commit
d3e716f1fb
3 changed files with 13 additions and 118 deletions
|
|
@ -285,7 +285,7 @@ void radv_meta_resolve_depth_stencil_cs(struct radv_cmd_buffer *cmd_buffer, stru
|
|||
|
||||
void radv_cmd_buffer_resolve_rendering_fs(struct radv_cmd_buffer *cmd_buffer, struct radv_image_view *src_iview,
|
||||
VkImageLayout src_layout, struct radv_image_view *dst_iview,
|
||||
VkImageLayout dst_layout);
|
||||
VkImageLayout dst_layout, const VkImageResolve2 *region);
|
||||
|
||||
void radv_meta_resolve_depth_stencil_fs(struct radv_cmd_buffer *cmd_buffer, struct radv_image *src_image,
|
||||
VkFormat src_format, VkImageLayout src_image_layout,
|
||||
|
|
|
|||
|
|
@ -236,7 +236,7 @@ radv_meta_resolve_hardware_image(struct radv_cmd_buffer *cmd_buffer, struct radv
|
|||
struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
|
||||
struct radv_meta_saved_state saved_state;
|
||||
|
||||
radv_meta_save(&saved_state, cmd_buffer, RADV_META_SAVE_GRAPHICS_PIPELINE);
|
||||
radv_meta_save(&saved_state, cmd_buffer, RADV_META_SAVE_GRAPHICS_PIPELINE | RADV_META_SAVE_RENDER);
|
||||
|
||||
assert(src_image->vk.samples > 1);
|
||||
assert(dst_image->vk.samples == 1);
|
||||
|
|
@ -444,75 +444,10 @@ radv_CmdResolveImage2(VkCommandBuffer commandBuffer, const VkResolveImageInfo2 *
|
|||
static void
|
||||
radv_cmd_buffer_resolve_rendering_hw(struct radv_cmd_buffer *cmd_buffer, struct radv_image_view *src_iview,
|
||||
VkImageLayout src_layout, struct radv_image_view *dst_iview,
|
||||
VkImageLayout dst_layout)
|
||||
VkImageLayout dst_layout, const VkImageResolve2 *region)
|
||||
{
|
||||
struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
|
||||
struct radv_meta_saved_state saved_state;
|
||||
|
||||
radv_meta_save(&saved_state, cmd_buffer, RADV_META_SAVE_GRAPHICS_PIPELINE | RADV_META_SAVE_RENDER);
|
||||
|
||||
VkRect2D *resolve_area = &saved_state.render.area;
|
||||
|
||||
radv_CmdSetViewport(radv_cmd_buffer_to_handle(cmd_buffer), 0, 1,
|
||||
&(VkViewport){.x = resolve_area->offset.x,
|
||||
.y = resolve_area->offset.y,
|
||||
.width = resolve_area->extent.width,
|
||||
.height = resolve_area->extent.height,
|
||||
.minDepth = 0.0f,
|
||||
.maxDepth = 1.0f});
|
||||
|
||||
radv_CmdSetScissor(radv_cmd_buffer_to_handle(cmd_buffer), 0, 1, resolve_area);
|
||||
|
||||
struct radv_image *src_img = src_iview->image;
|
||||
struct radv_image *dst_img = dst_iview->image;
|
||||
uint32_t queue_mask = radv_image_queue_family_mask(dst_img, cmd_buffer->qf, cmd_buffer->qf);
|
||||
|
||||
if (radv_layout_dcc_compressed(device, dst_img, dst_iview->vk.base_mip_level, dst_layout, queue_mask)) {
|
||||
VkImageSubresourceRange range = {
|
||||
.aspectMask = dst_iview->vk.aspects,
|
||||
.baseMipLevel = dst_iview->vk.base_mip_level,
|
||||
.levelCount = 1,
|
||||
.baseArrayLayer = 0,
|
||||
.layerCount = 1,
|
||||
};
|
||||
|
||||
cmd_buffer->state.flush_bits |= radv_init_dcc(cmd_buffer, dst_img, &range, 0xffffffff);
|
||||
}
|
||||
|
||||
const VkRenderingAttachmentInfo color_atts[2] = {
|
||||
{
|
||||
.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO,
|
||||
.imageView = radv_image_view_to_handle(src_iview),
|
||||
.imageLayout = src_layout,
|
||||
.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD,
|
||||
.storeOp = VK_ATTACHMENT_STORE_OP_STORE,
|
||||
},
|
||||
{
|
||||
.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO,
|
||||
.imageView = radv_image_view_to_handle(dst_iview),
|
||||
.imageLayout = dst_layout,
|
||||
.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD,
|
||||
.storeOp = VK_ATTACHMENT_STORE_OP_STORE,
|
||||
},
|
||||
};
|
||||
|
||||
const VkRenderingInfo rendering_info = {
|
||||
.sType = VK_STRUCTURE_TYPE_RENDERING_INFO,
|
||||
.flags = VK_RENDERING_INPUT_ATTACHMENT_NO_CONCURRENT_WRITES_BIT_MESA,
|
||||
.renderArea = saved_state.render.area,
|
||||
.layerCount = 1,
|
||||
.viewMask = saved_state.render.view_mask,
|
||||
.colorAttachmentCount = 2,
|
||||
.pColorAttachments = color_atts,
|
||||
};
|
||||
|
||||
radv_CmdBeginRendering(radv_cmd_buffer_to_handle(cmd_buffer), &rendering_info);
|
||||
|
||||
emit_resolve(cmd_buffer, src_img, dst_img, dst_iview->vk.format);
|
||||
|
||||
radv_CmdEndRendering(radv_cmd_buffer_to_handle(cmd_buffer));
|
||||
|
||||
radv_meta_restore(&saved_state, cmd_buffer);
|
||||
radv_meta_resolve_hardware_image(cmd_buffer, src_iview->image, src_iview->vk.format, src_layout, dst_iview->image,
|
||||
dst_iview->vk.format, dst_layout, region);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -690,7 +625,7 @@ radv_cmd_buffer_resolve_rendering(struct radv_cmd_buffer *cmd_buffer)
|
|||
|
||||
switch (resolve_method) {
|
||||
case RESOLVE_HW:
|
||||
radv_cmd_buffer_resolve_rendering_hw(cmd_buffer, src_iview, src_layout, dst_iview, dst_layout);
|
||||
radv_cmd_buffer_resolve_rendering_hw(cmd_buffer, src_iview, src_layout, dst_iview, dst_layout, ®ion);
|
||||
break;
|
||||
case RESOLVE_COMPUTE:
|
||||
radv_decompress_resolve_src(cmd_buffer, src_iview->image, src_layout, ®ion);
|
||||
|
|
@ -700,7 +635,7 @@ radv_cmd_buffer_resolve_rendering(struct radv_cmd_buffer *cmd_buffer)
|
|||
case RESOLVE_FRAGMENT:
|
||||
radv_decompress_resolve_src(cmd_buffer, src_iview->image, src_layout, ®ion);
|
||||
|
||||
radv_cmd_buffer_resolve_rendering_fs(cmd_buffer, src_iview, src_layout, dst_iview, dst_layout);
|
||||
radv_cmd_buffer_resolve_rendering_fs(cmd_buffer, src_iview, src_layout, dst_iview, dst_layout, ®ion);
|
||||
break;
|
||||
default:
|
||||
UNREACHABLE("Invalid resolve method");
|
||||
|
|
|
|||
|
|
@ -438,8 +438,9 @@ radv_meta_resolve_fragment_image(struct radv_cmd_buffer *cmd_buffer, struct radv
|
|||
struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
|
||||
struct radv_meta_saved_state saved_state;
|
||||
|
||||
radv_meta_save(&saved_state, cmd_buffer,
|
||||
RADV_META_SAVE_GRAPHICS_PIPELINE | RADV_META_SAVE_CONSTANTS | RADV_META_SAVE_DESCRIPTORS);
|
||||
radv_meta_save(
|
||||
&saved_state, cmd_buffer,
|
||||
RADV_META_SAVE_GRAPHICS_PIPELINE | RADV_META_SAVE_CONSTANTS | RADV_META_SAVE_DESCRIPTORS | RADV_META_SAVE_RENDER);
|
||||
|
||||
assert(region->srcSubresource.aspectMask == VK_IMAGE_ASPECT_COLOR_BIT);
|
||||
assert(region->dstSubresource.aspectMask == VK_IMAGE_ASPECT_COLOR_BIT);
|
||||
|
|
@ -537,51 +538,10 @@ radv_meta_resolve_fragment_image(struct radv_cmd_buffer *cmd_buffer, struct radv
|
|||
void
|
||||
radv_cmd_buffer_resolve_rendering_fs(struct radv_cmd_buffer *cmd_buffer, struct radv_image_view *src_iview,
|
||||
VkImageLayout src_layout, struct radv_image_view *dst_iview,
|
||||
VkImageLayout dst_layout)
|
||||
VkImageLayout dst_layout, const VkImageResolve2 *region)
|
||||
{
|
||||
const struct radv_rendering_state *render = &cmd_buffer->state.render;
|
||||
struct radv_meta_saved_state saved_state;
|
||||
VkRect2D resolve_area = render->area;
|
||||
|
||||
radv_meta_save(
|
||||
&saved_state, cmd_buffer,
|
||||
RADV_META_SAVE_GRAPHICS_PIPELINE | RADV_META_SAVE_CONSTANTS | RADV_META_SAVE_DESCRIPTORS | RADV_META_SAVE_RENDER);
|
||||
|
||||
radv_CmdSetViewport(radv_cmd_buffer_to_handle(cmd_buffer), 0, 1,
|
||||
&(VkViewport){.x = resolve_area.offset.x,
|
||||
.y = resolve_area.offset.y,
|
||||
.width = resolve_area.extent.width,
|
||||
.height = resolve_area.extent.height,
|
||||
.minDepth = 0.0f,
|
||||
.maxDepth = 1.0f});
|
||||
|
||||
radv_CmdSetScissor(radv_cmd_buffer_to_handle(cmd_buffer), 0, 1, &resolve_area);
|
||||
|
||||
const VkRenderingAttachmentInfo color_att = {
|
||||
.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO,
|
||||
.imageView = radv_image_view_to_handle(dst_iview),
|
||||
.imageLayout = dst_layout,
|
||||
.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD,
|
||||
.storeOp = VK_ATTACHMENT_STORE_OP_STORE,
|
||||
};
|
||||
|
||||
const VkRenderingInfo rendering_info = {
|
||||
.sType = VK_STRUCTURE_TYPE_RENDERING_INFO,
|
||||
.flags = VK_RENDERING_INPUT_ATTACHMENT_NO_CONCURRENT_WRITES_BIT_MESA,
|
||||
.renderArea = saved_state.render.area,
|
||||
.layerCount = 1,
|
||||
.viewMask = saved_state.render.view_mask,
|
||||
.colorAttachmentCount = 1,
|
||||
.pColorAttachments = &color_att,
|
||||
};
|
||||
|
||||
radv_CmdBeginRendering(radv_cmd_buffer_to_handle(cmd_buffer), &rendering_info);
|
||||
|
||||
emit_resolve(cmd_buffer, src_iview, dst_iview, &resolve_area.offset, &resolve_area.offset);
|
||||
|
||||
radv_CmdEndRendering(radv_cmd_buffer_to_handle(cmd_buffer));
|
||||
|
||||
radv_meta_restore(&saved_state, cmd_buffer);
|
||||
radv_meta_resolve_fragment_image(cmd_buffer, src_iview->image, src_iview->vk.format, src_layout, dst_iview->image,
|
||||
dst_iview->vk.format, dst_layout, region);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue