diff --git a/src/broadcom/vulkan/v3dv_cmd_buffer.c b/src/broadcom/vulkan/v3dv_cmd_buffer.c index a097dc210ee..4158efa2806 100644 --- a/src/broadcom/vulkan/v3dv_cmd_buffer.c +++ b/src/broadcom/vulkan/v3dv_cmd_buffer.c @@ -490,7 +490,6 @@ v3dv_job_start_frame(struct v3dv_job *job, uint32_t height, uint32_t layers, bool allocate_tile_state_for_all_layers, - bool allocate_tile_state_now, uint32_t render_target_count, uint8_t max_internal_bpp, uint8_t total_color_bpp, @@ -511,14 +510,6 @@ v3dv_job_start_frame(struct v3dv_job *job, job->allocate_tile_state_for_all_layers = allocate_tile_state_for_all_layers; - /* For subpass jobs we postpone tile state allocation until we are finishing - * the job and have made a decision about double-buffer. - */ - if (allocate_tile_state_now) { - if (!v3dv_job_allocate_tile_state(job)) - return; - } - v3d_X((&job->device->devinfo), job_emit_binning_prolog)(job, tiling, allocate_tile_state_for_all_layers ? tiling->layers : 1); @@ -1785,7 +1776,7 @@ cmd_buffer_subpass_create_job(struct v3dv_cmd_buffer *cmd_buffer, width, height, layers, - true, false, + true, subpass->color_count, max_internal_bpp, total_color_bpp, @@ -2776,7 +2767,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, false, + true, old_job->frame_tiling.render_target_count, old_job->frame_tiling.internal_bpp, old_job->frame_tiling.total_color_bpp, diff --git a/src/broadcom/vulkan/v3dv_cmd_buffer.h b/src/broadcom/vulkan/v3dv_cmd_buffer.h index 37f30d6bced..ed45c89573c 100644 --- a/src/broadcom/vulkan/v3dv_cmd_buffer.h +++ b/src/broadcom/vulkan/v3dv_cmd_buffer.h @@ -306,7 +306,6 @@ void v3dv_job_start_frame(struct v3dv_job *job, uint32_t height, uint32_t layers, bool allocate_tile_state_for_all_layers, - bool allocate_tile_state_now, uint32_t render_target_count, uint8_t max_internal_bpp, uint8_t total_color_bpp, diff --git a/src/broadcom/vulkan/v3dv_meta_clear.c b/src/broadcom/vulkan/v3dv_meta_clear.c index 87147f4d798..83a2409ab72 100644 --- a/src/broadcom/vulkan/v3dv_meta_clear.c +++ b/src/broadcom/vulkan/v3dv_meta_clear.c @@ -138,9 +138,8 @@ clear_image_tlb(struct v3dv_cmd_buffer *cmd_buffer, if (!job) return true; - v3dv_job_start_frame(job, width, height, max_layer, - false, true, 1, internal_bpp, - 4 * v3d_internal_bpp_words(internal_bpp), + v3dv_job_start_frame(job, width, height, max_layer, false, 1, + internal_bpp, 4 * v3d_internal_bpp_words(internal_bpp), image->vk.samples > VK_SAMPLE_COUNT_1_BIT); struct v3dv_meta_framebuffer framebuffer; @@ -149,6 +148,8 @@ clear_image_tlb(struct v3dv_cmd_buffer *cmd_buffer, &job->frame_tiling); v3d_X((&job->device->devinfo), job_emit_binning_flush)(job); + if (!v3dv_job_allocate_tile_state(job)) + return true; /* If this triggers it is an application bug: the spec requires * that any aspects to clear are present in the image. diff --git a/src/broadcom/vulkan/v3dv_meta_copy.c b/src/broadcom/vulkan/v3dv_meta_copy.c index 62fe9fd6638..b2c99cdf6c1 100644 --- a/src/broadcom/vulkan/v3dv_meta_copy.c +++ b/src/broadcom/vulkan/v3dv_meta_copy.c @@ -485,15 +485,17 @@ 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, false, true, 1, - internal_bpp, 4 * v3d_internal_bpp_words(internal_bpp), - false); + v3dv_job_start_frame(job, width, height, num_layers, false, 1, internal_bpp, + 4 * v3d_internal_bpp_words(internal_bpp), false); struct v3dv_meta_framebuffer framebuffer; v3d_X((&job->device->devinfo), meta_framebuffer_init)(&framebuffer, fb_format, internal_type, &job->frame_tiling); v3d_X((&job->device->devinfo), job_emit_binning_flush)(job); + if (!v3dv_job_allocate_tile_state(job)) + return true; + v3d_X((&job->device->devinfo), meta_emit_copy_image_to_buffer_rcl) (job, buffer, image, &framebuffer, region); @@ -1377,7 +1379,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, false, true, 1, + v3dv_job_start_frame(job, width, height, num_layers, false, 1, internal_bpp, 4 * v3d_internal_bpp_words(internal_bpp), src->vk.samples > VK_SAMPLE_COUNT_1_BIT); @@ -1386,6 +1388,9 @@ copy_image_tlb(struct v3dv_cmd_buffer *cmd_buffer, internal_type, &job->frame_tiling); v3d_X((&job->device->devinfo), job_emit_binning_flush)(job); + if (!v3dv_job_allocate_tile_state(job)) + return true; + v3d_X((&job->device->devinfo), meta_emit_copy_image_rcl)(job, dst, src, &framebuffer, region); v3dv_cmd_buffer_finish_job(cmd_buffer); @@ -2061,7 +2066,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, false, true, 1, + v3dv_job_start_frame(job, width, height, num_layers, false, 1, internal_bpp, 4 * v3d_internal_bpp_words(internal_bpp), false); @@ -2070,6 +2075,9 @@ copy_buffer_to_image_tlb(struct v3dv_cmd_buffer *cmd_buffer, internal_type, &job->frame_tiling); v3d_X((&job->device->devinfo), job_emit_binning_flush)(job); + if (!v3dv_job_allocate_tile_state(job)) + return true; + v3d_X((&job->device->devinfo), meta_emit_copy_buffer_to_image_rcl) (job, image, buffer, &framebuffer, region); @@ -4923,15 +4931,17 @@ resolve_image_tlb(struct v3dv_cmd_buffer *cmd_buffer, (resolve_format, region->srcSubresource.aspectMask, &internal_type, &internal_bpp); - v3dv_job_start_frame(job, width, height, num_layers, false, true, 1, - internal_bpp, 4 * v3d_internal_bpp_words(internal_bpp), - true); + v3dv_job_start_frame(job, width, height, num_layers, false, 1, internal_bpp, + 4 * v3d_internal_bpp_words(internal_bpp), true); struct v3dv_meta_framebuffer framebuffer; v3d_X((&job->device->devinfo), meta_framebuffer_init)(&framebuffer, resolve_format, internal_type, &job->frame_tiling); v3d_X((&job->device->devinfo), job_emit_binning_flush)(job); + if (!v3dv_job_allocate_tile_state(job)) + return true; + v3d_X((&job->device->devinfo), meta_emit_resolve_image_rcl)(job, dst, src, &framebuffer, region); diff --git a/src/broadcom/vulkan/v3dvx_meta_common.c b/src/broadcom/vulkan/v3dvx_meta_common.c index 628562de50d..76edd97a986 100644 --- a/src/broadcom/vulkan/v3dvx_meta_common.c +++ b/src/broadcom/vulkan/v3dvx_meta_common.c @@ -1410,15 +1410,16 @@ 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, true, true, 1, - internal_bpp, 4 * v3d_internal_bpp_words(internal_bpp), - false); + v3dv_job_start_frame(job, width, height, 1, true, 1, internal_bpp, + 4 * v3d_internal_bpp_words(internal_bpp), false); struct v3dv_meta_framebuffer framebuffer; v3dX(meta_framebuffer_init)(&framebuffer, vk_format, internal_type, &job->frame_tiling); v3dX(job_emit_binning_flush)(job); + if (!v3dv_job_allocate_tile_state(job)) + return NULL; v3dX(meta_emit_copy_buffer_rcl)(job, dst, src, dst_offset, src_offset, &framebuffer, format, item_size); @@ -1458,15 +1459,16 @@ 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, true, true, 1, - internal_bpp, 4 * v3d_internal_bpp_words(internal_bpp), - false); + v3dv_job_start_frame(job, width, height, 1, true, 1, internal_bpp, + 4 * v3d_internal_bpp_words(internal_bpp), false); struct v3dv_meta_framebuffer framebuffer; v3dX(meta_framebuffer_init)(&framebuffer, VK_FORMAT_R8G8B8A8_UINT, internal_type, &job->frame_tiling); v3dX(job_emit_binning_flush)(job); + if (!v3dv_job_allocate_tile_state(job)) + return; v3dX(meta_emit_fill_buffer_rcl)(job, bo, offset, &framebuffer, data); diff --git a/src/broadcom/vulkan/v3dvx_queue.c b/src/broadcom/vulkan/v3dvx_queue.c index 4fe88016cbb..251ed4ad4a8 100644 --- a/src/broadcom/vulkan/v3dvx_queue.c +++ b/src/broadcom/vulkan/v3dvx_queue.c @@ -30,9 +30,10 @@ void v3dX(job_emit_noop)(struct v3dv_job *job) { - v3dv_job_start_frame(job, 1, 1, 1, true, true, 1, - V3D_INTERNAL_BPP_32, 4, false); + v3dv_job_start_frame(job, 1, 1, 1, true, 1, V3D_INTERNAL_BPP_32, 4, false); v3dX(job_emit_binning_flush)(job); + if (!v3dv_job_allocate_tile_state(job)) + return; struct v3dv_cl *rcl = &job->rcl; v3dv_cl_ensure_space_with_branch(rcl, 200 + 1 * 256 *