[PATCH 08/43] drm: add helper for typecasting from abstract surface to drm surface type

"Enrico Weigelt, metux IT consult" <[email protected]>
Newsgroups gmane.comp.lib.cairo
Message-ID <[email protected]>
Signed-off-by: Enrico Weigelt, metux IT consult <[email protected]>
---
 src/drm/cairo-drm-i915-glyphs.c   |  2 +-
 src/drm/cairo-drm-i915-private.h  |  8 ++++++++
 src/drm/cairo-drm-i915-shader.c   |  2 +-
 src/drm/cairo-drm-i915-surface.c  |  6 +++---
 src/drm/cairo-drm-i965-private.h  |  8 ++++++++
 src/drm/cairo-drm-i965-surface.c  |  2 +-
 src/drm/cairo-drm-intel-private.h |  9 +++++++++
 src/drm/cairo-drm-intel-surface.c | 10 +++++-----
 src/drm/cairo-drm-private.h       |  6 ++++++
 src/drm/cairo-drm-surface.c       |  4 ++--
 10 files changed, 44 insertions(+), 13 deletions(-)

diff --git a/src/drm/cairo-drm-i915-glyphs.c b/src/drm/cairo-drm-i915-glyphs.c
index 9944f15..1e88605 100644
--- a/src/drm/cairo-drm-i915-glyphs.c
+++ b/src/drm/cairo-drm-i915-glyphs.c
@@ -282,7 +282,7 @@ i915_surface_glyphs (void			*abstract_surface,
 		     cairo_clip_t		*clip,
 		     int *num_remaining)
 {
-    i915_surface_t *surface = abstract_surface;
+    i915_surface_t *surface = cairo_abstract_surface_cast_i915(abstract_surface);
     i915_surface_t *mask = NULL;
     i915_device_t *device;
     i915_shader_t shader;
diff --git a/src/drm/cairo-drm-i915-private.h b/src/drm/cairo-drm-i915-private.h
index c750cf4..094caa5 100644
--- a/src/drm/cairo-drm-i915-private.h
+++ b/src/drm/cairo-drm-i915-private.h
@@ -764,6 +764,14 @@ struct i915_surface {
     uint32_t stencil_offset;
 };
 
+static inline i915_surface_t* cairo_abstract_surface_cast_i915(cairo_surface_t* surface)
+{
+    return cairo_container_of(
+	cairo_abstract_surface_cast_intel(surface),
+	i915_surface_t,
+	intel);
+}
+
 typedef enum {
     NONE = 0,
     YUV_I420,
diff --git a/src/drm/cairo-drm-i915-shader.c b/src/drm/cairo-drm-i915-shader.c
index 85aa984..e423520 100644
--- a/src/drm/cairo-drm-i915-shader.c
+++ b/src/drm/cairo-drm-i915-shader.c
@@ -43,7 +43,7 @@
 static cairo_status_t
 i915_packed_pixel_surface_finish (void *abstract_surface)
 {
-    i915_packed_pixel_surface_t *surface = abstract_surface;
+    i915_packed_pixel_surface_t *surface = cairo_abstract_surface_cast_i915(abstract_surface);
     i915_device_t *device;
 
     device = i915_device_acquire (&surface->device->intel.base);
diff --git a/src/drm/cairo-drm-i915-surface.c b/src/drm/cairo-drm-i915-surface.c
index c1a0452..6990184 100644
--- a/src/drm/cairo-drm-i915-surface.c
+++ b/src/drm/cairo-drm-i915-surface.c
@@ -652,7 +652,7 @@ i915_surface_create_similar (void *abstract_other,
 static cairo_status_t
 i915_surface_finish (void *abstract_surface)
 {
-    i915_surface_t *surface = abstract_surface;
+    i915_surface_t *surface = cairo_abstract_surface_cast_i915(abstract_surface);
     i915_device_t *device = i915_device (surface);
 
     if (surface->stencil != NULL) {
@@ -719,7 +719,7 @@ static cairo_status_t
 i915_surface_flush (void *abstract_surface,
 		    unsigned flags)
 {
-    i915_surface_t *surface = abstract_surface;
+    i915_surface_t *surface = cairo_abstract_surface_cast_i915(abstract_surface);
     cairo_status_t status;
 
     if (flags)
@@ -2795,7 +2795,7 @@ i915_surface_create_from_cacheable_image (cairo_drm_device_t *device,
 static cairo_status_t
 i915_surface_enable_scan_out (void *abstract_surface)
 {
-    i915_surface_t *surface = abstract_surface;
+    i915_surface_t *surface = cairo_abstract_surface_cast_i915(abstract_surface);
     intel_bo_t *bo;
     cairo_status_t status;
 
diff --git a/src/drm/cairo-drm-i965-private.h b/src/drm/cairo-drm-i965-private.h
index 79568a6..ffd2ca9 100644
--- a/src/drm/cairo-drm-i965-private.h
+++ b/src/drm/cairo-drm-i965-private.h
@@ -315,6 +315,14 @@ struct i965_surface {
     uint32_t offset;
 };
 
+static inline i965_surface_t* cairo_abstract_surface_cast_i965(cairo_surface_t *surface)
+{
+    return cairo_container_of(
+	cairo_abstract_surface_cast_intel(surface),
+	i965_surface_t,
+	intel);
+}
+
 struct i965_pending_relocation {
     uint32_t offset;
     uint32_t read_domains;
diff --git a/src/drm/cairo-drm-i965-surface.c b/src/drm/cairo-drm-i965-surface.c
index ec7b595..ffb5b38 100644
--- a/src/drm/cairo-drm-i965-surface.c
+++ b/src/drm/cairo-drm-i965-surface.c
@@ -1095,7 +1095,7 @@ i965_surface_paint (void			*abstract_dst,
 		    const cairo_pattern_t	*source,
 		    cairo_clip_t		*clip)
 {
-    i965_surface_t *dst = abstract_dst;
+    i965_surface_t *dst = cairo_abstract_surface_cast_i965(abstract_dst);
     cairo_composite_rectangles_t extents;
     cairo_boxes_t boxes;
     cairo_box_t *clip_boxes = boxes.boxes_embedded;
diff --git a/src/drm/cairo-drm-intel-private.h b/src/drm/cairo-drm-intel-private.h
index 343270a..5e95bc9 100644
--- a/src/drm/cairo-drm-intel-private.h
+++ b/src/drm/cairo-drm-intel-private.h
@@ -182,6 +182,15 @@ typedef struct _intel_surface {
     cairo_cache_entry_t snapshot_cache_entry;
 } intel_surface_t;
 
+static inline intel_surface_t*
+cairo_abstract_surface_cast_intel(cairo_surface_t* surface)
+{
+    return cairo_container_of(
+	cairo_abstract_surface_cast_drm(surface),
+	intel_surface_t,
+	drm);
+}
+
 typedef void (*intel_reset_context_func_t) (void *device);
 
 typedef struct _intel_device {
diff --git a/src/drm/cairo-drm-intel-surface.c b/src/drm/cairo-drm-intel-surface.c
index 88f5b8f..b642e88 100644
--- a/src/drm/cairo-drm-intel-surface.c
+++ b/src/drm/cairo-drm-intel-surface.c
@@ -52,7 +52,7 @@ intel_surface_create_similar (void			*abstract_surface,
 cairo_status_t
 intel_surface_finish (void *abstract_surface)
 {
-    intel_surface_t *surface = abstract_surface;
+    intel_surface_t *surface = cairo_abstract_surface_cast_intel(abstract_surface);
 
     intel_bo_in_flight_add (to_intel_device (surface->drm.base.device),
 			    to_intel_bo (surface->drm.bo));
@@ -71,7 +71,7 @@ intel_surface_acquire_source_image (void *abstract_surface,
 				    cairo_image_surface_t **image_out,
 				    void **image_extra)
 {
-    intel_surface_t *surface = abstract_surface;
+    intel_surface_t *surface = cairo_abstract_surface_cast_intel(abstract_surface);
     cairo_surface_t *image;
     cairo_status_t status;
     void *ptr;
@@ -124,7 +124,7 @@ intel_surface_release_source_image (void *abstract_surface,
 cairo_surface_t *
 intel_surface_map_to_image (void *abstract_surface)
 {
-    intel_surface_t *surface = abstract_surface;
+    intel_surface_t *surface = cairo_abstract_surface_cast_intel(abstract_surface);
 
     if (surface->drm.fallback == NULL) {
 	cairo_surface_t *image;
@@ -159,7 +159,7 @@ intel_surface_map_to_image (void *abstract_surface)
 cairo_status_t
 intel_surface_flush (void *abstract_surface, unsigned flags)
 {
-    intel_surface_t *surface = abstract_surface;
+    intel_surface_t *surface = cairo_abstract_surface_cast_intel(abstract_surface);
     cairo_status_t status;
 
     if (flags)
@@ -386,7 +386,7 @@ intel_surface_create_for_name (cairo_drm_device_t *device,
 static cairo_status_t
 intel_surface_enable_scan_out (void *abstract_surface)
 {
-    intel_surface_t *surface = abstract_surface;
+    intel_surface_t *surface = cairo_abstract_surface_cast_intel(abstract_surface);
 
     if (unlikely (surface->drm.bo == NULL))
 	return _cairo_error (CAIRO_STATUS_INVALID_SIZE);
diff --git a/src/drm/cairo-drm-private.h b/src/drm/cairo-drm-private.h
index 2db7f38..5e8d639 100644
--- a/src/drm/cairo-drm-private.h
+++ b/src/drm/cairo-drm-private.h
@@ -140,6 +140,12 @@ typedef struct _cairo_drm_surface {
     uint32_t map_count;
 } cairo_drm_surface_t;
 
+static inline cairo_drm_surface_t*
+cairo_abstract_surface_cast_drm(cairo_surface_t* surface)
+{
+    return cairo_container_of(surface, cairo_drm_surface_t, base);
+}
+
 static inline cairo_drm_bo_t *
 cairo_drm_bo_reference (cairo_drm_bo_t *bo)
 {
diff --git a/src/drm/cairo-drm-surface.c b/src/drm/cairo-drm-surface.c
index 8c4dd0e..d2f993f 100644
--- a/src/drm/cairo-drm-surface.c
+++ b/src/drm/cairo-drm-surface.c
@@ -76,7 +76,7 @@ cairo_bool_t
 _cairo_drm_surface_get_extents (void *abstract_surface,
 			        cairo_rectangle_int_t *rectangle)
 {
-    cairo_drm_surface_t *surface = abstract_surface;
+    cairo_drm_surface_t *surface = cairo_abstract_surface_cast_drm(abstract_surface);
 
     rectangle->x = 0;
     rectangle->y = 0;
@@ -233,7 +233,7 @@ cairo_drm_surface_get_handle (cairo_surface_t *abstract_surface)
 cairo_int_status_t
 _cairo_drm_surface_flink (void *abstract_surface)
 {
-    cairo_drm_surface_t *surface = abstract_surface;
+    cairo_drm_surface_t *surface = cairo_abstract_surface_cast_drm(abstract_surface);
 
     return _cairo_drm_bo_flink ((cairo_drm_device_t *) surface->base.device,
 				surface->bo);
-- 
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.