diff options
Diffstat (limited to 'hw')
-rw-r--r-- | hw/xfree86/xaa/xaa.h | 40 | ||||
-rw-r--r-- | hw/xfree86/xaa/xaaInitAccel.c | 8 | ||||
-rw-r--r-- | hw/xfree86/xaa/xaaPict.c | 32 |
3 files changed, 68 insertions, 12 deletions
diff --git a/hw/xfree86/xaa/xaa.h b/hw/xfree86/xaa/xaa.h index 98db3cf50..d4ff7bbd8 100644 --- a/hw/xfree86/xaa/xaa.h +++ b/hw/xfree86/xaa/xaa.h @@ -1278,6 +1278,10 @@ typedef struct _XAAInfoRec { GlyphPtr *glyphs ); + /* The old SetupForCPUToScreenAlphaTexture function is no longer used because + * it doesn't pass in enough information to write a conforming + * implementation. See SetupForCPUToScreenAlphaTexture2. + */ Bool (*SetupForCPUToScreenAlphaTexture) ( ScrnInfoPtr pScrn, int op, @@ -1304,6 +1308,10 @@ typedef struct _XAAInfoRec { int CPUToScreenAlphaTextureFlags; CARD32 * CPUToScreenAlphaTextureFormats; + /* The old SetupForCPUToScreenTexture function is no longer used because + * it doesn't pass in enough information to write a conforming + * implementation. See SetupForCPUToScreenTexture2. + */ Bool (*SetupForCPUToScreenTexture) ( ScrnInfoPtr pScrn, int op, @@ -1333,6 +1341,38 @@ typedef struct _XAAInfoRec { BoxRec SolidLineLimits; BoxRec DashedLineLimits; +#ifdef RENDER + /* These were added for X.Org 6.8.0 */ + Bool (*SetupForCPUToScreenAlphaTexture2) ( + ScrnInfoPtr pScrn, + int op, + CARD16 red, + CARD16 green, + CARD16 blue, + CARD16 alpha, + CARD32 maskFormat, + CARD32 dstFormat, + CARD8 *alphaPtr, + int alphaPitch, + int width, + int height, + int flags + ); + CARD32 *CPUToScreenAlphaTextureDstFormats; + + Bool (*SetupForCPUToScreenTexture2) ( + ScrnInfoPtr pScrn, + int op, + CARD32 srcFormat, + CARD32 dstFormat, + CARD8 *texPtr, + int texPitch, + int width, + int height, + int flags + ); + CARD32 *CPUToScreenTextureDstFormats; +#endif /* RENDER */ } XAAInfoRec, *XAAInfoRecPtr; #define SET_SYNC_FLAG(infoRec) (infoRec)->NeedToSync = TRUE diff --git a/hw/xfree86/xaa/xaaInitAccel.c b/hw/xfree86/xaa/xaaInitAccel.c index 02e5fb6fc..9d3764506 100644 --- a/hw/xfree86/xaa/xaaInitAccel.c +++ b/hw/xfree86/xaa/xaaInitAccel.c @@ -102,7 +102,7 @@ static XF86ModuleVersionInfo xaaVersRec = MODINFOSTRING1, MODINFOSTRING2, XORG_VERSION_CURRENT, - 1, 1, 0, + 1, 2, 0, ABI_CLASS_VIDEODRV, /* requires the video driver ABI */ ABI_VIDEODRV_VERSION, MOD_CLASS_NONE, @@ -1269,10 +1269,12 @@ XAAInitAccel(ScreenPtr pScreen, XAAInfoRecPtr infoRec) #ifdef RENDER { Bool haveTexture = infoRec->CPUToScreenTextureFormats && - infoRec->SetupForCPUToScreenTexture && + infoRec->CPUToScreenTextureDstFormats && + infoRec->SetupForCPUToScreenTexture2 && infoRec->SubsequentCPUToScreenTexture; Bool haveAlphaTexture = infoRec->CPUToScreenAlphaTextureFormats && - infoRec->SetupForCPUToScreenAlphaTexture && + infoRec->CPUToScreenAlphaTextureDstFormats && + infoRec->SetupForCPUToScreenAlphaTexture2 && infoRec->SubsequentCPUToScreenAlphaTexture; if(!infoRec->Composite && (haveTexture || haveAlphaTexture)) diff --git a/hw/xfree86/xaa/xaaPict.c b/hw/xfree86/xaa/xaaPict.c index af3380231..7df806042 100644 --- a/hw/xfree86/xaa/xaaPict.c +++ b/hw/xfree86/xaa/xaaPict.c @@ -190,7 +190,7 @@ XAADoComposite ( ScreenPtr pScreen = pDst->pDrawable->pScreen; XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCREEN(pScreen); RegionRec region; - CARD32 *formats; + CARD32 *formats, *dstformats; int flags = 0; BoxPtr pbox; int nbox, w, h; @@ -279,7 +279,9 @@ XAADoComposite ( return TRUE; } - if(!(formats = infoRec->CPUToScreenAlphaTextureFormats)) + formats = infoRec->CPUToScreenAlphaTextureFormats; + dstformats = infoRec->CPUToScreenAlphaTextureDstFormats; + if(!formats || !dstformats) return FALSE; w = pMask->pDrawable->width; @@ -304,6 +306,11 @@ XAADoComposite ( if(!(*formats)) return FALSE; formats++; } + while(*dstformats != pDst->format) { + if(!(*dstformats)) + return FALSE; + dstformats++; + } if (!miComputeCompositeRegion (®ion, pSrc, pMask, pDst, xSrc, ySrc, xMask, yMask, xDst, yDst, @@ -318,8 +325,9 @@ XAADoComposite ( return TRUE; } - if(!(infoRec->SetupForCPUToScreenAlphaTexture)(infoRec->pScrn, - op, red, green, blue, alpha, pMask->format, + if(!(infoRec->SetupForCPUToScreenAlphaTexture2)(infoRec->pScrn, + op, red, green, blue, alpha, pMask->format, + pDst->format, ((PixmapPtr)(pMask->pDrawable))->devPrivate.ptr, ((PixmapPtr)(pMask->pDrawable))->devKind, w, h, flags)) @@ -343,8 +351,10 @@ XAADoComposite ( REGION_UNINIT(pScreen, ®ion); return TRUE; } - } else { - if(!(formats = infoRec->CPUToScreenTextureFormats)) + } else { + formats = infoRec->CPUToScreenTextureFormats; + dstformats = infoRec->CPUToScreenTextureDstFormats; + if(!formats || !dstformats) return FALSE; w = pSrc->pDrawable->width; @@ -361,11 +371,15 @@ XAADoComposite ( flags |= XAA_RENDER_REPEAT; } - while(*formats != pSrc->format) { if(!(*formats)) return FALSE; formats++; } + while(*dstformats != pDst->format) { + if(!(*dstformats)) + return FALSE; + dstformats++; + } if (!miComputeCompositeRegion (®ion, pSrc, pMask, pDst, xSrc, ySrc, xMask, yMask, xDst, yDst, @@ -380,8 +394,8 @@ XAADoComposite ( return TRUE; } - if(!(infoRec->SetupForCPUToScreenTexture)(infoRec->pScrn, - op, pSrc->format, + if(!(infoRec->SetupForCPUToScreenTexture2)(infoRec->pScrn, + op, pSrc->format, pDst->format, ((PixmapPtr)(pSrc->pDrawable))->devPrivate.ptr, ((PixmapPtr)(pSrc->pDrawable))->devKind, w, h, flags)) |