Ein Vulkan-Layer bringt HDR auf virtuelle Displays zurück
Die Vulkan-Treiber von NVIDIA und AMD akzeptieren auf virtuellen Displays eine HDR-Swapchain, listen das Format aber nicht. Ein kleiner impliziter Layer ergänzt die fehlenden Einträge.
Auf einem virtuellen Display liefern die Vulkan-Treiber von NVIDIA und AMD bei vkGetPhysicalDeviceSurfaceFormatsKHR keinen HDR-Farbraum, auch wenn der Desktop in HDR zusammengesetzt wird. Vulkan-Spiele wie Doom: The Dark Ages und Indiana Jones and the Great Circle lesen diese Liste und schalten HDR ab.
Der Treiber zeigt, was er nicht listet
Ein Testprogramm hat auf dem virtuellen Display trotzdem eine HDR-Swapchain angelegt: A2B10G10R10_UNORM_PACK32 in HDR10_ST2084_EXT, ein Paar, das der Treiber nicht gelistet hatte. vkCreateSwapchainKHR, vkSetHdrMetadataEXT und jedes Present liefen durch. Der HDR-Pfad funktioniert; nur die Liste ist zu kurz.
Der Layer
VK_LAYER_PUNKTFUNK_hdr_inject ist ein impliziter Layer zwischen jedem Vulkan-Programm und dem Treiber.
- Er fängt
vkGetPhysicalDeviceSurfaceFormatsKHRund die2KHR-Variante ab, ruft den Treiber auf und hängt HDR10 (A2B10G10R10_UNORM_PACK32,HDR10_ST2084_EXT) und scRGB (R16G16B16A16_SFLOAT,EXTENDED_SRGB_LINEAR_EXT) an, sofern sie noch fehlen. - Er fängt
vkCreateWin32SurfaceKHRab, um jede Surface ihrem Fenster zuzuordnen. - Bei jeder Abfrage fragt er Windows (
DisplayConfigGetDeviceInfo, Advanced-Color-Info), ob HDR auf dem Monitor dieses Fensters an ist. Wenn nicht, geht die Liste unverändert durch, und ein SDR-Display bietet nie HDR an.
Der Treiber zeigt dann die HDR-Swapchain, die das Spiel anfordert. Der Layer prüft den HDR-Zustand des Displays, nicht den GPU-Hersteller.
Auslieferung
Die Zeile HDR Vulkan layer im Installer, standardmäßig an, registriert ihn unter HKLM\SOFTWARE\Khronos\Vulkan\ImplicitLayers. Maschinenweit registriert lädt er, egal wie ein Spiel startet; Scoping per Umgebungsvariable verpasst Spiele, die ein bereits laufendes Steam startet.
Er lädt in jeden Vulkan-Prozess, darum hat er Aus-Schalter:
DISABLE_PF_VKHDR=1, der Standardschalter des Loaders, schaltet ihn für diesen Prozess ab.- Eine eingebaute Liste lässt Titel mit Kernel-Anti-Cheat aus:
cs2.exe,rainbowsix.exe,rainbowsixgame.exe,r5apex.exe. PF_VKHDR_EXCLUDE=foo.exe,bar.exeerweitert diese Liste.
Für Nachbauer
Die privaten Create-Info-Structs des Loaders, VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO und VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO, nutzen die Werte 47 und 48, nicht den 1000211xxx-Bereich. Prüfst du auf den falschen Wert, scheitert vkCreateInstance in deinem Layer.
Für Spieler: die Kurzfassung. Die Ursache bei dir prüfen: DirectX-HDR geht, Vulkan-HDR nicht.