summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Robinson <mrobinson@igalia.com>2012-04-02 13:45:15 -0700
committerMartin Robinson <mrobinson@igalia.com>2012-05-17 14:21:25 -0700
commit707bb8663980e66e8406351b68c230b63a0265c6 (patch)
tree3afe254316e8c16f4a75d9b3a08d418a611b1f8e
parent4b3ad4e8dacdfb84636f188b2dc7afe3ad6966c5 (diff)
gl/msaa: Lazily flush the context
Instead of conservatively flushing after every single drawing operation. Wait until we are certain we need to flush, which in the case of the MSAA compositor is when we start compositing with a different type of geometry.
-rw-r--r--src/cairo-gl-composite.c37
-rw-r--r--src/cairo-gl-msaa-compositor.c4
2 files changed, 24 insertions, 17 deletions
diff --git a/src/cairo-gl-composite.c b/src/cairo-gl-composite.c
index 6063dca5..b4c3e3d2 100644
--- a/src/cairo-gl-composite.c
+++ b/src/cairo-gl-composite.c
@@ -789,12 +789,27 @@ _cairo_gl_composite_flush (cairo_gl_context_t *ctx)
_cairo_gl_glyph_cache_unlock (&ctx->glyph_cache[i]);
}
+typedef enum cairo_gl_geometry {
+ CAIRO_GL_GEOMETRY_TYPE_TRIANGLES,
+ CAIRO_GL_GEOMETRY_TYPE_TRISTRIPS
+} cairo_gl_geometry_t;
+
static void
_cairo_gl_composite_prepare_buffer (cairo_gl_context_t *ctx,
- unsigned int n_vertices)
+ unsigned int n_vertices,
+ cairo_gl_geometry_t geometry_type)
{
cairo_gl_dispatch_t *dispatch = &ctx->dispatch;
+ size_t tristrip_indices =_cairo_array_num_elements (&ctx->tristrip_indices);
+ if (geometry_type == CAIRO_GL_GEOMETRY_TYPE_TRIANGLES &&
+ tristrip_indices != 0) {
+ _cairo_gl_composite_flush (ctx);
+ } else if (geometry_type == CAIRO_GL_GEOMETRY_TYPE_TRISTRIPS &&
+ ! _cairo_gl_context_is_flushed (ctx) && tristrip_indices == 0) {
+ _cairo_gl_composite_flush (ctx);
+ }
+
if (ctx->vb_offset + n_vertices * ctx->vertex_size > CAIRO_GL_VBO_SIZE)
_cairo_gl_composite_flush (ctx);
@@ -859,7 +874,8 @@ _cairo_gl_composite_emit_rect (cairo_gl_context_t *ctx,
GLfloat y2,
uint8_t alpha)
{
- _cairo_gl_composite_prepare_buffer (ctx, 6);
+ _cairo_gl_composite_prepare_buffer (ctx, 6,
+ CAIRO_GL_GEOMETRY_TYPE_TRIANGLES);
_cairo_gl_composite_emit_vertex (ctx, x1, y1, alpha);
_cairo_gl_composite_emit_vertex (ctx, x2, y1, alpha);
@@ -901,7 +917,8 @@ _cairo_gl_composite_emit_glyph (cairo_gl_context_t *ctx,
GLfloat glyph_x2,
GLfloat glyph_y2)
{
- _cairo_gl_composite_prepare_buffer (ctx, 6);
+ _cairo_gl_composite_prepare_buffer (ctx, 6,
+ CAIRO_GL_GEOMETRY_TYPE_TRIANGLES);
_cairo_gl_composite_emit_glyph_vertex (ctx, x1, y1, glyph_x1, glyph_y1);
_cairo_gl_composite_emit_glyph_vertex (ctx, x2, y1, glyph_x2, glyph_y1);
@@ -988,11 +1005,8 @@ _cairo_gl_composite_emit_quad_as_tristrip (cairo_gl_context_t *ctx,
cairo_gl_composite_t *setup,
const cairo_point_t quad[4])
{
- if (_cairo_array_num_elements (&ctx->tristrip_indices) == 0 &&
- ! _cairo_gl_context_is_flushed (ctx))
- _cairo_gl_composite_flush (ctx);
-
- _cairo_gl_composite_prepare_buffer (ctx, 4);
+ _cairo_gl_composite_prepare_buffer (ctx, 4,
+ CAIRO_GL_GEOMETRY_TYPE_TRISTRIPS);
_cairo_gl_composite_emit_point (ctx, &quad[0], 0);
_cairo_gl_composite_emit_point (ctx, &quad[1], 0);
@@ -1011,11 +1025,8 @@ _cairo_gl_composite_emit_triangle_as_tristrip (cairo_gl_context_t *ctx,
cairo_gl_composite_t *setup,
const cairo_point_t triangle[3])
{
- if (_cairo_array_num_elements (&ctx->tristrip_indices) == 0 &&
- ! _cairo_gl_context_is_flushed (ctx))
- _cairo_gl_composite_flush (ctx);
-
- _cairo_gl_composite_prepare_buffer (ctx, 3);
+ _cairo_gl_composite_prepare_buffer (ctx, 3,
+ CAIRO_GL_GEOMETRY_TYPE_TRISTRIPS);
_cairo_gl_composite_emit_point (ctx, &triangle[0], 0);
_cairo_gl_composite_emit_point (ctx, &triangle[1], 0);
diff --git a/src/cairo-gl-msaa-compositor.c b/src/cairo-gl-msaa-compositor.c
index f0a8c96f..1054457d 100644
--- a/src/cairo-gl-msaa-compositor.c
+++ b/src/cairo-gl-msaa-compositor.c
@@ -373,7 +373,6 @@ _cairo_gl_msaa_compositor_mask (const cairo_compositor_t *compositor,
goto finish;
_draw_int_rect (ctx, &setup, &composite->bounded);
- _cairo_gl_composite_flush (ctx);
finish:
_cairo_gl_composite_fini (&setup);
@@ -559,8 +558,6 @@ _cairo_gl_msaa_compositor_stroke (const cairo_compositor_t *compositor,
if (unlikely (status))
goto finish;
- _cairo_gl_composite_flush (info.ctx);
-
finish:
_cairo_gl_composite_fini (&info.setup);
@@ -638,7 +635,6 @@ _cairo_gl_msaa_compositor_fill (const cairo_compositor_t *compositor,
if (unlikely (status))
goto cleanup_setup;
- _cairo_gl_composite_flush (ctx);
cleanup_setup:
_cairo_gl_composite_fini (&setup);