OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #if defined(ENABLE_GPU) | 5 #if defined(ENABLE_GPU) |
6 | 6 |
7 #include "content/common/gpu/image_transport_surface.h" | 7 #include "content/common/gpu/image_transport_surface.h" |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
11 #include "base/command_line.h" | 11 #include "base/command_line.h" |
12 #include "base/debug/trace_event.h" | 12 #include "base/debug/trace_event.h" |
13 #include "content/common/gpu/gpu_channel.h" | 13 #include "content/common/gpu/gpu_channel.h" |
14 #include "content/common/gpu/gpu_channel_manager.h" | 14 #include "content/common/gpu/gpu_channel_manager.h" |
15 #include "content/common/gpu/gpu_command_buffer_stub.h" | 15 #include "content/common/gpu/gpu_command_buffer_stub.h" |
16 #include "content/common/gpu/gpu_messages.h" | 16 #include "content/common/gpu/gpu_messages.h" |
17 #include "gpu/command_buffer/service/gpu_scheduler.h" | 17 #include "gpu/command_buffer/service/gpu_scheduler.h" |
18 #include "ui/gfx/gl/gl_switches.h" | 18 #include "ui/gfx/gl/gl_switches.h" |
19 | 19 |
20 ImageTransportSurface::ImageTransportSurface() { | 20 ImageTransportSurface::ImageTransportSurface() {} |
21 } | |
22 | 21 |
23 ImageTransportSurface::~ImageTransportSurface() { | 22 ImageTransportSurface::~ImageTransportSurface() {} |
24 } | |
25 | 23 |
26 void ImageTransportSurface::GetRegionsToCopy( | 24 void ImageTransportSurface::GetRegionsToCopy( |
27 const gfx::Rect& previous_damage_rect, | 25 const gfx::Rect& previous_damage_rect, |
28 const gfx::Rect& new_damage_rect, | 26 const gfx::Rect& new_damage_rect, |
29 std::vector<gfx::Rect>* regions) { | 27 std::vector<gfx::Rect>* regions) { |
30 gfx::Rect intersection = previous_damage_rect.Intersect(new_damage_rect); | 28 gfx::Rect intersection = previous_damage_rect.Intersect(new_damage_rect); |
31 | 29 |
32 if (intersection.IsEmpty()) { | 30 if (intersection.IsEmpty()) { |
33 regions->push_back(previous_damage_rect); | 31 regions->push_back(previous_damage_rect); |
34 return; | 32 return; |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
80 | 78 |
81 if (!decoder) | 79 if (!decoder) |
82 return false; | 80 return false; |
83 | 81 |
84 decoder->SetResizeCallback( | 82 decoder->SetResizeCallback( |
85 base::Bind(&ImageTransportHelper::Resize, base::Unretained(this))); | 83 base::Bind(&ImageTransportHelper::Resize, base::Unretained(this))); |
86 | 84 |
87 return true; | 85 return true; |
88 } | 86 } |
89 | 87 |
90 void ImageTransportHelper::Destroy() { | 88 void ImageTransportHelper::Destroy() {} |
91 } | |
92 | 89 |
93 bool ImageTransportHelper::OnMessageReceived(const IPC::Message& message) { | 90 bool ImageTransportHelper::OnMessageReceived(const IPC::Message& message) { |
94 bool handled = true; | 91 bool handled = true; |
95 IPC_BEGIN_MESSAGE_MAP(ImageTransportHelper, message) | 92 IPC_BEGIN_MESSAGE_MAP(ImageTransportHelper, message) |
96 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_BuffersSwappedACK, | 93 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_BuffersSwappedACK, |
97 OnBuffersSwappedACK) | 94 OnBuffersSwappedACK) |
98 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_PostSubBufferACK, | 95 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_PostSubBufferACK, |
99 OnPostSubBufferACK) | 96 OnPostSubBufferACK) |
100 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_NewACK, | 97 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_NewACK, |
101 OnNewSurfaceACK) | 98 OnNewSurfaceACK) |
102 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_ResizeViewACK, OnResizeViewACK); | 99 IPC_MESSAGE_HANDLER(AcceleratedSurfaceMsg_ResizeViewACK, OnResizeViewACK); |
103 IPC_MESSAGE_UNHANDLED(handled = false) | 100 IPC_MESSAGE_UNHANDLED(handled = false) |
104 IPC_END_MESSAGE_MAP() | 101 IPC_END_MESSAGE_MAP() |
105 return handled; | 102 return handled; |
106 } | 103 } |
107 | 104 |
108 void ImageTransportHelper::SendAcceleratedSurfaceRelease( | |
109 GpuHostMsg_AcceleratedSurfaceRelease_Params params) { | |
110 params.surface_id = stub_->surface_id(); | |
111 params.route_id = route_id_; | |
112 manager_->Send(new GpuHostMsg_AcceleratedSurfaceRelease(params)); | |
113 } | |
114 | |
115 void ImageTransportHelper::SendAcceleratedSurfaceNew( | 105 void ImageTransportHelper::SendAcceleratedSurfaceNew( |
116 GpuHostMsg_AcceleratedSurfaceNew_Params params) { | 106 GpuHostMsg_AcceleratedSurfaceNew_Params params) { |
117 params.surface_id = stub_->surface_id(); | 107 params.surface_id = stub_->surface_id(); |
118 params.route_id = route_id_; | 108 params.route_id = route_id_; |
119 #if defined(OS_MACOSX) | 109 #if defined(OS_MACOSX) |
120 params.window = handle_; | 110 params.window = handle_; |
121 #endif | 111 #endif |
122 manager_->Send(new GpuHostMsg_AcceleratedSurfaceNew(params)); | 112 manager_->Send(new GpuHostMsg_AcceleratedSurfaceNew(params)); |
123 } | 113 } |
124 | 114 |
(...skipping 10 matching lines...) Expand all Loading... |
135 void ImageTransportHelper::SendAcceleratedSurfacePostSubBuffer( | 125 void ImageTransportHelper::SendAcceleratedSurfacePostSubBuffer( |
136 GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params params) { | 126 GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params params) { |
137 params.surface_id = stub_->surface_id(); | 127 params.surface_id = stub_->surface_id(); |
138 params.route_id = route_id_; | 128 params.route_id = route_id_; |
139 #if defined(OS_MACOSX) | 129 #if defined(OS_MACOSX) |
140 params.window = handle_; | 130 params.window = handle_; |
141 #endif | 131 #endif |
142 manager_->Send(new GpuHostMsg_AcceleratedSurfacePostSubBuffer(params)); | 132 manager_->Send(new GpuHostMsg_AcceleratedSurfacePostSubBuffer(params)); |
143 } | 133 } |
144 | 134 |
| 135 void ImageTransportHelper::SendAcceleratedSurfaceRelease( |
| 136 GpuHostMsg_AcceleratedSurfaceRelease_Params params) { |
| 137 params.surface_id = stub_->surface_id(); |
| 138 params.route_id = route_id_; |
| 139 manager_->Send(new GpuHostMsg_AcceleratedSurfaceRelease(params)); |
| 140 } |
| 141 |
145 void ImageTransportHelper::SendResizeView(const gfx::Size& size) { | 142 void ImageTransportHelper::SendResizeView(const gfx::Size& size) { |
146 manager_->Send(new GpuHostMsg_ResizeView(stub_->surface_id(), | 143 manager_->Send(new GpuHostMsg_ResizeView(stub_->surface_id(), |
147 route_id_, | 144 route_id_, |
148 size)); | 145 size)); |
149 } | 146 } |
150 | 147 |
151 void ImageTransportHelper::SetScheduled(bool is_scheduled) { | 148 void ImageTransportHelper::SetScheduled(bool is_scheduled) { |
152 gpu::GpuScheduler* scheduler = Scheduler(); | 149 gpu::GpuScheduler* scheduler = Scheduler(); |
153 if (!scheduler) | 150 if (!scheduler) |
154 return; | 151 return; |
155 | 152 |
156 if (is_scheduled) { | 153 if (is_scheduled) { |
157 TRACE_EVENT_ASYNC_END0("gpu", "Descheduled", this); | 154 TRACE_EVENT_ASYNC_END0("gpu", "Descheduled", this); |
158 } else { | 155 } else { |
159 TRACE_EVENT_ASYNC_BEGIN0("gpu", "Descheduled", this); | 156 TRACE_EVENT_ASYNC_BEGIN0("gpu", "Descheduled", this); |
160 } | 157 } |
161 scheduler->SetScheduled(is_scheduled); | 158 scheduler->SetScheduled(is_scheduled); |
162 } | 159 } |
163 | 160 |
164 void ImageTransportHelper::DeferToFence(base::Closure task) { | 161 void ImageTransportHelper::DeferToFence(base::Closure task) { |
165 gpu::GpuScheduler* scheduler = Scheduler(); | 162 gpu::GpuScheduler* scheduler = Scheduler(); |
166 DCHECK(scheduler); | 163 DCHECK(scheduler); |
167 | 164 |
168 scheduler->DeferToFence(task); | 165 scheduler->DeferToFence(task); |
169 } | 166 } |
170 | 167 |
171 void ImageTransportHelper::OnBuffersSwappedACK() { | 168 bool ImageTransportHelper::MakeCurrent() { |
172 surface_->OnBuffersSwappedACK(); | 169 gpu::gles2::GLES2Decoder* decoder = Decoder(); |
| 170 if (!decoder) |
| 171 return false; |
| 172 return decoder->MakeCurrent(); |
173 } | 173 } |
174 | 174 |
175 void ImageTransportHelper::OnPostSubBufferACK() { | 175 void ImageTransportHelper::SetSwapInterval() { |
176 surface_->OnPostSubBufferACK(); | 176 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kDisableGpuVsync)) |
| 177 Decoder()->GetGLContext()->SetSwapInterval(0); |
| 178 else |
| 179 Decoder()->GetGLContext()->SetSwapInterval(1); |
| 180 } |
| 181 |
| 182 void ImageTransportHelper::Suspend() { |
| 183 manager_->Send(new GpuHostMsg_AcceleratedSurfaceSuspend(stub_->surface_id())); |
| 184 } |
| 185 |
| 186 gpu::GpuScheduler* ImageTransportHelper::Scheduler() { |
| 187 if (!stub_.get()) |
| 188 return NULL; |
| 189 return stub_->scheduler(); |
| 190 } |
| 191 |
| 192 gpu::gles2::GLES2Decoder* ImageTransportHelper::Decoder() { |
| 193 if (!stub_.get()) |
| 194 return NULL; |
| 195 return stub_->decoder(); |
177 } | 196 } |
178 | 197 |
179 void ImageTransportHelper::OnNewSurfaceACK( | 198 void ImageTransportHelper::OnNewSurfaceACK( |
180 uint64 surface_handle, | 199 uint64 surface_handle, |
181 TransportDIB::Handle shm_handle) { | 200 TransportDIB::Handle shm_handle) { |
182 surface_->OnNewSurfaceACK(surface_handle, shm_handle); | 201 surface_->OnNewSurfaceACK(surface_handle, shm_handle); |
183 } | 202 } |
184 | 203 |
| 204 void ImageTransportHelper::OnBuffersSwappedACK() { |
| 205 surface_->OnBuffersSwappedACK(); |
| 206 } |
| 207 |
| 208 void ImageTransportHelper::OnPostSubBufferACK() { |
| 209 surface_->OnPostSubBufferACK(); |
| 210 } |
| 211 |
185 void ImageTransportHelper::OnResizeViewACK() { | 212 void ImageTransportHelper::OnResizeViewACK() { |
186 surface_->OnResizeViewACK(); | 213 surface_->OnResizeViewACK(); |
187 } | 214 } |
188 | 215 |
189 void ImageTransportHelper::Resize(gfx::Size size) { | 216 void ImageTransportHelper::Resize(gfx::Size size) { |
190 // On windows, the surface is recreated and, in case the newly allocated | 217 // On windows, the surface is recreated and, in case the newly allocated |
191 // surface happens to have the same address, it should be invalidated on the | 218 // surface happens to have the same address, it should be invalidated on the |
192 // decoder so that future calls to MakeCurrent do not early out on the | 219 // decoder so that future calls to MakeCurrent do not early out on the |
193 // assumption that neither the context or surface have actually changed. | 220 // assumption that neither the context or surface have actually changed. |
194 #if defined(OS_WIN) | 221 #if defined(OS_WIN) |
195 Decoder()->ReleaseCurrent(); | 222 Decoder()->ReleaseCurrent(); |
196 #endif | 223 #endif |
197 | 224 |
198 surface_->OnResize(size); | 225 surface_->OnResize(size); |
199 | 226 |
200 #if defined(OS_WIN) | 227 #if defined(OS_WIN) |
201 Decoder()->MakeCurrent(); | 228 Decoder()->MakeCurrent(); |
202 SetSwapInterval(); | 229 SetSwapInterval(); |
203 #endif | 230 #endif |
204 } | 231 } |
205 | 232 |
206 void ImageTransportHelper::SetSwapInterval() { | |
207 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kDisableGpuVsync)) | |
208 Decoder()->GetGLContext()->SetSwapInterval(0); | |
209 else | |
210 Decoder()->GetGLContext()->SetSwapInterval(1); | |
211 } | |
212 | |
213 bool ImageTransportHelper::MakeCurrent() { | |
214 gpu::gles2::GLES2Decoder* decoder = Decoder(); | |
215 if (!decoder) | |
216 return false; | |
217 return decoder->MakeCurrent(); | |
218 } | |
219 | |
220 void ImageTransportHelper::Suspend() { | |
221 manager_->Send(new GpuHostMsg_AcceleratedSurfaceSuspend(stub_->surface_id())); | |
222 } | |
223 | |
224 gpu::GpuScheduler* ImageTransportHelper::Scheduler() { | |
225 if (!stub_.get()) | |
226 return NULL; | |
227 return stub_->scheduler(); | |
228 } | |
229 | |
230 gpu::gles2::GLES2Decoder* ImageTransportHelper::Decoder() { | |
231 if (!stub_.get()) | |
232 return NULL; | |
233 return stub_->decoder(); | |
234 } | |
235 | |
236 PassThroughImageTransportSurface::PassThroughImageTransportSurface( | 233 PassThroughImageTransportSurface::PassThroughImageTransportSurface( |
237 GpuChannelManager* manager, | 234 GpuChannelManager* manager, |
238 GpuCommandBufferStub* stub, | 235 GpuCommandBufferStub* stub, |
239 gfx::GLSurface* surface, | 236 gfx::GLSurface* surface, |
240 bool transport) | 237 bool transport) |
241 : GLSurfaceAdapter(surface), | 238 : GLSurfaceAdapter(surface), |
242 transport_(transport), | 239 transport_(transport), |
243 did_set_swap_interval_(false) { | 240 did_set_swap_interval_(false) { |
244 helper_.reset(new ImageTransportHelper(this, | 241 helper_.reset(new ImageTransportHelper(this, |
245 manager, | 242 manager, |
246 stub, | 243 stub, |
247 gfx::kNullPluginWindow)); | 244 gfx::kNullPluginWindow)); |
248 } | 245 } |
249 | 246 |
250 PassThroughImageTransportSurface::~PassThroughImageTransportSurface() { | |
251 } | |
252 | |
253 bool PassThroughImageTransportSurface::Initialize() { | 247 bool PassThroughImageTransportSurface::Initialize() { |
254 // The surface is assumed to have already been initialized. | 248 // The surface is assumed to have already been initialized. |
255 return helper_->Initialize(); | 249 return helper_->Initialize(); |
256 } | 250 } |
257 | 251 |
258 void PassThroughImageTransportSurface::Destroy() { | 252 void PassThroughImageTransportSurface::Destroy() { |
259 helper_->Destroy(); | 253 helper_->Destroy(); |
260 GLSurfaceAdapter::Destroy(); | 254 GLSurfaceAdapter::Destroy(); |
261 } | 255 } |
262 | 256 |
263 void PassThroughImageTransportSurface::OnNewSurfaceACK( | |
264 uint64 surface_handle, TransportDIB::Handle shm_handle) { | |
265 } | |
266 | |
267 bool PassThroughImageTransportSurface::SwapBuffers() { | 257 bool PassThroughImageTransportSurface::SwapBuffers() { |
268 bool result = gfx::GLSurfaceAdapter::SwapBuffers(); | 258 bool result = gfx::GLSurfaceAdapter::SwapBuffers(); |
269 | 259 |
270 if (transport_) { | 260 if (transport_) { |
271 // Round trip to the browser UI thread, for throttling, by sending a dummy | 261 // Round trip to the browser UI thread, for throttling, by sending a dummy |
272 // SwapBuffers message. | 262 // SwapBuffers message. |
273 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params; | 263 GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params; |
274 params.surface_handle = 0; | 264 params.surface_handle = 0; |
275 #if defined(OS_WIN) | 265 #if defined(OS_WIN) |
276 params.size = GetSize(); | 266 params.size = GetSize(); |
(...skipping 26 matching lines...) Expand all Loading... |
303 } | 293 } |
304 | 294 |
305 bool PassThroughImageTransportSurface::OnMakeCurrent(gfx::GLContext* context) { | 295 bool PassThroughImageTransportSurface::OnMakeCurrent(gfx::GLContext* context) { |
306 if (!did_set_swap_interval_) { | 296 if (!did_set_swap_interval_) { |
307 helper_->SetSwapInterval(); | 297 helper_->SetSwapInterval(); |
308 did_set_swap_interval_ = true; | 298 did_set_swap_interval_ = true; |
309 } | 299 } |
310 return true; | 300 return true; |
311 } | 301 } |
312 | 302 |
| 303 void PassThroughImageTransportSurface::OnNewSurfaceACK( |
| 304 uint64 surface_handle, |
| 305 TransportDIB::Handle shm_handle) { |
| 306 } |
| 307 |
313 void PassThroughImageTransportSurface::OnBuffersSwappedACK() { | 308 void PassThroughImageTransportSurface::OnBuffersSwappedACK() { |
314 DCHECK(transport_); | 309 DCHECK(transport_); |
315 helper_->SetScheduled(true); | 310 helper_->SetScheduled(true); |
316 } | 311 } |
317 | 312 |
318 void PassThroughImageTransportSurface::OnPostSubBufferACK() { | 313 void PassThroughImageTransportSurface::OnPostSubBufferACK() { |
319 DCHECK(transport_); | 314 DCHECK(transport_); |
320 helper_->SetScheduled(true); | 315 helper_->SetScheduled(true); |
321 } | 316 } |
322 | 317 |
323 void PassThroughImageTransportSurface::OnResizeViewACK() { | 318 void PassThroughImageTransportSurface::OnResizeViewACK() { |
324 DCHECK(transport_); | 319 DCHECK(transport_); |
325 Resize(new_size_); | 320 Resize(new_size_); |
326 | 321 |
327 helper_->SetScheduled(true); | 322 helper_->SetScheduled(true); |
328 } | 323 } |
329 | 324 |
330 void PassThroughImageTransportSurface::OnResize(gfx::Size size) { | 325 void PassThroughImageTransportSurface::OnResize(gfx::Size size) { |
331 new_size_ = size; | 326 new_size_ = size; |
332 | 327 |
333 if (transport_) { | 328 if (transport_) { |
334 helper_->SendResizeView(size); | 329 helper_->SendResizeView(size); |
335 helper_->SetScheduled(false); | 330 helper_->SetScheduled(false); |
336 } else { | 331 } else { |
337 Resize(new_size_); | 332 Resize(new_size_); |
338 } | 333 } |
339 } | 334 } |
340 | 335 |
| 336 PassThroughImageTransportSurface::~PassThroughImageTransportSurface() {} |
| 337 |
341 #endif // defined(ENABLE_GPU) | 338 #endif // defined(ENABLE_GPU) |
OLD | NEW |