Bug 1158089 - Fall back to d3d9 DXVA if d3d11 initialization fails. r=cpearce

This commit is contained in:
Matt Woodrow 2015-05-11 16:21:31 +12:00
parent 45163479b0
commit 197db41200
4 changed files with 26 additions and 4 deletions

View File

@ -147,7 +147,7 @@ public:
};
bool
WMFVideoMFTManager::InitializeDXVA()
WMFVideoMFTManager::InitializeDXVA(bool aForceD3D9)
{
MOZ_ASSERT(!mDXVA2Manager);
@ -162,7 +162,8 @@ WMFVideoMFTManager::InitializeDXVA()
}
// The DXVA manager must be created on the main thread.
nsRefPtr<CreateDXVAManagerEvent> event(new CreateDXVAManagerEvent(mLayersBackend));
nsRefPtr<CreateDXVAManagerEvent> event =
new CreateDXVAManagerEvent(aForceD3D9 ? LayersBackend::LAYERS_D3D9 : mLayersBackend);
if (NS_IsMainThread()) {
event->Run();
@ -176,9 +177,24 @@ WMFVideoMFTManager::InitializeDXVA()
TemporaryRef<MFTDecoder>
WMFVideoMFTManager::Init()
{
RefPtr<MFTDecoder> decoder = InitInternal(/* aForceD3D9 = */ false);
// If initialization failed with d3d11 DXVA then try falling back
// to d3d9.
if (!decoder && mDXVA2Manager && mDXVA2Manager->IsD3D11()) {
mDXVA2Manager = nullptr;
decoder = InitInternal(true);
}
return decoder.forget();
}
TemporaryRef<MFTDecoder>
WMFVideoMFTManager::InitInternal(bool aForceD3D9)
{
mUseHwAccel = false; // default value; changed if D3D setup succeeds.
bool useDxva = InitializeDXVA();
bool useDxva = InitializeDXVA(aForceD3D9);
RefPtr<MFTDecoder> decoder(new MFTDecoder());

View File

@ -39,7 +39,9 @@ public:
private:
bool InitializeDXVA();
bool InitializeDXVA(bool aForceD3D9);
TemporaryRef<MFTDecoder> InitInternal(bool aForceD3D9);
HRESULT ConfigureVideoFrameGeometry();

View File

@ -238,6 +238,8 @@ public:
virtual HRESULT ConfigureForSize(uint32_t aWidth, uint32_t aHeight) override;
virtual bool IsD3D11() override { return true; }
private:
HRESULT CreateFormatConverter();

View File

@ -40,6 +40,8 @@ public:
virtual HRESULT ConfigureForSize(uint32_t aWidth, uint32_t aHeight) { return S_OK; }
virtual bool IsD3D11() { return false; }
virtual ~DXVA2Manager();
protected: