radv: add a helper to pad DGC IB

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/29814>
This commit is contained in:
Samuel Pitoiset
2024-06-20 17:27:24 +02:00
committed by Marge Bot
parent 0a5c6415d1
commit 723acbe1e2

View File

@@ -1738,6 +1738,47 @@ dgc_is_cond_render_enabled(nir_builder *b)
return nir_if_phi(b, res1, res2);
}
static void
dgc_pad_cmdbuf(struct dgc_cmdbuf *cs, nir_def *cmd_buf_end)
{
const struct radv_device *device = cs->dev;
const struct radv_physical_device *pdev = radv_device_physical(device);
nir_builder *b = cs->b;
nir_push_if(b, nir_ine(b, nir_load_var(b, cs->offset), cmd_buf_end));
{
if (pdev->info.gfx_ib_pad_with_type2) {
nir_push_loop(b);
{
nir_def *curr_offset = nir_load_var(b, cs->offset);
nir_push_if(b, nir_ieq(b, curr_offset, cmd_buf_end));
{
nir_jump(b, nir_jump_break);
}
nir_pop_if(b, NULL);
nir_def *pkt = nir_imm_int(b, PKT2_NOP_PAD);
dgc_cs_begin(cs);
dgc_cs_emit(pkt);
dgc_cs_end();
}
nir_pop_loop(b, NULL);
} else {
nir_def *cnt = nir_isub(b, cmd_buf_end, nir_load_var(b, cs->offset));
cnt = nir_ushr_imm(b, cnt, 2);
cnt = nir_iadd_imm(b, cnt, -2);
nir_def *pkt = nir_pkt3(b, PKT3_NOP, cnt);
dgc_cs_begin(cs);
dgc_cs_emit(pkt);
dgc_cs_end();
}
}
nir_pop_if(b, NULL);
}
static nir_shader *
build_dgc_prepare_shader(struct radv_device *dev)
{
@@ -1878,38 +1919,7 @@ build_dgc_prepare_shader(struct radv_device *dev)
nir_pop_if(&b, NULL);
/* Pad the cmdbuffer if we did not use the whole stride */
nir_push_if(&b, nir_ine(&b, nir_load_var(&b, cmd_buf.offset), cmd_buf_end));
{
if (pdev->info.gfx_ib_pad_with_type2) {
nir_push_loop(&b);
{
nir_def *curr_offset = nir_load_var(&b, cmd_buf.offset);
nir_push_if(&b, nir_ieq(&b, curr_offset, cmd_buf_end));
{
nir_jump(&b, nir_jump_break);
}
nir_pop_if(&b, NULL);
nir_def *pkt = nir_imm_int(&b, PKT2_NOP_PAD);
dgc_cs_begin(&cmd_buf);
dgc_cs_emit(pkt);
dgc_cs_end();
}
nir_pop_loop(&b, NULL);
} else {
nir_def *cnt = nir_isub(&b, cmd_buf_end, nir_load_var(&b, cmd_buf.offset));
cnt = nir_ushr_imm(&b, cnt, 2);
cnt = nir_iadd_imm(&b, cnt, -2);
nir_def *pkt = nir_pkt3(&b, PKT3_NOP, cnt);
dgc_cs_begin(&cmd_buf);
dgc_cs_emit(pkt);
dgc_cs_end();
}
}
nir_pop_if(&b, NULL);
dgc_pad_cmdbuf(&cmd_buf, cmd_buf_end);
}
nir_pop_if(&b, NULL);