From 018b82c01e642aae45dace95c5aae5d489e98853 Mon Sep 17 00:00:00 2001 From: emersion Date: Wed, 25 Apr 2018 00:42:19 +0100 Subject: [PATCH] render/egl: allow passing NULL to surface and image destructors --- backend/drm/renderer.c | 8 ++------ backend/headless/output.c | 4 +--- include/wlr/render/egl.h | 2 +- render/egl.c | 14 +++++++++----- render/gles2/texture.c | 5 +---- 5 files changed, 14 insertions(+), 19 deletions(-) diff --git a/backend/drm/renderer.c b/backend/drm/renderer.c index 208d50fa9..ea46a5e98 100644 --- a/backend/drm/renderer.c +++ b/backend/drm/renderer.c @@ -79,9 +79,7 @@ bool wlr_drm_surface_init(struct wlr_drm_surface *surf, } gbm_surface_destroy(surf->gbm); } - if (surf->egl) { - wlr_egl_destroy_surface(&surf->renderer->egl, surf->egl); - } + wlr_egl_destroy_surface(&surf->renderer->egl, surf->egl); surf->gbm = gbm_surface_create(renderer->gbm, width, height, format, GBM_BO_USE_RENDERING | flags); @@ -117,9 +115,7 @@ void wlr_drm_surface_finish(struct wlr_drm_surface *surf) { gbm_surface_release_buffer(surf->gbm, surf->back); } - if (surf->egl) { - wlr_egl_destroy_surface(&surf->renderer->egl, surf->egl); - } + wlr_egl_destroy_surface(&surf->renderer->egl, surf->egl); if (surf->gbm) { gbm_surface_destroy(surf->gbm); } diff --git a/backend/headless/output.c b/backend/headless/output.c index 4b748dbfc..f71b4cdbe 100644 --- a/backend/headless/output.c +++ b/backend/headless/output.c @@ -29,9 +29,7 @@ static bool output_set_custom_mode(struct wlr_output *wlr_output, int32_t width, refresh = HEADLESS_DEFAULT_REFRESH; } - if (output->egl_surface) { - wlr_egl_destroy_surface(&backend->egl, output->egl_surface); - } + wlr_egl_destroy_surface(&backend->egl, output->egl_surface); output->egl_surface = egl_create_surface(&backend->egl, width, height); if (output->egl_surface == EGL_NO_SURFACE) { diff --git a/include/wlr/render/egl.h b/include/wlr/render/egl.h index 57570ef9d..4d8371386 100644 --- a/include/wlr/render/egl.h +++ b/include/wlr/render/egl.h @@ -98,6 +98,6 @@ bool wlr_egl_is_current(struct wlr_egl *egl); bool wlr_egl_swap_buffers(struct wlr_egl *egl, EGLSurface surface, pixman_region32_t *damage); -void wlr_egl_destroy_surface(struct wlr_egl *egl, EGLSurface surface); +bool wlr_egl_destroy_surface(struct wlr_egl *egl, EGLSurface surface); #endif diff --git a/render/egl.c b/render/egl.c index 74ac17fdb..95bdef55a 100644 --- a/render/egl.c +++ b/render/egl.c @@ -225,9 +225,10 @@ bool wlr_egl_destroy_image(struct wlr_egl *egl, EGLImage image) { if (!eglDestroyImageKHR) { return false; } - - eglDestroyImageKHR(egl->display, image); - return true; + if (!image) { + return true; + } + return eglDestroyImageKHR(egl->display, image); } EGLSurface wlr_egl_create_surface(struct wlr_egl *egl, void *window) { @@ -500,6 +501,9 @@ int wlr_egl_get_dmabuf_modifiers(struct wlr_egl *egl, return num; } -void wlr_egl_destroy_surface(struct wlr_egl *egl, EGLSurface surface) { - eglDestroySurface(egl->display, surface); +bool wlr_egl_destroy_surface(struct wlr_egl *egl, EGLSurface surface) { + if (!surface) { + return true; + } + return eglDestroySurface(egl->display, surface); } diff --git a/render/gles2/texture.c b/render/gles2/texture.c index 45169dafd..45425fbf8 100644 --- a/render/gles2/texture.c +++ b/render/gles2/texture.c @@ -88,10 +88,7 @@ static void gles2_texture_destroy(struct wlr_texture *wlr_texture) { if (texture->image_tex) { glDeleteTextures(1, &texture->image_tex); } - if (texture->image) { - assert(eglDestroyImageKHR); - wlr_egl_destroy_image(texture->egl, texture->image); - } + wlr_egl_destroy_image(texture->egl, texture->image); if (texture->type == WLR_GLES2_TEXTURE_GLTEX) { glDeleteTextures(1, &texture->gl_tex);