summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/cairo-gl-composite.c6
-rw-r--r--src/cairo-gl-device.c2
-rw-r--r--src/cairo-gl-glyphs.c14
-rw-r--r--src/cairo-gl-gradient.c3
-rw-r--r--src/cairo-gl-private.h14
-rw-r--r--src/cairo-gl-surface.c47
6 files changed, 43 insertions, 43 deletions
diff --git a/src/cairo-gl-composite.c b/src/cairo-gl-composite.c
index 0614fa35..67059a78 100644
--- a/src/cairo-gl-composite.c
+++ b/src/cairo-gl-composite.c
@@ -57,9 +57,7 @@ _cairo_gl_create_gradient_texture (cairo_gl_surface_t *dst,
status = _cairo_gl_gradient_create (ctx, pattern->n_stops, pattern->stops, gradient);
- _cairo_gl_context_release (ctx);
-
- return status;
+ return _cairo_gl_context_release (ctx, status);
}
/**
@@ -994,7 +992,7 @@ _cairo_gl_composite_begin (cairo_gl_composite_t *setup,
FAIL:
if (unlikely (status))
- _cairo_gl_context_release (ctx);
+ status = _cairo_gl_context_release (ctx, status);
return status;
}
diff --git a/src/cairo-gl-device.c b/src/cairo-gl-device.c
index 380d393b..c39489c3 100644
--- a/src/cairo-gl-device.c
+++ b/src/cairo-gl-device.c
@@ -92,7 +92,7 @@ _gl_flush (void *device)
glDisable (GL_SCISSOR_TEST);
glDisable (GL_BLEND);
- return _cairo_gl_context_release (ctx);
+ return _cairo_gl_context_release (ctx, status);
}
static void
diff --git a/src/cairo-gl-glyphs.c b/src/cairo-gl-glyphs.c
index b390f821..140a9ea5 100644
--- a/src/cairo-gl-glyphs.c
+++ b/src/cairo-gl-glyphs.c
@@ -229,7 +229,7 @@ _render_glyphs (cairo_gl_surface_t *dst,
cairo_gl_glyph_cache_t *cache = NULL;
cairo_gl_context_t *ctx;
cairo_gl_composite_t setup;
- cairo_status_t status, status_maybe_ignored;
+ cairo_status_t status;
int i = 0;
*has_component_alpha = FALSE;
@@ -306,14 +306,12 @@ _render_glyphs (cairo_gl_surface_t *dst,
*has_component_alpha |= cache->pattern.base.has_component_alpha;
- status = _cairo_gl_composite_begin (&setup, &ctx);
- if (unlikely (status))
- goto FINISH;
-
/* XXX: _cairo_gl_composite_begin() acquires the context a
* second time. Need to refactor this loop so this doesn't happen.
*/
- status = _cairo_gl_context_release (ctx);
+ status = _cairo_gl_composite_begin (&setup, &ctx);
+
+ status = _cairo_gl_context_release (ctx, status);
if (unlikely (status))
goto FINISH;
}
@@ -351,9 +349,7 @@ _render_glyphs (cairo_gl_surface_t *dst,
FINISH:
_cairo_scaled_font_thaw_cache (scaled_font);
- status_maybe_ignored = _cairo_gl_context_release (ctx);
- if (status == CAIRO_STATUS_SUCCESS)
- status = status_maybe_ignored;
+ status = _cairo_gl_context_release (ctx, status);
_cairo_gl_composite_fini (&setup);
diff --git a/src/cairo-gl-gradient.c b/src/cairo-gl-gradient.c
index a6cd1f87..8ebcdfe5 100644
--- a/src/cairo-gl-gradient.c
+++ b/src/cairo-gl-gradient.c
@@ -258,6 +258,7 @@ void
_cairo_gl_gradient_destroy (cairo_gl_gradient_t *gradient)
{
cairo_gl_context_t *ctx;
+ cairo_status_t ignore;
assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&gradient->ref_count));
@@ -266,7 +267,7 @@ _cairo_gl_gradient_destroy (cairo_gl_gradient_t *gradient)
if (_cairo_gl_context_acquire (gradient->device, &ctx) == CAIRO_STATUS_SUCCESS) {
glDeleteTextures (1, &gradient->tex);
- _cairo_gl_context_release (ctx);
+ ignore = _cairo_gl_context_release (ctx, CAIRO_STATUS_SUCCESS);
}
free (gradient);
diff --git a/src/cairo-gl-private.h b/src/cairo-gl-private.h
index 67fc864d..136d48fa 100644
--- a/src/cairo-gl-private.h
+++ b/src/cairo-gl-private.h
@@ -292,16 +292,18 @@ _cairo_gl_context_acquire (cairo_device_t *device,
}
static cairo_always_inline cairo_warn cairo_status_t
-_cairo_gl_context_release (cairo_gl_context_t *ctx)
+_cairo_gl_context_release (cairo_gl_context_t *ctx, cairo_status_t status)
{
- cairo_status_t status;
GLenum err;
err = _cairo_gl_get_error ();
- if (unlikely (err))
- status = _cairo_error (CAIRO_STATUS_DEVICE_ERROR);
- else
- status = CAIRO_STATUS_SUCCESS;
+
+ if (unlikely (err)) {
+ cairo_status_t new_status;
+ new_status = _cairo_error (CAIRO_STATUS_DEVICE_ERROR);
+ if (status == CAIRO_STATUS_SUCCESS)
+ status = new_status;
+ }
cairo_device_release (&(ctx)->base);
diff --git a/src/cairo-gl-surface.c b/src/cairo-gl-surface.c
index 88d58e88..6755955e 100644
--- a/src/cairo-gl-surface.c
+++ b/src/cairo-gl-surface.c
@@ -304,7 +304,7 @@ _cairo_gl_surface_clear (cairo_gl_surface_t *surface,
glClearColor (r, g, b, a);
glClear (GL_COLOR_BUFFER_BIT);
- return _cairo_gl_context_release (ctx);
+ return _cairo_gl_context_release (ctx, status);
}
cairo_surface_t *
@@ -338,21 +338,16 @@ cairo_gl_surface_create (cairo_device_t *abstract_device,
surface = (cairo_gl_surface_t *)
_cairo_gl_surface_create_scratch (ctx, content, width, height);
if (unlikely (surface->base.status)) {
- _cairo_gl_context_release (ctx);
+ status = _cairo_gl_context_release (ctx, surface->base.status);
return &surface->base;
}
/* Cairo surfaces start out initialized to transparent (black) */
status = _cairo_gl_surface_clear (surface, CAIRO_COLOR_TRANSPARENT);
- if (unlikely (status)) {
- cairo_surface_destroy (&surface->base);
- _cairo_gl_context_release (ctx);
- return _cairo_surface_create_in_error (status);
- }
- status = _cairo_gl_context_release (ctx);
+ status = _cairo_gl_context_release (ctx, status);
if (unlikely (status)) {
- _cairo_gl_context_release (ctx);
+ cairo_surface_destroy (&surface->base);
return _cairo_surface_create_in_error (status);
}
@@ -421,15 +416,19 @@ cairo_gl_surface_swapbuffers (cairo_surface_t *abstract_surface)
if (! _cairo_gl_surface_is_texture (surface)) {
cairo_gl_context_t *ctx;
+ cairo_status_t status;
- if (_cairo_gl_context_acquire (surface->base.device, &ctx))
+ status = _cairo_gl_context_acquire (surface->base.device, &ctx);
+ if (unlikely (status))
return;
cairo_surface_flush (abstract_surface);
ctx->swap_buffers (ctx, surface);
- _cairo_gl_context_release (ctx);
+ status = _cairo_gl_context_release (ctx, status);
+ if (status)
+ status = _cairo_surface_set_error (abstract_surface, status);
}
}
@@ -461,7 +460,11 @@ _cairo_gl_surface_create_similar (void *abstract_surface,
surface = _cairo_gl_surface_create_scratch (ctx, content, width, height);
RELEASE:
- _cairo_gl_context_release (ctx);
+ status = _cairo_gl_context_release (ctx, status);
+ if (unlikely (status)) {
+ cairo_surface_destroy (surface);
+ return _cairo_surface_create_in_error (status);
+ }
return surface;
}
@@ -582,7 +585,7 @@ _cairo_gl_surface_draw_image (cairo_gl_surface_t *dst,
FAIL:
glPixelStorei (GL_UNPACK_ROW_LENGTH, 0);
- _cairo_gl_context_release (ctx);
+ status = _cairo_gl_context_release (ctx, status);
if (clone)
cairo_surface_destroy (&clone->base);
@@ -651,7 +654,7 @@ _cairo_gl_surface_get_image (cairo_gl_surface_t *surface,
if (! _cairo_gl_surface_is_texture (surface) && GLEW_MESA_pack_invert)
glPixelStorei (GL_PACK_INVERT_MESA, 0);
- status = _cairo_gl_context_release (ctx);
+ status = _cairo_gl_context_release (ctx, status);
if (unlikely (status)) {
cairo_surface_destroy (&image->base);
return status;
@@ -690,7 +693,7 @@ _cairo_gl_surface_finish (void *abstract_surface)
glDeleteFramebuffersEXT (1, &surface->fb);
glDeleteTextures (1, &surface->tex);
- return _cairo_gl_context_release (ctx);
+ return _cairo_gl_context_release (ctx, status);
}
static cairo_status_t
@@ -945,7 +948,7 @@ _cairo_gl_surface_composite (cairo_operator_t op,
0);
}
- status = _cairo_gl_context_release (ctx);
+ status = _cairo_gl_context_release (ctx, status);
CLEANUP:
_cairo_gl_composite_fini (&setup);
@@ -1042,7 +1045,7 @@ _cairo_gl_surface_fill_rectangles (void *abstract_dst,
0);
}
- status = _cairo_gl_context_release (ctx);
+ status = _cairo_gl_context_release (ctx, status);
CLEANUP:
_cairo_gl_composite_fini (&setup);
@@ -1146,13 +1149,15 @@ _cairo_gl_finish_unbounded_spans (void *abstract_renderer)
0);
}
- return CAIRO_STATUS_SUCCESS;
+ return _cairo_gl_context_release (renderer->ctx, CAIRO_STATUS_SUCCESS);
}
static cairo_status_t
_cairo_gl_finish_bounded_spans (void *abstract_renderer)
{
- return CAIRO_STATUS_SUCCESS;
+ cairo_gl_surface_span_renderer_t *renderer = abstract_renderer;
+
+ return _cairo_gl_context_release (renderer->ctx, CAIRO_STATUS_SUCCESS);
}
static void
@@ -1163,8 +1168,6 @@ _cairo_gl_surface_span_renderer_destroy (void *abstract_renderer)
if (!renderer)
return;
- _cairo_gl_context_release (renderer->ctx);
-
_cairo_gl_composite_fini (&renderer->setup);
free (renderer);
@@ -1287,7 +1290,7 @@ _cairo_gl_surface_flush (void *abstract_surface)
(ctx->current_target == surface))
_cairo_gl_composite_flush (ctx);
- return _cairo_gl_context_release (ctx);
+ return _cairo_gl_context_release (ctx, status);
}
static cairo_int_status_t