diff options
author | apatrick@chromium.org <apatrick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-02-16 18:14:34 +0000 |
---|---|---|
committer | apatrick@chromium.org <apatrick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-02-16 18:14:34 +0000 |
commit | bde6bc5d302dba589b8e9a20dea48e98e25c47e3 (patch) | |
tree | 9a6635636d288e94c6ae50f486cd7f8737a32244 /ui/surface/accelerated_surface_transformer_win.cc | |
parent | e4a6eed6218d2e1c510507a07c54f3f305aaf9ee (diff) | |
download | chromium_src-bde6bc5d302dba589b8e9a20dea48e98e25c47e3.zip chromium_src-bde6bc5d302dba589b8e9a20dea48e98e25c47e3.tar.gz chromium_src-bde6bc5d302dba589b8e9a20dea48e98e25c47e3.tar.bz2 |
Windows: fix failure to recover from device lost in AcceleratedSurface.
When device lost is detected, null out or recreate all the resources and shaders used by the old device. They will not work on the new device. The old shaders created by the AcceleratedSurfaceTransformer need to be recreated. It should also recreate the shared texture and swap chain because they won't otherwise get recreated without window resizing and / or tab switching.
I moved the lock from AcceleratedPresenter to PresentThread so that one AcceratedPresenter can destroy resources of others that use the same D3D device without risking deadlock.
Check for device lost while polling the event query. Sometimes GetData does not seem to report the loss of the device.
Also, treat S_PRESENT_MODE_CHANGED as a lost device because sometimes CheckDeviceState returns that after a GPU hang.
I backed out the change to terminate the GPU process on any D3D errors in DoPresentAndAcknowledge. I don't think that was the real issue.
BUG=170767,170875
Review URL: https://chromiumcodereview.appspot.com/12252053
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@182984 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui/surface/accelerated_surface_transformer_win.cc')
-rw-r--r-- | ui/surface/accelerated_surface_transformer_win.cc | 44 |
1 files changed, 22 insertions, 22 deletions
diff --git a/ui/surface/accelerated_surface_transformer_win.cc b/ui/surface/accelerated_surface_transformer_win.cc index 30fd1af..834c5b8 100644 --- a/ui/surface/accelerated_surface_transformer_win.cc +++ b/ui/surface/accelerated_surface_transformer_win.cc @@ -181,35 +181,35 @@ bool AcceleratedSurfaceTransformer::DoInit(IDirect3DDevice9* device) { bool AcceleratedSurfaceTransformer::CompileShaderCombo( ShaderCombo shader) { - if (!vertex_shaders_[shader]) { - HRESULT hr = device_->CreateVertexShader( - reinterpret_cast<const DWORD*>(vertex_shader_sources_[shader]), - vertex_shaders_[shader].Receive()); + vertex_shaders_[shader] = NULL; - if (FAILED(hr)) - return false; + HRESULT hr = device_->CreateVertexShader( + reinterpret_cast<const DWORD*>(vertex_shader_sources_[shader]), + vertex_shaders_[shader].Receive()); + + if (FAILED(hr)) + return false; - for (int i = 0; i < NUM_SHADERS; ++i) { - if (vertex_shader_sources_[i] == vertex_shader_sources_[shader] && - i != shader) { - vertex_shaders_[i] = vertex_shaders_[shader]; - } + for (int i = 0; i < NUM_SHADERS; ++i) { + if (vertex_shader_sources_[i] == vertex_shader_sources_[shader] && + i != shader) { + vertex_shaders_[i] = vertex_shaders_[shader]; } } - if (!pixel_shaders_[shader]) { - HRESULT hr = device_->CreatePixelShader( - reinterpret_cast<const DWORD*>(pixel_shader_sources_[shader]), - pixel_shaders_[shader].Receive()); + pixel_shaders_[shader] = NULL; - if (FAILED(hr)) - return false; + hr = device_->CreatePixelShader( + reinterpret_cast<const DWORD*>(pixel_shader_sources_[shader]), + pixel_shaders_[shader].Receive()); + + if (FAILED(hr)) + return false; - for (int i = 0; i < NUM_SHADERS; ++i) { - if (pixel_shader_sources_[i] == pixel_shader_sources_[shader] && - i != shader) { - pixel_shaders_[i] = pixel_shaders_[shader]; - } + for (int i = 0; i < NUM_SHADERS; ++i) { + if (pixel_shader_sources_[i] == pixel_shader_sources_[shader] && + i != shader) { + pixel_shaders_[i] = pixel_shaders_[shader]; } } |