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

Side by Side Diff: cc/layer_tree_host_impl.cc

Issue 11882037: Activate LayerImpl tree with sync+push instead of pointer swap (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 7 years, 11 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 | Annotate | Revision Log
« no previous file with comments | « cc/layer_tree_host_impl.h ('k') | cc/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/layer_tree_host_impl.h" 5 #include "cc/layer_tree_host_impl.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/basictypes.h" 9 #include "base/basictypes.h"
10 #include "base/debug/trace_event.h" 10 #include "base/debug/trace_event.h"
(...skipping 21 matching lines...) Expand all
32 #include "cc/render_pass_draw_quad.h" 32 #include "cc/render_pass_draw_quad.h"
33 #include "cc/rendering_stats.h" 33 #include "cc/rendering_stats.h"
34 #include "cc/scrollbar_animation_controller.h" 34 #include "cc/scrollbar_animation_controller.h"
35 #include "cc/scrollbar_layer_impl.h" 35 #include "cc/scrollbar_layer_impl.h"
36 #include "cc/shared_quad_state.h" 36 #include "cc/shared_quad_state.h"
37 #include "cc/single_thread_proxy.h" 37 #include "cc/single_thread_proxy.h"
38 #include "cc/software_renderer.h" 38 #include "cc/software_renderer.h"
39 #include "cc/solid_color_draw_quad.h" 39 #include "cc/solid_color_draw_quad.h"
40 #include "cc/texture_uploader.h" 40 #include "cc/texture_uploader.h"
41 #include "cc/top_controls_manager.h" 41 #include "cc/top_controls_manager.h"
42 #include "cc/tree_synchronizer.h"
42 #include "cc/util.h" 43 #include "cc/util.h"
43 #include "ui/gfx/size_conversions.h" 44 #include "ui/gfx/size_conversions.h"
44 #include "ui/gfx/vector2d_conversions.h" 45 #include "ui/gfx/vector2d_conversions.h"
45 46
46 namespace { 47 namespace {
47 48
48 void didVisibilityChange(cc::LayerTreeHostImpl* id, bool visible) 49 void didVisibilityChange(cc::LayerTreeHostImpl* id, bool visible)
49 { 50 {
50 if (visible) { 51 if (visible) {
51 TRACE_EVENT_ASYNC_BEGIN1("webkit", "LayerTreeHostImpl::setVisible", id, "LayerTreeHostImpl", id); 52 TRACE_EVENT_ASYNC_BEGIN1("webkit", "LayerTreeHostImpl::setVisible", id, "LayerTreeHostImpl", id);
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
167 LayerTreeHostImpl::~LayerTreeHostImpl() 168 LayerTreeHostImpl::~LayerTreeHostImpl()
168 { 169 {
169 DCHECK(m_proxy->isImplThread()); 170 DCHECK(m_proxy->isImplThread());
170 TRACE_EVENT0("cc", "LayerTreeHostImpl::~LayerTreeHostImpl()"); 171 TRACE_EVENT0("cc", "LayerTreeHostImpl::~LayerTreeHostImpl()");
171 172
172 if (rootLayer()) { 173 if (rootLayer()) {
173 clearRenderSurfaces(); 174 clearRenderSurfaces();
174 // The layer trees must be destroyed before the layer tree host. We've 175 // The layer trees must be destroyed before the layer tree host. We've
175 // made a contract with our animation controllers that the registrar 176 // made a contract with our animation controllers that the registrar
176 // will outlive them, and we must make good. 177 // will outlive them, and we must make good.
178 m_recycleTree.reset();
179 m_pendingTree.reset();
177 m_activeTree.reset(); 180 m_activeTree.reset();
178 m_pendingTree.reset();
179 } 181 }
180 } 182 }
181 183
182 void LayerTreeHostImpl::beginCommit() 184 void LayerTreeHostImpl::beginCommit()
183 { 185 {
184 } 186 }
185 187
186 void LayerTreeHostImpl::commitComplete() 188 void LayerTreeHostImpl::commitComplete()
187 { 189 {
188 TRACE_EVENT0("cc", "LayerTreeHostImpl::commitComplete"); 190 TRACE_EVENT0("cc", "LayerTreeHostImpl::commitComplete");
189 191
190 // Impl-side painting needs an update immediately post-commit to have the 192 // Impl-side painting needs an update immediately post-commit to have the
191 // opportunity to create tilings. Other paths can call updateDrawProperties 193 // opportunity to create tilings. Other paths can call updateDrawProperties
192 // more lazily when needed prior to drawing. 194 // more lazily when needed prior to drawing.
193 setNeedsUpdateDrawProperties(); 195 setNeedsUpdateDrawProperties();
194 if (m_settings.implSidePainting) 196 if (m_settings.implSidePainting)
195 updateDrawProperties(); 197 updateDrawProperties();
196 198
197 // Recompute max scroll position; must be after layer content bounds are
198 // updated.
199 updateMaxScrollOffset();
200 m_client->sendManagedMemoryStats(); 199 m_client->sendManagedMemoryStats();
201 } 200 }
202 201
203 bool LayerTreeHostImpl::canDraw() 202 bool LayerTreeHostImpl::canDraw()
204 { 203 {
205 // Note: If you are changing this function or any other function that might 204 // Note: If you are changing this function or any other function that might
206 // affect the result of canDraw, make sure to call m_client->onCanDrawStateC hanged 205 // affect the result of canDraw, make sure to call m_client->onCanDrawStateC hanged
207 // in the proper places and update the notifyIfCanDrawChanged test. 206 // in the proper places and update the notifyIfCanDrawChanged test.
208 207
209 if (!rootLayer()) { 208 if (!rootLayer()) {
(...skipping 715 matching lines...) Expand 10 before | Expand all | Expand 10 after
925 924
926 if (layerImpl->drawsContent() && layerImpl->parent() && layerImpl->parent()- >scrollable()) 925 if (layerImpl->drawsContent() && layerImpl->parent() && layerImpl->parent()- >scrollable())
927 return layerImpl->parent(); 926 return layerImpl->parent();
928 927
929 return 0; 928 return 0;
930 } 929 }
931 930
932 void LayerTreeHostImpl::createPendingTree() 931 void LayerTreeHostImpl::createPendingTree()
933 { 932 {
934 CHECK(!m_pendingTree); 933 CHECK(!m_pendingTree);
935 m_pendingTree = LayerTreeImpl::create(this); 934 if (m_recycleTree)
935 m_recycleTree.swap(m_pendingTree);
936 else
937 m_pendingTree = LayerTreeImpl::create(this);
936 m_client->onCanDrawStateChanged(canDraw()); 938 m_client->onCanDrawStateChanged(canDraw());
937 m_client->onHasPendingTreeStateChanged(pendingTree()); 939 m_client->onHasPendingTreeStateChanged(pendingTree());
938 } 940 }
939 941
940 void LayerTreeHostImpl::checkForCompletedTileUploads() 942 void LayerTreeHostImpl::checkForCompletedTileUploads()
941 { 943 {
942 DCHECK(!m_client->isInsideDraw()) << "Checking for completed uploads within a draw may trigger spurious redraws."; 944 DCHECK(!m_client->isInsideDraw()) << "Checking for completed uploads within a draw may trigger spurious redraws.";
943 if (m_tileManager) 945 if (m_tileManager)
944 m_tileManager->CheckForCompletedTileUploads(); 946 m_tileManager->CheckForCompletedTileUploads();
945 } 947 }
(...skipping 10 matching lines...) Expand all
956 return; 958 return;
957 959
958 activatePendingTree(); 960 activatePendingTree();
959 } 961 }
960 962
961 void LayerTreeHostImpl::activatePendingTree() 963 void LayerTreeHostImpl::activatePendingTree()
962 { 964 {
963 CHECK(m_pendingTree); 965 CHECK(m_pendingTree);
964 966
965 m_activeTree->PushPersistedState(m_pendingTree.get()); 967 m_activeTree->PushPersistedState(m_pendingTree.get());
966 m_activeTree.swap(m_pendingTree); 968 m_activeTree->SetRootLayer(TreeSynchronizer::synchronizeTrees(m_pendingTree- >RootLayer(), m_activeTree->DetachLayerTree(), m_activeTree.get()));
967 // TODO(enne): consider recycling this tree to prevent layer churn 969 TreeSynchronizer::pushProperties(m_pendingTree->RootLayer(), m_activeTree->R ootLayer());
968 m_pendingTree.reset(); 970 DCHECK(!m_recycleTree);
971
972 // This should match the property synchronization in
973 // LayerTreeHost::finishCommitOnImplThread().
974 m_activeTree->set_source_frame_number(m_pendingTree->source_frame_number());
975 m_activeTree->set_background_color(m_pendingTree->background_color());
976 m_activeTree->set_has_transparent_background(m_pendingTree->has_transparent_ background());
977 if (m_pendingTree->ContentsTexturesPurged())
978 m_activeTree->SetContentsTexturesPurged();
979 else
980 m_activeTree->ResetContentsTexturesPurged();
981
982 // Now that we've synced everything from the pending tree to the active
983 // tree, rename the pending tree the recycle tree so we can reuse it on the
984 // next sync.
985 m_pendingTree.swap(m_recycleTree);
986 m_recycleTree->ClearRenderSurfaces();
987
969 m_activeTree->DidBecomeActive(); 988 m_activeTree->DidBecomeActive();
970 989
971 m_client->onCanDrawStateChanged(canDraw()); 990 m_client->onCanDrawStateChanged(canDraw());
972 m_client->onHasPendingTreeStateChanged(pendingTree()); 991 m_client->onHasPendingTreeStateChanged(pendingTree());
973 m_client->setNeedsRedrawOnImplThread(); 992 m_client->setNeedsRedrawOnImplThread();
974 m_client->renewTreePriority(); 993 m_client->renewTreePriority();
975 } 994 }
976 995
977 void LayerTreeHostImpl::setVisible(bool visible) 996 void LayerTreeHostImpl::setVisible(bool visible)
978 { 997 {
(...skipping 17 matching lines...) Expand all
996 { 1015 {
997 // Since we will create a new resource provider, we cannot continue to use 1016 // Since we will create a new resource provider, we cannot continue to use
998 // the old resources (i.e. renderSurfaces and texture IDs). Clear them 1017 // the old resources (i.e. renderSurfaces and texture IDs). Clear them
999 // before we destroy the old resource provider. 1018 // before we destroy the old resource provider.
1000 if (rootLayer()) 1019 if (rootLayer())
1001 clearRenderSurfaces(); 1020 clearRenderSurfaces();
1002 if (activeTree()->RootLayer()) 1021 if (activeTree()->RootLayer())
1003 sendDidLoseOutputSurfaceRecursive(activeTree()->RootLayer()); 1022 sendDidLoseOutputSurfaceRecursive(activeTree()->RootLayer());
1004 if (pendingTree() && pendingTree()->RootLayer()) 1023 if (pendingTree() && pendingTree()->RootLayer())
1005 sendDidLoseOutputSurfaceRecursive(pendingTree()->RootLayer()); 1024 sendDidLoseOutputSurfaceRecursive(pendingTree()->RootLayer());
1025 if (m_recycleTree && m_recycleTree->RootLayer())
1026 sendDidLoseOutputSurfaceRecursive(m_recycleTree->RootLayer());
1006 1027
1007 // Note: order is important here. 1028 // Note: order is important here.
1008 m_renderer.reset(); 1029 m_renderer.reset();
1009 m_tileManager.reset(); 1030 m_tileManager.reset();
1010 m_resourceProvider.reset(); 1031 m_resourceProvider.reset();
1011 m_outputSurface.reset(); 1032 m_outputSurface.reset();
1012 1033
1013 if (!outputSurface->BindToClient(this)) 1034 if (!outputSurface->BindToClient(this))
1014 return false; 1035 return false;
1015 1036
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
1110 void LayerTreeHostImpl::setPageScaleDelta(float delta) 1131 void LayerTreeHostImpl::setPageScaleDelta(float delta)
1111 { 1132 {
1112 m_pinchZoomViewport.set_page_scale_delta(delta); 1133 m_pinchZoomViewport.set_page_scale_delta(delta);
1113 1134
1114 updateMaxScrollOffset(); 1135 updateMaxScrollOffset();
1115 } 1136 }
1116 1137
1117 void LayerTreeHostImpl::updateMaxScrollOffset() 1138 void LayerTreeHostImpl::updateMaxScrollOffset()
1118 { 1139 {
1119 activeTree()->UpdateMaxScrollOffset(); 1140 activeTree()->UpdateMaxScrollOffset();
1120 if (pendingTree())
1121 pendingTree()->UpdateMaxScrollOffset();
1122 } 1141 }
1123 1142
1124 void LayerTreeHostImpl::setNeedsUpdateDrawProperties() 1143 void LayerTreeHostImpl::setNeedsUpdateDrawProperties()
1125 { 1144 {
1126 m_needsUpdateDrawProperties = true; 1145 m_needsUpdateDrawProperties = true;
1127 } 1146 }
1128 1147
1129 void LayerTreeHostImpl::setNeedsRedraw() 1148 void LayerTreeHostImpl::setNeedsRedraw()
1130 { 1149 {
1131 m_client->setNeedsRedrawOnImplThread(); 1150 m_client->setNeedsRedrawOnImplThread();
(...skipping 562 matching lines...) Expand 10 before | Expand all | Expand 10 after
1694 LayerImpl* layer = getNonCompositedContentLayerRecursive(tree->RootLayer()); 1713 LayerImpl* layer = getNonCompositedContentLayerRecursive(tree->RootLayer());
1695 return layer ? layer->getPicture() : skia::RefPtr<SkPicture>(); 1714 return layer ? layer->getPicture() : skia::RefPtr<SkPicture>();
1696 } 1715 }
1697 1716
1698 void LayerTreeHostImpl::savePaintTime(const base::TimeDelta& totalPaintTime) 1717 void LayerTreeHostImpl::savePaintTime(const base::TimeDelta& totalPaintTime)
1699 { 1718 {
1700 m_paintTimeCounter->SavePaintTime(totalPaintTime); 1719 m_paintTimeCounter->SavePaintTime(totalPaintTime);
1701 } 1720 }
1702 1721
1703 } // namespace cc 1722 } // namespace cc
OLDNEW
« no previous file with comments | « cc/layer_tree_host_impl.h ('k') | cc/layer_tree_host_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698