Преглед на файлове

DX11: Added device info to debug display.

bkaradzic преди 12 години
родител
ревизия
757bf93b78
променени са 2 файла, в които са добавени 91 реда и са изтрити 18 реда
  1. 76 5
      src/renderer_d3d11.cpp
  2. 15 13
      src/renderer_d3d9.cpp

+ 76 - 5
src/renderer_d3d11.cpp

@@ -10,6 +10,8 @@
 
 namespace bgfx
 {
+	typedef HRESULT (WINAPI * PFN_CREATEDXGIFACTORY)(REFIID _riid, void** _factory);
+
 	static const D3D11_PRIMITIVE_TOPOLOGY s_primType[] =
 	{
 		D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST,
@@ -322,8 +324,58 @@ namespace bgfx
 			PFN_D3D11_CREATE_DEVICE d3D11CreateDevice = (PFN_D3D11_CREATE_DEVICE)GetProcAddress(m_d3d11dll, "D3D11CreateDevice");
 			BGFX_FATAL(NULL != d3D11CreateDevice, Fatal::UnableToInitialize, "Function D3D11CreateDevice not found.");
 
+			m_dxgidll = LoadLibrary("dxgi.dll");
+			BGFX_FATAL(NULL != m_dxgidll, Fatal::UnableToInitialize, "Failed to load dxgi.dll.");
+
+			PFN_CREATEDXGIFACTORY dxgiCreateDXGIFactory = (PFN_CREATEDXGIFACTORY)GetProcAddress(m_dxgidll, "CreateDXGIFactory");
+			BGFX_FATAL(NULL != dxgiCreateDXGIFactory, Fatal::UnableToInitialize, "Function CreateDXGIFactory not found.");
+
 			HRESULT hr;
 
+			IDXGIFactory* factory;
+			hr = dxgiCreateDXGIFactory(__uuidof(IDXGIFactory), (void**)&factory);
+			BGFX_FATAL(SUCCEEDED(hr), Fatal::UnableToInitialize, "Unable to create DXGI factory.");
+
+			m_adapter = NULL;
+			m_driverType = D3D_DRIVER_TYPE_HARDWARE;
+
+			IDXGIAdapter* adapter;
+			for (uint32_t ii = 0; DXGI_ERROR_NOT_FOUND != factory->EnumAdapters(ii, &adapter); ++ii)
+			{
+				DXGI_ADAPTER_DESC desc;
+				hr = adapter->GetDesc(&desc);
+				if (SUCCEEDED(hr) )
+				{
+					BX_TRACE("Adapter #%d", ii);
+
+					char description[countof(desc.Description)];
+					wcstombs(description, desc.Description, countof(desc.Description) );
+					BX_TRACE("\tDescription: %s", description);
+					BX_TRACE("\tVendorId: 0x%08x, DeviceId: 0x%08x, SubSysId: 0x%08x, Revision: 0x%08x"
+						, desc.VendorId
+						, desc.DeviceId
+						, desc.SubSysId
+						, desc.Revision
+						);
+					BX_TRACE("\tMemory: %" PRIi64 " (video), %" PRIi64 " (system), %" PRIi64 " (shared)"
+						, desc.DedicatedVideoMemory
+						, desc.DedicatedSystemMemory
+						, desc.SharedSystemMemory
+						);
+
+#if BGFX_CONFIG_DEBUG_PERFHUD
+					if (0 != strstr(description, "PerfHUD") )
+					{
+						m_adapter = adapter;
+						m_driverType = D3D_DRIVER_TYPE_REFERENCE;
+					}
+#endif // BGFX_CONFIG_DEBUG_PERFHUD
+				}
+
+				DX_RELEASE(adapter, adapter == m_adapter ? 1 : 0);
+			}
+			DX_RELEASE(factory, NULL != m_adapter ? 1 : 0);
+
 			D3D_FEATURE_LEVEL features[] =
 			{
 				D3D_FEATURE_LEVEL_11_0,
@@ -350,8 +402,8 @@ namespace bgfx
 
 			D3D_FEATURE_LEVEL featureLevel;
 
-			hr = d3D11CreateDevice(NULL
-				, D3D_DRIVER_TYPE_HARDWARE
+			hr = d3D11CreateDevice(m_adapter
+				, m_driverType
 				, NULL
 				, flags
 				, features
@@ -367,11 +419,13 @@ namespace bgfx
 			hr = m_device->QueryInterface(__uuidof(IDXGIDevice), (void**)&device);
 			BGFX_FATAL(SUCCEEDED(hr), Fatal::UnableToInitialize, "Unable to create Direct3D11 device.");
 
-			IDXGIAdapter* adapter;
 			hr = device->GetParent(__uuidof(IDXGIAdapter), (void**)&adapter);
 			BGFX_FATAL(SUCCEEDED(hr), Fatal::UnableToInitialize, "Unable to create Direct3D11 device.");
 			DX_RELEASE(device, 2);
 
+			hr = adapter->GetDesc(&m_adapterDesc);
+			BGFX_FATAL(SUCCEEDED(hr), Fatal::UnableToInitialize, "Unable to create Direct3D11 device.");
+
 			hr = adapter->GetParent(__uuidof(IDXGIFactory), (void**)&m_factory);
 			BGFX_FATAL(SUCCEEDED(hr), Fatal::UnableToInitialize, "Unable to create Direct3D11 device.");
 			DX_RELEASE(adapter, 2);
@@ -444,6 +498,7 @@ namespace bgfx
 			DX_RELEASE(m_device, 0);
 			DX_RELEASE(m_factory, 0);
 
+			FreeLibrary(m_dxgidll);
 			FreeLibrary(m_d3d11dll);
 		}
 
@@ -1032,6 +1087,10 @@ namespace bgfx
 		}
 
 		HMODULE m_d3d11dll;
+		HMODULE m_dxgidll;
+		D3D_DRIVER_TYPE m_driverType;
+		IDXGIAdapter* m_adapter;
+		DXGI_ADAPTER_DESC m_adapterDesc;
 		IDXGIFactory* m_factory;
 		IDXGISwapChain* m_swapChain;
 		ID3D11Device* m_device;
@@ -2675,8 +2734,20 @@ namespace bgfx
 				double toMs = 1000.0/freq;
 
 				tvm.clear();
-				uint16_t pos = 10;
-				tvm.printf(0, 0, BGFX_CONFIG_DEBUG ? 0x89 : 0x8f, " " BGFX_RENDERER_NAME " ");
+				uint16_t pos = 0;
+				tvm.printf(0, pos++, BGFX_CONFIG_DEBUG ? 0x89 : 0x8f, " " BGFX_RENDERER_NAME " ");
+
+				const DXGI_ADAPTER_DESC& desc = s_renderCtx.m_adapterDesc;
+				char description[countof(desc.Description)];
+				wcstombs(description, desc.Description, countof(desc.Description) );
+				tvm.printf(0, pos++, 0x0f, " Device: %s", description);
+				tvm.printf(0, pos++, 0x0f, " Memory: %" PRIi64 " (video), %" PRIi64 " (system), %" PRIi64 " (shared)"
+					, desc.DedicatedVideoMemory
+					, desc.DedicatedSystemMemory
+					, desc.SharedSystemMemory
+					);
+
+				pos = 10;
 				tvm.printf(10, pos++, 0x8e, "      Frame: %7.3f, % 7.3f \x1f, % 7.3f \x1e [ms] / % 6.2f FPS"
 					, double(frameTime)*toMs
 					, double(min)*toMs

+ 15 - 13
src/renderer_d3d9.cpp

@@ -273,13 +273,14 @@ namespace bgfx
 			for (uint32_t ii = 0; ii < adapterCount; ++ii)
 			{
 				D3DADAPTER_IDENTIFIER9 identifier;
-				DX_CHECK(m_d3d9->GetAdapterIdentifier(ii, 0, &identifier) );
-
-				BX_TRACE("Adapter #%d", ii);
-				BX_TRACE("\tDriver: %s", identifier.Driver);
-				BX_TRACE("\tDescription: %s", identifier.Description);
-				BX_TRACE("\tDeviceName: %s", identifier.DeviceName);
-				BX_TRACE("\tVendorId: 0x%08x, DeviceId: 0x%08x, SubSysId: 0x%08x, Revision: 0x%08x"
+				HRESULT hr = m_d3d9->GetAdapterIdentifier(ii, 0, &identifier);
+				if (SUCCEEDED(hr) )
+				{
+					BX_TRACE("Adapter #%d", ii);
+					BX_TRACE("\tDriver: %s", identifier.Driver);
+					BX_TRACE("\tDescription: %s", identifier.Description);
+					BX_TRACE("\tDeviceName: %s", identifier.DeviceName);
+					BX_TRACE("\tVendorId: 0x%08x, DeviceId: 0x%08x, SubSysId: 0x%08x, Revision: 0x%08x"
 						, identifier.VendorId
 						, identifier.DeviceId
 						, identifier.SubSysId
@@ -287,12 +288,13 @@ namespace bgfx
 						);
 
 #if BGFX_CONFIG_DEBUG_PERFHUD
-				if (0 != strstr(identifier.Description, "PerfHUD") )
-				{
-					m_adapter = ii;
-					m_deviceType = D3DDEVTYPE_REF;
-				}
+					if (0 != strstr(identifier.Description, "PerfHUD") )
+					{
+						m_adapter = ii;
+						m_deviceType = D3DDEVTYPE_REF;
+					}
 #endif // BGFX_CONFIG_DEBUG_PERFHUD
+				}
 			}
 
 			DX_CHECK(m_d3d9->GetAdapterIdentifier(m_adapter, 0, &m_identifier) );
@@ -2776,7 +2778,7 @@ namespace bgfx
 				tvm.printf(0, pos++, BGFX_CONFIG_DEBUG ? 0x89 : 0x8f, " " BGFX_RENDERER_NAME " ");
 
 				const D3DADAPTER_IDENTIFIER9& identifier = s_renderCtx.m_identifier;
-				tvm.printf(0, pos++, 0x0f, "Device: %s (%s)", identifier.Description, identifier.Driver);
+				tvm.printf(0, pos++, 0x0f, " Device: %s (%s)", identifier.Description, identifier.Driver);
 
 				pos = 10;
 				tvm.printf(10, pos++, 0x8e, "      Frame: %7.3f, % 7.3f \x1f, % 7.3f \x1e [ms] / % 6.2f FPS"