Mesa (master): r300g: remove the redundant reference counter in radeon_bo

Marek Olšák mareko at kemper.freedesktop.org
Sun Apr 3 10:36:03 PDT 2011


Module: Mesa
Branch: master
Commit: c35572352e3e92683988ee8d151b47f4190d62f9
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=c35572352e3e92683988ee8d151b47f4190d62f9

Author: Marek Olšák <maraeo at gmail.com>
Date:   Sun Apr  3 17:32:47 2011 +0200

r300g: remove the redundant reference counter in radeon_bo

We already have pb_buffer::reference::count.

---

 src/gallium/winsys/radeon/drm/radeon_drm_bo.c |   41 ++++++++++---------------
 src/gallium/winsys/radeon/drm/radeon_drm_bo.h |   10 ++----
 src/gallium/winsys/radeon/drm/radeon_drm_cs.c |    6 +--
 3 files changed, 21 insertions(+), 36 deletions(-)

diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_bo.c b/src/gallium/winsys/radeon/drm/radeon_drm_bo.c
index 9eb8334..eb7225b 100644
--- a/src/gallium/winsys/radeon/drm/radeon_drm_bo.c
+++ b/src/gallium/winsys/radeon/drm/radeon_drm_bo.c
@@ -87,29 +87,7 @@ static struct radeon_bo *get_radeon_bo(struct pb_buffer *_buf)
     return bo;
 }
 
-void radeon_bo_unref(struct radeon_bo *bo)
-{
-    struct drm_gem_close args = {};
-
-    if (!p_atomic_dec_zero(&bo->ref_count))
-        return;
-
-    if (bo->name) {
-        pipe_mutex_lock(bo->mgr->bo_handles_mutex);
-        util_hash_table_remove(bo->mgr->bo_handles,
-			       (void*)(uintptr_t)bo->name);
-        pipe_mutex_unlock(bo->mgr->bo_handles_mutex);
-    }
 
-    if (bo->ptr)
-        munmap(bo->ptr, bo->size);
-
-    /* Close object. */
-    args.handle = bo->handle;
-    drmIoctl(bo->rws->fd, DRM_IOCTL_GEM_CLOSE, &args);
-    pipe_mutex_destroy(bo->map_mutex);
-    FREE(bo);
-}
 
 static void radeon_bo_wait(struct r300_winsys_bo *_buf)
 {
@@ -142,8 +120,23 @@ static boolean radeon_bo_is_busy(struct r300_winsys_bo *_buf)
 static void radeon_bo_destroy(struct pb_buffer *_buf)
 {
     struct radeon_bo *bo = radeon_bo(_buf);
+    struct drm_gem_close args = {};
+
+    if (bo->name) {
+        pipe_mutex_lock(bo->mgr->bo_handles_mutex);
+        util_hash_table_remove(bo->mgr->bo_handles,
+			       (void*)(uintptr_t)bo->name);
+        pipe_mutex_unlock(bo->mgr->bo_handles_mutex);
+    }
 
-    radeon_bo_unref(bo);
+    if (bo->ptr)
+        munmap(bo->ptr, bo->size);
+
+    /* Close object. */
+    args.handle = bo->handle;
+    drmIoctl(bo->rws->fd, DRM_IOCTL_GEM_CLOSE, &args);
+    pipe_mutex_destroy(bo->map_mutex);
+    FREE(bo);
 }
 
 static unsigned get_pb_usage_from_transfer_flags(enum pipe_transfer_usage usage)
@@ -300,7 +293,6 @@ static struct pb_buffer *radeon_bomgr_create_bo(struct pb_manager *_mgr,
     bo->size = size;
     pipe_mutex_init(bo->map_mutex);
 
-    radeon_bo_ref(bo);
     return &bo->base;
 }
 
@@ -531,7 +523,6 @@ static struct r300_winsys_bo *radeon_winsys_bo_from_handle(struct r300_winsys_sc
     bo->handle = open_arg.handle;
     bo->size = open_arg.size;
     bo->name = whandle->handle;
-    radeon_bo_ref(bo);
 
     /* Initialize it. */
     pipe_reference_init(&bo->base.base.reference, 1);
diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_bo.h b/src/gallium/winsys/radeon/drm/radeon_drm_bo.h
index a26866b..3f9a63f 100644
--- a/src/gallium/winsys/radeon/drm/radeon_drm_bo.h
+++ b/src/gallium/winsys/radeon/drm/radeon_drm_bo.h
@@ -54,8 +54,6 @@ struct radeon_bo {
     uint32_t handle;
     uint32_t name;
 
-    int ref_count;
-
     /* how many command streams is this bo referenced in? */
     int num_cs_references;
 
@@ -70,12 +68,10 @@ struct radeon_bo {
 struct pb_manager *radeon_bomgr_create(struct radeon_drm_winsys *rws);
 void radeon_bomgr_init_functions(struct radeon_drm_winsys *ws);
 
-void radeon_bo_unref(struct radeon_bo *buf);
-
-
-static INLINE void radeon_bo_ref(struct radeon_bo *bo)
+static INLINE
+void radeon_bo_reference(struct radeon_bo **dst, struct radeon_bo *src)
 {
-    p_atomic_inc(&bo->ref_count);
+    pb_reference((struct pb_buffer**)dst, (struct pb_buffer*)src);
 }
 
 static INLINE struct pb_buffer *
diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_cs.c b/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
index 951791a..4adf4ad 100644
--- a/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
+++ b/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
@@ -111,8 +111,7 @@ static void radeon_cs_context_cleanup(struct radeon_cs_context *csc)
 
     for (i = 0; i < csc->crelocs; i++) {
         p_atomic_dec(&csc->relocs_bo[i]->num_cs_references);
-        radeon_bo_unref(csc->relocs_bo[i]);
-        csc->relocs_bo[i] = NULL;
+        radeon_bo_reference(&csc->relocs_bo[i], NULL);
     }
 
     csc->crelocs = 0;
@@ -266,9 +265,8 @@ static void radeon_add_reloc(struct radeon_cs_context *csc,
     }
 
     /* Initialize the new relocation. */
-    radeon_bo_ref(bo);
     p_atomic_inc(&bo->num_cs_references);
-    csc->relocs_bo[csc->crelocs] = bo;
+    radeon_bo_reference(&csc->relocs_bo[csc->crelocs], bo);
     reloc = &csc->relocs[csc->crelocs];
     reloc->handle = bo->handle;
     reloc->read_domains = rd;



More information about the mesa-commit mailing list