Mesa (master): r600g: add winsys bo caching.

Dave Airlie airlied at kemper.freedesktop.org
Fri Sep 17 05:31:20 UTC 2010


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

Author: Dave Airlie <airlied at redhat.com>
Date:   Fri Sep 17 13:37:31 2010 +1000

r600g: add winsys bo caching.

this adds the bo caching layer and uses it for vertex/index/constant bos.

ctx needs to take references on hw bos so the flushing works okay, also
needs to flush the maps.

---

 src/gallium/winsys/r600/drm/radeon.c       |    4 ++
 src/gallium/winsys/r600/drm/radeon_ctx.c   |   44 +++++++++------------------
 src/gallium/winsys/r600/drm/radeon_priv.h  |    3 +-
 src/gallium/winsys/r600/drm/radeon_ws_bo.c |    4 ++-
 4 files changed, 24 insertions(+), 31 deletions(-)

diff --git a/src/gallium/winsys/r600/drm/radeon.c b/src/gallium/winsys/r600/drm/radeon.c
index 8a5acf6..f39d020 100644
--- a/src/gallium/winsys/r600/drm/radeon.c
+++ b/src/gallium/winsys/r600/drm/radeon.c
@@ -133,6 +133,9 @@ struct radeon *radeon_new(int fd, unsigned device)
 	radeon->kman = radeon_bo_pbmgr_create(radeon);
 	if (!radeon->kman)
 		return NULL;
+	radeon->cman = pb_cache_manager_create(radeon->kman, 100000);
+	if (!radeon->cman)
+		return NULL;
 	return radeon;
 }
 
@@ -153,6 +156,7 @@ struct radeon *radeon_decref(struct radeon *radeon)
 	}
 
 	radeon->mman->destroy(radeon->mman);
+	radeon->cman->destroy(radeon->cman);
 	radeon->kman->destroy(radeon->kman);
 	drmClose(radeon->fd);
 	free(radeon);
diff --git a/src/gallium/winsys/r600/drm/radeon_ctx.c b/src/gallium/winsys/r600/drm/radeon_ctx.c
index 4bec798..ca3e40f 100644
--- a/src/gallium/winsys/r600/drm/radeon_ctx.c
+++ b/src/gallium/winsys/r600/drm/radeon_ctx.c
@@ -34,28 +34,12 @@ static int radeon_ctx_set_bo_new(struct radeon_ctx *ctx, struct radeon_ws_bo *bo
 {
 	if (ctx->nbo >= RADEON_CTX_MAX_PM4)
 		return -EBUSY;
-	radeon_ws_bo_reference(ctx->radeon, &ctx->bo[ctx->nbo], bo);
+	/* take a reference to the kernel bo */
+	radeon_bo_reference(ctx->radeon, &ctx->bo[ctx->nbo], radeon_bo_pb_get_bo(bo->pb));
 	ctx->nbo++;
 	return 0;
 }
 
-static struct radeon_ws_bo *radeon_ctx_get_bo(struct radeon_ctx *ctx, unsigned reloc)
-{
-	struct radeon_cs_reloc *greloc;
-	unsigned i;
-	struct radeon_ws_bo *bo;
-
-	greloc = (void *)(((u8 *)ctx->reloc) + reloc * 4);
-	for (i = 0; i < ctx->nbo; i++) {
-		if (radeon_ws_bo_get_handle(ctx->bo[i]) == greloc->handle) {
-			radeon_ws_bo_reference(ctx->radeon, &bo, ctx->bo[i]);
-			return bo;
-		}
-	}
-	fprintf(stderr, "%s no bo for reloc[%d 0x%08X] %d\n", __func__, reloc, greloc->handle, ctx->nbo);
-	return NULL;
-}
-
 static void radeon_ctx_get_placement(struct radeon_ctx *ctx, unsigned reloc, u32 *placement)
 {
 	struct radeon_cs_reloc *greloc;
@@ -65,7 +49,7 @@ static void radeon_ctx_get_placement(struct radeon_ctx *ctx, unsigned reloc, u32
 	placement[1] = 0;
 	greloc = (void *)(((u8 *)ctx->reloc) + reloc * 4);
 	for (i = 0; i < ctx->nbo; i++) {
-		if (radeon_ws_bo_get_handle(ctx->bo[i]) == greloc->handle) {
+		if (ctx->bo[i]->handle == greloc->handle) {
 			placement[0] = greloc->read_domain | greloc->write_domain;
 			placement[1] = placement[0];
 			return;
@@ -76,7 +60,7 @@ static void radeon_ctx_get_placement(struct radeon_ctx *ctx, unsigned reloc, u32
 void radeon_ctx_clear(struct radeon_ctx *ctx)
 {
 	for (int i = 0; i < ctx->nbo; i++) {
-		radeon_ws_bo_reference(ctx->radeon, &ctx->bo[i], NULL);
+		radeon_bo_reference(ctx->radeon, &ctx->bo[i], NULL);
 	}
 	ctx->ndwords = RADEON_CTX_MAX_PM4;
 	ctx->cdwords = 0;
@@ -118,7 +102,7 @@ void radeon_ctx_fini(struct radeon_ctx *ctx)
 		return;
 
 	for (i = 0; i < ctx->nbo; i++) {
-		radeon_ws_bo_reference(ctx->radeon, &ctx->bo[i], NULL);
+		radeon_bo_reference(ctx->radeon, &ctx->bo[i], NULL);
 	}
 	ctx->radeon = radeon_decref(ctx->radeon);
 	free(ctx->bo);
@@ -131,12 +115,13 @@ static int radeon_ctx_state_bo(struct radeon_ctx *ctx, struct radeon_state *stat
 {
 	unsigned i, j;
 	int r;
-
+	struct radeon_bo *state_bo;
 	if (state == NULL)
 		return 0;
 	for (i = 0; i < state->nbo; i++) {
 		for (j = 0; j < ctx->nbo; j++) {
-			if (state->bo[i] == ctx->bo[j])
+			state_bo = radeon_bo_pb_get_bo(state->bo[i]->pb);
+			if (state_bo == ctx->bo[j])
 				break;
 		}
 		if (j == ctx->nbo) {
@@ -158,6 +143,8 @@ int radeon_ctx_submit(struct radeon_ctx *ctx)
 
 	if (!ctx->cdwords)
 		return 0;
+
+	radeon_bo_pbmgr_flush_maps(ctx->radeon->kman);
 #if 0
 	for (r = 0; r < ctx->cdwords; r++) {
 		fprintf(stderr, "0x%08X\n", ctx->pm4[r]);
@@ -310,7 +297,6 @@ void radeon_ctx_dump_bof(struct radeon_ctx *ctx, const char *file)
 {
 	bof_t *bcs, *blob, *array, *bo, *size, *handle, *device_id, *root;
 	unsigned i;
-	void *data;
 	unsigned bo_size;
 	root = device_id = bcs = blob = array = bo = size = handle = NULL;
 	root = bof_object();
@@ -347,7 +333,7 @@ void radeon_ctx_dump_bof(struct radeon_ctx *ctx, const char *file)
 		bo = bof_object();
 		if (bo == NULL)
 			goto out_err;
-		bo_size = radeon_ws_bo_get_size(ctx->bo[i]);
+		bo_size = ctx->bo[i]->size;
 		size = bof_int32(bo_size);
 		if (size == NULL)
 			goto out_err;
@@ -355,16 +341,16 @@ void radeon_ctx_dump_bof(struct radeon_ctx *ctx, const char *file)
 			goto out_err;
 		bof_decref(size);
 		size = NULL;
-		handle = bof_int32(radeon_ws_bo_get_handle(ctx->bo[i]));
+		handle = bof_int32(ctx->bo[i]->handle);
 		if (handle == NULL)
 			goto out_err;
 		if (bof_object_set(bo, "handle", handle))
 			goto out_err;
 		bof_decref(handle);
 		handle = NULL;
-		data = radeon_ws_bo_map(ctx->radeon, ctx->bo[i], 0, NULL);
-		blob = bof_blob(bo_size, data);
-		radeon_ws_bo_unmap(ctx->radeon, ctx->bo[i]);
+		radeon_bo_map(ctx->radeon, ctx->bo[i]);
+		blob = bof_blob(bo_size, ctx->bo[i]->data);
+		radeon_bo_unmap(ctx->radeon, ctx->bo[i]);
 		if (blob == NULL)
 			goto out_err;
 		if (bof_object_set(bo, "data", blob))
diff --git a/src/gallium/winsys/r600/drm/radeon_priv.h b/src/gallium/winsys/r600/drm/radeon_priv.h
index bbcf8ec..c284f6a 100644
--- a/src/gallium/winsys/r600/drm/radeon_priv.h
+++ b/src/gallium/winsys/r600/drm/radeon_priv.h
@@ -75,7 +75,7 @@ struct radeon_ctx {
 	unsigned			nreloc;
 	struct radeon_cs_reloc		*reloc;
 	unsigned			nbo;
-	struct radeon_ws_bo		**bo;
+	struct radeon_bo		**bo;
 };
 
 struct radeon {
@@ -89,6 +89,7 @@ struct radeon {
 	boolean use_mem_constant; /* true for evergreen */
 	struct pb_manager *mman; /* malloc manager */
 	struct pb_manager *kman; /* kernel bo manager */
+	struct pb_manager *cman; /* cached bo manager */
 };
 
 struct radeon_ws_bo {
diff --git a/src/gallium/winsys/r600/drm/radeon_ws_bo.c b/src/gallium/winsys/r600/drm/radeon_ws_bo.c
index c63e926..ccaedb4 100644
--- a/src/gallium/winsys/r600/drm/radeon_ws_bo.c
+++ b/src/gallium/winsys/r600/drm/radeon_ws_bo.c
@@ -15,7 +15,9 @@ struct radeon_ws_bo *radeon_ws_bo(struct radeon *radeon,
 
 	if (radeon->use_mem_constant && (usage & PIPE_BIND_CONSTANT_BUFFER)) {
 		man = radeon->mman;
-	} else
+	} else if (usage & (PIPE_BIND_CONSTANT_BUFFER | PIPE_BIND_VERTEX_BUFFER | PIPE_BIND_INDEX_BUFFER))
+		man = radeon->cman;
+	else
 		man = radeon->kman;
 
 	ws_bo->pb = man->create_buffer(man, size, &desc);




More information about the mesa-commit mailing list