Commit 7566efcf by apatrick@chromium.org

When CheckDeviceStats returns S_PRESENT_MODE_CHANGED, reset display mode and…

When CheckDeviceStats returns S_PRESENT_MODE_CHANGED, reset display mode and retest for device lost. Unless the display mode is reset, CheckDeviceLost can keep returning S_PRESENT_MODE_CHANGED, potentially masking a device lost on account of a GPU hang, causing ANGLE to fail to report context lost. Review URL: https://codereview.appspot.com/7381061 git-svn-id: https://angleproject.googlecode.com/svn/trunk@1986 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent 5a5b3db1
#define MAJOR_VERSION 1 #define MAJOR_VERSION 1
#define MINOR_VERSION 0 #define MINOR_VERSION 0
#define BUILD_VERSION 0 #define BUILD_VERSION 0
#define BUILD_REVISION 1985 #define BUILD_REVISION 1986
#define STRINGIFY(x) #x #define STRINGIFY(x) #x
#define MACRO_STRINGIFY(x) STRINGIFY(x) #define MACRO_STRINGIFY(x) STRINGIFY(x)
......
...@@ -908,16 +908,32 @@ D3DADAPTER_IDENTIFIER9 *Display::getAdapterIdentifier() ...@@ -908,16 +908,32 @@ D3DADAPTER_IDENTIFIER9 *Display::getAdapterIdentifier()
bool Display::testDeviceLost() bool Display::testDeviceLost()
{ {
bool isLost = false;
if (mDeviceEx) if (mDeviceEx)
{ {
return FAILED(mDeviceEx->CheckDeviceState(NULL)); HRESULT hr = mDeviceEx->CheckDeviceState(NULL);
if (hr == S_PRESENT_MODE_CHANGED)
{
// Reset the device so that D3D stops reporting S_PRESENT_MODE_CHANGED. Otherwise it will report
// it continuously, potentially masking a lost device. D3D resources are not lost on a mode change with WDDM.
D3DPRESENT_PARAMETERS presentParameters = getDefaultPresentParameters();
mDeviceEx->Reset(&presentParameters);
// Reset will not always cause the device loss to be reported so issue a dummy present.
mDeviceEx->Present(NULL, NULL, NULL, NULL);
// Retest the device status to see if the mode change really indicated a lost device.
hr = mDeviceEx->CheckDeviceState(NULL);
}
isLost = FAILED(hr);
} }
else if (mDevice) else if (mDevice)
{ {
return FAILED(mDevice->TestCooperativeLevel()); isLost = FAILED(mDevice->TestCooperativeLevel());
} }
return false; // No device yet, so no reset required return isLost;
} }
bool Display::testDeviceResettable() bool Display::testDeviceResettable()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment