diff options
author | Simon Ser <contact@emersion.fr> | 2020-04-06 11:53:20 +0200 |
---|---|---|
committer | Drew DeVault <sir@cmpwn.com> | 2020-04-08 17:33:00 +0200 |
commit | 507d9bc19e05d3fd4378063ad87f4a74b3dfcfca (patch) | |
tree | e2bf1efa32abf9b3e4b979a512824eb358e20267 /backend/x11 | |
parent | d3bd5f2a7ba83567983c4a53ee6a69c3f8f6b25f (diff) |
Add wlr_output_impl.rollback
Most of the pending output state is not forwarded to the backend prior
to an output commit. For instance, wlr_output_set_mode just stashes the
mode without calling any wlr_output_impl function.
wlr_output_impl.commit is responsible for applying the pending mode.
However, there are exceptions to this rule. The first one is
wlr_output_attach_render. It won't go away before renderer v6 is
complete, because it needs to set the current EGL surface.
The second one is wlr_output_attach_buffer.
wlr_output_impl.attach_buffer is removed in [1].
When wlr_output_rollback is called, all pending state is supposed to be
cleared. This works for all the state except the two exceptions
mentionned above. To fix this, introduce wlr_output_impl.rollback.
Right now, the backend resets the current EGL surface. This prevents GL
commands from affecting the output after wlr_output_rollback.
This patch is required for FBO-based outputs to work properly. The
compositor might be using FBOs for its own purposes [2], having leftover
FBO state can have bad consequences.
[1]: https://github.com/swaywm/wlroots/pull/2097
[2]: https://github.com/swaywm/wlroots/pull/2063#issuecomment-597614312
Diffstat (limited to 'backend/x11')
-rw-r--r-- | backend/x11/output.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/backend/x11/output.c b/backend/x11/output.c index 4e016afe..f2b90cd3 100644 --- a/backend/x11/output.c +++ b/backend/x11/output.c @@ -162,11 +162,17 @@ static bool output_commit(struct wlr_output *wlr_output) { return true; } +static void output_rollback(struct wlr_output *wlr_output) { + struct wlr_x11_output *output = get_x11_output_from_output(wlr_output); + wlr_egl_make_current(&output->x11->egl, EGL_NO_SURFACE, NULL); +} + static const struct wlr_output_impl output_impl = { .destroy = output_destroy, .attach_render = output_attach_render, .test = output_test, .commit = output_commit, + .rollback = output_rollback, }; struct wlr_output *wlr_x11_output_create(struct wlr_backend *backend) { |