aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--main/xorg-server/APKBUILD117
-rw-r--r--main/xorg-server/autoconfig-nvidia.patch27
-rw-r--r--main/xorg-server/autoconfig-sis.patch21
-rw-r--r--main/xorg-server/xwayland-glx.patch419
4 files changed, 475 insertions, 109 deletions
diff --git a/main/xorg-server/APKBUILD b/main/xorg-server/APKBUILD
index ff7ba6a27f..f969531ee3 100644
--- a/main/xorg-server/APKBUILD
+++ b/main/xorg-server/APKBUILD
@@ -2,7 +2,7 @@
# Maintainer: Natanael Copa <ncopa@alpinelinux.org>
pkgname=xorg-server
pkgver=1.20.7
-pkgrel=0
+pkgrel=1
pkgdesc="X.Org X servers"
url="https://www.x.org/wiki"
arch="all"
@@ -26,38 +26,32 @@ depends_dev="
"
makedepends="
$depends_dev
- autoconf
- automake
- eudev-dev
- libdrm-dev
- libpciaccess-dev
- openssl-dev
- libtool
- libx11-dev
- libxdamage-dev
- libxinerama-dev
- libxkbfile-dev
- libxkbui-dev
- libxv-dev
- libxxf86dga-dev
- libxxf86misc-dev
- perl
+ meson
+ xorgproto
+ xtrans
+ libxshmfence-dev
pixman-dev
- util-macros
+ xkbcomp-dev
+ libxkbfile-dev
+ nettle-dev
wayland-dev
wayland-protocols
+ libdrm-dev
+ libxext-dev
+ libx11-dev
+ libxau-dev
+ eudev-dev
+ libxcb-dev
xcb-util-dev
xcb-util-image-dev
xcb-util-keysyms-dev
xcb-util-renderutil-dev
xcb-util-wm-dev
- xorgproto
- xtrans
- zlib-dev
+ libpciaccess-dev
+ libxdmcp-dev
"
-source="https://www.x.org/releases/individual/xserver/$pkgname-$pkgver.tar.bz2
- autoconfig-nvidia.patch
- autoconfig-sis.patch
+source="https://www.x.org/releases/individual/xserver/xorg-server-$pkgver.tar.bz2
+ xwayland-glx.patch
"
# secfixes:
@@ -81,8 +75,6 @@ source="https://www.x.org/releases/individual/xserver/$pkgname-$pkgver.tar.bz2
prepare() {
default_prepare
- # Fix dbus config path
- sed -i -e 's/\$(sysconfdir)/\/etc/' config/Makefile.*
sed -i -e 's/termio.h/termios.h/' hw/xfree86/os-support/xf86_OSlib.h
}
@@ -94,47 +86,52 @@ build() {
export LDFLAGS="$LDFLAGS -Wl,-z,lazy"
_fontroot="/usr/share/fonts"
- ./configure \
- --build=$CBUILD \
- --host=$CHOST \
+ meson \
--prefix=/usr \
--sysconfdir=/etc/X11 \
--localstatedir=/var \
- --with-fontrootdir=$_fontroot \
- --with-default-font-path=${_fontroot}/misc,${_fontroot}/100dpi:unscaled,${_fontroot}/75dpi:unscaled,${_fontroot}/TTF,${_fontroot}/Type1 \
- --with-xkb-path=/usr/share/X11/xkb \
- --with-xkb-output=/var/lib/xkb \
- --without-systemd-daemon \
- --enable-composite \
- --enable-config-udev \
- --enable-dri \
- --enable-dri2 \
- --enable-dri3 \
- --enable-glamor \
- --enable-ipv6 \
- --enable-kdrive \
- --enable-xace \
- --enable-xcsecurity \
- --enable-xephyr \
- --enable-xnest \
- --enable-xorg \
- --enable-xres \
- --enable-xv \
- --enable-xwayland \
- --disable-config-hal \
- --disable-dmx \
- --disable-systemd-logind \
- --with-os-vendor="${DISTRO_NAME:-Alpine Linux}"
- make
+ -Dxorg=true \
+ -Dxephyr=true \
+ -Dxwayland=true \
+ -Dglamor=true \
+ -Dxwayland_eglstream=false \
+ -Dxnest=true \
+ -Ddmx=false \
+ -Dxvfb=true \
+ -Dxwin=false \
+ -Ddefault_font_path=$_fontroot/misc,$_fontroot/100dpi:unscaled,$_fontroot/75dpi:unscaled,$_fontroot/TTF,$_fontroot/Type1 \
+ -Dglx=true \
+ -Dxdmcp=true \
+ -Dxdm-auth-1=false \
+ -Dsecure-rpc=false \
+ -Dipv6=true \
+ -Dxkb_dir=/usr/share/X11/xkb \
+ -Dxkb_output_dir=/var/lib/xkb \
+ -Dos_vendor="${DISTRO_NAME:-Alpine Linux}" \
+ -Dlisten_tcp=false \
+ -Dlisten_unix=true \
+ -Dlisten_local=true \
+ -Dsuid_wrapper=true \
+ -Dpciaccess=true \
+ -Dudev=true \
+ -Dhal=false \
+ -Dsystemd_logind=false \
+ -Ddpms=true \
+ -Ddri1=true \
+ -Ddri2=true \
+ -Ddri3=true \
+ . output
+ ninja -C output
}
check() {
- make check
+ ninja -C output test
}
package() {
- make -j1 DESTDIR="$pkgdir" install
- chmod u+s "$pkgdir"/usr/bin/Xorg
+ DESTDIR="$pkgdir" ninja -C output install
+
+ ln -s /usr/bin/Xorg "$pkgdir"/usr/bin/X
# Don't conflict with xf86-input-evdev
rm -f "$pkgdir"/usr/share/X11/xorg.conf.d/10-evdev.conf
@@ -165,7 +162,5 @@ xwayland() {
mkdir -p "$subpkgdir"/usr/bin
mv "$pkgdir"/usr/bin/Xwayland "$subpkgdir"/usr/bin/
}
-
sha512sums="c67612e379111c28c68941c0a660abf72be7669591b41ccaa3b3474c4540a03822a28d892831b12ce08bac6e5e7e33504c2d19ef2a0c2298f83bd083459f96f5 xorg-server-1.20.7.tar.bz2
-016d10e59681d36be19aacc1505103bd340a5e81855e551997b42f8b54796be46fb2d91be8d1aa3bebb10d34e51258be9de1299c2e351b840450de38ff103df0 autoconfig-nvidia.patch
-30a78f4278edd535c45ee3f80933427cb029a13abaa4b041f816515fdd8f64f00b9c6aef50d4eba2aaf0d4f333e730399864fd97fa18891273601c77a6637200 autoconfig-sis.patch"
+004c9a7d920af8825a311d32433bf64190d45583d57bb20b3c5ef39d8011ced7bf17b73296e56078ca791e6cd923594dacfe3fbf7af7c98934627e34559c85d8 xwayland-glx.patch"
diff --git a/main/xorg-server/autoconfig-nvidia.patch b/main/xorg-server/autoconfig-nvidia.patch
deleted file mode 100644
index d15d36dafb..0000000000
--- a/main/xorg-server/autoconfig-nvidia.patch
+++ /dev/null
@@ -1,27 +0,0 @@
---- a/hw/xfree86/common/xf86pciBus.c
-+++ b/hw/xfree86/common/xf86pciBus.c
-@@ -1144,7 +1144,23 @@
- int idx = 0;
-
- #if defined(__linux__) || defined(__NetBSD__)
-- driverList[idx++] = "nouveau";
-+ switch (dev->device_id)
-+ {
-+ /* NV1 */
-+ case 0x0008:
-+ case 0x0009:
-+ driverList[idx++] = "vesa";
-+ break;
-+ /* NV3 */
-+ case 0x0018:
-+ case 0x0019:
-+ driverList[idx++] = "nouveau";
-+ break;
-+ default:
-+ driverList[idx++] = "nouveau";
-+ driverList[idx++] = "nvidia";
-+ break;
-+ }
- #endif
- driverList[idx++] = "nv";
- break;
diff --git a/main/xorg-server/autoconfig-sis.patch b/main/xorg-server/autoconfig-sis.patch
deleted file mode 100644
index e97d821140..0000000000
--- a/main/xorg-server/autoconfig-sis.patch
+++ /dev/null
@@ -1,21 +0,0 @@
---- ./hw/xfree86/common/xf86pciBus.c.orig 2011-09-24 10:53:45.421697668 +0000
-+++ ./hw/xfree86/common/xf86pciBus.c 2011-09-24 10:55:56.416250708 +0000
-@@ -1200,9 +1200,15 @@
- break;
- }
- break;
-- case 0x1039:
-- driverList[0] = "sis";
-- break;
-+ case 0x1039:
-+ switch (dev->device_id)
-+ {
-+ case 0x6350: case 0x6351:
-+ driverList[0] = "sisimedia"; driverList[1] = "sis"; break;
-+ default:
-+ driverList[0] = "sis"; break;
-+ }
-+ break;
- case 0x126f:
- driverList[0] = "siliconmotion";
- break;
diff --git a/main/xorg-server/xwayland-glx.patch b/main/xorg-server/xwayland-glx.patch
new file mode 100644
index 0000000000..c6a750af70
--- /dev/null
+++ b/main/xorg-server/xwayland-glx.patch
@@ -0,0 +1,419 @@
+diff --git a/hw/xwayland/meson.build b/hw/xwayland/meson.build
+index 36bf213..c8746e5 100644
+--- a/hw/xwayland/meson.build
++++ b/hw/xwayland/meson.build
+@@ -54,6 +54,9 @@ 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'
+ endif
+@@ -80,10 +83,15 @@ if build_glamor
+ xwayland_glamor += glamor
+ endif
+
++wayland_inc = [ inc, ]
++if build_glx
++ wayland_inc += glx_inc
++endif
++
+ executable(
+ 'Xwayland',
+ srcs,
+- include_directories: inc,
++ include_directories: wayland_inc,
+ dependencies: [
+ common_dep,
+ xwayland_dep,
+diff --git a/hw/xwayland/xwayland-glamor.c b/hw/xwayland/xwayland-glamor.c
+index 48e330a..dcfc7f1 100644
+--- a/hw/xwayland/xwayland-glamor.c
++++ b/hw/xwayland/xwayland-glamor.c
+@@ -31,6 +31,9 @@
+
+ #include <glamor.h>
+ #include <glamor_context.h>
++#ifdef GLXEXT
++#include "glx_extinit.h"
++#endif
+
+ static void
+ glamor_egl_make_current(struct glamor_context *glamor_ctx)
+@@ -262,5 +265,9 @@ xwl_glamor_init(struct xwl_screen *xwl_screen)
+ ErrorF("Failed to initialize glamor Xv extension\n");
+ #endif
+
++#ifdef GLXEXT
++ GlxPushProvider(&glamor_provider);
++#endif
++
+ return TRUE;
+ }
+diff --git a/hw/xwayland/xwayland-glx.c b/hw/xwayland/xwayland-glx.c
+new file mode 100644
+index 0000000..71c9aad
+--- /dev/null
++++ b/hw/xwayland/xwayland-glx.c
+@@ -0,0 +1,344 @@
++/*
++ * Copyright © 2019 Red Hat, Inc.
++ *
++ * 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.
++ *
++ * Authors:
++ * Adam Jackson <ajax@redhat.com>
++ */
++
++/*
++ * Sets up GLX capabilities based on the EGL capabilities of the glamor
++ * renderer for the screen. Without this you will get whatever swrast
++ * can do, which often does not include things like multisample visuals.
++ */
++
++#include <xwayland-config.h>
++#include "xwayland.h"
++#define MESA_EGL_NO_X11_HEADERS
++// #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.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
++#define GLX_PIXMAP_BIT 0x00000002
++#define GLX_PBUFFER_BIT 0x00000004
++#define GLX_NONE 0x8000
++#define GLX_SLOW_CONFIG 0x8001
++#define GLX_TRUE_COLOR 0x8002
++#define GLX_DIRECT_COLOR 0x8003
++#define GLX_NON_CONFORMANT_CONFIG 0x800D
++#define GLX_DONT_CARE 0xFFFFFFFF
++#define GLX_RGBA_FLOAT_BIT_ARB 0x00000004
++#define GLX_SWAP_UNDEFINED_OML 0x8063
++
++struct egl_config {
++ __GLXconfig base;
++ EGLConfig config;
++};
++
++struct egl_screen {
++ __GLXscreen base;
++ EGLDisplay display;
++ EGLConfig *configs;
++};
++
++static void
++egl_screen_destroy(__GLXscreen *_screen)
++{
++ struct egl_screen *screen = (struct egl_screen *)_screen;
++
++ /* XXX do we leak the fbconfig list? */
++
++ free(screen->configs);
++ __glXScreenDestroy(_screen);
++ free(_screen);
++}
++
++static void
++egl_drawable_destroy(__GLXdrawable *draw)
++{
++ free(draw);
++}
++
++static GLboolean
++egl_drawable_swap_buffers(ClientPtr client, __GLXdrawable *draw)
++{
++ return GL_FALSE;
++}
++
++static void
++egl_drawable_copy_sub_buffer(__GLXdrawable *draw, int x, int y, int w, int h)
++{
++}
++
++static void
++egl_drawable_wait_x(__GLXdrawable *draw)
++{
++ glamor_block_handler(draw->pDraw->pScreen);
++}
++
++static void
++egl_drawable_wait_gl(__GLXdrawable *draw)
++{
++}
++
++static __GLXdrawable *
++egl_create_glx_drawable(ClientPtr client, __GLXscreen *screen,
++ DrawablePtr draw, XID drawid, int type,
++ XID glxdrawid, __GLXconfig *modes)
++{
++ __GLXdrawable *ret;
++
++ ret = calloc(1, sizeof *ret);
++ if (!ret)
++ return NULL;
++
++ if (!__glXDrawableInit(ret, screen, draw, type, glxdrawid, modes)) {
++ free(ret);
++ return NULL;
++ }
++
++ ret->destroy = egl_drawable_destroy;
++ ret->swapBuffers = egl_drawable_swap_buffers;
++ ret->copySubBuffer = egl_drawable_copy_sub_buffer;
++ ret->waitX = egl_drawable_wait_x;
++ ret->waitGL = egl_drawable_wait_gl;
++
++ return ret;
++}
++
++/*
++ * TODO:
++ *
++ * - figure out sRGB
++ * - bindToTextureTargets is suspicious
++ * - better channel mask setup
++ * - drawable type masks is suspicious
++ */
++static struct egl_config *
++translate_eglconfig(struct egl_screen *screen, EGLConfig hc,
++ struct egl_config *chain, Bool direct_color,
++ Bool double_buffer)
++{
++ EGLint value;
++ struct egl_config *c = calloc(1, sizeof *c);
++
++ if (!c)
++ return chain;
++
++ /* constants. changing these requires (at least) new EGL extensions */
++ c->base.stereoMode = GL_FALSE;
++ c->base.numAuxBuffers = 0;
++ c->base.level = 0;
++ c->base.transparentAlpha = 0;
++ c->base.transparentIndex = 0;
++ c->base.transparentPixel = GLX_NONE;
++ c->base.visualSelectGroup = 0;
++ c->base.indexBits = 0;
++ c->base.optimalPbufferWidth = 0;
++ c->base.optimalPbufferHeight = 0;
++ c->base.bindToMipmapTexture = 0;
++ c->base.bindToTextureTargets = GLX_DONT_CARE;
++ c->base.sRGBCapable = 0;
++ c->base.swapMethod = GLX_SWAP_UNDEFINED_OML;
++
++ /* this is... suspect */
++ c->base.drawableType = GLX_WINDOW_BIT | GLX_PIXMAP_BIT | GLX_PBUFFER_BIT;
++
++ /* hmm */
++ c->base.bindToTextureRgb = GL_TRUE;
++ c->base.bindToTextureRgba = GL_TRUE;
++
++ /*
++ * glx conformance failure: there's no such thing as accumulation
++ * buffers in EGL. they should be emulable with shaders and fbos,
++ * but i'm pretty sure nobody's using this feature since it's
++ * entirely software. note that glx conformance merely requires
++ * that an accum buffer _exist_, not a minimum bitness.
++ */
++ c->base.accumRedBits = 0;
++ c->base.accumGreenBits = 0;
++ c->base.accumBlueBits = 0;
++ c->base.accumAlphaBits = 0;
++
++ /* parametric state */
++ if (direct_color)
++ c->base.visualType = GLX_DIRECT_COLOR;
++ else
++ c->base.visualType = GLX_TRUE_COLOR;
++
++ if (double_buffer)
++ c->base.doubleBufferMode = GL_TRUE;
++ else
++ c->base.doubleBufferMode = GL_FALSE;
++
++ /* direct-mapped state */
++#define GET(attr, slot) \
++ eglGetConfigAttrib(screen->display, hc, attr, &c->base.slot)
++ GET(EGL_RED_SIZE, redBits);
++ GET(EGL_GREEN_SIZE, greenBits);
++ GET(EGL_BLUE_SIZE, blueBits);
++ GET(EGL_ALPHA_SIZE, alphaBits);
++ GET(EGL_BUFFER_SIZE, rgbBits);
++ GET(EGL_DEPTH_SIZE, depthBits);
++ GET(EGL_STENCIL_SIZE, stencilBits);
++ GET(EGL_TRANSPARENT_RED_VALUE, transparentRed);
++ GET(EGL_TRANSPARENT_GREEN_VALUE, transparentGreen);
++ GET(EGL_TRANSPARENT_BLUE_VALUE, transparentBlue);
++ GET(EGL_SAMPLE_BUFFERS, sampleBuffers);
++ GET(EGL_SAMPLES, samples);
++ if (c->base.renderType & GLX_PBUFFER_BIT) {
++ GET(EGL_MAX_PBUFFER_WIDTH, maxPbufferWidth);
++ GET(EGL_MAX_PBUFFER_HEIGHT, maxPbufferHeight);
++ GET(EGL_MAX_PBUFFER_PIXELS, maxPbufferPixels);
++ }
++#undef GET
++
++ /* derived state: config caveats */
++ eglGetConfigAttrib(screen->display, hc, EGL_CONFIG_CAVEAT, &value);
++ if (value == EGL_NONE)
++ c->base.visualRating = GLX_NONE;
++ else if (value == EGL_SLOW_CONFIG)
++ c->base.visualRating = GLX_SLOW_CONFIG;
++ else if (value == EGL_NON_CONFORMANT_CONFIG)
++ c->base.visualRating = GLX_NON_CONFORMANT_CONFIG;
++ /* else panic */
++
++ /* derived state: float configs */
++ c->base.renderType = GLX_RGBA_BIT;
++ if (eglGetConfigAttrib(screen->display, hc, EGL_COLOR_COMPONENT_TYPE_EXT,
++ &value) == EGL_TRUE) {
++ if (value == EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT) {
++ c->base.renderType = GLX_RGBA_FLOAT_BIT_ARB;
++ }
++ /* else panic */
++ }
++
++ /* map to the backend's config */
++ c->config = hc;
++
++ /*
++ * XXX do something less ugly
++ */
++ if (c->base.renderType == GLX_RGBA_BIT) {
++ if (c->base.rgbBits == 24 || c->base.rgbBits == 32) {
++ c->base.redMask = 0xff0000;
++ c->base.greenMask = 0x00ff00;
++ c->base.blueMask = 0x0000ff;
++ if (c->base.alphaBits)
++ /* assume all remaining bits are alpha */
++ c->base.alphaMask = 0xff000000;
++ }
++ }
++
++ c->base.next = chain ? &chain->base : NULL;
++ return c;
++}
++
++static __GLXconfig *
++egl_mirror_configs(ScreenPtr pScreen, struct egl_screen *screen)
++{
++ int i, j, k, nconfigs;
++ struct egl_config *c = NULL;
++ EGLConfig *host_configs = NULL;
++ Bool offon[] = { FALSE, TRUE };
++
++ eglGetConfigs(screen->display, NULL, 0, &nconfigs);
++ if (!(host_configs = calloc(nconfigs, sizeof *host_configs)))
++ return NULL;
++
++ eglGetConfigs(screen->display, host_configs, nconfigs, &nconfigs);
++
++ /* We walk the EGL configs backwards to make building the
++ * ->next chain easier.
++ */
++ for (i = nconfigs - 1; i > 0; i--)
++ for (j = 0; j < 2; j++) /* direct_color */
++ for (k = 0; k < 2; k++) /* direct_color */
++ c = translate_eglconfig(screen, host_configs[i], c,
++ /* direct_color */ offon[j],
++ /* double_buffer */ offon[k]
++ );
++
++ screen->configs = host_configs;
++ return c ? &c->base : NULL;
++}
++
++static __GLXscreen *
++egl_screen_probe(ScreenPtr pScreen)
++{
++ struct egl_screen *screen;
++ struct xwl_screen *xwl_screen = xwl_screen_get(pScreen);
++ __GLXscreen *base;
++
++ if (enableIndirectGLX)
++ return NULL; /* not implemented */
++
++ if (!(screen = calloc(1, sizeof *screen)))
++ return NULL;
++
++ base = &screen->base;
++ base->destroy = egl_screen_destroy;
++ base->createDrawable = egl_create_glx_drawable;
++ /* base.swapInterval = NULL; */
++
++ screen->display = xwl_screen->glamor_ctx->display;
++
++ __glXInitExtensionEnableBits(screen->base.glx_enable_bits);
++ __glXEnableExtension(base->glx_enable_bits, "GLX_ARB_context_flush_control");
++ __glXEnableExtension(base->glx_enable_bits, "GLX_ARB_create_context");
++ __glXEnableExtension(base->glx_enable_bits, "GLX_ARB_create_context_no_error");
++ __glXEnableExtension(base->glx_enable_bits, "GLX_ARB_create_context_profile");
++ __glXEnableExtension(base->glx_enable_bits, "GLX_ARB_create_context_robustness");
++ __glXEnableExtension(base->glx_enable_bits, "GLX_ARB_fbconfig_float");
++ __glXEnableExtension(base->glx_enable_bits, "GLX_EXT_create_context_es2_profile");
++ __glXEnableExtension(base->glx_enable_bits, "GLX_EXT_create_context_es_profile");
++ __glXEnableExtension(base->glx_enable_bits, "GLX_EXT_fbconfig_packed_float");
++ __glXEnableExtension(base->glx_enable_bits, "GLX_EXT_framebuffer_sRGB");
++ __glXEnableExtension(base->glx_enable_bits, "GLX_EXT_no_config_context");
++ __glXEnableExtension(base->glx_enable_bits, "GLX_EXT_texture_from_pixmap");
++ __glXEnableExtension(base->glx_enable_bits, "GLX_MESA_copy_sub_buffer");
++ // __glXEnableExtension(base->glx_enable_bits, "GLX_SGI_swap_control");
++
++ base->fbconfigs = egl_mirror_configs(pScreen, screen);
++ if (!base->fbconfigs) {
++ free(screen);
++ return NULL;
++ }
++
++ __glXScreenInit(base, pScreen);
++ __glXsetGetProcAddress(eglGetProcAddress);
++
++ return base;
++}
++
++__GLXprovider glamor_provider = {
++ egl_screen_probe,
++ "glamor",
++ NULL
++};
+diff --git a/hw/xwayland/xwayland.h b/hw/xwayland/xwayland.h
+index 0854df4..a4804fe 100644
+--- a/hw/xwayland/xwayland.h
++++ b/hw/xwayland/xwayland.h
+@@ -488,4 +488,9 @@ static inline void xwl_glamor_init_eglstream(struct xwl_screen *xwl_screen)
+ }
+ #endif
+
++#ifdef GLXEXT
++#include "glx_extinit.h"
++extern __GLXprovider glamor_provider;
++#endif
++
+ #endif