blob: 00f07a93761609952d556f011e5479bf402c7639 [file] [log] [blame]
// 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