Mesa (amdgpu): winsys/amdgpu: add reference counting for contexts

Marek Olšák mareko at kemper.freedesktop.org
Thu May 14 13:05:26 UTC 2015


Module: Mesa
Branch: amdgpu
Commit: 7935e9647da54af02f6ce75570d6c4b197795ada
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=7935e9647da54af02f6ce75570d6c4b197795ada

Author: Marek Olšák <marek.olsak at 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.deucher at 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;
 }
 




More information about the mesa-commit mailing list