aboutsummaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/r600/compute_memory_pool.c
diff options
context:
space:
mode:
authorTom Stellard <[email protected]>2012-07-11 16:18:22 +0000
committerTom Stellard <[email protected]>2012-07-11 17:53:54 +0000
commitc0f7fe7b79afa9b95b1af56dce9eb881575b1cde (patch)
tree71475b2848b2bc731b45cc4154f6c6e5a9f98941 /src/gallium/drivers/r600/compute_memory_pool.c
parent49ae102ee346d4be6a61ebdaba6e5d5ad8469407 (diff)
r600g/compute: Disable growing the memory pool
The code for growing the memory pool (which is used for storing all of the global buffers) wasn't working. There seem to be two separate issues with the memory pool code. The first was the way it was growing the pool. When the memory pool needed more space, it would: 1. Copy the data from the memory pool's backing texture to system memory. 2. Delete the memory pool's texture 3. Create a bigger backing texture for the memory pool. 4. Copy the data from system memory into the bigger texture. The copy operations didn't seem to be working, and I suspect that since they were using fragment shaders to do the copy, that there might have been a problem with the mixing of compute and 3D state. The other issue is that the size of 1D textures is limited, and I was having trouble getting 2D textures to work. I think these problems will be easier to solve once more code is shared between 3D and compute, which is why I decided to disable it for now rather than continue searching for a fix.
Diffstat (limited to 'src/gallium/drivers/r600/compute_memory_pool.c')
-rw-r--r--src/gallium/drivers/r600/compute_memory_pool.c49
1 files changed, 32 insertions, 17 deletions
diff --git a/src/gallium/drivers/r600/compute_memory_pool.c b/src/gallium/drivers/r600/compute_memory_pool.c
index 17657f7c51a..cf48bad0985 100644
--- a/src/gallium/drivers/r600/compute_memory_pool.c
+++ b/src/gallium/drivers/r600/compute_memory_pool.c
@@ -74,23 +74,32 @@ static struct r600_resource_texture * create_pool_texture(struct r600_screen * s
* Creates a new pool
*/
struct compute_memory_pool* compute_memory_pool_new(
- int64_t initial_size_in_dw,
struct r600_screen * rscreen)
{
struct compute_memory_pool* pool = (struct compute_memory_pool*)
CALLOC(sizeof(struct compute_memory_pool), 1);
- COMPUTE_DBG("* compute_memory_pool_new() initial_size_in_dw = %ld\n",
+ COMPUTE_DBG("* compute_memory_pool_new()\n");
+
+ pool->screen = rscreen;
+ return pool;
+}
+
+static void compute_memory_pool_init(struct compute_memory_pool * pool,
+ unsigned initial_size_in_dw)
+{
+
+ COMPUTE_DBG("* compute_memory_pool_init() initial_size_in_dw = %ld\n",
initial_size_in_dw);
+ /* XXX: pool->shadow is used when the buffer needs to be resized, but
+ * resizing does not work at the moment.
+ * pool->shadow = (uint32_t*)CALLOC(4, pool->size_in_dw);
+ */
pool->next_id = 1;
pool->size_in_dw = initial_size_in_dw;
- pool->screen = rscreen;
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;
}
/**
@@ -183,16 +192,26 @@ void compute_memory_grow_pool(struct compute_memory_pool* pool,
assert(new_size_in_dw >= pool->size_in_dw);
- new_size_in_dw += 1024 - (new_size_in_dw % 1024);
+ assert(!pool->bo && "Growing the global memory pool is not yet "
+ "supported. You will see this message if you are trying to"
+ "use more than 64 kb of memory");
- COMPUTE_DBG(" Aligned size = %d\n", new_size_in_dw);
+ if (!pool->bo) {
+ compute_memory_pool_init(pool, 1024 * 16);
+ } else {
+ /* XXX: Growing memory pools does not work at the moment. I think
+ * it is because we are using fragment shaders to copy data to
+ * the new texture and some of the compute registers are being
+ * included in the 3D command stream. */
+ fprintf(stderr, "Warning: growing the global memory pool to"
+ "more than 64 kb is not yet supported\n");
+ new_size_in_dw += 1024 - (new_size_in_dw % 1024);
+
+ COMPUTE_DBG(" Aligned size = %d\n", new_size_in_dw);
- if (pool->bo) {
compute_memory_shadow(pool, pipe, 1);
- }
- pool->shadow = (uint32_t*)realloc(pool->shadow, new_size_in_dw*4);
- pool->size_in_dw = new_size_in_dw;
- if (pool->bo) {
+ pool->shadow = (uint32_t*)realloc(pool->shadow, new_size_in_dw*4);
+ pool->size_in_dw = new_size_in_dw;
pool->screen->screen.resource_destroy(
(struct pipe_screen *)pool->screen,
(struct pipe_resource *)pool->bo);
@@ -200,10 +219,6 @@ void compute_memory_grow_pool(struct compute_memory_pool* pool,
pool->screen,
pool->size_in_dw);
compute_memory_shadow(pool, pipe, 0);
- } else {
- pool->bo = (struct r600_resource*)create_pool_texture(
- pool->screen,
- pool->size_in_dw);
}
}