diff --git a/src/gallium/drivers/panfrost/pan_cmdstream.c b/src/gallium/drivers/panfrost/pan_cmdstream.c index cdb793e0283..cd6a0641c1e 100644 --- a/src/gallium/drivers/panfrost/pan_cmdstream.c +++ b/src/gallium/drivers/panfrost/pan_cmdstream.c @@ -4827,7 +4827,6 @@ GENX(panfrost_cmdstream_screen_init)(struct panfrost_screen *screen) GENX(pan_blitter_init)(dev, &screen->blitter.bin_pool.base, &screen->blitter.desc_pool.base); #if PAN_GPU_INDIRECTS - GENX(pan_indirect_dispatch_init)(dev); GENX(panfrost_init_indirect_draw_shaders)(dev, &screen->indirect_draw.bin_pool.base); #endif } diff --git a/src/panfrost/lib/pan_indirect_dispatch.c b/src/panfrost/lib/pan_indirect_dispatch.c index f2f78cea8ea..8a6ad81167d 100644 --- a/src/panfrost/lib/pan_indirect_dispatch.c +++ b/src/panfrost/lib/pan_indirect_dispatch.c @@ -53,38 +53,8 @@ get_tls(const struct panfrost_device *dev) pan_size(RENDERER_STATE); } -unsigned -GENX(pan_indirect_dispatch_emit)(struct pan_pool *pool, - struct pan_scoreboard *scoreboard, - const struct pan_indirect_dispatch_info *inputs) -{ - struct panfrost_device *dev = pool->dev; - struct panfrost_ptr job = - pan_pool_alloc_desc(pool, COMPUTE_JOB); - void *invocation = - pan_section_ptr(job.cpu, COMPUTE_JOB, INVOCATION); - - panfrost_pack_work_groups_compute(invocation, - 1, 1, 1, 1, 1, 1, - false, false); - - pan_section_pack(job.cpu, COMPUTE_JOB, PARAMETERS, cfg) { - cfg.job_task_split = 2; - } - - pan_section_pack(job.cpu, COMPUTE_JOB, DRAW, cfg) { - cfg.state = get_rsd(dev); - cfg.thread_storage = get_tls(pool->dev); - cfg.push_uniforms = - pan_pool_upload_aligned(pool, inputs, sizeof(*inputs), 16); - } - - return panfrost_add_job(pool, scoreboard, MALI_JOB_TYPE_COMPUTE, - false, true, 0, 0, &job, false); -} - -void -GENX(pan_indirect_dispatch_init)(struct panfrost_device *dev) +static void +pan_indirect_dispatch_init(struct panfrost_device *dev) { nir_builder b = nir_builder_init_simple_shader(MESA_SHADER_COMPUTE, @@ -192,6 +162,40 @@ GENX(pan_indirect_dispatch_init)(struct panfrost_device *dev) }; } +unsigned +GENX(pan_indirect_dispatch_emit)(struct pan_pool *pool, + struct pan_scoreboard *scoreboard, + const struct pan_indirect_dispatch_info *inputs) +{ + struct panfrost_device *dev = pool->dev; + struct panfrost_ptr job = + pan_pool_alloc_desc(pool, COMPUTE_JOB); + void *invocation = + pan_section_ptr(job.cpu, COMPUTE_JOB, INVOCATION); + + /* If we haven't compiled the indirect dispatch shader yet, do it now */ + if (!dev->indirect_dispatch.bin) + pan_indirect_dispatch_init(dev); + + panfrost_pack_work_groups_compute(invocation, + 1, 1, 1, 1, 1, 1, + false, false); + + pan_section_pack(job.cpu, COMPUTE_JOB, PARAMETERS, cfg) { + cfg.job_task_split = 2; + } + + pan_section_pack(job.cpu, COMPUTE_JOB, DRAW, cfg) { + cfg.state = get_rsd(dev); + cfg.thread_storage = get_tls(pool->dev); + cfg.push_uniforms = + pan_pool_upload_aligned(pool, inputs, sizeof(*inputs), 16); + } + + return panfrost_add_job(pool, scoreboard, MALI_JOB_TYPE_COMPUTE, + false, true, 0, 0, &job, false); +} + void GENX(pan_indirect_dispatch_cleanup)(struct panfrost_device *dev) { diff --git a/src/panfrost/lib/pan_indirect_dispatch.h b/src/panfrost/lib/pan_indirect_dispatch.h index 26ab77939a6..e996c76551f 100644 --- a/src/panfrost/lib/pan_indirect_dispatch.h +++ b/src/panfrost/lib/pan_indirect_dispatch.h @@ -41,9 +41,6 @@ GENX(pan_indirect_dispatch_emit)(struct pan_pool *pool, struct pan_scoreboard *scoreboard, const struct pan_indirect_dispatch_info *dispatch_info); -void -GENX(pan_indirect_dispatch_init)(struct panfrost_device *dev); - void GENX(pan_indirect_dispatch_cleanup)(struct panfrost_device *dev);