diff options
Diffstat (limited to '')
-rw-r--r-- | gfx/thebes/gfxWindowsPlatform.cpp | 57 |
1 files changed, 7 insertions, 50 deletions
diff --git a/gfx/thebes/gfxWindowsPlatform.cpp b/gfx/thebes/gfxWindowsPlatform.cpp index 93de20f445..4554d487f4 100644 --- a/gfx/thebes/gfxWindowsPlatform.cpp +++ b/gfx/thebes/gfxWindowsPlatform.cpp @@ -82,6 +82,7 @@ #include "mozilla/layers/DeviceAttachmentsD3D11.h" #include "mozilla/WindowsProcessMitigations.h" #include "D3D11Checks.h" +#include "mozilla/ScreenHelperWin.h" using namespace mozilla; using namespace mozilla::gfx; @@ -258,8 +259,7 @@ class D3DSharedTexturesReporter final : public nsIMemoryReporter { NS_IMPL_ISUPPORTS(D3DSharedTexturesReporter, nsIMemoryReporter) -gfxWindowsPlatform::gfxWindowsPlatform() - : mRenderMode(RENDER_GDI), mSupportsHDR(false) { +gfxWindowsPlatform::gfxWindowsPlatform() : mRenderMode(RENDER_GDI) { // If win32k is locked down then we can't use COM STA and shouldn't need it. // Also, we won't be using any GPU memory in this process. if (!IsWin32kLockedDown()) { @@ -400,7 +400,11 @@ void gfxWindowsPlatform::InitAcceleration() { // CanUseHardwareVideoDecoding depends on DeviceManagerDx state, // so update the cached value now. UpdateCanUseHardwareVideoDecoding(); - UpdateSupportsHDR(); + + // Our ScreenHelperWin also depends on DeviceManagerDx state. + if (XRE_IsParentProcess() && !gfxPlatform::IsHeadless()) { + ScreenHelperWin::RefreshScreens(); + } RecordStartupTelemetry(); } @@ -531,53 +535,6 @@ void gfxWindowsPlatform::UpdateRenderMode() { } } -void gfxWindowsPlatform::UpdateSupportsHDR() { - // TODO: This function crashes content processes, for reasons that are not - // obvious from the crash reports. For now, this function can only be executed - // by the parent process. Therefore SupportsHDR() will always return false for - // content processes, as noted in the header. - if (!XRE_IsParentProcess()) { - return; - } - - // Set mSupportsHDR to true if any of the DeviceManager outputs have a BT2020 - // colorspace with EOTF2084 gamma curve, this indicates the system is sending - // an HDR format to at least one monitor. The colorspace returned by DXGI is - // very vague - we only see DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020 for HDR - // and DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709 for SDR modes, even if the - // monitor is using something like YCbCr444 according to Settings - // (System -> Display Settings -> Advanced Display). To get more specific - // info we would need to query the DISPLAYCONFIG values in WinGDI. - // - // Note that the bit depth used to be checked here, but as of Windows 11 22H2, - // HDR is supported with 8bpc for lower bandwidth, where DWM converts to - // dithered RGB8 rather than RGB10, which doesn't really matter here. - // - // This only returns true if there is an HDR display connected at app start, - // if the user switches to HDR to watch a video, we won't know that here, and - // if no displays are connected we return false (e.g. if Windows Update - // restarted a laptop with its lid closed and no external displays, we will - // see zero outputs here when the app is restarted automatically). - // - // It would be better to track if HDR is ever used and report that telemetry - // so we know if HDR matters, not just when it is detected at app start. - // - // Further reading: - // https://learn.microsoft.com/en-us/windows/win32/direct3darticles/high-dynamic-range - // https://learn.microsoft.com/en-us/windows/win32/api/wingdi/ns-wingdi-displayconfig_sdr_white_level - DeviceManagerDx* dx = DeviceManagerDx::Get(); - nsTArray<DXGI_OUTPUT_DESC1> outputs = dx->EnumerateOutputs(); - - for (auto& output : outputs) { - if (output.ColorSpace == DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020) { - mSupportsHDR = true; - return; - } - } - - mSupportsHDR = false; -} - mozilla::gfx::BackendType gfxWindowsPlatform::GetContentBackendFor( mozilla::layers::LayersBackend aLayers) { mozilla::gfx::BackendType defaultBackend = |