diff --git a/hw/kdrive/fbdev/fb_glamor.c b/hw/kdrive/fbdev/fb_glamor.c index f4c8e8e686..27bbfc3ed1 100644 --- a/hw/kdrive/fbdev/fb_glamor.c +++ b/hw/kdrive/fbdev/fb_glamor.c @@ -18,7 +18,12 @@ #include "kxv.h" #endif +#ifdef WITH_LIBDRM +#include +#endif + char *fbdev_glvnd_provider = NULL; +char *fbdev_dri_path = NULL; bool es_allowed = TRUE; bool force_es = FALSE; @@ -29,10 +34,31 @@ bool fbXVAllowed = TRUE; Bool fbdevInitAccel(ScreenPtr pScreen) { +#ifdef WITH_LIBDRM + KdScreenPriv(pScreen); + KdScreenInfo *screen = pScreenPriv->screen; + FbdevScrPriv *scrpriv = screen->driver; + + if (fbdev_dri_path) { + scrpriv->dri_fd = open(fbdev_dri_path, O_RDWR); + if (scrpriv->dri_fd >= 0) { + drmSetMaster(scrpriv->dri_fd); + } else { + perror("open"); + } + } else { + scrpriv->dri_fd = -1; + } +#endif + glamor_egl_conf_t glamor_egl_conf = { .screen = pScreen, .glvnd_vendor = fbdev_glvnd_provider, - .fd = -1, +#ifdef WITH_LIBDRM + .fd = scrpriv->dri_fd, +#else + .fd = -1; +#endif .llvmpipe_allowed = TRUE, .force_glamor = TRUE, .es_disallowed = !es_allowed, @@ -45,7 +71,7 @@ fbdevInitAccel(ScreenPtr pScreen) const char *renderer = (const char*)glGetString(GL_RENDERER); - int flags = GLAMOR_USE_EGL_SCREEN | GLAMOR_NO_DRI3; + int flags = GLAMOR_USE_EGL_SCREEN; if (!fbGlamorAllowed) { flags |= GLAMOR_NO_RENDER_ACCEL; } else if (!fbForceGlamor){ @@ -56,6 +82,14 @@ fbdevInitAccel(ScreenPtr pScreen) } } +#ifdef WITH_LIBDRM + if (scrpriv->dri_fd < 0 || + flags & GLAMOR_NO_RENDER_ACCEL) +#endif + { + flags |= GLAMOR_NO_DRI3; + } + if (!glamor_init(pScreen, flags)) { return FALSE; } @@ -85,6 +119,13 @@ fbdevDisableAccel(ScreenPtr screen) void fbdevFiniAccel(ScreenPtr pScreen) { - /* Handled by CloseScreen */ - (void)pScreen; +#ifdef WITH_LIBDRM + KdScreenPriv(pScreen); + KdScreenInfo *screen = pScreenPriv->screen; + FbdevScrPriv *scrpriv = screen->driver; + + if (scrpriv->dri_fd >= 0) { + close(scrpriv->dri_fd); + } +#endif } diff --git a/hw/kdrive/fbdev/fbdev.c b/hw/kdrive/fbdev/fbdev.c index aeda6a5563..6155f07d64 100644 --- a/hw/kdrive/fbdev/fbdev.c +++ b/hw/kdrive/fbdev/fbdev.c @@ -30,6 +30,10 @@ #include "fbdev.h" +#if defined (GLAMOR) && defined (WITH_LIBDRM) +#include +#endif + const char *fbdevDevicePath = NULL; Bool fbDisableShadow = FALSE; @@ -755,6 +759,14 @@ fbdevEnable(ScreenPtr pScreen) { KdScreenPriv(pScreen); FbdevPriv *priv = pScreenPriv->card->driver; +#if defined (GLAMOR) && defined (WITH_LIBDRM) + KdScreenInfo *screen = pScreenPriv->screen; + FbdevScrPriv *scrpriv = screen->driver; + + if (scrpriv->dri_fd >= 0) { + drmSetMaster(scrpriv->dri_fd); + } +#endif int k; priv->var.activate = FB_ACTIVATE_NOW | FB_CHANGE_CMAP_VBL; @@ -810,6 +822,15 @@ fbdevDPMS(ScreenPtr pScreen, int mode) void fbdevDisable(ScreenPtr pScreen) { +#if defined (GLAMOR) && defined (WITH_LIBDRM) + KdScreenPriv(pScreen); + KdScreenInfo *screen = pScreenPriv->screen; + FbdevScrPriv *scrpriv = screen->driver; + + if (scrpriv->dri_fd >= 0) { + drmDropMaster(scrpriv->dri_fd); + } +#endif } void diff --git a/hw/kdrive/fbdev/fbdev.h b/hw/kdrive/fbdev/fbdev.h index 98756149f5..4e37ff9841 100644 --- a/hw/kdrive/fbdev/fbdev.h +++ b/hw/kdrive/fbdev/fbdev.h @@ -47,6 +47,9 @@ typedef struct _fbdevPriv { typedef struct _fbdevScrPriv { Rotation randr; Bool shadow; +#if defined (GLAMOR) && defined (WITH_LIBDRM) + int dri_fd; +#endif } FbdevScrPriv; extern KdCardFuncs fbdevFuncs; @@ -55,6 +58,7 @@ extern Bool fbDisableShadow; #ifdef GLAMOR extern char *fbdev_glvnd_provider; +extern char *fbdev_dri_path; extern bool es_allowed; extern bool force_es; extern bool fbGlamorAllowed; diff --git a/hw/kdrive/fbdev/fbinit.c b/hw/kdrive/fbdev/fbinit.c index 38dd8bf1e9..4140e94f24 100644 --- a/hw/kdrive/fbdev/fbinit.c +++ b/hw/kdrive/fbdev/fbinit.c @@ -70,6 +70,8 @@ ddxUseMsg(void) ErrorF("\nXfbdev Device Usage:\n"); ErrorF ("-fb path Framebuffer device to use. Defaults to /dev/fb0\n"); + ErrorF + ("-dri path Optional drm device path to use\n"); ErrorF ("-noshadow Disable the ShadowFB layer if possible\n"); ErrorF @@ -124,6 +126,15 @@ ddxProcessArgument(int argc, char **argv, int i) exit(1); } + if (!strcmp(argv[i], "-dri")) { + if (i + 1 < argc) { + fbdev_dri_path = strdup(argv[i + 1]); + return 2; + } + UseMsg(); + exit(1); + } + if (!strcmp(argv[i], "-force-gl")) { es_allowed = FALSE; return 1; diff --git a/hw/kdrive/fbdev/meson.build b/hw/kdrive/fbdev/meson.build index a036581b20..7b6138cd36 100644 --- a/hw/kdrive/fbdev/meson.build +++ b/hw/kdrive/fbdev/meson.build @@ -18,7 +18,7 @@ xfbdev_server = executable( include_directories('../src'), include_directories('../linux'), ], - dependencies: [ common_dep ], + dependencies: [ common_dep, libdrm_dep ], link_with: [ libxserver_main, fbdev_glamor,