[PATCH 47/72] 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 06555ab..d01de33 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 95e423b..18c22ee 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 fef1d39..66777c1 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 5be9952..daf51de 100644
--- a/src/drm/cairo-drm-intel-surface.c
+++ b/src/drm/cairo-drm-intel-surface.c
@@ -62,61 +62,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,
@@ -152,7 +97,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 53d826a..a3c5125 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_dumb_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 933acb5..5835b4b 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 a794612..167cef8 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 3e32ef9..da6a03f 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 ee86745..22b22b8 100644
--- a/src/drm/cairo-drm-surface.c
+++ b/src/drm/cairo-drm-surface.c
@@ -501,3 +501,66 @@ _cairo_drm_dumb_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]
http://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.