diff --git a/src/gallium/drivers/panfrost/pan_cmdstream.c b/src/gallium/drivers/panfrost/pan_cmdstream.c index 499b4a2fb46..b15e6b810c7 100644 --- a/src/gallium/drivers/panfrost/pan_cmdstream.c +++ b/src/gallium/drivers/panfrost/pan_cmdstream.c @@ -1771,42 +1771,32 @@ panfrost_emit_varying_descriptor(struct panfrost_batch *batch, void panfrost_emit_vertex_tiler_jobs(struct panfrost_batch *batch, - void *vertex_job, - void *tiler_job) + const struct panfrost_transfer *vertex_job, + const struct panfrost_transfer *tiler_job) { struct panfrost_context *ctx = batch->ctx; - struct panfrost_device *device = pan_device(ctx->base.screen); bool wallpapering = ctx->wallpaper_batch && batch->scoreboard.tiler_dep; - void *vp = vertex_job + MALI_JOB_HEADER_LENGTH; - size_t vp_size = MALI_COMPUTE_JOB_LENGTH - - MALI_JOB_HEADER_LENGTH; - void *tp = tiler_job + MALI_JOB_HEADER_LENGTH; - bool is_bifrost = device->quirks & IS_BIFROST; - size_t tp_size = (is_bifrost ? - MALI_BIFROST_TILER_JOB_LENGTH : - MALI_MIDGARD_TILER_JOB_LENGTH) - - MALI_JOB_HEADER_LENGTH; if (wallpapering) { /* Inject in reverse order, with "predicted" job indices. * THIS IS A HACK XXX */ - panfrost_new_job(&batch->pool, &batch->scoreboard, MALI_JOB_TYPE_TILER, false, - batch->scoreboard.job_index + 2, tp, tp_size, true); - panfrost_new_job(&batch->pool, &batch->scoreboard, MALI_JOB_TYPE_VERTEX, false, 0, - vp, vp_size, true); + + panfrost_add_job(&batch->pool, &batch->scoreboard, MALI_JOB_TYPE_TILER, false, + batch->scoreboard.job_index + 2, tiler_job, true); + panfrost_add_job(&batch->pool, &batch->scoreboard, MALI_JOB_TYPE_VERTEX, false, 0, + vertex_job, true); return; } /* If rasterizer discard is enable, only submit the vertex */ - unsigned vertex = panfrost_new_job(&batch->pool, &batch->scoreboard, MALI_JOB_TYPE_VERTEX, false, 0, - vp, vp_size, false); + unsigned vertex = panfrost_add_job(&batch->pool, &batch->scoreboard, MALI_JOB_TYPE_VERTEX, false, 0, + vertex_job, false); if (ctx->rasterizer->base.rasterizer_discard) return; - panfrost_new_job(&batch->pool, &batch->scoreboard, MALI_JOB_TYPE_TILER, false, vertex, tp, tp_size, - false); + panfrost_add_job(&batch->pool, &batch->scoreboard, MALI_JOB_TYPE_TILER, false, vertex, tiler_job, false); } /* TODO: stop hardcoding this */ diff --git a/src/gallium/drivers/panfrost/pan_cmdstream.h b/src/gallium/drivers/panfrost/pan_cmdstream.h index ea4729b4316..20abf614b11 100644 --- a/src/gallium/drivers/panfrost/pan_cmdstream.h +++ b/src/gallium/drivers/panfrost/pan_cmdstream.h @@ -84,8 +84,8 @@ panfrost_emit_varying_descriptor(struct panfrost_batch *batch, void panfrost_emit_vertex_tiler_jobs(struct panfrost_batch *batch, - void *vertex_job, - void *tiler_job); + const struct panfrost_transfer *vertex_job, + const struct panfrost_transfer *tiler_job); mali_ptr panfrost_emit_sample_locations(struct panfrost_batch *batch); diff --git a/src/gallium/drivers/panfrost/pan_compute.c b/src/gallium/drivers/panfrost/pan_compute.c index 43907b3e49b..74986992e98 100644 --- a/src/gallium/drivers/panfrost/pan_compute.c +++ b/src/gallium/drivers/panfrost/pan_compute.c @@ -104,7 +104,10 @@ panfrost_launch_grid(struct pipe_context *pipe, ctx->compute_grid = info; /* TODO: Stub */ - struct mali_compute_job_packed job = { 0 }; + struct panfrost_transfer t = + panfrost_pool_alloc_aligned(&batch->pool, + MALI_COMPUTE_JOB_LENGTH, + 64); /* We implement OpenCL inputs as uniforms (or a UBO -- same thing), so * reuse the graphics path for this by lowering to Gallium */ @@ -122,7 +125,7 @@ panfrost_launch_grid(struct pipe_context *pipe, /* Invoke according to the grid info */ void *invocation = - pan_section_ptr(&job, COMPUTE_JOB, INVOCATION); + pan_section_ptr(t.cpu, COMPUTE_JOB, INVOCATION); panfrost_pack_work_groups_compute(invocation, info->grid[0], info->grid[1], info->grid[2], @@ -130,14 +133,14 @@ panfrost_launch_grid(struct pipe_context *pipe, info->block[2], false); - pan_section_pack(&job, COMPUTE_JOB, PARAMETERS, cfg) { + pan_section_pack(t.cpu, COMPUTE_JOB, PARAMETERS, cfg) { cfg.job_task_split = util_logbase2_ceil(info->block[0] + 1) + util_logbase2_ceil(info->block[1] + 1) + util_logbase2_ceil(info->block[2] + 1); } - pan_section_pack(&job, COMPUTE_JOB, DRAW, cfg) { + pan_section_pack(t.cpu, COMPUTE_JOB, DRAW, cfg) { cfg.unknown_1 = (dev->quirks & IS_BIFROST) ? 0x2 : 0x6; cfg.state = panfrost_emit_compute_shader_meta(batch, PIPE_SHADER_COMPUTE); cfg.shared = panfrost_emit_shared_memory(batch, info); @@ -149,12 +152,8 @@ panfrost_launch_grid(struct pipe_context *pipe, PIPE_SHADER_COMPUTE); } - panfrost_new_job(&batch->pool, &batch->scoreboard, - MALI_JOB_TYPE_COMPUTE, true, 0, - ((void *)&job) + MALI_JOB_HEADER_LENGTH, - MALI_COMPUTE_JOB_LENGTH - - MALI_JOB_HEADER_LENGTH, - false); + panfrost_add_job(&batch->pool, &batch->scoreboard, + MALI_JOB_TYPE_COMPUTE, true, 0, &t, true); panfrost_flush_all_batches(ctx, 0); } diff --git a/src/gallium/drivers/panfrost/pan_context.c b/src/gallium/drivers/panfrost/pan_context.c index bb79806127e..2e01e6b8f6f 100644 --- a/src/gallium/drivers/panfrost/pan_context.c +++ b/src/gallium/drivers/panfrost/pan_context.c @@ -454,13 +454,19 @@ panfrost_draw_vbo( ctx->instance_count = info->instance_count; ctx->active_prim = info->mode; - /* bifrost tiler is bigger than midgard's one, so let's use it as a - * generic container for both. - */ - struct mali_bifrost_tiler_job_packed tiler = {}; - struct mali_compute_job_packed vertex = {}; - unsigned vertex_count = ctx->vertex_count; bool is_bifrost = device->quirks & IS_BIFROST; + struct panfrost_transfer tiler = + panfrost_pool_alloc_aligned(&batch->pool, + is_bifrost ? + MALI_BIFROST_TILER_JOB_LENGTH : + MALI_MIDGARD_TILER_JOB_LENGTH, + 64); + struct panfrost_transfer vertex = + panfrost_pool_alloc_aligned(&batch->pool, + MALI_COMPUTE_JOB_LENGTH, + 64); + + unsigned vertex_count = ctx->vertex_count; mali_ptr shared_mem = is_bifrost ? panfrost_vt_emit_shared_memory(batch) : @@ -506,9 +512,9 @@ panfrost_draw_vbo( /* Fire off the draw itself */ panfrost_draw_emit_vertex(batch, info, &invocation, shared_mem, - vs_vary, varyings, &vertex); + vs_vary, varyings, vertex.cpu); panfrost_draw_emit_tiler(batch, info, &invocation, shared_mem, indices, - fs_vary, varyings, pos, psiz, &tiler); + fs_vary, varyings, pos, psiz, tiler.cpu); panfrost_emit_vertex_tiler_jobs(batch, &vertex, &tiler); /* Adjust the batch stack size based on the new shader stack sizes. */ diff --git a/src/panfrost/lib/pan_blit.c b/src/panfrost/lib/pan_blit.c index dd4934deec4..ff1da6fdc05 100644 --- a/src/panfrost/lib/pan_blit.c +++ b/src/panfrost/lib/pan_blit.c @@ -340,9 +340,10 @@ panfrost_load_midg( } } - struct mali_midgard_tiler_job_packed payload = {}; + struct panfrost_transfer t = + panfrost_pool_alloc_aligned(pool, MALI_MIDGARD_TILER_JOB_LENGTH, 64); - pan_section_pack(&payload, MIDGARD_TILER_JOB, DRAW, cfg) { + pan_section_pack(t.cpu, MIDGARD_TILER_JOB, DRAW, cfg) { cfg.unknown_1 = 0x7; cfg.position = coordinates; cfg.textures = panfrost_pool_upload(pool, &texture_t.gpu, sizeof(texture_t.gpu)); @@ -354,16 +355,14 @@ panfrost_load_midg( cfg.shared = fbd; } - pan_section_pack(&payload, MIDGARD_TILER_JOB, PRIMITIVE, cfg) { + pan_section_pack(t.cpu, MIDGARD_TILER_JOB, PRIMITIVE, cfg) { cfg.draw_mode = MALI_DRAW_MODE_TRIANGLES; cfg.index_count = vertex_count; cfg.unknown_3 = 6; } - panfrost_pack_work_groups_compute(pan_section_ptr(&payload, MIDGARD_TILER_JOB, INVOCATION), + panfrost_pack_work_groups_compute(pan_section_ptr(t.cpu, MIDGARD_TILER_JOB, INVOCATION), 1, vertex_count, 1, 1, 1, 1, true); - panfrost_new_job(pool, scoreboard, MALI_JOB_TYPE_TILER, false, 0, - pan_section_ptr(&payload, MIDGARD_TILER_JOB, INVOCATION), - MALI_MIDGARD_TILER_JOB_LENGTH - MALI_JOB_HEADER_LENGTH, true); + panfrost_add_job(pool, scoreboard, MALI_JOB_TYPE_TILER, false, 0, &t, true); } diff --git a/src/panfrost/lib/pan_scoreboard.c b/src/panfrost/lib/pan_scoreboard.c index 22f3eaae9f4..b0e2cb3fdd3 100644 --- a/src/panfrost/lib/pan_scoreboard.c +++ b/src/panfrost/lib/pan_scoreboard.c @@ -106,13 +106,13 @@ * not wallpapering and set this, dragons will eat you. */ unsigned -panfrost_new_job( +panfrost_add_job( struct pan_pool *pool, struct pan_scoreboard *scoreboard, enum mali_job_type type, bool barrier, unsigned local_dep, - void *payload, size_t payload_size, + const struct panfrost_transfer *job, bool inject) { unsigned global_dep = 0; @@ -133,24 +133,19 @@ panfrost_new_job( /* Assign the index */ unsigned index = ++scoreboard->job_index; - struct panfrost_transfer transfer = - panfrost_pool_alloc_aligned(pool, MALI_JOB_HEADER_LENGTH + payload_size, 64); - - pan_pack(transfer.cpu, JOB_HEADER, job) { - job.type = type; - job.barrier = barrier; - job.index = index; - job.dependency_1 = local_dep; - job.dependency_2 = global_dep; + pan_pack(job->cpu, JOB_HEADER, header) { + header.type = type; + header.barrier = barrier; + header.index = index; + header.dependency_1 = local_dep; + header.dependency_2 = global_dep; if (inject) - job.next = scoreboard->first_job; + header.next = scoreboard->first_job; } - memcpy(transfer.cpu + MALI_JOB_HEADER_LENGTH, payload, payload_size); - if (inject) { - scoreboard->first_job = transfer.gpu; + scoreboard->first_job = job->gpu; return index; } @@ -164,13 +159,13 @@ panfrost_new_job( * TODO: Find a way to defer last job header emission until we * have a new job to queue or the batch is ready for execution. */ - scoreboard->prev_job->opaque[6] = transfer.gpu; - scoreboard->prev_job->opaque[7] = transfer.gpu >> 32; + scoreboard->prev_job->opaque[6] = job->gpu; + scoreboard->prev_job->opaque[7] = job->gpu >> 32; } else { - scoreboard->first_job = transfer.gpu; + scoreboard->first_job = job->gpu; } - scoreboard->prev_job = (struct mali_job_header_packed *)transfer.cpu; + scoreboard->prev_job = (struct mali_job_header_packed *)job->cpu; return index; } diff --git a/src/panfrost/lib/pan_scoreboard.h b/src/panfrost/lib/pan_scoreboard.h index 53c65d43764..17fbc32549d 100644 --- a/src/panfrost/lib/pan_scoreboard.h +++ b/src/panfrost/lib/pan_scoreboard.h @@ -49,13 +49,13 @@ struct pan_scoreboard { }; unsigned -panfrost_new_job( +panfrost_add_job( struct pan_pool *pool, struct pan_scoreboard *scoreboard, enum mali_job_type type, bool barrier, unsigned local_dep, - void *payload, size_t payload_size, + const struct panfrost_transfer *job, bool inject); void panfrost_scoreboard_initialize_tiler(