[cairo] [patch] gl: do not force flush everytime uploading a glyph image to glyph cache

Henry (Yu) Song - SISA hsong at sisa.samsung.com
Tue Jan 29 09:53:38 PST 2013


>From fc3c82cf6a2dd706a97aea2b34c4ddd23eb6e939 Mon Sep 17 00:00:00 2001
From: Henry Song <henry.song at samsung.com>
Date: Wed, 23 Jan 2013 11:55:44 -0800
Subject: [PATCH] gl: add a force_flush flag in _cairo_gl_surface_draw_image.
 In normal cases, we want to flush everytime we call this
 function. But during uploading glyph to glyph cache, we
 don't want to flush it everytime it uploads glyph images.

---
 src/cairo-gl-glyphs.c           |    2 +-
 src/cairo-gl-private.h          |    3 ++-
 src/cairo-gl-spans-compositor.c |    2 +-
 src/cairo-gl-surface-legacy.c   |    7 ++++---
 src/cairo-gl-surface.c          |   16 ++++++++++------
 src/cairo-gl-traps-compositor.c |    9 ++++++---
 6 files changed, 24 insertions(+), 15 deletions(-)

diff --git a/src/cairo-gl-glyphs.c b/src/cairo-gl-glyphs.c
index 3f65248..34b5d72 100644
--- a/src/cairo-gl-glyphs.c
+++ b/src/cairo-gl-glyphs.c
@@ -134,7 +134,7 @@ _cairo_gl_glyph_cache_add_glyph (cairo_gl_context_t *ctx,
     status = _cairo_gl_surface_draw_image (cache->surface, glyph_surface,
                                            0, 0,
                                            glyph_surface->width, glyph_surface->height,
-                                           node->x, node->y);
+                                           node->x, node->y, FALSE);
     if (unlikely (status))
 	return status;
 
diff --git a/src/cairo-gl-private.h b/src/cairo-gl-private.h
index a75afa7..a8f1db6 100644
--- a/src/cairo-gl-private.h
+++ b/src/cairo-gl-private.h
@@ -434,7 +434,8 @@ _cairo_gl_surface_draw_image (cairo_gl_surface_t *dst,
 			      cairo_image_surface_t *src,
 			      int src_x, int src_y,
 			      int width, int height,
-			      int dst_x, int dst_y);
+			      int dst_x, int dst_y,
+			      cairo_bool_t force_flush);
 
 static cairo_always_inline cairo_bool_t
 _cairo_gl_device_has_glsl (cairo_device_t *device)
diff --git a/src/cairo-gl-spans-compositor.c b/src/cairo-gl-spans-compositor.c
index 98efd46..fbad8f3 100644
--- a/src/cairo-gl-spans-compositor.c
+++ b/src/cairo-gl-spans-compositor.c
@@ -311,7 +311,7 @@ draw_image_boxes (void *_dst,
 	    status = _cairo_gl_surface_draw_image (dst, image,
 						   x + dx, y + dy,
 						   w, h,
-						   x, y);
+						   x, y, TRUE);
 	    if (unlikely (status))
 		return status;
 	}
diff --git a/src/cairo-gl-surface-legacy.c b/src/cairo-gl-surface-legacy.c
index 61bdd1f..92b27c9 100644
--- a/src/cairo-gl-surface-legacy.c
+++ b/src/cairo-gl-surface-legacy.c
@@ -77,7 +77,8 @@ _cairo_gl_surface_release_dest_image (void		      *abstract_surface,
     status = _cairo_gl_surface_draw_image (abstract_surface, image,
 					   0, 0,
 					   image->width, image->height,
-					   image_rect->x, image_rect->y);
+					   image_rect->x, image_rect->y,
+					   TRUE);
     /* as we created the image, its format should be directly applicable */
     assert (status == CAIRO_STATUS_SUCCESS);
 
@@ -126,7 +127,7 @@ _cairo_gl_surface_clone_similar (void		     *abstract_surface,
 	status = _cairo_gl_surface_draw_image (clone, image_src,
 					       src_x, src_y,
 					       width, height,
-					       0, 0);
+					       0, 0, TRUE);
 	if (status) {
 	    cairo_surface_destroy (&clone->base);
 	    return status;
@@ -236,7 +237,7 @@ _cairo_gl_surface_composite (cairo_operator_t		  op,
             status = _cairo_gl_surface_draw_image (dst, image,
                                                    dx, dy,
                                                    width, height,
-                                                   dst_x, dst_y);
+                                                   dst_x, dst_y, TRUE);
             if (status != CAIRO_INT_STATUS_UNSUPPORTED)
                 return status;
         }
diff --git a/src/cairo-gl-surface.c b/src/cairo-gl-surface.c
index 922f234..1d7515a 100644
--- a/src/cairo-gl-surface.c
+++ b/src/cairo-gl-surface.c
@@ -840,7 +840,8 @@ _cairo_gl_surface_draw_image (cairo_gl_surface_t *dst,
 			      cairo_image_surface_t *src,
 			      int src_x, int src_y,
 			      int width, int height,
-			      int dst_x, int dst_y)
+			      int dst_x, int dst_y,
+			      cairo_bool_t force_flush)
 {
     GLenum internal_format, format, type;
     cairo_bool_t has_alpha, needs_swap;
@@ -882,9 +883,11 @@ _cairo_gl_surface_draw_image (cairo_gl_surface_t *dst,
 
     cpp = PIXMAN_FORMAT_BPP (src->pixman_format) / 8;
 
-    status = _cairo_gl_surface_flush (&dst->base, 0);
-    if (unlikely (status))
-	goto FAIL;
+    if (force_flush) {
+	status = _cairo_gl_surface_flush (&dst->base, 0);
+	if (unlikely (status))
+	    goto FAIL;
+    }
 
     if (_cairo_gl_surface_is_texture (dst)) {
 	void *data_start = src->data + src_y * src->stride + src_x * cpp;
@@ -951,7 +954,7 @@ _cairo_gl_surface_draw_image (cairo_gl_surface_t *dst,
                                                src,
                                                src_x, src_y,
                                                width, height,
-                                               0, 0);
+                                               0, 0, force_flush);
         if (status == CAIRO_INT_STATUS_SUCCESS) {
             cairo_surface_pattern_t tmp_pattern;
 	    cairo_rectangle_int_t r;
@@ -1231,7 +1234,8 @@ _cairo_gl_surface_unmap_image (void		      *abstract_surface,
 					   0, 0,
 					   image->width, image->height,
 					   image->base.device_transform_inverse.x0,
-					   image->base.device_transform_inverse.y0);
+					   image->base.device_transform_inverse.y0,
+					   TRUE);
 
     cairo_surface_finish (&image->base);
     cairo_surface_destroy (&image->base);
diff --git a/src/cairo-gl-traps-compositor.c b/src/cairo-gl-traps-compositor.c
index b6c2333..52e624c 100644
--- a/src/cairo-gl-traps-compositor.c
+++ b/src/cairo-gl-traps-compositor.c
@@ -96,7 +96,8 @@ draw_image_boxes (void *_dst,
 	    status = _cairo_gl_surface_draw_image (dst, image,
 						   x + dx, y + dy,
 						   w, h,
-						   x, y);
+						   x, y,
+						   TRUE);
 	    if (unlikely (status))
 		return status;
 	}
@@ -345,7 +346,8 @@ traps_to_operand (void *_dst,
 					   (cairo_image_surface_t *)image,
 					   0, 0,
 					   extents->width, extents->height,
-					   0, 0);
+					   0, 0,
+					   TRUE);
     cairo_surface_destroy (image);
 
     if (unlikely (status))
@@ -455,7 +457,8 @@ tristrip_to_surface (void *_dst,
 					   (cairo_image_surface_t *)image,
 					   0, 0,
 					   extents->width, extents->height,
-					   0, 0);
+					   0, 0,
+					   TRUE);
     cairo_surface_destroy (image);
     if (unlikely (status)) {
 	cairo_surface_destroy (mask);
-- 
1.7.9.5


More information about the cairo mailing list