OLD | NEW |
| (Empty) |
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. | |
4 | |
5 #include "mojo/services/gles2/command_buffer_impl.h" | |
6 | |
7 #include "base/bind.h" | |
8 #include "base/message_loop/message_loop.h" | |
9 #include "gpu/command_buffer/service/sync_point_manager.h" | |
10 #include "mojo/services/gles2/command_buffer_driver.h" | |
11 | |
12 namespace mojo { | |
13 namespace { | |
14 void DestroyDriver(scoped_ptr<CommandBufferDriver> driver) { | |
15 // Just let ~scoped_ptr run. | |
16 } | |
17 | |
18 void RunCallback(const Callback<void()>& callback) { | |
19 callback.Run(); | |
20 } | |
21 | |
22 class CommandBufferDriverClientImpl : public CommandBufferDriver::Client { | |
23 public: | |
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) {} | |
29 | |
30 private: | |
31 void DidDestroy() override { delete this; } | |
32 | |
33 void UpdateVSyncParameters(base::TimeTicks timebase, | |
34 base::TimeDelta interval) override { | |
35 control_task_runner_->PostTask( | |
36 FROM_HERE, base::Bind(&CommandBufferImpl::UpdateVSyncParameters, | |
37 command_buffer_, timebase, interval)); | |
38 } | |
39 | |
40 void LostContext(int32_t lost_reason) override { | |
41 control_task_runner_->PostTask( | |
42 FROM_HERE, base::Bind(&CommandBufferImpl::LostContext, command_buffer_, | |
43 lost_reason)); | |
44 } | |
45 | |
46 base::WeakPtr<CommandBufferImpl> command_buffer_; | |
47 scoped_refptr<base::SingleThreadTaskRunner> control_task_runner_; | |
48 }; | |
49 } | |
50 | |
51 CommandBufferImpl::CommandBufferImpl( | |
52 InterfaceRequest<CommandBuffer> request, | |
53 ViewportParameterListenerPtr listener, | |
54 scoped_refptr<base::SingleThreadTaskRunner> control_task_runner, | |
55 gpu::SyncPointManager* sync_point_manager, | |
56 scoped_ptr<CommandBufferDriver> driver) | |
57 : sync_point_manager_(sync_point_manager), | |
58 driver_task_runner_(base::MessageLoop::current()->task_runner()), | |
59 driver_(driver.Pass()), | |
60 viewport_parameter_listener_(listener.Pass()), | |
61 binding_(this), | |
62 weak_factory_(this) { | |
63 driver_->set_client(new CommandBufferDriverClientImpl( | |
64 weak_factory_.GetWeakPtr(), control_task_runner)); | |
65 | |
66 control_task_runner->PostTask( | |
67 FROM_HERE, base::Bind(&CommandBufferImpl::BindToRequest, | |
68 base::Unretained(this), base::Passed(&request))); | |
69 } | |
70 | |
71 CommandBufferImpl::~CommandBufferImpl() { | |
72 binding_.client()->DidDestroy(); | |
73 driver_task_runner_->PostTask( | |
74 FROM_HERE, base::Bind(&DestroyDriver, base::Passed(&driver_))); | |
75 } | |
76 | |
77 void CommandBufferImpl::Initialize( | |
78 CommandBufferSyncClientPtr sync_client, | |
79 CommandBufferSyncPointClientPtr sync_point_client, | |
80 ScopedSharedBufferHandle shared_state) { | |
81 sync_point_client_ = sync_point_client.Pass(); | |
82 driver_task_runner_->PostTask( | |
83 FROM_HERE, | |
84 base::Bind(&CommandBufferDriver::Initialize, | |
85 base::Unretained(driver_.get()), base::Passed(&sync_client), | |
86 base::Passed(&shared_state))); | |
87 } | |
88 | |
89 void CommandBufferImpl::SetGetBuffer(int32_t buffer) { | |
90 driver_task_runner_->PostTask( | |
91 FROM_HERE, base::Bind(&CommandBufferDriver::SetGetBuffer, | |
92 base::Unretained(driver_.get()), buffer)); | |
93 } | |
94 | |
95 void CommandBufferImpl::Flush(int32_t put_offset) { | |
96 driver_task_runner_->PostTask( | |
97 FROM_HERE, base::Bind(&CommandBufferDriver::Flush, | |
98 base::Unretained(driver_.get()), put_offset)); | |
99 } | |
100 | |
101 void CommandBufferImpl::MakeProgress(int32_t last_get_offset) { | |
102 driver_task_runner_->PostTask( | |
103 FROM_HERE, base::Bind(&CommandBufferDriver::MakeProgress, | |
104 base::Unretained(driver_.get()), last_get_offset)); | |
105 } | |
106 | |
107 void CommandBufferImpl::RegisterTransferBuffer( | |
108 int32_t id, | |
109 ScopedSharedBufferHandle transfer_buffer, | |
110 uint32_t size) { | |
111 driver_task_runner_->PostTask( | |
112 FROM_HERE, base::Bind(&CommandBufferDriver::RegisterTransferBuffer, | |
113 base::Unretained(driver_.get()), id, | |
114 base::Passed(&transfer_buffer), size)); | |
115 } | |
116 | |
117 void CommandBufferImpl::DestroyTransferBuffer(int32_t id) { | |
118 driver_task_runner_->PostTask( | |
119 FROM_HERE, base::Bind(&CommandBufferDriver::DestroyTransferBuffer, | |
120 base::Unretained(driver_.get()), id)); | |
121 } | |
122 | |
123 void CommandBufferImpl::InsertSyncPoint(bool retire) { | |
124 uint32_t sync_point = sync_point_manager_->GenerateSyncPoint(); | |
125 sync_point_client_->DidInsertSyncPoint(sync_point); | |
126 if (retire) { | |
127 driver_task_runner_->PostTask( | |
128 FROM_HERE, base::Bind(&gpu::SyncPointManager::RetireSyncPoint, | |
129 sync_point_manager_, sync_point)); | |
130 } | |
131 } | |
132 | |
133 void CommandBufferImpl::RetireSyncPoint(uint32_t sync_point) { | |
134 driver_task_runner_->PostTask( | |
135 FROM_HERE, base::Bind(&gpu::SyncPointManager::RetireSyncPoint, | |
136 sync_point_manager_, sync_point)); | |
137 } | |
138 | |
139 void CommandBufferImpl::Echo(const Callback<void()>& callback) { | |
140 driver_task_runner_->PostTaskAndReply(FROM_HERE, base::Bind(&base::DoNothing), | |
141 base::Bind(&RunCallback, callback)); | |
142 } | |
143 | |
144 void CommandBufferImpl::BindToRequest(InterfaceRequest<CommandBuffer> request) { | |
145 binding_.Bind(request.Pass()); | |
146 } | |
147 | |
148 void CommandBufferImpl::LostContext(int32_t reason) { | |
149 binding_.client()->LostContext(reason); | |
150 } | |
151 | |
152 void CommandBufferImpl::UpdateVSyncParameters(base::TimeTicks timebase, | |
153 base::TimeDelta interval) { | |
154 if (!viewport_parameter_listener_) | |
155 return; | |
156 viewport_parameter_listener_->OnVSyncParametersUpdated( | |
157 timebase.ToInternalValue(), interval.ToInternalValue()); | |
158 } | |
159 | |
160 } // namespace mojo | |
OLD | NEW |