[cairo] [PATCH 45/72] drm: generalized *_map_to_image() functions

Enrico Weigelt, metux IT consult enrico.weigelt at gr13.net
Tue Dec 29 01:17:23 PST 2015


This function essentially creates an underlying image surface
(if not existing yet) and maps it to the underlying framebuffer.

The only device specific part here is actually mapping in the actual
BO (as long as we dont have an generic libdrm call / ioctl() for that).

As we already introduced the bo_map() vector in cairo_drm_device_t,
this function can be made generic, so all device specific backends
can just call it, instead of their own duplicated implementations.

In a later step, we can generalize thse surface ops, which just
proxy onto the image surface.

Signed-off-by: Enrico Weigelt, metux IT consult <enrico.weigelt at gr13.net>
---
 src/drm/cairo-drm-i915-surface.c   |  2 +-
 src/drm/cairo-drm-intel-private.h  |  2 --
 src/drm/cairo-drm-intel-surface.c  | 48 +++++---------------------------------
 src/drm/cairo-drm-private.h        |  3 +++
 src/drm/cairo-drm-radeon-surface.c | 46 ++++--------------------------------
 src/drm/cairo-drm-surface.c        | 39 +++++++++++++++++++++++++++++++
 6 files changed, 54 insertions(+), 86 deletions(-)

diff --git a/src/drm/cairo-drm-i915-surface.c b/src/drm/cairo-drm-i915-surface.c
index b1c61f4..06555ab 100644
--- a/src/drm/cairo-drm-i915-surface.c
+++ b/src/drm/cairo-drm-i915-surface.c
@@ -2922,7 +2922,7 @@ _cairo_drm_i915_device_create (int fd, dev_t dev_id, int vendor_id, int chip_id)
 
     device->intel.base.surface.flink = _cairo_drm_surface_flink;
     device->intel.base.surface.enable_scan_out = i915_surface_enable_scan_out;
-    device->intel.base.surface.map_to_image = intel_surface_map_to_image;
+    device->intel.base.surface.map_to_image = _cairo_drm_surface_map_to_image;
 
     device->intel.base.device.flush = i915_device_flush;
     device->intel.base.device.throttle = i915_device_throttle;
diff --git a/src/drm/cairo-drm-intel-private.h b/src/drm/cairo-drm-intel-private.h
index ba13344..fef1d39 100644
--- a/src/drm/cairo-drm-intel-private.h
+++ b/src/drm/cairo-drm-intel-private.h
@@ -438,8 +438,6 @@ cairo_private void
 intel_surface_release_source_image (void *abstract_surface,
 				    cairo_image_surface_t *image,
 				    void *image_extra);
-cairo_private cairo_surface_t *
-intel_surface_map_to_image (void *abstract_surface);
 
 cairo_private cairo_status_t
 intel_surface_flush (void *abstract_surface,
diff --git a/src/drm/cairo-drm-intel-surface.c b/src/drm/cairo-drm-intel-surface.c
index 1dd8f1f..3a20e27 100644
--- a/src/drm/cairo-drm-intel-surface.c
+++ b/src/drm/cairo-drm-intel-surface.c
@@ -125,42 +125,6 @@ intel_surface_release_source_image (void *abstract_surface,
     cairo_surface_destroy (&image->base);
 }
 
-cairo_surface_t *
-intel_surface_map_to_image (void *abstract_surface)
-{
-    intel_surface_t *surface = cairo_abstract_surface_cast_intel(abstract_surface);
-
-    if (surface->drm.fallback == NULL) {
-	cairo_surface_t *image;
-	cairo_status_t status;
-	void *ptr;
-
-	if (surface->drm.base.backend->flush != NULL) {
-	    status = surface->drm.base.backend->flush (surface, 0);
-	    if (unlikely (status))
-		return _cairo_surface_create_in_error (status);
-	}
-
-	ptr = intel_bo_map (_cairo_intel_surface_get_device (surface),
-			    _cairo_intel_surface_get_bo (surface));
-
-	if (unlikely (ptr == NULL))
-	    return _cairo_surface_create_in_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;
-
-	surface->drm.fallback = image;
-    }
-
-    return surface->drm.fallback;
-}
-
 cairo_status_t
 intel_surface_flush (void *abstract_surface, unsigned flags)
 {
@@ -189,7 +153,7 @@ intel_surface_paint (void *abstract_surface,
 		     const cairo_pattern_t	*source,
 		     const cairo_clip_t		*clip)
 {
-    return _cairo_surface_paint (intel_surface_map_to_image (abstract_surface),
+    return _cairo_surface_paint (_cairo_drm_surface_map_to_image (abstract_surface),
 				 op, source, clip);
 }
 
@@ -200,7 +164,7 @@ intel_surface_mask (void			*abstract_surface,
 		    const cairo_pattern_t	*mask,
 		    const cairo_clip_t		*clip)
 {
-    return _cairo_surface_mask (intel_surface_map_to_image (abstract_surface),
+    return _cairo_surface_mask (_cairo_drm_surface_map_to_image (abstract_surface),
 				op, source, mask, clip);
 }
 
@@ -216,7 +180,7 @@ intel_surface_stroke (void			*abstract_surface,
 		      cairo_antialias_t		 antialias,
 		      const cairo_clip_t		*clip)
 {
-    return _cairo_surface_stroke (intel_surface_map_to_image (abstract_surface),
+    return _cairo_surface_stroke (_cairo_drm_surface_map_to_image (abstract_surface),
 				  op, source, path, stroke_style, ctm, ctm_inverse,
 				  tolerance, antialias, clip);
 }
@@ -231,7 +195,7 @@ intel_surface_fill (void			*abstract_surface,
 		    cairo_antialias_t		 antialias,
 		    const cairo_clip_t		*clip)
 {
-    return _cairo_surface_fill (intel_surface_map_to_image (abstract_surface),
+    return _cairo_surface_fill (_cairo_drm_surface_map_to_image (abstract_surface),
 				op, source, path, fill_rule,
 				tolerance, antialias, clip);
 }
@@ -245,7 +209,7 @@ intel_surface_glyphs (void			*abstract_surface,
 		      cairo_scaled_font_t	*scaled_font,
 		      const cairo_clip_t	*clip)
 {
-    return _cairo_surface_show_text_glyphs (intel_surface_map_to_image (abstract_surface),
+    return _cairo_surface_show_text_glyphs (_cairo_drm_surface_map_to_image (abstract_surface),
 					    op, source,
 					    NULL, 0,
 					    glyphs, num_glyphs,
@@ -427,7 +391,7 @@ _cairo_drm_intel_device_create (int fd, dev_t dev, int vendor_id, int chip_id)
     device->base.surface.flink = _cairo_drm_surface_flink;
     device->base.surface.enable_scan_out = intel_surface_enable_scan_out;
 
-    device->base.surface.map_to_image = intel_surface_map_to_image;
+    device->base.surface.map_to_image = _cairo_drm_surface_map_to_image;
 
     device->base.device.flush = NULL;
     device->base.device.throttle = intel_device_throttle;
diff --git a/src/drm/cairo-drm-private.h b/src/drm/cairo-drm-private.h
index 90cd54c..b7fd9bd 100644
--- a/src/drm/cairo-drm-private.h
+++ b/src/drm/cairo-drm-private.h
@@ -317,6 +317,9 @@ _cairo_drm_device_init (cairo_drm_device_t *device,
 cairo_private void
 _cairo_drm_device_fini (cairo_drm_device_t *device);
 
+cairo_private cairo_surface_t *
+_cairo_drm_surface_map_to_image (void *abstract_surface);
+
 /* h/w specific backends */
 
 cairo_private cairo_drm_device_t *
diff --git a/src/drm/cairo-drm-radeon-surface.c b/src/drm/cairo-drm-radeon-surface.c
index 0a1f27c..c941e87 100644
--- a/src/drm/cairo-drm-radeon-surface.c
+++ b/src/drm/cairo-drm-radeon-surface.c
@@ -112,42 +112,6 @@ radeon_surface_release_source_image (void *abstract_surface,
     cairo_surface_destroy (&image->base);
 }
 
-static cairo_surface_t *
-radeon_surface_map_to_image (radeon_surface_t *surface)
-{
-    if (surface->base.fallback == NULL) {
-	cairo_surface_t *image;
-	cairo_status_t status;
-	void *ptr;
-
-	if (surface->base.base.backend->flush != NULL) {
-	    status = surface->base.base.backend->flush (surface, 0);
-	    if (unlikely (status))
-		return _cairo_surface_create_in_error (status);
-	}
-
-	ptr = radeon_bo_map (_cairo_radeon_surface_get_device (surface),
-			     _cairo_radeon_surface_get_bo (surface));
-
-	if (unlikely (ptr == NULL))
-	    return _cairo_surface_create_in_error (CAIRO_STATUS_NO_MEMORY);
-
-	image = cairo_image_surface_create_for_data (ptr,
-						     surface->base.format,
-						     surface->base.width,
-						     surface->base.height,
-						     surface->base.stride);
-	if (unlikely (image->status)) {
-	    _cairo_drm_bo_unmap (surface->base.bo);
-	    return image;
-	}
-
-	surface->base.fallback = image;
-    }
-
-    return surface->base.fallback;
-}
-
 static cairo_status_t
 radeon_surface_flush (void *abstract_surface,
 		      unsigned flags)
@@ -179,7 +143,7 @@ radeon_surface_paint (void *abstract_surface,
 		     const cairo_pattern_t	*source,
 		     const cairo_clip_t		*clip)
 {
-    return _cairo_surface_paint (radeon_surface_map_to_image (abstract_surface),
+    return _cairo_surface_paint (_cairo_drm_surface_map_to_image (abstract_surface),
 				 op, source, clip);
 }
 
@@ -190,7 +154,7 @@ radeon_surface_mask (void			*abstract_surface,
 		    const cairo_pattern_t	*mask,
 		    const cairo_clip_t		*clip)
 {
-    return _cairo_surface_mask (radeon_surface_map_to_image (abstract_surface),
+    return _cairo_surface_mask (_cairo_drm_surface_map_to_image (abstract_surface),
 				op, source, mask, clip);
 }
 
@@ -206,7 +170,7 @@ radeon_surface_stroke (void			*abstract_surface,
 		      cairo_antialias_t		 antialias,
 		      const cairo_clip_t		*clip)
 {
-    return _cairo_surface_stroke (radeon_surface_map_to_image (abstract_surface),
+    return _cairo_surface_stroke (_cairo_drm_surface_map_to_image (abstract_surface),
 				  op, source, path, stroke_style, ctm, ctm_inverse,
 				  tolerance, antialias, clip);
 }
@@ -221,7 +185,7 @@ radeon_surface_fill (void			*abstract_surface,
 		    cairo_antialias_t		 antialias,
 		    const cairo_clip_t		*clip)
 {
-    return _cairo_surface_fill (radeon_surface_map_to_image (abstract_surface),
+    return _cairo_surface_fill (_cairo_drm_surface_map_to_image (abstract_surface),
 				op, source, path, fill_rule,
 				tolerance, antialias, clip);
 }
@@ -235,7 +199,7 @@ radeon_surface_glyphs (void			*abstract_surface,
 		      cairo_scaled_font_t	*scaled_font,
 		      const cairo_clip_t	*clip)
 {
-    return _cairo_surface_show_text_glyphs (radeon_surface_map_to_image (abstract_surface),
+    return _cairo_surface_show_text_glyphs (_cairo_drm_surface_map_to_image (abstract_surface),
 					    op, source,
 					    NULL, 0,
 					    glyphs, num_glyphs,
diff --git a/src/drm/cairo-drm-surface.c b/src/drm/cairo-drm-surface.c
index ee514dd..c93fb94 100644
--- a/src/drm/cairo-drm-surface.c
+++ b/src/drm/cairo-drm-surface.c
@@ -367,3 +367,42 @@ cairo_drm_surface_unmap (cairo_surface_t *abstract_surface,
     if (--surface->map_count == 0)
 	cairo_surface_flush (&surface->base);
 }
+
+cairo_surface_t *
+_cairo_drm_surface_map_to_image (void *abstract_surface)
+{
+    cairo_drm_surface_t *surface = _cairo_surface_cast_drm (abstract_surface);
+    if (surface->fallback == NULL) {
+	cairo_surface_t *image;
+	cairo_status_t status;
+	void *ptr;
+
+	if (surface->base.backend->flush != NULL) {
+	    status = surface->base.backend->flush (surface, 0);
+	    if (unlikely (status))
+		return _cairo_surface_create_in_error (status);
+	}
+
+	cairo_drm_device_t * drm_dev = _cairo_device_cast_drm (surface->base.device);
+
+	ptr = drm_dev->bo.map (drm_dev, surface->bo);
+
+	if (unlikely (ptr == NULL))
+	    return _cairo_surface_create_in_error (CAIRO_STATUS_NO_MEMORY);
+
+	image = cairo_image_surface_create_for_data (ptr,
+						     surface->format,
+						     surface->width,
+						     surface->height,
+						     surface->stride);
+
+	if (unlikely (image->status)) {
+	    _cairo_drm_bo_unmap (surface->bo);
+	    return image;
+	}
+
+	surface->fallback = image;
+    }
+
+    return surface->fallback;
+}
-- 
2.6.4.442.g545299f



More information about the cairo mailing list