From d9d4b69a591789bc8ae5fc446ecec4ee680dd474 Mon Sep 17 00:00:00 2001 From: jpark37 Date: Wed, 13 Apr 2022 22:24:20 -0700 Subject: [PATCH] libobs-d3d11: Add monitor to HDR status cache Requesting HDR status is surprisingly expensive. --- libobs-d3d11/d3d11-subsystem.cpp | 16 +++++++++++++--- libobs-d3d11/d3d11-subsystem.hpp | 2 ++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/libobs-d3d11/d3d11-subsystem.cpp b/libobs-d3d11/d3d11-subsystem.cpp index 3b858b8a1..8fad75087 100644 --- a/libobs-d3d11/d3d11-subsystem.cpp +++ b/libobs-d3d11/d3d11-subsystem.cpp @@ -72,6 +72,12 @@ static bool screen_supports_hdr(gs_device_t *device, HMONITOR hMonitor) if (!factory1->IsCurrent()) { device->InitFactory(); factory1 = device->factory; + device->monitor_to_hdr.clear(); + } + + for (const std::pair &pair : device->monitor_to_hdr) { + if (pair.first == hMonitor) + return pair.second; } ComPtr adapter; @@ -86,9 +92,13 @@ static bool screen_supports_hdr(gs_device_t *device, HMONITOR hMonitor) if (SUCCEEDED(output->QueryInterface(&output6))) { DXGI_OUTPUT_DESC1 desc1; if (SUCCEEDED(output6->GetDesc1(&desc1)) && - desc1.Monitor == hMonitor) { - return desc1.ColorSpace == - DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020; + (desc1.Monitor == hMonitor)) { + const bool hdr = + desc1.ColorSpace == + DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020; + device->monitor_to_hdr.emplace_back( + hMonitor, hdr); + return hdr; } } } diff --git a/libobs-d3d11/d3d11-subsystem.hpp b/libobs-d3d11/d3d11-subsystem.hpp index 34297e00b..6ffc5fcb8 100644 --- a/libobs-d3d11/d3d11-subsystem.hpp +++ b/libobs-d3d11/d3d11-subsystem.hpp @@ -1036,6 +1036,8 @@ struct gs_device { vector loss_callbacks; gs_obj *first_obj = nullptr; + vector> monitor_to_hdr; + void InitCompiler(); void InitFactory(); void ReorderAdapters(uint32_t &adapterIdx);