r600g/compute: Add a function for defragmenting the pool
authorBruno Jiménez <brunojimen@gmail.com>
Wed, 16 Jul 2014 21:12:44 +0000 (23:12 +0200)
committerTom Stellard <thomas.stellard@amd.com>
Wed, 23 Jul 2014 14:29:17 +0000 (10:29 -0400)
This new function will move items forward in the pool, so that
there's no gap between them, effectively defragmenting the pool.

For now this function is a bit dumb as it just moves items
forward without trying to see if other items in the pool could
fit in the gaps.

Reviewed-by: Tom Stellard <thomas.stellard@amd.com>
src/gallium/drivers/r600/compute_memory_pool.c
src/gallium/drivers/r600/compute_memory_pool.h

index 0b4131808514f300ad2b09f0037f09d6837258e4..00b28bc3249729ea950db7a7fa055c43dfc0291d 100644 (file)
@@ -302,6 +302,30 @@ int compute_memory_finalize_pending(struct compute_memory_pool* pool,
        return 0;
 }
 
+/**
+ * Defragments the pool, so that there's no gap between items.
+ * \param pool The pool to be defragmented
+ */
+void compute_memory_defrag(struct compute_memory_pool *pool,
+       struct pipe_context *pipe)
+{
+       struct compute_memory_item *item;
+       int64_t last_pos;
+
+       COMPUTE_DBG(pool->screen, "* compute_memory_defrag()\n");
+
+       last_pos = 0;
+       LIST_FOR_EACH_ENTRY(item, pool->item_list, link) {
+               if (item->start_in_dw != last_pos) {
+                       assert(last_pos < item->start_in_dw);
+
+                       compute_memory_move_item(pool, item, last_pos, pipe);
+               }
+
+               last_pos += align(item->size_in_dw, ITEM_ALIGNMENT);
+       }
+}
+
 int compute_memory_promote_item(struct compute_memory_pool *pool,
                struct compute_memory_item *item, struct pipe_context *pipe,
                int64_t allocated)
@@ -417,6 +441,7 @@ void compute_memory_demote_item(struct compute_memory_pool *pool,
  *
  * \param item                 The item that will be moved
  * \param new_start_in_dw      The new position of the item in \a item_list
+ * \see compute_memory_defrag
  */
 void compute_memory_move_item(struct compute_memory_pool *pool,
        struct compute_memory_item *item, uint64_t new_start_in_dw,
index 73320100dbd1613d8c6bb810d4b1c5828ad70f21..5d187778d63dec4587556b2f5ccd15bb145d89db 100644 (file)
@@ -86,6 +86,9 @@ void compute_memory_shadow(struct compute_memory_pool* pool,
 int compute_memory_finalize_pending(struct compute_memory_pool* pool,
        struct pipe_context * pipe);
 
+void compute_memory_defrag(struct compute_memory_pool *pool,
+       struct pipe_context *pipe);
+
 int compute_memory_promote_item(struct compute_memory_pool *pool,
                struct compute_memory_item *item, struct pipe_context *pipe,
                int64_t allocated);