Mesa (main): panfrost: Prepare indirect draw 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: 1c953ba212109f10e9bf1d3b277b59b8291bca1f
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=1c953ba212109f10e9bf1d3b277b59b8291bca1f

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

panfrost: Prepare indirect draw 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 |  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



More information about the mesa-commit mailing list