Annotation of ntddk/src/video/displays/vga/enable.c, revision 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.