xserver: Branch 'master' - 6 commits

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Nov 10 09:54:42 UTC 2023


 glamor/glamor.c                   |   26 +++++++++++++++
 glamor/glamor.h                   |    6 +++
 glamor/glamor_egl.c               |   28 +++++++++++++++++
 glamor/glamor_egl_stubs.c         |   60 ------------------------------------
 glamor/glamor_glx_provider.c      |   51 ++++++++++++++-----------------
 glamor/glamor_glx_provider.h      |    4 +-
 glamor/glamor_priv.h              |    1 
 glamor/meson.build                |   11 ++----
 hw/kdrive/ephyr/ephyr_glamor.c    |   62 ++++++++++++++++++++++++++++++++++++++
 hw/kdrive/ephyr/hostx.c           |   56 ++++++++++++++++++++++++++++++++++
 hw/kdrive/ephyr/meson.build       |    2 -
 hw/xfree86/glamor_egl/meson.build |    2 -
 hw/xwayland/meson.build           |    4 --
 hw/xwayland/xwayland-glamor.c     |    3 +
 14 files changed, 212 insertions(+), 104 deletions(-)

New commits:
commit 8252b110f3db193217cdf7229d2bb466f5baa0f7
Author: Konstantin Pugin <ria.freelander at gmail.com>
Date:   Mon Aug 1 15:24:10 2022 +0300

    Xephyr: use glamor glx provider
    
    Xephyr now gained an ability to use glamor glx provider.
    Unfortunately, without DRI3, we end up with same llvmpipe as before
    
    Signed-off-by: Konstantin Pugin <ria.freelander at gmail.com>

diff --git a/glamor/glamor_egl_stubs.c b/glamor/glamor_egl_stubs.c
deleted file mode 100644
index 91ab9a7ae..000000000
--- a/glamor/glamor_egl_stubs.c
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright © 2013 Intel Corporation
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-/** @file glamor_egl_stubs.c
- *
- * Stubbed out glamor_egl.c functions for servers other than Xorg.
- */
-
-#include "dix-config.h"
-
-#include "glamor.h"
-
-void
-glamor_egl_screen_init(ScreenPtr screen, struct glamor_context *glamor_ctx)
-{
-}
-
-int
-glamor_egl_fd_name_from_pixmap(ScreenPtr screen,
-                               PixmapPtr pixmap,
-                               CARD16 *stride, CARD32 *size)
-{
-    return -1;
-}
-
-
-int
-glamor_egl_fds_from_pixmap(ScreenPtr screen, PixmapPtr pixmap, int *fds,
-                           uint32_t *offsets, uint32_t *strides,
-                           uint64_t *modifier)
-{
-    return 0;
-}
-
-int
-glamor_egl_fd_from_pixmap(ScreenPtr screen, PixmapPtr pixmap,
-                          CARD16 *stride, CARD32 *size)
-{
-    return -1;
-}
diff --git a/glamor/meson.build b/glamor/meson.build
index d4cb1859a..2ae522aec 100644
--- a/glamor/meson.build
+++ b/glamor/meson.build
@@ -51,12 +51,6 @@ glamor = static_library('glamor',
     ],
 )
 
-glamor_egl_stubs = static_library('glamor_egl_stubs',
-    'glamor_egl_stubs.c',
-    include_directories: inc,
-    dependencies: common_dep,
-)
-
 if build_xorg
     install_data('glamor.h', install_dir: xorgsdkdir)
 endif
diff --git a/hw/kdrive/ephyr/ephyr_glamor.c b/hw/kdrive/ephyr/ephyr_glamor.c
index 724611d69..772b73052 100644
--- a/hw/kdrive/ephyr/ephyr_glamor.c
+++ b/hw/kdrive/ephyr/ephyr_glamor.c
@@ -25,14 +25,18 @@
  *
  * Glamor support and EGL setup.
  */
+#define MESA_EGL_NO_X11_HEADERS
+#define EGL_NO_X11
 
 #include <stdlib.h>
 #include <stdint.h>
 #include <xcb/xcb.h>
 #include <xcb/xcb_aux.h>
 #include <pixman.h>
+#include "glamor_context.h"
 #include "glamor_egl.h"
 #include "glamor_priv.h"
+#include "ephyr.h"
 #include "ephyr_glamor.h"
 #include "os.h"
 
@@ -69,6 +73,64 @@ struct ephyr_glamor {
     GLuint vao, vbo;
 };
 
+static void
+glamor_egl_make_current(struct glamor_context *glamor_ctx)
+{
+    /* There's only a single global dispatch table in Mesa.  EGL, GLX,
+     * and AIGLX's direct dispatch table manipulation don't talk to
+     * each other.  We need to set the context to NULL first to avoid
+     * EGL's no-op context change fast path when switching back to
+     * EGL.
+     */
+    eglMakeCurrent(glamor_ctx->display, EGL_NO_SURFACE,
+                   EGL_NO_SURFACE, EGL_NO_CONTEXT);
+
+    if (!eglMakeCurrent(glamor_ctx->display,
+                        glamor_ctx->surface, glamor_ctx->surface,
+                        glamor_ctx->ctx)) {
+        FatalError("Failed to make EGL context current\n");
+    }
+}
+
+void
+glamor_egl_screen_init(ScreenPtr screen, struct glamor_context *glamor_ctx)
+{
+    KdScreenPriv(screen);
+    KdScreenInfo *kd_screen = pScreenPriv->screen;
+    EphyrScrPriv *scrpriv = kd_screen->driver;
+    struct ephyr_glamor *ephyr_glamor = scrpriv->glamor;
+
+    glamor_enable_dri3(screen);
+    glamor_ctx->display = ephyr_glamor->dpy;
+    glamor_ctx->ctx = ephyr_glamor->ctx;
+    glamor_ctx->surface = ephyr_glamor->egl_win;
+    glamor_ctx->make_current = glamor_egl_make_current;
+}
+
+int
+glamor_egl_fd_name_from_pixmap(ScreenPtr screen,
+                               PixmapPtr pixmap,
+                               CARD16 *stride, CARD32 *size)
+{
+    return -1;
+}
+
+
+int
+glamor_egl_fds_from_pixmap(ScreenPtr screen, PixmapPtr pixmap, int *fds,
+                           uint32_t *offsets, uint32_t *strides,
+                           uint64_t *modifier)
+{
+    return 0;
+}
+
+int
+glamor_egl_fd_from_pixmap(ScreenPtr screen, PixmapPtr pixmap,
+                          CARD16 *stride, CARD32 *size)
+{
+    return -1;
+}
+
 static GLuint
 ephyr_glamor_build_glsl_prog(GLuint vs, GLuint fs)
 {
diff --git a/hw/kdrive/ephyr/hostx.c b/hw/kdrive/ephyr/hostx.c
index 1dc14be38..5baa3e781 100644
--- a/hw/kdrive/ephyr/hostx.c
+++ b/hw/kdrive/ephyr/hostx.c
@@ -43,6 +43,8 @@
 #include <sys/time.h>
 #include <sys/mman.h>
 
+#define X_INCLUDE_STRING_H
+#include <X11/Xos_r.h>
 #include <X11/keysym.h>
 #include <xcb/xcb.h>
 #include <xcb/xproto.h>
@@ -55,8 +57,11 @@
 #include <xcb/randr.h>
 #include <xcb/xkb.h>
 #ifdef GLAMOR
+#include <xcb/glx.h>
+#include <epoxy/common.h>
 #include <epoxy/gl.h>
 #include "glamor.h"
+#include "glamor_glx_provider.h"
 #include "ephyr_glamor.h"
 #endif
 #include "ephyrlog.h"
@@ -83,6 +88,7 @@ struct EphyrHostXVars {
 
     long damage_debug_msec;
     Bool size_set_from_configure;
+    char *glvnd_vendor;
 };
 
 /* memset ( missing> ) instead of below  */
@@ -1551,12 +1557,50 @@ out:
 }
 
 #ifdef GLAMOR
+
+#ifndef GLX_EXTENSIONS
+#define GLX_EXTENSIONS          3
+#endif
+
+#ifndef GLX_VENDOR_NAMES_EXT
+#define GLX_VENDOR_NAMES_EXT 0x20F6
+#endif
+
+/**
+ * Exchange a protocol request for glXQueryServerString.
+ */
+static char *
+__glXQueryServerString(CARD32 name)
+{
+    xcb_glx_query_server_string_cookie_t cookie;
+    xcb_glx_query_server_string_reply_t *reply;
+    uint32_t len;
+    char *str;
+    char *buf;
+
+    cookie = xcb_glx_query_server_string(HostX.conn, HostX.screen, name);
+    reply = xcb_glx_query_server_string_reply(HostX.conn, cookie, NULL);
+    str = xcb_glx_query_server_string_string(reply);
+
+    /* The spec doesn't mention this, but the Xorg server replies with
+     * a string already terminated with '\0'. */
+    len = xcb_glx_query_server_string_string_length(reply);
+    buf = xnfalloc(len);
+    memcpy(buf, str, len);
+    free(reply);
+
+    return buf;
+}
+
 Bool
 ephyr_glamor_init(ScreenPtr screen)
 {
     KdScreenPriv(screen);
     KdScreenInfo *kd_screen = pScreenPriv->screen;
     EphyrScrPriv *scrpriv = kd_screen->driver;
+    char *hostx_glx_exts = NULL;
+    char *glvnd_vendors = NULL;
+    _Xstrtokparams saveptr;
 
     scrpriv->glamor = ephyr_glamor_screen_init(scrpriv->win, scrpriv->vid);
     ephyr_glamor_set_window_size(scrpriv->glamor,
@@ -1566,6 +1610,18 @@ ephyr_glamor_init(ScreenPtr screen)
         FatalError("Failed to initialize glamor\n");
         return FALSE;
     }
+    hostx_glx_exts = __glXQueryServerString(GLX_EXTENSIONS);
+    if (epoxy_extension_in_string(hostx_glx_exts,"GLX_EXT_libglvnd"))
+        glvnd_vendors = __glXQueryServerString(GLX_VENDOR_NAMES_EXT);
+
+    if (glvnd_vendors) {
+        HostX.glvnd_vendor = _XStrtok(glvnd_vendors, " ", saveptr);
+        glamor_set_glvnd_vendor(screen, HostX.glvnd_vendor);
+        free(glvnd_vendors);
+    }
+    free(hostx_glx_exts);
+
+    GlxPushProvider(&glamor_provider);
 
     return TRUE;
 }
diff --git a/hw/kdrive/ephyr/meson.build b/hw/kdrive/ephyr/meson.build
index dff1dfb68..148b82cef 100644
--- a/hw/kdrive/ephyr/meson.build
+++ b/hw/kdrive/ephyr/meson.build
@@ -28,8 +28,8 @@ if build_glamor
         srcs += 'ephyr_glamor_xv.c'
     endif
     xephyr_glamor += glamor
-    xephyr_glamor += glamor_egl_stubs
     xephyr_dep += epoxy_dep
+    xephyr_dep += dependency('xcb-glx')
 endif
 
 if build_xv
commit a449bb4c5dbb569d151e0d714b0ef3eab4074b67
Author: Konstantin <ria.freelander at gmail.com>
Date:   Tue Oct 10 17:36:50 2023 +0300

    glamor_egl: add support of GlxVendorLibrary option
    
    Same semantics as in glxdri2.c, and same purpose.
    
    Signed-off-by: Konstantin <ria.freelander at gmail.com>

diff --git a/glamor/glamor_egl.c b/glamor/glamor_egl.c
index 8ccca1402..5382eb2bc 100644
--- a/glamor/glamor_egl.c
+++ b/glamor/glamor_egl.c
@@ -59,6 +59,7 @@ struct glamor_egl_screen_private {
     int fd;
     struct gbm_device *gbm;
     int dmabuf_capable;
+    Bool force_vendor; /* if GLVND vendor is forced from options */
 
     CloseScreenProcPtr saved_close_screen;
     DestroyPixmapProcPtr saved_destroy_pixmap;
@@ -904,10 +905,13 @@ glamor_egl_screen_init(ScreenPtr screen, struct glamor_context *glamor_ctx)
 
     glamor_ctx->make_current = glamor_egl_make_current;
 
-    gbm_backend_name = gbm_device_get_backend_name(glamor_egl->gbm);
-    /* Mesa uses "drm" as backend name, in that case, just do nothing */
-    if (gbm_backend_name && strcmp(gbm_backend_name, "drm") != 0)
-        glamor_set_glvnd_vendor(screen, gbm_backend_name);
+    /* Use dynamic logic only if vendor is not forced via xorg.conf */
+    if (!glamor_egl->force_vendor) {
+        gbm_backend_name = gbm_device_get_backend_name(glamor_egl->gbm);
+        /* Mesa uses "drm" as backend name, in that case, just do nothing */
+        if (gbm_backend_name && strcmp(gbm_backend_name, "drm") != 0)
+            glamor_set_glvnd_vendor(screen, gbm_backend_name);
+    }
 #ifdef DRI3
     /* Tell the core that we have the interfaces for import/export
      * of pixmaps.
@@ -1061,10 +1065,12 @@ glamor_egl_try_gles_api(ScrnInfoPtr scrn)
 
 enum {
     GLAMOREGLOPT_RENDERING_API,
+    GLAMOREGLOPT_VENDOR_LIBRARY
 };
 
 static const OptionInfoRec GlamorEGLOptions[] = {
     { GLAMOREGLOPT_RENDERING_API, "RenderingAPI", OPTV_STRING, {0}, FALSE },
+    { GLAMOREGLOPT_VENDOR_LIBRARY, "GlxVendorLibrary", OPTV_STRING, {0}, FALSE },
     { -1, NULL, OPTV_NONE, {0}, FALSE },
 };
 
@@ -1077,6 +1083,7 @@ glamor_egl_init(ScrnInfoPtr scrn, int fd)
     const char *api = NULL;
     Bool es_allowed = TRUE;
     Bool force_es = FALSE;
+    const char *glvnd_vendor = NULL;
 
     glamor_egl = calloc(sizeof(*glamor_egl), 1);
     if (glamor_egl == NULL)
@@ -1087,6 +1094,11 @@ glamor_egl_init(ScrnInfoPtr scrn, int fd)
     options = xnfalloc(sizeof(GlamorEGLOptions));
     memcpy(options, GlamorEGLOptions, sizeof(GlamorEGLOptions));
     xf86ProcessOptions(scrn->scrnIndex, scrn->options, options);
+    glvnd_vendor = xf86GetOptValString(options, GLAMOREGLOPT_VENDOR_LIBRARY);
+    if (glvnd_vendor) {
+        glamor_set_glvnd_vendor(xf86ScrnToScreen(scrn), glvnd_vendor);
+        glamor_egl->force_vendor = TRUE;
+    }
     api = xf86GetOptValString(options, GLAMOREGLOPT_RENDERING_API);
     if (api && !strncasecmp(api, "es", 2))
         force_es = TRUE;
commit a987fc7c360fa1c59efa0dde61316d84c171801b
Author: Konstantin Pugin <ria.freelander at gmail.com>
Date:   Thu Jul 21 00:49:13 2022 +0300

    xorg: initialize glamor provider
    
    This allows Xorg to use Glamor GLX when Glamor is requested,
    and eliminates usage of DRI2 in case of Glamor.
    
    Signed-off-by: Konstantin Pugin <ria.freelander at gmail.com>
    Reviewed-by: Adam Jackson <ajax at redhat.com>
    Acked-by: Emma Anholt <emma at anholt.net>

diff --git a/glamor/glamor_egl.c b/glamor/glamor_egl.c
index c1142e34d..8ccca1402 100644
--- a/glamor/glamor_egl.c
+++ b/glamor/glamor_egl.c
@@ -46,6 +46,7 @@
 
 #include "glamor.h"
 #include "glamor_priv.h"
+#include "glamor_glx_provider.h"
 #include "dri3.h"
 
 struct glamor_egl_screen_private {
@@ -886,6 +887,9 @@ glamor_egl_screen_init(ScreenPtr screen, struct glamor_context *glamor_ctx)
         glamor_egl_get_screen_private(scrn);
 #ifdef DRI3
     glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
+#endif
+#ifdef GLXEXT
+    static Bool vendor_initialized = FALSE;
 #endif
     const char *gbm_backend_name;
 
@@ -927,6 +931,13 @@ glamor_egl_screen_init(ScreenPtr screen, struct glamor_context *glamor_ctx)
         }
     }
 #endif
+#ifdef GLXEXT
+    if (!vendor_initialized) {
+        GlxPushProvider(&glamor_provider);
+        xorgGlxCreateVendor();
+        vendor_initialized = TRUE;
+    }
+#endif
 }
 
 static void glamor_egl_cleanup(struct glamor_egl_screen_private *glamor_egl)
diff --git a/hw/xfree86/glamor_egl/meson.build b/hw/xfree86/glamor_egl/meson.build
index 7eae05812..dd1cafcd9 100644
--- a/hw/xfree86/glamor_egl/meson.build
+++ b/hw/xfree86/glamor_egl/meson.build
@@ -15,7 +15,7 @@ shared_module(
         dependency('libdrm', version: '>= 2.4.46'),
         gbm_dep,
     ],
-    link_with: glamor,
+    link_with: [glamor, libxserver_glx],
 
     install: true,
     install_dir: module_dir,
commit a563f530f637badd485727f6cdfc7972654133ca
Author: Adam Jackson <ajax at redhat.com>
Date:   Fri Feb 25 13:41:41 2022 -0500

    glamor/glxprov: Stop exposing non-db(-capable) configs

diff --git a/glamor/glamor_glx_provider.c b/glamor/glamor_glx_provider.c
index 77ccc3c8b..8a8239f68 100644
--- a/glamor/glamor_glx_provider.c
+++ b/glamor/glamor_glx_provider.c
@@ -142,8 +142,7 @@ egl_create_glx_drawable(ClientPtr client, __GLXscreen *screen,
 static struct egl_config *
 translate_eglconfig(struct egl_screen *screen, EGLConfig hc,
                     struct egl_config *chain, Bool direct_color,
-                    Bool double_buffer, Bool duplicate_for_composite,
-                    Bool srgb_only)
+                    Bool duplicate_for_composite, Bool srgb_only)
 {
     EGLint value;
     struct egl_config *c = calloc(1, sizeof *c);
@@ -191,10 +190,8 @@ translate_eglconfig(struct egl_screen *screen, EGLConfig hc,
     else
         c->base.visualType = GLX_TRUE_COLOR;
 
-    if (double_buffer)
-        c->base.doubleBufferMode = GL_TRUE;
-    else
-        c->base.doubleBufferMode = GL_FALSE;
+    /* We choose not to implement front-buffer-only configs */
+    c->base.doubleBufferMode = GL_TRUE;
 
     /* direct-mapped state */
 #define GET(attr, slot) \
@@ -320,7 +317,7 @@ translate_eglconfig(struct egl_screen *screen, EGLConfig hc,
 static __GLXconfig *
 egl_mirror_configs(ScreenPtr pScreen, struct egl_screen *screen)
 {
-    int i, j, k, nconfigs;
+    int i, j, nconfigs;
     struct egl_config *c = NULL;
     EGLConfig *host_configs = NULL;
     bool can_srgb = epoxy_has_gl_extension("GL_ARB_framebuffer_sRGB") ||
@@ -337,21 +334,18 @@ egl_mirror_configs(ScreenPtr pScreen, struct egl_screen *screen)
      * ->next chain easier.
      */
     for (i = nconfigs - 1; i >= 0; i--)
-        for (j = 0; j < 3; j++) /* direct_color */
-            for (k = 0; k < 2; k++) /* double_buffer */ {
-                if (can_srgb)
-                    c = translate_eglconfig(screen, host_configs[i], c,
-                                            /* direct_color */ j == 1,
-                                            /* double_buffer */ k > 0,
-                                            /* duplicate_for_composite */ j == 0,
-                                            /* srgb_only */ true);
-
+        for (j = 0; j < 3; j++) { /* direct_color */
+            if (can_srgb)
                 c = translate_eglconfig(screen, host_configs[i], c,
                                         /* direct_color */ j == 1,
-                                        /* double_buffer */ k > 0,
                                         /* duplicate_for_composite */ j == 0,
-                                        /* srgb_only */ false);
-            }
+                                        /* srgb_only */ true);
+
+            c = translate_eglconfig(screen, host_configs[i], c,
+                                    /* direct_color */ j == 1,
+                                    /* duplicate_for_composite */ j == 0,
+                                    /* srgb_only */ false);
+        }
 
     screen->configs = host_configs;
     return c ? &c->base : NULL;
commit 58b88ba0b180ec8d05c85c80eef2d224fb0a6daf
Author: Adam Jackson <ajax at redhat.com>
Date:   Wed Aug 26 18:22:22 2020 -0400

    glamor: Lift the GLX EGL backend from Xwayland
    
    This code is almost entirely ddx-agnostic already, and I'd like to use
    it from the other EGL glamor consumers. Which, right now that's just
    Xorg, but soon it'll be Xephyr too.

diff --git a/hw/xwayland/xwayland-glx.c b/glamor/glamor_glx_provider.c
similarity index 97%
rename from hw/xwayland/xwayland-glx.c
rename to glamor/glamor_glx_provider.c
index 4689b9ed6..77ccc3c8b 100644
--- a/hw/xwayland/xwayland-glx.c
+++ b/glamor/glamor_glx_provider.c
@@ -30,21 +30,18 @@
  * can do, which often does not include things like multisample visuals.
  */
 
-#include <xwayland-config.h>
+#include <dix-config.h>
 
 #define MESA_EGL_NO_X11_HEADERS
 #define EGL_NO_X11
-// #include <EGL/egl.h>
 #include <epoxy/egl.h>
 #include "glxserver.h"
 #include "glxutil.h"
 #include "compint.h"
 #include <X11/extensions/composite.h>
-#include "glamor_context.h"
+#include "glamor_priv.h"
 #include "glamor.h"
 
-#include "xwayland-screen.h"
-
 /* Can't get these from <GL/glx.h> since it pulls in client headers */
 #define GLX_RGBA_BIT		0x00000001
 #define GLX_WINDOW_BIT		0x00000001
@@ -364,12 +361,16 @@ static __GLXscreen *
 egl_screen_probe(ScreenPtr pScreen)
 {
     struct egl_screen *screen;
-    struct xwl_screen *xwl_screen = xwl_screen_get(pScreen);
+    glamor_screen_private *glamor_screen;
     __GLXscreen *base;
 
     if (enableIndirectGLX)
         return NULL; /* not implemented */
 
+    glamor_screen = glamor_get_screen_private(pScreen);
+    if (!glamor_screen)
+        return NULL;
+
     if (!(screen = calloc(1, sizeof *screen)))
         return NULL;
 
@@ -378,7 +379,7 @@ egl_screen_probe(ScreenPtr pScreen)
     base->createDrawable = egl_create_glx_drawable;
     /* base.swapInterval = NULL; */
 
-    screen->display = xwl_screen->glamor_ctx->display;
+    screen->display = glamor_screen->ctx.display;
 
     __glXInitExtensionEnableBits(screen->base.glx_enable_bits);
     __glXEnableExtension(base->glx_enable_bits, "GLX_ARB_context_flush_control");
@@ -402,8 +403,8 @@ egl_screen_probe(ScreenPtr pScreen)
         return NULL;
     }
 
-    if (!screen->base.glvnd && xwl_screen->glvnd_vendor)
-        screen->base.glvnd = strdup(xwl_screen->glvnd_vendor);
+    if (!screen->base.glvnd && glamor_screen->glvnd_vendor)
+        screen->base.glvnd = strdup(glamor_screen->glvnd_vendor);
 
     if (!screen->base.glvnd)
         screen->base.glvnd = strdup("mesa");
diff --git a/hw/xwayland/xwayland-glx.h b/glamor/glamor_glx_provider.h
similarity index 94%
rename from hw/xwayland/xwayland-glx.h
rename to glamor/glamor_glx_provider.h
index 62c9fb7ce..b0db90e47 100644
--- a/hw/xwayland/xwayland-glx.h
+++ b/glamor/glamor_glx_provider.h
@@ -27,11 +27,11 @@
 #ifndef XWAYLAND_GLX_H
 #define XWAYLAND_GLX_H
 
-#include <xwayland-config.h>
+#include <dix-config.h>
 
 #ifdef GLXEXT
 #include "glx_extinit.h"
-extern __GLXprovider glamor_provider;
+extern _X_EXPORT __GLXprovider glamor_provider;
 #endif
 
 #endif /* XWAYLAND_GLX_H */
diff --git a/glamor/meson.build b/glamor/meson.build
index 4a3f6241a..d4cb1859a 100644
--- a/glamor/meson.build
+++ b/glamor/meson.build
@@ -33,6 +33,9 @@ srcs_glamor = [
     'glamor_sync.c',
 ]
 
+if build_glx
+    srcs_glamor += 'glamor_glx_provider.c'
+endif
 if build_xv
     srcs_glamor += 'glamor_xv.c'
 endif
@@ -41,7 +44,7 @@ epoxy_dep = dependency('epoxy')
 
 glamor = static_library('glamor',
     srcs_glamor,
-    include_directories: inc,
+    include_directories: [inc, glx_inc],
     dependencies: [
         common_dep,
         epoxy_dep,
diff --git a/hw/xwayland/meson.build b/hw/xwayland/meson.build
index 8bda50eab..1106627a9 100644
--- a/hw/xwayland/meson.build
+++ b/hw/xwayland/meson.build
@@ -7,7 +7,6 @@ srcs = [
     'xwayland-drm-lease.h',
     'xwayland-drm-lease.c',
     'xwayland-glamor.h',
-    'xwayland-glx.h',
     'xwayland-pixmap.c',
     'xwayland-pixmap.h',
     'xwayland-present.h',
@@ -105,9 +104,6 @@ xwayland_glamor = []
 eglstream_srcs = []
 if build_glamor
     srcs += 'xwayland-glamor.c'
-    if build_glx
-        srcs += 'xwayland-glx.c'
-    endif
     if gbm_dep.found()
         srcs += [
                   'xwayland-glamor-gbm.c',
diff --git a/hw/xwayland/xwayland-glamor.c b/hw/xwayland/xwayland-glamor.c
index b4fba65c0..e962ccc15 100644
--- a/hw/xwayland/xwayland-glamor.c
+++ b/hw/xwayland/xwayland-glamor.c
@@ -33,6 +33,7 @@
 
 #include <glamor.h>
 #include <glamor_context.h>
+#include <glamor_glx_provider.h>
 #ifdef GLXEXT
 #include "glx_extinit.h"
 #endif
@@ -42,7 +43,6 @@
 #include <drm_fourcc.h>
 
 #include "xwayland-glamor.h"
-#include "xwayland-glx.h"
 #include "xwayland-screen.h"
 #include "xwayland-window.h"
 #include "xwayland-window-buffers.h"
commit 3caf7aa88d31450f116589d68ff66f78285f0e33
Author: Konstantin Pugin <ria.freelander at gmail.com>
Date:   Thu Jul 21 00:46:07 2022 +0300

    glamor: add glvnd_vendor private
    
    This commit adds an ability to store a glvnd vendor in Glamor
    structures, which can be used for initialize some vendor-based values
    without hooking into DDX internals. Also this adds setting this value
    into Xorg and Xwayland
    
    Signed-off-by: Konstantin Pugin <ria.freelander at gmail.com>
    Reviewed-by: Adam Jackson <ajax at redhat.com>
    Acked-by: Emma Anholt <emma at anholt.net>

diff --git a/glamor/glamor.c b/glamor/glamor.c
index 9bd2b90db..565bd67f1 100644
--- a/glamor/glamor.c
+++ b/glamor/glamor.c
@@ -933,6 +933,7 @@ glamor_close_screen(ScreenPtr screen)
     glamor_priv = glamor_get_screen_private(screen);
     glamor_sync_close(screen);
     glamor_composite_glyphs_fini(screen);
+    glamor_set_glvnd_vendor(screen, NULL);
     screen->CloseScreen = glamor_priv->saved_procs.close_screen;
 
     screen->CreateGC = glamor_priv->saved_procs.create_gc;
@@ -965,6 +966,31 @@ glamor_fini(ScreenPtr screen)
     /* Do nothing currently. */
 }
 
+void
+glamor_set_glvnd_vendor(ScreenPtr screen, const char *vendor_name)
+{
+    glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
+
+    if (!glamor_priv)
+        return;
+
+    if (glamor_priv->glvnd_vendor)
+        free(glamor_priv->glvnd_vendor);
+
+    glamor_priv->glvnd_vendor = xnfstrdup(vendor_name);
+}
+
+const char *
+glamor_get_glvnd_vendor(ScreenPtr screen)
+{
+    glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
+
+    if (!glamor_priv)
+        return NULL;
+
+    return glamor_priv->glvnd_vendor;
+}
+
 void
 glamor_enable_dri3(ScreenPtr screen)
 {
diff --git a/glamor/glamor.h b/glamor/glamor.h
index 31157471d..f5634b7e7 100644
--- a/glamor/glamor.h
+++ b/glamor/glamor.h
@@ -120,6 +120,12 @@ extern _X_EXPORT void glamor_clear_pixmap(PixmapPtr pixmap);
 
 extern _X_EXPORT void glamor_block_handler(ScreenPtr screen);
 
+/* This function should be called after glamor_init,
+ * but before adding a glamor GLX provider */
+extern _X_EXPORT void glamor_set_glvnd_vendor(ScreenPtr screen,
+                                              const char *vendor);
+extern _X_EXPORT const char *glamor_get_glvnd_vendor(ScreenPtr screen);
+
 extern _X_EXPORT PixmapPtr glamor_create_pixmap(ScreenPtr screen, int w, int h,
                                                 int depth, unsigned int usage);
 extern _X_EXPORT Bool glamor_destroy_pixmap(PixmapPtr pixmap);
diff --git a/glamor/glamor_egl.c b/glamor/glamor_egl.c
index 9bdff24c5..c1142e34d 100644
--- a/glamor/glamor_egl.c
+++ b/glamor/glamor_egl.c
@@ -887,6 +887,7 @@ glamor_egl_screen_init(ScreenPtr screen, struct glamor_context *glamor_ctx)
 #ifdef DRI3
     glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
 #endif
+    const char *gbm_backend_name;
 
     glamor_egl->saved_close_screen = screen->CloseScreen;
     screen->CloseScreen = glamor_egl_close_screen;
@@ -899,6 +900,10 @@ glamor_egl_screen_init(ScreenPtr screen, struct glamor_context *glamor_ctx)
 
     glamor_ctx->make_current = glamor_egl_make_current;
 
+    gbm_backend_name = gbm_device_get_backend_name(glamor_egl->gbm);
+    /* Mesa uses "drm" as backend name, in that case, just do nothing */
+    if (gbm_backend_name && strcmp(gbm_backend_name, "drm") != 0)
+        glamor_set_glvnd_vendor(screen, gbm_backend_name);
 #ifdef DRI3
     /* Tell the core that we have the interfaces for import/export
      * of pixmaps.
diff --git a/glamor/glamor_priv.h b/glamor/glamor_priv.h
index 33072cb3b..610af5315 100644
--- a/glamor/glamor_priv.h
+++ b/glamor/glamor_priv.h
@@ -336,6 +336,7 @@ typedef struct glamor_screen_private {
     int flags;
     ScreenPtr screen;
     int dri3_enabled;
+    char *glvnd_vendor;
 
     Bool suppress_gl_out_of_memory_logging;
     Bool logged_any_fbo_allocation_failure;
diff --git a/hw/xwayland/xwayland-glamor.c b/hw/xwayland/xwayland-glamor.c
index c6aa8eb17..b4fba65c0 100644
--- a/hw/xwayland/xwayland-glamor.c
+++ b/hw/xwayland/xwayland-glamor.c
@@ -77,6 +77,7 @@ glamor_egl_screen_init(ScreenPtr screen, struct glamor_context *glamor_ctx)
 {
     struct xwl_screen *xwl_screen = xwl_screen_get(screen);
 
+    glamor_set_glvnd_vendor(screen, xwl_screen->glvnd_vendor);
     glamor_enable_dri3(screen);
     glamor_ctx->ctx = xwl_screen->egl_context;
     glamor_ctx->display = xwl_screen->egl_display;


More information about the xorg-commit mailing list