Mesa (main): panfrost: Only build GPU indirect kernels for v7

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Dec 6 14:20:44 UTC 2021


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

Author: Alyssa Rosenzweig <alyssa at collabora.com>
Date:   Thu Nov 18 22:57:16 2021 -0500

panfrost: Only build GPU indirect kernels for v7

These kernels aren't tested (and are probably broken) elsewhere. Don't
waste cycles trying to compile for other architectures. This reduces the
amount of code that needs to be ported to a new architecture.

Signed-off-by: Alyssa Rosenzweig <alyssa at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14064>

---

 src/gallium/drivers/panfrost/pan_cmdstream.c | 20 +++++++++++++++++---
 src/panfrost/lib/meson.build                 | 16 ++++++++++++++--
 2 files changed, 31 insertions(+), 5 deletions(-)

diff --git a/src/gallium/drivers/panfrost/pan_cmdstream.c b/src/gallium/drivers/panfrost/pan_cmdstream.c
index 92ca4fdb250..dbcdef77fde 100644
--- a/src/gallium/drivers/panfrost/pan_cmdstream.c
+++ b/src/gallium/drivers/panfrost/pan_cmdstream.c
@@ -48,6 +48,8 @@
 #include "pan_indirect_dispatch.h"
 #include "pan_blitter.h"
 
+#define PAN_GPU_INDIRECTS (PAN_ARCH == 7)
+
 struct panfrost_rasterizer {
         struct pipe_rasterizer_state base;
 
@@ -2872,6 +2874,7 @@ panfrost_direct_draw(struct panfrost_batch *batch,
         panfrost_update_streamout_offsets(ctx);
 }
 
+#if PAN_GPU_INDIRECTS
 static void
 panfrost_indirect_draw(struct panfrost_batch *batch,
                        const struct pipe_draw_info *info,
@@ -3005,6 +3008,7 @@ panfrost_indirect_draw(struct panfrost_batch *batch,
 
         panfrost_emit_vertex_tiler_jobs(batch, &vertex, &tiler);
 }
+#endif
 
 static void
 panfrost_draw_vbo(struct pipe_context *pipe,
@@ -3021,7 +3025,7 @@ panfrost_draw_vbo(struct pipe_context *pipe,
                 return;
 
         /* Emulate indirect draws unless we're using the experimental path */
-        if (!(dev->debug & PAN_DBG_INDIRECT) && indirect && indirect->buffer) {
+        if ((!(dev->debug & PAN_DBG_INDIRECT) || !PAN_GPU_INDIRECTS) && indirect && indirect->buffer) {
                 assert(num_draws == 1);
                 util_draw_indirect(pipe, info, indirect);
                 return;
@@ -3049,7 +3053,9 @@ panfrost_draw_vbo(struct pipe_context *pipe,
 
         if (indirect) {
                 assert(num_draws == 1);
+                assert(PAN_GPU_INDIRECTS);
 
+#if PAN_GPU_INDIRECTS
                 if (indirect->count_from_stream_output) {
                         struct pipe_draw_start_count_bias tmp_draw = *draws;
                         struct panfrost_streamout_target *so =
@@ -3064,6 +3070,7 @@ panfrost_draw_vbo(struct pipe_context *pipe,
 
                 panfrost_indirect_draw(batch, info, drawid_offset, indirect, &draws[0]);
                 return;
+#endif
         }
 
         struct pipe_draw_info tmp_info = *info;
@@ -3101,7 +3108,7 @@ panfrost_launch_grid(struct pipe_context *pipe,
 
         /* Indirect dispatch can't handle workgroup local storage since that
          * would require dynamic memory allocation. Bail in this case. */
-        if (info->indirect && !cs->info.wls_size) {
+        if (info->indirect && (!cs->info.wls_size || !PAN_GPU_INDIRECTS)) {
                 struct pipe_transfer *transfer;
                 uint32_t *params = pipe_buffer_map_range(pipe, info->indirect,
                                 info->indirect_offset,
@@ -3176,6 +3183,7 @@ panfrost_launch_grid(struct pipe_context *pipe,
         }
 
         unsigned indirect_dep = 0;
+#if PAN_GPU_INDIRECTS
         if (info->indirect) {
                 struct pan_indirect_dispatch_info indirect = {
                         .job = t.gpu,
@@ -3192,6 +3200,7 @@ panfrost_launch_grid(struct pipe_context *pipe,
                                                                 &batch->scoreboard,
                                                                 &indirect);
         }
+#endif
 
         panfrost_add_job(&batch->pool.base, &batch->scoreboard,
                          MALI_JOB_TYPE_COMPUTE, true, false,
@@ -3532,9 +3541,12 @@ static void
 screen_destroy(struct pipe_screen *pscreen)
 {
         struct panfrost_device *dev = pan_device(pscreen);
+        GENX(pan_blitter_cleanup)(dev);
+
+#if PAN_GPU_INDIRECTS
         GENX(panfrost_cleanup_indirect_draw_shaders)(dev);
         GENX(pan_indirect_dispatch_cleanup)(dev);
-        GENX(pan_blitter_cleanup)(dev);
+#endif
 }
 
 static void
@@ -3677,6 +3689,8 @@ 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/meson.build b/src/panfrost/lib/meson.build
index d90b7e79fff..298229bf3e1 100644
--- a/src/panfrost/lib/meson.build
+++ b/src/panfrost/lib/meson.build
@@ -46,8 +46,6 @@ foreach ver : ['4', '5', '6', '7']
       'pan_blend.c',
       'pan_blitter.c',
       'pan_cs.c',
-      'pan_indirect_dispatch.c',
-      'pan_indirect_draw.c',
       'pan_shader.c',
       'pan_texture.c',
     ],
@@ -58,6 +56,20 @@ foreach ver : ['4', '5', '6', '7']
   )
 endforeach
 
+foreach ver : ['7']
+  libpanfrost_per_arch += static_library(
+    'pan-arch-indirect-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],
+    gnu_symbol_visibility : 'hidden',
+    dependencies : [dep_libdrm, idep_pan_packers, idep_nir],
+  )
+endforeach
+
 libpanfrost_lib_files = files(
   'pan_encoder.h',
 



More information about the mesa-commit mailing list