turnip: Track the first/last subpass an attachment is used in.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20994>
This commit is contained in:
Emma Anholt 2022-08-01 12:30:03 -07:00 committed by Marge Bot
parent fce10ddf0f
commit c96b2cc511
2 changed files with 52 additions and 17 deletions

View file

@ -790,10 +790,38 @@ static void
tu_subpass_use_attachment(struct tu_render_pass *pass, int i, uint32_t a, const VkRenderPassCreateInfo2 *pCreateInfo)
{
struct tu_subpass *subpass = &pass->subpasses[i];
struct tu_render_pass_attachment *att = &pass->attachments[a];
pass->attachments[a].gmem = true;
att->gmem = true;
update_samples(subpass, pCreateInfo->pAttachments[a].samples);
pass->attachments[a].clear_views |= subpass->multiview_mask;
att->clear_views |= subpass->multiview_mask;
/* Loads and clears are emitted at vkBeginRenderPass() time. */
if (att->clear_mask || att->load || att->load_stencil)
att->first_subpass_idx = 0;
else
att->first_subpass_idx = MIN2(i, att->first_subpass_idx);
/* Stores are emitted at vkEndRenderPass() time. */
if (att->store || att->store_stencil)
att->last_subpass_idx = pass->subpass_count - 1;
else
att->last_subpass_idx = MAX2(i, att->last_subpass_idx);
}
static void
tu_subpass_resolve_attachment(struct tu_render_pass *pass, int i, uint32_t dst_a, uint32_t src_a)
{
if (src_a != VK_ATTACHMENT_UNUSED && dst_a != VK_ATTACHMENT_UNUSED) {
struct tu_render_pass_attachment *src_att = &pass->attachments[src_a];
struct tu_render_pass_attachment *dst_att = &pass->attachments[dst_a];
src_att->will_be_resolved = true;
src_att->first_subpass_idx = MIN2(i, src_att->first_subpass_idx);
src_att->last_subpass_idx = MAX2(i, src_att->last_subpass_idx);
dst_att->first_subpass_idx = MIN2(i, dst_att->first_subpass_idx);
dst_att->last_subpass_idx = MAX2(i, dst_att->last_subpass_idx);
}
}
VKAPI_ATTR VkResult VKAPI_CALL
@ -851,6 +879,9 @@ tu_CreateRenderPass2(VkDevice _device,
attachment_set_ops(device, att, loadOp, stencilLoadOp,
pCreateInfo->pAttachments[i].storeOp,
pCreateInfo->pAttachments[i].stencilStoreOp);
att->first_subpass_idx = VK_SUBPASS_EXTERNAL;
att->last_subpass_idx = 0;
}
uint32_t subpass_attachment_count = 0;
struct tu_subpass_attachment *p;
@ -921,10 +952,15 @@ tu_CreateRenderPass2(VkDevice _device,
for (uint32_t j = 0; j < desc->inputAttachmentCount; j++) {
uint32_t a = desc->pInputAttachments[j].attachment;
subpass->input_attachments[j].attachment = a;
/* Note: attachments only used as input attachments will be read
* directly instead of through gmem, so we don't mark input
* attachments as needing gmem.
*/
if (a != VK_ATTACHMENT_UNUSED) {
struct tu_render_pass_attachment *att = &pass->attachments[a];
/* Note: attachments only used as input attachments will be read
* directly instead of through gmem, so we don't mark input
* attachments as needing gmem.
*/
att->first_subpass_idx = MIN2(i, att->first_subpass_idx);
att->last_subpass_idx = MAX2(i, att->last_subpass_idx);
}
}
}
@ -950,14 +986,11 @@ tu_CreateRenderPass2(VkDevice _device,
p += desc->colorAttachmentCount;
subpass->resolve_count += desc->colorAttachmentCount;
for (uint32_t j = 0; j < desc->colorAttachmentCount; j++) {
subpass->resolve_attachments[j].attachment =
desc->pResolveAttachments[j].attachment;
uint32_t a = desc->pResolveAttachments[j].attachment;
uint32_t src_a = desc->pColorAttachments[j].attachment;
if (src_a != VK_ATTACHMENT_UNUSED) {
pass->attachments[src_a].will_be_resolved =
desc->pResolveAttachments[j].attachment != VK_ATTACHMENT_UNUSED;
}
subpass->resolve_attachments[j].attachment = a;
tu_subpass_resolve_attachment(pass, i, a, src_a);
}
}
@ -965,12 +998,10 @@ tu_CreateRenderPass2(VkDevice _device,
p++;
subpass->resolve_count++;
uint32_t a = ds_resolve->pDepthStencilResolveAttachment->attachment;
uint32_t src_a = desc->pDepthStencilAttachment->attachment;
subpass->resolve_attachments[subpass->resolve_count - 1].attachment = a;
uint32_t src_a = desc->pDepthStencilAttachment->attachment;
if (src_a != VK_ATTACHMENT_UNUSED) {
pass->attachments[src_a].will_be_resolved = a != VK_ATTACHMENT_UNUSED;
}
tu_subpass_resolve_attachment(pass, i, a, src_a);
}
uint32_t a = desc->pDepthStencilAttachment ?

View file

@ -90,6 +90,10 @@ struct tu_render_pass_attachment
bool cond_store_allowed;
int32_t gmem_offset_stencil[TU_GMEM_LAYOUT_COUNT];
/* The subpass id in which the attachment will be used first/last. */
uint32_t first_subpass_idx;
uint32_t last_subpass_idx;
};
struct tu_render_pass