From 1447db0d51290c5b70ffa2a82fb1980de92dcd75 Mon Sep 17 00:00:00 2001 From: Boris Brezillon Date: Fri, 6 Aug 2021 11:05:13 +0200 Subject: [PATCH] panfrost: Prepare indirect dispatch helpers to per-gen XML Signed-off-by: Boris Brezillon Reviewed-by: Alyssa Rosenzweig Part-of: --- src/gallium/drivers/panfrost/pan_cmdstream.c | 8 +++++--- src/gallium/drivers/panfrost/pan_screen.c | 3 --- src/panfrost/lib/meson.build | 20 +++++++++++++++++--- src/panfrost/lib/pan_indirect_dispatch.c | 18 ++++++++++-------- src/panfrost/lib/pan_indirect_dispatch.h | 12 +++++++----- 5 files changed, 39 insertions(+), 22 deletions(-) diff --git a/src/gallium/drivers/panfrost/pan_cmdstream.c b/src/gallium/drivers/panfrost/pan_cmdstream.c index f615fae42ac..f0f119e663a 100644 --- a/src/gallium/drivers/panfrost/pan_cmdstream.c +++ b/src/gallium/drivers/panfrost/pan_cmdstream.c @@ -3186,9 +3186,9 @@ panfrost_launch_grid(struct pipe_context *pipe, }, }; - indirect_dep = pan_indirect_dispatch_emit(&batch->pool.base, - &batch->scoreboard, - &indirect); + indirect_dep = GENX(pan_indirect_dispatch_emit)(&batch->pool.base, + &batch->scoreboard, + &indirect); } panfrost_add_job(&batch->pool.base, &batch->scoreboard, @@ -3527,6 +3527,7 @@ screen_destroy(struct pipe_screen *pscreen) { struct panfrost_device *dev = pan_device(pscreen); pan_blitter_cleanup(dev); + GENX(pan_indirect_dispatch_cleanup)(dev); } static void @@ -3666,4 +3667,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); } diff --git a/src/gallium/drivers/panfrost/pan_screen.c b/src/gallium/drivers/panfrost/pan_screen.c index 8c119168a16..b4f3b63be58 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_dispatch.h" #include "pan_indirect_draw.h" #include "decode.h" @@ -709,7 +708,6 @@ panfrost_destroy_screen(struct pipe_screen *pscreen) struct panfrost_screen *screen = pan_screen(pscreen); panfrost_resource_screen_destroy(pscreen); - pan_indirect_dispatch_cleanup(dev); panfrost_cleanup_indirect_draw_shaders(dev); panfrost_pool_cleanup(&screen->indirect_draw.bin_pool); panfrost_pool_cleanup(&screen->blitter.bin_pool); @@ -901,7 +899,6 @@ panfrost_create_screen(int fd, struct renderonly *ro) PAN_BO_EXECUTE, 65536, "Indirect draw shaders", false, true); panfrost_init_indirect_draw_shaders(dev, &screen->indirect_draw.bin_pool.base); - pan_indirect_dispatch_init(dev); 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 d669d2b3f26..72b4e3e607f 100644 --- a/src/panfrost/lib/meson.build +++ b/src/panfrost/lib/meson.build @@ -48,6 +48,21 @@ foreach ver : pixel_format_versions ) endforeach +libpanfrost_per_arch = [] + +foreach ver : ['4', '5', '6', '7'] + libpanfrost_per_arch += static_library( + 'pan-arch-v' + ver, + [ + 'pan_indirect_dispatch.c', + ], + include_directories : [inc_include, inc_src, inc_mapi, inc_mesa, inc_gallium, inc_gallium_aux, inc_panfrost_hw], + c_args : ['-DPAN_ARCH=' + ver], + gnu_symbol_visibility : 'hidden', + dependencies : [dep_libdrm, idep_pan_packers, idep_nir], + ) +endforeach + libpanfrost_lib_files = files( 'pan_encoder.h', @@ -58,7 +73,6 @@ libpanfrost_lib_files = files( 'pan_blitter.c', 'pan_clear.c', 'pan_cs.c', - 'pan_indirect_dispatch.c', 'pan_indirect_draw.c', 'pan_samples.c', 'pan_tiler.c', @@ -83,7 +97,7 @@ libpanfrost_lib = static_library( gnu_symbol_visibility : 'hidden', dependencies: [dep_libdrm, idep_nir], build_by_default : false, - link_with: [libpanfrost_pixel_format], + link_with: [libpanfrost_pixel_format, libpanfrost_per_arch], ) libpanfrost_decode = static_library( @@ -97,7 +111,7 @@ libpanfrost_decode = static_library( ) libpanfrost_dep = declare_dependency( - link_with: [libpanfrost_lib, libpanfrost_decode, libpanfrost_midgard, libpanfrost_bifrost, libpanfrost_pixel_format], + link_with: [libpanfrost_lib, libpanfrost_decode, libpanfrost_midgard, libpanfrost_bifrost, libpanfrost_pixel_format, libpanfrost_per_arch], include_directories: [inc_include, inc_src, inc_mapi, inc_mesa, inc_gallium, inc_gallium_aux, inc_panfrost_hw, inc_panfrost], dependencies: [dep_libdrm, idep_nir, idep_pan_packers], ) diff --git a/src/panfrost/lib/pan_indirect_dispatch.c b/src/panfrost/lib/pan_indirect_dispatch.c index 590ae548f1b..980ac6b1792 100644 --- a/src/panfrost/lib/pan_indirect_dispatch.c +++ b/src/panfrost/lib/pan_indirect_dispatch.c @@ -112,9 +112,9 @@ get_push_uniforms(struct pan_pool *pool, } unsigned -pan_indirect_dispatch_emit(struct pan_pool *pool, - struct pan_scoreboard *scoreboard, - const struct pan_indirect_dispatch_info *dispatch_info) +GENX(pan_indirect_dispatch_emit)(struct pan_pool *pool, + struct pan_scoreboard *scoreboard, + const struct pan_indirect_dispatch_info *dispatch_info) { struct panfrost_device *dev = pool->dev; struct panfrost_ptr job = @@ -141,7 +141,7 @@ pan_indirect_dispatch_emit(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 = get_rsd(dev); cfg.thread_storage = get_tls(pool->dev); cfg.uniform_buffers = get_ubos(pool, &inputs); @@ -155,7 +155,7 @@ pan_indirect_dispatch_emit(struct pan_pool *pool, } void -pan_indirect_dispatch_init(struct panfrost_device *dev) +GENX(pan_indirect_dispatch_init)(struct panfrost_device *dev) { nir_builder b = nir_builder_init_simple_shader(MESA_SHADER_COMPUTE, @@ -249,8 +249,10 @@ pan_indirect_dispatch_init(struct panfrost_device *dev) 0, "Indirect dispatch descriptors"); mali_ptr address = dev->indirect_dispatch.bin->ptr.gpu; - if (!pan_is_bifrost(dev)) - address |= shader_info.midgard.first_tag; + +#if PAN_ARCH <= 5 + address |= shader_info.midgard.first_tag; +#endif void *rsd = dev->indirect_dispatch.descs->ptr.cpu; pan_pack(rsd, RENDERER_STATE, cfg) { @@ -265,7 +267,7 @@ pan_indirect_dispatch_init(struct panfrost_device *dev) } void -pan_indirect_dispatch_cleanup(struct panfrost_device *dev) +GENX(pan_indirect_dispatch_cleanup)(struct panfrost_device *dev) { panfrost_bo_unreference(dev->indirect_dispatch.bin); panfrost_bo_unreference(dev->indirect_dispatch.descs); diff --git a/src/panfrost/lib/pan_indirect_dispatch.h b/src/panfrost/lib/pan_indirect_dispatch.h index c48f61dd39d..2af2a7e13ba 100644 --- a/src/panfrost/lib/pan_indirect_dispatch.h +++ b/src/panfrost/lib/pan_indirect_dispatch.h @@ -24,6 +24,8 @@ #ifndef __PAN_INDIRECT_DISPATCH_SHADERS_H__ #define __PAN_INDIRECT_DISPATCH_SHADERS_H__ +#include "gen_macros.h" + struct pan_device; struct pan_scoreboard; struct pan_pool; @@ -35,14 +37,14 @@ struct pan_indirect_dispatch_info { }; unsigned -pan_indirect_dispatch_emit(struct pan_pool *pool, - struct pan_scoreboard *scoreboard, - const struct pan_indirect_dispatch_info *dispatch_info); +GENX(pan_indirect_dispatch_emit)(struct pan_pool *pool, + struct pan_scoreboard *scoreboard, + const struct pan_indirect_dispatch_info *dispatch_info); void -pan_indirect_dispatch_init(struct panfrost_device *dev); +GENX(pan_indirect_dispatch_init)(struct panfrost_device *dev); void -pan_indirect_dispatch_cleanup(struct panfrost_device *dev); +GENX(pan_indirect_dispatch_cleanup)(struct panfrost_device *dev); #endif