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

1.1       root        1: /******************************Module*Header*******************************\
                      2: * Module Name: screen.c
                      3: *
                      4: * Initializes the GDIINFO and DEVINFO structures for DrvEnablePDEV.
                      5: *
                      6: * Copyright (c) 1992 Microsoft Corporation
                      7: \**************************************************************************/
                      8: 
                      9: #include "driver.h"
                     10: 
                     11: #define SYSTM_LOGFONT {16,7,0,0,700,0,0,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,VARIABLE_PITCH | FF_DONTCARE,L"System"}
                     12: #define HELVE_LOGFONT {12,9,0,0,400,0,0,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_STROKE_PRECIS,PROOF_QUALITY,VARIABLE_PITCH | FF_DONTCARE,L"MS Sans Serif"}
                     13: #define COURI_LOGFONT {12,9,0,0,400,0,0,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_STROKE_PRECIS,PROOF_QUALITY,FIXED_PITCH | FF_DONTCARE, L"Courier"}
                     14: 
                     15: // This is the basic devinfo for a default driver.  This is used as a base and customized based
                     16: // on information passed back from the miniport driver.
                     17: 
                     18: const DEVINFO gDevInfoFrameBuffer = {
                     19:     GCAPS_OPAQUERECT | GCAPS_MONO_DITHER, /* Graphics capabilities    */
                     20:     SYSTM_LOGFONT,          /* Default font description */
                     21:     HELVE_LOGFONT,          /* ANSI variable font description   */
                     22:     COURI_LOGFONT,          /* ANSI fixed font description          */
                     23:     0,                      /* Count of device fonts          */
                     24:     0,                      /* Preferred DIB format          */
                     25:     8,                      /* Width of color dither          */
                     26:     8,                      /* Height of color dither   */
                     27:     0                       /* Default palette to use for this device */
                     28: };
                     29: 
                     30: /******************************Public*Routine******************************\
                     31: * bInitSURF
                     32: *
                     33: * Enables the surface.        Maps the frame buffer into memory.
                     34: *
                     35: \**************************************************************************/
                     36: 
                     37: BOOL bInitSURF(PPDEV ppdev, BOOL bFirst)
                     38: {
                     39: 
                     40:     VIDEO_MEMORY             VideoMemory;
                     41:     VIDEO_MEMORY_INFORMATION VideoMemoryInfo;
                     42:     DWORD         ReturnedDataLength;
                     43:     DWORD XGAPixelOp;
                     44: 
                     45:     VIDEO_XGA_COPROCESSOR_INFORMATION CoProcessorInfo;
                     46: 
                     47:     if (!DeviceIoControl(ppdev->hDriver,
                     48:                          IOCTL_VIDEO_SET_CURRENT_MODE,
                     49:                          &ppdev->ulMode,        // input buffer
                     50:                          sizeof(VIDEO_MODE),
                     51:                          NULL,
                     52:                          0,
                     53:                          &ReturnedDataLength,
                     54:                          NULL)) {
                     55: 
                     56:         RIP("XGA.DLL: Initialization error-Set mode\n");
                     57: 
                     58:     }
                     59: 
                     60:     if (bFirst) {
                     61: 
                     62:         VideoMemory.RequestedVirtualAddress = NULL;
                     63: 
                     64:         if (!DeviceIoControl(ppdev->hDriver,
                     65:                              IOCTL_VIDEO_MAP_VIDEO_MEMORY,
                     66:                              (PVOID) &VideoMemory, // input buffer
                     67:                              sizeof (VIDEO_MEMORY),
                     68:                              (PVOID) &VideoMemoryInfo, // output buffer
                     69:                              sizeof (VideoMemoryInfo),
                     70:                              &ReturnedDataLength,
                     71:                              NULL)) {
                     72: 
                     73:             RIP("XGA.DLL: Initialization error-Map buffer address\n");
                     74: 
                     75:         }
                     76: 
                     77:         ppdev->pjScreen = VideoMemoryInfo.FrameBufferBase;
                     78:         ppdev->ulScreenSize = VideoMemoryInfo.FrameBufferLength;
                     79:         ppdev->ulVideoMemorySize = VideoMemoryInfo.VideoRamLength;
                     80: 
                     81:         if (!DeviceIoControl(ppdev->hDriver,
                     82:                              IOCTL_VIDEO_XGA_MAP_COPROCESSOR,
                     83:                              NULL,    // input buffer
                     84:                              0,
                     85:                              &CoProcessorInfo, // output buffer
                     86:                              sizeof (VIDEO_XGA_COPROCESSOR_INFORMATION),
                     87:                              &ReturnedDataLength,
                     88:                              NULL)) {
                     89: 
                     90:             RIP("XGA.DLL: Initialization error-Map Coprocessor buffer address\n");
                     91: 
                     92:         }
                     93: 
                     94:         // Set the globals, we will need these almost everywhere.
                     95: 
                     96:         ppdev->pXgaCpRegs        = CoProcessorInfo.CoProcessorVirtualAddress;
                     97:         ppdev->ulPhysFrameBuffer = (ULONG) CoProcessorInfo.PhysicalVideoMemoryAddress;
                     98:         ppdev->ulXgaIoRegsBase   = CoProcessorInfo.XgaIoRegisterBaseAddress;
                     99: 
                    100:         // Set the coprocessor defaults (Target pel map).
                    101:         // The conventions for this driver will have the Target
                    102:         // Pel map as map A.
                    103: 
                    104:         ppdev->pXgaCpRegs->XGAPixelMapIndex = PEL_MAP_A;
                    105:         ppdev->pXgaCpRegs->XGAPixMapBasePtr = ppdev->ulPhysFrameBuffer;
                    106:         ppdev->pXgaCpRegs->XGAPixMapWidth   = (USHORT) ppdev->cxScreen - 1;
                    107:         ppdev->pXgaCpRegs->XGAPixMapHeight  = (USHORT) ppdev->cyScreen - 1;
                    108:         ppdev->pXgaCpRegs->XGAPixMapFormat  = PEL_MAP_FORMAT;
                    109: 
                    110:         ppdev->pXgaCpRegs->XGADestColCompCond = CCCC_FALSE;
                    111:         ppdev->pXgaCpRegs->XGAPixelBitMask    = 0xFF;
                    112: 
                    113:         //
                    114:         // Init the XGA memory manager.
                    115:         //
                    116: 
                    117:         bCpMmInitHeap(ppdev);
                    118: 
                    119:         //
                    120:         // Determine if the coprocessor is working properly.
                    121:         // Try a solid fill; if it fails, then disable all accelerations.
                    122:         //
                    123: 
                    124:         ppdev->pXgaCpRegs->XGAOpDim1 = 1;
                    125:         ppdev->pXgaCpRegs->XGAOpDim2 = 1;
                    126: 
                    127:         ppdev->pXgaCpRegs->XGADestMapX = 0;
                    128:         ppdev->pXgaCpRegs->XGADestMapY = 0;
                    129: 
                    130:         ppdev->pXgaCpRegs->XGAForeGrMix = XGA_S;
                    131:         ppdev->pXgaCpRegs->XGABackGrMix = XGA_S;
                    132: 
                    133:         ppdev->pXgaCpRegs->XGAForeGrColorReg = 0x55;
                    134: 
                    135:         //
                    136:         // Now build the Pel Operation Register Op Code;
                    137:         //
                    138: 
                    139:         XGAPixelOp = BS_BACK_COLOR   | FS_FORE_COLOR  | STEP_PX_BLT     |
                    140:                      SRC_PEL_MAP_A   | DST_PEL_MAP_A  | PATT_FOREGROUND;
                    141: 
                    142:         ppdev->pXgaCpRegs->XGAPixelOp = XGAPixelOp;
                    143: 
                    144:         //
                    145:         // Wait for the coprocessor.
                    146:         //
                    147: 
                    148:         vWaitForCoProcessor(ppdev, 10) ;
                    149: 
                    150:         //
                    151:         // Read the byte back to see if it was blit to the screen properly.
                    152:         // BUGBUG !!!
                    153:         // This is to allow the driver to treat the hardware as a frame buffer
                    154:         // in the case where the IBM hardware is broken !
                    155:         //
                    156: 
                    157:         if (*(ppdev->pjScreen) == 0x55) {
                    158: 
                    159:             //
                    160:             // private flag used for determining driver capabilities.
                    161:             //
                    162: 
                    163: 
                    164:             ppdev->ulfAccelerations_debug = CACHED_FONTS;
                    165:             ppdev->ulfBlitAccelerations_debug = SCRN_TO_SCRN_CPY | SOLID_PATTERN;
                    166: 
                    167:         } else {
                    168: 
                    169:             //
                    170:             // !!! Turn off all accelerations for broken hardware !
                    171:             //
                    172: 
                    173:             ppdev->ulfAccelerations_debug = 0;
                    174:             ppdev->ulfBlitAccelerations_debug = 0;
                    175: 
                    176:         }
                    177:     }
                    178: 
                    179:     return(TRUE);
                    180: }
                    181: 
                    182: /******************************Public*Routine******************************\
                    183: * vDisableSURF
                    184: *
                    185: * Disable the surface. Un-Maps the frame in memory.
                    186: *
                    187: \**************************************************************************/
                    188: 
                    189: VOID vDisableSURF(PPDEV ppdev)
                    190: {
                    191:     DWORD returnedDataLength;
                    192:     VIDEO_MEMORY videoMemory;
                    193: 
                    194:     videoMemory.RequestedVirtualAddress = (PVOID) ppdev->pjScreen;
                    195: 
                    196:     if (!DeviceIoControl(ppdev->hDriver,
                    197:                         IOCTL_VIDEO_UNMAP_VIDEO_MEMORY,
                    198:                         &videoMemory,
                    199:                         sizeof(VIDEO_MEMORY),
                    200:                         NULL,
                    201:                         0,
                    202:                         &returnedDataLength,
                    203:                         NULL))
                    204:     {
                    205:         DISPDBG((0, "DISP vDisableSURF failed IOCTL_VIDEO_UNMAP\n"));
                    206:     }
                    207: }
                    208: 
                    209: /******************************Public*Routine******************************\
                    210: * bInitPDEV
                    211: *
                    212: * Determine the mode we should be in based on the DEVMODE passed in.
                    213: * Query mini-port to get information needed to fill in the DevInfo and the
                    214: * GdiInfo .
                    215: *
                    216: \**************************************************************************/
                    217: 
                    218: BOOL bInitPDEV(
                    219: PPDEV ppdev,
                    220: DEVMODEW *pDevMode,
                    221: GDIINFO *pGdiInfo,
                    222: DEVINFO *pDevInfo)
                    223: {
                    224:     ULONG cModes;
                    225:     PVIDEO_MODE_INFORMATION pVideoBuffer, pVideoModeSelected, pVideoTemp;
                    226:     VIDEO_COLOR_CAPABILITIES colorCapabilities;
                    227:     ULONG ulTemp;
                    228:     BOOL bSelectDefault;
                    229:     ULONG cbModeSize;
                    230: 
                    231:     //
                    232:     // calls the miniport to get mode information.
                    233:     //
                    234: 
                    235:     cModes = getAvailableModes(ppdev->hDriver, &pVideoBuffer, &cbModeSize);
                    236: 
                    237:     if (cModes == 0)
                    238:     {
                    239:         return(FALSE);
                    240:     }
                    241: 
                    242:     //
                    243:     // Determine if we are looking for a default mode.
                    244:     //
                    245: 
                    246:     if ( ((pDevMode->dmPelsWidth) ||
                    247:           (pDevMode->dmPelsHeight) ||
                    248:           (pDevMode->dmBitsPerPel) ||
                    249:           (pDevMode->dmDisplayFlags) ||
                    250:           (pDevMode->dmDisplayFrequency)) == 0)
                    251:     {
                    252:         bSelectDefault = TRUE;
                    253:     }
                    254:     else
                    255:     {
                    256:         bSelectDefault = FALSE;
                    257:     }
                    258: 
                    259:     //
                    260:     // Now see if the requested mode has a match in that table.
                    261:     //
                    262: 
                    263:     pVideoModeSelected = NULL;
                    264:     pVideoTemp = pVideoBuffer;
                    265: 
                    266:     while (cModes--)
                    267:     {
                    268:         if (pVideoTemp->Length != 0)
                    269:         {
                    270:             if (bSelectDefault ||
                    271:                 ((pVideoTemp->VisScreenWidth  == pDevMode->dmPelsWidth) &&
                    272:                  (pVideoTemp->VisScreenHeight == pDevMode->dmPelsHeight) &&
                    273:                  (pVideoTemp->BitsPerPlane *
                    274:                     pVideoTemp->NumberOfPlanes  == pDevMode->dmBitsPerPel) &&
                    275:                  ((pVideoTemp->Frequency  == pDevMode->dmDisplayFrequency) ||
                    276:                     (pDevMode->dmDisplayFrequency == 0)) &&
                    277:                  (((pVideoTemp->AttributeFlags &
                    278:                             VIDEO_MODE_INTERLACED) ? 1:0) ==
                    279:                     ((pDevMode->dmDisplayFlags & DM_INTERLACED) ? 1:0)) ) )
                    280: 
                    281:             {
                    282:                 pVideoModeSelected = pVideoTemp;
                    283:                 DISPDBG((3, "XGA: Found a match\n"));
                    284:                 break;
                    285:             }
                    286:         }
                    287: 
                    288:         pVideoTemp = (PVIDEO_MODE_INFORMATION)
                    289:             (((PUCHAR)pVideoTemp) + cbModeSize);
                    290:     }
                    291: 
                    292:     //
                    293:     // If no mode has been found, return an error
                    294:     //
                    295: 
                    296:     if (pVideoModeSelected == NULL)
                    297:     {
                    298:         LocalFree(pVideoBuffer);
                    299:         return(FALSE);
                    300:     }
                    301: 
                    302:     //
                    303:     // Fill in the GDIINFO data structure with the information returned from
                    304:     // the kernel driver.
                    305:     //
                    306: 
                    307:     ppdev->ulMode = pVideoModeSelected->ModeIndex;
                    308:     ppdev->cxScreen = pVideoModeSelected->VisScreenWidth;
                    309:     ppdev->cyScreen = pVideoModeSelected->VisScreenHeight;
                    310:     ppdev->ulBitCount = pVideoModeSelected->BitsPerPlane *
                    311:                         pVideoModeSelected->NumberOfPlanes;
                    312:     ppdev->lDeltaScreen = pVideoModeSelected->ScreenStride;
                    313: 
                    314:     ppdev->flRed = pVideoModeSelected->RedMask;
                    315:     ppdev->flGreen = pVideoModeSelected->GreenMask;
                    316:     ppdev->flBlue = pVideoModeSelected->BlueMask;
                    317: 
                    318: 
                    319:     pGdiInfo->ulVersion    = 0x1000;    // Our driver is verion 1.000
                    320:     pGdiInfo->ulTechnology = DT_RASDISPLAY;
                    321:     pGdiInfo->ulHorzSize   = pVideoModeSelected->XMillimeter;
                    322:     pGdiInfo->ulVertSize   = pVideoModeSelected->YMillimeter;
                    323: 
                    324:     pGdiInfo->ulHorzRes   = ppdev->cxScreen;
                    325:     pGdiInfo->ulVertRes   = ppdev->cyScreen;
                    326:     pGdiInfo->cBitsPixel  = pVideoModeSelected->BitsPerPlane;
                    327:     pGdiInfo->cPlanes     = pVideoModeSelected->NumberOfPlanes;
                    328: 
                    329:     pGdiInfo->ulLogPixelsX = 96;
                    330:     pGdiInfo->ulLogPixelsY = 96;
                    331: 
                    332:     pGdiInfo->flTextCaps = TC_RA_ABLE;
                    333:     pGdiInfo->flRaster = 0;           // DDI reserves flRaster
                    334: 
                    335:     pGdiInfo->ulDACRed   = pVideoModeSelected->NumberRedBits;
                    336:     pGdiInfo->ulDACGreen = pVideoModeSelected->NumberGreenBits;
                    337:     pGdiInfo->ulDACBlue  = pVideoModeSelected->NumberBlueBits;
                    338: 
                    339:     pGdiInfo->ulAspectX    = 0x24;    // One-to-one aspect ratio
                    340:     pGdiInfo->ulAspectY    = 0x24;
                    341:     pGdiInfo->ulAspectXY   = 0x33;
                    342: 
                    343:     pGdiInfo->xStyleStep   = 1;       // A style unit is 3 pels
                    344:     pGdiInfo->yStyleStep   = 1;
                    345:     pGdiInfo->denStyleStep = 3;
                    346: 
                    347:     pGdiInfo->ptlPhysOffset.x = 0;
                    348:     pGdiInfo->ptlPhysOffset.y = 0;
                    349:     pGdiInfo->szlPhysSize.cx  = 0;
                    350:     pGdiInfo->szlPhysSize.cy  = 0;
                    351: 
                    352:     // RGB and CMY color info.
                    353: 
                    354:     // try to get it from the miniport.
                    355:     // if the miniport doesn ot support this feature, use defaults.
                    356: 
                    357:     if (!DeviceIoControl(ppdev->hDriver,
                    358:                          IOCTL_VIDEO_QUERY_COLOR_CAPABILITIES,
                    359:                          NULL,
                    360:                          0,
                    361:                          &colorCapabilities,
                    362:                          sizeof(VIDEO_COLOR_CAPABILITIES),
                    363:                          &ulTemp,
                    364:                          NULL))
                    365:     {
                    366:         DISPDBG((1, "XGA DISP getcolorCapabilities failed \n"));
                    367: 
                    368:         pGdiInfo->ciDevice.Red.x = 6700;
                    369:         pGdiInfo->ciDevice.Red.y = 3300;
                    370:         pGdiInfo->ciDevice.Red.Y = 0;
                    371:         pGdiInfo->ciDevice.Green.x = 2100;
                    372:         pGdiInfo->ciDevice.Green.y = 7100;
                    373:         pGdiInfo->ciDevice.Green.Y = 0;
                    374:         pGdiInfo->ciDevice.Blue.x = 1400;
                    375:         pGdiInfo->ciDevice.Blue.y = 800;
                    376:         pGdiInfo->ciDevice.Blue.Y = 0;
                    377:         pGdiInfo->ciDevice.AlignmentWhite.x = 3127;
                    378:         pGdiInfo->ciDevice.AlignmentWhite.y = 3290;
                    379:         pGdiInfo->ciDevice.AlignmentWhite.Y = 0;
                    380: 
                    381:         pGdiInfo->ciDevice.RedGamma = 20000;
                    382:         pGdiInfo->ciDevice.GreenGamma = 20000;
                    383:         pGdiInfo->ciDevice.BlueGamma = 20000;
                    384: 
                    385:     }
                    386:     else
                    387:     {
                    388: 
                    389:         pGdiInfo->ciDevice.Red.x = colorCapabilities.RedChromaticity_x;
                    390:         pGdiInfo->ciDevice.Red.y = colorCapabilities.RedChromaticity_y;
                    391:         pGdiInfo->ciDevice.Red.Y = 0;
                    392:         pGdiInfo->ciDevice.Green.x = colorCapabilities.GreenChromaticity_x;
                    393:         pGdiInfo->ciDevice.Green.y = colorCapabilities.GreenChromaticity_y;
                    394:         pGdiInfo->ciDevice.Green.Y = 0;
                    395:         pGdiInfo->ciDevice.Blue.x = colorCapabilities.BlueChromaticity_x;
                    396:         pGdiInfo->ciDevice.Blue.y = colorCapabilities.BlueChromaticity_y;
                    397:         pGdiInfo->ciDevice.Blue.Y = 0;
                    398:         pGdiInfo->ciDevice.AlignmentWhite.x = colorCapabilities.WhiteChromaticity_x;
                    399:         pGdiInfo->ciDevice.AlignmentWhite.y = colorCapabilities.WhiteChromaticity_y;
                    400:         pGdiInfo->ciDevice.AlignmentWhite.Y = colorCapabilities.WhiteChromaticity_Y;
                    401: 
                    402:         // if we have a color device store the three color gamma values,
                    403:         // otherwise store the unique gamma value in all three.
                    404: 
                    405:         if (colorCapabilities.AttributeFlags & VIDEO_DEVICE_COLOR)
                    406:         {
                    407:             pGdiInfo->ciDevice.RedGamma = colorCapabilities.RedGamma;
                    408:             pGdiInfo->ciDevice.GreenGamma = colorCapabilities.GreenGamma;
                    409:             pGdiInfo->ciDevice.BlueGamma = colorCapabilities.BlueGamma;
                    410:         }
                    411:         else
                    412:         {
                    413:             pGdiInfo->ciDevice.RedGamma = colorCapabilities.WhiteGamma;
                    414:             pGdiInfo->ciDevice.GreenGamma = colorCapabilities.WhiteGamma;
                    415:             pGdiInfo->ciDevice.BlueGamma = colorCapabilities.WhiteGamma;
                    416:         }
                    417: 
                    418:     };
                    419: 
                    420:     pGdiInfo->ciDevice.Cyan.x = 0;
                    421:     pGdiInfo->ciDevice.Cyan.y = 0;
                    422:     pGdiInfo->ciDevice.Cyan.Y = 0;
                    423:     pGdiInfo->ciDevice.Magenta.x = 0;
                    424:     pGdiInfo->ciDevice.Magenta.y = 0;
                    425:     pGdiInfo->ciDevice.Magenta.Y = 0;
                    426:     pGdiInfo->ciDevice.Yellow.x = 0;
                    427:     pGdiInfo->ciDevice.Yellow.y = 0;
                    428:     pGdiInfo->ciDevice.Yellow.Y = 0;
                    429: 
                    430:     // No dye correction for raster displays.
                    431: 
                    432:     pGdiInfo->ciDevice.MagentaInCyanDye = 0;
                    433:     pGdiInfo->ciDevice.YellowInCyanDye = 0;
                    434:     pGdiInfo->ciDevice.CyanInMagentaDye = 0;
                    435:     pGdiInfo->ciDevice.YellowInMagentaDye = 0;
                    436:     pGdiInfo->ciDevice.CyanInYellowDye = 0;
                    437:     pGdiInfo->ciDevice.MagentaInYellowDye = 0;
                    438: 
                    439:     pGdiInfo->ulDevicePelsDPI = 0;   // For printers only
                    440:     pGdiInfo->ulPrimaryOrder = PRIMARY_ORDER_CBA;
                    441: 
                    442:     // BUGBUG this should be modified to take into account the size
                    443:     // of the display and the resolution.
                    444: 
                    445:     pGdiInfo->ulHTPatternSize = HT_PATSIZE_4x4_M;
                    446: 
                    447:     pGdiInfo->flHTFlags = HT_FLAG_ADDITIVE_PRIMS;
                    448: 
                    449:     // Fill in the basic devinfo structure
                    450: 
                    451:     *pDevInfo = gDevInfoFrameBuffer;
                    452: 
                    453:     // Fill in the rest of the devinfo and GdiInfo structures.
                    454: 
                    455:     if (ppdev->ulBitCount == 8)
                    456:     {
                    457: 
                    458:         // BUGBUG check if we have a palette managed device.
                    459:         // BUGBUG why is ulNumColors set to 20 ?
                    460: 
                    461:         // It is Palette Managed.
                    462: 
                    463:         pGdiInfo->ulNumColors = 20;
                    464:         pGdiInfo->ulNumPalReg = 1 << ppdev->ulBitCount;
                    465: 
                    466:         pGdiInfo->flRaster |= RC_PALETTE;
                    467:         pGdiInfo->ulHTOutputFormat = HT_FORMAT_8BPP;
                    468: 
                    469:         pDevInfo->iDitherFormat = BMF_8BPP;
                    470:         pDevInfo->flGraphicsCaps |= (GCAPS_PALMANAGED | GCAPS_COLOR_DITHER);
                    471: 
                    472:     }
                    473:     else
                    474:     {
                    475:         pGdiInfo->ulNumColors = 1 << ppdev->ulBitCount;
                    476:         pGdiInfo->ulNumPalReg = 0;
                    477: 
                    478:         pDevInfo->iDitherFormat = BMF_16BPP;
                    479:         pGdiInfo->ulHTOutputFormat = HT_FORMAT_16BPP;
                    480:     }
                    481: 
                    482:     LocalFree(pVideoBuffer);
                    483: 
                    484:     return(TRUE);
                    485: }
                    486: 
                    487: 
                    488: /******************************Public*Routine******************************\
                    489: * getAvailableModes
                    490: *
                    491: * Calls the miniport to get the list of modes supported by the kernel driver,
                    492: * and returns the list of modes supported by the diplay driver among those
                    493: *
                    494: * returns the number of entries in the videomode buffer.
                    495: * 0 means no modes are supported by the miniport or that an error occured.
                    496: *
                    497: * NOTE: the buffer must be freed up by the caller.
                    498: *
                    499: \**************************************************************************/
                    500: 
                    501: DWORD getAvailableModes(
                    502: HANDLE hDriver,
                    503: PVIDEO_MODE_INFORMATION *modeInformation,
                    504: DWORD *cbModeSize)
                    505: {
                    506:     ULONG ulTemp;
                    507:     VIDEO_NUM_MODES modes;
                    508:     PVIDEO_MODE_INFORMATION pVideoTemp;
                    509: 
                    510:     //
                    511:     // Get the number of modes supported by the mini-port
                    512:     //
                    513: 
                    514:     if (!DeviceIoControl(hDriver,
                    515:             IOCTL_VIDEO_QUERY_NUM_AVAIL_MODES,
                    516:             NULL,
                    517:             0,
                    518:             &modes,
                    519:             sizeof(VIDEO_NUM_MODES),
                    520:             &ulTemp,
                    521:             NULL))
                    522:     {
                    523:         DISPDBG((0, "xga.dll getAvailableModes failed VIDEO_QUERY_NUM_AVAIL_MODES\n"));
                    524:         return(0);
                    525:     }
                    526: 
                    527:     *cbModeSize = modes.ModeInformationLength;
                    528: 
                    529:     //
                    530:     // Allocate the buffer for the mini-port to write the modes in.
                    531:     //
                    532: 
                    533:     *modeInformation = (PVIDEO_MODE_INFORMATION)
                    534:                         LocalAlloc(LMEM_FIXED | LMEM_ZEROINIT,
                    535:                                    modes.NumModes *
                    536:                                    modes.ModeInformationLength);
                    537: 
                    538:     if (*modeInformation == (PVIDEO_MODE_INFORMATION) NULL)
                    539:     {
                    540:         DISPDBG((0, "xga.dll getAvailableModes failed LocalAlloc\n"));
                    541: 
                    542:         return 0;
                    543:     }
                    544: 
                    545:     //
                    546:     // Ask the mini-port to fill in the available modes.
                    547:     //
                    548: 
                    549:     if (!DeviceIoControl(hDriver,
                    550:             IOCTL_VIDEO_QUERY_AVAIL_MODES,
                    551:             NULL,
                    552:             0,
                    553:             *modeInformation,
                    554:             modes.NumModes * modes.ModeInformationLength,
                    555:             &ulTemp,
                    556:             NULL))
                    557:     {
                    558: 
                    559:         DISPDBG((0, "xga.dll getAvailableModes failed VIDEO_QUERY_AVAIL_MODES\n"));
                    560: 
                    561:         LocalFree(*modeInformation);
                    562:         *modeInformation = (PVIDEO_MODE_INFORMATION) NULL;
                    563: 
                    564:         return(0);
                    565:     }
                    566: 
                    567:     //
                    568:     // Now see which of these modes are supported by the display driver.
                    569:     // As an internal mechanism, set the length to 0 for the modes we
                    570:     // DO NOT support.
                    571:     //
                    572: 
                    573:     ulTemp = modes.NumModes;
                    574:     pVideoTemp = *modeInformation;
                    575: 
                    576:     //
                    577:     // Mode is rejected if it is not one plane, or not graphics, or is not
                    578:     // one of 8 bits per pel.
                    579:     //
                    580: 
                    581:     while (ulTemp--)
                    582:     {
                    583:         if ((pVideoTemp->NumberOfPlanes != 1 ) ||
                    584:             !(pVideoTemp->AttributeFlags & VIDEO_MODE_GRAPHICS) ||
                    585:             (pVideoTemp->BitsPerPlane != 8))
                    586:         {
                    587:             pVideoTemp->Length = 0;
                    588:         }
                    589: 
                    590:         pVideoTemp = (PVIDEO_MODE_INFORMATION)
                    591:             (((PUCHAR)pVideoTemp) + modes.ModeInformationLength);
                    592:     }
                    593: 
                    594:     return modes.NumModes;
                    595: 
                    596: }

unix.superglobalmegacorp.com

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