Skip to content

Commit f62945e

Browse files
committed
1.3.0
Using fandangos approach to toggle HDR, which looks more reliable and doesn't need NVAPI, therefore this tool should work for AMD cards too.
1 parent d6d1d66 commit f62945e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+186
-26826
lines changed

Source/Externals/HDRController.dll

-246 KB
Binary file not shown.

Source/Externals/nvapi64.lib

-511 KB
Binary file not shown.
-323 KB
Binary file not shown.
-511 KB
Binary file not shown.
Lines changed: 155 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,181 @@
1-
#include "HDRController.h"
1+
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
2+
3+
#include <windows.h>
4+
25

6+
#include "HDRController.h"
37
#include <iostream>
4-
#include "toggle.h"
58
#include "WinUser.h"
69
#include <stdio.h>
10+
#include <winerror.h>
11+
#include <wingdi.h>
712

813

914

10-
using namespace core;
15+
#include <stdint.h>
16+
#include <cstdlib>
17+
#include <cstring>
18+
#include <conio.h>
1119

12-
static std::unique_ptr<Toggle> hdrToggle;
1320

21+
using namespace core;
1422

1523
static void showError(std::string msg)
1624
{
1725
LPCWSTR lmsg = (LPCWSTR)msg.c_str();
1826

19-
MessageBox(NULL, lmsg, L"HDR Switch Error", MB_OK | MB_ICONWARNING);
27+
MessageBox(NULL, lmsg, L"HDRController Error", MB_OK | MB_ICONWARNING);
2028
}
2129

22-
static void setHdrMode(bool enabled)
30+
31+
static void SetHDR(bool enabled)
2332
{
24-
auto status = hdrToggle->setHdrMode(enabled);
25-
if (!status.IsSuccessful)
33+
uint32_t pathCount, modeCount;
34+
35+
uint8_t set[] = { 0x0A, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x14, 0x81, 0x00, 0x00,
36+
0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 };
37+
38+
uint8_t request[] = { 0x09, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x7C, 0x6F, 0x00,
39+
0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0xDB, 0x00,
40+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00 };
41+
42+
if (ERROR_SUCCESS == GetDisplayConfigBufferSizes(QDC_ONLY_ACTIVE_PATHS, &pathCount, &modeCount))
2643
{
27-
auto msg = "Error setting hdr mode:" + status.Message;
28-
showError(msg);
44+
DISPLAYCONFIG_PATH_INFO* pathsArray = nullptr;
45+
DISPLAYCONFIG_MODE_INFO* modesArray = nullptr;
46+
47+
const size_t sizePathsArray = pathCount * sizeof(DISPLAYCONFIG_PATH_INFO);
48+
const size_t sizeModesArray = modeCount * sizeof(DISPLAYCONFIG_MODE_INFO);
49+
50+
pathsArray = static_cast<DISPLAYCONFIG_PATH_INFO*>(std::malloc(sizePathsArray));
51+
modesArray = static_cast<DISPLAYCONFIG_MODE_INFO*>(std::malloc(sizeModesArray));
52+
53+
if (pathsArray != nullptr && modesArray != nullptr)
54+
{
55+
std::memset(pathsArray, 0, sizePathsArray);
56+
std::memset(modesArray, 0, sizeModesArray);
57+
58+
if (ERROR_SUCCESS == QueryDisplayConfig(QDC_ONLY_ACTIVE_PATHS, &pathCount, pathsArray,
59+
&modeCount, modesArray, 0))
60+
{
61+
DISPLAYCONFIG_DEVICE_INFO_HEADER* setPacket =
62+
reinterpret_cast<DISPLAYCONFIG_DEVICE_INFO_HEADER*>(set);
63+
DISPLAYCONFIG_DEVICE_INFO_HEADER* requestPacket =
64+
reinterpret_cast<DISPLAYCONFIG_DEVICE_INFO_HEADER*>(request);
65+
66+
for (int i = 0; i < modeCount; i++)
67+
{
68+
if (modesArray[i].infoType == DISPLAYCONFIG_MODE_INFO_TYPE_TARGET)
69+
{
70+
setPacket->adapterId.HighPart = modesArray[i].adapterId.HighPart;
71+
setPacket->adapterId.LowPart = modesArray[i].adapterId.LowPart;
72+
setPacket->id = modesArray[i].id;
73+
74+
requestPacket->adapterId.HighPart = modesArray[i].adapterId.HighPart;
75+
requestPacket->adapterId.LowPart = modesArray[i].adapterId.LowPart;
76+
requestPacket->id = modesArray[i].id;
77+
}
78+
}
79+
80+
if (ERROR_SUCCESS == DisplayConfigGetDeviceInfo(requestPacket))
81+
{
82+
if (enabled == true)
83+
{
84+
set[20] = 1;
85+
DisplayConfigSetDeviceInfo(setPacket);
86+
}
87+
else if (enabled == false)
88+
{
89+
set[20] = 0;
90+
DisplayConfigSetDeviceInfo(setPacket);
91+
}
92+
}
93+
}
94+
std::free(pathsArray);
95+
std::free(modesArray);
96+
}
2997
}
3098
}
3199

32-
extern "C"
100+
static bool HDRIsOn()
33101
{
34-
__declspec(dllexport) void SetHDR(bool enabled)
102+
bool returnValue = false;
103+
104+
uint32_t pathCount, modeCount;
105+
106+
uint8_t set[] = { 0x0A, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x14, 0x81, 0x00, 0x00,
107+
0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 };
108+
109+
uint8_t request[] = { 0x09, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x7C, 0x6F, 0x00,
110+
0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0xDB, 0x00,
111+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00 };
112+
113+
if (ERROR_SUCCESS == GetDisplayConfigBufferSizes(QDC_ONLY_ACTIVE_PATHS, &pathCount, &modeCount))
35114
{
36-
setHdrMode(enabled);
115+
DISPLAYCONFIG_PATH_INFO* pathsArray = nullptr;
116+
DISPLAYCONFIG_MODE_INFO* modesArray = nullptr;
117+
118+
const size_t sizePathsArray = pathCount * sizeof(DISPLAYCONFIG_PATH_INFO);
119+
const size_t sizeModesArray = modeCount * sizeof(DISPLAYCONFIG_MODE_INFO);
120+
121+
pathsArray = static_cast<DISPLAYCONFIG_PATH_INFO*>(std::malloc(sizePathsArray));
122+
modesArray = static_cast<DISPLAYCONFIG_MODE_INFO*>(std::malloc(sizeModesArray));
123+
124+
if (pathsArray != nullptr && modesArray != nullptr)
125+
{
126+
std::memset(pathsArray, 0, sizePathsArray);
127+
std::memset(modesArray, 0, sizeModesArray);
128+
129+
if (ERROR_SUCCESS == QueryDisplayConfig(QDC_ONLY_ACTIVE_PATHS, &pathCount, pathsArray,
130+
&modeCount, modesArray, 0))
131+
{
132+
DISPLAYCONFIG_DEVICE_INFO_HEADER* setPacket =
133+
reinterpret_cast<DISPLAYCONFIG_DEVICE_INFO_HEADER*>(set);
134+
DISPLAYCONFIG_DEVICE_INFO_HEADER* requestPacket =
135+
reinterpret_cast<DISPLAYCONFIG_DEVICE_INFO_HEADER*>(request);
136+
137+
for (int i = 0; i < modeCount; i++)
138+
{
139+
if (modesArray[i].infoType == DISPLAYCONFIG_MODE_INFO_TYPE_TARGET)
140+
{
141+
setPacket->adapterId.HighPart = modesArray[i].adapterId.HighPart;
142+
setPacket->adapterId.LowPart = modesArray[i].adapterId.LowPart;
143+
setPacket->id = modesArray[i].id;
144+
145+
requestPacket->adapterId.HighPart = modesArray[i].adapterId.HighPart;
146+
requestPacket->adapterId.LowPart = modesArray[i].adapterId.LowPart;
147+
requestPacket->id = modesArray[i].id;
148+
}
149+
}
150+
151+
if (ERROR_SUCCESS == DisplayConfigGetDeviceInfo(requestPacket))
152+
{
153+
if (request[20] == 0xD1) // HDR is OFF
154+
{
155+
returnValue = false;
156+
}
157+
else if (request[20] == 0xD3) // HDR is ON
158+
{
159+
returnValue = true;
160+
}
161+
}
162+
}
163+
std::free(pathsArray);
164+
std::free(modesArray);
165+
return returnValue;
166+
}
37167
}
38168
}
39169

170+
extern "C"
171+
{
172+
__declspec(dllexport) void SetHDRState(bool enabled)
173+
{
174+
SetHDR(enabled);
175+
}
176+
177+
__declspec(dllexport) bool GetHDRState()
178+
{
179+
return HDRIsOn();
180+
}
181+
}

Source/HDRController/HDRController/HDRController.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ namespace core
33
class HDRController
44
{
55
public:
6-
void setHdrMode(bool enabled);
6+
static void SetHDR(bool enabled);
7+
static bool HDRIsOn();
78
};
89

910
}

Source/HDRController/HDRController/HDRController.vcxproj

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -92,14 +92,14 @@
9292
<ConformanceMode>true</ConformanceMode>
9393
<PrecompiledHeader>NotUsing</PrecompiledHeader>
9494
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
95-
<AdditionalIncludeDirectories>$(SolutionDir)\Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
95+
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
9696
<AdditionalOptions>/std:c++17 %(AdditionalOptions)</AdditionalOptions>
9797
</ClCompile>
9898
<Link>
9999
<SubSystem>Windows</SubSystem>
100100
<GenerateDebugInformation>true</GenerateDebugInformation>
101101
<EnableUAC>false</EnableUAC>
102-
<AdditionalDependencies>nvapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
102+
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
103103
</Link>
104104
</ItemDefinitionGroup>
105105
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
@@ -129,14 +129,15 @@
129129
<ConformanceMode>true</ConformanceMode>
130130
<PrecompiledHeader>NotUsing</PrecompiledHeader>
131131
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
132-
<AdditionalIncludeDirectories>$(SolutionDir)\Include</AdditionalIncludeDirectories>
132+
<AdditionalIncludeDirectories>
133+
</AdditionalIncludeDirectories>
133134
<AdditionalOptions>/std:c++17 %(AdditionalOptions)</AdditionalOptions>
134135
</ClCompile>
135136
<Link>
136137
<SubSystem>Windows</SubSystem>
137138
<GenerateDebugInformation>true</GenerateDebugInformation>
138139
<EnableUAC>false</EnableUAC>
139-
<AdditionalDependencies>nvapi64.lib;%(AdditionalDependencies)</AdditionalDependencies>
140+
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
140141
</Link>
141142
</ItemDefinitionGroup>
142143
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
@@ -161,10 +162,7 @@
161162
<ItemGroup>
162163
<ClInclude Include="framework.h" />
163164
<ClInclude Include="HDRController.h" />
164-
<ClInclude Include="nvapi_deps.h" />
165165
<ClInclude Include="pch.h" />
166-
<ClInclude Include="sdk_status.h" />
167-
<ClInclude Include="toggle.h" />
168166
</ItemGroup>
169167
<ItemGroup>
170168
<ClCompile Include="dllmain.cpp" />
@@ -175,8 +173,6 @@
175173
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
176174
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
177175
</ClCompile>
178-
<ClCompile Include="sdk_status.cpp" />
179-
<ClCompile Include="toggle.cpp" />
180176
</ItemGroup>
181177
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
182178
<ImportGroup Label="ExtensionTargets">

Source/HDRController/HDRController/HDRController.vcxproj.filters

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,6 @@
2424
<ClInclude Include="HDRController.h">
2525
<Filter>Headerdateien</Filter>
2626
</ClInclude>
27-
<ClInclude Include="sdk_status.h">
28-
<Filter>Headerdateien</Filter>
29-
</ClInclude>
30-
<ClInclude Include="toggle.h">
31-
<Filter>Headerdateien</Filter>
32-
</ClInclude>
33-
<ClInclude Include="nvapi_deps.h">
34-
<Filter>Headerdateien</Filter>
35-
</ClInclude>
3627
</ItemGroup>
3728
<ItemGroup>
3829
<ClCompile Include="dllmain.cpp">
@@ -44,11 +35,5 @@
4435
<ClCompile Include="HDRController.cpp">
4536
<Filter>Quelldateien</Filter>
4637
</ClCompile>
47-
<ClCompile Include="sdk_status.cpp">
48-
<Filter>Quelldateien</Filter>
49-
</ClCompile>
50-
<ClCompile Include="toggle.cpp">
51-
<Filter>Quelldateien</Filter>
52-
</ClCompile>
5338
</ItemGroup>
5439
</Project>
-511 KB
Binary file not shown.

Source/HDRController/HDRController/nvapi_deps.h

Lines changed: 0 additions & 8 deletions
This file was deleted.

0 commit comments

Comments
 (0)