gl: Make gl_composite_begin() acquire the context

Also remove the previous places for context acquisition. This completes
fixing the potential ABBA deadlock I talked about a few commits ago.
This commit is contained in:
Benjamin Otte 2010-05-26 13:03:12 +02:00
parent 1320a168fa
commit db79880d9a
4 changed files with 30 additions and 28 deletions

View file

@ -1041,19 +1041,26 @@ _cairo_gl_composite_begin_component_alpha (cairo_gl_context_t *ctx,
}
cairo_status_t
_cairo_gl_composite_begin (cairo_gl_context_t *ctx,
cairo_gl_composite_t *setup)
_cairo_gl_composite_begin (cairo_gl_composite_t *setup,
cairo_gl_context_t **ctx_out)
{
unsigned int dst_size, src_size, mask_size;
cairo_gl_context_t *ctx;
cairo_status_t status;
assert (setup->dst);
status = _cairo_gl_context_acquire (setup->dst->base.device, &ctx);
if (unlikely (status))
return status;
assert (! _cairo_gl_context_is_in_progress (ctx));
/* Do various magic for component alpha */
if (setup->has_component_alpha) {
status = _cairo_gl_composite_begin_component_alpha (ctx, setup);
if (unlikely (status))
return status;
goto FAIL;
}
status = _cairo_gl_set_shader_by_type (ctx,
@ -1063,7 +1070,7 @@ _cairo_gl_composite_begin (cairo_gl_context_t *ctx,
: CAIRO_GL_SHADER_IN_NORMAL);
if (unlikely (status)) {
setup->pre_shader = NULL;
return status;
goto FAIL;
}
status = CAIRO_STATUS_SUCCESS;
@ -1098,6 +1105,12 @@ _cairo_gl_composite_begin (cairo_gl_context_t *ctx,
if (setup->clip_region)
glEnable (GL_SCISSOR_TEST);
*ctx_out = ctx;
FAIL:
if (unlikely (status))
_cairo_gl_context_release (ctx);
return status;
}

View file

@ -309,9 +309,14 @@ _render_glyphs (cairo_gl_surface_t *dst,
*has_component_alpha |= cache->pattern.base.has_component_alpha;
status = _cairo_gl_composite_begin (ctx, &setup);
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.
*/
_cairo_gl_context_release (ctx);
}
if (scaled_glyph->surface_private == NULL) {

View file

@ -316,8 +316,8 @@ cairo_private void
_cairo_gl_composite_set_mask_spans (cairo_gl_composite_t *setup);
cairo_private cairo_status_t
_cairo_gl_composite_begin (cairo_gl_context_t *ctx,
cairo_gl_composite_t *setup);
_cairo_gl_composite_begin (cairo_gl_composite_t *setup,
cairo_gl_context_t **ctx);
cairo_private void
_cairo_gl_composite_emit_rect (cairo_gl_context_t *ctx,

View file

@ -913,10 +913,6 @@ _cairo_gl_surface_composite (cairo_operator_t op,
}
}
status = _cairo_gl_context_acquire (dst->base.device, &ctx);
if (unlikely (status))
return status;
status = _cairo_gl_composite_init (&setup, op, dst,
mask && mask->has_component_alpha,
&rect);
@ -937,7 +933,7 @@ _cairo_gl_surface_composite (cairo_operator_t op,
if (unlikely (status))
goto CLEANUP;
status = _cairo_gl_composite_begin (ctx, &setup);
status = _cairo_gl_composite_begin (&setup, &ctx);
if (unlikely (status))
goto CLEANUP;
@ -963,9 +959,9 @@ _cairo_gl_surface_composite (cairo_operator_t op,
}
_cairo_gl_composite_end (ctx, &setup);
_cairo_gl_context_release (ctx);
CLEANUP:
_cairo_gl_context_release (ctx);
_cairo_gl_composite_fini (&setup);
return status;
@ -1040,10 +1036,6 @@ _cairo_gl_surface_fill_rectangles (void *abstract_dst,
cairo_gl_composite_t setup;
int i;
status = _cairo_gl_context_acquire (dst->base.device, &ctx);
if (unlikely (status))
return status;
status = _cairo_gl_composite_init (&setup, op, dst,
FALSE,
/* XXX */ NULL);
@ -1065,7 +1057,7 @@ _cairo_gl_surface_fill_rectangles (void *abstract_dst,
if (unlikely (status))
goto CLEANUP;
status = _cairo_gl_composite_begin (ctx, &setup);
status = _cairo_gl_composite_begin (&setup, &ctx);
if (unlikely (status))
goto CLEANUP;
@ -1079,9 +1071,9 @@ _cairo_gl_surface_fill_rectangles (void *abstract_dst,
}
_cairo_gl_composite_end (ctx, &setup);
_cairo_gl_context_release (ctx);
CLEANUP:
_cairo_gl_context_release (ctx);
_cairo_gl_composite_fini (&setup);
return status;
@ -1238,12 +1230,6 @@ _cairo_gl_surface_create_span_renderer (cairo_operator_t op,
renderer->xmin = extents->x;
renderer->xmax = extents->x + extents->width;
status = _cairo_gl_context_acquire (dst->base.device, &renderer->ctx);
if (unlikely (status)) {
free (renderer);
return _cairo_span_renderer_create_in_error (status);
}
status = _cairo_gl_composite_init (&renderer->setup,
op, dst,
FALSE, extents);
@ -1260,15 +1246,13 @@ _cairo_gl_surface_create_span_renderer (cairo_operator_t op,
_cairo_gl_composite_set_mask_spans (&renderer->setup);
_cairo_gl_composite_set_clip_region (&renderer->setup, clip_region);
status = _cairo_gl_composite_begin (renderer->ctx, &renderer->setup);
status = _cairo_gl_composite_begin (&renderer->setup, &renderer->ctx);
if (unlikely (status))
goto FAIL;
return &renderer->base;
FAIL:
_cairo_gl_context_release (renderer->ctx);
_cairo_gl_composite_fini (&renderer->setup);
free (renderer);
return _cairo_span_renderer_create_in_error (status);