diff options
Diffstat (limited to 'src/rpi-renderer.c')
-rw-r--r-- | src/rpi-renderer.c | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/src/rpi-renderer.c b/src/rpi-renderer.c index c6b924c6..3a7f65cc 100644 --- a/src/rpi-renderer.c +++ b/src/rpi-renderer.c @@ -363,6 +363,7 @@ rpi_resource_update(struct rpi_resource *resource, struct weston_buffer *buffer, int height; int stride; int ret; + int applied_opaque_region = 0; #ifdef HAVE_RESOURCE_WRITE_DATA_RECT int n; #endif @@ -384,13 +385,18 @@ rpi_resource_update(struct rpi_resource *resource, struct weston_buffer *buffer, if (!pixels) return -1; + + applied_opaque_region = 1; } #endif ret = rpi_resource_realloc(resource, ifmt & ~PREMULT_ALPHA_FLAG, width, height, stride, height); - if (ret < 0) + if (ret < 0) { + if (applied_opaque_region) + free(pixels); return -1; + } pixman_region32_init_rect(&write_region, 0, 0, width, height); if (ret == 0) @@ -437,12 +443,8 @@ rpi_resource_update(struct rpi_resource *resource, struct weston_buffer *buffer, pixman_region32_fini(&write_region); -#ifndef HAVE_ELEMENT_SET_OPAQUE_RECT - if (pixman_region32_not_empty(opaque_region) && - wl_shm_buffer_get_format(buffer->shm_buffer) == WL_SHM_FORMAT_ARGB8888 && - resource->enable_opaque_regions) + if (applied_opaque_region) free(pixels); -#endif return ret ? -1 : 0; } @@ -1742,11 +1744,13 @@ rpi_renderer_create(struct weston_compositor *compositor, renderer->egl_display = eglGetDisplay(EGL_DEFAULT_DISPLAY); if (renderer->egl_display == EGL_NO_DISPLAY) { weston_log("failed to create EGL display\n"); + free(renderer); return -1; } if (!eglInitialize(renderer->egl_display, &major, &minor)) { weston_log("failed to initialize EGL display\n"); + free(renderer); return -1; } @@ -1761,6 +1765,8 @@ rpi_renderer_create(struct weston_compositor *compositor, EGL_EXTENSIONS); if (!extensions) { weston_log("Retrieving EGL extension string failed.\n"); + eglTerminate(renderer->egl_display); + free(renderer); return -1; } |