[cairo] [PATCH v8 40/71] drm: generalized *_map_to_image() functions
Enrico Weigelt, metux IT consult
enrico.weigelt at gr13.net
Thu Jun 30 15:46:18 UTC 2016
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 3f8004b..dd8ef01 100644
--- a/src/drm/cairo-drm-i915-surface.c
+++ b/src/drm/cairo-drm-i915-surface.c
@@ -2928,7 +2928,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 4d3b7c1..ace9742 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 356dc4a..0c61ca0 100644
--- a/src/drm/cairo-drm-intel-surface.c
+++ b/src/drm/cairo-drm-intel-surface.c
@@ -124,42 +124,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)
{
@@ -188,7 +152,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);
}
@@ -199,7 +163,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);
}
@@ -215,7 +179,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);
}
@@ -230,7 +194,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);
}
@@ -244,7 +208,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,
@@ -426,7 +390,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