Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |