MCPcopy Create free account
hub / github.com/Aleksoid1978/VideoRenderer / ToggleHDR

Method ToggleHDR

Source/DX11VideoProcessor.cpp:1675–1740  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1673}
1674
1675bool 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

Callers

nothing calls this directly

Calls 3

DLogFunction · 0.85
HR2StrFunction · 0.85

Tested by

no test coverage detected