diff --git a/src/drm/cairo-drm-i915-spans.c b/src/drm/cairo-drm-i915-spans.c index 0f1617d76..b3db71fd8 100644 --- a/src/drm/cairo-drm-i915-spans.c +++ b/src/drm/cairo-drm-i915-spans.c @@ -612,6 +612,9 @@ i915_spans_fini (i915_spans_t *spans) { i915_shader_fini (&spans->shader); + if (spans->tail->bo->virtual) + intel_bo_unmap (spans->tail->bo); + if (spans->head.bo != NULL) { struct vbo *vbo, *next; diff --git a/src/drm/cairo-drm-i965-glyphs.c b/src/drm/cairo-drm-i965-glyphs.c index fa86e341e..e31bc9cf3 100644 --- a/src/drm/cairo-drm-i965-glyphs.c +++ b/src/drm/cairo-drm-i965-glyphs.c @@ -448,6 +448,10 @@ i965_surface_glyphs (void *abstract_surface, cairo_device_release (surface->intel.drm.base.device); CLEANUP_GLYPHS: i965_shader_fini (&glyphs.shader); + + if (glyphs.tail->bo->virtual) + intel_bo_unmap (glyphs.tail->bo); + if (glyphs.head.bo != NULL) { struct i965_vbo *vbo, *next; diff --git a/src/drm/cairo-drm-i965-spans.c b/src/drm/cairo-drm-i965-spans.c index 9cf6d0009..581f1a7d6 100644 --- a/src/drm/cairo-drm-i965-spans.c +++ b/src/drm/cairo-drm-i965-spans.c @@ -344,6 +344,9 @@ i965_spans_fini (i965_spans_t *spans) { i965_shader_fini (&spans->shader); + if (spans->tail->bo->virtual) + intel_bo_unmap (spans->tail->bo); + if (spans->head.bo != NULL) { struct i965_vbo *vbo, *next; diff --git a/src/drm/cairo-drm-intel.c b/src/drm/cairo-drm-intel.c index 7cbbb16c0..984dcd81e 100644 --- a/src/drm/cairo-drm-intel.c +++ b/src/drm/cairo-drm-intel.c @@ -491,6 +491,8 @@ intel_bo_release (void *_dev, void *_bo) intel_bo_t *bo = _bo; int bucket; + assert (bo->virtual == NULL); + bucket = INTEL_BO_CACHE_BUCKETS; if (bo->base.size & -bo->base.size) bucket = ffs (bo->base.size / 4096) - 1; @@ -982,8 +984,10 @@ intel_glyph_cache_add_glyph (intel_device_t *device, if (width > (int) sizeof (buf)) { a8 = malloc (width); - if (unlikely (a8 == NULL)) + if (unlikely (a8 == NULL)) { + intel_bo_unmap (cache->buffer.bo); return _cairo_error (CAIRO_STATUS_NO_MEMORY); + } } dst += node->x;