From a330e82f6e78be71b5df581fb85ccc03fe134a8a Mon Sep 17 00:00:00 2001 From: stefan11111 Date: Sat, 23 May 2026 00:06:04 +0300 Subject: [PATCH] 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 --- hw/kdrive/fbdev/Xfbdev.man | 3 +++ hw/kdrive/fbdev/fb_glamor.c | 18 ++++++++++++++++++ hw/kdrive/fbdev/fbdev.h | 2 +- hw/kdrive/fbdev/fbinit.c | 9 +++++++++ 4 files changed, 31 insertions(+), 1 deletion(-) diff --git a/hw/kdrive/fbdev/Xfbdev.man b/hw/kdrive/fbdev/Xfbdev.man index f058ad7397..245dec11d6 100644 --- a/hw/kdrive/fbdev/Xfbdev.man +++ b/hw/kdrive/fbdev/Xfbdev.man @@ -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 diff --git a/hw/kdrive/fbdev/fb_glamor.c b/hw/kdrive/fbdev/fb_glamor.c index c64c269d8e..55f9b7add4 100644 --- a/hw/kdrive/fbdev/fb_glamor.c +++ b/hw/kdrive/fbdev/fb_glamor.c @@ -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); diff --git a/hw/kdrive/fbdev/fbdev.h b/hw/kdrive/fbdev/fbdev.h index 8c92a0c6b2..c389f35fd9 100644 --- a/hw/kdrive/fbdev/fbdev.h +++ b/hw/kdrive/fbdev/fbdev.h @@ -55,7 +55,7 @@ typedef struct _fbdevScrPriv { typedef struct _fbScreenConf { const char *fbdevDevicePath; Bool fbDisableShadow; - +bool fbNoAccel; #ifdef GLAMOR char *fbdev_glvnd_provider; diff --git a/hw/kdrive/fbdev/fbinit.c b/hw/kdrive/fbdev/fbinit.c index 2d2a76797c..37e9a58538 100644 --- a/hw/kdrive/fbdev/fbinit.c +++ b/hw/kdrive/fbdev/fbinit.c @@ -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;