Skip to content

platforms/drm: check wl_eglstream buffers before attaching

Erik Kurzinger requested to merge ekurzinger/kwin:wayland-eglstream-fix into master

If a wl_eglstream buffer is attached to a surface, but then later a different type of buffer, such as a dmabuf, is attached to the same surface, kwin will mistakenly keep trying to acquire frames from the EGLStream associated with the previous buffer. This can happen if an Xwayland window is made full-screen causing it to switch to the flipping presentation path, for instance. The result is that the window contents will no longer be updated.

Instead, the eglstream backend's loadTexture and updateTexture functions should first pass the buffer to eglCreateStreamAttribNV. If it fails with EGL_BAD_STREAM_KHR, that indicates it is indeed a wl_eglstream, and that we've already associated a server-side EGLStream with it in attachStreamConsumer, so we can proceed as usual. If it fails with EGL_BAD_ACCESS, though, that indicates it is not a wl_eglstream and we should fall back to the parent class which handles attaching other buffer types. If it doesn't fail at all, that means the client tried to attach a new wl_eglstream to a surface without first attaching the stream consumer. There's not really a great way to handle this, so just re-use the previous EGLStream.

Merge request reports