tu: Precompute maximum views across all subpasses

We'll need this to know how many viewports to create.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20304>
This commit is contained in:
Connor Abbott 2022-11-17 13:24:30 +01:00 committed by Marge Bot
parent 2668ba0ecd
commit 7673fcf206
3 changed files with 16 additions and 7 deletions

View file

@ -513,6 +513,15 @@ static void update_samples(struct tu_subpass *subpass,
subpass->samples = samples;
}
static void
tu_render_pass_calc_views(struct tu_render_pass *pass)
{
uint32_t view_mask = 0;
for (unsigned i = 0; i < pass->subpass_count; i++)
view_mask |= pass->subpasses[i].multiview_mask;
pass->num_views = util_last_bit(view_mask);
}
static void
tu_render_pass_calc_hash(struct tu_render_pass *pass)
{
@ -952,6 +961,7 @@ tu_CreateRenderPass2(VkDevice _device,
tu_render_pass_cond_config(pass);
tu_render_pass_gmem_config(pass, device->physical_device);
tu_render_pass_bandwidth_config(pass);
tu_render_pass_calc_views(pass);
tu_render_pass_calc_hash(pass);
for (unsigned i = 0; i < pCreateInfo->dependencyCount; ++i) {
@ -1126,6 +1136,7 @@ tu_setup_dynamic_render_pass(struct tu_cmd_buffer *cmd_buffer,
tu_render_pass_cond_config(pass);
tu_render_pass_gmem_config(pass, device->physical_device);
tu_render_pass_bandwidth_config(pass);
tu_render_pass_calc_views(pass);
tu_render_pass_calc_hash(pass);
}
@ -1185,6 +1196,8 @@ tu_setup_dynamic_inheritance(struct tu_cmd_buffer *cmd_buffer,
} else {
subpass->depth_stencil_attachment.attachment = VK_ATTACHMENT_UNUSED;
}
tu_render_pass_calc_views(pass);
}
VKAPI_ATTR void VKAPI_CALL

View file

@ -107,6 +107,8 @@ struct tu_render_pass
uint32_t gmem_bandwidth_per_pixel;
uint32_t sysmem_bandwidth_per_pixel;
unsigned num_views;
struct tu_subpass_attachment *subpass_attachments;
struct tu_render_pass_attachment *attachments;

View file

@ -122,13 +122,7 @@ tu_tiling_config_update_tile_layout(struct tu_framebuffer *fb,
* used.
*/
uint32_t layers = fb->layers;
if (pass->subpasses[0].multiview_mask) {
uint32_t view_mask = 0;
for (unsigned i = 0; i < pass->subpass_count; i++)
view_mask |= pass->subpasses[i].multiview_mask;
layers = util_logbase2(view_mask) + 1;
}
uint32_t layers = MAX2(fb->layers, pass->num_views);
/* If there is more than one layer, we need to make sure that the layer
* stride is expressible as an offset in RB_BLIT_BASE_GMEM which ignores