summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHenry Song <henry.song@samsung.com>2013-04-17 10:23:27 -0700
committerMartin Robinson <mrobinson@igalia.com>2013-04-17 10:27:58 -0700
commit498421bec90f68f3d7219b145860a71fd39f0c64 (patch)
tree17b36a128cefe555c016c90c1a3a1a19d7e0e5bc
parent2dd2c826a5b367d32cf2d48ed69754795990c5db (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.c39
-rw-r--r--src/cairo-gl-private.h3
-rw-r--r--src/cairo-gl-surface.c35
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)
{