]> git.pld-linux.org Git - packages/XFree86.git/blame - XFree86-neomagic-Xv-support.patch
- added Requires(post,postun) to -libs
[packages/XFree86.git] / XFree86-neomagic-Xv-support.patch
CommitLineData
e2df31c2 1--- XFree86-4.2.0/xc.orig/programs/Xserver/hw/xfree86/drivers/neomagic/Imakefile Wed Jan 24 01:06:21 2001
2+++ XFree86-4.2.0/xc/programs/Xserver/hw/xfree86/drivers/neomagic/Imakefile Thu Apr 4 16:05:44 2002
3@@ -2,12 +2,12 @@
4 #define IHaveModules
5 #include <Server.tmpl>
6
7
8 SRCS = neo_driver.c neo_bank.c neo_cursor.c neo_2097.c neo_2070.c \
9- neo_2090.c neo_2200.c neo_i2c.c neo_shadow.c neo_dga.c
10+ neo_2090.c neo_2200.c neo_i2c.c neo_shadow.c neo_dga.c neo_video.c
11
12 OBJS = neo_driver.o neo_bank.o neo_cursor.o neo_2097.o neo_2070.o \
13- neo_2090.o neo_2200.o neo_i2c.o neo_shadow.o neo_dga.o
14+ neo_2090.o neo_2200.o neo_i2c.o neo_shadow.o neo_dga.o neo_video.o
15
16 DEFINES = -DPSZ=8
17
18--- XFree86-4.2.0/xc.orig/programs/Xserver/hw/xfree86/drivers/neomagic/NM-reg.txt Thu Jan 1 01:00:00 1970
19+++ XFree86-4.2.0/xc/programs/Xserver/hw/xfree86/drivers/neomagic/NM-reg.txt Thu Apr 4 16:05:44 2002
20@@ -0,0 +1,69 @@
21+NM2160 Register GUESS
22+ --- Overlay and ZV capture ---
23+
24+2002,2.3.
25+
26+1. Overlay
27+ GRB0 bit5 Format; 0:YUY2/1:RGB
28+ bit1 1
29+ bit0 Enable overlay ; 1:enable/0:disable
30+ GRB1 bit7:4 X2[11:8]
31+ bit3:0 X1[11:8]
32+ GRB2 X1[7:0]
33+ GRB3 X2[7:0]
34+ GRB4 bit7:4 Y2[11:8]
35+ bit3:0 Y1[11:8]
36+ GRB5 Y1[7:0]
37+ GRB6 Y2[7:0]
38+ GRB7 VRAM offset[24:17]
39+ GRB8 VRAM offset[16:9]
40+ GRB9 VRAM offset[8:1]
41+ GRBA Width in byte[15:8]
42+ GRBB Width in byte[7:0]
43+ GRBC 0x4f
44+ GRBD -
45+ GRBE -
46+ GRBF bit2 0:normal/1:mirror
47+ bit1:0 b'10'
48+ GRC0 X scale[15:8] ; x1.0 == 0x1000
49+ GRC1 X scale[7:0]
50+ GRC2 Y scale[15:8] ; x1.0 == 0x1000
51+ GRC3 Y scale[7:0]
52+ GRC4 brightness ; -128 to +127
53+ GRC5 Color key(R)
54+ GRC6 Color key(G) / Color key(8bpp)
55+ GRC7 Color key(B)
56+
57+2. ZV capture
58+ GR0A bit5 Enable extended SR reg. ; 1:enable/0:disable
59+ bit0 1
60+
61+ SR08 bit7:1 b'1010000'
62+ bit0 Enable capture ; 1:enable/0:disable
63+ SR09 0x11
64+ SR0A 0x00
65+ SR0B -
66+ SR0C VRAM offset[8:1]
67+ SR0D VRAM offset[16:9]
68+ SR0E VRAM offset[24:17]
69+ SR0F -
70+ SR10 -
71+ SR11 -
72+ SR12 -
73+ SR13 -
74+ SR14 Y1[7:0]
75+ SR15 Y2[7:0]
76+ SR16 bit7:4 Y2[11:4]
77+ bit3:0 Y1[11:4]
78+ SR17 X1[7:0]
79+ SR18 X2[7:0]
80+ SR19 bit7:4 X2[11:8]
81+ bit3:0 X1[11:8]
82+ SR1A Width in byte[7:0]
83+ SR1B Width in byte[15:8]
84+ SR1C 0xfb
85+ SR1D 0x00
86+ SR1E 0xe2
87+ SR1F 0x02
88+
89+s.nomura@mba.nifty.ne.jp
90--- XFree86-4.2.0/xc.orig/programs/Xserver/hw/xfree86/drivers/neomagic/neo.h Mon Oct 1 15:44:07 2001
91+++ XFree86-4.2.0/xc/programs/Xserver/hw/xfree86/drivers/neomagic/neo.h Thu Apr 4 16:05:44 2002
92@@ -60,6 +60,11 @@
93
94 #include "xf86i2c.h"
95
96+#ifdef XvExtension
97+# include "xf86xv.h"
98+# include "Xv.h"
99+#endif /* XvExtension */
100+
101 /*
102 * Driver data structures.
103 */
104@@ -121,6 +126,10 @@
105 /* in neo_dga.c */
106 Bool NEODGAInit(ScreenPtr pScreen);
107
108+/* in neo_video.c */
109+extern void NEOInitVideo(ScreenPtr pScreen);
110+extern void NEOResetVideo(ScrnInfoPtr pScrn);
111+
112 /* shadow regs */
113
114 #define NEO_EXT_CR_MAX 0x85
115@@ -199,6 +208,8 @@
116 unsigned long NeoMMIOAddr;
117 unsigned long NeoLinearAddr;
118 unsigned char* NeoMMIOBase;
119+ unsigned long NeoMMIOAddr2;
120+ unsigned char* NeoMMIOBase2;
121 unsigned char* NeoFbBase;
122 long NeoFbMapSize;
123 unsigned long vgaIOBase;
124@@ -249,6 +260,17 @@
125 RefreshAreaFuncPtr refreshArea;
126 void (*PointerMoved)(int index, int x, int y);
127 int rotate;
128+ Bool showcache;
129+#ifdef XvExtension
130+ Bool video;
131+ double videoHZoom;
132+ double videoVZoom;
133+ XF86VideoAdaptorPtr overlayAdaptor;
134+ int overlay;
135+ int overlay_offset;
136+ int videoKey;
137+ int interlace;
138+#endif /* XvExtension */
139 } NEORec, *NEOPtr;
140
141 typedef struct {
142@@ -264,18 +286,20 @@
143 #define GRAX 0x3CE
144
145 /* vga IO functions */
146-#define VGArCR(index) hwp->readCrtc(hwp,index)
147-#define VGAwCR(index,val) hwp->writeCrtc(hwp,index,val)
148-#define VGArGR(index) hwp->readGr(hwp,index)
149-#define VGAwGR(index,val) hwp->writeGr(hwp,index,val)
150+#define VGArCR(index) (*hwp->readCrtc)(hwp, index)
151+#define VGAwCR(index, val) (*hwp->writeCrtc)(hwp, index, val)
152+#define VGArGR(index) (*hwp->readGr)(hwp, index)
153+#define VGAwGR(index, val) (*hwp->writeGr)(hwp, index, val)
154+#define VGArSR(index) (*hwp->readSeq)(hwp, index)
155+#define VGAwSR(index, val) (*hwp->writeSeq)(hwp, index, val)
156
157 /* memory mapped register access macros */
158-#define INREG8(addr) MMIO_IN8(nPtr->NeoMMIOBase, (addr))
159-#define INREG16(addr) MMIO_IN16(nPtr->NeoMMIOBase, (addr))
160-#define INREG(addr) MMIO_IN32(nPtr->NeoMMIOBase, (addr))
161-#define OUTREG8(addr, val) MMIO_OUT8(nPtr->NeoMMIOBase, (addr), (val))
162-#define OUTREG16(addr, val) MMIO_OUT16(nPtr->NeoMMIOBase, (addr), (val))
163-#define OUTREG(addr, val) MMIO_OUT32(nPtr->NeoMMIOBase, (addr), (val))
164+#define INREG8(addr) MMIO_IN8(nPtr->NeoMMIOBase, addr)
165+#define INREG16(addr) MMIO_IN16(nPtr->NeoMMIOBase, addr)
166+#define INREG(addr) MMIO_IN32(nPtr->NeoMMIOBase, addr)
167+#define OUTREG8(addr, val) MMIO_OUT8(nPtr->NeoMMIOBase, addr, val)
168+#define OUTREG16(addr, val) MMIO_OUT16(nPtr->NeoMMIOBase, addr, val)
169+#define OUTREG(addr, val) MMIO_OUT32(nPtr->NeoMMIOBase, addr, val)
170
171 /* This swizzle macro is to support the manipulation of cursor masks when
172 * the sprite moves off the left edge of the display. This code is
173--- XFree86-4.2.0/xc.orig/programs/Xserver/hw/xfree86/drivers/neomagic/neo_2070.c Tue Sep 26 01:57:08 2000
174+++ XFree86-4.2.0/xc/programs/Xserver/hw/xfree86/drivers/neomagic/neo_2070.c Thu Apr 4 16:05:44 2002
175@@ -104,8 +104,6 @@
176 ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
177 NEOPtr nPtr = NEOPTR(pScrn);
178 NEOACLPtr nAcl = NEOACLPTR(pScrn);
179- BoxRec AvailFBArea;
180- int lines;
181
182 nPtr->AccelInfoRec = infoPtr = XAACreateInfoRec();
183 if(!infoPtr) return FALSE;
184@@ -158,23 +156,7 @@
185 default:
186 return FALSE;
187 }
188-
189- /* Initialize for widths */
190- nAcl->Pitch = pScrn->displayWidth * nAcl->PixelWidth;
191- lines = nAcl->cacheEnd /
192- (pScrn->displayWidth * (pScrn->bitsPerPixel >> 3));
193- if(lines > 1024) lines = 1024;
194-
195- AvailFBArea.x1 = 0;
196- AvailFBArea.y1 = 0;
197- AvailFBArea.x2 = pScrn->displayWidth;
198- AvailFBArea.y2 = lines;
199- xf86InitFBManager(pScreen, &AvailFBArea);
200-
201- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
202- "Using %i scanlines of offscreen memory for pixmap caching\n",
203- lines - pScrn->virtualY);
204-
205+
206 return(XAAInit(pScreen, infoPtr));
207
208 }
209--- XFree86-4.2.0/xc.orig/programs/Xserver/hw/xfree86/drivers/neomagic/neo_2090.c Mon Oct 1 15:44:07 2001
210+++ XFree86-4.2.0/xc/programs/Xserver/hw/xfree86/drivers/neomagic/neo_2090.c Thu Apr 4 16:05:44 2002
211@@ -101,8 +101,6 @@
212 ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
213 NEOPtr nPtr = NEOPTR(pScrn);
214 NEOACLPtr nAcl = NEOACLPTR(pScrn);
215- BoxRec AvailFBArea;
216- int lines;
217
218 nPtr->AccelInfoRec = infoPtr = XAACreateInfoRec();
219 if(!infoPtr) return FALSE;
220@@ -197,20 +195,6 @@
221
222 nAcl->BltCntlFlags |= NEO_BC3_FIFO_EN;
223
224- lines = nAcl->cacheEnd /
225- (pScrn->displayWidth * (pScrn->bitsPerPixel >> 3));
226- if(lines > 1024) lines = 1024;
227-
228- AvailFBArea.x1 = 0;
229- AvailFBArea.y1 = 0;
230- AvailFBArea.x2 = pScrn->displayWidth;
231- AvailFBArea.y2 = lines;
232- xf86InitFBManager(pScreen, &AvailFBArea);
233-
234- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
235- "Using %i scanlines of offscreen memory for pixmap caching\n",
236- lines - pScrn->virtualY);
237-
238 return(XAAInit(pScreen, infoPtr));
239 }
240
241--- XFree86-4.2.0/xc.orig/programs/Xserver/hw/xfree86/drivers/neomagic/neo_2097.c Mon Oct 1 15:44:07 2001
242+++ XFree86-4.2.0/xc/programs/Xserver/hw/xfree86/drivers/neomagic/neo_2097.c Thu Apr 4 16:05:44 2002
243@@ -123,8 +123,6 @@
244 ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
245 NEOPtr nPtr = NEOPTR(pScrn);
246 NEOACLPtr nAcl = NEOACLPTR(pScrn);
247- int lines;
248- BoxRec AvailFBArea;
249
250 nPtr->AccelInfoRec = infoPtr = XAACreateInfoRec();
251 if(!infoPtr) return FALSE;
252@@ -245,21 +243,7 @@
253 default:
254 return FALSE;
255 }
256-
257- lines = nAcl->cacheEnd /
258- (pScrn->displayWidth * (pScrn->bitsPerPixel >> 3));
259- if(lines > 1024) lines = 1024;
260-
261- AvailFBArea.x1 = 0;
262- AvailFBArea.y1 = 0;
263- AvailFBArea.x2 = pScrn->displayWidth;
264- AvailFBArea.y2 = lines;
265- xf86InitFBManager(pScreen, &AvailFBArea);
266-
267- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
268- "Using %i scanlines of offscreen memory for pixmap caching\n",
269- lines - pScrn->virtualY);
270-
271+
272 return(XAAInit(pScreen, infoPtr));
273 }
274
275--- XFree86-4.2.0/xc.orig/programs/Xserver/hw/xfree86/drivers/neomagic/neo_2200.c Sun Oct 28 04:33:42 2001
276+++ XFree86-4.2.0/xc/programs/Xserver/hw/xfree86/drivers/neomagic/neo_2200.c Thu Apr 4 16:05:44 2002
277@@ -120,8 +120,6 @@
278 ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
279 NEOPtr nPtr = NEOPTR(pScrn);
280 NEOACLPtr nAcl = NEOACLPTR(pScrn);
281- BoxRec AvailFBArea;
282- int lines;
283
284 nPtr->AccelInfoRec = infoPtr = XAACreateInfoRec();
285 if(!infoPtr) return FALSE;
286@@ -251,19 +249,6 @@
287 return FALSE;
288 }
289
290- lines = nAcl->cacheEnd /
291- (pScrn->displayWidth * (pScrn->bitsPerPixel >> 3));
292- if(lines > 1024) lines = 1024;
293-
294- AvailFBArea.x1 = 0;
295- AvailFBArea.y1 = 0;
296- AvailFBArea.x2 = pScrn->displayWidth;
297- AvailFBArea.y2 = lines;
298- xf86InitFBManager(pScreen, &AvailFBArea);
299-
300- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
301- "Using %i scanlines of offscreen memory for pixmap caching\n",
302- lines - pScrn->virtualY);
303
304 return(XAAInit(pScreen, infoPtr));
305 }
306@@ -482,7 +467,7 @@
307 NEOPtr nPtr = NEOPTR(pScrn);
308
309 WAIT_ENGINE_IDLE();
310- OUTREG(NEOREG_DSTSTARTOFF, (y<<16) | (x & 0xffff));
311+ OUTREG(NEOREG_DSTSTARTOFF, (y <<16) | (x & 0xffff));
312 OUTREG(NEOREG_XYEXT, (h<<16) | (w & 0xffff));
313 }
314
315--- XFree86-4.2.0/xc.orig/programs/Xserver/hw/xfree86/drivers/neomagic/neo_dga.c Mon Oct 1 15:44:07 2001
316+++ XFree86-4.2.0/xc/programs/Xserver/hw/xfree86/drivers/neomagic/neo_dga.c Thu Apr 4 16:05:44 2002
317@@ -43,8 +43,10 @@
318 static void NEO_SetViewport(ScrnInfoPtr, int, int, int);
319 static void NEO_FillRect(ScrnInfoPtr, int, int, int, int, unsigned long);
320 static void NEO_BlitRect(ScrnInfoPtr, int, int, int, int, int, int);
321+#if 0
322 static void NEO_BlitTransRect(ScrnInfoPtr, int, int, int, int, int, int,
323 unsigned long);
324+#endif
325
326 static
327 DGAFunctionRec NEODGAFuncs = {
328@@ -76,7 +78,7 @@
329 imlines = (pScrn->videoRam * 1024) /
330 (pScrn->displayWidth * (pScrn->bitsPerPixel >> 3));
331
332- pixlines = (imlines > 1024 && !pNEO->noAccel) ? 1024 : imlines;
333+ pixlines = (imlines > 1024 && !pNEO->noAccel) ? 1024 : imlines;
334
335 pMode = firstMode = pScrn->modes;
336
337@@ -184,7 +186,7 @@
338 ){
339 NEOPtr pNEO = NEOPTR(pScrn);
340 vgaHWPtr hwp = VGAHWPTR(pScrn);
341-
342+
343 NEOAdjustFrame(pScrn->pScreen->myNum, x, y, flags);
344 /* wait for retrace */
345 while((hwp->readST01(hwp) & 0x08));
346@@ -240,7 +242,7 @@
347 }
348 }
349
350-
351+#if 0
352 static void
353 NEO_BlitTransRect(
354 ScrnInfoPtr pScrn,
355@@ -252,7 +254,7 @@
356 /* this one should be separate since the XAA function would
357 prohibit usage of ~0 as the key */
358 }
359-
360+#endif
361
362 static Bool
363 NEO_OpenFramebuffer(
364--- XFree86-4.2.0/xc.orig/programs/Xserver/hw/xfree86/drivers/neomagic/neo_driver.c Fri Nov 30 13:11:57 2001
365+++ XFree86-4.2.0/xc/programs/Xserver/hw/xfree86/drivers/neomagic/neo_driver.c Sat Apr 6 19:49:40 2002
366@@ -299,7 +307,11 @@
367 OPTION_PROG_LCD_MODE_REGS,
368 OPTION_PROG_LCD_MODE_STRETCH,
369 OPTION_OVERRIDE_VALIDATE_MODE,
370+ OPTION_SHOWCACHE,
371 OPTION_ROTATE,
372+ OPTION_VIDEO_KEY,
373+ OPTION_OVERLAYMEM,
374+ OPTION_VIDEO_INTERLACE,
375 OPTION_DISPLAY_HEIGHT_480,
376 OPTION_STRANGE_LOCKUPS
377 } NEOOpts;
378@@ -314,6 +326,7 @@
379 { OPTION_LCD_STRETCH, "NoStretch", OPTV_BOOLEAN, {0}, FALSE },
380 { OPTION_SHADOW_FB, "ShadowFB", OPTV_BOOLEAN, {0}, FALSE },
381 { OPTION_PCI_BURST, "pciBurst", OPTV_BOOLEAN, {0}, FALSE },
382+ { OPTION_SHOWCACHE, "ShowCache", OPTV_BOOLEAN, {0}, FALSE },
383 { OPTION_ROTATE, "Rotate", OPTV_ANYSTR, {0}, FALSE },
384 { OPTION_PROG_LCD_MODE_REGS, "progLcdModeRegs",
385 OPTV_BOOLEAN, {0}, FALSE },
386@@ -321,6 +334,10 @@
387 OPTV_BOOLEAN, {0}, FALSE },
388 { OPTION_OVERRIDE_VALIDATE_MODE, "overrideValidateMode",
389 OPTV_BOOLEAN, {0}, FALSE },
390+ { OPTION_VIDEO_KEY, "VideoKey", OPTV_INTEGER, {0}, FALSE },
391+ { OPTION_OVERLAYMEM, "OverlayMem", OPTV_INTEGER, {0}, FALSE },
392+ { OPTION_VIDEO_INTERLACE, "Interlace",
393+ OPTV_INTEGER, {0}, FALSE },
394 { -1, NULL, OPTV_NONE, {0}, FALSE }
395 };
396
397@@ -335,6 +352,7 @@
398 { OPTION_SHADOW_FB, "ShadowFB", OPTV_BOOLEAN, {0}, FALSE },
399 { OPTION_LCD_STRETCH,"NoStretch", OPTV_BOOLEAN, {0}, FALSE },
400 { OPTION_PCI_BURST, "pciBurst", OPTV_BOOLEAN, {0}, FALSE },
401+ { OPTION_SHOWCACHE, "ShowCache", OPTV_BOOLEAN, {0}, FALSE },
402 { OPTION_ROTATE, "Rotate", OPTV_ANYSTR, {0}, FALSE },
403 { OPTION_STRANGE_LOCKUPS, "StrangeLockups", OPTV_BOOLEAN, {0}, FALSE },
404 { OPTION_DISPLAY_HEIGHT_480, "DisplayHeight480",
405@@ -345,6 +363,10 @@
406 OPTV_BOOLEAN, {0}, FALSE },
407 { OPTION_OVERRIDE_VALIDATE_MODE, "overrideValidateMode",
408 OPTV_BOOLEAN, {0}, FALSE },
409+ { OPTION_VIDEO_KEY, "VideoKey", OPTV_INTEGER, {0}, FALSE },
410+ { OPTION_OVERLAYMEM, "OverlayMem", OPTV_INTEGER, {0}, FALSE },
411+ { OPTION_VIDEO_INTERLACE, "Interlace",
412+ OPTV_INTEGER, {0}, FALSE },
413 { -1, NULL, OPTV_NONE, {0}, FALSE }
414 };
415
416@@ -979,6 +1001,7 @@
417 xf86GetOptValBool(nPtr->Options, OPTION_LCD_CENTER,&nPtr->lcdCenter);
418 xf86GetOptValBool(nPtr->Options, OPTION_LCD_STRETCH,&nPtr->noLcdStretch);
419 xf86GetOptValBool(nPtr->Options, OPTION_SHADOW_FB,&nPtr->shadowFB);
420+ xf86GetOptValBool(nPtr->Options, OPTION_SHOWCACHE,&nPtr->showcache);
421 nPtr->onPciBurst = TRUE;
422 xf86GetOptValBool(nPtr->Options, OPTION_PCI_BURST,&nPtr->onPciBurst);
423 xf86GetOptValBool(nPtr->Options,
424@@ -1014,6 +1037,39 @@
425 "Valid options are \"CW\" or \"CCW\"\n");
426 }
427 }
428+#ifdef XvExtension
429+ if(xf86GetOptValInteger(nPtr->Options,
430+ OPTION_VIDEO_KEY, &(nPtr->videoKey))) {
431+ xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "video key set to 0x%x\n",
432+ nPtr->videoKey);
433+ } else {
434+ nPtr->videoKey = (1 << pScrn->offset.red) |
435+ (1 << pScrn->offset.green) |
436+ (((pScrn->mask.blue >> pScrn->offset.blue) - 1)
437+ << pScrn->offset.blue);
438+ }
439+ if(xf86GetOptValInteger(nPtr->Options, OPTION_OVERLAYMEM,
440+ &(nPtr->overlay))) {
441+ xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
442+ "reserve %d bytes for overlay.\n", nPtr->overlay);
443+ } else {
444+ nPtr->overlay = 0;
445+ }
446+ nPtr->interlace = 0;
447+ if(xf86GetOptValInteger(nPtr->Options, OPTION_VIDEO_INTERLACE,
448+ &(nPtr->interlace))) {
449+ if (nPtr->interlace >= 0 && nPtr->interlace <= 2){
450+ xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "interlace flag = %d\n",
451+ nPtr->interlace);
452+ } else {
453+ xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
454+ "\"%s\" is not a valid value for "
455+ "Option \"Interlaced\"\n", s);
456+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Valid options are 0..2\n");
457+ }
458+ }
459+#endif /* XvExtension */
460+
461
462 if (height_480 && nPtr->NeoPanelWidth == 800) {
463 xf86DrvMsg(pScrn->scrnIndex,X_CONFIG,
464@@ -1069,6 +1125,9 @@
465 if (nPtr->strangeLockups)
466 xf86DrvMsg(pScrn->scrnIndex,X_CONFIG,
467 "Option StrangeLockups set: disabling some acceleration\n");
468+ if (nPtr->showcache)
469+ xf86DrvMsg(pScrn->scrnIndex,X_CONFIG,
470+ "Show chache for debugging\n");
471 if (nPtr->shadowFB) {
472 if (nPtr->noLinear) {
473 xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
474@@ -1096,6 +1155,8 @@
475 nPtr->NeoLinearAddr = 0;
476 }
477
478+ nPtr->NeoMMIOAddr2 = 0;
479+ nPtr->NeoMMIOBase2 = NULL;
480 if (nPtr->pEnt->device->IOBase && !nPtr->noMMIO) {
481 /* XXX Check this matches a PCI base address */
482 nPtr->NeoMMIOAddr = nPtr->pEnt->device->IOBase;
483@@ -1113,7 +1174,7 @@
484 "FB base address is set at 0x%X.\n",
485 nPtr->NeoLinearAddr);
486 }
487- if (!nPtr->NeoMMIOAddr) {
488+ if (!nPtr->NeoMMIOAddr && !nPtr->noMMIO) {
489 switch (nPtr->NeoChipset) {
490 case NM2070 :
491 nPtr->NeoMMIOAddr = nPtr->NeoLinearAddr + 0x100000;
492@@ -1129,11 +1190,17 @@
493 case NM2360:
494 case NM2380:
495 nPtr->NeoMMIOAddr = nPtr->PciInfo->memBase[1];
496+ nPtr->NeoMMIOAddr2 = nPtr->PciInfo->memBase[2];
497 break;
498 }
499 xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
500 "MMIO base address is set at 0x%X.\n",
501 nPtr->NeoMMIOAddr);
502+ if (nPtr->NeoMMIOAddr2 != 0){
503+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
504+ "MMIO base address2 is set at 0x%X.\n",
505+ nPtr->NeoMMIOAddr2);
506+ }
507 }
508 /* XXX What about VGA resources in OPERATING mode? */
509 if (xf86RegisterResources(nPtr->pEnt->index, NULL, ResExclusive))
510@@ -1152,7 +1219,7 @@
511 "FB base address is set at 0x%X.\n",
512 nPtr->NeoLinearAddr);
513 }
514- if (!nPtr->NeoMMIOAddr) {
515+ if (!nPtr->NeoMMIOAddr && !nPtr->noMMIO) {
516 nPtr->NeoMMIOAddr = nPtr->NeoLinearAddr + 0x100000;
517 xf86DrvMsg(pScrn->scrnIndex, X_PROBED,
518 "MMIO base address is set at 0x%X.\n",
519@@ -1293,6 +1360,10 @@
520 /* Should we re-save the text mode on each VT enter? */
521 if(!neoModeInit(pScrn, pScrn->currentMode))
522 return FALSE;
523+#ifdef XvExtension
524+ if (nPtr->video)
525+ NEOResetVideo(pScrn);
526+#endif
527 if (nPtr->NeoHWCursorShown)
528 NeoShowCursor(pScrn);
529 NEOAdjustFrame(pScrn->scrnIndex, pScrn->frameX0, pScrn->frameY0, 0);
530@@ -1384,12 +1455,12 @@
531 /* Map the Neo memory and possible MMIO areas */
532 if (!neoMapMem(pScrn))
533 return FALSE;
534-
535+
536 /*
537 * next we save the current state and setup the first mode
538 */
539 neoSave(pScrn);
540-
541+
542 if (!neoModeInit(pScrn,pScrn->currentMode))
543 return FALSE;
544 vgaHWSaveScreen(pScreen,SCREEN_SAVER_ON);
545@@ -1431,7 +1502,7 @@
546 nPtr->ShadowPtr = NULL;
547 FBStart = nPtr->NeoFbBase;
548 }
549-
550+
551 ret = fbScreenInit(pScreen, FBStart,
552 width, height,
553 pScrn->xDpi, pScrn->yDpi,
554@@ -1509,13 +1580,13 @@
555 nPtr->NeoLinearAddr);
556 /* Setup pointers to free space in video ram */
557 allocatebase = (pScrn->videoRam << 10);
558- freespace = allocatebase - pScrn->displayWidth *
559+ freespace = allocatebase - pScrn->displayWidth *
560 pScrn->virtualY * (pScrn->bitsPerPixel >> 3);
561 currentaddr = allocatebase;
562 xf86DrvMsg(scrnIndex, X_PROBED,
563 "%d bytes off-screen memory available\n", freespace);
564
565- if (nPtr->swCursor || nPtr->noMMIO) {
566+ if (nPtr->swCursor || !nPtr->NeoMMIOBase) {
567 xf86DrvMsg(scrnIndex, X_CONFIG,
568 "Using Software Cursor.\n");
569 } else if (nPtr->NeoCursorMem <= freespace) {
570@@ -1530,19 +1601,52 @@
571 } else xf86DrvMsg(scrnIndex, X_ERROR,
572 "Too little space for H/W cursor.\n");
573
574- if (!nPtr->noAccel && nPtr->noMMIO)
575+ if (!nPtr->noAccel && !nPtr->NeoMMIOBase)
576 xf86DrvMsg(pScrn->scrnIndex,X_INFO,
577 "Acceleration disabled when not using MMIO\n");
578-
579- /* Setup the acceleration primitives */
580- if (!nPtr->noAccel && !nPtr->noMMIO) {
581+ {
582+#ifdef XvExtension
583+ if (nPtr->overlay > 0){
584+ if (nPtr->overlay > freespace){
585+ xf86DrvMsg(pScrn->scrnIndex,X_INFO,
586+ "Can not reserve %d bytes for overlay. "
587+ "Resize to %d bytes.\n",
588+ nPtr->overlay, freespace);
589+ nPtr->overlay = freespace;
590+ }
591+ currentaddr -= nPtr->overlay;
592+ freespace -= nPtr->overlay;
593+ nPtr->overlay_offset = currentaddr;
594+ xf86DrvMsg(pScrn->scrnIndex,X_INFO,"Overlay at 0x%x\n",
595+ nPtr->overlay_offset);
596+ }
597+#endif /* XvExtension */
598 nAcl->cacheStart = currentaddr - freespace;
599 nAcl->cacheEnd = currentaddr;
600 freespace = 0;
601+ if (nAcl->cacheStart < nAcl->cacheEnd) {
602+ BoxRec AvailFBArea;
603+ int lines = nAcl->cacheEnd /
604+ (pScrn->displayWidth * (pScrn->bitsPerPixel >> 3));
605+ if (!nPtr->noAccel && nPtr->NeoMMIOBase && lines > 1024)
606+ lines = 1024;
607+ AvailFBArea.x1 = 0;
608+ AvailFBArea.y1 = 0;
609+ AvailFBArea.x2 = pScrn->displayWidth;
610+ AvailFBArea.y2 = lines;
611+ xf86InitFBManager(pScreen, &AvailFBArea);
612+
613+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
614+ "Using %i scanlines of offscreen memory \n"
615+ , lines - pScrn->virtualY);
616+ }
617+ }
618+ /* Setup the acceleration primitives */
619+ if (!nPtr->noAccel && nPtr->NeoMMIOBase) {
620 if (nAcl->cacheStart >= nAcl->cacheEnd) {
621 xf86DrvMsg(scrnIndex, X_ERROR,
622 "Too little space for pixmap cache.\n");
623- }
624+ }
625 switch(nPtr->NeoChipset) {
626 case NM2070 :
627 Neo2070AccelInit(pScreen);
628@@ -1624,6 +1728,8 @@
629
630 pScrn->racIoFlags = pScrn->racMemFlags = racflag;
631
632+ NEOInitVideo(pScreen);
633+
634 pScreen->SaveScreen = vgaHWSaveScreen;
635
636 /* Setup DPMS mode */
637@@ -1635,18 +1741,7 @@
638 pScrn->memPhysBase = (unsigned long)nPtr->NeoFbBase;
639 pScrn->fbOffset = 0;
640 }
641-
642-#ifdef XvExtension
643- {
644- XF86VideoAdaptorPtr *ptr;
645- int n;
646-
647- n = xf86XVListGenericAdaptors(pScrn,&ptr);
648- if (n)
649- xf86XVScreenInit(pScreen, ptr, n);
650- }
651-#endif
652-
653+
654 /* Wrap the current CloseScreen function */
655 nPtr->CloseScreen = pScreen->CloseScreen;
656 pScreen->CloseScreen = NEOCloseScreen;
657@@ -1677,11 +1772,21 @@
658 int Base;
659
660 pScrn = xf86Screens[scrnIndex];
661- Base = (y * pScrn->displayWidth + x) >> 2;
662 hwp = VGAHWPTR(pScrn);
663 nPtr = NEOPTR(pScrn);
664- /* Scale Base by the number of bytes per pixel. */
665
666+ if (nPtr->showcache && y) {
667+ int lastline = nPtr->NeoFbMapSize /
668+ ((pScrn->displayWidth * pScrn->bitsPerPixel) / 8);
669+
670+ lastline -= pScrn->currentMode->VDisplay;
671+ y += pScrn->virtualY - 1;
672+ if (y > lastline) y = lastline;
673+ }
674+
675+ Base = (y * pScrn->displayWidth + x) >> 2;
676+
677+ /* Scale Base by the number of bytes per pixel. */
678 switch (pScrn->depth) {
679 case 8 :
680 break;
681@@ -1730,6 +1835,7 @@
682 if (nPtr->NeoHWCursorShown)
683 NeoHideCursor(pScrn);
684 neoRestore(pScrn, &(VGAHWPTR(pScrn))->SavedReg, &nPtr->NeoSavedReg, TRUE);
685+
686 neoLock(pScrn);
687 neoUnmapMem(pScrn);
688 }
689@@ -1845,12 +1951,18 @@
690
691 if (!nPtr->noLinear) {
692 if (!nPtr->noMMIO) {
693- if (nPtr->pEnt->location.type == BUS_PCI)
694+ if (nPtr->pEnt->location.type == BUS_PCI){
695 nPtr->NeoMMIOBase =
696 xf86MapPciMem(pScrn->scrnIndex, VIDMEM_MMIO,
697 nPtr->PciTag, nPtr->NeoMMIOAddr,
698 0x200000L);
699- else
700+ if (nPtr->NeoMMIOAddr2 != 0){
701+ nPtr->NeoMMIOBase2 =
702+ xf86MapPciMem(pScrn->scrnIndex, VIDMEM_MMIO,
703+ nPtr->PciTag, nPtr->NeoMMIOAddr2,
704+ 0x100000L);
705+ }
706+ } else
707 nPtr->NeoMMIOBase =
708 xf86MapVidMem(pScrn->scrnIndex,
709 VIDMEM_MMIO, nPtr->NeoMMIOAddr,
710@@ -1889,8 +2001,14 @@
711 NEOPtr nPtr = NEOPTR(pScrn);
712
713 if (!nPtr->noLinear) {
714- xf86UnMapVidMem(pScrn->scrnIndex, (pointer)nPtr->NeoMMIOBase, 0x200000L);
715+ if (nPtr->NeoMMIOBase)
716+ xf86UnMapVidMem(pScrn->scrnIndex, (pointer)nPtr->NeoMMIOBase,
717+ 0x200000L);
718 nPtr->NeoMMIOBase = NULL;
719+ if (nPtr->NeoMMIOBase2)
720+ xf86UnMapVidMem(pScrn->scrnIndex, (pointer)nPtr->NeoMMIOBase2,
721+ 0x100000L);
722+ nPtr->NeoMMIOBase2 = NULL;
723 xf86UnMapVidMem(pScrn->scrnIndex, (pointer)nPtr->NeoFbBase,
724 nPtr->NeoFbMapSize);
725 }
726@@ -2200,7 +2318,7 @@
727 unsigned char temp;
728 int i;
729 Bool clock_hi = FALSE;
730-
731+
732 vgaHWProtect(pScrn,TRUE); /* Blank the screen */
733
734 VGAwGR(0x09,0x26);
735@@ -2220,6 +2338,7 @@
736 * any reserved bits.
737 */
738 temp = VGArGR(0x90);
739+
740 switch (nPtr->NeoChipset) {
741 case NM2070 :
742 temp &= 0xF0; /* Save bits 7:4 */
743@@ -2238,6 +2357,7 @@
744 break;
745 }
746 VGAwGR(0x90,temp);
747+
748 /*
749 * In some rare cases a lockup might occur if we don't delay
750 * here. (Reported by Miles Lane)
751@@ -2256,7 +2376,6 @@
752 * had time to take effect.
753 */
754 xf86UDelay(200000);
755-
756 /*
757 * This function handles restoring the generic VGA registers. */
758 vgaHWRestore(pScrn, VgaReg,
759@@ -2273,6 +2392,7 @@
760 VGAwGR(0x11, restore->SysIfaceCntl2);
761 VGAwGR(0x15, restore->SingleAddrPage);
762 VGAwGR(0x16, restore->DualAddrPage);
763+
764 temp = VGArGR(0x20);
765 switch (nPtr->NeoChipset) {
766 case NM2070 :
767@@ -2349,7 +2469,7 @@
768 }
769 if (restore->biosMode)
770 VGAwCR(0x23,restore->biosMode);
771-
772+
773 if (restore->reg) {
774 VGAwCR(0x23,restore->reg->CR[0x23]);
775 VGAwCR(0x25,restore->reg->CR[0x25]);
776@@ -2371,13 +2491,13 @@
777 VGAwGR(i, restore->reg->GR[i]);
778 }
779 }
780+
781 /* Program vertical extension register */
782 if (nPtr->NeoChipset == NM2200 || nPtr->NeoChipset == NM2230
783 || nPtr->NeoChipset == NM2360 || nPtr->NeoChipset == NM2380) {
784 VGAwCR(0x70, restore->VerticalExt);
785 }
786-
787-
788+
789 vgaHWProtect(pScrn, FALSE); /* Turn on screen */
790
791 }
792@@ -2574,7 +2694,7 @@
793 NeoNew->PanelHorizCenterReg3 = 0x00;
794 NeoNew->PanelHorizCenterReg4 = 0x00;
795 NeoNew->PanelHorizCenterReg5 = 0x00;
796-
797+
798 if (nPtr->lcdCenter &&
799 (NeoNew->PanelDispCntlReg1 & 0x02)) {
800 if (mode->HDisplay == nPtr->NeoPanelWidth) {
801@@ -2632,6 +2752,18 @@
802 }
803 }
804 }
805+#ifdef XvExtension
806+ if (!noLcdStretch) {
807+ if (mode->HDisplay != nPtr->NeoPanelWidth)
808+ nPtr->videoHZoom = (double)nPtr->NeoPanelWidth/mode->HDisplay;
809+ if (mode->VDisplay != nPtr->NeoPanelHeight)
810+ nPtr->videoVZoom = (double)nPtr->NeoPanelHeight/mode->VDisplay;
811+ } else {
812+ nPtr->videoHZoom = 1.0;
813+ nPtr->videoVZoom = 1.0;
814+ }
815+#endif
816+
817 NeoNew->biosMode = neoFindMode(mode->HDisplay,mode->VDisplay,pScrn->depth);
818
819 /*
820@@ -2764,9 +2896,8 @@
821 }
822
823 /* Turn the screen on/off */
824- outb(0x3C4, 0x01);
825- SEQ01 |= inb(0x3C5) & ~0x20;
826- outb(0x3C5, SEQ01);
827+ SEQ01 |= VGArSR(0x01) & ~0x20;
828+ VGAwSR(0x01, SEQ01);
829
830 /* Turn the LCD on/off */
831 LCD_on |= VGArGR(0x20) & ~0x02;
832--- XFree86-4.2.0/xc.orig/programs/Xserver/hw/xfree86/drivers/neomagic/neo_video.c Thu Jan 1 01:00:00 1970
833+++ XFree86-4.2.0/xc/programs/Xserver/hw/xfree86/drivers/neomagic/neo_video.c Thu Apr 4 16:05:44 2002
834@@ -0,0 +1,1232 @@
835+/**********************************************************************
836+Copyright 2002 by Shigehiro Nomura.
837+
838+ All Rights Reserved
839+
840+Permission to use, copy, modify, distribute, and sell this software and
841+its documentation for any purpose is hereby granted without fee,
842+provided that the above copyright notice appear in all copies and that
843+both that copyright notice and this permission notice appear in
844+supporting documentation, and that the name of Shigehiro Nomura not be
845+used in advertising or publicity pertaining to distribution of the
846+software without specific, written prior permission. Shigehiro Nomura
847+and its suppliers make no representations about the suitability of this
848+software for any purpose. It is provided "as is" without express or
849+implied warranty.
850+
851+SHIGEHIRO NOMURA DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
852+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
853+EVENT SHALL SHIGEHIRO NOMURA AND/OR ITS SUPPLIERS BE LIABLE FOR ANY
854+SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
855+RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
856+CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
857+CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
858+**********************************************************************/
859+
860+/*
861+ * Copyright 2002 SuSE Linux AG, Author: Egbert Eich
862+ */
863+
864+#include "neo.h"
865+#include "neo_video.h"
866+
867+#define nElems(x) (sizeof(x) / sizeof(x[0]))
868+#define MAKE_ATOM(a) MakeAtom(a, sizeof(a) - 1, TRUE)
869+
870+#if defined(XvExtension)
871+
872+#include "dixstruct.h"
873+#include "xaa.h"
874+#include "xaalocal.h"
875+
876+static XF86VideoAdaptorPtr NEOSetupVideo(ScreenPtr);
877+
878+static int NEOPutVideo(ScrnInfoPtr, short, short, short, short,
879+ short, short, short, short, RegionPtr, pointer);
880+
881+static void NEOStopVideo(ScrnInfoPtr, pointer, Bool);
882+static int NEOSetPortAttribute(ScrnInfoPtr, Atom, INT32, pointer);
883+static int NEOGetPortAttribute(ScrnInfoPtr, Atom, INT32 *, pointer);
884+static void NEOQueryBestSize(ScrnInfoPtr, Bool, short, short, short,
885+ short, unsigned int *, unsigned int *, pointer);
886+static int NEOPutImage(ScrnInfoPtr, short, short, short, short, short, short,
887+ short, short, int, unsigned char *, short, short, Bool,
888+ RegionPtr, pointer);
889+static int NEOQueryImageAttributes(ScrnInfoPtr, int, unsigned short *,
890+ unsigned short *, int *, int *);
891+
892+static Bool RegionsEqual(RegionPtr, RegionPtr);
893+static void NEODisplayVideo(ScrnInfoPtr, int, int, short, short, int, int,
894+ int, int, int, BoxPtr, short, short, short, short);
895+
896+static void NEOInitOffscreenImages(ScreenPtr);
897+static FBLinearPtr NEOAllocateMemory(ScrnInfoPtr, FBLinearPtr, int);
898+static void NEOCopyData(unsigned char *, unsigned char *, int, int, int, int);
899+static void NEOCopyYV12Data(unsigned char *, unsigned char *, unsigned char *,
900+ unsigned char *, int, int, int, int, int);
901+
902+static int NEOAllocSurface(ScrnInfoPtr, int, unsigned short, unsigned short,
903+ XF86SurfacePtr);
904+static int NEOFreeSurface(XF86SurfacePtr);
905+static int NEODisplaySurface(XF86SurfacePtr, short, short, short, short,
906+ short, short, short, short, RegionPtr clipBoxes);
907+static int NEOStopSurface(XF86SurfacePtr);
908+static int NEOGetSurfaceAttribute(ScrnInfoPtr, Atom, INT32 *);
909+static int NEOSetSurfaceAttribute(ScrnInfoPtr, Atom, INT32);
910+
911+static Atom xvColorKey, xvBrightness, xvInterlace;
912+
913+void
914+NEOInitVideo(ScreenPtr pScreen)
915+{
916+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
917+ NEOPtr nPtr = NEOPTR(pScrn);
918+ XF86VideoAdaptorPtr *overlayAdaptors, *newAdaptors = NULL;
919+ XF86VideoAdaptorPtr newAdaptor = NULL;
920+ int numAdaptors;
921+
922+ numAdaptors = xf86XVListGenericAdaptors(pScrn, &overlayAdaptors);
923+
924+ if (nPtr->NeoChipset >= NM2160
925+ && !nPtr->noLinear
926+ && nPtr->NeoMMIOBase2 != NULL){
927+ nPtr->video = TRUE;
928+ newAdaptor = NEOSetupVideo(pScreen);
929+ NEOInitOffscreenImages(pScreen);
930+ } else
931+ nPtr->video = FALSE;
932+
933+ if (newAdaptor){
934+ if (!numAdaptors){
935+ numAdaptors = 1;
936+ overlayAdaptors = &newAdaptor;
937+ } else {
938+ newAdaptors = xalloc((numAdaptors + 1)
939+ * sizeof(XF86VideoAdaptorPtr*));
940+ if (newAdaptors){
941+ memcpy(newAdaptors, overlayAdaptors,
942+ numAdaptors * sizeof(XF86VideoAdaptorPtr));
943+ newAdaptors[numAdaptors++] = newAdaptor;
944+ overlayAdaptors = newAdaptors;
945+ }
946+ }
947+ }
948+
949+ if (numAdaptors)
950+ xf86XVScreenInit(pScreen, overlayAdaptors, numAdaptors);
951+
952+ if (newAdaptors)
953+ xfree(newAdaptors);
954+}
955+
956+static XF86VideoEncodingRec NEOVideoEncodings[] =
957+{
958+ {
959+ NEO_VIDEO_VIDEO,
960+ "XV_VIDEO",
961+ 1024, 1024,
962+ {1, 1}
963+ },
964+ {
965+ NEO_VIDEO_IMAGE,
966+ "XV_IMAGE",
967+ 1024, 1024,
968+ {1, 1}
969+ }
970+};
971+
972+static XF86VideoFormatRec NEOVideoFormats[] =
973+{
974+ { 8, PseudoColor },
975+ { 15, TrueColor },
976+ { 16, TrueColor },
977+ { 24, TrueColor },
978+};
979+
980+static XF86AttributeRec NEOVideoAttributes[] =
981+{
982+ {
983+ XvSettable | XvGettable,
984+ 0x000000, 0xFFFFFF,
985+ "XV_COLORKEY"
986+ },
987+ {
988+ XvSettable | XvGettable,
989+ -128, 127,
990+ "XV_BRIGHTNESS"
991+ },
992+ {
993+ XvSettable | XvGettable,
994+ 0,2,
995+ "XV_INTERLACE"
996+ },
997+};
998+
999+static XF86ImageRec NEOVideoImages[] =
1000+{
1001+ XVIMAGE_YUY2,
1002+ XVIMAGE_YV12,
1003+ XVIMAGE_I420,
1004+ {
1005+ FOURCC_RV15,
1006+ XvRGB,
1007+ LSBFirst,
1008+ { 'R', 'V' ,'1', '5',
1009+ 0x00,'5',0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
1010+ 16,
1011+ XvPacked,
1012+ 1,
1013+ 15, 0x001F, 0x03E0, 0x7C00,
1014+ 0, 0, 0,
1015+ 0, 0, 0,
1016+ 0, 0, 0,
1017+ { 'R', 'V', 'B' },
1018+ XvTopToBottom
1019+ },
1020+ {
1021+ FOURCC_RV16,
1022+ XvRGB,
1023+ LSBFirst,
1024+ { 'R', 'V' ,'1', '6',
1025+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 },
1026+ 16,
1027+ XvPacked,
1028+ 1,
1029+ 16, 0x001F, 0x07E0, 0xF800,
1030+ 0, 0, 0,
1031+ 0, 0, 0,
1032+ 0, 0, 0,
1033+ { 'R', 'V', 'B' },
1034+ XvTopToBottom
1035+ }
1036+};
1037+
1038+static XF86VideoAdaptorPtr
1039+NEOSetupVideo(ScreenPtr pScreen)
1040+{
1041+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
1042+ NEOPtr nPtr = NEOPTR(pScrn);
1043+ NEOPortPtr pPriv;
1044+ XF86VideoAdaptorPtr overlayAdaptor;
1045+ int i;
1046+
1047+#ifdef DEBUG
1048+ xf86DrvMsg(pScrn->scrnIndex,X_INFO,"NEOSetupVideo\n");
1049+#endif
1050+ if ((overlayAdaptor = xcalloc(1, sizeof(XF86VideoAdaptorRec) +
1051+ sizeof(DevUnion) +
1052+ sizeof(NEOPortRec))) == NULL){
1053+ return (NULL);
1054+ }
1055+
1056+ overlayAdaptor->type = XvInputMask | XvImageMask | XvWindowMask
1057+ | XvOutputMask | XvVideoMask;
1058+ overlayAdaptor->flags = VIDEO_OVERLAID_IMAGES | VIDEO_CLIP_TO_VIEWPORT;
1059+ overlayAdaptor->name = "NeoMagic Video Engine";
1060+ overlayAdaptor->nEncodings = nElems(NEOVideoEncodings);
1061+ overlayAdaptor->pEncodings = NEOVideoEncodings;
1062+ for (i = 0; i < nElems(NEOVideoEncodings); i++){
1063+ NEOVideoEncodings[i].width = 1024;
1064+ NEOVideoEncodings[i].height = 1024;
1065+ }
1066+ overlayAdaptor->nFormats = nElems(NEOVideoFormats);
1067+ overlayAdaptor->pFormats = NEOVideoFormats;
1068+ overlayAdaptor->nPorts = 1;
1069+ overlayAdaptor->pPortPrivates = (DevUnion*) &overlayAdaptor[1];
1070+ overlayAdaptor->pPortPrivates[0].ptr =
1071+ (pointer) &overlayAdaptor->pPortPrivates[1];
1072+ overlayAdaptor->nAttributes = nElems(NEOVideoAttributes);
1073+ overlayAdaptor->pAttributes = NEOVideoAttributes;
1074+ overlayAdaptor->nImages = nElems(NEOVideoImages);
1075+ overlayAdaptor->pImages = NEOVideoImages;
1076+
1077+ overlayAdaptor->PutVideo = NEOPutVideo;
1078+ overlayAdaptor->PutStill = NULL;
1079+ overlayAdaptor->GetVideo = NULL;
1080+ overlayAdaptor->GetStill = NULL;
1081+
1082+ overlayAdaptor->StopVideo = NEOStopVideo;
1083+ overlayAdaptor->SetPortAttribute = NEOSetPortAttribute;
1084+ overlayAdaptor->GetPortAttribute = NEOGetPortAttribute;
1085+ overlayAdaptor->QueryBestSize = NEOQueryBestSize;
1086+ overlayAdaptor->PutImage = NEOPutImage;
1087+ overlayAdaptor->QueryImageAttributes = NEOQueryImageAttributes;
1088+
1089+ pPriv = (NEOPortPtr)overlayAdaptor->pPortPrivates[0].ptr;
1090+ pPriv->colorKey = nPtr->videoKey;
1091+ pPriv->interlace = nPtr->interlace;
1092+ pPriv->videoStatus = 0;
1093+ pPriv->brightness = 0;
1094+ REGION_INIT(pScreen, &pPriv->clip, NullBox, 0);
1095+ nPtr->overlayAdaptor = overlayAdaptor;
1096+
1097+ xvBrightness = MAKE_ATOM("XV_BRIGHTNESS");
1098+ xvColorKey = MAKE_ATOM("XV_COLORKEY");
1099+ xvInterlace = MAKE_ATOM("XV_INTERLACE");
1100+
1101+ NEOResetVideo(pScrn);
1102+
1103+ return (overlayAdaptor);
1104+}
1105+
1106+void
1107+NEOResetVideo(ScrnInfoPtr pScrn)
1108+{
1109+ NEOPtr nPtr = NEOPTR(pScrn);
1110+ NEOPortPtr pPriv = (NEOPortPtr)nPtr->overlayAdaptor->pPortPrivates[0].ptr;
1111+ int r, g, b;
1112+ VGA_HWP(pScrn);
1113+
1114+#ifdef DEBUG
1115+ xf86DrvMsg(pScrn->scrnIndex,X_INFO,"NEOResetVideo\n");
1116+#endif
1117+ switch (pScrn->depth){
1118+ case 8:
1119+ OUTGR(0xc6, pPriv->colorKey & 0);
1120+ OUTGR(0xc5, pPriv->colorKey & 0xff);
1121+ OUTGR(0xc7, pPriv->colorKey & 0);
1122+ break;
1123+ default:
1124+ r = (pPriv->colorKey & pScrn->mask.red) >> pScrn->offset.red;
1125+ g = (pPriv->colorKey & pScrn->mask.green) >> pScrn->offset.green;
1126+ b = (pPriv->colorKey & pScrn->mask.blue) >> pScrn->offset.blue;
1127+ OUTGR(0xc5, r);
1128+ OUTGR(0xc6, g);
1129+ OUTGR(0xc7, b);
1130+ break;
1131+ }
1132+ OUTGR(0xc4, pPriv->brightness);
1133+}
1134+
1135+static int
1136+NEOPutVideo(ScrnInfoPtr pScrn,
1137+ short src_x, short src_y, short drw_x, short drw_y,
1138+ short src_w, short src_h, short drw_w, short drw_h,
1139+ RegionPtr clipBoxes, pointer data)
1140+{
1141+ NEOPortPtr pPriv = (NEOPortPtr)data;
1142+ NEOPtr nPtr = NEOPTR(pScrn);
1143+ CARD32 src_pitch, offset;
1144+ int xscale, yscale;
1145+ BoxRec dstBox;
1146+ INT32 x1, y1, x2, y2;
1147+ int size, bpp;
1148+ unsigned char capctrl;
1149+ VGA_HWP(pScrn);
1150+
1151+#ifdef DEBUG
1152+ xf86DrvMsg(pScrn->scrnIndex,X_INFO,"NEOPutVideo: src: %d %d %d %d\n",
1153+ src_x, src_y, src_w, src_h);
1154+ xf86DrvMsg(pScrn->scrnIndex,X_INFO,"NEOPutVideo: drw: %d %d %d %d\n",
1155+ drw_x, drw_y, drw_w, drw_h);
1156+#endif
1157+ if (src_w > 720)
1158+ src_w = 720;
1159+ if (src_h > 576)
1160+ src_h = 576;
1161+ if (pPriv->interlace != 2)
1162+ src_h /= 2;
1163+ x1 = src_x;
1164+ y1 = src_y;
1165+ x2 = src_x + src_w;
1166+ y2 = src_y + src_h;
1167+
1168+ dstBox.x1 = drw_x;
1169+ dstBox.y1 = drw_y;
1170+ dstBox.x2 = drw_x + drw_w;
1171+ dstBox.y2 = drw_y + drw_h;
1172+
1173+ if (!xf86XVClipVideoHelper(&dstBox, &x1, &x2, &y1, &y2,
1174+ clipBoxes, src_w, src_h)){
1175+ return(Success);
1176+ }
1177+#ifdef DEBUG
1178+ xf86DrvMsg(pScrn->scrnIndex,X_INFO,"NEOPutVideo: %d %d %d %d\n",
1179+ x1, y1, x2, y2);
1180+#endif
1181+
1182+ dstBox.x1 -= pScrn->frameX0;
1183+ dstBox.y1 -= pScrn->frameY0;
1184+ dstBox.x2 -= pScrn->frameX0;
1185+ dstBox.y2 -= pScrn->frameY0;
1186+#ifdef DEBUG
1187+ xf86DrvMsg(pScrn->scrnIndex,X_INFO,"NEOPutVideo: dstBox %d %d %d %d\n",
1188+ dstBox.x1, dstBox.y1, dstBox.x2, dstBox.y2);
1189+#endif
1190+
1191+ bpp = (pScrn->bitsPerPixel + 1) >> 3;
1192+ src_pitch = (src_w + 7) & ~7;
1193+
1194+ xscale = 0x1000;
1195+ if (src_w <= drw_w){
1196+ xscale = (src_w * 0x1000 / drw_w) & 0xffff;
1197+ }
1198+
1199+ yscale = 0x1000;
1200+ if (src_h <= drw_h){
1201+ yscale = (src_h * 0x1000 / drw_h) & 0xffff;
1202+ }
1203+
1204+ size = src_h * src_pitch * 2;
1205+
1206+ if (size > nPtr->overlay){
1207+ if ((pPriv->linear = NEOAllocateMemory(pScrn, pPriv->linear, size))
1208+ == NULL){
1209+ return (BadAlloc);
1210+ }
1211+ } else {
1212+ pPriv->linear = NULL;
1213+ }
1214+
1215+ if (pPriv->linear == NULL){
1216+ offset = nPtr->overlay_offset;
1217+ } else {
1218+ offset = pPriv->linear->offset * bpp;
1219+ }
1220+
1221+#ifdef DEBUG
1222+ xf86DrvMsg(pScrn->scrnIndex,X_INFO,"NEOPutVideo: offset=0x%x\n", offset);
1223+#endif
1224+ WAIT_ENGINE_IDLE();
1225+ memset(nPtr->NeoFbBase + offset, 0, size);
1226+
1227+ if (!RegionsEqual(&pPriv->clip, clipBoxes)){
1228+ REGION_COPY(pScreen, &pPriv->clip, clipBoxes);
1229+ xf86XVFillKeyHelper(pScrn->pScreen, pPriv->colorKey,
1230+ clipBoxes);
1231+ }
1232+
1233+ x1 >>= 16;
1234+ y1 >>= 16;
1235+ x2 >>= 16;
1236+ y2 >>= 16;
1237+
1238+ switch (nPtr->NeoChipset) {
1239+ default:
1240+ case NM2160:
1241+ offset/=2;
1242+ OUTGR(0xbc, 0x4f);
1243+ break;
1244+ case NM2200:
1245+ case NM2230:
1246+ case NM2360:
1247+ case NM2380:
1248+ OUTGR(0xbc, 0x2e);
1249+ break;
1250+ }
1251+
1252+
1253+ OUTGR(0xb1, (((dstBox.x2-1) >> 4) & 0xf0) | ((dstBox.x1 >> 8) & 0x0f));
1254+ OUTGR(0xb2, dstBox.x1);
1255+ OUTGR(0xb3, dstBox.x2 - 1);
1256+ OUTGR(0xb4, (((dstBox.y2 - 1) >> 4) & 0xf0) | ((dstBox.y1 >> 8) & 0x0f));
1257+ OUTGR(0xb5, dstBox.y1);
1258+ OUTGR(0xb6, dstBox.y2 - 1);
1259+ OUTGR(0xb7, offset >> 16);
1260+ OUTGR(0xb8, offset >> 8);
1261+ OUTGR(0xb9, offset );
1262+ OUTGR(0xba, src_pitch >> 8);
1263+ OUTGR(0xbb, src_pitch);
1264+
1265+ OUTGR(0xc0, xscale >> 8);
1266+ OUTGR(0xc1, xscale);
1267+ OUTGR(0xc2, yscale >> 8);
1268+ OUTGR(0xc3, yscale);
1269+ OUTGR(0xbf, 0x02);
1270+
1271+ OUTGR(0x0a, 0x21);
1272+
1273+ OUTSR(0x0c, offset );
1274+ OUTSR(0x0d, offset >> 8);
1275+ OUTSR(0x0e, offset >> 16);
1276+ OUTSR(0x1a, src_pitch);
1277+ OUTSR(0x1b, src_pitch>>8);
1278+
1279+ OUTSR(0x17, 0 + x1);
1280+ OUTSR(0x18, 0 + x2 -1);
1281+ OUTSR(0x19, (((0 + x2 - 1) >> 4) & 0xf0) | (((0 + x1) >> 8) & 0x0f));
1282+
1283+ OUTSR(0x14, 14 + y1);
1284+ OUTSR(0x15, 14 + y2 - 2);
1285+ OUTSR(0x16, (((14 + y2 - 1) >> 4) & 0xf0) | (((14 + y1) >> 8) & 0x0f));
1286+
1287+ OUTSR(0x1c, 0xfb);
1288+ OUTSR(0x1d, 0x00);
1289+ OUTSR(0x1e, 0xe2);
1290+ OUTSR(0x1f, 0x02);
1291+
1292+ OUTSR(0x09, 0x11);
1293+ OUTSR(0x0a, 0x00);
1294+
1295+ capctrl = 0x21;
1296+ switch (pPriv->interlace){
1297+ case 0: /* Combine 2 fields */
1298+ break;
1299+ case 1: /* one field only */
1300+ capctrl |= 0x80;
1301+ break;
1302+ case 2: /* Interlaced fields */
1303+ capctrl |= 0x40;
1304+ break;
1305+ }
1306+ OUTSR(0x08, capctrl);
1307+
1308+#if 0
1309+ OUTGR(0x0a, 0x01);
1310+#endif
1311+ OUTGR(0xb0, 0x03);
1312+
1313+ pPriv->videoStatus = CLIENT_VIDEO_ON;
1314+ return (Success);
1315+}
1316+
1317+static void
1318+NEOStopVideo(ScrnInfoPtr pScrn, pointer data, Bool exit)
1319+{
1320+ NEOPortPtr pPriv = (NEOPortPtr)data;
1321+ NEOPtr nPtr = NEOPTR(pScrn);
1322+ VGA_HWP(pScrn);
1323+
1324+#ifdef DEBUG
1325+ xf86DrvMsg(pScrn->scrnIndex,X_INFO,"NEOStopVideo\n");
1326+#endif
1327+ REGION_EMPTY(pScrn->pScreen, &pPriv->clip);
1328+
1329+ if (exit){
1330+ if (pPriv->videoStatus & CLIENT_VIDEO_ON){
1331+#ifdef DEBUG
1332+ xf86DrvMsg(pScrn->scrnIndex,X_INFO,"NEOStopVideo: stop capture\n");
1333+#endif
1334+ OUTGR(0xb0, 0x02);
1335+ OUTGR(0x0a, 0x21);
1336+ OUTSR(0x08, 0xa0);
1337+#if 0
1338+ OUTGR(0x0a, 0x01);
1339+#endif
1340+ }
1341+ if (pPriv->linear != NULL){
1342+ xf86FreeOffscreenLinear(pPriv->linear);
1343+ pPriv->linear = NULL;
1344+ }
1345+ pPriv->videoStatus = 0;
1346+ } else {
1347+ if (pPriv->videoStatus & CLIENT_VIDEO_ON){
1348+ OUTGR(0xb0, 0x02);
1349+ OUTGR(0x0a, 0x21);
1350+ OUTSR(0x08, 0xa0);
1351+#if 0
1352+ OUTGR(0x0a, 0x01);
1353+#endif
1354+ pPriv->videoStatus |= OFF_TIMER;
1355+ pPriv->offTime = currentTime.milliseconds + OFF_DELAY;
1356+ }
1357+ }
1358+}
1359+
1360+static int
1361+NEOSetPortAttribute(ScrnInfoPtr pScrn, Atom attribute, INT32 value,
1362+ pointer data)
1363+{
1364+ NEOPortPtr pPriv = (NEOPortPtr)data;
1365+ NEOPtr nPtr = NEOPTR(pScrn);
1366+ VGA_HWP(pScrn);
1367+
1368+#ifdef DEBUG
1369+ xf86DrvMsg(pScrn->scrnIndex,X_INFO,"NEOSetPortAttribute\n");
1370+#endif
1371+ if (attribute == xvColorKey){
1372+ int r, g, b;
1373+
1374+ pPriv->colorKey = value;
1375+ switch (pScrn->depth){
1376+ case 8:
1377+ OUTGR(0xc6, pPriv->colorKey & 0xff);
1378+ OUTGR(0xc5, 0x00);
1379+ OUTGR(0xc7, 0x00);
1380+ break;
1381+ default:
1382+ r = (pPriv->colorKey & pScrn->mask.red) >> pScrn->offset.red;
1383+ g = (pPriv->colorKey & pScrn->mask.green) >> pScrn->offset.green;
1384+ b = (pPriv->colorKey & pScrn->mask.blue) >> pScrn->offset.blue;
1385+ OUTGR(0xc5, r);
1386+ OUTGR(0xc6, g);
1387+ OUTGR(0xc7, b);
1388+ }
1389+ } else if (attribute == xvBrightness){
1390+ if ((value < -128) || (value > 127)){
1391+ return (BadValue);
1392+ }
1393+ pPriv->brightness = value;
1394+ OUTGR(0xc4, value);
1395+ } else if (attribute == xvInterlace){
1396+ if (value < 0 || value > 2){
1397+ return (BadValue);
1398+ }
1399+ pPriv->interlace = value;
1400+ } else {
1401+ return (BadMatch);
1402+ }
1403+ return (Success);
1404+}
1405+
1406+static int
1407+NEOGetPortAttribute(ScrnInfoPtr pScrn, Atom attribute, INT32 *value,
1408+ pointer data)
1409+{
1410+ NEOPortPtr pPriv = (NEOPortPtr)data;
1411+
1412+#ifdef DEBUG
1413+ xf86DrvMsg(pScrn->scrnIndex,X_INFO,"NEOGetPortAttribute\n");
1414+#endif
1415+ if (attribute == xvColorKey){
1416+ *value = pPriv->colorKey;
1417+ } else if (attribute == xvBrightness){
1418+ *value = pPriv->brightness;
1419+ } else if (attribute == xvInterlace){
1420+ *value = pPriv->interlace;
1421+ } else {
1422+ return (BadMatch);
1423+ }
1424+ return (Success);
1425+}
1426+
1427+static void
1428+NEOQueryBestSize(ScrnInfoPtr pScrn, Bool motion,
1429+ short vid_w, short vid_h, short drw_w, short drw_h,
1430+ unsigned int *p_w, unsigned int *p_h,
1431+ pointer data)
1432+{
1433+#ifdef DEBUG
1434+ xf86DrvMsg(pScrn->scrnIndex,X_INFO,"NEOQueryBestSize\n");
1435+#endif
1436+ *p_w = min(drw_w, 1024);
1437+ *p_h = min(drw_h, 1024);
1438+}
1439+
1440+static int
1441+NEOPutImage(ScrnInfoPtr pScrn,
1442+ short src_x, short src_y, short drw_x, short drw_y,
1443+ short src_w, short src_h, short drw_w, short drw_h,
1444+ int id, unsigned char *buf, short width, short height,
1445+ Bool sync, RegionPtr clipBoxes, pointer data)
1446+{
1447+ NEOPtr nPtr = NEOPTR(pScrn);
1448+ NEOPortPtr pPriv = (NEOPortPtr)nPtr->overlayAdaptor->pPortPrivates[0].ptr;
1449+ INT32 x1, y1, x2, y2;
1450+ int bpp;
1451+ int srcPitch, srcPitch2 = 0, dstPitch, size;
1452+ BoxRec dstBox;
1453+ CARD32 offset, offset2 = 0, offset3 = 0, tmp;
1454+ int left, top, nPixels, nLines;
1455+ unsigned char *dstStart;
1456+
1457+#ifdef DEBUG
1458+ xf86DrvMsg(pScrn->scrnIndex,X_INFO,"NEOPutImage\n");
1459+#endif
1460+
1461+ x1 = src_x;
1462+ y1 = src_y;
1463+ x2 = src_x + src_w;
1464+ y2 = src_y + src_h;
1465+
1466+ dstBox.x1 = drw_x;
1467+ dstBox.y1 = drw_y;
1468+ dstBox.x2 = drw_x + drw_w;
1469+ dstBox.y2 = drw_y + drw_h;
1470+
1471+ if (!xf86XVClipVideoHelper(&dstBox, &x1, &x2, &y1, &y2,
1472+ clipBoxes, width, height)){
1473+ return (Success);
1474+ }
1475+
1476+ dstBox.x1 -= pScrn->frameX0;
1477+ dstBox.y1 -= pScrn->frameY0;
1478+ dstBox.x2 -= pScrn->frameX0;
1479+ dstBox.y2 -= pScrn->frameY0;
1480+
1481+ bpp = ((pScrn->bitsPerPixel + 1) >> 3);
1482+
1483+ switch (id){
1484+ case FOURCC_YV12:
1485+ srcPitch = (width + 3) & ~3;
1486+ offset2 = srcPitch * height;
1487+ srcPitch2 = ((width >> 1) + 3) & ~3;
1488+ offset3 = offset2 + (srcPitch2 * (height >> 1));
1489+ dstPitch = ((width << 1) + 15) & ~15;
1490+ break;
1491+ case FOURCC_I420:
1492+ srcPitch = (width + 3) & ~3;
1493+ offset3 = srcPitch * height;
1494+ srcPitch2 = ((width >> 1) + 3) & ~3;
1495+ offset2 = offset3 + (srcPitch2 * (height >> 1));
1496+ dstPitch = ((width << 1) + 15) & ~15;
1497+ break;
1498+ case FOURCC_YUY2:
1499+ case FOURCC_RV15:
1500+ case FOURCC_RV16:
1501+ default:
1502+ srcPitch = width << 1;
1503+ dstPitch = (srcPitch + 15) & ~15;
1504+ break;
1505+ }
1506+
1507+ size = dstPitch * height;
1508+ if (size > nPtr->overlay){
1509+ if ((pPriv->linear = NEOAllocateMemory(pScrn, pPriv->linear, size))
1510+ == NULL){
1511+ return (BadAlloc);
1512+ }
1513+ } else {
1514+ pPriv->linear = NULL;
1515+ }
1516+
1517+ top = y1 >> 16;
1518+ left = (x1 >> 16) & ~1;
1519+ nPixels = ((((x2 + 0xFFFF) >> 16) + 1) & ~1) - left;
1520+ left <<= 1;
1521+
1522+ if (pPriv->linear == NULL){
1523+ offset = nPtr->overlay_offset;
1524+ } else {
1525+ offset = pPriv->linear->offset * bpp;
1526+ }
1527+
1528+#ifdef DEBUG
1529+ xf86DrvMsg(pScrn->scrnIndex,X_INFO,"offset=%x\n", offset);
1530+#endif
1531+
1532+ dstStart = (unsigned char *)(nPtr->NeoFbBase + offset + left);
1533+
1534+ switch (id){
1535+ case FOURCC_YV12:
1536+ case FOURCC_I420:
1537+ top &= ~1;
1538+ tmp = ((top >> 1) * srcPitch2) + (left >> 2);
1539+ offset2 += tmp;
1540+ offset3 += tmp;
1541+ nLines = ((((y2 + 0xFFFF) >> 16) + 1) & ~1) - top;
1542+ NEOCopyYV12Data(buf + (top * srcPitch) + (left >> 1), buf + offset2,
1543+ buf + offset3, dstStart, srcPitch, srcPitch2,
1544+ dstPitch, nLines, nPixels);
1545+ break;
1546+ default:
1547+ buf += (top * srcPitch) + left;
1548+ nLines = ((y2 + 0xFFFF) >> 16) - top;
1549+ NEOCopyData(buf, dstStart, srcPitch, dstPitch, nLines, nPixels << 1);
1550+ }
1551+
1552+ if (!RegionsEqual(&pPriv->clip, clipBoxes)){
1553+ REGION_COPY(pScreen, &pPriv->clip, clipBoxes);
1554+ xf86XVFillKeyHelper(pScrn->pScreen, pPriv->colorKey, clipBoxes);
1555+ }
1556+ NEODisplayVideo(pScrn, id, offset, width, height, dstPitch, x1, y1,
1557+ x2, y2, &dstBox, src_w, src_h, drw_w, drw_h);
1558+
1559+ pPriv->videoStatus = CLIENT_VIDEO_ON;
1560+ return (Success);
1561+
1562+}
1563+
1564+static int
1565+NEOQueryImageAttributes(ScrnInfoPtr pScrn, int id,
1566+ unsigned short *width, unsigned short *height,
1567+ int *pitches, int *offsets)
1568+{
1569+ int size, tmp;
1570+
1571+#ifdef DEBUG
1572+ xf86DrvMsg(pScrn->scrnIndex,X_INFO,"NEOQueryImageAttributes\n");
1573+#endif
1574+ if (*width > 1024){
1575+ *width = 1024;
1576+ }
1577+ if (*height > 1024){
1578+ *height = 1024;
1579+ }
1580+
1581+ *width = (*width + 1) & ~1;
1582+ if (offsets != NULL){
1583+ offsets[0] = 0;
1584+ }
1585+
1586+ switch (id){
1587+ case FOURCC_YV12:
1588+ case FOURCC_I420:
1589+ *height = (*height + 1) & ~1;
1590+ size = (*width + 3) & ~3;
1591+ if (pitches != NULL){
1592+ pitches[0] = size;
1593+ }
1594+ size *= *height;
1595+ if (offsets != NULL){
1596+ offsets[1] = size;
1597+ }
1598+ tmp = ((*width >> 1) + 3) & ~3;
1599+ if (pitches != NULL){
1600+ pitches[1] = pitches[2] = tmp;
1601+ }
1602+ tmp *= (*height >> 1);
1603+ size += tmp;
1604+ if (offsets != NULL){
1605+ offsets[2] = size;
1606+ }
1607+ size += tmp;
1608+ break;
1609+ case FOURCC_YUY2:
1610+ case FOURCC_RV15:
1611+ case FOURCC_RV16:
1612+ default:
1613+ size = *width * 2;
1614+ if (pitches != NULL){
1615+ pitches[0] = size;
1616+ }
1617+ size *= *height;
1618+ break;
1619+ }
1620+ return (size);
1621+}
1622+
1623+static Bool
1624+RegionsEqual(RegionPtr A, RegionPtr B)
1625+{
1626+ int *dataA, *dataB;
1627+ int num;
1628+
1629+ num = REGION_NUM_RECTS(A);
1630+ if (num != REGION_NUM_RECTS(B)){
1631+ return (FALSE);
1632+ }
1633+
1634+ if ((A->extents.x1 != B->extents.x1)
1635+ || (A->extents.y1 != B->extents.y1)
1636+ || (A->extents.x2 != B->extents.x2)
1637+ || (A->extents.y2 != B->extents.y2)){
1638+ return (FALSE);
1639+ }
1640+
1641+ dataA = (int*) REGION_RECTS(A);
1642+ dataB = (int*) REGION_RECTS(B);
1643+
1644+ while (num--){
1645+ if ((dataA[0] != dataB[0]) || (dataA[1] != dataB[1])){
1646+ return (FALSE);
1647+ }
1648+ dataA += 2;
1649+ dataB += 2;
1650+ }
1651+ return (TRUE);
1652+}
1653+
1654+static void
1655+NEODisplayVideo(ScrnInfoPtr pScrn, int id, int offset,
1656+ short width, short height, int pitch,
1657+ int x1, int y1, int x2, int y2, BoxPtr dstBox,
1658+ short src_w, short src_h, short drw_w, short drw_h)
1659+{
1660+ NEOPtr nPtr = NEOPTR(pScrn);
1661+ int hstretch, vstretch, fmt;
1662+ VGA_HWP(pScrn);
1663+#ifdef DEBUG
1664+ xf86DrvMsg(pScrn->scrnIndex,X_INFO,"NEODisplayVideo\n");
1665+ xf86DrvMsg(pScrn->scrnIndex,X_INFO,"NEODisplayVideo src_w=%d, src_h=%d, pitch=%d, drw_w=%d, drw_h=%d\n", src_w, src_h, pitch, drw_w, drw_h);
1666+#endif
1667+#define WIDTH_THRESHOLD 160
1668+ if (dstBox->x2 >= pScrn->virtualX) {
1669+ /*
1670+ * This is a hack to work around a problem when video is moved
1671+ * accross the right border.
1672+ */
1673+ int diff_s = (width - ((x2 - x1) >> 16)) & ~1;
1674+ int diff_d = (drw_w - dstBox->x2 + dstBox->x1) & ~1;
1675+
1676+ offset -= 2 * ((diff_s > diff_d) ? diff_d : diff_s);
1677+ dstBox->x1 -= diff_d;
1678+ } else if (dstBox->x2 - dstBox->x1 < WIDTH_THRESHOLD) {
1679+ /*
1680+ * When the video window is less than about 160 pixel wide
1681+ * it will be distoreted. We attempt to fix it by actually
1682+ * making it wider and relying on the color key to prevent
1683+ * it from appearanig outside of the video.
1684+ */
1685+ int pre, post;
1686+ int scale = 1;
1687+
1688+ if (dstBox->x1 < WIDTH_THRESHOLD) {
1689+ pre = dstBox->x1;
1690+ post = 160 - pre;
1691+ } else {
1692+ pre = 160;
1693+ post = 0;
1694+ }
1695+ offset -= 2 * scale * pre;
1696+ dstBox->x1 -= pre;
1697+ dstBox->x2 += post;
1698+ }
1699+ if (nPtr->videoHZoom != 1.0) {
1700+ if ((dstBox->x2 += 5) > pScrn->virtualX)
1701+ dstBox->x2 = pScrn->virtualX;
1702+ if (dstBox->x1 > 0) dstBox->x1 += 2;
1703+ }
1704+
1705+ fmt = 0x00;
1706+ switch (id){
1707+ case FOURCC_YV12:
1708+ case FOURCC_I420:
1709+ case FOURCC_YUY2:
1710+ fmt = 0x00;
1711+ break;
1712+ case FOURCC_RV15:
1713+ case FOURCC_RV16:
1714+ fmt = 0x20;
1715+ break;
1716+ }
1717+
1718+ offset += (x1 >> 15) & ~0x03;
1719+
1720+ switch (nPtr->NeoChipset) {
1721+ default:
1722+ case NM2160:
1723+ offset/=2;
1724+ pitch/=2;
1725+ OUTGR(0xbc, 0x4f);
1726+ break;
1727+ case NM2200:
1728+ case NM2230:
1729+ case NM2360:
1730+ case NM2380:
1731+ OUTGR(0xbc, 0x2e);
1732+ break;
1733+ }
1734+
1735+ /* factor 4 for granularity */
1736+ hstretch = (double)0x1000 * 4 / (int)(nPtr->videoHZoom * 4);
1737+ if (drw_w > src_w)
1738+ hstretch = (((int)src_w) * hstretch) / (int) drw_w;
1739+
1740+ vstretch = (double)0x1000 / nPtr->videoVZoom;
1741+ if (drw_h > src_h)
1742+ vstretch = (((int)src_h) * vstretch )/ (int) drw_h;
1743+
1744+ OUTGR(0xb1, (((dstBox->x2 - 1) >> 4) & 0xf0) | ((dstBox->x1 >> 8) & 0x0f));
1745+ OUTGR(0xb2, dstBox->x1);
1746+ OUTGR(0xb3, dstBox->x2 - 1);
1747+ OUTGR(0xb4, (((dstBox->y2 - 1) >> 4) & 0xf0) | ((dstBox->y1 >> 8) & 0x0f));
1748+ OUTGR(0xb5, dstBox->y1);
1749+ OUTGR(0xb6, dstBox->y2 - 1);
1750+ OUTGR(0xb7, offset >> 16);
1751+ OUTGR(0xb8, offset >> 8);
1752+ OUTGR(0xb9, offset );
1753+ OUTGR(0xba, pitch >> 8);
1754+ OUTGR(0xbb, pitch);
1755+
1756+ OUTGR(0xbd, 0x02);
1757+ OUTGR(0xbe, 0x00);
1758+ OUTGR(0xbf, 0x02);
1759+
1760+ OUTGR(0xc0, hstretch >> 8);
1761+ OUTGR(0xc1, hstretch);
1762+ OUTGR(0xc2, vstretch >> 8);
1763+ OUTGR(0xc3, vstretch);
1764+
1765+ OUTGR(0xb0, fmt | 0x03);
1766+
1767+ OUTGR(0x0a, 0x21);
1768+ OUTSR(0x08, 0xa0);
1769+ OUTGR(0x0a, 0x01);
1770+}
1771+
1772+static void
1773+NEOInitOffscreenImages(ScreenPtr pScreen)
1774+{
1775+ XF86OffscreenImagePtr offscreenImages;
1776+
1777+#ifdef DEBUG
1778+ xf86DrvMsg(xf86Screens[pScreen->myNum]->scrnIndex,X_INFO,"NEOInitOffscreenImages\n");
1779+#endif
1780+ if ((offscreenImages = xalloc(sizeof(XF86OffscreenImageRec))) == NULL){
1781+ return;
1782+ }
1783+
1784+ offscreenImages->image = NEOVideoImages;
1785+ offscreenImages->flags = VIDEO_OVERLAID_IMAGES | VIDEO_CLIP_TO_VIEWPORT;
1786+ offscreenImages->alloc_surface = NEOAllocSurface;
1787+ offscreenImages->free_surface = NEOFreeSurface;
1788+ offscreenImages->display = NEODisplaySurface;
1789+ offscreenImages->stop = NEOStopSurface;
1790+ offscreenImages->getAttribute = NEOGetSurfaceAttribute;
1791+ offscreenImages->setAttribute = NEOSetSurfaceAttribute;
1792+ offscreenImages->max_width = 1024;
1793+ offscreenImages->max_height = 1024;
1794+ offscreenImages->num_attributes = nElems(NEOVideoAttributes);
1795+ offscreenImages->attributes = NEOVideoAttributes;
1796+
1797+ xf86XVRegisterOffscreenImages(pScreen, offscreenImages, 1);
1798+}
1799+
1800+static FBLinearPtr
1801+NEOAllocateMemory(ScrnInfoPtr pScrn, FBLinearPtr linear, int size)
1802+{
1803+ ScreenPtr pScreen;
1804+ FBLinearPtr new_linear;
1805+ int bytespp = pScrn->bitsPerPixel >> 3;
1806+
1807+ /* convert size in bytes into number of pixels */
1808+ size = (size + bytespp - 1) / bytespp;
1809+#ifdef DEBUG
1810+ xf86DrvMsg(pScrn->scrnIndex,X_INFO,
1811+ "NEOAllocateMemory: linear=%x, size=%d\n", linear, size);
1812+#endif
1813+ if (linear){
1814+#ifdef DEBUG
1815+ xf86DrvMsg(pScrn->scrnIndex,X_INFO,
1816+ "NEOAllocateMemory: linear->size=%d\n", linear->size);
1817+#endif
1818+ if (linear->size >= size){
1819+ return (linear);
1820+ }
1821+
1822+ if (xf86ResizeOffscreenLinear(linear, size)){
1823+ return (linear);
1824+ }
1825+
1826+ xf86FreeOffscreenLinear(linear);
1827+ }
1828+
1829+
1830+ pScreen = screenInfo.screens[pScrn->scrnIndex];
1831+ if ((new_linear = xf86AllocateOffscreenLinear(pScreen, size, 16, NULL,
1832+ NULL, NULL)) == NULL){
1833+ int max_size;
1834+
1835+ xf86QueryLargestOffscreenLinear(pScreen, &max_size, 16,
1836+ PRIORITY_EXTREME);
1837+#ifdef DEBUG
1838+ xf86DrvMsg(pScrn->scrnIndex,X_INFO,
1839+ "NEOAllocateMemory: max_size=%d\n", max_size);
1840+#endif
1841+ if (max_size < size){
1842+ return (NULL);
1843+ }
1844+
1845+ xf86PurgeUnlockedOffscreenAreas(pScreen);
1846+ new_linear = xf86AllocateOffscreenLinear(pScreen,
1847+ size, 16, NULL, NULL, NULL);
1848+ }
1849+
1850+ return (new_linear);
1851+}
1852+
1853+static void
1854+NEOCopyData(unsigned char *src, unsigned char *dst,
1855+ int srcPitch, int dstPitch,
1856+ int height, int width)
1857+{
1858+ while (height-- > 0){
1859+ memcpy(dst, src, width);
1860+ src += srcPitch;
1861+ dst += dstPitch;
1862+ }
1863+}
1864+
1865+static void
1866+NEOCopyYV12Data(unsigned char *src1, unsigned char *src2,
1867+ unsigned char *src3, unsigned char *dst,
1868+ int srcPitch1, int srcPitch2, int dstPitch,
1869+ int height, int width)
1870+{
1871+ CARD32 *pDst = (CARD32 *) dst;
1872+ int i;
1873+
1874+ width >>= 1;
1875+ height >>= 1;
1876+ dstPitch >>= 2;
1877+ while (--height >= 0){
1878+ for (i =0; i < width; i++){
1879+ pDst[i] = src1[i << 1] | (src1[(i << 1) + 1] << 16) |
1880+ (src3[i] << 8) | (src2[i] << 24);
1881+ }
1882+ pDst += dstPitch;
1883+ src1 += srcPitch1;
1884+
1885+ for (i =0; i < width; i++){
1886+ pDst[i] = src1[i << 1] | (src1[(i << 1) + 1] << 16) |
1887+ (src3[i] << 8) | (src2[i] << 24);
1888+ }
1889+ pDst += dstPitch;
1890+ src1 += srcPitch1;
1891+ src2 += srcPitch2;
1892+ src3 += srcPitch2;
1893+ }
1894+}
1895+
1896+static int
1897+NEOAllocSurface(ScrnInfoPtr pScrn, int id,
1898+ unsigned short width, unsigned short height,
1899+ XF86SurfacePtr surface)
1900+{
1901+ int pitch, bpp, size;
1902+ NEOOffscreenPtr pPriv;
1903+ FBLinearPtr linear;
1904+
1905+#ifdef DEBUG
1906+ xf86DrvMsg(pScrn->scrnIndex,X_INFO,"NEOAllocSurface\n");
1907+#endif
1908+ if (width > 1024 || height > 1024){
1909+ return (BadAlloc);
1910+ }
1911+
1912+ width = (width + 1) & ~1;
1913+ bpp = ((pScrn->bitsPerPixel + 1) >> 3);
1914+ pitch = ((width << 1) + 15) & ~15;
1915+ size = pitch * height;
1916+
1917+ if ((linear = NEOAllocateMemory(pScrn, NULL, size)) == NULL){
1918+ return (BadAlloc);
1919+ }
1920+
1921+ surface->width = width;
1922+ surface->height = height;
1923+ if ((surface->pitches = xalloc(sizeof(int))) == NULL){
1924+ xf86FreeOffscreenLinear(linear);
1925+ return (BadAlloc);
1926+ }
1927+ if ((surface->offsets = xalloc(sizeof(int))) == NULL){
1928+ xfree(surface->pitches);
1929+ xf86FreeOffscreenLinear(linear);
1930+ return (BadAlloc);
1931+ }
1932+
1933+ if ((pPriv = xalloc(sizeof(NEOOffscreenRec))) == NULL){
1934+ xfree(surface->pitches);
1935+ xfree(surface->offsets);
1936+ xf86FreeOffscreenLinear(linear);
1937+ return (BadAlloc);
1938+ }
1939+
1940+ pPriv->linear = linear;
1941+ pPriv->isOn = FALSE;
1942+
1943+ surface->pScrn = pScrn;
1944+ surface->id = id;
1945+ surface->pitches[0] = pitch;
1946+ surface->offsets[0] = linear->offset << 1;
1947+ surface->devPrivate.ptr = (pointer)pPriv;
1948+ return (Success);
1949+}
1950+
1951+static int
1952+NEOFreeSurface(XF86SurfacePtr surface)
1953+{
1954+ NEOOffscreenPtr pPriv = (NEOOffscreenPtr)surface->devPrivate.ptr;
1955+
1956+#ifdef DEBUG
1957+ xf86DrvMsg(0,X_INFO,"NEOFreeSurface\n");
1958+#endif
1959+ if (pPriv->isOn)
1960+ NEOStopSurface(surface);
1961+
1962+ xf86FreeOffscreenLinear(pPriv->linear);
1963+ xfree(surface->pitches);
1964+ xfree(surface->offsets);
1965+ xfree(surface->devPrivate.ptr);
1966+ return (Success);
1967+}
1968+
1969+static int
1970+NEODisplaySurface(XF86SurfacePtr surface,
1971+ short src_x, short src_y, short drw_x, short drw_y,
1972+ short src_w, short src_h, short drw_w, short drw_h,
1973+ RegionPtr clipBoxes)
1974+{
1975+ NEOOffscreenPtr pPriv = (NEOOffscreenPtr)surface->devPrivate.ptr;
1976+ NEOPtr nPtr = NEOPTR(surface->pScrn);
1977+ NEOPortPtr portPriv = nPtr->overlayAdaptor->pPortPrivates[0].ptr;
1978+ INT32 x1, y1, x2, y2;
1979+ BoxRec dstBox;
1980+
1981+#ifdef DEBUG
1982+ xf86DrvMsg(surface->pScrn->scrnIndex,X_INFO,"NEODisplaySurface\n");
1983+#endif
1984+ x1 = src_x;
1985+ x2 = src_x + src_w;
1986+ y1 = src_y;
1987+ y2 = src_y + src_h;
1988+
1989+ dstBox.x1 = drw_x;
1990+ dstBox.x2 = drw_x + drw_w;
1991+ dstBox.y1 = drw_y;
1992+ dstBox.y2 = drw_y + drw_h;
1993+ if (!xf86XVClipVideoHelper( &dstBox, &x1, &x2, &y1, &y2,
1994+ clipBoxes, surface->width, surface->height)){
1995+ return (Success);
1996+ }
1997+
1998+ dstBox.x1 -= surface->pScrn->frameX0;
1999+ dstBox.y1 -= surface->pScrn->frameY0;
2000+ dstBox.x2 -= surface->pScrn->frameX0;
2001+ dstBox.y2 -= surface->pScrn->frameY0;
2002+
2003+ xf86XVFillKeyHelper(surface->pScrn->pScreen, portPriv->colorKey,
2004+ clipBoxes);
2005+ NEOResetVideo(surface->pScrn);
2006+ NEODisplayVideo(surface->pScrn, surface->id, surface->offsets[0],
2007+ surface->width, surface->height, surface->pitches[0],
2008+ x1, y1, x2, y2, &dstBox, src_w, src_h, drw_w, drw_h);
2009+
2010+ pPriv->isOn = TRUE;
2011+ if (portPriv->videoStatus & CLIENT_VIDEO_ON){
2012+ REGION_EMPTY(pScrn->pScreen, &portPriv->clip);
2013+ UpdateCurrentTime();
2014+ portPriv->videoStatus = FREE_TIMER;
2015+ portPriv->freeTime = currentTime.milliseconds + FREE_DELAY;
2016+ }
2017+ return (Success);
2018+}
2019+
2020+static int
2021+NEOStopSurface(XF86SurfacePtr surface)
2022+{
2023+ NEOOffscreenPtr pPriv = (NEOOffscreenPtr)surface->devPrivate.ptr;
2024+
2025+#ifdef DEBUG
2026+ xf86DrvMsg(surface->pScrn->scrnIndex,X_INFO,"NEOStopSurface\n");
2027+#endif
2028+ if (pPriv->isOn){
2029+ NEOPtr nPtr = NEOPTR(surface->pScrn);
2030+ VGA_HWP(surface->pScrn);
2031+ OUTGR(0xb0, 0x02);
2032+ pPriv->isOn = FALSE;
2033+ }
2034+ return (Success);
2035+}
2036+
2037+static int
2038+NEOGetSurfaceAttribute(ScrnInfoPtr pScrn, Atom attr, INT32 *value)
2039+{
2040+ NEOPtr nPtr = NEOPTR(pScrn);
2041+
2042+#ifdef DEBUG
2043+ xf86DrvMsg(pScrn->scrnIndex,X_INFO,"NEOGetSurfaceAttribute\n");
2044+#endif
2045+ return (NEOGetPortAttribute(pScrn,
2046+ attr, value, (pointer)nPtr->overlayAdaptor->pPortPrivates[0].ptr));
2047+}
2048+
2049+static int
2050+NEOSetSurfaceAttribute(ScrnInfoPtr pScrn, Atom attr, INT32 value)
2051+{
2052+ NEOPtr nPtr = NEOPTR(pScrn);
2053+
2054+#ifdef DEBUG
2055+ xf86DrvMsg(pScrn->scrnIndex,X_INFO,"NEOSetSurfaceAttribute\n");
2056+#endif
2057+ return (NEOSetPortAttribute(pScrn,
2058+ attr, value, (pointer)nPtr->overlayAdaptor->pPortPrivates[0].ptr));
2059+}
2060+
2061+#else /* XvExtension */
2062+
2063+void NEOInitVideo(ScreenPtr pScreen) {}
2064+void NEOResetVideo(ScreenPtr pScreen) {}
2065+
2066+#endif
2067--- XFree86-4.2.0/xc.orig/programs/Xserver/hw/xfree86/drivers/neomagic/neo_video.h Thu Jan 1 01:00:00 1970
2068+++ XFree86-4.2.0/xc/programs/Xserver/hw/xfree86/drivers/neomagic/neo_video.h Thu Apr 4 16:05:44 2002
2069@@ -0,0 +1,83 @@
2070+/**********************************************************************
2071+Copyright 2002 by Shigehiro Nomura.
2072+
2073+ All Rights Reserved
2074+
2075+Permission to use, copy, modify, distribute, and sell this software and
2076+its documentation for any purpose is hereby granted without fee,
2077+provided that the above copyright notice appear in all copies and that
2078+both that copyright notice and this permission notice appear in
2079+supporting documentation, and that the name of Shigehiro Nomura not be
2080+used in advertising or publicity pertaining to distribution of the
2081+software without specific, written prior permission. Shigehiro Nomura
2082+and its suppliers make no representations about the suitability of this
2083+software for any purpose. It is provided "as is" without express or
2084+implied warranty.
2085+
2086+SHIGEHIRO NOMURA DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
2087+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
2088+EVENT SHALL SHIGEHIRO NOMURA AND/OR ITS SUPPLIERS BE LIABLE FOR ANY
2089+SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
2090+RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
2091+CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
2092+CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
2093+**********************************************************************/
2094+
2095+#ifndef _NEO_VIDEO_H
2096+#define _NEO_VIDEO_H
2097+
2098+#define ACC_MMIO
2099+
2100+#include "vgaHW.h"
2101+#include "fourcc.h"
2102+#include "Xv.h"
2103+
2104+#define NEO_VIDEO_VIDEO 0
2105+#define NEO_VIDEO_IMAGE 1
2106+
2107+#define FOURCC_RV15 0x35315652
2108+#define FOURCC_RV16 0x36315652
2109+
2110+#define OFF_DELAY 200 /* milliseconds */
2111+#define FREE_DELAY 60000 /* milliseconds */
2112+
2113+#define OFF_TIMER 0x01
2114+#define FREE_TIMER 0x02
2115+#define CLIENT_VIDEO_ON 0x04
2116+#define TIMER_MASK (OFF_TIMER | FREE_TIMER)
2117+
2118+typedef struct
2119+{
2120+ FBLinearPtr linear;
2121+ RegionRec clip;
2122+ CARD32 colorKey;
2123+ CARD32 interlace;
2124+ CARD32 brightness;
2125+ CARD32 videoStatus;
2126+ Time offTime;
2127+ Time freeTime;
2128+} NEOPortRec, *NEOPortPtr;
2129+
2130+typedef struct
2131+{
2132+ FBLinearPtr linear;
2133+ Bool isOn;
2134+} NEOOffscreenRec, *NEOOffscreenPtr;
2135+
2136+/* I/O Functions */
2137+# define OUTGR(idx,dat) \
2138+ if (nPtr->NeoMMIOBase2) \
2139+ (*(unsigned short *)(nPtr->NeoMMIOBase2+VGA_GRAPH_INDEX)\
2140+ =(idx)|((dat)<<8));\
2141+ else \
2142+ VGAwGR((idx),(dat));
2143+
2144+# define OUTSR(idx,dat) \
2145+if (nPtr->NeoMMIOBase2) \
2146+ (*(unsigned short *)(nPtr->NeoMMIOBase2+VGA_SEQ_INDEX)=(idx)|((dat)<<8));\
2147+else \
2148+ VGAwSR((idx),(dat));
2149+
2150+# define VGA_HWP(x) vgaHWPtr hwp = VGAHWPTR(x)
2151+
2152+#endif /* _NEO_VIDEO_H */
This page took 0.303236 seconds and 4 git commands to generate.