Mesa (master): r600g: fix dirty state handling

Jerome Glisse glisse at kemper.freedesktop.org
Wed Oct 6 17:02:11 UTC 2010


Module: Mesa
Branch: master
Commit: 3fabd218a0ffe1aa362440d957cf9135955045a3
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=3fabd218a0ffe1aa362440d957cf9135955045a3

Author: Jerome Glisse <jglisse at redhat.com>
Date:   Wed Oct  6 12:56:53 2010 -0400

r600g: fix dirty state handling

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

Signed-off-by: Jerome Glisse <jglisse at redhat.com>

---

 src/gallium/winsys/r600/drm/evergreen_hw_context.c |    5 ++---
 src/gallium/winsys/r600/drm/r600_hw_context.c      |    8 ++++----
 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 9617035..9b39c0c 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 72bfb35..86bddcc 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 a693a5b..e3868d3 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)




More information about the mesa-commit mailing list