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