v3dv: allow limiting amount of tile state allocated
With multilayered framebuffer we want to allocate enough tile state for all layers involved, so te binner can handle layered rendering where a geometry shader is used to redirect primitives to specific layers by writing to gl_Layer. However, we may also have layered framebuffers in cases where layered rendering won't be used. Typically this will happen for meta copy/clear operations, where we setup multilayered framebuffers but then we just load and/or store the tile buffer without ever rendering a primitive, let alone use a geometry shader to do layered rendering. In these cases we can reduce the amount of tile state allocated to a sigle layer. This patch allows us to specify if we should allocate tile state for all layers when we start a new frame. We will take advantage of this in later patches targetting the meta copy/clear code paths. Reviewed-by: Alejandro Piñeiro <apinheiro@igalia.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11923>
This commit is contained in:
parent
93e7534a66
commit
7fcc518473
|
@ -513,6 +513,7 @@ v3dv_job_start_frame(struct v3dv_job *job,
|
|||
uint32_t width,
|
||||
uint32_t height,
|
||||
uint32_t layers,
|
||||
bool allocate_tile_state_for_all_layers,
|
||||
uint32_t render_target_count,
|
||||
uint8_t max_internal_bpp,
|
||||
bool msaa)
|
||||
|
@ -528,6 +529,16 @@ v3dv_job_start_frame(struct v3dv_job *job,
|
|||
v3dv_cl_ensure_space_with_branch(&job->bcl, 256);
|
||||
v3dv_return_if_oom(NULL, job);
|
||||
|
||||
/* We only need to allocate tile state for all layers if the binner
|
||||
* writes primitives to layers other than the first. This can only be
|
||||
* done using layered rendering (writing gl_Layer from a geometry shader),
|
||||
* so for other cases of multilayered framebuffers (typically with
|
||||
* meta copy/clear operations) that won't use layered rendering, we only
|
||||
* need one layer worth of of tile state for the binner.
|
||||
*/
|
||||
if (!allocate_tile_state_for_all_layers)
|
||||
layers = 1;
|
||||
|
||||
/* The PTB will request the tile alloc initial size per tile at start
|
||||
* of tile binning.
|
||||
*/
|
||||
|
@ -1490,6 +1501,7 @@ cmd_buffer_subpass_create_job(struct v3dv_cmd_buffer *cmd_buffer,
|
|||
framebuffer->width,
|
||||
framebuffer->height,
|
||||
framebuffer->layers,
|
||||
true,
|
||||
subpass->color_count,
|
||||
internal_bpp,
|
||||
msaa);
|
||||
|
@ -2405,6 +2417,7 @@ cmd_buffer_restart_job_for_msaa_if_needed(struct v3dv_cmd_buffer *cmd_buffer)
|
|||
old_job->frame_tiling.width,
|
||||
old_job->frame_tiling.height,
|
||||
old_job->frame_tiling.layers,
|
||||
true,
|
||||
old_job->frame_tiling.render_target_count,
|
||||
old_job->frame_tiling.internal_bpp,
|
||||
true /* msaa */);
|
||||
|
|
|
@ -124,7 +124,7 @@ clear_image_tlb(struct v3dv_cmd_buffer *cmd_buffer,
|
|||
if (!job)
|
||||
return true;
|
||||
|
||||
v3dv_job_start_frame(job, width, height, max_layer,
|
||||
v3dv_job_start_frame(job, width, height, max_layer, true,
|
||||
1, internal_bpp,
|
||||
image->samples > VK_SAMPLE_COUNT_1_BIT);
|
||||
|
||||
|
|
|
@ -408,7 +408,8 @@ copy_image_to_buffer_tlb(struct v3dv_cmd_buffer *cmd_buffer,
|
|||
const uint32_t width = DIV_ROUND_UP(region->imageExtent.width, block_w);
|
||||
const uint32_t height = DIV_ROUND_UP(region->imageExtent.height, block_h);
|
||||
|
||||
v3dv_job_start_frame(job, width, height, num_layers, 1, internal_bpp, false);
|
||||
v3dv_job_start_frame(job, width, height, num_layers, true,
|
||||
1, internal_bpp, false);
|
||||
|
||||
struct v3dv_meta_framebuffer framebuffer;
|
||||
v3dv_X(job->device, meta_framebuffer_init)(&framebuffer, fb_format,
|
||||
|
@ -915,7 +916,7 @@ copy_image_tlb(struct v3dv_cmd_buffer *cmd_buffer,
|
|||
const uint32_t width = DIV_ROUND_UP(region->extent.width, block_w);
|
||||
const uint32_t height = DIV_ROUND_UP(region->extent.height, block_h);
|
||||
|
||||
v3dv_job_start_frame(job, width, height, num_layers, 1, internal_bpp,
|
||||
v3dv_job_start_frame(job, width, height, num_layers, true, 1, internal_bpp,
|
||||
src->samples > VK_SAMPLE_COUNT_1_BIT);
|
||||
|
||||
struct v3dv_meta_framebuffer framebuffer;
|
||||
|
@ -1419,7 +1420,7 @@ copy_buffer_to_image_tlb(struct v3dv_cmd_buffer *cmd_buffer,
|
|||
const uint32_t width = DIV_ROUND_UP(region->imageExtent.width, block_w);
|
||||
const uint32_t height = DIV_ROUND_UP(region->imageExtent.height, block_h);
|
||||
|
||||
v3dv_job_start_frame(job, width, height, num_layers, 1, internal_bpp, false);
|
||||
v3dv_job_start_frame(job, width, height, num_layers, true, 1, internal_bpp, false);
|
||||
|
||||
struct v3dv_meta_framebuffer framebuffer;
|
||||
v3dv_X(job->device, meta_framebuffer_init)(&framebuffer, fb_format,
|
||||
|
@ -4250,7 +4251,7 @@ resolve_image_tlb(struct v3dv_cmd_buffer *cmd_buffer,
|
|||
(fb_format, region->srcSubresource.aspectMask,
|
||||
&internal_type, &internal_bpp);
|
||||
|
||||
v3dv_job_start_frame(job, width, height, num_layers, 1, internal_bpp, true);
|
||||
v3dv_job_start_frame(job, width, height, num_layers, true, 1, internal_bpp, true);
|
||||
|
||||
struct v3dv_meta_framebuffer framebuffer;
|
||||
v3dv_X(job->device, meta_framebuffer_init)(&framebuffer, fb_format,
|
||||
|
|
|
@ -1029,6 +1029,7 @@ void v3dv_job_start_frame(struct v3dv_job *job,
|
|||
uint32_t width,
|
||||
uint32_t height,
|
||||
uint32_t layers,
|
||||
bool allocate_tile_state_for_all_layers,
|
||||
uint32_t render_target_count,
|
||||
uint8_t max_internal_bpp,
|
||||
bool msaa);
|
||||
|
|
|
@ -1264,7 +1264,7 @@ v3dX(meta_copy_buffer)(struct v3dv_cmd_buffer *cmd_buffer,
|
|||
uint32_t width, height;
|
||||
framebuffer_size_for_pixel_count(num_items, &width, &height);
|
||||
|
||||
v3dv_job_start_frame(job, width, height, 1, 1, internal_bpp, false);
|
||||
v3dv_job_start_frame(job, width, height, 1, true, 1, internal_bpp, false);
|
||||
|
||||
struct v3dv_meta_framebuffer framebuffer;
|
||||
v3dX(meta_framebuffer_init)(&framebuffer, vk_format, internal_type,
|
||||
|
@ -1310,7 +1310,7 @@ v3dX(meta_fill_buffer)(struct v3dv_cmd_buffer *cmd_buffer,
|
|||
uint32_t width, height;
|
||||
framebuffer_size_for_pixel_count(num_items, &width, &height);
|
||||
|
||||
v3dv_job_start_frame(job, width, height, 1, 1, internal_bpp, false);
|
||||
v3dv_job_start_frame(job, width, height, 1, true, 1, internal_bpp, false);
|
||||
|
||||
struct v3dv_meta_framebuffer framebuffer;
|
||||
v3dX(meta_framebuffer_init)(&framebuffer, VK_FORMAT_R8G8B8A8_UINT,
|
||||
|
|
|
@ -29,7 +29,7 @@
|
|||
void
|
||||
v3dX(job_emit_noop)(struct v3dv_job *job)
|
||||
{
|
||||
v3dv_job_start_frame(job, 1, 1, 1, 1, V3D_INTERNAL_BPP_32, false);
|
||||
v3dv_job_start_frame(job, 1, 1, 1, true, 1, V3D_INTERNAL_BPP_32, false);
|
||||
v3dX(job_emit_binning_flush)(job);
|
||||
|
||||
struct v3dv_cl *rcl = &job->rcl;
|
||||
|
|
Loading…
Reference in New Issue