Changeset 72000 in vbox
- Timestamp:
- Apr 24, 2018 9:08:58 AM (7 years ago)
- svn:sync-xref-src-repo-rev:
- 122260
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxDispIf.cpp
r71860 r72000 98 98 static DWORD vboxDispIfWddmResizeDisplay(PCVBOXDISPIF const pIf, UINT Id, BOOL fEnable, DISPLAY_DEVICE * paDisplayDevices, 99 99 DEVMODE *paDeviceModes, UINT devModes); 100 101 static DWORD vboxDispIfWddmResizeDisplay2(PCVBOXDISPIF const pIf, DISPLAY_DEVICE *paDisplayDevices, DEVMODE *paDeviceModes, UINT devModes); 102 100 103 static DWORD vboxDispIfResizePerform(PCVBOXDISPIF const pIf, UINT iChangedMode, BOOL fEnable, BOOL fExtDispSup, 101 104 DISPLAY_DEVICE *paDisplayDevices, DEVMODE *paDeviceModes, UINT cDevModes); … … 1441 1444 if (pIf->enmMode > VBOXDISPIF_MODE_WDDM) 1442 1445 { 1443 winEr = vboxDispIfWddmResizeDisplay(pIf, iChangedMode, fEnable, paDisplayDevices, paDeviceModes, cDevModes); 1446 if (fEnable) 1447 paDisplayDevices[iChangedMode].StateFlags |= DISPLAY_DEVICE_ACTIVE; 1448 else 1449 paDisplayDevices[iChangedMode].StateFlags &= ~DISPLAY_DEVICE_ACTIVE; 1450 1451 winEr = vboxDispIfWddmResizeDisplay2(pIf, paDisplayDevices, paDeviceModes, cDevModes); 1452 1444 1453 if (winEr != NO_ERROR) 1445 1454 WARN(("VBoxTray: (WDDM) Failed vboxDispIfWddmResizeDisplay winEr %d\n", winEr)); … … 1687 1696 WARN(("VBoxTray: (WDDM) Failed vboxDispIfWddmEnableDisplay mode winEr %d\n", winEr)); 1688 1697 } 1698 1699 return winEr; 1700 } 1701 1702 static DWORD vboxDispIfWddmResizeDisplay2(PCVBOXDISPIF const pIf, DISPLAY_DEVICE *paDisplayDevices, DEVMODE *paDeviceModes, UINT devModes) 1703 { 1704 RT_NOREF(pIf, paDeviceModes); 1705 VBOXDISPIF_WDDM_DISPCFG DispCfg; 1706 DWORD winEr = ERROR_SUCCESS; 1707 UINT idx; 1708 int iPath; 1709 1710 winEr = vboxDispIfWddmDcCreate(&DispCfg, QDC_ALL_PATHS); 1711 1712 if (winEr != ERROR_SUCCESS) 1713 { 1714 WARN(("VBoxTray: (WDDM) Failed vboxDispIfWddmDcCreate\n")); 1715 return winEr; 1716 } 1717 1718 for (idx = 0; idx < devModes; idx++) 1719 { 1720 DEVMODE *pDeviceMode = &paDeviceModes[idx]; 1721 1722 if (paDisplayDevices[idx].StateFlags & DISPLAY_DEVICE_ACTIVE) 1723 { 1724 DISPLAYCONFIG_PATH_INFO *pPathInfo; 1725 1726 iPath = vboxDispIfWddmDcSearchPath(&DispCfg, idx, idx); 1727 1728 if (iPath < 0) 1729 { 1730 WARN(("VBoxTray:(WDDM) Unexpected iPath(%d) between src(%d) and tgt(%d)\n", iPath, idx, idx)); 1731 continue; 1732 } 1733 1734 pPathInfo = &DispCfg.pPathInfoArray[iPath]; 1735 1736 if (pPathInfo->flags & DISPLAYCONFIG_PATH_ACTIVE) 1737 { 1738 UINT iSrcMode, iTgtMode; 1739 DISPLAYCONFIG_SOURCE_MODE *pSrcMode; 1740 DISPLAYCONFIG_TARGET_MODE *pTgtMode; 1741 1742 iSrcMode = pPathInfo->sourceInfo.modeInfoIdx; 1743 iTgtMode = pPathInfo->targetInfo.modeInfoIdx; 1744 1745 if (iSrcMode >= DispCfg.cModeInfoArray || iTgtMode >= DispCfg.cModeInfoArray) 1746 { 1747 WARN(("VBoxTray:(WDDM) Unexpected iSrcMode(%d) and/or iTgtMode(%d)\n", iSrcMode, iTgtMode)); 1748 continue; 1749 } 1750 1751 pSrcMode = &DispCfg.pModeInfoArray[iSrcMode].sourceMode; 1752 pTgtMode = &DispCfg.pModeInfoArray[iTgtMode].targetMode; 1753 1754 if (pDeviceMode->dmFields & DM_PELSWIDTH) 1755 { 1756 pSrcMode->width = pDeviceMode->dmPelsWidth; 1757 pTgtMode->targetVideoSignalInfo.activeSize.cx = pDeviceMode->dmPelsWidth; 1758 pTgtMode->targetVideoSignalInfo.totalSize.cx = pDeviceMode->dmPelsWidth; 1759 } 1760 1761 if (pDeviceMode->dmFields & DM_PELSHEIGHT) 1762 { 1763 pSrcMode->height = pDeviceMode->dmPelsHeight; 1764 pTgtMode->targetVideoSignalInfo.activeSize.cy = pDeviceMode->dmPelsHeight; 1765 pTgtMode->targetVideoSignalInfo.totalSize.cy = pDeviceMode->dmPelsHeight; 1766 } 1767 1768 if (pDeviceMode->dmFields & DM_POSITION) 1769 { 1770 pSrcMode->position.x = pDeviceMode->dmPosition.x; 1771 pSrcMode->position.y = pDeviceMode->dmPosition.y; 1772 } 1773 1774 if (pDeviceMode->dmFields & DM_BITSPERPEL) 1775 { 1776 switch (pDeviceMode->dmBitsPerPel) 1777 { 1778 case 32: 1779 pSrcMode->pixelFormat = DISPLAYCONFIG_PIXELFORMAT_32BPP; 1780 break; 1781 case 24: 1782 pSrcMode->pixelFormat = DISPLAYCONFIG_PIXELFORMAT_24BPP; 1783 break; 1784 case 16: 1785 pSrcMode->pixelFormat = DISPLAYCONFIG_PIXELFORMAT_16BPP; 1786 break; 1787 case 8: 1788 pSrcMode->pixelFormat = DISPLAYCONFIG_PIXELFORMAT_8BPP; 1789 break; 1790 default: 1791 LogRel(("VBoxTray: (WDDM) invalid bpp %d, using 32bpp instead\n", pDeviceMode->dmBitsPerPel)); 1792 pSrcMode->pixelFormat = DISPLAYCONFIG_PIXELFORMAT_32BPP; 1793 break; 1794 } 1795 } 1796 } 1797 else 1798 { 1799 DISPLAYCONFIG_MODE_INFO *pModeInfo, *pModeInfoNew; 1800 1801 pModeInfo = (DISPLAYCONFIG_MODE_INFO *)realloc(DispCfg.pModeInfoArray, (DispCfg.cModeInfoArray + 2) * sizeof(DISPLAYCONFIG_MODE_INFO)); 1802 1803 if (!pModeInfo) 1804 { 1805 WARN(("VBoxTray:(WDDM) Unable to re-allocate DispCfg.pModeInfoArray\n")); 1806 continue; 1807 } 1808 1809 DispCfg.pModeInfoArray = pModeInfo; 1810 1811 *pPathInfo = DispCfg.pPathInfoArray[0]; 1812 pPathInfo->sourceInfo.id = idx; 1813 pPathInfo->targetInfo.id = idx; 1814 1815 pModeInfoNew = &pModeInfo[DispCfg.cModeInfoArray]; 1816 1817 pModeInfoNew->infoType = DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE; 1818 pModeInfoNew->id = idx; 1819 pModeInfoNew->adapterId = pModeInfo[0].adapterId; 1820 pModeInfoNew->sourceMode.width = pDeviceMode->dmPelsWidth; 1821 pModeInfoNew->sourceMode.height = pDeviceMode->dmPelsHeight; 1822 pModeInfoNew->sourceMode.pixelFormat = DISPLAYCONFIG_PIXELFORMAT_32BPP; 1823 pModeInfoNew->sourceMode.position.x = pDeviceMode->dmPosition.x; 1824 pModeInfoNew->sourceMode.position.y = pDeviceMode->dmPosition.y; 1825 pPathInfo->sourceInfo.modeInfoIdx = DispCfg.cModeInfoArray; 1826 1827 pModeInfoNew++; 1828 pModeInfoNew->infoType = DISPLAYCONFIG_MODE_INFO_TYPE_TARGET; 1829 pModeInfoNew->id = idx; 1830 pModeInfoNew->adapterId = pModeInfo[0].adapterId; 1831 pModeInfoNew->targetMode = pModeInfo[0].targetMode; 1832 pModeInfoNew->targetMode.targetVideoSignalInfo.activeSize.cx = pDeviceMode->dmPelsWidth; 1833 pModeInfoNew->targetMode.targetVideoSignalInfo.totalSize.cx = pDeviceMode->dmPelsWidth; 1834 pModeInfoNew->targetMode.targetVideoSignalInfo.activeSize.cy = pDeviceMode->dmPelsHeight; 1835 pModeInfoNew->targetMode.targetVideoSignalInfo.totalSize.cy = pDeviceMode->dmPelsHeight; 1836 pPathInfo->targetInfo.modeInfoIdx = DispCfg.cModeInfoArray + 1; 1837 1838 DispCfg.cModeInfoArray += 2; 1839 } 1840 } 1841 else 1842 { 1843 iPath = vboxDispIfWddmDcSearchActivePath(&DispCfg, idx, idx); 1844 1845 if (iPath >= 0) 1846 { 1847 DispCfg.pPathInfoArray[idx].flags &= ~DISPLAYCONFIG_PATH_ACTIVE; 1848 } 1849 } 1850 } 1851 1852 UINT fSetFlags = SDC_USE_SUPPLIED_DISPLAY_CONFIG; 1853 winEr = vboxDispIfWddmDcSet(&DispCfg, fSetFlags | SDC_VALIDATE); 1854 if (winEr != ERROR_SUCCESS) 1855 { 1856 WARN(("VBoxTray:(WDDM) pfnSetDisplayConfig Failed to validate winEr %d.\n", winEr)); 1857 fSetFlags |= SDC_ALLOW_CHANGES; 1858 } 1859 1860 winEr = vboxDispIfWddmDcSet(&DispCfg, fSetFlags | SDC_SAVE_TO_DATABASE | SDC_APPLY); 1861 if (winEr != ERROR_SUCCESS) 1862 { 1863 WARN(("VBoxTray:(WDDM) pfnSetDisplayConfig Failed to validate winEr %d.\n", winEr)); 1864 } 1865 1866 vboxDispIfWddmDcTerm(&DispCfg); 1689 1867 1690 1868 return winEr;
Note:
See TracChangeset
for help on using the changeset viewer.