aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Fedchin <afedchin@ruswizards.com>2016-03-15 23:47:52 +0300
committerAnton Fedchin <afedchin@ruswizards.com>2016-03-20 20:09:37 +0300
commit4d4209cd907ec4aa2bc7d18ecb61844c36deda46 (patch)
treee7eaec1f93dd3d9a6300c1ba1e83bce610e9b076
parent296c1a31d6ccb14bdd8c5e5417485bd2bcd893b0 (diff)
[RenderSystemDX] Added workaround to create device on a default adapter if it wasn't detected previously.
-rw-r--r--xbmc/rendering/dx/RenderSystemDX.cpp127
-rw-r--r--xbmc/rendering/dx/RenderSystemDX.h1
2 files changed, 79 insertions, 49 deletions
diff --git a/xbmc/rendering/dx/RenderSystemDX.cpp b/xbmc/rendering/dx/RenderSystemDX.cpp
index b1b9d1c387..7dbc8e35b9 100644
--- a/xbmc/rendering/dx/RenderSystemDX.cpp
+++ b/xbmc/rendering/dx/RenderSystemDX.cpp
@@ -49,52 +49,50 @@ CRenderSystemDX::CRenderSystemDX() : CRenderSystemBase()
{
m_enumRenderingSystem = RENDERING_SYSTEM_DIRECTX;
- m_hFocusWnd = NULL;
- m_hDeviceWnd = NULL;
+ m_hFocusWnd = nullptr;
+ m_hDeviceWnd = nullptr;
m_nBackBufferWidth = 0;
m_nBackBufferHeight = 0;
m_bFullScreenDevice = false;
- m_bVSync = true;
- m_nDeviceStatus = S_OK;
- m_inScene = false;
- m_needNewDevice = false;
+ m_bVSync = true;
+ m_nDeviceStatus = S_OK;
+ m_inScene = false;
+ m_needNewDevice = false;
m_resizeInProgress = false;
- m_screenHeight = 0;
- m_systemFreq = CurrentHostFrequency();
-
+ m_screenHeight = 0;
+ m_systemFreq = CurrentHostFrequency();
m_defaultD3DUsage = D3D11_USAGE_DEFAULT;
-
m_featureLevel = D3D_FEATURE_LEVEL_11_1;
m_driverType = D3D_DRIVER_TYPE_HARDWARE;
- m_adapter = NULL;
- m_adapterIndex = -1;
- m_pOutput = NULL;
- m_dxgiFactory = NULL;
- m_pD3DDev = NULL;
- m_pImdContext = NULL;
- m_pContext = NULL;
-
- m_pSwapChain = NULL;
- m_pSwapChain1 = NULL;
- m_pRenderTargetView = NULL;
- m_depthStencilState = NULL;
- m_depthStencilView = NULL;
- m_BlendEnableState = NULL;
- m_BlendDisableState = NULL;
+ m_adapter = nullptr;
+ m_pOutput = nullptr;
+ m_dxgiFactory = nullptr;
+ m_pD3DDev = nullptr;
+ m_pImdContext = nullptr;
+ m_pContext = nullptr;
+
+ m_pSwapChain = nullptr;
+ m_pSwapChain1 = nullptr;
+ m_pRenderTargetView = nullptr;
+ m_depthStencilState = nullptr;
+ m_depthStencilView = nullptr;
+ m_BlendEnableState = nullptr;
+ m_BlendDisableState = nullptr;
m_BlendEnabled = false;
- m_RSScissorDisable = NULL;
- m_RSScissorEnable = NULL;
+ m_RSScissorDisable = nullptr;
+ m_RSScissorEnable = nullptr;
m_ScissorsEnabled = false;
- m_pTextureRight = NULL;
- m_pRenderTargetViewRight = NULL;
- m_pShaderResourceViewRight = NULL;
- m_pGUIShader = NULL;
+ m_pTextureRight = nullptr;
+ m_pRenderTargetViewRight = nullptr;
+ m_pShaderResourceViewRight = nullptr;
+ m_pGUIShader = nullptr;
m_bResizeRequred = false;
m_bHWStereoEnabled = false;
ZeroMemory(&m_cachedMode, sizeof(m_cachedMode));
ZeroMemory(&m_viewPort, sizeof(m_viewPort));
ZeroMemory(&m_scissor, sizeof(CRect));
+ ZeroMemory(&m_adapterDesc, sizeof(DXGI_ADAPTER_DESC));
}
CRenderSystemDX::~CRenderSystemDX()
@@ -139,33 +137,31 @@ void CRenderSystemDX::SetMonitor(HMONITOR monitor)
IDXGIAdapter1* pAdapter;
for (unsigned i = 0; m_dxgiFactory->EnumAdapters1(i, &pAdapter) != DXGI_ERROR_NOT_FOUND; ++i)
{
+ DXGI_ADAPTER_DESC1 adaperDesc;
+ pAdapter->GetDesc1(&adaperDesc);
+
IDXGIOutput* pOutput;
for (unsigned j = 0; pAdapter->EnumOutputs(j, &pOutput) != DXGI_ERROR_NOT_FOUND; ++j)
{
- if (FAILED(pOutput->GetDesc(&outputDesc)))
- break;
-
+ pOutput->GetDesc(&outputDesc);
if (outputDesc.Monitor == monitor)
{
+ CLog::Log(LOGDEBUG, __FUNCTION__" - Selected %S output. ", outputDesc.DeviceName);
+
// update monitor info
SAFE_RELEASE(m_pOutput);
m_pOutput = pOutput;
- CLog::Log(LOGDEBUG, __FUNCTION__" - Selected %S output. ", outputDesc.DeviceName);
-
// check if adapter is changed
- if (m_adapterIndex != i)
+ if ( m_adapterDesc.AdapterLuid.HighPart != adaperDesc.AdapterLuid.HighPart
+ || m_adapterDesc.AdapterLuid.LowPart != adaperDesc.AdapterLuid.LowPart)
{
- pAdapter->GetDesc(&m_adapterDesc);
-
CLog::Log(LOGDEBUG, __FUNCTION__" - Selected %S adapter. ", m_adapterDesc.Description);
+ pAdapter->GetDesc(&m_adapterDesc);
SAFE_RELEASE(m_adapter);
m_adapter = pAdapter;
-
m_needNewDevice = true;
- m_adapterIndex = i;
-
return;
}
@@ -182,7 +178,7 @@ bool CRenderSystemDX::ResetRenderSystem(int width, int height, bool fullScreen,
if (!m_pD3DDev)
return false;
- if (m_hDeviceWnd != NULL)
+ if (m_hDeviceWnd != nullptr)
{
HMONITOR hMonitor = MonitorFromWindow(m_hDeviceWnd, MONITOR_DEFAULTTONULL);
if (hMonitor)
@@ -507,7 +503,6 @@ bool CRenderSystemDX::CreateDevice()
CSingleLock lock(m_resourceSection);
HRESULT hr;
-
SAFE_RELEASE(m_pD3DDev);
D3D_FEATURE_LEVEL featureLevels[] =
@@ -526,9 +521,9 @@ bool CRenderSystemDX::CreateDevice()
#ifdef _DEBUG
createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG;
#endif
-
+ D3D_DRIVER_TYPE driverType = m_adapter == nullptr ? D3D_DRIVER_TYPE_HARDWARE : D3D_DRIVER_TYPE_UNKNOWN;
// we should specify D3D_DRIVER_TYPE_UNKNOWN if create device with specified adapter.
- hr = D3D11CreateDevice(m_adapter, D3D_DRIVER_TYPE_UNKNOWN, NULL, createDeviceFlags, featureLevels, ARRAYSIZE(featureLevels),
+ hr = D3D11CreateDevice(m_adapter, driverType, nullptr, createDeviceFlags, featureLevels, ARRAYSIZE(featureLevels),
D3D11_SDK_VERSION, &m_pD3DDev, &m_featureLevel, &m_pImdContext);
if (FAILED(hr))
@@ -537,7 +532,7 @@ bool CRenderSystemDX::CreateDevice()
CLog::Log(LOGDEBUG, "%s - First try to create device failed with error: %s.", __FUNCTION__, GetErrorDescription(hr).c_str());
CLog::Log(LOGDEBUG, "%s - Trying to create device with lowest feature level: %#x.", __FUNCTION__, featureLevels[1]);
- hr = D3D11CreateDevice(m_adapter, D3D_DRIVER_TYPE_UNKNOWN, NULL, createDeviceFlags, &featureLevels[1], ARRAYSIZE(featureLevels) - 1,
+ hr = D3D11CreateDevice(m_adapter, driverType, nullptr, createDeviceFlags, &featureLevels[1], ARRAYSIZE(featureLevels) - 1,
D3D11_SDK_VERSION, &m_pD3DDev, &m_featureLevel, &m_pImdContext);
if (FAILED(hr))
{
@@ -546,7 +541,7 @@ bool CRenderSystemDX::CreateDevice()
CLog::Log(LOGDEBUG, "%s - Trying to create device without video API support.", __FUNCTION__);
createDeviceFlags &= ~D3D11_CREATE_DEVICE_VIDEO_SUPPORT;
- hr = D3D11CreateDevice(m_adapter, D3D_DRIVER_TYPE_UNKNOWN, NULL, createDeviceFlags, &featureLevels[1], ARRAYSIZE(featureLevels) - 1,
+ hr = D3D11CreateDevice(m_adapter, driverType, nullptr, createDeviceFlags, &featureLevels[1], ARRAYSIZE(featureLevels) - 1,
D3D11_SDK_VERSION, &m_pD3DDev, &m_featureLevel, &m_pImdContext);
if (SUCCEEDED(hr))
CLog::Log(LOGNOTICE, "%s - Your video driver doesn't support DirectX 11 Video Acceleration API. Application is not be able to use hardware video processing and decoding", __FUNCTION__);
@@ -559,6 +554,42 @@ bool CRenderSystemDX::CreateDevice()
return false;
}
+ if (!m_adapter)
+ {
+ // get adapter from device if it was not detected previously
+ IDXGIDevice1* pDXGIDevice = nullptr;
+ if (SUCCEEDED(m_pD3DDev->QueryInterface(__uuidof(IDXGIDevice1), reinterpret_cast<void**>(&pDXGIDevice))))
+ {
+ IDXGIAdapter *pAdapter = nullptr;
+ if (SUCCEEDED(pDXGIDevice->GetAdapter(&pAdapter)))
+ {
+ hr = pAdapter->QueryInterface(__uuidof(IDXGIAdapter1), reinterpret_cast<void**>(&m_adapter));
+ SAFE_RELEASE(pAdapter);
+ if (FAILED(hr))
+ return false;
+
+ m_adapter->GetDesc(&m_adapterDesc);
+ CLog::Log(LOGDEBUG, __FUNCTION__" - Selected %S adapter. ", m_adapterDesc.Description);
+ }
+ SAFE_RELEASE(pDXGIDevice);
+ }
+ }
+
+ if (!m_adapter)
+ {
+ CLog::Log(LOGERROR, "%s - Failed to find adapter.", __FUNCTION__);
+ return false;
+ }
+
+ SAFE_RELEASE(m_dxgiFactory);
+ m_adapter->GetParent(__uuidof(IDXGIFactory1), reinterpret_cast<void**>(&m_dxgiFactory));
+
+ if (!m_pOutput)
+ {
+ HMONITOR hMonitor = MonitorFromWindow(m_hDeviceWnd, MONITOR_DEFAULTTONULL);
+ SetMonitor(hMonitor);
+ }
+
if ( g_advancedSettings.m_bAllowDeferredRendering
&& FAILED(m_pD3DDev->CreateDeferredContext(0, &m_pContext)))
{
diff --git a/xbmc/rendering/dx/RenderSystemDX.h b/xbmc/rendering/dx/RenderSystemDX.h
index cf58be2302..5a8a63ece4 100644
--- a/xbmc/rendering/dx/RenderSystemDX.h
+++ b/xbmc/rendering/dx/RenderSystemDX.h
@@ -169,7 +169,6 @@ protected:
IDXGIFactory1* m_dxgiFactory;
ID3D11Device* m_pD3DDev;
IDXGIAdapter1* m_adapter;
- int m_adapterIndex;
IDXGIOutput* m_pOutput;
ID3D11DeviceContext* m_pContext;
ID3D11DeviceContext* m_pImdContext;