diff --git a/dom/media/platforms/wmf/WMFVideoMFTManager.cpp b/dom/media/platforms/wmf/WMFVideoMFTManager.cpp index 1c7f874960ff..25e85d90aa61 100644 --- a/dom/media/platforms/wmf/WMFVideoMFTManager.cpp +++ b/dom/media/platforms/wmf/WMFVideoMFTManager.cpp @@ -156,13 +156,23 @@ public: NS_IMETHOD Run() { NS_ASSERTION(NS_IsMainThread(), "Must be on main thread."); + nsACString* failureReason = &mFailureReason; + nsCString secondFailureReason; if (mBackend == LayersBackend::LAYERS_D3D11 && Preferences::GetBool("media.windows-media-foundation.allow-d3d11-dxva", true) && IsWin8OrLater()) { - mDXVA2Manager = DXVA2Manager::CreateD3D11DXVA(mFailureReason); - } else { - mDXVA2Manager = DXVA2Manager::CreateD3D9DXVA(mFailureReason); + mDXVA2Manager = DXVA2Manager::CreateD3D11DXVA(*failureReason); + if (mDXVA2Manager) { + return NS_OK; + } + // Try again with d3d9, but record the failure reason + // into a new var to avoid overwriting the d3d11 failure. + failureReason = &secondFailureReason; + mFailureReason.Append(NS_LITERAL_CSTRING("; ")); } + mDXVA2Manager = DXVA2Manager::CreateD3D9DXVA(*failureReason); + // Make sure we include the messages from both attempts (if applicable). + mFailureReason.Append(secondFailureReason); return NS_OK; } nsAutoPtr mDXVA2Manager; @@ -206,21 +216,13 @@ WMFVideoMFTManager::Init() { bool success = InitInternal(/* aForceD3D9 = */ false); - // If initialization failed with d3d11 DXVA then try falling back - // to d3d9. - if (!success && mDXVA2Manager && mDXVA2Manager->IsD3D11()) { - mDXVA2Manager = nullptr; - nsCString d3d11Failure = mDXVAFailureReason; - success = InitInternal(true); - mDXVAFailureReason.Append(NS_LITERAL_CSTRING("; ")); - mDXVAFailureReason.Append(d3d11Failure); - } - if (success && mDXVA2Manager) { + // If we had some failures but eventually made it work, + // make sure we preserve the messages. if (mDXVA2Manager->IsD3D11()) { - mDXVAFailureReason.AssignLiteral("Using D3D11 API"); + mDXVAFailureReason.Append(NS_LITERAL_CSTRING("Using D3D11 API")); } else { - mDXVAFailureReason.AssignLiteral("Using D3D9 API"); + mDXVAFailureReason.Append(NS_LITERAL_CSTRING("Using D3D9 API")); } }