| Index: mojo/services/gles2/command_buffer_impl.cc
|
| diff --git a/mojo/services/gles2/command_buffer_impl.cc b/mojo/services/gles2/command_buffer_impl.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..b89279f9ceeb98ee6ed6efa5fced3dd0058802da
|
| --- /dev/null
|
| +++ b/mojo/services/gles2/command_buffer_impl.cc
|
| @@ -0,0 +1,160 @@
|
| +// Copyright 2014 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 "mojo/services/gles2/command_buffer_impl.h"
|
| +
|
| +#include "base/bind.h"
|
| +#include "base/message_loop/message_loop.h"
|
| +#include "gpu/command_buffer/service/sync_point_manager.h"
|
| +#include "mojo/services/gles2/command_buffer_driver.h"
|
| +
|
| +namespace gles2 {
|
| +namespace {
|
| +void DestroyDriver(scoped_ptr<CommandBufferDriver> driver) {
|
| + // Just let ~scoped_ptr run.
|
| +}
|
| +
|
| +void RunCallback(const mojo::Callback<void()>& callback) {
|
| + callback.Run();
|
| +}
|
| +
|
| +class CommandBufferDriverClientImpl : public CommandBufferDriver::Client {
|
| + public:
|
| + CommandBufferDriverClientImpl(
|
| + base::WeakPtr<CommandBufferImpl> command_buffer,
|
| + scoped_refptr<base::SingleThreadTaskRunner> control_task_runner)
|
| + : command_buffer_(command_buffer),
|
| + control_task_runner_(control_task_runner) {}
|
| +
|
| + private:
|
| + void UpdateVSyncParameters(base::TimeTicks timebase,
|
| + base::TimeDelta interval) override {
|
| + control_task_runner_->PostTask(
|
| + FROM_HERE, base::Bind(&CommandBufferImpl::UpdateVSyncParameters,
|
| + command_buffer_, timebase, interval));
|
| + }
|
| +
|
| + void DidLoseContext() override {
|
| + control_task_runner_->PostTask(
|
| + FROM_HERE, base::Bind(&CommandBufferImpl::DidLoseContext,
|
| + command_buffer_));
|
| + }
|
| +
|
| + base::WeakPtr<CommandBufferImpl> command_buffer_;
|
| + scoped_refptr<base::SingleThreadTaskRunner> control_task_runner_;
|
| +};
|
| +}
|
| +
|
| +CommandBufferImpl::CommandBufferImpl(
|
| + mojo::InterfaceRequest<mojo::CommandBuffer> request,
|
| + mojo::ViewportParameterListenerPtr listener,
|
| + scoped_refptr<base::SingleThreadTaskRunner> control_task_runner,
|
| + gpu::SyncPointManager* sync_point_manager,
|
| + scoped_ptr<CommandBufferDriver> driver)
|
| + : sync_point_manager_(sync_point_manager),
|
| + driver_task_runner_(base::MessageLoop::current()->task_runner()),
|
| + driver_(driver.Pass()),
|
| + viewport_parameter_listener_(listener.Pass()),
|
| + binding_(this),
|
| + weak_factory_(this) {
|
| + driver_->set_client(make_scoped_ptr(new CommandBufferDriverClientImpl(
|
| + weak_factory_.GetWeakPtr(), control_task_runner)));
|
| +
|
| + control_task_runner->PostTask(
|
| + FROM_HERE, base::Bind(&CommandBufferImpl::BindToRequest,
|
| + base::Unretained(this), base::Passed(&request)));
|
| +}
|
| +
|
| +CommandBufferImpl::~CommandBufferImpl() {
|
| + driver_task_runner_->PostTask(
|
| + FROM_HERE, base::Bind(&DestroyDriver, base::Passed(&driver_)));
|
| +}
|
| +
|
| +void CommandBufferImpl::Initialize(
|
| + mojo::CommandBufferSyncClientPtr sync_client,
|
| + mojo::CommandBufferSyncPointClientPtr sync_point_client,
|
| + mojo::CommandBufferLostContextObserverPtr loss_observer,
|
| + mojo::ScopedSharedBufferHandle shared_state) {
|
| + sync_point_client_ = sync_point_client.Pass();
|
| + driver_task_runner_->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&CommandBufferDriver::Initialize,
|
| + base::Unretained(driver_.get()), base::Passed(&sync_client),
|
| + base::Passed(&loss_observer),
|
| + base::Passed(&shared_state)));
|
| +}
|
| +
|
| +void CommandBufferImpl::SetGetBuffer(int32_t buffer) {
|
| + driver_task_runner_->PostTask(
|
| + FROM_HERE, base::Bind(&CommandBufferDriver::SetGetBuffer,
|
| + base::Unretained(driver_.get()), buffer));
|
| +}
|
| +
|
| +void CommandBufferImpl::Flush(int32_t put_offset) {
|
| + driver_task_runner_->PostTask(
|
| + FROM_HERE, base::Bind(&CommandBufferDriver::Flush,
|
| + base::Unretained(driver_.get()), put_offset));
|
| +}
|
| +
|
| +void CommandBufferImpl::MakeProgress(int32_t last_get_offset) {
|
| + driver_task_runner_->PostTask(
|
| + FROM_HERE, base::Bind(&CommandBufferDriver::MakeProgress,
|
| + base::Unretained(driver_.get()), last_get_offset));
|
| +}
|
| +
|
| +void CommandBufferImpl::RegisterTransferBuffer(
|
| + int32_t id,
|
| + mojo::ScopedSharedBufferHandle transfer_buffer,
|
| + uint32_t size) {
|
| + driver_task_runner_->PostTask(
|
| + FROM_HERE, base::Bind(&CommandBufferDriver::RegisterTransferBuffer,
|
| + base::Unretained(driver_.get()), id,
|
| + base::Passed(&transfer_buffer), size));
|
| +}
|
| +
|
| +void CommandBufferImpl::DestroyTransferBuffer(int32_t id) {
|
| + driver_task_runner_->PostTask(
|
| + FROM_HERE, base::Bind(&CommandBufferDriver::DestroyTransferBuffer,
|
| + base::Unretained(driver_.get()), id));
|
| +}
|
| +
|
| +void CommandBufferImpl::InsertSyncPoint(bool retire) {
|
| + uint32_t sync_point = sync_point_manager_->GenerateSyncPoint();
|
| + sync_point_client_->DidInsertSyncPoint(sync_point);
|
| + if (retire) {
|
| + driver_task_runner_->PostTask(
|
| + FROM_HERE, base::Bind(&gpu::SyncPointManager::RetireSyncPoint,
|
| + sync_point_manager_, sync_point));
|
| + }
|
| +}
|
| +
|
| +void CommandBufferImpl::RetireSyncPoint(uint32_t sync_point) {
|
| + driver_task_runner_->PostTask(
|
| + FROM_HERE, base::Bind(&gpu::SyncPointManager::RetireSyncPoint,
|
| + sync_point_manager_, sync_point));
|
| +}
|
| +
|
| +void CommandBufferImpl::Echo(const mojo::Callback<void()>& callback) {
|
| + driver_task_runner_->PostTaskAndReply(FROM_HERE, base::Bind(&base::DoNothing),
|
| + base::Bind(&RunCallback, callback));
|
| +}
|
| +
|
| +void CommandBufferImpl::BindToRequest(
|
| + mojo::InterfaceRequest<mojo::CommandBuffer> request) {
|
| + binding_.Bind(request.Pass());
|
| +}
|
| +
|
| +void CommandBufferImpl::DidLoseContext() {
|
| + binding_.OnConnectionError();
|
| +}
|
| +
|
| +void CommandBufferImpl::UpdateVSyncParameters(base::TimeTicks timebase,
|
| + base::TimeDelta interval) {
|
| + if (!viewport_parameter_listener_)
|
| + return;
|
| + viewport_parameter_listener_->OnVSyncParametersUpdated(
|
| + timebase.ToInternalValue(), interval.ToInternalValue());
|
| +}
|
| +
|
| +} // namespace gles2
|
|
|