aboutsummaryrefslogtreecommitdiff
path: root/backend/drm
diff options
context:
space:
mode:
authorSimon Ser <contact@emersion.fr>2020-12-07 19:57:12 +0100
committerSimon Ser <contact@emersion.fr>2020-12-08 00:10:57 +0100
commite69bbfd0d6a654a0421793bf10cb3cab15e13273 (patch)
tree57eda2a838213fd5e4114ef86d92208321bbf231 /backend/drm
parentc9760569ae380d99df4fb9c7d1f00d0c70f9e580 (diff)
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
Diffstat (limited to 'backend/drm')
-rw-r--r--backend/drm/renderer.c11
1 files 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,