📄 neomagic.diff
字号:
diff -uNr neomagic.org/Imakefile neomagic/Imakefile--- neomagic.org/Imakefile Wed Jun 6 17:31:29 2001+++ neomagic/Imakefile Fri Feb 1 21:28:40 2002@@ -4,10 +4,10 @@ SRCS = neo_driver.c neo_bank.c neo_cursor.c neo_2097.c neo_2070.c \- neo_2090.c neo_2200.c neo_i2c.c neo_shadow.c neo_dga.c+ neo_2090.c neo_2200.c neo_i2c.c neo_shadow.c neo_dga.c neo_video.c OBJS = neo_driver.o neo_bank.o neo_cursor.o neo_2097.o neo_2070.o \- neo_2090.o neo_2200.o neo_i2c.o neo_shadow.o neo_dga.o+ neo_2090.o neo_2200.o neo_i2c.o neo_shadow.o neo_dga.o neo_video.o DEFINES = -DPSZ=8 diff -uNr neomagic.org/neo.h neomagic/neo.h--- neomagic.org/neo.h Wed Jun 6 17:15:07 2001+++ neomagic/neo.h Sat Feb 2 17:50:18 2002@@ -57,6 +57,11 @@ #include "xf86i2c.h" +#ifdef XvExtension+# include "xf86xv.h"+# include "Xv.h"+#endif /* XvExtension */+ /* * Driver data structures. */@@ -196,6 +201,8 @@ unsigned long NeoMMIOAddr; unsigned long NeoLinearAddr; unsigned char* NeoMMIOBase;+ unsigned long NeoMMIOAddr2;+ unsigned char* NeoMMIOBase2; unsigned char* NeoFbBase; long NeoFbMapSize; unsigned long vgaIOBase;@@ -245,6 +252,10 @@ RefreshAreaFuncPtr refreshArea; void (*PointerMoved)(int index, int x, int y); int rotate;+#ifdef XvExtension+ XF86VideoAdaptorPtr overlayAdaptor;+ int videoKey;+#endif /* XvExtension */ } NEORec, *NEOPtr; typedef struct {diff -uNr neomagic.org/neo_driver.c neomagic/neo_driver.c--- neomagic.org/neo_driver.c Wed Jun 6 17:31:30 2001+++ neomagic/neo_driver.c Sun Feb 3 12:08:50 2002@@ -262,7 +262,8 @@ OPTION_PROG_LCD_MODE_REGS, OPTION_PROG_LCD_MODE_STRETCH, OPTION_OVERRIDE_VALIDATE_MODE,- OPTION_ROTATE+ OPTION_ROTATE,+ OPTION_VIDEO_KEY } NEOOpts; static const OptionInfoRec NEO_2070_Options[] = {@@ -282,6 +283,7 @@ OPTV_BOOLEAN, {0}, FALSE }, { OPTION_OVERRIDE_VALIDATE_MODE, "overrideValidateMode", OPTV_BOOLEAN, {0}, FALSE },+ { OPTION_VIDEO_KEY, "VideoKey", OPTV_INTEGER, {0}, FALSE }, { -1, NULL, OPTV_NONE, {0}, FALSE } }; @@ -844,7 +846,7 @@ if (xf86LoadSubModule(pScrn, "ddc")) { xf86LoaderReqSymLists(ddcSymbols, NULL);-#if 1 /* for DDC1 testing */+#if 0 /* for DDC1 testing */ if (!neoDoDDCVBE(pScrn)) if (!neoDoDDC2(pScrn)) #endif@@ -959,6 +961,16 @@ "Valid options are \"CW\" or \"CCW\"\n"); } }+#ifdef XvExtension+ if(xf86GetOptValInteger(nPtr->Options, OPTION_VIDEO_KEY, &(nPtr->videoKey))) {+ xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "video key set to 0x%x\n", nPtr->videoKey);+ } else {+ nPtr->videoKey = (1 << pScrn->offset.red) | + (1 << pScrn->offset.green) |+ (((pScrn->mask.blue >> pScrn->offset.blue) - 1) << pScrn->offset.blue); + }+#endif /* XvExtension */+ if (nPtr->internDisp && nPtr->externDisp) xf86DrvMsg(pScrn->scrnIndex,X_CONFIG,@@ -1032,6 +1044,8 @@ nPtr->NeoLinearAddr = 0; } + nPtr->NeoMMIOAddr2 = 0;+ nPtr->NeoMMIOBase2 = NULL; if (nPtr->pEnt->device->IOBase && !nPtr->noMMIO) { /* XXX Check this matches a PCI base address */ nPtr->NeoMMIOAddr = nPtr->pEnt->device->IOBase;@@ -1065,11 +1079,17 @@ case NM2360: case NM2380: nPtr->NeoMMIOAddr = nPtr->PciInfo->memBase[1];+ nPtr->NeoMMIOAddr2 = nPtr->PciInfo->memBase[2]; break; } xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "MMIO base address is set at 0x%X.\n", nPtr->NeoMMIOAddr);+ if (nPtr->NeoMMIOAddr2 != 0){+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED,+ "MMIO base address2 is set at 0x%X.\n",+ nPtr->NeoMMIOAddr2);+ } } /* XXX What about VGA resources in OPERATING mode? */ if (xf86RegisterResources(nPtr->pEnt->index, NULL, ResExclusive))@@ -1554,6 +1574,8 @@ pScrn->racIoFlags = pScrn->racMemFlags = racflag; + NEOInitVideo(pScreen);+ pScreen->SaveScreen = vgaHWSaveScreen; /* Setup DPMS mode */@@ -1566,6 +1588,7 @@ pScrn->fbOffset = 0; } +#if 0 #ifdef XvExtension { XF86VideoAdaptorPtr *ptr;@@ -1576,6 +1599,7 @@ xf86XVScreenInit(pScreen, ptr, n); } #endif+#endif /* Wrap the current CloseScreen function */ nPtr->CloseScreen = pScreen->CloseScreen;@@ -1773,12 +1797,18 @@ if (!nPtr->noLinear) { if (!nPtr->noMMIO) {- if (nPtr->pEnt->location.type == BUS_PCI)+ if (nPtr->pEnt->location.type == BUS_PCI){ nPtr->NeoMMIOBase = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_MMIO, nPtr->PciTag, nPtr->NeoMMIOAddr, 0x200000L);- else+ if (nPtr->NeoMMIOAddr2 != 0){+ nPtr->NeoMMIOBase2 =+ xf86MapPciMem(pScrn->scrnIndex, VIDMEM_MMIO,+ nPtr->PciTag, nPtr->NeoMMIOAddr2,+ 0x100000L);+ }+ } else nPtr->NeoMMIOBase = xf86MapVidMem(pScrn->scrnIndex, VIDMEM_MMIO, nPtr->NeoMMIOAddr,diff -uNr neomagic.org/neo_video.c neomagic/neo_video.c--- neomagic.org/neo_video.c Thu Jan 1 09:00:00 1970+++ neomagic/neo_video.c Tue Feb 5 06:05:47 2002@@ -0,0 +1,1103 @@+#include "neo.h"+#include "neo_video.h"++#define nElems(x) (sizeof(x) / sizeof(x[0]))+#define MAKE_ATOM(a) MakeAtom(a, sizeof(a) - 1, TRUE)++#if defined(XvExtension)++#include "dixstruct.h"+#include "xaa.h"+#include "xaalocal.h"++static XF86VideoAdaptorPtr NEOSetupVideo(ScreenPtr);+static void NEOResetVideo(ScrnInfoPtr);++static int NEOPutVideo(ScrnInfoPtr, short, short, short, short, short, short, short, short, RegionPtr, pointer);++static void NEOStopVideo(ScrnInfoPtr, pointer, Bool);+static int NEOSetPortAttribute(ScrnInfoPtr, Atom, INT32, pointer);+static int NEOGetPortAttribute(ScrnInfoPtr, Atom, INT32 *, pointer);+static void NEOQueryBestSize(ScrnInfoPtr, Bool, short, short, short, short, unsigned int *, unsigned int *, pointer);+static int NEOPutImage(ScrnInfoPtr, short, short, short, short, short, short, short, short, int, unsigned char *, short, short, Bool, RegionPtr, pointer);+static int NEOQueryImageAttributes(ScrnInfoPtr, int, unsigned short *, unsigned short *, int *, int *);++static Bool RegionsEqual(RegionPtr, RegionPtr);+static Bool NEOClipVideo(ScrnInfoPtr, BoxPtr, INT32 *, INT32 *, INT32 *, INT32 *, RegionPtr, INT32, INT32);+static void NEODisplayVideo(ScrnInfoPtr, int, int, short, short, int, int, int, int, int, BoxPtr, short, short, short, short);++static void NEOInitOffscreenImages(ScreenPtr);+static FBLinearPtr NEOAllocateMemory(ScrnInfoPtr, FBLinearPtr, int);+static void NEOCopyData(unsigned char *, unsigned char *, int, int, int, int);+static void NEOCopyYV12Data(unsigned char *, unsigned char *, unsigned char *, unsigned char *, int, int, int, int, int);++static int NEOAllocSurface(ScrnInfoPtr, int, unsigned short, unsigned short, XF86SurfacePtr);+static int NEOFreeSurface(XF86SurfacePtr);+static int NEODisplaySurface(XF86SurfacePtr, short, short, short, short, short, short, short, short, RegionPtr clipBoxes);+static int NEOStopSurface(XF86SurfacePtr);+static int NEOGetSurfaceAttribute(ScrnInfoPtr, Atom, INT32 *);+static int NEOSetSurfaceAttribute(ScrnInfoPtr, Atom, INT32);++static Atom xvColorKey, xvBrightness;++void+NEOInitVideo(ScreenPtr pScreen)+{+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];+ NEOPtr nPtr = NEOPTR(pScrn);+ XF86VideoAdaptorPtr *overlayAdaptors, *newAdaptors = NULL;+ XF86VideoAdaptorPtr newAdaptor = NULL;+ int numAdaptors;++ numAdaptors = xf86XVListGenericAdaptors(pScrn, &overlayAdaptors);++ if (nPtr->NeoChipset == NM2160 && nPtr->NeoMMIOBase2 != NULL+ && !nPtr->noAccel){+ newAdaptor = NEOSetupVideo(pScreen);+ NEOInitOffscreenImages(pScreen);+ }++ if (newAdaptor){+ if (!numAdaptors){+ numAdaptors = 1;+ overlayAdaptors = &newAdaptor;+ } else {+ newAdaptors = xalloc((numAdaptors + 1) * sizeof(XF86VideoAdaptorPtr*));+ if (newAdaptors){+ memcpy(newAdaptors, overlayAdaptors, numAdaptors * sizeof(XF86VideoAdaptorPtr));+ newAdaptors[numAdaptors++] = newAdaptor;+ overlayAdaptors = newAdaptors;+ }+ }+ }++ if (numAdaptors)+ xf86XVScreenInit(pScreen, overlayAdaptors, numAdaptors);++ if (newAdaptors)+ xfree(newAdaptors);+}++static XF86VideoEncodingRec NEOVideoEncodings[] =+{+ {+ NEO_VIDEO_VIDEO,+ "XV_VIDEO",+ 1024, 1024,+ {1, 1}+ },+ {+ NEO_VIDEO_IMAGE,+ "XV_IMAGE",+ 1024, 1024,+ {1, 1}+ }+};++static XF86VideoFormatRec NEOVideoFormats[] =+{+ { 15, TrueColor },+ { 16, TrueColor },+};++static XF86AttributeRec NEOVideoAttributes[] =+{+ {+ XvSettable | XvGettable,+ 0x000000, 0xFFFFFF,+ "XV_COLORKEY"+ },+ {+ XvSettable | XvGettable,+ -128, 127,+ "XV_BRIGHTNESS"+ },+};++static XF86ImageRec NEOVideoImages[] =+{+ XVIMAGE_YUY2,+ XVIMAGE_YV12,+ XVIMAGE_I420,+ {+ FOURCC_RV15,+ XvRGB,+ LSBFirst,+ { 'R', 'V' ,'1', '5',+ 0x00,'5',0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},+ 16,+ XvPacked,+ 1,+ 15, 0x001F, 0x03E0, 0x7C00,+ 0, 0, 0,+ 0, 0, 0,+ 0, 0, 0,+ { 'R', 'V', 'B' },+ XvTopToBottom+ },+ {+ FOURCC_RV16,+ XvRGB,+ LSBFirst,+ { 'R', 'V' ,'1', '6',+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },+ 16,+ XvPacked,+ 1,+ 16, 0x001F, 0x07E0, 0xF800,+ 0, 0, 0,+ 0, 0, 0,+ 0, 0, 0,+ { 'R', 'V', 'B' },+ XvTopToBottom+ }+};++static XF86VideoAdaptorPtr+NEOSetupVideo(ScreenPtr pScreen)+{+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];+ NEOPtr nPtr = NEOPTR(pScrn);+ NEOPortPtr pPriv;+ XF86VideoAdaptorPtr overlayAdaptor;+ int i;++#ifdef DEBUG+ xf86DrvMsg(pScrn->scrnIndex,X_INFO,"NEOSetupVideo\n");+#endif+ if ((overlayAdaptor = xcalloc(1, sizeof(XF86VideoAdaptorRec) ++ sizeof(DevUnion) + + sizeof(NEOPortRec))) == NULL){+ return (NULL);+ }++ overlayAdaptor->type = XvInputMask | XvImageMask | XvWindowMask | XvOutputMask | XvVideoMask;+ overlayAdaptor->flags = VIDEO_OVERLAID_IMAGES | VIDEO_CLIP_TO_VIEWPORT;+ overlayAdaptor->name = "NeoMagic Video Engine";+ overlayAdaptor->nEncodings = nElems(NEOVideoEncodings);+ overlayAdaptor->pEncodings = NEOVideoEncodings;+ for (i = 0; i < nElems(NEOVideoEncodings); i++){+ NEOVideoEncodings[i].width = 1024;+ NEOVideoEncodings[i].height = 1024;+ }+ overlayAdaptor->nFormats = nElems(NEOVideoFormats);+ overlayAdaptor->pFormats = NEOVideoFormats;+ overlayAdaptor->nPorts = 1;+ overlayAdaptor->pPortPrivates = (DevUnion*) &overlayAdaptor[1];+ overlayAdaptor->pPortPrivates[0].ptr = (pointer) &overlayAdaptor->pPortPrivates[1];+ overlayAdaptor->nAttributes = nElems(NEOVideoAttributes);+ overlayAdaptor->pAttributes = NEOVideoAttributes;+ overlayAdaptor->nImages = nElems(NEOVideoImages);+ overlayAdaptor->pImages = NEOVideoImages;++ overlayAdaptor->PutVideo = NEOPutVideo;+ overlayAdaptor->PutStill = NULL;+ overlayAdaptor->GetVideo = NULL;+ overlayAdaptor->GetStill = NULL;++ overlayAdaptor->StopVideo = NEOStopVideo;+ overlayAdaptor->SetPortAttribute = NEOSetPortAttribute;+ overlayAdaptor->GetPortAttribute = NEOGetPortAttribute;+ overlayAdaptor->QueryBestSize = NEOQueryBestSize;+ overlayAdaptor->PutImage = NEOPutImage;+ overlayAdaptor->QueryImageAttributes = NEOQueryImageAttributes;++ pPriv = (NEOPortPtr)overlayAdaptor->pPortPrivates[0].ptr;+ pPriv->colorKey = nPtr->videoKey;+ pPriv->video_status = 0;+ pPriv->brightness = 0;+ REGION_INIT(pScreen, &pPriv->clip, NullBox, 0);+ nPtr->overlayAdaptor = overlayAdaptor;++ xvBrightness = MAKE_ATOM("XV_BRIGHTNESS");+ xvColorKey = MAKE_ATOM("XV_COLORKEY");++ NEOResetVideo(pScrn);++ return (overlayAdaptor);+}++static void+NEOResetVideo(ScrnInfoPtr pScrn)+{+ NEOPtr nPtr = NEOPTR(pScrn);+ NEOPortPtr pPriv = (NEOPortPtr)nPtr->overlayAdaptor->pPortPrivates[0].ptr;+ int r, g, b;++#ifdef DEBUG+ xf86DrvMsg(pScrn->scrnIndex,X_INFO,"NEOResetVideo\n");+#endif+ switch (pScrn->depth){+ case 8:+ OUTGR(0xc6, pPriv->colorKey & 0xff);+ OUTGR(0xc5, 0x00);+ OUTGR(0xc7, 0x00);+ break;+ default:+ r = (pPriv->colorKey & pScrn->mask.red) >> pScrn->offset.red;+ g = (pPriv->colorKey & pScrn->mask.green) >> pScrn->offset.green;+ b = (pPriv->colorKey & pScrn->mask.blue) >> pScrn->offset.blue;+ OUTGR(0xc5, r);+ OUTGR(0xc6, g);+ OUTGR(0xc7, b);+ break;+ }+ OUTGR(0xc4, pPriv->brightness);+}++static int+NEOPutVideo(ScrnInfoPtr pScrn, + short src_x, short src_y, short drw_x, short drw_y,+ short src_w, short src_h, short drw_w, short drw_h,+ RegionPtr clipBoxes, pointer data)+{+ NEOPortPtr pPriv = (NEOPortPtr)data;+ NEOPtr nPtr = NEOPTR(pScrn);+ CARD32 src_pitch, offset;+ int xscale, yscale;+ BoxRec dstBox;+ INT32 x1, y1, x2, y2;+ int size, bpp;++#ifdef DEBUG+ xf86DrvMsg(pScrn->scrnIndex,X_INFO,"NEOPutVideo: src: %d %d %d %d\n", src_x, src_y, src_w, src_h);+ xf86DrvMsg(pScrn->scrnIndex,X_INFO,"NEOPutVideo: drw: %d %d %d %d\n", drw_x, drw_y, drw_w, drw_h);+#endif+ x1 = src_x;+ y1 = src_y;+ x2 = src_x + src_w;+ y2 = src_y + src_h;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -