summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gallium/drivers/r600/compute_memory_pool.c25
-rw-r--r--src/gallium/drivers/r600/compute_memory_pool.h3
2 files changed, 28 insertions, 0 deletions
diff --git a/src/gallium/drivers/r600/compute_memory_pool.c b/src/gallium/drivers/r600/compute_memory_pool.c
index 0b413180851..00b28bc3249 100644
--- a/src/gallium/drivers/r600/compute_memory_pool.c
+++ b/src/gallium/drivers/r600/compute_memory_pool.c
@@ -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,
diff --git a/src/gallium/drivers/r600/compute_memory_pool.h b/src/gallium/drivers/r600/compute_memory_pool.h
index 73320100dbd..5d187778d63 100644
--- a/src/gallium/drivers/r600/compute_memory_pool.h
+++ b/src/gallium/drivers/r600/compute_memory_pool.h
@@ -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);