diff options
author | Henry Song <henry.song@samsung.com> | 2013-04-17 10:23:27 -0700 |
---|---|---|
committer | Martin Robinson <mrobinson@igalia.com> | 2013-04-17 10:27:58 -0700 |
commit | 498421bec90f68f3d7219b145860a71fd39f0c64 (patch) | |
tree | 17b36a128cefe555c016c90c1a3a1a19d7e0e5bc | |
parent | 2dd2c826a5b367d32cf2d48ed69754795990c5db (diff) |
gl/msaa: Resolve multisampling on surface flush
When flushing a surface, we must resolve multisampling for desktop GL.
This allows use of the original surface texture in any following raw GL
operations. This fixes accelerated canvas with WebKitGTK+ using the MSAA
compositor.
-rw-r--r-- | src/cairo-gl-operand.c | 39 | ||||
-rw-r--r-- | src/cairo-gl-private.h | 3 | ||||
-rw-r--r-- | src/cairo-gl-surface.c | 35 |
3 files changed, 41 insertions, 36 deletions
diff --git a/src/cairo-gl-operand.c b/src/cairo-gl-operand.c index f99400ca..7b5b404d 100644 --- a/src/cairo-gl-operand.c +++ b/src/cairo-gl-operand.c @@ -69,39 +69,6 @@ _cairo_gl_create_gradient_texture (cairo_gl_surface_t *dst, return _cairo_gl_context_release (ctx, status); } -static cairo_int_status_t -_resolve_multisampling (cairo_gl_surface_t *surface) -{ - cairo_gl_context_t *ctx; - cairo_int_status_t status; - - if (! surface->msaa_active) - return CAIRO_INT_STATUS_SUCCESS; - - if (surface->base.device == NULL) - return CAIRO_INT_STATUS_SUCCESS; - - /* GLES surfaces do not need explicit resolution. */ - if (((cairo_gl_context_t *) surface->base.device)->gl_flavor == CAIRO_GL_FLAVOR_ES) - return CAIRO_INT_STATUS_SUCCESS; - - if (! _cairo_gl_surface_is_texture (surface)) - return CAIRO_INT_STATUS_SUCCESS; - - status = _cairo_gl_context_acquire (surface->base.device, &ctx); - if (unlikely (status)) - return status; - - ctx->current_target = surface; - -#if CAIRO_HAS_GL_SURFACE - _cairo_gl_activate_surface_as_nonmultisampling (ctx, surface); -#endif - - status = _cairo_gl_context_release (ctx, status); - return status; -} - static cairo_status_t _cairo_gl_subsurface_clone_operand_init (cairo_gl_operand_t *operand, const cairo_pattern_t *_src, @@ -161,7 +128,7 @@ _cairo_gl_subsurface_clone_operand_init (cairo_gl_operand_t *operand, _cairo_surface_subsurface_set_snapshot (&sub->base, &surface->base); } - status = _resolve_multisampling (surface); + status = _cairo_gl_surface_resolve_multisampling (surface); if (unlikely (status)) return status; @@ -223,7 +190,7 @@ _cairo_gl_subsurface_operand_init (cairo_gl_operand_t *operand, if (! _cairo_gl_surface_is_texture (surface)) return CAIRO_INT_STATUS_UNSUPPORTED; - status = _resolve_multisampling (surface); + status = _cairo_gl_surface_resolve_multisampling (surface); if (unlikely (status)) return status; @@ -281,7 +248,7 @@ _cairo_gl_surface_operand_init (cairo_gl_operand_t *operand, if (surface->base.device && ! _cairo_gl_surface_is_texture (surface)) return CAIRO_INT_STATUS_UNSUPPORTED; - status = _resolve_multisampling (surface); + status = _cairo_gl_surface_resolve_multisampling (surface); if (unlikely (status)) return status; diff --git a/src/cairo-gl-private.h b/src/cairo-gl-private.h index 5c9193dc..c99bd162 100644 --- a/src/cairo-gl-private.h +++ b/src/cairo-gl-private.h @@ -440,6 +440,9 @@ _cairo_gl_surface_draw_image (cairo_gl_surface_t *dst, int dst_x, int dst_y, cairo_bool_t force_flush); +cairo_private cairo_int_status_t +_cairo_gl_surface_resolve_multisampling (cairo_gl_surface_t *surface); + static cairo_always_inline cairo_bool_t _cairo_gl_device_has_glsl (cairo_device_t *device) { diff --git a/src/cairo-gl-surface.c b/src/cairo-gl-surface.c index 1d7515a4..144dccce 100644 --- a/src/cairo-gl-surface.c +++ b/src/cairo-gl-surface.c @@ -1278,9 +1278,44 @@ _cairo_gl_surface_flush (void *abstract_surface, unsigned flags) (ctx->current_target == surface)) _cairo_gl_composite_flush (ctx); + status = _cairo_gl_surface_resolve_multisampling (surface); + return _cairo_gl_context_release (ctx, status); } +cairo_int_status_t +_cairo_gl_surface_resolve_multisampling (cairo_gl_surface_t *surface) +{ + cairo_gl_context_t *ctx; + cairo_int_status_t status; + + if (! surface->msaa_active) + return CAIRO_INT_STATUS_SUCCESS; + + if (surface->base.device == NULL) + return CAIRO_INT_STATUS_SUCCESS; + + /* GLES surfaces do not need explicit resolution. */ + if (((cairo_gl_context_t *) surface->base.device)->gl_flavor == CAIRO_GL_FLAVOR_ES) + return CAIRO_INT_STATUS_SUCCESS; + + if (! _cairo_gl_surface_is_texture (surface)) + return CAIRO_INT_STATUS_SUCCESS; + + status = _cairo_gl_context_acquire (surface->base.device, &ctx); + if (unlikely (status)) + return status; + + ctx->current_target = surface; + +#if CAIRO_HAS_GL_SURFACE + _cairo_gl_activate_surface_as_nonmultisampling (ctx, surface); +#endif + + status = _cairo_gl_context_release (ctx, status); + return status; +} + static const cairo_compositor_t * get_compositor (cairo_gl_surface_t *surface) { |