|
|
1.1 root 1: /******************************Module*Header*******************************\
2: * Module Name: enable.c
3: *
4: * This module contains the functions that enable and disable the
5: * driver, the pdev, and the surface.
6: *
7: * Copyright (c) 1992 Microsoft Corporation
8: \**************************************************************************/
9:
10: #include "driver.h"
11:
12: #define GDI_MODE 1
13: #define FULL_SCREEN_MODE 2
14:
15: ULONG gLastState = GDI_MODE;
16:
17: #if DBG
18:
19: ULONG gCount = 1;
20:
21: DHPDEV WDrvEnablePDEV(
22: DEVMODEW *pDevmode, // Pointer to DEVMODE
23: PWSTR pwszLogAddress, // Logical address
24: ULONG cPatterns, // number of patterns
25: HSURF *ahsurfPatterns, // return standard patterns
26: ULONG cjGdiInfo, // Length of memory pointed to by pGdiInfo
27: ULONG *pGdiInfo, // Pointer to GdiInfo structure
28: ULONG cjDevInfo, // Length of following PDEVINFO structure
29: DEVINFO *pDevInfo, // physical device information structure
30: PWSTR pwszDataFile, // DataFile - not used
31: PWSTR pwszDeviceName, // DeviceName - not used
32: HANDLE hDriver) // Handle to base driver
33: {
34: DHPDEV bRet;
35:
36: LOGDBG((1, "DrvEnablePDEV\n"));
37:
38: if (InterlockedDecrement(&gCount) != 0)
39: RIP("Somebody else is in here\n");
40:
41: bRet = DrvEnablePDEV(
42: pDevmode,
43: pwszLogAddress,
44: cPatterns,
45: ahsurfPatterns,
46: cjGdiInfo,
47: pGdiInfo,
48: cjDevInfo,
49: pDevInfo,
50: pwszDataFile,
51: pwszDeviceName,
52: hDriver);
53:
54: if (InterlockedIncrement(&gCount) <= 0)
55: RIP("Can't leave\n");
56:
57: LOGDBG((5, "DrvEnablePDEV done\n"));
58:
59: return(bRet);
60: }
61:
62: VOID WDrvCompletePDEV(
63: DHPDEV dhpdev,
64: HDEV hdev)
65: {
66: LOGDBG((1, "DrvCompletePDEV\n"));
67:
68: if (InterlockedDecrement(&gCount) != 0)
69: RIP("Somebody else is in here\n");
70:
71: DrvCompletePDEV(
72: dhpdev,
73: hdev);
74:
75: if (InterlockedIncrement(&gCount) <= 0)
76: RIP("Can't leave\n");
77:
78: LOGDBG((5, "DrvCompletePDEV done\n"));
79: }
80:
81: VOID WDrvDisablePDEV(DHPDEV dhpdev)
82: {
83: LOGDBG((1, "DrvDisable\n"));
84:
85: DrvDisablePDEV(dhpdev);
86:
87: LOGDBG((5, "DrvDisable done\n"));
88: }
89:
90: HSURF WDrvEnableSurface(DHPDEV dhpdev)
91: {
92: HSURF h;
93:
94: LOGDBG((1, "DrvEnableSurface\n"));
95:
96: if (InterlockedDecrement(&gCount) != 0)
97: RIP("Somebody else is in here\n");
98:
99: h = DrvEnableSurface(dhpdev);
100:
101: if (InterlockedIncrement(&gCount) <= 0)
102: RIP("Can't leave\n");
103:
104: LOGDBG((5, "DrvEnableSurface done\n"));
105:
106: return(h);
107: }
108:
109: VOID WDrvDisableSurface(DHPDEV dhpdev)
110: {
111: LOGDBG((1, "DrvDisableSurface\n"));
112:
113: DrvDisableSurface(dhpdev);
114:
115: LOGDBG((5, "DrvDisableSurface done\n"));
116: }
117:
118:
119: VOID WDrvAssertMode(
120: DHPDEV dhpdev,
121: BOOL bEnable)
122: {
123: LOGDBG((1, "DrvAssertMode\n"));
124:
125: if (bEnable)
126: {
127: // When the driver is active we'll always expect gCount to be
128: // one at the beginning of any driver call:
129:
130: if (InterlockedIncrement(&gCount) <= 0)
131: RIP("Somebody else is in here\n");
132: }
133: else
134: {
135: if (InterlockedDecrement(&gCount) != 0)
136: RIP("Somebody else is in here\n");
137: }
138:
139: DrvAssertMode(dhpdev,bEnable);
140:
141: LOGDBG((5, "DrvAssertMode done\n"));
142: }
143:
144:
145: VOID WDrvMovePointer(SURFOBJ *pso,LONG x,LONG y,RECTL *prcl)
146: {
147: LOGDBG((1, "DrvMovePointer\n"));
148:
149: if (InterlockedDecrement(&gCount) != 0)
150: RIP("Somebody else is in here\n");
151:
152: DrvMovePointer(pso,x,y,prcl);
153:
154: if (InterlockedIncrement(&gCount) <= 0)
155: RIP("Can't leave\n");
156:
157: LOGDBG((5, "DrvMovePointer done\n"));
158: }
159:
160: ULONG WDrvSetPointerShape(
161: SURFOBJ *pso,
162: SURFOBJ *psoMask,
163: SURFOBJ *psoColor,
164: XLATEOBJ *pxlo,
165: LONG xHot,
166: LONG yHot,
167: LONG x,
168: LONG y,
169: RECTL *prcl,
170: FLONG fl)
171: {
172: ULONG u;
173:
174: LOGDBG((1, "DrvSetPointerShape\n"));
175:
176: if (InterlockedDecrement(&gCount) != 0)
177: RIP("Somebody else is in here\n");
178:
179: u = DrvSetPointerShape(
180: pso,
181: psoMask,
182: psoColor,
183: pxlo,
184: xHot,
185: yHot,
186: x,
187: y,
188: prcl,
189: fl);
190:
191: if (InterlockedIncrement(&gCount) <= 0)
192: RIP("Can't leave\n");
193:
194: LOGDBG((5, "DrvSetPointerShape done\n"));
195:
196: return(u);
197: }
198:
199: ULONG WDrvDitherColor(
200: DHPDEV dhpdev,
201: ULONG iMode,
202: ULONG rgb,
203: ULONG *pul)
204: {
205: ULONG u;
206:
207: LOGDBG((1, "DrvDitherColor\n"));
208:
209: u = DrvDitherColor(
210: dhpdev,
211: iMode,
212: rgb,
213: pul);
214:
215: LOGDBG((5, "DrvDitherColor done\n"));
216:
217: return(u);
218: }
219:
220:
221: BOOL WDrvSetPalette(
222: DHPDEV dhpdev,
223: PALOBJ *ppalo,
224: FLONG fl,
225: ULONG iStart,
226: ULONG cColors)
227: {
228: BOOL u;
229:
230: LOGDBG((1, "DrvSetPalette\n"));
231:
232: if (InterlockedDecrement(&gCount) != 0)
233: RIP("Somebody else is in here\n");
234:
235: u = DrvSetPalette(
236: dhpdev,
237: ppalo,
238: fl,
239: iStart,
240: cColors);
241:
242:
243: if (InterlockedIncrement(&gCount) <= 0)
244: RIP("Can't leave\n");
245:
246: LOGDBG((5, "DrvSetPalette done\n"));
247:
248: return(u);
249: }
250:
251: BOOL WDrvCopyBits(
252: SURFOBJ *psoDest,
253: SURFOBJ *psoSrc,
254: CLIPOBJ *pco,
255: XLATEOBJ *pxlo,
256: RECTL *prclDest,
257: POINTL *pptlSrc)
258: {
259: BOOL u;
260:
261: LOGDBG((1, "DrvCopyBits\n"));
262:
263: if (InterlockedDecrement(&gCount) != 0)
264: RIP("Somebody else is in here\n");
265:
266: u = DrvCopyBits(
267: psoDest,
268: psoSrc,
269: pco,
270: pxlo,
271: prclDest,
272: pptlSrc);
273:
274: if (InterlockedIncrement(&gCount) <= 0)
275: RIP("Can't leave\n");
276:
277: LOGDBG((5, "DrvCopyBits done\n"));
278:
279: return(u);
280: }
281:
282:
283: BOOL WDrvBitBlt(
284: SURFOBJ *psoTrg,
285: SURFOBJ *psoSrc,
286: SURFOBJ *psoMask,
287: CLIPOBJ *pco,
288: XLATEOBJ *pxlo,
289: RECTL *prclTrg,
290: POINTL *pptlSrc,
291: POINTL *pptlMask,
292: BRUSHOBJ *pbo,
293: POINTL *pptlBrush,
294: ROP4 rop4)
295: {
296: BOOL u;
297:
298: LOGDBG((1, "DrvBitBlt\n"));
299:
300: if (InterlockedDecrement(&gCount) != 0)
301: RIP("Somebody else is in here\n");
302:
303: u = DrvBitBlt(
304: psoTrg,
305: psoSrc,
306: psoMask,
307: pco,
308: pxlo,
309: prclTrg,
310: pptlSrc,
311: pptlMask,
312: pbo,
313: pptlBrush,
314: rop4);
315:
316: if (InterlockedIncrement(&gCount) <= 0)
317: RIP("Can't leave\n");
318:
319: LOGDBG((5, "DrvBitBlt done\n"));
320:
321: return(u);
322: }
323:
324: BOOL WDrvTextOut(
325: SURFOBJ *pso,
326: STROBJ *pstro,
327: FONTOBJ *pfo,
328: CLIPOBJ *pco,
329: RECTL *prclExtra,
330: RECTL *prclOpaque,
331: BRUSHOBJ *pboFore,
332: BRUSHOBJ *pboOpaque,
333: POINTL *pptlOrg,
334: MIX mix)
335: {
336: BOOL u;
337:
338: LOGDBG((1, "DrvTextOut\n"));
339:
340: if (InterlockedDecrement(&gCount) != 0)
341: RIP("Somebody else is in here\n");
342:
343: u = DrvTextOut(
344: pso,
345: pstro,
346: pfo,
347: pco,
348: prclExtra,
349: prclOpaque,
350: pboFore,
351: pboOpaque,
352: pptlOrg,
353: mix);
354:
355: if (InterlockedIncrement(&gCount) <= 0)
356: RIP("Can't leave\n");
357:
358: LOGDBG((5, "DrvTextOut done\n"));
359:
360: return(u);
361: }
362:
363: ULONG WDrvGetModes(
364: HANDLE hDriver,
365: ULONG cjSize,
366: DEVMODEW *pdm)
367: {
368: ULONG u;
369:
370: LOGDBG((1, "DrvGetModes\n"));
371:
372: if (InterlockedDecrement(&gCount) != 0)
373: RIP("Somebody else is in here\n");
374:
375: u = DrvGetModes(
376: hDriver,
377: cjSize,
378: pdm);
379:
380: if (InterlockedIncrement(&gCount) <= 0)
381: RIP("Can't leave\n");
382:
383: LOGDBG((5, "DrvGetModes done\n"));
384:
385: return(u);
386: }
387:
388: BOOL WDrvStrokePath(
389: SURFOBJ *pso,
390: PATHOBJ *ppo,
391: CLIPOBJ *pco,
392: XFORMOBJ *pxo,
393: BRUSHOBJ *pbo,
394: POINTL *pptlBrushOrg,
395: LINEATTRS *plineattrs,
396: MIX mix)
397: {
398: BOOL u;
399:
400: LOGDBG((1, "DrvStrokePath\n"));
401:
402: if (InterlockedDecrement(&gCount) != 0)
403: RIP("Somebody else is in here\n");
404:
405: u = DrvStrokePath(
406: pso,
407: ppo,
408: pco,
409: pxo,
410: pbo,
411: pptlBrushOrg,
412: plineattrs,
413: mix);
414:
415: if (InterlockedIncrement(&gCount) <= 0)
416: RIP("Can't leave\n");
417:
418: LOGDBG((5, "DrvStrokePath done\n"));
419:
420: return(u);
421: }
422:
423:
424: BOOL WDrvFillPath(
425: SURFOBJ *pso,
426: PATHOBJ *ppo,
427: CLIPOBJ *pco,
428: BRUSHOBJ *pbo,
429: POINTL *pptlBrushOrg,
430: MIX mix,
431: FLONG flOptions)
432: {
433: BOOL u;
434:
435: LOGDBG((1, "DrvFillPath\n"));
436:
437: if (InterlockedDecrement(&gCount) != 0)
438: RIP("Somebody else is in here\n");
439:
440: u = DrvFillPath(pso,
441: ppo,
442: pco,
443: pbo,
444: pptlBrushOrg,
445: mix,
446: flOptions);
447:
448: if (InterlockedIncrement(&gCount) <= 0)
449: RIP("Can't leave\n");
450:
451: LOGDBG((5, "DrvFillPath done\n"));
452:
453: return(u);
454: }
455:
456: BOOL WDrvPaint(
457: SURFOBJ *pso,
458: CLIPOBJ *pco,
459: BRUSHOBJ *pbo,
460: POINTL *pptlBrushOrg,
461: MIX mix)
462: {
463: BOOL u;
464:
465: LOGDBG((1, "DrvPaint\n"));
466:
467: if (InterlockedDecrement(&gCount) != 0)
468: RIP("Somebody else is in here\n");
469:
470: u = DrvPaint(
471: pso,
472: pco,
473: pbo,
474: pptlBrushOrg,
475: mix);
476:
477: if (InterlockedIncrement(&gCount) <= 0)
478: RIP("Can't leave\n");
479:
480: LOGDBG((5, "DrvPaint done\n"));
481:
482: return(u);
483: }
484:
485: BOOL WDrvRealizeBrush(
486: BRUSHOBJ *pbo,
487: SURFOBJ *psoTarget,
488: SURFOBJ *psoPattern,
489: SURFOBJ *psoMask,
490: XLATEOBJ *pxlo,
491: ULONG iHatch)
492: {
493: BOOL u;
494:
495: LOGDBG((1, "DrvRealizeBrush\n"));
496:
497: if (gCount != 0)
498: RIP("DrvRealizeBrush Somebody else is in here\n");
499:
500: u = DrvRealizeBrush(
501: pbo,
502: psoTarget,
503: psoPattern,
504: psoMask,
505: pxlo,
506: iHatch);
507:
508: LOGDBG((5, "DrvRealizeBrush done\n"));
509:
510: return(u);
511: }
512:
513: ULONG WDrvSaveScreenBits(SURFOBJ *pso,ULONG iMode,ULONG ident,RECTL *prcl)
514: {
515: ULONG u;
516:
517: LOGDBG((1, "DrvSaveScreenBits\n"));
518:
519: if (InterlockedDecrement(&gCount) != 0)
520: RIP("Somebody else is in here\n");
521:
522: u = DrvSaveScreenBits(pso,iMode,ident,prcl);
523:
524: if (InterlockedIncrement(&gCount) <= 0)
525: RIP("Can't leave\n");
526:
527: LOGDBG((5, "DrvSaveScreenBits done\n"));
528:
529: return(u);
530: }
531:
532: VOID WDrvDestroyFont(FONTOBJ *pfo)
533: {
534: LOGDBG((1, "DrvDestroyFont\n"));
535:
536: // !!! if (InterlockedDecrement(&gCount) != 0)
537: // !!! RIP("Somebody else is in here\n");
538:
539: DrvDestroyFont(pfo);
540:
541: // !!! if (InterlockedIncrement(&gCount) <= 0)
542: // !!! RIP("Can't leave\n");
543:
544: LOGDBG((5, "DrvDestroyFont done\n"));
545: }
546:
547: //
548: // On a checked build, we thunk all driver calls for debugging purposes:
549: //
550:
551: DRVFN gadrvfn[] = {
552: { INDEX_DrvEnablePDEV, (PFN) WDrvEnablePDEV },
553: { INDEX_DrvCompletePDEV, (PFN) WDrvCompletePDEV },
554: { INDEX_DrvDisablePDEV, (PFN) WDrvDisablePDEV },
555: { INDEX_DrvEnableSurface, (PFN) WDrvEnableSurface },
556: { INDEX_DrvDisableSurface, (PFN) WDrvDisableSurface },
557: { INDEX_DrvAssertMode, (PFN) WDrvAssertMode },
558: { INDEX_DrvMovePointer, (PFN) WDrvMovePointer },
559: { INDEX_DrvSetPointerShape, (PFN) WDrvSetPointerShape },
560: { INDEX_DrvDitherColor, (PFN) WDrvDitherColor },
561: { INDEX_DrvSetPalette, (PFN) WDrvSetPalette },
562: { INDEX_DrvCopyBits, (PFN) WDrvCopyBits },
563: { INDEX_DrvBitBlt, (PFN) WDrvBitBlt },
564: { INDEX_DrvTextOut, (PFN) WDrvTextOut },
565: { INDEX_DrvGetModes, (PFN) WDrvGetModes },
566: { INDEX_DrvStrokePath, (PFN) WDrvStrokePath },
567: { INDEX_DrvFillPath, (PFN) WDrvFillPath },
568: { INDEX_DrvPaint, (PFN) WDrvPaint },
569: { INDEX_DrvRealizeBrush, (PFN) WDrvRealizeBrush },
570: { INDEX_DrvSaveScreenBits, (PFN) WDrvSaveScreenBits },
571: { INDEX_DrvDestroyFont, (PFN) WDrvDestroyFont }
572: };
573:
574: #else
575:
576: //
577: // Build the driver function table gadrvfn with function index/address pairs
578: //
579:
580: DRVFN gadrvfn[] = {
581: { INDEX_DrvEnablePDEV, (PFN) DrvEnablePDEV },
582: { INDEX_DrvCompletePDEV, (PFN) DrvCompletePDEV },
583: { INDEX_DrvDisablePDEV, (PFN) DrvDisablePDEV },
584: { INDEX_DrvEnableSurface, (PFN) DrvEnableSurface },
585: { INDEX_DrvDisableSurface, (PFN) DrvDisableSurface },
586: { INDEX_DrvAssertMode, (PFN) DrvAssertMode },
587: { INDEX_DrvMovePointer, (PFN) DrvMovePointer },
588: { INDEX_DrvSetPointerShape, (PFN) DrvSetPointerShape },
589: { INDEX_DrvDitherColor, (PFN) DrvDitherColor },
590: { INDEX_DrvSetPalette, (PFN) DrvSetPalette },
591: { INDEX_DrvCopyBits, (PFN) DrvCopyBits },
592: { INDEX_DrvBitBlt, (PFN) DrvBitBlt },
593: { INDEX_DrvTextOut, (PFN) DrvTextOut },
594: { INDEX_DrvGetModes, (PFN) DrvGetModes },
595: { INDEX_DrvStrokePath, (PFN) DrvStrokePath },
596: { INDEX_DrvFillPath, (PFN) DrvFillPath },
597: { INDEX_DrvPaint, (PFN) DrvPaint },
598: { INDEX_DrvRealizeBrush, (PFN) DrvRealizeBrush },
599: { INDEX_DrvSaveScreenBits, (PFN) DrvSaveScreenBits },
600: { INDEX_DrvDestroyFont, (PFN) DrvDestroyFont }
601: };
602: #endif
603:
604: /******************************Public*Routine******************************\
605: * DrvEnableDriver
606: *
607: * Enables the driver by retrieving the drivers function table and version.
608: *
609: \**************************************************************************/
610:
611: BOOL DrvEnableDriver(
612: ULONG iEngineVersion,
613: ULONG cj,
614: PDRVENABLEDATA pded)
615: {
616: UNREFERENCED_PARAMETER(iEngineVersion);
617:
618: DISPDBG((2, "*** S3.DLL!DrvEnableDriver - Entry ***\n"));
619:
620: // Engine Version is passed down so future drivers can support previous
621: // engine versions. A next generation driver can support both the old
622: // and new engine conventions if told what version of engine it is
623: // working with. For the first version the driver does nothing with it.
624:
625: DISPDBG((2, "S3.DLL!DrvEnableDriver - iEngineVersion: %ld\n", iEngineVersion));
626:
627: // Fill in as much as we can.
628:
629: if (cj >= sizeof(DRVENABLEDATA))
630: pded->pdrvfn = gadrvfn;
631:
632: if (cj >= (sizeof(ULONG) * 2))
633: pded->c = sizeof(gadrvfn) / sizeof(DRVFN);
634:
635: // DDI version this driver was targeted for is passed back to engine.
636: // Future graphic's engine may break calls down to old driver format.
637:
638: if (cj >= sizeof(ULONG))
639: pded->iDriverVersion = DDI_DRIVER_VERSION;
640:
641: return(TRUE);
642: }
643:
644: /******************************Public*Routine******************************\
645: * DrvDisableDriver
646: *
647: * Tells the driver it is being disabled. Release any resources allocated in
648: * DrvEnableDriver.
649: *
650: \**************************************************************************/
651:
652: VOID DrvDisableDriver(VOID)
653: {
654: return;
655: }
656:
657: /******************************Public*Routine******************************\
658: * DrvEnablePDEV
659: *
660: * DDI function, Enables the Physical Device.
661: *
662: * Return Value: device handle to pdev.
663: *
664: \**************************************************************************/
665:
666: DHPDEV DrvEnablePDEV(
667: DEVMODEW *pDevmode, // Pointer to DEVMODE
668: PWSTR pwszLogAddress, // Logical address
669: ULONG cPatterns, // number of patterns
670: HSURF *ahsurfPatterns, // return standard patterns
671: ULONG cjGdiInfo, // Length of memory pointed to by pGdiInfo
672: ULONG *pGdiInfo, // Pointer to GdiInfo structure
673: ULONG cjDevInfo, // Length of following PDEVINFO structure
674: DEVINFO *pDevInfo, // physical device information structure
675: PWSTR pwszDataFile, // DataFile - not used
676: PWSTR pwszDeviceName, // DeviceName - not used
677: HANDLE hDriver) // Handle to base driver
678: {
679: GDIINFO GdiInfo;
680: DEVINFO DevInfo;
681: PPDEV ppdev = (PPDEV) NULL;
682:
683: UNREFERENCED_PARAMETER(pwszLogAddress);
684: UNREFERENCED_PARAMETER(pwszDataFile);
685: UNREFERENCED_PARAMETER(pwszDeviceName);
686:
687: // Allocate a physical device structure.
688:
689: ppdev = (PPDEV) LocalAlloc(LMEM_FIXED | LMEM_ZEROINIT, sizeof(PDEV));
690:
691: if (ppdev == (PPDEV) NULL)
692: {
693: DISPDBG((0, "DISP DrvEnablePDEV failed LocalAlloc\n"));
694: EngSetLastError(ERROR_NOT_ENOUGH_MEMORY);
695: goto error0;
696: }
697:
698: // Set up pointers in PDEV to temporary structures we build up to return.
699:
700: ppdev->pGdiInfo = &GdiInfo;
701: ppdev->pDevInfo = &DevInfo;
702:
703: // Save the screen handle in the PDEV.
704:
705: ppdev->hDriver = hDriver;
706:
707: // Get the current screen mode information. Set up device caps and devinfo.
708:
709: if (!bInitPDEV(ppdev, pDevmode))
710: {
711: DISPDBG((0, "S3 DrvEnablePDEV failed bGetScreenInfo\n"));
712: goto error1;
713: }
714:
715: // Initialize palette information.
716:
717: if (!bInitPaletteInfo(ppdev))
718: {
719: DISPDBG((0, "DISP DrvEnableSurface failed bInitPalette\n"));
720: goto error1;
721: }
722:
723: // Initialize device standard patterns.
724:
725: if (!bInitPatterns(ppdev, min(cPatterns, HS_DDI_MAX)))
726: {
727: DISPDBG((0, "DISP DrvEnablePDEV failed bInitPatterns\n"));
728: goto error2;
729: }
730:
731: // Copy the devinfo into the engine buffer.
732:
733: memcpy(pDevInfo, ppdev->pDevInfo, min(sizeof(DEVINFO), cjDevInfo));
734:
735: // Set the ahsurfPatterns array to handles each of the standard
736: // patterns that were just created.
737:
738: memcpy((PVOID) ahsurfPatterns, ppdev->ahbmPat, ppdev->cPatterns*sizeof(HBITMAP));
739:
740: // Set the pdevCaps with GdiInfo we have prepared to the list of caps for this
741: // pdev.
742:
743: memcpy(pGdiInfo, ppdev->pGdiInfo, min(cjGdiInfo, sizeof(GDIINFO)));
744:
745: // Set NULL into pointers for stack allocated memory.
746:
747: ppdev->pGdiInfo = (GDIINFO *) NULL;
748: ppdev->pDevInfo = (DEVINFO *) NULL;
749:
750: return((DHPDEV) ppdev);
751:
752: // Error case for failure.
753:
754: error2:
755: vDisablePatterns(ppdev);
756: vDisablePalette(ppdev);
757:
758: error1:
759: LocalFree(ppdev);
760:
761: error0:
762:
763: return((DHPDEV) 0);
764: }
765:
766: /******************************Public*Routine******************************\
767: * DrvCompletePDEV
768: *
769: * Store the HPDEV, the engines handle for this PDEV, in the DHPDEV.
770: *
771: \**************************************************************************/
772:
773: VOID DrvCompletePDEV(
774: DHPDEV dhpdev,
775: HDEV hdev)
776: {
777: ((PPDEV) dhpdev)->hdevEng = hdev;
778: }
779:
780: /******************************Public*Routine******************************\
781: * DrvDisablePDEV
782: *
783: * Release the resources allocated in DrvEnablePDEV. If a surface has been
784: * enabled DrvDisableSurface will have already been called.
785: *
786: \**************************************************************************/
787:
788: VOID DrvDisablePDEV(
789: DHPDEV dhpdev)
790: {
791: vDisablePalette((PPDEV) dhpdev);
792: vDisablePatterns((PPDEV) dhpdev);
793: LocalFree(dhpdev);
794: }
795:
796: /******************************Public*Routine******************************\
797: * DrvEnableSurface
798: *
799: * Enable the surface for the device. Hook the calls this driver supports.
800: *
801: * Return: Handle to the surface if successful, 0 for failure.
802: *
803: \**************************************************************************/
804:
805: HSURF DrvEnableSurface(
806: DHPDEV dhpdev)
807: {
808: PPDEV ppdev;
809: HSURF hsurf,
810: hsurfBm;
811: SIZEL sizl;
812: ULONG ulBitmapType;
813: FLONG flHooks;
814: BOOL bRet;
815:
816: // Create engine bitmap around frame buffer.
817:
818: ppdev = (PPDEV) dhpdev;
819:
820: if (!bInitSURF(ppdev, TRUE))
821: {
822: DISPDBG((0, "DISP DrvEnableSurface failed bInitSURF\n"));
823: return(FALSE);
824: }
825:
826: if (ppdev->ulBitCount == 8) {
827: if (!bInit256ColorPalette(ppdev)) {
828: DISPDBG((0, "DISP DrvEnableSurface failed to init the 8bpp palette\n"));
829: return(FALSE);
830: }
831: }
832:
833: sizl.cx = ppdev->cxScreen;
834: sizl.cy = ppdev->cyScreen;
835:
836: // Init the bank manager for the punt system.
837:
838: bRet = bBankInit(ppdev, TRUE);
839: if (bRet == FALSE)
840: {
841: return (NULL);
842: }
843:
844: // Set all the hooks and create our bitmaps
845:
846: if (ppdev->ulBitCount == 8)
847: {
848: ulBitmapType = BMF_8BPP;
849: flHooks = HOOKS_BMF8BPP;
850: }
851: else if (ppdev->ulBitCount == 16)
852: {
853: ulBitmapType = BMF_16BPP;
854: flHooks = HOOKS_BMF16BPP;
855: }
856: else
857: {
858: DISPDBG((0,"S3.DLL: ppdev->ulBitCount is invalid\n"));
859: }
860:
861: hsurfBm = (HSURF) EngCreateBitmap(sizl,
862: (ULONG) (ppdev->lDeltaScreen),
863: (ULONG) (ulBitmapType),
864: (FLONG) (((ppdev->lDeltaScreen > 0) ? BMF_TOPDOWN : 0)),
865: (PVOID) (ppdev->pjScreen));
866:
867: if ((hsurfBm == 0) || (!EngAssociateSurface(hsurfBm, ppdev->hdevEng, 0)))
868: {
869: DISPDBG((0, "S3.DLL!DrvEnableSurface - failed EngAssociateSurface bitmap\n"));
870: EngDeleteSurface(hsurfBm);
871: return(NULL);
872: }
873:
874: ppdev->hsurfBm = hsurfBm;
875:
876: // Note: the engine lock cannot fail, so no error code is checked.
877:
878: ppdev->pSurfObj = EngLockSurface(hsurfBm);
879:
880: // BUGBUG Check return code.
881:
882: sizl.cy = S3BM_HEIGHT;
883:
884: hsurf = EngCreateSurface((DHSURF) ppdev, sizl);
885: if (hsurf == NULL)
886: {
887: DISPDBG((0, "S3.DLL!DrvEnableSurface - failed EngCreateSurface bitmap\n"));
888: EngDeleteSurface(hsurfBm);
889: return (NULL);
890: }
891:
892: if (!EngAssociateSurface(hsurf, ppdev->hdevEng, flHooks))
893: {
894: DISPDBG((0, "S3.DLL!DrvEnableSurface - failed EngAssociateSurface\n"));
895: EngDeleteSurface(hsurfBm);
896: EngDeleteSurface(hsurf);
897: return(NULL);
898: }
899:
900: ppdev->hsurfEng = hsurf;
901:
902: // Create a temporary bitmap for the screen to screen punt blits.
903: // First, create a surface.
904:
905: sizl.cx = ppdev->cxMaxRam;
906:
907: #if defined(_X86_) || defined(i386)
908:
909: ppdev->psoTemp = NULL;
910:
911: #else
912:
913: sizl.cy = ppdev->cyScreen;
914:
915: hsurfBm = (HSURF) EngCreateBitmap(sizl,
916: (ULONG) (ppdev->lDeltaScreen),
917: BMF_8BPP,
918: BMF_TOPDOWN,
919: NULL);
920: if (hsurfBm == NULL)
921: {
922: DISPDBG((0, "S3.DLL!DrvEnableSurface - failed EngCreateBitmap\n"));
923: EngDeleteSurface(hsurfBm);
924: EngDeleteSurface(hsurf);
925: return(NULL);
926: }
927:
928: // Get a pointer to the surface object.
929:
930: ppdev->psoTemp = EngLockSurface(hsurfBm);
931:
932: #endif
933:
934: // These values are here for the strip drawer, they should be removed.
935:
936: ppdev->iFormat = BMF_PHYSDEVICE;
937: ppdev->lNextScan = S3BM_WIDTH;
938:
939: // Set the shadow clip values.
940:
941: ppdev->ClipRight = 0;
942: ppdev->ClipLeft = 0;
943: ppdev->ClipTop = 0;
944: ppdev->ClipBottom = 0;
945:
946: vResetS3Clipping(ppdev);
947:
948: return(hsurf);
949: }
950:
951: /******************************Public*Routine******************************\
952: * DrvDisableSurface
953: *
954: * Free resources allocated by DrvEnableSurface. Release the surface.
955: *
956: \**************************************************************************/
957:
958: VOID DrvDisableSurface(
959: DHPDEV dhpdev)
960: {
961: //!!! check and return error. unlock and delete hsurfBM see XGA
962: EngDeleteSurface(((PPDEV) dhpdev)->hsurfEng);
963: vDisableSURF((PPDEV) dhpdev);
964: ((PPDEV) dhpdev)->hsurfEng = (HSURF) 0;
965: }
966:
967: /******************************Public*Routine******************************\
968: * DrvAssertMode
969: *
970: * This asks the device to reset itself to the mode of the pdev passed in.
971: *
972: \**************************************************************************/
973:
974: VOID DrvAssertMode(
975: DHPDEV dhpdev,
976: BOOL bEnable)
977: {
978: PPDEV ppdev = (PPDEV) dhpdev;
979: ULONG ulReturn;
980:
981: #if CATCHIT
982:
983: if (gLastState == GDI_MODE)
984: {
985: if (bEnable == TRUE)
986: {
987: RIP("S3.DLL!DrvAssertMode - Told to go into GDI mode while in GDI mode\n");
988: return;
989: }
990: }
991: else if (gLastState == FULL_SCREEN_MODE)
992: {
993: if (bEnable == FALSE)
994: {
995: RIP("S3.DLL!DrvAssertMode - Told to go into Full Screen mode while in Full Screen mode\n");
996: return;
997: }
998: }
999: else
1000: {
1001: RIP("S3.DLL!DrvAssertMode - Undefine mode\n");
1002: return;
1003: }
1004:
1005: #endif
1006:
1007: if (bEnable)
1008: {
1009: gLastState = GDI_MODE;
1010:
1011: // The screen must be reenabled, reinitialize the device to
1012: // a clean state.
1013:
1014: bInitSURF(ppdev, FALSE);
1015: bBankInit(ppdev, FALSE);
1016:
1017: // Restore the off screen data. This protects the Desktop
1018: // from an DOS application that might trash the off screen
1019: // memory.
1020:
1021: ppdev->ClipRight = -1;
1022: ppdev->ClipLeft = -1;
1023: ppdev->ClipTop = -1;
1024: ppdev->ClipBottom = -1;
1025: vResetS3Clipping(ppdev);
1026:
1027: vRestoreOffScreenMemory(ppdev);
1028: }
1029: else
1030: {
1031: gLastState = FULL_SCREEN_MODE;
1032:
1033: // We must give up the display.
1034:
1035: ppdev->ClipRight = -1;
1036: ppdev->ClipLeft = -1;
1037: ppdev->ClipTop = -1;
1038: ppdev->ClipBottom = -1;
1039: vResetS3Clipping(ppdev);
1040: vSaveOffScreenMemory(ppdev);
1041:
1042: // Call the kernel driver to reset the device to a known state.
1043:
1044: if (!DeviceIoControl(ppdev->hDriver,
1045: IOCTL_VIDEO_RESET_DEVICE,
1046: NULL,
1047: 0,
1048: NULL,
1049: 0,
1050: &ulReturn,
1051: NULL))
1052: {
1053: DISPDBG((0, "S3.DLL!DrvAssertMode - DrvAssertMode failed IOCTL"));
1054: }
1055:
1056: }
1057:
1058: return;
1059: }
1060:
1061:
1062: /******************************Public*Routine******************************\
1063: * DrvGetModes
1064: *
1065: * Returns the list of available modes for the device.
1066: *
1067: \**************************************************************************/
1068:
1069: ULONG DrvGetModes(
1070: HANDLE hDriver,
1071: ULONG cjSize,
1072: DEVMODEW *pdm)
1073:
1074: {
1075:
1076: DWORD cModes;
1077: DWORD cbOutputSize;
1078: PVIDEO_MODE_INFORMATION pVideoModeInformation, pVideoTemp;
1079: DWORD cOutputModes = cjSize / (sizeof(DEVMODEW) + DRIVER_EXTRA_SIZE);
1080: DWORD cbModeSize;
1081:
1082: DISPDBG((3, "S3.dll:DrvGetModes\n"));
1083:
1084: cModes = getAvailableModes(hDriver,
1085: (PVIDEO_MODE_INFORMATION *) &pVideoModeInformation,
1086: &cbModeSize);
1087:
1088:
1089: if (cModes == 0)
1090: {
1091: DISPDBG((0, "S3 DISP DrvGetModes failed to get mode information"));
1092: return 0;
1093: }
1094:
1095: if (pdm == NULL)
1096: {
1097: cbOutputSize = cModes * (sizeof(DEVMODEW) + DRIVER_EXTRA_SIZE);
1098: }
1099: else
1100: {
1101: //
1102: // Now copy the information for the supported modes back into the output
1103: // buffer
1104: //
1105:
1106: cbOutputSize = 0;
1107:
1108: pVideoTemp = pVideoModeInformation;
1109:
1110: do
1111: {
1112: if (pVideoTemp->Length != 0)
1113: {
1114: if (cOutputModes == 0)
1115: {
1116: break;
1117: }
1118:
1119: //
1120: // Zero the entire structure to start off with.
1121: //
1122:
1123: memset(pdm, 0, sizeof(DEVMODEW));
1124:
1125: //
1126: // Set the name of the device to the name of the DLL.
1127: //
1128:
1129: memcpy(&(pdm->dmDeviceName), L"s3", sizeof(L"s3"));
1130:
1131: pdm->dmSpecVersion = DM_SPECVERSION;
1132: pdm->dmDriverVersion = DM_SPECVERSION;
1133:
1134: //
1135: // We currently do not support Extra information in the driver
1136: //
1137:
1138: pdm->dmDriverExtra = DRIVER_EXTRA_SIZE;
1139:
1140: pdm->dmSize = sizeof(DEVMODEW);
1141: pdm->dmBitsPerPel = pVideoTemp->NumberOfPlanes *
1142: pVideoTemp->BitsPerPlane;
1143: pdm->dmPelsWidth = pVideoTemp->VisScreenWidth;
1144: pdm->dmPelsHeight = pVideoTemp->VisScreenHeight;
1145: pdm->dmDisplayFrequency = pVideoTemp->Frequency;
1146:
1147: if (pVideoTemp->AttributeFlags & VIDEO_MODE_INTERLACED)
1148: {
1149: pdm->dmDisplayFlags |= DM_INTERLACED;
1150: }
1151:
1152: //
1153: // Go to the next DEVMODE entry in the buffer.
1154: //
1155:
1156: cOutputModes--;
1157:
1158: pdm = (LPDEVMODEW) ( ((ULONG)pdm) + sizeof(DEVMODEW) +
1159: DRIVER_EXTRA_SIZE);
1160:
1161: cbOutputSize += (sizeof(DEVMODEW) + DRIVER_EXTRA_SIZE);
1162:
1163: }
1164:
1165: pVideoTemp = (PVIDEO_MODE_INFORMATION)
1166: (((PUCHAR)pVideoTemp) + cbModeSize);
1167:
1168:
1169: } while (--cModes);
1170: }
1171:
1172: LocalFree(pVideoModeInformation);
1173:
1174: return cbOutputSize;
1175: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.