pan/indirect_draw: Support IDVS jobs

Handle as tiler jobs with an extra vertex DCD at the end.

Signed-off-by: Alyssa Rosenzweig <alyssa@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14154>
This commit is contained in:
Alyssa Rosenzweig 2021-12-13 12:45:50 -05:00 committed by Marge Bot
parent 37ab248c77
commit e8566f7529
2 changed files with 34 additions and 6 deletions

View file

@ -88,7 +88,8 @@ enum pan_indirect_draw_flags {
PAN_INDIRECT_DRAW_HAS_PSIZ = 1 << 2,
PAN_INDIRECT_DRAW_PRIMITIVE_RESTART = 1 << 3,
PAN_INDIRECT_DRAW_UPDATE_PRIM_SIZE = 1 << 4,
PAN_INDIRECT_DRAW_LAST_FLAG = PAN_INDIRECT_DRAW_UPDATE_PRIM_SIZE,
PAN_INDIRECT_DRAW_IDVS = 1 << 5,
PAN_INDIRECT_DRAW_LAST_FLAG = PAN_INDIRECT_DRAW_IDVS,
PAN_INDIRECT_DRAW_FLAGS_MASK = (PAN_INDIRECT_DRAW_LAST_FLAG << 1) - 1,
PAN_INDIRECT_DRAW_MIN_MAX_SEARCH_1B_INDEX = PAN_INDIRECT_DRAW_LAST_FLAG << 1,
PAN_INDIRECT_DRAW_MIN_MAX_SEARCH_2B_INDEX,

View file

@ -363,14 +363,16 @@ init_shader_builder(struct indirect_draw_shader_builder *builder,
builder->b =
nir_builder_init_simple_shader(MESA_SHADER_COMPUTE,
GENX(pan_shader_get_compiler_options)(),
"indirect_draw(index_size=%d%s%s%s)",
"indirect_draw(index_size=%d%s%s%s%s)",
builder->index_size,
flags & PAN_INDIRECT_DRAW_HAS_PSIZ ?
",psiz" : "",
flags & PAN_INDIRECT_DRAW_PRIMITIVE_RESTART ?
",primitive_restart" : "",
flags & PAN_INDIRECT_DRAW_UPDATE_PRIM_SIZE ?
",update_primitive_size" : "");
",update_primitive_size" : "",
flags & PAN_INDIRECT_DRAW_IDVS ?
",idvs" : "");
}
nir_builder *b = &builder->b;
@ -460,6 +462,12 @@ update_job(struct indirect_draw_shader_builder *builder, enum mali_job_type type
update_dcd(builder, job_ptr, draw_offset);
if (builder->flags & PAN_INDIRECT_DRAW_IDVS) {
assert(type == MALI_JOB_TYPE_TILER);
update_dcd(builder, job_ptr,
pan_section_offset(INDEXED_VERTEX_JOB, VERTEX_DRAW));
}
}
static void
@ -773,6 +781,14 @@ get_invocation(struct indirect_draw_shader_builder *builder)
nir_imm_int(b, 2 << 28)));
}
static nir_ssa_def *
nir_align_pot(nir_builder *b, nir_ssa_def *val, unsigned pot)
{
assert(pot != 0 && util_is_power_of_two_or_zero(pot));
return nir_iand_imm(b, nir_iadd_imm(b, val, pot - 1), ~(pot - 1));
}
/* Based on panfrost_padded_vertex_count() */
static nir_ssa_def *
@ -807,7 +823,10 @@ static void
update_jobs(struct indirect_draw_shader_builder *builder)
{
get_invocation(builder);
update_job(builder, MALI_JOB_TYPE_VERTEX);
if (!(builder->flags & PAN_INDIRECT_DRAW_IDVS))
update_job(builder, MALI_JOB_TYPE_VERTEX);
update_job(builder, MALI_JOB_TYPE_TILER);
}
@ -960,13 +979,21 @@ patch(struct indirect_draw_shader_builder *builder)
/* If there's nothing to draw, turn the vertex/tiler jobs into
* null jobs.
*/
set_null_job(builder, builder->jobs.vertex_job);
if (!(builder->flags & PAN_INDIRECT_DRAW_IDVS))
set_null_job(builder, builder->jobs.vertex_job);
set_null_job(builder, builder->jobs.tiler_job);
} ELSE {
get_instance_size(builder);
nir_ssa_def *count = builder->instance_size.raw;
/* IDVS requires padding to a multiple of 4 */
if (builder->flags & PAN_INDIRECT_DRAW_IDVS)
count = nir_align_pot(b, count, 4);
builder->instance_size.padded =
get_padded_count(b, builder->instance_size.raw,
get_padded_count(b, count,
&builder->instance_size.packed);
update_varyings(builder);