Mesa (main): panfrost: Prepare indirect dispatch helpers to per-gen XML

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Aug 26 08:52:46 UTC 2021


Module: Mesa
Branch: main
Commit: 1447db0d51290c5b70ffa2a82fb1980de92dcd75
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=1447db0d51290c5b70ffa2a82fb1980de92dcd75

Author: Boris Brezillon <boris.brezillon at collabora.com>
Date:   Fri Aug  6 11:05:13 2021 +0200

panfrost: Prepare indirect dispatch helpers to per-gen XML

Signed-off-by: Boris Brezillon <boris.brezillon at collabora.com>
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12551>

---

 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



More information about the mesa-commit mailing list