diff options
author | Eric Anholt <anholt@freebsd.org> | 2004-08-04 10:05:37 +0000 |
---|---|---|
committer | Eric Anholt <anholt@freebsd.org> | 2004-08-04 10:05:37 +0000 |
commit | 751fd11a9ad1a473d7311362246b0869a008001b (patch) | |
tree | b355d3bc40e7cbd0d958bdd31c40aa5b72507338 | |
parent | 9c1d52a69db841ac85ef97d7223361b83a66ae29 (diff) |
- Add two new XAA hooks, SetupForCPUToScreenTexture2 and
SetupForCPUToScreenAlphaTexture2. These add a dstFormat argument after
the previous format argument, which the driver needs to use to properly
set up the destination format. Two new arrays are added for the list of
destination formats supported that correspond to the previous format
arrays for sources.
- Make Render acceleration only occur when the new hook for that
acceleration type is supplied and the dst format list is set, along
with the src format list being set. Without knowing the destination
format, the Render acceleration couldn't properly support all the
destinations it might encounter.
- Bump XAA module minor version.
- Update the Radeon Render acceleration to use the new hooks when the XAA
module is sufficiently new. Fix a bug in the src/dst alpha booleans for
ops, and use them to set blend_cntl to support destinations without
alpha. Add missing PICT_a1r5g5b5 texture format, and add list
terminator. (!)
-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)) |