mirror of
https://gitlab.freedesktop.org/xorg/xserver.git
synced 2026-06-19 08:58:25 +02:00
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:
parent
db568f9eab
commit
1545a120df
3 changed files with 28 additions and 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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue