On Wed, May 4, 2011 at 4:18 AM, Dave Airlie <airl...@gmail.com> wrote: > From: Dave Airlie <airl...@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 <alexdeuc...@gmail.com> > > Signed-off-by: Dave Airlie <airl...@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@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev