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

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

Issue 761903003: Update from https://crrev.com/306655 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 6 years 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 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
144 // that time interval, and then uploads should have a chance to be processed. 144 // that time interval, and then uploads should have a chance to be processed.
145 size_t ms_per_frame = std::floor(1000.0 / refresh_rate); 145 size_t ms_per_frame = std::floor(1000.0 / refresh_rate);
146 size_t max_transfer_buffer_usage_bytes = 146 size_t max_transfer_buffer_usage_bytes =
147 ms_per_frame * kMaxBytesUploadedPerMs; 147 ms_per_frame * kMaxBytesUploadedPerMs;
148 148
149 // The context may request a lower limit based on the device capabilities. 149 // The context may request a lower limit based on the device capabilities.
150 return std::min(context_capabilities.max_transfer_buffer_usage_bytes, 150 return std::min(context_capabilities.max_transfer_buffer_usage_bytes,
151 max_transfer_buffer_usage_bytes); 151 max_transfer_buffer_usage_bytes);
152 } 152 }
153 153
154 unsigned GetMapImageTextureTarget(
155 const ContextProvider::Capabilities& context_capabilities) {
156 // TODO(reveman): This should be a setting passed to the compositor instead
157 // of hard-coded here. The target that need to be used depends on our choice
158 // of GpuMemoryBuffer type. Note: SURFACE_TEXTURE needs EXTERNAL_OES,
159 // IO_SURFACE needs RECTANGLE_ARB. crbug.com/431059
160 #if defined(OS_ANDROID)
161 if (context_capabilities.gpu.egl_image_external)
162 return GL_TEXTURE_EXTERNAL_OES;
163 #endif
164 if (context_capabilities.gpu.texture_rectangle)
165 return GL_TEXTURE_RECTANGLE_ARB;
166
167 return GL_TEXTURE_2D;
168 }
169
170 size_t GetMaxStagingResourceCount() { 154 size_t GetMaxStagingResourceCount() {
171 // Upper bound for number of staging resource to allow. 155 // Upper bound for number of staging resource to allow.
172 return 32; 156 return 32;
173 } 157 }
174 158
175 } // namespace 159 } // namespace
176 160
177 LayerTreeHostImpl::FrameData::FrameData() : has_no_damage(false) { 161 LayerTreeHostImpl::FrameData::FrameData() : has_no_damage(false) {
178 } 162 }
179 163
(...skipping 1818 matching lines...) Expand 10 before | Expand all | Expand 10 after
1998 void LayerTreeHostImpl::CreateResourceAndRasterWorkerPool( 1982 void LayerTreeHostImpl::CreateResourceAndRasterWorkerPool(
1999 scoped_ptr<RasterWorkerPool>* raster_worker_pool, 1983 scoped_ptr<RasterWorkerPool>* raster_worker_pool,
2000 scoped_ptr<ResourcePool>* resource_pool, 1984 scoped_ptr<ResourcePool>* resource_pool,
2001 scoped_ptr<ResourcePool>* staging_resource_pool) { 1985 scoped_ptr<ResourcePool>* staging_resource_pool) {
2002 base::SingleThreadTaskRunner* task_runner = 1986 base::SingleThreadTaskRunner* task_runner =
2003 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner() 1987 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner()
2004 : proxy_->MainThreadTaskRunner(); 1988 : proxy_->MainThreadTaskRunner();
2005 DCHECK(task_runner); 1989 DCHECK(task_runner);
2006 1990
2007 ContextProvider* context_provider = output_surface_->context_provider(); 1991 ContextProvider* context_provider = output_surface_->context_provider();
2008 bool should_use_zero_copy_rasterizer =
2009 settings_.use_zero_copy || IsSynchronousSingleThreaded();
2010
2011 if (!context_provider) { 1992 if (!context_provider) {
2012 *resource_pool = 1993 *resource_pool =
2013 ResourcePool::Create(resource_provider_.get(), 1994 ResourcePool::Create(resource_provider_.get(),
2014 GL_TEXTURE_2D, 1995 GL_TEXTURE_2D,
2015 resource_provider_->best_texture_format()); 1996 resource_provider_->best_texture_format());
2016 1997
2017 *raster_worker_pool = 1998 *raster_worker_pool =
2018 BitmapRasterWorkerPool::Create(task_runner, 1999 BitmapRasterWorkerPool::Create(task_runner,
2019 RasterWorkerPool::GetTaskGraphRunner(), 2000 RasterWorkerPool::GetTaskGraphRunner(),
2020 resource_provider_.get()); 2001 resource_provider_.get());
2021 } else if (use_gpu_rasterization_) { 2002 return;
2003 }
2004
2005 if (use_gpu_rasterization_) {
2022 *resource_pool = 2006 *resource_pool =
2023 ResourcePool::Create(resource_provider_.get(), 2007 ResourcePool::Create(resource_provider_.get(),
2024 GL_TEXTURE_2D, 2008 GL_TEXTURE_2D,
2025 resource_provider_->best_texture_format()); 2009 resource_provider_->best_texture_format());
2026 2010
2027 *raster_worker_pool = 2011 *raster_worker_pool =
2028 GpuRasterWorkerPool::Create(task_runner, 2012 GpuRasterWorkerPool::Create(task_runner,
2029 context_provider, 2013 context_provider,
2030 resource_provider_.get(), 2014 resource_provider_.get(),
2031 settings_.use_distance_field_text); 2015 settings_.use_distance_field_text);
2032 } else if (should_use_zero_copy_rasterizer && CanUseZeroCopyRasterizer()) { 2016 return;
2033 *resource_pool = ResourcePool::Create( 2017 }
2034 resource_provider_.get(),
2035 GetMapImageTextureTarget(context_provider->ContextCapabilities()),
2036 resource_provider_->best_texture_format());
2037 2018
2038 TaskGraphRunner* task_graph_runner; 2019 if (GetRendererCapabilities().using_image) {
2039 if (IsSynchronousSingleThreaded()) { 2020 unsigned image_target = GL_TEXTURE_2D;
2040 DCHECK(!single_thread_synchronous_task_graph_runner_); 2021 #if defined(OS_MACOSX)
2041 single_thread_synchronous_task_graph_runner_.reset(new TaskGraphRunner); 2022 // GL_TEXTURE_RECTANGLE_ARB target is required by IOSurface backed images.
2042 task_graph_runner = single_thread_synchronous_task_graph_runner_.get(); 2023 DCHECK(context_provider->ContextCapabilities().gpu.texture_rectangle);
2043 } else { 2024 image_target = GL_TEXTURE_RECTANGLE_ARB;
2044 task_graph_runner = RasterWorkerPool::GetTaskGraphRunner(); 2025 #endif
2026 if (settings_.use_image_external) {
2027 DCHECK(context_provider->ContextCapabilities().gpu.egl_image_external);
2028 image_target = GL_TEXTURE_EXTERNAL_OES;
2045 } 2029 }
2046 2030
2047 *raster_worker_pool = ZeroCopyRasterWorkerPool::Create( 2031 if (settings_.use_zero_copy || IsSynchronousSingleThreaded()) {
2048 task_runner, task_graph_runner, resource_provider_.get()); 2032 *resource_pool =
2049 } else if (settings_.use_one_copy && CanUseOneCopyRasterizer()) { 2033 ResourcePool::Create(resource_provider_.get(), image_target,
2050 // We need to create a staging resource pool when using copy rasterizer. 2034 resource_provider_->best_texture_format());
2051 *staging_resource_pool = ResourcePool::Create(
2052 resource_provider_.get(),
2053 GetMapImageTextureTarget(context_provider->ContextCapabilities()),
2054 resource_provider_->best_texture_format());
2055 *resource_pool =
2056 ResourcePool::Create(resource_provider_.get(),
2057 GL_TEXTURE_2D,
2058 resource_provider_->best_texture_format());
2059 2035
2060 *raster_worker_pool = 2036 TaskGraphRunner* task_graph_runner;
2061 OneCopyRasterWorkerPool::Create(task_runner, 2037 if (IsSynchronousSingleThreaded()) {
2062 RasterWorkerPool::GetTaskGraphRunner(), 2038 DCHECK(!single_thread_synchronous_task_graph_runner_);
2063 context_provider, 2039 single_thread_synchronous_task_graph_runner_.reset(new TaskGraphRunner);
2064 resource_provider_.get(), 2040 task_graph_runner = single_thread_synchronous_task_graph_runner_.get();
2065 staging_resource_pool_.get()); 2041 } else {
2066 } else { 2042 task_graph_runner = RasterWorkerPool::GetTaskGraphRunner();
2067 *resource_pool = ResourcePool::Create( 2043 }
2068 resource_provider_.get(),
2069 GL_TEXTURE_2D,
2070 resource_provider_->memory_efficient_texture_format());
2071 2044
2072 *raster_worker_pool = PixelBufferRasterWorkerPool::Create( 2045 *raster_worker_pool = ZeroCopyRasterWorkerPool::Create(
2073 task_runner, RasterWorkerPool::GetTaskGraphRunner(), context_provider, 2046 task_runner, task_graph_runner, resource_provider_.get());
2074 resource_provider_.get(), 2047 return;
2075 GetMaxTransferBufferUsageBytes( 2048 }
2076 context_provider->ContextCapabilities(), 2049
2077 settings_.renderer_settings.refresh_rate)); 2050 if (settings_.use_one_copy) {
2051 // We need to create a staging resource pool when using copy rasterizer.
2052 *staging_resource_pool =
2053 ResourcePool::Create(resource_provider_.get(), image_target,
2054 resource_provider_->best_texture_format());
2055 *resource_pool =
2056 ResourcePool::Create(resource_provider_.get(), GL_TEXTURE_2D,
2057 resource_provider_->best_texture_format());
2058
2059 *raster_worker_pool = OneCopyRasterWorkerPool::Create(
2060 task_runner, RasterWorkerPool::GetTaskGraphRunner(), context_provider,
2061 resource_provider_.get(), staging_resource_pool_.get());
2062 return;
2063 }
2078 } 2064 }
2065
2066 *resource_pool = ResourcePool::Create(
2067 resource_provider_.get(), GL_TEXTURE_2D,
2068 resource_provider_->memory_efficient_texture_format());
2069
2070 *raster_worker_pool = PixelBufferRasterWorkerPool::Create(
2071 task_runner, RasterWorkerPool::GetTaskGraphRunner(), context_provider,
2072 resource_provider_.get(),
2073 GetMaxTransferBufferUsageBytes(context_provider->ContextCapabilities(),
2074 settings_.renderer_settings.refresh_rate));
2079 } 2075 }
2080 2076
2081 void LayerTreeHostImpl::DestroyTileManager() { 2077 void LayerTreeHostImpl::DestroyTileManager() {
2082 tile_manager_ = nullptr; 2078 tile_manager_ = nullptr;
2083 resource_pool_ = nullptr; 2079 resource_pool_ = nullptr;
2084 staging_resource_pool_ = nullptr; 2080 staging_resource_pool_ = nullptr;
2085 raster_worker_pool_ = nullptr; 2081 raster_worker_pool_ = nullptr;
2086 single_thread_synchronous_task_graph_runner_ = nullptr; 2082 single_thread_synchronous_task_graph_runner_ = nullptr;
2087 } 2083 }
2088 2084
2089 bool LayerTreeHostImpl::UsePendingTreeForSync() const { 2085 bool LayerTreeHostImpl::UsePendingTreeForSync() const {
2090 // In impl-side painting, synchronize to the pending tree so that it has 2086 // In impl-side painting, synchronize to the pending tree so that it has
2091 // time to raster before being displayed. 2087 // time to raster before being displayed.
2092 return settings_.impl_side_painting; 2088 return settings_.impl_side_painting;
2093 } 2089 }
2094 2090
2095 bool LayerTreeHostImpl::IsSynchronousSingleThreaded() const { 2091 bool LayerTreeHostImpl::IsSynchronousSingleThreaded() const {
2096 return !proxy_->HasImplThread() && !settings_.single_thread_proxy_scheduler; 2092 return !proxy_->HasImplThread() && !settings_.single_thread_proxy_scheduler;
2097 } 2093 }
2098 2094
2099 bool LayerTreeHostImpl::CanUseZeroCopyRasterizer() const {
2100 return GetRendererCapabilities().using_image;
2101 }
2102
2103 bool LayerTreeHostImpl::CanUseOneCopyRasterizer() const {
2104 return GetRendererCapabilities().using_image;
2105 }
2106
2107 void LayerTreeHostImpl::EnforceZeroBudget(bool zero_budget) { 2095 void LayerTreeHostImpl::EnforceZeroBudget(bool zero_budget) {
2108 SetManagedMemoryPolicy(cached_managed_memory_policy_, zero_budget); 2096 SetManagedMemoryPolicy(cached_managed_memory_policy_, zero_budget);
2109 } 2097 }
2110 2098
2111 bool LayerTreeHostImpl::InitializeRenderer( 2099 bool LayerTreeHostImpl::InitializeRenderer(
2112 scoped_ptr<OutputSurface> output_surface) { 2100 scoped_ptr<OutputSurface> output_surface) {
2113 TRACE_EVENT0("cc", "LayerTreeHostImpl::InitializeRenderer"); 2101 TRACE_EVENT0("cc", "LayerTreeHostImpl::InitializeRenderer");
2114 2102
2115 // Since we will create a new resource provider, we cannot continue to use 2103 // Since we will create a new resource provider, we cannot continue to use
2116 // the old resources (i.e. render_surfaces and texture IDs). Clear them 2104 // the old resources (i.e. render_surfaces and texture IDs). Clear them
(...skipping 439 matching lines...) Expand 10 before | Expand all | Expand 10 after
2556 &end_clipped); 2544 &end_clipped);
2557 DCHECK(!end_clipped); 2545 DCHECK(!end_clipped);
2558 if (end_clipped) 2546 if (end_clipped)
2559 return gfx::Vector2dF(); 2547 return gfx::Vector2dF();
2560 gfx::PointF actual_viewport_end_point = 2548 gfx::PointF actual_viewport_end_point =
2561 gfx::ScalePoint(actual_screen_space_end_point, 2549 gfx::ScalePoint(actual_screen_space_end_point,
2562 1.f / scale_from_viewport_to_screen_space); 2550 1.f / scale_from_viewport_to_screen_space);
2563 return actual_viewport_end_point - viewport_point; 2551 return actual_viewport_end_point - viewport_point;
2564 } 2552 }
2565 2553
2566 static gfx::Vector2dF ScrollLayerWithLocalDelta(LayerImpl* layer_impl, 2554 static gfx::Vector2dF ScrollLayerWithLocalDelta(
2567 const gfx::Vector2dF& local_delta) { 2555 LayerImpl* layer_impl,
2556 const gfx::Vector2dF& local_delta,
2557 float page_scale_factor) {
2568 gfx::Vector2dF previous_delta(layer_impl->ScrollDelta()); 2558 gfx::Vector2dF previous_delta(layer_impl->ScrollDelta());
2569 layer_impl->ScrollBy(local_delta); 2559 gfx::Vector2dF delta = local_delta;
2560 delta.Scale(1.f / page_scale_factor);
2561 layer_impl->ScrollBy(delta);
2570 return layer_impl->ScrollDelta() - previous_delta; 2562 return layer_impl->ScrollDelta() - previous_delta;
2571 } 2563 }
2572 2564
2573 bool LayerTreeHostImpl::ShouldTopControlsConsumeScroll( 2565 bool LayerTreeHostImpl::ShouldTopControlsConsumeScroll(
2574 const gfx::Vector2dF& scroll_delta) const { 2566 const gfx::Vector2dF& scroll_delta) const {
2575 DCHECK(CurrentlyScrollingLayer()); 2567 DCHECK(CurrentlyScrollingLayer());
2576 2568
2577 if (!top_controls_manager_) 2569 if (!top_controls_manager_)
2578 return false; 2570 return false;
2579 2571
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
2637 } 2629 }
2638 // Track root layer deltas for reporting overscroll. 2630 // Track root layer deltas for reporting overscroll.
2639 if (layer_impl == InnerViewportScrollLayer()) 2631 if (layer_impl == InnerViewportScrollLayer())
2640 unused_root_delta = pending_delta; 2632 unused_root_delta = pending_delta;
2641 } 2633 }
2642 2634
2643 gfx::Vector2dF applied_delta; 2635 gfx::Vector2dF applied_delta;
2644 // Gesture events need to be transformed from viewport coordinates to local 2636 // Gesture events need to be transformed from viewport coordinates to local
2645 // layer coordinates so that the scrolling contents exactly follow the 2637 // layer coordinates so that the scrolling contents exactly follow the
2646 // user's finger. In contrast, wheel events represent a fixed amount of 2638 // user's finger. In contrast, wheel events represent a fixed amount of
2647 // scrolling so we can just apply them directly. 2639 // scrolling so we can just apply them directly, but the page scale factor
2640 // is applied to the scroll delta.
2648 if (!wheel_scrolling_) { 2641 if (!wheel_scrolling_) {
2649 float scale_from_viewport_to_screen_space = device_scale_factor_; 2642 float scale_from_viewport_to_screen_space = device_scale_factor_;
2650 applied_delta = 2643 applied_delta =
2651 ScrollLayerWithViewportSpaceDelta(layer_impl, 2644 ScrollLayerWithViewportSpaceDelta(layer_impl,
2652 scale_from_viewport_to_screen_space, 2645 scale_from_viewport_to_screen_space,
2653 viewport_point, pending_delta); 2646 viewport_point, pending_delta);
2654 } else { 2647 } else {
2655 applied_delta = ScrollLayerWithLocalDelta(layer_impl, pending_delta); 2648 applied_delta = ScrollLayerWithLocalDelta(
2649 layer_impl, pending_delta, active_tree_->total_page_scale_factor());
2656 } 2650 }
2657 2651
2658 const float kEpsilon = 0.1f; 2652 const float kEpsilon = 0.1f;
2659 if (layer_impl == InnerViewportScrollLayer()) { 2653 if (layer_impl == InnerViewportScrollLayer()) {
2660 unused_root_delta.Subtract(applied_delta); 2654 unused_root_delta.Subtract(applied_delta);
2661 if (std::abs(unused_root_delta.x()) < kEpsilon) 2655 if (std::abs(unused_root_delta.x()) < kEpsilon)
2662 unused_root_delta.set_x(0.0f); 2656 unused_root_delta.set_x(0.0f);
2663 if (std::abs(unused_root_delta.y()) < kEpsilon) 2657 if (std::abs(unused_root_delta.y()) < kEpsilon)
2664 unused_root_delta.set_y(0.0f); 2658 unused_root_delta.set_y(0.0f);
2665 // Disable overscroll on axes which is impossible to scroll. 2659 // Disable overscroll on axes which is impossible to scroll.
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
2767 float height = layer_impl->clip_height(); 2761 float height = layer_impl->clip_height();
2768 2762
2769 // These magical values match WebKit and are designed to scroll nearly the 2763 // These magical values match WebKit and are designed to scroll nearly the
2770 // entire visible content height but leave a bit of overlap. 2764 // entire visible content height but leave a bit of overlap.
2771 float page = std::max(height * 0.875f, 1.f); 2765 float page = std::max(height * 0.875f, 1.f);
2772 if (direction == SCROLL_BACKWARD) 2766 if (direction == SCROLL_BACKWARD)
2773 page = -page; 2767 page = -page;
2774 2768
2775 gfx::Vector2dF delta = gfx::Vector2dF(0.f, page); 2769 gfx::Vector2dF delta = gfx::Vector2dF(0.f, page);
2776 2770
2777 gfx::Vector2dF applied_delta = ScrollLayerWithLocalDelta(layer_impl, delta); 2771 gfx::Vector2dF applied_delta =
2772 ScrollLayerWithLocalDelta(layer_impl, delta, 1.f);
2778 2773
2779 if (!applied_delta.IsZero()) { 2774 if (!applied_delta.IsZero()) {
2780 client_->SetNeedsCommitOnImplThread(); 2775 client_->SetNeedsCommitOnImplThread();
2781 SetNeedsRedraw(); 2776 SetNeedsRedraw();
2782 client_->RenewTreePriority(); 2777 client_->RenewTreePriority();
2783 return true; 2778 return true;
2784 } 2779 }
2785 2780
2786 active_tree_->SetCurrentlyScrollingLayer(layer_impl); 2781 active_tree_->SetCurrentlyScrollingLayer(layer_impl);
2787 } 2782 }
(...skipping 456 matching lines...) Expand 10 before | Expand all | Expand 10 after
3244 void LayerTreeHostImpl::ResetCurrentBeginFrameArgsForNextFrame() { 3239 void LayerTreeHostImpl::ResetCurrentBeginFrameArgsForNextFrame() {
3245 current_begin_frame_args_ = BeginFrameArgs(); 3240 current_begin_frame_args_ = BeginFrameArgs();
3246 } 3241 }
3247 3242
3248 BeginFrameArgs LayerTreeHostImpl::CurrentBeginFrameArgs() const { 3243 BeginFrameArgs LayerTreeHostImpl::CurrentBeginFrameArgs() const {
3249 // Try to use the current frame time to keep animations non-jittery. But if 3244 // Try to use the current frame time to keep animations non-jittery. But if
3250 // we're not in a frame (because this is during an input event or a delayed 3245 // we're not in a frame (because this is during an input event or a delayed
3251 // task), fall back to physical time. This should still be monotonic. 3246 // task), fall back to physical time. This should still be monotonic.
3252 if (current_begin_frame_args_.IsValid()) 3247 if (current_begin_frame_args_.IsValid())
3253 return current_begin_frame_args_; 3248 return current_begin_frame_args_;
3254 return BeginFrameArgs::Create(gfx::FrameTime::Now(), base::TimeTicks(), 3249 return BeginFrameArgs::Create(
3255 BeginFrameArgs::DefaultInterval(), 3250 BEGINFRAME_FROM_HERE, gfx::FrameTime::Now(), base::TimeTicks(),
3256 BeginFrameArgs::NORMAL); 3251 BeginFrameArgs::DefaultInterval(), BeginFrameArgs::NORMAL);
3257 } 3252 }
3258 3253
3259 scoped_refptr<base::debug::ConvertableToTraceFormat> 3254 scoped_refptr<base::debug::ConvertableToTraceFormat>
3260 LayerTreeHostImpl::AsValue() const { 3255 LayerTreeHostImpl::AsValue() const {
3261 return AsValueWithFrame(NULL); 3256 return AsValueWithFrame(NULL);
3262 } 3257 }
3263 3258
3264 scoped_refptr<base::debug::ConvertableToTraceFormat> 3259 scoped_refptr<base::debug::ConvertableToTraceFormat>
3265 LayerTreeHostImpl::AsValueWithFrame(FrameData* frame) const { 3260 LayerTreeHostImpl::AsValueWithFrame(FrameData* frame) const {
3266 scoped_refptr<base::debug::TracedValue> state = 3261 scoped_refptr<base::debug::TracedValue> state =
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
3491 } 3486 }
3492 3487
3493 void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) { 3488 void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) {
3494 std::vector<PictureLayerImpl*>::iterator it = 3489 std::vector<PictureLayerImpl*>::iterator it =
3495 std::find(picture_layers_.begin(), picture_layers_.end(), layer); 3490 std::find(picture_layers_.begin(), picture_layers_.end(), layer);
3496 DCHECK(it != picture_layers_.end()); 3491 DCHECK(it != picture_layers_.end());
3497 picture_layers_.erase(it); 3492 picture_layers_.erase(it);
3498 } 3493 }
3499 3494
3500 } // namespace cc 3495 } // 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