summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/gallium/drivers/r600/compute_memory_pool.c40
-rw-r--r--src/gallium/drivers/r600/compute_memory_pool.h2
2 files changed, 19 insertions, 23 deletions
diff --git a/src/gallium/drivers/r600/compute_memory_pool.c b/src/gallium/drivers/r600/compute_memory_pool.c
index dbf6682c68f..d53587ffa96 100644
--- a/src/gallium/drivers/r600/compute_memory_pool.c
+++ b/src/gallium/drivers/r600/compute_memory_pool.c
@@ -169,10 +169,12 @@ struct list_head *compute_memory_postalloc_chunk(
* Reallocates pool, conserves data.
* @returns -1 if it fails, 0 otherwise
*/
-int compute_memory_grow_pool(struct compute_memory_pool* pool,
- struct pipe_context * pipe, int new_size_in_dw)
+int compute_memory_grow_defrag_pool(struct compute_memory_pool *pool,
+ struct pipe_context *pipe, int new_size_in_dw)
{
- COMPUTE_DBG(pool->screen, "* compute_memory_grow_pool() "
+ new_size_in_dw = align(new_size_in_dw, ITEM_ALIGNMENT);
+
+ COMPUTE_DBG(pool->screen, "* compute_memory_grow_defrag_pool() "
"new_size_in_dw = %d (%d bytes)\n",
new_size_in_dw, new_size_in_dw * 4);
@@ -183,27 +185,17 @@ int compute_memory_grow_pool(struct compute_memory_pool* pool,
} else {
struct r600_resource *temp = NULL;
- new_size_in_dw = align(new_size_in_dw, ITEM_ALIGNMENT);
-
- COMPUTE_DBG(pool->screen, " Aligned size = %d (%d bytes)\n",
- new_size_in_dw, new_size_in_dw * 4);
-
temp = (struct r600_resource *)r600_compute_buffer_alloc_vram(
pool->screen, new_size_in_dw * 4);
if (temp != NULL) {
- struct r600_context *rctx = (struct r600_context *)pipe;
struct pipe_resource *src = (struct pipe_resource *)pool->bo;
struct pipe_resource *dst = (struct pipe_resource *)temp;
- struct pipe_box box;
- COMPUTE_DBG(pool->screen, " Growing the pool using a temporary resource\n");
+ COMPUTE_DBG(pool->screen, " Growing and defragmenting the pool "
+ "using a temporary resource\n");
- u_box_1d(0, pool->size_in_dw * 4, &box);
-
- rctx->b.b.resource_copy_region(pipe,
- dst, 0, 0, 0 ,0,
- src, 0, &box);
+ compute_memory_defrag(pool, src, dst, pipe);
pool->screen->b.b.resource_destroy(
(struct pipe_screen *)pool->screen,
@@ -229,6 +221,11 @@ int compute_memory_grow_pool(struct compute_memory_pool* pool,
pool->screen,
pool->size_in_dw * 4);
compute_memory_shadow(pool, pipe, 0);
+
+ if (pool->status & POOL_FRAGMENTED) {
+ struct pipe_resource *src = (struct pipe_resource *)pool->bo;
+ compute_memory_defrag(pool, src, src, pipe);
+ }
}
}
@@ -292,16 +289,15 @@ int compute_memory_finalize_pending(struct compute_memory_pool* pool,
return 0;
}
- if (pool->status & POOL_FRAGMENTED) {
- struct pipe_resource *src = (struct pipe_resource *)pool->bo;
- compute_memory_defrag(pool, src, src, pipe);
- }
-
if (pool->size_in_dw < allocated + unallocated) {
- err = compute_memory_grow_pool(pool, pipe, allocated + unallocated);
+ err = compute_memory_grow_defrag_pool(pool, pipe, allocated + unallocated);
if (err == -1)
return -1;
}
+ else if (pool->status & POOL_FRAGMENTED) {
+ struct pipe_resource *src = (struct pipe_resource *)pool->bo;
+ compute_memory_defrag(pool, src, src, pipe);
+ }
/* After defragmenting the pool, allocated is equal to the first available
* position for new items in the pool */
diff --git a/src/gallium/drivers/r600/compute_memory_pool.h b/src/gallium/drivers/r600/compute_memory_pool.h
index 5f1d72b0f25..c7eb2370fc2 100644
--- a/src/gallium/drivers/r600/compute_memory_pool.h
+++ b/src/gallium/drivers/r600/compute_memory_pool.h
@@ -81,7 +81,7 @@ int64_t compute_memory_prealloc_chunk(struct compute_memory_pool* pool, int64_t
struct list_head *compute_memory_postalloc_chunk(struct compute_memory_pool* pool, int64_t start_in_dw); ///search for the chunk where we can link our new chunk after it
-int compute_memory_grow_pool(struct compute_memory_pool* pool, struct pipe_context * pipe,
+int compute_memory_grow_defrag_pool(struct compute_memory_pool* pool, struct pipe_context * pipe,
int new_size_in_dw);
void compute_memory_shadow(struct compute_memory_pool* pool,