summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Jackson <ajax@redhat.com>2017-01-05 14:36:51 -0500
committerAdam Jackson <ajax@redhat.com>2017-02-16 12:22:09 -0500
commite0bce0d017c5e1597aa8269551355e1ddeb3c8fb (patch)
tree922924fa1a8a79e0edead3937c36c76d7bfbf48f
parent3cf99231199bd5bd9e681e85d9da1f9eb736e3e7 (diff)
Use shadowUpdate32to24 at 24bpp
Signed-off-by: Adam Jackson <ajax@redhat.com>
-rw-r--r--man/fbdev.man6
-rw-r--r--src/fbdev.c43
2 files changed, 43 insertions, 6 deletions
diff --git a/man/fbdev.man b/man/fbdev.man
index bda0ed6..ed73d00 100644
--- a/man/fbdev.man
+++ b/man/fbdev.man
@@ -47,12 +47,14 @@ are supported:
The framebuffer device to use. Default: /dev/fb0.
.TP
.BI "Option \*qShadowFB\*q \*q" boolean \*q
-Enable or disable use of the shadow framebuffer layer. Default: on.
+Enable or disable use of the shadow framebuffer layer. Mandatory for 24bpp
+framebuffers on newer servers. Default: on.
.TP
.BI "Option \*qRotate\*q \*q" string \*q
Enable rotation of the display. The supported values are "CW" (clockwise,
90 degrees), "UD" (upside down, 180 degrees) and "CCW" (counter clockwise,
-270 degrees). Implies use of the shadow framebuffer layer. Default: off.
+270 degrees). Implies use of the shadow framebuffer layer. Disabled for 24bpp
+framebuffers. Default: off.
.SH "SEE ALSO"
__xservername__(__appmansuffix__), __xconfigfile__(__filemansuffix__), Xserver(__appmansuffix__),
X(__miscmansuffix__), fbdevhw(__drivermansuffix__)
diff --git a/src/fbdev.c b/src/fbdev.c
index eaf3aa8..af1587f 100644
--- a/src/fbdev.c
+++ b/src/fbdev.c
@@ -41,6 +41,10 @@
/* for xf86{Depth,FbBpp}. i am a terrible person, and i am sorry. */
#include "xf86Priv.h"
+#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) > 23
+#define HAVE_SHADOW_3224
+#endif
+
static Bool debug = 0;
#define TRACE_ENTER(str) \
@@ -181,6 +185,7 @@ typedef struct {
int lineLength;
int rotate;
Bool shadowFB;
+ Bool shadow24;
void *shadow;
CloseScreenProcPtr CloseScreen;
CreateScreenResourcesProcPtr CreateScreenResources;
@@ -482,6 +487,15 @@ FBDevPreInit(ScrnInfoPtr pScrn, int flags)
fbbpp = 32;
} while (0);
+ fPtr->shadow24 = FALSE;
+#if HAVE_SHADOW_3224
+ /* okay but 24bpp is awful */
+ if (fbbpp == 24) {
+ fPtr->shadow24 = TRUE;
+ fbbpp = 32;
+ }
+#endif
+
if (!xf86SetDepthBpp(pScrn, default_depth, default_depth, fbbpp,
Support24bppFb | Support32bppFb | SupportConvert32to24 | SupportConvert24to32))
return FALSE;
@@ -531,12 +545,18 @@ FBDevPreInit(ScrnInfoPtr pScrn, int flags)
/* use shadow framebuffer by default */
fPtr->shadowFB = xf86ReturnOptValBool(fPtr->Options, OPTION_SHADOW_FB, TRUE);
+ if (!fPtr->shadowFB && fPtr->shadow24) {
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "24bpp requires shadow framebuffer, forcing\n");
+ fPtr->shadowFB = TRUE;
+ }
debug = xf86ReturnOptValBool(fPtr->Options, OPTION_DEBUG, FALSE);
/* rotation */
fPtr->rotate = FBDEV_ROTATE_NONE;
- if ((s = xf86GetOptValString(fPtr->Options, OPTION_ROTATE)))
+ s = xf86GetOptValString(fPtr->Options, OPTION_ROTATE);
+ if (s && !fPtr->shadow24)
{
if(!xf86NameCmp(s, "CW"))
{
@@ -658,6 +678,14 @@ FBDevPreInit(ScrnInfoPtr pScrn, int flags)
}
static void
+fbdevUpdate32to24(ScreenPtr pScreen, shadowBufPtr pBuf)
+{
+#ifdef HAVE_SHADOW_3224
+ shadowUpdate32to24(pScreen, pBuf);
+#endif
+}
+
+static void
fbdevUpdateRotatePacked(ScreenPtr pScreen, shadowBufPtr pBuf)
{
shadowUpdateRotatePacked(pScreen, pBuf);
@@ -676,6 +704,7 @@ FBDevCreateScreenResources(ScreenPtr pScreen)
ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
FBDevPtr fPtr = FBDEVPTR(pScrn);
Bool ret;
+ void (*update)(ScreenPtr, shadowBufPtr);
pScreen->CreateScreenResources = fPtr->CreateScreenResources;
ret = pScreen->CreateScreenResources(pScreen);
@@ -686,9 +715,15 @@ FBDevCreateScreenResources(ScreenPtr pScreen)
pPixmap = pScreen->GetScreenPixmap(pScreen);
- if (!shadowAdd(pScreen, pPixmap, fPtr->rotate ?
- fbdevUpdateRotatePacked : fbdevUpdatePacked,
- FBDevWindowLinear, fPtr->rotate, NULL)) {
+ if (fPtr->shadow24)
+ update = fbdevUpdate32to24;
+ else if (fPtr->rotate)
+ update = fbdevUpdateRotatePacked;
+ else
+ update = fbdevUpdatePacked;
+
+ if (!shadowAdd(pScreen, pPixmap, update, FBDevWindowLinear, fPtr->rotate,
+ NULL)) {
return FALSE;
}