[d3d11] Fixed segfault if device was lost. Also this adds trying to restore device...
authorAnton Fedchin <afedchin@ruswizards.com>
Tue, 13 Oct 2015 14:15:16 +0000 (17:15 +0300)
committerAnton Fedchin <afedchin@ruswizards.com>
Tue, 13 Oct 2015 14:27:44 +0000 (17:27 +0300)
xbmc/guilib/GUIFontTTFDX.cpp
xbmc/rendering/dx/RenderSystemDX.cpp

index af370e8..144c2dc 100644 (file)
@@ -263,7 +263,7 @@ bool CGUIFontTTFDX::CopyCharToTexture(FT_BitmapGlyph bitGlyph, unsigned int x1,
   FT_Bitmap bitmap = bitGlyph->bitmap;
 
   ID3D11DeviceContext* pContext = g_Windowing.GetImmediateContext();
-  if (m_speedupTexture)
+  if (m_speedupTexture && pContext)
   {
     CD3D11_BOX dstBox(x1, y1, 0, x2, y2, 1);
     pContext->UpdateSubresource(m_speedupTexture->Get(), 0, &dstBox, bitmap.buffer, bitmap.pitch, 0);
index 298a4cc..e3795e2 100644 (file)
@@ -414,13 +414,6 @@ bool CRenderSystemDX::DestroyRenderSystem()
   SAFE_RELEASE(m_pOutput);
   SAFE_RELEASE(m_adapter);
   SAFE_RELEASE(m_dxgiFactory);
-#ifdef _DEBUG
-  if (m_d3dDebug)
-  {
-    m_d3dDebug->ReportLiveDeviceObjects(D3D11_RLDO_SUMMARY | D3D11_RLDO_DETAIL);
-    m_d3dDebug->Release();
-  }
-#endif
   return true;
 }
 
@@ -435,6 +428,9 @@ void CRenderSystemDX::DeleteDevice()
   for (std::vector<ID3DResource *>::iterator i = m_resources.begin(); i != m_resources.end(); ++i)
     (*i)->OnDestroyDevice();
 
+  if (m_pSwapChain)
+    m_pSwapChain->SetFullscreenState(false, NULL);
+
   SAFE_DELETE(m_pGUIShader);
   SAFE_RELEASE(m_pTextureRight);
   SAFE_RELEASE(m_pRenderTargetViewRight);
@@ -446,16 +442,8 @@ void CRenderSystemDX::DeleteDevice()
   SAFE_RELEASE(m_depthStencilState);
   SAFE_RELEASE(m_depthStencilView);
   SAFE_RELEASE(m_pRenderTargetView);
-  if (m_pSwapChain)
-  {
-    m_pSwapChain->SetFullscreenState(false, NULL);
-    SAFE_RELEASE(m_pSwapChain);
-  }
-  SAFE_RELEASE(m_pSwapChain1);
-  SAFE_RELEASE(m_pD3DDev);
   if (m_pContext && m_pContext != m_pImdContext)
   {
-    FinishCommandList(false);
     m_pContext->ClearState();
     m_pContext->Flush();
     SAFE_RELEASE(m_pContext);
@@ -466,6 +454,16 @@ void CRenderSystemDX::DeleteDevice()
     m_pImdContext->Flush();
     SAFE_RELEASE(m_pImdContext);
   }
+  SAFE_RELEASE(m_pSwapChain);
+  SAFE_RELEASE(m_pSwapChain1);
+  SAFE_RELEASE(m_pD3DDev);
+#ifdef _DEBUG
+  if (m_d3dDebug)
+  {
+    m_d3dDebug->ReportLiveDeviceObjects(D3D11_RLDO_SUMMARY | D3D11_RLDO_DETAIL);
+    SAFE_RELEASE(m_d3dDebug);
+  }
+#endif
   m_bResizeRequred = false;
   m_bHWStereoEnabled = false;
   m_bRenderCreated = false;
@@ -1210,6 +1208,7 @@ bool CRenderSystemDX::BeginRender()
     if (DXGI_ERROR_DEVICE_REMOVED == m_nDeviceStatus)
     {
       OnDeviceLost();
+      OnDeviceReset();
     }
     return false;
   }
@@ -1362,6 +1361,9 @@ void CRenderSystemDX::SetCameraPosition(const CPoint &camera, int screenWidth, i
 
 void CRenderSystemDX::Project(float &x, float &y, float &z)
 {
+  if (!m_bRenderCreated)
+    return;
+
   m_pGUIShader->Project(x, y, z);
 }
 
@@ -1482,7 +1484,10 @@ void CRenderSystemDX::RestoreViewPort()
 
 bool CRenderSystemDX::ScissorsCanEffectClipping()
 {
-  return m_pGUIShader != NULL && m_pGUIShader->HardwareClipIsPossible(); 
+  if (!m_bRenderCreated)
+    return false;
+
+  return m_pGUIShader != NULL && m_pGUIShader->HardwareClipIsPossible();
 }
 
 CRect CRenderSystemDX::ClipRectToScissorRect(const CRect &rect)
@@ -1637,6 +1642,9 @@ bool CRenderSystemDX::SupportsStereo(RENDER_STEREO_MODE mode) const
 
 void CRenderSystemDX::FlushGPU()
 {
+  if (!m_bRenderCreated)
+    return;
+
   FinishCommandList();
   m_pImdContext->Flush();
 }