15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// found in the LICENSE file. 4558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/compositor/gpu_process_transport_factory.h" 6558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 7558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include <string> 8558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 9558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "base/bind.h" 10558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "base/command_line.h" 11558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "base/location.h" 12558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "base/message_loop/message_loop.h" 13d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/metrics/histogram.h" 14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/threading/thread.h" 15558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "cc/output/compositor_frame.h" 16558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "cc/output/output_surface.h" 1746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "cc/surfaces/surface_manager.h" 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/compositor/browser_compositor_output_surface.h" 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/compositor/browser_compositor_output_surface_proxy.h" 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/compositor/gpu_browser_compositor_output_surface.h" 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.h" 2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "content/browser/compositor/onscreen_display_client.h" 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/compositor/reflector_impl.h" 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/compositor/software_browser_compositor_output_surface.h" 2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "content/browser/compositor/surface_display_output_surface.h" 26558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/browser/gpu/browser_gpu_channel_host_factory.h" 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/browser/gpu/compositor_util.h" 28558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/browser/gpu/gpu_data_manager_impl.h" 29558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/browser/gpu/gpu_surface_tracker.h" 30558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/browser/renderer_host/render_widget_host_impl.h" 31fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch#include "content/common/gpu/client/context_provider_command_buffer.h" 32558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/common/gpu/client/gl_helper.h" 33558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/common/gpu/client/gpu_channel_host.h" 34558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h" 35558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/common/gpu/gpu_process_launch_causes.h" 36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/common/host_shared_bitmap_manager.h" 3746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "content/public/common/content_switches.h" 38558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "gpu/GLES2/gl2extchromium.h" 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "gpu/command_buffer/client/gles2_interface.h" 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "gpu/command_buffer/common/mailbox.h" 41558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "third_party/khronos/GLES2/gl2.h" 42558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "ui/compositor/compositor.h" 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/compositor/compositor_constants.h" 44558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "ui/compositor/compositor_switches.h" 45558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "ui/gfx/native_widget_types.h" 46558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "ui/gfx/size.h" 47558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 48558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#if defined(OS_WIN) 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/compositor/software_output_device_win.h" 501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#elif defined(USE_OZONE) 51c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/browser/compositor/overlay_candidate_validator_ozone.h" 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/compositor/software_output_device_ozone.h" 536d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "ui/ozone/public/surface_factory_ozone.h" 54558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#elif defined(USE_X11) 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/compositor/software_output_device_x11.h" 56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#elif defined(OS_MACOSX) 57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/browser/compositor/software_output_device_mac.h" 58558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif 59558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using cc::ContextProvider; 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using gpu::gles2::GLES2Interface; 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 63558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochnamespace content { 64558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 65558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochstruct GpuProcessTransportFactory::PerCompositorData { 66558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch int surface_id; 67558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch scoped_refptr<ReflectorImpl> reflector; 6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<OnscreenDisplayClient> display_client; 69558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}; 70558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 71558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochGpuProcessTransportFactory::GpuProcessTransportFactory() 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : next_surface_id_namespace_(1u), 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci callback_factory_(this) { 74558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch output_surface_proxy_ = new BrowserCompositorOutputSurfaceProxy( 75d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch &output_surface_map_); 76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(OS_CHROMEOS) 776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) bool use_thread = !base::CommandLine::ForCurrentProcess()->HasSwitch( 78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) switches::kUIDisableThreadedCompositing); 79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#else 80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool use_thread = false; 81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif 82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (use_thread) { 83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) compositor_thread_.reset(new base::Thread("Browser Compositor")); 84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) compositor_thread_->Start(); 85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (UseSurfacesEnabled()) 8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) surface_manager_ = make_scoped_ptr(new cc::SurfaceManager); 88558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 89558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 90558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochGpuProcessTransportFactory::~GpuProcessTransportFactory() { 91558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch DCHECK(per_compositor_data_.empty()); 92fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch 93fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch // Make sure the lost context callback doesn't try to run during destruction. 94fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch callback_factory_.InvalidateWeakPtrs(); 95558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 96558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 97558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochscoped_ptr<WebGraphicsContext3DCommandBufferImpl> 98558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochGpuProcessTransportFactory::CreateOffscreenCommandBufferContext() { 99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return CreateContextCommon(0); 100558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 101558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 102bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochscoped_ptr<cc::SoftwareOutputDevice> CreateSoftwareOutputDevice( 103bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch ui::Compositor* compositor) { 104bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#if defined(OS_WIN) 105bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch return scoped_ptr<cc::SoftwareOutputDevice>(new SoftwareOutputDeviceWin( 106bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch compositor)); 1071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#elif defined(USE_OZONE) 1081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return scoped_ptr<cc::SoftwareOutputDevice>(new SoftwareOutputDeviceOzone( 1091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) compositor)); 110bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#elif defined(USE_X11) 111bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch return scoped_ptr<cc::SoftwareOutputDevice>(new SoftwareOutputDeviceX11( 112bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch compositor)); 113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#elif defined(OS_MACOSX) 114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return scoped_ptr<cc::SoftwareOutputDevice>( 115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new SoftwareOutputDeviceMac(compositor)); 11623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#else 117bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch NOTREACHED(); 118bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch return scoped_ptr<cc::SoftwareOutputDevice>(); 11923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#endif 120bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch} 121bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 122c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochscoped_ptr<cc::OverlayCandidateValidator> CreateOverlayCandidateValidator( 123c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch gfx::AcceleratedWidget widget) { 124c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(USE_OZONE) 1256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) ui::OverlayCandidatesOzone* overlay_candidates = 1266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) ui::SurfaceFactoryOzone::GetInstance()->GetOverlayCandidates(widget); 1276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (overlay_candidates && 1286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::CommandLine::ForCurrentProcess()->HasSwitch( 1296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) switches::kEnableHardwareOverlays)) { 130c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return scoped_ptr<cc::OverlayCandidateValidator>( 131c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch new OverlayCandidateValidatorOzone(widget, overlay_candidates)); 132c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 133c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif 134c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return scoped_ptr<cc::OverlayCandidateValidator>(); 135c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 136c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 137558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochscoped_ptr<cc::OutputSurface> GpuProcessTransportFactory::CreateOutputSurface( 138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ui::Compositor* compositor, bool software_fallback) { 139558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch PerCompositorData* data = per_compositor_data_[compositor]; 140558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (!data) 141558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch data = CreatePerCompositorData(compositor); 142558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool create_software_renderer = software_fallback; 144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(OS_CHROMEOS) 145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Software fallback does not happen on Chrome OS. 146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) create_software_renderer = false; 147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#elif defined(OS_WIN) 1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (::GetProp(compositor->widget(), kForceSoftwareCompositor)) { 149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (::RemoveProp(compositor->widget(), kForceSoftwareCompositor)) 150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) create_software_renderer = true; 1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_refptr<ContextProviderCommandBuffer> context_provider; 15546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!create_software_renderer) { 1573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) context_provider = ContextProviderCommandBuffer::Create( 158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GpuProcessTransportFactory::CreateContextCommon(data->surface_id), 159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "Compositor"); 160558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 161d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci UMA_HISTOGRAM_BOOLEAN("Aura.CreatedGpuBrowserCompositor", 1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci !!context_provider.get()); 164d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (context_provider.get()) { 1665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_refptr<base::SingleThreadTaskRunner> compositor_thread_task_runner = 1675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetCompositorMessageLoop(); 1685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!compositor_thread_task_runner.get()) 1695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) compositor_thread_task_runner = base::MessageLoopProxy::current(); 1705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Here we know the GpuProcessHost has been set up, because we created a 1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // context. 1735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) output_surface_proxy_->ConnectToGpuProcessHost( 1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) compositor_thread_task_runner.get()); 1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (UseSurfacesEnabled()) { 17846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // This gets a bit confusing. Here we have a ContextProvider configured to 17946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // render directly to this widget. We need to make an OnscreenDisplayClient 18046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // associated with this context, then return a SurfaceDisplayOutputSurface 18146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // set up to draw to the display's surface. 18246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) cc::SurfaceManager* manager = surface_manager_.get(); 1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<cc::OutputSurface> display_surface; 1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!context_provider.get()) { 1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci display_surface = 18646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) make_scoped_ptr(new SoftwareBrowserCompositorOutputSurface( 18746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) output_surface_proxy_, 18846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) CreateSoftwareOutputDevice(compositor), 18946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) per_compositor_data_[compositor]->surface_id, 19046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) &output_surface_map_, 19146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) compositor->vsync_manager())); 1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } else { 1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci display_surface = make_scoped_ptr(new GpuBrowserCompositorOutputSurface( 1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci context_provider, 1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci per_compositor_data_[compositor]->surface_id, 1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &output_surface_map_, 1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci compositor->vsync_manager(), 1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreateOverlayCandidateValidator(compositor->widget()))); 19946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<OnscreenDisplayClient> display_client(new OnscreenDisplayClient( 2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci display_surface.Pass(), manager, compositor->task_runner())); 20246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 20346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_refptr<cc::ContextProvider> offscreen_context_provider; 2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (context_provider.get()) { 20546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) offscreen_context_provider = ContextProviderCommandBuffer::Create( 20646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GpuProcessTransportFactory::CreateOffscreenCommandBufferContext(), 20746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) "Offscreen-Compositor"); 20846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 20946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<SurfaceDisplayOutputSurface> output_surface( 210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new SurfaceDisplayOutputSurface(manager, 211116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch next_surface_id_namespace_++, 212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch offscreen_context_provider)); 2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci display_client->set_surface_output_surface(output_surface.get()); 214116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch output_surface->set_display(display_client->display()); 21546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) data->display_client = display_client.Pass(); 21646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return output_surface.PassAs<cc::OutputSurface>(); 21746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 21846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 2193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!context_provider.get()) { 220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (compositor_thread_.get()) { 2213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) LOG(FATAL) << "Failed to create UI context, but can't use software" 222ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch " compositing with browser threaded compositing. Aborting."; 223ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 224ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 225f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<SoftwareBrowserCompositorOutputSurface> surface( 226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) new SoftwareBrowserCompositorOutputSurface( 227f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) output_surface_proxy_, 228f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) CreateSoftwareOutputDevice(compositor), 229f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) per_compositor_data_[compositor]->surface_id, 230f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) &output_surface_map_, 2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) compositor->vsync_manager())); 232bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch return surface.PassAs<cc::OutputSurface>(); 233bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch } 234558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<BrowserCompositorOutputSurface> surface; 2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(USE_OZONE) 2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (ui::SurfaceFactoryOzone::GetInstance()->CanShowPrimaryPlaneAsOverlay()) { 2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci surface.reset(new GpuSurfacelessBrowserCompositorOutputSurface( 2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci context_provider, 2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci per_compositor_data_[compositor]->surface_id, 2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &output_surface_map_, 2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci compositor->vsync_manager(), 2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreateOverlayCandidateValidator(compositor->widget()), 2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GL_RGB8_OES)); 2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!surface) 2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci surface.reset(new GpuBrowserCompositorOutputSurface( 2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci context_provider, 2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci per_compositor_data_[compositor]->surface_id, 2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci &output_surface_map_, 2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci compositor->vsync_manager(), 2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreateOverlayCandidateValidator(compositor->widget()))); 2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 255a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (data->reflector.get()) 256a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) data->reflector->ReattachToOutputSurfaceFromMainThread(surface.get()); 257558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 258558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return surface.PassAs<cc::OutputSurface>(); 259558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 260558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 261558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochscoped_refptr<ui::Reflector> GpuProcessTransportFactory::CreateReflector( 262558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ui::Compositor* source, 263558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ui::Layer* target) { 264558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch PerCompositorData* data = per_compositor_data_[source]; 265558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch DCHECK(data); 266558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 267cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) data->reflector = new ReflectorImpl(source, 268cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) target, 269cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) &output_surface_map_, 270cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetCompositorMessageLoop(), 271cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) data->surface_id); 272558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return data->reflector; 273558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 274558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 275558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid GpuProcessTransportFactory::RemoveReflector( 276558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch scoped_refptr<ui::Reflector> reflector) { 277558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ReflectorImpl* reflector_impl = 278558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch static_cast<ReflectorImpl*>(reflector.get()); 279558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch PerCompositorData* data = 280558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch per_compositor_data_[reflector_impl->mirrored_compositor()]; 281558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch DCHECK(data); 282558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch data->reflector->Shutdown(); 283558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch data->reflector = NULL; 284558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 285558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 286558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid GpuProcessTransportFactory::RemoveCompositor(ui::Compositor* compositor) { 287558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch PerCompositorDataMap::iterator it = per_compositor_data_.find(compositor); 288558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (it == per_compositor_data_.end()) 289558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return; 290558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch PerCompositorData* data = it->second; 291558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch DCHECK(data); 292558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch GpuSurfaceTracker::Get()->RemoveSurface(data->surface_id); 293558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch delete data; 294558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch per_compositor_data_.erase(it); 2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (per_compositor_data_.empty()) { 2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Destroying the GLHelper may cause some async actions to be cancelled, 2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // causing things to request a new GLHelper. Due to crbug.com/176091 the 2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // GLHelper created in this case would be lost/leaked if we just reset() 2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // on the |gl_helper_| variable directly. So instead we call reset() on a 3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // local scoped_ptr. 3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<GLHelper> helper = gl_helper_.Pass(); 302f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 303f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // If there are any observer left at this point, make sure they clean up 304f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // before we destroy the GLHelper. 305f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) FOR_EACH_OBSERVER( 306f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ImageTransportFactoryObserver, observer_list_, OnLostResources()); 307f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) helper.reset(); 3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(!gl_helper_) << "Destroying the GLHelper should not cause a new " 3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "GLHelper to be created."; 3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 312558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 313558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 314c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdochbool GpuProcessTransportFactory::DoesCreateTestContexts() { return false; } 315c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 316010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)cc::SharedBitmapManager* GpuProcessTransportFactory::GetSharedBitmapManager() { 317010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return HostSharedBitmapManager::current(); 318558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 319558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 3200de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)ui::ContextFactory* GpuProcessTransportFactory::GetContextFactory() { 3210de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) return this; 3220de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)} 3230de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) 324cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)base::MessageLoopProxy* GpuProcessTransportFactory::GetCompositorMessageLoop() { 325cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!compositor_thread_) 326cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return NULL; 3271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return compositor_thread_->message_loop_proxy().get(); 328cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 329cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)gfx::GLSurfaceHandle GpuProcessTransportFactory::GetSharedSurfaceHandle() { 331558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch gfx::GLSurfaceHandle handle = gfx::GLSurfaceHandle( 332558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch gfx::kNullPluginWindow, gfx::TEXTURE_TRANSPORT); 333a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) handle.parent_client_id = 334a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) BrowserGpuChannelHostFactory::instance()->GetGpuChannelId(); 335558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return handle; 336558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 337558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 3385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)scoped_ptr<cc::SurfaceIdAllocator> 3395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)GpuProcessTransportFactory::CreateSurfaceIdAllocator() { 3405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return make_scoped_ptr( 3415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) new cc::SurfaceIdAllocator(next_surface_id_namespace_++)); 3425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 3435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)cc::SurfaceManager* GpuProcessTransportFactory::GetSurfaceManager() { 3455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return surface_manager_.get(); 3465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 3475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 348558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochGLHelper* GpuProcessTransportFactory::GetGLHelper() { 3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!gl_helper_ && !per_compositor_data_.empty()) { 3504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<cc::ContextProvider> provider = 3514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SharedMainThreadContextProvider(); 3524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (provider.get()) 3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gl_helper_.reset(new GLHelper(provider->ContextGL(), 3548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) provider->ContextSupport())); 355558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 356558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return gl_helper_.get(); 357558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 358558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 359558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid GpuProcessTransportFactory::AddObserver( 360558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ImageTransportFactoryObserver* observer) { 361558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch observer_list_.AddObserver(observer); 362558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 363558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 364558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid GpuProcessTransportFactory::RemoveObserver( 365558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ImageTransportFactoryObserver* observer) { 366558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch observer_list_.RemoveObserver(observer); 367558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 368558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 369f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(OS_MACOSX) 370f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void GpuProcessTransportFactory::OnSurfaceDisplayed(int surface_id) { 371f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) BrowserCompositorOutputSurface* surface = output_surface_map_.Lookup( 372f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) surface_id); 373f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (surface) 374f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) surface->OnSurfaceDisplayed(); 375f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 376f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif 377f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 378558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochscoped_refptr<cc::ContextProvider> 3794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)GpuProcessTransportFactory::SharedMainThreadContextProvider() { 3804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (shared_main_thread_contexts_.get()) 3814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return shared_main_thread_contexts_; 3824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // In threaded compositing mode, we have to create our own context for the 3845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // main thread since the compositor's context will be bound to the 3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // compositor thread. When not in threaded mode, we still need a separate 3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // context so that skia and gl_helper don't step on each other. 3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) shared_main_thread_contexts_ = ContextProviderCommandBuffer::Create( 3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GpuProcessTransportFactory::CreateOffscreenCommandBufferContext(), 3895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Offscreen-MainThread"); 3904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 3911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (shared_main_thread_contexts_.get()) { 3924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) shared_main_thread_contexts_->SetLostContextCallback( 3934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Bind(&GpuProcessTransportFactory:: 3944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) OnLostMainThreadSharedContextInsideCallback, 3954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) callback_factory_.GetWeakPtr())); 3965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (!shared_main_thread_contexts_->BindToCurrentThread()) 3974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) shared_main_thread_contexts_ = NULL; 398558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 3994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return shared_main_thread_contexts_; 400558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 401558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 402558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochGpuProcessTransportFactory::PerCompositorData* 403558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochGpuProcessTransportFactory::CreatePerCompositorData( 404558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ui::Compositor* compositor) { 405558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch DCHECK(!per_compositor_data_[compositor]); 406558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 407558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch gfx::AcceleratedWidget widget = compositor->widget(); 408558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch GpuSurfaceTracker* tracker = GpuSurfaceTracker::Get(); 409558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 410558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch PerCompositorData* data = new PerCompositorData; 411558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch data->surface_id = tracker->AddSurfaceForNativeWidget(widget); 412558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch tracker->SetSurfaceHandle( 413558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch data->surface_id, 414558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch gfx::GLSurfaceHandle(widget, gfx::NATIVE_DIRECT)); 415558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 416558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch per_compositor_data_[compositor] = data; 417558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 418558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return data; 419558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 420558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 421558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochscoped_ptr<WebGraphicsContext3DCommandBufferImpl> 422f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)GpuProcessTransportFactory::CreateContextCommon(int surface_id) { 423558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (!GpuDataManagerImpl::GetInstance()->CanUseGpuBrowserCompositor()) 424558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return scoped_ptr<WebGraphicsContext3DCommandBufferImpl>(); 425f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebGraphicsContext3D::Attributes attrs; 426558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch attrs.shareResources = true; 427558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch attrs.depth = false; 428558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch attrs.stencil = false; 429558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch attrs.antialias = false; 430558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch attrs.noAutomaticFlushes = true; 431e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch bool lose_context_when_out_of_memory = true; 432f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) CauseForGpuLaunch cause = 433f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) CAUSE_FOR_GPU_LAUNCH_WEBGRAPHICSCONTEXT3DCOMMANDBUFFERIMPL_INITIALIZE; 4341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_refptr<GpuChannelHost> gpu_channel_host( 435f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) BrowserGpuChannelHostFactory::instance()->EstablishGpuChannelSync(cause)); 4361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!gpu_channel_host.get()) { 437a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LOG(ERROR) << "Failed to establish GPU channel."; 4381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return scoped_ptr<WebGraphicsContext3DCommandBufferImpl>(); 439a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 440558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch GURL url("chrome://gpu/GpuProcessTransportFactory::CreateContextCommon"); 441558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch scoped_ptr<WebGraphicsContext3DCommandBufferImpl> context( 442558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch new WebGraphicsContext3DCommandBufferImpl( 443558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch surface_id, 444558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch url, 4451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) gpu_channel_host.get(), 4461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) attrs, 447e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch lose_context_when_out_of_memory, 448a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebGraphicsContext3DCommandBufferImpl::SharedMemoryLimits(), 449a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NULL)); 450558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return context.Pass(); 451558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 452558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 453fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdochvoid GpuProcessTransportFactory::OnLostMainThreadSharedContextInsideCallback() { 454558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::MessageLoop::current()->PostTask( 455558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch FROM_HERE, 456558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::Bind(&GpuProcessTransportFactory::OnLostMainThreadSharedContext, 457fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch callback_factory_.GetWeakPtr())); 458558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 459558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 460558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid GpuProcessTransportFactory::OnLostMainThreadSharedContext() { 461558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch LOG(ERROR) << "Lost UI shared context."; 4623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 463558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Keep old resources around while we call the observers, but ensure that 464558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // new resources are created if needed. 4653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Kill shared contexts for both threads in tandem so they are always in 4663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // the same share group. 4674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<cc::ContextProvider> lost_shared_main_thread_contexts = 4684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) shared_main_thread_contexts_; 4694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) shared_main_thread_contexts_ = NULL; 470558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 4713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_ptr<GLHelper> lost_gl_helper = gl_helper_.Pass(); 472558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 473558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch FOR_EACH_OBSERVER(ImageTransportFactoryObserver, 474558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch observer_list_, 475558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch OnLostResources()); 4763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Kill things that use the shared context before killing the shared context. 4783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) lost_gl_helper.reset(); 4794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) lost_shared_main_thread_contexts = NULL; 480558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 481558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 482558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} // namespace content 483