kdrive/fbdev: Add DRI3 support through glamor

Signed-off-by: stefan11111 <stefan11111github@gmail.com>
This commit is contained in:
stefan11111 2026-05-06 02:16:04 +03:00 • committed by Enrico Weigelt
commit e2ff92b7bd
5 changed files with 82 additions and 5 deletions

View file

@ -18,7 +18,12 @@
#include "kxv.h"
#endif
#ifdef WITH_LIBDRM
#include <xf86drm.h>
#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
}

View file

@ -30,6 +30,10 @@
#include "fbdev.h"
#if defined (GLAMOR) && defined (WITH_LIBDRM)
#include <xf86drm.h>
#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

View file

@ -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;

View file

@ -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;

View file

@ -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,