Mesa (master): r600g: store reloc information in bo structure

Jerome Glisse glisse at kemper.freedesktop.org
Tue Oct 5 15:15:31 UTC 2010


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

Author: Jerome Glisse <jglisse at redhat.com>
Date:   Tue Oct  5 08:42:42 2010 -0400

r600g: store reloc information in bo structure

Allow fast lookup of relocation information & id which
was a CPU time consumming operation.

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

---

 src/gallium/winsys/r600/drm/r600_hw_context.c |   37 +++++++++---------------
 src/gallium/winsys/r600/drm/r600_priv.h       |    2 +
 2 files changed, 16 insertions(+), 23 deletions(-)

diff --git a/src/gallium/winsys/r600/drm/r600_hw_context.c b/src/gallium/winsys/r600/drm/r600_hw_context.c
index bee0446..40c612c 100644
--- a/src/gallium/winsys/r600/drm/r600_hw_context.c
+++ b/src/gallium/winsys/r600/drm/r600_hw_context.c
@@ -707,33 +707,23 @@ out_err:
 void r600_context_bo_reloc(struct r600_context *ctx, u32 *pm4, struct r600_bo *rbo)
 {
 	struct radeon_bo *bo;
-	int i, reloc_id;
 
 	bo = r600_bo_get_bo(rbo);
 	assert(bo != NULL);
-	for (i = 0, reloc_id = -1; i < ctx->creloc; i++) {
-		if (ctx->reloc[i].handle == bo->handle) {
-			reloc_id = i * sizeof(struct r600_reloc) / 4;
-			/* set PKT3 to point to proper reloc */
-			*pm4 = reloc_id;
-			break;
-		}
-	}
-	if (reloc_id == -1) {
-		/* add new relocation */
-		if (ctx->creloc >= ctx->nreloc) {
-			r600_context_flush(ctx);
-		}
-		reloc_id = ctx->creloc * sizeof(struct r600_reloc) / 4;
-		ctx->reloc[ctx->creloc].handle = bo->handle;
-		ctx->reloc[ctx->creloc].read_domain = RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM;
-		ctx->reloc[ctx->creloc].write_domain = RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM;
-		ctx->reloc[ctx->creloc].flags = 0;
-		radeon_bo_reference(ctx->radeon, &ctx->bo[ctx->creloc], bo);
-		ctx->creloc++;
-		/* set PKT3 to point to proper reloc */
-		*pm4 = reloc_id;
+	if (bo->reloc) {
+		*pm4 = bo->reloc_id;
+		return;
 	}
+	bo->reloc = &ctx->reloc[ctx->creloc];
+	bo->reloc_id = ctx->creloc * sizeof(struct r600_reloc) / 4;
+	ctx->reloc[ctx->creloc].handle = bo->handle;
+	ctx->reloc[ctx->creloc].read_domain = RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM;
+	ctx->reloc[ctx->creloc].write_domain = RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM;
+	ctx->reloc[ctx->creloc].flags = 0;
+	radeon_bo_reference(ctx->radeon, &ctx->bo[ctx->creloc], bo);
+	ctx->creloc++;
+	/* set PKT3 to point to proper reloc */
+	*pm4 = bo->reloc_id;
 }
 
 void r600_context_pipe_state_set(struct r600_context *ctx, struct r600_pipe_state *state)
@@ -1045,6 +1035,7 @@ void r600_context_flush(struct r600_context *ctx)
 	/* restart */
 	radeon_bo_fencelist(ctx->radeon, ctx->bo, ctx->creloc);
 	for (int i = 0; i < ctx->creloc; i++) {
+		ctx->bo[i]->reloc = NULL;
 		radeon_bo_reference(ctx->radeon, &ctx->bo[i], NULL);
 	}
 	ctx->creloc = 0;
diff --git a/src/gallium/winsys/r600/drm/r600_priv.h b/src/gallium/winsys/r600/drm/r600_priv.h
index ee48754..4619207 100644
--- a/src/gallium/winsys/r600/drm/r600_priv.h
+++ b/src/gallium/winsys/r600/drm/r600_priv.h
@@ -66,6 +66,8 @@ struct radeon_bo {
 	boolean				shared;
 	int64_t				last_busy;
 	boolean				set_busy;
+	struct r600_reloc		*reloc;
+	unsigned			reloc_id;
 };
 
 struct r600_bo {




More information about the mesa-commit mailing list