D3D11 additional context-loss logging
This makes logging more consistent when we encounter context loss.
In Renderer11::testDeviceLost, note DXGI_ERROR_INVALID_CALL is a
valid GetDeviceRemovedReason, but was not detected prior.
SwapChain11::resize and SwapChain11::reset added more logging,
likewise with Context11::handleResult.
This covers everywhere d3d11::isDeviceLostError is invoked, though that
might not be exhaustive of all cases we detect device loss.
Bug: b/188291915
Test: Manually trigger conditions to test logging.
Change-Id: Idd57363101b53bc2d3c4c306ee78a42012a1a320
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2935696
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Doug Horn <doughorn@google.com>
Commit-Queue: Michael Yu <warty@google.com>
diff --git a/src/libANGLE/renderer/d3d/d3d11/Context11.cpp b/src/libANGLE/renderer/d3d/d3d11/Context11.cpp
index 117e5c7..84d3762 100644
--- a/src/libANGLE/renderer/d3d/d3d11/Context11.cpp
+++ b/src/libANGLE/renderer/d3d/d3d11/Context11.cpp
@@ -991,15 +991,19 @@
{
ASSERT(FAILED(hr));
- if (d3d11::isDeviceLostError(hr))
- {
- mRenderer->notifyDeviceLost();
- }
-
GLenum glErrorCode = DefaultGLErrorCode(hr);
std::stringstream errorStream;
- errorStream << "Internal D3D11 error: " << gl::FmtHR(hr) << ": " << message;
+ errorStream << "Internal D3D11 error: " << gl::FmtHR(hr);
+
+ if (d3d11::isDeviceLostError(hr))
+ {
+ HRESULT removalReason = mRenderer->getDevice()->GetDeviceRemovedReason();
+ errorStream << " (removal reason: " << gl::FmtHR(removalReason) << ")";
+ mRenderer->notifyDeviceLost();
+ }
+
+ errorStream << ": " << message;
mErrors->handleError(glErrorCode, errorStream.str().c_str(), file, function, line);
}
diff --git a/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp b/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp
index 3178840..68ef522 100644
--- a/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp
+++ b/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp
@@ -2127,8 +2127,6 @@
// set notify to true to broadcast a message to all contexts of the device loss
bool Renderer11::testDeviceLost()
{
- bool isLost = false;
-
if (!mDevice)
{
return true;
@@ -2136,7 +2134,7 @@
// GetRemovedReason is used to test if the device is removed
HRESULT result = mDevice->GetDeviceRemovedReason();
- isLost = d3d11::isDeviceLostError(result);
+ bool isLost = FAILED(result);
if (isLost)
{
diff --git a/src/libANGLE/renderer/d3d/d3d11/SwapChain11.cpp b/src/libANGLE/renderer/d3d/d3d11/SwapChain11.cpp
index dff0848..23fe302 100644
--- a/src/libANGLE/renderer/d3d/d3d11/SwapChain11.cpp
+++ b/src/libANGLE/renderer/d3d/d3d11/SwapChain11.cpp
@@ -512,6 +512,9 @@
if (d3d11::isDeviceLostError(hr))
{
+ HRESULT reason = device->GetDeviceRemovedReason();
+ ERR() << "Device lost in SwapChain11::resize " << gl::FmtHR(hr)
+ << ", reason: " << gl::FmtHR(reason);
return EGL_CONTEXT_LOST;
}
else
@@ -630,6 +633,9 @@
if (d3d11::isDeviceLostError(hr))
{
+ HRESULT reason = device->GetDeviceRemovedReason();
+ ERR() << "Device lost in SwapChain11::reset " << gl::FmtHR(hr)
+ << ", reason: " << gl::FmtHR(reason);
return EGL_CONTEXT_LOST;
}
else