pan/indirect_draw: Split out update_dcd

This is common between vertex/tiler jobs and needs to be duplicated for
IDVS jobs.

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:15:55 -05:00 committed by Marge Bot
parent d696183d4d
commit 37ab248c77
1 changed files with 24 additions and 14 deletions

View File

@ -382,6 +382,29 @@ init_shader_builder(struct indirect_draw_shader_builder *builder,
extract_inputs(builder);
}
static void
update_dcd(struct indirect_draw_shader_builder *builder,
nir_ssa_def *job_ptr,
unsigned draw_offset)
{
nir_builder *b = &builder->b;
nir_ssa_def *draw_w01 =
load_global(b, get_address_imm(b, job_ptr, draw_offset + WORD(0)), 2, 32);
nir_ssa_def *draw_w0 = nir_channel(b, draw_w01, 0);
/* Update DRAW.{instance_size,offset_start} */
nir_ssa_def *instance_size =
nir_bcsel(b,
nir_ult(b, builder->draw.instance_count, nir_imm_int(b, 2)),
nir_imm_int(b, 0), builder->instance_size.packed);
draw_w01 = nir_vec2(b,
nir_ior(b, nir_iand_imm(b, draw_w0, 0xffff),
nir_ishl(b, instance_size, nir_imm_int(b, 16))),
builder->jobs.offset_start);
store_global(b, get_address_imm(b, job_ptr, draw_offset + WORD(0)),
draw_w01, 2);
}
static void
update_job(struct indirect_draw_shader_builder *builder, enum mali_job_type type)
{
@ -435,21 +458,8 @@ update_job(struct indirect_draw_shader_builder *builder, enum mali_job_type type
builder->varyings.pos_ptr, 2);
}
nir_ssa_def *draw_w01 =
load_global(b, get_address_imm(b, job_ptr, draw_offset + WORD(0)), 2, 32);
nir_ssa_def *draw_w0 = nir_channel(b, draw_w01, 0);
update_dcd(builder, job_ptr, draw_offset);
/* Update DRAW.{instance_size,offset_start} */
nir_ssa_def *instance_size =
nir_bcsel(b,
nir_ult(b, builder->draw.instance_count, nir_imm_int(b, 2)),
nir_imm_int(b, 0), builder->instance_size.packed);
draw_w01 = nir_vec2(b,
nir_ior(b, nir_iand_imm(b, draw_w0, 0xffff),
nir_ishl(b, instance_size, nir_imm_int(b, 16))),
builder->jobs.offset_start);
store_global(b, get_address_imm(b, job_ptr, draw_offset + WORD(0)),
draw_w01, 2);
}
static void