[Mesa-dev] [PATCH] r600g: do RV6xx base updates inline with state updates.

Alex Deucher alexdeucher at gmail.com
Wed May 4 08:30:01 PDT 2011


On Wed, May 4, 2011 at 4:18 AM, Dave Airlie <airlied at gmail.com> wrote:
> From: Dave Airlie <airlied at redhat.com>
>
> This seems more in line with what the documentation suggests we should be
> doing. It doesn't fix the rv635 regression, though I thought it might,
> so it means I've no idea whats actually going wrong there.

Patch looks good.  I'll do some more digging internally to see if I
can find any additional info.

Reviewed-by: Alex Deucher <alexdeucher at gmail.com>

>
> Signed-off-by: Dave Airlie <airlied at redhat.com>
> ---
>  src/gallium/winsys/r600/drm/r600_hw_context.c |   77 +++++++------------------
>  src/gallium/winsys/r600/drm/r600_priv.h       |    1 +
>  2 files changed, 22 insertions(+), 56 deletions(-)
>
> diff --git a/src/gallium/winsys/r600/drm/r600_hw_context.c b/src/gallium/winsys/r600/drm/r600_hw_context.c
> index f639703..df12542 100644
> --- a/src/gallium/winsys/r600/drm/r600_hw_context.c
> +++ b/src/gallium/winsys/r600/drm/r600_hw_context.c
> @@ -127,10 +127,20 @@ int r600_context_add_block(struct r600_context *ctx, const struct r600_reg *reg,
>                                block->pm4_bo_index[j] = block->nbo;
>                                block->pm4[block->pm4_ndwords++] = PKT3(PKT3_NOP, 0, 0);
>                                block->pm4[block->pm4_ndwords++] = 0x00000000;
> -                               block->reloc[block->nbo].flush_flags = reg[i+j].flush_flags;
> -                               block->reloc[block->nbo].flush_mask = reg[i+j].flush_mask;
> +                               if (reg[i+j].flags & REG_FLAG_RV6XX_SBU) {
> +                                       block->reloc[block->nbo].flush_flags = 0;
> +                                       block->reloc[block->nbo].flush_mask = 0;
> +                               } else {
> +                                       block->reloc[block->nbo].flush_flags = reg[i+j].flush_flags;
> +                                       block->reloc[block->nbo].flush_mask = reg[i+j].flush_mask;
> +                               }
>                                block->reloc[block->nbo].bo_pm4_index = block->pm4_ndwords - 1;
>                        }
> +                       if ((ctx->radeon->family > CHIP_R600) &&
> +                           (ctx->radeon->family < CHIP_RV770) && reg[i+j].flags & REG_FLAG_RV6XX_SBU) {
> +                               block->pm4[block->pm4_ndwords++] = PKT3(PKT3_SURFACE_BASE_UPDATE, 0, 0);
> +                               block->pm4[block->pm4_ndwords++] = reg[i+j].flush_flags;
> +                       }
>                }
>                for (j = 0; j < n; j++) {
>                        if (reg[i+j].flush_flags) {
> @@ -197,7 +207,7 @@ static const struct r600_reg r600_context_reg_list[] = {
>        {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_028028_DB_STENCIL_CLEAR, 0, 0, 0},
>        {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_02802C_DB_DEPTH_CLEAR, 0, 0, 0},
>        {0, 0, GROUP_FORCE_NEW_BLOCK, 0, 0, 0},
> -       {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_028040_CB_COLOR0_BASE, REG_FLAG_NEED_BO, 0, 0},
> +       {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_028040_CB_COLOR0_BASE, REG_FLAG_NEED_BO|REG_FLAG_RV6XX_SBU, SURFACE_BASE_UPDATE_COLOR(0), 0},
>        {0, 0, GROUP_FORCE_NEW_BLOCK, 0, 0, 0},
>        {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_0280A0_CB_COLOR0_INFO, REG_FLAG_NEED_BO, 0, 0xFFFFFFFF},
>        {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_028060_CB_COLOR0_SIZE, 0, 0, 0},
> @@ -208,7 +218,7 @@ static const struct r600_reg r600_context_reg_list[] = {
>        {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_0280C0_CB_COLOR0_TILE, REG_FLAG_NEED_BO, 0, 0},
>        {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_028100_CB_COLOR0_MASK, 0, 0, 0},
>        {0, 0, GROUP_FORCE_NEW_BLOCK, 0, 0, 0},
> -       {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_028044_CB_COLOR1_BASE, REG_FLAG_NEED_BO, 0, 0},
> +       {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_028044_CB_COLOR1_BASE, REG_FLAG_NEED_BO|REG_FLAG_RV6XX_SBU, SURFACE_BASE_UPDATE_COLOR(1), 0},
>        {0, 0, GROUP_FORCE_NEW_BLOCK, 0, 0, 0},
>        {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_0280A4_CB_COLOR1_INFO, REG_FLAG_NEED_BO, 0, 0xFFFFFFFF},
>        {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_028064_CB_COLOR1_SIZE, 0, 0, 0},
> @@ -219,7 +229,7 @@ static const struct r600_reg r600_context_reg_list[] = {
>        {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_0280C4_CB_COLOR1_TILE, REG_FLAG_NEED_BO, 0, 0},
>        {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_028104_CB_COLOR1_MASK, 0, 0, 0},
>        {0, 0, GROUP_FORCE_NEW_BLOCK, 0, 0, 0},
> -       {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_028048_CB_COLOR2_BASE, REG_FLAG_NEED_BO, 0, 0},
> +       {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_028048_CB_COLOR2_BASE, REG_FLAG_NEED_BO|REG_FLAG_RV6XX_SBU, SURFACE_BASE_UPDATE_COLOR(2), 0},
>        {0, 0, GROUP_FORCE_NEW_BLOCK, 0, 0, 0},
>        {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_0280A8_CB_COLOR2_INFO, REG_FLAG_NEED_BO, 0, 0xFFFFFFFF},
>        {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_028068_CB_COLOR2_SIZE, 0, 0, 0},
> @@ -230,7 +240,7 @@ static const struct r600_reg r600_context_reg_list[] = {
>        {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_0280C8_CB_COLOR2_TILE, REG_FLAG_NEED_BO, 0, 0},
>        {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_028108_CB_COLOR2_MASK, 0, 0, 0},
>        {0, 0, GROUP_FORCE_NEW_BLOCK, 0, 0, 0},
> -       {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_02804C_CB_COLOR3_BASE, REG_FLAG_NEED_BO, 0, 0},
> +       {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_02804C_CB_COLOR3_BASE, REG_FLAG_NEED_BO|REG_FLAG_RV6XX_SBU, SURFACE_BASE_UPDATE_COLOR(3), 0},
>        {0, 0, GROUP_FORCE_NEW_BLOCK, 0, 0, 0},
>        {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_0280AC_CB_COLOR3_INFO, REG_FLAG_NEED_BO, 0, 0xFFFFFFFF},
>        {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_02806C_CB_COLOR3_SIZE, 0, 0, 0},
> @@ -241,7 +251,7 @@ static const struct r600_reg r600_context_reg_list[] = {
>        {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_0280CC_CB_COLOR3_TILE, REG_FLAG_NEED_BO, 0, 0},
>        {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_02810C_CB_COLOR3_MASK, 0, 0, 0},
>        {0, 0, GROUP_FORCE_NEW_BLOCK, 0, 0, 0},
> -       {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_028050_CB_COLOR4_BASE, REG_FLAG_NEED_BO, 0, 0},
> +       {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_028050_CB_COLOR4_BASE, REG_FLAG_NEED_BO|REG_FLAG_RV6XX_SBU, SURFACE_BASE_UPDATE_COLOR(4), 0},
>        {0, 0, GROUP_FORCE_NEW_BLOCK, 0, 0, 0},
>        {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_0280B0_CB_COLOR4_INFO, REG_FLAG_NEED_BO, 0, 0xFFFFFFFF},
>        {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_028070_CB_COLOR4_SIZE, 0, 0, 0},
> @@ -252,7 +262,7 @@ static const struct r600_reg r600_context_reg_list[] = {
>        {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_0280D0_CB_COLOR4_TILE, REG_FLAG_NEED_BO, 0, 0},
>        {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_028110_CB_COLOR4_MASK, 0, 0, 0},
>        {0, 0, GROUP_FORCE_NEW_BLOCK, 0, 0, 0},
> -       {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_028054_CB_COLOR5_BASE, REG_FLAG_NEED_BO, 0, 0},
> +       {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_028054_CB_COLOR5_BASE, REG_FLAG_NEED_BO|REG_FLAG_RV6XX_SBU, SURFACE_BASE_UPDATE_COLOR(5), 0},
>        {0, 0, GROUP_FORCE_NEW_BLOCK, 0, 0, 0},
>        {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_0280B4_CB_COLOR5_INFO, REG_FLAG_NEED_BO, 0, 0xFFFFFFFF},
>        {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_028074_CB_COLOR5_SIZE, 0, 0, 0},
> @@ -262,7 +272,7 @@ static const struct r600_reg r600_context_reg_list[] = {
>        {0, 0, GROUP_FORCE_NEW_BLOCK, 0, 0, 0},
>        {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_0280D4_CB_COLOR5_TILE, REG_FLAG_NEED_BO, 0, 0},
>        {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_028114_CB_COLOR5_MASK, 0, 0, 0},
> -       {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_028058_CB_COLOR6_BASE, REG_FLAG_NEED_BO, 0, 0},
> +       {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_028058_CB_COLOR6_BASE, REG_FLAG_NEED_BO|REG_FLAG_RV6XX_SBU, SURFACE_BASE_UPDATE_COLOR(6), 0},
>        {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_0280B8_CB_COLOR6_INFO, REG_FLAG_NEED_BO, 0, 0xFFFFFFFF},
>        {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_028078_CB_COLOR6_SIZE, 0, 0, 0},
>        {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_028098_CB_COLOR6_VIEW, 0, 0, 0},
> @@ -272,7 +282,7 @@ static const struct r600_reg r600_context_reg_list[] = {
>        {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_0280D8_CB_COLOR6_TILE, REG_FLAG_NEED_BO, 0, 0},
>        {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_028118_CB_COLOR6_MASK, 0, 0, 0},
>        {0, 0, GROUP_FORCE_NEW_BLOCK, 0, 0, 0},
> -       {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_02805C_CB_COLOR7_BASE, REG_FLAG_NEED_BO, 0, 0},
> +       {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_02805C_CB_COLOR7_BASE, REG_FLAG_NEED_BO|REG_FLAG_RV6XX_SBU, SURFACE_BASE_UPDATE_COLOR(7), 0},
>        {0, 0, GROUP_FORCE_NEW_BLOCK, 0, 0, 0},
>        {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_0280BC_CB_COLOR7_INFO, REG_FLAG_NEED_BO, 0, 0xFFFFFFFF},
>        {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_02807C_CB_COLOR7_SIZE, 0, 0, 0},
> @@ -327,7 +337,7 @@ static const struct r600_reg r600_context_reg_list[] = {
>        {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_028C48_PA_SC_AA_MASK, 0, 0, 0},
>        {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_028D2C_DB_SRESULTS_COMPARE_STATE1, 0, 0, 0},
>        {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_028D44_DB_ALPHA_TO_MASK, 0, 0, 0},
> -       {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_02800C_DB_DEPTH_BASE, REG_FLAG_NEED_BO, 0, 0},
> +       {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_02800C_DB_DEPTH_BASE, REG_FLAG_NEED_BO|REG_FLAG_RV6XX_SBU, SURFACE_BASE_UPDATE_DEPTH, 0},
>        {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_028000_DB_DEPTH_SIZE, 0, 0, 0},
>        {PKT3_SET_CONTEXT_REG, R600_CONTEXT_REG_OFFSET, R_028004_DB_DEPTH_VIEW, 0, 0, 0},
>        {0, 0, GROUP_FORCE_NEW_BLOCK, 0, 0, 0},
> @@ -766,17 +776,6 @@ out_err:
>        return r;
>  }
>
> -static void rv6xx_context_surface_base_update(struct r600_context *ctx,
> -                                             unsigned base_update_flags)
> -{
> -       /* need to emit surface base update on rv6xx */
> -       if ((ctx->radeon->family > CHIP_R600) &&
> -           (ctx->radeon->family < CHIP_RV770)) {
> -               ctx->pm4[ctx->pm4_cdwords++] = PKT3(PKT3_SURFACE_BASE_UPDATE, 0, 0);
> -               ctx->pm4[ctx->pm4_cdwords++] = base_update_flags;
> -       }
> -}
> -
>  /* Flushes all surfaces */
>  void r600_context_flush_all(struct r600_context *ctx, unsigned flush_flags)
>  {
> @@ -1192,7 +1191,6 @@ void r600_context_draw(struct r600_context *ctx, const struct r600_draw *draw)
>        unsigned ndwords = 7;
>        struct r600_block *dirty_block = NULL;
>        struct r600_block *next_block;
> -       unsigned rv6xx_surface_base_update = 0;
>
>        if (draw->indices) {
>                ndwords = 11;
> @@ -1202,33 +1200,6 @@ void r600_context_draw(struct r600_context *ctx, const struct r600_draw *draw)
>                }
>        }
>
> -       /* rv6xx surface base update */
> -       if ((ctx->radeon->family > CHIP_R600) &&
> -           (ctx->radeon->family < CHIP_RV770)) {
> -               struct r600_bo *cb[8];
> -               struct r600_bo *db;
> -
> -               db = r600_context_reg_bo(ctx, R_02800C_DB_DEPTH_BASE);
> -               cb[0] = r600_context_reg_bo(ctx, R_028040_CB_COLOR0_BASE);
> -               cb[1] = r600_context_reg_bo(ctx, R_028044_CB_COLOR1_BASE);
> -               cb[2] = r600_context_reg_bo(ctx, R_028048_CB_COLOR2_BASE);
> -               cb[3] = r600_context_reg_bo(ctx, R_02804C_CB_COLOR3_BASE);
> -               cb[4] = r600_context_reg_bo(ctx, R_028050_CB_COLOR4_BASE);
> -               cb[5] = r600_context_reg_bo(ctx, R_028054_CB_COLOR5_BASE);
> -               cb[6] = r600_context_reg_bo(ctx, R_028058_CB_COLOR6_BASE);
> -               cb[7] = r600_context_reg_bo(ctx, R_02805C_CB_COLOR7_BASE);
> -               for (int i = 0; i < 8; i++) {
> -                       if (cb[i]) {
> -                               rv6xx_surface_base_update |= SURFACE_BASE_UPDATE_COLOR(i);
> -                       }
> -               }
> -               if (db) {
> -                       rv6xx_surface_base_update |= SURFACE_BASE_UPDATE_DEPTH;
> -               }
> -       }
> -
> -       /* XXX also need to update SURFACE_BASE_UPDATE_STRMOUT when we support it */
> -
>        /* queries need some special values */
>        if (ctx->num_query_running) {
>                if (ctx->radeon->family >= CHIP_RV770) {
> @@ -1261,12 +1232,6 @@ void r600_context_draw(struct r600_context *ctx, const struct r600_draw *draw)
>                r600_context_block_emit_dirty(ctx, dirty_block);
>        }
>
> -       /* rv6xx surface base update */
> -       /* If the dst caches are dirty we know that the surface base registers
> -        * haven't changed since the last surface base update was emitted */
> -       if (rv6xx_surface_base_update && !(ctx->flags & R600_CONTEXT_DST_CACHES_DIRTY))
> -               rv6xx_context_surface_base_update(ctx, rv6xx_surface_base_update);
> -
>        /* draw packet */
>        ctx->pm4[ctx->pm4_cdwords++] = PKT3(PKT3_INDEX_TYPE, 0, ctx->predicate_drawing);
>        ctx->pm4[ctx->pm4_cdwords++] = draw->vgt_index_type;
> diff --git a/src/gallium/winsys/r600/drm/r600_priv.h b/src/gallium/winsys/r600/drm/r600_priv.h
> index ed0f3e5..2b846ee 100644
> --- a/src/gallium/winsys/r600/drm/r600_priv.h
> +++ b/src/gallium/winsys/r600/drm/r600_priv.h
> @@ -64,6 +64,7 @@ struct radeon {
>
>  #define REG_FLAG_NEED_BO 1
>  #define REG_FLAG_DIRTY_ALWAYS 2
> +#define REG_FLAG_RV6XX_SBU 4
>
>  struct r600_reg {
>        unsigned                        opcode;
> --
> 1.7.5
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>


More information about the mesa-dev mailing list