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

Side by Side Diff: content/browser/renderer_host/compositor_impl_android.cc

Issue 2337913003: Fork cc::OutputSurface into cc::CompositorFrameSink. (Closed)
Patch Set: cfsfork: rebase Created 4 years, 3 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 (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/renderer_host/compositor_impl_android.h" 5 #include "content/browser/renderer_host/compositor_impl_android.h"
6 6
7 #include <android/bitmap.h> 7 #include <android/bitmap.h>
8 #include <android/native_window_jni.h> 8 #include <android/native_window_jni.h>
9 #include <stdint.h> 9 #include <stdint.h>
10 #include <unordered_set> 10 #include <unordered_set>
(...skipping 23 matching lines...) Expand all
34 #include "cc/layers/layer.h" 34 #include "cc/layers/layer.h"
35 #include "cc/output/compositor_frame.h" 35 #include "cc/output/compositor_frame.h"
36 #include "cc/output/context_provider.h" 36 #include "cc/output/context_provider.h"
37 #include "cc/output/output_surface.h" 37 #include "cc/output/output_surface.h"
38 #include "cc/output/output_surface_client.h" 38 #include "cc/output/output_surface_client.h"
39 #include "cc/output/texture_mailbox_deleter.h" 39 #include "cc/output/texture_mailbox_deleter.h"
40 #include "cc/output/vulkan_in_process_context_provider.h" 40 #include "cc/output/vulkan_in_process_context_provider.h"
41 #include "cc/raster/single_thread_task_graph_runner.h" 41 #include "cc/raster/single_thread_task_graph_runner.h"
42 #include "cc/resources/ui_resource_manager.h" 42 #include "cc/resources/ui_resource_manager.h"
43 #include "cc/scheduler/begin_frame_source.h" 43 #include "cc/scheduler/begin_frame_source.h"
44 #include "cc/surfaces/direct_compositor_frame_sink.h"
44 #include "cc/surfaces/display.h" 45 #include "cc/surfaces/display.h"
45 #include "cc/surfaces/display_scheduler.h" 46 #include "cc/surfaces/display_scheduler.h"
46 #include "cc/surfaces/surface_display_output_surface.h"
47 #include "cc/surfaces/surface_id_allocator.h" 47 #include "cc/surfaces/surface_id_allocator.h"
48 #include "cc/trees/layer_tree_host.h" 48 #include "cc/trees/layer_tree_host.h"
49 #include "cc/trees/layer_tree_settings.h" 49 #include "cc/trees/layer_tree_settings.h"
50 #include "components/display_compositor/compositor_overlay_candidate_validator_a ndroid.h" 50 #include "components/display_compositor/compositor_overlay_candidate_validator_a ndroid.h"
51 #include "components/display_compositor/gl_helper.h" 51 #include "components/display_compositor/gl_helper.h"
52 #include "content/browser/android/child_process_launcher_android.h" 52 #include "content/browser/android/child_process_launcher_android.h"
53 #include "content/browser/gpu/browser_gpu_memory_buffer_manager.h" 53 #include "content/browser/gpu/browser_gpu_memory_buffer_manager.h"
54 #include "content/browser/gpu/compositor_util.h" 54 #include "content/browser/gpu/compositor_util.h"
55 #include "content/browser/gpu/gpu_surface_tracker.h" 55 #include "content/browser/gpu/gpu_surface_tracker.h"
56 #include "content/browser/renderer_host/context_provider_factory_impl_android.h" 56 #include "content/browser/renderer_host/context_provider_factory_impl_android.h"
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
205 base::TimeTicks deadline = frame_time + vsync_period; 205 base::TimeTicks deadline = frame_time + vsync_period;
206 last_begin_frame_args_ = 206 last_begin_frame_args_ =
207 cc::BeginFrameArgs::Create(BEGINFRAME_FROM_HERE, frame_time, deadline, 207 cc::BeginFrameArgs::Create(BEGINFRAME_FROM_HERE, frame_time, deadline,
208 vsync_period, cc::BeginFrameArgs::NORMAL); 208 vsync_period, cc::BeginFrameArgs::NORMAL);
209 std::unordered_set<cc::BeginFrameObserver*> observers(observers_); 209 std::unordered_set<cc::BeginFrameObserver*> observers(observers_);
210 for (auto* obs : observers) 210 for (auto* obs : observers)
211 obs->OnBeginFrame(last_begin_frame_args_); 211 obs->OnBeginFrame(last_begin_frame_args_);
212 } 212 }
213 213
214 // Used to override capabilities_.adjust_deadline_for_parent to false 214 // Used to override capabilities_.adjust_deadline_for_parent to false
215 class OutputSurfaceWithoutParent : public cc::OutputSurface { 215 class AndroidOutputSurface : public cc::OutputSurface {
216 public: 216 public:
217 OutputSurfaceWithoutParent( 217 AndroidOutputSurface(
218 scoped_refptr<ContextProviderCommandBuffer> context_provider, 218 scoped_refptr<ContextProviderCommandBuffer> context_provider,
219 const base::Callback<void(gpu::Capabilities)>& 219 const base::Callback<void(gpu::Capabilities)>&
220 populate_gpu_capabilities_callback) 220 populate_gpu_capabilities_callback)
221 : cc::OutputSurface(std::move(context_provider), nullptr, nullptr), 221 : cc::OutputSurface(std::move(context_provider), nullptr, nullptr),
222 populate_gpu_capabilities_callback_(populate_gpu_capabilities_callback), 222 populate_gpu_capabilities_callback_(populate_gpu_capabilities_callback),
223 swap_buffers_completion_callback_( 223 swap_buffers_completion_callback_(
224 base::Bind(&OutputSurfaceWithoutParent::OnSwapBuffersCompleted, 224 base::Bind(&AndroidOutputSurface::OnSwapBuffersCompleted,
225 base::Unretained(this))), 225 base::Unretained(this))),
226 overlay_candidate_validator_( 226 overlay_candidate_validator_(
227 new display_compositor:: 227 new display_compositor::
228 CompositorOverlayCandidateValidatorAndroid()) { 228 CompositorOverlayCandidateValidatorAndroid()) {
229 capabilities_.adjust_deadline_for_parent = false; 229 capabilities_.adjust_deadline_for_parent = false;
230 capabilities_.max_frames_pending = kMaxDisplaySwapBuffers; 230 capabilities_.max_frames_pending = kMaxDisplaySwapBuffers;
231 } 231 }
232 232
233 ~OutputSurfaceWithoutParent() override = default; 233 ~AndroidOutputSurface() override = default;
234 234
235 void SwapBuffers(cc::CompositorFrame frame) override { 235 void SwapBuffers(cc::CompositorFrame frame) override {
236 GetCommandBufferProxy()->SetLatencyInfo(frame.metadata.latency_info); 236 GetCommandBufferProxy()->SetLatencyInfo(frame.metadata.latency_info);
237 if (frame.gl_frame_data->sub_buffer_rect.IsEmpty()) { 237 if (frame.gl_frame_data->sub_buffer_rect.IsEmpty()) {
238 context_provider_->ContextSupport()->CommitOverlayPlanes(); 238 context_provider_->ContextSupport()->CommitOverlayPlanes();
239 } else { 239 } else {
240 DCHECK(frame.gl_frame_data->sub_buffer_rect == 240 DCHECK(frame.gl_frame_data->sub_buffer_rect ==
241 gfx::Rect(frame.gl_frame_data->size)); 241 gfx::Rect(frame.gl_frame_data->size));
242 context_provider_->ContextSupport()->Swap(); 242 context_provider_->ContextSupport()->Swap();
243 } 243 }
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
287 base::Callback<void(gpu::Capabilities)> populate_gpu_capabilities_callback_; 287 base::Callback<void(gpu::Capabilities)> populate_gpu_capabilities_callback_;
288 base::CancelableCallback<void( 288 base::CancelableCallback<void(
289 const std::vector<ui::LatencyInfo>&, 289 const std::vector<ui::LatencyInfo>&,
290 gfx::SwapResult, 290 gfx::SwapResult,
291 const gpu::GpuProcessHostedCALayerTreeParamsMac* params_mac)> 291 const gpu::GpuProcessHostedCALayerTreeParamsMac* params_mac)>
292 swap_buffers_completion_callback_; 292 swap_buffers_completion_callback_;
293 std::unique_ptr<cc::OverlayCandidateValidator> overlay_candidate_validator_; 293 std::unique_ptr<cc::OverlayCandidateValidator> overlay_candidate_validator_;
294 }; 294 };
295 295
296 #if defined(ENABLE_VULKAN) 296 #if defined(ENABLE_VULKAN)
297 class VulkanOutputSurface : public cc::OutputSurface { 297 class VulkanOutputSurface : public cc::CompositorFrameSink {
298 public: 298 public:
299 explicit VulkanOutputSurface( 299 explicit VulkanOutputSurface(
300 scoped_refptr<cc::VulkanContextProvider> vulkan_context_provider) 300 scoped_refptr<cc::VulkanContextProvider> vulkan_context_provider)
301 : OutputSurface(std::move(vulkan_context_provider)) {} 301 : CompositorFrameSink(std::move(vulkan_context_provider)) {}
302 302
303 ~VulkanOutputSurface() override { Destroy(); } 303 ~VulkanOutputSurface() override { Destroy(); }
304 304
305 bool Initialize(gfx::AcceleratedWidget widget) { 305 bool Initialize(gfx::AcceleratedWidget widget) {
306 DCHECK(!surface_); 306 DCHECK(!surface_);
307 std::unique_ptr<gpu::VulkanSurface> surface( 307 std::unique_ptr<gpu::VulkanSurface> surface(
308 gpu::VulkanSurface::CreateViewSurface(widget)); 308 gpu::VulkanSurface::CreateViewSurface(widget));
309 if (!surface->Initialize(vulkan_context_provider()->GetDeviceQueue(), 309 if (!surface->Initialize(vulkan_context_provider()->GetDeviceQueue(),
310 gpu::VulkanSurface::DEFAULT_SURFACE_FORMAT)) { 310 gpu::VulkanSurface::DEFAULT_SURFACE_FORMAT)) {
311 return false; 311 return false;
312 } 312 }
313 surface_ = std::move(surface); 313 surface_ = std::move(surface);
314 314
315 return true; 315 return true;
316 } 316 }
317 317
318 bool BindToClient(cc::OutputSurfaceClient* client) override { 318 bool BindToClient(cc::CompositorFrameSinkClient* client) override {
319 if (!OutputSurface::BindToClient(client)) 319 if (!CompositorFrameSink::BindToClient(client))
320 return false; 320 return false;
321 return true; 321 return true;
322 } 322 }
323 323
324 void SwapBuffers(cc::CompositorFrame frame) override { 324 void SwapBuffers(cc::CompositorFrame frame) override {
325 surface_->SwapBuffers(); 325 surface_->SwapBuffers();
326 PostSwapBuffersComplete(); 326 PostSwapBuffersComplete();
327 } 327 }
328 328
329 void Destroy() { 329 void Destroy() {
330 if (surface_) { 330 if (surface_) {
331 surface_->Destroy(); 331 surface_->Destroy();
332 surface_.reset(); 332 surface_.reset();
333 } 333 }
334 } 334 }
335 335
336 void OnSwapBuffersCompleted(const std::vector<ui::LatencyInfo>& latency_info, 336 void OnSwapBuffersCompleted(const std::vector<ui::LatencyInfo>& latency_info,
337 gfx::SwapResult result) { 337 gfx::SwapResult result) {
338 RenderWidgetHostImpl::CompositorFrameDrawn(latency_info); 338 RenderWidgetHostImpl::CompositorFrameDrawn(latency_info);
339 OutputSurface::OnSwapBuffersComplete(); 339 CompositorFrameSink::OnSwapBuffersComplete();
340 } 340 }
341 341
342 private: 342 private:
343 std::unique_ptr<gpu::VulkanSurface> surface_; 343 std::unique_ptr<gpu::VulkanSurface> surface_;
344 344
345 DISALLOW_COPY_AND_ASSIGN(VulkanOutputSurface); 345 DISALLOW_COPY_AND_ASSIGN(VulkanOutputSurface);
346 }; 346 };
347 #endif 347 #endif
348 348
349 static bool g_initialized = false; 349 static bool g_initialized = false;
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
389 resource_manager_(root_window), 389 resource_manager_(root_window),
390 has_transparent_background_(false), 390 has_transparent_background_(false),
391 device_scale_factor_(1), 391 device_scale_factor_(1),
392 window_(NULL), 392 window_(NULL),
393 surface_handle_(gpu::kNullSurfaceHandle), 393 surface_handle_(gpu::kNullSurfaceHandle),
394 client_(client), 394 client_(client),
395 root_window_(root_window), 395 root_window_(root_window),
396 needs_animate_(false), 396 needs_animate_(false),
397 pending_swapbuffers_(0U), 397 pending_swapbuffers_(0U),
398 num_successive_context_creation_failures_(0), 398 num_successive_context_creation_failures_(0),
399 output_surface_request_pending_(false), 399 compositor_frame_sink_request_pending_(false),
400 needs_begin_frames_(false), 400 needs_begin_frames_(false),
401 weak_factory_(this) { 401 weak_factory_(this) {
402 ui::ContextProviderFactory::GetInstance() 402 ui::ContextProviderFactory::GetInstance()
403 ->GetSurfaceManager() 403 ->GetSurfaceManager()
404 ->RegisterSurfaceClientId(surface_id_allocator_->client_id()); 404 ->RegisterSurfaceClientId(surface_id_allocator_->client_id());
405 DCHECK(client); 405 DCHECK(client);
406 DCHECK(root_window); 406 DCHECK(root_window);
407 DCHECK(root_window->GetLayer() == nullptr); 407 DCHECK(root_window->GetLayer() == nullptr);
408 root_window->SetLayer(cc::Layer::Create()); 408 root_window->SetLayer(cc::Layer::Create());
409 readback_layer_tree_ = cc::Layer::Create(); 409 readback_layer_tree_ = cc::Layer::Create();
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
465 // ANativeWindow_fromSurface are released immediately. This is needed as a 465 // ANativeWindow_fromSurface are released immediately. This is needed as a
466 // workaround for https://code.google.com/p/android/issues/detail?id=68174 466 // workaround for https://code.google.com/p/android/issues/detail?id=68174
467 base::android::ScopedJavaLocalFrame scoped_local_reference_frame(env); 467 base::android::ScopedJavaLocalFrame scoped_local_reference_frame(env);
468 window = ANativeWindow_fromSurface(env, surface); 468 window = ANativeWindow_fromSurface(env, surface);
469 } 469 }
470 470
471 if (window) { 471 if (window) {
472 window_ = window; 472 window_ = window;
473 ANativeWindow_acquire(window); 473 ANativeWindow_acquire(window);
474 surface_handle_ = tracker->AddSurfaceForNativeWidget(window); 474 surface_handle_ = tracker->AddSurfaceForNativeWidget(window);
475 // Register first, SetVisible() might create an OutputSurface. 475 // Register first, SetVisible() might create an CompositorFrameSink.
476 RegisterViewSurface(surface_handle_, j_surface); 476 RegisterViewSurface(surface_handle_, j_surface);
477 SetVisible(true); 477 SetVisible(true);
478 ANativeWindow_release(window); 478 ANativeWindow_release(window);
479 } 479 }
480 } 480 }
481 481
482 void CompositorImpl::CreateLayerTreeHost() { 482 void CompositorImpl::CreateLayerTreeHost() {
483 DCHECK(!host_); 483 DCHECK(!host_);
484 484
485 cc::LayerTreeSettings settings; 485 cc::LayerTreeSettings settings;
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
522 if (!visible) { 522 if (!visible) {
523 DCHECK(host_->IsVisible()); 523 DCHECK(host_->IsVisible());
524 524
525 // Make a best effort to try to complete pending readbacks. 525 // Make a best effort to try to complete pending readbacks.
526 // TODO(crbug.com/637035): Consider doing this in a better way, 526 // TODO(crbug.com/637035): Consider doing this in a better way,
527 // ideally with the guarantee of readbacks completing. 527 // ideally with the guarantee of readbacks completing.
528 if (display_.get() && HavePendingReadbacks()) 528 if (display_.get() && HavePendingReadbacks())
529 display_->ForceImmediateDrawAndSwapIfPossible(); 529 display_->ForceImmediateDrawAndSwapIfPossible();
530 530
531 host_->SetVisible(false); 531 host_->SetVisible(false);
532 host_->ReleaseOutputSurface(); 532 host_->ReleaseCompositorFrameSink();
533 pending_swapbuffers_ = 0; 533 pending_swapbuffers_ = 0;
534 display_.reset(); 534 display_.reset();
535 } else { 535 } else {
536 host_->SetVisible(true); 536 host_->SetVisible(true);
537 if (output_surface_request_pending_) 537 if (compositor_frame_sink_request_pending_)
538 HandlePendingOutputSurfaceRequest(); 538 HandlePendingCompositorFrameSinkRequest();
539 } 539 }
540 } 540 }
541 541
542 void CompositorImpl::setDeviceScaleFactor(float factor) { 542 void CompositorImpl::setDeviceScaleFactor(float factor) {
543 device_scale_factor_ = factor; 543 device_scale_factor_ = factor;
544 if (host_) 544 if (host_)
545 host_->GetLayerTree()->SetDeviceScaleFactor(factor); 545 host_->GetLayerTree()->SetDeviceScaleFactor(factor);
546 } 546 }
547 547
548 void CompositorImpl::SetWindowBounds(const gfx::Size& size) { 548 void CompositorImpl::SetWindowBounds(const gfx::Size& size) {
(...skipping 22 matching lines...) Expand all
571 } 571 }
572 572
573 void CompositorImpl::UpdateLayerTreeHost() { 573 void CompositorImpl::UpdateLayerTreeHost() {
574 client_->UpdateLayerTreeHost(); 574 client_->UpdateLayerTreeHost();
575 if (needs_animate_) { 575 if (needs_animate_) {
576 needs_animate_ = false; 576 needs_animate_ = false;
577 root_window_->Animate(base::TimeTicks::Now()); 577 root_window_->Animate(base::TimeTicks::Now());
578 } 578 }
579 } 579 }
580 580
581 void CompositorImpl::RequestNewOutputSurface() { 581 void CompositorImpl::RequestNewCompositorFrameSink() {
582 DCHECK(!output_surface_request_pending_) 582 DCHECK(!compositor_frame_sink_request_pending_)
583 << "Output Surface Request is already pending?"; 583 << "Output Surface Request is already pending?";
584 584
585 output_surface_request_pending_ = true; 585 compositor_frame_sink_request_pending_ = true;
586 HandlePendingOutputSurfaceRequest(); 586 HandlePendingCompositorFrameSinkRequest();
587 } 587 }
588 588
589 void CompositorImpl::DidInitializeOutputSurface() { 589 void CompositorImpl::DidInitializeCompositorFrameSink() {
590 num_successive_context_creation_failures_ = 0; 590 num_successive_context_creation_failures_ = 0;
591 output_surface_request_pending_ = false; 591 compositor_frame_sink_request_pending_ = false;
592 } 592 }
593 593
594 void CompositorImpl::DidFailToInitializeOutputSurface() { 594 void CompositorImpl::DidFailToInitializeCompositorFrameSink() {
595 LOG(ERROR) << "Failed to init OutputSurface for compositor."; 595 LOG(ERROR) << "Failed to init CompositorFrameSink for compositor.";
596 LOG_IF(FATAL, ++num_successive_context_creation_failures_ >= 2) 596 LOG_IF(FATAL, ++num_successive_context_creation_failures_ >= 2)
597 << "Too many context creation failures. Giving up... "; 597 << "Too many context creation failures. Giving up... ";
598 HandlePendingOutputSurfaceRequest(); 598 HandlePendingCompositorFrameSinkRequest();
599 } 599 }
600 600
601 void CompositorImpl::HandlePendingOutputSurfaceRequest() { 601 void CompositorImpl::HandlePendingCompositorFrameSinkRequest() {
602 DCHECK(output_surface_request_pending_); 602 DCHECK(compositor_frame_sink_request_pending_);
603 603
604 // We might have been made invisible now. 604 // We might have been made invisible now.
605 if (!host_->IsVisible()) 605 if (!host_->IsVisible())
606 return; 606 return;
607 607
608 #if defined(ENABLE_VULKAN) 608 #if defined(ENABLE_VULKAN)
609 CreateVulkanOutputSurface() 609 CreateVulkanOutputSurface()
610 if (display_) 610 if (display_)
611 return; 611 return;
612 #endif 612 #endif
613 613
614 DCHECK(surface_handle_ != gpu::kNullSurfaceHandle); 614 DCHECK(surface_handle_ != gpu::kNullSurfaceHandle);
615 ContextProviderFactoryImpl::GetInstance()->RequestGpuChannelHost(base::Bind( 615 ContextProviderFactoryImpl::GetInstance()->RequestGpuChannelHost(base::Bind(
616 &CompositorImpl::OnGpuChannelEstablished, weak_factory_.GetWeakPtr())); 616 &CompositorImpl::OnGpuChannelEstablished, weak_factory_.GetWeakPtr()));
617 } 617 }
618 618
619 #if defined(ENABLE_VULKAN) 619 #if defined(ENABLE_VULKAN)
620 void CompositorImpl::CreateVulkanOutputSurface() { 620 void CompositorImpl::CreateVulkanOutputSurface() {
621 if (!base::CommandLine::ForCurrentProcess()->HasSwitch( 621 if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
622 switches::kEnableVulkan)) 622 switches::kEnableVulkan))
623 return; 623 return;
624 624
625 std::unique_ptr<cc::OutputSurface> display_output_surface;
626 scoped_refptr<cc::VulkanContextProvider> vulkan_context_provider = 625 scoped_refptr<cc::VulkanContextProvider> vulkan_context_provider =
627 ui::ContextProviderFactory::GetInstance() 626 ui::ContextProviderFactory::GetInstance()
628 ->GetSharedVulkanContextProvider(); 627 ->GetSharedVulkanContextProvider();
629 if (vulkan_context_provider) { 628 if (!vulkan_context_provider)
630 std::unique_ptr<VulkanOutputSurface> vulkan_surface(
631 new VulkanOutputSurface(std::move(vulkan_context_provider)));
632 if (!vulkan_surface->Initialize(window_)) {
633 vulkan_surface->Destroy();
634 vulkan_surface.reset();
635 } else {
636 display_output_surface = std::move(vulkan_surface);
637 }
638 }
639
640 if (!display_output_surface)
641 return; 629 return;
642 630
643 InitializeDisplay(std::move(display_output_surface), 631 auto vulkan_surface =
632 base::MakeUnique<VulkanOutputSurface>(vulkan_context_provider);
633 if (!vulkan_surface->Initialize(window_))
634 return;
635
636 InitializeDisplay(std::move(vulkan_surface),
644 std::move(vulkan_context_provider), nullptr); 637 std::move(vulkan_context_provider), nullptr);
645 } 638 }
646 #endif 639 #endif
647 640
648 void CompositorImpl::OnGpuChannelEstablished( 641 void CompositorImpl::OnGpuChannelEstablished(
649 scoped_refptr<gpu::GpuChannelHost> gpu_channel_host, 642 scoped_refptr<gpu::GpuChannelHost> gpu_channel_host,
650 ui::ContextProviderFactory::GpuChannelHostResult result) { 643 ui::ContextProviderFactory::GpuChannelHostResult result) {
651 // We might end up queing multiple GpuChannel requests for the same 644 // We might end up queing multiple GpuChannel requests for the same
652 // OutputSurface request as the visibility of the compositor changes, so the 645 // CompositorFrameSink request as the visibility of the compositor changes, so
653 // OutputSurface request could have been handled already. 646 // the
enne (OOO) 2016/09/14 00:35:45 @_@
654 if (!output_surface_request_pending_) 647 // CompositorFrameSink request could have been handled already.
648 if (!compositor_frame_sink_request_pending_)
655 return; 649 return;
656 650
657 switch (result) { 651 switch (result) {
658 // Don't retry if we are shutting down. 652 // Don't retry if we are shutting down.
659 case ui::ContextProviderFactory::GpuChannelHostResult:: 653 case ui::ContextProviderFactory::GpuChannelHostResult::
660 FAILURE_FACTORY_SHUTDOWN: 654 FAILURE_FACTORY_SHUTDOWN:
661 break; 655 break;
662 case ui::ContextProviderFactory::GpuChannelHostResult:: 656 case ui::ContextProviderFactory::GpuChannelHostResult::
663 FAILURE_GPU_PROCESS_INITIALIZATION_FAILED: 657 FAILURE_GPU_PROCESS_INITIALIZATION_FAILED:
664 // TODO(khushalsagar): Retry or have a fallback path after 658 // TODO(khushalsagar): Retry or have a fallback path after
(...skipping 11 matching lines...) Expand all
676 ->CreateDisplayContextProvider( 670 ->CreateDisplayContextProvider(
677 surface_handle_, GetCompositorContextSharedMemoryLimits(), 671 surface_handle_, GetCompositorContextSharedMemoryLimits(),
678 GetCompositorContextAttributes(has_transparent_background_), 672 GetCompositorContextAttributes(has_transparent_background_),
679 false /*support_locking*/, false /*automatic_flushes*/, 673 false /*support_locking*/, false /*automatic_flushes*/,
680 std::move(gpu_channel_host)); 674 std::move(gpu_channel_host));
681 675
682 scoped_refptr<ContextProviderCommandBuffer> 676 scoped_refptr<ContextProviderCommandBuffer>
683 context_provider_command_buffer = 677 context_provider_command_buffer =
684 static_cast<ContextProviderCommandBuffer*>( 678 static_cast<ContextProviderCommandBuffer*>(
685 context_provider.get()); 679 context_provider.get());
686 std::unique_ptr<cc::OutputSurface> display_output_surface( 680 auto display_output_surface = base::MakeUnique<AndroidOutputSurface>(
687 new OutputSurfaceWithoutParent( 681 context_provider_command_buffer,
688 context_provider_command_buffer, 682 base::Bind(&CompositorImpl::PopulateGpuCapabilities,
689 base::Bind(&CompositorImpl::PopulateGpuCapabilities, 683 base::Unretained(this)));
690 base::Unretained(this))));
691 InitializeDisplay(std::move(display_output_surface), nullptr, 684 InitializeDisplay(std::move(display_output_surface), nullptr,
692 std::move(context_provider)); 685 std::move(context_provider));
693 break; 686 break;
694 } 687 }
695 } 688 }
696 689
697 void CompositorImpl::InitializeDisplay( 690 void CompositorImpl::InitializeDisplay(
698 std::unique_ptr<cc::OutputSurface> display_output_surface, 691 std::unique_ptr<cc::OutputSurface> display_output_surface,
699 scoped_refptr<cc::VulkanContextProvider> vulkan_context_provider, 692 scoped_refptr<cc::VulkanContextProvider> vulkan_context_provider,
700 scoped_refptr<cc::ContextProvider> context_provider) { 693 scoped_refptr<cc::ContextProvider> context_provider) {
701 DCHECK(output_surface_request_pending_); 694 DCHECK(compositor_frame_sink_request_pending_);
702 695
703 pending_swapbuffers_ = 0; 696 pending_swapbuffers_ = 0;
704 697
705 cc::SurfaceManager* manager = 698 cc::SurfaceManager* manager =
706 ui::ContextProviderFactory::GetInstance()->GetSurfaceManager(); 699 ui::ContextProviderFactory::GetInstance()->GetSurfaceManager();
707 auto* task_runner = base::ThreadTaskRunnerHandle::Get().get(); 700 auto* task_runner = base::ThreadTaskRunnerHandle::Get().get();
708 std::unique_ptr<ExternalBeginFrameSource> begin_frame_source( 701 std::unique_ptr<ExternalBeginFrameSource> begin_frame_source(
709 new ExternalBeginFrameSource(this)); 702 new ExternalBeginFrameSource(this));
710 std::unique_ptr<cc::DisplayScheduler> scheduler(new cc::DisplayScheduler( 703 std::unique_ptr<cc::DisplayScheduler> scheduler(new cc::DisplayScheduler(
711 begin_frame_source.get(), task_runner, 704 begin_frame_source.get(), task_runner,
712 display_output_surface->capabilities().max_frames_pending)); 705 display_output_surface->capabilities().max_frames_pending));
713 706
714 display_.reset(new cc::Display( 707 display_.reset(new cc::Display(
715 HostSharedBitmapManager::current(), 708 HostSharedBitmapManager::current(),
716 BrowserGpuMemoryBufferManager::current(), 709 BrowserGpuMemoryBufferManager::current(),
717 host_->GetSettings().renderer_settings, std::move(begin_frame_source), 710 host_->GetSettings().renderer_settings, std::move(begin_frame_source),
718 std::move(display_output_surface), std::move(scheduler), 711 std::move(display_output_surface), std::move(scheduler),
719 base::MakeUnique<cc::TextureMailboxDeleter>(task_runner))); 712 base::MakeUnique<cc::TextureMailboxDeleter>(task_runner)));
720 713
721 std::unique_ptr<cc::SurfaceDisplayOutputSurface> delegated_output_surface( 714 auto compositor_frame_sink =
722 vulkan_context_provider ? new cc::SurfaceDisplayOutputSurface( 715 vulkan_context_provider ? base::MakeUnique<cc::DirectCompositorFrameSink>(
723 manager, surface_id_allocator_.get(), 716 manager, surface_id_allocator_.get(),
724 display_.get(), vulkan_context_provider) 717 display_.get(), vulkan_context_provider)
725 : new cc::SurfaceDisplayOutputSurface( 718 : base::MakeUnique<cc::DirectCompositorFrameSink>(
726 manager, surface_id_allocator_.get(), 719 manager, surface_id_allocator_.get(),
727 display_.get(), context_provider, nullptr)); 720 display_.get(), context_provider, nullptr);
728 721
729 display_->SetVisible(true); 722 display_->SetVisible(true);
730 display_->Resize(size_); 723 display_->Resize(size_);
731 host_->SetOutputSurface(std::move(delegated_output_surface)); 724 host_->SetCompositorFrameSink(std::move(compositor_frame_sink));
732 } 725 }
733 726
734 void CompositorImpl::PopulateGpuCapabilities( 727 void CompositorImpl::PopulateGpuCapabilities(
735 gpu::Capabilities gpu_capabilities) { 728 gpu::Capabilities gpu_capabilities) {
736 gpu_capabilities_ = gpu_capabilities; 729 gpu_capabilities_ = gpu_capabilities;
737 } 730 }
738 731
739 void CompositorImpl::AddObserver(VSyncObserver* observer) { 732 void CompositorImpl::AddObserver(VSyncObserver* observer) {
740 observer_list_.AddObserver(observer); 733 observer_list_.AddObserver(observer);
741 } 734 }
(...skipping 25 matching lines...) Expand all
767 void CompositorImpl::DidCompleteSwapBuffers() { 760 void CompositorImpl::DidCompleteSwapBuffers() {
768 TRACE_EVENT0("compositor", "CompositorImpl::DidCompleteSwapBuffers"); 761 TRACE_EVENT0("compositor", "CompositorImpl::DidCompleteSwapBuffers");
769 DCHECK_GT(pending_swapbuffers_, 0U); 762 DCHECK_GT(pending_swapbuffers_, 0U);
770 pending_swapbuffers_--; 763 pending_swapbuffers_--;
771 client_->OnSwapBuffersCompleted(pending_swapbuffers_); 764 client_->OnSwapBuffersCompleted(pending_swapbuffers_);
772 } 765 }
773 766
774 void CompositorImpl::DidAbortSwapBuffers() { 767 void CompositorImpl::DidAbortSwapBuffers() {
775 TRACE_EVENT0("compositor", "CompositorImpl::DidAbortSwapBuffers"); 768 TRACE_EVENT0("compositor", "CompositorImpl::DidAbortSwapBuffers");
776 // This really gets called only once from 769 // This really gets called only once from
777 // SingleThreadProxy::DidLoseOutputSurfaceOnImplThread() when the 770 // SingleThreadProxy::DidLoseCompositorFrameSinkOnImplThread() when the
778 // context was lost. 771 // context was lost.
779 if (host_->IsVisible()) 772 if (host_->IsVisible())
780 host_->SetNeedsCommit(); 773 host_->SetNeedsCommit();
781 client_->OnSwapBuffersCompleted(0); 774 client_->OnSwapBuffersCompleted(0);
782 } 775 }
783 776
784 void CompositorImpl::DidCommit() { 777 void CompositorImpl::DidCommit() {
785 root_window_->OnCompositingDidCommit(); 778 root_window_->OnCompositingDidCommit();
786 } 779 }
787 780
(...skipping 30 matching lines...) Expand all
818 811
819 TRACE_EVENT0("compositor", "Compositor::SetNeedsAnimate"); 812 TRACE_EVENT0("compositor", "Compositor::SetNeedsAnimate");
820 host_->SetNeedsAnimate(); 813 host_->SetNeedsAnimate();
821 } 814 }
822 815
823 bool CompositorImpl::HavePendingReadbacks() { 816 bool CompositorImpl::HavePendingReadbacks() {
824 return !readback_layer_tree_->children().empty(); 817 return !readback_layer_tree_->children().empty();
825 } 818 }
826 819
827 } // namespace content 820 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698