mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-02 03:38:06 +02:00
nvk: Use meta for MSAA resolves
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24326>
This commit is contained in:
parent
1c3dc8c632
commit
4bd2ba31fc
4 changed files with 101 additions and 5 deletions
|
|
@ -223,6 +223,9 @@ void
|
||||||
nvk_cmd_buffer_flush_push_descriptors(struct nvk_cmd_buffer *cmd,
|
nvk_cmd_buffer_flush_push_descriptors(struct nvk_cmd_buffer *cmd,
|
||||||
struct nvk_descriptor_state *desc);
|
struct nvk_descriptor_state *desc);
|
||||||
|
|
||||||
|
void nvk_meta_resolve_rendering(struct nvk_cmd_buffer *cmd,
|
||||||
|
const VkRenderingInfo *pRenderingInfo);
|
||||||
|
|
||||||
void nvk_cmd_buffer_dump(struct nvk_cmd_buffer *cmd, FILE *fp);
|
void nvk_cmd_buffer_dump(struct nvk_cmd_buffer *cmd, FILE *fp);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -354,8 +354,6 @@ nvk_attachment_init(struct nvk_attachment *att,
|
||||||
|
|
||||||
if (info->resolveMode != VK_RESOLVE_MODE_NONE) {
|
if (info->resolveMode != VK_RESOLVE_MODE_NONE) {
|
||||||
VK_FROM_HANDLE(nvk_image_view, res_iview, info->resolveImageView);
|
VK_FROM_HANDLE(nvk_image_view, res_iview, info->resolveImageView);
|
||||||
assert(iview->vk.format == res_iview->vk.format);
|
|
||||||
|
|
||||||
att->resolve_mode = info->resolveMode;
|
att->resolve_mode = info->resolveMode;
|
||||||
att->resolve_iview = res_iview;
|
att->resolve_iview = res_iview;
|
||||||
}
|
}
|
||||||
|
|
@ -610,12 +608,71 @@ nvk_CmdEndRendering(VkCommandBuffer commandBuffer)
|
||||||
VK_FROM_HANDLE(nvk_cmd_buffer, cmd, commandBuffer);
|
VK_FROM_HANDLE(nvk_cmd_buffer, cmd, commandBuffer);
|
||||||
struct nvk_rendering_state *render = &cmd->state.gfx.render;
|
struct nvk_rendering_state *render = &cmd->state.gfx.render;
|
||||||
|
|
||||||
if (!(render->flags & VK_RENDERING_SUSPENDING_BIT)) {
|
bool need_resolve = false;
|
||||||
/* TODO: Attachment resolves */
|
|
||||||
|
/* Translate render state back to VK for meta */
|
||||||
|
VkRenderingAttachmentInfo vk_color_att[NVK_MAX_RTS];
|
||||||
|
for (uint32_t i = 0; i < render->color_att_count; i++) {
|
||||||
|
if (render->color_att[i].resolve_mode != VK_RESOLVE_MODE_NONE)
|
||||||
|
need_resolve = true;
|
||||||
|
|
||||||
|
vk_color_att[i] = (VkRenderingAttachmentInfo) {
|
||||||
|
.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO,
|
||||||
|
.imageView = nvk_image_view_to_handle(render->color_att[i].iview),
|
||||||
|
.imageLayout = VK_IMAGE_LAYOUT_GENERAL,
|
||||||
|
.resolveMode = render->color_att[i].resolve_mode,
|
||||||
|
.resolveImageView =
|
||||||
|
nvk_image_view_to_handle(render->color_att[i].resolve_iview),
|
||||||
|
.resolveImageLayout = VK_IMAGE_LAYOUT_GENERAL,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO: Tear down rendering if needed */
|
const VkRenderingAttachmentInfo vk_depth_att = {
|
||||||
|
.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO,
|
||||||
|
.imageView = nvk_image_view_to_handle(render->depth_att.iview),
|
||||||
|
.imageLayout = VK_IMAGE_LAYOUT_GENERAL,
|
||||||
|
.resolveMode = render->depth_att.resolve_mode,
|
||||||
|
.resolveImageView =
|
||||||
|
nvk_image_view_to_handle(render->depth_att.resolve_iview),
|
||||||
|
.resolveImageLayout = VK_IMAGE_LAYOUT_GENERAL,
|
||||||
|
};
|
||||||
|
if (render->depth_att.resolve_mode != VK_RESOLVE_MODE_NONE)
|
||||||
|
need_resolve = true;
|
||||||
|
|
||||||
|
const VkRenderingAttachmentInfo vk_stencil_att = {
|
||||||
|
.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO,
|
||||||
|
.imageView = nvk_image_view_to_handle(render->stencil_att.iview),
|
||||||
|
.imageLayout = VK_IMAGE_LAYOUT_GENERAL,
|
||||||
|
.resolveMode = render->stencil_att.resolve_mode,
|
||||||
|
.resolveImageView =
|
||||||
|
nvk_image_view_to_handle(render->stencil_att.resolve_iview),
|
||||||
|
.resolveImageLayout = VK_IMAGE_LAYOUT_GENERAL,
|
||||||
|
};
|
||||||
|
if (render->stencil_att.resolve_mode != VK_RESOLVE_MODE_NONE)
|
||||||
|
need_resolve = true;
|
||||||
|
|
||||||
|
const VkRenderingInfo vk_render = {
|
||||||
|
.sType = VK_STRUCTURE_TYPE_RENDERING_INFO,
|
||||||
|
.renderArea = render->area,
|
||||||
|
.layerCount = render->layer_count,
|
||||||
|
.viewMask = render->view_mask,
|
||||||
|
.colorAttachmentCount = render->color_att_count,
|
||||||
|
.pColorAttachments = vk_color_att,
|
||||||
|
.pDepthAttachment = &vk_depth_att,
|
||||||
|
.pStencilAttachment = &vk_stencil_att,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (render->flags & VK_RENDERING_SUSPENDING_BIT)
|
||||||
|
need_resolve = false;
|
||||||
|
|
||||||
memset(render, 0, sizeof(*render));
|
memset(render, 0, sizeof(*render));
|
||||||
|
|
||||||
|
if (need_resolve) {
|
||||||
|
struct nv_push *p = nvk_cmd_buffer_push(cmd, 2);
|
||||||
|
P_IMMD(p, NV9097, WAIT_FOR_IDLE, 0);
|
||||||
|
|
||||||
|
nvk_meta_resolve_rendering(cmd, &vk_render);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
||||||
|
|
@ -139,3 +139,32 @@ nvk_CmdBlitImage2(VkCommandBuffer commandBuffer,
|
||||||
|
|
||||||
nvk_meta_end(cmd, &save);
|
nvk_meta_end(cmd, &save);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VKAPI_ATTR void VKAPI_CALL
|
||||||
|
nvk_CmdResolveImage2(VkCommandBuffer commandBuffer,
|
||||||
|
const VkResolveImageInfo2 *pResolveImageInfo)
|
||||||
|
{
|
||||||
|
VK_FROM_HANDLE(nvk_cmd_buffer, cmd, commandBuffer);
|
||||||
|
struct nvk_device *dev = nvk_cmd_buffer_device(cmd);
|
||||||
|
|
||||||
|
struct nvk_meta_save save;
|
||||||
|
nvk_meta_begin(cmd, &save);
|
||||||
|
|
||||||
|
vk_meta_resolve_image2(&cmd->vk, &dev->meta, pResolveImageInfo);
|
||||||
|
|
||||||
|
nvk_meta_end(cmd, &save);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
nvk_meta_resolve_rendering(struct nvk_cmd_buffer *cmd,
|
||||||
|
const VkRenderingInfo *pRenderingInfo)
|
||||||
|
{
|
||||||
|
struct nvk_device *dev = nvk_cmd_buffer_device(cmd);
|
||||||
|
|
||||||
|
struct nvk_meta_save save;
|
||||||
|
nvk_meta_begin(cmd, &save);
|
||||||
|
|
||||||
|
vk_meta_resolve_rendering(&cmd->vk, &dev->meta, pRenderingInfo);
|
||||||
|
|
||||||
|
nvk_meta_end(cmd, &save);
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -216,6 +216,13 @@ nvk_image_init(struct nvk_device *device,
|
||||||
{
|
{
|
||||||
vk_image_init(&device->vk, &image->vk, pCreateInfo);
|
vk_image_init(&device->vk, &image->vk, pCreateInfo);
|
||||||
|
|
||||||
|
if ((image->vk.usage & (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
|
||||||
|
VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)) &&
|
||||||
|
image->vk.samples > 1) {
|
||||||
|
image->vk.usage |= VK_IMAGE_USAGE_SAMPLED_BIT;
|
||||||
|
image->vk.stencil_usage |= VK_IMAGE_USAGE_SAMPLED_BIT;
|
||||||
|
}
|
||||||
|
|
||||||
if (image->vk.usage & VK_IMAGE_USAGE_TRANSFER_SRC_BIT)
|
if (image->vk.usage & VK_IMAGE_USAGE_TRANSFER_SRC_BIT)
|
||||||
image->vk.usage |= VK_IMAGE_USAGE_SAMPLED_BIT;
|
image->vk.usage |= VK_IMAGE_USAGE_SAMPLED_BIT;
|
||||||
if (image->vk.usage & VK_IMAGE_USAGE_TRANSFER_DST_BIT)
|
if (image->vk.usage & VK_IMAGE_USAGE_TRANSFER_DST_BIT)
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue