VirtualBox

Ignore:
Timestamp:
Jun 19, 2018 10:35:18 AM (7 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
123108
Message:

WDDM/VBoxTray: bugref:8444, applying mode hints to all displays at once, Vista version

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxDispIf.cpp

    r72372 r72611  
    17001700}
    17011701
    1702 BOOL vboxDispIfWddmResizeDisplayWin7(PCVBOXDISPIF const pIf, uint32_t cDispDef, const VMMDevDisplayDef *paDispDef)
     1702BOOL VBoxDispIfResizeDisplayWin7(PCVBOXDISPIF const pIf, uint32_t cDispDef, const VMMDevDisplayDef *paDispDef)
    17031703{
    17041704    const VMMDevDisplayDef* pDispDef;
     
    17691769                pTgtMode = &DispCfg.pModeInfoArray[iTgtMode].targetMode;
    17701770
    1771                 pSrcMode->width =
    1772                     pTgtMode->targetVideoSignalInfo.activeSize.cx =
    1773                     pTgtMode->targetVideoSignalInfo.totalSize.cx  = pDispDef->cx;
    1774 
    1775                 pSrcMode->height =
    1776                     pTgtMode->targetVideoSignalInfo.activeSize.cy =
    1777                     pTgtMode->targetVideoSignalInfo.totalSize.cy  = pDispDef->cy;
    1778 
    1779                 pSrcMode->position.x = pDispDef->xOrigin;
    1780                 pSrcMode->position.y = pDispDef->yOrigin;
    1781 
    1782                 switch (pDispDef->cBitsPerPixel)
     1771                if (pDispDef->fDisplayFlags & VMMDEV_DISPLAY_CX)
    17831772                {
    1784                 case 32:
    1785                     pSrcMode->pixelFormat = DISPLAYCONFIG_PIXELFORMAT_32BPP;
    1786                     break;
    1787                 case 24:
    1788                     pSrcMode->pixelFormat = DISPLAYCONFIG_PIXELFORMAT_24BPP;
    1789                     break;
    1790                 case 16:
    1791                     pSrcMode->pixelFormat = DISPLAYCONFIG_PIXELFORMAT_16BPP;
    1792                     break;
    1793                 case 8:
    1794                     pSrcMode->pixelFormat = DISPLAYCONFIG_PIXELFORMAT_8BPP;
    1795                     break;
    1796                 default:
    1797                     LogRel(("VBoxTray: (WDDM) invalid bpp %d, using 32bpp instead\n", pDispDef->cBitsPerPixel));
    1798                     pSrcMode->pixelFormat = DISPLAYCONFIG_PIXELFORMAT_32BPP;
    1799                     break;
     1773                    pSrcMode->width =
     1774                        pTgtMode->targetVideoSignalInfo.activeSize.cx =
     1775                        pTgtMode->targetVideoSignalInfo.totalSize.cx = pDispDef->cx;
     1776                }
     1777
     1778                if (pDispDef->fDisplayFlags & VMMDEV_DISPLAY_CY)
     1779                {
     1780                    pSrcMode->height =
     1781                        pTgtMode->targetVideoSignalInfo.activeSize.cy =
     1782                        pTgtMode->targetVideoSignalInfo.totalSize.cy = pDispDef->cy;
     1783                }
     1784
     1785                if (pDispDef->fDisplayFlags & VMMDEV_DISPLAY_ORIGIN)
     1786                {
     1787                    pSrcMode->position.x = pDispDef->xOrigin;
     1788                    pSrcMode->position.y = pDispDef->yOrigin;
     1789                }
     1790
     1791                if (pDispDef->fDisplayFlags & VMMDEV_DISPLAY_BPP)
     1792                {
     1793                    switch (pDispDef->cBitsPerPixel)
     1794                    {
     1795                    case 32:
     1796                        pSrcMode->pixelFormat = DISPLAYCONFIG_PIXELFORMAT_32BPP;
     1797                        break;
     1798                    case 24:
     1799                        pSrcMode->pixelFormat = DISPLAYCONFIG_PIXELFORMAT_24BPP;
     1800                        break;
     1801                    case 16:
     1802                        pSrcMode->pixelFormat = DISPLAYCONFIG_PIXELFORMAT_16BPP;
     1803                        break;
     1804                    case 8:
     1805                        pSrcMode->pixelFormat = DISPLAYCONFIG_PIXELFORMAT_8BPP;
     1806                        break;
     1807                    default:
     1808                        LogRel(("VBoxTray: (WDDM) invalid bpp %d, using 32bpp instead\n", pDispDef->cBitsPerPixel));
     1809                        pSrcMode->pixelFormat = DISPLAYCONFIG_PIXELFORMAT_32BPP;
     1810                        break;
     1811                    }
    18001812                }
    18011813            }
     
    18471859        else
    18481860        {
    1849                 DispCfg.pPathInfoArray[id].flags &= ~DISPLAYCONFIG_PATH_ACTIVE;
     1861                DispCfg.pPathInfoArray[iPath].flags &= ~DISPLAYCONFIG_PATH_ACTIVE;
    18501862        }
    18511863    }
     
    18551867    if (winEr != ERROR_SUCCESS)
    18561868    {
    1857         WARN(("VBoxTray:(WDDM) pfnSetDisplayConfig Failed to validate winEr %d.\n", winEr));
     1869        WARN(("VBoxTray:(WDDM) pfnSetDisplayConfig Failed to VALIDATE winEr %d.\n", winEr));
    18581870        fSetFlags |= SDC_ALLOW_CHANGES;
    18591871    }
     
    18621874    if (winEr != ERROR_SUCCESS)
    18631875    {
    1864         WARN(("VBoxTray:(WDDM) pfnSetDisplayConfig Failed to validate winEr %d.\n", winEr));
     1876        WARN(("VBoxTray:(WDDM) pfnSetDisplayConfig Failed to SET, winEr %d.\n", winEr));
     1877
     1878        vboxDispIfWddmDcSettingsInvalidateModeIndeces(&DispCfg);
     1879        winEr = vboxDispIfWddmDcSet(&DispCfg, SDC_TOPOLOGY_SUPPLIED | SDC_ALLOW_PATH_ORDER_CHANGES | SDC_APPLY);
     1880        if (winEr != ERROR_SUCCESS)
     1881        {
     1882            WARN(("VBoxTray:(WDDM) pfnSetDisplayConfig Failed to APPLY TOPOLOGY ONLY, winEr %d.\n", winEr));
     1883            winEr = vboxDispIfWddmDcSet(&DispCfg, SDC_USE_SUPPLIED_DISPLAY_CONFIG | SDC_APPLY);
     1884            if (winEr != ERROR_SUCCESS)
     1885            {
     1886                WARN(("VBoxTray:(WDDM) pfnSetDisplayConfig Failed to APPLY ANY TOPOLOGY, winEr %d.\n", winEr));
     1887            }
     1888        }
    18651889    }
    18661890
    18671891    vboxDispIfWddmDcTerm(&DispCfg);
     1892
     1893    return (winEr == ERROR_SUCCESS);
     1894}
     1895
     1896BOOL VBoxDispIfResizeDisplayVista(PCVBOXDISPIF const pIf, uint32_t cDispDef, const VMMDevDisplayDef *paDispDef)
     1897{
     1898    const VMMDevDisplayDef* pDispDef;
     1899    VBOXDISPIF_OP Op;
     1900    DWORD winEr = ERROR_SUCCESS;
     1901    uint32_t id;
     1902    DISPLAY_DEVICE *paDisplayDevices;
     1903    DEVMODE *paDisplayModes;
     1904    RECTL *paRects;
     1905    DWORD DevNum = 0;
     1906    DWORD DevPrimaryNum = 0;
     1907    DWORD status;
     1908    DISPLAY_DEVICE *pDev;
     1909    DEVMODE *pMode;
     1910    DWORD cDisplays;
     1911
     1912    //    if (!pCtx->fAnyX)
     1913    //       Width &= 0xFFF8;
     1914
     1915    cDisplays = VBoxDisplayGetCount();
     1916
     1917    paDisplayDevices = (DISPLAY_DEVICE *)alloca(sizeof(DISPLAY_DEVICE) * cDisplays);
     1918    paDisplayModes = (DEVMODE *)alloca(sizeof(DEVMODE) * cDisplays);
     1919    paRects = (RECTL *)alloca(sizeof(RECTL) * cDisplays);
     1920
     1921    status = VBoxDisplayGetConfig(cDisplays, &DevPrimaryNum, &DevNum, paDisplayDevices, paDisplayModes);
     1922    if (status != NO_ERROR)
     1923    {
     1924        LogFlowFunc(("ResizeDisplayDevice: VBoxGetDisplayConfig failed, %d\n", status));
     1925        return FALSE;
     1926    }
     1927
     1928    if (cDisplays != DevNum)
     1929        LogFlowFunc(("ResizeDisplayDevice: NumDevices(%d) != DevNum(%d)\n", cDisplays, DevNum));
     1930
     1931    if (cDisplays != cDispDef)
     1932    {
     1933        LogFlowFunc(("ResizeDisplayDevice: cDisplays(%d) != cModeHints(%d)\n", cDisplays, cDispDef));
     1934        return FALSE;
     1935    }
     1936
     1937    vboxDispIfOpBegin(pIf, &Op);
     1938
     1939    for (id = 0; id < cDispDef; ++id)
     1940    {
     1941        pDispDef = &paDispDef[id];
     1942
     1943        if (!(pDispDef->fDisplayFlags & VMMDEV_DISPLAY_DISABLED) &&
     1944            (pDispDef->fDisplayFlags | VMMDEV_DISPLAY_CX) ||
     1945            (pDispDef->fDisplayFlags | VMMDEV_DISPLAY_CY))
     1946        {
     1947            RTRECTSIZE Size;
     1948
     1949            Size.cx = pDispDef->cx;
     1950            Size.cy = pDispDef->cy;
     1951
     1952            vboxDispIfUpdateModesWDDM(&Op, id, &Size);
     1953        }
     1954    }
     1955
     1956    vboxDispIfOpEnd(&Op);
     1957   
     1958    for (id = 0; id < cDispDef; id++)
     1959    {
     1960        DEVMODE tempDevMode;
     1961       
     1962        ZeroMemory (&tempDevMode, sizeof (tempDevMode));
     1963        tempDevMode.dmSize = sizeof(DEVMODE);
     1964       
     1965        EnumDisplaySettings((LPSTR)paDisplayDevices[id].DeviceName, 0xffffff, &tempDevMode);
     1966    }
     1967
     1968    for (id = 0; id < cDispDef; ++id)
     1969    {
     1970        pDev = &paDisplayDevices[id];
     1971        pMode = &paDisplayModes[id];
     1972        pDispDef = &paDispDef[id];
     1973
     1974        if (pDev->StateFlags & DISPLAY_DEVICE_ACTIVE)
     1975        {
     1976            if (!(pDispDef->fDisplayFlags & VMMDEV_DISPLAY_DISABLED))
     1977            {
     1978                pMode->dmFields = 0;
     1979
     1980                if (pMode->dmPosition.x != pDispDef->xOrigin || pMode->dmPosition.y != pDispDef->yOrigin)
     1981                {
     1982                    pMode->dmPosition.x = pDispDef->xOrigin;
     1983                    pMode->dmPosition.y = pDispDef->yOrigin;
     1984                    pMode->dmFields |= DM_POSITION;
     1985                }
     1986
     1987                if (pMode->dmBitsPerPel != pDispDef->cBitsPerPixel)
     1988                {
     1989                    pMode->dmBitsPerPel = pDispDef->cBitsPerPixel;
     1990                    pMode->dmFields |= DM_BITSPERPEL;
     1991                }
     1992
     1993                if (pMode->dmPelsWidth != pDispDef->cx)
     1994                {
     1995                    pMode->dmPelsWidth = pDispDef->cx;
     1996                    pMode->dmFields |= DM_PELSWIDTH;
     1997                }
     1998
     1999                if (pMode->dmPelsHeight != pDispDef->cy)
     2000                {
     2001                    pMode->dmPelsHeight = pDispDef->cy;
     2002                    pMode->dmFields |= DM_PELSHEIGHT;
     2003                }
     2004
     2005                if (pMode->dmFields)
     2006                    status = pIf->modeData.wddm.pfnChangeDisplaySettingsEx((LPSTR)pDev->DeviceName, pMode, NULL, CDS_NORESET | CDS_UPDATEREGISTRY, NULL);
     2007            }
     2008            else
     2009            {
     2010                DEVMODE tmpDevMode;
     2011
     2012                ZeroMemory(&tmpDevMode, sizeof(DEVMODE));
     2013                tmpDevMode.dmSize = sizeof(DEVMODE);
     2014                tmpDevMode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_POSITION | DM_DISPLAYFREQUENCY | DM_DISPLAYFLAGS;
     2015
     2016                status = pIf->modeData.wddm.pfnChangeDisplaySettingsEx(pDev->DeviceName, &tmpDevMode, NULL, CDS_UPDATEREGISTRY | CDS_NORESET, NULL);
     2017            }
     2018        }
     2019        else
     2020        {
     2021            pMode->dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_POSITION | DM_DISPLAYFREQUENCY | DM_DISPLAYFLAGS;
     2022
     2023            pMode->dmPosition.x = pDispDef->xOrigin;
     2024            pMode->dmPosition.y = pDispDef->yOrigin;
     2025            pMode->dmBitsPerPel = pDispDef->cBitsPerPixel;
     2026            pMode->dmPelsWidth  = pDispDef->cx;
     2027            pMode->dmPelsHeight = pDispDef->cy;
     2028
     2029            status = pIf->modeData.wddm.pfnChangeDisplaySettingsEx((LPSTR)pDev->DeviceName, pMode, NULL, CDS_NORESET | CDS_UPDATEREGISTRY, NULL);
     2030        }
     2031    }
     2032
     2033    pIf->modeData.wddm.pfnChangeDisplaySettingsEx(NULL, NULL, NULL, 0, NULL);
    18682034
    18692035    return (winEr == ERROR_SUCCESS);
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