mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-24 01:40:22 +01:00
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:
parent
37ab248c77
commit
e8566f7529
2 changed files with 34 additions and 6 deletions
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue