diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp
index 9e7ea15cd799158042b7e9812fd902c90495ef7b..9e2e07102e3886e3cdd889b4512116083772eadb 100644
--- a/indra/llwindow/llwindowwin32.cpp
+++ b/indra/llwindow/llwindowwin32.cpp
@@ -48,6 +48,8 @@
 #include "llthreadsafequeue.h"
 #include "stringize.h"
 #include "llframetimer.h"
+#include "commoncontrol.h" // TODO: Remove after testing
+#include "llsd.h" // TODO: Remove after testing
 
 // System includes
 #include <commdlg.h>
@@ -416,7 +418,9 @@ struct LLWindowWin32::LLWindowWin32Thread : public LL::ThreadPool
 
     std::atomic<U32> mAvailableVRAM;
 
+    bool mTryUseDXGIAdapter; // TODO: Remove after testing
     IDXGIAdapter3* mDXGIAdapter = nullptr;
+    bool mTryUseD3DDevice; // TODO: Remove after testing
     LPDIRECT3D9 mD3D = nullptr;
     LPDIRECT3DDEVICE9 mD3DDevice = nullptr;
 };
@@ -4549,6 +4553,14 @@ U32 LLWindowWin32::getAvailableVRAMMegabytes()
 inline LLWindowWin32::LLWindowWin32Thread::LLWindowWin32Thread()
     : ThreadPool("Window Thread", 1, MAX_QUEUE_SIZE)
 {
+    const LLSD skipDXGI{ LL::CommonControl::get("Global", "DisablePrimaryGraphicsMemoryAccounting") }; // TODO: Remove after testing
+    LL_WARNS() << "DisablePrimaryGraphicsMemoryAccounting: " << skipDXGI << ", as boolean: " << skipDXGI.asBoolean() << LL_ENDL;
+    mTryUseDXGIAdapter = !skipDXGI.asBoolean();
+    LL_WARNS() << "mTryUseDXGIAdapter: " << mTryUseDXGIAdapter << LL_ENDL;
+    const LLSD skipD3D{ LL::CommonControl::get("Global", "DisableSecondaryGraphicsMemoryAccounting") }; // TODO: Remove after testing
+    LL_WARNS() << "DisableSecondaryGraphicsMemoryAccounting: " << skipD3D << ", as boolean: " << skipD3D.asBoolean() << LL_ENDL;
+    mTryUseD3DDevice = !skipD3D.asBoolean();
+    LL_WARNS() << "mTryUseD3DDevice: " << mTryUseD3DDevice << LL_ENDL;
     ThreadPool::start();
 }
 
@@ -4665,7 +4677,7 @@ void debugEnumerateGraphicsAdapters()
 
 void LLWindowWin32::LLWindowWin32Thread::initDX()
 {
-    if (mDXGIAdapter == NULL)
+    if (mDXGIAdapter == NULL && mTryUseDXGIAdapter)
     {
         debugEnumerateGraphicsAdapters();
 
@@ -4684,6 +4696,10 @@ void LLWindowWin32::LLWindowWin32Thread::initDX()
             {
                 LL_WARNS() << "EnumAdapters failed: 0x" << std::hex << res << LL_ENDL;
             }
+            else
+            {
+                LL_INFOS() << "EnumAdapters success" << LL_ENDL;
+            }
         }
 
         if (pFactory)
@@ -4695,7 +4711,7 @@ void LLWindowWin32::LLWindowWin32Thread::initDX()
 
 void LLWindowWin32::LLWindowWin32Thread::initD3D()
 {
-    if (mDXGIAdapter == NULL && mD3DDevice == NULL && mWindowHandle != 0)
+    if (mDXGIAdapter == NULL && mD3DDevice == NULL && mTryUseD3DDevice && mWindowHandle != 0)
     {
         mD3D = Direct3DCreate9(D3D_SDK_VERSION);
         
@@ -4705,7 +4721,16 @@ void LLWindowWin32::LLWindowWin32Thread::initD3D()
         d3dpp.Windowed = TRUE;
         d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
 
-        mD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, mWindowHandle, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &mD3DDevice);
+        HRESULT res = mD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, mWindowHandle, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &mD3DDevice);
+        
+        if (FAILED(res))
+        {
+            LL_WARNS() << "(fallback) CreateDevice failed: 0x" << std::hex << res << LL_ENDL;
+        }
+        else
+        {
+            LL_INFOS() << "(fallback) CreateDevice success" << LL_ENDL;
+        }
     }
 }
 
@@ -4768,6 +4793,7 @@ void LLWindowWin32::LLWindowWin32Thread::run()
         if (mWindowHandle != 0)
         {
             // lazily call initD3D inside this loop to catch when mWindowHandle has been set
+            // *TODO: Shutdown if this fails when mWindowHandle exists
             initD3D();
 
             MSG msg;
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index bc4945eca5a1940296023dbc9d40003daffc51d8..afa8217af281699930c12a24d0485bb437fa817e 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -3387,6 +3387,29 @@
       <key>Value</key>
       <integer>0</integer>
     </map>
+    <!-- TODO: Remove settings keys DisablePrimaryGraphicsMemoryAccounting and DisableSecondaryGraphicsMemoryAccounting after testing, and code that references them -->
+    <key>DisablePrimaryGraphicsMemoryAccounting</key>
+    <map>
+      <key>Comment</key>
+      <string>Disable the first method used to detect GPU memory use</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>0</integer>
+    </map>
+    <key>DisableSecondaryGraphicsMemoryAccounting</key>
+    <map>
+      <key>Comment</key>
+      <string>Disable the second method used to detect GPU memory use, used as a fallback when the first method fails</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>0</integer>
+    </map>
     <key>DisableTextHyperlinkActions</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 9ec341813229f4ac9c7f7fb729893302a3624920..d4e667bcc613671e55a627910248cb2d47deb4a2 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -434,6 +434,7 @@ void LLPipeline::connectRefreshCachedSettingsSafe(const std::string name)
 
 void LLPipeline::init()
 {
+    LL_WARNS() << "Begin pipeline initialization" << LL_ENDL; // TODO: Remove after testing
 	refreshCachedSettings();
 
 	gOctreeMaxCapacity = gSavedSettings.getU32("OctreeMaxNodeCapacity");
@@ -450,6 +451,7 @@ void LLPipeline::init()
 	mInitialized = true;
 	
 	stop_glerror();
+    LL_WARNS() << "No GL errors yet. Pipeline initialization will continue." << LL_ENDL; // TODO: Remove after testing
 
 	//create render pass pools
 	getPool(LLDrawPool::POOL_ALPHA);
@@ -510,7 +512,9 @@ void LLPipeline::init()
 	
 	// Enable features
 		
+    LL_WARNS() << "Shader initialization start" << LL_ENDL; // TODO: Remove after testing
 	LLViewerShaderMgr::instance()->setShaders();
+    LL_WARNS() << "Shader initialization end" << LL_ENDL; // TODO: Remove after testing
 
 	stop_glerror();