[PATCH v8 42/71] drm: generalized *_surface_acquire_source_image() functions

"Enrico Weigelt, metux IT consult" <[email protected]>
Newsgroups gmane.comp.lib.cairo
Message-ID <[email protected]>
The driver-specific drm backends have their individual implementation,
which is generalized by moving out the driver specific parts to
their own callbacks.

Signed-off-by: Enrico Weigelt, metux IT consult <[email protected]>
---
 src/drm/cairo-drm-i915-surface.c   |  2 +-
 src/drm/cairo-drm-i965-surface.c   |  2 +-
 src/drm/cairo-drm-intel-private.h  |  5 ---
 src/drm/cairo-drm-intel-surface.c  | 57 +---------------------------------
 src/drm/cairo-drm-private.h        | 11 +++++--
 src/drm/cairo-drm-radeon-private.h |  6 ++--
 src/drm/cairo-drm-radeon-surface.c | 44 +-------------------------
 src/drm/cairo-drm-radeon.c         | 12 +++++---
 src/drm/cairo-drm-surface.c        | 63 ++++++++++++++++++++++++++++++++++++++
 9 files changed, 87 insertions(+), 115 deletions(-)

diff --git a/src/drm/cairo-drm-i915-surface.c b/src/drm/cairo-drm-i915-surface.c
index dd8ef01..c7e0fef 100644
--- a/src/drm/cairo-drm-i915-surface.c
+++ b/src/drm/cairo-drm-i915-surface.c
@@ -2359,7 +2359,7 @@ static const cairo_surface_backend_t i915_surface_backend = {
     .create_context		= _cairo_default_context_create,
     .create_similar		= i915_surface_create_similar,
     .finish			= i915_surface_finish,
-    .acquire_source_image	= intel_surface_acquire_source_image,
+    .acquire_source_image	= _cairo_drm_surface_acquire_source_image,
     .release_source_image	= intel_surface_release_source_image,
     .get_extents		= _cairo_drm_surface_get_extents,
     .get_font_options		= _cairo_drm_surface_get_font_options,
diff --git a/src/drm/cairo-drm-i965-surface.c b/src/drm/cairo-drm-i965-surface.c
index 825555f..8343f92 100644
--- a/src/drm/cairo-drm-i965-surface.c
+++ b/src/drm/cairo-drm-i965-surface.c
@@ -1496,7 +1496,7 @@ static const cairo_surface_backend_t i965_surface_backend = {
     .create_context		= _cairo_default_context_create,
     .create_similar		= i965_surface_create_similar,
     .finish			= i965_surface_finish,
-    .acquire_source_image	= intel_surface_acquire_source_image,
+    .acquire_source_image	= _cairo_drm_surface_acquire_source_image,
     .release_source_image	= intel_surface_release_source_image,
     .get_extents		= _cairo_drm_surface_get_extents,
     .get_font_options		= _cairo_drm_surface_get_font_options,
diff --git a/src/drm/cairo-drm-intel-private.h b/src/drm/cairo-drm-intel-private.h
index ace9742..570494c 100644
--- a/src/drm/cairo-drm-intel-private.h
+++ b/src/drm/cairo-drm-intel-private.h
@@ -429,11 +429,6 @@ intel_snapshot_cache_thaw (intel_device_t *device);
 cairo_private void
 intel_throttle (intel_device_t *device);
 
-cairo_private cairo_status_t
-intel_surface_acquire_source_image (void *abstract_surface,
-				    cairo_image_surface_t **image_out,
-				    void **image_extra);
-
 cairo_private void
 intel_surface_release_source_image (void *abstract_surface,
 				    cairo_image_surface_t *image,
diff --git a/src/drm/cairo-drm-intel-surface.c b/src/drm/cairo-drm-intel-surface.c
index 3000f2a..0f08dc6 100644
--- a/src/drm/cairo-drm-intel-surface.c
+++ b/src/drm/cairo-drm-intel-surface.c
@@ -61,61 +61,6 @@ intel_surface_finish (void *abstract_surface)
     return _cairo_drm_surface_finish (&surface->drm);
 }
 
-static void
-surface_finish_and_destroy (cairo_surface_t *surface)
-{
-    cairo_surface_finish (surface);
-    cairo_surface_destroy (surface);
-}
-
-cairo_status_t
-intel_surface_acquire_source_image (void *abstract_surface,
-				    cairo_image_surface_t **image_out,
-				    void **image_extra)
-{
-    intel_surface_t *surface = cairo_abstract_surface_cast_intel(abstract_surface);
-    cairo_surface_t *image;
-    cairo_status_t status;
-    void *ptr;
-
-    if (surface->drm.fallback != NULL) {
-	image = surface->drm.fallback;
-	goto DONE;
-    }
-
-    image = _cairo_surface_has_snapshot (&surface->drm.base,
-	                                 &_cairo_image_surface_backend);
-    if (image != NULL)
-	goto DONE;
-
-    if (surface->drm.base.backend->flush != NULL) {
-	status = surface->drm.base.backend->flush (surface, 0);
-	if (unlikely (status))
-	    return status;
-    }
-
-    ptr = intel_bo_map (_cairo_intel_surface_get_device (surface),
-			_cairo_intel_surface_get_bo (surface));
-
-    if (unlikely (ptr == NULL))
-	return _cairo_error (CAIRO_STATUS_NO_MEMORY);
-
-    image = cairo_image_surface_create_for_data (ptr,
-						 surface->drm.format,
-						 surface->drm.width,
-						 surface->drm.height,
-						 surface->drm.stride);
-    if (unlikely (image->status))
-	return image->status;
-
-    _cairo_surface_attach_snapshot (&surface->drm.base, image, surface_finish_and_destroy);
-
-DONE:
-    *image_out = (cairo_image_surface_t *) cairo_surface_reference (image);
-    *image_extra = NULL;
-    return CAIRO_STATUS_SUCCESS;
-}
-
 void
 intel_surface_release_source_image (void *abstract_surface,
 				    cairo_image_surface_t *image,
@@ -151,7 +96,7 @@ static const cairo_surface_backend_t intel_surface_backend = {
     .create_context		= _cairo_default_context_create,
     .create_similar		= intel_surface_create_similar,
     .finish			= intel_surface_finish,
-    .acquire_source_image	= intel_surface_acquire_source_image,
+    .acquire_source_image	= _cairo_drm_surface_acquire_source_image,
     .release_source_image	= intel_surface_release_source_image,
     .get_extents		= _cairo_drm_surface_get_extents,
     .get_font_options		= _cairo_drm_surface_get_font_options,
diff --git a/src/drm/cairo-drm-private.h b/src/drm/cairo-drm-private.h
index 3917447..e975ad3 100644
--- a/src/drm/cairo-drm-private.h
+++ b/src/drm/cairo-drm-private.h
@@ -50,6 +50,7 @@
 
 typedef struct _cairo_drm_device cairo_drm_device_t;
 typedef struct _cairo_drm_bo cairo_drm_bo_t;
+typedef struct _cairo_drm_surface cairo_drm_surface_t;
 
 typedef cairo_drm_device_t *
 (*cairo_drm_device_create_func_t) (int fd,
@@ -93,6 +94,7 @@ typedef cairo_surface_t *
 typedef struct _cairo_drm_bo_backend {
     void (*release) (cairo_drm_device_t *device, cairo_drm_bo_t *bo);
     void *(*map)    (const cairo_drm_device_t *device, cairo_drm_bo_t *bo);
+    cairo_surface_t *(*get_image) (const cairo_drm_device_t *device, cairo_drm_bo_t *bo, const cairo_drm_surface_t *surface);
 } cairo_drm_bo_backend_t;
 
 typedef struct _cairo_drm_device_backend {
@@ -136,7 +138,7 @@ struct _cairo_drm_device {
     cairo_drm_device_t *next, *prev;
 };
 
-typedef struct _cairo_drm_surface {
+struct _cairo_drm_surface {
     cairo_surface_t base;
 
     cairo_drm_bo_t *bo;
@@ -146,7 +148,7 @@ typedef struct _cairo_drm_surface {
 
     cairo_surface_t *fallback;
     uint32_t map_count;
-} cairo_drm_surface_t;
+};
 
 /* cast from abstract void* pointer */
 static inline cairo_drm_device_t*
@@ -366,6 +368,11 @@ _cairo_drm_surface_glyphs (void				*abstract_surface,
 			   cairo_scaled_font_t		*scaled_font,
 			   const cairo_clip_t		*clip);
 
+cairo_private cairo_status_t
+_cairo_drm_surface_acquire_source_image (void *abstract_surface,
+					 cairo_image_surface_t **image_out,
+					 void **image_extra);
+
 /* h/w specific backends */
 
 cairo_private cairo_drm_device_t *
diff --git a/src/drm/cairo-drm-radeon-private.h b/src/drm/cairo-drm-radeon-private.h
index c2234fc..1987c13 100644
--- a/src/drm/cairo-drm-radeon-private.h
+++ b/src/drm/cairo-drm-radeon-private.h
@@ -192,8 +192,8 @@ cairo_private cairo_drm_bo_t *
 radeon_bo_create_for_name (radeon_device_t *dev, uint32_t name);
 
 cairo_private cairo_surface_t *
-radeon_bo_get_image (const radeon_device_t *device,
-	             radeon_bo_t *bo,
-		     const cairo_drm_surface_t *surface);
+_cairo_drm_radeon_bo_get_image (const cairo_drm_device_t *device,
+				cairo_drm_bo_t *bo,
+				const cairo_drm_surface_t *surface);
 
 #endif /* CAIRO_DRM_RADEON_PRIVATE_H */
diff --git a/src/drm/cairo-drm-radeon-surface.c b/src/drm/cairo-drm-radeon-surface.c
index 72d222a..d1d9fe6 100644
--- a/src/drm/cairo-drm-radeon-surface.c
+++ b/src/drm/cairo-drm-radeon-surface.c
@@ -62,48 +62,6 @@ radeon_surface_finish (void *abstract_surface)
     return _cairo_drm_surface_finish (&surface->base);
 }
 
-static cairo_status_t
-radeon_surface_acquire_source_image (void *abstract_surface,
-				     cairo_image_surface_t **image_out,
-				     void **image_extra)
-{
-    radeon_surface_t *surface = abstract_surface;
-    cairo_surface_t *image;
-    cairo_status_t status;
-
-    /* XXX batch flush */
-
-    if (surface->base.fallback != NULL) {
-	image = surface->base.fallback;
-	goto DONE;
-    }
-
-    image = _cairo_surface_has_snapshot (&surface->base.base,
-	                                 &_cairo_image_surface_backend);
-    if (image != NULL)
-	goto DONE;
-
-    if (surface->base.base.backend->flush != NULL) {
-	status = surface->base.base.backend->flush (surface, 0);
-	if (unlikely (status))
-	    return status;
-    }
-
-    image = radeon_bo_get_image (_cairo_radeon_surface_get_device (surface),
-				 _cairo_radeon_surface_get_bo (surface),
-				&surface->base);
-    status = image->status;
-    if (unlikely (status))
-	return status;
-
-    _cairo_surface_attach_snapshot (&surface->base.base, image, cairo_surface_destroy);
-
-DONE:
-    *image_out = (cairo_image_surface_t *) cairo_surface_reference (image);
-    *image_extra = NULL;
-    return CAIRO_STATUS_SUCCESS;
-}
-
 static void
 radeon_surface_release_source_image (void *abstract_surface,
 				     cairo_image_surface_t *image,
@@ -142,7 +100,7 @@ static const cairo_surface_backend_t radeon_surface_backend = {
     .create_context		= _cairo_default_context_create,
     .create_similar		= radeon_surface_create_similar,
     .finish			= radeon_surface_finish,
-    .acquire_source_image	= radeon_surface_acquire_source_image,
+    .acquire_source_image	= _cairo_drm_surface_acquire_source_image,
     .release_source_image	= radeon_surface_release_source_image,
     .get_extents		= _cairo_drm_surface_get_extents,
     .get_font_options		= _cairo_drm_surface_get_font_options,
diff --git a/src/drm/cairo-drm-radeon.c b/src/drm/cairo-drm-radeon.c
index 2ef53d1..72cc0b0 100644
--- a/src/drm/cairo-drm-radeon.c
+++ b/src/drm/cairo-drm-radeon.c
@@ -253,14 +253,17 @@ radeon_bo_release (cairo_drm_device_t *_dev, cairo_drm_bo_t *_bo)
 }
 
 cairo_surface_t *
-radeon_bo_get_image (const radeon_device_t *device,
-	             radeon_bo_t *bo,
+_cairo_drm_radeon_bo_get_image (const cairo_drm_device_t *drm_dev,
+	             cairo_drm_bo_t *drm_bo,
 		     const cairo_drm_surface_t *surface)
 {
     cairo_image_surface_t *image;
     uint8_t *dst;
     int size, row;
 
+    const radeon_device_t *device = _cairo_drm_device_cast_radeon_const (drm_dev);
+    radeon_bo_t *bo = _cairo_drm_bo_cast_radeon (drm_bo);
+
     image = _cairo_surface_cast_image (
 	cairo_image_surface_create (surface->format,
 				    surface->width,
@@ -296,8 +299,9 @@ radeon_device_init (radeon_device_t *device, int fd)
 {
     _cairo_freepool_init (&device->base.bo_pool, sizeof (radeon_bo_t));
 
-    device->base.bo.release = radeon_bo_release;
-    device->base.bo.map     = _cairo_drm_radeon_bo_map;
+    device->base.bo.release   = radeon_bo_release;
+    device->base.bo.map       = _cairo_drm_radeon_bo_map;
+    device->base.bo.get_image = _cairo_drm_radeon_bo_get_image;
 
     return CAIRO_STATUS_SUCCESS;
 }
diff --git a/src/drm/cairo-drm-surface.c b/src/drm/cairo-drm-surface.c
index 217eb57..47dccad 100644
--- a/src/drm/cairo-drm-surface.c
+++ b/src/drm/cairo-drm-surface.c
@@ -501,3 +501,66 @@ _cairo_drm_surface_glyphs (void				*abstract_surface,
 					    scaled_font,
 					    clip);
 }
+
+static void
+_surface_finish_and_destroy (cairo_surface_t *surface)
+{
+    cairo_surface_finish (surface);
+    cairo_surface_destroy (surface);
+}
+
+cairo_status_t
+_cairo_drm_surface_acquire_source_image (void *abstract_surface,
+					 cairo_image_surface_t **image_out,
+					 void **image_extra)
+{
+    cairo_drm_surface_t *surface = _cairo_surface_cast_drm(abstract_surface);
+    cairo_surface_t *image;
+    cairo_status_t status;
+
+    if (surface->fallback != NULL) {
+	image = surface->fallback;
+	goto DONE;
+    }
+
+    image = _cairo_surface_has_snapshot (&surface->base,
+					 &_cairo_image_surface_backend);
+    if (image != NULL)
+	goto DONE;
+
+    if (surface->base.backend->flush != NULL) {
+	status = surface->base.backend->flush (surface, 0);
+	if (unlikely (status))
+	    return status;
+    }
+
+    cairo_drm_device_t *drm_dev = _cairo_drm_surface_get_device (surface);
+
+    if (drm_dev->bo.get_image == NULL)
+    {
+	void *ptr = drm_dev->bo.map (drm_dev, surface->bo);
+
+	if (unlikely (ptr == NULL))
+	    return _cairo_error (CAIRO_STATUS_NO_MEMORY);
+
+	image = cairo_image_surface_create_for_data (ptr,
+						     surface->format,
+						     surface->width,
+						     surface->height,
+						     surface->stride);
+    }
+    else
+    {
+	image = drm_dev->bo.get_image (drm_dev, surface->bo, surface);
+    }
+
+    if (unlikely (image->status))
+	return image->status;
+
+    _cairo_surface_attach_snapshot (&surface->base, image, _surface_finish_and_destroy);
+
+DONE:
+    *image_out = (cairo_image_surface_t *) cairo_surface_reference (image);
+    *image_extra = NULL;
+    return CAIRO_STATUS_SUCCESS;
+}
-- 
2.6.4.442.g545299f

-- 
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.