Bug 1709476 - Allow falling back to Software WebRender from D3D11/WebRender in release. r=jrmuizel

If a user is able to get D3D11, and Software WebRender hasn't been
forced on (either by the Fission experiment or our pref), then we prefer
D3D11 in late beta and release. This will allow users who start with
D3D11 in the GPU process, to fallback to Software WebRender in the GPU
process.

Differential Revision: https://phabricator.services.mozilla.com/D114286
This commit is contained in:
Andrew Osmond 2021-05-05 14:31:46 +00:00
parent af2746449f
commit c46e4b35ef
5 changed files with 63 additions and 59 deletions

View File

@ -171,17 +171,11 @@ void gfxConfigManager::ConfigureWebRenderSoftware() {
break;
}
if (!mIsEarlyBetaOrEarlier && mFeatureD3D11Compositing) {
if (!mFeatureGPUProcess->IsEnabled()) {
mFeatureWrSoftware->Disable(FeatureStatus::Unavailable,
"Requires GPU process on release",
"FEATURE_FAILURE_RELEASE_NO_GPU_PROCESS"_ns);
}
if (mFeatureD3D11Compositing->IsEnabled()) {
mFeatureWrSoftware->Disable(FeatureStatus::Unavailable,
"User has D3D11 support on release",
"FEATURE_FAILURE_RELEASE_D3D11_SUPPORTED"_ns);
}
if (!mIsEarlyBetaOrEarlier && mFeatureD3D11Compositing &&
!mFeatureGPUProcess->IsEnabled()) {
mFeatureWrSoftware->Disable(FeatureStatus::Unavailable,
"Requires GPU process on release",
"FEATURE_FAILURE_RELEASE_NO_GPU_PROCESS"_ns);
}
}

View File

@ -201,6 +201,10 @@ bool GPUProcessManager::MaybeDisableGPUProcess(const char* aMessage,
return true;
}
if (!aAllowRestart) {
gfxConfig::SetFailed(Feature::GPU_PROCESS, FeatureStatus::Failed, aMessage);
}
bool wantRestart = gfxPlatform::FallbackFromAcceleration(
FeatureStatus::Unavailable, "GPU Process is disabled",
"FEATURE_FAILURE_GPU_PROCESS_DISABLED"_ns);
@ -209,7 +213,10 @@ bool GPUProcessManager::MaybeDisableGPUProcess(const char* aMessage,
return false;
}
gfxConfig::SetFailed(Feature::GPU_PROCESS, FeatureStatus::Failed, aMessage);
if (aAllowRestart) {
gfxConfig::SetFailed(Feature::GPU_PROCESS, FeatureStatus::Failed, aMessage);
}
gfxCriticalNote << aMessage;
gfxPlatform::DisableGPUProcess();

View File

@ -983,47 +983,6 @@ TEST_F(GfxConfigManager, WebRenderForceSoftwareForceEnabledEnvvar) {
EXPECT_TRUE(mFeatures.mWrSoftware.IsEnabled());
}
TEST_F(GfxConfigManager, WebRenderSoftwareReleaseD3D11Enabled) {
mIsNightly = mIsEarlyBetaOrEarlier = false;
mMockGfxInfo->mStatusWr = nsIGfxInfo::FEATURE_DENIED;
mMockGfxInfo->mStatusWrSoftware = nsIGfxInfo::FEATURE_ALLOW_ALWAYS;
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_FALSE(mFeatures.mWrShaderCache.IsEnabled());
EXPECT_FALSE(mFeatures.mWrOptimizedShaders.IsEnabled());
EXPECT_TRUE(mFeatures.mHwCompositing.IsEnabled());
EXPECT_TRUE(mFeatures.mGPUProcess.IsEnabled());
EXPECT_TRUE(mFeatures.mD3D11HwAngle.IsEnabled());
EXPECT_FALSE(mFeatures.mWrSoftware.IsEnabled());
}
TEST_F(GfxConfigManager, WebRenderSoftwareReleaseD3D11Disabled) {
mIsNightly = mIsEarlyBetaOrEarlier = false;
mMockGfxInfo->mStatusWr = nsIGfxInfo::FEATURE_DENIED;
mMockGfxInfo->mStatusWrSoftware = nsIGfxInfo::FEATURE_ALLOW_ALWAYS;
mFeatures.mD3D11Compositing.UserDisable("", ""_ns);
ConfigureWebRender();
EXPECT_FALSE(mFeatures.mWrQualified.IsEnabled());
EXPECT_FALSE(mFeatures.mWr.IsEnabled());
EXPECT_FALSE(mFeatures.mWrCompositor.IsEnabled());
EXPECT_TRUE(mFeatures.mWrAngle.IsEnabled());
EXPECT_FALSE(mFeatures.mWrDComp.IsEnabled());
EXPECT_TRUE(mFeatures.mWrPartial.IsEnabled());
EXPECT_FALSE(mFeatures.mWrShaderCache.IsEnabled());
EXPECT_FALSE(mFeatures.mWrOptimizedShaders.IsEnabled());
EXPECT_TRUE(mFeatures.mHwCompositing.IsEnabled());
EXPECT_TRUE(mFeatures.mGPUProcess.IsEnabled());
EXPECT_TRUE(mFeatures.mD3D11HwAngle.IsEnabled());
EXPECT_TRUE(mFeatures.mWrSoftware.IsEnabled());
}
TEST_F(GfxConfigManager, WebRenderSoftwareReleaseWindowsGPUProcessDisabled) {
mIsNightly = mIsEarlyBetaOrEarlier = false;
mMockGfxInfo->mStatusWr = nsIGfxInfo::FEATURE_DENIED;

View File

@ -2671,6 +2671,18 @@ void gfxPlatform::InitWebRenderConfig() {
bool hasHardware = gfxConfig::IsEnabled(Feature::WEBRENDER);
bool hasSoftware = gfxConfig::IsEnabled(Feature::WEBRENDER_SOFTWARE);
#if defined(XP_WIN) && !defined(EARLY_BETA_OR_EARLIER)
// If we have D3D11 compositing, and Software WebRender isn't forced on, then
// we should prefer D3D11 compositing over Software WebRender in late beta and
// release by default. We may chose to fallback to Software WebRender in
// gfxPlatform::FallbackFromAcceleration.
if (gfxConfig::IsEnabled(Feature::D3D11_COMPOSITING) &&
!gfxConfig::IsForcedOnByUser(Feature::WEBRENDER_SOFTWARE)) {
hasSoftware = false;
}
#endif
bool hasWebRender = hasHardware || hasSoftware;
#ifdef XP_WIN
@ -3366,11 +3378,19 @@ bool gfxPlatform::FallbackFromAcceleration(FeatureStatus aStatus,
.ForceDisable(aStatus, aMessage, aFailureId);
}
// Determine whether or not we are allowed to use Software WebRender in
// fallback without the GPU process. Either the pref is false, or the feature
// is enabled and we are currently still using it.
bool swglFallbackAllowed =
!StaticPrefs::
gfx_webrender_fallback_software_requires_gpu_process_AtStartup() ||
gfxConfig::IsEnabled(Feature::GPU_PROCESS);
#ifdef XP_WIN
// Before we disable D3D11 and HW_COMPOSITING, we should check if we can
// fallback from WebRender to Software WebRender + D3D11 compositing.
if (StaticPrefs::gfx_webrender_fallback_software_d3d11_AtStartup() &&
gfxVars::AllowSoftwareWebRenderD3D11() &&
swglFallbackAllowed && gfxVars::AllowSoftwareWebRenderD3D11() &&
gfxConfig::IsEnabled(Feature::WEBRENDER_SOFTWARE) &&
gfxConfig::IsEnabled(Feature::D3D11_COMPOSITING) &&
gfxVars::UseWebRender() && !gfxVars::UseSoftwareWebRender()) {
@ -3381,7 +3401,7 @@ bool gfxPlatform::FallbackFromAcceleration(FeatureStatus aStatus,
}
if (StaticPrefs::gfx_webrender_fallback_software_d3d11_AtStartup() &&
gfxVars::AllowSoftwareWebRenderD3D11() &&
swglFallbackAllowed && gfxVars::AllowSoftwareWebRenderD3D11() &&
gfxVars::UseSoftwareWebRender()) {
// Fallback from Software WebRender + D3D11 to Software WebRender.
gfxCriticalNote << "Fallback SW-WR + D3D11 to SW-WR";
@ -3391,14 +3411,25 @@ bool gfxPlatform::FallbackFromAcceleration(FeatureStatus aStatus,
// We aren't using Software WebRender + D3D11 compositing, so turn off the
// D3D11 and D2D.
if (gfxConfig::IsEnabled(Feature::D3D11_COMPOSITING)) {
gfxConfig::GetFeature(Feature::D3D11_COMPOSITING)
.ForceDisable(aStatus, aMessage, aFailureId);
}
if (gfxConfig::IsEnabled(Feature::DIRECT2D)) {
gfxConfig::GetFeature(Feature::DIRECT2D)
.ForceDisable(aStatus, aMessage, aFailureId);
}
if (gfxConfig::IsEnabled(Feature::D3D11_COMPOSITING)) {
gfxConfig::GetFeature(Feature::D3D11_COMPOSITING)
.ForceDisable(aStatus, aMessage, aFailureId);
if (StaticPrefs::gfx_webrender_fallback_software_AtStartup() &&
swglFallbackAllowed &&
gfxConfig::IsEnabled(Feature::WEBRENDER_SOFTWARE) &&
!gfxVars::UseWebRender()) {
// Fallback from D3D11 to Software WebRender.
gfxCriticalNote << "Fallback D3D11 to SW-WR";
gfxVars::SetUseWebRender(true);
gfxVars::SetUseSoftwareWebRender(true);
return true;
}
}
#endif
#ifndef MOZ_WIDGET_ANDROID
@ -3417,6 +3448,7 @@ bool gfxPlatform::FallbackFromAcceleration(FeatureStatus aStatus,
}
if (StaticPrefs::gfx_webrender_fallback_software_AtStartup() &&
swglFallbackAllowed &&
gfxConfig::IsEnabled(Feature::WEBRENDER_SOFTWARE) &&
!gfxVars::UseSoftwareWebRender()) {
// Fallback from WebRender to Software WebRender.

View File

@ -4985,6 +4985,8 @@
type: bool
#if defined(MOZ_WIDGET_ANDROID)
value: false
#elif defined(XP_WIN) || defined(MOZ_WIDGET_GTK)
value: true
#else
value: @IS_EARLY_BETA_OR_EARLIER@
#endif
@ -4998,6 +5000,16 @@
mirror: once
#endif
# Whether or not fallback to Software WebRender requires the GPU process.
- name: gfx.webrender.fallback.software.requires-gpu-process
type: bool
#if defined(XP_WIN)
value: @IS_NOT_EARLY_BETA_OR_EARLIER@
#else
value: false
#endif
mirror: once
- name: gfx.webrender.program-binary-disk
type: bool
#if defined(XP_WIN) || defined(ANDROID)