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

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: //
                     13: // Build the driver function table gadrvfn with function index/address pairs
                     14: //
                     15: 
                     16: DRVFN gadrvfn[] = {
                     17:     {   INDEX_DrvEnablePDEV,            (PFN) DrvEnablePDEV         },
                     18:     {   INDEX_DrvCompletePDEV,          (PFN) DrvCompletePDEV       },
                     19:     {   INDEX_DrvDisablePDEV,           (PFN) DrvDisablePDEV        },
                     20:     {   INDEX_DrvAssertMode,            (PFN) DrvAssertMode         },
                     21:     {   INDEX_DrvEnableSurface,         (PFN) DrvEnableSurface      },
                     22:     {   INDEX_DrvDisableSurface,        (PFN) DrvDisableSurface     },
                     23:     {   INDEX_DrvMovePointer,           (PFN) DrvMovePointer        },
                     24:     {   INDEX_DrvSetPointerShape,       (PFN) DrvSetPointerShape    },
                     25:     {   INDEX_DrvDitherColor,           (PFN) DrvDitherColor        },
                     26:     {   INDEX_DrvSetPalette,            (PFN) DrvSetPalette         },
                     27:     {   INDEX_DrvCopyBits,              (PFN) DrvCopyBits           },
                     28:     {   INDEX_DrvBitBlt,                (PFN) DrvBitBlt             },
                     29:     {   INDEX_DrvTextOut,               (PFN) DrvTextOut            },
                     30:     {   INDEX_DrvStrokePath,            (PFN) DrvStrokePath         },
                     31:     {   INDEX_DrvPaint,                 (PFN) DrvPaint              },
                     32:     {   INDEX_DrvGetModes,              (PFN) DrvGetModes,          }
                     33: };
                     34: 
                     35: DWORD gDevInfoSize = sizeof(gadrvfn) / sizeof(DRVFN);
                     36: 
                     37: /******************************Public*Routine******************************\
                     38: * DrvEnableDriver
                     39: *
                     40: * Enables the driver by retrieving the drivers function table and version.
                     41: *
                     42: \**************************************************************************/
                     43: 
                     44: BOOL DrvEnableDriver(
                     45: ULONG iEngineVersion,
                     46: ULONG cj,
                     47: PDRVENABLEDATA pded)
                     48: {
                     49:     // Engine Version is passed down so future drivers can support previous
                     50:     // engine versions.        A next generation driver can support both the old
                     51:     // and new engine conventions if told what version of engine it is
                     52:     // working with.  For the first version the driver does nothing with it.
                     53: 
                     54:     iEngineVersion;
                     55: 
                     56:     // Fill in as much as we can.
                     57: 
                     58:     if (cj >= sizeof(DRVENABLEDATA))
                     59:         pded->pdrvfn = gadrvfn;
                     60: 
                     61:     if (cj >= (sizeof(ULONG) * 2))
                     62:         pded->c = sizeof(gadrvfn) / sizeof(DRVFN);
                     63: 
                     64:     // DDI version this driver was targeted for is passed back to engine.
                     65:     // Future graphic's engine may break calls down to old driver format.
                     66: 
                     67:     if (cj >= sizeof(ULONG))
                     68:         pded->iDriverVersion = DDI_DRIVER_VERSION;
                     69: 
                     70:     return(TRUE);
                     71: }
                     72: 
                     73: /******************************Public*Routine******************************\
                     74: * DrvDisableDriver
                     75: *
                     76: * Tells the driver it is being disabled. Release any resources allocated in
                     77: * DrvEnableDriver.
                     78: *
                     79: \**************************************************************************/
                     80: 
                     81: VOID DrvDisableDriver(VOID)
                     82: {
                     83:     return;
                     84: }
                     85: 
                     86: /******************************Public*Routine******************************\
                     87: * DrvEnablePDEV
                     88: *
                     89: * DDI function, Enables the Physical Device.
                     90: *
                     91: * Return Value: device handle to pdev.
                     92: *
                     93: \**************************************************************************/
                     94: 
                     95: DHPDEV DrvEnablePDEV(
                     96: DEVMODEW   *pDevmode,       // Pointer to DEVMODE
                     97: PWSTR       pwszLogAddress, // Logical address
                     98: ULONG       cPatterns,      // number of patterns
                     99: HSURF      *ahsurfPatterns, // return standard patterns
                    100: ULONG       cjGdiInfo,      // Length of memory pointed to by pGdiInfo
                    101: ULONG      *pGdiInfo,       // Pointer to GdiInfo structure
                    102: ULONG       cjDevInfo,      // Length of following PDEVINFO structure
                    103: DEVINFO    *pDevInfo,       // physical device information structure
                    104: PWSTR       pwszDataFile,   // DataFile - not used
                    105: PWSTR       pwszDeviceName, // DeviceName - not used
                    106: HANDLE      hDriver)        // Handle to base driver
                    107: {
                    108:     GDIINFO GdiInfo;
                    109:     DEVINFO DevInfo;
                    110:     PPDEV   ppdev = (PPDEV) NULL;
                    111: 
                    112:     UNREFERENCED_PARAMETER(pwszLogAddress);
                    113:     UNREFERENCED_PARAMETER(pwszDataFile);
                    114:     UNREFERENCED_PARAMETER(pwszDeviceName);
                    115: 
                    116:     // Allocate a physical device structure.
                    117: 
                    118:     ppdev = (PPDEV) LocalAlloc(LMEM_FIXED | LMEM_ZEROINIT, sizeof(PDEV));
                    119: 
                    120:     if (ppdev == (PPDEV) NULL)
                    121:     {
                    122:         DISPDBG((0, "DISP DrvEnablePDEV failed LocalAlloc\n"));
                    123:         return ((DHPDEV) 0);
                    124:     }
                    125: 
                    126:     // Save the screen handle in the PDEV.
                    127: 
                    128:     ppdev->hDriver = hDriver;
                    129: 
                    130:     // Get the current screen mode information.  Set up device caps and devinfo.
                    131: 
                    132:     if (!bInitPDEV(ppdev, pDevmode, &GdiInfo, &DevInfo))
                    133:     {
                    134:         DISPDBG((0, "DISP DrvEnablePDEV failed bGetScreenInfo\n"));
                    135:         goto error_free;
                    136:     }
                    137: 
                    138:     // Initialize palette information.
                    139: 
                    140:     if (!bInitPaletteInfo(ppdev, &DevInfo))
                    141:     {
                    142:         DISPDBG((0, "DISP DrvEnableSurface failed bInitPalette\n"));
                    143:         goto error_free;
                    144:     }
                    145: 
                    146:     // Initialize device standard patterns.
                    147: 
                    148:     if (!bInitPatterns(ppdev, min(cPatterns, HS_DDI_MAX)))
                    149:     {
                    150:         DISPDBG((0, "DISP DrvEnablePDEV failed bInitPatterns\n"));
                    151:         vDisablePatterns(ppdev);
                    152:         vDisablePalette(ppdev);
                    153:         goto error_free;
                    154:     }
                    155: 
                    156:     // Copy the devinfo into the engine buffer.
                    157: 
                    158:     memcpy(pDevInfo, &DevInfo, min(sizeof(DEVINFO), cjDevInfo));
                    159: 
                    160:     // Set the ahsurfPatterns array to handles each of the standard
                    161:     // patterns that were just created.
                    162: 
                    163:     memcpy((PVOID)ahsurfPatterns, ppdev->ahbmPat, ppdev->cPatterns*sizeof(HBITMAP));
                    164: 
                    165:     // Set the pdevCaps with GdiInfo we have prepared to the list of caps for this
                    166:     // pdev.
                    167: 
                    168:     memcpy(pGdiInfo, &GdiInfo, min(cjGdiInfo, sizeof(GDIINFO)));
                    169: 
                    170:     return((DHPDEV) ppdev);
                    171: 
                    172:     // Error case for failure.
                    173: error_free:
                    174:     LocalFree(ppdev);
                    175:     DISPDBG((0, "DISP DrvEnablePDEV failed\n"));
                    176:     return((DHPDEV) 0);
                    177: }
                    178: 
                    179: /******************************Public*Routine******************************\
                    180: * DrvCompletePDEV
                    181: *
                    182: * Store the HPDEV, the engines handle for this PDEV, in the DHPDEV.
                    183: *
                    184: \**************************************************************************/
                    185: 
                    186: VOID DrvCompletePDEV(
                    187: DHPDEV dhpdev,
                    188: HDEV  hdev)
                    189: {
                    190:     ((PPDEV) dhpdev)->hdevEng = hdev;
                    191: }
                    192: 
                    193: /******************************Public*Routine******************************\
                    194: * DrvDisablePDEV
                    195: *
                    196: * Release the resources allocated in DrvEnablePDEV.  If a surface has been
                    197: * enabled DrvDisableSurface will have already been called.
                    198: *
                    199: \**************************************************************************/
                    200: 
                    201: VOID DrvDisablePDEV(
                    202: DHPDEV dhpdev)
                    203: {
                    204:     vDisablePalette((PPDEV) dhpdev);
                    205:     vDisablePatterns((PPDEV) dhpdev);
                    206:     LocalFree(dhpdev);
                    207: }
                    208: 
                    209: /******************************Public*Routine******************************\
                    210: * DrvEnableSurface
                    211: *
                    212: * Enable the surface for the device.  Hook the calls this driver supports.
                    213: *
                    214: * Return: Handle to the surface if successful, 0 for failure.
                    215: *
                    216: \**************************************************************************/
                    217: 
                    218: HSURF DrvEnableSurface(
                    219: DHPDEV dhpdev)
                    220: {
                    221:     PPDEV   ppdev;
                    222:     HSURF   hsurf,
                    223:             hSurfBm ;
                    224:     SIZEL   sizl;
                    225:     ULONG   ulBitmapType;
                    226:     FLONG   flHooks;
                    227:     SURFOBJ *pSurfObj ;
                    228: 
                    229:     // Create engine bitmap around frame buffer.
                    230: 
                    231:     ppdev = (PPDEV) dhpdev;
                    232: 
                    233:     if (!bInitSURF(ppdev, TRUE))
                    234:     {
                    235:         DISPDBG((0, "DISP DrvEnableSurface failed bInitSURF\n"));
                    236:         return(FALSE);
                    237:     }
                    238: 
                    239:     if (ppdev->ulBitCount == 8)  {
                    240:         if (!bInit256ColorPalette(ppdev)) {
                    241:             DISPDBG((0, "DISP DrvEnableSurface failed to init the 8bpp palette\n"));
                    242:             return(FALSE);
                    243:         }
                    244:     }
                    245: 
                    246:     sizl.cx = ppdev->cxScreen;
                    247:     sizl.cy = ppdev->cyScreen;
                    248: 
                    249:     if (ppdev->ulBitCount == 8)
                    250:     {
                    251:         ulBitmapType = BMF_8BPP;
                    252:         flHooks = HOOKS_BMF8BPP;
                    253:     }
                    254:     else if (ppdev->ulBitCount == 16)
                    255:     {
                    256:         ulBitmapType = BMF_16BPP;
                    257:         flHooks = HOOKS_BMF16BPP;
                    258:     }
                    259:     else
                    260:     {
                    261:         RIP("XGA.DLL: DrvEnableSurface wrong big count");
                    262:     }
                    263: 
                    264:     hSurfBm = (HSURF) EngCreateBitmap(sizl,
                    265:                                       (ULONG)ppdev->lDeltaScreen,
                    266:                                       ulBitmapType,
                    267:                                       (ppdev->lDeltaScreen > 0) ? BMF_TOPDOWN : 0,
                    268:                                           (PVOID) (ppdev->pjScreen));
                    269: 
                    270:     if (hSurfBm == (HSURF) 0)
                    271:     {
                    272:         DISPDBG((0, "DISP!DrvEnableSurface failed EngCreateBitmap\n"));
                    273:         return(FALSE);
                    274:     }
                    275: 
                    276:     if (!EngAssociateSurface(hSurfBm, ppdev->hdevEng, 0))
                    277:     {
                    278:         DISPDBG((0, "DISP DrvEnableSurface failed to Associate Engine Bitmap\n"));
                    279:         EngDeleteSurface(hSurfBm);
                    280:         return(FALSE);
                    281:     }
                    282: 
                    283:     // BUGBUG check return code
                    284: 
                    285:     pSurfObj = EngLockSurface(hSurfBm) ;
                    286: 
                    287:     // BUGBUG check return code
                    288: 
                    289:     hsurf = EngCreateSurface((DHSURF) pSurfObj, sizl) ;
                    290: 
                    291:     if (!EngAssociateSurface(hsurf, ppdev->hdevEng, flHooks))
                    292:     {
                    293:         DISPDBG((0, "DISP DrvEnableSurface failed to Associate Device Surface\n"));
                    294:         EngUnlockSurface(pSurfObj);
                    295:         EngDeleteSurface(hSurfBm);
                    296:         EngDeleteSurface(hsurf);
                    297:         return(FALSE);
                    298:     }
                    299: 
                    300:     ppdev->hSurfEng = hsurf;
                    301:     ppdev->hSurfBm  = hSurfBm;
                    302:     ppdev->pSurfObj = pSurfObj ;
                    303: 
                    304:     return(hsurf);
                    305: }
                    306: 
                    307: /******************************Public*Routine******************************\
                    308: * DrvDisableSurface
                    309: *
                    310: * Free resources allocated by DrvEnableSurface.  Release the surface.
                    311: *
                    312: \**************************************************************************/
                    313: 
                    314: VOID DrvDisableSurface(
                    315: DHPDEV dhpdev)
                    316: {
                    317:     EngUnlockSurface(((PPDEV) dhpdev)->pSurfObj);
                    318:     EngDeleteSurface(((PPDEV) dhpdev)->hSurfBm);
                    319:     EngDeleteSurface(((PPDEV) dhpdev)->hSurfEng);
                    320:     vDisableSURF((PPDEV) dhpdev);
                    321:     ((PPDEV) dhpdev)->hSurfEng = (HSURF) 0;
                    322: }
                    323: 
                    324: /******************************Public*Routine******************************\
                    325: * DrvAssertMode
                    326: *
                    327: * This asks the device to reset itself to the mode of the pdev passed in.
                    328: *
                    329: \**************************************************************************/
                    330: 
                    331: VOID DrvAssertMode(
                    332: DHPDEV dhpdev,
                    333: BOOL bEnable)
                    334: {
                    335:     PPDEV   ppdev = (PPDEV) dhpdev;
                    336:     ULONG   ulReturn;
                    337:     BOOL        b;
                    338:     PCACHEDFONT pcf,
                    339:                 pcfLast;
                    340: 
                    341: 
                    342:     if (bEnable)
                    343:     {
                    344:     // The screen must be reenabled, reinitialize the device to clean state.
                    345: 
                    346:             bInitSURF(ppdev, FALSE);
                    347:     }
                    348:     else
                    349:     {
                    350:     // We must give up the display.
                    351:     // free the caches.
                    352: 
                    353:         // Traverse the CachedFonts list.
                    354:         // Free all the system memory used for each font.
                    355: 
                    356:         for (pcf = ppdev->pCachedFontsRoot; pcf != NULL; pcf = pcf->pcfNext)
                    357:         {
                    358:             LocalFree(pcf->pCachedGlyphs);
                    359:         }
                    360: 
                    361:         // Now free all the memory for the font nodes.
                    362: 
                    363:         for (pcf = ppdev->pCachedFontsRoot; pcf != NULL; )
                    364:         {
                    365:             pcfLast = pcf;
                    366:             pcf = pcf->pcfNext;
                    367:             LocalFree(pcfLast);
                    368:         }
                    369: 
                    370:         ppdev->pCachedFontsRoot = NULL;
                    371: 
                    372:         // Now Free all the memory used to maintain the XGA heap.
                    373: 
                    374:         b = bCpMmDestroyHeap(ppdev);
                    375:         if (b == FALSE)
                    376:         {
                    377:             DISPDBG((1, "XGA.DLL!bBlowCache - bCpMmDestroyHeap failed\n"));
                    378:         }
                    379: 
                    380:         // Now ReInitialize the XGA Heap.
                    381: 
                    382:         b = bCpMmInitHeap(ppdev);
                    383:         if (b == FALSE)
                    384:         {
                    385:             DISPDBG((1, "XGA.DLL!bBlowCache - bCpMmInitHeap failed\n"));
                    386:         }
                    387: 
                    388: 
                    389:     // Call the kernel driver to reset the device to a known state.
                    390: 
                    391:         if (!DeviceIoControl(ppdev->hDriver,
                    392:                              IOCTL_VIDEO_RESET_DEVICE,
                    393:                              NULL,
                    394:                              0,
                    395:                              NULL,
                    396:                              0,
                    397:                              &ulReturn,
                    398:                              NULL))
                    399:         {
                    400:             DISPDBG((1, "DISP DrvAssertMode failed IOCTL"));
                    401:         }
                    402:     }
                    403: 
                    404:     return;
                    405: }
                    406: 
                    407: 
                    408: /******************************Public*Routine******************************\
                    409: * DrvGetModes
                    410: *
                    411: * Returns the list of available modes for the device.
                    412: *
                    413: \**************************************************************************/
                    414: 
                    415: ULONG DrvGetModes(
                    416: HANDLE hDriver,
                    417: ULONG cjSize,
                    418: DEVMODEW *pdm)
                    419: 
                    420: {
                    421: 
                    422:     DWORD cModes;
                    423:     DWORD cbOutputSize;
                    424:     PVIDEO_MODE_INFORMATION pVideoModeInformation, pVideoTemp;
                    425:     DWORD cOutputModes = cjSize / (sizeof(DEVMODEW) + DRIVER_EXTRA_SIZE);
                    426:     DWORD cbModeSize;
                    427: 
                    428:     DISPDBG((3, "Xga.dll:DrvGetModes\n"));
                    429: 
                    430:     cModes = getAvailableModes(hDriver,
                    431:                                (PVIDEO_MODE_INFORMATION *) &pVideoModeInformation,
                    432:                                &cbModeSize);
                    433: 
                    434:     if (cModes == 0)
                    435:     {
                    436:         DISPDBG((0, "Xga.dll DrvGetModes failed to get mode information"));
                    437:         return 0;
                    438:     }
                    439: 
                    440:     if (pdm == NULL)
                    441:     {
                    442:         cbOutputSize = cModes * (sizeof(DEVMODEW) + DRIVER_EXTRA_SIZE);
                    443:     }
                    444:     else
                    445:     {
                    446:         //
                    447:         // Now copy the information for the supported modes back into the output
                    448:         // buffer
                    449:         //
                    450: 
                    451:         cbOutputSize = 0;
                    452: 
                    453:         pVideoTemp = pVideoModeInformation;
                    454: 
                    455:         do
                    456:         {
                    457:             if (pVideoTemp->Length != 0)
                    458:             {
                    459:                 if (cOutputModes == 0)
                    460:                 {
                    461:                     break;
                    462:                 }
                    463: 
                    464:                 //
                    465:                 // Zero the entire structure to start off with.
                    466:                 //
                    467: 
                    468:                 memset(pdm, 0, sizeof(DEVMODEW));
                    469: 
                    470:                 //
                    471:                 // Set the name of the device to the name of the DLL.
                    472:                 //
                    473: 
                    474:                 memcpy(&(pdm->dmDeviceName), L"xga", sizeof(L"xga"));
                    475: 
                    476:                 pdm->dmSpecVersion = DM_SPECVERSION;
                    477:                 pdm->dmDriverVersion = DM_SPECVERSION;
                    478: 
                    479:                 //
                    480:                 // We currently do not support Extra information in the driver
                    481:                 //
                    482: 
                    483:                 pdm->dmDriverExtra = DRIVER_EXTRA_SIZE;
                    484: 
                    485:                 pdm->dmSize = sizeof(DEVMODEW);
                    486:                 pdm->dmBitsPerPel = pVideoTemp->NumberOfPlanes *
                    487:                                     pVideoTemp->BitsPerPlane;
                    488:                 pdm->dmPelsWidth = pVideoTemp->VisScreenWidth;
                    489:                 pdm->dmPelsHeight = pVideoTemp->VisScreenHeight;
                    490:                 pdm->dmDisplayFrequency = pVideoTemp->Frequency;
                    491: 
                    492:                 if (pVideoTemp->AttributeFlags & VIDEO_MODE_INTERLACED)
                    493:                 {
                    494:                     pdm->dmDisplayFlags |= DM_INTERLACED;
                    495:                 }
                    496: 
                    497:                 //
                    498:                 // Go to the next DEVMODE entry in the buffer.
                    499:                 //
                    500: 
                    501:                 cOutputModes--;
                    502: 
                    503:                 pdm = (LPDEVMODEW) ( ((ULONG)pdm) + sizeof(DEVMODEW) +
                    504:                                                    DRIVER_EXTRA_SIZE);
                    505: 
                    506:                 cbOutputSize += (sizeof(DEVMODEW) + DRIVER_EXTRA_SIZE);
                    507: 
                    508:             }
                    509: 
                    510:             pVideoTemp = (PVIDEO_MODE_INFORMATION)
                    511:                 (((PUCHAR)pVideoTemp) + cbModeSize);
                    512: 
                    513:         } while (--cModes);
                    514:     }
                    515: 
                    516:     LocalFree(pVideoModeInformation);
                    517: 
                    518:     return cbOutputSize;
                    519: 
                    520: }

unix.superglobalmegacorp.com

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