diff --git a/src/broadcom/vulkan/v3dv_cmd_buffer.c b/src/broadcom/vulkan/v3dv_cmd_buffer.c index ed0f975a6ed..557b703ae04 100644 --- a/src/broadcom/vulkan/v3dv_cmd_buffer.c +++ b/src/broadcom/vulkan/v3dv_cmd_buffer.c @@ -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 */); diff --git a/src/broadcom/vulkan/v3dv_meta_clear.c b/src/broadcom/vulkan/v3dv_meta_clear.c index 60a7843d1d6..759d4bfa46d 100644 --- a/src/broadcom/vulkan/v3dv_meta_clear.c +++ b/src/broadcom/vulkan/v3dv_meta_clear.c @@ -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); diff --git a/src/broadcom/vulkan/v3dv_meta_copy.c b/src/broadcom/vulkan/v3dv_meta_copy.c index 4d2cb2f172a..39b92af8991 100644 --- a/src/broadcom/vulkan/v3dv_meta_copy.c +++ b/src/broadcom/vulkan/v3dv_meta_copy.c @@ -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, diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h index 0f03f392742..b7bc7dc0c9b 100644 --- a/src/broadcom/vulkan/v3dv_private.h +++ b/src/broadcom/vulkan/v3dv_private.h @@ -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); diff --git a/src/broadcom/vulkan/v3dvx_meta_common.c b/src/broadcom/vulkan/v3dvx_meta_common.c index 51130d0a83f..c652377e10b 100644 --- a/src/broadcom/vulkan/v3dvx_meta_common.c +++ b/src/broadcom/vulkan/v3dvx_meta_common.c @@ -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, diff --git a/src/broadcom/vulkan/v3dvx_queue.c b/src/broadcom/vulkan/v3dvx_queue.c index 4a70141bfca..38f9efbfa5d 100644 --- a/src/broadcom/vulkan/v3dvx_queue.c +++ b/src/broadcom/vulkan/v3dvx_queue.c @@ -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;