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

Side by Side Diff: cc/trees/layer_tree_host_impl.cc

Issue 903273002: Update from https://crrev.com/315085 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 10 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
« no previous file with comments | « cc/trees/layer_tree_host_impl.h ('k') | cc/trees/layer_tree_host_impl_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2011 The Chromium Authors. All rights reserved. 1 // Copyright 2011 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 "cc/trees/layer_tree_host_impl.h" 5 #include "cc/trees/layer_tree_host_impl.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <limits> 8 #include <limits>
9 9
10 #include "base/basictypes.h" 10 #include "base/basictypes.h"
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
109 delta = outer_->ScrollBy(delta); 109 delta = outer_->ScrollBy(delta);
110 inner_->ScrollBy(delta); 110 inner_->ScrollBy(delta);
111 } 111 }
112 112
113 private: 113 private:
114 LayerImpl* inner_; 114 LayerImpl* inner_;
115 LayerImpl* outer_; 115 LayerImpl* outer_;
116 gfx::ScrollOffset viewport_in_content_coordinates_; 116 gfx::ScrollOffset viewport_in_content_coordinates_;
117 }; 117 };
118 118
119
120 void DidVisibilityChange(LayerTreeHostImpl* id, bool visible) { 119 void DidVisibilityChange(LayerTreeHostImpl* id, bool visible) {
121 if (visible) { 120 if (visible) {
122 TRACE_EVENT_ASYNC_BEGIN1("webkit", 121 TRACE_EVENT_ASYNC_BEGIN1("cc", "LayerTreeHostImpl::SetVisible", id,
123 "LayerTreeHostImpl::SetVisible", 122 "LayerTreeHostImpl", id);
124 id,
125 "LayerTreeHostImpl",
126 id);
127 return; 123 return;
128 } 124 }
129 125
130 TRACE_EVENT_ASYNC_END0("webkit", "LayerTreeHostImpl::SetVisible", id); 126 TRACE_EVENT_ASYNC_END0("cc", "LayerTreeHostImpl::SetVisible", id);
131 } 127 }
132 128
133 size_t GetMaxTransferBufferUsageBytes( 129 size_t GetMaxTransferBufferUsageBytes(
134 const ContextProvider::Capabilities& context_capabilities, 130 const ContextProvider::Capabilities& context_capabilities,
135 double refresh_rate) { 131 double refresh_rate) {
136 // We want to make sure the default transfer buffer size is equal to the 132 // We want to make sure the default transfer buffer size is equal to the
137 // amount of data that can be uploaded by the compositor to avoid stalling 133 // amount of data that can be uploaded by the compositor to avoid stalling
138 // the pipeline. 134 // the pipeline.
139 // For reference Chromebook Pixel can upload 1MB in about 0.5ms. 135 // For reference Chromebook Pixel can upload 1MB in about 0.5ms.
140 const size_t kMaxBytesUploadedPerMs = 1024 * 1024 * 2; 136 const size_t kMaxBytesUploadedPerMs = 1024 * 1024 * 2;
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
222 device_scale_factor_(1.f), 218 device_scale_factor_(1.f),
223 resourceless_software_draw_(false), 219 resourceless_software_draw_(false),
224 begin_impl_frame_interval_(BeginFrameArgs::DefaultInterval()), 220 begin_impl_frame_interval_(BeginFrameArgs::DefaultInterval()),
225 animation_registrar_(AnimationRegistrar::Create()), 221 animation_registrar_(AnimationRegistrar::Create()),
226 rendering_stats_instrumentation_(rendering_stats_instrumentation), 222 rendering_stats_instrumentation_(rendering_stats_instrumentation),
227 micro_benchmark_controller_(this), 223 micro_benchmark_controller_(this),
228 shared_bitmap_manager_(shared_bitmap_manager), 224 shared_bitmap_manager_(shared_bitmap_manager),
229 gpu_memory_buffer_manager_(gpu_memory_buffer_manager), 225 gpu_memory_buffer_manager_(gpu_memory_buffer_manager),
230 id_(id), 226 id_(id),
231 requires_high_res_to_draw_(false), 227 requires_high_res_to_draw_(false),
232 is_likely_to_require_a_draw_(false) { 228 is_likely_to_require_a_draw_(false),
229 frame_timing_tracker_(FrameTimingTracker::Create()) {
233 DCHECK(proxy_->IsImplThread()); 230 DCHECK(proxy_->IsImplThread());
234 DidVisibilityChange(this, visible_); 231 DidVisibilityChange(this, visible_);
235 animation_registrar_->set_supports_scroll_animations( 232 animation_registrar_->set_supports_scroll_animations(
236 proxy_->SupportsImplScrolling()); 233 proxy_->SupportsImplScrolling());
237 234
238 SetDebugState(settings.initial_debug_state); 235 SetDebugState(settings.initial_debug_state);
239 236
240 // LTHI always has an active tree. 237 // LTHI always has an active tree.
241 active_tree_ = LayerTreeImpl::create(this, new SyncedProperty<ScaleGroup>(), 238 active_tree_ = LayerTreeImpl::create(this, new SyncedProperty<ScaleGroup>(),
242 new SyncedElasticOverscroll); 239 new SyncedElasticOverscroll);
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
462 gfx::PointF device_viewport_point = 459 gfx::PointF device_viewport_point =
463 gfx::ScalePoint(viewport_point, device_scale_factor_); 460 gfx::ScalePoint(viewport_point, device_scale_factor_);
464 461
465 LayerImpl* layer_impl = 462 LayerImpl* layer_impl =
466 active_tree_->FindLayerWithWheelHandlerThatIsHitByPoint( 463 active_tree_->FindLayerWithWheelHandlerThatIsHitByPoint(
467 device_viewport_point); 464 device_viewport_point);
468 465
469 return layer_impl != NULL; 466 return layer_impl != NULL;
470 } 467 }
471 468
472 bool LayerTreeHostImpl::HaveTouchEventHandlersAt( 469 static LayerImpl* NextScrollLayer(LayerImpl* layer) {
470 if (LayerImpl* scroll_parent = layer->scroll_parent())
471 return scroll_parent;
472 return layer->parent();
473 }
474
475 static ScrollBlocksOn EffectiveScrollBlocksOn(LayerImpl* layer) {
476 ScrollBlocksOn blocks = ScrollBlocksOnNone;
477 for (; layer; layer = NextScrollLayer(layer)) {
478 blocks |= layer->scroll_blocks_on();
479 }
480 return blocks;
481 }
482
483 bool LayerTreeHostImpl::DoTouchEventsBlockScrollAt(
473 const gfx::Point& viewport_point) { 484 const gfx::Point& viewport_point) {
474
475 gfx::PointF device_viewport_point = 485 gfx::PointF device_viewport_point =
476 gfx::ScalePoint(viewport_point, device_scale_factor_); 486 gfx::ScalePoint(viewport_point, device_scale_factor_);
477 487
488 // First check if scrolling at this point is required to block on any
489 // touch event handlers. Note that we must start at the innermost layer
490 // (as opposed to only the layer found to contain a touch handler region
491 // below) to ensure all relevant scroll-blocks-on values are applied.
478 LayerImpl* layer_impl = 492 LayerImpl* layer_impl =
479 active_tree_->FindLayerThatIsHitByPointInTouchHandlerRegion( 493 active_tree_->FindLayerThatIsHitByPoint(device_viewport_point);
480 device_viewport_point); 494 ScrollBlocksOn blocking = EffectiveScrollBlocksOn(layer_impl);
495 if (!(blocking & ScrollBlocksOnStartTouch))
496 return false;
481 497
498 // Now determine if there are actually any handlers at that point.
499 // TODO(rbyers): Consider also honoring touch-action (crbug.com/347272).
500 layer_impl = active_tree_->FindLayerThatIsHitByPointInTouchHandlerRegion(
501 device_viewport_point);
482 return layer_impl != NULL; 502 return layer_impl != NULL;
483 } 503 }
484 504
485 scoped_ptr<SwapPromiseMonitor> 505 scoped_ptr<SwapPromiseMonitor>
486 LayerTreeHostImpl::CreateLatencyInfoSwapPromiseMonitor( 506 LayerTreeHostImpl::CreateLatencyInfoSwapPromiseMonitor(
487 ui::LatencyInfo* latency) { 507 ui::LatencyInfo* latency) {
488 return make_scoped_ptr( 508 return make_scoped_ptr(
489 new LatencyInfoSwapPromiseMonitor(latency, NULL, this)); 509 new LatencyInfoSwapPromiseMonitor(latency, NULL, this));
490 } 510 }
491 511
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
667 bool root_surface_has_no_visible_damage = 687 bool root_surface_has_no_visible_damage =
668 !root_surface->damage_tracker()->current_damage_rect().Intersects( 688 !root_surface->damage_tracker()->current_damage_rect().Intersects(
669 root_surface->content_rect()); 689 root_surface->content_rect());
670 bool root_surface_has_contributing_layers = 690 bool root_surface_has_contributing_layers =
671 !root_surface->layer_list().empty(); 691 !root_surface->layer_list().empty();
672 bool hud_wants_to_draw_ = active_tree_->hud_layer() && 692 bool hud_wants_to_draw_ = active_tree_->hud_layer() &&
673 active_tree_->hud_layer()->IsAnimatingHUDContents(); 693 active_tree_->hud_layer()->IsAnimatingHUDContents();
674 if (root_surface_has_contributing_layers && 694 if (root_surface_has_contributing_layers &&
675 root_surface_has_no_visible_damage && 695 root_surface_has_no_visible_damage &&
676 active_tree_->LayersWithCopyOutputRequest().empty() && 696 active_tree_->LayersWithCopyOutputRequest().empty() &&
697 !output_surface_->capabilities().can_force_reclaim_resources &&
677 !hud_wants_to_draw_) { 698 !hud_wants_to_draw_) {
678 TRACE_EVENT0("cc", 699 TRACE_EVENT0("cc",
679 "LayerTreeHostImpl::CalculateRenderPasses::EmptyDamageRect"); 700 "LayerTreeHostImpl::CalculateRenderPasses::EmptyDamageRect");
680 frame->has_no_damage = true; 701 frame->has_no_damage = true;
681 DCHECK(!output_surface_->capabilities() 702 DCHECK(!output_surface_->capabilities()
682 .draw_and_swap_full_viewport_every_frame); 703 .draw_and_swap_full_viewport_every_frame);
683 return DRAW_SUCCESS; 704 return DRAW_SUCCESS;
684 } 705 }
685 706
686 TRACE_EVENT1("cc", 707 TRACE_EVENT1("cc",
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
806 827
807 contributing_render_pass_id = 828 contributing_render_pass_id =
808 it->NextContributingRenderPassId(contributing_render_pass_id); 829 it->NextContributingRenderPassId(contributing_render_pass_id);
809 } 830 }
810 } 831 }
811 832
812 AppendQuadsForLayer(target_render_pass, 833 AppendQuadsForLayer(target_render_pass,
813 *it, 834 *it,
814 occlusion_tracker, 835 occlusion_tracker,
815 &append_quads_data); 836 &append_quads_data);
837
838 // For layers that represent themselves, add composite frame timing
839 // requests if the visible rect intersects the requested rect.
840 for (const auto& request : it->frame_timing_requests()) {
841 const gfx::Rect& request_content_rect =
842 it->LayerRectToContentRect(request.rect());
843 if (request_content_rect.Intersects(it->visible_content_rect())) {
844 frame->composite_events.push_back(
845 FrameTimingTracker::FrameAndRectIds(
846 active_tree_->source_frame_number(), request.id()));
847 }
848 }
816 } 849 }
817 850
818 ++layers_drawn; 851 ++layers_drawn;
819 } 852 }
820 853
821 rendering_stats_instrumentation_->AddVisibleContentArea( 854 rendering_stats_instrumentation_->AddVisibleContentArea(
822 append_quads_data.visible_content_area); 855 append_quads_data.visible_content_area);
823 rendering_stats_instrumentation_->AddApproximatedVisibleContentArea( 856 rendering_stats_instrumentation_->AddApproximatedVisibleContentArea(
824 append_quads_data.approximated_visible_content_area); 857 append_quads_data.approximated_visible_content_area);
825 858
(...skipping 605 matching lines...) Expand 10 before | Expand all | Expand 10 after
1431 1464
1432 static void LayerTreeHostImplDidBeginTracingCallback(LayerImpl* layer) { 1465 static void LayerTreeHostImplDidBeginTracingCallback(LayerImpl* layer) {
1433 layer->DidBeginTracing(); 1466 layer->DidBeginTracing();
1434 } 1467 }
1435 1468
1436 void LayerTreeHostImpl::DrawLayers(FrameData* frame, 1469 void LayerTreeHostImpl::DrawLayers(FrameData* frame,
1437 base::TimeTicks frame_begin_time) { 1470 base::TimeTicks frame_begin_time) {
1438 TRACE_EVENT0("cc", "LayerTreeHostImpl::DrawLayers"); 1471 TRACE_EVENT0("cc", "LayerTreeHostImpl::DrawLayers");
1439 DCHECK(CanDraw()); 1472 DCHECK(CanDraw());
1440 1473
1474 if (!frame->composite_events.empty()) {
1475 frame_timing_tracker_->SaveTimeStamps(frame_begin_time,
1476 frame->composite_events);
1477 }
1478
1441 if (frame->has_no_damage) { 1479 if (frame->has_no_damage) {
1442 TRACE_EVENT_INSTANT0("cc", "EarlyOut_NoDamage", TRACE_EVENT_SCOPE_THREAD); 1480 TRACE_EVENT_INSTANT0("cc", "EarlyOut_NoDamage", TRACE_EVENT_SCOPE_THREAD);
1443 DCHECK(!output_surface_->capabilities() 1481 DCHECK(!output_surface_->capabilities()
1444 .draw_and_swap_full_viewport_every_frame); 1482 .draw_and_swap_full_viewport_every_frame);
1445 return; 1483 return;
1446 } 1484 }
1447 1485
1448 DCHECK(!frame->render_passes.empty()); 1486 DCHECK(!frame->render_passes.empty());
1449 1487
1450 fps_counter_->SaveTimeStamp(frame_begin_time, 1488 fps_counter_->SaveTimeStamp(frame_begin_time,
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
1570 // query the new state of |use_gpu_rasterization_|. 1608 // query the new state of |use_gpu_rasterization_|.
1571 use_gpu_rasterization_ = use_gpu; 1609 use_gpu_rasterization_ = use_gpu;
1572 1610
1573 // Clean up and replace existing tile manager with another one that uses 1611 // Clean up and replace existing tile manager with another one that uses
1574 // appropriate rasterizer. 1612 // appropriate rasterizer.
1575 ReleaseTreeResources(); 1613 ReleaseTreeResources();
1576 if (tile_manager_) { 1614 if (tile_manager_) {
1577 DestroyTileManager(); 1615 DestroyTileManager();
1578 CreateAndSetTileManager(); 1616 CreateAndSetTileManager();
1579 } 1617 }
1618 RecreateTreeResources();
1580 1619
1581 // We have released tilings for both active and pending tree. 1620 // We have released tilings for both active and pending tree.
1582 // We would not have any content to draw until the pending tree is activated. 1621 // We would not have any content to draw until the pending tree is activated.
1583 // Prevent the active tree from drawing until activation. 1622 // Prevent the active tree from drawing until activation.
1584 SetRequiresHighResToDraw(); 1623 SetRequiresHighResToDraw();
1585 } 1624 }
1586 1625
1587 const RendererCapabilitiesImpl& 1626 const RendererCapabilitiesImpl&
1588 LayerTreeHostImpl::GetRendererCapabilities() const { 1627 LayerTreeHostImpl::GetRendererCapabilities() const {
1589 return renderer_->Capabilities(); 1628 return renderer_->Capabilities();
(...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after
1888 void LayerTreeHostImpl::ReleaseTreeResources() { 1927 void LayerTreeHostImpl::ReleaseTreeResources() {
1889 active_tree_->ReleaseResources(); 1928 active_tree_->ReleaseResources();
1890 if (pending_tree_) 1929 if (pending_tree_)
1891 pending_tree_->ReleaseResources(); 1930 pending_tree_->ReleaseResources();
1892 if (recycle_tree_) 1931 if (recycle_tree_)
1893 recycle_tree_->ReleaseResources(); 1932 recycle_tree_->ReleaseResources();
1894 1933
1895 EvictAllUIResources(); 1934 EvictAllUIResources();
1896 } 1935 }
1897 1936
1937 void LayerTreeHostImpl::RecreateTreeResources() {
1938 active_tree_->RecreateResources();
1939 if (pending_tree_)
1940 pending_tree_->RecreateResources();
1941 if (recycle_tree_)
1942 recycle_tree_->RecreateResources();
1943 }
1944
1898 void LayerTreeHostImpl::CreateAndSetRenderer() { 1945 void LayerTreeHostImpl::CreateAndSetRenderer() {
1899 DCHECK(!renderer_); 1946 DCHECK(!renderer_);
1900 DCHECK(output_surface_); 1947 DCHECK(output_surface_);
1901 DCHECK(resource_provider_); 1948 DCHECK(resource_provider_);
1902 1949
1903 if (output_surface_->capabilities().delegated_rendering) { 1950 if (output_surface_->capabilities().delegated_rendering) {
1904 renderer_ = DelegatingRenderer::Create(this, &settings_.renderer_settings, 1951 renderer_ = DelegatingRenderer::Create(this, &settings_.renderer_settings,
1905 output_surface_.get(), 1952 output_surface_.get(),
1906 resource_provider_.get()); 1953 resource_provider_.get());
1907 } else if (output_surface_->context_provider()) { 1954 } else if (output_surface_->context_provider()) {
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
1952 tile_task_worker_pool_->AsTileTaskRunner(), 1999 tile_task_worker_pool_->AsTileTaskRunner(),
1953 rasterizer_.get(), scheduled_raster_task_limit); 2000 rasterizer_.get(), scheduled_raster_task_limit);
1954 2001
1955 UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy()); 2002 UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy());
1956 } 2003 }
1957 2004
1958 scoped_ptr<Rasterizer> LayerTreeHostImpl::CreateRasterizer() { 2005 scoped_ptr<Rasterizer> LayerTreeHostImpl::CreateRasterizer() {
1959 ContextProvider* context_provider = output_surface_->context_provider(); 2006 ContextProvider* context_provider = output_surface_->context_provider();
1960 if (use_gpu_rasterization_ && context_provider) { 2007 if (use_gpu_rasterization_ && context_provider) {
1961 return GpuRasterizer::Create(context_provider, resource_provider_.get(), 2008 return GpuRasterizer::Create(context_provider, resource_provider_.get(),
1962 settings_.use_distance_field_text, false, 2009 settings_.use_distance_field_text,
2010 settings_.threaded_gpu_rasterization_enabled,
1963 settings_.gpu_rasterization_msaa_sample_count); 2011 settings_.gpu_rasterization_msaa_sample_count);
1964 } 2012 }
1965 return SoftwareRasterizer::Create(); 2013 return SoftwareRasterizer::Create();
1966 } 2014 }
1967 2015
1968 void LayerTreeHostImpl::CreateResourceAndTileTaskWorkerPool( 2016 void LayerTreeHostImpl::CreateResourceAndTileTaskWorkerPool(
1969 scoped_ptr<TileTaskWorkerPool>* tile_task_worker_pool, 2017 scoped_ptr<TileTaskWorkerPool>* tile_task_worker_pool,
1970 scoped_ptr<ResourcePool>* resource_pool, 2018 scoped_ptr<ResourcePool>* resource_pool,
1971 scoped_ptr<ResourcePool>* staging_resource_pool) { 2019 scoped_ptr<ResourcePool>* staging_resource_pool) {
1972 base::SingleThreadTaskRunner* task_runner = 2020 base::SingleThreadTaskRunner* task_runner =
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
2078 // the old resources (i.e. render_surfaces and texture IDs). Clear them 2126 // the old resources (i.e. render_surfaces and texture IDs). Clear them
2079 // before we destroy the old resource provider. 2127 // before we destroy the old resource provider.
2080 ReleaseTreeResources(); 2128 ReleaseTreeResources();
2081 2129
2082 // Note: order is important here. 2130 // Note: order is important here.
2083 renderer_ = nullptr; 2131 renderer_ = nullptr;
2084 DestroyTileManager(); 2132 DestroyTileManager();
2085 resource_provider_ = nullptr; 2133 resource_provider_ = nullptr;
2086 output_surface_ = nullptr; 2134 output_surface_ = nullptr;
2087 2135
2088 if (!output_surface->BindToClient(this)) 2136 if (!output_surface->BindToClient(this)) {
2137 // Avoid recreating tree resources because we might not have enough
2138 // information to do this yet (eg. we don't have a TileManager at this
2139 // point).
2089 return false; 2140 return false;
2141 }
2090 2142
2091 output_surface_ = output_surface.Pass(); 2143 output_surface_ = output_surface.Pass();
2092 resource_provider_ = ResourceProvider::Create( 2144 resource_provider_ = ResourceProvider::Create(
2093 output_surface_.get(), shared_bitmap_manager_, gpu_memory_buffer_manager_, 2145 output_surface_.get(), shared_bitmap_manager_, gpu_memory_buffer_manager_,
2094 proxy_->blocking_main_thread_task_runner(), 2146 proxy_->blocking_main_thread_task_runner(),
2095 settings_.renderer_settings.highp_threshold_min, 2147 settings_.renderer_settings.highp_threshold_min,
2096 settings_.renderer_settings.use_rgba_4444_textures, 2148 settings_.renderer_settings.use_rgba_4444_textures,
2097 settings_.renderer_settings.texture_id_allocation_chunk_size); 2149 settings_.renderer_settings.texture_id_allocation_chunk_size);
2098 2150
2099 if (output_surface_->capabilities().deferred_gl_initialization) 2151 if (output_surface_->capabilities().deferred_gl_initialization)
2100 EnforceZeroBudget(true); 2152 EnforceZeroBudget(true);
2101 2153
2102 CreateAndSetRenderer(); 2154 CreateAndSetRenderer();
2103 2155
2104 if (settings_.impl_side_painting) 2156 if (settings_.impl_side_painting)
2105 CreateAndSetTileManager(); 2157 CreateAndSetTileManager();
2158 RecreateTreeResources();
2106 2159
2107 // Initialize vsync parameters to sane values. 2160 // Initialize vsync parameters to sane values.
2108 const base::TimeDelta display_refresh_interval = 2161 const base::TimeDelta display_refresh_interval =
2109 base::TimeDelta::FromMicroseconds( 2162 base::TimeDelta::FromMicroseconds(
2110 base::Time::kMicrosecondsPerSecond / 2163 base::Time::kMicrosecondsPerSecond /
2111 settings_.renderer_settings.refresh_rate); 2164 settings_.renderer_settings.refresh_rate);
2112 CommitVSyncParameters(base::TimeTicks(), display_refresh_interval); 2165 CommitVSyncParameters(base::TimeTicks(), display_refresh_interval);
2113 2166
2114 // TODO(brianderson): Don't use a hard-coded parent draw time. 2167 // TODO(brianderson): Don't use a hard-coded parent draw time.
2115 base::TimeDelta parent_draw_time = 2168 base::TimeDelta parent_draw_time =
(...skipping 29 matching lines...) Expand all
2145 2198
2146 ReleaseTreeResources(); 2199 ReleaseTreeResources();
2147 renderer_ = nullptr; 2200 renderer_ = nullptr;
2148 DestroyTileManager(); 2201 DestroyTileManager();
2149 2202
2150 resource_provider_->InitializeGL(); 2203 resource_provider_->InitializeGL();
2151 2204
2152 CreateAndSetRenderer(); 2205 CreateAndSetRenderer();
2153 EnforceZeroBudget(false); 2206 EnforceZeroBudget(false);
2154 CreateAndSetTileManager(); 2207 CreateAndSetTileManager();
2208 RecreateTreeResources();
2155 2209
2156 client_->SetNeedsCommitOnImplThread(); 2210 client_->SetNeedsCommitOnImplThread();
2157 } 2211 }
2158 2212
2159 void LayerTreeHostImpl::ReleaseGL() { 2213 void LayerTreeHostImpl::ReleaseGL() {
2160 DCHECK(output_surface_->capabilities().deferred_gl_initialization); 2214 DCHECK(output_surface_->capabilities().deferred_gl_initialization);
2161 DCHECK(settings_.impl_side_painting); 2215 DCHECK(settings_.impl_side_painting);
2162 DCHECK(output_surface_->context_provider()); 2216 DCHECK(output_surface_->context_provider());
2163 2217
2164 ReleaseTreeResources(); 2218 ReleaseTreeResources();
2165 renderer_ = nullptr; 2219 renderer_ = nullptr;
2166 DestroyTileManager(); 2220 DestroyTileManager();
2167 2221
2168 resource_provider_->InitializeSoftware(); 2222 resource_provider_->InitializeSoftware();
2169 output_surface_->ReleaseContextProvider(); 2223 output_surface_->ReleaseContextProvider();
2170 2224
2171 CreateAndSetRenderer(); 2225 CreateAndSetRenderer();
2172 EnforceZeroBudget(true); 2226 EnforceZeroBudget(true);
2173 CreateAndSetTileManager(); 2227 CreateAndSetTileManager();
2228 RecreateTreeResources();
2174 2229
2175 client_->SetNeedsCommitOnImplThread(); 2230 client_->SetNeedsCommitOnImplThread();
2176 } 2231 }
2177 2232
2178 void LayerTreeHostImpl::SetViewportSize(const gfx::Size& device_viewport_size) { 2233 void LayerTreeHostImpl::SetViewportSize(const gfx::Size& device_viewport_size) {
2179 if (device_viewport_size == device_viewport_size_) 2234 if (device_viewport_size == device_viewport_size_)
2180 return; 2235 return;
2236 TRACE_EVENT_INSTANT2("cc", "LayerTreeHostImpl::SetViewportSize",
2237 TRACE_EVENT_SCOPE_THREAD, "width",
2238 device_viewport_size.width(), "height",
2239 device_viewport_size.height());
2181 2240
2182 if (pending_tree_) 2241 if (pending_tree_)
2183 active_tree_->SetViewportSizeInvalid(); 2242 active_tree_->SetViewportSizeInvalid();
2184 2243
2185 device_viewport_size_ = device_viewport_size; 2244 device_viewport_size_ = device_viewport_size;
2186 2245
2187 UpdateViewportContainerSizes(); 2246 UpdateViewportContainerSizes();
2188 client_->OnCanDrawStateChanged(CanDraw()); 2247 client_->OnCanDrawStateChanged(CanDraw());
2189 SetFullRootLayerDamage(); 2248 SetFullRootLayerDamage();
2190 active_tree_->set_needs_update_draw_properties(); 2249 active_tree_->set_needs_update_draw_properties();
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
2248 float LayerTreeHostImpl::ControlsTopOffset() const { 2307 float LayerTreeHostImpl::ControlsTopOffset() const {
2249 return active_tree_->total_top_controls_content_offset() - 2308 return active_tree_->total_top_controls_content_offset() -
2250 active_tree_->top_controls_height(); 2309 active_tree_->top_controls_height();
2251 } 2310 }
2252 2311
2253 void LayerTreeHostImpl::BindToClient(InputHandlerClient* client) { 2312 void LayerTreeHostImpl::BindToClient(InputHandlerClient* client) {
2254 DCHECK(input_handler_client_ == NULL); 2313 DCHECK(input_handler_client_ == NULL);
2255 input_handler_client_ = client; 2314 input_handler_client_ = client;
2256 } 2315 }
2257 2316
2258 static LayerImpl* NextScrollLayer(LayerImpl* layer) {
2259 if (LayerImpl* scroll_parent = layer->scroll_parent())
2260 return scroll_parent;
2261 return layer->parent();
2262 }
2263
2264 LayerImpl* LayerTreeHostImpl::FindScrollLayerForDeviceViewportPoint( 2317 LayerImpl* LayerTreeHostImpl::FindScrollLayerForDeviceViewportPoint(
2265 const gfx::PointF& device_viewport_point, 2318 const gfx::PointF& device_viewport_point,
2266 InputHandler::ScrollInputType type, 2319 InputHandler::ScrollInputType type,
2267 LayerImpl* layer_impl, 2320 LayerImpl* layer_impl,
2268 bool* scroll_on_main_thread, 2321 bool* scroll_on_main_thread,
2269 bool* optional_has_ancestor_scroll_handler) const { 2322 bool* optional_has_ancestor_scroll_handler) const {
2270 DCHECK(scroll_on_main_thread); 2323 DCHECK(scroll_on_main_thread);
2271 2324
2325 ScrollBlocksOn block_mode = EffectiveScrollBlocksOn(layer_impl);
2326
2272 // Walk up the hierarchy and look for a scrollable layer. 2327 // Walk up the hierarchy and look for a scrollable layer.
2273 LayerImpl* potentially_scrolling_layer_impl = NULL; 2328 LayerImpl* potentially_scrolling_layer_impl = NULL;
2274 for (; layer_impl; layer_impl = NextScrollLayer(layer_impl)) { 2329 for (; layer_impl; layer_impl = NextScrollLayer(layer_impl)) {
2275 // The content layer can also block attempts to scroll outside the main 2330 // The content layer can also block attempts to scroll outside the main
2276 // thread. 2331 // thread.
2277 ScrollStatus status = layer_impl->TryScroll(device_viewport_point, type); 2332 ScrollStatus status =
2333 layer_impl->TryScroll(device_viewport_point, type, block_mode);
2278 if (status == ScrollOnMainThread) { 2334 if (status == ScrollOnMainThread) {
2279 *scroll_on_main_thread = true; 2335 *scroll_on_main_thread = true;
2280 return NULL; 2336 return NULL;
2281 } 2337 }
2282 2338
2283 LayerImpl* scroll_layer_impl = FindScrollLayerForContentLayer(layer_impl); 2339 LayerImpl* scroll_layer_impl = FindScrollLayerForContentLayer(layer_impl);
2284 if (!scroll_layer_impl) 2340 if (!scroll_layer_impl)
2285 continue; 2341 continue;
2286 2342
2287 status = scroll_layer_impl->TryScroll(device_viewport_point, type); 2343 status =
2344 scroll_layer_impl->TryScroll(device_viewport_point, type, block_mode);
2288 // If any layer wants to divert the scroll event to the main thread, abort. 2345 // If any layer wants to divert the scroll event to the main thread, abort.
2289 if (status == ScrollOnMainThread) { 2346 if (status == ScrollOnMainThread) {
2290 *scroll_on_main_thread = true; 2347 *scroll_on_main_thread = true;
2291 return NULL; 2348 return NULL;
2292 } 2349 }
2293 2350
2294 if (optional_has_ancestor_scroll_handler && 2351 if (optional_has_ancestor_scroll_handler &&
2295 scroll_layer_impl->have_scroll_event_handlers()) 2352 scroll_layer_impl->have_scroll_event_handlers())
2296 *optional_has_ancestor_scroll_handler = true; 2353 *optional_has_ancestor_scroll_handler = true;
2297 2354
(...skipping 683 matching lines...) Expand 10 before | Expand all | Expand 10 after
2981 static void CollectScrollDeltas(ScrollAndScaleSet* scroll_info, 3038 static void CollectScrollDeltas(ScrollAndScaleSet* scroll_info,
2982 LayerImpl* layer_impl) { 3039 LayerImpl* layer_impl) {
2983 if (!layer_impl) 3040 if (!layer_impl)
2984 return; 3041 return;
2985 3042
2986 gfx::ScrollOffset scroll_delta = layer_impl->PullDeltaForMainThread(); 3043 gfx::ScrollOffset scroll_delta = layer_impl->PullDeltaForMainThread();
2987 3044
2988 if (!scroll_delta.IsZero()) { 3045 if (!scroll_delta.IsZero()) {
2989 LayerTreeHostCommon::ScrollUpdateInfo scroll; 3046 LayerTreeHostCommon::ScrollUpdateInfo scroll;
2990 scroll.layer_id = layer_impl->id(); 3047 scroll.layer_id = layer_impl->id();
2991 scroll.scroll_delta = gfx::Vector2d(scroll_delta.x(), scroll_delta.y()); 3048 scroll.scroll_delta = gfx::Vector2dF(scroll_delta.x(), scroll_delta.y());
2992 scroll_info->scrolls.push_back(scroll); 3049 scroll_info->scrolls.push_back(scroll);
2993 } 3050 }
2994 3051
2995 for (size_t i = 0; i < layer_impl->children().size(); ++i) 3052 for (size_t i = 0; i < layer_impl->children().size(); ++i)
2996 CollectScrollDeltas(scroll_info, layer_impl->children()[i]); 3053 CollectScrollDeltas(scroll_info, layer_impl->children()[i]);
2997 } 3054 }
2998 3055
2999 scoped_ptr<ScrollAndScaleSet> LayerTreeHostImpl::ProcessScrollDeltas() { 3056 scoped_ptr<ScrollAndScaleSet> LayerTreeHostImpl::ProcessScrollDeltas() {
3000 scoped_ptr<ScrollAndScaleSet> scroll_info(new ScrollAndScaleSet()); 3057 scoped_ptr<ScrollAndScaleSet> scroll_info(new ScrollAndScaleSet());
3001 3058
(...skipping 457 matching lines...) Expand 10 before | Expand all | Expand 10 after
3459 } 3516 }
3460 3517
3461 void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) { 3518 void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) {
3462 std::vector<PictureLayerImpl*>::iterator it = 3519 std::vector<PictureLayerImpl*>::iterator it =
3463 std::find(picture_layers_.begin(), picture_layers_.end(), layer); 3520 std::find(picture_layers_.begin(), picture_layers_.end(), layer);
3464 DCHECK(it != picture_layers_.end()); 3521 DCHECK(it != picture_layers_.end());
3465 picture_layers_.erase(it); 3522 picture_layers_.erase(it);
3466 } 3523 }
3467 3524
3468 } // namespace cc 3525 } // namespace cc
OLDNEW
« no previous file with comments | « cc/trees/layer_tree_host_impl.h ('k') | cc/trees/layer_tree_host_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698