summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/armsoc_driver.c44
-rw-r--r--src/armsoc_dumb.c6
-rw-r--r--src/armsoc_dumb.h1
-rw-r--r--src/drmmode_display.c20
4 files changed, 43 insertions, 28 deletions
diff --git a/src/armsoc_driver.c b/src/armsoc_driver.c
index 590352e..3181ed3 100644
--- a/src/armsoc_driver.c
+++ b/src/armsoc_driver.c
@@ -760,7 +760,7 @@ ARMSOCPreInit(ScrnInfoPtr pScrn, int flags)
pScrn->monitor = pScrn->confScreen->monitor;
- /* Get the current depth, and set it for XFree86: */
+ /* Get the current color depth & bpp, and set it for XFree86: */
default_depth = 24; /* TODO: MIDEGL-1445: get from kernel */
fbbpp = 32; /* TODO: MIDEGL-1445: get from kernel */
@@ -880,7 +880,7 @@ ARMSOCPreInit(ScrnInfoPtr pScrn, int flags)
/* Let XFree86 calculate or get (from command line) the display DPI: */
xf86SetDpi(pScrn, 0, 0);
- /* Ensure we have a supported depth: */
+ /* Ensure we have a supported bitsPerPixel: */
switch (pScrn->bitsPerPixel) {
case 16:
case 24:
@@ -893,9 +893,7 @@ ARMSOCPreInit(ScrnInfoPtr pScrn, int flags)
goto fail2;
}
-
/* Load external sub-modules now: */
-
if (!(xf86LoadSubModule(pScrn, "dri2") &&
xf86LoadSubModule(pScrn, "exa") &&
xf86LoadSubModule(pScrn, "fb"))) {
@@ -952,6 +950,7 @@ ARMSOCScreenInit(SCREEN_INIT_ARGS_DECL)
xf86CrtcConfigPtr xf86_config;
int j;
char *fbdev;
+ int depth;
TRACE_ENTER();
@@ -960,12 +959,22 @@ ARMSOCScreenInit(SCREEN_INIT_ARGS_DECL)
ERROR_MSG("Cannot get DRM master: %s", strerror(errno));
goto fail;
}
- /* Allocate initial scanout buffer */
- DEBUG_MSG("allocating new scanout buffer: %dx%d",
- pScrn->virtualX, pScrn->virtualY);
+
+ /* We create a single visual with the depth set to the
+ * screen's bpp as otherwise XComposite will add an alternate
+ * visual and ARGB8888 windows will be implicitly redirected.
+ * The initial scanout buffer is created with the same depth
+ * to match the visual.
+ */
+ depth = pScrn->bitsPerPixel;
+
+ /* Allocate initial scanout buffer.*/
+ DEBUG_MSG("allocating new scanout buffer: %dx%d %d %d",
+ pScrn->virtualX, pScrn->virtualY,
+ depth, pScrn->bitsPerPixel);
assert(!pARMSOC->scanout);
pARMSOC->scanout = armsoc_bo_new_with_dim(pARMSOC->dev, pScrn->virtualX,
- pScrn->virtualY, pScrn->depth, pScrn->bitsPerPixel,
+ pScrn->virtualY, depth, pScrn->bitsPerPixel,
ARMSOC_BO_SCANOUT);
if (!pARMSOC->scanout) {
ERROR_MSG("Cannot allocate scanout buffer\n");
@@ -995,26 +1004,17 @@ ARMSOCScreenInit(SCREEN_INIT_ARGS_DECL)
/* Reset the visual list. */
miClearVisualTypes();
- if (!miSetVisualTypes(pScrn->bitsPerPixel,
- miGetDefaultVisualMask(pScrn->depth),
+
+ if (!miSetVisualTypes(depth,
+ miGetDefaultVisualMask(depth),
pScrn->rgbBits, pScrn->defaultVisual)) {
ERROR_MSG(
- "Cannot initialize the visual type for %d bits per pixel!",
+ "Cannot initialize the visual type for %d depth, %d bits per pixel!",
+ depth,
pScrn->bitsPerPixel);
goto fail2;
}
- if (pScrn->bitsPerPixel == 32 && pScrn->depth == 24) {
- /* Also add a 24 bit depth visual */
- if (!miSetVisualTypes(24, miGetDefaultVisualMask(pScrn->depth),
- pScrn->rgbBits, pScrn->defaultVisual)) {
- WARNING_MSG(
- "Cannot initialize a 24 depth visual for 32bpp");
- } else {
- INFO_MSG("Initialized a 24 depth visual for 32bpp");
- }
- }
-
if (!miSetPixmapDepths()) {
ERROR_MSG("Cannot initialize the pixmap depth!");
goto fail3;
diff --git a/src/armsoc_dumb.c b/src/armsoc_dumb.c
index 33f9b44..eee8904 100644
--- a/src/armsoc_dumb.c
+++ b/src/armsoc_dumb.c
@@ -266,6 +266,12 @@ uint32_t armsoc_bo_height(struct armsoc_bo *bo)
return bo->height;
}
+uint8_t armsoc_bo_depth(struct armsoc_bo *bo)
+{
+ assert(bo->refcnt > 0);
+ return bo->depth;
+}
+
uint32_t armsoc_bo_bpp(struct armsoc_bo *bo)
{
assert(bo->refcnt > 0);
diff --git a/src/armsoc_dumb.h b/src/armsoc_dumb.h
index c510c18..a299ccf 100644
--- a/src/armsoc_dumb.h
+++ b/src/armsoc_dumb.h
@@ -76,6 +76,7 @@ struct armsoc_bo *armsoc_bo_new_with_dim(struct armsoc_device *dev,
enum armsoc_buf_type buf_type);
uint32_t armsoc_bo_width(struct armsoc_bo *bo);
uint32_t armsoc_bo_height(struct armsoc_bo *bo);
+uint8_t armsoc_bo_depth(struct armsoc_bo *bo);
uint32_t armsoc_bo_bpp(struct armsoc_bo *bo);
uint32_t armsoc_bo_pitch(struct armsoc_bo *bo);
diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index b9e59f1..27d5ab6 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -1430,22 +1430,30 @@ static Bool resize_scanout_bo(ScrnInfoPtr pScrn, int width, int height)
struct ARMSOCRec *pARMSOC = ARMSOCPTR(pScrn);
ScreenPtr pScreen = pScrn->pScreen;
uint32_t pitch;
+ uint8_t depth, bpp;
TRACE_ENTER();
- DEBUG_MSG("Resize: %dx%d", width, height);
+
+ depth = armsoc_bo_depth(pARMSOC->scanout);
+ bpp = armsoc_bo_bpp(pARMSOC->scanout);
+ DEBUG_MSG("Resize: %dx%d %d,%d", width, height, depth, bpp );
+
+ /* We don't expect the depth and bpp to change for the screen
+ * assert this here as a check */
+ assert( depth == pScrn->bitsPerPixel );
+ assert( bpp == pScrn->bitsPerPixel );
pScrn->virtualX = width;
pScrn->virtualY = height;
- if ((width != armsoc_bo_width(pARMSOC->scanout))
- || (height != armsoc_bo_height(pARMSOC->scanout))
- || (pScrn->bitsPerPixel != armsoc_bo_bpp(pARMSOC->scanout))) {
+ if ((width != armsoc_bo_width(pARMSOC->scanout)) ||
+ (height != armsoc_bo_height(pARMSOC->scanout))) {
struct armsoc_bo *new_scanout;
/* allocate new scanout buffer */
new_scanout = armsoc_bo_new_with_dim(pARMSOC->dev,
width, height,
- pScrn->depth, pScrn->bitsPerPixel,
+ depth, bpp,
ARMSOC_BO_SCANOUT);
if (!new_scanout) {
/* Try to use the previous buffer if the new resolution
@@ -1521,7 +1529,7 @@ static Bool resize_scanout_bo(ScrnInfoPtr pScrn, int width, int height)
pScreen->ModifyPixmapHeader(rootPixmap,
pScrn->virtualX, pScrn->virtualY,
- pScrn->depth, pScrn->bitsPerPixel, pitch,
+ depth, bpp, pitch,
armsoc_bo_map(pARMSOC->scanout));
/* Bump the serial number to ensure that all existing DRI2