diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp
index 474c1395f683701cb27a90bca3b10e9f798c8b2e..1400561c19100cfa331f0224e51e1bce31cba257 100644
--- a/indra/llrender/llgl.cpp
+++ b/indra/llrender/llgl.cpp
@@ -683,29 +683,39 @@ bool LLGLManager::initGL()
 	initExtensions();
 	stop_glerror();
 
-	S32 old_vram = mVRAM;
+	if (mVRAM == 0)
+	{
+		S32 old_vram = mVRAM;
 
-	if (mHasATIMemInfo)
-	{ //ask the gl how much vram is free at startup and attempt to use no more than half of that
-		S32 meminfo[4];
-		glGetIntegerv(GL_TEXTURE_FREE_MEMORY_ATI, meminfo);
+		if (mHasATIMemInfo)
+		{ //ask the gl how much vram is free at startup and attempt to use no more than half of that
+			S32 meminfo[4];
+			glGetIntegerv(GL_TEXTURE_FREE_MEMORY_ATI, meminfo);
 
-		mVRAM = meminfo[0]/1024;
+			mVRAM = meminfo[0] / 1024;
+		}
+		else if (mHasNVXMemInfo)
+		{
+			S32 dedicated_memory;
+			glGetIntegerv(GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX, &dedicated_memory);
+			mVRAM = dedicated_memory / 1024;
+		}
+
+		if (mVRAM < 256)
+		{ //something likely went wrong using the above extensions, fall back to old method
+			mVRAM = old_vram;
+			LL_INFOS("RenderInit") << "Failed to detect VRAM from GL falling back to value: " << mVRAM << LL_ENDL;
+		}
+		else
+		{
+			LL_INFOS("RenderInit") << "Detected VRAM from GL: " << mVRAM << LL_ENDL;
+		}
 	}
-	else if (mHasNVXMemInfo)
+	else
 	{
-		S32 dedicated_memory;
-		glGetIntegerv(GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX, &dedicated_memory);
-		mVRAM = dedicated_memory/1024;
+		LL_INFOS("RenderInit") << "Using VRAM value from OS: " << mVRAM << LL_ENDL;
 	}
 
-	if (mVRAM < 256)
-	{ //something likely went wrong using the above extensions, fall back to old method
-		mVRAM = old_vram;
-	}
-
-	stop_glerror();
-
 	stop_glerror();
 
 	if (mHasFragmentShader)
diff --git a/indra/llwindow/CMakeLists.txt b/indra/llwindow/CMakeLists.txt
index 8bfb23ed647e60d7df1a2cf264c714eb603ec7c7..a86f45c90f1dfd6e71511dcbfffa4cf4e7964bf5 100644
--- a/indra/llwindow/CMakeLists.txt
+++ b/indra/llwindow/CMakeLists.txt
@@ -145,6 +145,7 @@ if (WINDOWS)
   list(APPEND llwindow_LINK_LIBRARIES
        comdlg32     # Common Dialogs for ChooseColor
        ole32
+       DXGI
        )
 endif (WINDOWS)
 
diff --git a/indra/llwindow/lldxhardware.cpp b/indra/llwindow/lldxhardware.cpp
index 9397b831f724f62b7a988a8890af648476ea1e53..3157c7936c64483212778454c0c73eb92c25271a 100644
--- a/indra/llwindow/lldxhardware.cpp
+++ b/indra/llwindow/lldxhardware.cpp
@@ -34,6 +34,7 @@
 #include <dxdiag.h>
 #undef INITGUID
 
+#include <dxgi.h>
 #include <wbemidl.h>
 #include <comdef.h>
 
@@ -47,7 +48,7 @@
 #include "llstl.h"
 #include "lltimer.h"
 
-void (*gWriteDebug)(const char* msg) = NULL;
+void (*gWriteDebug)(const char* msg) = nullptr;
 LLDXHardware gDXHardware;
 
 //-----------------------------------------------------------------------------
@@ -61,152 +62,6 @@ typedef BOOL ( WINAPI* PfnCoSetProxyBlanket )( IUnknown* pProxy, DWORD dwAuthnSv
                                                OLECHAR* pServerPrincName, DWORD dwAuthnLevel, DWORD dwImpLevel,
                                                RPC_AUTH_IDENTITY_HANDLE pAuthInfo, DWORD dwCapabilities );
 
-HRESULT GetVideoMemoryViaWMI( WCHAR* strInputDeviceID, DWORD* pdwAdapterRam )
-{
-    HRESULT hr;
-    bool bGotMemory = false;
-    HRESULT hrCoInitialize = S_OK;
-    IWbemLocator* pIWbemLocator = nullptr;
-    IWbemServices* pIWbemServices = nullptr;
-    BSTR pNamespace = nullptr;
-
-    *pdwAdapterRam = 0;
-    hrCoInitialize = CoInitialize( 0 );
-
-    hr = CoCreateInstance( CLSID_WbemLocator,
-                           nullptr,
-                           CLSCTX_INPROC_SERVER,
-                           IID_IWbemLocator,
-                           ( LPVOID* )&pIWbemLocator );
-#ifdef PRINTF_DEBUGGING
-    if( FAILED( hr ) ) wprintf( L"WMI: CoCreateInstance failed: 0x%0.8x\n", hr );
-#endif
-
-    if( SUCCEEDED( hr ) && pIWbemLocator )
-    {
-        // Using the locator, connect to WMI in the given namespace.
-        pNamespace = SysAllocString( L"\\\\.\\root\\cimv2" );
-
-        hr = pIWbemLocator->ConnectServer( pNamespace, nullptr, nullptr, 0L,
-                                           0L, nullptr, nullptr, &pIWbemServices );
-#ifdef PRINTF_DEBUGGING
-        if( FAILED( hr ) ) wprintf( L"WMI: pIWbemLocator->ConnectServer failed: 0x%0.8x\n", hr );
-#endif
-        if( SUCCEEDED( hr ) && pIWbemServices != 0 )
-        {
-            HINSTANCE hinstOle32 = nullptr;
-
-            hinstOle32 = LoadLibraryW( L"ole32.dll" );
-            if( hinstOle32 )
-            {
-                PfnCoSetProxyBlanket pfnCoSetProxyBlanket = nullptr;
-
-                pfnCoSetProxyBlanket = ( PfnCoSetProxyBlanket )GetProcAddress( hinstOle32, "CoSetProxyBlanket" );
-                if( pfnCoSetProxyBlanket != 0 )
-                {
-                    // Switch security level to IMPERSONATE. 
-                    pfnCoSetProxyBlanket( pIWbemServices, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, nullptr,
-                                          RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, nullptr, 0 );
-                }
-
-                FreeLibrary( hinstOle32 );
-            }
-
-            IEnumWbemClassObject* pEnumVideoControllers = nullptr;
-            BSTR pClassName = nullptr;
-
-            pClassName = SysAllocString( L"Win32_VideoController" );
-
-            hr = pIWbemServices->CreateInstanceEnum( pClassName, 0,
-                                                     nullptr, &pEnumVideoControllers );
-#ifdef PRINTF_DEBUGGING
-            if( FAILED( hr ) ) wprintf( L"WMI: pIWbemServices->CreateInstanceEnum failed: 0x%0.8x\n", hr );
-#endif
-
-            if( SUCCEEDED( hr ) && pEnumVideoControllers )
-            {
-                IWbemClassObject* pVideoControllers[10] = {0};
-                DWORD uReturned = 0;
-                BSTR pPropName = nullptr;
-
-                // Get the first one in the list
-                pEnumVideoControllers->Reset();
-                hr = pEnumVideoControllers->Next( 5000,             // timeout in 5 seconds
-                                                  10,                  // return the first 10
-                                                  pVideoControllers,
-                                                  &uReturned );
-#ifdef PRINTF_DEBUGGING
-                if( FAILED( hr ) ) wprintf( L"WMI: pEnumVideoControllers->Next failed: 0x%0.8x\n", hr );
-                if( uReturned == 0 ) wprintf( L"WMI: pEnumVideoControllers uReturned == 0\n" );
-#endif
-
-                VARIANT var;
-                if( SUCCEEDED( hr ) )
-                {
-                    bool bFound = false;
-                    for( UINT iController = 0; iController < uReturned; iController++ )
-                    {
-                        if ( !pVideoControllers[iController] )
-                            continue;
-
-                        pPropName = SysAllocString( L"PNPDeviceID" );
-                        hr = pVideoControllers[iController]->Get( pPropName, 0L, &var, nullptr, nullptr );
-#ifdef PRINTF_DEBUGGING
-                        if( FAILED( hr ) )
-                            wprintf( L"WMI: pVideoControllers[iController]->Get PNPDeviceID failed: 0x%0.8x\n", hr );
-#endif
-                        if( SUCCEEDED( hr ) )
-                        {
-                            if( wcsstr( var.bstrVal, strInputDeviceID ) != 0 )
-                                bFound = true;
-                        }
-                        VariantClear( &var );
-                        if( pPropName ) SysFreeString( pPropName );
-
-                        if( bFound )
-                        {
-                            pPropName = SysAllocString( L"AdapterRAM" );
-                            hr = pVideoControllers[iController]->Get( pPropName, 0L, &var, nullptr, nullptr );
-#ifdef PRINTF_DEBUGGING
-                            if( FAILED( hr ) )
-                                wprintf( L"WMI: pVideoControllers[iController]->Get AdapterRAM failed: 0x%0.8x\n",
-                                         hr );
-#endif
-                            if( SUCCEEDED( hr ) )
-                            {
-                                bGotMemory = true;
-                                *pdwAdapterRam = var.ulVal;
-                            }
-                            VariantClear( &var );
-                            if( pPropName ) SysFreeString( pPropName );
-                            break;
-                        }
-                        SAFE_RELEASE( pVideoControllers[iController] );
-                    }
-                }
-            }
-
-            if( pClassName )
-                SysFreeString( pClassName );
-            SAFE_RELEASE( pEnumVideoControllers );
-        }
-
-        if( pNamespace )
-            SysFreeString( pNamespace );
-        SAFE_RELEASE( pIWbemServices );
-    }
-
-    SAFE_RELEASE( pIWbemLocator );
-
-    if( SUCCEEDED( hrCoInitialize ) )
-        CoUninitialize();
-
-    if( bGotMemory )
-        return S_OK;
-    else
-        return E_FAIL;
-}
-
 //Getting the version of graphics controller driver via WMI
 std::string LLDXHardware::getDriverVersionWMI()
 {
@@ -361,7 +216,7 @@ std::string LLDXHardware::getDriverVersionWMI()
 	return mDriverVersion;
 }
 
-void get_wstring(IDxDiagContainer* containerp, WCHAR* wszPropName, WCHAR* wszPropValue, int outputSize)
+void get_wstring(IDxDiagContainer* containerp, const WCHAR* wszPropName, wchar_t* wszPropValue, int outputSize)
 {
 	HRESULT hr;
 	VARIANT var;
@@ -374,16 +229,16 @@ void get_wstring(IDxDiagContainer* containerp, WCHAR* wszPropName, WCHAR* wszPro
 		switch( var.vt )
 		{
 			case VT_UI4:
-				swprintf( wszPropValue, L"%d", var.ulVal );	/* Flawfinder: ignore */
+				swprintf(wszPropValue, outputSize, L"%lu", var.ulVal);	/* Flawfinder: ignore */
 				break;
 			case VT_I4:
-				swprintf( wszPropValue, L"%d", var.lVal );	/* Flawfinder: ignore */
+				swprintf(wszPropValue, outputSize, L"%li", var.lVal);	/* Flawfinder: ignore */
 				break;
 			case VT_BOOL:
-				wcscpy( wszPropValue, (var.boolVal) ? L"true" : L"false" );	/* Flawfinder: ignore */
+				wcscpy_s( wszPropValue, outputSize, (var.boolVal) ? L"true" : L"false");	/* Flawfinder: ignore */
 				break;
 			case VT_BSTR:
-				wcsncpy( wszPropValue, var.bstrVal, outputSize-1 );	/* Flawfinder: ignore */
+				wcsncpy_s( wszPropValue, outputSize, var.bstrVal, outputSize-1 );	/* Flawfinder: ignore */
 				wszPropValue[outputSize-1] = 0;
 				break;
 		}
@@ -392,12 +247,12 @@ void get_wstring(IDxDiagContainer* containerp, WCHAR* wszPropName, WCHAR* wszPro
 	VariantClear( &var );
 }
 
-std::string get_string(IDxDiagContainer *containerp, WCHAR *wszPropName)
+std::string get_string(IDxDiagContainer *containerp, const WCHAR *wszPropName)
 {
-    WCHAR wszPropValue[256];
-	get_wstring(containerp, wszPropName, wszPropValue, 256);
+    wchar_t wszPropValue[256];
+	get_wstring(containerp, wszPropName, wszPropValue, _countof(wszPropValue));
 
-	return utf16str_to_utf8str(wszPropValue);
+	return ll_convert_wide_to_string(wszPropValue);
 }
 
 
@@ -419,14 +274,13 @@ BOOL LLVersion::set(const std::string &version_string)
 		mFields[i] = 0;
 	}
 	// Split the version string.
-	std::string str(version_string);
 	typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
 	boost::char_separator<char> sep(".", "", boost::keep_empty_tokens);
-	tokenizer tokens(str, sep);
+	tokenizer tokens(version_string, sep);
 
-	tokenizer::iterator iter = tokens.begin();
+    
 	S32 count = 0;
-	for (;(iter != tokens.end()) && (count < 4);++iter)
+	for (auto iter = tokens.begin(); iter != tokens.end() && count < 4; ++iter)
 	{
 		mFields[count] = atoi(iter->c_str());
 		count++;
@@ -532,349 +386,81 @@ LLDXDriverFile *LLDXDevice::findDriver(const std::string &driver)
 		}
 	}
 
-	return NULL;
+	return nullptr;
 }
 
 LLDXHardware::LLDXHardware()
 {
 	mVRAM = 0;
-	gWriteDebug = NULL;
+	gWriteDebug = nullptr;
 }
 
 void LLDXHardware::cleanup()
 {
-  // for_each(mDevices.begin(), mDevices.end(), DeletePairedPointer());
-  // mDevices.clear();
-}
-
-/*
-std::string LLDXHardware::dumpDevices()
-{
-	if (gWriteDebug)
-	{
-		gWriteDebug("\n");
-		gWriteDebug("StartAllDevices\n");
-	}
-	for (device_map_t::iterator iter = mDevices.begin(),
-			 end = mDevices.end();
-		 iter != end; iter++)
-	{
-		LLDXDevice *devicep = iter->second;
-		devicep->dump();
-	}
-	if (gWriteDebug)
-	{
-		gWriteDebug("EndAllDevices\n\n");
-	}
-	return "";
-}
-
-LLDXDevice *LLDXHardware::findDevice(const std::string &vendor, const std::string &devices)
-{
-	// Iterate through different devices tokenized in devices string
-	std::string str(devices);
-	typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
-	boost::char_separator<char> sep("|", "", boost::keep_empty_tokens);
-	tokenizer tokens(str, sep);
-
-	tokenizer::iterator iter = tokens.begin();
-	for (;iter != tokens.end();++iter)
-	{
-		std::string dev_str = *iter;
-		for (device_map_t::iterator iter = mDevices.begin(),
-				 end = mDevices.end();
-			 iter != end; iter++)
-		{
-			LLDXDevice *devicep = iter->second;
-			if ((devicep->mVendorID == vendor)
-				&& (devicep->mDeviceID == dev_str))
-			{
-				return devicep;
-			}
-		}
-	}
-
-	return NULL;
 }
-*/
 
-BOOL LLDXHardware::getInfo(BOOL vram_only)
+BOOL LLDXHardware::updateVRAM()
 {
-	LLTimer hw_timer;
-	BOOL ok = FALSE;
-    HRESULT       hr;
-
-    CoInitialize(NULL);
-
-    IDxDiagProvider *dx_diag_providerp = NULL;
-    IDxDiagContainer *dx_diag_rootp = NULL;
-	IDxDiagContainer *devices_containerp = NULL;
-	// IDxDiagContainer *system_device_containerp= NULL;
-	IDxDiagContainer *device_containerp = NULL;
-	IDxDiagContainer *file_containerp = NULL;
-	IDxDiagContainer *driver_containerp = NULL;
-	DWORD dw_device_count;
-
-    // CoCreate a IDxDiagProvider*
-	LL_DEBUGS("AppInit") << "CoCreateInstance IID_IDxDiagProvider" << LL_ENDL;
-    hr = CoCreateInstance(CLSID_DxDiagProvider,
-                          NULL,
-                          CLSCTX_INPROC_SERVER,
-                          IID_IDxDiagProvider,
-                          (LPVOID*) &dx_diag_providerp);
+	HRESULT hr;
+	BOOL bGotMemory = FALSE;
+	HRESULT hrCoInitialize = S_OK;
+	SIZE_T vram = 0;
 
-	if (FAILED(hr))
+	hrCoInitialize = CoInitialize(0);
+	if (SUCCEEDED(hrCoInitialize))
 	{
-		LL_WARNS("AppInit") << "No DXDiag provider found!  DirectX 9 not installed!" << LL_ENDL;
-		gWriteDebug("No DXDiag provider found!  DirectX 9 not installed!\n");
-		goto LCleanup;
-	}
-    if (SUCCEEDED(hr)) // if FAILED(hr) then dx9 is not installed
-    {
-        // Fill out a DXDIAG_INIT_PARAMS struct and pass it to IDxDiagContainer::Initialize
-        // Passing in TRUE for bAllowWHQLChecks, allows dxdiag to check if drivers are 
-        // digital signed as logo'd by WHQL which may connect via internet to update 
-        // WHQL certificates.    
-        DXDIAG_INIT_PARAMS dx_diag_init_params;
-        ZeroMemory(&dx_diag_init_params, sizeof(DXDIAG_INIT_PARAMS));
+		IDXGIFactory1* pDXGIFactory = nullptr;
 
-        dx_diag_init_params.dwSize                  = sizeof(DXDIAG_INIT_PARAMS);
-        dx_diag_init_params.dwDxDiagHeaderVersion   = DXDIAG_DX9_SDK_VERSION;
-        dx_diag_init_params.bAllowWHQLChecks        = TRUE;
-        dx_diag_init_params.pReserved               = NULL;
-
-		LL_DEBUGS("AppInit") << "dx_diag_providerp->Initialize" << LL_ENDL;
-        hr = dx_diag_providerp->Initialize(&dx_diag_init_params);
-        if(FAILED(hr))
+		hr = CreateDXGIFactory1(IID_PPV_ARGS(&pDXGIFactory));
+		if (SUCCEEDED(hr))
 		{
-            goto LCleanup;
-		}
+			assert(pDXGIFactory != 0);
 
-		LL_DEBUGS("AppInit") << "dx_diag_providerp->GetRootContainer" << LL_ENDL;
-        hr = dx_diag_providerp->GetRootContainer( &dx_diag_rootp );
-        if(FAILED(hr) || !dx_diag_rootp)
-		{
-            goto LCleanup;
-		}
-
-		HRESULT hr;
-
-		// Get display driver information
-		LL_DEBUGS("AppInit") << "dx_diag_rootp->GetChildContainer" << LL_ENDL;
-		hr = dx_diag_rootp->GetChildContainer(L"DxDiag_DisplayDevices", &devices_containerp);
-		if(FAILED(hr) || !devices_containerp)
-		{
-            // do not release 'dirty' devices_containerp at this stage, only dx_diag_rootp
-            devices_containerp = NULL; 
-            goto LCleanup;
-		}
-
-        // make sure there is something inside
-        hr = devices_containerp->GetNumberOfChildContainers(&dw_device_count);
-        if (FAILED(hr) || dw_device_count == 0)
-        {
-            goto LCleanup;
-        }
-
-		// Get device 0
-		LL_DEBUGS("AppInit") << "devices_containerp->GetChildContainer" << LL_ENDL;
-		hr = devices_containerp->GetChildContainer(L"0", &device_containerp);
-		if(FAILED(hr) || !device_containerp)
-		{
-            goto LCleanup;
-		}
-		
-		DWORD vram = 0;
-
-		WCHAR deviceID[512];
-
-		get_wstring(device_containerp, L"szDeviceID", deviceID, 512);
-		
-		if (SUCCEEDED(GetVideoMemoryViaWMI(deviceID, &vram))) 
-		{
-			mVRAM = vram/(1024*1024);
-		}
-		else
-		{ // Get the English VRAM string
-		  std::string ram_str = get_string(device_containerp, L"szDisplayMemoryEnglish");
-
-		  // We don't need the device any more
-		  SAFE_RELEASE(device_containerp);
-
-		  // Dump the string as an int into the structure
-		  char *stopstring;
-		  mVRAM = strtol(ram_str.c_str(), &stopstring, 10); 
-		  LL_INFOS("AppInit") << "VRAM Detected: " << mVRAM << " DX9 string: " << ram_str << LL_ENDL;
-		}
-
-		if (vram_only)
-		{
-			ok = TRUE;
-			goto LCleanup;
-		}
-
-
-		/* for now, we ONLY do vram_only the rest of this
-		   is commented out, to ensure no-one is tempted
-		   to use it
-		
-		// Now let's get device and driver information
-		// Get the IDxDiagContainer object called "DxDiag_SystemDevices".
-		// This call may take some time while dxdiag gathers the info.
-		DWORD num_devices = 0;
-	    WCHAR wszContainer[256];
-		LL_DEBUGS("AppInit") << "dx_diag_rootp->GetChildContainer DxDiag_SystemDevices" << LL_ENDL;
-		hr = dx_diag_rootp->GetChildContainer(L"DxDiag_SystemDevices", &system_device_containerp);
-		if (FAILED(hr))
-		{
-			goto LCleanup;
-		}
-
-		hr = system_device_containerp->GetNumberOfChildContainers(&num_devices);
-		if (FAILED(hr))
-		{
-			goto LCleanup;
-		}
-
-		LL_DEBUGS("AppInit") << "DX9 iterating over devices" << LL_ENDL;
-		S32 device_num = 0;
-		for (device_num = 0; device_num < (S32)num_devices; device_num++)
-		{
-			hr = system_device_containerp->EnumChildContainerNames(device_num, wszContainer, 256);
-			if (FAILED(hr))
-			{
-				goto LCleanup;
-			}
-
-			hr = system_device_containerp->GetChildContainer(wszContainer, &device_containerp);
-			if (FAILED(hr) || device_containerp == NULL)
+			for (UINT index = 0; ; ++index)
 			{
-				goto LCleanup;
-			}
-
-			std::string device_name = get_string(device_containerp, L"szDescription");
-
-			std::string device_id = get_string(device_containerp, L"szDeviceID");
-
-			LLDXDevice *dxdevicep = new LLDXDevice;
-			dxdevicep->mName = device_name;
-			dxdevicep->mPCIString = device_id;
-			mDevices[dxdevicep->mPCIString] = dxdevicep;
-
-			// Split the PCI string based on vendor, device, subsys, rev.
-			std::string str(device_id);
-			typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
-			boost::char_separator<char> sep("&\\", "", boost::keep_empty_tokens);
-			tokenizer tokens(str, sep);
+				IDXGIAdapter1* pAdapter = nullptr;
+				hr = pDXGIFactory->EnumAdapters1(index, &pAdapter);
+				if (FAILED(hr)) // DXGIERR_NOT_FOUND is expected when the end of the list is hit
+					break;
 
-			tokenizer::iterator iter = tokens.begin();
-			S32 count = 0;
-			BOOL valid = TRUE;
-			for (;(iter != tokens.end()) && (count < 3);++iter)
-			{
-				switch (count)
+				DXGI_ADAPTER_DESC1 desc;
+				memset(&desc, 0, sizeof(DXGI_ADAPTER_DESC1));
+				if (SUCCEEDED(pAdapter->GetDesc1(&desc)))
 				{
-				case 0:
-					if (strcmp(iter->c_str(), "PCI"))
+					if (desc.Flags == 0)
 					{
-						valid = FALSE;
+						vram = desc.DedicatedVideoMemory;
+						bGotMemory = TRUE;
 					}
-					break;
-				case 1:
-					dxdevicep->mVendorID = iter->c_str();
-					break;
-				case 2:
-					dxdevicep->mDeviceID = iter->c_str();
-					break;
-				default:
-					// Ignore it
-					break;
 				}
-				count++;
-			}
-
-
-
-
-			// Now, iterate through the related drivers
-			hr = device_containerp->GetChildContainer(L"Drivers", &driver_containerp);
-			if (FAILED(hr) || !driver_containerp)
-			{
-				goto LCleanup;
-			}
-
-			DWORD num_files = 0;
-			hr = driver_containerp->GetNumberOfChildContainers(&num_files);
-			if (FAILED(hr))
-			{
-				goto LCleanup;
-			}
-
-			S32 file_num = 0;
-			for (file_num = 0; file_num < (S32)num_files; file_num++ )
-			{
-
-				hr = driver_containerp->EnumChildContainerNames(file_num, wszContainer, 256);
-				if (FAILED(hr))
-				{
-					goto LCleanup;
-				}
-
-				hr = driver_containerp->GetChildContainer(wszContainer, &file_containerp);
-				if (FAILED(hr) || file_containerp == NULL)
-				{
-					goto LCleanup;
-				}
-
-				std::string driver_path = get_string(file_containerp, L"szPath");
-				std::string driver_name = get_string(file_containerp, L"szName");
-				std::string driver_version = get_string(file_containerp, L"szVersion");
-				std::string driver_date = get_string(file_containerp, L"szDatestampEnglish");
-
-				LLDXDriverFile *dxdriverfilep = new LLDXDriverFile;
-				dxdriverfilep->mName = driver_name;
-				dxdriverfilep->mFilepath= driver_path;
-				dxdriverfilep->mVersionString = driver_version;
-				dxdriverfilep->mVersion.set(driver_version);
-				dxdriverfilep->mDateString = driver_date;
-
-				dxdevicep->mDriverFiles[driver_name] = dxdriverfilep;
-
-				SAFE_RELEASE(file_containerp);
+				SAFE_RELEASE(pAdapter);
+				if (bGotMemory != FALSE)
+					break;
 			}
-			SAFE_RELEASE(device_containerp);
+			SAFE_RELEASE(pDXGIFactory);
 		}
-		*/
-    }
+		CoUninitialize();
+	}
 
-    // dumpDevices();
-    ok = TRUE;
-	
-LCleanup:
-	if (!ok)
+	if (bGotMemory != FALSE)
 	{
-		LL_WARNS("AppInit") << "DX9 probe failed" << LL_ENDL;
-		gWriteDebug("DX9 probe failed\n");
+		mVRAM = vram / (1024 * 1024);
 	}
-
-	SAFE_RELEASE(file_containerp);
-	SAFE_RELEASE(driver_containerp);
-	SAFE_RELEASE(device_containerp);
-	SAFE_RELEASE(devices_containerp);
-    SAFE_RELEASE(dx_diag_rootp);
-    SAFE_RELEASE(dx_diag_providerp);
-    
-    CoUninitialize();
-    
-    return ok;
-    }
+	return bGotMemory;
+}
 
 LLSD LLDXHardware::getDisplayInfo()
 {
 	LLTimer hw_timer;
     HRESULT       hr;
 	LLSD ret;
-    CoInitialize(NULL);
+    hr = CoInitialize(nullptr);
+	if (FAILED(hr))
+	{
+		LL_WARNS() << "COM initialization failure!" << LL_ENDL;
+		gWriteDebug("COM initialization failure!\n");
+		return ret;
+	}
 
     IDxDiagProvider *dx_diag_providerp = NULL;
     IDxDiagContainer *dx_diag_rootp = NULL;
@@ -887,7 +473,7 @@ LLSD LLDXHardware::getDisplayInfo()
     // CoCreate a IDxDiagProvider*
 	LL_INFOS() << "CoCreateInstance IID_IDxDiagProvider" << LL_ENDL;
     hr = CoCreateInstance(CLSID_DxDiagProvider,
-                          NULL,
+                          nullptr,
                           CLSCTX_INPROC_SERVER,
                           IID_IDxDiagProvider,
                           (LPVOID*) &dx_diag_providerp);
@@ -959,7 +545,7 @@ LLSD LLDXHardware::getDisplayInfo()
 
 		// Dump the string as an int into the structure
 		char *stopstring;
-		ret["VRAM"] = strtol(ram_str.c_str(), &stopstring, 10);
+		ret["VRAM"] = (LLSD::Integer)strtol(ram_str.c_str(), &stopstring, 10);
 		std::string device_name = get_string(device_containerp, L"szDescription");
 		ret["DeviceName"] = device_name;
 		std::string device_driver=  get_string(device_containerp, L"szDriverVersion");
@@ -981,13 +567,13 @@ LLSD LLDXHardware::getDisplayInfo()
                 // get the value
                 DWORD dwType = REG_SZ;
                 DWORD dwSize = sizeof(WCHAR) * RV_SIZE;
-                if(ERROR_SUCCESS == RegQueryValueEx(hKey, TEXT("ReleaseVersion"), 
-                    NULL, &dwType, (LPBYTE)release_version, &dwSize))
+                if(ERROR_SUCCESS == RegQueryValueEx(hKey, TEXT("ReleaseVersion"),
+                    nullptr, &dwType, (LPBYTE)release_version, &dwSize))
                 {
                     // print the value
                     // windows doesn't guarantee to be null terminated
                     release_version[RV_SIZE - 1] = NULL;
-                    ret["DriverVersion"] = utf16str_to_utf8str(release_version);
+                    ret["DriverVersion"] = ll_convert_wide_to_string(release_version);
 
                 }
                 RegCloseKey(hKey);
diff --git a/indra/llwindow/lldxhardware.h b/indra/llwindow/lldxhardware.h
index cf33db8b3726231804b4a95faf33d726e7e0b167..1311888e8366a677f03bdc2844d217b831148796 100644
--- a/indra/llwindow/lldxhardware.h
+++ b/indra/llwindow/lldxhardware.h
@@ -86,7 +86,7 @@ class LLDXHardware
 
 	// Returns TRUE on success.
 	// vram_only TRUE does a "light" probe.
-	BOOL getInfo(BOOL vram_only);
+	BOOL updateVRAM();
 
 	std::string getDriverVersionWMI();
 
diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp
index d208e135bbb69bf2f2d95ca06fae99e830c29d10..3c210b73ae3c7c890adace2440d4c3808f78479c 100644
--- a/indra/newview/llappviewerwin32.cpp
+++ b/indra/newview/llappviewerwin32.cpp
@@ -704,43 +704,14 @@ bool LLAppViewerWin32::initHardwareTest()
 	// Do driver verification and initialization based on DirectX
 	// hardware polling and driver versions
 	//
-	if (TRUE == gSavedSettings.getBOOL("ProbeHardwareOnStartup") && FALSE == gSavedSettings.getBOOL("NoHardwareProbe"))
+	if (FALSE == gSavedSettings.getBOOL("NoHardwareProbe"))
 	{
-		// per DEV-11631 - disable hardware probing for everything
-		// but vram.
-		BOOL vram_only = TRUE;
-
 		LLSplashScreen::update(LLTrans::getString("StartupDetectingHardware"));
 
 		LL_DEBUGS("AppInit") << "Attempting to poll DirectX for hardware info" << LL_ENDL;
 		gDXHardware.setWriteDebugFunc(write_debug_dx);
-		BOOL probe_ok = gDXHardware.getInfo(vram_only);
-
-		if (!probe_ok
-			&& gWarningSettings.getBOOL("AboutDirectX9"))
-		{
-			LL_WARNS("AppInit") << "DirectX probe failed, alerting user." << LL_ENDL;
-
-			// Warn them that runnin without DirectX 9 will
-			// not allow us to tell them about driver issues
-			std::ostringstream msg;
-			msg << LLTrans::getString ("MBNoDirectX");
-			S32 button = OSMessageBox(
-				msg.str(),
-				LLTrans::getString("MBWarning"),
-				OSMB_YESNO);
-			if (OSBTN_NO== button)
-			{
-				LL_INFOS("AppInit") << "User quitting after failed DirectX 9 detection" << LL_ENDL;
-				LLWeb::loadURLExternal("http://secondlife.com/support/", false);
-				return false;
-			}
-			gWarningSettings.setBOOL("AboutDirectX9", FALSE);
-		}
-		LL_DEBUGS("AppInit") << "Done polling DirectX for hardware info" << LL_ENDL;
-
-		// Only probe once after installation
-		gSavedSettings.setBOOL("ProbeHardwareOnStartup", FALSE);
+		gDXHardware.updateVRAM();
+		LL_DEBUGS("AppInit") << "Done polling DXGI for vram info" << LL_ENDL;
 
 		// Disable so debugger can work
 		std::string splash_msg;