diff options
| author | Jerome Glisse <jglisse@redhat.com> | 2010-10-06 12:56:53 -0400 | 
|---|---|---|
| committer | Jerome Glisse <jglisse@redhat.com> | 2010-10-06 13:01:31 -0400 | 
| commit | 3fabd218a0ffe1aa362440d957cf9135955045a3 (patch) | |
| tree | 00c0864e353dae2989c9daf53232f9d20a4f0569 /src | |
| parent | 634abbf7b2e6ea21db30aafc0de9472ee31d4173 (diff) | |
r600g: fix dirty state handling
Avoid having object ending up in dead list of dirty object.
Signed-off-by: Jerome Glisse <jglisse@redhat.com>
Diffstat (limited to 'src')
| -rw-r--r-- | src/gallium/winsys/r600/drm/evergreen_hw_context.c | 5 | ||||
| -rw-r--r-- | src/gallium/winsys/r600/drm/r600_hw_context.c | 8 | ||||
| -rw-r--r-- | src/gallium/winsys/r600/drm/r600_priv.h | 1 | 
3 files changed, 7 insertions, 7 deletions
| diff --git a/src/gallium/winsys/r600/drm/evergreen_hw_context.c b/src/gallium/winsys/r600/drm/evergreen_hw_context.c index 9617035c93..9b39c0c4f0 100644 --- a/src/gallium/winsys/r600/drm/evergreen_hw_context.c +++ b/src/gallium/winsys/r600/drm/evergreen_hw_context.c @@ -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); diff --git a/src/gallium/winsys/r600/drm/r600_hw_context.c b/src/gallium/winsys/r600/drm/r600_hw_context.c index 72bfb357b3..86bddccbbb 100644 --- a/src/gallium/winsys/r600/drm/r600_hw_context.c +++ b/src/gallium/winsys/r600/drm/r600_hw_context.c @@ -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;  		} diff --git a/src/gallium/winsys/r600/drm/r600_priv.h b/src/gallium/winsys/r600/drm/r600_priv.h index a693a5b5ab..e3868d3cb9 100644 --- a/src/gallium/winsys/r600/drm/r600_priv.h +++ b/src/gallium/winsys/r600/drm/r600_priv.h @@ -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) | 
