Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mpc-hc/LAVFilters.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHendrik Leppkes <h.leppkes@gmail.com>2017-08-20 19:26:35 +0300
committerHendrik Leppkes <h.leppkes@gmail.com>2017-08-20 19:26:35 +0300
commit1911009d231a27d7c87ed5d773356fb594e87a5f (patch)
tree3e421cd54a78d0033a6c33553406ff50755e1f91
parent4ec93e5857a2341d65376c15c859f4b288a55774 (diff)
d3d11: implement saving of the selected device
-rw-r--r--decoder/LAVVideo/LAVVideo.cpp35
-rw-r--r--decoder/LAVVideo/LAVVideo.h2
-rw-r--r--decoder/LAVVideo/decoders/ILAVDecoder.h1
-rw-r--r--decoder/LAVVideo/decoders/d3d11va.cpp63
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
////////////////////////////////////////////////////////////////////////////////