Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 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 #include "content/browser/compositor/gpu_process_transport_factory.h" | 5 #include "content/browser/compositor/gpu_process_transport_factory.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| 11 #include "base/location.h" | 11 #include "base/location.h" |
| 12 #include "base/message_loop/message_loop.h" | 12 #include "base/message_loop/message_loop.h" |
| 13 #include "base/metrics/histogram.h" | 13 #include "base/metrics/histogram.h" |
| 14 #include "base/threading/thread.h" | |
| 14 #include "cc/output/compositor_frame.h" | 15 #include "cc/output/compositor_frame.h" |
| 15 #include "cc/output/output_surface.h" | 16 #include "cc/output/output_surface.h" |
| 16 #include "content/browser/compositor/browser_compositor_output_surface.h" | 17 #include "content/browser/compositor/browser_compositor_output_surface.h" |
| 17 #include "content/browser/compositor/browser_compositor_output_surface_proxy.h" | 18 #include "content/browser/compositor/browser_compositor_output_surface_proxy.h" |
| 18 #include "content/browser/compositor/gpu_browser_compositor_output_surface.h" | 19 #include "content/browser/compositor/gpu_browser_compositor_output_surface.h" |
| 19 #include "content/browser/compositor/reflector_impl.h" | 20 #include "content/browser/compositor/reflector_impl.h" |
| 20 #include "content/browser/compositor/software_browser_compositor_output_surface. h" | 21 #include "content/browser/compositor/software_browser_compositor_output_surface. h" |
| 21 #include "content/browser/gpu/browser_gpu_channel_host_factory.h" | 22 #include "content/browser/gpu/browser_gpu_channel_host_factory.h" |
| 22 #include "content/browser/gpu/gpu_data_manager_impl.h" | 23 #include "content/browser/gpu/gpu_data_manager_impl.h" |
| 23 #include "content/browser/gpu/gpu_surface_tracker.h" | 24 #include "content/browser/gpu/gpu_surface_tracker.h" |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 55 | 56 |
| 56 struct GpuProcessTransportFactory::PerCompositorData { | 57 struct GpuProcessTransportFactory::PerCompositorData { |
| 57 int surface_id; | 58 int surface_id; |
| 58 scoped_refptr<ReflectorImpl> reflector; | 59 scoped_refptr<ReflectorImpl> reflector; |
| 59 }; | 60 }; |
| 60 | 61 |
| 61 GpuProcessTransportFactory::GpuProcessTransportFactory() | 62 GpuProcessTransportFactory::GpuProcessTransportFactory() |
| 62 : callback_factory_(this) { | 63 : callback_factory_(this) { |
| 63 output_surface_proxy_ = new BrowserCompositorOutputSurfaceProxy( | 64 output_surface_proxy_ = new BrowserCompositorOutputSurfaceProxy( |
| 64 &output_surface_map_); | 65 &output_surface_map_); |
| 66 #if defined(OS_CHROMEOS) | |
| 67 bool use_thread = !CommandLine::ForCurrentProcess()->HasSwitch( | |
| 68 switches::kUIDisableThreadedCompositing); | |
| 69 #else | |
| 70 bool use_thread = false; | |
| 71 #endif | |
| 72 if (use_thread) { | |
| 73 compositor_thread_.reset(new base::Thread("Browser Compositor")); | |
| 74 compositor_thread_->Start(); | |
| 75 } | |
| 65 } | 76 } |
| 66 | 77 |
| 67 GpuProcessTransportFactory::~GpuProcessTransportFactory() { | 78 GpuProcessTransportFactory::~GpuProcessTransportFactory() { |
| 68 DCHECK(per_compositor_data_.empty()); | 79 DCHECK(per_compositor_data_.empty()); |
| 69 | 80 |
| 70 // Make sure the lost context callback doesn't try to run during destruction. | 81 // Make sure the lost context callback doesn't try to run during destruction. |
| 71 callback_factory_.InvalidateWeakPtrs(); | 82 callback_factory_.InvalidateWeakPtrs(); |
| 83 | |
| 84 if (compositor_thread_.get()) { | |
| 85 compositor_thread_->Stop(); | |
|
danakj
2014/05/08 22:37:30
Why do we need to do Stop() and reset()? The destr
piman
2014/05/08 22:48:34
Done. I was just copy&pasting from existing code t
| |
| 86 compositor_thread_.reset(); | |
| 87 } | |
| 72 } | 88 } |
| 73 | 89 |
| 74 scoped_ptr<WebGraphicsContext3DCommandBufferImpl> | 90 scoped_ptr<WebGraphicsContext3DCommandBufferImpl> |
| 75 GpuProcessTransportFactory::CreateOffscreenCommandBufferContext() { | 91 GpuProcessTransportFactory::CreateOffscreenCommandBufferContext() { |
| 76 return CreateContextCommon(0); | 92 return CreateContextCommon(0); |
| 77 } | 93 } |
| 78 | 94 |
| 79 scoped_ptr<cc::SoftwareOutputDevice> CreateSoftwareOutputDevice( | 95 scoped_ptr<cc::SoftwareOutputDevice> CreateSoftwareOutputDevice( |
| 80 ui::Compositor* compositor) { | 96 ui::Compositor* compositor) { |
| 81 #if defined(OS_WIN) | 97 #if defined(OS_WIN) |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 127 scoped_refptr<ContextProviderCommandBuffer> context_provider; | 143 scoped_refptr<ContextProviderCommandBuffer> context_provider; |
| 128 if (!create_software_renderer) { | 144 if (!create_software_renderer) { |
| 129 context_provider = ContextProviderCommandBuffer::Create( | 145 context_provider = ContextProviderCommandBuffer::Create( |
| 130 GpuProcessTransportFactory::CreateContextCommon(data->surface_id), | 146 GpuProcessTransportFactory::CreateContextCommon(data->surface_id), |
| 131 "Compositor"); | 147 "Compositor"); |
| 132 } | 148 } |
| 133 | 149 |
| 134 UMA_HISTOGRAM_BOOLEAN("Aura.CreatedGpuBrowserCompositor", !!context_provider); | 150 UMA_HISTOGRAM_BOOLEAN("Aura.CreatedGpuBrowserCompositor", !!context_provider); |
| 135 | 151 |
| 136 if (!context_provider.get()) { | 152 if (!context_provider.get()) { |
| 137 if (ui::Compositor::WasInitializedWithThread()) { | 153 if (compositor_thread_.get()) { |
| 138 LOG(FATAL) << "Failed to create UI context, but can't use software" | 154 LOG(FATAL) << "Failed to create UI context, but can't use software" |
| 139 " compositing with browser threaded compositing. Aborting."; | 155 " compositing with browser threaded compositing. Aborting."; |
| 140 } | 156 } |
| 141 | 157 |
| 142 scoped_ptr<SoftwareBrowserCompositorOutputSurface> surface( | 158 scoped_ptr<SoftwareBrowserCompositorOutputSurface> surface( |
| 143 new SoftwareBrowserCompositorOutputSurface( | 159 new SoftwareBrowserCompositorOutputSurface( |
| 144 output_surface_proxy_, | 160 output_surface_proxy_, |
| 145 CreateSoftwareOutputDevice(compositor), | 161 CreateSoftwareOutputDevice(compositor), |
| 146 per_compositor_data_[compositor]->surface_id, | 162 per_compositor_data_[compositor]->surface_id, |
| 147 &output_surface_map_, | 163 &output_surface_map_, |
| 148 compositor->vsync_manager())); | 164 compositor->vsync_manager())); |
| 149 return surface.PassAs<cc::OutputSurface>(); | 165 return surface.PassAs<cc::OutputSurface>(); |
| 150 } | 166 } |
| 151 | 167 |
| 152 scoped_refptr<base::SingleThreadTaskRunner> compositor_thread_task_runner = | 168 scoped_refptr<base::SingleThreadTaskRunner> compositor_thread_task_runner = |
| 153 ui::Compositor::GetCompositorMessageLoop(); | 169 GetCompositorMessageLoop(); |
| 154 if (!compositor_thread_task_runner.get()) | 170 if (!compositor_thread_task_runner.get()) |
| 155 compositor_thread_task_runner = base::MessageLoopProxy::current(); | 171 compositor_thread_task_runner = base::MessageLoopProxy::current(); |
| 156 | 172 |
| 157 // Here we know the GpuProcessHost has been set up, because we created a | 173 // Here we know the GpuProcessHost has been set up, because we created a |
| 158 // context. | 174 // context. |
| 159 output_surface_proxy_->ConnectToGpuProcessHost( | 175 output_surface_proxy_->ConnectToGpuProcessHost( |
| 160 compositor_thread_task_runner.get()); | 176 compositor_thread_task_runner.get()); |
| 161 | 177 |
| 162 scoped_ptr<BrowserCompositorOutputSurface> surface( | 178 scoped_ptr<BrowserCompositorOutputSurface> surface( |
| 163 new GpuBrowserCompositorOutputSurface( | 179 new GpuBrowserCompositorOutputSurface( |
| 164 context_provider, | 180 context_provider, |
| 165 per_compositor_data_[compositor]->surface_id, | 181 per_compositor_data_[compositor]->surface_id, |
| 166 &output_surface_map_, | 182 &output_surface_map_, |
| 167 compositor->vsync_manager(), | 183 compositor->vsync_manager(), |
| 168 CreateOverlayCandidateValidator(compositor->widget()))); | 184 CreateOverlayCandidateValidator(compositor->widget()))); |
| 169 if (data->reflector.get()) | 185 if (data->reflector.get()) |
| 170 data->reflector->ReattachToOutputSurfaceFromMainThread(surface.get()); | 186 data->reflector->ReattachToOutputSurfaceFromMainThread(surface.get()); |
| 171 | 187 |
| 172 return surface.PassAs<cc::OutputSurface>(); | 188 return surface.PassAs<cc::OutputSurface>(); |
| 173 } | 189 } |
| 174 | 190 |
| 175 scoped_refptr<ui::Reflector> GpuProcessTransportFactory::CreateReflector( | 191 scoped_refptr<ui::Reflector> GpuProcessTransportFactory::CreateReflector( |
| 176 ui::Compositor* source, | 192 ui::Compositor* source, |
| 177 ui::Layer* target) { | 193 ui::Layer* target) { |
| 178 PerCompositorData* data = per_compositor_data_[source]; | 194 PerCompositorData* data = per_compositor_data_[source]; |
| 179 DCHECK(data); | 195 DCHECK(data); |
| 180 | 196 |
| 181 data->reflector = new ReflectorImpl( | 197 data->reflector = new ReflectorImpl(source, |
| 182 source, target, &output_surface_map_, data->surface_id); | 198 target, |
| 199 &output_surface_map_, | |
| 200 GetCompositorMessageLoop(), | |
| 201 data->surface_id); | |
| 183 return data->reflector; | 202 return data->reflector; |
| 184 } | 203 } |
| 185 | 204 |
| 186 void GpuProcessTransportFactory::RemoveReflector( | 205 void GpuProcessTransportFactory::RemoveReflector( |
| 187 scoped_refptr<ui::Reflector> reflector) { | 206 scoped_refptr<ui::Reflector> reflector) { |
| 188 ReflectorImpl* reflector_impl = | 207 ReflectorImpl* reflector_impl = |
| 189 static_cast<ReflectorImpl*>(reflector.get()); | 208 static_cast<ReflectorImpl*>(reflector.get()); |
| 190 PerCompositorData* data = | 209 PerCompositorData* data = |
| 191 per_compositor_data_[reflector_impl->mirrored_compositor()]; | 210 per_compositor_data_[reflector_impl->mirrored_compositor()]; |
| 192 DCHECK(data); | 211 DCHECK(data); |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 215 "GLHelper to be created."; | 234 "GLHelper to be created."; |
| 216 } | 235 } |
| 217 } | 236 } |
| 218 | 237 |
| 219 bool GpuProcessTransportFactory::DoesCreateTestContexts() { return false; } | 238 bool GpuProcessTransportFactory::DoesCreateTestContexts() { return false; } |
| 220 | 239 |
| 221 cc::SharedBitmapManager* GpuProcessTransportFactory::GetSharedBitmapManager() { | 240 cc::SharedBitmapManager* GpuProcessTransportFactory::GetSharedBitmapManager() { |
| 222 return HostSharedBitmapManager::current(); | 241 return HostSharedBitmapManager::current(); |
| 223 } | 242 } |
| 224 | 243 |
| 244 base::MessageLoopProxy* GpuProcessTransportFactory::GetCompositorMessageLoop() { | |
| 245 if (!compositor_thread_) | |
| 246 return NULL; | |
| 247 return compositor_thread_->message_loop_proxy(); | |
| 248 } | |
| 249 | |
| 225 gfx::GLSurfaceHandle GpuProcessTransportFactory::GetSharedSurfaceHandle() { | 250 gfx::GLSurfaceHandle GpuProcessTransportFactory::GetSharedSurfaceHandle() { |
| 226 gfx::GLSurfaceHandle handle = gfx::GLSurfaceHandle( | 251 gfx::GLSurfaceHandle handle = gfx::GLSurfaceHandle( |
| 227 gfx::kNullPluginWindow, gfx::TEXTURE_TRANSPORT); | 252 gfx::kNullPluginWindow, gfx::TEXTURE_TRANSPORT); |
| 228 handle.parent_client_id = | 253 handle.parent_client_id = |
| 229 BrowserGpuChannelHostFactory::instance()->GetGpuChannelId(); | 254 BrowserGpuChannelHostFactory::instance()->GetGpuChannelId(); |
| 230 return handle; | 255 return handle; |
| 231 } | 256 } |
| 232 | 257 |
| 233 GLHelper* GpuProcessTransportFactory::GetGLHelper() { | 258 GLHelper* GpuProcessTransportFactory::GetGLHelper() { |
| 234 if (!gl_helper_ && !per_compositor_data_.empty()) { | 259 if (!gl_helper_ && !per_compositor_data_.empty()) { |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 349 FOR_EACH_OBSERVER(ImageTransportFactoryObserver, | 374 FOR_EACH_OBSERVER(ImageTransportFactoryObserver, |
| 350 observer_list_, | 375 observer_list_, |
| 351 OnLostResources()); | 376 OnLostResources()); |
| 352 | 377 |
| 353 // Kill things that use the shared context before killing the shared context. | 378 // Kill things that use the shared context before killing the shared context. |
| 354 lost_gl_helper.reset(); | 379 lost_gl_helper.reset(); |
| 355 lost_shared_main_thread_contexts = NULL; | 380 lost_shared_main_thread_contexts = NULL; |
| 356 } | 381 } |
| 357 | 382 |
| 358 } // namespace content | 383 } // namespace content |
| OLD | NEW |