Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • chengbo7135/xserver
  • wjp/xserver
  • DemiMarie/xserver
  • alanc/xserver
  • uvas/xserver
  • cl91/xserver
  • heymiaoO/xserver
  • oreaus/xserver
  • stapelberg/xserver
  • PaulKocialkowski/xserver
  • CendioOssman/xserver
  • wiz/xserver
  • maos20008/xserver
  • dougvj/xserver
  • mgorse1/xserver
  • gldrk/xserver
  • TMR5454/xserver
  • Kyawswat/xserver
  • hexiaodong/xserver
  • gilvbp/xserver
  • vliaskov/xserver
  • aarondill/xserver
  • zzyiwei/xserver
  • kleinerm/xserver
  • jcherry/xserver
  • jcristau/xserver
  • nathankidd/xserver
  • jexposit/xserver
  • refi_64/xserver
  • kbrenneman/xserver
  • kupper.pa/xserver
  • LickmeDown/xserver
  • zboszor/xserver
  • jadahl/xserver
  • shadeslayer/xserver
  • mherrb/xserver
  • Julia/xserver
  • twaik/xserver
  • fvalasiad/xserver
  • zzxyb/xserver
  • HermannSW/xserver
  • erwinou/xserver
  • ekurzinger/xserver
  • nacho.resa/xserver
  • agoins/xserver
  • NSUTanghaixiang/xserver
  • p12tic/xserver
  • huxd1532/xserver
  • keithp/xserver
  • vinilokorlok/xserver
  • bbeckett/xserver
  • dslater38/xserver
  • zzag/xserver
  • emersion/xserver
  • djlucas/xserver
  • ccullumbine2018/xserver
  • daniels/xserver
  • llandwerlin/xserver
  • matt335672/xserver
  • doraskayo/xserver
  • afett/xserver
  • XDXTHX/xserver
  • xexaxo/xserver
  • ecurtin/xserver
  • rbernon/xserver
  • pekdon/xserver
  • karolherbst/xserver
  • russellcnv/xserver
  • mbiebl/xserver
  • orbea/xserver
  • vsyrjala/xserver
  • lyudess/xserver
  • manu/xserver
  • lucmann/xserver
  • tholin/xserver
  • yarivb/xserver
  • tmlind/xserver
  • chema/xserver
  • J-Bu/xserver
  • chenhuacai/xserver
  • E5ten/xserver
  • haagch/xserver
  • whot/xserver
  • strassek/xserver
  • mntmn/xserver
  • liyi42/xserver
  • YusufKhan-gamedev/xserver
  • iv-m/xserver
  • vanvugt/xserver
  • Rui511/xserver
  • catap/xserver
  • tjbp/xserver
  • webi123/xserver
  • noblock/xserver
  • freemangordon/xserver
  • xdandys/xserver
  • jbeich/xserver
  • zeising/xserver
  • romangg/xserver
  • pq/xserver
  • azhadchenko/xserver
  • Emantor/xserver
  • carlosg/xserver
  • kwg/xserver
  • pichika/xserver
  • klniu/xserver
  • TAAPArthur/xserver
  • sjoerd/xserver
  • Sjecai2/xserver
  • jturney/xserver
  • pkubaj/xserver
  • os369510/xserver
  • Zamundaaa/xserver
  • Gorg/xserver
  • lkundrak/xserver
  • niveditharau/xserver
  • ForTheReallys/xserver
  • jmonteiro/xserver
  • jocelyn/xserver
  • ThatMG393/xserver
  • fweimer/xserver
  • mlankhorst/xserver
  • marv/xserver
  • dbn/xserver
  • mattrope/xserver
  • coypoop/xserver
  • mwyraz/xserver
  • frog/xserver
  • 3v1n0/xserver
  • awilfox/xserver
  • muesli4/xserver
  • rarbab/xserver
  • yshui/xserver
  • jannau/xserver
  • mikeroyal/xserver
  • andrebsguedes/xserver
  • JeffyCN/xserver
  • ipominov/xserver
  • gtrentalancia/xserver
  • josch/xserver
  • lucyllewy/xserver
  • tomty89/xserver
  • qarmin/xserver
  • tagr/xserver
  • zwenna/xserver
  • bkylerussell/xserver
  • mupuf/xserver
  • zubzub/xserver
  • galaxytgtabiday/xserver
  • OlCe/xserver
  • ashafer/xserver
  • dengbo/xserver
  • valpackett/xserver
  • andreyknyazev077/xserver
  • antonovitch/xserver
  • contactshashanksharma/xserver-fork-shashank
  • akihiko.odaki/xserver
  • sknsean/xserver
  • rnpnr/xserver
  • hitong602/xserver
  • halfline/xserver
  • ismailsiege/xserver
  • dongwonk/xserver
  • Fatton1/xserver
  • GermanAizek/xserver
  • daenzer/xserver
  • FeepingCreature/xserver
  • mvlad/xserver
  • puleglot/xserver
  • smelenius/xserver
  • sewn/xserver
  • kaichuan.hsieh/xserver
  • SimonPilkington/xserver
  • adamdruppe/xserver
  • floppym/xserver
  • trevdave/xserver
  • luke-jr/xserver
  • headrush/xserver
  • davidriley/xserver
  • heitbaum/xserver
  • mrisaacb/xserver
  • goosen78/xserver
  • Ma/xserver
  • gmbr3/xserver
  • tsutsui/xserver
  • sherrodejjohnson/xserver
  • hassoon1986/xserver
  • lanodan/xserver
  • ydc-dadada/xserver
  • wengxt/xserver
  • icenowy/xserver
  • denisfa/xserver
  • StarsGreen/xserver
  • adamjrichter/xserver
  • bigon/xserver
  • djacewicz/xserver
  • davidre/xserver
  • kylin0061/xserver
  • arrowd/xserver
  • ernstp/xserver
  • bbrezillon/xserver
  • penguin42/xserver
  • anarsoul/xserver
  • marvinjr35/xserver
  • gerddie/xserver
  • xry111/xserver
  • psyruss85/xserver
  • volkanorhan/xserver
  • luporl/xserver
  • cbur201592/xserver
  • bphaslett/xserver
  • guillem/xserver
  • haihao/xserver
  • peterh/xserver
  • miztake/xserver
  • zaps166/xserver
  • lostgoat/xserver
  • vfjpl/xserver
  • bentiss/xserver
  • rilian-la-te/xserver
  • wujiangGitHub/xserver
  • cubanismo/xserver
  • arichardson/xserver
  • schreibemirhalt/xserver
  • jsg/xserver
  • karlosrangel337/xserver
  • knisht/xserver
  • manuelcrack642/xserver
  • ross/xserver
  • topimiettinen/xserver
  • davidedmundson/xserver
  • DPA/xserver
  • dkorkmazturk/xserver
  • karamjameelmoore/xserver
  • lihongtao/xserver
  • sthibaul/xserver
  • RyzenDew/xserver
  • christian-rauch/xserver
  • Vivek/xserver
  • peigongdsd/xserver
  • peng.jin/xserver
  • alagner/xserver
  • mehdigh419/xserver
  • dixler/xserver
  • BBaoVanC/xserver
  • Drakulix/xserver
  • Acidburn0zzz/xserver
  • bafanahub/xserver
  • benpicco/xserver
  • yangxiaojuan-loongson/xserver
  • kaocher82/xserver
  • pepp/xserver
  • cgzones/xserver
  • luyn/xserver
  • 1740301466jxz/xserver
  • ids1024/xserver
  • svalaskevicius/xserver
  • ZhiJie.Zhang/xserver
  • metux/xserver
  • eschwartz/xserver
  • jayantpranjal0/xserver
  • hmazlan/xserver
  • kerneltoast/xserver
  • Michaelypk/xserver
  • dottedmag/xserver
  • aplattner/xserver
  • sergiomb/xserver
  • looi/xserver
  • robclark/xserver
  • tzimmermann/xserver
  • vitoux.pascal/xserver
  • aditj/xserver
  • kennylevinsen/xserver
  • Kishore409/xserver
  • Daasin/xserver
  • dirbaio/xserver
  • xinbowang/xserver
  • mwei/xserver
  • SpikyCaterpillar1/xserver
  • devin11911191/xserver
  • xorg/xserver
  • alex-tu-cc/xserver
  • kaniini/xserver
  • jcourreges/xserver
  • n3rdopolis/xserver
  • zagursky/xserver
  • thesamesam/xserver
  • anholt/xserver
  • themaister/xserver
  • jrtc27/xserver
  • JoseExposito/xserver
  • Hi-Angel/xserver
  • City-busz/xserver
  • ydirson/xserver
  • dawnhan/xserver
  • avolkov/xserver
  • meMuszr/xserver
  • dk/xserver
  • cooperch/xserver
  • Tuetuopay/xserver
  • gabifalk/xserver
  • jeremyhu/xserver
  • 1480c1/xserver
  • Spintzyk/xserver
  • MisterDA/xserver
  • starnight/xserver
  • abono/xserver
  • ajax/xserver
  • dougg3/xserver
  • chenx_dust/xserver
  • EXtremeExploit/xserver
  • jwrdegoede/xserver
  • road2react/xserver
  • acelan/xserver
  • airlied/xserver
  • justazarsky/xserver
  • sri-ka1ki/xserver
  • rgfernandes/xserver
  • lynxeye/xserver
  • tintou/xserver
  • mattst88/xserver
  • rmader/xserver
  • linkmauve/xserver
  • kamarul6401/xserver
  • andy-zetier/xserver
  • gsittyz/xserver
  • bernhardu/xserver
  • causztic/xserver
  • cpmichael/modesetting
  • ryanneph/xserver
  • zhangyaning/xserver
  • olv/xserver
  • hongaoo/xserver
  • LiChenG-P/xserver
  • Ivaniku/x-taylan
  • dkg/xserver
  • ofourdan/xserver
  • mahkoh/xserver
  • AkiSakurai/xserver
  • msizanoen1/xserver
340 results
Show changes
Commits on Source (11)
Showing
with 240 additions and 88 deletions
......@@ -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)
{
......
......@@ -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);
......
......@@ -46,6 +46,7 @@
#include "glamor.h"
#include "glamor_priv.h"
#include "glamor_glx_provider.h"
#include "dri3.h"
struct glamor_egl_screen_private {
......@@ -58,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;
......@@ -887,6 +889,10 @@ glamor_egl_screen_init(ScreenPtr screen, struct glamor_context *glamor_ctx)
#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;
glamor_egl->saved_close_screen = screen->CloseScreen;
screen->CloseScreen = glamor_egl_close_screen;
......@@ -899,6 +905,13 @@ glamor_egl_screen_init(ScreenPtr screen, struct glamor_context *glamor_ctx)
glamor_ctx->make_current = glamor_egl_make_current;
/* 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.
......@@ -922,6 +935,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)
......@@ -1045,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 },
};
......@@ -1061,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)
......@@ -1071,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;
......
/*
* 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;
}
......@@ -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");
......
......@@ -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 */
......@@ -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;
......
......@@ -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,19 +44,13 @@ epoxy_dep = dependency('epoxy')
glamor = static_library('glamor',
srcs_glamor,
include_directories: inc,
include_directories: [inc, glx_inc],
dependencies: [
common_dep,
epoxy_dep,
],
)
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
......@@ -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)
{
......
......@@ -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;
}
......
......@@ -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
......
......@@ -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,
......
......@@ -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',
......
......@@ -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"
......@@ -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;
......
......@@ -601,6 +601,7 @@ static void
apply_output_change(struct xwl_output *xwl_output)
{
struct xwl_screen *xwl_screen = xwl_output->xwl_screen;
struct xwl_window *xwl_window;
struct xwl_output *it;
int mode_width, mode_height, count;
int width = 0, height = 0, has_this_output = 0;
......@@ -658,6 +659,15 @@ apply_output_change(struct xwl_output *xwl_output)
update_screen_size(xwl_screen, width, height);
else
RRTellChanged(xwl_screen->screen);
/* If running rootful and fullscreen, make sure to match the new setup */
if (xwl_screen->fullscreen) {
/* The root window may not yet be created */
if (xwl_screen->screen->root) {
xwl_window = xwl_window_get(xwl_screen->screen->root);
xwl_window_rootful_update_fullscreen(xwl_window, xwl_output);
}
}
}
static void
......
......@@ -31,5 +31,6 @@ struct xwl_window;
struct xwl_screen;
struct xwl_egl_backend;
struct xwl_drm_lease;
struct xwl_output;
#endif /* XWAYLAND_TYPES_H */
......@@ -569,6 +569,29 @@ xwl_window_set_fullscreen(struct xwl_window *xwl_window)
return TRUE;
}
void
xwl_window_rootful_update_fullscreen(struct xwl_window *xwl_window,
struct xwl_output *xwl_output)
{
struct xwl_screen *xwl_screen = xwl_window->xwl_screen;
if (!xwl_screen->fullscreen)
return;
if (xwl_window->window != xwl_screen->screen->root)
return;
if (xwl_window->wl_output_fullscreen != xwl_output->output)
return;
/* The size and position of the output may have changed, clear our
* output to make sure the next call to xwl_window_set_fullscreen()
* recomputes the size and updates the viewport as needed.
*/
xwl_window->wl_output_fullscreen = NULL;
xwl_window_set_fullscreen(xwl_window);
}
void
xwl_window_rootful_update_title(struct xwl_window *xwl_window)
{
......@@ -766,13 +789,16 @@ xdg_toplevel_handle_configure(void *data,
struct wl_array *states)
{
struct xwl_window *xwl_window = data;
struct xwl_screen *xwl_screen = xwl_window->xwl_screen;
/* Maintain our current size if no dimensions are requested */
if (width == 0 && height == 0)
return;
/* This will be committed by the xdg_surface.configure handler */
xwl_window_maybe_resize(xwl_window, width, height);
if (!xwl_screen->fullscreen) {
/* This will be committed by the xdg_surface.configure handler */
xwl_window_maybe_resize(xwl_window, width, height);
}
}
static void
......
......@@ -135,7 +135,8 @@ Bool xwl_window_has_viewport_enabled(struct xwl_window *xwl_window);
Bool xwl_window_is_toplevel(WindowPtr window);
void xwl_window_check_resolution_change_emulation(struct xwl_window *xwl_window);
void xwl_window_rootful_update_title(struct xwl_window *xwl_window);
void xwl_window_rootful_update_fullscreen(struct xwl_window *xwl_window,
struct xwl_output *xwl_output);
void xwl_window_set_window_pixmap(WindowPtr window, PixmapPtr pixmap);
Bool xwl_realize_window(WindowPtr window);
......