| // Copyright 2015 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "services/native_viewport/onscreen_context_provider.h" |
| |
| #include "services/gles2/command_buffer_driver.h" |
| #include "services/gles2/gpu_state.h" |
| |
| namespace native_viewport { |
| |
| OnscreenContextProvider::OnscreenContextProvider( |
| const scoped_refptr<gles2::GpuState>& state) |
| : requested_configuration_(gfx::SurfaceConfiguration()), |
| command_buffer_impl_(nullptr), |
| state_(state), |
| widget_(gfx::kNullAcceleratedWidget), |
| binding_(this) { |
| } |
| |
| OnscreenContextProvider::~OnscreenContextProvider() { |
| if (command_buffer_impl_) |
| command_buffer_impl_->set_observer(nullptr); |
| } |
| |
| void OnscreenContextProvider::Bind( |
| mojo::InterfaceRequest<mojo::ContextProvider> request) { |
| binding_.Bind(request.Pass()); |
| } |
| |
| void OnscreenContextProvider::SetAcceleratedWidget( |
| gfx::AcceleratedWidget widget) { |
| widget_ = widget; |
| |
| if (widget_ == gfx::kNullAcceleratedWidget) { |
| if (command_buffer_impl_) { |
| command_buffer_impl_->DidLoseContext(); |
| } |
| return; |
| } |
| |
| if (pending_create_callback_.is_null()) |
| return; |
| |
| CreateAndReturnCommandBuffer(); |
| } |
| |
| void OnscreenContextProvider::Create( |
| mojo::InterfaceHandle<mojo::ViewportParameterListener> |
| viewport_parameter_listener, |
| const CreateCallback& callback) { |
| if (!pending_create_callback_.is_null()) { |
| DCHECK(!command_buffer_impl_); |
| pending_create_callback_.Run(nullptr); |
| } |
| |
| pending_listener_ = mojo::ViewportParameterListenerPtr::Create( |
| std::move(viewport_parameter_listener)); |
| pending_create_callback_ = callback; |
| |
| if (widget_ != gfx::kNullAcceleratedWidget) |
| CreateAndReturnCommandBuffer(); |
| } |
| |
| void OnscreenContextProvider::OnCommandBufferImplDestroyed() { |
| DCHECK(command_buffer_impl_); |
| command_buffer_impl_ = nullptr; |
| } |
| |
| void OnscreenContextProvider::CreateAndReturnCommandBuffer() { |
| mojo::CommandBufferPtr cb; |
| command_buffer_impl_ = new gles2::CommandBufferImpl( |
| GetProxy(&cb), pending_listener_.Pass(), state_->control_task_runner(), |
| state_->sync_point_manager(), |
| make_scoped_ptr(new gles2::CommandBufferDriver( |
| widget_, state_->share_group(), state_->mailbox_manager(), |
| state_->sync_point_manager(), requested_configuration_))); |
| command_buffer_impl_->set_observer(this); |
| pending_create_callback_.Run(cb.Pass()); |
| pending_create_callback_.reset(); |
| } |
| |
| } // namespace mojo |