/**************************************************************************\ * * ************************ * * MINIPORT SAMPLE CODE * * ************************ * * Module Name: * * perm3dat.c * * Abstract: * * This module contains all the global data used by the Permedia3 driver. * * Environment: * * Kernel mode * * * Copyright (c) 1994-1999 3Dlabs Inc. Ltd. All rights reserved. * Copyright (c) 1995-2003 Microsoft Corporation. All Rights Reserved. * \***************************************************************************/ #include "perm3.h" // // DATA STRUCTURES // =============== // #if defined(ALLOC_PRAGMA) #pragma data_seg("PAGEDATA") #endif // // RangeStart RangeLength // | | RangeInIoSpace // | | | RangeVisible // +-----+-----+ | | | RangeShareable // | | | | | | RangePassive // v v v v v v v VIDEO_ACCESS_RANGE Perm3LegacyResourceList[] = { {0x000C0000, 0x00000000, 0x00010000, 0, 0, 0, 0}, // ROM location {0x000A0000, 0x00000000, 0x00020000, 0, 0, 1, 0}, // Frame buffer {0x000003B0, 0x00000000, 0x0000000B, 1, 1, 1, 0}, // VGA regs {0x000003C0, 0x00000000, 0x0000001F, 1, 1, 1, 0}, // VGA regs }; ULONG Perm3LegacyResourceEntries = sizeof Perm3LegacyResourceList / sizeof Perm3LegacyResourceList[0]; // // Video mode table - Lists the information about each individual mode. // // Note that any new modes should be added here and to the appropriate // PERM3_VIDEO_FREQUENCIES tables. // PERM3_VIDEO_MODES Perm3Modes[] = { { // 320x200x8bpp 0x0201, // 'Contiguous' Int 10 mode number (for high-colour) 0x0201, // 'Noncontiguous' Int 10 mode number 320, // 'Contiguous' screen stride { sizeof(VIDEO_MODE_INFORMATION), // Size of the mode informtion structure 0, // Mode index used in setting the mode // (filled in later) 320, // X Resolution, in pixels 200, // Y Resolution, in pixels 320, // 'Noncontiguous' screen stride, // in bytes (distance between the // start point of two consecutive // scan lines, in bytes) 1, // Number of video memory planes 8, // Number of bits per plane 1, // Screen Frequency, in Hertz ('1' // means use hardware default) 320, // Horizontal size of screen in millimeters 240, // Vertical size of screen in millimeters 8, // Number Red pixels in DAC 8, // Number Green pixels in DAC 8, // Number Blue pixels in DAC 0x00000000, // Mask for Red Pixels in non-palette modes 0x00000000, // Mask for Green Pixels in non-palette modes 0x00000000, // Mask for Blue Pixels in non-palette modes VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS | VIDEO_MODE_PALETTE_DRIVEN | VIDEO_MODE_MANAGED_PALETTE, // Mode description flags. 0, // Video Memory Bitmap Width (filled // in later) 0 // Video Memory Bitmap Height (filled // in later) }, }, { // 320x240x8bpp 0x0201, // 'Contiguous' Int 10 mode number (for high-colour) 0x0201, // 'Noncontiguous' Int 10 mode number 320, // 'Contiguous' screen stride { sizeof(VIDEO_MODE_INFORMATION), // Size of the mode informtion structure 0, // Mode index used in setting the mode // (filled in later) 320, // X Resolution, in pixels 240, // Y Resolution, in pixels 320, // 'Noncontiguous' screen stride, // in bytes (distance between the // start point of two consecutive // scan lines, in bytes) 1, // Number of video memory planes 8, // Number of bits per plane 1, // Screen Frequency, in Hertz ('1' // means use hardware default) 320, // Horizontal size of screen in millimeters 240, // Vertical size of screen in millimeters 8, // Number Red pixels in DAC 8, // Number Green pixels in DAC 8, // Number Blue pixels in DAC 0x00000000, // Mask for Red Pixels in non-palette modes 0x00000000, // Mask for Green Pixels in non-palette modes 0x00000000, // Mask for Blue Pixels in non-palette modes VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS | VIDEO_MODE_PALETTE_DRIVEN | VIDEO_MODE_MANAGED_PALETTE, // Mode description flags. 0, // Video Memory Bitmap Width (filled // in later) 0 // Video Memory Bitmap Height (filled // in later) }, }, { // 512x384x8bpp 0x0201, // 'Contiguous' Int 10 mode number (for high-colour) 0x0201, // 'Noncontiguous' Int 10 mode number 512, // 'Contiguous' screen stride { sizeof(VIDEO_MODE_INFORMATION), // Size of the mode informtion structure 0, // Mode index used in setting the mode // (filled in later) 512, // X Resolution, in pixels 384, // Y Resolution, in pixels 512, // 'Noncontiguous' screen stride, // in bytes (distance between the // start point of two consecutive // scan lines, in bytes) 1, // Number of video memory planes 8, // Number of bits per plane 1, // Screen Frequency, in Hertz ('1' // means use hardware default) 320, // Horizontal size of screen in millimeters 240, // Vertical size of screen in millimeters 8, // Number Red pixels in DAC 8, // Number Green pixels in DAC 8, // Number Blue pixels in DAC 0x00000000, // Mask for Red Pixels in non-palette modes 0x00000000, // Mask for Green Pixels in non-palette modes 0x00000000, // Mask for Blue Pixels in non-palette modes VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS | VIDEO_MODE_PALETTE_DRIVEN | VIDEO_MODE_MANAGED_PALETTE, // Mode description flags. 0, // Video Memory Bitmap Width (filled // in later) 0 // Video Memory Bitmap Height (filled // in later) }, }, { // 640x400x8bpp 0x0201, // 'Contiguous' Int 10 mode number (for high-colour) 0x0201, // 'Noncontiguous' Int 10 mode number 640, // 'Contiguous' screen stride { sizeof(VIDEO_MODE_INFORMATION), // Size of the mode informtion structure 0, // Mode index used in setting the mode // (filled in later) 640, // X Resolution, in pixels 400, // Y Resolution, in pixels 640, // 'Noncontiguous' screen stride, // in bytes (distance between the // start point of two consecutive // scan lines, in bytes) 1, // Number of video memory planes 8, // Number of bits per plane 1, // Screen Frequency, in Hertz ('1' // means use hardware default) 320, // Horizontal size of screen in millimeters 240, // Vertical size of screen in millimeters 8, // Number Red pixels in DAC 8, // Number Green pixels in DAC 8, // Number Blue pixels in DAC 0x00000000, // Mask for Red Pixels in non-palette modes 0x00000000, // Mask for Green Pixels in non-palette modes 0x00000000, // Mask for Blue Pixels in non-palette modes VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS | VIDEO_MODE_PALETTE_DRIVEN | VIDEO_MODE_MANAGED_PALETTE, // Mode description flags. 0, // Video Memory Bitmap Width (filled // in later) 0 // Video Memory Bitmap Height (filled // in later) }, }, { // 640x480x8bpp 0x0201, // 'Contiguous' Int 10 mode number (for high-colour) 0x0201, // 'Noncontiguous' Int 10 mode number 640, // 'Contiguous' screen stride { sizeof(VIDEO_MODE_INFORMATION), // Size of the mode informtion structure 0, // Mode index used in setting the mode // (filled in later) 640, // X Resolution, in pixels 480, // Y Resolution, in pixels 640, // 'Noncontiguous' screen stride, // in bytes (distance between the // start point of two consecutive // scan lines, in bytes) 1, // Number of video memory planes 8, // Number of bits per plane 1, // Screen Frequency, in Hertz ('1' // means use hardware default) 320, // Horizontal size of screen in millimeters 240, // Vertical size of screen in millimeters 8, // Number Red pixels in DAC 8, // Number Green pixels in DAC 8, // Number Blue pixels in DAC 0x00000000, // Mask for Red Pixels in non-palette modes 0x00000000, // Mask for Green Pixels in non-palette modes 0x00000000, // Mask for Blue Pixels in non-palette modes VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS | VIDEO_MODE_PALETTE_DRIVEN | VIDEO_MODE_MANAGED_PALETTE, // Mode description flags. 0, // Video Memory Bitmap Width (filled // in later) 0 // Video Memory Bitmap Height (filled // in later) }, }, { // 800x600x8bpp 0x0103, 0x0203, 800, { sizeof(VIDEO_MODE_INFORMATION), 0, 800, 600, 800, 1, 8, 1, 320, 240, 8, 8, 8, 0x00000000, 0x00000000, 0x00000000, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS | VIDEO_MODE_PALETTE_DRIVEN | VIDEO_MODE_MANAGED_PALETTE, } }, { // 1024x768x8bpp 0x0205, 0x0205, 1024, { sizeof(VIDEO_MODE_INFORMATION), 0, 1024, 768, 1024, 1, 8, 1, 320, 240, 8, 8, 8, 0x00000000, 0x00000000, 0x00000000, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS | VIDEO_MODE_PALETTE_DRIVEN | VIDEO_MODE_MANAGED_PALETTE, } }, { // 1152x864x8bpp 0x0207, 0x0207, 1152, { sizeof(VIDEO_MODE_INFORMATION), 0, 1152, 864, 1152, 1, 8, 1, 320, 240, 8, 8, 8, 0x00000000, 0x00000000, 0x00000000, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS | VIDEO_MODE_PALETTE_DRIVEN | VIDEO_MODE_MANAGED_PALETTE, } }, { // 1280x800x8bpp 0x0207, 0x0207, 1280, { sizeof(VIDEO_MODE_INFORMATION), 0, 1280, 800, 1280, 1, 8, 1, 320, 240, 8, 8, 8, 0x00000000, 0x00000000, 0x00000000, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS | VIDEO_MODE_PALETTE_DRIVEN | VIDEO_MODE_MANAGED_PALETTE, } }, { // 1280x960x8bpp 0x0207, 0x0207, 1280, { sizeof(VIDEO_MODE_INFORMATION), 0, 1280, 960, 1280, 1, 8, 1, 320, 240, 8, 8, 8, 0x00000000, 0x00000000, 0x00000000, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS | VIDEO_MODE_PALETTE_DRIVEN | VIDEO_MODE_MANAGED_PALETTE, } }, { // 1280x1024x8bpp 0x0107, 0x0107, 1280, { sizeof(VIDEO_MODE_INFORMATION), 0, 1280, 1024, 1280, 1, 8, 1, 320, 240, 8, 8, 8, 0x00000000, 0x00000000, 0x00000000, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS | VIDEO_MODE_PALETTE_DRIVEN | VIDEO_MODE_MANAGED_PALETTE, } }, { // 1600x1000x8bpp 0x0120, 0x0120, 1600, { sizeof(VIDEO_MODE_INFORMATION), 0, 1600, 1000, 1600, 1, 8, 1, 320, 240, 8, 8, 8, 0x00000000, 0x00000000, 0x00000000, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS | VIDEO_MODE_PALETTE_DRIVEN | VIDEO_MODE_MANAGED_PALETTE, } }, { // 1600x1024x8bpp 0x0120, 0x0120, 1600, { sizeof(VIDEO_MODE_INFORMATION), 0, 1600, 1024, 1600, 1, 8, 1, 320, 240, 8, 8, 8, 0x00000000, 0x00000000, 0x00000000, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS | VIDEO_MODE_PALETTE_DRIVEN | VIDEO_MODE_MANAGED_PALETTE, } }, { // 1600x1200x8bpp 0x0120, 0x0120, 1600, { sizeof(VIDEO_MODE_INFORMATION), 0, 1600, 1200, 1600, 1, 8, 1, 320, 240, 8, 8, 8, 0x00000000, 0x00000000, 0x00000000, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS | VIDEO_MODE_PALETTE_DRIVEN | VIDEO_MODE_MANAGED_PALETTE, } }, { // 1920x1080x8bpp 0x0120, 0x0120, 1920, { sizeof(VIDEO_MODE_INFORMATION), 0, 1920, 1080, 1920, 1, 8, 1, 320, 240, 8, 8, 8, 0x00000000, 0x00000000, 0x00000000, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS | VIDEO_MODE_PALETTE_DRIVEN | VIDEO_MODE_MANAGED_PALETTE, } }, { // 1920x1200x8bpp 0x0120, 0x0120, 1920, { sizeof(VIDEO_MODE_INFORMATION), 0, 1920, 1200, 1920, 1, 8, 1, 320, 240, 8, 8, 8, 0x00000000, 0x00000000, 0x00000000, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS | VIDEO_MODE_PALETTE_DRIVEN | VIDEO_MODE_MANAGED_PALETTE, } }, { // 320x200x16bpp 0x0111, 0x0211, 640, { sizeof(VIDEO_MODE_INFORMATION), 0, 320, 200, 640, 1, 16, 1, 320, 240, 8, 8, 8, 0x0000f800, // BGR 5:6:5 0x000007e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 320x240x16bpp 0x0111, 0x0211, 640, { sizeof(VIDEO_MODE_INFORMATION), 0, 320, 240, 640, 1, 16, 1, 320, 240, 8, 8, 8, 0x0000f800, // BGR 5:6:5 0x000007e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 512x384x16bpp 0x0111, 0x0211, 1024, { sizeof(VIDEO_MODE_INFORMATION), 0, 512, 384, 1024, 1, 16, 1, 320, 240, 8, 8, 8, 0x0000f800, // BGR 5:6:5 0x000007e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 640x400x16bpp 0x0111, 0x0211, 1280, { sizeof(VIDEO_MODE_INFORMATION), 0, 640, 400, 1280, 1, 16, 1, 320, 240, 8, 8, 8, 0x0000f800, // BGR 5:6:5 0x000007e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 640x480x16bpp 0x0111, 0x0211, 1280, { sizeof(VIDEO_MODE_INFORMATION), 0, 640, 480, 1280, 1, 16, 1, 320, 240, 8, 8, 8, 0x0000f800, // BGR 5:6:5 0x000007e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 800x600x16bpp 0x0114, 0x0214, 1600, { sizeof(VIDEO_MODE_INFORMATION), 0, 800, 600, 1600, 1, 16, 1, 320, 240, 8, 8, 8, 0x0000f800, // BGR 5:6:5 0x000007e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 1024x768x16bpp 0x0117, 0x0117, 2048, { sizeof(VIDEO_MODE_INFORMATION), 0, 1024, 768, 2048, 1, 16, 1, 320, 240, 8, 8, 8, 0x0000f800, // BGR 5:6:5 0x000007e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 1152x864x16bpp 0x0118, 0x0222, 2304, { sizeof(VIDEO_MODE_INFORMATION), 0, 1152, 864, 2304, 1, 16, 1, 320, 240, 8, 8, 8, 0x0000f800, // BGR 5:6:5 0x000007e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 1280x800x16bpp 0x011A, 0x021A, 2560, { sizeof(VIDEO_MODE_INFORMATION), 0, 1280, 800, 2560, 1, 16, 1, 320, 240, 8, 8, 8, 0x0000f800, // BGR 5:6:5 0x000007e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 1280x960x16bpp 0x011A, 0x021A, 2560, { sizeof(VIDEO_MODE_INFORMATION), 0, 1280, 960, 2560, 1, 16, 1, 320, 240, 8, 8, 8, 0x0000f800, // BGR 5:6:5 0x000007e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 1280x1024x16bpp 0x011A, 0x021A, 2560, { sizeof(VIDEO_MODE_INFORMATION), 0, 1280, 1024, 2560, 1, 16, 1, 320, 240, 8, 8, 8, 0x0000f800, // BGR 5:6:5 0x000007e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 1600x1000x16bpp 0x0121, 0x0121, 3200, { sizeof(VIDEO_MODE_INFORMATION), 0, 1600, 1000, 3200, 1, 16, 1, 320, 240, 8, 8, 8, 0x0000f800, // BGR 5:6:5 0x000007e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 1600x1024x16bpp 0x0121, 0x0121, 3200, { sizeof(VIDEO_MODE_INFORMATION), 0, 1600, 1024, 3200, 1, 16, 1, 320, 240, 8, 8, 8, 0x0000f800, // BGR 5:6:5 0x000007e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 1600x1200x16bpp 0x0121, 0x0121, 3200, { sizeof(VIDEO_MODE_INFORMATION), 0, 1600, 1200, 3200, 1, 16, 1, 320, 240, 8, 8, 8, 0x0000f800, // BGR 5:6:5 0x000007e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 1920x1080x16bpp 0x0121, 0x0121, 3840, { sizeof(VIDEO_MODE_INFORMATION), 0, 1920, 1080, 3840, 1, 16, 1, 320, 240, 8, 8, 8, 0x0000f800, // BGR 5:6:5 0x000007e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 1920x1200x16bpp 0x0121, 0x0121, 3840, { sizeof(VIDEO_MODE_INFORMATION), 0, 1920, 1200, 3840, 1, 16, 1, 320, 240, 8, 8, 8, 0x0000f800, // BGR 5:6:5 0x000007e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 320x200x15bpp 0x0111, 0x0211, 640, { sizeof(VIDEO_MODE_INFORMATION), 0, 320, 200, 640, 1, 15, 1, 320, 240, 8, 8, 8, 0x00007c00, // BGR 5:5:5 0x000003e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 320x240x15bpp 0x0111, 0x0211, 640, { sizeof(VIDEO_MODE_INFORMATION), 0, 320, 240, 640, 1, 15, 1, 320, 240, 8, 8, 8, 0x00007c00, // BGR 5:5:5 0x000003e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 512x384x15bpp 0x0111, 0x0211, 1024, { sizeof(VIDEO_MODE_INFORMATION), 0, 512, 384, 1024, 1, 15, 1, 320, 240, 8, 8, 8, 0x00007c00, // BGR 5:5:5 0x000003e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 640x400x15bpp 0x0111, 0x0211, 1280, { sizeof(VIDEO_MODE_INFORMATION), 0, 640, 400, 1280, 1, 15, 1, 320, 240, 8, 8, 8, 0x00007c00, // BGR 5:5:5 0x000003e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 640x480x15bpp 0x0111, 0x0211, 1280, { sizeof(VIDEO_MODE_INFORMATION), 0, 640, 480, 1280, 1, 15, 1, 320, 240, 8, 8, 8, 0x00007c00, // BGR 5:5:5 0x000003e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 800x600x15bpp 0x0114, 0x0214, 1600, { sizeof(VIDEO_MODE_INFORMATION), 0, 800, 600, 1600, 1, 15, 1, 320, 240, 8, 8, 8, 0x00007c00, // BGR 5:5:5 0x000003e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 1024x768x15bpp 0x0117, 0x0117, 2048, { sizeof(VIDEO_MODE_INFORMATION), 0, 1024, 768, 2048, 1, 15, 1, 320, 240, 8, 8, 8, 0x00007c00, // BGR 5:5:5 0x000003e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 1152x864x15bpp 0x0118, 0x0222, 2304, { sizeof(VIDEO_MODE_INFORMATION), 0, 1152, 864, 2304, 1, 15, 1, 320, 240, 8, 8, 8, 0x00007c00, // BGR 5:5:5 0x000003e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 1280x800x15bpp 0x011A, 0x021A, 2560, { sizeof(VIDEO_MODE_INFORMATION), 0, 1280, 800, 2560, 1, 15, 1, 320, 240, 8, 8, 8, 0x00007c00, // BGR 5:5:5 0x000003e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 1280x960x15bpp 0x011A, 0x021A, 2560, { sizeof(VIDEO_MODE_INFORMATION), 0, 1280, 960, 2560, 1, 15, 1, 320, 240, 8, 8, 8, 0x00007c00, // BGR 5:5:5 0x000003e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 1280x1024x15bpp 0x011A, 0x021A, 2560, { sizeof(VIDEO_MODE_INFORMATION), 0, 1280, 1024, 2560, 1, 15, 1, 320, 240, 8, 8, 8, 0x00007c00, // BGR 5:5:5 0x000003e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 1600x1000x15bpp 0x0121, 0x0121, 3200, { sizeof(VIDEO_MODE_INFORMATION), 0, 1600, 1000, 3200, 1, 15, 1, 320, 240, 8, 8, 8, 0x00007c00, // BGR 5:5:5 0x000003e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 1600x1024x15bpp 0x0121, 0x0121, 3200, { sizeof(VIDEO_MODE_INFORMATION), 0, 1600, 1024, 3200, 1, 15, 1, 320, 240, 8, 8, 8, 0x00007c00, // BGR 5:5:5 0x000003e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 1600x1200x15bpp 0x0121, 0x0121, 3200, { sizeof(VIDEO_MODE_INFORMATION), 0, 1600, 1200, 3200, 1, 15, 1, 320, 240, 8, 8, 8, 0x00007c00, // BGR 5:5:5 0x000003e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 1920x1080x15bpp 0x0121, 0x0121, 3840, { sizeof(VIDEO_MODE_INFORMATION), 0, 1920, 1080, 3840, 1, 15, 1, 320, 240, 8, 8, 8, 0x00007c00, // BGR 5:5:5 0x000003e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 1920x1200x15bpp 0x0121, 0x0121, 3840, { sizeof(VIDEO_MODE_INFORMATION), 0, 1920, 1200, 3840, 1, 15, 1, 320, 240, 8, 8, 8, 0x00007c00, // BGR 5:5:5 0x000003e0, 0x0000001f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 640x480x12bpp 0x0112, 0x0220, 2560, { sizeof(VIDEO_MODE_INFORMATION), 0, 640, 480, 2560, 1, 12, 1, 320, 240, 8, 8, 8, 0x000f0000, // BGR 4:4:4 0x00000f00, 0x0000000f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 800x600x12bpp 0x0115, 0x0221, 3200, { sizeof(VIDEO_MODE_INFORMATION), 0, 800, 600, 3200, 1, 12, 1, 320, 240, 8, 8, 8, 0x000f0000, // BGR 4:4:4 0x00000f00, 0x0000000f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 1024x768x12bpp 0x0118, 0x0222, 4096, { sizeof(VIDEO_MODE_INFORMATION), 0, 1024, 768, 4096, 1, 12, 1, 320, 240, 8, 8, 8, 0x000f0000, // BGR 4:4:4 0x00000f00, 0x0000000f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 1152x864x12bpp 0x0118, 0x0222, 4608, { sizeof(VIDEO_MODE_INFORMATION), 0, 1152, 864, 4608, 1, 12, 1, 320, 240, 8, 8, 8, 0x000f0000, // BGR 4:4:4 0x00000f00, 0x0000000f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 1280x960x12bpp 0x011B, 0x011B, 5120, { sizeof(VIDEO_MODE_INFORMATION), 0, 1280, 960, 5120, 1, 12, 1, 320, 240, 8, 8, 8, 0x000f0000, // BGR 4:4:4 0x00000f00, 0x0000000f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 1280x1024x12bpp 0x011B, 0x011B, 5120, { sizeof(VIDEO_MODE_INFORMATION), 0, 1280, 1024, 5120, 1, 12, 1, 320, 240, 8, 8, 8, 0x000f0000, // BGR 4:4:4 0x00000f00, 0x0000000f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 1600x1200x12bpp 0x0122, 0x0122, 6400, { sizeof(VIDEO_MODE_INFORMATION), 0, 1600, 1200, 6400, 1, 12, 1, 320, 240, 8, 8, 8, 0x000f0000, // BGR 4:4:4 0x00000f00, 0x0000000f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 1920x1080x12bpp 0x0122, 0x0122, 7680, { sizeof(VIDEO_MODE_INFORMATION), 0, 1920, 1080, 7680, 1, 12, 1, 320, 240, 8, 8, 8, 0x000f0000, // BGR 4:4:4 0x00000f00, 0x0000000f, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 320x200x32bpp 0x0112, 0x0220, 1280, { sizeof(VIDEO_MODE_INFORMATION), 0, 320, 200, 1280, 1, 32, 1, 320, 240, 8, 8, 8, 0x00ff0000, // BGR 8:8:8 0x0000ff00, 0x000000ff, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 320x240x32bpp 0x0112, 0x0220, 1280, { sizeof(VIDEO_MODE_INFORMATION), 0, 320, 240, 1280, 1, 32, 1, 320, 240, 8, 8, 8, 0x00ff0000, // BGR 8:8:8 0x0000ff00, 0x000000ff, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 512x384x32bpp 0x0112, 0x0220, 2048, { sizeof(VIDEO_MODE_INFORMATION), 0, 512, 384, 2048, 1, 32, 1, 320, 240, 8, 8, 8, 0x00ff0000, // BGR 8:8:8 0x0000ff00, 0x000000ff, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 640x400x32bpp 0x0112, 0x0220, 2560, { sizeof(VIDEO_MODE_INFORMATION), 0, 640, 400, 2560, 1, 32, 1, 320, 240, 8, 8, 8, 0x00ff0000, // BGR 8:8:8 0x0000ff00, 0x000000ff, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 640x480x32bpp 0x0112, 0x0220, 2560, { sizeof(VIDEO_MODE_INFORMATION), 0, 640, 480, 2560, 1, 32, 1, 320, 240, 8, 8, 8, 0x00ff0000, // BGR 8:8:8 0x0000ff00, 0x000000ff, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 800x600x32bpp 0x0115, 0x0221, 3200, { sizeof(VIDEO_MODE_INFORMATION), 0, 800, 600, 3200, 1, 32, 1, 320, 240, 8, 8, 8, 0x00ff0000, // BGR 8:8:8 0x0000ff00, 0x000000ff, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 1024x768x32bpp 0x0118, 0x0222, 4096, { sizeof(VIDEO_MODE_INFORMATION), 0, 1024, 768, 4096, 1, 32, 1, 320, 240, 8, 8, 8, 0x00ff0000, // BGR 8:8:8 0x0000ff00, 0x000000ff, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 1152x864x32bpp 0x0118, 0x0222, 4608, { sizeof(VIDEO_MODE_INFORMATION), 0, 1152, 864, 4608, 1, 32, 1, 320, 240, 8, 8, 8, 0x00ff0000, // BGR 8:8:8 0x0000ff00, 0x000000ff, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 1280x800x32bpp 0x011B, 0x011B, 5120, { sizeof(VIDEO_MODE_INFORMATION), 0, 1280, 800, 5120, 1, 32, 1, 320, 240, 8, 8, 8, 0x00ff0000, // BGR 8:8:8 0x0000ff00, 0x000000ff, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 1280x960x32bpp 0x011B, 0x011B, 5120, { sizeof(VIDEO_MODE_INFORMATION), 0, 1280, 960, 5120, 1, 32, 1, 320, 240, 8, 8, 8, 0x00ff0000, // BGR 8:8:8 0x0000ff00, 0x000000ff, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 1280x1024x32bpp 0x011B, 0x011B, 5120, { sizeof(VIDEO_MODE_INFORMATION), 0, 1280, 1024, 5120, 1, 32, 1, 320, 240, 8, 8, 8, 0x00ff0000, // BGR 8:8:8 0x0000ff00, 0x000000ff, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 1600x1000x32bpp 0x0122, 0x0122, 6400, { sizeof(VIDEO_MODE_INFORMATION), 0, 1600, 1000, 6400, 1, 32, 1, 320, 240, 8, 8, 8, 0x00ff0000, // BGR 8:8:8 0x0000ff00, 0x000000ff, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 1600x1024x32bpp 0x0122, 0x0122, 6400, { sizeof(VIDEO_MODE_INFORMATION), 0, 1600, 1024, 6400, 1, 32, 1, 320, 240, 8, 8, 8, 0x00ff0000, // BGR 8:8:8 0x0000ff00, 0x000000ff, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 1600x1200x32bpp 0x0122, 0x0122, 6400, { sizeof(VIDEO_MODE_INFORMATION), 0, 1600, 1200, 6400, 1, 32, 1, 320, 240, 8, 8, 8, 0x00ff0000, // BGR 8:8:8 0x0000ff00, 0x000000ff, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 1920x1080x32bpp 0x0122, 0x0122, 7680, { sizeof(VIDEO_MODE_INFORMATION), 0, 1920, 1080, 7680, 1, 32, 1, 320, 240, 8, 8, 8, 0x00ff0000, // BGR 8:8:8 0x0000ff00, 0x000000ff, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 1920x1200x32bpp 0x0122, 0x0122, 7680, { sizeof(VIDEO_MODE_INFORMATION), 0, 1920, 1200, 7680, 1, 32, 1, 320, 240, 8, 8, 8, 0x00ff0000, // BGR 8:8:8 0x0000ff00, 0x000000ff, VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, } }, { // 640x480x24bpp 0, // 'Contiguous' Int 10 mode number (for high-colour) (UNUSED) 0, // 'Noncontiguous' Int 10 mode number (UNUSED) 1920, // 'Contiguous' screen stride (640 by 3 bytes/pixel) { sizeof(VIDEO_MODE_INFORMATION), // Size of the mode informtion structure 0, // Mode index used in setting the mode // (filled in later) 640, // X Resolution, in pixels 480, // Y Resolution, in pixels 1920, // 'Noncontiguous' screen stride, // in bytes (distance between the // start point of two consecutive // scan lines, in bytes) 1, // Number of video memory planes 24, // Number of bits per plane 1, // Screen Frequency, in Hertz ('1' // means use hardware default) 320, // Horizontal size of screen in millimeters 240, // Vertical size of screen in millimeters 8, // Number Red pixels in DAC 8, // Number Green pixels in DAC 8, // Number Blue pixels in DAC 0x00ff0000, // Mask for Red Pixels in non-palette modes 0x0000ff00, // Mask for Green Pixels in non-palette modes 0x000000ff, // Mask for Blue Pixels in non-palette modes VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, // Mode description flags. }, }, { // 800x600x24bpp 0, // 'Contiguous' Int 10 mode number (for high-colour) (UNUSED) 0, // 'Noncontiguous' Int 10 mode number (UNUSED) 2400, // 'Contiguous' screen stride (800 by 3 bytes/pixel) { sizeof(VIDEO_MODE_INFORMATION), // Size of the mode informtion structure 0, // Mode index used in setting the mode // (filled in later) 800, // X Resolution, in pixels 600, // Y Resolution, in pixels 2400, // 'Noncontiguous' screen stride, // in bytes (distance between the // start point of two consecutive // scan lines, in bytes) 1, // Number of video memory planes 24, // Number of bits per plane 1, // Screen Frequency, in Hertz ('1' // means use hardware default) 320, // Horizontal size of screen in millimeters 240, // Vertical size of screen in millimeters 8, // Number Red pixels in DAC 8, // Number Green pixels in DAC 8, // Number Blue pixels in DAC 0x00ff0000, // Mask for Red Pixels in non-palette modes 0x0000ff00, // Mask for Green Pixels in non-palette modes 0x000000ff, // Mask for Blue Pixels in non-palette modes VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, // Mode description flags. }, }, { // 1024x768x24bpp 0, // 'Contiguous' Int 10 mode number (for high-colour) (UNUSED) 0, // 'Noncontiguous' Int 10 mode number (UNUSED) 3072, // 'Contiguous' screen stride (1024 by 3 bytes/pixel) { sizeof(VIDEO_MODE_INFORMATION), // Size of the mode informtion structure 0, // Mode index used in setting the mode // (filled in later) 1024, // X Resolution, in pixels 768, // Y Resolution, in pixels 3072, // 'Noncontiguous' screen stride, // in bytes (distance between the // start point of two consecutive // scan lines, in bytes) 1, // Number of video memory planes 24, // Number of bits per plane 1, // Screen Frequency, in Hertz ('1' // means use hardware default) 320, // Horizontal size of screen in millimeters 240, // Vertical size of screen in millimeters 8, // Number Red pixels in DAC 8, // Number Green pixels in DAC 8, // Number Blue pixels in DAC 0x00ff0000, // Mask for Red Pixels in non-palette modes 0x0000ff00, // Mask for Green Pixels in non-palette modes 0x000000ff, // Mask for Blue Pixels in non-palette modes VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, // Mode description flags. }, }, { // 1152x864x24bpp 0, // 'Contiguous' Int 10 mode number (for high-colour) (UNUSED) 0, // 'Noncontiguous' Int 10 mode number (UNUSED) 3456, // 'Contiguous' screen stride (1152 by 3 bytes/pixel) { sizeof(VIDEO_MODE_INFORMATION), // Size of the mode informtion structure 0, // Mode index used in setting the mode // (filled in later) 1152, // X Resolution, in pixels 864, // Y Resolution, in pixels 3072, // 'Noncontiguous' screen stride, // in bytes (distance between the // start point of two consecutive // scan lines, in bytes) 1, // Number of video memory planes 24, // Number of bits per plane 1, // Screen Frequency, in Hertz ('1' // means use hardware default) 320, // Horizontal size of screen in millimeters 240, // Vertical size of screen in millimeters 8, // Number Red pixels in DAC 8, // Number Green pixels in DAC 8, // Number Blue pixels in DAC 0x00ff0000, // Mask for Red Pixels in non-palette modes 0x0000ff00, // Mask for Green Pixels in non-palette modes 0x000000ff, // Mask for Blue Pixels in non-palette modes VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, // Mode description flags. }, }, { // 1280x1024x24bpp 0, // 'Contiguous' Int 10 mode number (for high-colour) (UNUSED) 0, // 'Noncontiguous' Int 10 mode number (UNUSED) 3840, // 'Contiguous' screen stride (1280 by 3 bytes/pixel) { sizeof(VIDEO_MODE_INFORMATION), // Size of the mode informtion structure 0, // Mode index used in setting the mode // (filled in later) 3840, // X Resolution, in pixels 1280, // Y Resolution, in pixels 1024, // 'Noncontiguous' screen stride, // in bytes (distance between the // start point of two consecutive // scan lines, in bytes) 1, // Number of video memory planes 24, // Number of bits per plane 1, // Screen Frequency, in Hertz ('1' // means use hardware default) 320, // Horizontal size of screen in millimeters 240, // Vertical size of screen in millimeters 8, // Number Red pixels in DAC 8, // Number Green pixels in DAC 8, // Number Blue pixels in DAC 0x00ff0000, // Mask for Red Pixels in non-palette modes 0x0000ff00, // Mask for Green Pixels in non-palette modes 0x000000ff, // Mask for Blue Pixels in non-palette modes VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, // Mode description flags. }, }, { // 1600x1200x24bpp 0, // 'Contiguous' Int 10 mode number (for high-colour) (UNUSED) 0, // 'Noncontiguous' Int 10 mode number (UNUSED) 4800, // 'Contiguous' screen stride (1600 by 3 bytes/pixel) { sizeof(VIDEO_MODE_INFORMATION), // Size of the mode informtion structure 0, // Mode index used in setting the mode // (filled in later) 1600, // X Resolution, in pixels 1280, // Y Resolution, in pixels 4800, // 'Noncontiguous' screen stride, // in bytes (distance between the // start point of two consecutive // scan lines, in bytes) 1, // Number of video memory planes 24, // Number of bits per plane 1, // Screen Frequency, in Hertz ('1' // means use hardware default) 320, // Horizontal size of screen in millimeters 240, // Vertical size of screen in millimeters 8, // Number Red pixels in DAC 8, // Number Green pixels in DAC 8, // Number Blue pixels in DAC 0x00ff0000, // Mask for Red Pixels in non-palette modes 0x0000ff00, // Mask for Green Pixels in non-palette modes 0x000000ff, // Mask for Blue Pixels in non-palette modes VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, // Mode description flags. }, }, }; const ULONG NumPerm3VideoModes = sizeof(Perm3Modes) / sizeof(Perm3Modes[0]); ULONG Perm3DepthList [] = { 8, 15, 16, 24, 32 }; #define Perm3DepthCnt (sizeof(Perm3DepthList) / sizeof(Perm3DepthList[0])) /*+++ Data format is: Horizontal total time (chars) Horizontal right border + front porch (chars) Horizontal sync time (chars) Horizontal back porch + left border (chars) Horizontal sync polarity Vertical total time (lines) Vertical bottom border + front porch (lines) Vertical sync time (lines) Vertical back porch + top border (lines) Vertical sync polarity Pixel clock ---*/ #define NEG 0 #define POS 1 // // This is our hybrid of DMTF modes and GTF modes which we call the 'VESA' // mode list: // TIMING_INFO VESA_LIST[] = { // The first entry in the list must be 640x480x60 as this is the mode Windows // defaults to when it has somehow been set to an invalid or non-existant mode. {{ 640, 480, 60}, { 100, 2, 12, 6, NEG, 525,10, 2, 33, NEG, 251750}}, // DMTF // Don't bother for now. // {{ 640, 480, 72}, { 104, 3, 5, 16, NEG, 520, 9, 3, 28, NEG, 315000}}, // DMTF {{ 640, 480, 75}, { 105, 2, 8, 15, NEG, 500, 1, 3, 16, NEG, 315000}}, // DMTF {{ 640, 480, 85}, { 104, 7, 7, 10, NEG, 509, 1, 3, 25, NEG, 360000}}, // DMTF {{ 640, 480,100}, { 106, 5, 8, 13, NEG, 509, 1, 3, 25, NEG, 431630}}, // GTF // <--320 x 400--> <--320 x 200--> <320x400/2> // 320x200x60 has an fH of 25kHz which is too slow for most monitors // {{ 320, 200, 60}, { 48, 0, 4, 4, NEG, 208, 1, 3, 4, POS, 47810}}, // GTF (hybrid of 320 x 400) {{ 320, 200, 75}, { 50, 1, 4, 5, NEG, 210, 1, 3, 6, POS, 62700}}, // GTF (hybrid of 320 x 400) // {{ 320, 200, 85}, { 52, 2, 4, 6, NEG, 211, 1, 3, 7, POS, 74435}}, // GTF (hybrid of 320 x 400) // {{ 320, 200,100}, { 52, 2, 4, 6, NEG, 213, 1, 3, 9, POS, 88190}}, // GTF (hybrid of 320 x 400) // {{ 320, 240, 60}, { 50, 1, 4, 5, NEG, 249, 1, 3, 5, POS, 59640}}, // GTF (hybrid of 320 x 480) {{ 320, 240, 75}, { 52, 2, 4, 6, NEG, 251, 1, 3, 7, POS, 78310}}, // GTF (hybrid of 320 x 480) // {{ 320, 240, 85}, { 52, 2, 4, 6, NEG, 253, 1, 3, 9, POS, 89285}}, // GTF (hybrid of 320 x 480) // {{ 320, 240,100}, { 52, 2, 4, 6, NEG, 255, 1, 3, 11, POS, 105870}}, // GTF (hybrid of 320 x 480) // DX does not work as these require a screen stride. // {{ 400, 300, 60}, { 64, 2, 5, 7, NEG, 311, 1, 3, 7, POS, 86580}}, // GTF (hybrid of 400 x 600) // {{ 400, 300, 75}, { 66, 3, 5, 8, NEG, 314, 1, 3, 10, POS, 113040}}, // GTF (hybrid of 400 x 600) // {{ 400, 300, 85}, { 66, 3, 5, 8, NEG, 316, 1, 3, 12, POS, 133230}}, // GTF (hybrid of 400 x 600) // {{ 400, 300,100}, { 66, 3, 5, 8, NEG, 319, 1, 3, 15, POS, 158220}}, // GTF (hybrid of 400 x 600) // 512x384x60 has an fH of 24kHz which is too slow for most monitors // {{ 512, 384, 60}, { 78, 1, 6, 7, NEG, 398, 1, 3, 10, POS, 149010}}, // GTF {{ 512, 384, 75}, { 80, 2, 6, 8, NEG, 402, 1, 3, 14, POS, 192960}}, // GTF // {{ 512, 384, 85}, { 82, 2, 7, 9, NEG, 404, 1, 3, 16, POS, 225270}}, // GTF // {{ 512, 384,100}, { 82, 2, 7, 9, NEG, 407, 1, 3, 19, POS, 266990}}, // GTF // Don't bother for now. // {{ 640, 350, 85}, { 104, 4, 8, 12, POS, 445,32, 3, 60, NEG, 315000}}, // DMTF // {{ 640, 400, 60}, { 98, 1, 8, 9, NEG, 415, 1, 3, 11, POS, 195220}}, // GTF {{ 640, 400, 75}, { 100, 2, 8, 10, NEG, 418, 1, 3, 14, POS, 250800}}, // GTF // {{ 640, 400, 85}, { 104, 4, 8, 12, NEG, 445, 1, 3, 41, POS, 315000}}, // DMTF // {{ 640, 400,100}, { 104, 4, 8, 12, NEG, 424, 1, 3, 20, POS, 352770}}, // GTF // DX does not work as this requires a screen stride. // {{ 720, 400, 85}, { 104, 4, 8, 12, NEG, 446, 1, 3, 42, POS, 355000}}, // DMTF // Don't bother for now. // {{ 800, 600, 56}, { 128, 3, 9, 16, POS, 625, 1, 2, 22, POS, 360000}}, // DMTF {{ 800, 600, 60}, { 132, 5, 16, 11, POS, 628, 1, 4, 23, POS, 400000}}, // DMTF // {{ 800, 600, 72}, { 130, 7, 15, 8, POS, 666,37, 6, 23, POS, 500000}}, // DMTF {{ 800, 600, 75}, { 132, 2, 10, 20, POS, 625, 1, 3, 21, POS, 495000}}, // DMTF {{ 800, 600, 85}, { 131, 4, 8, 19, POS, 631, 1, 3, 27, POS, 562500}}, // DMTF {{ 800, 600,100}, { 134, 6, 11, 17, NEG, 636, 1, 3, 32, POS, 681790}}, // GTF // DX does not work as these require a screen stride. // {{ 856, 480, 60}, { 133, 2, 11, 13, NEG, 497, 1, 3, 13, POS, 317280}}, // GTF // {{ 856, 480, 75}, { 137, 4, 11, 15, NEG, 502, 1, 3, 18, POS, 412640}}, // GTF // {{ 856, 480, 85}, { 139, 5, 11, 16, NEG, 505, 1, 3, 21, POS, 477330}}, // GTF // {{ 856, 480,100}, { 141, 6, 11, 17, NEG, 509, 1, 3, 25, POS, 574150}}, // GTF {{1024, 768, 60}, { 168, 3, 17, 20, NEG, 806, 3, 6, 29, NEG, 650000}}, // DMTF // Don't bother for now. // {{1024, 768, 70}, { 166, 3, 17, 18, NEG, 806, 3, 6, 29, NEG, 750000}}, // DMTF {{1024, 768, 75}, { 164, 2, 12, 22, POS, 800, 1, 3, 28, POS, 787500}}, // DMTF {{1024, 768, 85}, { 172, 6, 12, 26, POS, 808, 1, 3, 36, POS, 945000}}, // DMTF {{1024, 768,100}, { 174, 9, 14, 23, NEG, 814, 1, 3, 42, POS, 1133090}}, // GTF {{1024, 768,120}, { 176, 10, 14, 24, NEG, 823, 1, 3, 51, POS, 1390540}}, // GTF {{1152, 864, 60}, { 190, 8, 15, 23, NEG, 895, 1, 3, 27, POS, 816240}}, // GTF {{1152, 864, 75}, { 200, 8, 16, 32, POS, 900, 1, 3, 32, POS, 1080000}}, // DMTF {{1152, 864, 85}, { 194, 9, 16, 25, NEG, 907, 1, 3, 39, POS, 1196510}}, // GTF {{1152, 864,100}, { 196, 10, 16, 26, NEG, 915, 1, 3, 47, POS, 1434720}}, // GTF {{1152, 864,120}, { 198, 11, 16, 27, NEG, 926, 1, 3, 58, POS, 1760140}}, // GTF {{1280, 960, 60}, { 225, 12, 14, 39, POS, 1000, 1, 3, 36, POS, 1080000}}, // DMTF {{1280, 960, 75}, { 216, 11, 17, 28, NEG, 1002, 1, 3, 38, POS, 1298590}}, // GTF {{1280, 960, 85}, { 216, 8, 20, 28, POS, 1011, 1, 3, 47, POS, 1485000}}, // DMTF {{1280, 960,100}, { 220, 12, 18, 30, NEG, 1017, 1, 3, 53, POS, 1789920}}, // GTF {{1280, 960,120}, { 220, 12, 18, 30, NEG, 1029, 1, 3, 65, POS, 2173250}}, // GTF {{1280,1024, 60}, { 211, 6, 14, 31, POS, 1066, 1, 3, 38, POS, 1080000}}, // DMTF {{1280,1024, 75}, { 211, 2, 18, 31, POS, 1066, 1, 3, 38, POS, 1350000}}, // DMTF {{1280,1024, 85}, { 216, 8, 20, 28, POS, 1072, 1, 3, 44, POS, 1575000}}, // DMTF {{1280,1024,100}, { 220, 12, 18, 30, NEG, 1085, 1, 3, 57, POS, 1909600}}, // GTF {{1280,1024,120}, { 222, 13, 18, 31, NEG, 1097, 1, 3, 69, POS, 2337930}}, // GTF {{1600,1200, 60}, { 270, 8, 24, 38, POS, 1250, 1, 3, 46, POS, 1620000}}, // DMTF // Don't bother for now. // {{1600,1200, 65}, { 270, 8, 24, 38, POS, 1250, 1, 3, 46, POS, 1755000}}, // DMTF // {{1600,1200, 70}, { 270, 8, 24, 38, POS, 1250, 1, 3, 46, POS, 1890000}}, // DMTF {{1600,1200, 75}, { 270, 8, 24, 38, POS, 1250, 1, 3, 46, POS, 2025000}}, // DMTF {{1600,1200, 85}, { 270, 8, 24, 38, POS, 1250, 1, 3, 46, POS, 2295000}}, // DMTF {{1600,1200,100}, { 276, 16, 22, 38, NEG, 1271, 1, 3, 67, POS, 2806370}}, // GTF {{1920,1080, 60}, { 322, 15, 26, 41, NEG, 1118, 1, 3, 34, POS, 1727980}}, // GTF {{1920,1080, 75}, { 326, 17, 26, 43, NEG, 1128, 1, 3, 44, POS, 2206370}}, // GTF {{1920,1080, 85}, { 328, 18, 26, 44, NEG, 1134, 1, 3, 50, POS, 2529270}}, // GTF {{1920,1080,100}, { 330, 19, 26, 45, NEG, 1144, 1, 3, 60, POS, 3020160}}, // GTF {{1920,1200, 60}, { 324, 16, 26, 42, NEG, 1242, 1, 3, 38, POS, 1931560}}, // GTF {{1920,1200, 75}, { 328, 18, 26, 44, NEG, 1253, 1, 3, 49, POS, 2465900}}, // GTF {{1920,1200, 85}, { 330, 19, 26, 45, NEG, 1260, 1, 3, 56, POS, 2827440}}, // GTF {{1920,1200,100}, { 332, 19, 27, 46, NEG, 1271, 1, 3, 67, POS, 3375780}}, // GTF }; TIMING_INFO SGIDFP_LIST[] = { {{1600,1024, 60}, { 302, 30, 24, 48, POS, 1067, 3, 3, 37, POS, 1069100}}, }; #undef NEG #undef POS #define VESA_COUNT (sizeof(VESA_LIST) / sizeof(VESA_LIST[0])) #define SGIDFP_COUNT (sizeof(SGIDFP_LIST) / sizeof(SGIDFP_LIST[0])) #if defined(ALLOC_PRAGMA) #pragma data_seg() #endif // // THE CODE // ======== // #if defined(ALLOC_PRAGMA) #pragma alloc_text(PAGE,GetVideoTiming) #pragma alloc_text(PAGE,CopyMonitorTimings) #pragma alloc_text(PAGE,GrowTimingList) #pragma alloc_text(PAGE,testExtendRanges) #pragma alloc_text(PAGE,BuildFrequencyList) #pragma alloc_text(PAGE,BuildFrequencyListForSGIDFP) #pragma alloc_text(PAGE,BuildFrequencyListFromVESA) #endif // ALLOC_PRAGMA BOOLEAN GetVideoTiming( PHW_DEVICE_EXTENSION hwDeviceExtension, ULONG xRes, ULONG yRes, ULONG Freq, ULONG Depth, VESA_TIMING_STANDARD *VESATimings ) /*+++ Routine Description: Given a width, height and frequency this function will return a VESA timing information. The information is extracted from the VESA_LIST. ---*/ { TIMING_INFO *list = hwDeviceExtension->monitorInfo.timingList; ULONG count = hwDeviceExtension->monitorInfo.timingNum; ULONG i; BOOLEAN retVal; retVal = FALSE; // // Loop through the table looking for a match // for( i = 0; !retVal && (i < count); i++ ) { // // Comparewidth, height and frequency // if( list[i].basic.width == xRes && list[i].basic.height == yRes && list[i].basic.refresh == Freq ) { // // We got a match // *VESATimings = list[i].vesa; retVal = TRUE; } } // // Fix up pixel clock, just in case it hasn't been set // if (retVal && VESATimings->pClk == 0) { VideoDebugPrint((0, "Perm3: Pixel clock is zero - recalculating!")); VESATimings->pClk = (8 * VESATimings->HTot * VESATimings->VTot * Freq) / 100; } return retVal; } BOOLEAN CopyMonitorTimings( PVOID HwDeviceExtension, MONITOR_INFO *srcMI, MONITOR_INFO *mi ) { ULONG i, j, k; VP_STATUS status; if( mi->timingList ) { VideoPortReleaseBuffer(HwDeviceExtension, mi->timingList); mi->timingList = NULL; } if( mi->frequencyTable ) { VideoPortReleaseBuffer(HwDeviceExtension, mi->frequencyTable); mi->frequencyTable = NULL; } *mi = *srcMI; status = VideoPortAllocateBuffer(HwDeviceExtension, sizeof(*mi->timingList ) * (mi->timingNum + 1), &(mi->timingList)); if (status != NO_ERROR) { return FALSE; } status = VideoPortAllocateBuffer(HwDeviceExtension, sizeof(*mi->frequencyTable) * (mi->timingNum + 1) * Perm3DepthCnt, &(mi->frequencyTable)); if (status != NO_ERROR) { VideoPortReleaseBuffer(HwDeviceExtension, mi->timingList); mi->timingList = NULL; return FALSE; } VideoPortZeroMemory(mi->frequencyTable, sizeof(*mi->frequencyTable) * (mi->timingNum + 1) * Perm3DepthCnt ); mi->timingMax = mi->timingNum; for( i = k = 0; i < mi->timingNum; i++ ) { mi->timingList[i] = srcMI->timingList[i]; for( j = 0; j < Perm3DepthCnt; j++, k++ ) { mi->frequencyTable[k].BitsPerPel = Perm3DepthList[j]; mi->frequencyTable[k].ScreenWidth = mi->timingList[i].basic.width; mi->frequencyTable[k].ScreenHeight = mi->timingList[i].basic.height; mi->frequencyTable[k].ScreenFrequency = mi->timingList[i].basic.refresh; mi->frequencyTable[k].PixelClock = mi->timingList[i].vesa.pClk; } } // // Ensure the lists are terminted // mi->frequencyTable[k].BitsPerPel = 0; mi->timingList[i].basic.width = 0; return TRUE; } BOOLEAN GrowTimingList( PVOID HwDeviceExtension, MONITOR_INFO *mi ) { ULONG newSize = mi->timingNum + 100; TIMING_INFO *newList; VP_STATUS status; status = VideoPortAllocateBuffer(HwDeviceExtension, sizeof(*newList) * newSize, &(newList)); if (status != NO_ERROR) { return FALSE; } VideoPortZeroMemory( newList, sizeof(*newList) * newSize ); VideoPortMoveMemory( newList, mi->timingList, sizeof(*newList) * mi->timingNum ); if( mi->timingList ) VideoPortReleaseBuffer( HwDeviceExtension, mi->timingList ); mi->timingList = newList; mi->timingMax = newSize; return TRUE; } VOID testExtendRanges( MONITOR_INFO *mi, TIMING_INFO *ti, FREQUENCIES *freq ) { if( mi->flags & MI_FLAGS_FUDGED_VH ) { if( freq->fH > mi->fhMax ) mi->fhMax = freq->fH; if( freq->fH < mi->fhMin ) mi->fhMin = freq->fH; if( freq->fV > mi->fvMax ) mi->fvMax = freq->fV; if( freq->fV < mi->fvMin ) mi->fvMin = freq->fV; } if( mi->flags & MI_FLAGS_FUDGED_PCLK ) { if( freq->pClk < mi->pClkMin ) { mi->pClkMin = freq->pClk; } if( freq->pClk > mi->pClkMax ) { mi->pClkMax = freq->pClk; } } if( mi->flags & MI_FLAGS_FUDGED_XY ) { if( ti->basic.width < mi->xMin ) { mi->xMin = ti->basic.width; } if( ti->basic.width > mi->xMax ) { mi->xMax = ti->basic.width; } if( ti->basic.height < mi->yMin ) { mi->yMin = ti->basic.height; } if( ti->basic.height > mi->yMax ) { mi->yMax = ti->basic.height; } } } BOOLEAN BuildFrequencyList( PHW_DEVICE_EXTENSION hwDeviceExtension, MONITOR_INFO *mi ) { MONITOR_INFO newMI; ULONG i, j, k; BOOLEAN bRet = FALSE; BOOLEAN bRet1; UCHAR EdidBuffer[256]; VideoPortZeroMemory(&newMI, sizeof(newMI)); newMI.flags = mi->flags; newMI.flags |= ( MI_FLAGS_FUDGED_VH | MI_FLAGS_FUDGED_PCLK | MI_FLAGS_FUDGED_XY); newMI.fhMin = 0xFFFFFFFF; newMI.fhMax = 0; newMI.fvMin = 0xFFFFFFFF; newMI.fvMax = 0; newMI.pClkMin = 0xFFFFFFFF; newMI.pClkMax = 0; newMI.xMin = 0xFFFFFFFF; newMI.xMax = 0; newMI.yMin = 0xFFFFFFFF; newMI.yMax = 0; if ((hwDeviceExtension->deviceInfo.SubsystemId == SUBDEVICEID_P3_VX1_1600SW) && GetDFPEdid(hwDeviceExtension, EdidBuffer, sizeof(EdidBuffer))) { bRet1 = BuildFrequencyListForSGIDFP(&newMI, hwDeviceExtension); } else { bRet1 = BuildFrequencyListFromVESA(&newMI, hwDeviceExtension); } if (bRet1) { // // Copy the lists about: // if(CopyMonitorTimings((PVOID)hwDeviceExtension, &newMI, mi)) bRet = TRUE; } if(newMI.timingList) { VideoPortReleaseBuffer((PVOID)hwDeviceExtension, newMI.timingList); newMI.timingList = NULL; } return bRet; } BOOLEAN BuildFrequencyListFromVESA( MONITOR_INFO *mi, PHW_DEVICE_EXTENSION hwDeviceExtension ) { ULONG realCount = VESA_COUNT; TIMING_INFO *realList = VESA_LIST; TIMING_INFO *ti; FREQUENCIES freq; // // loop through the list of resolutions // for( mi->timingNum = 0; mi->timingNum < realCount; mi->timingNum++ ) { if( mi->timingNum >= mi->timingMax ) { if(!GrowTimingList((PVOID)hwDeviceExtension, mi)) { return FALSE; } } ti = &mi->timingList[mi->timingNum]; *ti = realList[mi->timingNum]; if( !ti->vesa.pClk ) { ti->vesa.pClk = ((ti->vesa.HTot * ti->vesa.VTot * 8) / 100) * ti->basic.refresh; } freq.pClk = ti->vesa.pClk; freq.fH = (freq.pClk * 100) / (ti->vesa.HTot * 8); freq.fV = (freq.pClk * 100) / (ti->vesa.HTot * ti->vesa.VTot * 8); testExtendRanges( mi, ti, &freq ); } return TRUE; } BOOLEAN BuildFrequencyListForSGIDFP( MONITOR_INFO *mi, PHW_DEVICE_EXTENSION hwDeviceExtension ) { ULONG realCount = SGIDFP_COUNT; TIMING_INFO *realList = SGIDFP_LIST; TIMING_INFO *ti; FREQUENCIES freq; // // Loop through the list of resolutions // for( mi->timingNum = 0; mi->timingNum < realCount; mi->timingNum++ ) { if( mi->timingNum >= mi->timingMax ) { if(!GrowTimingList((PVOID)hwDeviceExtension, mi)) { return FALSE; } } ti = &mi->timingList[mi->timingNum]; *ti = realList[mi->timingNum]; if( !ti->vesa.pClk ) { ti->vesa.pClk = ((ti->vesa.HTot * ti->vesa.VTot * 8) / 100) * ti->basic.refresh; } freq.pClk = ti->vesa.pClk; freq.fH = (freq.pClk * 100) / (ti->vesa.HTot * 8); freq.fV = (freq.pClk * 100) / (ti->vesa.HTot * ti->vesa.VTot * 8); testExtendRanges( mi, ti, &freq ); } return TRUE; }