OLD | NEW |
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 396 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
407 return; | 407 return; |
408 if (!tile_priorities_dirty_) | 408 if (!tile_priorities_dirty_) |
409 return; | 409 return; |
410 | 410 |
411 tile_priorities_dirty_ = false; | 411 tile_priorities_dirty_ = false; |
412 tile_manager_->ManageTiles(global_tile_state_); | 412 tile_manager_->ManageTiles(global_tile_state_); |
413 | 413 |
414 client_->DidManageTiles(); | 414 client_->DidManageTiles(); |
415 } | 415 } |
416 | 416 |
| 417 void LayerTreeHostImpl::StartPageScaleAnimation( |
| 418 const gfx::Vector2d& target_offset, |
| 419 bool anchor_point, |
| 420 float page_scale, |
| 421 base::TimeDelta duration) { |
| 422 if (!InnerViewportScrollLayer()) |
| 423 return; |
| 424 |
| 425 gfx::ScrollOffset scroll_total = active_tree_->TotalScrollOffset(); |
| 426 gfx::SizeF scaled_scrollable_size = active_tree_->ScrollableSize(); |
| 427 gfx::SizeF viewport_size = |
| 428 active_tree_->InnerViewportContainerLayer()->bounds(); |
| 429 |
| 430 // Easing constants experimentally determined. |
| 431 scoped_ptr<TimingFunction> timing_function = |
| 432 CubicBezierTimingFunction::Create(.8, 0, .3, .9); |
| 433 |
| 434 // TODO(miletus) : Pass in ScrollOffset. |
| 435 page_scale_animation_ = |
| 436 PageScaleAnimation::Create(ScrollOffsetToVector2dF(scroll_total), |
| 437 active_tree_->total_page_scale_factor(), |
| 438 viewport_size, |
| 439 scaled_scrollable_size, |
| 440 timing_function.Pass()); |
| 441 |
| 442 if (anchor_point) { |
| 443 gfx::Vector2dF anchor(target_offset); |
| 444 page_scale_animation_->ZoomWithAnchor(anchor, |
| 445 page_scale, |
| 446 duration.InSecondsF()); |
| 447 } else { |
| 448 gfx::Vector2dF scaled_target_offset = target_offset; |
| 449 page_scale_animation_->ZoomTo(scaled_target_offset, |
| 450 page_scale, |
| 451 duration.InSecondsF()); |
| 452 } |
| 453 |
| 454 SetNeedsAnimate(); |
| 455 client_->SetNeedsCommitOnImplThread(); |
| 456 client_->RenewTreePriority(); |
| 457 } |
| 458 |
417 bool LayerTreeHostImpl::IsCurrentlyScrollingLayerAt( | 459 bool LayerTreeHostImpl::IsCurrentlyScrollingLayerAt( |
418 const gfx::Point& viewport_point, | 460 const gfx::Point& viewport_point, |
419 InputHandler::ScrollInputType type) { | 461 InputHandler::ScrollInputType type) { |
420 if (!CurrentlyScrollingLayer()) | 462 if (!CurrentlyScrollingLayer()) |
421 return false; | 463 return false; |
422 | 464 |
423 gfx::PointF device_viewport_point = | 465 gfx::PointF device_viewport_point = |
424 gfx::ScalePoint(viewport_point, device_scale_factor_); | 466 gfx::ScalePoint(viewport_point, device_scale_factor_); |
425 | 467 |
426 LayerImpl* layer_impl = | 468 LayerImpl* layer_impl = |
(...skipping 1080 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1507 TRACE_EVENT0("cc", "DrawLayers.UpdateHudTexture"); | 1549 TRACE_EVENT0("cc", "DrawLayers.UpdateHudTexture"); |
1508 active_tree_->hud_layer()->UpdateHudTexture(draw_mode, | 1550 active_tree_->hud_layer()->UpdateHudTexture(draw_mode, |
1509 resource_provider_.get()); | 1551 resource_provider_.get()); |
1510 } | 1552 } |
1511 | 1553 |
1512 if (draw_mode == DRAW_MODE_RESOURCELESS_SOFTWARE) { | 1554 if (draw_mode == DRAW_MODE_RESOURCELESS_SOFTWARE) { |
1513 bool disable_picture_quad_image_filtering = | 1555 bool disable_picture_quad_image_filtering = |
1514 IsActivelyScrolling() || needs_animate_layers(); | 1556 IsActivelyScrolling() || needs_animate_layers(); |
1515 | 1557 |
1516 scoped_ptr<SoftwareRenderer> temp_software_renderer = | 1558 scoped_ptr<SoftwareRenderer> temp_software_renderer = |
1517 SoftwareRenderer::Create(this, &settings_, output_surface_.get(), NULL); | 1559 SoftwareRenderer::Create(this, &settings_.renderer_settings, |
| 1560 output_surface_.get(), NULL); |
1518 temp_software_renderer->DrawFrame(&frame->render_passes, | 1561 temp_software_renderer->DrawFrame(&frame->render_passes, |
1519 device_scale_factor_, | 1562 device_scale_factor_, |
1520 DeviceViewport(), | 1563 DeviceViewport(), |
1521 DeviceClip(), | 1564 DeviceClip(), |
1522 disable_picture_quad_image_filtering); | 1565 disable_picture_quad_image_filtering); |
1523 } else { | 1566 } else { |
1524 renderer_->DrawFrame(&frame->render_passes, | 1567 renderer_->DrawFrame(&frame->render_passes, |
1525 device_scale_factor_, | 1568 device_scale_factor_, |
1526 DeviceViewport(), | 1569 DeviceViewport(), |
1527 DeviceClip(), | 1570 DeviceClip(), |
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1800 if (debug_state_.continuous_painting) { | 1843 if (debug_state_.continuous_painting) { |
1801 const RenderingStats& stats = | 1844 const RenderingStats& stats = |
1802 rendering_stats_instrumentation_->GetRenderingStats(); | 1845 rendering_stats_instrumentation_->GetRenderingStats(); |
1803 // TODO(hendrikw): This requires a different metric when we commit directly | 1846 // TODO(hendrikw): This requires a different metric when we commit directly |
1804 // to the active tree. See crbug.com/429311. | 1847 // to the active tree. See crbug.com/429311. |
1805 paint_time_counter_->SavePaintTime( | 1848 paint_time_counter_->SavePaintTime( |
1806 stats.commit_to_activate_duration.GetLastTimeDelta() + | 1849 stats.commit_to_activate_duration.GetLastTimeDelta() + |
1807 stats.draw_duration.GetLastTimeDelta()); | 1850 stats.draw_duration.GetLastTimeDelta()); |
1808 } | 1851 } |
1809 | 1852 |
1810 scoped_ptr<PageScaleAnimation> page_scale_animation = | 1853 scoped_ptr<PendingPageScaleAnimation> pending_page_scale_animation = |
1811 active_tree_->TakePageScaleAnimation(); | 1854 active_tree_->TakePendingPageScaleAnimation(); |
1812 if (page_scale_animation) { | 1855 if (pending_page_scale_animation) { |
1813 page_scale_animation_ = page_scale_animation.Pass(); | 1856 StartPageScaleAnimation( |
1814 SetNeedsAnimate(); | 1857 pending_page_scale_animation->target_offset, |
1815 client_->SetNeedsCommitOnImplThread(); | 1858 pending_page_scale_animation->use_anchor, |
1816 client_->RenewTreePriority(); | 1859 pending_page_scale_animation->scale, |
| 1860 pending_page_scale_animation->duration); |
1817 } | 1861 } |
1818 } | 1862 } |
1819 | 1863 |
1820 void LayerTreeHostImpl::SetVisible(bool visible) { | 1864 void LayerTreeHostImpl::SetVisible(bool visible) { |
1821 DCHECK(proxy_->IsImplThread()); | 1865 DCHECK(proxy_->IsImplThread()); |
1822 | 1866 |
1823 if (visible_ == visible) | 1867 if (visible_ == visible) |
1824 return; | 1868 return; |
1825 visible_ = visible; | 1869 visible_ = visible; |
1826 DidVisibilityChange(this, visible_); | 1870 DidVisibilityChange(this, visible_); |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1889 | 1933 |
1890 EvictAllUIResources(); | 1934 EvictAllUIResources(); |
1891 } | 1935 } |
1892 | 1936 |
1893 void LayerTreeHostImpl::CreateAndSetRenderer() { | 1937 void LayerTreeHostImpl::CreateAndSetRenderer() { |
1894 DCHECK(!renderer_); | 1938 DCHECK(!renderer_); |
1895 DCHECK(output_surface_); | 1939 DCHECK(output_surface_); |
1896 DCHECK(resource_provider_); | 1940 DCHECK(resource_provider_); |
1897 | 1941 |
1898 if (output_surface_->capabilities().delegated_rendering) { | 1942 if (output_surface_->capabilities().delegated_rendering) { |
1899 renderer_ = DelegatingRenderer::Create( | 1943 renderer_ = DelegatingRenderer::Create(this, &settings_.renderer_settings, |
1900 this, &settings_, output_surface_.get(), resource_provider_.get()); | 1944 output_surface_.get(), |
| 1945 resource_provider_.get()); |
1901 } else if (output_surface_->context_provider()) { | 1946 } else if (output_surface_->context_provider()) { |
1902 renderer_ = GLRenderer::Create(this, | 1947 renderer_ = GLRenderer::Create( |
1903 &settings_, | 1948 this, &settings_.renderer_settings, output_surface_.get(), |
1904 output_surface_.get(), | 1949 resource_provider_.get(), texture_mailbox_deleter_.get(), |
1905 resource_provider_.get(), | 1950 settings_.renderer_settings.highp_threshold_min); |
1906 texture_mailbox_deleter_.get(), | |
1907 settings_.highp_threshold_min); | |
1908 } else if (output_surface_->software_device()) { | 1951 } else if (output_surface_->software_device()) { |
1909 renderer_ = SoftwareRenderer::Create( | 1952 renderer_ = SoftwareRenderer::Create(this, &settings_.renderer_settings, |
1910 this, &settings_, output_surface_.get(), resource_provider_.get()); | 1953 output_surface_.get(), |
| 1954 resource_provider_.get()); |
1911 } | 1955 } |
1912 DCHECK(renderer_); | 1956 DCHECK(renderer_); |
1913 | 1957 |
1914 renderer_->SetVisible(visible_); | 1958 renderer_->SetVisible(visible_); |
1915 SetFullRootLayerDamage(); | 1959 SetFullRootLayerDamage(); |
1916 | 1960 |
1917 // See note in LayerTreeImpl::UpdateDrawProperties. Renderer needs to be | 1961 // See note in LayerTreeImpl::UpdateDrawProperties. Renderer needs to be |
1918 // initialized to get max texture size. Also, after releasing resources, | 1962 // initialized to get max texture size. Also, after releasing resources, |
1919 // trees need another update to generate new ones. | 1963 // trees need another update to generate new ones. |
1920 active_tree_->set_needs_update_draw_properties(); | 1964 active_tree_->set_needs_update_draw_properties(); |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2019 context_provider, | 2063 context_provider, |
2020 resource_provider_.get(), | 2064 resource_provider_.get(), |
2021 staging_resource_pool_.get()); | 2065 staging_resource_pool_.get()); |
2022 } else { | 2066 } else { |
2023 *resource_pool = ResourcePool::Create( | 2067 *resource_pool = ResourcePool::Create( |
2024 resource_provider_.get(), | 2068 resource_provider_.get(), |
2025 GL_TEXTURE_2D, | 2069 GL_TEXTURE_2D, |
2026 resource_provider_->memory_efficient_texture_format()); | 2070 resource_provider_->memory_efficient_texture_format()); |
2027 | 2071 |
2028 *raster_worker_pool = PixelBufferRasterWorkerPool::Create( | 2072 *raster_worker_pool = PixelBufferRasterWorkerPool::Create( |
2029 task_runner, | 2073 task_runner, RasterWorkerPool::GetTaskGraphRunner(), context_provider, |
2030 RasterWorkerPool::GetTaskGraphRunner(), | |
2031 context_provider, | |
2032 resource_provider_.get(), | 2074 resource_provider_.get(), |
2033 GetMaxTransferBufferUsageBytes(context_provider->ContextCapabilities(), | 2075 GetMaxTransferBufferUsageBytes( |
2034 settings_.refresh_rate)); | 2076 context_provider->ContextCapabilities(), |
| 2077 settings_.renderer_settings.refresh_rate)); |
2035 } | 2078 } |
2036 } | 2079 } |
2037 | 2080 |
2038 void LayerTreeHostImpl::DestroyTileManager() { | 2081 void LayerTreeHostImpl::DestroyTileManager() { |
2039 tile_manager_ = nullptr; | 2082 tile_manager_ = nullptr; |
2040 resource_pool_ = nullptr; | 2083 resource_pool_ = nullptr; |
2041 staging_resource_pool_ = nullptr; | 2084 staging_resource_pool_ = nullptr; |
2042 raster_worker_pool_ = nullptr; | 2085 raster_worker_pool_ = nullptr; |
2043 single_thread_synchronous_task_graph_runner_ = nullptr; | 2086 single_thread_synchronous_task_graph_runner_ = nullptr; |
2044 } | 2087 } |
2045 | 2088 |
2046 bool LayerTreeHostImpl::UsePendingTreeForSync() const { | 2089 bool LayerTreeHostImpl::UsePendingTreeForSync() const { |
2047 // In impl-side painting, synchronize to the pending tree so that it has | 2090 // In impl-side painting, synchronize to the pending tree so that it has |
2048 // time to raster before being displayed. | 2091 // time to raster before being displayed. |
2049 return settings_.impl_side_painting; | 2092 return settings_.impl_side_painting; |
2050 } | 2093 } |
2051 | 2094 |
2052 bool LayerTreeHostImpl::IsSynchronousSingleThreaded() const { | 2095 bool LayerTreeHostImpl::IsSynchronousSingleThreaded() const { |
2053 return !proxy_->HasImplThread() && !settings_.single_thread_proxy_scheduler; | 2096 return !proxy_->HasImplThread() && !settings_.single_thread_proxy_scheduler; |
2054 } | 2097 } |
2055 | 2098 |
2056 bool LayerTreeHostImpl::CanUseZeroCopyRasterizer() const { | 2099 bool LayerTreeHostImpl::CanUseZeroCopyRasterizer() const { |
2057 return GetRendererCapabilities().using_image; | 2100 return GetRendererCapabilities().using_image; |
2058 } | 2101 } |
2059 | 2102 |
2060 bool LayerTreeHostImpl::CanUseOneCopyRasterizer() const { | 2103 bool LayerTreeHostImpl::CanUseOneCopyRasterizer() const { |
2061 // Sync query support is required by one-copy rasterizer. | 2104 return GetRendererCapabilities().using_image; |
2062 return GetRendererCapabilities().using_image && | |
2063 resource_provider_->use_sync_query(); | |
2064 } | 2105 } |
2065 | 2106 |
2066 void LayerTreeHostImpl::EnforceZeroBudget(bool zero_budget) { | 2107 void LayerTreeHostImpl::EnforceZeroBudget(bool zero_budget) { |
2067 SetManagedMemoryPolicy(cached_managed_memory_policy_, zero_budget); | 2108 SetManagedMemoryPolicy(cached_managed_memory_policy_, zero_budget); |
2068 } | 2109 } |
2069 | 2110 |
2070 bool LayerTreeHostImpl::InitializeRenderer( | 2111 bool LayerTreeHostImpl::InitializeRenderer( |
2071 scoped_ptr<OutputSurface> output_surface) { | 2112 scoped_ptr<OutputSurface> output_surface) { |
2072 TRACE_EVENT0("cc", "LayerTreeHostImpl::InitializeRenderer"); | 2113 TRACE_EVENT0("cc", "LayerTreeHostImpl::InitializeRenderer"); |
2073 | 2114 |
2074 // Since we will create a new resource provider, we cannot continue to use | 2115 // Since we will create a new resource provider, we cannot continue to use |
2075 // the old resources (i.e. render_surfaces and texture IDs). Clear them | 2116 // the old resources (i.e. render_surfaces and texture IDs). Clear them |
2076 // before we destroy the old resource provider. | 2117 // before we destroy the old resource provider. |
2077 ReleaseTreeResources(); | 2118 ReleaseTreeResources(); |
2078 | 2119 |
2079 // Note: order is important here. | 2120 // Note: order is important here. |
2080 renderer_ = nullptr; | 2121 renderer_ = nullptr; |
2081 DestroyTileManager(); | 2122 DestroyTileManager(); |
2082 resource_provider_ = nullptr; | 2123 resource_provider_ = nullptr; |
2083 output_surface_ = nullptr; | 2124 output_surface_ = nullptr; |
2084 | 2125 |
2085 if (!output_surface->BindToClient(this)) | 2126 if (!output_surface->BindToClient(this)) |
2086 return false; | 2127 return false; |
2087 | 2128 |
2088 output_surface_ = output_surface.Pass(); | 2129 output_surface_ = output_surface.Pass(); |
2089 resource_provider_ = | 2130 resource_provider_ = ResourceProvider::Create( |
2090 ResourceProvider::Create(output_surface_.get(), | 2131 output_surface_.get(), shared_bitmap_manager_, gpu_memory_buffer_manager_, |
2091 shared_bitmap_manager_, | 2132 proxy_->blocking_main_thread_task_runner(), |
2092 gpu_memory_buffer_manager_, | 2133 settings_.renderer_settings.highp_threshold_min, |
2093 proxy_->blocking_main_thread_task_runner(), | 2134 settings_.renderer_settings.use_rgba_4444_textures, |
2094 settings_.highp_threshold_min, | 2135 settings_.renderer_settings.texture_id_allocation_chunk_size); |
2095 settings_.use_rgba_4444_textures, | |
2096 settings_.texture_id_allocation_chunk_size); | |
2097 | 2136 |
2098 if (output_surface_->capabilities().deferred_gl_initialization) | 2137 if (output_surface_->capabilities().deferred_gl_initialization) |
2099 EnforceZeroBudget(true); | 2138 EnforceZeroBudget(true); |
2100 | 2139 |
2101 CreateAndSetRenderer(); | 2140 CreateAndSetRenderer(); |
2102 | 2141 |
2103 if (settings_.impl_side_painting) | 2142 if (settings_.impl_side_painting) |
2104 CreateAndSetTileManager(); | 2143 CreateAndSetTileManager(); |
2105 | 2144 |
2106 // Initialize vsync parameters to sane values. | 2145 // Initialize vsync parameters to sane values. |
2107 const base::TimeDelta display_refresh_interval = | 2146 const base::TimeDelta display_refresh_interval = |
2108 base::TimeDelta::FromMicroseconds(base::Time::kMicrosecondsPerSecond / | 2147 base::TimeDelta::FromMicroseconds( |
2109 settings_.refresh_rate); | 2148 base::Time::kMicrosecondsPerSecond / |
| 2149 settings_.renderer_settings.refresh_rate); |
2110 CommitVSyncParameters(base::TimeTicks(), display_refresh_interval); | 2150 CommitVSyncParameters(base::TimeTicks(), display_refresh_interval); |
2111 | 2151 |
2112 // TODO(brianderson): Don't use a hard-coded parent draw time. | 2152 // TODO(brianderson): Don't use a hard-coded parent draw time. |
2113 base::TimeDelta parent_draw_time = | 2153 base::TimeDelta parent_draw_time = |
2114 (!settings_.use_external_begin_frame_source && | 2154 (!settings_.use_external_begin_frame_source && |
2115 output_surface_->capabilities().adjust_deadline_for_parent) | 2155 output_surface_->capabilities().adjust_deadline_for_parent) |
2116 ? BeginFrameArgs::DefaultEstimatedParentDrawTime() | 2156 ? BeginFrameArgs::DefaultEstimatedParentDrawTime() |
2117 : base::TimeDelta(); | 2157 : base::TimeDelta(); |
2118 client_->SetEstimatedParentDrawTime(parent_draw_time); | 2158 client_->SetEstimatedParentDrawTime(parent_draw_time); |
2119 | 2159 |
(...skipping 506 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2626 if (settings_.report_overscroll_only_for_scrollable_axes) { | 2666 if (settings_.report_overscroll_only_for_scrollable_axes) { |
2627 if (std::abs(active_tree_->TotalMaxScrollOffset().x()) <= kEpsilon || | 2667 if (std::abs(active_tree_->TotalMaxScrollOffset().x()) <= kEpsilon || |
2628 !layer_impl->user_scrollable_horizontal()) | 2668 !layer_impl->user_scrollable_horizontal()) |
2629 unused_root_delta.set_x(0.0f); | 2669 unused_root_delta.set_x(0.0f); |
2630 if (std::abs(active_tree_->TotalMaxScrollOffset().y()) <= kEpsilon || | 2670 if (std::abs(active_tree_->TotalMaxScrollOffset().y()) <= kEpsilon || |
2631 !layer_impl->user_scrollable_vertical()) | 2671 !layer_impl->user_scrollable_vertical()) |
2632 unused_root_delta.set_y(0.0f); | 2672 unused_root_delta.set_y(0.0f); |
2633 } | 2673 } |
2634 } | 2674 } |
2635 | 2675 |
| 2676 // Scrolls should bubble perfectly between the outer and inner viewports. |
| 2677 bool allow_unrestricted_bubbling_for_current_layer = |
| 2678 layer_impl == OuterViewportScrollLayer(); |
| 2679 bool allow_bubbling_for_current_layer = |
| 2680 allow_unrestricted_bubbling_for_current_layer || should_bubble_scrolls_; |
| 2681 |
2636 // If the layer wasn't able to move, try the next one in the hierarchy. | 2682 // If the layer wasn't able to move, try the next one in the hierarchy. |
2637 bool did_move_layer_x = std::abs(applied_delta.x()) > kEpsilon; | 2683 bool did_move_layer_x = std::abs(applied_delta.x()) > kEpsilon; |
2638 bool did_move_layer_y = std::abs(applied_delta.y()) > kEpsilon; | 2684 bool did_move_layer_y = std::abs(applied_delta.y()) > kEpsilon; |
2639 did_scroll_x |= did_move_layer_x; | 2685 did_scroll_x |= did_move_layer_x; |
2640 did_scroll_y |= did_move_layer_y; | 2686 did_scroll_y |= did_move_layer_y; |
2641 if (!did_move_layer_x && !did_move_layer_y) { | 2687 if (!did_move_layer_x && !did_move_layer_y) { |
2642 // Scrolls should always bubble between the outer and inner viewports | 2688 if (allow_bubbling_for_current_layer || !did_lock_scrolling_layer_) |
2643 if (should_bubble_scrolls_ || !did_lock_scrolling_layer_ || | |
2644 layer_impl == OuterViewportScrollLayer()) | |
2645 continue; | 2689 continue; |
2646 else | 2690 else |
2647 break; | 2691 break; |
2648 } | 2692 } |
2649 | 2693 |
2650 did_lock_scrolling_layer_ = true; | 2694 did_lock_scrolling_layer_ = true; |
2651 if (!should_bubble_scrolls_) { | 2695 if (!allow_bubbling_for_current_layer) { |
2652 active_tree_->SetCurrentlyScrollingLayer(layer_impl); | 2696 active_tree_->SetCurrentlyScrollingLayer(layer_impl); |
2653 break; | 2697 break; |
2654 } | 2698 } |
2655 | 2699 |
2656 // If the applied delta is within 45 degrees of the input delta, bail out to | 2700 if (allow_unrestricted_bubbling_for_current_layer) { |
2657 // make it easier to scroll just one layer in one direction without | 2701 pending_delta -= applied_delta; |
2658 // affecting any of its parents. | 2702 } else { |
2659 float angle_threshold = 45; | 2703 // If the applied delta is within 45 degrees of the input delta, bail out |
2660 if (MathUtil::SmallestAngleBetweenVectors( | 2704 // to make it easier to scroll just one layer in one direction without |
2661 applied_delta, pending_delta) < angle_threshold) { | 2705 // affecting any of its parents. |
2662 pending_delta = gfx::Vector2dF(); | 2706 float angle_threshold = 45; |
2663 break; | 2707 if (MathUtil::SmallestAngleBetweenVectors(applied_delta, pending_delta) < |
| 2708 angle_threshold) { |
| 2709 pending_delta = gfx::Vector2dF(); |
| 2710 break; |
| 2711 } |
| 2712 |
| 2713 // Allow further movement only on an axis perpendicular to the direction |
| 2714 // in which the layer moved. |
| 2715 gfx::Vector2dF perpendicular_axis(-applied_delta.y(), applied_delta.x()); |
| 2716 pending_delta = |
| 2717 MathUtil::ProjectVector(pending_delta, perpendicular_axis); |
2664 } | 2718 } |
2665 | 2719 |
2666 // Allow further movement only on an axis perpendicular to the direction in | |
2667 // which the layer moved. | |
2668 gfx::Vector2dF perpendicular_axis(-applied_delta.y(), applied_delta.x()); | |
2669 pending_delta = MathUtil::ProjectVector(pending_delta, perpendicular_axis); | |
2670 | |
2671 if (gfx::ToRoundedVector2d(pending_delta).IsZero()) | 2720 if (gfx::ToRoundedVector2d(pending_delta).IsZero()) |
2672 break; | 2721 break; |
2673 } | 2722 } |
2674 | 2723 |
2675 bool did_scroll_content = did_scroll_x || did_scroll_y; | 2724 bool did_scroll_content = did_scroll_x || did_scroll_y; |
2676 if (did_scroll_content) { | 2725 if (did_scroll_content) { |
2677 // If we are scrolling with an active scroll handler, forward latency | 2726 // If we are scrolling with an active scroll handler, forward latency |
2678 // tracking information to the main thread so the delay introduced by the | 2727 // tracking information to the main thread so the delay introduced by the |
2679 // handler is accounted for. | 2728 // handler is accounted for. |
2680 if (scroll_affects_scroll_handler()) | 2729 if (scroll_affects_scroll_handler()) |
(...skipping 514 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3195 void LayerTreeHostImpl::ResetCurrentBeginFrameArgsForNextFrame() { | 3244 void LayerTreeHostImpl::ResetCurrentBeginFrameArgsForNextFrame() { |
3196 current_begin_frame_args_ = BeginFrameArgs(); | 3245 current_begin_frame_args_ = BeginFrameArgs(); |
3197 } | 3246 } |
3198 | 3247 |
3199 BeginFrameArgs LayerTreeHostImpl::CurrentBeginFrameArgs() const { | 3248 BeginFrameArgs LayerTreeHostImpl::CurrentBeginFrameArgs() const { |
3200 // Try to use the current frame time to keep animations non-jittery. But if | 3249 // Try to use the current frame time to keep animations non-jittery. But if |
3201 // we're not in a frame (because this is during an input event or a delayed | 3250 // we're not in a frame (because this is during an input event or a delayed |
3202 // task), fall back to physical time. This should still be monotonic. | 3251 // task), fall back to physical time. This should still be monotonic. |
3203 if (current_begin_frame_args_.IsValid()) | 3252 if (current_begin_frame_args_.IsValid()) |
3204 return current_begin_frame_args_; | 3253 return current_begin_frame_args_; |
3205 return BeginFrameArgs::Create(gfx::FrameTime::Now(), | 3254 return BeginFrameArgs::Create(gfx::FrameTime::Now(), base::TimeTicks(), |
3206 base::TimeTicks(), | 3255 BeginFrameArgs::DefaultInterval(), |
3207 BeginFrameArgs::DefaultInterval()); | 3256 BeginFrameArgs::NORMAL); |
3208 } | 3257 } |
3209 | 3258 |
3210 scoped_refptr<base::debug::ConvertableToTraceFormat> | 3259 scoped_refptr<base::debug::ConvertableToTraceFormat> |
3211 LayerTreeHostImpl::AsValue() const { | 3260 LayerTreeHostImpl::AsValue() const { |
3212 return AsValueWithFrame(NULL); | 3261 return AsValueWithFrame(NULL); |
3213 } | 3262 } |
3214 | 3263 |
3215 scoped_refptr<base::debug::ConvertableToTraceFormat> | 3264 scoped_refptr<base::debug::ConvertableToTraceFormat> |
3216 LayerTreeHostImpl::AsValueWithFrame(FrameData* frame) const { | 3265 LayerTreeHostImpl::AsValueWithFrame(FrameData* frame) const { |
3217 scoped_refptr<base::debug::TracedValue> state = | 3266 scoped_refptr<base::debug::TracedValue> state = |
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3442 } | 3491 } |
3443 | 3492 |
3444 void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) { | 3493 void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) { |
3445 std::vector<PictureLayerImpl*>::iterator it = | 3494 std::vector<PictureLayerImpl*>::iterator it = |
3446 std::find(picture_layers_.begin(), picture_layers_.end(), layer); | 3495 std::find(picture_layers_.begin(), picture_layers_.end(), layer); |
3447 DCHECK(it != picture_layers_.end()); | 3496 DCHECK(it != picture_layers_.end()); |
3448 picture_layers_.erase(it); | 3497 picture_layers_.erase(it); |
3449 } | 3498 } |
3450 | 3499 |
3451 } // namespace cc | 3500 } // namespace cc |
OLD | NEW |