From f3521ce2c440bd50020a3ff81e6d9fa17c01009c Mon Sep 17 00:00:00 2001 From: Jan Vesely Date: Thu, 3 May 2018 19:26:29 -0400 Subject: [PATCH] eg/compute: Use reference counting to handle compute memory pool. Use pipe_reference to release old RAT surfaces. RAT surface adds a reference to pool bo, so use reference counting for pool->bo as well. v2: Use the same pattern for both defrag paths Drop confusing comment CC: Signed-off-by: Jan Vesely Reviewed-by: Dave Airlie --- src/gallium/drivers/r600/compute_memory_pool.c | 16 +++++----------- src/gallium/drivers/r600/evergreen_compute.c | 3 ++- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/src/gallium/drivers/r600/compute_memory_pool.c b/src/gallium/drivers/r600/compute_memory_pool.c index bcda155..4b0e004 100644 --- a/src/gallium/drivers/r600/compute_memory_pool.c +++ b/src/gallium/drivers/r600/compute_memory_pool.c @@ -91,10 +91,7 @@ void compute_memory_pool_delete(struct compute_memory_pool* pool) { COMPUTE_DBG(pool->screen, "* compute_memory_pool_delete()\n"); free(pool->shadow); - if (pool->bo) { - pool->screen->b.b.resource_destroy((struct pipe_screen *) - pool->screen, (struct pipe_resource *)pool->bo); - } + pipe_resource_reference(&pool->bo, NULL); /* In theory, all of the items were freed in compute_memory_free. * Just delete the list heads */ @@ -213,10 +210,8 @@ int compute_memory_grow_defrag_pool(struct compute_memory_pool *pool, compute_memory_defrag(pool, src, dst, pipe); - pool->screen->b.b.resource_destroy( - (struct pipe_screen *)pool->screen, - src); - + /* Release the old buffer */ + pipe_resource_reference(&pool->bo, NULL); pool->bo = temp; pool->size_in_dw = new_size_in_dw; } @@ -230,9 +225,8 @@ int compute_memory_grow_defrag_pool(struct compute_memory_pool *pool, 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); + /* Release the old buffer */ + pipe_resource_reference(&pool->bo, NULL); pool->bo = r600_compute_buffer_alloc_vram(pool->screen, pool->size_in_dw * 4); compute_memory_shadow(pool, pipe, 0); diff --git a/src/gallium/drivers/r600/evergreen_compute.c b/src/gallium/drivers/r600/evergreen_compute.c index bd3d893..8c81870 100644 --- a/src/gallium/drivers/r600/evergreen_compute.c +++ b/src/gallium/drivers/r600/evergreen_compute.c @@ -122,7 +122,8 @@ static void evergreen_set_rat(struct r600_pipe_compute *pipe, rat_templ.u.tex.first_layer = 0; rat_templ.u.tex.last_layer = 0; - /* Add the RAT the list of color buffers */ + /* Add the RAT the list of color buffers. Drop the old buffer first. */ + pipe_surface_reference(&pipe->ctx->framebuffer.state.cbufs[id], NULL); pipe->ctx->framebuffer.state.cbufs[id] = pipe->ctx->b.b.create_surface( (struct pipe_context *)pipe->ctx, (struct pipe_resource *)bo, &rat_templ); -- 2.7.4