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 |