[Mesa-dev] [PATCH 08/10] r600g: Use a texture as the underlying resource for compute_memory_pool

Tom Stellard tstellar at gmail.com
Wed Jun 27 08:37:32 PDT 2012


This the first step towards being able to use evergreen_cb to bind RATs.
---
 src/gallium/drivers/r600/compute_memory_pool.c     |   34 +++++++++++++++++--
 .../drivers/r600/evergreen_compute_internal.c      |   21 ++++--------
 2 files changed, 37 insertions(+), 18 deletions(-)

diff --git a/src/gallium/drivers/r600/compute_memory_pool.c b/src/gallium/drivers/r600/compute_memory_pool.c
index 01bf0c3..1e88aaf 100644
--- a/src/gallium/drivers/r600/compute_memory_pool.c
+++ b/src/gallium/drivers/r600/compute_memory_pool.c
@@ -41,6 +41,32 @@
 #include "compute_memory_pool.h"
 #include "evergreen_compute_internal.h"
 
+static struct r600_resource_texture * create_pool_texture(struct r600_screen * screen,
+		unsigned size_in_dw)
+{
+
+	struct pipe_resource templ;
+	struct r600_resource_texture * tex;
+
+	memset(&templ, 0, sizeof(templ));
+	templ.target = PIPE_TEXTURE_1D;
+	templ.format = PIPE_FORMAT_R32_UNORM;
+	templ.bind = PIPE_BIND_CUSTOM;
+	templ.usage = PIPE_USAGE_IMMUTABLE;
+	templ.flags = 0;
+	templ.width0 = size_in_dw;
+	templ.height0 = 1;
+	templ.depth0 = 1;
+	templ.array_size = 1;
+
+	tex = (struct r600_resource_texture *)r600_texture_create(
+						&screen->screen, &templ);
+	/* XXX: Propagate this error */
+	assert(tex && "Out of memory");
+	tex->is_rat = 1;
+	return tex;
+}
+
 /**
  * Creates a new pool
  */
@@ -54,8 +80,8 @@ struct compute_memory_pool* compute_memory_pool_new(
 	pool->next_id = 1;
 	pool->size_in_dw = initial_size_in_dw;
 	pool->screen = rscreen;
-	pool->bo = (struct r600_resource*)r600_compute_buffer_alloc_vram(
-					pool->screen, pool->size_in_dw*4);
+	pool->bo = (struct r600_resource*)create_pool_texture(pool->screen,
+							pool->size_in_dw);
 	pool->shadow = (uint32_t*)CALLOC(4, pool->size_in_dw);
 
 	return pool;
@@ -147,8 +173,8 @@ void compute_memory_grow_pool(struct compute_memory_pool* pool,
 	pool->screen->screen.resource_destroy(
 		(struct pipe_screen *)pool->screen,
 		(struct pipe_resource *)pool->bo);
-	pool->bo = r600_compute_buffer_alloc_vram(pool->screen,
-						pool->size_in_dw*4);
+	pool->bo = (struct r600_resource*)create_pool_texture(pool->screen,
+							pool->size_in_dw);
 	compute_memory_shadow(pool, pipe, 0);
 }
 
diff --git a/src/gallium/drivers/r600/evergreen_compute_internal.c b/src/gallium/drivers/r600/evergreen_compute_internal.c
index 13c82f0..ca44837 100644
--- a/src/gallium/drivers/r600/evergreen_compute_internal.c
+++ b/src/gallium/drivers/r600/evergreen_compute_internal.c
@@ -298,20 +298,13 @@ void evergreen_set_rat(
 		evergreen_compute_get_gpu_format(&fmt, bo);
 	}
 
-	if (linear) {
-		evergreen_reg_set(res,
-			R_028C70_CB_COLOR0_INFO, S_028C70_RAT(1)
-			| S_028C70_ARRAY_MODE(V_028C70_ARRAY_LINEAR_ALIGNED)
-			| S_028C70_FORMAT(fmt.format)
-			| S_028C70_NUMBER_TYPE(fmt.number_type)
-		);
-		evergreen_emit_force_reloc(res);
-	} else {
-		assert(0 && "TODO");
-		///TODO
-//	 evergreen_reg_set(res, R_028C70_CB_COLOR0_INFO, S_028C70_RAT(1) | S_028C70_ARRAY_MODE(????));
-//	 evergreen_emit_force_reloc(res);
-	}
+	evergreen_reg_set(res,
+		R_028C70_CB_COLOR0_INFO, S_028C70_RAT(1)
+		| S_028C70_ARRAY_MODE(V_028C70_ARRAY_LINEAR_ALIGNED)
+		| S_028C70_FORMAT(fmt.format)
+		| S_028C70_NUMBER_TYPE(fmt.number_type)
+	);
+	evergreen_emit_force_reloc(res);
 
 	evergreen_reg_set(res, R_028C74_CB_COLOR0_ATTRIB, S_028C74_NON_DISP_TILING_ORDER(1));
 	evergreen_emit_force_reloc(res);
-- 
1.7.7.6



More information about the mesa-dev mailing list