mirror of
https://github.com/X11Libre/xserver.git
synced 2026-11-15 05:23:40 +00:00
kdrive/fbdev: Add DRI3 support through glamor
Signed-off-by: stefan11111 <stefan11111github@gmail.com>
This commit is contained in:
parent
adffc74e07
commit
e2ff92b7bd
5 changed files with 82 additions and 5 deletions
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Reference in a new issue