Module: Mesa Branch: main Commit: 1c953ba212109f10e9bf1d3b277b59b8291bca1f URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=1c953ba212109f10e9bf1d3b277b59b8291bca1f
Author: Boris Brezillon <[email protected]> Date: Fri Aug 6 11:21:14 2021 +0200 panfrost: Prepare indirect draw helpers to per-gen XML Signed-off-by: Boris Brezillon <[email protected]> Reviewed-by: Alyssa Rosenzweig <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12551> --- src/gallium/drivers/panfrost/pan_cmdstream.c | 10 ++- src/gallium/drivers/panfrost/pan_screen.c | 3 - src/panfrost/lib/meson.build | 2 +- src/panfrost/lib/pan_indirect_draw.c | 111 +++++++++++++-------------- src/panfrost/lib/pan_indirect_draw.h | 16 ++-- 5 files changed, 70 insertions(+), 72 deletions(-) diff --git a/src/gallium/drivers/panfrost/pan_cmdstream.c b/src/gallium/drivers/panfrost/pan_cmdstream.c index f0f119e663a..47fd051e5bd 100644 --- a/src/gallium/drivers/panfrost/pan_cmdstream.c +++ b/src/gallium/drivers/panfrost/pan_cmdstream.c @@ -2993,10 +2993,10 @@ panfrost_indirect_draw(struct panfrost_batch *batch, } batch->indirect_draw_job_id = - panfrost_emit_indirect_draw(&batch->pool.base, - &batch->scoreboard, - &draw_info, - &batch->indirect_draw_ctx); + GENX(panfrost_emit_indirect_draw)(&batch->pool.base, + &batch->scoreboard, + &draw_info, + &batch->indirect_draw_ctx); panfrost_emit_vertex_tiler_jobs(batch, &vertex, &tiler); } @@ -3527,6 +3527,7 @@ screen_destroy(struct pipe_screen *pscreen) { struct panfrost_device *dev = pan_device(pscreen); pan_blitter_cleanup(dev); + GENX(panfrost_cleanup_indirect_draw_shaders)(dev); GENX(pan_indirect_dispatch_cleanup)(dev); } @@ -3668,4 +3669,5 @@ GENX(panfrost_cmdstream_screen_init)(struct panfrost_screen *screen) pan_blitter_init(dev, &screen->blitter.bin_pool.base, &screen->blitter.desc_pool.base); GENX(pan_indirect_dispatch_init)(dev); + GENX(panfrost_init_indirect_draw_shaders)(dev, &screen->indirect_draw.bin_pool.base); } diff --git a/src/gallium/drivers/panfrost/pan_screen.c b/src/gallium/drivers/panfrost/pan_screen.c index b4f3b63be58..46cd97bbf13 100644 --- a/src/gallium/drivers/panfrost/pan_screen.c +++ b/src/gallium/drivers/panfrost/pan_screen.c @@ -49,7 +49,6 @@ #include "pan_resource.h" #include "pan_public.h" #include "pan_util.h" -#include "pan_indirect_draw.h" #include "decode.h" #include "pan_context.h" @@ -708,7 +707,6 @@ panfrost_destroy_screen(struct pipe_screen *pscreen) struct panfrost_screen *screen = pan_screen(pscreen); panfrost_resource_screen_destroy(pscreen); - panfrost_cleanup_indirect_draw_shaders(dev); panfrost_pool_cleanup(&screen->indirect_draw.bin_pool); panfrost_pool_cleanup(&screen->blitter.bin_pool); panfrost_pool_cleanup(&screen->blitter.desc_pool); @@ -898,7 +896,6 @@ panfrost_create_screen(int fd, struct renderonly *ro) panfrost_pool_init(&screen->indirect_draw.bin_pool, NULL, dev, PAN_BO_EXECUTE, 65536, "Indirect draw shaders", false, true); - panfrost_init_indirect_draw_shaders(dev, &screen->indirect_draw.bin_pool.base); panfrost_pool_init(&screen->blitter.bin_pool, NULL, dev, PAN_BO_EXECUTE, 4096, "Blitter shaders", false, true); panfrost_pool_init(&screen->blitter.desc_pool, NULL, dev, 0, 65536, diff --git a/src/panfrost/lib/meson.build b/src/panfrost/lib/meson.build index 72b4e3e607f..bb11b843413 100644 --- a/src/panfrost/lib/meson.build +++ b/src/panfrost/lib/meson.build @@ -55,6 +55,7 @@ foreach ver : ['4', '5', '6', '7'] 'pan-arch-v' + ver, [ 'pan_indirect_dispatch.c', + 'pan_indirect_draw.c', ], include_directories : [inc_include, inc_src, inc_mapi, inc_mesa, inc_gallium, inc_gallium_aux, inc_panfrost_hw], c_args : ['-DPAN_ARCH=' + ver], @@ -73,7 +74,6 @@ libpanfrost_lib_files = files( 'pan_blitter.c', 'pan_clear.c', 'pan_cs.c', - 'pan_indirect_draw.c', 'pan_samples.c', 'pan_tiler.c', 'pan_texture.c', diff --git a/src/panfrost/lib/pan_indirect_draw.c b/src/panfrost/lib/pan_indirect_draw.c index 2e9c49ff870..ef054163405 100644 --- a/src/panfrost/lib/pan_indirect_draw.c +++ b/src/panfrost/lib/pan_indirect_draw.c @@ -397,17 +397,9 @@ update_job(struct indirect_draw_shader_builder *builder, enum mali_job_type type unsigned draw_offset = type == MALI_JOB_TYPE_VERTEX ? pan_section_offset(COMPUTE_JOB, DRAW) : - pan_is_bifrost(builder->dev) ? - pan_section_offset(BIFROST_TILER_JOB, DRAW) : - pan_section_offset(MIDGARD_TILER_JOB, DRAW); - unsigned prim_offset = - pan_is_bifrost(builder->dev) ? - pan_section_offset(BIFROST_TILER_JOB, PRIMITIVE) : - pan_section_offset(MIDGARD_TILER_JOB, PRIMITIVE); - unsigned psiz_offset = - pan_is_bifrost(builder->dev) ? - pan_section_offset(BIFROST_TILER_JOB, PRIMITIVE_SIZE) : - pan_section_offset(MIDGARD_TILER_JOB, PRIMITIVE_SIZE); + pan_section_offset(TILER_JOB, DRAW); + unsigned prim_offset = pan_section_offset(TILER_JOB, PRIMITIVE); + unsigned psiz_offset = pan_section_offset(TILER_JOB, PRIMITIVE_SIZE); unsigned index_size = builder->index_size; if (type == MALI_JOB_TYPE_TILER) { @@ -586,8 +578,11 @@ update_vertex_attribs(struct indirect_draw_shader_builder *builder) nir_local_variable_create(b->impl, glsl_uint_type(), "attrib_idx"); nir_store_var(b, attrib_idx_var, nir_imm_int(b, 0), 1); + +#if PAN_ARCH <= 5 nir_ssa_def *single_instance = nir_ult(b, builder->draw.instance_count, nir_imm_int(b, 2)); +#endif LOOP { nir_ssa_def *attrib_idx = nir_load_var(b, attrib_idx_var); @@ -606,43 +601,43 @@ update_vertex_attribs(struct indirect_draw_shader_builder *builder) nir_ssa_def *r_e, *d; - if (!pan_is_bifrost(builder->dev)) { - IF (nir_ieq_imm(b, attrib_idx, PAN_VERTEX_ID)) { - nir_ssa_def *r_p = - nir_bcsel(b, single_instance, - nir_imm_int(b, 0x9f), - builder->instance_size.packed); +#if PAN_ARCH <= 5 + IF (nir_ieq_imm(b, attrib_idx, PAN_VERTEX_ID)) { + nir_ssa_def *r_p = + nir_bcsel(b, single_instance, + nir_imm_int(b, 0x9f), + builder->instance_size.packed); - store_global(b, - get_address_imm(b, attrib_buf_ptr, WORD(4)), - nir_ishl(b, r_p, nir_imm_int(b, 24)), 1); + store_global(b, + get_address_imm(b, attrib_buf_ptr, WORD(4)), + nir_ishl(b, r_p, nir_imm_int(b, 24)), 1); - nir_store_var(b, attrib_idx_var, - nir_iadd_imm(b, attrib_idx, 1), 1); - CONTINUE; - } ENDIF + nir_store_var(b, attrib_idx_var, + nir_iadd_imm(b, attrib_idx, 1), 1); + CONTINUE; + } ENDIF - IF (nir_ieq_imm(b, attrib_idx, PAN_INSTANCE_ID)) { - split_div(b, builder->instance_size.padded, - &r_e, &d); - nir_ssa_def *default_div = - nir_ior(b, single_instance, - nir_ult(b, - builder->instance_size.padded, - nir_imm_int(b, 2))); - r_e = nir_bcsel(b, default_div, - nir_imm_int(b, 0x3f), r_e); - d = nir_bcsel(b, default_div, - nir_imm_int(b, (1u << 31) - 1), d); - store_global(b, - get_address_imm(b, attrib_buf_ptr, WORD(1)), - nir_vec2(b, nir_ishl(b, r_e, nir_imm_int(b, 24)), d), - 2); - nir_store_var(b, attrib_idx_var, - nir_iadd_imm(b, attrib_idx, 1), 1); - CONTINUE; - } ENDIF - } + IF (nir_ieq_imm(b, attrib_idx, PAN_INSTANCE_ID)) { + split_div(b, builder->instance_size.padded, + &r_e, &d); + nir_ssa_def *default_div = + nir_ior(b, single_instance, + nir_ult(b, + builder->instance_size.padded, + nir_imm_int(b, 2))); + r_e = nir_bcsel(b, default_div, + nir_imm_int(b, 0x3f), r_e); + d = nir_bcsel(b, default_div, + nir_imm_int(b, (1u << 31) - 1), d); + store_global(b, + get_address_imm(b, attrib_buf_ptr, WORD(1)), + nir_vec2(b, nir_ishl(b, r_e, nir_imm_int(b, 24)), d), + 2); + nir_store_var(b, attrib_idx_var, + nir_iadd_imm(b, attrib_idx, 1), 1); + CONTINUE; + } ENDIF +#endif nir_ssa_def *instance_div = load_global(b, get_address_imm(b, attrib_buf_ptr, WORD(7)), 1, 32); @@ -1098,9 +1093,11 @@ create_indirect_draw_shader(struct panfrost_device *dev, mali_ptr address = pan_pool_upload_aligned(dev->indirect_draw_shaders.bin_pool, binary.data, binary.size, - pan_is_bifrost(dev) ? 128 : 64); - if (!pan_is_bifrost(dev)) - address |= shader_info.midgard.first_tag; + PAN_ARCH >= 6 ? 128 : 64); + +#if PAN_ARCH <= 5 + address |= shader_info.midgard.first_tag; +#endif util_dynarray_fini(&binary); @@ -1253,7 +1250,7 @@ panfrost_emit_index_min_max_search(struct pan_pool *pool, pan_section_pack(job.cpu, COMPUTE_JOB, DRAW, cfg) { cfg.draw_descriptor_is_64b = true; - cfg.texture_descriptor_is_64b = !pan_is_bifrost(dev); + cfg.texture_descriptor_is_64b = PAN_ARCH <= 5; cfg.state = rsd; cfg.thread_storage = get_tls(pool->dev); cfg.uniform_buffers = ubos; @@ -1267,10 +1264,10 @@ panfrost_emit_index_min_max_search(struct pan_pool *pool, } unsigned -panfrost_emit_indirect_draw(struct pan_pool *pool, - struct pan_scoreboard *scoreboard, - const struct pan_indirect_draw_info *draw_info, - struct panfrost_ptr *ctx) +GENX(panfrost_emit_indirect_draw)(struct pan_pool *pool, + struct pan_scoreboard *scoreboard, + const struct pan_indirect_draw_info *draw_info, + struct panfrost_ptr *ctx) { struct panfrost_device *dev = pool->dev; @@ -1345,7 +1342,7 @@ panfrost_emit_indirect_draw(struct pan_pool *pool, pan_section_pack(job.cpu, COMPUTE_JOB, DRAW, cfg) { cfg.draw_descriptor_is_64b = true; - cfg.texture_descriptor_is_64b = !pan_is_bifrost(dev); + cfg.texture_descriptor_is_64b = PAN_ARCH <= 5; cfg.state = rsd; cfg.thread_storage = get_tls(pool->dev); cfg.uniform_buffers = ubos; @@ -1370,8 +1367,8 @@ panfrost_emit_indirect_draw(struct pan_pool *pool, } void -panfrost_init_indirect_draw_shaders(struct panfrost_device *dev, - struct pan_pool *bin_pool) +GENX(panfrost_init_indirect_draw_shaders)(struct panfrost_device *dev, + struct pan_pool *bin_pool) { /* We allocate the states and varying_heap BO lazily to avoid * reserving memory when indirect draws are not used. @@ -1381,7 +1378,7 @@ panfrost_init_indirect_draw_shaders(struct panfrost_device *dev, } void -panfrost_cleanup_indirect_draw_shaders(struct panfrost_device *dev) +GENX(panfrost_cleanup_indirect_draw_shaders)(struct panfrost_device *dev) { panfrost_bo_unreference(dev->indirect_draw_shaders.states); panfrost_bo_unreference(dev->indirect_draw_shaders.varying_heap); diff --git a/src/panfrost/lib/pan_indirect_draw.h b/src/panfrost/lib/pan_indirect_draw.h index 03fc23aa319..421a4a42593 100644 --- a/src/panfrost/lib/pan_indirect_draw.h +++ b/src/panfrost/lib/pan_indirect_draw.h @@ -24,6 +24,8 @@ #ifndef __PAN_INDIRECT_DRAW_SHADERS_H__ #define __PAN_INDIRECT_DRAW_SHADERS_H__ +#include "gen_macros.h" + struct pan_device; struct pan_scoreboard; struct pan_pool; @@ -47,16 +49,16 @@ struct pan_indirect_draw_info { }; unsigned -panfrost_emit_indirect_draw(struct pan_pool *pool, - struct pan_scoreboard *scoreboard, - const struct pan_indirect_draw_info *draw_info, - struct panfrost_ptr *ctx); +GENX(panfrost_emit_indirect_draw)(struct pan_pool *pool, + struct pan_scoreboard *scoreboard, + const struct pan_indirect_draw_info *draw_info, + struct panfrost_ptr *ctx); void -panfrost_init_indirect_draw_shaders(struct panfrost_device *dev, - struct pan_pool *bin_pool); +GENX(panfrost_init_indirect_draw_shaders)(struct panfrost_device *dev, + struct pan_pool *bin_pool); void -panfrost_cleanup_indirect_draw_shaders(struct panfrost_device *dev); +GENX(panfrost_cleanup_indirect_draw_shaders)(struct panfrost_device *dev); #endif
