From d6ab670bf8da1b12226303ded939c0ab90f93007 Mon Sep 17 00:00:00 2001 From: Andrew Osmond Date: Fri, 15 May 2020 01:35:00 +0000 Subject: [PATCH] Bug 1638011 - Block WebRender in release for high refresh rate monitors. r=jrmuizel Differential Revision: https://phabricator.services.mozilla.com/D75450 --- gfx/config/gfxConfigManager.cpp | 7 ++++++ gfx/tests/gtest/TestConfigManager.cpp | 36 +++++++++++++++++++++++++++ widget/GfxInfoBase.h | 1 + widget/nsIGfxInfo.idl | 5 ++++ widget/windows/GfxInfo.cpp | 8 ++++++ widget/windows/GfxInfo.h | 1 + 6 files changed, 58 insertions(+) diff --git a/gfx/config/gfxConfigManager.cpp b/gfx/config/gfxConfigManager.cpp index 7dd4b343698a..a9537b812c3b 100644 --- a/gfx/config/gfxConfigManager.cpp +++ b/gfx/config/gfxConfigManager.cpp @@ -176,6 +176,13 @@ bool gfxConfigManager::ConfigureWebRenderQualified() { NS_LITERAL_CSTRING("INTEL_BATTERY_REQUIRES_DCOMP")); } } + + int32_t maxRefreshRate = mGfxInfo->GetMaxRefreshRate(); + if (maxRefreshRate >= 60) { + mFeatureWrQualified->Disable(FeatureStatus::Blocked, + "Monitor refresh rate too high", + NS_LITERAL_CSTRING("REFRESH_RATE_TOO_HIGH")); + } } return guarded; diff --git a/gfx/tests/gtest/TestConfigManager.cpp b/gfx/tests/gtest/TestConfigManager.cpp index 44c078f2a5fb..9b5a66d57771 100644 --- a/gfx/tests/gtest/TestConfigManager.cpp +++ b/gfx/tests/gtest/TestConfigManager.cpp @@ -21,6 +21,7 @@ class MockGfxInfo final : public nsIGfxInfo { int32_t mStatusWr; int32_t mStatusWrCompositor; + int32_t mMaxRefreshRate; Maybe mHasBattery; const char* mVendorId; @@ -28,6 +29,7 @@ class MockGfxInfo final : public nsIGfxInfo { MockGfxInfo() : mStatusWr(nsIGfxInfo::FEATURE_ALLOW_ALWAYS), mStatusWrCompositor(nsIGfxInfo::FEATURE_STATUS_OK), + mMaxRefreshRate(-1), mHasBattery(Some(false)), mVendorId("0x10de") {} @@ -62,6 +64,8 @@ class MockGfxInfo final : public nsIGfxInfo { return NS_OK; } + int32_t GetMaxRefreshRate() override { return mMaxRefreshRate; } + // The following methods we don't need for testing gfxConfigManager. NS_IMETHOD GetFeatureSuggestedDriverVersion(int32_t aFeature, nsAString& _retval) override { @@ -622,3 +626,35 @@ TEST_F(GfxConfigManager, WebRenderIntelBatteryNoHwStretchingNotNightly) { EXPECT_TRUE(mFeatures.mGPUProcess.IsEnabled()); EXPECT_TRUE(mFeatures.mD3D11HwAngle.IsEnabled()); } + +TEST_F(GfxConfigManager, WebRenderHighRefreshRateNightly) { + mIsNightly = true; + mMockGfxInfo->mMaxRefreshRate = 120; + ConfigureWebRender(); + + EXPECT_TRUE(mFeatures.mWrQualified.IsEnabled()); + EXPECT_TRUE(mFeatures.mWr.IsEnabled()); + EXPECT_TRUE(mFeatures.mWrCompositor.IsEnabled()); + EXPECT_TRUE(mFeatures.mWrAngle.IsEnabled()); + EXPECT_TRUE(mFeatures.mWrDComp.IsEnabled()); + EXPECT_TRUE(mFeatures.mWrPartial.IsEnabled()); + EXPECT_TRUE(mFeatures.mHwCompositing.IsEnabled()); + EXPECT_TRUE(mFeatures.mGPUProcess.IsEnabled()); + EXPECT_TRUE(mFeatures.mD3D11HwAngle.IsEnabled()); +} + +TEST_F(GfxConfigManager, WebRenderHighRefreshRateNotNightly) { + mIsNightly = false; + mMockGfxInfo->mMaxRefreshRate = 120; + ConfigureWebRender(); + + EXPECT_FALSE(mFeatures.mWrQualified.IsEnabled()); + EXPECT_FALSE(mFeatures.mWr.IsEnabled()); + EXPECT_FALSE(mFeatures.mWrCompositor.IsEnabled()); + EXPECT_FALSE(mFeatures.mWrAngle.IsEnabled()); + EXPECT_FALSE(mFeatures.mWrDComp.IsEnabled()); + EXPECT_FALSE(mFeatures.mWrPartial.IsEnabled()); + EXPECT_TRUE(mFeatures.mHwCompositing.IsEnabled()); + EXPECT_TRUE(mFeatures.mGPUProcess.IsEnabled()); + EXPECT_TRUE(mFeatures.mD3D11HwAngle.IsEnabled()); +} diff --git a/widget/GfxInfoBase.h b/widget/GfxInfoBase.h index 71008ad7db46..7bfa1a5bb2a7 100644 --- a/widget/GfxInfoBase.h +++ b/widget/GfxInfoBase.h @@ -88,6 +88,7 @@ class GfxInfoBase : public nsIGfxInfo, virtual nsresult Init(); NS_IMETHOD_(void) GetData() override; + int32_t GetMaxRefreshRate() override { return -1; } static void AddCollector(GfxInfoCollectorBase* collector); static void RemoveCollector(GfxInfoCollectorBase* collector); diff --git a/widget/nsIGfxInfo.idl b/widget/nsIGfxInfo.idl index 269904236274..1550ccd77f2e 100644 --- a/widget/nsIGfxInfo.idl +++ b/widget/nsIGfxInfo.idl @@ -204,6 +204,11 @@ interface nsIGfxInfo : nsISupports // only useful on X11 [noscript, notxpcom] void GetData(); + /** + * Maximum refresh rate among detected monitors. -1 if unknown. + */ + [noscript, notxpcom] long GetMaxRefreshRate(); + [implicit_jscontext] jsval getInfo(); diff --git a/widget/windows/GfxInfo.cpp b/widget/windows/GfxInfo.cpp index edfeaba8b63a..800f1e7f3407 100644 --- a/widget/windows/GfxInfo.cpp +++ b/widget/windows/GfxInfo.cpp @@ -78,6 +78,14 @@ GfxInfo::GetHasBattery(bool* aHasBattery) { return NS_OK; } +int32_t GfxInfo::GetMaxRefreshRate() { + int32_t refreshRate = -1; + for (auto displayInfo : mDisplayInfo) { + refreshRate = std::max(refreshRate, int32_t(displayInfo.mRefreshRate)); + } + return refreshRate; +} + #define PIXEL_STRUCT_RGB 1 #define PIXEL_STRUCT_BGR 2 diff --git a/widget/windows/GfxInfo.h b/widget/windows/GfxInfo.h index 6e4091aa67da..4ed7d2c412bc 100644 --- a/widget/windows/GfxInfo.h +++ b/widget/windows/GfxInfo.h @@ -55,6 +55,7 @@ class GfxInfo : public GfxInfoBase { using GfxInfoBase::GetFeatureSuggestedDriverVersion; nsresult Init() override; + int32_t GetMaxRefreshRate() override; uint32_t OperatingSystemVersion() override { return mWindowsVersion; } uint32_t OperatingSystemBuild() override { return mWindowsBuildNumber; }