OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
9 #include "base/debug/trace_event.h" | 9 #include "base/debug/trace_event.h" |
10 #include "base/shared_memory.h" | 10 #include "base/shared_memory.h" |
11 #include "build/build_config.h" | 11 #include "build/build_config.h" |
12 #include "content/common/gpu/gpu_channel.h" | 12 #include "content/common/gpu/gpu_channel.h" |
13 #include "content/common/gpu/gpu_channel_manager.h" | 13 #include "content/common/gpu/gpu_channel_manager.h" |
14 #include "content/common/gpu/gpu_command_buffer_stub.h" | 14 #include "content/common/gpu/gpu_command_buffer_stub.h" |
15 #include "content/common/gpu/gpu_messages.h" | 15 #include "content/common/gpu/gpu_messages.h" |
16 #include "content/common/gpu/gpu_watchdog.h" | 16 #include "content/common/gpu/gpu_watchdog.h" |
17 #include "gpu/command_buffer/common/constants.h" | 17 #include "gpu/command_buffer/common/constants.h" |
18 #include "ui/gfx/gl/gl_switches.h" | 18 #include "ui/gfx/gl/gl_switches.h" |
19 | 19 |
20 #if defined(OS_MACOSX) || defined(TOUCH_UI) | 20 #if defined(OS_MACOSX) || defined(UI_COMPOSITOR_IMAGE_TRANSPORT) |
21 #include "content/common/gpu/image_transport_surface.h" | 21 #include "content/common/gpu/image_transport_surface.h" |
22 #endif | 22 #endif |
23 | 23 |
24 GpuCommandBufferStub::GpuCommandBufferStub( | 24 GpuCommandBufferStub::GpuCommandBufferStub( |
25 GpuChannel* channel, | 25 GpuChannel* channel, |
26 GpuCommandBufferStub* share_group, | 26 GpuCommandBufferStub* share_group, |
27 gfx::PluginWindowHandle handle, | 27 gfx::PluginWindowHandle handle, |
28 const gfx::Size& size, | 28 const gfx::Size& size, |
29 const gpu::gles2::DisallowedFeatures& disallowed_features, | 29 const gpu::gles2::DisallowedFeatures& disallowed_features, |
30 const std::string& allowed_extensions, | 30 const std::string& allowed_extensions, |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
170 | 170 |
171 decoder_.reset(::gpu::gles2::GLES2Decoder::Create(context_group_.get())); | 171 decoder_.reset(::gpu::gles2::GLES2Decoder::Create(context_group_.get())); |
172 | 172 |
173 scheduler_.reset(new gpu::GpuScheduler(command_buffer_.get(), | 173 scheduler_.reset(new gpu::GpuScheduler(command_buffer_.get(), |
174 decoder_.get(), | 174 decoder_.get(), |
175 NULL)); | 175 NULL)); |
176 | 176 |
177 decoder_->set_engine(scheduler_.get()); | 177 decoder_->set_engine(scheduler_.get()); |
178 | 178 |
179 if (handle_) { | 179 if (handle_) { |
180 #if defined(TOUCH_UI) || defined(OS_MACOSX) | 180 #if defined(OS_MACOSX) || defined(UI_COMPOSITOR_IMAGE_TRANSPORT) |
181 if (software_) { | 181 if (software_) { |
182 OnInitializeFailed(reply_message); | 182 OnInitializeFailed(reply_message); |
183 return; | 183 return; |
184 } | 184 } |
185 | 185 |
186 surface_ = ImageTransportSurface::CreateSurface( | 186 surface_ = ImageTransportSurface::CreateSurface( |
187 channel_->gpu_channel_manager(), | 187 channel_->gpu_channel_manager(), |
188 render_view_id_, | 188 render_view_id_, |
189 renderer_id_, | 189 renderer_id_, |
190 route_id_, | 190 route_id_, |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
234 NewCallback(scheduler_.get(), | 234 NewCallback(scheduler_.get(), |
235 &gpu::GpuScheduler::PutChanged)); | 235 &gpu::GpuScheduler::PutChanged)); |
236 command_buffer_->SetParseErrorCallback( | 236 command_buffer_->SetParseErrorCallback( |
237 NewCallback(this, &GpuCommandBufferStub::OnParseError)); | 237 NewCallback(this, &GpuCommandBufferStub::OnParseError)); |
238 scheduler_->SetScheduledCallback( | 238 scheduler_->SetScheduledCallback( |
239 NewCallback(channel_, &GpuChannel::OnScheduled)); | 239 NewCallback(channel_, &GpuChannel::OnScheduled)); |
240 | 240 |
241 // On platforms that use an ImageTransportSurface, the surface | 241 // On platforms that use an ImageTransportSurface, the surface |
242 // handles co-ordinating the resize with the browser process. The | 242 // handles co-ordinating the resize with the browser process. The |
243 // surface sets it's own resize callback, so we shouldn't do it here. | 243 // surface sets it's own resize callback, so we shouldn't do it here. |
244 #if !defined(TOUCH_UI) && !defined(OS_MACOSX) | 244 #if !defined(OS_MACOSX) && !defined(UI_COMPOSITOR_IMAGE_TRANSPORT) |
245 if (handle_ != gfx::kNullPluginWindow) { | 245 if (handle_ != gfx::kNullPluginWindow) { |
246 decoder_->SetResizeCallback( | 246 decoder_->SetResizeCallback( |
247 NewCallback(this, &GpuCommandBufferStub::OnResize)); | 247 NewCallback(this, &GpuCommandBufferStub::OnResize)); |
248 } | 248 } |
249 #endif | 249 #endif |
250 | 250 |
251 if (watchdog_) { | 251 if (watchdog_) { |
252 scheduler_->SetCommandProcessedCallback( | 252 scheduler_->SetCommandProcessedCallback( |
253 NewCallback(this, &GpuCommandBufferStub::OnCommandProcessed)); | 253 NewCallback(this, &GpuCommandBufferStub::OnCommandProcessed)); |
254 } | 254 } |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
411 | 411 |
412 void GpuCommandBufferStub::OnCommandProcessed() { | 412 void GpuCommandBufferStub::OnCommandProcessed() { |
413 if (watchdog_) | 413 if (watchdog_) |
414 watchdog_->CheckArmed(); | 414 watchdog_->CheckArmed(); |
415 } | 415 } |
416 | 416 |
417 void GpuCommandBufferStub::OnResize(gfx::Size size) { | 417 void GpuCommandBufferStub::OnResize(gfx::Size size) { |
418 if (handle_ == gfx::kNullPluginWindow) | 418 if (handle_ == gfx::kNullPluginWindow) |
419 return; | 419 return; |
420 | 420 |
421 #if defined(TOOLKIT_USES_GTK) && !defined(TOUCH_UI) || defined(OS_WIN) | 421 #if defined(TOOLKIT_USES_GTK) && !defined(UI_COMPOSITOR_IMAGE_TRANSPORT) || \ |
| 422 defined(OS_WIN) |
422 GpuChannelManager* gpu_channel_manager = channel_->gpu_channel_manager(); | 423 GpuChannelManager* gpu_channel_manager = channel_->gpu_channel_manager(); |
423 | 424 |
424 // On Windows, Linux, we need to coordinate resizing of onscreen | 425 // On Windows, Linux, we need to coordinate resizing of onscreen |
425 // contexts with the resizing of the actual OS-level window. We do this by | 426 // contexts with the resizing of the actual OS-level window. We do this by |
426 // sending a resize message to the browser process and descheduling the | 427 // sending a resize message to the browser process and descheduling the |
427 // context until the ViewResized message comes back in reply. | 428 // context until the ViewResized message comes back in reply. |
428 // Send the resize message if needed | 429 // Send the resize message if needed |
429 gpu_channel_manager->Send( | 430 gpu_channel_manager->Send( |
430 new GpuHostMsg_ResizeView(renderer_id_, | 431 new GpuHostMsg_ResizeView(renderer_id_, |
431 render_view_id_, | 432 render_view_id_, |
432 route_id_, | 433 route_id_, |
433 size)); | 434 size)); |
434 | 435 |
435 scheduler_->SetScheduled(false); | 436 scheduler_->SetScheduled(false); |
436 #endif // defined(TOOLKIT_USES_GTK) && !defined(TOUCH_UI) || defined(OS_WIN) | 437 #endif |
437 } | 438 } |
438 | 439 |
439 void GpuCommandBufferStub::ViewResized() { | 440 void GpuCommandBufferStub::ViewResized() { |
440 #if defined(TOOLKIT_USES_GTK) && !defined(TOUCH_UI) || defined(OS_WIN) | 441 #if defined(TOOLKIT_USES_GTK) && !defined(UI_COMPOSITOR_IMAGE_TRANSPORT) || \ |
| 442 defined(OS_WIN) |
441 DCHECK(handle_ != gfx::kNullPluginWindow); | 443 DCHECK(handle_ != gfx::kNullPluginWindow); |
442 scheduler_->SetScheduled(true); | 444 scheduler_->SetScheduled(true); |
443 #endif | 445 #endif |
444 | 446 |
445 #if defined(OS_WIN) | 447 #if defined(OS_WIN) |
446 // Recreate the view surface to match the window size. Swap chains do not | 448 // Recreate the view surface to match the window size. Swap chains do not |
447 // automatically resize with window size with D3D. | 449 // automatically resize with window size with D3D. |
448 context_->ReleaseCurrent(surface_.get()); | 450 context_->ReleaseCurrent(surface_.get()); |
449 if (surface_.get()) { | 451 if (surface_.get()) { |
450 surface_->Destroy(); | 452 surface_->Destroy(); |
451 surface_->Initialize(); | 453 surface_->Initialize(); |
452 SetSwapInterval(); | 454 SetSwapInterval(); |
453 } | 455 } |
454 #endif | 456 #endif |
455 } | 457 } |
456 | 458 |
457 void GpuCommandBufferStub::ReportState() { | 459 void GpuCommandBufferStub::ReportState() { |
458 gpu::CommandBuffer::State state = command_buffer_->GetState(); | 460 gpu::CommandBuffer::State state = command_buffer_->GetState(); |
459 if (state.error == gpu::error::kLostContext && | 461 if (state.error == gpu::error::kLostContext && |
460 gfx::GLContext::LosesAllContextsOnContextLost()) { | 462 gfx::GLContext::LosesAllContextsOnContextLost()) { |
461 channel_->LoseAllContexts(); | 463 channel_->LoseAllContexts(); |
462 } else { | 464 } else { |
463 IPC::Message* msg = new GpuCommandBufferMsg_UpdateState(route_id_, state); | 465 IPC::Message* msg = new GpuCommandBufferMsg_UpdateState(route_id_, state); |
464 msg->set_unblock(true); | 466 msg->set_unblock(true); |
465 Send(msg); | 467 Send(msg); |
466 } | 468 } |
467 } | 469 } |
468 | 470 |
469 void GpuCommandBufferStub::SetSwapInterval() { | 471 void GpuCommandBufferStub::SetSwapInterval() { |
470 #if !defined(OS_MACOSX) && !defined(TOUCH_UI) | 472 #if !defined(OS_MACOSX) && !defined(UI_COMPOSITOR_IMAGE_TRANSPORT) |
471 // Set up swap interval for onscreen contexts. | 473 // Set up swap interval for onscreen contexts. |
472 if (!surface_->IsOffscreen()) { | 474 if (!surface_->IsOffscreen()) { |
473 decoder_->MakeCurrent(); | 475 decoder_->MakeCurrent(); |
474 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kDisableGpuVsync)) | 476 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kDisableGpuVsync)) |
475 context_->SetSwapInterval(0); | 477 context_->SetSwapInterval(0); |
476 else | 478 else |
477 context_->SetSwapInterval(1); | 479 context_->SetSwapInterval(1); |
478 } | 480 } |
479 #endif | 481 #endif |
480 } | 482 } |
(...skipping 10 matching lines...) Expand all Loading... |
491 channel_->AddRoute(decoder_route_id, decoder); | 493 channel_->AddRoute(decoder_route_id, decoder); |
492 decoder->Initialize(profile, reply_message); | 494 decoder->Initialize(profile, reply_message); |
493 } | 495 } |
494 | 496 |
495 void GpuCommandBufferStub::OnDestroyVideoDecoder(int decoder_route_id) { | 497 void GpuCommandBufferStub::OnDestroyVideoDecoder(int decoder_route_id) { |
496 channel_->RemoveRoute(decoder_route_id); | 498 channel_->RemoveRoute(decoder_route_id); |
497 video_decoders_.Remove(decoder_route_id); | 499 video_decoders_.Remove(decoder_route_id); |
498 } | 500 } |
499 | 501 |
500 #endif // defined(ENABLE_GPU) | 502 #endif // defined(ENABLE_GPU) |
OLD | NEW |