Now, before moving everything to host memory, we try to create a
new resource to use as a pool. I we succeed we just use this resource
and delete the previous one. If we fail we fallback to using the
shadow.

This should make growing the pool faster, and we can also save
64KB of memory that were allocated for the 'shadow', even if they
weren't used.
---
 src/gallium/drivers/r600/compute_memory_pool.c | 61 ++++++++++++++++++--------
 1 file changed, 43 insertions(+), 18 deletions(-)

diff --git a/src/gallium/drivers/r600/compute_memory_pool.c 
b/src/gallium/drivers/r600/compute_memory_pool.c
index fe19d9e..db6d937 100644
--- a/src/gallium/drivers/r600/compute_memory_pool.c
+++ b/src/gallium/drivers/r600/compute_memory_pool.c
@@ -73,10 +73,6 @@ static void compute_memory_pool_init(struct 
compute_memory_pool * pool,
        COMPUTE_DBG(pool->screen, "* compute_memory_pool_init() 
initial_size_in_dw = %ld\n",
                initial_size_in_dw);
 
-       pool->shadow = (uint32_t*)CALLOC(initial_size_in_dw, 4);
-       if (pool->shadow == NULL)
-               return;
-
        pool->size_in_dw = initial_size_in_dw;
        pool->bo = (struct 
r600_resource*)r600_compute_buffer_alloc_vram(pool->screen,
                                                        pool->size_in_dw * 4);
@@ -184,27 +180,56 @@ int compute_memory_grow_pool(struct compute_memory_pool* 
pool,
 
        if (!pool->bo) {
                compute_memory_pool_init(pool, MAX2(new_size_in_dw, 1024 * 16));
-               if (pool->shadow == NULL)
-                       return -1;
        } 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);
 
-               compute_memory_shadow(pool, pipe, 1);
-               pool->shadow = realloc(pool->shadow, new_size_in_dw*4);
-               if (pool->shadow == NULL)
-                       return -1;
+               temp = (struct r600_resource *)r600_compute_buffer_alloc_vram(
+                                                       pool->screen, 
new_size_in_dw * 4);
 
-               pool->size_in_dw = new_size_in_dw;
-               pool->screen->b.b.resource_destroy(
-                       (struct pipe_screen *)pool->screen,
-                       (struct pipe_resource *)pool->bo);
-               pool->bo = (struct 
r600_resource*)r600_compute_buffer_alloc_vram(
-                                                       pool->screen,
-                                                       pool->size_in_dw * 4);
-               compute_memory_shadow(pool, pipe, 0);
+               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");
+
+                       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);
+
+                       pool->screen->b.b.resource_destroy(
+                                       (struct pipe_screen *)pool->screen,
+                                       src);
+
+                       pool->bo = temp;
+                       pool->size_in_dw = new_size_in_dw;
+               }
+               else {
+                       COMPUTE_DBG(pool->screen, "  The creation of the 
temporary resource failed\n"
+                               "  Falling back to using 'shadow'\n");
+
+                       compute_memory_shadow(pool, pipe, 1);
+                       pool->shadow = realloc(pool->shadow, new_size_in_dw * 
4);
+                       if (pool->shadow == NULL)
+                               return -1;
+
+                       pool->size_in_dw = new_size_in_dw;
+                       pool->screen->b.b.resource_destroy(
+                                       (struct pipe_screen *)pool->screen,
+                                       (struct pipe_resource *)pool->bo);
+                       pool->bo = (struct 
r600_resource*)r600_compute_buffer_alloc_vram(
+                                       pool->screen,
+                                       pool->size_in_dw * 4);
+                       compute_memory_shadow(pool, pipe, 0);
+               }
        }
 
        return 0;
-- 
2.0.1

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to