[Mesa-dev] [PATCH 4/7] radeonsi: transpose indirect/index draw dispatch
Marek Olšák
maraeo at gmail.com
Wed Aug 3 18:14:55 UTC 2016
Patches 1-4:
Reviewed-by: Marek Olšák <marek.olsak at amd.com>
Marek
On Tue, Aug 2, 2016 at 9:41 PM, Nicolai Hähnle <nhaehnle at gmail.com> wrote:
> From: Nicolai Hähnle <nicolai.haehnle at amd.com>
>
> This allows better code sharing for indirect draw calls.
> ---
> src/gallium/drivers/radeonsi/si_state_draw.c | 76 ++++++++++++----------------
> 1 file changed, 31 insertions(+), 45 deletions(-)
>
> diff --git a/src/gallium/drivers/radeonsi/si_state_draw.c b/src/gallium/drivers/radeonsi/si_state_draw.c
> index 6b8ab9f..54fe2bb 100644
> --- a/src/gallium/drivers/radeonsi/si_state_draw.c
> +++ b/src/gallium/drivers/radeonsi/si_state_draw.c
> @@ -619,36 +619,45 @@ static void si_emit_draw_packets(struct si_context *sctx,
> RADEON_USAGE_READ, RADEON_PRIO_DRAW_INDIRECT);
> }
>
> - if (info->indexed) {
> - if (info->indirect) {
> - assert(info->indirect_offset % 4 == 0);
> + if (info->indirect) {
> + unsigned di_src_sel = info->indexed ? V_0287F0_DI_SRC_SEL_DMA
> + : V_0287F0_DI_SRC_SEL_AUTO_INDEX;
> +
> + assert(info->indirect_offset % 4 == 0);
>
> + if (info->indexed) {
> radeon_emit(cs, PKT3(PKT3_INDEX_BASE, 1, 0));
> radeon_emit(cs, index_va);
> radeon_emit(cs, index_va >> 32);
>
> radeon_emit(cs, PKT3(PKT3_INDEX_BUFFER_SIZE, 0, 0));
> radeon_emit(cs, index_max_size);
> + }
>
> - if (sctx->b.family < CHIP_POLARIS10) {
> - radeon_emit(cs, PKT3(PKT3_DRAW_INDEX_INDIRECT, 3, render_cond_bit));
> - radeon_emit(cs, info->indirect_offset);
> - radeon_emit(cs, (sh_base_reg + SI_SGPR_BASE_VERTEX * 4 - SI_SH_REG_OFFSET) >> 2);
> - radeon_emit(cs, (sh_base_reg + SI_SGPR_START_INSTANCE * 4 - SI_SH_REG_OFFSET) >> 2);
> - radeon_emit(cs, V_0287F0_DI_SRC_SEL_DMA);
> - } else {
> - radeon_emit(cs, PKT3(PKT3_DRAW_INDEX_INDIRECT_MULTI, 8, render_cond_bit));
> - radeon_emit(cs, info->indirect_offset);
> - radeon_emit(cs, (sh_base_reg + SI_SGPR_BASE_VERTEX * 4 - SI_SH_REG_OFFSET) >> 2);
> - radeon_emit(cs, (sh_base_reg + SI_SGPR_START_INSTANCE * 4 - SI_SH_REG_OFFSET) >> 2);
> - radeon_emit(cs, 0); /* draw_index */
> - radeon_emit(cs, 1); /* count */
> - radeon_emit(cs, 0); /* count_addr -- disabled */
> - radeon_emit(cs, 0);
> - radeon_emit(cs, 16); /* stride */
> - radeon_emit(cs, V_0287F0_DI_SRC_SEL_DMA);
> - }
> + if (sctx->b.family < CHIP_POLARIS10) {
> + radeon_emit(cs, PKT3(info->indexed ? PKT3_DRAW_INDEX_INDIRECT
> + : PKT3_DRAW_INDIRECT,
> + 3, render_cond_bit));
> + radeon_emit(cs, info->indirect_offset);
> + radeon_emit(cs, (sh_base_reg + SI_SGPR_BASE_VERTEX * 4 - SI_SH_REG_OFFSET) >> 2);
> + radeon_emit(cs, (sh_base_reg + SI_SGPR_START_INSTANCE * 4 - SI_SH_REG_OFFSET) >> 2);
> + radeon_emit(cs, di_src_sel);
> } else {
> + radeon_emit(cs, PKT3(info->indexed ? PKT3_DRAW_INDEX_INDIRECT_MULTI :
> + PKT3_DRAW_INDIRECT_MULTI,
> + 8, render_cond_bit));
> + radeon_emit(cs, info->indirect_offset);
> + radeon_emit(cs, (sh_base_reg + SI_SGPR_BASE_VERTEX * 4 - SI_SH_REG_OFFSET) >> 2);
> + radeon_emit(cs, (sh_base_reg + SI_SGPR_START_INSTANCE * 4 - SI_SH_REG_OFFSET) >> 2);
> + radeon_emit(cs, 0); /* draw_index */
> + radeon_emit(cs, 1); /* count */
> + radeon_emit(cs, 0); /* count_addr -- disabled */
> + radeon_emit(cs, 0);
> + radeon_emit(cs, 16); /* stride */
> + radeon_emit(cs, di_src_sel);
> + }
> + } else {
> + if (info->indexed) {
> index_va += info->start * ib->index_size;
>
> radeon_emit(cs, PKT3(PKT3_DRAW_INDEX_2, 4, render_cond_bit));
> @@ -657,34 +666,11 @@ static void si_emit_draw_packets(struct si_context *sctx,
> radeon_emit(cs, (index_va >> 32UL) & 0xFF);
> radeon_emit(cs, info->count);
> radeon_emit(cs, V_0287F0_DI_SRC_SEL_DMA);
> - }
> - } else {
> - if (info->indirect) {
> - assert(info->indirect_offset % 4 == 0);
> -
> - if (sctx->b.family < CHIP_POLARIS10) {
> - radeon_emit(cs, PKT3(PKT3_DRAW_INDIRECT, 3, render_cond_bit));
> - radeon_emit(cs, info->indirect_offset);
> - radeon_emit(cs, (sh_base_reg + SI_SGPR_BASE_VERTEX * 4 - SI_SH_REG_OFFSET) >> 2);
> - radeon_emit(cs, (sh_base_reg + SI_SGPR_START_INSTANCE * 4 - SI_SH_REG_OFFSET) >> 2);
> - radeon_emit(cs, V_0287F0_DI_SRC_SEL_AUTO_INDEX);
> - } else {
> - radeon_emit(cs, PKT3(PKT3_DRAW_INDIRECT_MULTI, 8, render_cond_bit));
> - radeon_emit(cs, info->indirect_offset);
> - radeon_emit(cs, (sh_base_reg + SI_SGPR_BASE_VERTEX * 4 - SI_SH_REG_OFFSET) >> 2);
> - radeon_emit(cs, (sh_base_reg + SI_SGPR_START_INSTANCE * 4 - SI_SH_REG_OFFSET) >> 2);
> - radeon_emit(cs, 0); /* draw_index */
> - radeon_emit(cs, 1); /* count */
> - radeon_emit(cs, 0); /* count_addr -- disabled */
> - radeon_emit(cs, 0);
> - radeon_emit(cs, 16); /* stride */
> - radeon_emit(cs, V_0287F0_DI_SRC_SEL_AUTO_INDEX);
> - }
> } else {
> radeon_emit(cs, PKT3(PKT3_DRAW_INDEX_AUTO, 1, render_cond_bit));
> radeon_emit(cs, info->count);
> radeon_emit(cs, V_0287F0_DI_SRC_SEL_AUTO_INDEX |
> - S_0287F0_USE_OPAQUE(!!info->count_from_stream_output));
> + S_0287F0_USE_OPAQUE(!!info->count_from_stream_output));
> }
> }
> }
> --
> 2.7.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list