| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/aura/gpu_process_transport_factory.h" | 5 #include "content/browser/aura/gpu_process_transport_factory.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 400 // loss for this context through the lost context callback. If the context | 400 // loss for this context through the lost context callback. If the context |
| 401 // is lost, we want to leave this ContextProvider available until the lost | 401 // is lost, we want to leave this ContextProvider available until the lost |
| 402 // context notification is sent to the ImageTransportFactoryObserver clients. | 402 // context notification is sent to the ImageTransportFactoryObserver clients. |
| 403 if (offscreen_compositor_contexts_.get()) | 403 if (offscreen_compositor_contexts_.get()) |
| 404 return offscreen_compositor_contexts_; | 404 return offscreen_compositor_contexts_; |
| 405 | 405 |
| 406 offscreen_compositor_contexts_ = ContextProviderCommandBuffer::Create( | 406 offscreen_compositor_contexts_ = ContextProviderCommandBuffer::Create( |
| 407 GpuProcessTransportFactory::CreateOffscreenCommandBufferContext(), | 407 GpuProcessTransportFactory::CreateOffscreenCommandBufferContext(), |
| 408 "Compositor-Offscreen"); | 408 "Compositor-Offscreen"); |
| 409 | 409 |
| 410 if (!offscreen_compositor_contexts_.get()) | |
| 411 return NULL; | |
| 412 | |
| 413 if (!ui::Compositor::WasInitializedWithThread()) { | |
| 414 offscreen_compositor_contexts_->SetLostContextCallback(base::Bind( | |
| 415 &GpuProcessTransportFactory:: | |
| 416 OnLostMainThreadSharedContextInsideCallback, | |
| 417 callback_factory_.GetWeakPtr())); | |
| 418 } | |
| 419 | |
| 420 return offscreen_compositor_contexts_; | 410 return offscreen_compositor_contexts_; |
| 421 } | 411 } |
| 422 | 412 |
| 423 scoped_refptr<cc::ContextProvider> | 413 scoped_refptr<cc::ContextProvider> |
| 424 GpuProcessTransportFactory::SharedMainThreadContextProvider() { | 414 GpuProcessTransportFactory::SharedMainThreadContextProvider() { |
| 425 if (shared_main_thread_contexts_.get()) | 415 if (shared_main_thread_contexts_.get()) |
| 426 return shared_main_thread_contexts_; | 416 return shared_main_thread_contexts_; |
| 427 | 417 |
| 428 if (ui::Compositor::WasInitializedWithThread()) { | 418 if (ui::Compositor::WasInitializedWithThread()) { |
| 429 // In threaded compositing mode, we have to create our own context for the | 419 // In threaded compositing mode, we have to create our own context for the |
| 430 // main thread since the compositor's context will be bound to the | 420 // main thread since the compositor's context will be bound to the |
| 431 // compositor thread. | 421 // compositor thread. |
| 432 shared_main_thread_contexts_ = ContextProviderCommandBuffer::Create( | 422 shared_main_thread_contexts_ = ContextProviderCommandBuffer::Create( |
| 433 GpuProcessTransportFactory::CreateOffscreenCommandBufferContext(), | 423 GpuProcessTransportFactory::CreateOffscreenCommandBufferContext(), |
| 434 "Offscreen-MainThread"); | 424 "Offscreen-MainThread"); |
| 435 } else { | 425 } else { |
| 436 // In single threaded compositing mode, we can just reuse the compositor's | 426 // In single threaded compositing mode, we can just reuse the compositor's |
| 437 // shared context. | 427 // shared context. |
| 438 shared_main_thread_contexts_ = | 428 shared_main_thread_contexts_ = |
| 439 static_cast<ContextProviderCommandBuffer*>( | 429 static_cast<ContextProviderCommandBuffer*>( |
| 440 OffscreenCompositorContextProvider().get()); | 430 OffscreenCompositorContextProvider().get()); |
| 441 } | 431 } |
| 442 | 432 |
| 443 if (shared_main_thread_contexts_ && | 433 if (shared_main_thread_contexts_) { |
| 444 !shared_main_thread_contexts_->BindToCurrentThread()) | 434 shared_main_thread_contexts_->SetLostContextCallback( |
| 445 shared_main_thread_contexts_ = NULL; | 435 base::Bind(&GpuProcessTransportFactory:: |
| 436 OnLostMainThreadSharedContextInsideCallback, |
| 437 callback_factory_.GetWeakPtr())); |
| 438 if (!shared_main_thread_contexts_->BindToCurrentThread()) |
| 439 shared_main_thread_contexts_ = NULL; |
| 440 } |
| 446 return shared_main_thread_contexts_; | 441 return shared_main_thread_contexts_; |
| 447 } | 442 } |
| 448 | 443 |
| 449 void GpuProcessTransportFactory::OnLostContext(ui::Compositor* compositor) { | 444 void GpuProcessTransportFactory::OnLostContext(ui::Compositor* compositor) { |
| 450 LOG(ERROR) << "Lost UI compositor context."; | 445 LOG(ERROR) << "Lost UI compositor context."; |
| 451 PerCompositorData* data = per_compositor_data_[compositor]; | 446 PerCompositorData* data = per_compositor_data_[compositor]; |
| 452 DCHECK(data); | 447 DCHECK(data); |
| 453 | 448 |
| 454 // Prevent callbacks from other contexts in the same share group from | 449 // Prevent callbacks from other contexts in the same share group from |
| 455 // calling us again. | 450 // calling us again. |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 536 observer_list_, | 531 observer_list_, |
| 537 OnLostResources()); | 532 OnLostResources()); |
| 538 | 533 |
| 539 // Kill things that use the shared context before killing the shared context. | 534 // Kill things that use the shared context before killing the shared context. |
| 540 lost_gl_helper.reset(); | 535 lost_gl_helper.reset(); |
| 541 lost_offscreen_compositor_contexts = NULL; | 536 lost_offscreen_compositor_contexts = NULL; |
| 542 lost_shared_main_thread_contexts = NULL; | 537 lost_shared_main_thread_contexts = NULL; |
| 543 } | 538 } |
| 544 | 539 |
| 545 } // namespace content | 540 } // namespace content |
| OLD | NEW |