diff options
author | Hendrik Leppkes <h.leppkes@gmail.com> | 2017-08-20 19:26:35 +0300 |
---|---|---|
committer | Hendrik Leppkes <h.leppkes@gmail.com> | 2017-08-20 19:26:35 +0300 |
commit | 1911009d231a27d7c87ed5d773356fb594e87a5f (patch) | |
tree | 3e421cd54a78d0033a6c33553406ff50755e1f91 /decoder/LAVVideo | |
parent | 4ec93e5857a2341d65376c15c859f4b288a55774 (diff) |
d3d11: implement saving of the selected device
Diffstat (limited to 'decoder/LAVVideo')
-rw-r--r-- | decoder/LAVVideo/LAVVideo.cpp | 35 | ||||
-rw-r--r-- | decoder/LAVVideo/LAVVideo.h | 2 | ||||
-rw-r--r-- | decoder/LAVVideo/decoders/ILAVDecoder.h | 1 | ||||
-rw-r--r-- | decoder/LAVVideo/decoders/d3d11va.cpp | 63 |
4 files changed, 100 insertions, 1 deletions
diff --git a/decoder/LAVVideo/LAVVideo.cpp b/decoder/LAVVideo/LAVVideo.cpp index 936471a0..0bf4d79e 100644 --- a/decoder/LAVVideo/LAVVideo.cpp +++ b/decoder/LAVVideo/LAVVideo.cpp @@ -182,6 +182,9 @@ HRESULT CLAVVideo::LoadDefaults() m_settings.HWAccelDeviceDXVA2 = LAVHWACCEL_DEVICE_DEFAULT; m_settings.HWAccelDeviceDXVA2Desc = 0; + m_settings.HWAccelDeviceD3D11 = LAVHWACCEL_DEVICE_DEFAULT; + m_settings.HWAccelDeviceD3D11Desc = 0; + m_settings.bH264MVCOverride = TRUE; return S_OK; @@ -314,6 +317,12 @@ HRESULT CLAVVideo::ReadSettings(HKEY rootKey) dwVal = regHW.ReadDWORD(L"HWAccelDeviceDXVA2Desc", hr); if (SUCCEEDED(hr)) m_settings.HWAccelDeviceDXVA2Desc = dwVal; + dwVal = regHW.ReadDWORD(L"HWAccelDeviceD3D11", hr); + if (SUCCEEDED(hr)) m_settings.HWAccelDeviceD3D11 = dwVal; + + dwVal = regHW.ReadDWORD(L"HWAccelDeviceD3D11Desc", hr); + if (SUCCEEDED(hr)) m_settings.HWAccelDeviceD3D11Desc = dwVal; + bFlag = regHW.ReadBOOL(L"HWAccelCUVIDXVA", hr); if (SUCCEEDED(hr)) m_settings.HWAccelCUVIDXVA = bFlag; } @@ -373,6 +382,9 @@ HRESULT CLAVVideo::SaveSettings() regHW.WriteDWORD(L"HWAccelDeviceDXVA2", m_settings.HWAccelDeviceDXVA2); regHW.WriteDWORD(L"HWAccelDeviceDXVA2Desc", m_settings.HWAccelDeviceDXVA2Desc); + regHW.WriteDWORD(L"HWAccelDeviceD3D11", m_settings.HWAccelDeviceD3D11); + regHW.WriteDWORD(L"HWAccelDeviceD3D11Desc", m_settings.HWAccelDeviceD3D11Desc); + regHW.WriteBOOL(L"HWAccelCUVIDXVA", m_settings.HWAccelCUVIDXVA); reg.WriteDWORD(L"SWDeintMode", m_settings.SWDeintMode); @@ -2425,7 +2437,24 @@ STDMETHODIMP_(DWORD) CLAVVideo::GetHWAccelDeviceIndex(LAVHWAccel hwAccel, DWORD *pdwDeviceIdentifier = dwDeviceId; return dwDeviceIndex; - } + } else if (hwAccel == HWAccel_D3D11) { + DWORD dwDeviceIndex = m_settings.HWAccelDeviceD3D11; + DWORD dwDeviceId = m_settings.HWAccelDeviceD3D11Desc; + + // verify the values and re-match them to adapters appropriately + if (dwDeviceIndex != LAVHWACCEL_DEVICE_DEFAULT && dwDeviceId != 0) { + hr = VerifyD3D11Device(dwDeviceIndex, dwDeviceId); + if (FAILED(hr)) { + dwDeviceIndex = LAVHWACCEL_DEVICE_DEFAULT; + dwDeviceId = 0; + } + } + + if (pdwDeviceIdentifier) + *pdwDeviceIdentifier = dwDeviceId; + + return dwDeviceIndex; + } if (pdwDeviceIdentifier) *pdwDeviceIdentifier = 0; @@ -2444,6 +2473,10 @@ STDMETHODIMP CLAVVideo::SetHWAccelDeviceIndex(LAVHWAccel hwAccel, DWORD dwIndex, m_settings.HWAccelDeviceDXVA2 = dwIndex; m_settings.HWAccelDeviceDXVA2Desc = dwDeviceIdentifier; } + else if (hwAccel == HWAccel_D3D11) { + m_settings.HWAccelDeviceD3D11 = dwIndex; + m_settings.HWAccelDeviceD3D11Desc = dwDeviceIdentifier; + } return SaveSettings(); } else { diff --git a/decoder/LAVVideo/LAVVideo.h b/decoder/LAVVideo/LAVVideo.h index 0ecc5a19..e48aca13 100644 --- a/decoder/LAVVideo/LAVVideo.h +++ b/decoder/LAVVideo/LAVVideo.h @@ -302,6 +302,8 @@ private: BOOL bDVDVideo; DWORD HWAccelDeviceDXVA2; DWORD HWAccelDeviceDXVA2Desc; + DWORD HWAccelDeviceD3D11; + DWORD HWAccelDeviceD3D11Desc; BOOL bH264MVCOverride; } m_settings; diff --git a/decoder/LAVVideo/decoders/ILAVDecoder.h b/decoder/LAVVideo/decoders/ILAVDecoder.h index 2e47430d..0e539e7e 100644 --- a/decoder/LAVVideo/decoders/ILAVDecoder.h +++ b/decoder/LAVVideo/decoders/ILAVDecoder.h @@ -437,3 +437,4 @@ ILAVDecoder *CreateDecoderD3D11(); ILAVDecoder *CreateDecoderMSDKMVC(); HRESULT VerifyD3D9Device(DWORD & dwIndex, DWORD dwDeviceId); +HRESULT VerifyD3D11Device(DWORD & dwIndex, DWORD dwDeviceId); diff --git a/decoder/LAVVideo/decoders/d3d11va.cpp b/decoder/LAVVideo/decoders/d3d11va.cpp index 7437d250..1691ecb9 100644 --- a/decoder/LAVVideo/decoders/d3d11va.cpp +++ b/decoder/LAVVideo/decoders/d3d11va.cpp @@ -27,6 +27,69 @@ ILAVDecoder *CreateDecoderD3D11() return new CDecD3D11(); } +HRESULT VerifyD3D11Device(DWORD & dwIndex, DWORD dwDeviceId) +{ + HRESULT hr = S_OK; + DXGI_ADAPTER_DESC desc; + + HMODULE dxgi = LoadLibrary(L"dxgi.dll"); + if (dxgi == nullptr) + { + hr = E_FAIL; + goto done; + } + + PFN_CREATE_DXGI_FACTORY1 mCreateDXGIFactory1 = (PFN_CREATE_DXGI_FACTORY1)GetProcAddress(dxgi, "CreateDXGIFactory1"); + if (mCreateDXGIFactory1 == nullptr) + { + hr = E_FAIL; + goto done; + } + + IDXGIAdapter *pDXGIAdapter = nullptr; + IDXGIFactory1 *pDXGIFactory = nullptr; + + hr = mCreateDXGIFactory1(IID_IDXGIFactory1, (void **)&pDXGIFactory); + if (FAILED(hr)) + goto done; + + // check the adapter specified by dwIndex + hr = pDXGIFactory->EnumAdapters(dwIndex, &pDXGIAdapter); + if (FAILED(hr)) + goto done; + + // if it matches the device id, then all is well and we're done + pDXGIAdapter->GetDesc(&desc); + if (desc.DeviceId == dwDeviceId) + goto done; + + SafeRelease(&pDXGIAdapter); + + // try to find a device that matches this device id + UINT i = 0; + while (SUCCEEDED(pDXGIFactory->EnumAdapters(i, &pDXGIAdapter))) + { + pDXGIAdapter->GetDesc(&desc); + SafeRelease(&pDXGIAdapter); + + if (desc.DeviceId == dwDeviceId) + { + dwIndex = i; + goto done; + } + i++; + } + + // if none is found, fail + hr = E_FAIL; + +done: + SafeRelease(&pDXGIAdapter); + SafeRelease(&pDXGIFactory); + FreeLibrary(dxgi); + return hr; +} + //////////////////////////////////////////////////////////////////////////////// // D3D11 decoder implementation //////////////////////////////////////////////////////////////////////////////// |