| Index: gpu/command_buffer/service/gles2_cmd_decoder.cc
|
| diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
|
| index 717c635c9b2e14ac9723740560c4160cb2cf5c6b..a14f72e11199ea51c4abdb21c359217f7eb4c6cc 100644
|
| --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
|
| +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
|
| @@ -685,6 +685,7 @@ class GLES2DecoderImpl : public GLES2Decoder,
|
| void SetAsyncPixelTransferManagerForTest(
|
| AsyncPixelTransferManager* manager) override;
|
| void SetIgnoreCachedStateForTest(bool ignore) override;
|
| + void SetAllowExit(bool allow_exit) override;
|
| void ProcessFinishedAsyncTransfers();
|
|
|
| bool GetServiceTextureId(uint32 client_texture_id,
|
| @@ -1997,6 +1998,8 @@ class GLES2DecoderImpl : public GLES2Decoder,
|
| GLuint validation_fbo_multisample_;
|
| GLuint validation_fbo_;
|
|
|
| + bool allow_exit_;
|
| +
|
| typedef gpu::gles2::GLES2Decoder::Error (GLES2DecoderImpl::*CmdHandler)(
|
| uint32 immediate_data_size,
|
| const void* data);
|
| @@ -2509,7 +2512,8 @@ GLES2DecoderImpl::GLES2DecoderImpl(ContextGroup* group)
|
| gpu_debug_commands_(false),
|
| validation_texture_(0),
|
| validation_fbo_multisample_(0),
|
| - validation_fbo_(0) {
|
| + validation_fbo_(0),
|
| + allow_exit_(false) {
|
| DCHECK(group);
|
|
|
| // The shader translator is used for WebGL even when running on EGL
|
| @@ -4494,6 +4498,10 @@ void GLES2DecoderImpl::SetIgnoreCachedStateForTest(bool ignore) {
|
| state_.SetIgnoreCachedStateForTest(ignore);
|
| }
|
|
|
| +void GLES2DecoderImpl::SetAllowExit(bool allow_exit) {
|
| + allow_exit_ = allow_exit;
|
| +}
|
| +
|
| void GLES2DecoderImpl::OnFboChanged() const {
|
| if (workarounds().restore_scissor_on_fbo_change)
|
| state_.fbo_binding_for_scissor_workaround_dirty = true;
|
| @@ -11326,11 +11334,10 @@ void GLES2DecoderImpl::MarkContextLost(error::ContextLostReason reason) {
|
| current_decoder_error_ = error::kLostContext;
|
| context_was_lost_ = true;
|
|
|
| - // Some D3D drivers cannot recover from device lost in the GPU process
|
| - // sandbox. Allow a new GPU process to launch.
|
| - if (workarounds().exit_on_context_lost) {
|
| - LOG(ERROR) << "Exiting GPU process because some drivers cannot reset"
|
| - << " a D3D device in the Chrome GPU process sandbox.";
|
| + // Work around issues with recovery by allowing a new GPU process to launch.
|
| + if (workarounds().exit_on_context_lost && allow_exit_) {
|
| + LOG(ERROR) << "Exiting GPU process because some drivers cannot recover"
|
| + << " from problems.";
|
| #if defined(OS_WIN)
|
| base::win::SetShouldCrashOnProcessDetach(false);
|
| #endif
|
|
|