| 1673 | } |
| 1674 | |
| 1675 | bool CDX11VideoProcessor::ToggleHDR(const DisplayConfig_t& displayConfig, const bool bEnableAdvancedColor) |
| 1676 | { |
| 1677 | DLog(L"ToggleHDR() : {} for '{}'", bEnableAdvancedColor, displayConfig.displayName); |
| 1678 | |
| 1679 | auto GetCurrentDisplayMode = [](LPCWSTR lpszDeviceName) -> std::optional<DEVMODEW> { |
| 1680 | DEVMODEW devmode = {}; |
| 1681 | devmode.dmSize = sizeof(DEVMODEW); |
| 1682 | auto ret = EnumDisplaySettingsW(lpszDeviceName, ENUM_CURRENT_SETTINGS, &devmode); |
| 1683 | if (ret) { |
| 1684 | return devmode; |
| 1685 | } |
| 1686 | |
| 1687 | return {}; |
| 1688 | }; |
| 1689 | |
| 1690 | auto beforeModeOpt = GetCurrentDisplayMode(displayConfig.displayName); |
| 1691 | |
| 1692 | LONG ret = 1; |
| 1693 | |
| 1694 | if (IsWindows11_24H2OrGreater()) { |
| 1695 | DISPLAYCONFIG_SET_HDR_STATE setHdrState = {}; |
| 1696 | setHdrState.header.type = static_cast<DISPLAYCONFIG_DEVICE_INFO_TYPE>(DISPLAYCONFIG_DEVICE_INFO_SET_HDR_STATE); |
| 1697 | setHdrState.header.size = sizeof(setHdrState); |
| 1698 | setHdrState.header.adapterId = displayConfig.modeTarget.adapterId; |
| 1699 | setHdrState.header.id = displayConfig.modeTarget.id; |
| 1700 | setHdrState.enableHdr = bEnableAdvancedColor ? 1 : 0; |
| 1701 | |
| 1702 | ret = DisplayConfigSetDeviceInfo(&setHdrState.header); |
| 1703 | DLogIf(ERROR_SUCCESS != ret, L"ToggleHDR() : DisplayConfigSetDeviceInfo(DISPLAYCONFIG_SET_HDR_STATE) with '{}' failed with error {}", bEnableAdvancedColor, HR2Str(HRESULT_FROM_WIN32(ret))); |
| 1704 | } else { |
| 1705 | DISPLAYCONFIG_SET_ADVANCED_COLOR_STATE setColorState = {}; |
| 1706 | setColorState.header.type = DISPLAYCONFIG_DEVICE_INFO_SET_ADVANCED_COLOR_STATE; |
| 1707 | setColorState.header.size = sizeof(setColorState); |
| 1708 | setColorState.header.adapterId = displayConfig.modeTarget.adapterId; |
| 1709 | setColorState.header.id = displayConfig.modeTarget.id; |
| 1710 | setColorState.enableAdvancedColor = bEnableAdvancedColor ? 1 : 0; |
| 1711 | |
| 1712 | ret = DisplayConfigSetDeviceInfo(&setColorState.header); |
| 1713 | DLogIf(ERROR_SUCCESS != ret, L"ToggleHDR() : DisplayConfigSetDeviceInfo(DISPLAYCONFIG_SET_ADVANCED_COLOR_STATE) with '{}' failed with error {}", bEnableAdvancedColor, HR2Str(HRESULT_FROM_WIN32(ret))); |
| 1714 | } |
| 1715 | |
| 1716 | if (ret == ERROR_SUCCESS) { |
| 1717 | m_bDisplayModeChangeAfterHDRToggle = true; |
| 1718 | |
| 1719 | if (beforeModeOpt.has_value()) { |
| 1720 | auto afterModeOpt = GetCurrentDisplayMode(displayConfig.displayName); |
| 1721 | if (afterModeOpt.has_value()) { |
| 1722 | auto& beforeMode = *beforeModeOpt; |
| 1723 | auto& afterMode = *afterModeOpt; |
| 1724 | if (beforeMode.dmPelsWidth != afterMode.dmPelsWidth || beforeMode.dmPelsHeight != afterMode.dmPelsHeight |
| 1725 | || beforeMode.dmBitsPerPel != afterMode.dmBitsPerPel || beforeMode.dmDisplayFrequency != afterMode.dmDisplayFrequency) { |
| 1726 | DLog(L"ToggleHDR() : Display mode changed from {}x{}@{} to {}x{}@{}, restoring", |
| 1727 | beforeMode.dmPelsWidth, beforeMode.dmPelsHeight, beforeMode.dmDisplayFrequency, |
| 1728 | afterMode.dmPelsWidth, afterMode.dmPelsHeight, afterMode.dmDisplayFrequency); |
| 1729 | |
| 1730 | auto ret = ChangeDisplaySettingsExW(displayConfig.displayName, &beforeMode, nullptr, CDS_FULLSCREEN, nullptr); |
| 1731 | DLogIf(DISP_CHANGE_SUCCESSFUL != ret, L"ToggleHDR() : ChangeDisplaySettingsExW() failed with error {}", HR2Str(HRESULT_FROM_WIN32(ret))); |
| 1732 |
nothing calls this directly
no test coverage detected