r600g: fix dirty state handling

Avoid having object ending up in dead list of dirty object.

Signed-off-by: Jerome Glisse <jglisse@redhat.com>
This commit is contained in:
Jerome Glisse 2010-10-06 12:56:53 -04:00
parent 634abbf7b2
commit 3fabd218a0
3 changed files with 7 additions and 7 deletions

View File

@ -762,7 +762,7 @@ void evergreen_context_draw(struct r600_context *ctx, const struct r600_draw *dr
struct r600_bo *cb[12];
struct r600_bo *db;
unsigned ndwords = 9, flush;
struct r600_block *dirty_block;
struct r600_block *dirty_block, *next_block;
if (draw->indices) {
ndwords = 13;
@ -817,10 +817,9 @@ void evergreen_context_draw(struct r600_context *ctx, const struct r600_draw *dr
}
/* enough room to copy packet */
LIST_FOR_EACH_ENTRY(dirty_block,&ctx->dirty,list) {
LIST_FOR_EACH_ENTRY_SAFE(dirty_block, next_block, &ctx->dirty,list) {
r600_context_block_emit_dirty(ctx, dirty_block);
}
LIST_INITHEAD(&ctx->dirty);
/* draw packet */
ctx->pm4[ctx->pm4_cdwords++] = PKT3(PKT3_INDEX_TYPE, 0);

View File

@ -967,7 +967,7 @@ void r600_context_draw(struct r600_context *ctx, const struct r600_draw *draw)
struct r600_bo *cb[8];
struct r600_bo *db;
unsigned ndwords = 9;
struct r600_block *dirty_block;
struct r600_block *dirty_block, *next_block;
if (draw->indices) {
ndwords = 13;
@ -1020,10 +1020,9 @@ void r600_context_draw(struct r600_context *ctx, const struct r600_draw *draw)
}
/* enough room to copy packet */
LIST_FOR_EACH_ENTRY(dirty_block,&ctx->dirty,list) {
LIST_FOR_EACH_ENTRY_SAFE(dirty_block, next_block, &ctx->dirty,list) {
r600_context_block_emit_dirty(ctx, dirty_block);
}
LIST_INITHEAD(&ctx->dirty);
/* draw packet */
ctx->pm4[ctx->pm4_cdwords++] = PKT3(PKT3_INDEX_TYPE, 0);
@ -1135,8 +1134,9 @@ void r600_context_flush(struct r600_context *ctx)
*/
for (int i = 0; i < ctx->nblocks; i++) {
if (ctx->blocks[i]->status & R600_BLOCK_STATUS_ENABLED) {
if(!(ctx->blocks[i]->status & R600_BLOCK_STATUS_DIRTY))
if(!(ctx->blocks[i]->status & R600_BLOCK_STATUS_DIRTY)) {
LIST_ADDTAIL(&ctx->blocks[i]->list,&ctx->dirty);
}
ctx->pm4_dirty_cdwords += ctx->blocks[i]->pm4_ndwords + ctx->blocks[i]->pm4_flush_ndwords;
ctx->blocks[i]->status |= R600_BLOCK_STATUS_DIRTY;
}

View File

@ -162,6 +162,7 @@ static inline void r600_context_block_emit_dirty(struct r600_context *ctx, struc
memcpy(&ctx->pm4[ctx->pm4_cdwords], block->pm4, block->pm4_ndwords * 4);
ctx->pm4_cdwords += block->pm4_ndwords;
block->status ^= R600_BLOCK_STATUS_DIRTY;
LIST_DELINIT(&block->list);
}
static inline int radeon_bo_map(struct radeon *radeon, struct radeon_bo *bo)