Chromium Code Reviews| 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 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 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 template <typename Object> | |
| 120 class ScopedCaller { | |
|
danakj
2015/02/05 20:45:49
did you look around in base/ for something like th
vmpstr
2015/02/05 21:41:32
I couldn't really find anything that would do a si
| |
| 121 public: | |
| 122 using Function = void (Object::*)(); | |
| 123 ScopedCaller(Object* object, Function on_entry, Function on_exit) | |
| 124 : object_(object), on_exit_(on_exit) { | |
| 125 (object_->*on_entry)(); | |
| 126 } | |
| 127 | |
| 128 ~ScopedCaller() { (object_->*on_exit_)(); } | |
| 129 | |
| 130 private: | |
| 131 Object* object_; | |
| 132 Function on_exit_; | |
| 133 }; | |
| 119 | 134 |
| 120 void DidVisibilityChange(LayerTreeHostImpl* id, bool visible) { | 135 void DidVisibilityChange(LayerTreeHostImpl* id, bool visible) { |
| 121 if (visible) { | 136 if (visible) { |
| 122 TRACE_EVENT_ASYNC_BEGIN1("cc", "LayerTreeHostImpl::SetVisible", id, | 137 TRACE_EVENT_ASYNC_BEGIN1("cc", "LayerTreeHostImpl::SetVisible", id, |
| 123 "LayerTreeHostImpl", id); | 138 "LayerTreeHostImpl", id); |
| 124 return; | 139 return; |
| 125 } | 140 } |
| 126 | 141 |
| 127 TRACE_EVENT_ASYNC_END0("cc", "LayerTreeHostImpl::SetVisible", id); | 142 TRACE_EVENT_ASYNC_END0("cc", "LayerTreeHostImpl::SetVisible", id); |
| 128 } | 143 } |
| (...skipping 1475 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1604 void LayerTreeHostImpl::SetUseGpuRasterization(bool use_gpu) { | 1619 void LayerTreeHostImpl::SetUseGpuRasterization(bool use_gpu) { |
| 1605 if (use_gpu == use_gpu_rasterization_) | 1620 if (use_gpu == use_gpu_rasterization_) |
| 1606 return; | 1621 return; |
| 1607 | 1622 |
| 1608 // Note that this must happen first, in case the rest of the calls want to | 1623 // Note that this must happen first, in case the rest of the calls want to |
| 1609 // query the new state of |use_gpu_rasterization_|. | 1624 // query the new state of |use_gpu_rasterization_|. |
| 1610 use_gpu_rasterization_ = use_gpu; | 1625 use_gpu_rasterization_ = use_gpu; |
| 1611 | 1626 |
| 1612 // Clean up and replace existing tile manager with another one that uses | 1627 // Clean up and replace existing tile manager with another one that uses |
| 1613 // appropriate rasterizer. | 1628 // appropriate rasterizer. |
| 1614 ReleaseTreeResources(); | 1629 ScopedCaller<LayerTreeHostImpl> scoped_release_resources( |
| 1630 this, &LayerTreeHostImpl::ReleaseTreeResources, | |
| 1631 &LayerTreeHostImpl::RecreateTreeResources); | |
| 1615 if (tile_manager_) { | 1632 if (tile_manager_) { |
| 1616 DestroyTileManager(); | 1633 DestroyTileManager(); |
| 1617 CreateAndSetTileManager(); | 1634 CreateAndSetTileManager(); |
| 1618 } | 1635 } |
| 1619 | 1636 |
| 1620 // We have released tilings for both active and pending tree. | 1637 // We have released tilings for both active and pending tree. |
| 1621 // We would not have any content to draw until the pending tree is activated. | 1638 // We would not have any content to draw until the pending tree is activated. |
| 1622 // Prevent the active tree from drawing until activation. | 1639 // Prevent the active tree from drawing until activation. |
| 1623 SetRequiresHighResToDraw(); | 1640 SetRequiresHighResToDraw(); |
| 1624 } | 1641 } |
| (...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1927 void LayerTreeHostImpl::ReleaseTreeResources() { | 1944 void LayerTreeHostImpl::ReleaseTreeResources() { |
| 1928 active_tree_->ReleaseResources(); | 1945 active_tree_->ReleaseResources(); |
| 1929 if (pending_tree_) | 1946 if (pending_tree_) |
| 1930 pending_tree_->ReleaseResources(); | 1947 pending_tree_->ReleaseResources(); |
| 1931 if (recycle_tree_) | 1948 if (recycle_tree_) |
| 1932 recycle_tree_->ReleaseResources(); | 1949 recycle_tree_->ReleaseResources(); |
| 1933 | 1950 |
| 1934 EvictAllUIResources(); | 1951 EvictAllUIResources(); |
| 1935 } | 1952 } |
| 1936 | 1953 |
| 1954 void LayerTreeHostImpl::RecreateTreeResources() { | |
| 1955 active_tree_->RecreateResources(); | |
| 1956 if (pending_tree_) | |
| 1957 pending_tree_->RecreateResources(); | |
| 1958 if (recycle_tree_) | |
| 1959 recycle_tree_->RecreateResources(); | |
| 1960 } | |
| 1961 | |
| 1937 void LayerTreeHostImpl::CreateAndSetRenderer() { | 1962 void LayerTreeHostImpl::CreateAndSetRenderer() { |
| 1938 DCHECK(!renderer_); | 1963 DCHECK(!renderer_); |
| 1939 DCHECK(output_surface_); | 1964 DCHECK(output_surface_); |
| 1940 DCHECK(resource_provider_); | 1965 DCHECK(resource_provider_); |
| 1941 | 1966 |
| 1942 if (output_surface_->capabilities().delegated_rendering) { | 1967 if (output_surface_->capabilities().delegated_rendering) { |
| 1943 renderer_ = DelegatingRenderer::Create(this, &settings_.renderer_settings, | 1968 renderer_ = DelegatingRenderer::Create(this, &settings_.renderer_settings, |
| 1944 output_surface_.get(), | 1969 output_surface_.get(), |
| 1945 resource_provider_.get()); | 1970 resource_provider_.get()); |
| 1946 } else if (output_surface_->context_provider()) { | 1971 } else if (output_surface_->context_provider()) { |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2118 // the old resources (i.e. render_surfaces and texture IDs). Clear them | 2143 // the old resources (i.e. render_surfaces and texture IDs). Clear them |
| 2119 // before we destroy the old resource provider. | 2144 // before we destroy the old resource provider. |
| 2120 ReleaseTreeResources(); | 2145 ReleaseTreeResources(); |
| 2121 | 2146 |
| 2122 // Note: order is important here. | 2147 // Note: order is important here. |
| 2123 renderer_ = nullptr; | 2148 renderer_ = nullptr; |
| 2124 DestroyTileManager(); | 2149 DestroyTileManager(); |
| 2125 resource_provider_ = nullptr; | 2150 resource_provider_ = nullptr; |
| 2126 output_surface_ = nullptr; | 2151 output_surface_ = nullptr; |
| 2127 | 2152 |
| 2128 if (!output_surface->BindToClient(this)) | 2153 if (!output_surface->BindToClient(this)) { |
| 2154 // Avoid recreating tree resources because we might not have enough | |
| 2155 // information to do this yet (eg. we don't have a TileManager at this | |
| 2156 // point). | |
| 2129 return false; | 2157 return false; |
| 2158 } | |
| 2130 | 2159 |
| 2131 output_surface_ = output_surface.Pass(); | 2160 output_surface_ = output_surface.Pass(); |
| 2132 resource_provider_ = ResourceProvider::Create( | 2161 resource_provider_ = ResourceProvider::Create( |
| 2133 output_surface_.get(), shared_bitmap_manager_, gpu_memory_buffer_manager_, | 2162 output_surface_.get(), shared_bitmap_manager_, gpu_memory_buffer_manager_, |
| 2134 proxy_->blocking_main_thread_task_runner(), | 2163 proxy_->blocking_main_thread_task_runner(), |
| 2135 settings_.renderer_settings.highp_threshold_min, | 2164 settings_.renderer_settings.highp_threshold_min, |
| 2136 settings_.renderer_settings.use_rgba_4444_textures, | 2165 settings_.renderer_settings.use_rgba_4444_textures, |
| 2137 settings_.renderer_settings.texture_id_allocation_chunk_size); | 2166 settings_.renderer_settings.texture_id_allocation_chunk_size); |
| 2138 | 2167 |
| 2139 if (output_surface_->capabilities().deferred_gl_initialization) | 2168 if (output_surface_->capabilities().deferred_gl_initialization) |
| 2140 EnforceZeroBudget(true); | 2169 EnforceZeroBudget(true); |
| 2141 | 2170 |
| 2142 CreateAndSetRenderer(); | 2171 CreateAndSetRenderer(); |
| 2143 | 2172 |
| 2144 if (settings_.impl_side_painting) | 2173 if (settings_.impl_side_painting) |
| 2145 CreateAndSetTileManager(); | 2174 CreateAndSetTileManager(); |
| 2175 RecreateTreeResources(); | |
| 2146 | 2176 |
| 2147 // Initialize vsync parameters to sane values. | 2177 // Initialize vsync parameters to sane values. |
| 2148 const base::TimeDelta display_refresh_interval = | 2178 const base::TimeDelta display_refresh_interval = |
| 2149 base::TimeDelta::FromMicroseconds( | 2179 base::TimeDelta::FromMicroseconds( |
| 2150 base::Time::kMicrosecondsPerSecond / | 2180 base::Time::kMicrosecondsPerSecond / |
| 2151 settings_.renderer_settings.refresh_rate); | 2181 settings_.renderer_settings.refresh_rate); |
| 2152 CommitVSyncParameters(base::TimeTicks(), display_refresh_interval); | 2182 CommitVSyncParameters(base::TimeTicks(), display_refresh_interval); |
| 2153 | 2183 |
| 2154 // TODO(brianderson): Don't use a hard-coded parent draw time. | 2184 // TODO(brianderson): Don't use a hard-coded parent draw time. |
| 2155 base::TimeDelta parent_draw_time = | 2185 base::TimeDelta parent_draw_time = |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 2176 void LayerTreeHostImpl::CommitVSyncParameters(base::TimeTicks timebase, | 2206 void LayerTreeHostImpl::CommitVSyncParameters(base::TimeTicks timebase, |
| 2177 base::TimeDelta interval) { | 2207 base::TimeDelta interval) { |
| 2178 client_->CommitVSyncParameters(timebase, interval); | 2208 client_->CommitVSyncParameters(timebase, interval); |
| 2179 } | 2209 } |
| 2180 | 2210 |
| 2181 void LayerTreeHostImpl::DeferredInitialize() { | 2211 void LayerTreeHostImpl::DeferredInitialize() { |
| 2182 DCHECK(output_surface_->capabilities().deferred_gl_initialization); | 2212 DCHECK(output_surface_->capabilities().deferred_gl_initialization); |
| 2183 DCHECK(settings_.impl_side_painting); | 2213 DCHECK(settings_.impl_side_painting); |
| 2184 DCHECK(output_surface_->context_provider()); | 2214 DCHECK(output_surface_->context_provider()); |
| 2185 | 2215 |
| 2186 ReleaseTreeResources(); | 2216 ScopedCaller<LayerTreeHostImpl> scoped_release_resources( |
|
enne (OOO)
2015/02/05 20:43:52
This seems like overkill. Neither of the function
vmpstr
2015/02/05 21:41:32
It's ReleaseResources is also implemented in textu
| |
| 2217 this, &LayerTreeHostImpl::ReleaseTreeResources, | |
| 2218 &LayerTreeHostImpl::RecreateTreeResources); | |
| 2187 renderer_ = nullptr; | 2219 renderer_ = nullptr; |
| 2188 DestroyTileManager(); | 2220 DestroyTileManager(); |
| 2189 | 2221 |
| 2190 resource_provider_->InitializeGL(); | 2222 resource_provider_->InitializeGL(); |
| 2191 | 2223 |
| 2192 CreateAndSetRenderer(); | 2224 CreateAndSetRenderer(); |
| 2193 EnforceZeroBudget(false); | 2225 EnforceZeroBudget(false); |
| 2194 CreateAndSetTileManager(); | 2226 CreateAndSetTileManager(); |
| 2195 | 2227 |
| 2196 client_->SetNeedsCommitOnImplThread(); | 2228 client_->SetNeedsCommitOnImplThread(); |
| 2197 } | 2229 } |
| 2198 | 2230 |
| 2199 void LayerTreeHostImpl::ReleaseGL() { | 2231 void LayerTreeHostImpl::ReleaseGL() { |
| 2200 DCHECK(output_surface_->capabilities().deferred_gl_initialization); | 2232 DCHECK(output_surface_->capabilities().deferred_gl_initialization); |
| 2201 DCHECK(settings_.impl_side_painting); | 2233 DCHECK(settings_.impl_side_painting); |
| 2202 DCHECK(output_surface_->context_provider()); | 2234 DCHECK(output_surface_->context_provider()); |
| 2203 | 2235 |
| 2204 ReleaseTreeResources(); | 2236 ScopedCaller<LayerTreeHostImpl> scoped_release_resources( |
| 2237 this, &LayerTreeHostImpl::ReleaseTreeResources, | |
| 2238 &LayerTreeHostImpl::RecreateTreeResources); | |
| 2205 renderer_ = nullptr; | 2239 renderer_ = nullptr; |
| 2206 DestroyTileManager(); | 2240 DestroyTileManager(); |
| 2207 | 2241 |
| 2208 resource_provider_->InitializeSoftware(); | 2242 resource_provider_->InitializeSoftware(); |
| 2209 output_surface_->ReleaseContextProvider(); | 2243 output_surface_->ReleaseContextProvider(); |
| 2210 | 2244 |
| 2211 CreateAndSetRenderer(); | 2245 CreateAndSetRenderer(); |
| 2212 EnforceZeroBudget(true); | 2246 EnforceZeroBudget(true); |
| 2213 CreateAndSetTileManager(); | 2247 CreateAndSetTileManager(); |
| 2214 | 2248 |
| (...skipping 1286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3501 } | 3535 } |
| 3502 | 3536 |
| 3503 void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) { | 3537 void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) { |
| 3504 std::vector<PictureLayerImpl*>::iterator it = | 3538 std::vector<PictureLayerImpl*>::iterator it = |
| 3505 std::find(picture_layers_.begin(), picture_layers_.end(), layer); | 3539 std::find(picture_layers_.begin(), picture_layers_.end(), layer); |
| 3506 DCHECK(it != picture_layers_.end()); | 3540 DCHECK(it != picture_layers_.end()); |
| 3507 picture_layers_.erase(it); | 3541 picture_layers_.erase(it); |
| 3508 } | 3542 } |
| 3509 | 3543 |
| 3510 } // namespace cc | 3544 } // namespace cc |
| OLD | NEW |