r600g/compute: Add a function for defragmenting the pool

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>
This commit is contained in:
Bruno Jiménez 2014-07-16 23:12:44 +02:00 committed by Tom Stellard
parent 1f705b2bee
commit d8b6f0dacb
2 changed files with 28 additions and 0 deletions

View 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,

View 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);