diff options
author | Martin Robinson <mrobinson@igalia.com> | 2012-04-02 13:45:15 -0700 |
---|---|---|
committer | Martin Robinson <mrobinson@igalia.com> | 2012-05-17 14:21:25 -0700 |
commit | 707bb8663980e66e8406351b68c230b63a0265c6 (patch) | |
tree | 3afe254316e8c16f4a75d9b3a08d418a611b1f8e | |
parent | 4b3ad4e8dacdfb84636f188b2dc7afe3ad6966c5 (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.c | 37 | ||||
-rw-r--r-- | src/cairo-gl-msaa-compositor.c | 4 |
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); |