exa: fix CreatePixmap2 to be useful for tiling.

This adds a pitch return so that the driver can align the pitch to any
value it wishes and not just the one it gave to EXA at startup.
This commit is contained in:
Dave Airlie 2009-08-11 15:00:36 +10:00
parent db568f9eab
commit 1545a120df
3 changed files with 28 additions and 21 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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;