| Index: cc/trees/layer_tree_host.cc
|
| diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc
|
| deleted file mode 100644
|
| index 9d2be1080d67bffeb3920bc777dcc17b2d17bd4f..0000000000000000000000000000000000000000
|
| --- a/cc/trees/layer_tree_host.cc
|
| +++ /dev/null
|
| @@ -1,1276 +0,0 @@
|
| -// Copyright 2011 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "cc/trees/layer_tree_host.h"
|
| -
|
| -#include <algorithm>
|
| -#include <stack>
|
| -#include <string>
|
| -
|
| -#include "base/atomic_sequence_num.h"
|
| -#include "base/bind.h"
|
| -#include "base/command_line.h"
|
| -#include "base/message_loop/message_loop.h"
|
| -#include "base/metrics/histogram.h"
|
| -#include "base/stl_util.h"
|
| -#include "base/strings/string_number_conversions.h"
|
| -#include "base/trace_event/trace_event.h"
|
| -#include "base/trace_event/trace_event_argument.h"
|
| -#include "cc/animation/animation_registrar.h"
|
| -#include "cc/animation/layer_animation_controller.h"
|
| -#include "cc/base/math_util.h"
|
| -#include "cc/debug/devtools_instrumentation.h"
|
| -#include "cc/debug/frame_viewer_instrumentation.h"
|
| -#include "cc/debug/rendering_stats_instrumentation.h"
|
| -#include "cc/input/layer_selection_bound.h"
|
| -#include "cc/input/page_scale_animation.h"
|
| -#include "cc/input/top_controls_manager.h"
|
| -#include "cc/layers/heads_up_display_layer.h"
|
| -#include "cc/layers/heads_up_display_layer_impl.h"
|
| -#include "cc/layers/layer.h"
|
| -#include "cc/layers/layer_iterator.h"
|
| -#include "cc/layers/painted_scrollbar_layer.h"
|
| -#include "cc/layers/render_surface.h"
|
| -#include "cc/resources/prioritized_resource_manager.h"
|
| -#include "cc/resources/ui_resource_request.h"
|
| -#include "cc/scheduler/begin_frame_source.h"
|
| -#include "cc/trees/layer_tree_host_client.h"
|
| -#include "cc/trees/layer_tree_host_common.h"
|
| -#include "cc/trees/layer_tree_host_impl.h"
|
| -#include "cc/trees/layer_tree_impl.h"
|
| -#include "cc/trees/occlusion_tracker.h"
|
| -#include "cc/trees/single_thread_proxy.h"
|
| -#include "cc/trees/thread_proxy.h"
|
| -#include "cc/trees/tree_synchronizer.h"
|
| -#include "ui/gfx/geometry/size_conversions.h"
|
| -#include "ui/gfx/geometry/vector2d_conversions.h"
|
| -
|
| -namespace {
|
| -static base::StaticAtomicSequenceNumber s_layer_tree_host_sequence_number;
|
| -}
|
| -
|
| -namespace cc {
|
| -
|
| -scoped_ptr<LayerTreeHost> LayerTreeHost::CreateThreaded(
|
| - LayerTreeHostClient* client,
|
| - SharedBitmapManager* shared_bitmap_manager,
|
| - gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
|
| - TaskGraphRunner* task_graph_runner,
|
| - const LayerTreeSettings& settings,
|
| - scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
|
| - scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner,
|
| - scoped_ptr<BeginFrameSource> external_begin_frame_source) {
|
| - DCHECK(main_task_runner.get());
|
| - DCHECK(impl_task_runner.get());
|
| - scoped_ptr<LayerTreeHost> layer_tree_host(new LayerTreeHost(
|
| - client, shared_bitmap_manager, gpu_memory_buffer_manager,
|
| - task_graph_runner, settings));
|
| - layer_tree_host->InitializeThreaded(main_task_runner,
|
| - impl_task_runner,
|
| - external_begin_frame_source.Pass());
|
| - return layer_tree_host.Pass();
|
| -}
|
| -
|
| -scoped_ptr<LayerTreeHost> LayerTreeHost::CreateSingleThreaded(
|
| - LayerTreeHostClient* client,
|
| - LayerTreeHostSingleThreadClient* single_thread_client,
|
| - SharedBitmapManager* shared_bitmap_manager,
|
| - gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
|
| - TaskGraphRunner* task_graph_runner,
|
| - const LayerTreeSettings& settings,
|
| - scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
|
| - scoped_ptr<BeginFrameSource> external_begin_frame_source) {
|
| - scoped_ptr<LayerTreeHost> layer_tree_host(new LayerTreeHost(
|
| - client, shared_bitmap_manager, gpu_memory_buffer_manager,
|
| - task_graph_runner, settings));
|
| - layer_tree_host->InitializeSingleThreaded(single_thread_client,
|
| - main_task_runner,
|
| - external_begin_frame_source.Pass());
|
| - return layer_tree_host.Pass();
|
| -}
|
| -
|
| -LayerTreeHost::LayerTreeHost(
|
| - LayerTreeHostClient* client,
|
| - SharedBitmapManager* shared_bitmap_manager,
|
| - gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
|
| - TaskGraphRunner* task_graph_runner,
|
| - const LayerTreeSettings& settings)
|
| - : micro_benchmark_controller_(this),
|
| - next_ui_resource_id_(1),
|
| - inside_begin_main_frame_(false),
|
| - needs_full_tree_sync_(true),
|
| - client_(client),
|
| - source_frame_number_(0),
|
| - rendering_stats_instrumentation_(RenderingStatsInstrumentation::Create()),
|
| - output_surface_lost_(true),
|
| - settings_(settings),
|
| - debug_state_(settings.initial_debug_state),
|
| - top_controls_shrink_blink_size_(false),
|
| - top_controls_height_(0.f),
|
| - top_controls_shown_ratio_(0.f),
|
| - device_scale_factor_(1.f),
|
| - visible_(true),
|
| - page_scale_factor_(1.f),
|
| - min_page_scale_factor_(1.f),
|
| - max_page_scale_factor_(1.f),
|
| - has_gpu_rasterization_trigger_(false),
|
| - content_is_suitable_for_gpu_rasterization_(true),
|
| - gpu_rasterization_histogram_recorded_(false),
|
| - background_color_(SK_ColorWHITE),
|
| - has_transparent_background_(false),
|
| - partial_texture_update_requests_(0),
|
| - did_complete_scale_animation_(false),
|
| - in_paint_layer_contents_(false),
|
| - id_(s_layer_tree_host_sequence_number.GetNext() + 1),
|
| - next_commit_forces_redraw_(false),
|
| - shared_bitmap_manager_(shared_bitmap_manager),
|
| - gpu_memory_buffer_manager_(gpu_memory_buffer_manager),
|
| - task_graph_runner_(task_graph_runner),
|
| - surface_id_namespace_(0u),
|
| - next_surface_sequence_(1u) {
|
| - if (settings_.accelerated_animation_enabled)
|
| - animation_registrar_ = AnimationRegistrar::Create();
|
| - rendering_stats_instrumentation_->set_record_rendering_stats(
|
| - debug_state_.RecordRenderingStats());
|
| -}
|
| -
|
| -void LayerTreeHost::InitializeThreaded(
|
| - scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
|
| - scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner,
|
| - scoped_ptr<BeginFrameSource> external_begin_frame_source) {
|
| - InitializeProxy(ThreadProxy::Create(this,
|
| - main_task_runner,
|
| - impl_task_runner,
|
| - external_begin_frame_source.Pass()));
|
| -}
|
| -
|
| -void LayerTreeHost::InitializeSingleThreaded(
|
| - LayerTreeHostSingleThreadClient* single_thread_client,
|
| - scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
|
| - scoped_ptr<BeginFrameSource> external_begin_frame_source) {
|
| - InitializeProxy(
|
| - SingleThreadProxy::Create(this,
|
| - single_thread_client,
|
| - main_task_runner,
|
| - external_begin_frame_source.Pass()));
|
| -}
|
| -
|
| -void LayerTreeHost::InitializeForTesting(scoped_ptr<Proxy> proxy_for_testing) {
|
| - InitializeProxy(proxy_for_testing.Pass());
|
| -}
|
| -
|
| -void LayerTreeHost::InitializeProxy(scoped_ptr<Proxy> proxy) {
|
| - TRACE_EVENT0("cc", "LayerTreeHost::InitializeForReal");
|
| -
|
| - proxy_ = proxy.Pass();
|
| - proxy_->Start();
|
| - if (settings_.accelerated_animation_enabled) {
|
| - animation_registrar_->set_supports_scroll_animations(
|
| - proxy_->SupportsImplScrolling());
|
| - }
|
| -}
|
| -
|
| -LayerTreeHost::~LayerTreeHost() {
|
| - TRACE_EVENT0("cc", "LayerTreeHost::~LayerTreeHost");
|
| -
|
| - if (root_layer_.get())
|
| - root_layer_->SetLayerTreeHost(NULL);
|
| -
|
| - DCHECK(swap_promise_monitor_.empty());
|
| -
|
| - BreakSwapPromises(SwapPromise::COMMIT_FAILS);
|
| -
|
| - if (proxy_) {
|
| - DCHECK(proxy_->IsMainThread());
|
| - proxy_->Stop();
|
| - }
|
| -
|
| - // We must clear any pointers into the layer tree prior to destroying it.
|
| - RegisterViewportLayers(NULL, NULL, NULL, NULL);
|
| -
|
| - if (root_layer_.get()) {
|
| - // The layer tree must be destroyed before the layer tree host. We've
|
| - // made a contract with our animation controllers that the registrar
|
| - // will outlive them, and we must make good.
|
| - root_layer_ = NULL;
|
| - }
|
| -}
|
| -
|
| -void LayerTreeHost::SetLayerTreeHostClientReady() {
|
| - proxy_->SetLayerTreeHostClientReady();
|
| -}
|
| -
|
| -void LayerTreeHost::DeleteContentsTexturesOnImplThread(
|
| - ResourceProvider* resource_provider) {
|
| - DCHECK(proxy_->IsImplThread());
|
| - if (contents_texture_manager_)
|
| - contents_texture_manager_->ClearAllMemory(resource_provider);
|
| -}
|
| -
|
| -void LayerTreeHost::WillBeginMainFrame() {
|
| - devtools_instrumentation::WillBeginMainThreadFrame(id(),
|
| - source_frame_number());
|
| - client_->WillBeginMainFrame();
|
| -}
|
| -
|
| -void LayerTreeHost::DidBeginMainFrame() {
|
| - client_->DidBeginMainFrame();
|
| -}
|
| -
|
| -void LayerTreeHost::BeginMainFrameNotExpectedSoon() {
|
| - client_->BeginMainFrameNotExpectedSoon();
|
| -}
|
| -
|
| -void LayerTreeHost::BeginMainFrame(const BeginFrameArgs& args) {
|
| - inside_begin_main_frame_ = true;
|
| - client_->BeginMainFrame(args);
|
| - inside_begin_main_frame_ = false;
|
| -}
|
| -
|
| -void LayerTreeHost::DidStopFlinging() {
|
| - proxy_->MainThreadHasStoppedFlinging();
|
| -}
|
| -
|
| -void LayerTreeHost::Layout() {
|
| - client_->Layout();
|
| -}
|
| -
|
| -void LayerTreeHost::BeginCommitOnImplThread(LayerTreeHostImpl* host_impl) {
|
| - DCHECK(proxy_->IsImplThread());
|
| - TRACE_EVENT0("cc", "LayerTreeHost::CommitTo");
|
| -}
|
| -
|
| -// This function commits the LayerTreeHost to an impl tree. When modifying
|
| -// this function, keep in mind that the function *runs* on the impl thread! Any
|
| -// code that is logically a main thread operation, e.g. deletion of a Layer,
|
| -// should be delayed until the LayerTreeHost::CommitComplete, which will run
|
| -// after the commit, but on the main thread.
|
| -void LayerTreeHost::FinishCommitOnImplThread(LayerTreeHostImpl* host_impl) {
|
| - DCHECK(proxy_->IsImplThread());
|
| -
|
| - // If there are linked evicted backings, these backings' resources may be put
|
| - // into the impl tree, so we can't draw yet. Determine this before clearing
|
| - // all evicted backings.
|
| - bool new_impl_tree_has_no_evicted_resources = false;
|
| - if (contents_texture_manager_) {
|
| - new_impl_tree_has_no_evicted_resources =
|
| - !contents_texture_manager_->LinkedEvictedBackingsExist();
|
| -
|
| - // If the memory limit has been increased since this now-finishing
|
| - // commit began, and the extra now-available memory would have been used,
|
| - // then request another commit.
|
| - if (contents_texture_manager_->MaxMemoryLimitBytes() <
|
| - host_impl->memory_allocation_limit_bytes() &&
|
| - contents_texture_manager_->MaxMemoryLimitBytes() <
|
| - contents_texture_manager_->MaxMemoryNeededBytes()) {
|
| - host_impl->SetNeedsCommit();
|
| - }
|
| -
|
| - host_impl->set_max_memory_needed_bytes(
|
| - contents_texture_manager_->MaxMemoryNeededBytes());
|
| -
|
| - contents_texture_manager_->UpdateBackingsState(
|
| - host_impl->resource_provider());
|
| - contents_texture_manager_->ReduceMemory(host_impl->resource_provider());
|
| - }
|
| -
|
| - bool is_new_trace;
|
| - TRACE_EVENT_IS_NEW_TRACE(&is_new_trace);
|
| - if (is_new_trace &&
|
| - frame_viewer_instrumentation::IsTracingLayerTreeSnapshots() &&
|
| - root_layer()) {
|
| - LayerTreeHostCommon::CallFunctionForSubtree(
|
| - root_layer(), [](Layer* layer) { layer->DidBeginTracing(); });
|
| - }
|
| -
|
| - LayerTreeImpl* sync_tree = host_impl->sync_tree();
|
| -
|
| - if (next_commit_forces_redraw_) {
|
| - sync_tree->ForceRedrawNextActivation();
|
| - next_commit_forces_redraw_ = false;
|
| - }
|
| -
|
| - sync_tree->set_source_frame_number(source_frame_number());
|
| -
|
| - if (needs_full_tree_sync_) {
|
| - sync_tree->SetRootLayer(TreeSynchronizer::SynchronizeTrees(
|
| - root_layer(), sync_tree->DetachLayerTree(), sync_tree));
|
| - }
|
| - sync_tree->set_needs_full_tree_sync(needs_full_tree_sync_);
|
| - needs_full_tree_sync_ = false;
|
| -
|
| - if (hud_layer_.get()) {
|
| - LayerImpl* hud_impl = LayerTreeHostCommon::FindLayerInSubtree(
|
| - sync_tree->root_layer(), hud_layer_->id());
|
| - sync_tree->set_hud_layer(static_cast<HeadsUpDisplayLayerImpl*>(hud_impl));
|
| - } else {
|
| - sync_tree->set_hud_layer(NULL);
|
| - }
|
| -
|
| - sync_tree->set_background_color(background_color_);
|
| - sync_tree->set_has_transparent_background(has_transparent_background_);
|
| -
|
| - if (page_scale_layer_.get() && inner_viewport_scroll_layer_.get()) {
|
| - sync_tree->SetViewportLayersFromIds(
|
| - overscroll_elasticity_layer_.get() ? overscroll_elasticity_layer_->id()
|
| - : Layer::INVALID_ID,
|
| - page_scale_layer_->id(), inner_viewport_scroll_layer_->id(),
|
| - outer_viewport_scroll_layer_.get() ? outer_viewport_scroll_layer_->id()
|
| - : Layer::INVALID_ID);
|
| - DCHECK(inner_viewport_scroll_layer_->IsContainerForFixedPositionLayers());
|
| - } else {
|
| - sync_tree->ClearViewportLayers();
|
| - }
|
| -
|
| - sync_tree->RegisterSelection(selection_start_, selection_end_);
|
| -
|
| - sync_tree->PushPageScaleFromMainThread(
|
| - page_scale_factor_, min_page_scale_factor_, max_page_scale_factor_);
|
| - sync_tree->elastic_overscroll()->PushFromMainThread(elastic_overscroll_);
|
| - if (sync_tree->IsActiveTree())
|
| - sync_tree->elastic_overscroll()->PushPendingToActive();
|
| -
|
| - sync_tree->PassSwapPromises(&swap_promise_list_);
|
| -
|
| - sync_tree->set_top_controls_shrink_blink_size(
|
| - top_controls_shrink_blink_size_);
|
| - sync_tree->set_top_controls_height(top_controls_height_);
|
| - sync_tree->PushTopControlsFromMainThread(top_controls_shown_ratio_);
|
| -
|
| - host_impl->SetUseGpuRasterization(UseGpuRasterization());
|
| - host_impl->set_gpu_rasterization_status(GetGpuRasterizationStatus());
|
| - RecordGpuRasterizationHistogram();
|
| -
|
| - host_impl->SetViewportSize(device_viewport_size_);
|
| - host_impl->SetDeviceScaleFactor(device_scale_factor_);
|
| - host_impl->SetDebugState(debug_state_);
|
| - if (pending_page_scale_animation_) {
|
| - sync_tree->SetPendingPageScaleAnimation(
|
| - pending_page_scale_animation_.Pass());
|
| - }
|
| -
|
| - if (!ui_resource_request_queue_.empty()) {
|
| - sync_tree->set_ui_resource_request_queue(ui_resource_request_queue_);
|
| - ui_resource_request_queue_.clear();
|
| - }
|
| -
|
| - DCHECK(!sync_tree->ViewportSizeInvalid());
|
| -
|
| - if (new_impl_tree_has_no_evicted_resources) {
|
| - if (sync_tree->ContentsTexturesPurged())
|
| - sync_tree->ResetContentsTexturesPurged();
|
| - }
|
| -
|
| - sync_tree->set_has_ever_been_drawn(false);
|
| -
|
| - {
|
| - TRACE_EVENT0("cc", "LayerTreeHost::PushProperties");
|
| - TreeSynchronizer::PushProperties(root_layer(), sync_tree->root_layer());
|
| - }
|
| -
|
| - micro_benchmark_controller_.ScheduleImplBenchmarks(host_impl);
|
| -}
|
| -
|
| -void LayerTreeHost::WillCommit() {
|
| - client_->WillCommit();
|
| -}
|
| -
|
| -void LayerTreeHost::UpdateHudLayer() {
|
| - if (debug_state_.ShowHudInfo()) {
|
| - if (!hud_layer_.get())
|
| - hud_layer_ = HeadsUpDisplayLayer::Create();
|
| -
|
| - if (root_layer_.get() && !hud_layer_->parent())
|
| - root_layer_->AddChild(hud_layer_);
|
| - } else if (hud_layer_.get()) {
|
| - hud_layer_->RemoveFromParent();
|
| - hud_layer_ = NULL;
|
| - }
|
| -}
|
| -
|
| -void LayerTreeHost::CommitComplete() {
|
| - source_frame_number_++;
|
| - client_->DidCommit();
|
| - if (did_complete_scale_animation_) {
|
| - client_->DidCompletePageScaleAnimation();
|
| - did_complete_scale_animation_ = false;
|
| - }
|
| -}
|
| -
|
| -void LayerTreeHost::SetOutputSurface(scoped_ptr<OutputSurface> surface) {
|
| - TRACE_EVENT0("cc", "LayerTreeHost::SetOutputSurface");
|
| - DCHECK(output_surface_lost_);
|
| - DCHECK(surface);
|
| -
|
| - proxy_->SetOutputSurface(surface.Pass());
|
| -}
|
| -
|
| -void LayerTreeHost::RequestNewOutputSurface() {
|
| - client_->RequestNewOutputSurface();
|
| -}
|
| -
|
| -void LayerTreeHost::DidInitializeOutputSurface() {
|
| - output_surface_lost_ = false;
|
| -
|
| - if (!contents_texture_manager_ && !settings_.impl_side_painting) {
|
| - contents_texture_manager_ =
|
| - PrioritizedResourceManager::Create(proxy_.get());
|
| - surface_memory_placeholder_ =
|
| - contents_texture_manager_->CreateTexture(gfx::Size(), RGBA_8888);
|
| - }
|
| -
|
| - if (root_layer()) {
|
| - LayerTreeHostCommon::CallFunctionForSubtree(
|
| - root_layer(), [](Layer* layer) { layer->OnOutputSurfaceCreated(); });
|
| - }
|
| -
|
| - client_->DidInitializeOutputSurface();
|
| -}
|
| -
|
| -void LayerTreeHost::DidFailToInitializeOutputSurface() {
|
| - DCHECK(output_surface_lost_);
|
| - client_->DidFailToInitializeOutputSurface();
|
| -}
|
| -
|
| -scoped_ptr<LayerTreeHostImpl> LayerTreeHost::CreateLayerTreeHostImpl(
|
| - LayerTreeHostImplClient* client) {
|
| - DCHECK(proxy_->IsImplThread());
|
| - scoped_ptr<LayerTreeHostImpl> host_impl = LayerTreeHostImpl::Create(
|
| - settings_, client, proxy_.get(), rendering_stats_instrumentation_.get(),
|
| - shared_bitmap_manager_, gpu_memory_buffer_manager_, task_graph_runner_,
|
| - id_);
|
| - host_impl->SetUseGpuRasterization(UseGpuRasterization());
|
| - shared_bitmap_manager_ = NULL;
|
| - gpu_memory_buffer_manager_ = NULL;
|
| - task_graph_runner_ = NULL;
|
| - top_controls_manager_weak_ptr_ =
|
| - host_impl->top_controls_manager()->AsWeakPtr();
|
| - input_handler_weak_ptr_ = host_impl->AsWeakPtr();
|
| - return host_impl.Pass();
|
| -}
|
| -
|
| -void LayerTreeHost::DidLoseOutputSurface() {
|
| - TRACE_EVENT0("cc", "LayerTreeHost::DidLoseOutputSurface");
|
| - DCHECK(proxy_->IsMainThread());
|
| -
|
| - if (output_surface_lost_)
|
| - return;
|
| -
|
| - output_surface_lost_ = true;
|
| - SetNeedsCommit();
|
| -}
|
| -
|
| -void LayerTreeHost::FinishAllRendering() {
|
| - proxy_->FinishAllRendering();
|
| -}
|
| -
|
| -void LayerTreeHost::SetDeferCommits(bool defer_commits) {
|
| - proxy_->SetDeferCommits(defer_commits);
|
| -}
|
| -
|
| -void LayerTreeHost::SetNeedsDisplayOnAllLayers() {
|
| - std::stack<Layer*> layer_stack;
|
| - layer_stack.push(root_layer());
|
| - while (!layer_stack.empty()) {
|
| - Layer* current_layer = layer_stack.top();
|
| - layer_stack.pop();
|
| - current_layer->SetNeedsDisplay();
|
| - for (unsigned int i = 0; i < current_layer->children().size(); i++) {
|
| - layer_stack.push(current_layer->child_at(i));
|
| - }
|
| - }
|
| -}
|
| -
|
| -const RendererCapabilities& LayerTreeHost::GetRendererCapabilities() const {
|
| - return proxy_->GetRendererCapabilities();
|
| -}
|
| -
|
| -void LayerTreeHost::SetNeedsAnimate() {
|
| - proxy_->SetNeedsAnimate();
|
| - NotifySwapPromiseMonitorsOfSetNeedsCommit();
|
| -}
|
| -
|
| -void LayerTreeHost::SetNeedsUpdateLayers() {
|
| - proxy_->SetNeedsUpdateLayers();
|
| - NotifySwapPromiseMonitorsOfSetNeedsCommit();
|
| -}
|
| -
|
| -void LayerTreeHost::SetNeedsCommit() {
|
| - if (!prepaint_callback_.IsCancelled()) {
|
| - TRACE_EVENT_INSTANT0("cc",
|
| - "LayerTreeHost::SetNeedsCommit::cancel prepaint",
|
| - TRACE_EVENT_SCOPE_THREAD);
|
| - prepaint_callback_.Cancel();
|
| - }
|
| - proxy_->SetNeedsCommit();
|
| - NotifySwapPromiseMonitorsOfSetNeedsCommit();
|
| -}
|
| -
|
| -void LayerTreeHost::SetNeedsFullTreeSync() {
|
| - needs_full_tree_sync_ = true;
|
| - SetNeedsCommit();
|
| -}
|
| -
|
| -void LayerTreeHost::SetNeedsRedraw() {
|
| - SetNeedsRedrawRect(gfx::Rect(device_viewport_size_));
|
| -}
|
| -
|
| -void LayerTreeHost::SetNeedsRedrawRect(const gfx::Rect& damage_rect) {
|
| - proxy_->SetNeedsRedraw(damage_rect);
|
| -}
|
| -
|
| -bool LayerTreeHost::CommitRequested() const {
|
| - return proxy_->CommitRequested();
|
| -}
|
| -
|
| -bool LayerTreeHost::BeginMainFrameRequested() const {
|
| - return proxy_->BeginMainFrameRequested();
|
| -}
|
| -
|
| -
|
| -void LayerTreeHost::SetNextCommitWaitsForActivation() {
|
| - proxy_->SetNextCommitWaitsForActivation();
|
| -}
|
| -
|
| -void LayerTreeHost::SetNextCommitForcesRedraw() {
|
| - next_commit_forces_redraw_ = true;
|
| -}
|
| -
|
| -void LayerTreeHost::SetAnimationEvents(
|
| - scoped_ptr<AnimationEventsVector> events) {
|
| - DCHECK(proxy_->IsMainThread());
|
| - animation_registrar_->SetAnimationEvents(events.Pass());
|
| -}
|
| -
|
| -void LayerTreeHost::SetRootLayer(scoped_refptr<Layer> root_layer) {
|
| - if (root_layer_.get() == root_layer.get())
|
| - return;
|
| -
|
| - if (root_layer_.get())
|
| - root_layer_->SetLayerTreeHost(NULL);
|
| - root_layer_ = root_layer;
|
| - if (root_layer_.get()) {
|
| - DCHECK(!root_layer_->parent());
|
| - root_layer_->SetLayerTreeHost(this);
|
| - }
|
| -
|
| - if (hud_layer_.get())
|
| - hud_layer_->RemoveFromParent();
|
| -
|
| - // Reset gpu rasterization flag.
|
| - // This flag is sticky until a new tree comes along.
|
| - content_is_suitable_for_gpu_rasterization_ = true;
|
| - gpu_rasterization_histogram_recorded_ = false;
|
| -
|
| - SetNeedsFullTreeSync();
|
| -}
|
| -
|
| -void LayerTreeHost::SetDebugState(const LayerTreeDebugState& debug_state) {
|
| - LayerTreeDebugState new_debug_state =
|
| - LayerTreeDebugState::Unite(settings_.initial_debug_state, debug_state);
|
| -
|
| - if (LayerTreeDebugState::Equal(debug_state_, new_debug_state))
|
| - return;
|
| -
|
| - debug_state_ = new_debug_state;
|
| -
|
| - rendering_stats_instrumentation_->set_record_rendering_stats(
|
| - debug_state_.RecordRenderingStats());
|
| -
|
| - SetNeedsCommit();
|
| - proxy_->SetDebugState(debug_state);
|
| -}
|
| -
|
| -bool LayerTreeHost::UseGpuRasterization() const {
|
| - if (settings_.gpu_rasterization_forced) {
|
| - return true;
|
| - } else if (settings_.gpu_rasterization_enabled) {
|
| - return has_gpu_rasterization_trigger_ &&
|
| - content_is_suitable_for_gpu_rasterization_;
|
| - } else {
|
| - return false;
|
| - }
|
| -}
|
| -
|
| -GpuRasterizationStatus LayerTreeHost::GetGpuRasterizationStatus() const {
|
| - if (settings_.gpu_rasterization_forced) {
|
| - return GpuRasterizationStatus::ON_FORCED;
|
| - } else if (settings_.gpu_rasterization_enabled) {
|
| - if (!has_gpu_rasterization_trigger_) {
|
| - return GpuRasterizationStatus::OFF_VIEWPORT;
|
| - } else if (!content_is_suitable_for_gpu_rasterization_) {
|
| - return GpuRasterizationStatus::OFF_CONTENT;
|
| - } else {
|
| - return GpuRasterizationStatus::ON;
|
| - }
|
| - }
|
| - return GpuRasterizationStatus::OFF_DEVICE;
|
| -}
|
| -
|
| -void LayerTreeHost::SetHasGpuRasterizationTrigger(bool has_trigger) {
|
| - if (has_trigger == has_gpu_rasterization_trigger_)
|
| - return;
|
| -
|
| - has_gpu_rasterization_trigger_ = has_trigger;
|
| - TRACE_EVENT_INSTANT1("cc",
|
| - "LayerTreeHost::SetHasGpuRasterizationTrigger",
|
| - TRACE_EVENT_SCOPE_THREAD,
|
| - "has_trigger",
|
| - has_gpu_rasterization_trigger_);
|
| -}
|
| -
|
| -void LayerTreeHost::SetViewportSize(const gfx::Size& device_viewport_size) {
|
| - if (device_viewport_size == device_viewport_size_)
|
| - return;
|
| -
|
| - device_viewport_size_ = device_viewport_size;
|
| -
|
| - SetNeedsCommit();
|
| -}
|
| -
|
| -void LayerTreeHost::SetTopControlsHeight(float height, bool shrink) {
|
| - if (top_controls_height_ == height &&
|
| - top_controls_shrink_blink_size_ == shrink)
|
| - return;
|
| -
|
| - top_controls_height_ = height;
|
| - top_controls_shrink_blink_size_ = shrink;
|
| - SetNeedsCommit();
|
| -}
|
| -
|
| -void LayerTreeHost::SetTopControlsShownRatio(float ratio) {
|
| - if (top_controls_shown_ratio_ == ratio)
|
| - return;
|
| -
|
| - top_controls_shown_ratio_ = ratio;
|
| - SetNeedsCommit();
|
| -}
|
| -
|
| -void LayerTreeHost::ApplyPageScaleDeltaFromImplSide(float page_scale_delta) {
|
| - DCHECK(CommitRequested());
|
| - page_scale_factor_ *= page_scale_delta;
|
| -}
|
| -
|
| -void LayerTreeHost::SetPageScaleFactorAndLimits(float page_scale_factor,
|
| - float min_page_scale_factor,
|
| - float max_page_scale_factor) {
|
| - if (page_scale_factor == page_scale_factor_ &&
|
| - min_page_scale_factor == min_page_scale_factor_ &&
|
| - max_page_scale_factor == max_page_scale_factor_)
|
| - return;
|
| -
|
| - page_scale_factor_ = page_scale_factor;
|
| - min_page_scale_factor_ = min_page_scale_factor;
|
| - max_page_scale_factor_ = max_page_scale_factor;
|
| - SetNeedsCommit();
|
| -}
|
| -
|
| -void LayerTreeHost::SetVisible(bool visible) {
|
| - if (visible_ == visible)
|
| - return;
|
| - visible_ = visible;
|
| - if (!visible)
|
| - ReduceMemoryUsage();
|
| - proxy_->SetVisible(visible);
|
| -}
|
| -
|
| -void LayerTreeHost::SetThrottleFrameProduction(bool throttle) {
|
| - proxy_->SetThrottleFrameProduction(throttle);
|
| -}
|
| -
|
| -void LayerTreeHost::StartPageScaleAnimation(const gfx::Vector2d& target_offset,
|
| - bool use_anchor,
|
| - float scale,
|
| - base::TimeDelta duration) {
|
| - pending_page_scale_animation_.reset(
|
| - new PendingPageScaleAnimation(
|
| - target_offset,
|
| - use_anchor,
|
| - scale,
|
| - duration));
|
| -
|
| - SetNeedsCommit();
|
| -}
|
| -
|
| -void LayerTreeHost::NotifyInputThrottledUntilCommit() {
|
| - proxy_->NotifyInputThrottledUntilCommit();
|
| -}
|
| -
|
| -void LayerTreeHost::Composite(base::TimeTicks frame_begin_time) {
|
| - DCHECK(!proxy_->HasImplThread());
|
| - // This function is only valid when not using the scheduler.
|
| - DCHECK(!settings_.single_thread_proxy_scheduler);
|
| - SingleThreadProxy* proxy = static_cast<SingleThreadProxy*>(proxy_.get());
|
| -
|
| - SetLayerTreeHostClientReady();
|
| - proxy->CompositeImmediately(frame_begin_time);
|
| -}
|
| -
|
| -bool LayerTreeHost::UpdateLayers(ResourceUpdateQueue* queue) {
|
| - DCHECK(!output_surface_lost_);
|
| -
|
| - if (!root_layer())
|
| - return false;
|
| -
|
| - DCHECK(!root_layer()->parent());
|
| -
|
| - bool result = UpdateLayers(root_layer(), queue);
|
| -
|
| - micro_benchmark_controller_.DidUpdateLayers();
|
| -
|
| - return result || next_commit_forces_redraw_;
|
| -}
|
| -
|
| -void LayerTreeHost::DidCompletePageScaleAnimation() {
|
| - did_complete_scale_animation_ = true;
|
| -}
|
| -
|
| -static Layer* FindFirstScrollableLayer(Layer* layer) {
|
| - if (!layer)
|
| - return NULL;
|
| -
|
| - if (layer->scrollable())
|
| - return layer;
|
| -
|
| - for (size_t i = 0; i < layer->children().size(); ++i) {
|
| - Layer* found = FindFirstScrollableLayer(layer->children()[i].get());
|
| - if (found)
|
| - return found;
|
| - }
|
| -
|
| - return NULL;
|
| -}
|
| -
|
| -void LayerTreeHost::RecordGpuRasterizationHistogram() {
|
| - // Gpu rasterization is only supported when impl-side painting is enabled.
|
| - if (gpu_rasterization_histogram_recorded_ || !settings_.impl_side_painting)
|
| - return;
|
| -
|
| - // Record how widely gpu rasterization is enabled.
|
| - // This number takes device/gpu whitelisting/backlisting into account.
|
| - // Note that we do not consider the forced gpu rasterization mode, which is
|
| - // mostly used for debugging purposes.
|
| - UMA_HISTOGRAM_BOOLEAN("Renderer4.GpuRasterizationEnabled",
|
| - settings_.gpu_rasterization_enabled);
|
| - if (settings_.gpu_rasterization_enabled) {
|
| - UMA_HISTOGRAM_BOOLEAN("Renderer4.GpuRasterizationTriggered",
|
| - has_gpu_rasterization_trigger_);
|
| - UMA_HISTOGRAM_BOOLEAN("Renderer4.GpuRasterizationSuitableContent",
|
| - content_is_suitable_for_gpu_rasterization_);
|
| - // Record how many pages actually get gpu rasterization when enabled.
|
| - UMA_HISTOGRAM_BOOLEAN("Renderer4.GpuRasterizationUsed",
|
| - (has_gpu_rasterization_trigger_ &&
|
| - content_is_suitable_for_gpu_rasterization_));
|
| - }
|
| -
|
| - gpu_rasterization_histogram_recorded_ = true;
|
| -}
|
| -
|
| -bool LayerTreeHost::UsingSharedMemoryResources() {
|
| - return GetRendererCapabilities().using_shared_memory_resources;
|
| -}
|
| -
|
| -bool LayerTreeHost::UpdateLayers(Layer* root_layer,
|
| - ResourceUpdateQueue* queue) {
|
| - TRACE_EVENT1("cc", "LayerTreeHost::UpdateLayers",
|
| - "source_frame_number", source_frame_number());
|
| -
|
| - RenderSurfaceLayerList update_list;
|
| - {
|
| - UpdateHudLayer();
|
| -
|
| - Layer* root_scroll = FindFirstScrollableLayer(root_layer);
|
| - Layer* page_scale_layer = page_scale_layer_.get();
|
| - if (!page_scale_layer && root_scroll)
|
| - page_scale_layer = root_scroll->parent();
|
| -
|
| - if (hud_layer_.get()) {
|
| - hud_layer_->PrepareForCalculateDrawProperties(
|
| - device_viewport_size(), device_scale_factor_);
|
| - }
|
| -
|
| - TRACE_EVENT0("cc", "LayerTreeHost::UpdateLayers::CalcDrawProps");
|
| - bool can_render_to_separate_surface = true;
|
| - // TODO(vmpstr): Passing 0 as the current render surface layer list id means
|
| - // that we won't be able to detect if a layer is part of |update_list|.
|
| - // Change this if this information is required.
|
| - int render_surface_layer_list_id = 0;
|
| - LayerTreeHostCommon::CalcDrawPropsMainInputs inputs(
|
| - root_layer, device_viewport_size(), gfx::Transform(),
|
| - device_scale_factor_, page_scale_factor_, page_scale_layer,
|
| - elastic_overscroll_, overscroll_elasticity_layer_.get(),
|
| - GetRendererCapabilities().max_texture_size, settings_.can_use_lcd_text,
|
| - settings_.layers_always_allowed_lcd_text,
|
| - can_render_to_separate_surface,
|
| - settings_.layer_transforms_should_scale_layer_contents,
|
| - settings_.verify_property_trees, &update_list,
|
| - render_surface_layer_list_id);
|
| - LayerTreeHostCommon::CalculateDrawProperties(&inputs);
|
| - }
|
| -
|
| - // Reset partial texture update requests.
|
| - partial_texture_update_requests_ = 0;
|
| -
|
| - bool did_paint_content = false;
|
| - bool need_more_updates = false;
|
| - PaintLayerContents(
|
| - update_list, queue, &did_paint_content, &need_more_updates);
|
| - if (need_more_updates) {
|
| - TRACE_EVENT0("cc", "LayerTreeHost::UpdateLayers::posting prepaint task");
|
| - prepaint_callback_.Reset(base::Bind(&LayerTreeHost::TriggerPrepaint,
|
| - base::Unretained(this)));
|
| - static base::TimeDelta prepaint_delay =
|
| - base::TimeDelta::FromMilliseconds(100);
|
| - base::MessageLoop::current()->PostDelayedTask(
|
| - FROM_HERE, prepaint_callback_.callback(), prepaint_delay);
|
| - }
|
| -
|
| - return did_paint_content;
|
| -}
|
| -
|
| -void LayerTreeHost::TriggerPrepaint() {
|
| - prepaint_callback_.Cancel();
|
| - TRACE_EVENT0("cc", "LayerTreeHost::TriggerPrepaint");
|
| - SetNeedsCommit();
|
| -}
|
| -
|
| -void LayerTreeHost::ReduceMemoryUsage() {
|
| - if (!root_layer())
|
| - return;
|
| -
|
| - LayerTreeHostCommon::CallFunctionForSubtree(
|
| - root_layer(), [](Layer* layer) { layer->ReduceMemoryUsage(); });
|
| -}
|
| -
|
| -void LayerTreeHost::SetPrioritiesForSurfaces(size_t surface_memory_bytes) {
|
| - DCHECK(surface_memory_placeholder_);
|
| -
|
| - // Surfaces have a place holder for their memory since they are managed
|
| - // independantly but should still be tracked and reduce other memory usage.
|
| - surface_memory_placeholder_->SetTextureManager(
|
| - contents_texture_manager_.get());
|
| - surface_memory_placeholder_->set_request_priority(
|
| - PriorityCalculator::RenderSurfacePriority());
|
| - surface_memory_placeholder_->SetToSelfManagedMemoryPlaceholder(
|
| - surface_memory_bytes);
|
| -}
|
| -
|
| -void LayerTreeHost::SetPrioritiesForLayers(
|
| - const RenderSurfaceLayerList& update_list) {
|
| - PriorityCalculator calculator;
|
| - typedef LayerIterator<Layer> LayerIteratorType;
|
| - LayerIteratorType end = LayerIteratorType::End(&update_list);
|
| - for (LayerIteratorType it = LayerIteratorType::Begin(&update_list);
|
| - it != end;
|
| - ++it) {
|
| - if (it.represents_itself()) {
|
| - it->SetTexturePriorities(calculator);
|
| - } else if (it.represents_target_render_surface()) {
|
| - if (it->mask_layer())
|
| - it->mask_layer()->SetTexturePriorities(calculator);
|
| - if (it->replica_layer() && it->replica_layer()->mask_layer())
|
| - it->replica_layer()->mask_layer()->SetTexturePriorities(calculator);
|
| - }
|
| - }
|
| -}
|
| -
|
| -void LayerTreeHost::PrioritizeTextures(
|
| - const RenderSurfaceLayerList& render_surface_layer_list) {
|
| - if (!contents_texture_manager_)
|
| - return;
|
| -
|
| - contents_texture_manager_->ClearPriorities();
|
| -
|
| - size_t memory_for_render_surfaces_metric =
|
| - CalculateMemoryForRenderSurfaces(render_surface_layer_list);
|
| -
|
| - SetPrioritiesForLayers(render_surface_layer_list);
|
| - SetPrioritiesForSurfaces(memory_for_render_surfaces_metric);
|
| -
|
| - contents_texture_manager_->PrioritizeTextures();
|
| -}
|
| -
|
| -size_t LayerTreeHost::CalculateMemoryForRenderSurfaces(
|
| - const RenderSurfaceLayerList& update_list) {
|
| - size_t readback_bytes = 0;
|
| - size_t contents_texture_bytes = 0;
|
| -
|
| - // Start iteration at 1 to skip the root surface as it does not have a texture
|
| - // cost.
|
| - for (size_t i = 1; i < update_list.size(); ++i) {
|
| - Layer* render_surface_layer = update_list.at(i);
|
| - RenderSurface* render_surface = render_surface_layer->render_surface();
|
| -
|
| - size_t bytes =
|
| - Resource::MemorySizeBytes(render_surface->content_rect().size(),
|
| - RGBA_8888);
|
| - contents_texture_bytes += bytes;
|
| -
|
| - if (render_surface_layer->background_filters().IsEmpty() &&
|
| - render_surface_layer->uses_default_blend_mode())
|
| - continue;
|
| -
|
| - if (!readback_bytes) {
|
| - readback_bytes = Resource::MemorySizeBytes(device_viewport_size_,
|
| - RGBA_8888);
|
| - }
|
| - }
|
| - return readback_bytes + contents_texture_bytes;
|
| -}
|
| -
|
| -void LayerTreeHost::PaintMasksForRenderSurface(Layer* render_surface_layer,
|
| - ResourceUpdateQueue* queue,
|
| - bool* did_paint_content,
|
| - bool* need_more_updates) {
|
| - // Note: Masks and replicas only exist for layers that own render surfaces. If
|
| - // we reach this point in code, we already know that at least something will
|
| - // be drawn into this render surface, so the mask and replica should be
|
| - // painted.
|
| -
|
| - Layer* mask_layer = render_surface_layer->mask_layer();
|
| - if (mask_layer) {
|
| - *did_paint_content |= mask_layer->Update(queue, NULL);
|
| - *need_more_updates |= mask_layer->NeedMoreUpdates();
|
| - }
|
| -
|
| - Layer* replica_mask_layer =
|
| - render_surface_layer->replica_layer() ?
|
| - render_surface_layer->replica_layer()->mask_layer() : NULL;
|
| - if (replica_mask_layer) {
|
| - *did_paint_content |= replica_mask_layer->Update(queue, NULL);
|
| - *need_more_updates |= replica_mask_layer->NeedMoreUpdates();
|
| - }
|
| -}
|
| -
|
| -void LayerTreeHost::PaintLayerContents(
|
| - const RenderSurfaceLayerList& render_surface_layer_list,
|
| - ResourceUpdateQueue* queue,
|
| - bool* did_paint_content,
|
| - bool* need_more_updates) {
|
| - OcclusionTracker<Layer> occlusion_tracker(
|
| - root_layer_->render_surface()->content_rect());
|
| - occlusion_tracker.set_minimum_tracking_size(
|
| - settings_.minimum_occlusion_tracking_size);
|
| -
|
| - PrioritizeTextures(render_surface_layer_list);
|
| -
|
| - in_paint_layer_contents_ = true;
|
| -
|
| - // Iterates front-to-back to allow for testing occlusion and performing
|
| - // culling during the tree walk.
|
| - typedef LayerIterator<Layer> LayerIteratorType;
|
| - LayerIteratorType end = LayerIteratorType::End(&render_surface_layer_list);
|
| - for (LayerIteratorType it =
|
| - LayerIteratorType::Begin(&render_surface_layer_list);
|
| - it != end;
|
| - ++it) {
|
| - occlusion_tracker.EnterLayer(it);
|
| -
|
| - if (it.represents_target_render_surface()) {
|
| - PaintMasksForRenderSurface(
|
| - *it, queue, did_paint_content, need_more_updates);
|
| - } else if (it.represents_itself()) {
|
| - DCHECK(!it->paint_properties().bounds.IsEmpty());
|
| - *did_paint_content |= it->Update(queue, &occlusion_tracker);
|
| - *need_more_updates |= it->NeedMoreUpdates();
|
| - // Note the '&&' with previous is-suitable state.
|
| - // This means that once the layer-tree becomes unsuitable for gpu
|
| - // rasterization due to some content, it will continue to be unsuitable
|
| - // even if that content is replaced by gpu-friendly content.
|
| - // This is to avoid switching back-and-forth between gpu and sw
|
| - // rasterization which may be both bad for performance and visually
|
| - // jarring.
|
| - content_is_suitable_for_gpu_rasterization_ &=
|
| - it->IsSuitableForGpuRasterization();
|
| - }
|
| -
|
| - occlusion_tracker.LeaveLayer(it);
|
| - }
|
| -
|
| - in_paint_layer_contents_ = false;
|
| -}
|
| -
|
| -void LayerTreeHost::ApplyScrollAndScale(ScrollAndScaleSet* info) {
|
| - ScopedPtrVector<SwapPromise>::iterator it = info->swap_promises.begin();
|
| - for (; it != info->swap_promises.end(); ++it) {
|
| - scoped_ptr<SwapPromise> swap_promise(info->swap_promises.take(it));
|
| - TRACE_EVENT_FLOW_STEP0("input",
|
| - "LatencyInfo.Flow",
|
| - TRACE_ID_DONT_MANGLE(swap_promise->TraceId()),
|
| - "Main thread scroll update");
|
| - QueueSwapPromise(swap_promise.Pass());
|
| - }
|
| -
|
| - gfx::Vector2dF inner_viewport_scroll_delta;
|
| - gfx::Vector2dF outer_viewport_scroll_delta;
|
| -
|
| - if (root_layer_.get()) {
|
| - for (size_t i = 0; i < info->scrolls.size(); ++i) {
|
| - Layer* layer = LayerTreeHostCommon::FindLayerInSubtree(
|
| - root_layer_.get(), info->scrolls[i].layer_id);
|
| - if (!layer)
|
| - continue;
|
| - if (layer == outer_viewport_scroll_layer_.get()) {
|
| - outer_viewport_scroll_delta += info->scrolls[i].scroll_delta;
|
| - } else if (layer == inner_viewport_scroll_layer_.get()) {
|
| - inner_viewport_scroll_delta += info->scrolls[i].scroll_delta;
|
| - } else {
|
| - layer->SetScrollOffsetFromImplSide(
|
| - gfx::ScrollOffsetWithDelta(layer->scroll_offset(),
|
| - info->scrolls[i].scroll_delta));
|
| - }
|
| - }
|
| - }
|
| -
|
| - if (!inner_viewport_scroll_delta.IsZero() ||
|
| - !outer_viewport_scroll_delta.IsZero() || info->page_scale_delta != 1.f ||
|
| - !info->elastic_overscroll_delta.IsZero() || info->top_controls_delta) {
|
| - // Preemptively apply the scroll offset and scale delta here before sending
|
| - // it to the client. If the client comes back and sets it to the same
|
| - // value, then the layer can early out without needing a full commit.
|
| - if (inner_viewport_scroll_layer_.get()) {
|
| - inner_viewport_scroll_layer_->SetScrollOffsetFromImplSide(
|
| - gfx::ScrollOffsetWithDelta(
|
| - inner_viewport_scroll_layer_->scroll_offset(),
|
| - inner_viewport_scroll_delta));
|
| - }
|
| -
|
| - if (outer_viewport_scroll_layer_.get()) {
|
| - outer_viewport_scroll_layer_->SetScrollOffsetFromImplSide(
|
| - gfx::ScrollOffsetWithDelta(
|
| - outer_viewport_scroll_layer_->scroll_offset(),
|
| - outer_viewport_scroll_delta));
|
| - }
|
| -
|
| - ApplyPageScaleDeltaFromImplSide(info->page_scale_delta);
|
| - elastic_overscroll_ += info->elastic_overscroll_delta;
|
| - if (!settings_.use_pinch_virtual_viewport) {
|
| - // TODO(miletus): Make sure either this code path is totally gone,
|
| - // or revisit the flooring here if the old pinch viewport code path
|
| - // is causing problems with fractional scroll offset.
|
| - client_->ApplyViewportDeltas(
|
| - gfx::ToFlooredVector2d(inner_viewport_scroll_delta +
|
| - outer_viewport_scroll_delta),
|
| - info->page_scale_delta, info->top_controls_delta);
|
| - } else {
|
| - // TODO(ccameron): pass the elastic overscroll here so that input events
|
| - // may be translated appropriately.
|
| - client_->ApplyViewportDeltas(
|
| - inner_viewport_scroll_delta, outer_viewport_scroll_delta,
|
| - info->elastic_overscroll_delta, info->page_scale_delta,
|
| - info->top_controls_delta);
|
| - }
|
| - }
|
| -}
|
| -
|
| -void LayerTreeHost::StartRateLimiter() {
|
| - if (inside_begin_main_frame_)
|
| - return;
|
| -
|
| - if (!rate_limit_timer_.IsRunning()) {
|
| - rate_limit_timer_.Start(FROM_HERE,
|
| - base::TimeDelta(),
|
| - this,
|
| - &LayerTreeHost::RateLimit);
|
| - }
|
| -}
|
| -
|
| -void LayerTreeHost::StopRateLimiter() {
|
| - rate_limit_timer_.Stop();
|
| -}
|
| -
|
| -void LayerTreeHost::RateLimit() {
|
| - // Force a no-op command on the compositor context, so that any ratelimiting
|
| - // commands will wait for the compositing context, and therefore for the
|
| - // SwapBuffers.
|
| - proxy_->ForceSerializeOnSwapBuffers();
|
| - client_->RateLimitSharedMainThreadContext();
|
| -}
|
| -
|
| -bool LayerTreeHost::AlwaysUsePartialTextureUpdates() {
|
| - if (!proxy_->GetRendererCapabilities().allow_partial_texture_updates)
|
| - return false;
|
| - return !proxy_->HasImplThread();
|
| -}
|
| -
|
| -size_t LayerTreeHost::MaxPartialTextureUpdates() const {
|
| - size_t max_partial_texture_updates = 0;
|
| - if (proxy_->GetRendererCapabilities().allow_partial_texture_updates &&
|
| - !settings_.impl_side_painting) {
|
| - max_partial_texture_updates =
|
| - std::min(settings_.max_partial_texture_updates,
|
| - proxy_->MaxPartialTextureUpdates());
|
| - }
|
| - return max_partial_texture_updates;
|
| -}
|
| -
|
| -bool LayerTreeHost::RequestPartialTextureUpdate() {
|
| - if (partial_texture_update_requests_ >= MaxPartialTextureUpdates())
|
| - return false;
|
| -
|
| - partial_texture_update_requests_++;
|
| - return true;
|
| -}
|
| -
|
| -void LayerTreeHost::SetDeviceScaleFactor(float device_scale_factor) {
|
| - if (device_scale_factor == device_scale_factor_)
|
| - return;
|
| - device_scale_factor_ = device_scale_factor;
|
| -
|
| - SetNeedsCommit();
|
| -}
|
| -
|
| -void LayerTreeHost::UpdateTopControlsState(TopControlsState constraints,
|
| - TopControlsState current,
|
| - bool animate) {
|
| - // Top controls are only used in threaded mode.
|
| - proxy_->ImplThreadTaskRunner()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&TopControlsManager::UpdateTopControlsState,
|
| - top_controls_manager_weak_ptr_,
|
| - constraints,
|
| - current,
|
| - animate));
|
| -}
|
| -
|
| -void LayerTreeHost::AnimateLayers(base::TimeTicks monotonic_time) {
|
| - if (!settings_.accelerated_animation_enabled)
|
| - return;
|
| -
|
| - if (animation_registrar_->AnimateLayers(monotonic_time))
|
| - animation_registrar_->UpdateAnimationState(true, NULL);
|
| -}
|
| -
|
| -UIResourceId LayerTreeHost::CreateUIResource(UIResourceClient* client) {
|
| - DCHECK(client);
|
| -
|
| - UIResourceId next_id = next_ui_resource_id_++;
|
| - DCHECK(ui_resource_client_map_.find(next_id) ==
|
| - ui_resource_client_map_.end());
|
| -
|
| - bool resource_lost = false;
|
| - UIResourceRequest request(UIResourceRequest::UI_RESOURCE_CREATE, next_id,
|
| - client->GetBitmap(next_id, resource_lost));
|
| - ui_resource_request_queue_.push_back(request);
|
| -
|
| - UIResourceClientData data;
|
| - data.client = client;
|
| - data.size = request.GetBitmap().GetSize();
|
| -
|
| - ui_resource_client_map_[request.GetId()] = data;
|
| - return request.GetId();
|
| -}
|
| -
|
| -// Deletes a UI resource. May safely be called more than once.
|
| -void LayerTreeHost::DeleteUIResource(UIResourceId uid) {
|
| - UIResourceClientMap::iterator iter = ui_resource_client_map_.find(uid);
|
| - if (iter == ui_resource_client_map_.end())
|
| - return;
|
| -
|
| - UIResourceRequest request(UIResourceRequest::UI_RESOURCE_DELETE, uid);
|
| - ui_resource_request_queue_.push_back(request);
|
| - ui_resource_client_map_.erase(iter);
|
| -}
|
| -
|
| -void LayerTreeHost::RecreateUIResources() {
|
| - for (UIResourceClientMap::iterator iter = ui_resource_client_map_.begin();
|
| - iter != ui_resource_client_map_.end();
|
| - ++iter) {
|
| - UIResourceId uid = iter->first;
|
| - const UIResourceClientData& data = iter->second;
|
| - bool resource_lost = true;
|
| - UIResourceRequest request(UIResourceRequest::UI_RESOURCE_CREATE, uid,
|
| - data.client->GetBitmap(uid, resource_lost));
|
| - ui_resource_request_queue_.push_back(request);
|
| - }
|
| -}
|
| -
|
| -// Returns the size of a resource given its id.
|
| -gfx::Size LayerTreeHost::GetUIResourceSize(UIResourceId uid) const {
|
| - UIResourceClientMap::const_iterator iter = ui_resource_client_map_.find(uid);
|
| - if (iter == ui_resource_client_map_.end())
|
| - return gfx::Size();
|
| -
|
| - const UIResourceClientData& data = iter->second;
|
| - return data.size;
|
| -}
|
| -
|
| -void LayerTreeHost::RegisterViewportLayers(
|
| - scoped_refptr<Layer> overscroll_elasticity_layer,
|
| - scoped_refptr<Layer> page_scale_layer,
|
| - scoped_refptr<Layer> inner_viewport_scroll_layer,
|
| - scoped_refptr<Layer> outer_viewport_scroll_layer) {
|
| - overscroll_elasticity_layer_ = overscroll_elasticity_layer;
|
| - page_scale_layer_ = page_scale_layer;
|
| - inner_viewport_scroll_layer_ = inner_viewport_scroll_layer;
|
| - outer_viewport_scroll_layer_ = outer_viewport_scroll_layer;
|
| -}
|
| -
|
| -void LayerTreeHost::RegisterSelection(const LayerSelectionBound& start,
|
| - const LayerSelectionBound& end) {
|
| - if (selection_start_ == start && selection_end_ == end)
|
| - return;
|
| -
|
| - selection_start_ = start;
|
| - selection_end_ = end;
|
| - SetNeedsCommit();
|
| -}
|
| -
|
| -int LayerTreeHost::ScheduleMicroBenchmark(
|
| - const std::string& benchmark_name,
|
| - scoped_ptr<base::Value> value,
|
| - const MicroBenchmark::DoneCallback& callback) {
|
| - return micro_benchmark_controller_.ScheduleRun(
|
| - benchmark_name, value.Pass(), callback);
|
| -}
|
| -
|
| -bool LayerTreeHost::SendMessageToMicroBenchmark(int id,
|
| - scoped_ptr<base::Value> value) {
|
| - return micro_benchmark_controller_.SendMessage(id, value.Pass());
|
| -}
|
| -
|
| -void LayerTreeHost::InsertSwapPromiseMonitor(SwapPromiseMonitor* monitor) {
|
| - swap_promise_monitor_.insert(monitor);
|
| -}
|
| -
|
| -void LayerTreeHost::RemoveSwapPromiseMonitor(SwapPromiseMonitor* monitor) {
|
| - swap_promise_monitor_.erase(monitor);
|
| -}
|
| -
|
| -void LayerTreeHost::NotifySwapPromiseMonitorsOfSetNeedsCommit() {
|
| - std::set<SwapPromiseMonitor*>::iterator it = swap_promise_monitor_.begin();
|
| - for (; it != swap_promise_monitor_.end(); it++)
|
| - (*it)->OnSetNeedsCommitOnMain();
|
| -}
|
| -
|
| -void LayerTreeHost::QueueSwapPromise(scoped_ptr<SwapPromise> swap_promise) {
|
| - DCHECK(swap_promise);
|
| - swap_promise_list_.push_back(swap_promise.Pass());
|
| -}
|
| -
|
| -void LayerTreeHost::BreakSwapPromises(SwapPromise::DidNotSwapReason reason) {
|
| - for (size_t i = 0; i < swap_promise_list_.size(); i++)
|
| - swap_promise_list_[i]->DidNotSwap(reason);
|
| - swap_promise_list_.clear();
|
| -}
|
| -
|
| -void LayerTreeHost::set_surface_id_namespace(uint32_t id_namespace) {
|
| - surface_id_namespace_ = id_namespace;
|
| -}
|
| -
|
| -SurfaceSequence LayerTreeHost::CreateSurfaceSequence() {
|
| - return SurfaceSequence(surface_id_namespace_, next_surface_sequence_++);
|
| -}
|
| -
|
| -void LayerTreeHost::SetChildrenNeedBeginFrames(
|
| - bool children_need_begin_frames) const {
|
| - proxy_->SetChildrenNeedBeginFrames(children_need_begin_frames);
|
| -}
|
| -
|
| -void LayerTreeHost::SendBeginFramesToChildren(
|
| - const BeginFrameArgs& args) const {
|
| - client_->SendBeginFramesToChildren(args);
|
| -}
|
| -
|
| -} // namespace cc
|
|
|