mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 09:38:07 +02:00
panvk: move cmd_resolve_attachments to panvk_vX_cmd_meta.c
This uses the vk-meta framework, so it feels more like it belongs here. While we're at it, rename the function as well. Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/39304>
This commit is contained in:
parent
b542ac4ca0
commit
a6009833c3
6 changed files with 123 additions and 122 deletions
|
|
@ -3675,7 +3675,7 @@ panvk_per_arch(CmdEndRendering)(VkCommandBuffer commandBuffer)
|
|||
|
||||
/* If we're not suspending, we need to resolve attachments. */
|
||||
if (!suspending)
|
||||
panvk_per_arch(cmd_resolve_attachments)(cmdbuf);
|
||||
panvk_per_arch(cmd_meta_resolve_attachments)(cmdbuf);
|
||||
|
||||
struct panvk_instr_end_args instr_info = {
|
||||
.render = {
|
||||
|
|
|
|||
|
|
@ -1998,6 +1998,6 @@ panvk_per_arch(CmdEndRendering)(VkCommandBuffer commandBuffer)
|
|||
|
||||
panvk_per_arch(cmd_close_batch)(cmdbuf);
|
||||
cmdbuf->cur_batch = NULL;
|
||||
panvk_per_arch(cmd_resolve_attachments)(cmdbuf);
|
||||
panvk_per_arch(cmd_meta_resolve_attachments)(cmdbuf);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -373,7 +373,6 @@ void
|
|||
panvk_per_arch(cmd_preload_render_area_border)(struct panvk_cmd_buffer *cmdbuf,
|
||||
const VkRenderingInfo *render_info);
|
||||
|
||||
void panvk_per_arch(cmd_resolve_attachments)(struct panvk_cmd_buffer *cmdbuf);
|
||||
void panvk_per_arch(cmd_select_tile_size)(struct panvk_cmd_buffer *cmdbuf);
|
||||
|
||||
struct panvk_draw_info {
|
||||
|
|
|
|||
|
|
@ -77,4 +77,7 @@ void panvk_per_arch(cmd_meta_gfx_end)(
|
|||
struct panvk_cmd_buffer *cmdbuf,
|
||||
const struct panvk_cmd_meta_graphics_save_ctx *save_ctx);
|
||||
|
||||
void panvk_per_arch(cmd_meta_resolve_attachments)(
|
||||
struct panvk_cmd_buffer *cmdbuf);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@
|
|||
|
||||
#include "panvk_buffer.h"
|
||||
#include "panvk_cmd_buffer.h"
|
||||
#include "panvk_cmd_meta.h"
|
||||
#include "panvk_device_memory.h"
|
||||
#include "panvk_entrypoints.h"
|
||||
|
||||
|
|
@ -489,124 +488,6 @@ panvk_per_arch(cmd_select_tile_size)(struct panvk_cmd_buffer *cmdbuf)
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
panvk_per_arch(cmd_resolve_attachments)(struct panvk_cmd_buffer *cmdbuf)
|
||||
{
|
||||
struct pan_fb_info *fbinfo = &cmdbuf->state.gfx.render.fb.info;
|
||||
bool needs_resolve = false;
|
||||
|
||||
unsigned bound_atts = cmdbuf->state.gfx.render.bound_attachments;
|
||||
unsigned color_att_count =
|
||||
util_last_bit(bound_atts & MESA_VK_RP_ATTACHMENT_ANY_COLOR_BITS);
|
||||
VkRenderingAttachmentInfo color_atts[MAX_RTS];
|
||||
for (uint32_t i = 0; i < color_att_count; i++) {
|
||||
|
||||
const struct panvk_resolve_attachment *resolve_info =
|
||||
&cmdbuf->state.gfx.render.color_attachments.resolve[i];
|
||||
struct panvk_image_view *src_iview =
|
||||
cmdbuf->state.gfx.render.color_attachments.iviews[i];
|
||||
|
||||
color_atts[i] = (VkRenderingAttachmentInfo){
|
||||
.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO,
|
||||
.imageView = panvk_image_view_to_handle(src_iview),
|
||||
.imageLayout = VK_IMAGE_LAYOUT_GENERAL,
|
||||
.resolveMode = resolve_info->mode,
|
||||
.resolveImageView =
|
||||
panvk_image_view_to_handle(resolve_info->dst_iview),
|
||||
.resolveImageLayout = VK_IMAGE_LAYOUT_GENERAL,
|
||||
};
|
||||
|
||||
if (resolve_info->mode != VK_RESOLVE_MODE_NONE)
|
||||
needs_resolve = true;
|
||||
|
||||
if (resolve_info->mode != VK_RESOLVE_MODE_NONE) {
|
||||
assert(src_iview->pview.nr_samples > 1);
|
||||
assert(resolve_info->dst_iview->pview.nr_samples == 1);
|
||||
}
|
||||
}
|
||||
|
||||
const struct panvk_resolve_attachment *resolve_info =
|
||||
&cmdbuf->state.gfx.render.z_attachment.resolve;
|
||||
struct panvk_image_view *src_iview =
|
||||
cmdbuf->state.gfx.render.z_attachment.iview;
|
||||
VkRenderingAttachmentInfo z_att = {
|
||||
.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO,
|
||||
.imageView = panvk_image_view_to_handle(src_iview),
|
||||
.imageLayout = VK_IMAGE_LAYOUT_GENERAL,
|
||||
.resolveMode = resolve_info->mode,
|
||||
.resolveImageView = panvk_image_view_to_handle(resolve_info->dst_iview),
|
||||
.resolveImageLayout = VK_IMAGE_LAYOUT_GENERAL,
|
||||
};
|
||||
|
||||
if (resolve_info->mode != VK_RESOLVE_MODE_NONE)
|
||||
needs_resolve = true;
|
||||
|
||||
resolve_info = &cmdbuf->state.gfx.render.s_attachment.resolve;
|
||||
src_iview = cmdbuf->state.gfx.render.s_attachment.iview;
|
||||
|
||||
VkRenderingAttachmentInfo s_att = {
|
||||
.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO,
|
||||
.imageView = panvk_image_view_to_handle(src_iview),
|
||||
.imageLayout = VK_IMAGE_LAYOUT_GENERAL,
|
||||
.resolveMode = resolve_info->mode,
|
||||
.resolveImageView = panvk_image_view_to_handle(resolve_info->dst_iview),
|
||||
.resolveImageLayout = VK_IMAGE_LAYOUT_GENERAL,
|
||||
};
|
||||
|
||||
if (resolve_info->mode != VK_RESOLVE_MODE_NONE)
|
||||
needs_resolve = true;
|
||||
|
||||
if (!needs_resolve)
|
||||
return;
|
||||
|
||||
#if PAN_ARCH >= 10
|
||||
/* insert a barrier for resolve */
|
||||
const VkMemoryBarrier2 mem_barrier = {
|
||||
.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER_2,
|
||||
.srcStageMask = VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BIT |
|
||||
VK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BIT |
|
||||
VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT,
|
||||
.srcAccessMask = VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT |
|
||||
VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
|
||||
.dstStageMask = VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT,
|
||||
.dstAccessMask = VK_ACCESS_2_SHADER_SAMPLED_READ_BIT
|
||||
};
|
||||
const VkDependencyInfo dep_info = {
|
||||
.sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
|
||||
.memoryBarrierCount = 1,
|
||||
.pMemoryBarriers = &mem_barrier,
|
||||
};
|
||||
panvk_per_arch(CmdPipelineBarrier2)(panvk_cmd_buffer_to_handle(cmdbuf),
|
||||
&dep_info);
|
||||
#endif
|
||||
|
||||
const VkRenderingInfo render_info = {
|
||||
.sType = VK_STRUCTURE_TYPE_RENDERING_INFO,
|
||||
.renderArea =
|
||||
{
|
||||
.offset.x = fbinfo->draw_extent.minx,
|
||||
.offset.y = fbinfo->draw_extent.miny,
|
||||
.extent.width =
|
||||
fbinfo->draw_extent.maxx - fbinfo->draw_extent.minx + 1,
|
||||
.extent.height =
|
||||
fbinfo->draw_extent.maxy - fbinfo->draw_extent.miny + 1,
|
||||
},
|
||||
.layerCount = cmdbuf->state.gfx.render.layer_count,
|
||||
.viewMask = cmdbuf->state.gfx.render.view_mask,
|
||||
.colorAttachmentCount = color_att_count,
|
||||
.pColorAttachments = color_atts,
|
||||
.pDepthAttachment = &z_att,
|
||||
.pStencilAttachment = &s_att,
|
||||
};
|
||||
|
||||
struct panvk_device *dev = to_panvk_device(cmdbuf->vk.base.device);
|
||||
struct panvk_cmd_meta_graphics_save_ctx save = {0};
|
||||
|
||||
panvk_per_arch(cmd_meta_gfx_start)(cmdbuf, &save);
|
||||
vk_meta_resolve_rendering(&cmdbuf->vk, &dev->meta, &render_info);
|
||||
panvk_per_arch(cmd_meta_gfx_end)(cmdbuf, &save);
|
||||
}
|
||||
|
||||
void
|
||||
panvk_per_arch(cmd_force_fb_preload)(struct panvk_cmd_buffer *cmdbuf,
|
||||
const VkRenderingInfo *render_info)
|
||||
|
|
|
|||
|
|
@ -646,3 +646,121 @@ panvk_per_arch(cmd_transition_image_layout)(
|
|||
if (handler.cmd)
|
||||
handler.cmd(cmdbuf, barrier);
|
||||
}
|
||||
|
||||
void
|
||||
panvk_per_arch(cmd_meta_resolve_attachments)(struct panvk_cmd_buffer *cmdbuf)
|
||||
{
|
||||
struct pan_fb_info *fbinfo = &cmdbuf->state.gfx.render.fb.info;
|
||||
bool needs_resolve = false;
|
||||
|
||||
unsigned bound_atts = cmdbuf->state.gfx.render.bound_attachments;
|
||||
unsigned color_att_count =
|
||||
util_last_bit(bound_atts & MESA_VK_RP_ATTACHMENT_ANY_COLOR_BITS);
|
||||
VkRenderingAttachmentInfo color_atts[MAX_RTS];
|
||||
for (uint32_t i = 0; i < color_att_count; i++) {
|
||||
|
||||
const struct panvk_resolve_attachment *resolve_info =
|
||||
&cmdbuf->state.gfx.render.color_attachments.resolve[i];
|
||||
struct panvk_image_view *src_iview =
|
||||
cmdbuf->state.gfx.render.color_attachments.iviews[i];
|
||||
|
||||
color_atts[i] = (VkRenderingAttachmentInfo){
|
||||
.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO,
|
||||
.imageView = panvk_image_view_to_handle(src_iview),
|
||||
.imageLayout = VK_IMAGE_LAYOUT_GENERAL,
|
||||
.resolveMode = resolve_info->mode,
|
||||
.resolveImageView =
|
||||
panvk_image_view_to_handle(resolve_info->dst_iview),
|
||||
.resolveImageLayout = VK_IMAGE_LAYOUT_GENERAL,
|
||||
};
|
||||
|
||||
if (resolve_info->mode != VK_RESOLVE_MODE_NONE)
|
||||
needs_resolve = true;
|
||||
|
||||
if (resolve_info->mode != VK_RESOLVE_MODE_NONE) {
|
||||
assert(src_iview->pview.nr_samples > 1);
|
||||
assert(resolve_info->dst_iview->pview.nr_samples == 1);
|
||||
}
|
||||
}
|
||||
|
||||
const struct panvk_resolve_attachment *resolve_info =
|
||||
&cmdbuf->state.gfx.render.z_attachment.resolve;
|
||||
struct panvk_image_view *src_iview =
|
||||
cmdbuf->state.gfx.render.z_attachment.iview;
|
||||
VkRenderingAttachmentInfo z_att = {
|
||||
.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO,
|
||||
.imageView = panvk_image_view_to_handle(src_iview),
|
||||
.imageLayout = VK_IMAGE_LAYOUT_GENERAL,
|
||||
.resolveMode = resolve_info->mode,
|
||||
.resolveImageView = panvk_image_view_to_handle(resolve_info->dst_iview),
|
||||
.resolveImageLayout = VK_IMAGE_LAYOUT_GENERAL,
|
||||
};
|
||||
|
||||
if (resolve_info->mode != VK_RESOLVE_MODE_NONE)
|
||||
needs_resolve = true;
|
||||
|
||||
resolve_info = &cmdbuf->state.gfx.render.s_attachment.resolve;
|
||||
src_iview = cmdbuf->state.gfx.render.s_attachment.iview;
|
||||
|
||||
VkRenderingAttachmentInfo s_att = {
|
||||
.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO,
|
||||
.imageView = panvk_image_view_to_handle(src_iview),
|
||||
.imageLayout = VK_IMAGE_LAYOUT_GENERAL,
|
||||
.resolveMode = resolve_info->mode,
|
||||
.resolveImageView = panvk_image_view_to_handle(resolve_info->dst_iview),
|
||||
.resolveImageLayout = VK_IMAGE_LAYOUT_GENERAL,
|
||||
};
|
||||
|
||||
if (resolve_info->mode != VK_RESOLVE_MODE_NONE)
|
||||
needs_resolve = true;
|
||||
|
||||
if (!needs_resolve)
|
||||
return;
|
||||
|
||||
#if PAN_ARCH >= 10
|
||||
/* insert a barrier for resolve */
|
||||
const VkMemoryBarrier2 mem_barrier = {
|
||||
.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER_2,
|
||||
.srcStageMask = VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BIT |
|
||||
VK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BIT |
|
||||
VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT,
|
||||
.srcAccessMask = VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT |
|
||||
VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
|
||||
.dstStageMask = VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT,
|
||||
.dstAccessMask = VK_ACCESS_2_SHADER_SAMPLED_READ_BIT
|
||||
};
|
||||
const VkDependencyInfo dep_info = {
|
||||
.sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO,
|
||||
.memoryBarrierCount = 1,
|
||||
.pMemoryBarriers = &mem_barrier,
|
||||
};
|
||||
panvk_per_arch(CmdPipelineBarrier2)(panvk_cmd_buffer_to_handle(cmdbuf),
|
||||
&dep_info);
|
||||
#endif
|
||||
|
||||
const VkRenderingInfo render_info = {
|
||||
.sType = VK_STRUCTURE_TYPE_RENDERING_INFO,
|
||||
.renderArea =
|
||||
{
|
||||
.offset.x = fbinfo->draw_extent.minx,
|
||||
.offset.y = fbinfo->draw_extent.miny,
|
||||
.extent.width =
|
||||
fbinfo->draw_extent.maxx - fbinfo->draw_extent.minx + 1,
|
||||
.extent.height =
|
||||
fbinfo->draw_extent.maxy - fbinfo->draw_extent.miny + 1,
|
||||
},
|
||||
.layerCount = cmdbuf->state.gfx.render.layer_count,
|
||||
.viewMask = cmdbuf->state.gfx.render.view_mask,
|
||||
.colorAttachmentCount = color_att_count,
|
||||
.pColorAttachments = color_atts,
|
||||
.pDepthAttachment = &z_att,
|
||||
.pStencilAttachment = &s_att,
|
||||
};
|
||||
|
||||
struct panvk_device *dev = to_panvk_device(cmdbuf->vk.base.device);
|
||||
struct panvk_cmd_meta_graphics_save_ctx save = {0};
|
||||
|
||||
panvk_per_arch(cmd_meta_gfx_start)(cmdbuf, &save);
|
||||
vk_meta_resolve_rendering(&cmdbuf->vk, &dev->meta, &render_info);
|
||||
panvk_per_arch(cmd_meta_gfx_end)(cmdbuf, &save);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue