xserver: Branch 'master' - 2 commits

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Sep 22 19:22:02 UTC 2020


 hw/xwayland/xwayland-glamor-eglstream.c |    1 +
 hw/xwayland/xwayland-glamor-gbm.c       |    3 +++
 hw/xwayland/xwayland-glamor.c           |   31 +++++++++++++++++++++++++++++++
 hw/xwayland/xwayland-glamor.h           |   14 ++++++++++++++
 hw/xwayland/xwayland-present.c          |    5 +----
 hw/xwayland/xwayland-screen.c           |    4 +---
 hw/xwayland/xwayland-window-buffers.c   |    5 +++++
 7 files changed, 56 insertions(+), 7 deletions(-)

New commits:
commit 0b86c0c36241989d7e9662d007c5297fe22ae8b5
Author: Olivier Fourdan <ofourdan at redhat.com>
Date:   Mon Sep 14 14:35:22 2020 +0200

    xwayland: Add a flag for n-buffers in EGL backend
    
    Using multiple window buffers crashes with EGLStream, which does not
    need it anyway as this is handled through EGL directly.
    
    Add a flag to the EGL backend to indicate whether it would benefit from
    multiple buffers and use this in the get_buffer() function.
    
    Thanks to Adam Jackson <ajax at redhat.com> for pointing out that issue
    with EGLStream.
    
    v2: Fix logical test (Adam Jackson <ajax at redhat.com>)
    
    Signed-off-by: Olivier Fourdan <ofourdan at redhat.com>
    Reviewed-by: Adam Jackson <ajax at redhat.com>

diff --git a/hw/xwayland/xwayland-glamor-gbm.c b/hw/xwayland/xwayland-glamor-gbm.c
index 0a76b60a2..802e0f65d 100644
--- a/hw/xwayland/xwayland-glamor-gbm.c
+++ b/hw/xwayland/xwayland-glamor-gbm.c
@@ -1117,5 +1117,6 @@ xwl_glamor_init_gbm(struct xwl_screen *xwl_screen)
     xwl_screen->gbm_backend.get_wl_buffer_for_pixmap = xwl_glamor_gbm_get_wl_buffer_for_pixmap;
     xwl_screen->gbm_backend.is_available = TRUE;
     xwl_screen->gbm_backend.backend_flags = XWL_EGL_BACKEND_HAS_PRESENT_FLIP |
-                                            XWL_EGL_BACKEND_NEEDS_BUFFER_FLUSH;
+                                            XWL_EGL_BACKEND_NEEDS_BUFFER_FLUSH |
+                                            XWL_EGL_BACKEND_NEEDS_N_BUFFERING;
 }
diff --git a/hw/xwayland/xwayland-glamor.c b/hw/xwayland/xwayland-glamor.c
index 3c439f304..9dc7b9b92 100644
--- a/hw/xwayland/xwayland-glamor.c
+++ b/hw/xwayland/xwayland-glamor.c
@@ -196,6 +196,17 @@ xwl_glamor_needs_buffer_flush(struct xwl_screen *xwl_screen)
                 XWL_EGL_BACKEND_NEEDS_BUFFER_FLUSH);
 }
 
+Bool
+xwl_glamor_needs_n_buffering(struct xwl_screen *xwl_screen)
+{
+    /* wl_shm benefits from n-buffering */
+    if (!xwl_screen->glamor || !xwl_screen->egl_backend)
+        return TRUE;
+
+    return (xwl_screen->egl_backend->backend_flags &
+                XWL_EGL_BACKEND_NEEDS_N_BUFFERING);
+}
+
 void
 xwl_glamor_init_backends(struct xwl_screen *xwl_screen, Bool use_eglstream)
 {
diff --git a/hw/xwayland/xwayland-glamor.h b/hw/xwayland/xwayland-glamor.h
index 07b08a828..029b5dbd1 100644
--- a/hw/xwayland/xwayland-glamor.h
+++ b/hw/xwayland/xwayland-glamor.h
@@ -36,6 +36,7 @@ typedef enum _xwl_egl_backend_flags {
     XWL_EGL_BACKEND_NO_FLAG = 0,
     XWL_EGL_BACKEND_HAS_PRESENT_FLIP = (1 << 0),
     XWL_EGL_BACKEND_NEEDS_BUFFER_FLUSH = (1 << 1),
+    XWL_EGL_BACKEND_NEEDS_N_BUFFERING = (1 << 2),
 } xwl_egl_backend_flags;
 
 struct xwl_egl_backend {
@@ -120,6 +121,7 @@ Bool xwl_glamor_allow_commits(struct xwl_window *xwl_window);
 void xwl_glamor_egl_make_current(struct xwl_screen *xwl_screen);
 Bool xwl_glamor_has_present_flip(struct xwl_screen *xwl_screen);
 Bool xwl_glamor_needs_buffer_flush(struct xwl_screen *xwl_screen);
+Bool xwl_glamor_needs_n_buffering(struct xwl_screen *xwl_screen);
 
 
 #ifdef XV
diff --git a/hw/xwayland/xwayland-window-buffers.c b/hw/xwayland/xwayland-window-buffers.c
index d1ae8774f..7336a7fbe 100644
--- a/hw/xwayland/xwayland-window-buffers.c
+++ b/hw/xwayland/xwayland-window-buffers.c
@@ -279,6 +279,11 @@ xwl_window_buffers_get_pixmap(struct xwl_window *xwl_window,
 
     window_pixmap = (*xwl_screen->screen->GetWindowPixmap) (xwl_window->window);
 
+#ifdef XWL_HAS_GLAMOR
+    if (!xwl_glamor_needs_n_buffering(xwl_screen))
+        return window_pixmap;
+#endif /* XWL_HAS_GLAMOR */
+
     xwl_window_buffer = xwl_window_buffer_get_available(xwl_window);
     if (!xwl_window_buffer)
         return window_pixmap;
commit ae84f14fb554e5ad54c51c2e6d52ab4a68bf7a0a
Author: Olivier Fourdan <ofourdan at redhat.com>
Date:   Mon Sep 14 14:26:34 2020 +0200

    xwayland: Add a flag to expose EGL backend features
    
    The present flip does not work with the EGLStream backend. Similarly,
    the EGLStream backend does not require the buffer to be flushed as
    eglSwapBuffers() should take care of this.
    
    Instead of actually checking the backend in use in the present code,
    add a flag in the form of a bitfield to the EGL backend to indicate
    its features and requirements.
    
    This should not introduce any functional change.
    
    v2: Fix logical test (Adam Jackson <ajax at redhat.com>)
    
    Signed-off-by: Olivier Fourdan <ofourdan at redhat.com>
    Reviewed-by: Adam Jackson <ajax at redhat.com>

diff --git a/hw/xwayland/xwayland-glamor-eglstream.c b/hw/xwayland/xwayland-glamor-eglstream.c
index a344c2993..ee7f95b56 100644
--- a/hw/xwayland/xwayland-glamor-eglstream.c
+++ b/hw/xwayland/xwayland-glamor-eglstream.c
@@ -939,4 +939,5 @@ xwl_glamor_init_eglstream(struct xwl_screen *xwl_screen)
     xwl_screen->eglstream_backend.post_damage = xwl_glamor_eglstream_post_damage;
     xwl_screen->eglstream_backend.allow_commits = xwl_glamor_eglstream_allow_commits;
     xwl_screen->eglstream_backend.is_available = TRUE;
+    xwl_screen->eglstream_backend.backend_flags = XWL_EGL_BACKEND_NO_FLAG;
 }
diff --git a/hw/xwayland/xwayland-glamor-gbm.c b/hw/xwayland/xwayland-glamor-gbm.c
index 396188070..0a76b60a2 100644
--- a/hw/xwayland/xwayland-glamor-gbm.c
+++ b/hw/xwayland/xwayland-glamor-gbm.c
@@ -1116,4 +1116,6 @@ xwl_glamor_init_gbm(struct xwl_screen *xwl_screen)
     xwl_screen->gbm_backend.init_screen = xwl_glamor_gbm_init_screen;
     xwl_screen->gbm_backend.get_wl_buffer_for_pixmap = xwl_glamor_gbm_get_wl_buffer_for_pixmap;
     xwl_screen->gbm_backend.is_available = TRUE;
+    xwl_screen->gbm_backend.backend_flags = XWL_EGL_BACKEND_HAS_PRESENT_FLIP |
+                                            XWL_EGL_BACKEND_NEEDS_BUFFER_FLUSH;
 }
diff --git a/hw/xwayland/xwayland-glamor.c b/hw/xwayland/xwayland-glamor.c
index d9523b0a7..3c439f304 100644
--- a/hw/xwayland/xwayland-glamor.c
+++ b/hw/xwayland/xwayland-glamor.c
@@ -176,6 +176,26 @@ glamor_egl_fd_name_from_pixmap(ScreenPtr screen,
     return 0;
 }
 
+Bool
+xwl_glamor_has_present_flip(struct xwl_screen *xwl_screen)
+{
+    if (!xwl_screen->glamor || !xwl_screen->egl_backend)
+        return FALSE;
+
+    return (xwl_screen->egl_backend->backend_flags &
+                XWL_EGL_BACKEND_HAS_PRESENT_FLIP);
+}
+
+Bool
+xwl_glamor_needs_buffer_flush(struct xwl_screen *xwl_screen)
+{
+    if (!xwl_screen->glamor || !xwl_screen->egl_backend)
+        return FALSE;
+
+    return (xwl_screen->egl_backend->backend_flags &
+                XWL_EGL_BACKEND_NEEDS_BUFFER_FLUSH);
+}
+
 void
 xwl_glamor_init_backends(struct xwl_screen *xwl_screen, Bool use_eglstream)
 {
diff --git a/hw/xwayland/xwayland-glamor.h b/hw/xwayland/xwayland-glamor.h
index e9896bfef..07b08a828 100644
--- a/hw/xwayland/xwayland-glamor.h
+++ b/hw/xwayland/xwayland-glamor.h
@@ -32,10 +32,19 @@
 
 #include "xwayland-types.h"
 
+typedef enum _xwl_egl_backend_flags {
+    XWL_EGL_BACKEND_NO_FLAG = 0,
+    XWL_EGL_BACKEND_HAS_PRESENT_FLIP = (1 << 0),
+    XWL_EGL_BACKEND_NEEDS_BUFFER_FLUSH = (1 << 1),
+} xwl_egl_backend_flags;
+
 struct xwl_egl_backend {
     /* Set by the backend if available */
     Bool is_available;
 
+    /* Features and requirements set by the backend */
+    xwl_egl_backend_flags backend_flags;
+
     /* Called once for each interface in the global registry. Backends
      * should use this to bind to any wayland interfaces they need.
      */
@@ -109,6 +118,9 @@ void xwl_glamor_post_damage(struct xwl_window *xwl_window,
                             PixmapPtr pixmap, RegionPtr region);
 Bool xwl_glamor_allow_commits(struct xwl_window *xwl_window);
 void xwl_glamor_egl_make_current(struct xwl_screen *xwl_screen);
+Bool xwl_glamor_has_present_flip(struct xwl_screen *xwl_screen);
+Bool xwl_glamor_needs_buffer_flush(struct xwl_screen *xwl_screen);
+
 
 #ifdef XV
 /* glamor Xv Adaptor */
diff --git a/hw/xwayland/xwayland-present.c b/hw/xwayland/xwayland-present.c
index afcd03187..d36b47149 100644
--- a/hw/xwayland/xwayland-present.c
+++ b/hw/xwayland/xwayland-present.c
@@ -540,10 +540,7 @@ xwl_present_init(ScreenPtr screen)
 {
     struct xwl_screen *xwl_screen = xwl_screen_get(screen);
 
-    /*
-     * doesn't work with the EGLStream backend.
-     */
-    if (xwl_screen->egl_backend == &xwl_screen->eglstream_backend)
+    if (!xwl_glamor_has_present_flip(xwl_screen))
         return FALSE;
 
     if (!dixRegisterPrivateKey(&xwl_present_window_private_key, PRIVATE_WINDOW, 0))
diff --git a/hw/xwayland/xwayland-screen.c b/hw/xwayland/xwayland-screen.c
index 92643c0ed..bc6751be7 100644
--- a/hw/xwayland/xwayland-screen.c
+++ b/hw/xwayland/xwayland-screen.c
@@ -330,10 +330,8 @@ xwl_screen_post_damage(struct xwl_screen *xwl_screen)
         return;
 
 #ifdef XWL_HAS_GLAMOR
-    if (xwl_screen->glamor &&
-        xwl_screen->egl_backend == &xwl_screen->gbm_backend) {
+    if (xwl_glamor_needs_buffer_flush(xwl_screen))
         glamor_block_handler(xwl_screen->screen);
-    }
 #endif
 
     xorg_list_for_each_entry_safe(xwl_window, next_xwl_window,


More information about the xorg-commit mailing list