1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4  * License, v. 2.0. If a copy of the MPL was not distributed with this
5  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 #include "gtest/gtest.h"
7 
8 #include "gfxFeature.h"
9 #include "mozilla/gfx/gfxConfigManager.h"
10 #include "nsIGfxInfo.h"
11 
12 using namespace mozilla;
13 using namespace mozilla::gfx;
14 
15 namespace mozilla {
16 namespace gfx {
17 
18 class MockGfxInfo final : public nsIGfxInfo {
19  public:
20   NS_DECL_THREADSAFE_ISUPPORTS
21 
22   int32_t mStatusWr;
23   int32_t mStatusWrCompositor;
24   int32_t mStatusWrShaderCache;
25   int32_t mStatusWrOptimizedShaders;
26   int32_t mStatusWrPartialPresent;
27   int32_t mMaxRefreshRate;
28   bool mHasMixedRefreshRate;
29   Maybe<bool> mHasBattery;
30   const char* mVendorId;
31   const char* mDeviceId;
32 
33   // Default allows WebRender + compositor, and is desktop NVIDIA.
MockGfxInfo()34   MockGfxInfo()
35       : mStatusWr(nsIGfxInfo::FEATURE_ALLOW_ALWAYS),
36         mStatusWrCompositor(nsIGfxInfo::FEATURE_STATUS_OK),
37         mStatusWrShaderCache(nsIGfxInfo::FEATURE_STATUS_OK),
38         mStatusWrOptimizedShaders(nsIGfxInfo::FEATURE_STATUS_OK),
39         mStatusWrPartialPresent(nsIGfxInfo::FEATURE_STATUS_OK),
40         mMaxRefreshRate(-1),
41         mHasMixedRefreshRate(false),
42         mHasBattery(Some(false)),
43         mVendorId("0x10de"),
44         mDeviceId("") {}
45 
GetFeatureStatus(int32_t aFeature,nsACString & aFailureId,int32_t * _retval)46   NS_IMETHOD GetFeatureStatus(int32_t aFeature, nsACString& aFailureId,
47                               int32_t* _retval) override {
48     switch (aFeature) {
49       case nsIGfxInfo::FEATURE_WEBRENDER:
50         *_retval = mStatusWr;
51         break;
52       case nsIGfxInfo::FEATURE_WEBRENDER_COMPOSITOR:
53         *_retval = mStatusWrCompositor;
54         break;
55       case nsIGfxInfo::FEATURE_WEBRENDER_SHADER_CACHE:
56         *_retval = mStatusWrShaderCache;
57         break;
58       case nsIGfxInfo::FEATURE_WEBRENDER_OPTIMIZED_SHADERS:
59         *_retval = mStatusWrOptimizedShaders;
60         break;
61       case nsIGfxInfo::FEATURE_WEBRENDER_PARTIAL_PRESENT:
62         *_retval = mStatusWrPartialPresent;
63         break;
64       default:
65         return NS_ERROR_NOT_IMPLEMENTED;
66     }
67     return NS_OK;
68   }
69 
GetHasBattery(bool * aHasBattery)70   NS_IMETHOD GetHasBattery(bool* aHasBattery) override {
71     if (mHasBattery.isNothing()) {
72       return NS_ERROR_NOT_IMPLEMENTED;
73     }
74     *aHasBattery = *mHasBattery;
75     return NS_OK;
76   }
77 
GetAdapterVendorID(nsAString & aAdapterVendorID)78   NS_IMETHOD GetAdapterVendorID(nsAString& aAdapterVendorID) override {
79     if (!mVendorId) {
80       return NS_ERROR_NOT_IMPLEMENTED;
81     }
82     aAdapterVendorID.AssignASCII(mVendorId);
83     return NS_OK;
84   }
85 
GetAdapterDeviceID(nsAString & aAdapterDeviceID)86   NS_IMETHOD GetAdapterDeviceID(nsAString& aAdapterDeviceID) override {
87     if (!mDeviceId) {
88       return NS_ERROR_NOT_IMPLEMENTED;
89     }
90     aAdapterDeviceID.AssignASCII(mDeviceId);
91     return NS_OK;
92   }
93 
GetMaxRefreshRate(bool * aMixed)94   NS_IMETHOD_(int32_t) GetMaxRefreshRate(bool* aMixed) override {
95     if (aMixed) {
96       *aMixed = mHasMixedRefreshRate;
97     }
98     return mMaxRefreshRate;
99   }
100 
GetEmbeddedInFirefoxReality(bool * aEmbeddedInFirefoxReality)101   NS_IMETHODIMP GetEmbeddedInFirefoxReality(
102       bool* aEmbeddedInFirefoxReality) override {
103     return NS_ERROR_NOT_IMPLEMENTED;
104   }
105 
GetAzureCanvasBackend(nsAString & aBackend)106   NS_IMETHOD GetAzureCanvasBackend(nsAString& aBackend) override {
107     return NS_ERROR_NOT_IMPLEMENTED;
108   }
109 
GetAzureContentBackend(nsAString & aBackend)110   NS_IMETHOD GetAzureContentBackend(nsAString& aBackend) override {
111     return NS_ERROR_NOT_IMPLEMENTED;
112   }
113 
114   // The following methods we don't need for testing gfxConfigManager.
GetFeatureSuggestedDriverVersion(int32_t aFeature,nsAString & _retval)115   NS_IMETHOD GetFeatureSuggestedDriverVersion(int32_t aFeature,
116                                               nsAString& _retval) override {
117     return NS_ERROR_NOT_IMPLEMENTED;
118   }
119 
GetMonitors(JSContext * cx,JS::MutableHandleValue _retval)120   NS_IMETHOD GetMonitors(JSContext* cx,
121                          JS::MutableHandleValue _retval) override {
122     return NS_ERROR_NOT_IMPLEMENTED;
123   }
RefreshMonitors(void)124   NS_IMETHOD RefreshMonitors(void) override { return NS_ERROR_NOT_IMPLEMENTED; }
GetFailures(nsTArray<int32_t> & indices,nsTArray<nsCString> & failures)125   NS_IMETHOD GetFailures(nsTArray<int32_t>& indices,
126                          nsTArray<nsCString>& failures) override {
127     return NS_ERROR_NOT_IMPLEMENTED;
128   }
LogFailure(const nsACString & failure)129   NS_IMETHOD_(void) LogFailure(const nsACString& failure) override {}
GetInfo(JSContext *,JS::MutableHandle<JS::Value>)130   NS_IMETHOD GetInfo(JSContext*, JS::MutableHandle<JS::Value>) override {
131     return NS_ERROR_NOT_IMPLEMENTED;
132   }
GetFeatures(JSContext *,JS::MutableHandle<JS::Value>)133   NS_IMETHOD GetFeatures(JSContext*, JS::MutableHandle<JS::Value>) override {
134     return NS_ERROR_NOT_IMPLEMENTED;
135   }
GetFeatureLog(JSContext *,JS::MutableHandle<JS::Value>)136   NS_IMETHOD GetFeatureLog(JSContext*, JS::MutableHandle<JS::Value>) override {
137     return NS_ERROR_NOT_IMPLEMENTED;
138   }
GetActiveCrashGuards(JSContext *,JS::MutableHandle<JS::Value>)139   NS_IMETHOD GetActiveCrashGuards(JSContext*,
140                                   JS::MutableHandle<JS::Value>) override {
141     return NS_ERROR_NOT_IMPLEMENTED;
142   }
GetContentBackend(nsAString & aContentBackend)143   NS_IMETHOD GetContentBackend(nsAString& aContentBackend) override {
144     return NS_ERROR_NOT_IMPLEMENTED;
145   }
GetUsingGPUProcess(bool * aOutValue)146   NS_IMETHOD GetUsingGPUProcess(bool* aOutValue) override {
147     return NS_ERROR_NOT_IMPLEMENTED;
148   }
GetWebRenderEnabled(bool * aWebRenderEnabled)149   NS_IMETHOD GetWebRenderEnabled(bool* aWebRenderEnabled) override {
150     return NS_ERROR_NOT_IMPLEMENTED;
151   }
GetIsHeadless(bool * aIsHeadless)152   NS_IMETHOD GetIsHeadless(bool* aIsHeadless) override {
153     return NS_ERROR_NOT_IMPLEMENTED;
154   }
GetTargetFrameRate(uint32_t * aTargetFrameRate)155   NS_IMETHOD GetTargetFrameRate(uint32_t* aTargetFrameRate) override {
156     return NS_ERROR_NOT_IMPLEMENTED;
157   }
GetD2DEnabled(bool * aD2DEnabled)158   NS_IMETHOD GetD2DEnabled(bool* aD2DEnabled) override {
159     return NS_ERROR_NOT_IMPLEMENTED;
160   }
GetDWriteEnabled(bool * aDWriteEnabled)161   NS_IMETHOD GetDWriteEnabled(bool* aDWriteEnabled) override {
162     return NS_ERROR_NOT_IMPLEMENTED;
163   }
GetDWriteVersion(nsAString & aDwriteVersion)164   NS_IMETHOD GetDWriteVersion(nsAString& aDwriteVersion) override {
165     return NS_ERROR_NOT_IMPLEMENTED;
166   }
GetCleartypeParameters(nsAString & aCleartypeParams)167   NS_IMETHOD GetCleartypeParameters(nsAString& aCleartypeParams) override {
168     return NS_ERROR_NOT_IMPLEMENTED;
169   }
GetWindowProtocol(nsAString & aWindowProtocol)170   NS_IMETHOD GetWindowProtocol(nsAString& aWindowProtocol) override {
171     return NS_ERROR_NOT_IMPLEMENTED;
172   }
GetDesktopEnvironment(nsAString & aDesktopEnvironment)173   NS_IMETHOD GetDesktopEnvironment(nsAString& aDesktopEnvironment) override {
174     return NS_ERROR_NOT_IMPLEMENTED;
175   }
GetTestType(nsAString & aTestType)176   NS_IMETHOD GetTestType(nsAString& aTestType) override {
177     return NS_ERROR_NOT_IMPLEMENTED;
178   }
GetAdapterDescription(nsAString & aAdapterDescription)179   NS_IMETHOD GetAdapterDescription(nsAString& aAdapterDescription) override {
180     return NS_ERROR_NOT_IMPLEMENTED;
181   }
GetAdapterDriver(nsAString & aAdapterDriver)182   NS_IMETHOD GetAdapterDriver(nsAString& aAdapterDriver) override {
183     return NS_ERROR_NOT_IMPLEMENTED;
184   }
GetAdapterSubsysID(nsAString & aAdapterSubsysID)185   NS_IMETHOD GetAdapterSubsysID(nsAString& aAdapterSubsysID) override {
186     return NS_ERROR_NOT_IMPLEMENTED;
187   }
GetAdapterRAM(uint32_t * aAdapterRAM)188   NS_IMETHOD GetAdapterRAM(uint32_t* aAdapterRAM) override {
189     return NS_ERROR_NOT_IMPLEMENTED;
190   }
GetAdapterDriverVendor(nsAString & aAdapterDriverVendor)191   NS_IMETHOD GetAdapterDriverVendor(nsAString& aAdapterDriverVendor) override {
192     return NS_ERROR_NOT_IMPLEMENTED;
193   }
GetAdapterDriverVersion(nsAString & aAdapterDriverVersion)194   NS_IMETHOD GetAdapterDriverVersion(
195       nsAString& aAdapterDriverVersion) override {
196     return NS_ERROR_NOT_IMPLEMENTED;
197   }
GetAdapterDriverDate(nsAString & aAdapterDriverDate)198   NS_IMETHOD GetAdapterDriverDate(nsAString& aAdapterDriverDate) override {
199     return NS_ERROR_NOT_IMPLEMENTED;
200   }
GetAdapterDescription2(nsAString & aAdapterDescription)201   NS_IMETHOD GetAdapterDescription2(nsAString& aAdapterDescription) override {
202     return NS_ERROR_NOT_IMPLEMENTED;
203   }
GetAdapterDriver2(nsAString & aAdapterDriver)204   NS_IMETHOD GetAdapterDriver2(nsAString& aAdapterDriver) override {
205     return NS_ERROR_NOT_IMPLEMENTED;
206   }
GetAdapterVendorID2(nsAString & aAdapterVendorID)207   NS_IMETHOD GetAdapterVendorID2(nsAString& aAdapterVendorID) override {
208     return NS_ERROR_NOT_IMPLEMENTED;
209   }
GetAdapterDeviceID2(nsAString & aAdapterDeviceID)210   NS_IMETHOD GetAdapterDeviceID2(nsAString& aAdapterDeviceID) override {
211     return NS_ERROR_NOT_IMPLEMENTED;
212   }
GetAdapterSubsysID2(nsAString & aAdapterSubsysID)213   NS_IMETHOD GetAdapterSubsysID2(nsAString& aAdapterSubsysID) override {
214     return NS_ERROR_NOT_IMPLEMENTED;
215   }
GetAdapterRAM2(uint32_t * aAdapterRAM)216   NS_IMETHOD GetAdapterRAM2(uint32_t* aAdapterRAM) override {
217     return NS_ERROR_NOT_IMPLEMENTED;
218   }
GetAdapterDriverVendor2(nsAString & aAdapterDriverVendor)219   NS_IMETHOD GetAdapterDriverVendor2(nsAString& aAdapterDriverVendor) override {
220     return NS_ERROR_NOT_IMPLEMENTED;
221   }
GetAdapterDriverVersion2(nsAString & aAdapterDriverVersion)222   NS_IMETHOD GetAdapterDriverVersion2(
223       nsAString& aAdapterDriverVersion) override {
224     return NS_ERROR_NOT_IMPLEMENTED;
225   }
GetAdapterDriverDate2(nsAString & aAdapterDriverDate)226   NS_IMETHOD GetAdapterDriverDate2(nsAString& aAdapterDriverDate) override {
227     return NS_ERROR_NOT_IMPLEMENTED;
228   }
GetIsGPU2Active(bool * aIsGPU2Active)229   NS_IMETHOD GetIsGPU2Active(bool* aIsGPU2Active) override {
230     return NS_ERROR_NOT_IMPLEMENTED;
231   }
GetDisplayInfo(nsTArray<nsString> & aDisplayInfo)232   NS_IMETHOD GetDisplayInfo(nsTArray<nsString>& aDisplayInfo) override {
233     return NS_ERROR_NOT_IMPLEMENTED;
234   }
GetDisplayWidth(nsTArray<uint32_t> & aDisplayWidth)235   NS_IMETHOD GetDisplayWidth(nsTArray<uint32_t>& aDisplayWidth) override {
236     return NS_ERROR_NOT_IMPLEMENTED;
237   }
GetDisplayHeight(nsTArray<uint32_t> & aDisplayHeight)238   NS_IMETHOD GetDisplayHeight(nsTArray<uint32_t>& aDisplayHeight) override {
239     return NS_ERROR_NOT_IMPLEMENTED;
240   }
GetDrmRenderDevice(nsACString & aDrmRenderDevice)241   NS_IMETHOD GetDrmRenderDevice(nsACString& aDrmRenderDevice) override {
242     return NS_ERROR_NOT_IMPLEMENTED;
243   }
ControlGPUProcessForXPCShell(bool aEnable,bool * _retval)244   NS_IMETHOD ControlGPUProcessForXPCShell(bool aEnable,
245                                           bool* _retval) override {
246     return NS_ERROR_NOT_IMPLEMENTED;
247   }
KillGPUProcessForTests()248   NS_IMETHOD KillGPUProcessForTests() override {
249     return NS_ERROR_NOT_IMPLEMENTED;
250   }
CrashGPUProcessForTests()251   NS_IMETHOD CrashGPUProcessForTests() override {
252     return NS_ERROR_NOT_IMPLEMENTED;
253   }
254 
GetData()255   NS_IMETHOD_(void) GetData() override {}
256 
257  private:
258   virtual ~MockGfxInfo() = default;
259 };
260 
261 NS_IMPL_ISUPPORTS(MockGfxInfo, nsIGfxInfo)
262 
263 class GfxConfigManager : public ::testing::Test, public gfxConfigManager {
264  public:
GfxConfigManager()265   GfxConfigManager() {
266     mFeatureWr = &mFeatures.mWr;
267     mFeatureWrQualified = &mFeatures.mWrQualified;
268     mFeatureWrCompositor = &mFeatures.mWrCompositor;
269     mFeatureWrAngle = &mFeatures.mWrAngle;
270     mFeatureWrDComp = &mFeatures.mWrDComp;
271     mFeatureWrPartial = &mFeatures.mWrPartial;
272     mFeatureWrShaderCache = &mFeatures.mWrShaderCache;
273     mFeatureWrOptimizedShaders = &mFeatures.mWrOptimizedShaders;
274     mFeatureHwCompositing = &mFeatures.mHwCompositing;
275     mFeatureGPUProcess = &mFeatures.mGPUProcess;
276     mFeatureWrSoftware = &mFeatures.mWrSoftware;
277   }
278 
SetUp()279   void SetUp() override {
280     mMockGfxInfo = new MockGfxInfo();
281     mGfxInfo = mMockGfxInfo;
282 
283     mFeatureD3D11HwAngle = &mFeatures.mD3D11HwAngle;
284     mFeatureD3D11Compositing = &mFeatures.mD3D11Compositing;
285 
286     // By default, turn everything on. This effectively assumes we are on
287     // qualified nightly Windows 10 with DirectComposition support.
288     mFeatureHwCompositing->EnableByDefault();
289     mFeatureD3D11HwAngle->EnableByDefault();
290     mFeatureD3D11Compositing->EnableByDefault();
291     mFeatureGPUProcess->EnableByDefault();
292 
293     mWrCompositorEnabled.emplace(true);
294     mWrPartialPresent = true;
295     mWrShaderCache.emplace(true);
296     mWrOptimizedShaders = true;
297     mWrForceAngle = true;
298     mWrDCompWinEnabled = true;
299     mWrCompositorDCompRequired = true;
300     ++mHwStretchingSupport.mBoth;
301     mIsWin10OrLater = true;
302     mIsNightly = true;
303     mIsEarlyBetaOrEarlier = true;
304   }
305 
TearDown()306   void TearDown() override {
307     mFeatures.mWr.Reset();
308     mFeatures.mWrQualified.Reset();
309     mFeatures.mWrCompositor.Reset();
310     mFeatures.mWrAngle.Reset();
311     mFeatures.mWrDComp.Reset();
312     mFeatures.mWrPartial.Reset();
313     mFeatures.mWrShaderCache.Reset();
314     mFeatures.mWrOptimizedShaders.Reset();
315     mFeatures.mHwCompositing.Reset();
316     mFeatures.mD3D11HwAngle.Reset();
317     mFeatures.mD3D11Compositing.Reset();
318     mFeatures.mGPUProcess.Reset();
319     mFeatures.mWrSoftware.Reset();
320   }
321 
322   struct {
323     FeatureState mWr;
324     FeatureState mWrQualified;
325     FeatureState mWrCompositor;
326     FeatureState mWrAngle;
327     FeatureState mWrDComp;
328     FeatureState mWrPartial;
329     FeatureState mWrShaderCache;
330     FeatureState mWrOptimizedShaders;
331     FeatureState mHwCompositing;
332     FeatureState mD3D11HwAngle;
333     FeatureState mD3D11Compositing;
334     FeatureState mGPUProcess;
335     FeatureState mWrSoftware;
336   } mFeatures;
337 
338   RefPtr<MockGfxInfo> mMockGfxInfo;
339 };
340 
341 }  // namespace gfx
342 }  // namespace mozilla
343 
TEST_F(GfxConfigManager,WebRenderDefault)344 TEST_F(GfxConfigManager, WebRenderDefault) {
345   ConfigureWebRender();
346 
347   EXPECT_TRUE(mFeatures.mWrQualified.IsEnabled());
348   EXPECT_TRUE(mFeatures.mWr.IsEnabled());
349   EXPECT_TRUE(mFeatures.mWrCompositor.IsEnabled());
350   EXPECT_TRUE(mFeatures.mWrAngle.IsEnabled());
351   EXPECT_TRUE(mFeatures.mWrDComp.IsEnabled());
352   EXPECT_TRUE(mFeatures.mWrPartial.IsEnabled());
353   EXPECT_TRUE(mFeatures.mWrShaderCache.IsEnabled());
354   EXPECT_TRUE(mFeatures.mWrOptimizedShaders.IsEnabled());
355   EXPECT_TRUE(mFeatures.mHwCompositing.IsEnabled());
356   EXPECT_TRUE(mFeatures.mGPUProcess.IsEnabled());
357   EXPECT_TRUE(mFeatures.mD3D11HwAngle.IsEnabled());
358   EXPECT_TRUE(mFeatures.mWrSoftware.IsEnabled());
359 }
360 
TEST_F(GfxConfigManager,WebRenderNoPartialPresent)361 TEST_F(GfxConfigManager, WebRenderNoPartialPresent) {
362   mWrPartialPresent = false;
363   ConfigureWebRender();
364 
365   EXPECT_TRUE(mFeatures.mWrQualified.IsEnabled());
366   EXPECT_TRUE(mFeatures.mWr.IsEnabled());
367   EXPECT_TRUE(mFeatures.mWrCompositor.IsEnabled());
368   EXPECT_TRUE(mFeatures.mWrAngle.IsEnabled());
369   EXPECT_TRUE(mFeatures.mWrDComp.IsEnabled());
370   EXPECT_FALSE(mFeatures.mWrPartial.IsEnabled());
371   EXPECT_TRUE(mFeatures.mWrShaderCache.IsEnabled());
372   EXPECT_TRUE(mFeatures.mWrOptimizedShaders.IsEnabled());
373   EXPECT_TRUE(mFeatures.mHwCompositing.IsEnabled());
374   EXPECT_TRUE(mFeatures.mGPUProcess.IsEnabled());
375   EXPECT_TRUE(mFeatures.mD3D11HwAngle.IsEnabled());
376   EXPECT_TRUE(mFeatures.mWrSoftware.IsEnabled());
377 }
378 
TEST_F(GfxConfigManager,WebRenderPartialBlocked)379 TEST_F(GfxConfigManager, WebRenderPartialBlocked) {
380   mWrPartialPresent = true;
381   mMockGfxInfo->mStatusWrPartialPresent = nsIGfxInfo::FEATURE_BLOCKED_DEVICE;
382   ConfigureWebRender();
383 
384   EXPECT_FALSE(mFeatures.mWrPartial.IsEnabled());
385 }
386 
TEST_F(GfxConfigManager,WebRenderForcePartialBlocked)387 TEST_F(GfxConfigManager, WebRenderForcePartialBlocked) {
388   mWrForcePartialPresent = true;
389   mMockGfxInfo->mStatusWrPartialPresent = nsIGfxInfo::FEATURE_BLOCKED_DEVICE;
390   ConfigureWebRender();
391 
392   EXPECT_TRUE(mFeatures.mWrPartial.IsEnabled());
393 }
394 
TEST_F(GfxConfigManager,WebRenderScaledResolutionWithHwStretching)395 TEST_F(GfxConfigManager, WebRenderScaledResolutionWithHwStretching) {
396   mScaledResolution = true;
397   ConfigureWebRender();
398 
399   EXPECT_TRUE(mFeatures.mWrQualified.IsEnabled());
400   EXPECT_TRUE(mFeatures.mWr.IsEnabled());
401   EXPECT_TRUE(mFeatures.mWrCompositor.IsEnabled());
402   EXPECT_TRUE(mFeatures.mWrAngle.IsEnabled());
403   EXPECT_TRUE(mFeatures.mWrDComp.IsEnabled());
404   EXPECT_TRUE(mFeatures.mWrShaderCache.IsEnabled());
405   EXPECT_TRUE(mFeatures.mWrOptimizedShaders.IsEnabled());
406   EXPECT_TRUE(mFeatures.mWrPartial.IsEnabled());
407   EXPECT_TRUE(mFeatures.mHwCompositing.IsEnabled());
408   EXPECT_TRUE(mFeatures.mGPUProcess.IsEnabled());
409   EXPECT_TRUE(mFeatures.mD3D11HwAngle.IsEnabled());
410   EXPECT_TRUE(mFeatures.mWrSoftware.IsEnabled());
411 }
412 
TEST_F(GfxConfigManager,WebRenderScaledResolutionNoHwStretching)413 TEST_F(GfxConfigManager, WebRenderScaledResolutionNoHwStretching) {
414   ++mHwStretchingSupport.mNone;
415   mScaledResolution = true;
416   ConfigureWebRender();
417 
418   EXPECT_TRUE(mFeatures.mWrQualified.IsEnabled());
419   EXPECT_TRUE(mFeatures.mWr.IsEnabled());
420   EXPECT_FALSE(mFeatures.mWrCompositor.IsEnabled());
421   EXPECT_TRUE(mFeatures.mWrAngle.IsEnabled());
422   EXPECT_TRUE(mFeatures.mWrDComp.IsEnabled());
423   EXPECT_TRUE(mFeatures.mWrShaderCache.IsEnabled());
424   EXPECT_TRUE(mFeatures.mWrOptimizedShaders.IsEnabled());
425   EXPECT_TRUE(mFeatures.mWrPartial.IsEnabled());
426   EXPECT_TRUE(mFeatures.mHwCompositing.IsEnabled());
427   EXPECT_TRUE(mFeatures.mGPUProcess.IsEnabled());
428   EXPECT_TRUE(mFeatures.mD3D11HwAngle.IsEnabled());
429   EXPECT_TRUE(mFeatures.mWrSoftware.IsEnabled());
430 }
431 
TEST_F(GfxConfigManager,WebRenderEnabledWithDisableHwCompositingNoWr)432 TEST_F(GfxConfigManager, WebRenderEnabledWithDisableHwCompositingNoWr) {
433   mDisableHwCompositingNoWr = true;
434   ConfigureWebRender();
435 
436   EXPECT_TRUE(mFeatures.mWrQualified.IsEnabled());
437   EXPECT_TRUE(mFeatures.mWr.IsEnabled());
438   EXPECT_TRUE(mFeatures.mWrCompositor.IsEnabled());
439   EXPECT_TRUE(mFeatures.mWrAngle.IsEnabled());
440   EXPECT_TRUE(mFeatures.mWrDComp.IsEnabled());
441   EXPECT_TRUE(mFeatures.mWrShaderCache.IsEnabled());
442   EXPECT_TRUE(mFeatures.mWrOptimizedShaders.IsEnabled());
443   EXPECT_TRUE(mFeatures.mWrPartial.IsEnabled());
444   EXPECT_TRUE(mFeatures.mHwCompositing.IsEnabled());
445   EXPECT_TRUE(mFeatures.mGPUProcess.IsEnabled());
446   EXPECT_TRUE(mFeatures.mD3D11HwAngle.IsEnabled());
447   EXPECT_TRUE(mFeatures.mWrSoftware.IsEnabled());
448 }
449 
TEST_F(GfxConfigManager,WebRenderDisabledWithDisableHwCompositingNoWr)450 TEST_F(GfxConfigManager, WebRenderDisabledWithDisableHwCompositingNoWr) {
451   mDisableHwCompositingNoWr = true;
452   mMockGfxInfo->mStatusWr = nsIGfxInfo::FEATURE_DENIED;
453   ConfigureWebRender();
454 
455   EXPECT_FALSE(mFeatures.mWrQualified.IsEnabled());
456   EXPECT_FALSE(mFeatures.mWr.IsEnabled());
457   EXPECT_FALSE(mFeatures.mWrCompositor.IsEnabled());
458   EXPECT_TRUE(mFeatures.mWrAngle.IsEnabled());
459   EXPECT_FALSE(mFeatures.mWrDComp.IsEnabled());
460   EXPECT_TRUE(mFeatures.mWrPartial.IsEnabled());
461   EXPECT_FALSE(mFeatures.mWrShaderCache.IsEnabled());
462   EXPECT_FALSE(mFeatures.mWrOptimizedShaders.IsEnabled());
463   EXPECT_FALSE(mFeatures.mHwCompositing.IsEnabled());
464   EXPECT_FALSE(mFeatures.mGPUProcess.IsEnabled());
465   EXPECT_TRUE(mFeatures.mD3D11HwAngle.IsEnabled());
466   EXPECT_TRUE(mFeatures.mWrSoftware.IsEnabled());
467 }
468 
TEST_F(GfxConfigManager,WebRenderDisabledWithAllowSoftwareGPUProcess)469 TEST_F(GfxConfigManager, WebRenderDisabledWithAllowSoftwareGPUProcess) {
470   mDisableHwCompositingNoWr = true;
471   mMockGfxInfo->mStatusWr = nsIGfxInfo::FEATURE_DENIED;
472   mGPUProcessAllowSoftware = true;
473   ConfigureWebRender();
474 
475   EXPECT_FALSE(mFeatures.mWrQualified.IsEnabled());
476   EXPECT_FALSE(mFeatures.mWr.IsEnabled());
477   EXPECT_FALSE(mFeatures.mWrCompositor.IsEnabled());
478   EXPECT_TRUE(mFeatures.mWrAngle.IsEnabled());
479   EXPECT_FALSE(mFeatures.mWrDComp.IsEnabled());
480   EXPECT_TRUE(mFeatures.mWrPartial.IsEnabled());
481   EXPECT_FALSE(mFeatures.mWrShaderCache.IsEnabled());
482   EXPECT_FALSE(mFeatures.mWrOptimizedShaders.IsEnabled());
483   EXPECT_FALSE(mFeatures.mHwCompositing.IsEnabled());
484   EXPECT_TRUE(mFeatures.mGPUProcess.IsEnabled());
485   EXPECT_TRUE(mFeatures.mD3D11HwAngle.IsEnabled());
486   EXPECT_TRUE(mFeatures.mWrSoftware.IsEnabled());
487 }
488 
TEST_F(GfxConfigManager,WebRenderSafeMode)489 TEST_F(GfxConfigManager, WebRenderSafeMode) {
490   mSafeMode = true;
491   ConfigureWebRender();
492 
493   EXPECT_TRUE(mFeatures.mWrQualified.IsEnabled());
494   EXPECT_FALSE(mFeatures.mWr.IsEnabled());
495   EXPECT_FALSE(mFeatures.mWrCompositor.IsEnabled());
496   EXPECT_TRUE(mFeatures.mWrAngle.IsEnabled());
497   EXPECT_FALSE(mFeatures.mWrDComp.IsEnabled());
498   EXPECT_TRUE(mFeatures.mWrPartial.IsEnabled());
499   EXPECT_FALSE(mFeatures.mWrShaderCache.IsEnabled());
500   EXPECT_FALSE(mFeatures.mWrOptimizedShaders.IsEnabled());
501   EXPECT_TRUE(mFeatures.mHwCompositing.IsEnabled());
502   EXPECT_TRUE(mFeatures.mGPUProcess.IsEnabled());
503   EXPECT_TRUE(mFeatures.mD3D11HwAngle.IsEnabled());
504   EXPECT_TRUE(mFeatures.mWrSoftware.IsEnabled());
505 }
506 
TEST_F(GfxConfigManager,WebRenderEarlierThanWindows10)507 TEST_F(GfxConfigManager, WebRenderEarlierThanWindows10) {
508   mIsWin10OrLater = false;
509   ConfigureWebRender();
510 
511   EXPECT_TRUE(mFeatures.mWrQualified.IsEnabled());
512   EXPECT_TRUE(mFeatures.mWr.IsEnabled());
513   EXPECT_FALSE(mFeatures.mWrCompositor.IsEnabled());
514   EXPECT_TRUE(mFeatures.mWrAngle.IsEnabled());
515   EXPECT_FALSE(mFeatures.mWrDComp.IsEnabled());
516   EXPECT_TRUE(mFeatures.mWrPartial.IsEnabled());
517   EXPECT_TRUE(mFeatures.mWrShaderCache.IsEnabled());
518   EXPECT_TRUE(mFeatures.mWrOptimizedShaders.IsEnabled());
519   EXPECT_TRUE(mFeatures.mHwCompositing.IsEnabled());
520   EXPECT_TRUE(mFeatures.mGPUProcess.IsEnabled());
521   EXPECT_TRUE(mFeatures.mD3D11HwAngle.IsEnabled());
522   EXPECT_TRUE(mFeatures.mWrSoftware.IsEnabled());
523 }
524 
TEST_F(GfxConfigManager,WebRenderDCompDisabled)525 TEST_F(GfxConfigManager, WebRenderDCompDisabled) {
526   mWrDCompWinEnabled = false;
527   ConfigureWebRender();
528 
529   EXPECT_TRUE(mFeatures.mWrQualified.IsEnabled());
530   EXPECT_TRUE(mFeatures.mWr.IsEnabled());
531   EXPECT_FALSE(mFeatures.mWrCompositor.IsEnabled());
532   EXPECT_TRUE(mFeatures.mWrAngle.IsEnabled());
533   EXPECT_FALSE(mFeatures.mWrDComp.IsEnabled());
534   EXPECT_TRUE(mFeatures.mWrPartial.IsEnabled());
535   EXPECT_TRUE(mFeatures.mWrShaderCache.IsEnabled());
536   EXPECT_TRUE(mFeatures.mWrOptimizedShaders.IsEnabled());
537   EXPECT_TRUE(mFeatures.mHwCompositing.IsEnabled());
538   EXPECT_TRUE(mFeatures.mGPUProcess.IsEnabled());
539   EXPECT_TRUE(mFeatures.mD3D11HwAngle.IsEnabled());
540   EXPECT_TRUE(mFeatures.mWrSoftware.IsEnabled());
541 }
542 
TEST_F(GfxConfigManager,WebRenderDCompNotRequired)543 TEST_F(GfxConfigManager, WebRenderDCompNotRequired) {
544   mWrDCompWinEnabled = false;
545   mWrCompositorDCompRequired = false;
546   ConfigureWebRender();
547 
548   EXPECT_TRUE(mFeatures.mWrQualified.IsEnabled());
549   EXPECT_TRUE(mFeatures.mWr.IsEnabled());
550   EXPECT_TRUE(mFeatures.mWrCompositor.IsEnabled());
551   EXPECT_TRUE(mFeatures.mWrAngle.IsEnabled());
552   EXPECT_FALSE(mFeatures.mWrDComp.IsEnabled());
553   EXPECT_TRUE(mFeatures.mWrPartial.IsEnabled());
554   EXPECT_TRUE(mFeatures.mWrShaderCache.IsEnabled());
555   EXPECT_TRUE(mFeatures.mWrOptimizedShaders.IsEnabled());
556   EXPECT_TRUE(mFeatures.mHwCompositing.IsEnabled());
557   EXPECT_TRUE(mFeatures.mGPUProcess.IsEnabled());
558   EXPECT_TRUE(mFeatures.mD3D11HwAngle.IsEnabled());
559   EXPECT_TRUE(mFeatures.mWrSoftware.IsEnabled());
560 }
561 
TEST_F(GfxConfigManager,WebRenderForceAngleDisabled)562 TEST_F(GfxConfigManager, WebRenderForceAngleDisabled) {
563   mWrForceAngle = false;
564   ConfigureWebRender();
565 
566   EXPECT_TRUE(mFeatures.mWrQualified.IsEnabled());
567   EXPECT_TRUE(mFeatures.mWr.IsEnabled());
568   EXPECT_FALSE(mFeatures.mWrCompositor.IsEnabled());
569   EXPECT_FALSE(mFeatures.mWrAngle.IsEnabled());
570   EXPECT_FALSE(mFeatures.mWrDComp.IsEnabled());
571   EXPECT_TRUE(mFeatures.mWrPartial.IsEnabled());
572   EXPECT_TRUE(mFeatures.mWrShaderCache.IsEnabled());
573   EXPECT_TRUE(mFeatures.mWrOptimizedShaders.IsEnabled());
574   EXPECT_TRUE(mFeatures.mHwCompositing.IsEnabled());
575   EXPECT_TRUE(mFeatures.mGPUProcess.IsEnabled());
576   EXPECT_TRUE(mFeatures.mD3D11HwAngle.IsEnabled());
577   EXPECT_TRUE(mFeatures.mWrSoftware.IsEnabled());
578 }
579 
TEST_F(GfxConfigManager,WebRenderD3D11HwAngleDisabled)580 TEST_F(GfxConfigManager, WebRenderD3D11HwAngleDisabled) {
581   mFeatures.mD3D11HwAngle.UserDisable("", ""_ns);
582   ConfigureWebRender();
583 
584   EXPECT_TRUE(mFeatures.mWrQualified.IsEnabled());
585   EXPECT_FALSE(mFeatures.mWr.IsEnabled());
586   EXPECT_FALSE(mFeatures.mWrCompositor.IsEnabled());
587   EXPECT_FALSE(mFeatures.mWrAngle.IsEnabled());
588   EXPECT_FALSE(mFeatures.mWrDComp.IsEnabled());
589   EXPECT_TRUE(mFeatures.mWrPartial.IsEnabled());
590   EXPECT_FALSE(mFeatures.mWrShaderCache.IsEnabled());
591   EXPECT_FALSE(mFeatures.mWrOptimizedShaders.IsEnabled());
592   EXPECT_TRUE(mFeatures.mHwCompositing.IsEnabled());
593   EXPECT_TRUE(mFeatures.mGPUProcess.IsEnabled());
594   EXPECT_FALSE(mFeatures.mD3D11HwAngle.IsEnabled());
595   EXPECT_TRUE(mFeatures.mWrSoftware.IsEnabled());
596 }
597 
TEST_F(GfxConfigManager,WebRenderD3D11HwAngleAndForceAngleDisabled)598 TEST_F(GfxConfigManager, WebRenderD3D11HwAngleAndForceAngleDisabled) {
599   mWrForceAngle = false;
600   mFeatures.mD3D11HwAngle.UserDisable("", ""_ns);
601   ConfigureWebRender();
602 
603   EXPECT_TRUE(mFeatures.mWrQualified.IsEnabled());
604   EXPECT_TRUE(mFeatures.mWr.IsEnabled());
605   EXPECT_FALSE(mFeatures.mWrCompositor.IsEnabled());
606   EXPECT_FALSE(mFeatures.mWrAngle.IsEnabled());
607   EXPECT_FALSE(mFeatures.mWrDComp.IsEnabled());
608   EXPECT_TRUE(mFeatures.mWrPartial.IsEnabled());
609   EXPECT_TRUE(mFeatures.mWrShaderCache.IsEnabled());
610   EXPECT_TRUE(mFeatures.mWrOptimizedShaders.IsEnabled());
611   EXPECT_TRUE(mFeatures.mHwCompositing.IsEnabled());
612   EXPECT_TRUE(mFeatures.mGPUProcess.IsEnabled());
613   EXPECT_FALSE(mFeatures.mD3D11HwAngle.IsEnabled());
614   EXPECT_TRUE(mFeatures.mWrSoftware.IsEnabled());
615 }
616 
TEST_F(GfxConfigManager,WebRenderGPUProcessDisabled)617 TEST_F(GfxConfigManager, WebRenderGPUProcessDisabled) {
618   mFeatures.mGPUProcess.UserDisable("", ""_ns);
619   ConfigureWebRender();
620 
621   EXPECT_TRUE(mFeatures.mWrQualified.IsEnabled());
622   EXPECT_FALSE(mFeatures.mWr.IsEnabled());
623   EXPECT_FALSE(mFeatures.mWrCompositor.IsEnabled());
624   EXPECT_FALSE(mFeatures.mWrAngle.IsEnabled());
625   EXPECT_FALSE(mFeatures.mWrDComp.IsEnabled());
626   EXPECT_TRUE(mFeatures.mWrPartial.IsEnabled());
627   EXPECT_FALSE(mFeatures.mWrShaderCache.IsEnabled());
628   EXPECT_FALSE(mFeatures.mWrOptimizedShaders.IsEnabled());
629   EXPECT_TRUE(mFeatures.mHwCompositing.IsEnabled());
630   EXPECT_FALSE(mFeatures.mGPUProcess.IsEnabled());
631   EXPECT_TRUE(mFeatures.mD3D11HwAngle.IsEnabled());
632   EXPECT_TRUE(mFeatures.mWrSoftware.IsEnabled());
633 }
634 
TEST_F(GfxConfigManager,WebRenderQualifiedAndBlocklistAllowQualified)635 TEST_F(GfxConfigManager, WebRenderQualifiedAndBlocklistAllowQualified) {
636   mMockGfxInfo->mStatusWr = nsIGfxInfo::FEATURE_ALLOW_QUALIFIED;
637   ConfigureWebRender();
638 
639   EXPECT_TRUE(mFeatures.mWrQualified.IsEnabled());
640   EXPECT_TRUE(mFeatures.mWr.IsEnabled());
641   EXPECT_TRUE(mFeatures.mWrCompositor.IsEnabled());
642   EXPECT_TRUE(mFeatures.mWrAngle.IsEnabled());
643   EXPECT_TRUE(mFeatures.mWrDComp.IsEnabled());
644   EXPECT_TRUE(mFeatures.mWrPartial.IsEnabled());
645   EXPECT_TRUE(mFeatures.mWrShaderCache.IsEnabled());
646   EXPECT_TRUE(mFeatures.mWrOptimizedShaders.IsEnabled());
647   EXPECT_TRUE(mFeatures.mHwCompositing.IsEnabled());
648   EXPECT_TRUE(mFeatures.mGPUProcess.IsEnabled());
649   EXPECT_TRUE(mFeatures.mD3D11HwAngle.IsEnabled());
650   EXPECT_TRUE(mFeatures.mWrSoftware.IsEnabled());
651 }
652 
TEST_F(GfxConfigManager,WebRenderQualifiedAndBlocklistAllowAlways)653 TEST_F(GfxConfigManager, WebRenderQualifiedAndBlocklistAllowAlways) {
654   mIsNightly = mIsEarlyBetaOrEarlier = false;
655   mMockGfxInfo->mStatusWr = nsIGfxInfo::FEATURE_ALLOW_ALWAYS;
656   ConfigureWebRender();
657 
658   EXPECT_TRUE(mFeatures.mWrQualified.IsEnabled());
659   EXPECT_TRUE(mFeatures.mWr.IsEnabled());
660   EXPECT_TRUE(mFeatures.mWrCompositor.IsEnabled());
661   EXPECT_TRUE(mFeatures.mWrAngle.IsEnabled());
662   EXPECT_TRUE(mFeatures.mWrDComp.IsEnabled());
663   EXPECT_TRUE(mFeatures.mWrPartial.IsEnabled());
664   EXPECT_TRUE(mFeatures.mWrShaderCache.IsEnabled());
665   EXPECT_TRUE(mFeatures.mWrOptimizedShaders.IsEnabled());
666   EXPECT_TRUE(mFeatures.mHwCompositing.IsEnabled());
667   EXPECT_TRUE(mFeatures.mGPUProcess.IsEnabled());
668   EXPECT_TRUE(mFeatures.mD3D11HwAngle.IsEnabled());
669   EXPECT_TRUE(mFeatures.mWrSoftware.IsEnabled());
670 }
671 
TEST_F(GfxConfigManager,WebRenderIntelBatteryNoHwStretchingNotNightly)672 TEST_F(GfxConfigManager, WebRenderIntelBatteryNoHwStretchingNotNightly) {
673   mIsNightly = mIsEarlyBetaOrEarlier = false;
674   ++mHwStretchingSupport.mNone;
675   mScaledResolution = true;
676   mMockGfxInfo->mHasBattery.ref() = true;
677   mMockGfxInfo->mVendorId = "0x8086";
678   ConfigureWebRender();
679 
680   EXPECT_TRUE(mFeatures.mWrQualified.IsEnabled());
681   EXPECT_TRUE(mFeatures.mWr.IsEnabled());
682   EXPECT_FALSE(mFeatures.mWrCompositor.IsEnabled());
683   EXPECT_TRUE(mFeatures.mWrAngle.IsEnabled());
684   EXPECT_TRUE(mFeatures.mWrDComp.IsEnabled());
685   EXPECT_TRUE(mFeatures.mWrPartial.IsEnabled());
686   EXPECT_TRUE(mFeatures.mWrShaderCache.IsEnabled());
687   EXPECT_TRUE(mFeatures.mWrOptimizedShaders.IsEnabled());
688   EXPECT_TRUE(mFeatures.mHwCompositing.IsEnabled());
689   EXPECT_TRUE(mFeatures.mGPUProcess.IsEnabled());
690   EXPECT_TRUE(mFeatures.mD3D11HwAngle.IsEnabled());
691   EXPECT_TRUE(mFeatures.mWrSoftware.IsEnabled());
692 }
693 
TEST_F(GfxConfigManager,WebRenderNvidiaHighMixedRefreshRateNightly)694 TEST_F(GfxConfigManager, WebRenderNvidiaHighMixedRefreshRateNightly) {
695   mIsNightly = true;
696   mMockGfxInfo->mMaxRefreshRate = 120;
697   mMockGfxInfo->mHasMixedRefreshRate = true;
698   ConfigureWebRender();
699 
700   EXPECT_TRUE(mFeatures.mWrQualified.IsEnabled());
701   EXPECT_TRUE(mFeatures.mWr.IsEnabled());
702   EXPECT_TRUE(mFeatures.mWrCompositor.IsEnabled());
703   EXPECT_TRUE(mFeatures.mWrAngle.IsEnabled());
704   EXPECT_TRUE(mFeatures.mWrDComp.IsEnabled());
705   EXPECT_TRUE(mFeatures.mWrPartial.IsEnabled());
706   EXPECT_TRUE(mFeatures.mWrShaderCache.IsEnabled());
707   EXPECT_TRUE(mFeatures.mWrOptimizedShaders.IsEnabled());
708   EXPECT_TRUE(mFeatures.mHwCompositing.IsEnabled());
709   EXPECT_TRUE(mFeatures.mGPUProcess.IsEnabled());
710   EXPECT_TRUE(mFeatures.mD3D11HwAngle.IsEnabled());
711   EXPECT_TRUE(mFeatures.mWrSoftware.IsEnabled());
712 }
713 
TEST_F(GfxConfigManager,WebRenderNvidiaHighMixedRefreshRateNotNightly)714 TEST_F(GfxConfigManager, WebRenderNvidiaHighMixedRefreshRateNotNightly) {
715   mIsNightly = mIsEarlyBetaOrEarlier = false;
716   mMockGfxInfo->mMaxRefreshRate = 120;
717   mMockGfxInfo->mHasMixedRefreshRate = true;
718   ConfigureWebRender();
719 
720   EXPECT_TRUE(mFeatures.mWrQualified.IsEnabled());
721   EXPECT_TRUE(mFeatures.mWr.IsEnabled());
722   EXPECT_FALSE(mFeatures.mWrCompositor.IsEnabled());
723   EXPECT_TRUE(mFeatures.mWrAngle.IsEnabled());
724   EXPECT_FALSE(mFeatures.mWrDComp.IsEnabled());
725   EXPECT_TRUE(mFeatures.mWrPartial.IsEnabled());
726   EXPECT_TRUE(mFeatures.mWrShaderCache.IsEnabled());
727   EXPECT_TRUE(mFeatures.mWrOptimizedShaders.IsEnabled());
728   EXPECT_TRUE(mFeatures.mHwCompositing.IsEnabled());
729   EXPECT_TRUE(mFeatures.mGPUProcess.IsEnabled());
730   EXPECT_TRUE(mFeatures.mD3D11HwAngle.IsEnabled());
731   EXPECT_TRUE(mFeatures.mWrSoftware.IsEnabled());
732 }
733 
TEST_F(GfxConfigManager,WebRenderNvidiaHighRefreshRateNotNightly)734 TEST_F(GfxConfigManager, WebRenderNvidiaHighRefreshRateNotNightly) {
735   mMockGfxInfo->mMaxRefreshRate = 120;
736   ConfigureWebRender();
737 
738   EXPECT_TRUE(mFeatures.mWrQualified.IsEnabled());
739   EXPECT_TRUE(mFeatures.mWr.IsEnabled());
740   EXPECT_TRUE(mFeatures.mWrCompositor.IsEnabled());
741   EXPECT_TRUE(mFeatures.mWrAngle.IsEnabled());
742   EXPECT_TRUE(mFeatures.mWrDComp.IsEnabled());
743   EXPECT_TRUE(mFeatures.mWrPartial.IsEnabled());
744   EXPECT_TRUE(mFeatures.mWrShaderCache.IsEnabled());
745   EXPECT_TRUE(mFeatures.mWrOptimizedShaders.IsEnabled());
746   EXPECT_TRUE(mFeatures.mHwCompositing.IsEnabled());
747   EXPECT_TRUE(mFeatures.mGPUProcess.IsEnabled());
748   EXPECT_TRUE(mFeatures.mD3D11HwAngle.IsEnabled());
749   EXPECT_TRUE(mFeatures.mWrSoftware.IsEnabled());
750 }
751 
TEST_F(GfxConfigManager,WebRenderNvidiaLowMixedRefreshRateNotNightly)752 TEST_F(GfxConfigManager, WebRenderNvidiaLowMixedRefreshRateNotNightly) {
753   mMockGfxInfo->mMaxRefreshRate = 60;
754   mMockGfxInfo->mHasMixedRefreshRate = true;
755   ConfigureWebRender();
756 
757   EXPECT_TRUE(mFeatures.mWrQualified.IsEnabled());
758   EXPECT_TRUE(mFeatures.mWr.IsEnabled());
759   EXPECT_TRUE(mFeatures.mWrCompositor.IsEnabled());
760   EXPECT_TRUE(mFeatures.mWrAngle.IsEnabled());
761   EXPECT_TRUE(mFeatures.mWrDComp.IsEnabled());
762   EXPECT_TRUE(mFeatures.mWrPartial.IsEnabled());
763   EXPECT_TRUE(mFeatures.mWrShaderCache.IsEnabled());
764   EXPECT_TRUE(mFeatures.mWrOptimizedShaders.IsEnabled());
765   EXPECT_TRUE(mFeatures.mHwCompositing.IsEnabled());
766   EXPECT_TRUE(mFeatures.mGPUProcess.IsEnabled());
767   EXPECT_TRUE(mFeatures.mD3D11HwAngle.IsEnabled());
768   EXPECT_TRUE(mFeatures.mWrSoftware.IsEnabled());
769 }
770 
TEST_F(GfxConfigManager,WebRenderSofwareAndNotQualified)771 TEST_F(GfxConfigManager, WebRenderSofwareAndNotQualified) {
772   mMockGfxInfo->mStatusWr = nsIGfxInfo::FEATURE_DENIED;
773   ConfigureWebRender();
774 
775   EXPECT_FALSE(mFeatures.mWrQualified.IsEnabled());
776   EXPECT_FALSE(mFeatures.mWr.IsEnabled());
777   EXPECT_FALSE(mFeatures.mWrCompositor.IsEnabled());
778   EXPECT_TRUE(mFeatures.mWrAngle.IsEnabled());
779   EXPECT_FALSE(mFeatures.mWrDComp.IsEnabled());
780   EXPECT_TRUE(mFeatures.mWrPartial.IsEnabled());
781   EXPECT_FALSE(mFeatures.mWrShaderCache.IsEnabled());
782   EXPECT_FALSE(mFeatures.mWrOptimizedShaders.IsEnabled());
783   EXPECT_TRUE(mFeatures.mHwCompositing.IsEnabled());
784   EXPECT_TRUE(mFeatures.mGPUProcess.IsEnabled());
785   EXPECT_TRUE(mFeatures.mD3D11HwAngle.IsEnabled());
786   EXPECT_TRUE(mFeatures.mWrSoftware.IsEnabled());
787 }
788 
TEST_F(GfxConfigManager,WebRenderForceEnabledEnvvar)789 TEST_F(GfxConfigManager, WebRenderForceEnabledEnvvar) {
790   mWrEnvForceEnabled = true;
791   mMockGfxInfo->mStatusWr = nsIGfxInfo::FEATURE_DENIED;
792   ConfigureWebRender();
793 
794   EXPECT_FALSE(mFeatures.mWrQualified.IsEnabled());
795   EXPECT_TRUE(mFeatures.mWr.IsEnabled());
796   EXPECT_TRUE(mFeatures.mWrCompositor.IsEnabled());
797   EXPECT_TRUE(mFeatures.mWrAngle.IsEnabled());
798   EXPECT_TRUE(mFeatures.mWrDComp.IsEnabled());
799   EXPECT_TRUE(mFeatures.mWrPartial.IsEnabled());
800   EXPECT_TRUE(mFeatures.mWrShaderCache.IsEnabled());
801   EXPECT_TRUE(mFeatures.mWrOptimizedShaders.IsEnabled());
802   EXPECT_TRUE(mFeatures.mHwCompositing.IsEnabled());
803   EXPECT_TRUE(mFeatures.mGPUProcess.IsEnabled());
804   EXPECT_TRUE(mFeatures.mD3D11HwAngle.IsEnabled());
805   EXPECT_TRUE(mFeatures.mWrSoftware.IsEnabled());
806 }
807 
TEST_F(GfxConfigManager,WebRenderSoftwareAllowedForceEnabledPref)808 TEST_F(GfxConfigManager, WebRenderSoftwareAllowedForceEnabledPref) {
809   mWrForceEnabled = true;
810   mMockGfxInfo->mStatusWr = nsIGfxInfo::FEATURE_DENIED;
811   ConfigureWebRender();
812 
813   EXPECT_FALSE(mFeatures.mWrQualified.IsEnabled());
814   EXPECT_TRUE(mFeatures.mWr.IsEnabled());
815   EXPECT_TRUE(mFeatures.mWrCompositor.IsEnabled());
816   EXPECT_TRUE(mFeatures.mWrAngle.IsEnabled());
817   EXPECT_TRUE(mFeatures.mWrDComp.IsEnabled());
818   EXPECT_TRUE(mFeatures.mWrPartial.IsEnabled());
819   EXPECT_TRUE(mFeatures.mWrShaderCache.IsEnabled());
820   EXPECT_TRUE(mFeatures.mWrOptimizedShaders.IsEnabled());
821   EXPECT_TRUE(mFeatures.mHwCompositing.IsEnabled());
822   EXPECT_TRUE(mFeatures.mGPUProcess.IsEnabled());
823   EXPECT_TRUE(mFeatures.mD3D11HwAngle.IsEnabled());
824   EXPECT_TRUE(mFeatures.mWrSoftware.IsEnabled());
825 }
826 
TEST_F(GfxConfigManager,WebRenderForceSoftwareForceEnabledEnvvar)827 TEST_F(GfxConfigManager, WebRenderForceSoftwareForceEnabledEnvvar) {
828   mWrEnvForceEnabled = true;
829   mWrSoftwareForceEnabled = true;
830   mMockGfxInfo->mStatusWr = nsIGfxInfo::FEATURE_DENIED;
831   ConfigureWebRender();
832 
833   EXPECT_FALSE(mFeatures.mWrQualified.IsEnabled());
834   EXPECT_FALSE(mFeatures.mWr.IsEnabled());
835   EXPECT_FALSE(mFeatures.mWrCompositor.IsEnabled());
836   EXPECT_TRUE(mFeatures.mWrAngle.IsEnabled());
837   EXPECT_FALSE(mFeatures.mWrDComp.IsEnabled());
838   EXPECT_TRUE(mFeatures.mWrPartial.IsEnabled());
839   EXPECT_FALSE(mFeatures.mWrShaderCache.IsEnabled());
840   EXPECT_FALSE(mFeatures.mWrOptimizedShaders.IsEnabled());
841   EXPECT_TRUE(mFeatures.mHwCompositing.IsEnabled());
842   EXPECT_TRUE(mFeatures.mGPUProcess.IsEnabled());
843   EXPECT_TRUE(mFeatures.mD3D11HwAngle.IsEnabled());
844   EXPECT_TRUE(mFeatures.mWrSoftware.IsEnabled());
845 }
846 
TEST_F(GfxConfigManager,WebRenderSoftwareReleaseWindowsGPUProcessDisabled)847 TEST_F(GfxConfigManager, WebRenderSoftwareReleaseWindowsGPUProcessDisabled) {
848   mIsNightly = mIsEarlyBetaOrEarlier = false;
849   mMockGfxInfo->mStatusWr = nsIGfxInfo::FEATURE_DENIED;
850   mFeatures.mGPUProcess.UserDisable("", ""_ns);
851   ConfigureWebRender();
852 
853   EXPECT_FALSE(mFeatures.mWrQualified.IsEnabled());
854   EXPECT_FALSE(mFeatures.mWr.IsEnabled());
855   EXPECT_FALSE(mFeatures.mWrCompositor.IsEnabled());
856   EXPECT_FALSE(mFeatures.mWrAngle.IsEnabled());
857   EXPECT_FALSE(mFeatures.mWrDComp.IsEnabled());
858   EXPECT_TRUE(mFeatures.mWrPartial.IsEnabled());
859   EXPECT_FALSE(mFeatures.mWrShaderCache.IsEnabled());
860   EXPECT_FALSE(mFeatures.mWrOptimizedShaders.IsEnabled());
861   EXPECT_TRUE(mFeatures.mHwCompositing.IsEnabled());
862   EXPECT_FALSE(mFeatures.mGPUProcess.IsEnabled());
863   EXPECT_TRUE(mFeatures.mD3D11HwAngle.IsEnabled());
864   EXPECT_TRUE(mFeatures.mWrSoftware.IsEnabled());
865 }
866 
TEST_F(GfxConfigManager,WebRenderSoftwareReleaseGPUProcessDisabled)867 TEST_F(GfxConfigManager, WebRenderSoftwareReleaseGPUProcessDisabled) {
868   mIsNightly = mIsEarlyBetaOrEarlier = false;
869   mIsWin10OrLater = false;
870   mFeatureD3D11Compositing = nullptr;
871   mMockGfxInfo->mStatusWr = nsIGfxInfo::FEATURE_DENIED;
872   mFeatures.mGPUProcess.UserDisable("", ""_ns);
873   ConfigureWebRender();
874 
875   EXPECT_FALSE(mFeatures.mWrQualified.IsEnabled());
876   EXPECT_FALSE(mFeatures.mWr.IsEnabled());
877   EXPECT_FALSE(mFeatures.mWrCompositor.IsEnabled());
878   EXPECT_FALSE(mFeatures.mWrAngle.IsEnabled());
879   EXPECT_FALSE(mFeatures.mWrDComp.IsEnabled());
880   EXPECT_TRUE(mFeatures.mWrPartial.IsEnabled());
881   EXPECT_FALSE(mFeatures.mWrShaderCache.IsEnabled());
882   EXPECT_FALSE(mFeatures.mWrOptimizedShaders.IsEnabled());
883   EXPECT_TRUE(mFeatures.mHwCompositing.IsEnabled());
884   EXPECT_FALSE(mFeatures.mGPUProcess.IsEnabled());
885   EXPECT_TRUE(mFeatures.mD3D11HwAngle.IsEnabled());
886   EXPECT_TRUE(mFeatures.mWrSoftware.IsEnabled());
887 }
888 
TEST_F(GfxConfigManager,WebRenderShaderCacheDisabled)889 TEST_F(GfxConfigManager, WebRenderShaderCacheDisabled) {
890   mWrShaderCache = Some(false);
891   ConfigureWebRender();
892 
893   EXPECT_TRUE(mFeatures.mWrQualified.IsEnabled());
894   EXPECT_TRUE(mFeatures.mWr.IsEnabled());
895   EXPECT_TRUE(mFeatures.mWrCompositor.IsEnabled());
896   EXPECT_TRUE(mFeatures.mWrAngle.IsEnabled());
897   EXPECT_TRUE(mFeatures.mWrDComp.IsEnabled());
898   EXPECT_FALSE(mFeatures.mWrShaderCache.IsEnabled());
899   EXPECT_TRUE(mFeatures.mWrOptimizedShaders.IsEnabled());
900   EXPECT_TRUE(mFeatures.mWrPartial.IsEnabled());
901   EXPECT_TRUE(mFeatures.mHwCompositing.IsEnabled());
902   EXPECT_TRUE(mFeatures.mGPUProcess.IsEnabled());
903   EXPECT_TRUE(mFeatures.mD3D11HwAngle.IsEnabled());
904   EXPECT_TRUE(mFeatures.mWrSoftware.IsEnabled());
905 }
906 
TEST_F(GfxConfigManager,WebRenderShaderCacheBlocked)907 TEST_F(GfxConfigManager, WebRenderShaderCacheBlocked) {
908   mMockGfxInfo->mStatusWrShaderCache = nsIGfxInfo::FEATURE_BLOCKED_DEVICE;
909   ConfigureWebRender();
910 
911   EXPECT_TRUE(mFeatures.mWrQualified.IsEnabled());
912   EXPECT_TRUE(mFeatures.mWr.IsEnabled());
913   EXPECT_TRUE(mFeatures.mWrCompositor.IsEnabled());
914   EXPECT_TRUE(mFeatures.mWrAngle.IsEnabled());
915   EXPECT_TRUE(mFeatures.mWrDComp.IsEnabled());
916   EXPECT_FALSE(mFeatures.mWrShaderCache.IsEnabled());
917   EXPECT_TRUE(mFeatures.mWrOptimizedShaders.IsEnabled());
918   EXPECT_TRUE(mFeatures.mWrPartial.IsEnabled());
919   EXPECT_TRUE(mFeatures.mHwCompositing.IsEnabled());
920   EXPECT_TRUE(mFeatures.mGPUProcess.IsEnabled());
921   EXPECT_TRUE(mFeatures.mD3D11HwAngle.IsEnabled());
922   EXPECT_TRUE(mFeatures.mWrSoftware.IsEnabled());
923 }
924