Annotation of ntddk/src/video/displays/vga/enable.c, revision 1.1.1.1

1.1       root        1: /******************************Module*Header*******************************\
                      2: * Module Name: enable.c
                      3: *
                      4: * Functions to enable and disable the driver
                      5: *
                      6: * Copyright (c) 1992 Microsoft Corporation
                      7: \**************************************************************************/
                      8: 
                      9: 
                     10: #include "driver.h"
                     11: 
                     12: 
                     13: FLONG   gflDrv = 0;
                     14: #ifdef  FIREWALLS
                     15: LONG    cPDEV = 0;                  // PDEV counter for checking Engine
                     16: #endif
                     17: 
                     18: extern GDIINFO gaulCap;             // in gdiinfo.c
                     19: extern LOGPALETTE logPalVGA;        // in gdiinfo.c
                     20: extern BYTE gaajPat[19][32];        // in gdiinfo.c
                     21: extern DEVINFO devinfoVGA;          // in gdiinfo.c
                     22: extern LPBYTE pPtrSave;
                     23: 
                     24: BOOL SetUpBanking(PDEVSURF, PPDEV);
                     25: BOOL bInitPointer(PPDEV);
                     26: 
                     27: extern ajConvertBuffer[1];            // Arbitrary sized array!
                     28: 
                     29: static  DRVFN   gadrvfn[] = {
                     30:     {   INDEX_DrvEnablePDEV,            (PFN) DrvEnablePDEV             },
                     31:     {   INDEX_DrvCompletePDEV,          (PFN) DrvCompletePDEV           },
                     32:     {   INDEX_DrvDisablePDEV,           (PFN) DrvDisablePDEV            },
                     33:     {   INDEX_DrvEnableSurface,         (PFN) DrvEnableSurface          },
                     34:     {   INDEX_DrvDisableSurface,        (PFN) DrvDisableSurface         },
                     35:     {   INDEX_DrvRealizeBrush,          (PFN) DrvRealizeBrush           },
                     36:     {   INDEX_DrvBitBlt,                (PFN) DrvBitBlt                 },
                     37:     {   INDEX_DrvTextOut,               (PFN) DrvTextOut                },
                     38:     {   INDEX_DrvSetPointerShape,       (PFN) DrvSetPointerShape        },
                     39:     {   INDEX_DrvMovePointer,           (PFN) DrvMovePointer            },
                     40:     {   INDEX_DrvStrokePath,            (PFN) DrvStrokePath             },
                     41:     {   INDEX_DrvCopyBits,              (PFN) DrvCopyBits               },
                     42:     {   INDEX_DrvDitherColor,           (PFN) DrvDitherColor            },
                     43:     {   INDEX_DrvAssertMode,            (PFN) DrvAssertMode             },
                     44:     {   INDEX_DrvSaveScreenBits,        (PFN) DrvSaveScreenBits         },
                     45:     {   INDEX_DrvGetModes,              (PFN) DrvGetModes               },
                     46:     {   INDEX_DrvFillPath,              (PFN) DrvFillPath               },
                     47:     {   INDEX_DrvPaint,                 (PFN) DrvPaint                  }
                     48: };
                     49: 
                     50: /******************************Public*Routine******************************\
                     51: * BOOL bEnableDriver(iEngineVersion, cb, pded)
                     52: *
                     53: * Enables the driver by filling the function table.  This call is made by
                     54: * the Engine to fill its driver function table in the LDEV (Logical DEVice).
                     55: * This call should only be made once per driver but we can handle being
                     56: * called multiple times.
                     57: *
                     58: \**************************************************************************/
                     59: 
                     60: BOOL DrvEnableDriver
                     61: (
                     62:     ULONG           iEngineVersion,
                     63:     ULONG           cb,
                     64:     PDRVENABLEDATA  pded
                     65: )
                     66: {
                     67:     DISPDBG((2, "VGA: enabling Driver\n"));
                     68: 
                     69:     cb /= sizeof(ULONG);
                     70: 
                     71:     switch(cb)
                     72:     {
                     73:     case 3:
                     74:         pded->pdrvfn = gadrvfn;
                     75:     case 2:
                     76:         pded->c = sizeof(gadrvfn) / sizeof(DRVFN);
                     77:     case 1:
                     78:         pded->iDriverVersion = DDI_DRIVER_VERSION;
                     79:     }
                     80: 
                     81:     return(TRUE);
                     82: }
                     83: 
                     84: /******************************Public*Routine******************************\
                     85: * VOID vDisableDriver
                     86: *
                     87: * Unload the driver and any data in may have created.
                     88: *
                     89: \**************************************************************************/
                     90: 
                     91: VOID DrvDisableDriver()
                     92: {
                     93:     DISPDBG((2, "VGA: disabling Driver\n"));
                     94: }
                     95: 
                     96: /******************************Public*Routine******************************\
                     97: * BOOL bLoadResources()
                     98: *
                     99: * Load the resources used by the PDEV
                    100: *
                    101: \**************************************************************************/
                    102: 
                    103: BOOL bLoadResources(PPDEV ppdev)
                    104: {
                    105: // Load the font resources
                    106: 
                    107:     return(TRUE);
                    108: 
                    109:     UNREFERENCED_PARAMETER(ppdev);
                    110: }
                    111: 
                    112: /******************************Public*Routine******************************\
                    113: * bInitDefaultPatterns
                    114: *
                    115: * Creates the default monochrome patterns to be used on it's surface.
                    116: *
                    117: \**************************************************************************/
                    118: 
                    119: BOOL bInitDefaultPatterns(PPDEV ppdev)
                    120: {
                    121:     SIZEL           sizl;
                    122:     INT             iLoop;
                    123:     PULONG          pulInit;
                    124: 
                    125:     sizl.cx = 8;
                    126:     sizl.cy = 8;
                    127: 
                    128:     DISPDBG((2, "VGA: initializing defailt patterns\n"));
                    129: 
                    130:     for (iLoop = 0; iLoop < HS_DDI_MAX; iLoop++)
                    131:     {
                    132:         pulInit = (PULONG) (&gaajPat[iLoop][0]);
                    133:         ppdev->ahbmPat[iLoop] = EngCreateBitmap(sizl, sizl.cx / 8, BMF_1BPP,
                    134:                                                 BMF_TOPDOWN, pulInit);
                    135: 
                    136:         if (ppdev->ahbmPat[iLoop] == (HBITMAP)0)
                    137:         {
                    138:         // Release any bitmaps we have created.
                    139: 
                    140:             while(iLoop--)
                    141:                 EngDeleteSurface((HSURF) ppdev->ahbmPat[iLoop]);
                    142: 
                    143:             return(FALSE);
                    144:         }
                    145:     }
                    146: 
                    147:     return(TRUE);
                    148: }
                    149: 
                    150: /******************************Public*Routine******************************\
                    151: * DHPDEV DrvEnablePDEV
                    152: *
                    153: * Enable the Physical DEVice
                    154: *
                    155: * Warnings:
                    156: *   The PDEV isn't complete until bCompletePDEV is called.
                    157: *
                    158: \**************************************************************************/
                    159: 
                    160: DHPDEV DrvEnablePDEV
                    161: (
                    162:     DEVMODEW *pdrivw,
                    163:     PWSTR     pwszLogAddress,
                    164:     ULONG     cPatterns,
                    165:     PHSURF    ahsurfPatterns,
                    166:     ULONG     cjGdiInfo,
                    167:     ULONG    *pdevcaps,
                    168:     ULONG     cb,
                    169:     PDEVINFO  pdevinfo,
                    170:     PWSTR     pwszDataFile,
                    171:     PWSTR     pwszDeviceName,
                    172:     HANDLE    hDriver          // Handle to base driver
                    173: )
                    174: {
                    175:     FLONG   fl = 0;
                    176:     DHPDEV  dhpdev = (DHPDEV) 0;
                    177:     PPDEV   ppdev;
                    178:     SYSTEM_INFO SystemInfo;
                    179: 
                    180:     DISPDBG((2, "VGA: enabling PDEV\n"));
                    181: 
                    182: // Define flag to keep track of allocation
                    183: 
                    184: #define PDEV_ALLOCED    0x01
                    185: 
                    186: #ifdef DRV_ONE_PDEV
                    187:     if (gflDrv & DRV_ENABLED_PDEV)
                    188:     {
                    189:         // SAVE_ERROR_CODE(DDI_PDEV_ALREADY_ENABLED);
                    190:         goto error;
                    191:     }
                    192: #endif
                    193: 
                    194:     dhpdev = (DHPDEV) LocalAlloc(LMEM_FIXED | LMEM_ZEROINIT, sizeof(PDEV));
                    195:     if (dhpdev == (DHPDEV) 0)
                    196:         goto error;
                    197: 
                    198:     fl |= PDEV_ALLOCED;
                    199: 
                    200:     ppdev = (PPDEV) dhpdev;
                    201: 
                    202:     // Identifier, for debugging purposes
                    203:     ppdev->ident = PDEV_IDENT;
                    204: 
                    205:     // Determine whether this is a 386 or a better processor
                    206:     GetSystemInfo(&SystemInfo);
                    207:     if (SystemInfo.dwProcessorType == PROCESSOR_INTEL_386) {
                    208:         ppdev->ulIs386 = 1;
                    209:     } else {
                    210:         ppdev->ulIs386 = 0;
                    211:     }
                    212: 
                    213:     // Cache the device driver handle away for later use.
                    214: 
                    215:     ppdev->hDriver = hDriver;
                    216: 
                    217:     // Initialize the cursor stuff.  We can violate the atomic rule here
                    218:     // since nobody can talk to the driver yet.
                    219: 
                    220:     ppdev->xyCursor.x = 320;            // Non-atomic
                    221:     ppdev->xyCursor.y = 240;            // Non-atomic
                    222: 
                    223:     ppdev->ptlExtent.x = 0;
                    224:     ppdev->ptlExtent.y = 0;
                    225:     ppdev->cExtent = 0;
                    226: 
                    227:     ppdev->flCursor = CURSOR_DOWN;
                    228: 
                    229:     //
                    230:     // Get the current screen mode information.  Set up device caps and devinfo.
                    231:     //
                    232: 
                    233:     if (!bInitPDEV(ppdev, pdrivw, &gaulCap, &devinfoVGA))
                    234:     {
                    235:         DISPDBG((1, "DISP VGA DrvEnablePDEV failed bInitPDEV\n"));
                    236:         goto error;
                    237:     }
                    238: 
                    239:     if (!bLoadResources(ppdev))
                    240:         goto error;
                    241: 
                    242:     if (!bInitDefaultPatterns(ppdev))
                    243:         goto error;
                    244: 
                    245: #ifdef DRV_ONE_PDEV
                    246:     gflDrv |= DRV_ENABLED_PDEV;             // So we're not called twice
                    247: #endif
                    248: 
                    249:     cPatterns=min(cPatterns, HS_DDI_MAX);
                    250: 
                    251:     memcpy((PVOID)ahsurfPatterns, ppdev->ahbmPat, cPatterns*sizeof(HBITMAP));
                    252: 
                    253:     cjGdiInfo=min(cjGdiInfo, sizeof(GDIINFO));
                    254: 
                    255:     memcpy(pdevcaps, &gaulCap, cjGdiInfo);
                    256: 
                    257:      // Now let's pass back the devinfo
                    258: 
                    259:     devinfoVGA.hpalDefault = EngCreatePalette(PAL_INDEXED, 16,
                    260:                                               (PULONG) (logPalVGA.palPalEntry),
                    261:                                               0, 0, 0);
                    262: 
                    263:     // *pdevinfo  = devinfoVGA;
                    264:     memcpy((PVOID) pdevinfo, (PVOID) &devinfoVGA, (ULONG) sizeof(DEVINFO));
                    265: 
                    266:     // Try to preallocate a saved screen bits buffer. If we fail, set the flag
                    267:     // to indicate the buffer is in use, so that we'll never attempt to use it.
                    268:     // If we succeed, mark the buffer as free.
                    269: 
                    270:     if ((ppdev->pjPreallocSSBBuffer = (PUCHAR)
                    271:               LocalAlloc(LMEM_FIXED | LMEM_ZEROINIT, PREALLOC_SSB_SIZE))
                    272:               != NULL) {
                    273:         ppdev->flPreallocSSBBufferInUse = FALSE;
                    274:         ppdev->ulPreallocSSBSize = PREALLOC_SSB_SIZE;
                    275:     } else {
                    276:         ppdev->flPreallocSSBBufferInUse = TRUE;
                    277:     }
                    278: 
                    279:     // Fill in the DIB4->VGA conversion tables. Allow 256 extra bytes so that
                    280:     // we can always safely align the tables to a 256-byte boundary, for
                    281:     // look-up reasons. There are four tables, each 256 bytes long
                    282: 
                    283:     ppdev->pucDIB4ToVGAConvBuffer =
                    284:             (UCHAR *) LocalAlloc((LMEM_FIXED | LMEM_ZEROINIT),
                    285:             ((256*4+256)*sizeof(UCHAR)));
                    286: 
                    287:     if (ppdev->pucDIB4ToVGAConvBuffer == NULL) {
                    288:         goto error;
                    289:     }
                    290: 
                    291:     // Round the table start up to the nearest 256 byte boundary, because the
                    292:     // tables must start on 256-byte boundaries for look-up reasons
                    293: 
                    294:     ppdev->pucDIB4ToVGAConvTables =
                    295:             (UCHAR *) ((ULONG) (ppdev->pucDIB4ToVGAConvBuffer + 0xFF) & ~0xFF);
                    296: 
                    297:     vSetDIB4ToVGATables(ppdev->pucDIB4ToVGAConvTables);
                    298: 
                    299:     return(dhpdev);
                    300: 
                    301: error:
                    302:     if (fl & PDEV_ALLOCED)
                    303:         LocalFree(dhpdev);
                    304: 
                    305:     return((DHPDEV) 0);
                    306: 
                    307:     UNREFERENCED_PARAMETER(cb);
                    308:     UNREFERENCED_PARAMETER(pwszLogAddress);
                    309:     UNREFERENCED_PARAMETER(pwszDataFile);
                    310:     UNREFERENCED_PARAMETER(pwszDeviceName);
                    311: }
                    312: 
                    313: /******************************Public*Routine******************************\
                    314: * BOOL bCompletePDEV(dhpdev, hpdev)
                    315: *
                    316: * Complete the initialization of the PDEV
                    317: *
                    318: \**************************************************************************/
                    319: 
                    320: VOID DrvCompletePDEV(
                    321:     DHPDEV dhpdev,
                    322:     HDEV  hdev)
                    323: {
                    324:     PPDEV   ppdev;
                    325: 
                    326:     ppdev = (PPDEV) dhpdev;
                    327: 
                    328:     ppdev->hdevEng = hdev;
                    329: }
                    330: 
                    331: /******************************Public*Routine******************************\
                    332: * VOID vFreeResources(ppdev)
                    333: *
                    334: * Free the resources used by the PDEV
                    335: *
                    336: * Effects:
                    337: *
                    338: * Warnings:
                    339: *
                    340: \**************************************************************************/
                    341: 
                    342: VOID vFreeResources(PPDEV ppdev)
                    343: {
                    344: 
                    345:     UNREFERENCED_PARAMETER(ppdev);
                    346: }
                    347: 
                    348: /******************************Public*Routine******************************\
                    349: * VOID vKillPatterns(ppdev)
                    350: *
                    351: * Clear the standard patterns
                    352: *
                    353: \**************************************************************************/
                    354: 
                    355: VOID vKillPatterns(PPDEV ppdev)
                    356: {
                    357:     INT     ii;
                    358: 
                    359:     for (ii = 0; ii < HS_DDI_MAX; ii++)
                    360:         EngDeleteSurface((HSURF) ppdev->ahbmPat[ii]);
                    361: }
                    362: 
                    363: /******************************Public*Routine******************************\
                    364: * VOID DrvDisablePDEV(dhpdev)
                    365: *
                    366: * Shutdown this physical device.
                    367: *
                    368: * Warnings:
                    369: *   If a surface is still active for this PDEV it will be freed.
                    370: *
                    371: 
                    372: \**************************************************************************/
                    373: 
                    374: VOID DrvDisablePDEV(DHPDEV dhpdev)
                    375: {
                    376:     PPDEV   ppdev;
                    377: 
                    378:     ppdev = (PPDEV) dhpdev;
                    379: 
                    380:     DISPDBG((2, "VGA:disabling PDEV\n"));
                    381: 
                    382: //    ASSERT(ppdev != (PPDEV) NULL, "PDEV error");
                    383: 
                    384: // Is there a deliquent surface still in the PDEV?
                    385: 
                    386:     if (ppdev->hsurfEng != (HSURF) 0)
                    387:         DrvDisableSurface(dhpdev);
                    388: 
                    389: // Check if the Engine has called us to many times.
                    390: 
                    391: //    ASSERT(--cPDEV >= 0, "PDEV - too many disables");
                    392: 
                    393: // Free the resources and bitmaps associated with this PDEV
                    394: 
                    395:     vFreeResources(ppdev);
                    396:     vKillPatterns(ppdev);
                    397: 
                    398: // Free the preallocated saved screen bits buffer, if there is one.
                    399: 
                    400:     if (ppdev->pjPreallocSSBBuffer != NULL) {
                    401:         LocalFree(ppdev->pjPreallocSSBBuffer);
                    402:     }
                    403: 
                    404: // Free the conversion table buffer
                    405: 
                    406:     if (ppdev->pucDIB4ToVGAConvBuffer != NULL) {
                    407:         LocalFree(ppdev->pucDIB4ToVGAConvBuffer);
                    408:     }
                    409: 
                    410: // Delete the PDEV
                    411: 
                    412:     LocalFree(dhpdev);
                    413: 
                    414:     DISPDBG((2, "VGA: disabled PDEV\n"));
                    415: 
                    416: #ifdef  DRV_ONE_PDEV
                    417:     gflDrv &= ~DRV_ENABLED_PDEV;
                    418: #endif
                    419: }
                    420: 
                    421: /******************************Public*Routine******************************\
                    422: * HSURF DrvEnableSurface(dhpdev)
                    423: *
                    424: * Enable the surface for the device.  This will actually intialize the
                    425: * screen on the VGA.
                    426: *
                    427: * Warnings:
                    428: *   This routine should only be called ONCE per PDEV.
                    429: *
                    430: \**************************************************************************/
                    431: 
                    432: HSURF DrvEnableSurface(DHPDEV dhpdev)
                    433: {
                    434:     PPDEV    ppdev;
                    435:     PDEVSURF pdsurf;
                    436:     DHSURF   dhsurf;
                    437:     HSURF    hsurf;
                    438: 
                    439:     DISPDBG((2, "VGA:enabling Surface\n"));
                    440: 
                    441:     ppdev = (PPDEV) dhpdev;
                    442: 
                    443:     //
                    444:     // Initialize the VGA device into the selected mode which will also map
                    445:     // the video frame buffer
                    446:     //
                    447: 
                    448:     if (!bInitVGA(ppdev, TRUE))
                    449:     {
                    450:         goto error_done;
                    451:     }
                    452: 
                    453:     dhsurf = (DHSURF) LocalAlloc(LMEM_FIXED, (SIZE_T) sizeof(DEVSURF));
                    454: 
                    455:     if (dhsurf == (DHSURF) 0)
                    456:         goto error_done;
                    457: 
                    458:     pdsurf = (PDEVSURF) dhsurf;
                    459: 
                    460:     pdsurf->ident           = DEVSURF_IDENT;
                    461:     pdsurf->flSurf          = 0;
                    462:     pdsurf->iFormat         = BMF_PHYSDEVICE;
                    463:     pdsurf->jReserved1      = 0;
                    464:     pdsurf->jReserved2      = 0;
                    465:     pdsurf->ppdev           = ppdev;
                    466:     pdsurf->sizlSurf.cx     = ppdev->sizlSurf.cx;
                    467:     pdsurf->sizlSurf.cy     = ppdev->sizlSurf.cy;
                    468:     pdsurf->lNextPlane      = 0;
                    469:     pdsurf->pvScan0         = ppdev->pjScreen;
                    470:     pdsurf->pvBitmapStart   = ppdev->pjScreen;
                    471:     pdsurf->pvStart         = ppdev->pjScreen;
                    472:     pdsurf->pvConv          = &ajConvertBuffer[0];
                    473: 
                    474:     if (!bInitPointer(ppdev)) {
                    475:         DISPDBG((0, "VGA DrvEnablePDEV failed bInitPointer\n"));
                    476:         goto error_clean;
                    477:     }
                    478: 
                    479:     if (!SetUpBanking(pdsurf, ppdev)) {
                    480:         DISPDBG((0, "VGA DrvEnablePDEV failed SetUpBanking\n"));
                    481:         goto error_clean;
                    482:     }
                    483: 
                    484:     // Initialize pointer information.
                    485: 
                    486:     if ((hsurf = EngCreateSurface(dhsurf, ppdev->sizlSurf)) == (HSURF) 0)
                    487:     {
                    488:         DISPDBG((0, "VGA DrvEnablePDEV failed EngCreateSurface\n"));
                    489:         goto error_clean;
                    490:     }
                    491: 
                    492:     if (EngAssociateSurface(hsurf, ppdev->hdevEng,
                    493:                         HOOK_BITBLT | HOOK_TEXTOUT | HOOK_STROKEPATH |
                    494:                         HOOK_COPYBITS | HOOK_PAINT | HOOK_FILLPATH))
                    495:     {
                    496:         ppdev->hsurfEng = hsurf;
                    497:         ppdev->pdsurf = pdsurf;
                    498: 
                    499:         // Set up an empty saved screen block list
                    500:         pdsurf->ssbList = NULL;
                    501:         // Initialize the offscreen adapter memory heap to currently all
                    502:         // available
                    503:         // Beginning of heap starts right after the displayed bitmap ends
                    504:         pdsurf->pjAdapterHeapStart = ((PBYTE)pdsurf->pvBitmapStart) +
                    505:              (pdsurf->lNextScan * pdsurf->sizlSurf.cy);
                    506: 
                    507:         // End of heap is the start of either the pointer work area or the
                    508:         // hardware pointer reserved memory area, whichever comes first
                    509:         pdsurf->pjAdapterHeapEnd = pPtrSave;
                    510:         if (ppdev->pPointerAttributes != NULL)
                    511:         {
                    512:             // There's a hardware pointer, so check what display memory it
                    513:             //  uses, if any
                    514:             if (ppdev->PointerCapabilities.HWPtrBitmapStart != -1)
                    515:             {
                    516:                 // The hardware pointer does use display memory
                    517:                 if (( ((PBYTE)pdsurf->pvBitmapStart) +
                    518:                         ppdev->PointerCapabilities.HWPtrBitmapStart) <
                    519:                         pdsurf->pjAdapterHeapEnd)
                    520:                 {
                    521:                     // The hardware pointer marks the end of the heap
                    522:                     pdsurf->pjAdapterHeapEnd = ((PBYTE)pdsurf->pvBitmapStart) +
                    523:                         ppdev->PointerCapabilities.HWPtrBitmapStart;
                    524:                 }
                    525:             }
                    526:         }
                    527: 
                    528:         // The current top of the heap is the end of the heap, because the heap
                    529:         // is empty
                    530:         pdsurf->pjAdapterHeapTop = pdsurf->pjAdapterHeapEnd;
                    531: 
                    532:         DISPDBG((2, "VGA: enabled surface\n"));
                    533: 
                    534:         return(hsurf);
                    535: 
                    536:     }
                    537: 
                    538:     DISPDBG((0, "VGA DrvEnablePDEV failed EngDeleteSurface\n"));
                    539:     EngDeleteSurface(hsurf);
                    540: 
                    541: error_clean:
                    542:     // We created the surface, so delete it
                    543:     LocalFree(dhsurf);
                    544: 
                    545: error_done:
                    546:     return((HSURF) 0);
                    547: }
                    548: 
                    549: 
                    550: /******************************Public*Routine******************************\
                    551: * DrvDisableSurface
                    552: *
                    553: * Free resources associated with this surface.
                    554: *
                    555: \**************************************************************************/
                    556: 
                    557: VOID DrvDisableSurface(DHPDEV dhpdev)
                    558: {
                    559:     PPDEV   ppdev = (PPDEV) dhpdev;
                    560:     PDEVSURF pdsurf = ppdev->pdsurf;
                    561:     PSAVED_SCREEN_BITS pSSB, pSSBNext;
                    562: 
                    563:     DISPDBG((2, "VGA:disabling surface\n"));
                    564: 
                    565:     // Free up banking-related stuff.
                    566:     LocalFree(pdsurf->pBankSelectInfo);
                    567: 
                    568:     if (pdsurf->pbiBankInfo != NULL) {
                    569:         LocalFree(pdsurf->pbiBankInfo);
                    570:     }
                    571: 
                    572:     if (pdsurf->pbiBankInfo2RW != NULL) {
                    573:         LocalFree(pdsurf->pbiBankInfo2RW);
                    574:     }
                    575: 
                    576:     if (pdsurf->pvBankBufferPlane0 != NULL) {
                    577:         LocalFree(pdsurf->pvBankBufferPlane0);
                    578:     }
                    579: 
                    580:     if (ppdev->pPointerAttributes != NULL) {
                    581:         LocalFree(ppdev->pPointerAttributes);
                    582:     }
                    583: 
                    584:     // Free any pending saved screen bit blocks.
                    585:     pSSB = pdsurf->ssbList;
                    586:     while (pSSB != (PSAVED_SCREEN_BITS) NULL) {
                    587:         // Point to the next saved screen bits block
                    588:         pSSBNext = (PSAVED_SCREEN_BITS) pSSB->pvNextSSB;
                    589:         // Free the current block
                    590:         LocalFree(pSSB);
                    591:         pSSB = pSSBNext;
                    592:     }
                    593: 
                    594:     EngDeleteSurface((HSURF) ppdev->hsurfEng);
                    595: 
                    596:     LocalFree(pdsurf);  // free the surface
                    597: 
                    598:     DISPDBG((2, "VGA:disabled surface\n"));
                    599: 
                    600: }
                    601: 
                    602: /******************************Public*Routine******************************\
                    603: * DrvAssertMode
                    604: *
                    605: * Ping the device back into its last known mode
                    606: *
                    607: \**************************************************************************/
                    608: 
                    609: VOID DrvAssertMode(DHPDEV dhpdev, BOOL Enable)
                    610: {
                    611:     PPDEV   ppdev = (PPDEV) dhpdev;
                    612:     ULONG   returnedDataLength;
                    613: 
                    614:     DISPDBG((2, "VGA: DrvAssertMode\n"));
                    615: 
                    616:     if (Enable) {
                    617: 
                    618:         //
                    619:         // The screen must be reenabled since we had gone to full screen.
                    620:         // Re-initialize the device.
                    621:         // !!! BUGBUG what happens if this fails ??
                    622:         //
                    623: 
                    624:         bInitVGA(ppdev, FALSE);
                    625: 
                    626:         vForceBank0(ppdev);
                    627: 
                    628:     } else {
                    629: 
                    630:         //
                    631:         // We must give up the display.
                    632:         // Call the kernel driver to reset the device to a known state.
                    633:         //
                    634: 
                    635:         if (!DeviceIoControl(ppdev->hDriver,
                    636:                              IOCTL_VIDEO_RESET_DEVICE,
                    637:                              NULL,
                    638:                              0,
                    639:                              NULL,
                    640:                              0,
                    641:                              &returnedDataLength,
                    642:                              NULL)) {
                    643: 
                    644:             RIP("VGA.DLL: Reset Device Failed");
                    645: 
                    646:         }
                    647:     }
                    648: 
                    649:     return;
                    650: }
                    651: 
                    652: /******************************Public*Routine******************************\
                    653: * DrvGetModes
                    654: *
                    655: * Returns the list of available modes for the device.
                    656: *
                    657: \**************************************************************************/
                    658: 
                    659: ULONG DrvGetModes(
                    660: HANDLE hDriver,
                    661: ULONG cjSize,
                    662: DEVMODEW *pdm)
                    663: 
                    664: {
                    665: 
                    666:     DWORD cModes;
                    667:     DWORD cbOutputSize;
                    668:     PVIDEO_MODE_INFORMATION pVideoModeInformation, pVideoTemp;
                    669:     DWORD cOutputModes = cjSize / (sizeof(DEVMODEW) + DRIVER_EXTRA_SIZE);
                    670:     DWORD cbModeSize;
                    671: 
                    672:     DISPDBG((2, "Vga.dll:DrvGetModes\n"));
                    673: 
                    674:     cModes = getAvailableModes(hDriver,
                    675:                                (PVIDEO_MODE_INFORMATION *) &pVideoModeInformation,
                    676:                                &cbModeSize);
                    677: 
                    678:     if (cModes == 0)
                    679:     {
                    680:         DISPDBG((0, "VGA DISP DrvGetModes failed to get mode information"));
                    681:         return 0;
                    682:     }
                    683: 
                    684:     if (pdm == NULL)
                    685:     {
                    686:         cbOutputSize = cModes * (sizeof(DEVMODEW) + DRIVER_EXTRA_SIZE);
                    687:     }
                    688:     else
                    689:     {
                    690:         //
                    691:         // Now copy the information for the supported modes back into the output
                    692:         // buffer
                    693:         //
                    694: 
                    695:         cbOutputSize = 0;
                    696: 
                    697:         pVideoTemp = pVideoModeInformation;
                    698: 
                    699:         do
                    700:         {
                    701:             if (pVideoTemp->Length != 0)
                    702:             {
                    703:                 if (cOutputModes == 0)
                    704:                 {
                    705:                     break;
                    706:                 }
                    707: 
                    708:                 //
                    709:                 // Zero the entire structure to start off with.
                    710:                 //
                    711: 
                    712:                 memset(pdm, 0, sizeof(DEVMODEW));
                    713: 
                    714:                 //
                    715:                 // Set the name of the device to the name of the DLL.
                    716:                 //
                    717: 
                    718:                 memcpy(&(pdm->dmDeviceName), L"vga", sizeof(L"vga"));
                    719: 
                    720:                 pdm->dmSpecVersion = DM_SPECVERSION;
                    721:                 pdm->dmDriverVersion = DM_SPECVERSION;
                    722: 
                    723:                 //
                    724:                 // We currently do not support Extra information in the driver
                    725:                 //
                    726: 
                    727:                 pdm->dmDriverExtra = DRIVER_EXTRA_SIZE;
                    728: 
                    729:                 pdm->dmSize = sizeof(DEVMODEW);
                    730:                 pdm->dmBitsPerPel = pVideoTemp->NumberOfPlanes *
                    731:                                     pVideoTemp->BitsPerPlane;
                    732:                 pdm->dmPelsWidth = pVideoTemp->VisScreenWidth;
                    733:                 pdm->dmPelsHeight = pVideoTemp->VisScreenHeight;
                    734:                 pdm->dmDisplayFrequency = pVideoTemp->Frequency;
                    735: 
                    736:                 if (pVideoTemp->AttributeFlags & VIDEO_MODE_INTERLACED)
                    737:                 {
                    738:                     pdm->dmDisplayFlags |= DM_INTERLACED;
                    739:                 }
                    740: 
                    741:                 //
                    742:                 // Go to the next DEVMODE entry in the buffer.
                    743:                 //
                    744: 
                    745:                 cOutputModes--;
                    746: 
                    747:                 pdm = (LPDEVMODEW) ( ((ULONG)pdm) + sizeof(DEVMODEW) +
                    748:                                                    DRIVER_EXTRA_SIZE);
                    749: 
                    750:                 cbOutputSize += (sizeof(DEVMODEW) + DRIVER_EXTRA_SIZE);
                    751: 
                    752:             }
                    753: 
                    754:             pVideoTemp = (PVIDEO_MODE_INFORMATION)
                    755:                 (((PUCHAR)pVideoTemp) + cbModeSize);
                    756: 
                    757:         } while (--cModes);
                    758:     }
                    759: 
                    760:     LocalFree(pVideoModeInformation);
                    761: 
                    762:     return cbOutputSize;
                    763: 
                    764: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.