[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