@@ -89,6 +89,7 @@ wstring gpuname;
8989wstring confpath = L" C:\\ VirtualDisplayDriver" ;
9090bool logsEnabled = false ;
9191bool debugLogs;
92+ bool HDRPlus = false ;
9293
9394
9495
@@ -351,6 +352,108 @@ void vddlog(const char* type, const char* message) {
351352}
352353
353354
355+
356+ bool HDRPLUSEnabledQuery () {
357+ wstring settingsname = confpath + L" \\ vdd_settings.xml" ;
358+ HKEY hKey;
359+ DWORD dwValue;
360+ DWORD dwBufferSize = sizeof (dwValue);
361+ LONG lResult = RegOpenKeyExW (HKEY_LOCAL_MACHINE , L" SOFTWARE\\ MikeTheTech\\ VirtualDisplayDriver" , 0 , KEY_READ , &hKey);
362+
363+ if (lResult == ERROR_SUCCESS ) {
364+ vddlog (" d" , " Get HDRPlus - Successfully opened registry key." );
365+
366+ lResult = RegQueryValueExW (hKey, L" HDRPLUS" , NULL , NULL , (LPBYTE )&dwValue, &dwBufferSize);
367+ if (lResult == ERROR_SUCCESS ) {
368+ RegCloseKey (hKey);
369+ vddlog (" d" , " Get HDRPlus - HDRPLUS value retrieved from registry." );
370+
371+ if (dwValue == 1 ) {
372+ vddlog (" d" , " Get HDRPlus - HDRPLUS is enabled (value = 1)." );
373+ return true ;
374+ }
375+ else if (dwValue == 0 ) {
376+ vddlog (" d" , " Get HDRPlus - HDRPLUS is disabled (value = 0). Checking XML settings." );
377+ goto check_xml;
378+ }
379+ }
380+ else {
381+ vddlog (" e" , " Get HDRPlus - Failed to retrieve HDRPLUS value from registry. Attempting to read as string." );
382+ wchar_t path[MAX_PATH ];
383+ dwBufferSize = sizeof (path);
384+ lResult = RegQueryValueExW (hKey, L" HDRPLUS" , NULL , NULL , (LPBYTE )path, &dwBufferSize);
385+
386+ if (lResult == ERROR_SUCCESS ) {
387+ wstring HDRValue (path);
388+ RegCloseKey (hKey);
389+ vddlog (" d" , " Get HDRPlus - HDRPLUS string value retrieved from registry. " );
390+
391+ if (HDRValue == L" true" || HDRValue == L" 1" ) {
392+ vddlog (" d" , " Get HDRPlus - HDRPLUS is enabled (string value)." );
393+ return true ;
394+ }
395+ else if (HDRValue == L" false" || HDRValue == L" 0" ) {
396+ vddlog (" d" , " Get HDRPlus - HDRPLUS is disabled (string value). Checking XML settings." );
397+ goto check_xml;
398+ }
399+ }
400+ RegCloseKey (hKey);
401+ vddlog (" e" , " Get HDRPlus - Failed to retrieve HDRPLUS string value from registry." );
402+ }
403+ }
404+ else {
405+ vddlog (" e" , " Get HDRPlus - Failed to open registry key for HDRPLUS." );
406+ }
407+
408+ check_xml:
409+ CComPtr<IStream> pFileStream;
410+ HRESULT hr = SHCreateStreamOnFileEx (settingsname.c_str (), STGM_READ , FILE_ATTRIBUTE_NORMAL , FALSE , nullptr , &pFileStream);
411+
412+ if (FAILED (hr)) {
413+ vddlog (" e" , " Get HDRPlus - Failed to create file stream for XML settings." );
414+ return false ;
415+ }
416+ vddlog (" d" , " Get HDRPlus - File stream created for XML settings." );
417+
418+ CComPtr<IXmlReader> pReader;
419+ hr = CreateXmlReader (__uuidof (IXmlReader), (void **)&pReader, nullptr );
420+
421+ if (FAILED (hr)) {
422+ vddlog (" e" , " Get HDRPlus - Failed to create XML reader." );
423+ return false ;
424+ }
425+ vddlog (" d" , " Get HDRPlus - XML reader created." );
426+
427+ hr = pReader->SetInput (pFileStream);
428+ if (FAILED (hr)) {
429+ vddlog (" e" , " Get HDRPlus - Failed to set input for XML reader." );
430+ return false ;
431+ }
432+ vddlog (" d" , " Get HDRPlus - Input set for XML reader." );
433+
434+ XmlNodeType nodeType;
435+ const wchar_t * pwszLocalName;
436+ bool xmlHDRvalue = false ;
437+
438+ while (S_OK == pReader->Read (&nodeType)) {
439+ if (nodeType == XmlNodeType_Element) {
440+ pReader->GetLocalName (&pwszLocalName, nullptr );
441+ if (wcscmp (pwszLocalName, L" HDRPlus" ) == 0 ) {
442+ pReader->Read (&nodeType);
443+ if (nodeType == XmlNodeType_Text) {
444+ const wchar_t * pwszValue;
445+ pReader->GetValue (&pwszValue, nullptr );
446+ xmlHDRvalue = (wcscmp (pwszValue, L" true" ) == 0 );
447+ vddlog (" i" , xmlHDRvalue ? " HDRPlus is enabled." : " HDRPlus is disabled." );
448+ break ;
449+ }
450+ }
451+ }
452+ }
453+
454+ return xmlHDRvalue;
455+ }
456+
354457void LogIddCxVersion () {
355458 IDARG_OUT_GETVERSION outArgs;
356459 NTSTATUS status = IddCxGetVersion (&outArgs);
@@ -807,6 +910,7 @@ extern "C" NTSTATUS DriverEntry(
807910 Config.EvtDriverUnload = EvtDriverUnload;
808911 initpath ();
809912 logsEnabled = LogEnabledQuery ();
913+ HDRPlus = HDRPLUSEnabledQuery ();
810914 vddlog (" i" , " Driver Starting" );
811915 string utf8_confpath = WStringToString (confpath);
812916 string logtext = " VDD Path: " + utf8_confpath;
@@ -2039,7 +2143,13 @@ void CreateTargetMode2(IDDCX_TARGET_MODE2& Mode, UINT Width, UINT Height, UINT V
20392143 vddlog (" d" , logStream.str ().c_str ());
20402144
20412145 Mode.Size = sizeof (Mode);
2042- Mode.BitsPerComponent .Rgb = IDDCX_BITS_PER_COMPONENT_8 | IDDCX_BITS_PER_COMPONENT_10 ;
2146+ if (HDRPlus) {
2147+ Mode.BitsPerComponent .Rgb = IDDCX_BITS_PER_COMPONENT_8 | IDDCX_BITS_PER_COMPONENT_12 ;
2148+ }
2149+ else {
2150+ Mode.BitsPerComponent .Rgb = IDDCX_BITS_PER_COMPONENT_8 | IDDCX_BITS_PER_COMPONENT_10 ;
2151+ }
2152+
20432153
20442154 logStream.str (" " );
20452155 logStream << " IDDCX_TARGET_MODE2 configured with Size: " << Mode.Size
@@ -2138,7 +2248,12 @@ NTSTATUS IddSampleEvtIddCxAdapterQueryTargetInfo(
21382248 UNREFERENCED_PARAMETER (pInArgs);
21392249
21402250 pOutArgs->TargetCaps = IDDCX_TARGET_CAPS_HIGH_COLOR_SPACE ;
2141- pOutArgs->DitheringSupport .Rgb = IDDCX_BITS_PER_COMPONENT_10 ;
2251+ if (HDRPlus) {
2252+ pOutArgs->DitheringSupport .Rgb = IDDCX_BITS_PER_COMPONENT_12 ;
2253+ }
2254+ else {
2255+ pOutArgs->DitheringSupport .Rgb = IDDCX_BITS_PER_COMPONENT_10 ;
2256+ }
21422257
21432258 logStream.str (" " );
21442259 logStream << " Target capabilities set to: " << pOutArgs->TargetCaps
@@ -2212,7 +2327,14 @@ NTSTATUS IddSampleEvtIddCxParseMonitorDescription2(
22122327 pInArgs->pMonitorModes [ModeIndex].Size = sizeof (IDDCX_MONITOR_MODE2 );
22132328 pInArgs->pMonitorModes [ModeIndex].Origin = IDDCX_MONITOR_MODE_ORIGIN_MONITORDESCRIPTOR ;
22142329 pInArgs->pMonitorModes [ModeIndex].MonitorVideoSignalInfo = s_KnownMonitorModes2[ModeIndex];
2215- pInArgs->pMonitorModes [ModeIndex].BitsPerComponent .Rgb = IDDCX_BITS_PER_COMPONENT_8 | IDDCX_BITS_PER_COMPONENT_10 ;
2330+
2331+ if (HDRPlus) {
2332+ pInArgs->pMonitorModes [ModeIndex].BitsPerComponent .Rgb = IDDCX_BITS_PER_COMPONENT_8 | IDDCX_BITS_PER_COMPONENT_12 ;
2333+ }
2334+ else {
2335+ pInArgs->pMonitorModes [ModeIndex].BitsPerComponent .Rgb = IDDCX_BITS_PER_COMPONENT_8 | IDDCX_BITS_PER_COMPONENT_10 ;
2336+ }
2337+
22162338
22172339 logStream << " \n ModeIndex: " << ModeIndex
22182340 << " \n Size: " << pInArgs->pMonitorModes [ModeIndex].Size
0 commit comments