xserver: Branch 'master' - 2 commits

Lyude lyudess at kemper.freedesktop.org
Wed Jun 27 19:09:30 UTC 2018


 glamor/glamor.c                   |   56 ++++++++++++++++++++++----------------
 glamor/glamor.h                   |    3 +-
 glamor/glamor_egl.c               |    2 -
 glamor/glamor_egl_stubs.c         |    7 ++++
 hw/xwayland/xwayland-glamor-gbm.c |   10 ++++++
 randr/rrcrtc.c                    |    1 
 6 files changed, 54 insertions(+), 25 deletions(-)

New commits:
commit dc90b1c3c328f1d0b022a234b69ef32bda7ccb01
Author: Lyude Paul <lyude at redhat.com>
Date:   Wed Jun 20 19:12:32 2018 -0400

    randr: Scream when creating a shared pixmap fails
    
    This seems like a problem worth screaming about.
    
    Signed-off-by: Lyude Paul <lyude at redhat.com>
    Reviewed-by: Dave Airlie <airlied at redhat.com>

diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
index d7d937e80..74dc5a265 100644
--- a/randr/rrcrtc.c
+++ b/randr/rrcrtc.c
@@ -534,6 +534,7 @@ rrSetupPixmapSharing(RRCrtcPtr crtc, int width, int height,
                                       width, height, depth,
                                       x, y, rotation);
     if (spix_front == NULL) {
+        ErrorF("randr: failed to create shared pixmap\n");
         return FALSE;
     }
 
commit 186a21c4bac744ffe645c8d1a6dda2d41c6d33d8
Author: Lyude Paul <lyude at redhat.com>
Date:   Wed Jun 20 19:12:31 2018 -0400

    glamor: Unbreak glamor_fd_from_pixmap()
    
    When support for allocating GBM BOs with modifiers was added,
    glamor_fd_from_pixmap() was changed so that it would return an error if
    it got a bo with modifiers set from glamor_fds_from_pixmap(). The
    problem is that on systems that support BOs with modifiers,
    glamor_fds_from_pixmap() will always return BOs with modifiers.
    
    This means that glamor_fd_from_pixmap() was broken entirely, which broke
    a number of other things including glamor_shareable_fd_from_pixmap(),
    which meant that modesetting using multiple GPUs with the modesetting
    DDX was also broken. Easy reproducer:
    
    - Find a laptop with DRI prime that has outputs connected to the
      dedicated GPU and integrated GPU
    - Try to enable one display on each using the modesetting DDX
    - Fail
    
    Since there isn't a way to ask for no modifiers from
    glamor_fds_from_pixmap, we create a shared _glamor_fds_from_pixmap()
    function used by both glamor_fds_from_pixmap() and
    glamor_fd_from_pixmap() that calls down to the appropriate
    glamor_egl_fd*_from_pixmap() function.
    
    Signed-off-by: Lyude Paul <lyude at redhat.com>
    Reviewed-by: Dave Airlie <airlied at redhat.com>
    Cc: Louis-Francis Ratté-Boulianne <lfrb at collabora.com>
    Fixes: c8c276c956 ("glamor: Implement PixmapFromBuffers and BuffersFromPixmap")

diff --git a/glamor/glamor.c b/glamor/glamor.c
index 54ca0db35..9bf1707de 100644
--- a/glamor/glamor.c
+++ b/glamor/glamor.c
@@ -826,10 +826,10 @@ glamor_get_drawable_modifiers(DrawablePtr draw, uint32_t format,
     return TRUE;
 }
 
-_X_EXPORT int
-glamor_fds_from_pixmap(ScreenPtr screen, PixmapPtr pixmap, int *fds,
-                       uint32_t *strides, uint32_t *offsets,
-                       uint64_t *modifier)
+static int
+_glamor_fds_from_pixmap(ScreenPtr screen, PixmapPtr pixmap, int *fds,
+                        uint32_t *strides, uint32_t *offsets,
+                        CARD32 *size, uint64_t *modifier)
 {
     glamor_pixmap_private *pixmap_priv = glamor_get_pixmap_private(pixmap);
     glamor_screen_private *glamor_priv =
@@ -843,9 +843,19 @@ glamor_fds_from_pixmap(ScreenPtr screen, PixmapPtr pixmap, int *fds,
         if (!glamor_pixmap_ensure_fbo(pixmap, pixmap->drawable.depth == 30 ?
                                       GL_RGB10_A2 : GL_RGBA, 0))
             return 0;
-        return glamor_egl_fds_from_pixmap(screen, pixmap, fds,
-                                          strides, offsets,
-                                          modifier);
+
+        if (modifier) {
+            return glamor_egl_fds_from_pixmap(screen, pixmap, fds,
+                                              strides, offsets,
+                                              modifier);
+        } else {
+            CARD16 stride;
+
+            fds[0] = glamor_egl_fd_from_pixmap(screen, pixmap, &stride, size);
+            strides[0] = stride;
+
+            return fds[0] >= 0;
+        }
     default:
         break;
     }
@@ -853,29 +863,29 @@ glamor_fds_from_pixmap(ScreenPtr screen, PixmapPtr pixmap, int *fds,
 }
 
 _X_EXPORT int
+glamor_fds_from_pixmap(ScreenPtr screen, PixmapPtr pixmap, int *fds,
+                       uint32_t *strides, uint32_t *offsets,
+                       uint64_t *modifier)
+{
+    return _glamor_fds_from_pixmap(screen, pixmap, fds, strides, offsets,
+                                   NULL, modifier);
+}
+
+_X_EXPORT int
 glamor_fd_from_pixmap(ScreenPtr screen,
                       PixmapPtr pixmap, CARD16 *stride, CARD32 *size)
 {
+    int fd;
     int ret;
-    int fds[4];
-    uint32_t strides[4], offsets[4];
-    uint64_t modifier;
-
-    ret = glamor_fds_from_pixmap(screen, pixmap, fds, strides, offsets,
-                                 &modifier);
+    uint32_t stride32;
 
-    /* Pixmaps with multi-planes/modifier are not supported in this interface */
-    if (ret != 1 || offsets[0] != 0) {
-        while (ret > 0)
-            close(fds[--ret]);
+    ret = _glamor_fds_from_pixmap(screen, pixmap, &fd, &stride32, NULL, size,
+                                  NULL);
+    if (ret != 1)
         return -1;
-    }
 
-    ret = fds[0];
-    *stride = strides[0];
-    *size = pixmap->drawable.height * *stride;
-
-    return ret;
+    *stride = stride32;
+    return fd;
 }
 
 _X_EXPORT int
diff --git a/glamor/glamor.h b/glamor/glamor.h
index 06e11506f..09e9c895c 100644
--- a/glamor/glamor.h
+++ b/glamor/glamor.h
@@ -141,7 +141,7 @@ extern _X_EXPORT void glamor_egl_exchange_buffers(PixmapPtr front,
 extern _X_EXPORT void glamor_pixmap_exchange_fbos(PixmapPtr front,
                                                   PixmapPtr back);
 
-/* The DDX is not supposed to call these three functions */
+/* The DDX is not supposed to call these four functions */
 extern _X_EXPORT void glamor_enable_dri3(ScreenPtr screen);
 extern _X_EXPORT int glamor_egl_fds_from_pixmap(ScreenPtr, PixmapPtr, int *,
                                                 uint32_t *, uint32_t *,
@@ -150,6 +150,7 @@ extern _X_EXPORT int glamor_egl_fd_name_from_pixmap(ScreenPtr, PixmapPtr,
                                                     CARD16 *, CARD32 *);
 
 extern _X_EXPORT struct gbm_device *glamor_egl_get_gbm_device(ScreenPtr screen);
+extern _X_EXPORT int glamor_egl_fd_from_pixmap(ScreenPtr, PixmapPtr, CARD16 *, CARD32 *);
 
 /* @glamor_supports_pixmap_import_export: Returns whether
  * glamor_fds_from_pixmap(), glamor_name_from_pixmap(), and
diff --git a/glamor/glamor_egl.c b/glamor/glamor_egl.c
index 4a4ca4bd8..5a3b7f193 100644
--- a/glamor/glamor_egl.c
+++ b/glamor/glamor_egl.c
@@ -402,7 +402,7 @@ glamor_egl_fds_from_pixmap(ScreenPtr screen, PixmapPtr pixmap, int *fds,
 #endif
 }
 
-static int
+_X_EXPORT int
 glamor_egl_fd_from_pixmap(ScreenPtr screen, PixmapPtr pixmap,
                           CARD16 *stride, CARD32 *size)
 {
diff --git a/glamor/glamor_egl_stubs.c b/glamor/glamor_egl_stubs.c
index aae909e9f..91ab9a7ae 100644
--- a/glamor/glamor_egl_stubs.c
+++ b/glamor/glamor_egl_stubs.c
@@ -51,3 +51,10 @@ glamor_egl_fds_from_pixmap(ScreenPtr screen, PixmapPtr pixmap, int *fds,
 {
     return 0;
 }
+
+int
+glamor_egl_fd_from_pixmap(ScreenPtr screen, PixmapPtr pixmap,
+                          CARD16 *stride, CARD32 *size)
+{
+    return -1;
+}
diff --git a/hw/xwayland/xwayland-glamor-gbm.c b/hw/xwayland/xwayland-glamor-gbm.c
index 42d758e93..06fcf5239 100644
--- a/hw/xwayland/xwayland-glamor-gbm.c
+++ b/hw/xwayland/xwayland-glamor-gbm.c
@@ -517,6 +517,16 @@ glamor_egl_fds_from_pixmap(ScreenPtr screen, PixmapPtr pixmap, int *fds,
 #endif
 }
 
+/* Not actually used, just defined here so there's something for
+ * _glamor_egl_fds_from_pixmap() to link against
+ */
+_X_EXPORT int
+glamor_egl_fd_from_pixmap(ScreenPtr screen, PixmapPtr pixmap,
+                          CARD16 *stride, CARD32 *size)
+{
+    return -1;
+}
+
 _X_EXPORT Bool
 glamor_get_formats(ScreenPtr screen,
                    CARD32 *num_formats, CARD32 **formats)


More information about the xorg-commit mailing list