Module: Mesa Branch: amdgpu Commit: 7935e9647da54af02f6ce75570d6c4b197795ada URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=7935e9647da54af02f6ce75570d6c4b197795ada
Author: Marek Olšák <marek.ol...@amd.com> Date: Wed May 6 18:19:14 2015 +0200 winsys/amdgpu: add reference counting for contexts Fences can outlive a context, so we need to postpone releasing the context handle until all its fences are destroyed. Reviewed-by: Alex Deucher <alexander.deuc...@amd.com> --- src/gallium/winsys/amdgpu/drm/amdgpu_cs.c | 7 +++---- src/gallium/winsys/amdgpu/drm/amdgpu_cs.h | 13 ++++++++++++- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c index da8085c..7064474 100644 --- a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c @@ -48,6 +48,7 @@ amdgpu_fence_create(struct amdgpu_ctx *ctx, unsigned ip, uint32_t instance) fence->ip_type = ip; fence->ring = instance; fence->submission_in_progress = true; + p_atomic_inc(&ctx->refcount); return (struct pipe_fence_handle *)fence; } @@ -130,6 +131,7 @@ static struct radeon_winsys_ctx *amdgpu_ctx_create(struct radeon_winsys *ws) int r; ctx->ws = amdgpu_winsys(ws); + ctx->refcount = 1; r = amdgpu_cs_ctx_create(ctx->ws->dev, &ctx->ctx); if (r) { @@ -143,10 +145,7 @@ static struct radeon_winsys_ctx *amdgpu_ctx_create(struct radeon_winsys *ws) static void amdgpu_ctx_destroy(struct radeon_winsys_ctx *rwctx) { - struct amdgpu_ctx *ctx = (struct amdgpu_ctx*)rwctx; - - amdgpu_cs_ctx_free(ctx->ctx); - FREE(ctx); + amdgpu_ctx_unref((struct amdgpu_ctx*)rwctx); } static enum pipe_reset_status diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.h b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.h index 5234967..781ad19 100644 --- a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.h +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.h @@ -38,6 +38,7 @@ struct amdgpu_ctx { struct amdgpu_winsys *ws; amdgpu_context_handle ctx; + int refcount; }; struct amdgpu_cs_buffer { @@ -101,14 +102,24 @@ struct amdgpu_fence { bool signalled; }; +static INLINE void amdgpu_ctx_unref(struct amdgpu_ctx *ctx) +{ + if (p_atomic_dec_zero(&ctx->refcount)) { + amdgpu_cs_ctx_free(ctx->ctx); + FREE(ctx); + } +} + static INLINE void amdgpu_fence_reference(struct pipe_fence_handle **dst, struct pipe_fence_handle *src) { struct amdgpu_fence **rdst = (struct amdgpu_fence **)dst; struct amdgpu_fence *rsrc = (struct amdgpu_fence *)src; - if (pipe_reference(&(*rdst)->reference, &rsrc->reference)) + if (pipe_reference(&(*rdst)->reference, &rsrc->reference)) { + amdgpu_ctx_unref((*rdst)->ctx); FREE(*rdst); + } *rdst = rsrc; } _______________________________________________ mesa-commit mailing list mesa-commit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-commit