[Mesa-dev] [PATCH 2/2] r600g, radeonsi: set resource domains in one place (v2)

Marek Olšák maraeo at gmail.com
Wed Feb 5 00:01:15 CET 2014


From: Marek Olšák <marek.olsak at amd.com>

v2: This doesn't change the behavior. It only moves the tiling check
    to r600_init_resource and removes the usage parameter.
---
 src/gallium/drivers/r600/r600_state_common.c    |  4 +--
 src/gallium/drivers/radeon/r600_buffer_common.c | 33 ++++++++++++-------------
 src/gallium/drivers/radeon/r600_pipe_common.h   |  2 +-
 src/gallium/drivers/radeon/r600_texture.c       |  7 ++----
 src/gallium/drivers/radeonsi/si_descriptors.c   |  4 +--
 5 files changed, 23 insertions(+), 27 deletions(-)

diff --git a/src/gallium/drivers/r600/r600_state_common.c b/src/gallium/drivers/r600/r600_state_common.c
index d8fab10..c1d7e29 100644
--- a/src/gallium/drivers/r600/r600_state_common.c
+++ b/src/gallium/drivers/r600/r600_state_common.c
@@ -2082,8 +2082,8 @@ static void r600_invalidate_buffer(struct pipe_context *ctx, struct pipe_resourc
 	pb_reference(&rbuffer->buf, NULL);
 
 	/* Create a new one in the same pipe_resource. */
-	r600_init_resource(&rctx->screen->b, rbuffer, rbuffer->b.b.width0, alignment,
-			   TRUE, rbuffer->b.b.usage);
+	r600_init_resource(&rctx->screen->b, rbuffer, rbuffer->b.b.width0,
+			   alignment, TRUE);
 
 	/* We changed the buffer, now we need to bind it where the old one was bound. */
 	/* Vertex buffers. */
diff --git a/src/gallium/drivers/radeon/r600_buffer_common.c b/src/gallium/drivers/radeon/r600_buffer_common.c
index 2077228..59578e1 100644
--- a/src/gallium/drivers/radeon/r600_buffer_common.c
+++ b/src/gallium/drivers/radeon/r600_buffer_common.c
@@ -103,42 +103,41 @@ void *r600_buffer_map_sync_with_rings(struct r600_common_context *ctx,
 bool r600_init_resource(struct r600_common_screen *rscreen,
 			struct r600_resource *res,
 			unsigned size, unsigned alignment,
-			bool use_reusable_pool, unsigned usage)
+			bool use_reusable_pool)
 {
-	uint32_t initial_domain, domains;
+	struct r600_texture *rtex = (struct r600_texture*)res;
 
-	switch(usage) {
+	switch (res->b.b.usage) {
 	case PIPE_USAGE_STAGING:
 	case PIPE_USAGE_DYNAMIC:
 	case PIPE_USAGE_STREAM:
-		/* These resources participate in transfers, i.e. are used
-		 * for uploads and downloads from regular resources.
-		 * We generate them internally for some transfers.
-		 */
-		initial_domain = RADEON_DOMAIN_GTT;
-		domains = RADEON_DOMAIN_GTT;
+		/* Transfers are likely to occur more often with these resources. */
+		res->domains = RADEON_DOMAIN_GTT;
 		break;
 	case PIPE_USAGE_DEFAULT:
 	case PIPE_USAGE_STATIC:
 	case PIPE_USAGE_IMMUTABLE:
 	default:
-		/* Don't list GTT here, because the memory manager would put some
-		 * resources to GTT no matter what the initial domain is.
-		 * Not listing GTT in the domains improves performance a lot. */
-		initial_domain = RADEON_DOMAIN_VRAM;
-		domains = RADEON_DOMAIN_VRAM;
+		/* Not listing GTT here improves performance in some apps. */
+		res->domains = RADEON_DOMAIN_VRAM;
 		break;
 	}
 
+	/* Tiled textures are unmappable. Always put them in VRAM. */
+	if (res->b.b.target != PIPE_BUFFER &&
+	    rtex->surface.level[0].mode >= RADEON_SURF_MODE_1D) {
+		res->domains = RADEON_DOMAIN_VRAM;
+	}
+
+	/* Allocate the resource. */
 	res->buf = rscreen->ws->buffer_create(rscreen->ws, size, alignment,
                                               use_reusable_pool,
-                                              initial_domain);
+                                              res->domains);
 	if (!res->buf) {
 		return false;
 	}
 
 	res->cs_buf = rscreen->ws->buffer_get_cs_handle(res->buf);
-	res->domains = domains;
 	util_range_set_empty(&res->valid_buffer_range);
 
 	if (rscreen->debug_flags & DBG_VM && res->b.b.target == PIPE_BUFFER) {
@@ -327,7 +326,7 @@ struct pipe_resource *r600_buffer_create(struct pipe_screen *screen,
 	rbuffer->b.vtbl = &r600_buffer_vtbl;
 	util_range_init(&rbuffer->valid_buffer_range);
 
-	if (!r600_init_resource(rscreen, rbuffer, templ->width0, alignment, TRUE, templ->usage)) {
+	if (!r600_init_resource(rscreen, rbuffer, templ->width0, alignment, TRUE)) {
 		FREE(rbuffer);
 		return NULL;
 	}
diff --git a/src/gallium/drivers/radeon/r600_pipe_common.h b/src/gallium/drivers/radeon/r600_pipe_common.h
index 9fdfdfd..7193a0f 100644
--- a/src/gallium/drivers/radeon/r600_pipe_common.h
+++ b/src/gallium/drivers/radeon/r600_pipe_common.h
@@ -321,7 +321,7 @@ void *r600_buffer_map_sync_with_rings(struct r600_common_context *ctx,
 bool r600_init_resource(struct r600_common_screen *rscreen,
 			struct r600_resource *res,
 			unsigned size, unsigned alignment,
-			bool use_reusable_pool, unsigned usage);
+			bool use_reusable_pool);
 struct pipe_resource *r600_buffer_create(struct pipe_screen *screen,
 					 const struct pipe_resource *templ,
 					 unsigned alignment);
diff --git a/src/gallium/drivers/radeon/r600_texture.c b/src/gallium/drivers/radeon/r600_texture.c
index aa4e8ea..4cd2322 100644
--- a/src/gallium/drivers/radeon/r600_texture.c
+++ b/src/gallium/drivers/radeon/r600_texture.c
@@ -616,11 +616,8 @@ r600_texture_create_object(struct pipe_screen *screen,
 
 	/* Now create the backing buffer. */
 	if (!buf) {
-		unsigned base_align = rtex->surface.bo_alignment;
-		unsigned usage = rtex->surface.level[0].mode >= RADEON_SURF_MODE_1D ?
-					 PIPE_USAGE_STATIC : base->usage;
-
-		if (!r600_init_resource(rscreen, resource, rtex->size, base_align, FALSE, usage)) {
+		if (!r600_init_resource(rscreen, resource, rtex->size,
+					rtex->surface.bo_alignment, FALSE)) {
 			FREE(rtex);
 			return NULL;
 		}
diff --git a/src/gallium/drivers/radeonsi/si_descriptors.c b/src/gallium/drivers/radeonsi/si_descriptors.c
index 9078c6c..f717371 100644
--- a/src/gallium/drivers/radeonsi/si_descriptors.c
+++ b/src/gallium/drivers/radeonsi/si_descriptors.c
@@ -706,8 +706,8 @@ static void si_invalidate_buffer(struct pipe_context *ctx, struct pipe_resource
 	pb_reference(&rbuffer->buf, NULL);
 
 	/* Create a new one in the same pipe_resource. */
-	r600_init_resource(&sctx->screen->b, rbuffer, rbuffer->b.b.width0, alignment,
-			   TRUE, rbuffer->b.b.usage);
+	r600_init_resource(&sctx->screen->b, rbuffer, rbuffer->b.b.width0,
+			   alignment, TRUE);
 
 	/* We changed the buffer, now we need to bind it where the old one
 	 * was bound. This consists of 2 things:
-- 
1.8.3.2



More information about the mesa-dev mailing list