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

Side by Side Diff: cc/layer_tree_host_impl.cc

Issue 12212156: cc: Only allow trees created at the current viewport size to draw. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Move viewport sizes out of LTHI Created 7 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 | Annotate | Revision Log
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 216 matching lines...) Expand 10 before | Expand all | Expand 10 after
227 // in the proper places and update the notifyIfCanDrawChanged test. 227 // in the proper places and update the notifyIfCanDrawChanged test.
228 228
229 if (!rootLayer()) { 229 if (!rootLayer()) {
230 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::canDraw no root layer"); 230 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::canDraw no root layer");
231 return false; 231 return false;
232 } 232 }
233 if (deviceViewportSize().IsEmpty()) { 233 if (deviceViewportSize().IsEmpty()) {
234 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::canDraw empty viewport"); 234 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::canDraw empty viewport");
235 return false; 235 return false;
236 } 236 }
237 if (deviceViewportSize() != activeTree()->device_viewport_size()) {
238 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::canDraw viewport resize i ncomplete");
239 return false;
240 }
237 if (!m_renderer) { 241 if (!m_renderer) {
238 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::canDraw no renderer"); 242 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::canDraw no renderer");
239 return false; 243 return false;
240 } 244 }
241 if (m_activeTree->ContentsTexturesPurged()) { 245 if (m_activeTree->ContentsTexturesPurged()) {
242 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::canDraw contents textures purged"); 246 TRACE_EVENT_INSTANT0("cc", "LayerTreeHostImpl::canDraw contents textures purged");
243 return false; 247 return false;
244 } 248 }
245 return true; 249 return true;
246 } 250 }
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
279 { 283 {
280 if (!rootScrollLayer()) 284 if (!rootScrollLayer())
281 return; 285 return;
282 286
283 gfx::Vector2dF scrollTotal = rootScrollLayer()->scrollOffset() + rootScrollL ayer()->scrollDelta(); 287 gfx::Vector2dF scrollTotal = rootScrollLayer()->scrollOffset() + rootScrollL ayer()->scrollDelta();
284 gfx::SizeF scaledScrollableSize = activeTree()->ScrollableSize(); 288 gfx::SizeF scaledScrollableSize = activeTree()->ScrollableSize();
285 if (!m_settings.pageScalePinchZoomEnabled) { 289 if (!m_settings.pageScalePinchZoomEnabled) {
286 scrollTotal.Scale(1 / activeTree()->page_scale_factor()); 290 scrollTotal.Scale(1 / activeTree()->page_scale_factor());
287 scaledScrollableSize.Scale(1 / activeTree()->page_scale_factor()); 291 scaledScrollableSize.Scale(1 / activeTree()->page_scale_factor());
288 } 292 }
289 gfx::SizeF viewportSize = gfx::ScaleSize(m_deviceViewportSize, 1 / m_deviceS caleFactor); 293 gfx::SizeF viewportSize = gfx::ScaleSize(deviceViewportSize(), 1 / m_deviceS caleFactor);
danakj 2013/02/13 06:51:36 Is this right? The rootScrollLayer() it's using he
aelias_OOO_until_Jul13 2013/02/13 07:37:08 I definitely want pendingTree size here. pageScal
290 294
291 double startTimeSeconds = (startTime - base::TimeTicks()).InSecondsF(); 295 double startTimeSeconds = (startTime - base::TimeTicks()).InSecondsF();
292 m_pageScaleAnimation = PageScaleAnimation::create(scrollTotal, activeTree()- >total_page_scale_factor(), viewportSize, scaledScrollableSize, startTimeSeconds ); 296 m_pageScaleAnimation = PageScaleAnimation::create(scrollTotal, activeTree()- >total_page_scale_factor(), viewportSize, scaledScrollableSize, startTimeSeconds );
293 297
294 if (anchorPoint) { 298 if (anchorPoint) {
295 gfx::Vector2dF anchor(targetOffset); 299 gfx::Vector2dF anchor(targetOffset);
296 if (!m_settings.pageScalePinchZoomEnabled) 300 if (!m_settings.pageScalePinchZoomEnabled)
297 anchor.Scale(1 / pageScale); 301 anchor.Scale(1 / pageScale);
298 m_pageScaleAnimation->zoomWithAnchor(anchor, pageScale, duration.InSecon dsF()); 302 m_pageScaleAnimation->zoomWithAnchor(anchor, pageScale, duration.InSecon dsF());
299 } else { 303 } else {
(...skipping 561 matching lines...) Expand 10 before | Expand all | Expand 10 after
861 return m_renderer->capabilities(); 865 return m_renderer->capabilities();
862 } 866 }
863 867
864 bool LayerTreeHostImpl::swapBuffers() 868 bool LayerTreeHostImpl::swapBuffers()
865 { 869 {
866 return m_renderer->swapBuffers(); 870 return m_renderer->swapBuffers();
867 } 871 }
868 872
869 const gfx::Size& LayerTreeHostImpl::deviceViewportSize() const 873 const gfx::Size& LayerTreeHostImpl::deviceViewportSize() const
870 { 874 {
871 return m_deviceViewportSize; 875 if (pendingTree())
876 return pendingTree()->device_viewport_size();
877 return activeTree()->device_viewport_size();
878 }
879
880 const gfx::Size& LayerTreeHostImpl::layoutViewportSize() const
881 {
882 if (pendingTree())
883 return pendingTree()->layout_viewport_size();
884 return activeTree()->layout_viewport_size();
872 } 885 }
873 886
874 const LayerTreeSettings& LayerTreeHostImpl::settings() const 887 const LayerTreeSettings& LayerTreeHostImpl::settings() const
875 { 888 {
876 return m_settings; 889 return m_settings;
877 } 890 }
878 891
879 void LayerTreeHostImpl::didLoseOutputSurface() 892 void LayerTreeHostImpl::didLoseOutputSurface()
880 { 893 {
881 m_client->didLoseOutputSurfaceOnImplThread(); 894 m_client->didLoseOutputSurfaceOnImplThread();
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after
1084 // to be initialized to get max texture size. 1097 // to be initialized to get max texture size.
1085 activeTree()->set_needs_update_draw_properties(); 1098 activeTree()->set_needs_update_draw_properties();
1086 if (pendingTree()) 1099 if (pendingTree())
1087 pendingTree()->set_needs_update_draw_properties(); 1100 pendingTree()->set_needs_update_draw_properties();
1088 1101
1089 return true; 1102 return true;
1090 } 1103 }
1091 1104
1092 void LayerTreeHostImpl::setViewportSize(const gfx::Size& layoutViewportSize, con st gfx::Size& deviceViewportSize) 1105 void LayerTreeHostImpl::setViewportSize(const gfx::Size& layoutViewportSize, con st gfx::Size& deviceViewportSize)
1093 { 1106 {
1094 if (layoutViewportSize == m_layoutViewportSize && deviceViewportSize == m_de viceViewportSize) 1107 if (m_settings.implSidePainting)
1095 return; 1108 pendingTree()->SetViewportSize(layoutViewportSize, deviceViewportSize);
1096 1109 else
1097 m_layoutViewportSize = layoutViewportSize; 1110 activeTree()->SetViewportSize(layoutViewportSize, deviceViewportSize);
1098 m_deviceViewportSize = deviceViewportSize;
1099
1100 updateMaxScrollOffset();
1101
1102 if (m_renderer)
1103 m_renderer->viewportChanged();
1104
1105 m_client->onCanDrawStateChanged(canDraw());
1106 } 1111 }
1107 1112
1108 static void adjustScrollsForPageScaleChange(LayerImpl* layerImpl, float pageScal eChange) 1113 static void adjustScrollsForPageScaleChange(LayerImpl* layerImpl, float pageScal eChange)
1109 { 1114 {
1110 if (!layerImpl) 1115 if (!layerImpl)
1111 return; 1116 return;
1112 1117
1113 if (layerImpl->scrollable()) { 1118 if (layerImpl->scrollable()) {
1114 // We need to convert impl-side scroll deltas to pageScale space. 1119 // We need to convert impl-side scroll deltas to pageScale space.
1115 gfx::Vector2dF scrollDelta = layerImpl->scrollDelta(); 1120 gfx::Vector2dF scrollDelta = layerImpl->scrollDelta();
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after
1421 gfx::Vector2dF scrollBegin = rootScrollLayer()->scrollOffset() + rootScrollL ayer()->scrollDelta(); 1426 gfx::Vector2dF scrollBegin = rootScrollLayer()->scrollOffset() + rootScrollL ayer()->scrollDelta();
1422 scrollBegin.Scale(activeTree()->page_scale_delta()); 1427 scrollBegin.Scale(activeTree()->page_scale_delta());
1423 float scaleBegin = activeTree()->total_page_scale_factor(); 1428 float scaleBegin = activeTree()->total_page_scale_factor();
1424 float pageScaleDeltaToSend = activeTree()->min_page_scale_factor() / activeT ree()->page_scale_factor(); 1429 float pageScaleDeltaToSend = activeTree()->min_page_scale_factor() / activeT ree()->page_scale_factor();
1425 gfx::SizeF scaledScrollableSize = gfx::ScaleSize(activeTree()->ScrollableSiz e(), pageScaleDeltaToSend); 1430 gfx::SizeF scaledScrollableSize = gfx::ScaleSize(activeTree()->ScrollableSiz e(), pageScaleDeltaToSend);
1426 1431
1427 gfx::Vector2d anchorOffset = m_previousPinchAnchor.OffsetFromOrigin(); 1432 gfx::Vector2d anchorOffset = m_previousPinchAnchor.OffsetFromOrigin();
1428 gfx::Vector2dF scrollEnd = scrollBegin + anchorOffset; 1433 gfx::Vector2dF scrollEnd = scrollBegin + anchorOffset;
1429 scrollEnd.Scale(activeTree()->min_page_scale_factor() / scaleBegin); 1434 scrollEnd.Scale(activeTree()->min_page_scale_factor() / scaleBegin);
1430 scrollEnd -= anchorOffset; 1435 scrollEnd -= anchorOffset;
1431 scrollEnd.ClampToMax(gfx::RectF(scaledScrollableSize).bottom_right() - gfx:: Rect(m_deviceViewportSize).bottom_right()); 1436 scrollEnd.ClampToMax(gfx::RectF(scaledScrollableSize).bottom_right() - gfx:: Rect(deviceViewportSize()).bottom_right());
danakj 2013/02/13 06:51:36 Should this be the active tree's deviceViewportSiz
aelias_OOO_until_Jul13 2013/02/13 07:37:08 This is dead code due for deletion, doesn't matter
1432 scrollEnd.ClampToMin(gfx::Vector2d()); 1437 scrollEnd.ClampToMin(gfx::Vector2d());
1433 scrollEnd.Scale(1 / pageScaleDeltaToSend); 1438 scrollEnd.Scale(1 / pageScaleDeltaToSend);
1434 scrollEnd.Scale(m_deviceScaleFactor); 1439 scrollEnd.Scale(m_deviceScaleFactor);
1435 1440
1436 makeScrollAndScaleSet(scrollInfo, gfx::ToRoundedVector2d(scrollEnd), activeT ree()->min_page_scale_factor()); 1441 makeScrollAndScaleSet(scrollInfo, gfx::ToRoundedVector2d(scrollEnd), activeT ree()->min_page_scale_factor());
1437 } 1442 }
1438 1443
1439 static void collectScrollDeltas(ScrollAndScaleSet* scrollInfo, LayerImpl* layerI mpl) 1444 static void collectScrollDeltas(ScrollAndScaleSet* scrollInfo, LayerImpl* layerI mpl)
1440 { 1445 {
1441 if (!layerImpl) 1446 if (!layerImpl)
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after
1711 state->SetString("lthi_id", StringPrintf("%p", this)); 1716 state->SetString("lthi_id", StringPrintf("%p", this));
1712 state->SetBoolean("visible_resources_ready", pendingTree()->AreVisibleResour cesReady()); 1717 state->SetBoolean("visible_resources_ready", pendingTree()->AreVisibleResour cesReady());
1713 state->Set("tile_manager", m_tileManager->BasicStateAsValue().release()); 1718 state->Set("tile_manager", m_tileManager->BasicStateAsValue().release());
1714 return state.PassAs<base::Value>(); 1719 return state.PassAs<base::Value>();
1715 } 1720 }
1716 1721
1717 scoped_ptr<base::Value> LayerTreeHostImpl::frameStateAsValue() const 1722 scoped_ptr<base::Value> LayerTreeHostImpl::frameStateAsValue() const
1718 { 1723 {
1719 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); 1724 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue());
1720 state->SetString("lthi_id", StringPrintf("%p", this)); 1725 state->SetString("lthi_id", StringPrintf("%p", this));
1721 state->Set("device_viewport_size", MathUtil::asValue(m_deviceViewportSize).r elease()); 1726 state->Set("device_viewport_size", MathUtil::asValue(deviceViewportSize()).r elease());
danakj 2013/02/13 06:51:36 This should be the active tree too right? I feel
aelias_OOO_until_Jul13 2013/02/13 07:37:08 If it drew a frame, then active tree and pending t
1722 if (m_tileManager) 1727 if (m_tileManager)
1723 state->Set("tiles", m_tileManager->AllTilesAsValue().release()); 1728 state->Set("tiles", m_tileManager->AllTilesAsValue().release());
1724 return state.PassAs<base::Value>(); 1729 return state.PassAs<base::Value>();
1725 } 1730 }
1726 1731
1727 // static 1732 // static
1728 LayerImpl* LayerTreeHostImpl::getNonCompositedContentLayerRecursive(LayerImpl* l ayer) 1733 LayerImpl* LayerTreeHostImpl::getNonCompositedContentLayerRecursive(LayerImpl* l ayer)
1729 { 1734 {
1730 if (!layer) 1735 if (!layer)
1731 return NULL; 1736 return NULL;
(...skipping 25 matching lines...) Expand all
1757 if (m_tileManager) 1762 if (m_tileManager)
1758 m_tileManager->SetRecordRenderingStats(m_debugState.recordRenderingStats ()); 1763 m_tileManager->SetRecordRenderingStats(m_debugState.recordRenderingStats ());
1759 } 1764 }
1760 1765
1761 void LayerTreeHostImpl::savePaintTime(const base::TimeDelta& totalPaintTime) 1766 void LayerTreeHostImpl::savePaintTime(const base::TimeDelta& totalPaintTime)
1762 { 1767 {
1763 m_paintTimeCounter->SavePaintTime(totalPaintTime); 1768 m_paintTimeCounter->SavePaintTime(totalPaintTime);
1764 } 1769 }
1765 1770
1766 } // namespace cc 1771 } // namespace cc
OLDNEW
« no previous file with comments | « cc/layer_tree_host_impl.h ('k') | cc/layer_tree_impl.h » ('j') | cc/layer_tree_impl.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698