[Mesa-dev] [PATCH 4/9] r600g/compute: only move to the pool the buffers marked for promoting
Tom Stellard
tom at stellard.net
Mon Jun 16 07:54:20 PDT 2014
On Fri, Jun 13, 2014 at 10:35:33PM +0200, Bruno Jiménez wrote:
Reviewed-by: Tom Stellard <thomas.stellard at amd.com>
> ---
> src/gallium/drivers/r600/compute_memory_pool.c | 140 +++++++++++++++----------
> src/gallium/drivers/r600/compute_memory_pool.h | 5 +
> 2 files changed, 87 insertions(+), 58 deletions(-)
>
> diff --git a/src/gallium/drivers/r600/compute_memory_pool.c b/src/gallium/drivers/r600/compute_memory_pool.c
> index 5a5ef12..1da4609 100644
> --- a/src/gallium/drivers/r600/compute_memory_pool.c
> +++ b/src/gallium/drivers/r600/compute_memory_pool.c
> @@ -229,8 +229,6 @@ int compute_memory_finalize_pending(struct compute_memory_pool* pool,
> int64_t allocated = 0;
> int64_t unallocated = 0;
>
> - int64_t start_in_dw = 0;
> -
> int err = 0;
>
> COMPUTE_DBG(pool->screen, "* compute_memory_finalize_pending()\n");
> @@ -247,10 +245,12 @@ int compute_memory_finalize_pending(struct compute_memory_pool* pool,
> allocated += align(item->size_in_dw, ITEM_ALIGNMENT);
> }
>
> - /* Calculate the total unallocated size */
> + /* Calculate the total unallocated size of the items that
> + * will be promoted to the pool */
> for (item = pool->unallocated_list; item; item = next) {
> next = item->next;
> - unallocated += align(item->size_in_dw, ITEM_ALIGNMENT);
> + if (item->status & ITEM_FOR_PROMOTING)
> + unallocated += align(item->size_in_dw, ITEM_ALIGNMENT);
> }
>
> /* If we require more space than the size of the pool, then grow the
> @@ -276,83 +276,107 @@ int compute_memory_finalize_pending(struct compute_memory_pool* pool,
> return -1;
> }
>
> - /* Loop through all the unallocated items, allocate space for them
> - * and add them to the item_list. */
> + /* Loop through all the unallocated items, check if they are marked
> + * for promoting, allocate space for them and add them to the item_list. */
> for (item = pool->unallocated_list; item; item = next) {
> next = item->next;
>
> - /* Search for free space in the pool for this item. */
> - while ((start_in_dw=compute_memory_prealloc_chunk(pool,
> - item->size_in_dw)) == -1) {
> - int64_t need = item->size_in_dw+2048 -
> - (pool->size_in_dw - allocated);
> -
> - if (need < 0) {
> - need = pool->size_in_dw / 10;
> - }
> + if (item->status & ITEM_FOR_PROMOTING) {
> + err = compute_memory_promote_item(pool, item, pipe, allocated);
> + item->status ^= ITEM_FOR_PROMOTING;
>
> - need = align(need, ITEM_ALIGNMENT);
> -
> - err = compute_memory_grow_pool(pool,
> - pipe,
> - pool->size_in_dw + need);
> + allocated += align(item->size_in_dw, ITEM_ALIGNMENT);
>
> if (err == -1)
> return -1;
> }
> - COMPUTE_DBG(pool->screen, " + Found space for Item %p id = %u "
> + }
> +
> + return 0;
> +}
> +
> +int compute_memory_promote_item(struct compute_memory_pool *pool,
> + struct compute_memory_item *item, struct pipe_context *pipe,
> + int64_t allocated)
> +{
> + int64_t start_in_dw;
> + int err = 0;
> +
> + /* Search for free space in the pool for this item. */
> + while ((start_in_dw=compute_memory_prealloc_chunk(pool,
> + item->size_in_dw)) == -1) {
> + int64_t need = item->size_in_dw + 2048 -
> + (pool->size_in_dw - allocated);
> +
> + if (need < 0) {
> + need = pool->size_in_dw / 10;
> + }
> +
> + need = align(need, ITEM_ALIGNMENT);
> +
> + err = compute_memory_grow_pool(pool,
> + pipe,
> + pool->size_in_dw + need);
> +
> + if (err == -1)
> + return -1;
> + }
> + COMPUTE_DBG(pool->screen, " + Found space for Item %p id = %u "
> "start_in_dw = %u (%u bytes) size_in_dw = %u (%u bytes)\n",
> item, item->id, start_in_dw, start_in_dw * 4,
> item->size_in_dw, item->size_in_dw * 4);
>
> - item->start_in_dw = start_in_dw;
> - item->next = NULL;
> - item->prev = NULL;
> -
> - if (pool->item_list) {
> - struct compute_memory_item *pos;
> -
> - pos = compute_memory_postalloc_chunk(pool, start_in_dw);
> - if (pos) {
> - item->prev = pos;
> - item->next = pos->next;
> - pos->next = item;
> - if (item->next) {
> - item->next->prev = item;
> - }
> - } else {
> - /* Add item to the front of the list */
> - item->next = pool->item_list;
> - item->prev = pool->item_list->prev;
> - pool->item_list->prev = item;
> - pool->item_list = item;
> + /* Remove the item from the unallocated list */
> + if (item->prev == NULL)
> + pool->unallocated_list = item->next;
> + else
> + item->prev->next = item->next;
> +
> + if (item->next != NULL)
> + item->next->prev = item->prev;
> +
> + item->start_in_dw = start_in_dw;
> + item->next = NULL;
> + item->prev = NULL;
> +
> + if (pool->item_list) {
> + struct compute_memory_item *pos;
> +
> + pos = compute_memory_postalloc_chunk(pool, start_in_dw);
> + if (pos) {
> + item->prev = pos;
> + item->next = pos->next;
> + pos->next = item;
> + if (item->next) {
> + item->next->prev = item;
> }
> - }
> - else {
> + } else {
> + /* Add item to the front of the list */
> + item->next = pool->item_list;
> + item->prev = pool->item_list->prev;
> + pool->item_list->prev = item;
> pool->item_list = item;
> }
> + }
> + else {
> + pool->item_list = item;
> + }
>
> - ((struct r600_context *)pipe)->b.b.resource_copy_region(pipe,
> - (struct pipe_resource *)pool->bo,
> - 0, item->start_in_dw * 4, 0 ,0,
> - (struct pipe_resource *)item->real_buffer,
> - 0, &(struct pipe_box) {.width = item->size_in_dw * 4,
> - .height = 1, .depth = 1});
> + ((struct r600_context *)pipe)->b.b.resource_copy_region(pipe,
> + (struct pipe_resource *)pool->bo,
> + 0, item->start_in_dw * 4, 0 ,0,
> + (struct pipe_resource *)item->real_buffer,
> + 0, &(struct pipe_box) {.width = item->size_in_dw * 4,
> + .height = 1, .depth = 1});
>
> - pool->screen->b.b.resource_destroy(
> + pool->screen->b.b.resource_destroy(
> (struct pipe_screen *)pool->screen,
> (struct pipe_resource *)item->real_buffer);
> - item->real_buffer = NULL;
> -
> - allocated += item->size_in_dw;
> - }
> -
> - pool->unallocated_list = NULL;
> + item->real_buffer = NULL;
>
> return 0;
> }
>
> -
> void compute_memory_free(struct compute_memory_pool* pool, int64_t id)
> {
> struct compute_memory_item *item, *next;
> diff --git a/src/gallium/drivers/r600/compute_memory_pool.h b/src/gallium/drivers/r600/compute_memory_pool.h
> index 2cb9985..6a45fb2 100644
> --- a/src/gallium/drivers/r600/compute_memory_pool.h
> +++ b/src/gallium/drivers/r600/compute_memory_pool.h
> @@ -80,6 +80,11 @@ void compute_memory_shadow(struct compute_memory_pool* pool,
>
> int compute_memory_finalize_pending(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);
> +
> void compute_memory_free(struct compute_memory_pool* pool, int64_t id);
> struct compute_memory_item* compute_memory_alloc(struct compute_memory_pool* pool, int64_t size_in_dw); ///Creates pending allocations
>
> --
> 2.0.0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list