panfrost: Prepare indirect draw helpers to per-gen XML

Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12551>
This commit is contained in:
Boris Brezillon
2021-08-06 11:21:14 +02:00
parent 1447db0d51
commit 1c953ba212
5 changed files with 70 additions and 72 deletions
+6 -4
View File
@@ -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);
}
@@ -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,
+1 -1
View File
@@ -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',
+54 -57
View File
@@ -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);
+9 -7
View File
@@ -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