From e8566f7529664c993bb089367eb89a2e24d02a0a Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Mon, 13 Dec 2021 12:45:50 -0500 Subject: [PATCH] pan/indirect_draw: Support IDVS jobs Handle as tiler jobs with an extra vertex DCD at the end. Signed-off-by: Alyssa Rosenzweig Part-of: --- src/panfrost/lib/pan_device.h | 3 ++- src/panfrost/lib/pan_indirect_draw.c | 37 ++++++++++++++++++++++++---- 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/src/panfrost/lib/pan_device.h b/src/panfrost/lib/pan_device.h index 5de3dcbdbc6..67cf6519438 100644 --- a/src/panfrost/lib/pan_device.h +++ b/src/panfrost/lib/pan_device.h @@ -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, diff --git a/src/panfrost/lib/pan_indirect_draw.c b/src/panfrost/lib/pan_indirect_draw.c index 31dbc6f8376..9444bd37aec 100644 --- a/src/panfrost/lib/pan_indirect_draw.c +++ b/src/panfrost/lib/pan_indirect_draw.c @@ -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);