Bug 1345648 - Add BREAK_ON_D3D_ERROR to DeviceManagerDx - r=kvark draft
authorJeff Gilbert <jdashg@gmail.com>
Wed, 08 Mar 2017 17:06:43 -0800
changeset 495580 7e44b90ef1087f1fb53d56e764f5e7446ddac67e
parent 495579 6633d37aa7b6fdfb5d322e44df5cda5ad4aa008b
child 548416 e01629210d7bfea1d08ada43eefe900b179ec148
push id48374
push userbmo:jgilbert@mozilla.com
push dateThu, 09 Mar 2017 01:07:14 +0000
reviewerskvark
bugs1345648
milestone55.0a1
Bug 1345648 - Add BREAK_ON_D3D_ERROR to DeviceManagerDx - r=kvark MozReview-Commit-ID: DgHPXgjOi3f
gfx/thebes/DeviceManagerDx.cpp
--- a/gfx/thebes/DeviceManagerDx.cpp
+++ b/gfx/thebes/DeviceManagerDx.cpp
@@ -362,32 +362,58 @@ DeviceManagerDx::CreateCompositorDevice(
       false,
       textureSharingWorks,
       featureLevel,
       DxgiAdapterDesc::From(desc)));
   }
   mCompositorDevice->SetExceptionMode(0);
 }
 
+//#define BREAK_ON_D3D_ERROR
+
 bool
 DeviceManagerDx::CreateDevice(IDXGIAdapter* aAdapter,
                                  D3D_DRIVER_TYPE aDriverType,
                                  UINT aFlags,
                                  HRESULT& aResOut,
                                  RefPtr<ID3D11Device>& aOutDevice)
 {
+#ifdef BREAK_ON_D3D_ERROR
+  aFlags |= D3D11_CREATE_DEVICE_DEBUG;
+#endif
+
   MOZ_SEH_TRY {
     aResOut = sD3D11CreateDeviceFn(
       aAdapter, aDriverType, nullptr,
       aFlags,
       mFeatureLevels.Elements(), mFeatureLevels.Length(),
       D3D11_SDK_VERSION, getter_AddRefs(aOutDevice), nullptr, nullptr);
   } MOZ_SEH_EXCEPT (EXCEPTION_EXECUTE_HANDLER) {
     return false;
   }
+
+#ifdef BREAK_ON_D3D_ERROR
+  do {
+    if (!aOutDevice)
+      break;
+
+    RefPtr<ID3D11Debug> debug;
+    if(!SUCCEEDED( aOutDevice->QueryInterface(__uuidof(ID3D11Debug), getter_AddRefs(debug)) ))
+      break;
+
+    RefPtr<ID3D11InfoQueue> infoQueue;
+    if(!SUCCEEDED( debug->QueryInterface(__uuidof(ID3D11InfoQueue), getter_AddRefs(infoQueue)) ))
+      break;
+
+    infoQueue->SetBreakOnSeverity(D3D11_MESSAGE_SEVERITY_CORRUPTION, true);
+    infoQueue->SetBreakOnSeverity(D3D11_MESSAGE_SEVERITY_ERROR, true);
+    infoQueue->SetBreakOnSeverity(D3D11_MESSAGE_SEVERITY_WARNING, true);
+  } while (false);
+#endif
+
   return true;
 }
 
 void
 DeviceManagerDx::CreateWARPCompositorDevice()
 {
   ScopedGfxFeatureReporter reporterWARP("D3D11-WARP", gfxPrefs::LayersD3D11ForceWARP());
   FeatureState& d3d11 = gfxConfig::GetFeature(Feature::D3D11_COMPOSITING);