diff options
-rw-r--r-- | src/cairo-gl-composite.c | 6 | ||||
-rw-r--r-- | src/cairo-gl-device.c | 2 | ||||
-rw-r--r-- | src/cairo-gl-glyphs.c | 14 | ||||
-rw-r--r-- | src/cairo-gl-gradient.c | 3 | ||||
-rw-r--r-- | src/cairo-gl-private.h | 14 | ||||
-rw-r--r-- | src/cairo-gl-surface.c | 47 |
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 |