Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(201)

Side by Side Diff: content/browser/compositor/gpu_process_transport_factory.cc

Issue 2096843002: mus+ash: Enable Chrome HW rendering in mus+ash (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Update Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 #include <utility> 8 #include <utility>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
53 #include "gpu/command_buffer/common/mailbox.h" 53 #include "gpu/command_buffer/common/mailbox.h"
54 #include "gpu/ipc/client/gpu_channel_host.h" 54 #include "gpu/ipc/client/gpu_channel_host.h"
55 #include "third_party/khronos/GLES2/gl2.h" 55 #include "third_party/khronos/GLES2/gl2.h"
56 #include "ui/compositor/compositor.h" 56 #include "ui/compositor/compositor.h"
57 #include "ui/compositor/compositor_constants.h" 57 #include "ui/compositor/compositor_constants.h"
58 #include "ui/compositor/compositor_switches.h" 58 #include "ui/compositor/compositor_switches.h"
59 #include "ui/compositor/layer.h" 59 #include "ui/compositor/layer.h"
60 #include "ui/gfx/geometry/size.h" 60 #include "ui/gfx/geometry/size.h"
61 61
62 #if defined(MOJO_RUNNER_CLIENT) 62 #if defined(MOJO_RUNNER_CLIENT)
63 #include "content/browser/compositor/mus_browser_compositor_output_surface.h"
64 #include "content/public/common/mojo_shell_connection.h"
63 #include "services/shell/runner/common/client_util.h" 65 #include "services/shell/runner/common/client_util.h"
66 #include "services/ui/common/gpu_service.h"
64 #endif 67 #endif
65 68
66 #if defined(OS_WIN) 69 #if defined(OS_WIN)
67 #include "content/browser/compositor/software_output_device_win.h" 70 #include "content/browser/compositor/software_output_device_win.h"
68 #include "ui/gfx/win/rendering_window_manager.h" 71 #include "ui/gfx/win/rendering_window_manager.h"
69 #elif defined(USE_OZONE) 72 #elif defined(USE_OZONE)
70 #include "components/display_compositor/compositor_overlay_candidate_validator_o zone.h" 73 #include "components/display_compositor/compositor_overlay_candidate_validator_o zone.h"
71 #include "content/browser/compositor/software_output_device_ozone.h" 74 #include "content/browser/compositor/software_output_device_ozone.h"
72 #include "ui/ozone/public/overlay_candidates_ozone.h" 75 #include "ui/ozone/public/overlay_candidates_ozone.h"
73 #include "ui/ozone/public/overlay_manager_ozone.h" 76 #include "ui/ozone/public/overlay_manager_ozone.h"
(...skipping 20 matching lines...) Expand all
94 #include "content/browser/compositor/vulkan_browser_compositor_output_surface.h" 97 #include "content/browser/compositor/vulkan_browser_compositor_output_surface.h"
95 #endif 98 #endif
96 99
97 using cc::ContextProvider; 100 using cc::ContextProvider;
98 using gpu::gles2::GLES2Interface; 101 using gpu::gles2::GLES2Interface;
99 102
100 namespace { 103 namespace {
101 104
102 const int kNumRetriesBeforeSoftwareFallback = 4; 105 const int kNumRetriesBeforeSoftwareFallback = 4;
103 106
107 bool IsUsingMus() {
108 #if defined(MOJO_RUNNER_CLIENT)
109 return shell::ShellIsRemote();
110 #else
111 return false;
112 #endif
113 }
114
104 scoped_refptr<content::ContextProviderCommandBuffer> CreateContextCommon( 115 scoped_refptr<content::ContextProviderCommandBuffer> CreateContextCommon(
105 scoped_refptr<gpu::GpuChannelHost> gpu_channel_host, 116 scoped_refptr<gpu::GpuChannelHost> gpu_channel_host,
106 gpu::SurfaceHandle surface_handle, 117 gpu::SurfaceHandle surface_handle,
118 bool need_alpha_channel,
107 bool support_locking, 119 bool support_locking,
108 content::ContextProviderCommandBuffer* shared_context_provider, 120 content::ContextProviderCommandBuffer* shared_context_provider,
109 content::command_buffer_metrics::ContextType type) { 121 content::command_buffer_metrics::ContextType type) {
110 DCHECK( 122 DCHECK(
111 content::GpuDataManagerImpl::GetInstance()->CanUseGpuBrowserCompositor()); 123 content::GpuDataManagerImpl::GetInstance()->CanUseGpuBrowserCompositor());
112 DCHECK(gpu_channel_host); 124 DCHECK(gpu_channel_host);
113 125
114 // This is called from a few places to create different contexts: 126 // This is called from a few places to create different contexts:
115 // - The shared main thread context (offscreen). 127 // - The shared main thread context (offscreen).
116 // - The compositor context, which is used by the browser compositor 128 // - The compositor context, which is used by the browser compositor
117 // (offscreen) for synchronization mostly, and by the display compositor 129 // (offscreen) for synchronization mostly, and by the display compositor
118 // (onscreen) for actual GL drawing. 130 // (onscreen, except for with mus) for actual GL drawing.
119 // - The compositor worker context (offscreen) used for GPU raster. 131 // - The compositor worker context (offscreen) used for GPU raster.
120 // So ask for capabilities needed by any of these cases (we can optimize by 132 // So ask for capabilities needed by any of these cases (we can optimize by
121 // branching on |surface_handle| being null if these needs diverge). 133 // branching on |surface_handle| being null if these needs diverge).
122 // 134 //
123 // The default framebuffer for an offscreen context is not used, so it does 135 // The default framebuffer for an offscreen context is not used, so it does
124 // not need alpha, stencil, depth, antialiasing. The display compositor does 136 // not need alpha, stencil, depth, antialiasing. The display compositor does
125 // not use these things either, so we can request nothing here. 137 // not use these things either, so we can request nothing here.
138 // The display compositor does not use these things either (except for alpha
139 // when using mus for non-opaque ui that overlaps the system's window
140 // borders), so we can request only that when needed.
126 gpu::gles2::ContextCreationAttribHelper attributes; 141 gpu::gles2::ContextCreationAttribHelper attributes;
127 attributes.alpha_size = -1; 142 attributes.alpha_size = need_alpha_channel ? 8 : -1;
128 attributes.depth_size = 0; 143 attributes.depth_size = 0;
129 attributes.stencil_size = 0; 144 attributes.stencil_size = 0;
130 attributes.samples = 0; 145 attributes.samples = 0;
131 attributes.sample_buffers = 0; 146 attributes.sample_buffers = 0;
132 attributes.bind_generates_resource = false; 147 attributes.bind_generates_resource = false;
133 attributes.lose_context_when_out_of_memory = true; 148 attributes.lose_context_when_out_of_memory = true;
149 attributes.buffer_preserved = false;
134 150
135 constexpr bool automatic_flushes = false; 151 constexpr bool automatic_flushes = false;
136 152
137 GURL url("chrome://gpu/GpuProcessTransportFactory::CreateContextCommon"); 153 GURL url("chrome://gpu/GpuProcessTransportFactory::CreateContextCommon");
138 return make_scoped_refptr(new content::ContextProviderCommandBuffer( 154 return make_scoped_refptr(new content::ContextProviderCommandBuffer(
139 std::move(gpu_channel_host), gpu::GPU_STREAM_DEFAULT, 155 std::move(gpu_channel_host), gpu::GPU_STREAM_DEFAULT,
140 gpu::GpuStreamPriority::NORMAL, surface_handle, url, automatic_flushes, 156 gpu::GpuStreamPriority::NORMAL, surface_handle, url, automatic_flushes,
141 support_locking, gpu::SharedMemoryLimits(), attributes, 157 support_locking, gpu::SharedMemoryLimits(), attributes,
142 shared_context_provider, type)); 158 shared_context_provider, type));
143 } 159 }
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
247 #elif defined(OS_ANDROID) 263 #elif defined(OS_ANDROID)
248 validator.reset( 264 validator.reset(
249 new display_compositor::CompositorOverlayCandidateValidatorAndroid()); 265 new display_compositor::CompositorOverlayCandidateValidatorAndroid());
250 #endif 266 #endif
251 267
252 return validator; 268 return validator;
253 } 269 }
254 270
255 static bool ShouldCreateGpuOutputSurface(ui::Compositor* compositor) { 271 static bool ShouldCreateGpuOutputSurface(ui::Compositor* compositor) {
256 #if defined(MOJO_RUNNER_CLIENT) 272 #if defined(MOJO_RUNNER_CLIENT)
257 // Chrome running as a mojo app currently can only use software compositing. 273 if (shell::ShellIsRemote() && !ui::GpuService::UseChromeGpuCommandBuffer())
258 // TODO(rjkroege): http://crbug.com/548451
259 if (shell::ShellIsRemote()) {
260 return false; 274 return false;
261 }
262 #endif 275 #endif
263 276
264 #if defined(OS_CHROMEOS) 277 #if defined(OS_CHROMEOS)
265 // Software fallback does not happen on Chrome OS. 278 // Software fallback does not happen on Chrome OS.
266 return true; 279 return true;
267 #endif 280 #endif
268 281
269 #if defined(OS_WIN) 282 #if defined(OS_WIN)
270 if (::GetProp(compositor->widget(), kForceSoftwareCompositor) && 283 if (::GetProp(compositor->widget(), kForceSoftwareCompositor) &&
271 ::RemoveProp(compositor->widget(), kForceSoftwareCompositor)) 284 ::RemoveProp(compositor->widget(), kForceSoftwareCompositor))
(...skipping 15 matching lines...) Expand all
287 data->display_output_surface = nullptr; 300 data->display_output_surface = nullptr;
288 data->begin_frame_source = nullptr; 301 data->begin_frame_source = nullptr;
289 } 302 }
290 303
291 #if defined(OS_WIN) 304 #if defined(OS_WIN)
292 gfx::RenderingWindowManager::GetInstance()->UnregisterParent( 305 gfx::RenderingWindowManager::GetInstance()->UnregisterParent(
293 compositor->widget()); 306 compositor->widget());
294 #endif 307 #endif
295 308
296 const bool use_vulkan = static_cast<bool>(SharedVulkanContextProvider()); 309 const bool use_vulkan = static_cast<bool>(SharedVulkanContextProvider());
297 310 const bool use_mus = IsUsingMus();
298 const bool create_gpu_output_surface = 311 const bool create_gpu_output_surface =
299 ShouldCreateGpuOutputSurface(compositor.get()); 312 ShouldCreateGpuOutputSurface(compositor.get());
300 if (create_gpu_output_surface && !use_vulkan) { 313 if (create_gpu_output_surface && !use_vulkan) {
301 BrowserGpuChannelHostFactory::instance()->EstablishGpuChannel( 314 base::Closure callback(
302 CAUSE_FOR_GPU_LAUNCH_SHARED_WORKER_THREAD_CONTEXT,
303 base::Bind(&GpuProcessTransportFactory::EstablishedGpuChannel, 315 base::Bind(&GpuProcessTransportFactory::EstablishedGpuChannel,
304 callback_factory_.GetWeakPtr(), compositor, 316 callback_factory_.GetWeakPtr(), compositor,
305 create_gpu_output_surface, 0)); 317 create_gpu_output_surface, 0));
318 if (!use_mus) {
319 BrowserGpuChannelHostFactory::instance()->EstablishGpuChannel(
320 CAUSE_FOR_GPU_LAUNCH_SHARED_WORKER_THREAD_CONTEXT, callback);
321 } else {
322 #if defined(MOJO_RUNNER_CLIENT)
323 ui::GpuService::GetInstance()->EstablishGpuChannel(callback);
324 #else
325 NOTREACHED();
326 #endif
327 }
306 } else { 328 } else {
307 EstablishedGpuChannel(compositor, create_gpu_output_surface, 0); 329 EstablishedGpuChannel(compositor, create_gpu_output_surface, 0);
308 } 330 }
309 } 331 }
310 332
311 void GpuProcessTransportFactory::EstablishedGpuChannel( 333 void GpuProcessTransportFactory::EstablishedGpuChannel(
312 base::WeakPtr<ui::Compositor> compositor, 334 base::WeakPtr<ui::Compositor> compositor,
313 bool create_gpu_output_surface, 335 bool create_gpu_output_surface,
314 int num_attempts) { 336 int num_attempts) {
315 if (!compositor) 337 if (!compositor)
(...skipping 16 matching lines...) Expand all
332 create_gpu_output_surface = false; 354 create_gpu_output_surface = false;
333 } 355 }
334 356
335 #if defined(OS_WIN) 357 #if defined(OS_WIN)
336 gfx::RenderingWindowManager::GetInstance()->RegisterParent( 358 gfx::RenderingWindowManager::GetInstance()->RegisterParent(
337 compositor->widget()); 359 compositor->widget());
338 #endif 360 #endif
339 361
340 scoped_refptr<cc::VulkanInProcessContextProvider> vulkan_context_provider = 362 scoped_refptr<cc::VulkanInProcessContextProvider> vulkan_context_provider =
341 SharedVulkanContextProvider(); 363 SharedVulkanContextProvider();
342 364 const bool use_mus = IsUsingMus();
343 scoped_refptr<ContextProviderCommandBuffer> context_provider; 365 scoped_refptr<ContextProviderCommandBuffer> context_provider;
344 if (create_gpu_output_surface && !vulkan_context_provider) { 366 if (create_gpu_output_surface && !vulkan_context_provider) {
345 // Try to reuse existing worker context provider. 367 // Try to reuse existing worker context provider.
346 if (shared_worker_context_provider_) { 368 if (shared_worker_context_provider_) {
347 bool lost; 369 bool lost;
348 { 370 {
349 // Note: If context is lost, we delete reference after releasing the 371 // Note: If context is lost, we delete reference after releasing the
350 // lock. 372 // lock.
351 base::AutoLock lock(*shared_worker_context_provider_->GetLock()); 373 base::AutoLock lock(*shared_worker_context_provider_->GetLock());
352 lost = shared_worker_context_provider_->ContextGL() 374 lost = shared_worker_context_provider_->ContextGL()
353 ->GetGraphicsResetStatusKHR() != GL_NO_ERROR; 375 ->GetGraphicsResetStatusKHR() != GL_NO_ERROR;
354 } 376 }
355 if (lost) 377 if (lost)
356 shared_worker_context_provider_ = nullptr; 378 shared_worker_context_provider_ = nullptr;
357 } 379 }
358 380
359 scoped_refptr<gpu::GpuChannelHost> gpu_channel_host; 381 scoped_refptr<gpu::GpuChannelHost> gpu_channel_host;
360 if (GpuDataManagerImpl::GetInstance()->CanUseGpuBrowserCompositor()) { 382 if (GpuDataManagerImpl::GetInstance()->CanUseGpuBrowserCompositor()) {
361 // We attempted to do EstablishGpuChannel already, so we just use 383 // We attempted to do EstablishGpuChannel already, so we just use
362 // GetGpuChannel() instead of EstablishGpuChannelSync(). 384 // GetGpuChannel() instead of EstablishGpuChannelSync().
363 gpu_channel_host = 385 if (!use_mus) {
364 BrowserGpuChannelHostFactory::instance()->GetGpuChannel(); 386 gpu_channel_host =
387 BrowserGpuChannelHostFactory::instance()->GetGpuChannel();
388 } else {
389 #if defined(MOJO_RUNNER_CLIENT)
390 gpu_channel_host = ui::GpuService::GetInstance()->GetGpuChannel();
391 #else
392 NOTREACHED();
393 #endif
394 }
365 } 395 }
366 396
367 if (!gpu_channel_host) { 397 if (!gpu_channel_host) {
368 shared_worker_context_provider_ = nullptr; 398 shared_worker_context_provider_ = nullptr;
369 } else { 399 } else {
370 if (!shared_worker_context_provider_) { 400 if (!shared_worker_context_provider_) {
401 bool need_alpha_channel = false;
371 const bool support_locking = true; 402 const bool support_locking = true;
372 shared_worker_context_provider_ = CreateContextCommon( 403 shared_worker_context_provider_ =
373 gpu_channel_host, gpu::kNullSurfaceHandle, support_locking, nullptr, 404 CreateContextCommon(gpu_channel_host, gpu::kNullSurfaceHandle,
374 command_buffer_metrics::BROWSER_WORKER_CONTEXT); 405 need_alpha_channel, support_locking, nullptr,
406 command_buffer_metrics::BROWSER_WORKER_CONTEXT);
375 // TODO(vadimt): Remove ScopedTracker below once crbug.com/125248 is 407 // TODO(vadimt): Remove ScopedTracker below once crbug.com/125248 is
376 // fixed. Tracking time in BindToCurrentThread. 408 // fixed. Tracking time in BindToCurrentThread.
377 tracked_objects::ScopedTracker tracking_profile( 409 tracked_objects::ScopedTracker tracking_profile(
378 FROM_HERE_WITH_EXPLICIT_FUNCTION( 410 FROM_HERE_WITH_EXPLICIT_FUNCTION(
379 "125248" 411 "125248"
380 " GpuProcessTransportFactory::EstablishedGpuChannel" 412 " GpuProcessTransportFactory::EstablishedGpuChannel"
381 "::Worker")); 413 "::Worker"));
382 if (!shared_worker_context_provider_->BindToCurrentThread()) 414 if (!shared_worker_context_provider_->BindToCurrentThread())
383 shared_worker_context_provider_ = nullptr; 415 shared_worker_context_provider_ = nullptr;
384 } 416 }
385 417
386 // The |context_provider| is used for both the browser compositor and the 418 // The |context_provider| is used for both the browser compositor and the
387 // display compositor. It shares resources with the worker context, so if 419 // display compositor. It shares resources with the worker context, so if
388 // we failed to make a worker context, just start over and try again. 420 // we failed to make a worker context, just start over and try again.
389 if (shared_worker_context_provider_) { 421 if (shared_worker_context_provider_) {
422 // For mus, we create an offscreen context for a mus window, and we will
423 // use CommandBufferProxyImpl::TakeFrontBuffer() to take the context's
424 // front buffer into a mailbox, insert a sync token, and send the
425 // mailbox+sync to the ui service process.
426 gpu::SurfaceHandle surface_handle =
427 IsUsingMus() ? gpu::kNullSurfaceHandle : data->surface_handle;
428 bool need_alpha_channel = IsUsingMus();
390 bool support_locking = false; 429 bool support_locking = false;
391 context_provider = CreateContextCommon( 430 context_provider = CreateContextCommon(
392 std::move(gpu_channel_host), data->surface_handle, support_locking, 431 std::move(gpu_channel_host), surface_handle, need_alpha_channel,
393 shared_worker_context_provider_.get(), 432 support_locking, shared_worker_context_provider_.get(),
394 command_buffer_metrics::DISPLAY_COMPOSITOR_ONSCREEN_CONTEXT); 433 command_buffer_metrics::DISPLAY_COMPOSITOR_ONSCREEN_CONTEXT);
395 // TODO(vadimt): Remove ScopedTracker below once crbug.com/125248 is 434 // TODO(vadimt): Remove ScopedTracker below once crbug.com/125248 is
396 // fixed. Tracking time in BindToCurrentThread. 435 // fixed. Tracking time in BindToCurrentThread.
397 tracked_objects::ScopedTracker tracking_profile( 436 tracked_objects::ScopedTracker tracking_profile(
398 FROM_HERE_WITH_EXPLICIT_FUNCTION( 437 FROM_HERE_WITH_EXPLICIT_FUNCTION(
399 "125248" 438 "125248"
400 " GpuProcessTransportFactory::EstablishedGpuChannel" 439 " GpuProcessTransportFactory::EstablishedGpuChannel"
401 "::Compositor")); 440 "::Compositor"));
402 #if defined(OS_MACOSX) 441 #if defined(OS_MACOSX)
403 // On Mac, GpuCommandBufferMsg_SwapBuffersCompleted must be handled in 442 // On Mac, GpuCommandBufferMsg_SwapBuffersCompleted must be handled in
404 // a nested message loop during resize. 443 // a nested message loop during resize.
405 context_provider->SetDefaultTaskRunner( 444 context_provider->SetDefaultTaskRunner(
406 ui::WindowResizeHelperMac::Get()->task_runner()); 445 ui::WindowResizeHelperMac::Get()->task_runner());
407 #endif 446 #endif
408 if (!context_provider->BindToCurrentThread()) 447 if (!context_provider->BindToCurrentThread())
409 context_provider = nullptr; 448 context_provider = nullptr;
410 } 449 }
411 } 450 }
412 451
413 bool created_gpu_browser_compositor = 452 bool created_gpu_browser_compositor =
414 !!context_provider && !!shared_worker_context_provider_; 453 !!context_provider && !!shared_worker_context_provider_;
415 454
416 UMA_HISTOGRAM_BOOLEAN("Aura.CreatedGpuBrowserCompositor", 455 UMA_HISTOGRAM_BOOLEAN("Aura.CreatedGpuBrowserCompositor",
417 created_gpu_browser_compositor); 456 created_gpu_browser_compositor);
418 457
419 if (!created_gpu_browser_compositor) { 458 if (!created_gpu_browser_compositor) {
420 // Try again. 459 // Try again.
421 BrowserGpuChannelHostFactory::instance()->EstablishGpuChannel( 460 base::Closure callback(
422 CAUSE_FOR_GPU_LAUNCH_SHARED_WORKER_THREAD_CONTEXT,
423 base::Bind(&GpuProcessTransportFactory::EstablishedGpuChannel, 461 base::Bind(&GpuProcessTransportFactory::EstablishedGpuChannel,
424 callback_factory_.GetWeakPtr(), compositor, 462 callback_factory_.GetWeakPtr(), compositor,
425 create_gpu_output_surface, num_attempts + 1)); 463 create_gpu_output_surface, num_attempts + 1));
464 if (!use_mus) {
465 BrowserGpuChannelHostFactory::instance()->EstablishGpuChannel(
466 CAUSE_FOR_GPU_LAUNCH_SHARED_WORKER_THREAD_CONTEXT, callback);
467 } else {
468 #if defined(MOJO_RUNNER_CLIENT)
469 ui::GpuService::GetInstance()->EstablishGpuChannel(callback);
470 #else
471 NOTREACHED();
472 #endif
473 }
426 return; 474 return;
427 } 475 }
428 } 476 }
429 477
430 std::unique_ptr<cc::SyntheticBeginFrameSource> begin_frame_source; 478 std::unique_ptr<cc::SyntheticBeginFrameSource> begin_frame_source;
431 if (!compositor->GetRendererSettings().disable_display_vsync) { 479 if (!compositor->GetRendererSettings().disable_display_vsync) {
432 begin_frame_source.reset(new cc::DelayBasedBeginFrameSource( 480 begin_frame_source.reset(new cc::DelayBasedBeginFrameSource(
433 base::MakeUnique<cc::DelayBasedTimeSource>( 481 base::MakeUnique<cc::DelayBasedTimeSource>(
434 compositor->task_runner().get()))); 482 compositor->task_runner().get())));
435 } else { 483 } else {
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
484 compositor->vsync_manager(), begin_frame_source.get(), 532 compositor->vsync_manager(), begin_frame_source.get(),
485 CreateOverlayCandidateValidator(compositor->widget()), 533 CreateOverlayCandidateValidator(compositor->widget()),
486 GL_TEXTURE_2D, GL_RGB, 534 GL_TEXTURE_2D, GL_RGB,
487 BrowserGpuMemoryBufferManager::current())); 535 BrowserGpuMemoryBufferManager::current()));
488 #endif 536 #endif
489 } else { 537 } else {
490 std::unique_ptr<display_compositor::CompositorOverlayCandidateValidator> 538 std::unique_ptr<display_compositor::CompositorOverlayCandidateValidator>
491 validator; 539 validator;
492 #if !defined(OS_MACOSX) 540 #if !defined(OS_MACOSX)
493 // Overlays are only supported on surfaceless output surfaces on Mac. 541 // Overlays are only supported on surfaceless output surfaces on Mac.
494 validator = CreateOverlayCandidateValidator(compositor->widget()); 542 if (!use_mus)
543 validator = CreateOverlayCandidateValidator(compositor->widget());
495 #endif 544 #endif
496 display_output_surface = 545 if (!use_mus) {
497 base::WrapUnique(new GpuBrowserCompositorOutputSurface( 546 display_output_surface =
498 context_provider, compositor->vsync_manager(), 547 base::WrapUnique(new GpuBrowserCompositorOutputSurface(
499 begin_frame_source.get(), std::move(validator))); 548 context_provider, compositor->vsync_manager(),
549 begin_frame_source.get(), std::move(validator)));
550 } else {
551 #if defined(MOJO_RUNNER_CLIENT)
552 display_output_surface =
553 base::WrapUnique(new MusBrowserCompositorOutputSurface(
554 data->surface_handle, context_provider,
555 compositor->vsync_manager(), begin_frame_source.get(),
556 std::move(validator)));
557 #else
558 NOTREACHED();
559 #endif
560 }
500 } 561 }
501 } 562 }
502 } 563 }
503 564
504 data->display_output_surface = display_output_surface.get(); 565 data->display_output_surface = display_output_surface.get();
505 data->begin_frame_source = begin_frame_source.get(); 566 data->begin_frame_source = begin_frame_source.get();
506 if (data->reflector) 567 if (data->reflector)
507 data->reflector->OnSourceSurfaceReady(data->display_output_surface); 568 data->reflector->OnSourceSurfaceReady(data->display_output_surface);
508 569
509 #if defined(OS_WIN) 570 #if defined(OS_WIN)
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after
725 } 786 }
726 #endif 787 #endif
727 788
728 scoped_refptr<cc::ContextProvider> 789 scoped_refptr<cc::ContextProvider>
729 GpuProcessTransportFactory::SharedMainThreadContextProvider() { 790 GpuProcessTransportFactory::SharedMainThreadContextProvider() {
730 if (shared_main_thread_contexts_) 791 if (shared_main_thread_contexts_)
731 return shared_main_thread_contexts_; 792 return shared_main_thread_contexts_;
732 793
733 if (!GpuDataManagerImpl::GetInstance()->CanUseGpuBrowserCompositor()) 794 if (!GpuDataManagerImpl::GetInstance()->CanUseGpuBrowserCompositor())
734 return nullptr; 795 return nullptr;
735 scoped_refptr<gpu::GpuChannelHost> gpu_channel_host( 796
736 BrowserGpuChannelHostFactory::instance()->EstablishGpuChannelSync( 797 const bool use_mus = IsUsingMus();
737 CAUSE_FOR_GPU_LAUNCH_BROWSER_SHARED_MAIN_THREAD_CONTEXT)); 798 scoped_refptr<gpu::GpuChannelHost> gpu_channel_host;
799 if (!use_mus) {
800 gpu_channel_host =
801 BrowserGpuChannelHostFactory::instance()->EstablishGpuChannelSync(
802 CAUSE_FOR_GPU_LAUNCH_BROWSER_SHARED_MAIN_THREAD_CONTEXT);
803 } else {
804 #if defined(MOJO_RUNNER_CLIENT)
805 gpu_channel_host = ui::GpuService::GetInstance()->EstablishGpuChannelSync();
806 #else
807 NOTREACHED();
808 #endif
809 }
810
738 if (!gpu_channel_host) 811 if (!gpu_channel_host)
739 return nullptr; 812 return nullptr;
740 813
741 // We need a separate context from the compositor's so that skia and gl_helper 814 // We need a separate context from the compositor's so that skia and gl_helper
742 // don't step on each other. 815 // don't step on each other.
816 bool need_alpha_channel = false;
743 bool support_locking = false; 817 bool support_locking = false;
744 shared_main_thread_contexts_ = CreateContextCommon( 818 shared_main_thread_contexts_ = CreateContextCommon(
745 std::move(gpu_channel_host), gpu::kNullSurfaceHandle, support_locking, 819 std::move(gpu_channel_host), gpu::kNullSurfaceHandle, need_alpha_channel,
746 nullptr, command_buffer_metrics::BROWSER_OFFSCREEN_MAINTHREAD_CONTEXT); 820 support_locking, nullptr,
821 command_buffer_metrics::BROWSER_OFFSCREEN_MAINTHREAD_CONTEXT);
747 shared_main_thread_contexts_->SetLostContextCallback(base::Bind( 822 shared_main_thread_contexts_->SetLostContextCallback(base::Bind(
748 &GpuProcessTransportFactory::OnLostMainThreadSharedContextInsideCallback, 823 &GpuProcessTransportFactory::OnLostMainThreadSharedContextInsideCallback,
749 callback_factory_.GetWeakPtr())); 824 callback_factory_.GetWeakPtr()));
750 // TODO(vadimt): Remove ScopedTracker below once crbug.com/125248 is 825 // TODO(vadimt): Remove ScopedTracker below once crbug.com/125248 is
751 // fixed. Tracking time in BindToCurrentThread. 826 // fixed. Tracking time in BindToCurrentThread.
752 tracked_objects::ScopedTracker tracking_profile( 827 tracked_objects::ScopedTracker tracking_profile(
753 FROM_HERE_WITH_EXPLICIT_FUNCTION( 828 FROM_HERE_WITH_EXPLICIT_FUNCTION(
754 "125248" 829 "125248"
755 " GpuProcessTransportFactory::SharedMainThreadContextProvider")); 830 " GpuProcessTransportFactory::SharedMainThreadContextProvider"));
756 if (!shared_main_thread_contexts_->BindToCurrentThread()) 831 if (!shared_main_thread_contexts_->BindToCurrentThread())
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
819 shared_vulkan_context_provider_ = 894 shared_vulkan_context_provider_ =
820 cc::VulkanInProcessContextProvider::Create(); 895 cc::VulkanInProcessContextProvider::Create();
821 } 896 }
822 897
823 shared_vulkan_context_provider_initialized_ = true; 898 shared_vulkan_context_provider_initialized_ = true;
824 } 899 }
825 return shared_vulkan_context_provider_; 900 return shared_vulkan_context_provider_;
826 } 901 }
827 902
828 } // namespace content 903 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/compositor/DEPS ('k') | content/browser/compositor/mus_browser_compositor_output_surface.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698