panvk: Use the new FB code for tile size selection

The only functional change is that the new code doesn't reserve space
for dummy allocations.  However, the old code never actually took dummy
allocations into account when placing RTs so they end up overlapping
anyway and it's not causing problems.  Also, we set rt_count when there
are no attachments and that doesn't reserve dummy space so clearly
running with zero attachments is fine.

Reviewed-by: Lars-Ivar Hesselberg Simonsen <lars-ivar.simonsen@arm.com>
Acked-by: Boris Brezillon <boris.brezillon@collabora.com>
Acked-by: Eric R. Smith <eric.smith@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/39759>
This commit is contained in:
Faith Ekstrand 2026-01-23 02:49:32 -05:00 committed by Marge Bot
parent 225135ed10
commit c6ebf3cc59
3 changed files with 19 additions and 12 deletions

View file

@ -2337,7 +2337,7 @@ prepare_draw(struct panvk_cmd_buffer *cmdbuf, struct panvk_draw_info *draw)
return result;
if (!cmdbuf->vk.dynamic_graphics_state.rs.rasterizer_discard_enable) {
const struct pan_fb_info *fbinfo = &cmdbuf->state.gfx.render.fb.info;
const struct pan_fb_layout *fb = &cmdbuf->state.gfx.render.fb.layout;
uint32_t *nr_samples = &cmdbuf->state.gfx.render.fb.nr_samples;
uint32_t rasterization_samples =
cmdbuf->vk.dynamic_graphics_state.ms.rasterization_samples;
@ -2357,8 +2357,8 @@ prepare_draw(struct panvk_cmd_buffer *cmdbuf, struct panvk_draw_info *draw)
* XXX: This currently can happen in case we resume a render pass with no
* attachements and without any draw as the FBD is emitted when suspending.
*/
assert(fbinfo->nr_samples == 0 ||
fbinfo->nr_samples == cmdbuf->state.gfx.render.fb.nr_samples);
assert(fb->sample_count == 0 ||
fb->sample_count == cmdbuf->state.gfx.render.fb.nr_samples);
}
if (!inherits_render_ctx(cmdbuf)) {

View file

@ -1298,7 +1298,7 @@ prepare_draw(struct panvk_cmd_buffer *cmdbuf, struct panvk_draw_data *draw)
}
if (!rs->rasterizer_discard_enable) {
const struct pan_fb_info *fbinfo = &cmdbuf->state.gfx.render.fb.info;
const struct pan_fb_layout *fb = &cmdbuf->state.gfx.render.fb.layout;
uint32_t *nr_samples = &cmdbuf->state.gfx.render.fb.nr_samples;
uint32_t rasterization_samples =
cmdbuf->vk.dynamic_graphics_state.ms.rasterization_samples;
@ -1318,8 +1318,8 @@ prepare_draw(struct panvk_cmd_buffer *cmdbuf, struct panvk_draw_data *draw)
* XXX: This currently can happen in case we resume a render pass with no
* attachements and without any draw as the FBD is emitted when suspending.
*/
assert(fbinfo->nr_samples == 0 ||
fbinfo->nr_samples == cmdbuf->state.gfx.render.fb.nr_samples);
assert(fb->sample_count == 0 ||
fb->sample_count == cmdbuf->state.gfx.render.fb.nr_samples);
result = panvk_per_arch(cmd_alloc_fb_desc)(cmdbuf);
if (result != VK_SUCCESS)

View file

@ -553,24 +553,31 @@ panvk_per_arch(cmd_init_render_state)(struct panvk_cmd_buffer *cmdbuf,
void
panvk_per_arch(cmd_select_tile_size)(struct panvk_cmd_buffer *cmdbuf)
{
struct pan_fb_info *fbinfo = &cmdbuf->state.gfx.render.fb.info;
struct panvk_rendering_state *render = &cmdbuf->state.gfx.render;
struct pan_fb_layout *fb = &render->fb.layout;
/* In case we never emitted tiler/framebuffer descriptors, we emit the
* current sample count and compute tile size */
if (fbinfo->nr_samples == 0) {
fbinfo->nr_samples = cmdbuf->state.gfx.render.fb.nr_samples;
GENX(pan_select_tile_size)(fbinfo);
assert(fb->sample_count == render->fb.info.nr_samples);
if (fb->sample_count == 0) {
fb->sample_count = render->fb.nr_samples;
render->fb.info.nr_samples = render->fb.nr_samples;
GENX(pan_select_fb_tile_size)(fb);
#if PAN_ARCH != 6
if (fbinfo->cbuf_allocation > fbinfo->tile_buf_budget) {
if (fb->tile_rt_alloc_B > fb->tile_rt_budget_B) {
vk_perf(VK_LOG_OBJS(&cmdbuf->vk.base),
"Using too much tile-memory, disabling pipelining");
}
#endif
render->fb.info.tile_size = fb->tile_size_px;
render->fb.info.cbuf_allocation = fb->tile_rt_alloc_B;
} else {
/* In case we already emitted tiler/framebuffer descriptors, we ensure
* that the sample count didn't change (this should never happen) */
assert(fbinfo->nr_samples == cmdbuf->state.gfx.render.fb.nr_samples);
assert(fb->sample_count == render->fb.nr_samples);
}
}