diff --git a/src/gallium/drivers/panfrost/pan_job.c b/src/gallium/drivers/panfrost/pan_job.c index 46bc06d0770..6a0a0cdb2a3 100644 --- a/src/gallium/drivers/panfrost/pan_job.c +++ b/src/gallium/drivers/panfrost/pan_job.c @@ -451,11 +451,14 @@ panfrost_batch_to_fb_info(const struct panfrost_batch *batch, struct pan_image_view *zs, struct pan_image_view *s, bool reserve) { + struct panfrost_device *dev = pan_device(batch->ctx->base.screen); + memset(fb, 0, sizeof(*fb)); memset(rts, 0, sizeof(*rts) * 8); memset(zs, 0, sizeof(*zs)); memset(s, 0, sizeof(*s)); + fb->tile_buf_budget = dev->optimal_tib_size; fb->width = batch->key.width; fb->height = batch->key.height; fb->extent.minx = batch->minx; diff --git a/src/panfrost/lib/pan_desc.c b/src/panfrost/lib/pan_desc.c index b7160eb783d..0c4d6435305 100644 --- a/src/panfrost/lib/pan_desc.c +++ b/src/panfrost/lib/pan_desc.c @@ -691,7 +691,7 @@ GENX(pan_emit_fbd)(const struct panfrost_device *dev, unsigned bytes_per_pixel = pan_cbuf_bytes_per_pixel(dev, fb); unsigned tile_size = - pan_select_max_tile_size(dev->optimal_tib_size, bytes_per_pixel); + pan_select_max_tile_size(fb->tile_buf_budget, bytes_per_pixel); /* Clamp tile size to hardware limits */ tile_size = MIN2(tile_size, 16 * 16); @@ -699,7 +699,7 @@ GENX(pan_emit_fbd)(const struct panfrost_device *dev, /* Colour buffer allocations must be 1K aligned. */ unsigned cbuf_allocation = ALIGN_POT(bytes_per_pixel * tile_size, 1024); - assert(cbuf_allocation <= dev->optimal_tib_size && "tile too big"); + assert(cbuf_allocation <= fb->tile_buf_budget && "tile too big"); int crc_rt = GENX(pan_select_crc_rt)(fb, tile_size); bool has_zs_crc_ext = (fb->zs.view.zs || fb->zs.view.s || crc_rt >= 0); diff --git a/src/panfrost/lib/pan_desc.h b/src/panfrost/lib/pan_desc.h index 5cdb87ce43d..574594e77af 100644 --- a/src/panfrost/lib/pan_desc.h +++ b/src/panfrost/lib/pan_desc.h @@ -125,6 +125,9 @@ struct pan_fb_info { struct pan_fb_bifrost_info bifrost; }; + /* Optimal tile buffer size. */ + unsigned tile_buf_budget; + /* Only used on Valhall */ bool sprite_coord_origin; bool first_provoking_vertex; diff --git a/src/panfrost/vulkan/panvk_cmd_buffer.c b/src/panfrost/vulkan/panvk_cmd_buffer.c index 69c7651127f..167aaf68d52 100644 --- a/src/panfrost/vulkan/panvk_cmd_buffer.c +++ b/src/panfrost/vulkan/panvk_cmd_buffer.c @@ -482,6 +482,7 @@ panvk_cmd_fb_info_init(struct panvk_cmd_buffer *cmdbuf) memset(cmdbuf->state.fb.crc_valid, 0, sizeof(cmdbuf->state.fb.crc_valid)); *fbinfo = (struct pan_fb_info){ + .tile_buf_budget = cmdbuf->device->physical_device->pdev.optimal_tib_size, .width = fb->width, .height = fb->height, .extent.maxx = fb->width - 1, diff --git a/src/panfrost/vulkan/panvk_vX_meta_blit.c b/src/panfrost/vulkan/panvk_vX_meta_blit.c index bd752b33bfe..4cce902bba4 100644 --- a/src/panfrost/vulkan/panvk_vX_meta_blit.c +++ b/src/panfrost/vulkan/panvk_vX_meta_blit.c @@ -53,6 +53,7 @@ panvk_meta_blit(struct panvk_cmd_buffer *cmdbuf, }; *fbinfo = (struct pan_fb_info){ + .tile_buf_budget = cmdbuf->device->physical_device->pdev.optimal_tib_size, .width = u_minify(blitinfo->dst.planes[0].image->layout.width, blitinfo->dst.level), .height = u_minify(blitinfo->dst.planes[0].image->layout.height, diff --git a/src/panfrost/vulkan/panvk_vX_meta_clear.c b/src/panfrost/vulkan/panvk_vX_meta_clear.c index edde83a0b98..3082882868c 100644 --- a/src/panfrost/vulkan/panvk_vX_meta_clear.c +++ b/src/panfrost/vulkan/panvk_vX_meta_clear.c @@ -332,6 +332,7 @@ panvk_meta_clear_color_img(struct panvk_cmd_buffer *cmdbuf, cmdbuf->state.fb.crc_valid[0] = false; *fbinfo = (struct pan_fb_info){ + .tile_buf_budget = cmdbuf->device->physical_device->pdev.optimal_tib_size, .nr_samples = img->pimage.layout.nr_samples, .rt_count = 1, .rts[0].view = &view, @@ -401,6 +402,7 @@ panvk_meta_clear_zs_img(struct panvk_cmd_buffer *cmdbuf, cmdbuf->state.fb.crc_valid[0] = false; *fbinfo = (struct pan_fb_info){ + .tile_buf_budget = cmdbuf->device->physical_device->pdev.optimal_tib_size, .nr_samples = img->pimage.layout.nr_samples, .rt_count = 1, .zs.clear_value.depth = value->depth, diff --git a/src/panfrost/vulkan/panvk_vX_meta_copy.c b/src/panfrost/vulkan/panvk_vX_meta_copy.c index 041b84090a4..cf5a48b41a8 100644 --- a/src/panfrost/vulkan/panvk_vX_meta_copy.c +++ b/src/panfrost/vulkan/panvk_vX_meta_copy.c @@ -627,6 +627,7 @@ panvk_meta_copy_img2img(struct panvk_cmd_buffer *cmdbuf, u_minify(dst->pimage.layout.height, region->dstSubresource.mipLevel); cmdbuf->state.fb.crc_valid[0] = false; *fbinfo = (struct pan_fb_info){ + .tile_buf_budget = cmdbuf->device->physical_device->pdev.optimal_tib_size, .width = width, .height = height, .extent.minx = minx & ~31, @@ -1057,6 +1058,7 @@ panvk_meta_copy_buf2img(struct panvk_cmd_buffer *cmdbuf, /* TODO: don't force preloads of dst resources if unneeded */ cmdbuf->state.fb.crc_valid[0] = false; *fbinfo = (struct pan_fb_info){ + .tile_buf_budget = cmdbuf->device->physical_device->pdev.optimal_tib_size, .width = u_minify(img->pimage.layout.width, region->imageSubresource.mipLevel), .height =