diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2011-12-09 09:20:23 +0000 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2011-12-09 09:20:23 +0000 |
commit | f446e57f350190f3ecc4758fe5cc2c6e949ff7b9 (patch) | |
tree | 85df0a8430d2c383b05fcb19f1f8be15f8408880 | |
parent | 8d4425053d126ead3087fe59c69063bce3b42cb5 (diff) |
gl: Track surface references through operands
In the case where we created a surface to handle an operand, it needs to
be freed when we release the operand. However, we also have to be
careful not to introduce reference cycles into ordinary surfaces, so
always remember to teardown the composite setup!
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r-- | src/cairo-gl-operand.c | 4 | ||||
-rw-r--r-- | src/cairo-gl-private.h | 1 |
2 files changed, 5 insertions, 0 deletions
diff --git a/src/cairo-gl-operand.c b/src/cairo-gl-operand.c index 1cfd4157..989f4ce3 100644 --- a/src/cairo-gl-operand.c +++ b/src/cairo-gl-operand.c @@ -124,6 +124,7 @@ _cairo_gl_subsurface_clone_operand_init (cairo_gl_operand_t *operand, operand->type = CAIRO_GL_OPERAND_TEXTURE; operand->texture.surface = surface; + operand->texture.owns_surface = surface; operand->texture.tex = surface->tex; if (_cairo_gl_device_requires_power_of_two_textures (dst->base.device)) { @@ -254,6 +255,7 @@ _cairo_gl_pattern_texture_setup (cairo_gl_operand_t *operand, } *operand = surface->operand; + operand->texture.owns_surface = surface; operand->texture.attributes.matrix.x0 -= extents->x * operand->texture.attributes.matrix.xx; operand->texture.attributes.matrix.y0 -= extents->y * operand->texture.attributes.matrix.yy; return CAIRO_STATUS_SUCCESS; @@ -375,6 +377,7 @@ _cairo_gl_operand_copy (cairo_gl_operand_t *dst, _cairo_gl_gradient_reference (dst->gradient.gradient); break; case CAIRO_GL_OPERAND_TEXTURE: + cairo_surface_reference (&dst->texture.owns_surface->base); break; default: case CAIRO_GL_OPERAND_COUNT: @@ -397,6 +400,7 @@ _cairo_gl_operand_destroy (cairo_gl_operand_t *operand) _cairo_gl_gradient_destroy (operand->gradient.gradient); break; case CAIRO_GL_OPERAND_TEXTURE: + cairo_surface_destroy (&operand->texture.owns_surface->base); break; default: case CAIRO_GL_OPERAND_COUNT: diff --git a/src/cairo-gl-private.h b/src/cairo-gl-private.h index 05d1567c..a0cf50b1 100644 --- a/src/cairo-gl-private.h +++ b/src/cairo-gl-private.h @@ -132,6 +132,7 @@ typedef struct cairo_gl_operand { struct { GLuint tex; cairo_gl_surface_t *surface; + cairo_gl_surface_t *owns_surface; cairo_surface_attributes_t attributes; } texture; struct { |