From e69bbfd0d6a654a0421793bf10cb3cab15e13273 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Mon, 7 Dec 2020 19:57:12 +0100 Subject: [PATCH] backend/drm: unset current surface before importing drm_fb_import_wlr may need to change the current EGL context. For instance by calling drm_fb_clear, which calls wlr_buffer_unlock, which may destroy a buffer if the cursor swapchain size has changed, which calls gles2's destroy_buffer, which calls glDeleteFramebuffers. Closes: https://github.com/swaywm/wlroots/issues/2479 --- backend/drm/renderer.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/backend/drm/renderer.c b/backend/drm/renderer.c index 8091f27b..408effd8 100644 --- a/backend/drm/renderer.c +++ b/backend/drm/renderer.c @@ -322,12 +322,15 @@ void drm_fb_clear(struct wlr_drm_fb *fb) { bool drm_fb_lock_surface(struct wlr_drm_fb *fb, struct wlr_drm_surface *surf) { assert(surf->back_buffer != NULL); - if (!drm_fb_import_wlr(fb, surf->renderer, surf->back_buffer, NULL)) { - return false; - } + struct wlr_buffer *buffer = wlr_buffer_lock(surf->back_buffer); + // Unset the current EGL context ASAP, because other operations may require + // making another context current. drm_surface_unset_current(surf); - return true; + + bool ok = drm_fb_import_wlr(fb, surf->renderer, buffer, NULL); + wlr_buffer_unlock(buffer); + return ok; } bool drm_fb_import_wlr(struct wlr_drm_fb *fb, struct wlr_drm_renderer *renderer,