summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2011-12-09 09:20:23 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2011-12-09 09:20:23 +0000
commitf446e57f350190f3ecc4758fe5cc2c6e949ff7b9 (patch)
tree85df0a8430d2c383b05fcb19f1f8be15f8408880
parent8d4425053d126ead3087fe59c69063bce3b42cb5 (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.c4
-rw-r--r--src/cairo-gl-private.h1
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 {