1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "components/gles2/command_buffer_impl.h"
8 #include "base/message_loop/message_loop.h"
9 #include "components/gles2/command_buffer_driver.h"
10 #include "gpu/command_buffer/service/sync_point_manager.h"
14 void DestroyDriver(scoped_ptr
<CommandBufferDriver
> driver
) {
15 // Just let ~scoped_ptr run.
18 void RunCallback(const mojo::Callback
<void()>& callback
) {
22 class CommandBufferDriverClientImpl
: public CommandBufferDriver::Client
{
24 CommandBufferDriverClientImpl(
25 base::WeakPtr
<CommandBufferImpl
> command_buffer
,
26 scoped_refptr
<base::SingleThreadTaskRunner
> control_task_runner
)
27 : command_buffer_(command_buffer
),
28 control_task_runner_(control_task_runner
) {}
31 void UpdateVSyncParameters(base::TimeTicks timebase
,
32 base::TimeDelta interval
) override
{
33 control_task_runner_
->PostTask(
34 FROM_HERE
, base::Bind(&CommandBufferImpl::UpdateVSyncParameters
,
35 command_buffer_
, timebase
, interval
));
38 void DidLoseContext() override
{
39 control_task_runner_
->PostTask(
40 FROM_HERE
, base::Bind(&CommandBufferImpl::DidLoseContext
,
44 base::WeakPtr
<CommandBufferImpl
> command_buffer_
;
45 scoped_refptr
<base::SingleThreadTaskRunner
> control_task_runner_
;
49 CommandBufferImpl::CommandBufferImpl(
50 mojo::InterfaceRequest
<mojo::CommandBuffer
> request
,
51 mojo::ViewportParameterListenerPtr listener
,
52 scoped_refptr
<base::SingleThreadTaskRunner
> control_task_runner
,
53 gpu::SyncPointManager
* sync_point_manager
,
54 scoped_ptr
<CommandBufferDriver
> driver
)
55 : sync_point_manager_(sync_point_manager
),
56 driver_task_runner_(base::MessageLoop::current()->task_runner()),
57 driver_(driver
.Pass()),
58 viewport_parameter_listener_(listener
.Pass()),
61 driver_
->set_client(make_scoped_ptr(new CommandBufferDriverClientImpl(
62 weak_factory_
.GetWeakPtr(), control_task_runner
)));
64 control_task_runner
->PostTask(
65 FROM_HERE
, base::Bind(&CommandBufferImpl::BindToRequest
,
66 base::Unretained(this), base::Passed(&request
)));
69 CommandBufferImpl::~CommandBufferImpl() {
70 driver_task_runner_
->PostTask(
71 FROM_HERE
, base::Bind(&DestroyDriver
, base::Passed(&driver_
)));
74 void CommandBufferImpl::Initialize(
75 mojo::CommandBufferSyncClientPtr sync_client
,
76 mojo::CommandBufferSyncPointClientPtr sync_point_client
,
77 mojo::CommandBufferLostContextObserverPtr loss_observer
,
78 mojo::ScopedSharedBufferHandle shared_state
) {
79 sync_point_client_
= sync_point_client
.Pass();
80 driver_task_runner_
->PostTask(
82 base::Bind(&CommandBufferDriver::Initialize
,
83 base::Unretained(driver_
.get()), base::Passed(&sync_client
),
84 base::Passed(&loss_observer
),
85 base::Passed(&shared_state
)));
88 void CommandBufferImpl::SetGetBuffer(int32_t buffer
) {
89 driver_task_runner_
->PostTask(
90 FROM_HERE
, base::Bind(&CommandBufferDriver::SetGetBuffer
,
91 base::Unretained(driver_
.get()), buffer
));
94 void CommandBufferImpl::Flush(int32_t put_offset
) {
95 driver_task_runner_
->PostTask(
96 FROM_HERE
, base::Bind(&CommandBufferDriver::Flush
,
97 base::Unretained(driver_
.get()), put_offset
));
100 void CommandBufferImpl::MakeProgress(int32_t last_get_offset
) {
101 driver_task_runner_
->PostTask(
102 FROM_HERE
, base::Bind(&CommandBufferDriver::MakeProgress
,
103 base::Unretained(driver_
.get()), last_get_offset
));
106 void CommandBufferImpl::RegisterTransferBuffer(
108 mojo::ScopedSharedBufferHandle transfer_buffer
,
110 driver_task_runner_
->PostTask(
111 FROM_HERE
, base::Bind(&CommandBufferDriver::RegisterTransferBuffer
,
112 base::Unretained(driver_
.get()), id
,
113 base::Passed(&transfer_buffer
), size
));
116 void CommandBufferImpl::DestroyTransferBuffer(int32_t id
) {
117 driver_task_runner_
->PostTask(
118 FROM_HERE
, base::Bind(&CommandBufferDriver::DestroyTransferBuffer
,
119 base::Unretained(driver_
.get()), id
));
122 void CommandBufferImpl::InsertSyncPoint(bool retire
) {
123 uint32_t sync_point
= sync_point_manager_
->GenerateSyncPoint();
124 sync_point_client_
->DidInsertSyncPoint(sync_point
);
126 driver_task_runner_
->PostTask(
127 FROM_HERE
, base::Bind(&gpu::SyncPointManager::RetireSyncPoint
,
128 sync_point_manager_
, sync_point
));
132 void CommandBufferImpl::RetireSyncPoint(uint32_t sync_point
) {
133 driver_task_runner_
->PostTask(
134 FROM_HERE
, base::Bind(&gpu::SyncPointManager::RetireSyncPoint
,
135 sync_point_manager_
, sync_point
));
138 void CommandBufferImpl::Echo(const mojo::Callback
<void()>& callback
) {
139 driver_task_runner_
->PostTaskAndReply(FROM_HERE
, base::Bind(&base::DoNothing
),
140 base::Bind(&RunCallback
, callback
));
143 void CommandBufferImpl::BindToRequest(
144 mojo::InterfaceRequest
<mojo::CommandBuffer
> request
) {
145 binding_
.Bind(request
.Pass());
148 void CommandBufferImpl::DidLoseContext() {
149 binding_
.OnConnectionError();
152 void CommandBufferImpl::UpdateVSyncParameters(base::TimeTicks timebase
,
153 base::TimeDelta interval
) {
154 if (!viewport_parameter_listener_
)
156 viewport_parameter_listener_
->OnVSyncParametersUpdated(
157 timebase
.ToInternalValue(), interval
.ToInternalValue());