[PATCH 35/71] drm: consolidated bo_pool into drm_device

"Enrico Weigelt, metux IT consult" <[email protected]>
Newsgroups gmane.comp.lib.cairo
Message-ID <[email protected]>
All driver-specific devices have their own bo_pool, which only needs
to be initialized differently (size of the driver-specific bo struct),
so consolidate it into cairo_drm_device_t.

Signed-off-by: Enrico Weigelt, metux IT consult <[email protected]>
---
 src/drm/cairo-drm-bo.c             |  1 +
 src/drm/cairo-drm-intel-private.h  |  1 -
 src/drm/cairo-drm-intel.c          | 12 +++++-------
 src/drm/cairo-drm-private.h        | 15 +++++++++++++++
 src/drm/cairo-drm-radeon-private.h |  1 -
 src/drm/cairo-drm-radeon-surface.c |  2 +-
 src/drm/cairo-drm-radeon.c         | 35 ++++++-----------------------------
 src/drm/cairo-drm.c                |  4 +++-
 8 files changed, 31 insertions(+), 40 deletions(-)

diff --git a/src/drm/cairo-drm-bo.c b/src/drm/cairo-drm-bo.c
index 6b946ac62..532700e51 100644
--- a/src/drm/cairo-drm-bo.c
+++ b/src/drm/cairo-drm-bo.c
@@ -61,6 +61,7 @@ _cairo_drm_bo_open_for_name (const cairo_drm_device_t *dev,
     bo->name = name;
     bo->size = open.size;
     bo->handle = open.handle;
+    bo->mapped = NULL;
 
     return CAIRO_STATUS_SUCCESS;
 }
diff --git a/src/drm/cairo-drm-intel-private.h b/src/drm/cairo-drm-intel-private.h
index 43550eeca..3e5373327 100644
--- a/src/drm/cairo-drm-intel-private.h
+++ b/src/drm/cairo-drm-intel-private.h
@@ -203,7 +203,6 @@ typedef struct _intel_device {
     size_t gtt_max_size;
     size_t gtt_avail_size;
 
-    cairo_freepool_t bo_pool;
     cairo_list_t bo_in_flight;
 
     cairo_mutex_t mutex;
diff --git a/src/drm/cairo-drm-intel.c b/src/drm/cairo-drm-intel.c
index 9e8219f8a..86876e667 100644
--- a/src/drm/cairo-drm-intel.c
+++ b/src/drm/cairo-drm-intel.c
@@ -380,7 +380,7 @@ intel_bo_create (intel_device_t *device,
     }
 
     /* no cached buffer available, allocate fresh */
-    bo = _cairo_freepool_alloc (&device->bo_pool);
+    bo = _cairo_drm_bo_cast_intel (_cairo_drm_bo_from_pool (&device->base));
     if (unlikely (bo == NULL)) {
 	_cairo_error_throw (CAIRO_STATUS_NO_MEMORY);
 	return bo;
@@ -412,7 +412,7 @@ intel_bo_create (intel_device_t *device,
     ret = ioctl (device->base.fd, DRM_IOCTL_I915_GEM_CREATE, &create);
     if (unlikely (ret != 0)) {
 	_cairo_error_throw (CAIRO_STATUS_NO_MEMORY);
-	_cairo_freepool_free (&device->bo_pool, bo);
+	_cairo_freepool_free (&device->base.bo_pool, bo);
 	return NULL;
     }
 
@@ -435,7 +435,7 @@ intel_bo_create_for_name (intel_device_t *device, uint32_t name)
     intel_bo_t *bo;
     int ret;
 
-    bo = _cairo_freepool_alloc (&device->bo_pool);
+    bo = _cairo_drm_bo_cast_intel (_cairo_drm_bo_from_pool (&device->base));
     if (unlikely (bo == NULL)) {
 	_cairo_error_throw (CAIRO_STATUS_NO_MEMORY);
 	return NULL;
@@ -450,7 +450,6 @@ intel_bo_create_for_name (intel_device_t *device, uint32_t name)
 
     bo->full_size = bo->base.size;
     bo->offset = 0;
-    bo->base.mapped = NULL;
     bo->purgeable = 0;
     bo->busy = TRUE;
     bo->cpu = FALSE;
@@ -479,7 +478,7 @@ intel_bo_create_for_name (intel_device_t *device, uint32_t name)
     return bo;
 
 FAIL:
-    _cairo_freepool_free (&device->bo_pool, bo);
+    _cairo_freepool_free (&device->base.bo_pool, bo);
     return NULL;
 }
 
@@ -495,7 +494,7 @@ intel_bo_release (cairo_drm_device_t *_dev, cairo_drm_bo_t *_bo)
     assert (cairo_list_is_empty (&bo->cache_list));
 
     _cairo_drm_bo_close (_dev, _bo);
-    _cairo_freepool_free (&device->bo_pool, bo);
+    _cairo_freepool_free (&device->base.bo_pool, bo);
 }
 
 void
@@ -767,7 +766,6 @@ intel_device_fini (intel_device_t *device)
     _cairo_cache_fini (&device->snapshot_cache);
 
     _intel_gradient_cache_fini (device);
-    _cairo_freepool_fini (&device->bo_pool);
 
     _cairo_drm_device_fini (&device->base);
 }
diff --git a/src/drm/cairo-drm-private.h b/src/drm/cairo-drm-private.h
index 299ed3630..800d1598c 100644
--- a/src/drm/cairo-drm-private.h
+++ b/src/drm/cairo-drm-private.h
@@ -45,6 +45,8 @@
 #include "cairo-device-private.h"
 #include "cairo-reference-count-private.h"
 #include "cairo-surface-private.h"
+#include "cairo-freelist-type-private.h"
+#include "cairo-freelist-private.h"
 
 typedef struct _cairo_drm_device cairo_drm_device_t;
 typedef struct _cairo_drm_bo cairo_drm_bo_t;
@@ -128,6 +130,7 @@ struct _cairo_drm_device {
     cairo_drm_bo_backend_t bo;
     cairo_drm_surface_backend_t surface;
     cairo_drm_device_backend_t device;
+    cairo_freepool_t bo_pool;
 
     cairo_drm_device_t *next, *prev;
 };
@@ -200,6 +203,18 @@ _cairo_drm_surface_get_device (cairo_drm_surface_t *surface)
     return _cairo_device_cast_drm(surface->base.device);
 }
 
+static inline cairo_always_inline cairo_drm_bo_t *
+_cairo_drm_bo_from_pool (cairo_drm_device_t *device)
+{
+    cairo_drm_bo_t *bo = _cairo_freepool_alloc (&device->bo_pool);
+
+    if (unlikely(bo == NULL))
+	return NULL;
+    bo->mapped = NULL;
+
+    return bo;
+}
+
 static cairo_always_inline void
 cairo_drm_bo_destroy (cairo_device_t *abstract_device,
 		      cairo_drm_bo_t *bo)
diff --git a/src/drm/cairo-drm-radeon-private.h b/src/drm/cairo-drm-radeon-private.h
index 3567562de..561518c8b 100644
--- a/src/drm/cairo-drm-radeon-private.h
+++ b/src/drm/cairo-drm-radeon-private.h
@@ -45,7 +45,6 @@ typedef struct _radeon_bo {
 
 typedef struct _radeon_device {
     cairo_drm_device_t base;
-    cairo_freepool_t bo_pool;
 
     uint64_t vram_limit;
     uint64_t gart_limit;
diff --git a/src/drm/cairo-drm-radeon-surface.c b/src/drm/cairo-drm-radeon-surface.c
index 7de342f08..0a1f27cba 100644
--- a/src/drm/cairo-drm-radeon-surface.c
+++ b/src/drm/cairo-drm-radeon-surface.c
@@ -379,7 +379,7 @@ radeon_device_destroy (void *data)
 {
     radeon_device_t *device = _cairo_device_cast_radeon (data);
 
-    radeon_device_fini (device);
+    _cairo_drm_device_fini (&device->base);
 
     free (data);
 }
diff --git a/src/drm/cairo-drm-radeon.c b/src/drm/cairo-drm-radeon.c
index bf92270ed..409c75e58 100644
--- a/src/drm/cairo-drm-radeon.c
+++ b/src/drm/cairo-drm-radeon.c
@@ -185,7 +185,7 @@ radeon_bo_create (radeon_device_t *device,
     radeon_bo_t *bo;
     int ret;
 
-    bo = _cairo_freepool_alloc (&device->bo_pool);
+    bo = _cairo_drm_bo_cast_radeon (_cairo_drm_bo_from_pool (&device->base));
     if (unlikely (bo == NULL))
 	return NULL;
 
@@ -199,15 +199,13 @@ radeon_bo_create (radeon_device_t *device,
 	ret = ioctl (device->base.fd, DRM_IOCTL_RADEON_GEM_CREATE, &create);
     } while (ret == -1 && errno == EINTR);
     if (ret == -1) {
-	_cairo_freepool_free (&device->bo_pool, bo);
+	_cairo_freepool_free (&device->base.bo_pool, bo);
 	return NULL;
     }
 
     bo->base.handle = create.handle;
     bo->base.size = size;
 
-    bo->base.mapped = NULL;
-
     bo->in_batch = FALSE;
     bo->read_domains = 0;
     bo->write_domain = 0;
@@ -223,18 +221,16 @@ radeon_bo_create_for_name (radeon_device_t *device,
     radeon_bo_t *bo;
     cairo_status_t status;
 
-    bo = _cairo_freepool_alloc (&device->bo_pool);
+    bo = _cairo_drm_bo_cast_radeon (_cairo_drm_bo_from_pool (&device->base));
     if (unlikely (bo == NULL))
 	return NULL;
 
     status = _cairo_drm_bo_open_for_name (&device->base, &bo->base, name);
     if (unlikely (status)) {
-	_cairo_freepool_free (&device->bo_pool, bo);
+	_cairo_freepool_free (&device->base.bo_pool, bo);
 	return NULL;
     }
 
-    bo->base.mapped = NULL;
-
     bo->in_batch = FALSE;
     bo->read_domains = 0;
     bo->write_domain = 0;
@@ -250,7 +246,7 @@ radeon_bo_release (cairo_drm_device_t *_dev, cairo_drm_bo_t *_bo)
     radeon_bo_t *bo = _cairo_drm_bo_cast_radeon(_bo);
 
     _cairo_drm_bo_close (&device->base, &bo->base);
-    _cairo_freepool_free (&device->bo_pool, bo);
+    _cairo_freepool_free (&device->base.bo_pool, bo);
 }
 
 cairo_surface_t *
@@ -292,31 +288,12 @@ radeon_bo_get_image (const radeon_device_t *device,
     return &image->base;
 }
 
-static void
-_radeon_device_init_bo_cache (radeon_device_t *device)
-{
-    _cairo_freepool_init (&device->bo_pool, sizeof (radeon_bo_t));
-}
-
 cairo_status_t
 radeon_device_init (radeon_device_t *device, int fd)
 {
-    _radeon_device_init_bo_cache (device);
+    _cairo_freepool_init (&device->base.bo_pool, sizeof (radeon_bo_t));
 
     device->base.bo.release = radeon_bo_release;
 
     return CAIRO_STATUS_SUCCESS;
 }
-
-static void
-_radeon_bo_cache_fini (radeon_device_t *device)
-{
-    _cairo_freepool_fini (&device->bo_pool);
-}
-
-void
-radeon_device_fini (radeon_device_t *device)
-{
-    _radeon_bo_cache_fini (device);
-    _cairo_drm_device_fini (&device->base);
-}
diff --git a/src/drm/cairo-drm.c b/src/drm/cairo-drm.c
index 5e8d40748..d4c107925 100644
--- a/src/drm/cairo-drm.c
+++ b/src/drm/cairo-drm.c
@@ -33,7 +33,7 @@
 #include "cairoint.h"
 
 #include "cairo-drm-private.h"
-
+#include "cairo-freelist-private.h"
 #include "cairo-device-private.h"
 #include "cairo-error-private.h"
 
@@ -368,6 +368,8 @@ _cairo_drm_device_fini (cairo_drm_device_t *device)
 {
     if (device->fd != -1)
 	close (device->fd);
+
+    _cairo_freepool_fini (&device->bo_pool);
 }
 
 void
-- 
2.11.0.rc0.7.gbe5a750

-- 
cairo mailing list
[email protected]
https://lists.cairographics.org/mailman/listinfo/cairo
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.