diff options
author | Android Chromium Automerger <chromium-automerger@android> | 2013-11-28 07:19:32 +0000 |
---|---|---|
committer | Android Chromium Automerger <chromium-automerger@android> | 2013-11-28 07:19:32 +0000 |
commit | a5e7bb8e41e934b48a70bb85f564ceb1810e7511 (patch) | |
tree | 8368c2dafa4858f870ed7ed5e3e892f614ad87c5 | |
parent | a9fb4a91fa55e7808f65ca1a448c7847652d5199 (diff) | |
parent | af640efbfdbe80909016fc623bb65f010a2e551f (diff) | |
download | angle_dx11-a5e7bb8e41e934b48a70bb85f564ceb1810e7511.tar.gz |
Merge third_party/angle_dx11 from https://chromium.googlesource.com/external/angle.git at af640efbfdbe80909016fc623bb65f010a2e551f
This commit was generated by merge_from_chromium.py.
Change-Id: I45af795ac7ab674108b79ea2d867643e3dde1f1f
-rw-r--r-- | src/libGLESv2/renderer/Renderer9.cpp | 68 | ||||
-rw-r--r-- | src/libGLESv2/renderer/Renderer9.h | 3 | ||||
-rw-r--r-- | src/libGLESv2/renderer/SwapChain9.cpp | 5 |
3 files changed, 56 insertions, 20 deletions
diff --git a/src/libGLESv2/renderer/Renderer9.cpp b/src/libGLESv2/renderer/Renderer9.cpp index 59ae6c52..c46d82b3 100644 --- a/src/libGLESv2/renderer/Renderer9.cpp +++ b/src/libGLESv2/renderer/Renderer9.cpp @@ -2115,7 +2115,7 @@ bool Renderer9::testDeviceResettable() return (mDeviceEx != NULL); case D3DERR_DEVICEREMOVED: ASSERT(mDeviceEx != NULL); - return true; + return isRemovedDeviceResettable(); default: return false; } @@ -2129,23 +2129,26 @@ bool Renderer9::resetDevice() HRESULT result = D3D_OK; bool lost = testDeviceLost(false); - int attempts = 3; bool removedDevice = (getDeviceStatusCode() == D3DERR_DEVICEREMOVED); - while (lost && attempts > 0) + // Device Removed is a feature which is only present with D3D9Ex + ASSERT(mDeviceEx != NULL || !removedDevice); + + for (int attempts = 3; lost && attempts > 0; attempts--) { - if (mDeviceEx) + if (removedDevice) + { + // Device removed, which may trigger on driver reinstallation, + // may cause a longer wait other reset attempts before the + // system is ready to handle creating a new device. + Sleep(800); + lost = !resetRemovedDevice(); + } + else if (mDeviceEx) { Sleep(500); // Give the graphics driver some CPU time - - if (removedDevice) - { - result = resetRemovedDevice(); - } - else - { - result = mDeviceEx->ResetEx(&presentParameters, NULL); - } + result = mDeviceEx->ResetEx(&presentParameters, NULL); + lost = testDeviceLost(false); } else { @@ -2160,10 +2163,8 @@ bool Renderer9::resetDevice() { result = mDevice->Reset(&presentParameters); } + lost = testDeviceLost(false); } - - lost = testDeviceLost(false); - attempts --; } if (FAILED(result)) @@ -2172,6 +2173,12 @@ bool Renderer9::resetDevice() return false; } + if (removedDevice && lost) + { + ERR("Device lost reset failed multiple times"); + return false; + } + // If the device was removed, we already finished re-initialization in resetRemovedDevice if (!removedDevice) { @@ -2184,15 +2191,38 @@ bool Renderer9::resetDevice() return true; } -HRESULT Renderer9::resetRemovedDevice() +bool Renderer9::isRemovedDeviceResettable() const +{ + bool success = false; + +#ifdef ANGLE_ENABLE_D3D9EX + IDirect3D9Ex *d3d9Ex = NULL; + typedef HRESULT (WINAPI *Direct3DCreate9ExFunc)(UINT, IDirect3D9Ex**); + Direct3DCreate9ExFunc Direct3DCreate9ExPtr = reinterpret_cast<Direct3DCreate9ExFunc>(GetProcAddress(mD3d9Module, "Direct3DCreate9Ex")); + + if (Direct3DCreate9ExPtr && SUCCEEDED(Direct3DCreate9ExPtr(D3D_SDK_VERSION, &d3d9Ex))) + { + D3DCAPS9 deviceCaps; + HRESULT result = d3d9Ex->GetDeviceCaps(mAdapter, mDeviceType, &deviceCaps); + success = SUCCEEDED(result); + } + + SafeRelease(d3d9Ex); +#else + ASSERT(UNREACHABLE()); +#endif + + return success; +} + +bool Renderer9::resetRemovedDevice() { // From http://msdn.microsoft.com/en-us/library/windows/desktop/bb172554(v=vs.85).aspx: // The hardware adapter has been removed. Application must destroy the device, do enumeration of // adapters and create another Direct3D device. If application continues rendering without // calling Reset, the rendering calls will succeed. Applies to Direct3D 9Ex only. - ASSERT(mDeviceEx != NULL); deinitialize(); - return (initialize() == EGL_SUCCESS ? S_OK : S_FALSE); + return (initialize() == EGL_SUCCESS); } DWORD Renderer9::getAdapterVendor() const diff --git a/src/libGLESv2/renderer/Renderer9.h b/src/libGLESv2/renderer/Renderer9.h index 65e8d73d..1fac9b7f 100644 --- a/src/libGLESv2/renderer/Renderer9.h +++ b/src/libGLESv2/renderer/Renderer9.h @@ -221,7 +221,8 @@ class Renderer9 : public Renderer void releaseDeviceResources(); HRESULT getDeviceStatusCode(); - HRESULT resetRemovedDevice(); + bool isRemovedDeviceResettable() const; + bool resetRemovedDevice(); UINT mAdapter; D3DDEVTYPE mDeviceType; diff --git a/src/libGLESv2/renderer/SwapChain9.cpp b/src/libGLESv2/renderer/SwapChain9.cpp index 757ce1cb..7b9b32b4 100644 --- a/src/libGLESv2/renderer/SwapChain9.cpp +++ b/src/libGLESv2/renderer/SwapChain9.cpp @@ -312,6 +312,11 @@ EGLint SwapChain9::swapRect(EGLint x, EGLint y, EGLint width, EGLint height) device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP); device->SetFVF(D3DFVF_XYZRHW | D3DFVF_TEX1); + for (UINT streamIndex = 0; streamIndex < gl::MAX_VERTEX_ATTRIBS; streamIndex++) + { + device->SetStreamSourceFreq(streamIndex, 1); + } + D3DVIEWPORT9 viewport = {0, 0, mWidth, mHeight, 0.0f, 1.0f}; device->SetViewport(&viewport); |