diff options
Diffstat (limited to 'gpu/command_buffer/service')
-rw-r--r-- | gpu/command_buffer/service/gpu_processor.h | 2 | ||||
-rw-r--r-- | gpu/command_buffer/service/gpu_processor_mac.cc | 12 |
2 files changed, 14 insertions, 0 deletions
diff --git a/gpu/command_buffer/service/gpu_processor.h b/gpu/command_buffer/service/gpu_processor.h index 9d30f980..a143bad 100644 --- a/gpu/command_buffer/service/gpu_processor.h +++ b/gpu/command_buffer/service/gpu_processor.h @@ -97,6 +97,8 @@ class GPUProcessor : public CommandBufferEngine { uint64 swap_buffers_count() const; void set_acknowledged_swap_buffers_count( uint64 acknowledged_swap_buffers_count); + + void DidDestroySurface(); #endif // Sets a callback that is called when a glResizeCHROMIUM command diff --git a/gpu/command_buffer/service/gpu_processor_mac.cc b/gpu/command_buffer/service/gpu_processor_mac.cc index 63a894d..4d9ba18 100644 --- a/gpu/command_buffer/service/gpu_processor_mac.cc +++ b/gpu/command_buffer/service/gpu_processor_mac.cc @@ -108,6 +108,18 @@ void GPUProcessor::set_acknowledged_swap_buffers_count( acknowledged_swap_buffers_count_ = acknowledged_swap_buffers_count; } +void GPUProcessor::DidDestroySurface() { + // When a browser window with a GPUProcessor is closed, the render process + // will attempt to finish all GL commands, it will busy-wait on the GPU + // process until the command queue is empty. If a paint is pending, the GPU + // process won't process any GL commands until the browser sends a paint ack, + // but since the browser window is already closed, it will never arrive. + // To break this infinite loop, the browser tells the GPU process that the + // surface became invalid, which causes the GPU process to not wait for paint + // acks. + surface_.reset(); +} + void GPUProcessor::WillSwapBuffers() { DCHECK(decoder_.get()); DCHECK(decoder_->GetGLContext()); |