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,
bool msaa)
v3dv_return_if_oom(NULL, job);
job->allocate_tile_state_for_all_layers = allocate_tile_state_for_all_layers;
- if (!v3dv_job_allocate_tile_state(job))
- return;
+
+ /* 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;
+ }
v3dv_X(job->device, job_emit_binning_prolog)(job, tiling,
allocate_tile_state_for_all_layers ? tiling->layers : 1);
static void
cmd_buffer_end_render_pass_frame(struct v3dv_cmd_buffer *cmd_buffer)
{
- assert(cmd_buffer->state.job);
+ struct v3dv_job *job = cmd_buffer->state.job;
+ assert(job);
/* Typically, we have a single job for each subpass and we emit the job's RCL
* here when we are ending the frame for the subpass. However, some commands
* those jobs, so we only emit the subpass RCL if the job has not recorded
* any RCL commands of its own.
*/
- if (v3dv_cl_offset(&cmd_buffer->state.job->rcl) == 0)
+ if (v3dv_cl_offset(&job->rcl) == 0) {
+ /* At this point we have decided whether we want to use double-buffer or
+ * not and the job's frame tiling represents that decision so we can
+ * allocate the tile state, which we need to do before we emit the RCL.
+ */
+ v3dv_job_allocate_tile_state(job);
+
v3dv_X(cmd_buffer->device, cmd_buffer_emit_render_pass_rcl)(cmd_buffer);
+ }
- v3dv_X(cmd_buffer->device, job_emit_binning_flush)(cmd_buffer->state.job);
+ v3dv_X(cmd_buffer->device, job_emit_binning_flush)(job);
}
struct v3dv_job *
framebuffer->width,
framebuffer->height,
layers,
- true,
+ true, false,
subpass->color_count,
internal_bpp,
msaa);
old_job->frame_tiling.width,
old_job->frame_tiling.height,
old_job->frame_tiling.layers,
- true,
+ true, false,
old_job->frame_tiling.render_target_count,
old_job->frame_tiling.internal_bpp,
true /* msaa */);
if (!job)
return true;
- v3dv_job_start_frame(job, width, height, max_layer, false,
- 1, internal_bpp,
+ v3dv_job_start_frame(job, width, height, max_layer,
+ false, true, 1, internal_bpp,
image->vk.samples > VK_SAMPLE_COUNT_1_BIT);
struct v3dv_meta_framebuffer framebuffer;
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,
+ v3dv_job_start_frame(job, width, height, num_layers, false, true,
1, internal_bpp, false);
struct v3dv_meta_framebuffer framebuffer;
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, 1, internal_bpp,
+ v3dv_job_start_frame(job, width, height, num_layers,
+ false, true, 1, internal_bpp,
src->vk.samples > VK_SAMPLE_COUNT_1_BIT);
struct v3dv_meta_framebuffer framebuffer;
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,
+ v3dv_job_start_frame(job, width, height, num_layers, false, true,
1, internal_bpp, false);
struct v3dv_meta_framebuffer framebuffer;
(fb_format, region->srcSubresource.aspectMask,
&internal_type, &internal_bpp);
- v3dv_job_start_frame(job, width, height, num_layers, false,
+ v3dv_job_start_frame(job, width, height, num_layers, false, true,
1, internal_bpp, true);
struct v3dv_meta_framebuffer framebuffer;
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,
bool msaa);
uint32_t width, height;
framebuffer_size_for_pixel_count(num_items, &width, &height);
- v3dv_job_start_frame(job, width, height, 1, true, 1, internal_bpp, false);
+ v3dv_job_start_frame(job, width, height, 1, true, true,
+ 1, internal_bpp, false);
struct v3dv_meta_framebuffer framebuffer;
v3dX(meta_framebuffer_init)(&framebuffer, vk_format, internal_type,
uint32_t width, height;
framebuffer_size_for_pixel_count(num_items, &width, &height);
- v3dv_job_start_frame(job, width, height, 1, true, 1, internal_bpp, false);
+ v3dv_job_start_frame(job, width, height, 1, true, true,
+ 1, internal_bpp, false);
struct v3dv_meta_framebuffer framebuffer;
v3dX(meta_framebuffer_init)(&framebuffer, VK_FORMAT_R8G8B8A8_UINT,
void
v3dX(job_emit_noop)(struct v3dv_job *job)
{
- v3dv_job_start_frame(job, 1, 1, 1, true, 1, V3D_INTERNAL_BPP_32, false);
+ v3dv_job_start_frame(job, 1, 1, 1, true, true, 1, V3D_INTERNAL_BPP_32, false);
v3dX(job_emit_binning_flush)(job);
struct v3dv_cl *rcl = &job->rcl;