diff options
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/g80_driver.c | 54 | ||||
-rw-r--r-- | src/g80_exa.c | 102 | ||||
-rw-r--r-- | src/g80_exa.h | 1 | ||||
-rw-r--r-- | src/g80_type.h | 10 | ||||
-rw-r--r-- | src/g80_xaa.c | 4 | ||||
-rw-r--r-- | src/g80_xaa.h | 2 |
7 files changed, 167 insertions, 8 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 52b6b47..e2166fe 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -75,6 +75,8 @@ g80_sources = \ g80_dma.c \ g80_dma.h \ g80_driver.c \ + g80_exa.c \ + g80_exa.h \ g80_output.c \ g80_output.h \ g80_sor.c \ diff --git a/src/g80_driver.c b/src/g80_driver.c index a4e7bad..3e93237 100644 --- a/src/g80_driver.c +++ b/src/g80_driver.c @@ -45,6 +45,7 @@ #include "g80_display.h" #include "g80_dma.h" #include "g80_output.h" +#include "g80_exa.h" #include "g80_xaa.h" #define G80_REG_SIZE (1024 * 1024 * 16) @@ -66,6 +67,13 @@ static const char *xaaSymbols[] = { NULL }; +static const char *exaSymbols[] = { + "exaDriverAlloc", + "exaDriverInit", + "exaDriverFini", + NULL +}; + static const char *i2cSymbols[] = { "xf86CreateI2CBusRec", "xf86I2CBusInit", @@ -96,11 +104,13 @@ static const char *int10Symbols[] = { typedef enum { OPTION_HW_CURSOR, OPTION_NOACCEL, + OPTION_ACCEL_METHOD, } G80Opts; static const OptionInfoRec G80Options[] = { { OPTION_HW_CURSOR, "HWCursor", OPTV_BOOLEAN, {0}, FALSE }, { OPTION_NOACCEL, "NoAccel", OPTV_BOOLEAN, {0}, FALSE }, + { OPTION_ACCEL_METHOD, "AccelMethod", OPTV_STRING, {0}, FALSE }, { -1, NULL, OPTV_NONE, {0}, FALSE } }; @@ -164,6 +174,7 @@ G80PreInit(ScrnInfoPtr pScrn, int flags) Bool primary; const rgb zeros = {0, 0, 0}; const Gamma gzeros = {0.0, 0.0, 0.0}; + char *s; CARD32 tmp; if(flags & PROBE_DETECT) { @@ -272,6 +283,16 @@ G80PreInit(ScrnInfoPtr pScrn, int flags) pNv->NoAccel = TRUE; xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Acceleration disabled\n"); } + s = xf86GetOptValString(pNv->Options, OPTION_ACCEL_METHOD); + if(!s || !strcasecmp(s, "xaa")) + pNv->AccelMethod = XAA; + else if(!strcasecmp(s, "exa")) + pNv->AccelMethod = EXA; + else { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Unrecognized AccelMethod " + "\"%s\".\n", s); + goto fail; + } /* Set the bits per RGB for 8bpp mode */ if(pScrn->depth == 8) @@ -366,8 +387,16 @@ G80PreInit(ScrnInfoPtr pScrn, int flags) xf86LoaderReqSymLists(fbSymbols, NULL); if(!pNv->NoAccel) { - if(!xf86LoadSubModule(pScrn, "xaa")) goto fail; - xf86LoaderReqSymLists(xaaSymbols, NULL); + switch(pNv->AccelMethod) { + case XAA: + if(!xf86LoadSubModule(pScrn, "xaa")) goto fail; + xf86LoaderReqSymLists(xaaSymbols, NULL); + break; + case EXA: + if(!xf86LoadSubModule(pScrn, "exa")) goto fail; + xf86LoaderReqSymLists(exaSymbols, NULL); + break; + } } /* Load ramdac if needed */ @@ -440,6 +469,8 @@ G80CloseScreen(int scrnIndex, ScreenPtr pScreen) if(pNv->xaa) XAADestroyInfoRec(pNv->xaa); + if(pNv->exa) + exaDriverFini(pScrn->pScreen); xf86_cursors_fini(pScreen); if(xf86ServerIsExiting()) { @@ -759,10 +790,21 @@ G80ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) if(!pNv->NoAccel) { G80InitHW(pScrn); - if(!G80XAAInit(pScreen)) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Hardware acceleration initialization failed\n"); - return FALSE; + switch(pNv->AccelMethod) { + case XAA: + if(!G80XAAInit(pScreen)) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "XAA hardware acceleration initialization failed\n"); + return FALSE; + } + break; + case EXA: + if(!G80ExaInit(pScreen, pScrn)) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "EXA hardware acceleration initialization failed\n"); + return FALSE; + } + break; } } diff --git a/src/g80_exa.c b/src/g80_exa.c new file mode 100644 index 0000000..7f487ff --- /dev/null +++ b/src/g80_exa.c @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2007 NVIDIA, Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "g80_type.h" +#include "g80_dma.h" + +static void +waitMarker(ScreenPtr pScreen, int marker) +{ + G80Sync(xf86Screens[pScreen->myNum]); +} + +static Bool +prepareSolid(PixmapPtr pPixmap, + int alu, + Pixel planemask, + Pixel fg) +{ + return FALSE; +} + +static Bool +checkComposite(int op, + PicturePtr pSrcPicture, + PicturePtr pMaskPicture, + PicturePtr pDstPicture) +{ + return FALSE; +} + +static Bool +prepareCopy(PixmapPtr pSrcPixmap, + PixmapPtr pDstPixmap, + int dx, + int dy, + int alu, + Pixel planemask) +{ + return FALSE; +} + +Bool G80ExaInit(ScreenPtr pScreen, ScrnInfoPtr pScrn) +{ + G80Ptr pNv = G80PTR(pScrn); + ExaDriverPtr exa; + const int pitch = pScrn->displayWidth * (pScrn->bitsPerPixel / 8); + + exa = pNv->exa = exaDriverAlloc(); + if(!exa) return FALSE; + + exa->exa_major = EXA_VERSION_MAJOR; + exa->exa_minor = EXA_VERSION_MINOR; + exa->memoryBase = pNv->mem; + exa->offScreenBase = pitch * pScrn->virtualY; + exa->memorySize = pitch * pNv->offscreenHeight; + exa->pixmapOffsetAlign = 256; + exa->pixmapPitchAlign = 256; + exa->flags = EXA_OFFSCREEN_PIXMAPS; + exa->maxX = 8192; + exa->maxY = 8192; + + /**** Rendering ops ****/ + exa->PrepareSolid = prepareSolid; + //exa->Solid = solid; + //exa->DoneSolid = doneSolid; + exa->PrepareCopy = prepareCopy; + //exa->Copy = copy; + //exa->DoneCopy = doneCopy; + exa->CheckComposite = checkComposite; + //exa->PrepareComposite = prepareComposite; + //exa->Composite = composite; + //exa->DoneComposite = doneComposite; + + exa->WaitMarker = waitMarker; + + return exaDriverInit(pScreen, exa); +} diff --git a/src/g80_exa.h b/src/g80_exa.h new file mode 100644 index 0000000..2f01af6 --- /dev/null +++ b/src/g80_exa.h @@ -0,0 +1 @@ +Bool G80ExaInit(ScreenPtr pScreen, ScrnInfoPtr pScrn); diff --git a/src/g80_type.h b/src/g80_type.h index 95517e3..17acf93 100644 --- a/src/g80_type.h +++ b/src/g80_type.h @@ -1,4 +1,5 @@ #include <xaa.h> +#include <exa.h> #include <xf86.h> #include <xf86int10.h> #include <xf86Cursor.h> @@ -24,6 +25,11 @@ typedef enum ORNum { SOR1 = 1 } ORNum; +typedef enum AccelMethod { + XAA, + EXA, +} AccelMethod; + typedef struct G80Rec { volatile CARD32 * reg; unsigned char * mem; @@ -46,11 +52,15 @@ typedef struct G80Rec { OptionInfoPtr Options; Bool HWCursor; Bool NoAccel; + AccelMethod AccelMethod; /* XAA */ XAAInfoRecPtr xaa; CARD32 currentRop; + /* EXA */ + ExaDriverPtr exa; + /* DMA command buffer */ CARD32 dmaPut; CARD32 dmaCurrent; diff --git a/src/g80_xaa.c b/src/g80_xaa.c index 1f07444..d256d64 100644 --- a/src/g80_xaa.c +++ b/src/g80_xaa.c @@ -31,7 +31,7 @@ #include "g80_dma.h" #include "g80_xaa.h" -static void +void G80Sync(ScrnInfoPtr pScrn) { G80Ptr pNv = G80PTR(pScrn); @@ -47,7 +47,7 @@ G80Sync(ScrnInfoPtr pScrn) while(*pSync); } -static void +void G80DMAKickoffCallback(ScrnInfoPtr pScrn) { G80Ptr pNv = G80PTR(pScrn); diff --git a/src/g80_xaa.h b/src/g80_xaa.h index e2f1f63..7d2fee5 100644 --- a/src/g80_xaa.h +++ b/src/g80_xaa.h @@ -1 +1,3 @@ +void G80Sync(ScrnInfoPtr pScrn); +void G80DMAKickoffCallback(ScrnInfoPtr pScrn); Bool G80XAAInit(ScreenPtr); |