kdrive/fbdev: Implement -noaccel flag

Similar to `-dumb`, but allows disabling acceleration
for a single screen, as oposed to the whole server

Signed-off-by: stefan11111 <stefan11111github@gmail.com>
This commit is contained in:
stefan11111 2026-05-23 00:06:04 +03:00 • committed by Enrico Weigelt
commit a330e82f6e
4 changed files with 31 additions and 1 deletions

View file

@ -45,6 +45,9 @@ tells the X server to enable master permissions on the dri fd it uses
disables the ShadowFB layer on supported hw, may slightly increase performance.
May also lead to flickering.
.TP 8
.B -noaccel
disables hw acceleration (similar to -dumb, but only for a single screen).
.TP 8
.B -glamor
force enables glamor render acceleration (even on top of sw renderers like softpipe/llvmpipe).
.TP 8

View file

@ -32,6 +32,11 @@ fbdevInitAccel(ScreenPtr pScreen)
FbdevScrPriv *scrpriv = screen->driver;
FbScreenConf *config = screen->card->closure;
if (config->fbNoAccel) {
/* Only disable accel for this screen */
return TRUE;
}
if (config->fbdev_dri_path) {
scrpriv->dri_fd = open(config->fbdev_dri_path, O_RDWR);
if (scrpriv->dri_fd >= 0) {
@ -113,6 +118,10 @@ fbdevEnableAccel(ScreenPtr pScreen)
FbdevScrPriv *scrpriv = screen->driver;
FbScreenConf *config = screen->card->closure;
if (config->fbNoAccel) {
return;
}
if (config->fbdev_drm_master && scrpriv->dri_fd >= 0) {
drmSetMaster(scrpriv->dri_fd);
}
@ -128,6 +137,10 @@ fbdevDisableAccel(ScreenPtr pScreen)
FbdevScrPriv *scrpriv = screen->driver;
FbScreenConf *config = screen->card->closure;
if (config->fbNoAccel) {
return;
}
if (config->fbdev_drm_master && scrpriv->dri_fd >= 0) {
drmDropMaster(scrpriv->dri_fd);
}
@ -140,6 +153,11 @@ fbdevFiniAccel(ScreenPtr pScreen)
KdScreenPriv(pScreen);
KdScreenInfo *screen = pScreenPriv->screen;
FbdevScrPriv *scrpriv = screen->driver;
FbScreenConf *config = screen->card->closure;
if (config->fbNoAccel) {
return;
}
if (scrpriv->dri_fd >= 0) {
close(scrpriv->dri_fd);

View file

@ -55,7 +55,7 @@ typedef struct _fbdevScrPriv {
typedef struct _fbScreenConf {
const char *fbdevDevicePath;
Bool fbDisableShadow;
bool fbNoAccel;
#ifdef GLAMOR
char *fbdev_glvnd_provider;

View file

@ -96,6 +96,8 @@ fbdevLogScreenInfo(FbScreenConf *config, int screen_num)
config->fbdevDevicePath ? config->fbdevDevicePath : "not passed");
LogMessage(X_INFO, "Xfbdev(%d): ShadowFB %s\n", screen_num,
config->fbDisableShadow ? "disabled" : "enabled");
LogMessage(X_INFO, "Xfbdev(%d): HW Acceleration %s\n", screen_num,
config->fbNoAccel ? "disabled" : "enabled");
#ifdef GLAMOR
LogMessage(X_INFO, "Xfbdev(%d): glvnd library: %s\n", screen_num,
config->fbdev_glvnd_provider ? config->fbdev_glvnd_provider : "not passed");
@ -167,6 +169,8 @@ ddxUseMsg(void)
("-drm-master Enable master permissions on the fd used for dri\n");
ErrorF
("-noshadow Disable the ShadowFB layer if possible\n");
ErrorF
("-noaccel Disable hw acceleration (per screen)\n");
ErrorF
("-glamor Force enable glamor render acceleration if possible\n");
ErrorF
@ -215,6 +219,11 @@ ddxProcessArgument(int argc, char **argv, int i)
return 1;
}
if (!strcmp(argv[i], "-noaccel")) {
fbCurrScreen->fbNoAccel = TRUE;
return 1;
}
#ifdef GLAMOR
if (!strcmp(argv[i], "-glamor")) {
fbCurrScreen->fbForceGlamor = TRUE;