VirtualBox

Ignore:
Timestamp:
Dec 18, 2012 2:05:27 PM (12 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
82834
Message:

wddm/display-only: fix auto-resize

Location:
trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/common
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/common/VBoxMPCommon.h

    r42217 r44149  
    3333void VBoxMPCmnInitCustomVideoModes(PVBOXMP_DEVEXT pExt);
    3434VIDEO_MODE_INFORMATION* VBoxMPCmnGetCustomVideoModeInfo(ULONG ulIndex);
    35 VIDEO_MODE_INFORMATION* VBoxMPCmnGetVideoModeInfo(ULONG ulIndex);
    3635
    3736#ifdef VBOX_XPDM_MINIPORT
     37VIDEO_MODE_INFORMATION* VBoxMPCmnGetVideoModeInfo(ULONG ulIndex);
    3838VIDEO_MODE_INFORMATION* VBoxMPXpdmCurrentVideoMode(PVBOXMP_DEVEXT pExt);
    3939ULONG VBoxMPXpdmGetVideoModesCount();
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/mp/common/VBoxMPVidModes.cpp

    r44040 r44149  
    2424#endif
    2525#include <wchar.h>
     26#include <VBox/Hardware/VBoxVideoVBE.h>
    2627
    2728#ifdef VBOX_WITH_WDDM
     
    3031
    3132/* Custom video modes which are being read from registry at driver startup. */
    32 static VIDEO_MODE_INFORMATION g_CustomVideoModes[64] = { 0 };
    33 
     33static VIDEO_MODE_INFORMATION g_CustomVideoModes[VBOX_VIDEO_MAX_SCREENS] = { 0 };
     34
     35#ifdef VBOX_XPDM_MINIPORT
    3436/* Standart video modes list.
    35  * Additional space is reserved for custom video modes for 64 guest monitors.
     37 * Additional space is reserved for custom video modes for VBOX_VIDEO_MAX_SCREENS guest monitors.
    3638 * The custom video mode index is alternating and 2 indexes are reserved for the last custom mode.
    3739 */
    38 static VIDEO_MODE_INFORMATION g_VideoModes[VBOXMP_MAX_VIDEO_MODES + 64 + 2] = { 0 };
     40static VIDEO_MODE_INFORMATION g_VideoModes[VBOXMP_MAX_VIDEO_MODES + VBOX_VIDEO_MAX_SCREENS + 2] = { 0 };
    3941
    4042/* Number of available video modes, set by VBoxMPCmnBuildVideoModesTable. */
    4143static uint32_t g_NumVideoModes = 0;
     44#endif
    4245
    4346static BOOLEAN
     
    210213}
    211214
     215#ifdef VBOX_XPDM_MINIPORT
    212216VIDEO_MODE_INFORMATION* VBoxMPCmnGetVideoModeInfo(ULONG ulIndex)
    213217{
    214218    return (ulIndex<RT_ELEMENTS(g_VideoModes)) ? &g_VideoModes[ulIndex] : NULL;
    215219}
     220#endif
    216221
    217222static bool VBoxMPVideoModesMatch(const PVIDEO_MODE_INFORMATION pMode1, const PVIDEO_MODE_INFORMATION pMode2)
     
    963968    Assert(pModes->cModes<=RT_ELEMENTS(pModes->aModes));
    964969
     970    if (!VBoxMPIsStartingUp(pExt, VidPnTargetId))
     971    {
     972        /* make sure we keep the current mode to avoid mode flickering */
     973        PVBOXWDDM_ALLOC_DATA pAllocData = pExt->aSources[VidPnTargetId].pPrimaryAllocation ?
     974                  &pExt->aSources[VidPnTargetId].pPrimaryAllocation->AllocData
     975                : &pExt->aSources[VidPnTargetId].AllocData;
     976        if (pModes->cModes < RT_ELEMENTS(pModes->aModes))
     977        {
     978            int foundIdx;
     979            VBoxFillVidModeInfo(&pModes->aModes[pModes->cModes], pAllocData->SurfDesc.width, pAllocData->SurfDesc.height, pAllocData->SurfDesc.bpp, 1/*index*/, 0);
     980            if ((foundIdx=VBoxMPFindVideoMode(pModes->aModes, pModes->cModes, &pModes->aModes[pModes->cModes]))>=0)
     981            {
     982                pModes->iPreferredMode = foundIdx;
     983            }
     984            else
     985            {
     986                pModes->iPreferredMode = pModes->cModes;
     987                ++pModes->cModes;
     988            }
     989
     990#ifdef VBOX_WITH_8BPP_MODES
     991            int bytesPerPixel=1;
     992#else
     993            int bytesPerPixel=2;
     994#endif
     995            for (; bytesPerPixel<=4; bytesPerPixel++)
     996            {
     997                int bpp = 8*bytesPerPixel;
     998
     999                if (bpp == pAllocData->SurfDesc.bpp)
     1000                    continue;
     1001
     1002                if (!VBoxMPValidateVideoModeParamsGuest(pExt, VidPnTargetId,
     1003                        pAllocData->SurfDesc.width, pAllocData->SurfDesc.height,
     1004                        bpp))
     1005                    continue;
     1006
     1007                if (pModes->cModes >= RT_ELEMENTS(pModes->aModes))
     1008                {
     1009                    WARN(("ran out of video modes 2"));
     1010                    break;
     1011                }
     1012
     1013                VBoxFillVidModeInfo(&pModes->aModes[pModes->cModes],
     1014                                        pAllocData->SurfDesc.width, pAllocData->SurfDesc.height,
     1015                                        bpp, pModes->cModes, 0);
     1016                if (VBoxMPFindVideoMode(pModes->aModes, pModes->cModes, &pModes->aModes[pModes->cModes]) < 0)
     1017                {
     1018                    ++pModes->cModes;
     1019                }
     1020            }
     1021        }
     1022        else
     1023        {
     1024            WARN(("ran out of video modes 1"));
     1025        }
     1026    }
     1027
    9651028    /* Check if there's a pending display change request for this adapter */
    9661029    VIDEO_MODE_INFORMATION specialMode;
Note: See TracChangeset for help on using the changeset viewer.

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