diff options
28 files changed, 93 insertions, 9 deletions
diff --git a/content/common/gpu/client/command_buffer_proxy_impl.cc b/content/common/gpu/client/command_buffer_proxy_impl.cc index 36e6459..7eccd84 100644 --- a/content/common/gpu/client/command_buffer_proxy_impl.cc +++ b/content/common/gpu/client/command_buffer_proxy_impl.cc @@ -446,6 +446,10 @@ void CommandBufferProxyImpl::SetLock(base::Lock* lock) { lock_ = lock; } +bool CommandBufferProxyImpl::IsGpuChannelLost() { + return !channel_ || channel_->IsLost(); +} + uint32 CommandBufferProxyImpl::InsertSyncPoint() { CheckLock(); if (last_state_.error != gpu::error::kNoError) diff --git a/content/common/gpu/client/command_buffer_proxy_impl.h b/content/common/gpu/client/command_buffer_proxy_impl.h index cf73174..f418a5b 100644 --- a/content/common/gpu/client/command_buffer_proxy_impl.h +++ b/content/common/gpu/client/command_buffer_proxy_impl.h @@ -118,6 +118,7 @@ class CommandBufferProxyImpl void SetSurfaceVisible(bool visible) override; uint32 CreateStreamTexture(uint32 texture_id) override; void SetLock(base::Lock* lock) override; + bool IsGpuChannelLost() override; int GetRouteID() const; bool ProduceFrontBuffer(const gpu::Mailbox& mailbox); diff --git a/content/common/gpu/client/gl_helper_scaling.cc b/content/common/gpu/client/gl_helper_scaling.cc index b248d9d..7b7338d 100644 --- a/content/common/gpu/client/gl_helper_scaling.cc +++ b/content/common/gpu/client/gl_helper_scaling.cc @@ -870,15 +870,8 @@ void ShaderProgram::Setup(const GLchar* vertex_shader_text, // The only reason fetching these attribute locations should fail is // if the context was spontaneously lost (i.e., because the GPU // process crashed, perhaps deliberately for testing). - // Unfortunately, the only way to reliably detect context loss from - // GLES2Interface would be to repeatedly call GetError(), and this - // seems fragile. Most of the APIs in GLHelper should be updated to - // be able to return an error. Fortunately, many users of this code - // check for context loss at a higher level. - if (!Initialized()) { - LOG(ERROR) << "ShaderProgram::Setup: initialization failed (context lost?)"; - } - return; + DCHECK_IMPLIES(!Initialized(), + gl_->GetGraphicsResetStatusKHR() != GL_NO_ERROR); } void ShaderProgram::UseProgram(const gfx::Size& src_size, diff --git a/gpu/GLES2/gl2chromium_autogen.h b/gpu/GLES2/gl2chromium_autogen.h index 9dbe95d..391df10 100644 --- a/gpu/GLES2/gl2chromium_autogen.h +++ b/gpu/GLES2/gl2chromium_autogen.h @@ -330,6 +330,7 @@ #define glSwapInterval GLES2_GET_FUN(SwapInterval) #define glMatrixLoadfCHROMIUM GLES2_GET_FUN(MatrixLoadfCHROMIUM) #define glMatrixLoadIdentityCHROMIUM GLES2_GET_FUN(MatrixLoadIdentityCHROMIUM) +#define glGetGraphicsResetStatusKHR GLES2_GET_FUN(GetGraphicsResetStatusKHR) #define glBlendBarrierKHR GLES2_GET_FUN(BlendBarrierKHR) #endif // GPU_GLES2_GL2CHROMIUM_AUTOGEN_H_ diff --git a/gpu/command_buffer/build_gles2_cmd_buffer.py b/gpu/command_buffer/build_gles2_cmd_buffer.py index ab60f0d..af622ce 100755 --- a/gpu/command_buffer/build_gles2_cmd_buffer.py +++ b/gpu/command_buffer/build_gles2_cmd_buffer.py @@ -2699,6 +2699,12 @@ _FUNCTION_INFO = { 'gl_test_func': 'glGetFramebufferAttachmentParameterivEXT', 'result': ['SizedResult<GLint>'], }, + 'GetGraphicsResetStatusKHR': { + 'extension': True, + 'client_test': False, + 'gen_cmd': False, + 'trace_level': 1, + }, 'GetInteger64v': { 'type': 'GETn', 'result': ['SizedResult<GLint64>'], diff --git a/gpu/command_buffer/client/client_test_helper.h b/gpu/command_buffer/client/client_test_helper.h index 10dd75c..07234c7 100644 --- a/gpu/command_buffer/client/client_test_helper.h +++ b/gpu/command_buffer/client/client_test_helper.h @@ -111,6 +111,7 @@ class MockClientGpuControl : public GpuControl { MOCK_METHOD1(SetSurfaceVisible, void(bool visible)); MOCK_METHOD1(CreateStreamTexture, uint32(uint32)); MOCK_METHOD1(SetLock, void(base::Lock*)); + MOCK_METHOD0(IsGpuChannelLost, bool()); private: DISALLOW_COPY_AND_ASSIGN(MockClientGpuControl); diff --git a/gpu/command_buffer/client/gles2_c_lib_autogen.h b/gpu/command_buffer/client/gles2_c_lib_autogen.h index 7eb7a0e..591df8a 100644 --- a/gpu/command_buffer/client/gles2_c_lib_autogen.h +++ b/gpu/command_buffer/client/gles2_c_lib_autogen.h @@ -1393,6 +1393,9 @@ void GLES2MatrixLoadfCHROMIUM(GLenum matrixMode, const GLfloat* m) { void GLES2MatrixLoadIdentityCHROMIUM(GLenum matrixMode) { gles2::GetGLContext()->MatrixLoadIdentityCHROMIUM(matrixMode); } +GLenum GLES2GetGraphicsResetStatusKHR() { + return gles2::GetGLContext()->GetGraphicsResetStatusKHR(); +} void GLES2BlendBarrierKHR() { gles2::GetGLContext()->BlendBarrierKHR(); } @@ -2620,6 +2623,10 @@ extern const NameToFunc g_gles2_function_table[] = { reinterpret_cast<GLES2FunctionPointer>(glMatrixLoadIdentityCHROMIUM), }, { + "glGetGraphicsResetStatusKHR", + reinterpret_cast<GLES2FunctionPointer>(glGetGraphicsResetStatusKHR), + }, + { "glBlendBarrierKHR", reinterpret_cast<GLES2FunctionPointer>(glBlendBarrierKHR), }, diff --git a/gpu/command_buffer/client/gles2_implementation.cc b/gpu/command_buffer/client/gles2_implementation.cc index e859299..8f75e7f 100644 --- a/gpu/command_buffer/client/gles2_implementation.cc +++ b/gpu/command_buffer/client/gles2_implementation.cc @@ -4103,6 +4103,21 @@ void GLES2Implementation::GetVertexAttribIuiv( CheckGLError(); } +GLenum GLES2Implementation::GetGraphicsResetStatusKHR() { + GPU_CLIENT_SINGLE_THREAD_CHECK(); + GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glGetGraphicsResetStatusKHR()"); + // If we can't make command buffers then the context is lost. + if (gpu_control_->IsGpuChannelLost()) + return GL_UNKNOWN_CONTEXT_RESET_KHR; + // Otherwise, check the command buffer if it is lost. + if (helper_->IsContextLost()) { + // TODO(danakj): We could GetLastState() off the CommandBuffer and return + // the actual reason here if we cared to. + return GL_UNKNOWN_CONTEXT_RESET_KHR; + } + return GL_NO_ERROR; +} + void GLES2Implementation::Swap() { SwapBuffers(); } diff --git a/gpu/command_buffer/client/gles2_implementation_autogen.h b/gpu/command_buffer/client/gles2_implementation_autogen.h index b89f8d6..b4b9e98 100644 --- a/gpu/command_buffer/client/gles2_implementation_autogen.h +++ b/gpu/command_buffer/client/gles2_implementation_autogen.h @@ -1041,6 +1041,8 @@ void MatrixLoadfCHROMIUM(GLenum matrixMode, const GLfloat* m) override; void MatrixLoadIdentityCHROMIUM(GLenum matrixMode) override; +GLenum GetGraphicsResetStatusKHR() override; + void BlendBarrierKHR() override; #endif // GPU_COMMAND_BUFFER_CLIENT_GLES2_IMPLEMENTATION_AUTOGEN_H_ diff --git a/gpu/command_buffer/client/gles2_interface_autogen.h b/gpu/command_buffer/client/gles2_interface_autogen.h index 6b30a53..ae93c08 100644 --- a/gpu/command_buffer/client/gles2_interface_autogen.h +++ b/gpu/command_buffer/client/gles2_interface_autogen.h @@ -769,5 +769,6 @@ virtual void ScheduleOverlayPlaneCHROMIUM(GLint plane_z_order, virtual void SwapInterval(GLint interval) = 0; virtual void MatrixLoadfCHROMIUM(GLenum matrixMode, const GLfloat* m) = 0; virtual void MatrixLoadIdentityCHROMIUM(GLenum matrixMode) = 0; +virtual GLenum GetGraphicsResetStatusKHR() = 0; virtual void BlendBarrierKHR() = 0; #endif // GPU_COMMAND_BUFFER_CLIENT_GLES2_INTERFACE_AUTOGEN_H_ diff --git a/gpu/command_buffer/client/gles2_interface_stub_autogen.h b/gpu/command_buffer/client/gles2_interface_stub_autogen.h index 3471376..290bc28 100644 --- a/gpu/command_buffer/client/gles2_interface_stub_autogen.h +++ b/gpu/command_buffer/client/gles2_interface_stub_autogen.h @@ -749,5 +749,6 @@ void ScheduleOverlayPlaneCHROMIUM(GLint plane_z_order, void SwapInterval(GLint interval) override; void MatrixLoadfCHROMIUM(GLenum matrixMode, const GLfloat* m) override; void MatrixLoadIdentityCHROMIUM(GLenum matrixMode) override; +GLenum GetGraphicsResetStatusKHR() override; void BlendBarrierKHR() override; #endif // GPU_COMMAND_BUFFER_CLIENT_GLES2_INTERFACE_STUB_AUTOGEN_H_ diff --git a/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h b/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h index 1a462d7..aa07a67 100644 --- a/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h +++ b/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h @@ -1274,6 +1274,9 @@ void GLES2InterfaceStub::MatrixLoadfCHROMIUM(GLenum /* matrixMode */, } void GLES2InterfaceStub::MatrixLoadIdentityCHROMIUM(GLenum /* matrixMode */) { } +GLenum GLES2InterfaceStub::GetGraphicsResetStatusKHR() { + return 0; +} void GLES2InterfaceStub::BlendBarrierKHR() { } #endif // GPU_COMMAND_BUFFER_CLIENT_GLES2_INTERFACE_STUB_IMPL_AUTOGEN_H_ diff --git a/gpu/command_buffer/client/gles2_trace_implementation_autogen.h b/gpu/command_buffer/client/gles2_trace_implementation_autogen.h index d5f0ed9..b017be2 100644 --- a/gpu/command_buffer/client/gles2_trace_implementation_autogen.h +++ b/gpu/command_buffer/client/gles2_trace_implementation_autogen.h @@ -749,5 +749,6 @@ void ScheduleOverlayPlaneCHROMIUM(GLint plane_z_order, void SwapInterval(GLint interval) override; void MatrixLoadfCHROMIUM(GLenum matrixMode, const GLfloat* m) override; void MatrixLoadIdentityCHROMIUM(GLenum matrixMode) override; +GLenum GetGraphicsResetStatusKHR() override; void BlendBarrierKHR() override; #endif // GPU_COMMAND_BUFFER_CLIENT_GLES2_TRACE_IMPLEMENTATION_AUTOGEN_H_ diff --git a/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h b/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h index be4a030..34b0743 100644 --- a/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h +++ b/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h @@ -2181,6 +2181,11 @@ void GLES2TraceImplementation::MatrixLoadIdentityCHROMIUM(GLenum matrixMode) { gl_->MatrixLoadIdentityCHROMIUM(matrixMode); } +GLenum GLES2TraceImplementation::GetGraphicsResetStatusKHR() { + TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::GetGraphicsResetStatusKHR"); + return gl_->GetGraphicsResetStatusKHR(); +} + void GLES2TraceImplementation::BlendBarrierKHR() { TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::BlendBarrierKHR"); gl_->BlendBarrierKHR(); diff --git a/gpu/command_buffer/client/gpu_control.h b/gpu/command_buffer/client/gpu_control.h index 2b303b3..75bd082 100644 --- a/gpu/command_buffer/client/gpu_control.h +++ b/gpu/command_buffer/client/gpu_control.h @@ -85,6 +85,10 @@ class GPU_EXPORT GpuControl { // may not be supported with all implementations. virtual void SetLock(base::Lock*) = 0; + // Returns true if the channel to the Gpu is lost. When true, all contexts + // should be considered as lost. + virtual bool IsGpuChannelLost() = 0; + private: DISALLOW_COPY_AND_ASSIGN(GpuControl); }; diff --git a/gpu/command_buffer/cmd_buffer_functions.txt b/gpu/command_buffer/cmd_buffer_functions.txt index f154161..3613d8a 100644 --- a/gpu/command_buffer/cmd_buffer_functions.txt +++ b/gpu/command_buffer/cmd_buffer_functions.txt @@ -313,5 +313,8 @@ GL_APICALL void GL_APIENTRY glSwapInterval (GLint interval); GL_APICALL void GL_APIENTRY glMatrixLoadfCHROMIUM (GLenumMatrixMode matrixMode, const GLfloat* m); GL_APICALL void GL_APIENTRY glMatrixLoadIdentityCHROMIUM (GLenumMatrixMode matrixMode); +// Extension KHR_robustness +GL_APICALL GLenum GL_APIENTRY glGetGraphicsResetStatusKHR (void); + // Extension KHR_blend_equation_advanced GL_APICALL void GL_APIENTRY glBlendBarrierKHR (void); diff --git a/gpu/command_buffer/service/in_process_command_buffer.cc b/gpu/command_buffer/service/in_process_command_buffer.cc index 5b325ab..5140da6 100644 --- a/gpu/command_buffer/service/in_process_command_buffer.cc +++ b/gpu/command_buffer/service/in_process_command_buffer.cc @@ -912,6 +912,12 @@ uint32 InProcessCommandBuffer::CreateStreamTexture(uint32 texture_id) { void InProcessCommandBuffer::SetLock(base::Lock*) { } +bool InProcessCommandBuffer::IsGpuChannelLost() { + // There is no such channel to lose for in-process contexts. This only + // makes sense for out-of-process command buffers. + return false; +} + uint32 InProcessCommandBuffer::CreateStreamTextureOnGpuThread( uint32 client_texture_id) { #if defined(OS_ANDROID) diff --git a/gpu/command_buffer/service/in_process_command_buffer.h b/gpu/command_buffer/service/in_process_command_buffer.h index b3f6eb8..c6c4f2c 100644 --- a/gpu/command_buffer/service/in_process_command_buffer.h +++ b/gpu/command_buffer/service/in_process_command_buffer.h @@ -121,6 +121,7 @@ class GPU_EXPORT InProcessCommandBuffer : public CommandBuffer, void SetSurfaceVisible(bool visible) override; uint32 CreateStreamTexture(uint32 texture_id) override; void SetLock(base::Lock*) override; + bool IsGpuChannelLost() override; // The serializer interface to the GPU service (i.e. thread). class Service { diff --git a/gpu/command_buffer/tests/gl_manager.cc b/gpu/command_buffer/tests/gl_manager.cc index d527203..10136c0 100644 --- a/gpu/command_buffer/tests/gl_manager.cc +++ b/gpu/command_buffer/tests/gl_manager.cc @@ -516,4 +516,9 @@ void GLManager::SetLock(base::Lock*) { NOTIMPLEMENTED(); } +bool GLManager::IsGpuChannelLost() { + NOTIMPLEMENTED(); + return false; +} + } // namespace gpu diff --git a/gpu/command_buffer/tests/gl_manager.h b/gpu/command_buffer/tests/gl_manager.h index c163ac0..e06387e 100644 --- a/gpu/command_buffer/tests/gl_manager.h +++ b/gpu/command_buffer/tests/gl_manager.h @@ -120,6 +120,7 @@ class GLManager : private GpuControl { void SetSurfaceVisible(bool visible) override; uint32 CreateStreamTexture(uint32 texture_id) override; void SetLock(base::Lock*) override; + bool IsGpuChannelLost() override; private: void PumpCommands(); diff --git a/gpu/gles2_conform_support/egl/display.cc b/gpu/gles2_conform_support/egl/display.cc index bd17250..d65e589 100644 --- a/gpu/gles2_conform_support/egl/display.cc +++ b/gpu/gles2_conform_support/egl/display.cc @@ -339,4 +339,9 @@ void Display::SetLock(base::Lock*) { NOTIMPLEMENTED(); } +bool Display::IsGpuChannelLost() { + NOTIMPLEMENTED(); + return false; +} + } // namespace egl diff --git a/gpu/gles2_conform_support/egl/display.h b/gpu/gles2_conform_support/egl/display.h index 9b349bd..0566da6 100644 --- a/gpu/gles2_conform_support/egl/display.h +++ b/gpu/gles2_conform_support/egl/display.h @@ -93,6 +93,7 @@ class Display : private gpu::GpuControl { void SetSurfaceVisible(bool visible) override; uint32 CreateStreamTexture(uint32 texture_id) override; void SetLock(base::Lock*) override; + bool IsGpuChannelLost() override; private: EGLNativeDisplayType display_id_; diff --git a/mojo/gles2/command_buffer_client_impl.cc b/mojo/gles2/command_buffer_client_impl.cc index 6933679..97ea89a 100644 --- a/mojo/gles2/command_buffer_client_impl.cc +++ b/mojo/gles2/command_buffer_client_impl.cc @@ -335,4 +335,9 @@ void CommandBufferClientImpl::MakeProgressAndUpdateState() { void CommandBufferClientImpl::SetLock(base::Lock* lock) { } +bool CommandBufferClientImpl::IsGpuChannelLost() { + // This is only possible for out-of-process command buffers. + return false; +} + } // namespace gles2 diff --git a/mojo/gles2/command_buffer_client_impl.h b/mojo/gles2/command_buffer_client_impl.h index 75bcc26..16eb7b8 100644 --- a/mojo/gles2/command_buffer_client_impl.h +++ b/mojo/gles2/command_buffer_client_impl.h @@ -72,6 +72,7 @@ class CommandBufferClientImpl : public mojo::CommandBufferLostContextObserver, void SetSurfaceVisible(bool visible) override; uint32 CreateStreamTexture(uint32 texture_id) override; void SetLock(base::Lock*) override; + bool IsGpuChannelLost() override; private: class SyncClientImpl; diff --git a/mojo/gpu/mojo_gles2_impl_autogen.cc b/mojo/gpu/mojo_gles2_impl_autogen.cc index 2ffcbf1..f3d0131 100644 --- a/mojo/gpu/mojo_gles2_impl_autogen.cc +++ b/mojo/gpu/mojo_gles2_impl_autogen.cc @@ -1615,6 +1615,10 @@ void MojoGLES2Impl::MatrixLoadfCHROMIUM(GLenum matrixMode, const GLfloat* m) { void MojoGLES2Impl::MatrixLoadIdentityCHROMIUM(GLenum matrixMode) { NOTREACHED() << "Unimplemented MatrixLoadIdentityCHROMIUM."; } +GLenum MojoGLES2Impl::GetGraphicsResetStatusKHR() { + NOTREACHED() << "Unimplemented GetGraphicsResetStatusKHR."; + return 0; +} void MojoGLES2Impl::BlendBarrierKHR() { NOTREACHED() << "Unimplemented BlendBarrierKHR."; } diff --git a/mojo/gpu/mojo_gles2_impl_autogen.h b/mojo/gpu/mojo_gles2_impl_autogen.h index 8b242d7..a6746d0 100644 --- a/mojo/gpu/mojo_gles2_impl_autogen.h +++ b/mojo/gpu/mojo_gles2_impl_autogen.h @@ -774,6 +774,7 @@ class MojoGLES2Impl : public gpu::gles2::GLES2Interface { void SwapInterval(GLint interval) override; void MatrixLoadfCHROMIUM(GLenum matrixMode, const GLfloat* m) override; void MatrixLoadIdentityCHROMIUM(GLenum matrixMode) override; + GLenum GetGraphicsResetStatusKHR() override; void BlendBarrierKHR() override; private: diff --git a/ppapi/proxy/ppapi_command_buffer_proxy.cc b/ppapi/proxy/ppapi_command_buffer_proxy.cc index 73f6dfc..384df02 100644 --- a/ppapi/proxy/ppapi_command_buffer_proxy.cc +++ b/ppapi/proxy/ppapi_command_buffer_proxy.cc @@ -162,6 +162,11 @@ void PpapiCommandBufferProxy::SetLock(base::Lock*) { NOTIMPLEMENTED(); } +bool PpapiCommandBufferProxy::IsGpuChannelLost() { + NOTIMPLEMENTED(); + return false; +} + uint32 PpapiCommandBufferProxy::InsertSyncPoint() { uint32 sync_point = 0; if (last_state_.error == gpu::error::kNoError) { diff --git a/ppapi/proxy/ppapi_command_buffer_proxy.h b/ppapi/proxy/ppapi_command_buffer_proxy.h index 62f77a4..24ed177 100644 --- a/ppapi/proxy/ppapi_command_buffer_proxy.h +++ b/ppapi/proxy/ppapi_command_buffer_proxy.h @@ -66,6 +66,7 @@ class PPAPI_PROXY_EXPORT PpapiCommandBufferProxy : public gpu::CommandBuffer, void SetSurfaceVisible(bool visible) override; uint32 CreateStreamTexture(uint32 texture_id) override; void SetLock(base::Lock*) override; + bool IsGpuChannelLost() override; private: bool Send(IPC::Message* msg); |