[cairo] [PATCH 31/72] drm: fixed handling of private pointers in scaled_font objects

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


Signed-off-by: Enrico Weigelt, metux IT consult <enrico.weigelt at gr13.net>
---
 src/drm/cairo-drm-i915-glyphs.c   | 37 +++++++++++++++++++++++++++++++------
 src/drm/cairo-drm-i915-private.h  |  7 +++++++
 src/drm/cairo-drm-i965-glyphs.c   | 38 +++++++++++++++++++++++++++++++-------
 src/drm/cairo-drm-i965-private.h  |  7 +++++++
 src/drm/cairo-drm-intel-private.h |  4 ++++
 5 files changed, 80 insertions(+), 13 deletions(-)

diff --git a/src/drm/cairo-drm-i915-glyphs.c b/src/drm/cairo-drm-i915-glyphs.c
index 3f04bfa..df05c39 100644
--- a/src/drm/cairo-drm-i915-glyphs.c
+++ b/src/drm/cairo-drm-i915-glyphs.c
@@ -273,6 +273,22 @@ CLEANUP_SHADER:
     return status;
 }
 
+/* this is just a dummy to produce an unique address */
+static const char *_i915_scaled_font_key = "i915_scaled_font_t";
+
+/* destructor for the i915_scaled_font object */
+static void _i915_scaled_font_fini(
+    cairo_scaled_font_private_t *abstract_priv,
+    cairo_scaled_font_t* scaled_font)
+{
+    i915_scaled_font_private_t *i915_priv = cairo_container_of(abstract_priv, i915_scaled_font_private_t, base);
+
+    // FIXME: do we need to do something more ?
+
+    cairo_list_del(&i915_priv->base.link);
+    free(i915_priv);
+}
+
 cairo_int_status_t
 i915_surface_glyphs (void			*abstract_surface,
 		     cairo_operator_t		 op,
@@ -425,10 +441,19 @@ i915_surface_glyphs (void			*abstract_surface,
     device = i915_device (surface);
 
     _cairo_scaled_font_freeze_cache (scaled_font);
-    if (scaled_font->surface_private == NULL) {
-	scaled_font->surface_private = device;
-	scaled_font->surface_backend = surface->intel.drm.base.backend;
-	cairo_list_add (&scaled_font->link, &device->intel.fonts);
+
+    if (_cairo_scaled_font_find_private(scaled_font, _i915_scaled_font_key) == NULL) {
+	i915_scaled_font_private_t *priv = (i915_scaled_font_private_t*)malloc(sizeof(i915_scaled_font_private_t));
+
+	priv->device = device;
+	priv->backend = surface->intel.drm.base.backend;
+
+	_cairo_scaled_font_attach_private(
+		scaled_font,
+		&(priv->base),
+		_i915_scaled_font_key,
+		_i915_scaled_font_fini
+	);
     }
 
     memset (glyph_cache, 0, sizeof (glyph_cache));
@@ -476,7 +501,7 @@ i915_surface_glyphs (void			*abstract_surface,
 	    continue;
 	}
 
-	if (scaled_glyph->surface_private == NULL) {
+	if (scaled_glyph->dev_private == NULL) {
 	    status = intel_get_glyph (&device->intel, scaled_font, scaled_glyph);
 	    if (unlikely (status == CAIRO_INT_STATUS_NOTHING_TO_DO)) {
 		status = CAIRO_INT_STATUS_SUCCESS;
@@ -486,7 +511,7 @@ i915_surface_glyphs (void			*abstract_surface,
 		goto FINISH;
 	}
 
-	glyph = intel_glyph_pin (scaled_glyph->surface_private);
+	glyph = intel_glyph_pin (scaled_glyph->dev_private);
 	if (glyph->cache->buffer.bo != last_bo) {
 	    intel_buffer_cache_t *cache = glyph->cache;
 
diff --git a/src/drm/cairo-drm-i915-private.h b/src/drm/cairo-drm-i915-private.h
index 6659040..708d9c7 100644
--- a/src/drm/cairo-drm-i915-private.h
+++ b/src/drm/cairo-drm-i915-private.h
@@ -620,6 +620,7 @@ i915_fs_operand_pure_alpha (int pure)
 typedef struct i915_surface i915_surface_t;
 typedef struct i915_device i915_device_t;
 typedef struct i915_shader i915_shader_t;
+typedef struct i915_scaled_font_private i915_scaled_font_private_t;
 
 typedef void (*i915_add_rectangle_func_t) (const i915_shader_t *shader,
 					   int x, int y,
@@ -710,6 +711,12 @@ struct i915_device {
     uint8_t vbo_base[I915_VBO_SIZE];
 };
 
+struct i915_scaled_font_private {
+    cairo_scaled_font_private_t base;
+    i915_device_t *device;
+    const cairo_surface_backend_t *backend;
+};
+
 enum {
     CURRENT_SOURCE = 0x1,
     CURRENT_MASK = 0x2,
diff --git a/src/drm/cairo-drm-i965-glyphs.c b/src/drm/cairo-drm-i965-glyphs.c
index 5d1abb6..2275e08 100644
--- a/src/drm/cairo-drm-i965-glyphs.c
+++ b/src/drm/cairo-drm-i965-glyphs.c
@@ -215,6 +215,22 @@ i965_surface_mask_internal (i965_surface_t *dst,
     return status;
 }
 
+/* this is just a dummy to produce an unique address */
+static const char *_i965_scaled_font_key = "i965_scaled_font_t";
+
+/* destructor for the i915_scaled_font object */
+static void _i965_scaled_font_fini(
+    cairo_scaled_font_private_t *abstract_priv,
+    cairo_scaled_font_t* scaled_font)
+{
+    i965_scaled_font_private_t *i915_priv = cairo_container_of(abstract_priv, i965_scaled_font_private_t, base);
+
+    // FIXME: do we need to do something more ?
+
+    cairo_list_del(&i915_priv->base.link);
+    free(i915_priv);
+}
+
 cairo_int_status_t
 i965_surface_glyphs (void			*abstract_surface,
 		     cairo_operator_t		 op,
@@ -341,11 +357,19 @@ i965_surface_glyphs (void			*abstract_surface,
 	goto CLEANUP_GLYPHS;
 
     _cairo_scaled_font_freeze_cache (scaled_font);
-    //private = _cairo_scaled_font_get_device (scaled_font, device);
-    if (scaled_font->surface_private == NULL) {
-	scaled_font->surface_private = device;
-	scaled_font->surface_backend = surface->intel.drm.base.backend;
-	cairo_list_add (&scaled_font->link, &device->intel.fonts);
+
+    if (_cairo_scaled_font_find_private(scaled_font, _i965_scaled_font_key) == NULL) {
+	i965_scaled_font_private_t *priv = (i965_scaled_font_private_t*)malloc(sizeof(i965_scaled_font_private_t));
+
+	priv->device = device;
+	priv->backend = surface->intel.drm.base.backend;
+
+	_cairo_scaled_font_attach_private(
+	    scaled_font,
+	    &(priv->base),
+	    _i965_scaled_font_key,
+	    _i965_scaled_font_fini
+	);
     }
 
     memset (glyph_cache, 0, sizeof (glyph_cache));
@@ -393,7 +417,7 @@ i965_surface_glyphs (void			*abstract_surface,
 	    continue;
 	}
 
-	if (scaled_glyph->surface_private == NULL) {
+	if (scaled_glyph->dev_private == NULL) {
 	    status = intel_get_glyph (&device->intel, scaled_font, scaled_glyph);
 	    if (unlikely (status == CAIRO_INT_STATUS_NOTHING_TO_DO)) {
 		status = CAIRO_STATUS_SUCCESS;
@@ -402,7 +426,7 @@ i965_surface_glyphs (void			*abstract_surface,
 	    if (unlikely (status))
 		goto FINISH;
 	}
-	glyph = intel_glyph_pin (scaled_glyph->surface_private);
+	glyph = intel_glyph_pin (scaled_glyph->dev_private);
 
 	if (glyph->cache->buffer.bo != last_bo) {
 	    intel_buffer_cache_t *cache = glyph->cache;
diff --git a/src/drm/cairo-drm-i965-private.h b/src/drm/cairo-drm-i965-private.h
index 9c562a1..a2e7ba1 100644
--- a/src/drm/cairo-drm-i965-private.h
+++ b/src/drm/cairo-drm-i965-private.h
@@ -255,6 +255,7 @@ typedef struct i965_device i965_device_t;
 typedef struct i965_surface i965_surface_t;
 typedef struct i965_shader i965_shader_t;
 typedef struct i965_stream i965_stream_t;
+typedef struct i965_scaled_font_private i965_scaled_font_private_t;
 
 struct i965_sf_state {
     cairo_hash_entry_t entry;
@@ -533,6 +534,12 @@ struct i965_shader {
     jmp_buf unwind;
 };
 
+struct i965_scaled_font_private {
+    cairo_scaled_font_private_t base;
+    i965_device_t *device;
+    const cairo_surface_backend_t *backend;
+};
+
 enum i965_shader_linear_mode {
     /* XXX REFLECT */
     LINEAR_TEXTURE,
diff --git a/src/drm/cairo-drm-intel-private.h b/src/drm/cairo-drm-intel-private.h
index 4ba36a8..a9a5ff9 100644
--- a/src/drm/cairo-drm-intel-private.h
+++ b/src/drm/cairo-drm-intel-private.h
@@ -171,6 +171,10 @@ typedef struct _intel_glyph {
     int width, height;
 } intel_glyph_t;
 
+typedef struct _intel_scaled_font {
+    cairo_scaled_font_private_t base;
+} intel_scaled_font_t;
+
 typedef struct _intel_gradient_cache {
     cairo_pattern_union_t pattern;
     intel_buffer_t buffer;
-- 
2.6.4.442.g545299f



More information about the cairo mailing list