VirtualBox

Ignore:
Timestamp:
Oct 21, 2009 8:25:33 AM (15 years ago)
Author:
vboxsync
Message:

Windows guest video driver: 800x600 is always a valid video mode.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/Graphics/Miniport/VBoxVideo.cpp

    r23793 r23926  
    211211    VP_STATUS status = 0;
    212212
     213    /* Always add 800x600 video modes. Windows XP+ needs at least 800x600 resolution
     214     * and fallbacks to 800x600x4bpp VGA mode if the driver did not report suitable modes.
     215     * This resolution could be rejected by a low resolution host (netbooks, etc).
     216     */
     217    int cBytesPerPixel;
     218    for (cBytesPerPixel = 1; cBytesPerPixel <= 4; cBytesPerPixel++)
     219    {
     220        int cBitsPerPixel = cBytesPerPixel * 8; /* 8, 16, 24, 32 */
     221
     222#ifndef VBOX_WITH_8BPP_MODES
     223        if (cBitsPerPixel == 8)
     224        {
     225             continue;
     226        }
     227#endif /* !VBOX_WITH_8BPP_MODES */
     228
     229        /* does the mode fit into the VRAM? */
     230        if (800 * 600 * cBytesPerPixel > (LONG)vramSize)
     231        {
     232            continue;
     233        }
     234
     235        VideoModes[gNumVideoModes].Length                       = sizeof(VIDEO_MODE_INFORMATION);
     236        VideoModes[gNumVideoModes].ModeIndex                    = gNumVideoModes + 1;
     237        VideoModes[gNumVideoModes].VisScreenWidth               = 800;
     238        VideoModes[gNumVideoModes].VisScreenHeight              = 600;
     239        VideoModes[gNumVideoModes].ScreenStride                 = 800 * cBytesPerPixel;
     240        VideoModes[gNumVideoModes].NumberOfPlanes               = 1;
     241        VideoModes[gNumVideoModes].BitsPerPlane                 = cBitsPerPixel;
     242        VideoModes[gNumVideoModes].Frequency                    = 60;
     243        VideoModes[gNumVideoModes].XMillimeter                  = 320;
     244        VideoModes[gNumVideoModes].YMillimeter                  = 240;
     245        switch (cBytesPerPixel)
     246        {
     247            case 1:
     248            {
     249                VideoModes[gNumVideoModes].NumberRedBits                = 6;
     250                VideoModes[gNumVideoModes].NumberGreenBits              = 6;
     251                VideoModes[gNumVideoModes].NumberBlueBits               = 6;
     252                VideoModes[gNumVideoModes].RedMask                      = 0;
     253                VideoModes[gNumVideoModes].GreenMask                    = 0;
     254                VideoModes[gNumVideoModes].BlueMask                     = 0;
     255                VideoModes[gNumVideoModes].AttributeFlags               = VIDEO_MODE_GRAPHICS | VIDEO_MODE_COLOR | VIDEO_MODE_NO_OFF_SCREEN |
     256                                                                          VIDEO_MODE_PALETTE_DRIVEN | VIDEO_MODE_MANAGED_PALETTE;
     257            } break;
     258            case 2:
     259            {
     260                VideoModes[gNumVideoModes].NumberRedBits                = 5;
     261                VideoModes[gNumVideoModes].NumberGreenBits              = 6;
     262                VideoModes[gNumVideoModes].NumberBlueBits               = 5;
     263                VideoModes[gNumVideoModes].RedMask                      = 0xF800;
     264                VideoModes[gNumVideoModes].GreenMask                    = 0x7E0;
     265                VideoModes[gNumVideoModes].BlueMask                     = 0x1F;
     266                VideoModes[gNumVideoModes].AttributeFlags               = VIDEO_MODE_GRAPHICS | VIDEO_MODE_COLOR | VIDEO_MODE_NO_OFF_SCREEN;
     267            } break;
     268            case 3:
     269            {
     270                VideoModes[gNumVideoModes].NumberRedBits                = 8;
     271                VideoModes[gNumVideoModes].NumberGreenBits              = 8;
     272                VideoModes[gNumVideoModes].NumberBlueBits               = 8;
     273                VideoModes[gNumVideoModes].RedMask                      = 0xFF0000;
     274                VideoModes[gNumVideoModes].GreenMask                    = 0xFF00;
     275                VideoModes[gNumVideoModes].BlueMask                     = 0xFF;
     276                VideoModes[gNumVideoModes].AttributeFlags               = VIDEO_MODE_GRAPHICS | VIDEO_MODE_COLOR | VIDEO_MODE_NO_OFF_SCREEN;
     277            } break;
     278            default:
     279            case 4:
     280            {
     281                VideoModes[gNumVideoModes].NumberRedBits                = 8;
     282                VideoModes[gNumVideoModes].NumberGreenBits              = 8;
     283                VideoModes[gNumVideoModes].NumberBlueBits               = 8;
     284                VideoModes[gNumVideoModes].RedMask                      = 0xFF0000;
     285                VideoModes[gNumVideoModes].GreenMask                    = 0xFF00;
     286                VideoModes[gNumVideoModes].BlueMask                     = 0xFF;
     287                VideoModes[gNumVideoModes].AttributeFlags               = VIDEO_MODE_GRAPHICS | VIDEO_MODE_COLOR | VIDEO_MODE_NO_OFF_SCREEN;
     288            } break;
     289        }
     290        VideoModes[gNumVideoModes].VideoMemoryBitmapWidth       = 800;
     291        VideoModes[gNumVideoModes].VideoMemoryBitmapHeight      = 600;
     292        VideoModes[gNumVideoModes].DriverSpecificAttributeFlags = 0;
     293
     294        /* a new mode has been filled in */
     295        ++gNumVideoModes;
     296    }
     297
    213298    /*
    214299     * Query the y-offset from the host
     
    231316        if (resolutionMatrix[matrixIndex].xRes * resolutionMatrix[matrixIndex].yRes * 1 > (LONG)vramSize)
    232317        {
     318            ++matrixIndex;
     319            continue;
     320        }
     321
     322        if (yOffset == 0 && resolutionMatrix[matrixIndex].xRes == 800 && resolutionMatrix[matrixIndex].yRes == 600)
     323        {
     324            /* This mode was already added. */
    233325            ++matrixIndex;
    234326            continue;
     
    290382        }
    291383
     384        if (yOffset == 0 && resolutionMatrix[matrixIndex].xRes == 800 && resolutionMatrix[matrixIndex].yRes == 600)
     385        {
     386            /* This mode was already added. */
     387            ++matrixIndex;
     388            continue;
     389        }
     390
    292391        /* does the host like that mode? */
    293392        if (!vboxLikesVideoMode(resolutionMatrix[matrixIndex].xRes, resolutionMatrix[matrixIndex].yRes - yOffset, 16))
     
    343442        }
    344443
     444        if (yOffset == 0 && resolutionMatrix[matrixIndex].xRes == 800 && resolutionMatrix[matrixIndex].yRes == 600)
     445        {
     446            /* This mode was already added. */
     447            ++matrixIndex;
     448            continue;
     449        }
     450
    345451        /* does the host like that mode? */
    346452        if (!vboxLikesVideoMode(resolutionMatrix[matrixIndex].xRes, resolutionMatrix[matrixIndex].yRes - yOffset, 24))
     
    392498        if (resolutionMatrix[matrixIndex].xRes * resolutionMatrix[matrixIndex].yRes * 4 > (LONG)vramSize)
    393499        {
     500            ++matrixIndex;
     501            continue;
     502        }
     503
     504        if (yOffset == 0 && resolutionMatrix[matrixIndex].xRes == 800 && resolutionMatrix[matrixIndex].yRes == 600)
     505        {
     506            /* This mode was already added. */
    394507            ++matrixIndex;
    395508            continue;
     
    561674     * registry key add it to the modes table.
    562675     */
    563     uint32_t xres, yres, bpp = 0;
     676    uint32_t xres = 0, yres = 0, bpp = 0;
    564677    if (   (   vboxQueryDisplayRequest(&xres, &yres, &bpp)
    565678            && (xres || yres || bpp))
     
    570683        if (DeviceExtension->CurrentMode == 0)
    571684        {
    572             xres = gCustomXRes;
    573             yres = gCustomYRes;
    574             bpp  = gCustomBPP;
     685            /* Use the stored custom resolution values only if nothing was read from host.
     686             * The custom mode might be not valid anymore and would block any hints from host.
     687             */
     688            if (!xres)
     689                xres = gCustomXRes;
     690            if (!yres)
     691                yres = gCustomYRes;
     692            if (!bpp)
     693                bpp  = gCustomBPP;
    575694            dprintf(("VBoxVideo: using stored custom resolution %dx%dx%d\n", xres, yres, bpp));
    576695        }
     
    589708                bpp  = DeviceExtension->CurrentModeBPP;
    590709        }
     710
     711        /* Use a default value. */
     712        if (!bpp)
     713            bpp = 32;
    591714
    592715        /* does the host like that mode? */
     
    719842                     xres, yres, bpp));
    720843    }
    721 #ifdef DEBUG
     844#ifdef LOG_ENABLED
    722845    {
    723846        int i;
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette