summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Vesely <jan.vesely@rutgers.edu>2018-05-03 19:26:29 -0400
committerJuan A. Suarez Romero <jasuarez@igalia.com>2018-05-22 13:03:34 +0200
commit712456cb388403955b30fa544b6858d7a4aa8cce (patch)
tree7c5d81446d3ee5f207c5d99de3fbab0fd0c90007
parent0f7b29aa93004bcfc1e6461d0823bf1da941ccce (diff)
downloadmesa-712456cb388403955b30fa544b6858d7a4aa8cce.tar.gz
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: <mesa-stable@lists.freedesktop.org> Signed-off-by: Jan Vesely <jan.vesely@rutgers.edu> Reviewed-by: Dave Airlie <airlied@redhat.com> (cherry picked from commit f3521ce2c440bd50020a3ff81e6d9fa17c01009c)
-rw-r--r--src/gallium/drivers/r600/compute_memory_pool.c16
-rw-r--r--src/gallium/drivers/r600/evergreen_compute.c3
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 bcda155c71a..4b0e0044f51 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 8cbb54e39cc..10a1fd00691 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);