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