Преглед изворни кода

DX11: Allow lost device for few frames.

Branimir Karadžić пре 11 година
родитељ
комит
61ed393f6c
5 измењених фајлова са 41 додато и 6 уклоњено
  1. 3 0
      include/bgfx.c99.h
  2. 3 0
      include/bgfx.h
  3. 2 1
      src/bgfx.cpp
  4. 32 4
      src/renderer_d3d11.cpp
  5. 1 1
      src/renderer_d3d9.cpp

+ 3 - 0
include/bgfx.c99.h

@@ -282,6 +282,9 @@ typedef enum bgfx_fatal
     BGFX_FATAL_INVALID_SHADER,
     BGFX_FATAL_INVALID_SHADER,
     BGFX_FATAL_UNABLE_TO_INITIALIZE,
     BGFX_FATAL_UNABLE_TO_INITIALIZE,
     BGFX_FATAL_UNABLE_TO_CREATE_TEXTURE,
     BGFX_FATAL_UNABLE_TO_CREATE_TEXTURE,
+    BGFX_FATAL_DEVICE_LOST,
+
+    BGFX_FATAL_COUNT
 
 
 } bgfx_fatal_t;
 } bgfx_fatal_t;
 
 

+ 3 - 0
include/bgfx.h

@@ -32,6 +32,9 @@ namespace bgfx
 			InvalidShader,
 			InvalidShader,
 			UnableToInitialize,
 			UnableToInitialize,
 			UnableToCreateTexture,
 			UnableToCreateTexture,
+			DeviceLost,
+
+			Count
 		};
 		};
 	};
 	};
 
 

+ 2 - 1
src/bgfx.cpp

@@ -1349,7 +1349,7 @@ again:
 			{
 			{
 				RendererType::Enum first  = RendererType::Direct3D9;
 				RendererType::Enum first  = RendererType::Direct3D9;
 				RendererType::Enum second = RendererType::Direct3D11;
 				RendererType::Enum second = RendererType::Direct3D11;
-				if (0x601 == getWindowsVersion() )
+				if (0x601 <= getWindowsVersion() )
 				{
 				{
 					first  = RendererType::Direct3D11;
 					first  = RendererType::Direct3D11;
 					second = RendererType::Direct3D9;
 					second = RendererType::Direct3D9;
@@ -2722,6 +2722,7 @@ again:
 #include <bgfx.c99.h>
 #include <bgfx.c99.h>
 #include <bgfxplatform.c99.h>
 #include <bgfxplatform.c99.h>
 
 
+BX_STATIC_ASSERT(bgfx::Fatal::Count         == bgfx::Fatal::Enum(BGFX_FATAL_COUNT) );
 BX_STATIC_ASSERT(bgfx::RendererType::Count  == bgfx::RendererType::Enum(BGFX_RENDERER_TYPE_COUNT) );
 BX_STATIC_ASSERT(bgfx::RendererType::Count  == bgfx::RendererType::Enum(BGFX_RENDERER_TYPE_COUNT) );
 BX_STATIC_ASSERT(bgfx::Attrib::Count        == bgfx::Attrib::Enum(BGFX_ATTRIB_COUNT) );
 BX_STATIC_ASSERT(bgfx::Attrib::Count        == bgfx::Attrib::Enum(BGFX_ATTRIB_COUNT) );
 BX_STATIC_ASSERT(bgfx::AttribType::Count    == bgfx::AttribType::Enum(BGFX_ATTRIB_TYPE_COUNT) );
 BX_STATIC_ASSERT(bgfx::AttribType::Count    == bgfx::AttribType::Enum(BGFX_ATTRIB_TYPE_COUNT) );

+ 32 - 4
src/renderer_d3d11.cpp

@@ -539,7 +539,8 @@ RENDERDOC_IMPORT
 	struct RendererContextD3D11 : public RendererContextI
 	struct RendererContextD3D11 : public RendererContextI
 	{
 	{
 		RendererContextD3D11()
 		RendererContextD3D11()
-			: m_captureTexture(NULL)
+			: m_lost(0)
+			, m_captureTexture(NULL)
 			, m_captureResolve(NULL)
 			, m_captureResolve(NULL)
 			, m_wireframe(false)
 			, m_wireframe(false)
 			, m_flags(BGFX_RESET_NONE)
 			, m_flags(BGFX_RESET_NONE)
@@ -1158,16 +1159,42 @@ RENDERDOC_IMPORT
 			capturePostReset();
 			capturePostReset();
 		}
 		}
 
 
+		static bool isLost(HRESULT _hr)
+		{
+			return DXGI_ERROR_DEVICE_REMOVED == _hr
+				|| DXGI_ERROR_DEVICE_HUNG == _hr
+				|| DXGI_ERROR_DEVICE_RESET == _hr
+				|| DXGI_ERROR_DRIVER_INTERNAL_ERROR == _hr
+				|| DXGI_ERROR_NOT_CURRENTLY_AVAILABLE == _hr
+				;
+		}
+
 		void flip() BX_OVERRIDE
 		void flip() BX_OVERRIDE
 		{
 		{
 			if (NULL != m_swapChain)
 			if (NULL != m_swapChain)
 			{
 			{
+				HRESULT hr = 0;
 				uint32_t syncInterval = !!(m_flags & BGFX_RESET_VSYNC);
 				uint32_t syncInterval = !!(m_flags & BGFX_RESET_VSYNC);
-				for (uint32_t ii = 1, num = m_numWindows; ii < num; ++ii)
+				for (uint32_t ii = 1, num = m_numWindows && SUCCEEDED(hr); ii < num; ++ii)
+				{
+					hr = m_frameBuffers[m_windows[ii].idx].m_swapChain->Present(syncInterval, 0);
+				}
+
+				if (SUCCEEDED(hr) )
+				{
+					hr = m_swapChain->Present(syncInterval, 0);
+				}
+
+				if (FAILED(hr)
+				&&  isLost(hr) )
+				{
+					++m_lost;
+					BGFX_FATAL(10 > m_lost, bgfx::Fatal::DeviceLost, "Device is lost. FAILED 0x%08x", hr);
+				}
+				else
 				{
 				{
-					DX_CHECK(m_frameBuffers[m_windows[ii].idx].m_swapChain->Present(syncInterval, 0) );
+					m_lost = 0;
 				}
 				}
-				DX_CHECK(m_swapChain->Present(syncInterval, 0) );
 			}
 			}
 		}
 		}
 
 
@@ -1978,6 +2005,7 @@ RENDERDOC_IMPORT
 		IDXGIFactory* m_factory;
 		IDXGIFactory* m_factory;
 
 
 		IDXGISwapChain* m_swapChain;
 		IDXGISwapChain* m_swapChain;
+		uint16_t m_lost;
 		uint16_t m_numWindows;
 		uint16_t m_numWindows;
 		FrameBufferHandle m_windows[BGFX_CONFIG_MAX_FRAME_BUFFERS];
 		FrameBufferHandle m_windows[BGFX_CONFIG_MAX_FRAME_BUFFERS];
 
 

+ 1 - 1
src/renderer_d3d9.cpp

@@ -1042,7 +1042,7 @@ namespace bgfx
 			postReset();
 			postReset();
 		}
 		}
 
 
-		bool isLost(HRESULT _hr) const
+		static bool isLost(HRESULT _hr)
 		{
 		{
 			return D3DERR_DEVICELOST == _hr
 			return D3DERR_DEVICELOST == _hr
 				|| D3DERR_DRIVERINTERNALERROR == _hr
 				|| D3DERR_DRIVERINTERNALERROR == _hr