diff options
-rw-r--r-- | exa/exa.h | 4 | ||||
-rw-r--r-- | exa/exa_driver.c | 31 | ||||
-rw-r--r-- | exa/exa_migration_mixed.c | 14 |
3 files changed, 28 insertions, 21 deletions
@@ -708,8 +708,10 @@ typedef struct _ExaDriver { int depth, int bitsPerPixel, int devKind, pointer pPixData); + /* if the driver is going to tile the buffer it may need to adjust the pitch alignment */ void *(*CreatePixmap2)(ScreenPtr pScreen, int width, int height, - int depth, int usage_hint, int bitsPerPixel); + int depth, int usage_hint, int bitsPerPixel, + int *new_fb_pitch); /** @} */ } ExaDriverRec, *ExaDriverPtr; diff --git a/exa/exa_driver.c b/exa/exa_driver.c index b4ca42638..97036955b 100644 --- a/exa/exa_driver.c +++ b/exa/exa_driver.c @@ -71,26 +71,29 @@ exaCreatePixmap_driver(ScreenPtr pScreen, int w, int h, int depth, bpp = pPixmap->drawable.bitsPerPixel; - paddedWidth = ((w * bpp + FB_MASK) >> FB_SHIFT) * sizeof(FbBits); - if (paddedWidth / 4 > 32767 || h > 32767) - return NullPixmap; - - exaSetFbPitch(pExaScr, pExaPixmap, w, h, bpp); - - if (paddedWidth < pExaPixmap->fb_pitch) - paddedWidth = pExaPixmap->fb_pitch; - - datasize = h * paddedWidth; - /* Set this before driver hooks, to allow for !offscreen pixmaps. * !offscreen pixmaps have a valid pointer at all times. */ pPixmap->devPrivate.ptr = NULL; - if (pExaScr->info->CreatePixmap2) - pExaPixmap->driverPriv = pExaScr->info->CreatePixmap2(pScreen, w, h, depth, usage_hint, bpp); - else + if (pExaScr->info->CreatePixmap2) { + int new_pitch = 0; + pExaPixmap->driverPriv = pExaScr->info->CreatePixmap2(pScreen, w, h, depth, usage_hint, bpp, &new_pitch); + paddedWidth = pExaPixmap->fb_pitch = new_pitch; + } + else { + paddedWidth = ((w * bpp + FB_MASK) >> FB_SHIFT) * sizeof(FbBits); + if (paddedWidth / 4 > 32767 || h > 32767) + return NullPixmap; + + exaSetFbPitch(pExaScr, pExaPixmap, w, h, bpp); + + if (paddedWidth < pExaPixmap->fb_pitch) + paddedWidth = pExaPixmap->fb_pitch; + datasize = h * paddedWidth; pExaPixmap->driverPriv = pExaScr->info->CreatePixmap(pScreen, datasize, 0); + } + if (!pExaPixmap->driverPriv) { swap(pExaScr, pScreen, DestroyPixmap); pScreen->DestroyPixmap (pPixmap); diff --git a/exa/exa_migration_mixed.c b/exa/exa_migration_mixed.c index ed0cc142b..d1ee9871b 100644 --- a/exa/exa_migration_mixed.c +++ b/exa/exa_migration_mixed.c @@ -92,13 +92,15 @@ exaCreateDriverPixmap_mixed(PixmapPtr pPixmap) if (pExaPixmap->accel_blocked || bpp < 8) return; - if (paddedWidth < pExaPixmap->fb_pitch) - paddedWidth = pExaPixmap->fb_pitch; - - if (pExaScr->info->CreatePixmap2) - pExaPixmap->driverPriv = pExaScr->info->CreatePixmap2(pScreen, w, h, depth, usage_hint, bpp); - else + if (pExaScr->info->CreatePixmap2) { + int new_pitch = 0; + pExaPixmap->driverPriv = pExaScr->info->CreatePixmap2(pScreen, w, h, depth, usage_hint, bpp, &new_pitch); + paddedWidth = pExaPixmap->fb_pitch = new_pitch; + } else { + if (paddedWidth < pExaPixmap->fb_pitch) + paddedWidth = pExaPixmap->fb_pitch; pExaPixmap->driverPriv = pExaScr->info->CreatePixmap(pScreen, paddedWidth*h, 0); + } if (!pExaPixmap->driverPriv) return; |