layer_tree_host_unittest.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2011 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/synchronization/lock.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/animation/timing_function.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/content_layer.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/content_layer_client.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/layer_impl.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/picture_layer.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/scrollbar_layer.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/output_surface.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/prioritized_resource.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/prioritized_resource_manager.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/resource_update_queue.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/scheduler/frame_rate_controller.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_content_layer.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_content_layer_client.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_layer_tree_host_client.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_output_surface.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_proxy.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_scrollbar_layer.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/geometry_test_utils.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/layer_tree_test.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/occlusion_tracker_test_common.h" 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host_impl.h" 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_impl.h" 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/single_thread_proxy.h" 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/thread_proxy.h" 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "skia/ext/refptr.h" 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/WebKit/Source/Platform/chromium/public/WebSize.h" 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/khronos/GLES2/gl2.h" 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/khronos/GLES2/gl2ext.h" 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/core/SkPicture.h" 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/point_conversions.h" 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/size_conversions.h" 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/vector2d_conversions.h" 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTest : public LayerTreeTest {}; 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Test interleaving of redraws and commits 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestCommitingWithContinuousRedraw : public LayerTreeHostTest { 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostTestCommitingWithContinuousRedraw() 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : m_numCompleteCommits(0) 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) , m_numDraws(0) 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl*) OVERRIDE 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_numCompleteCommits++; 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (m_numCompleteCommits == 2) 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl*) OVERRIDE 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (m_numDraws == 1) 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_numDraws++; 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsRedrawToMainThread(); 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private: 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int m_numCompleteCommits; 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int m_numDraws; 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestCommitingWithContinuousRedraw) 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Two setNeedsCommits in a row should lead to at least 1 commit and at least 1 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// draw with frame 0. 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestSetNeedsCommit1 : public LayerTreeHostTest { 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostTestSetNeedsCommit1() 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : m_numCommits(0) 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) , m_numDraws(0) 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_numDraws++; 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!impl->active_tree()->source_frame_number()) 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl*) OVERRIDE 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_numCommits++; 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_GE(1, m_numCommits); 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_GE(1, m_numDraws); 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private: 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int m_numCommits; 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int m_numDraws; 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//MULTI_THREAD_TEST_F(LayerTreeHostTestSetNeedsCommit1) 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A setNeedsCommit should lead to 1 commit. Issuing a second commit after that 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// first committed frame draws should lead to another commit. 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestSetNeedsCommit2 : public LayerTreeHostTest { 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostTestSetNeedsCommit2() 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : m_numCommits(0) 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) , m_numDraws(0) 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (impl->active_tree()->source_frame_number() == 0) 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (impl->active_tree()->source_frame_number() == 1) 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl*) OVERRIDE 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_numCommits++; 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2, m_numCommits); 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_GE(2, m_numDraws); 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private: 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int m_numCommits; 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int m_numDraws; 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestSetNeedsCommit2) 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 1 setNeedsRedraw after the first commit has completed should lead to 1 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// additional draw. 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestSetNeedsRedraw : public LayerTreeHostTest { 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostTestSetNeedsRedraw() 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : m_numCommits(0) 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) , m_numDraws(0) 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, impl->active_tree()->source_frame_number()); 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!m_numDraws) 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsRedrawToMainThread(); // Redraw again to verify that the second redraw doesn't commit. 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_numDraws++; 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl*) OVERRIDE 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, m_numDraws); 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_numCommits++; 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_GE(2, m_numDraws); 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, m_numCommits); 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private: 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int m_numCommits; 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int m_numDraws; 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestSetNeedsRedraw) 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestNoExtraCommitFromInvalidate : public LayerTreeHostTest { 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostTestNoExtraCommitFromInvalidate() 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : m_rootLayer(ContentLayer::Create(&client_)) 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_rootLayer->SetAutomaticallyComputeRasterScale(false); 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_rootLayer->SetIsDrawable(true); 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_rootLayer->SetBounds(gfx::Size(1, 1)); 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetRootLayer(m_rootLayer); 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommit() OVERRIDE 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (layer_tree_host()->commit_number()) { 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 1: 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Changing the content bounds will cause a single commit! 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_rootLayer->SetRasterScale(4.0f); 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No extra commits. 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2, layer_tree_host()->commit_number()); 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private: 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerClient client_; 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<ContentLayer> m_rootLayer; 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestNoExtraCommitFromInvalidate) 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestCompositeAndReadback : public LayerTreeHostTest { 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostTestCompositeAndReadback() 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : m_numCommits(0) 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommit() OVERRIDE 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_numCommits++; 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (m_numCommits == 1) { 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) char pixels[4]; 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->CompositeAndReadback(&pixels, gfx::Rect(0, 0, 1, 1)); 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (m_numCommits == 2) { 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This is inside the readback. We should get another commit after it. 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (m_numCommits == 3) { 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private: 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int m_numCommits; 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestCompositeAndReadback) 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestCompositeAndReadbackBeforePreviousCommitDraws : public LayerTreeHostTest { 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostTestCompositeAndReadbackBeforePreviousCommitDraws() 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : m_numCommits(0) 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommit() OVERRIDE 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_numCommits++; 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (m_numCommits == 1) { 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (m_numCommits == 2) { 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) char pixels[4]; 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->CompositeAndReadback(&pixels, gfx::Rect(0, 0, 1, 1)); 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (m_numCommits == 3) { 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This is inside the readback. We should get another commit after it. 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (m_numCommits == 4) { 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private: 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int m_numCommits; 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestCompositeAndReadbackBeforePreviousCommitDraws) 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// If the layerTreeHost says it can't draw, then we should not try to draw. 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestCanDrawBlocksDrawing : public LayerTreeHostTest { 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostTestCanDrawBlocksDrawing() 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : m_numCommits(0) 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) , m_done(false) 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (m_done) 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Only the initial draw should bring us here. 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(impl->CanDraw()); 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, impl->active_tree()->source_frame_number()); 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (m_done) 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (m_numCommits >= 1) { 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // After the first commit, we should not be able to draw. 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(impl->CanDraw()); 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommit() OVERRIDE 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_numCommits++; 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (m_numCommits == 1) { 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Make the viewport empty so the host says it can't draw. 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(0, 0), gfx::Size(0, 0)); 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (m_numCommits == 2) { 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) char pixels[4]; 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->CompositeAndReadback(&pixels, gfx::Rect(0, 0, 1, 1)); 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (m_numCommits == 3) { 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Let it draw so we go idle and end the test. 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(1, 1), gfx::Size(1, 1)); 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_done = true; 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private: 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int m_numCommits; 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool m_done; 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestCanDrawBlocksDrawing) 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// beginLayerWrite should prevent draws from executing until a commit occurs 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestWriteLayersRedraw : public LayerTreeHostTest { 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostTestWriteLayersRedraw() 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : m_numCommits(0) 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) , m_numDraws(0) 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostAcquireLayerTextures(); 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsRedrawToMainThread(); // should be inhibited without blocking 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_numDraws++; 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(m_numDraws, m_numCommits); 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl*) OVERRIDE 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_numCommits++; 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, m_numCommits); 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private: 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int m_numCommits; 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int m_numDraws; 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestWriteLayersRedraw) 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verify that when resuming visibility, requesting layer write permission 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// will not deadlock the main thread even though there are not yet any 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// scheduled redraws. This behavior is critical for reliably surviving tab 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// switching. There are no failure conditions to this test, it just passes 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// by not timing out. 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestWriteLayersAfterVisible : public LayerTreeHostTest { 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostTestWriteLayersAfterVisible() 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : m_numCommits(0) 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl*) OVERRIDE 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_numCommits++; 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (m_numCommits == 2) 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (m_numCommits < 2) { 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetVisibleToMainThread(false); 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetVisibleToMainThread(true); 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostAcquireLayerTextures(); 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private: 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int m_numCommits; 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestWriteLayersAfterVisible) 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A compositeAndReadback while invisible should force a normal commit without assertion. 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestCompositeAndReadbackWhileInvisible : public LayerTreeHostTest { 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostTestCompositeAndReadbackWhileInvisible() 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : m_numCommits(0) 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_numCommits++; 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (m_numCommits == 1) { 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetVisible(false); 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) char pixels[4]; 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->CompositeAndReadback(&pixels, gfx::Rect(0, 0, 1, 1)); 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private: 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int m_numCommits; 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestCompositeAndReadbackWhileInvisible) 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestAbortFrameWhenInvisible : public LayerTreeHostTest { 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostTestAbortFrameWhenInvisible() 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Request a commit (from the main thread), which will trigger the commit flow from the impl side. 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Then mark ourselves as not visible before processing any more messages on the main thread. 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetVisible(false); 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If we make it without kicking a frame, we pass! 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTestAfterDelay(1); 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Layout() OVERRIDE 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_FALSE(true); 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private: 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestAbortFrameWhenInvisible) 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This test verifies that properties on the layer tree host are commited to the impl side. 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestCommit : public LayerTreeHostTest { 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostTestCommit() { } 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(20, 20), gfx::Size(20, 20)); 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->set_background_color(SK_ColorGRAY); 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetPageScaleFactorAndLimits(5, 5, 5); 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(gfx::Size(20, 20), impl->layout_viewport_size()); 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(SK_ColorGRAY, impl->active_tree()->background_color()); 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(5, impl->active_tree()->page_scale_factor()); 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE { } 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestCommit) 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verifies that startPageScaleAnimation events propagate correctly from LayerTreeHost to 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// LayerTreeHostImpl in the MT compositor. 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestStartPageScaleAnimation : public LayerTreeHostTest { 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostTestStartPageScaleAnimation() 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : m_animationRequested(false) 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->root_layer()->SetScrollable(true); 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->root_layer()->SetScrollOffset(gfx::Vector2d()); 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsRedrawToMainThread(); 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void requestStartPageScaleAnimation() 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->StartPageScaleAnimation(gfx::Vector2d(), false, 1.25, base::TimeDelta()); 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) impl->active_tree()->root_layer()->SetScrollable(true); 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) impl->active_tree()->root_layer()->SetScrollOffset(gfx::Vector2d()); 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) impl->active_tree()->SetPageScaleFactorAndLimits(impl->active_tree()->page_scale_factor(), 0.5, 2); 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We request animation only once. 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!m_animationRequested) { 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) impl->proxy()->MainThread()->PostTask(base::Bind(&LayerTreeHostTestStartPageScaleAnimation::requestStartPageScaleAnimation, base::Unretained(this))); 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_animationRequested = true; 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void ApplyScrollAndScale(gfx::Vector2d scrollDelta, float scale) OVERRIDE 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2d offset = layer_tree_host()->root_layer()->scroll_offset(); 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->root_layer()->SetScrollOffset(offset + scrollDelta); 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetPageScaleFactorAndLimits(scale, 0.5, 2); 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) impl->ProcessScrollDeltas(); 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We get one commit before the first draw, and the animation doesn't happen until the second draw. 6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (impl->active_tree()->source_frame_number() == 1) { 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1.25, impl->active_tree()->page_scale_factor()); 6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsRedrawToMainThread(); 6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE 6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private: 6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool m_animationRequested; 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(aelias): This test is currently broken: http://crbug.com/178295 6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//MULTI_THREAD_TEST_F(LayerTreeHostTestStartPageScaleAnimation) 6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestSetVisible : public LayerTreeHostTest { 6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostTestSetVisible() 6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : m_numDraws(0) 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE 6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetVisibleToMainThread(false); 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsRedrawToMainThread(); // This is suppressed while we're invisible. 6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetVisibleToMainThread(true); // Triggers the redraw. 6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE 6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(impl->visible()); 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++m_numDraws; 6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE 6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, m_numDraws); 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private: 6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int m_numDraws; 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestSetVisible) 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TestOpacityChangeLayerDelegate : public ContentLayerClient { 6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestOpacityChangeLayerDelegate() 6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : m_testLayer(0) 6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void setTestLayer(Layer* testLayer) 6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_testLayer = testLayer; 6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void PaintContents(SkCanvas*, gfx::Rect, gfx::RectF*) OVERRIDE 6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Set layer opacity to 0. 6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (m_testLayer) 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_testLayer->SetOpacity(0); 6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidChangeLayerCanUseLCDText() OVERRIDE {} 6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private: 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Layer* m_testLayer; 6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ContentLayerWithUpdateTracking : public ContentLayer { 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static scoped_refptr<ContentLayerWithUpdateTracking> Create(ContentLayerClient* client) { return make_scoped_refptr(new ContentLayerWithUpdateTracking(client)); } 6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int paintContentsCount() { return m_paintContentsCount; } 6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void resetPaintContentsCount() { m_paintContentsCount = 0; } 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Update(ResourceUpdateQueue* queue, const OcclusionTracker* occlusion, RenderingStats* stats) OVERRIDE 6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ContentLayer::Update(queue, occlusion, stats); 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_paintContentsCount++; 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private: 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit ContentLayerWithUpdateTracking(ContentLayerClient* client) 7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : ContentLayer(client) 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) , m_paintContentsCount(0) 7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetAnchorPoint(gfx::PointF(0, 0)); 7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetBounds(gfx::Size(10, 10)); 7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetIsDrawable(true); 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~ContentLayerWithUpdateTracking() 7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int m_paintContentsCount; 7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Layer opacity change during paint should not prevent compositor resources from being updated during commit. 7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestOpacityChange : public LayerTreeHostTest { 7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostTestOpacityChange() 7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : m_testOpacityChangeDelegate() 7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) , m_updateCheckLayer(ContentLayerWithUpdateTracking::Create(&m_testOpacityChangeDelegate)) 7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_testOpacityChangeDelegate.setTestLayer(m_updateCheckLayer.get()); 7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE 7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(10, 10), gfx::Size(10, 10)); 7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->root_layer()->AddChild(m_updateCheckLayer); 7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl*) OVERRIDE 7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE 7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Update() should have been called once. 7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, m_updateCheckLayer->paintContentsCount()); 7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // clear m_updateCheckLayer so LayerTreeHost dies. 7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_updateCheckLayer = NULL; 7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private: 7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestOpacityChangeLayerDelegate m_testOpacityChangeDelegate; 7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<ContentLayerWithUpdateTracking> m_updateCheckLayer; 7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestOpacityChange) 7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NoScaleContentLayer : public ContentLayer { 7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static scoped_refptr<NoScaleContentLayer> Create(ContentLayerClient* client) { return make_scoped_refptr(new NoScaleContentLayer(client)); } 7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CalculateContentsScale( 7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float ideal_contents_scale, 7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool animating_transform_to_screen, 7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float* contents_scale_x, 7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float* contents_scale_y, 7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size* contentBounds) OVERRIDE 7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Skip over the ContentLayer's method to the base Layer class. 7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Layer::CalculateContentsScale( 7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ideal_contents_scale, 7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animating_transform_to_screen, 7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contents_scale_x, 7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contents_scale_y, 7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) contentBounds); 7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private: 7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit NoScaleContentLayer(ContentLayerClient* client) 7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : ContentLayer(client) { } 7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~NoScaleContentLayer() { } 7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestDeviceScaleFactorScalesViewportAndLayers : public LayerTreeHostTest { 7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostTestDeviceScaleFactorScalesViewportAndLayers() 7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : m_rootLayer(NoScaleContentLayer::Create(&client_)) 7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) , m_childLayer(ContentLayer::Create(&client_)) 7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE 7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(40, 40), gfx::Size(60, 60)); 7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetDeviceScaleFactor(1.5); 7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(gfx::Size(40, 40), layer_tree_host()->layout_viewport_size()); 7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(gfx::Size(60, 60), layer_tree_host()->device_viewport_size()); 8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_rootLayer->AddChild(m_childLayer); 8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_rootLayer->SetIsDrawable(true); 8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_rootLayer->SetBounds(gfx::Size(30, 30)); 8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_rootLayer->SetAnchorPoint(gfx::PointF(0, 0)); 8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_childLayer->SetIsDrawable(true); 8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_childLayer->SetPosition(gfx::Point(2, 2)); 8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_childLayer->SetBounds(gfx::Size(10, 10)); 8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_childLayer->SetAnchorPoint(gfx::PointF(0, 0)); 8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetRootLayer(m_rootLayer); 8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(layer_tree_host()->InitializeRendererIfNeeded()); 8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceUpdateQueue queue; 8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->UpdateLayers(&queue, std::numeric_limits<size_t>::max()); 8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE 8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Should only do one commit. 8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, impl->active_tree()->source_frame_number()); 8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Device scale factor should come over to impl. 8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NEAR(impl->device_scale_factor(), 1.5, 0.00001); 8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Both layers are on impl. 8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(1u, impl->active_tree()->root_layer()->children().size()); 8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Device viewport is scaled. 8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(gfx::Size(40, 40), impl->layout_viewport_size()); 8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(gfx::Size(60, 60), impl->device_viewport_size()); 8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* root = impl->active_tree()->root_layer(); 8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerImpl* child = impl->active_tree()->root_layer()->children()[0]; 8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Positions remain in layout pixels. 8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(gfx::Point(0, 0), root->position()); 8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(gfx::Point(2, 2), child->position()); 8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Compute all the layer transforms for the frame. 8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImpl::FrameData frameData; 8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) impl->PrepareToDraw(&frameData); 8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) impl->DidDrawAllLayers(frameData); 8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const LayerTreeHostImpl::LayerList& renderSurfaceLayerList = 8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *frameData.render_surface_layer_list; 8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Both layers should be drawing into the root render surface. 8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(1u, renderSurfaceLayerList.size()); 8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(root->render_surface(), renderSurfaceLayerList[0]->render_surface()); 8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(2u, root->render_surface()->layer_list().size()); 8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The root render surface is the size of the viewport. 8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_RECT_EQ(gfx::Rect(0, 0, 60, 60), root->render_surface()->content_rect()); 8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The content bounds of the child should be scaled. 8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size childBoundsScaled = gfx::ToCeiledSize(gfx::ScaleSize(child->bounds(), 1.5)); 8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(childBoundsScaled, child->content_bounds()); 8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform scaleTransform; 8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scaleTransform.Scale(impl->device_scale_factor(), impl->device_scale_factor()); 8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The root layer is scaled by 2x. 8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform rootScreenSpaceTransform = scaleTransform; 8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform rootDrawTransform = scaleTransform; 8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(rootDrawTransform, root->draw_transform()); 8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(rootScreenSpaceTransform, root->screen_space_transform()); 8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The child is at position 2,2, which is transformed to 3,3 after the scale 8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform childScreenSpaceTransform; 8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) childScreenSpaceTransform.Translate(3, 3); 8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform childDrawTransform = childScreenSpaceTransform; 8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRANSFORMATION_MATRIX_EQ(childDrawTransform, child->draw_transform()); 8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRANSFORMATION_MATRIX_EQ(childScreenSpaceTransform, child->screen_space_transform()); 8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE 8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_rootLayer = NULL; 8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_childLayer = NULL; 8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private: 8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerClient client_; 8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<NoScaleContentLayer> m_rootLayer; 8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<ContentLayer> m_childLayer; 8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestDeviceScaleFactorScalesViewportAndLayers) 8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verify atomicity of commits and reuse of textures. 8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestAtomicCommit : public LayerTreeHostTest { 8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE 9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Make sure partial texture updates are turned off. 9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings->max_partial_texture_updates = 0; 9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Linear fade animator prevents scrollbars from drawing immediately. 9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings->use_linear_fade_scrollbar_animator = false; 9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetupTree() OVERRIDE 9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_layer = FakeContentLayer::Create(&client_); 9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_layer->SetBounds(gfx::Size(10, 20)); 9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool paint_scrollbar = true; 9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool has_thumb = false; 9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_scrollbar = FakeScrollbarLayer::Create( 9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) paint_scrollbar, has_thumb, m_layer->id()); 9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_scrollbar->SetPosition(gfx::Point(0, 10)); 9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_scrollbar->SetBounds(gfx::Size(10, 10)); 9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_layer->AddChild(m_scrollbar); 9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetRootLayer(m_layer); 9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE 9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE 9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(0u, 9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->settings().max_partial_texture_updates); 9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestWebGraphicsContext3D* context = static_cast<TestWebGraphicsContext3D*>(impl->output_surface()->context3d()); 9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (impl->active_tree()->source_frame_number()) { 9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 0: 9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Number of textures should be one for each layer 9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(2, context->NumTextures()); 9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Number of textures used for commit should be one for each layer. 9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2, context->NumUsedTextures()); 9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Verify that used texture is correct. 9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(0))); 9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(1))); 9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context->ResetUsedTextures(); 9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 1: 9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Number of textures should be doubled as the first textures 9522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // are used by impl thread and cannot by used for update. 9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(4, context->NumTextures()); 9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Number of textures used for commit should still be one for each layer. 9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2, context->NumUsedTextures()); 9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // First textures should not have been used. 9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(context->UsedTexture(context->TextureAt(0))); 9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(context->UsedTexture(context->TextureAt(1))); 9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // New textures should have been used. 9602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(2))); 9612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(3))); 9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context->ResetUsedTextures(); 9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 2: 9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE 9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestWebGraphicsContext3D* context = static_cast<TestWebGraphicsContext3D*>(impl->output_surface()->context3d()); 9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Number of textures used for draw should always be one for each layer. 9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2, context->NumUsedTextures()); 9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context->ResetUsedTextures(); 9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Layout() OVERRIDE 9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_layer->SetNeedsDisplay(); 9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_scrollbar->SetNeedsDisplay(); 9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE 9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private: 9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerClient client_; 9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<FakeContentLayer> m_layer; 9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<FakeScrollbarLayer> m_scrollbar; 9982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 9992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestAtomicCommit) 10012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static void setLayerPropertiesForTesting(Layer* layer, Layer* parent, const gfx::Transform& transform, const gfx::PointF& anchor, const gfx::PointF& position, const gfx::Size& bounds, bool opaque) 10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->RemoveAllChildren(); 10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (parent) 10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent->AddChild(layer); 10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->SetTransform(transform); 10082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->SetAnchorPoint(anchor); 10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->SetPosition(position); 10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->SetBounds(bounds); 10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer->SetContentsOpaque(opaque); 10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestAtomicCommitWithPartialUpdate : public LayerTreeHostTest { 10152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostTestAtomicCommitWithPartialUpdate() 10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : m_numCommits(0) 10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE 10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Allow one partial texture update. 10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings->max_partial_texture_updates = 1; 10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Linear fade animator prevents scrollbars from drawing immediately. 10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings->use_linear_fade_scrollbar_animator = false; 10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetupTree() OVERRIDE 10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent_ = FakeContentLayer::Create(&client_); 10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent_->SetBounds(gfx::Size(10, 20)); 10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_child = FakeContentLayer::Create(&client_); 10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_child->SetPosition(gfx::Point(0, 10)); 10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_child->SetBounds(gfx::Size(3, 10)); 10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool paint_scrollbar = true; 10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool has_thumb = false; 10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_scrollbarWithPaints = FakeScrollbarLayer::Create( 10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) paint_scrollbar, has_thumb, parent_->id()); 10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_scrollbarWithPaints->SetPosition(gfx::Point(3, 10)); 10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_scrollbarWithPaints->SetBounds(gfx::Size(3, 10)); 10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) paint_scrollbar = false; 10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_scrollbarWithoutPaints = FakeScrollbarLayer::Create( 10472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) paint_scrollbar, has_thumb, parent_->id()); 10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_scrollbarWithoutPaints->SetPosition(gfx::Point(6, 10)); 10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_scrollbarWithoutPaints->SetBounds(gfx::Size(3, 10)); 10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent_->AddChild(m_child); 10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent_->AddChild(m_scrollbarWithPaints); 10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent_->AddChild(m_scrollbarWithoutPaints); 10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetRootLayer(parent_); 10562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE 10602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE 10652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 10662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(1u, 10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->settings().max_partial_texture_updates); 10682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestWebGraphicsContext3D* context = static_cast<TestWebGraphicsContext3D*>(impl->output_surface()->context3d()); 10702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (impl->active_tree()->source_frame_number()) { 10722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 0: 10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Number of textures should be one for each layer. 10742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(4, context->NumTextures()); 10752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Number of textures used for commit should be one for each layer. 10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(4, context->NumUsedTextures()); 10772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Verify that used textures are correct. 10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(0))); 10792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(1))); 10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(2))); 10812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(3))); 10822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context->ResetUsedTextures(); 10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 1: 10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Number of textures should be two for each content layer and one 10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // for each scrollbar, since they always do a partial update. 10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(6, context->NumTextures()); 10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Number of textures used for commit should be one for each content 10912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // layer, and one for the scrollbar layer that paints. 10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(3, context->NumUsedTextures()); 10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // First content textures should not have been used. 10952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(context->UsedTexture(context->TextureAt(0))); 10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(context->UsedTexture(context->TextureAt(1))); 10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The non-painting scrollbar's texture wasn't updated. 10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(context->UsedTexture(context->TextureAt(2))); 10992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The painting scrollbar's partial update texture was used. 11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(3))); 11012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // New textures should have been used. 11022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(4))); 11032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(5))); 11042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context->ResetUsedTextures(); 11062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 11072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 11082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 2: 11092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Number of textures should be two for each content layer and one 11102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // for each scrollbar, since they always do a partial update. 11112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(6, context->NumTextures()); 11122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Number of textures used for commit should be one for each content 11132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // layer, and one for the scrollbar layer that paints. 11142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(3, context->NumUsedTextures()); 11152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The non-painting scrollbar's texture wasn't updated. 11172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(context->UsedTexture(context->TextureAt(2))); 11182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The painting scrollbar does a partial update. 11192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(3))); 11202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // One content layer does a partial update also. 11212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(context->UsedTexture(context->TextureAt(4))); 11222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(context->UsedTexture(context->TextureAt(5))); 11232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context->ResetUsedTextures(); 11252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 11262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 11272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 3: 11282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No textures should be used for commit. 11292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, context->NumUsedTextures()); 11302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context->ResetUsedTextures(); 11322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 11332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 11342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 4: 11352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Number of textures used for commit should be two. One for the 11362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // content layer, and one for the painting scrollbar. The 11372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // non-painting scrollbar doesn't update its texture. 11382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2, context->NumUsedTextures()); 11392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context->ResetUsedTextures(); 11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 11422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 5: 11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 11462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 11472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 11482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 11492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE 11532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestWebGraphicsContext3D* context = static_cast<TestWebGraphicsContext3D*>(impl->output_surface()->context3d()); 11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Number of textures used for drawing should one per layer except for 11572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // frame 3 where the viewport only contains one layer. 11582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (impl->active_tree()->source_frame_number() == 3) 11592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, context->NumUsedTextures()); 11602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 11612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(4, context->NumUsedTextures()); 11622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) context->ResetUsedTextures(); 11642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Layout() OVERRIDE 11672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 11682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (m_numCommits++) { 11692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 0: 11702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 1: 11712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent_->SetNeedsDisplay(); 11722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_child->SetNeedsDisplay(); 11732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_scrollbarWithPaints->SetNeedsDisplay(); 11742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_scrollbarWithoutPaints->SetNeedsDisplay(); 11752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 11762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 2: 11772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Damage part of layers. 11782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent_->SetNeedsDisplayRect(gfx::RectF(0, 0, 5, 5)); 11792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_child->SetNeedsDisplayRect(gfx::RectF(0, 0, 5, 5)); 11802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_scrollbarWithPaints->SetNeedsDisplayRect(gfx::RectF(0, 0, 5, 5)); 11812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_scrollbarWithoutPaints->SetNeedsDisplayRect(gfx::RectF(0, 0, 5, 5)); 11822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 11832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 3: 11842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_child->SetNeedsDisplay(); 11852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_scrollbarWithPaints->SetNeedsDisplay(); 11862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_scrollbarWithoutPaints->SetNeedsDisplay(); 11872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(10, 10), gfx::Size(10, 10)); 11882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 11892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 4: 11902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(10, 20), gfx::Size(10, 20)); 11912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 11922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 5: 11932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 11942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 11952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 11962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 11972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE 12012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 12022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private: 12052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerClient client_; 12062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<FakeContentLayer> parent_; 12072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<FakeContentLayer> m_child; 12082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<FakeScrollbarLayer> m_scrollbarWithPaints; 12092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<FakeScrollbarLayer> m_scrollbarWithoutPaints; 12102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int m_numCommits; 12112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 12122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestAtomicCommitWithPartialUpdate) 12142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestFinishAllRendering : public LayerTreeHostTest { 12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 12172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostTestFinishAllRendering() 12182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : m_once(false) 12192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) , m_drawCount(0) 12202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 12212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE 12242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 12252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetNeedsRedraw(); 12262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 12272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE 12302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 12312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (m_once) 12322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 12332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_once = true; 12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetNeedsRedraw(); 12352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->AcquireLayerTextures(); 12362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 12372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::AutoLock lock(m_lock); 12382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_drawCount = 0; 12392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->FinishAllRendering(); 12412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::AutoLock lock(m_lock); 12432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, m_drawCount); 12442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 12462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE 12492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 12502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::AutoLock lock(m_lock); 12512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++m_drawCount; 12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE 12552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private: 12582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool m_once; 12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Lock m_lock; 12612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int m_drawCount; 12622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestFinishAllRendering) 12652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestCompositeAndReadbackCleanup : public LayerTreeHostTest { 12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 12682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostTestCompositeAndReadbackCleanup() { } 12692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE 12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 12722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Layer* rootLayer = layer_tree_host()->root_layer(); 12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) char pixels[4]; 12752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->CompositeAndReadback(static_cast<void*>(&pixels), gfx::Rect(0, 0, 1, 1)); 12762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(rootLayer->render_surface()); 12772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 12792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE 12822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 12832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestCompositeAndReadbackCleanup) 12872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestSurfaceNotAllocatedForLayersOutsideMemoryLimit : public LayerTreeHostTest { 12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 12902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostTestSurfaceNotAllocatedForLayersOutsideMemoryLimit() 12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : m_rootLayer(ContentLayerWithUpdateTracking::Create(&m_fakeDelegate)) 12922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) , m_surfaceLayer1(ContentLayerWithUpdateTracking::Create(&m_fakeDelegate)) 12932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) , m_replicaLayer1(ContentLayerWithUpdateTracking::Create(&m_fakeDelegate)) 12942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) , m_surfaceLayer2(ContentLayerWithUpdateTracking::Create(&m_fakeDelegate)) 12952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) , m_replicaLayer2(ContentLayerWithUpdateTracking::Create(&m_fakeDelegate)) 12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE 13002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 13012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings->cache_render_pass_contents = true; 13022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE 13052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 13062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(100, 100), gfx::Size(100, 100)); 13072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_rootLayer->SetBounds(gfx::Size(100, 100)); 13092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_surfaceLayer1->SetBounds(gfx::Size(100, 100)); 13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_surfaceLayer1->SetForceRenderSurface(true); 13112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_surfaceLayer1->SetOpacity(0.5); 13122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_surfaceLayer2->SetBounds(gfx::Size(100, 100)); 13132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_surfaceLayer2->SetForceRenderSurface(true); 13142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_surfaceLayer2->SetOpacity(0.5); 13152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_surfaceLayer1->SetReplicaLayer(m_replicaLayer1.get()); 13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_surfaceLayer2->SetReplicaLayer(m_replicaLayer2.get()); 13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_rootLayer->AddChild(m_surfaceLayer1); 13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_surfaceLayer1->AddChild(m_surfaceLayer2); 13212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetRootLayer(m_rootLayer); 13222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 13242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* hostImpl) OVERRIDE 13272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Renderer* renderer = hostImpl->renderer(); 13292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderPass::Id surface1RenderPassId = hostImpl->active_tree()->root_layer()->children()[0]->render_surface()->RenderPassId(); 13302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderPass::Id surface2RenderPassId = hostImpl->active_tree()->root_layer()->children()[0]->children()[0]->render_surface()->RenderPassId(); 13312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (hostImpl->active_tree()->source_frame_number()) { 13332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 0: 13342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(renderer->HaveCachedResourcesForRenderPassId(surface1RenderPassId)); 13352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(renderer->HaveCachedResourcesForRenderPassId(surface2RenderPassId)); 13362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Reduce the memory limit to only fit the root layer and one render surface. This 13382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // prevents any contents drawing into surfaces from being allocated. 13392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) hostImpl->SetManagedMemoryPolicy(ManagedMemoryPolicy(100 * 100 * 4 * 2)); 13402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 13412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 1: 13422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(renderer->HaveCachedResourcesForRenderPassId(surface1RenderPassId)); 13432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(renderer->HaveCachedResourcesForRenderPassId(surface2RenderPassId)); 13442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 13462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 13472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE 13512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 13522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2, m_rootLayer->paintContentsCount()); 13532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2, m_surfaceLayer1->paintContentsCount()); 13542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2, m_surfaceLayer2->paintContentsCount()); 13552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Clear layer references so LayerTreeHost dies. 13572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_rootLayer = NULL; 13582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_surfaceLayer1 = NULL; 13592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_replicaLayer1 = NULL; 13602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_surfaceLayer2 = NULL; 13612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_replicaLayer2 = NULL; 13622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private: 13652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerClient m_fakeDelegate; 13662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<ContentLayerWithUpdateTracking> m_rootLayer; 13672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<ContentLayerWithUpdateTracking> m_surfaceLayer1; 13682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<ContentLayerWithUpdateTracking> m_replicaLayer1; 13692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<ContentLayerWithUpdateTracking> m_surfaceLayer2; 13702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<ContentLayerWithUpdateTracking> m_replicaLayer2; 13712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 13722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestSurfaceNotAllocatedForLayersOutsideMemoryLimit) 13742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class EvictionTestLayer : public Layer { 13762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 13772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static scoped_refptr<EvictionTestLayer> Create() { return make_scoped_refptr(new EvictionTestLayer()); } 13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Update(ResourceUpdateQueue*, const OcclusionTracker*, RenderingStats*) OVERRIDE; 13802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool DrawsContent() const OVERRIDE { return true; } 13812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_ptr<LayerImpl> CreateLayerImpl(LayerTreeImpl* treeImpl) OVERRIDE; 13832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void PushPropertiesTo(LayerImpl*) OVERRIDE; 13842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetTexturePriorities(const PriorityCalculator&) OVERRIDE; 13852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool haveBackingTexture() const { return m_texture.get() ? m_texture->have_backing_texture() : false; } 13872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private: 13892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EvictionTestLayer() : Layer() { } 13902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~EvictionTestLayer() { } 13912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void createTextureIfNeeded() 13932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 13942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (m_texture.get()) 13952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 13962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_texture = PrioritizedResource::Create(layer_tree_host()->contents_texture_manager()); 13972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_texture->SetDimensions(gfx::Size(10, 10), GL_RGBA); 13982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_bitmap.setConfig(SkBitmap::kARGB_8888_Config, 10, 10); 13992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<PrioritizedResource> m_texture; 14022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkBitmap m_bitmap; 14032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 14042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class EvictionTestLayerImpl : public LayerImpl { 14062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 14072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static scoped_ptr<EvictionTestLayerImpl> Create(LayerTreeImpl* treeImpl, int id) 14082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 14092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return make_scoped_ptr(new EvictionTestLayerImpl(treeImpl, id)); 14102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~EvictionTestLayerImpl() { } 14122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AppendQuads(QuadSink* quad_sink, 14142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AppendQuadsData* append_quads_data) OVERRIDE 14152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 14162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(m_hasTexture); 14172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_NE(0u, layer_tree_impl()->resource_provider()->num_resources()); 14182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void setHasTexture(bool hasTexture) { m_hasTexture = hasTexture; } 14212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private: 14232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EvictionTestLayerImpl(LayerTreeImpl* treeImpl, int id) 14242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : LayerImpl(treeImpl, id) 14252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) , m_hasTexture(false) { } 14262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool m_hasTexture; 14282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 14292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void EvictionTestLayer::SetTexturePriorities(const PriorityCalculator&) 14312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 14322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) createTextureIfNeeded(); 14332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!m_texture.get()) 14342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 14352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_texture->set_request_priority(PriorityCalculator::UIPriority(true)); 14362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void EvictionTestLayer::Update(ResourceUpdateQueue* queue, const OcclusionTracker*, RenderingStats*) 14392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 14402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) createTextureIfNeeded(); 14412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!m_texture.get()) 14422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 14432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect fullRect(0, 0, 10, 10); 14452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResourceUpdate upload = ResourceUpdate::Create( 14462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_texture.get(), &m_bitmap, fullRect, fullRect, gfx::Vector2d()); 14472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) queue->AppendFullUpload(upload); 14482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<LayerImpl> EvictionTestLayer::CreateLayerImpl(LayerTreeImpl* treeImpl) 14512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 14522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return EvictionTestLayerImpl::Create(treeImpl, layer_id_).PassAs<LayerImpl>(); 14532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void EvictionTestLayer::PushPropertiesTo(LayerImpl* layerImpl) 14562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 14572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Layer::PushPropertiesTo(layerImpl); 14582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EvictionTestLayerImpl* testLayerImpl = static_cast<EvictionTestLayerImpl*>(layerImpl); 14602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) testLayerImpl->setHasTexture(m_texture->have_backing_texture()); 14612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestEvictTextures : public LayerTreeHostTest { 14642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 14652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostTestEvictTextures() 14662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : m_layer(EvictionTestLayer::Create()) 14672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) , m_implForEvictTextures(0) 14682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) , m_numCommits(0) 14692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 14702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE 14732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 14742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetRootLayer(m_layer); 14752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(10, 20), gfx::Size(10, 20)); 14762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform identityMatrix; 14782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) setLayerPropertiesForTesting(m_layer.get(), 0, identityMatrix, gfx::PointF(0, 0), gfx::PointF(0, 0), gfx::Size(10, 20), true); 14792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 14812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void postEvictTextures() 14842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 14852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(ImplThread()); 14862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ImplThread()->PostTask(base::Bind(&LayerTreeHostTestEvictTextures::evictTexturesOnImplThread, 14872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Unretained(this))); 14882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void evictTexturesOnImplThread() 14912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 14922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(m_implForEvictTextures); 14932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_implForEvictTextures->EnforceManagedMemoryPolicy(ManagedMemoryPolicy(0)); 14942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Commit 1: Just commit and draw normally, then post an eviction at the end 14972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // that will trigger a commit. 14982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Commit 2: Triggered by the eviction, let it go through and then set 14992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // needsCommit. 15002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Commit 3: Triggered by the setNeedsCommit. In Layout(), post an eviction 15012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // task, which will be handled before the commit. Don't set needsCommit, it 15022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // should have been posted. A frame should not be drawn (note, 15032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // didCommitAndDrawFrame may be called anyway). 15042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Commit 4: Triggered by the eviction, let it go through and then set 15052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // needsCommit. 15062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Commit 5: Triggered by the setNeedsCommit, post an eviction task in 15072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Layout(), a frame should not be drawn but a commit will be posted. 15082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Commit 6: Triggered by the eviction, post an eviction task in 15092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Layout(), which will be a noop, letting the commit (which recreates the 15102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // textures) go through and draw a frame, then end the test. 15112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 15122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Commits 1+2 test the eviction recovery path where eviction happens outside 15132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // of the beginFrame/commit pair. 15142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Commits 3+4 test the eviction recovery path where eviction happens inside 15152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the beginFrame/commit pair. 15162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Commits 5+6 test the path where an eviction happens during the eviction 15172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // recovery path. 15182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE 15192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 15202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (m_numCommits) { 15212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 1: 15222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(m_layer->haveBackingTexture()); 15232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) postEvictTextures(); 15242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 15252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 2: 15262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(m_layer->haveBackingTexture()); 15272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 15282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 15292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 3: 15302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 15312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 4: 15322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(m_layer->haveBackingTexture()); 15332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetNeedsCommit(); 15342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 15352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 5: 15362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 15372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 6: 15382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(m_layer->haveBackingTexture()); 15392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 15402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 15412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 15422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 15432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 15442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE 15482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 15492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_implForEvictTextures = impl; 15502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Layout() OVERRIDE 15532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 15542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++m_numCommits; 15552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (m_numCommits) { 15562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 1: 15572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 2: 15582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 15592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 3: 15602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) postEvictTextures(); 15612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 15622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 4: 15632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We couldn't check in didCommitAndDrawFrame on commit 3, so check here. 15642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(m_layer->haveBackingTexture()); 15652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 15662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 5: 15672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) postEvictTextures(); 15682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 15692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 6: 15702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We couldn't check in didCommitAndDrawFrame on commit 5, so check here. 15712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(m_layer->haveBackingTexture()); 15722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) postEvictTextures(); 15732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 15742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 15752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 15762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 15772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE 15812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 15822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private: 15852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerClient client_; 15862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<EvictionTestLayer> m_layer; 15872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostImpl* m_implForEvictTextures; 15882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int m_numCommits; 15892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 15902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestEvictTextures) 15922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestContinuousCommit : public LayerTreeHostTest { 15942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 15952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostTestContinuousCommit() 15962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : m_numCommitComplete(0) 15972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) , m_numDrawLayers(0) 15982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 15992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE 16022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 16032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(10, 10), gfx::Size(10, 10)); 16042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->root_layer()->SetBounds(gfx::Size(10, 10)); 16052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 16072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommit() OVERRIDE 16102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 16112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (m_numDrawLayers == 2) 16122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 16132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 16142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl*) OVERRIDE 16172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 16182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (m_numDrawLayers == 1) 16192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_numCommitComplete++; 16202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE 16232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 16242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_numDrawLayers++; 16252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (m_numDrawLayers == 2) 16262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 16272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE 16302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 16312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check that we didn't commit twice between first and second draw. 16322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, m_numCommitComplete); 16332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private: 16362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int m_numCommitComplete; 16372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int m_numDrawLayers; 16382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 16392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestContinuousCommit) 16412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestContinuousInvalidate : public LayerTreeHostTest { 16432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 16442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostTestContinuousInvalidate() 16452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : m_numCommitComplete(0) 16462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) , m_numDrawLayers(0) 16472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 16482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE 16512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 16522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(10, 10), gfx::Size(10, 10)); 16532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->root_layer()->SetBounds(gfx::Size(10, 10)); 16542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_contentLayer = ContentLayer::Create(&m_fakeDelegate); 16562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_contentLayer->SetBounds(gfx::Size(10, 10)); 16572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_contentLayer->SetPosition(gfx::PointF(0, 0)); 16582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_contentLayer->SetAnchorPoint(gfx::PointF(0, 0)); 16592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_contentLayer->SetIsDrawable(true); 16602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->root_layer()->AddChild(m_contentLayer); 16612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 16632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommit() OVERRIDE 16662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 16672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (m_numDrawLayers == 2) 16682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 16692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_contentLayer->SetNeedsDisplay(); 16702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl*) OVERRIDE 16732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 16742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (m_numDrawLayers == 1) 16752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_numCommitComplete++; 16762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE 16792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 16802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_numDrawLayers++; 16812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (m_numDrawLayers == 2) 16822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 16832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE 16862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 16872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check that we didn't commit twice between first and second draw. 16882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, m_numCommitComplete); 16892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Clear layer references so LayerTreeHost dies. 16912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_contentLayer = NULL; 16922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 16942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private: 16952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerClient m_fakeDelegate; 16962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<Layer> m_contentLayer; 16972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int m_numCommitComplete; 16982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int m_numDrawLayers; 16992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 17002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestContinuousInvalidate) 17022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestDeferCommits : public LayerTreeHostTest { 17042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 17052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostTestDeferCommits() 17062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : m_numCommitsDeferred(0) 17072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) , m_numCompleteCommits(0) 17082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 17092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 17102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE 17122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 17132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 17142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 17152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidDeferCommit() OVERRIDE 17172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 17182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_numCommitsDeferred++; 17192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetDeferCommits(false); 17202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 17212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommit() OVERRIDE 17232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 17242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_numCompleteCommits++; 17252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (m_numCompleteCommits) { 17262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 1: 17272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, m_numCommitsDeferred); 17282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetDeferCommits(true); 17292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 17302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 17312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 2: 17322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 17332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 17342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 17352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 17362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 17372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 17382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 17392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE 17412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 17422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, m_numCommitsDeferred); 17432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2, m_numCompleteCommits); 17442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 17452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private: 17472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int m_numCommitsDeferred; 17482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int m_numCompleteCommits; 17492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 17502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestDeferCommits) 17522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostWithProxy : public LayerTreeHost { 17542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 17552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostWithProxy(FakeLayerTreeHostClient* client, const LayerTreeSettings& settings, scoped_ptr<Proxy> proxy) 17562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : LayerTreeHost(client, settings) 17572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 17582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(InitializeForTesting(proxy.Pass())); 17592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 17602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 17612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(LayerTreeHostTest, LimitPartialUpdates) 17632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 17642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // When partial updates are not allowed, max updates should be 0. 17652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 17662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_3D); 17672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<FakeProxy> proxy = make_scoped_ptr(new FakeProxy(scoped_ptr<Thread>())); 17692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) proxy->GetRendererCapabilities().allow_partial_texture_updates = false; 17702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) proxy->SetMaxPartialTextureUpdates(5); 17712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeSettings settings; 17732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings.max_partial_texture_updates = 10; 17742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostWithProxy host(&client, settings, proxy.PassAs<Proxy>()); 17762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(host.InitializeRendererIfNeeded()); 17772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, host.settings().max_partial_texture_updates); 17792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 17802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // When partial updates are allowed, max updates should be limited by the proxy. 17822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 17832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_3D); 17842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<FakeProxy> proxy = make_scoped_ptr(new FakeProxy(scoped_ptr<Thread>())); 17862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) proxy->GetRendererCapabilities().allow_partial_texture_updates = true; 17872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) proxy->SetMaxPartialTextureUpdates(5); 17882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeSettings settings; 17902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings.max_partial_texture_updates = 10; 17912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostWithProxy host(&client, settings, proxy.PassAs<Proxy>()); 17932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(host.InitializeRendererIfNeeded()); 17942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(5u, host.settings().max_partial_texture_updates); 17962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 17972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 17982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // When partial updates are allowed, max updates should also be limited by the settings. 17992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 18002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_3D); 18012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<FakeProxy> proxy = make_scoped_ptr(new FakeProxy(scoped_ptr<Thread>())); 18032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) proxy->GetRendererCapabilities().allow_partial_texture_updates = true; 18042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) proxy->SetMaxPartialTextureUpdates(20); 18052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeSettings settings; 18072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings.max_partial_texture_updates = 10; 18082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostWithProxy host(&client, settings, proxy.PassAs<Proxy>()); 18102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(host.InitializeRendererIfNeeded()); 18112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(10u, host.settings().max_partial_texture_updates); 18132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 18142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 18152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(LayerTreeHostTest, PartialUpdatesWithGLRenderer) 18172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 18182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_3D); 18192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeSettings settings; 18212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings.max_partial_texture_updates = 4; 18222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<LayerTreeHost> host = LayerTreeHost::Create(&client, settings, scoped_ptr<Thread>()); 18242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(host->InitializeRendererIfNeeded()); 18252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(4u, host->settings().max_partial_texture_updates); 18262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 18272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(LayerTreeHostTest, PartialUpdatesWithSoftwareRenderer) 18292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 18302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DIRECT_SOFTWARE); 18312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeSettings settings; 18332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings.max_partial_texture_updates = 4; 18342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<LayerTreeHost> host = LayerTreeHost::Create(&client, settings, scoped_ptr<Thread>()); 18362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(host->InitializeRendererIfNeeded()); 18372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(4u, host->settings().max_partial_texture_updates); 18382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 18392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(LayerTreeHostTest, PartialUpdatesWithDelegatingRendererAndGLContent) 18412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 18422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DELEGATED_3D); 18432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeSettings settings; 18452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings.max_partial_texture_updates = 4; 18462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<LayerTreeHost> host = LayerTreeHost::Create(&client, settings, scoped_ptr<Thread>()); 18482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(host->InitializeRendererIfNeeded()); 18492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, host->settings().max_partial_texture_updates); 18502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 18512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(LayerTreeHostTest, PartialUpdatesWithDelegatingRendererAndSoftwareContent) 18532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 18542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeLayerTreeHostClient client(FakeLayerTreeHostClient::DELEGATED_SOFTWARE); 18552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeSettings settings; 18572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings.max_partial_texture_updates = 4; 18582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<LayerTreeHost> host = LayerTreeHost::Create(&client, settings, scoped_ptr<Thread>()); 18602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(host->InitializeRendererIfNeeded()); 18612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, host->settings().max_partial_texture_updates); 18622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 18632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestCapturePicture : public LayerTreeHostTest { 18652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 18662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostTestCapturePicture() 18672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : bounds_(gfx::Size(100, 100)) 18682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) , m_layer(PictureLayer::Create(&m_contentClient)) 18692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 18702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 18712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE 18732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 18742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings->impl_side_painting = true; 18752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 18762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) class FillRectContentLayerClient : public ContentLayerClient { 18782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 18792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void PaintContents(SkCanvas* canvas, gfx::Rect clip, gfx::RectF* opaque) OVERRIDE 18802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 18812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkPaint paint; 18822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) paint.setColor(SK_ColorGREEN); 18832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkRect rect = SkRect::MakeWH(canvas->getDeviceSize().width(), canvas->getDeviceSize().height()); 18852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *opaque = gfx::RectF(rect.width(), rect.height()); 18862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas->drawRect(rect, paint); 18872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 18882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidChangeLayerCanUseLCDText() OVERRIDE {} 18892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 18902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE 18922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 18932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_layer->SetIsDrawable(true); 18942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_layer->SetBounds(bounds_); 18952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetViewportSize(bounds_, bounds_); 18962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetRootLayer(m_layer); 18972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(layer_tree_host()->InitializeRendererIfNeeded()); 18992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 19002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 19012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE 19032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 19042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_picture = layer_tree_host()->CapturePicture(); 19052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 19062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 19072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE 19092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 19102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(bounds_, gfx::Size(m_picture->width(), m_picture->height())); 19112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkBitmap bitmap; 19132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bitmap.setConfig(SkBitmap::kARGB_8888_Config, bounds_.width(), bounds_.height()); 19142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bitmap.allocPixels(); 19152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bitmap.eraseARGB(0, 0, 0, 0); 19162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkCanvas canvas(bitmap); 19172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_picture->draw(&canvas); 19192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bitmap.lockPixels(); 19212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkColor* pixels = reinterpret_cast<SkColor*>(bitmap.getPixels()); 19222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(SK_ColorGREEN, pixels[0]); 19232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bitmap.unlockPixels(); 19242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 19252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private: 19272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size bounds_; 19282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FillRectContentLayerClient m_contentClient; 19292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<PictureLayer> m_layer; 19302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) skia::RefPtr<SkPicture> m_picture; 19312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 19322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MULTI_THREAD_TEST_F(LayerTreeHostTestCapturePicture); 19342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestMaxPendingFrames : public LayerTreeHostTest { 19362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 19372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostTestMaxPendingFrames() 19382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : LayerTreeHostTest() 19392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 19402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 19412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_ptr<OutputSurface> CreateOutputSurface() OVERRIDE 19432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 19442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (m_delegatingRenderer) 19452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return FakeOutputSurface::CreateDelegating3d().PassAs<OutputSurface>(); 19462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return FakeOutputSurface::Create3d().PassAs<OutputSurface>(); 19472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 19482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE 19502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 19512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 19522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 19532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* hostImpl) OVERRIDE 19552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 19562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(hostImpl->proxy()->HasImplThread()); 19572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ThreadProxy* proxy = static_cast<ThreadProxy*>(hostImpl->proxy()); 19592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (m_delegatingRenderer) 19602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, proxy->MaxFramesPendingForTesting()); 19612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 19622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(FrameRateController::DEFAULT_MAX_FRAMES_PENDING, proxy->MaxFramesPendingForTesting()); 19632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 19642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 19652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE 19672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 19682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 19692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)protected: 19712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool m_delegatingRenderer; 19722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 19732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostTestMaxPendingFrames, DelegatingRenderer) 19752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 19762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_delegatingRenderer = true; 19772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunTest(true); 19782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 19792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(LayerTreeHostTestMaxPendingFrames, GLRenderer) 19812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 19822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_delegatingRenderer = false; 19832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunTest(true); 19842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 19852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestShutdownWithOnlySomeResourcesEvicted : public LayerTreeHostTest { 19872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 19882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostTestShutdownWithOnlySomeResourcesEvicted() 19892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : m_rootLayer(FakeContentLayer::Create(&client_)) 19902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) , m_childLayer1(FakeContentLayer::Create(&client_)) 19912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) , m_childLayer2(FakeContentLayer::Create(&client_)) 19922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) , m_numCommits(0) 19932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 19942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 19952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE 19972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 19982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(100, 100), gfx::Size(100, 100)); 19992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_rootLayer->SetBounds(gfx::Size(100, 100)); 20002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_childLayer1->SetBounds(gfx::Size(100, 100)); 20012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_childLayer2->SetBounds(gfx::Size(100, 100)); 20022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_rootLayer->AddChild(m_childLayer1); 20032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_rootLayer->AddChild(m_childLayer2); 20042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetRootLayer(m_rootLayer); 20052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 20062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 20072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidSetVisibleOnImplTree(LayerTreeHostImpl* hostImpl, bool visible) OVERRIDE 20092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 20102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // One backing should remain unevicted. 20112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ( 20122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 100 * 100 * 4 * 1, 20132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->contents_texture_manager()->MemoryUseBytes()); 20142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Make sure that contents textures are marked as having been 20152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // purged. 20162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(hostImpl->active_tree()->ContentsTexturesPurged()); 20172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // End the test in this state. 20182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 20192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 20202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void CommitCompleteOnThread(LayerTreeHostImpl* hostImpl) OVERRIDE 20222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 20232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++m_numCommits; 20242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch(m_numCommits) { 20252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 1: 20262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // All three backings should have memory. 20272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ( 20282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 100 * 100 * 4 * 3, 20292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->contents_texture_manager()->MemoryUseBytes()); 20302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Set a new policy that will kick out 1 of the 3 resources. 20312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Because a resource was evicted, a commit will be kicked off. 20322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) hostImpl->SetManagedMemoryPolicy(ManagedMemoryPolicy( 20332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 100 * 100 * 4 * 2, 20342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ManagedMemoryPolicy::CUTOFF_ALLOW_EVERYTHING, 20352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 100 * 100 * 4 * 1, 20362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ManagedMemoryPolicy::CUTOFF_ALLOW_EVERYTHING)); 20372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 20382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 2: 20392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Only two backings should have memory. 20402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ( 20412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 100 * 100 * 4 * 2, 20422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->contents_texture_manager()->MemoryUseBytes()); 20432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Become backgrounded, which will cause 1 more resource to be 20442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // evicted. 20452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetVisibleToMainThread(false); 20462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 20472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 20482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No further commits should happen because this is not visible 20492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // anymore. 20502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 20512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 20522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 20532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 20542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE 20562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 20572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 20582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private: 20602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerClient client_; 20612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<FakeContentLayer> m_rootLayer; 20622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<FakeContentLayer> m_childLayer1; 20632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<FakeContentLayer> m_childLayer2; 20642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int m_numCommits; 20652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 20662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestShutdownWithOnlySomeResourcesEvicted) 20682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestPinchZoomScrollbarCreation : public LayerTreeHostTest { 20702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 20712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostTestPinchZoomScrollbarCreation() 20722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : m_rootLayer(ContentLayer::Create(&client_)) 20732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 20742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 20752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE 20772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 20782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings->use_pinch_zoom_scrollbars = true; 20792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 20802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE 20822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 20832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_rootLayer->SetIsDrawable(true); 20842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_rootLayer->SetBounds(gfx::Size(100, 100)); 20852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetRootLayer(m_rootLayer); 20862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 20872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 20882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommit() OVERRIDE 20902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 20912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We always expect two pinch-zoom scrollbar layers. 20922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(2 == m_rootLayer->children().size()); 20932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Pinch-zoom scrollbar layers always have invalid scrollLayerIds. 20952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScrollbarLayer* layer1 = m_rootLayer->children()[0]->ToScrollbarLayer(); 20962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(layer1); 20972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(Layer::PINCH_ZOOM_ROOT_SCROLL_LAYER_ID, layer1->scroll_layer_id()); 20982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, layer1->opacity()); 20992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(layer1->OpacityCanAnimateOnImplThread()); 21002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(layer1->DrawsContent()); 21012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScrollbarLayer* layer2 = m_rootLayer->children()[1]->ToScrollbarLayer(); 21032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(layer2); 21042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(Layer::PINCH_ZOOM_ROOT_SCROLL_LAYER_ID, layer2->scroll_layer_id()); 21052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, layer2->opacity()); 21062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(layer2->OpacityCanAnimateOnImplThread()); 21072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(layer2->DrawsContent()); 21082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 21102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 21112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE 21132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 21142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 21152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private: 21172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerClient client_; 21182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<ContentLayer> m_rootLayer; 21192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 21202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestPinchZoomScrollbarCreation) 21222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestPinchZoomScrollbarResize : public LayerTreeHostTest { 21242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 21252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostTestPinchZoomScrollbarResize() 21262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : m_rootLayer(ContentLayer::Create(&client_)) 21272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) , m_numCommits(0) 21282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 21292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 21302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE 21322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 21332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings->use_pinch_zoom_scrollbars = true; 21342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 21352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE 21372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 21382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_rootLayer->SetIsDrawable(true); 21392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_rootLayer->SetBounds(gfx::Size(100, 100)); 21402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetRootLayer(m_rootLayer); 21412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(100, 100), 21422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size(100, 100)); 21432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 21442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 21452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommit() OVERRIDE 21472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 21482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_numCommits++; 21492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScrollbarLayer* layer1 = m_rootLayer->children()[0]->ToScrollbarLayer(); 21512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(layer1); 21522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScrollbarLayer* layer2 = m_rootLayer->children()[1]->ToScrollbarLayer(); 21532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(layer2); 21542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Get scrollbar thickness from horizontal scrollbar's height. 21562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int thickness = layer1->bounds().height(); 21572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!layer1->Orientation() == WebKit::WebScrollbar::Horizontal) 21592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::swap(layer1, layer2); 21602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size viewportSize = layer_tree_host()->layout_viewport_size(); 21622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(viewportSize.width() - thickness, layer1->bounds().width()); 21632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(viewportSize.height() - thickness, layer2->bounds().height()); 21642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (m_numCommits) { 21662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 1: 21672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Resizing the viewport should also resize the pinch-zoom scrollbars. 21682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetViewportSize(gfx::Size(120, 150), 21692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size(120, 150)); 21702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 21712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 21722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 21732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 21742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 21752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE 21772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 21782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 21792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private: 21812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerClient client_; 21822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<ContentLayer> m_rootLayer; 21832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int m_numCommits; 21842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 21852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestPinchZoomScrollbarResize) 21872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestPinchZoomScrollbarNewRootLayer : public LayerTreeHostTest { 21892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 21902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostTestPinchZoomScrollbarNewRootLayer() 21912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : m_rootLayer(ContentLayer::Create(&client_)) 21922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) , m_numCommits(0) 21932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 21942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 21952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 21962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE 21972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 21982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings->use_pinch_zoom_scrollbars = true; 21992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 22002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE 22022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 22032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_rootLayer->SetIsDrawable(true); 22042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_rootLayer->SetBounds(gfx::Size(100, 100)); 22052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetRootLayer(m_rootLayer); 22062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 22072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 22082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommit() OVERRIDE 22102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 22112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_numCommits++; 22122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We always expect two pinch-zoom scrollbar layers. 22142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(2 == m_rootLayer->children().size()); 22152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Pinch-zoom scrollbar layers always have invalid scrollLayerIds. 22172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScrollbarLayer* layer1 = m_rootLayer->children()[0]->ToScrollbarLayer(); 22182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(layer1); 22192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(Layer::PINCH_ZOOM_ROOT_SCROLL_LAYER_ID, layer1->scroll_layer_id()); 22202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, layer1->opacity()); 22212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(layer1->DrawsContent()); 22222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScrollbarLayer* layer2 = m_rootLayer->children()[1]->ToScrollbarLayer(); 22242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(layer2); 22252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(Layer::PINCH_ZOOM_ROOT_SCROLL_LAYER_ID, layer2->scroll_layer_id()); 22262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, layer2->opacity()); 22272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(layer2->DrawsContent()); 22282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (m_numCommits == 1) { 22302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Create a new root layer and attach to tree to verify the pinch 22312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // zoom scrollbars get correctly re-attached. 22322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_rootLayer = ContentLayer::Create(&client_); 22332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_rootLayer->SetIsDrawable(true); 22342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) m_rootLayer->SetBounds(gfx::Size(100, 100)); 22352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetRootLayer(m_rootLayer); 22362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 22372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else 22382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 22392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 22402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE 22422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 22432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 22442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private: 22462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeContentLayerClient client_; 22472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<ContentLayer> m_rootLayer; 22482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int m_numCommits; 22492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 22502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestPinchZoomScrollbarNewRootLayer) 22522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHostTestLCDNotification : public LayerTreeHostTest { 22542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 22552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) class NotificationClient : public ContentLayerClient { 22562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 22572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NotificationClient() 22582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : layer_(0) 22592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) , paint_count_(0) 22602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) , lcd_notification_count_(0) 22612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 22622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 22632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void set_layer(Layer* layer) { layer_ = layer; } 22652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int paint_count() const { return paint_count_; } 22662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int lcd_notification_count() const { return lcd_notification_count_; } 22672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void PaintContents(SkCanvas* canvas, 22692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect clip, 22702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::RectF* opaque) OVERRIDE 22712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 22722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++paint_count_; 22732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 22742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidChangeLayerCanUseLCDText() OVERRIDE 22752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 22762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++lcd_notification_count_; 22772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_->SetNeedsDisplay(); 22782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 22792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 22812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Layer* layer_; 22822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int paint_count_; 22832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int lcd_notification_count_; 22842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 22852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetupTree() OVERRIDE 22872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 22882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<ContentLayer> root_layer = ContentLayer::Create(&client_); 22892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_layer->SetIsDrawable(true); 22902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_layer->SetBounds(gfx::Size(1, 1)); 22912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetRootLayer(root_layer); 22932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_.set_layer(root_layer.get()); 22942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The expecations are based on the assumption that the default 22962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // LCD settings are: 22972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(layer_tree_host()->settings().can_use_lcd_text); 22982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(root_layer->can_use_lcd_text()); 22992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerTreeHostTest::SetupTree(); 23012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 23022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE 23042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 23052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 23062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 23072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE { } 23082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommit() OVERRIDE 23102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 23112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (layer_tree_host()->commit_number()) { 23122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 1: 23132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The first update consists one LCD notification and one paint. 23142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, client_.lcd_notification_count()); 23152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, client_.paint_count()); 23162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // LCD text must have been enabled on the layer. 23172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(layer_tree_host()->root_layer()->can_use_lcd_text()); 23182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 23192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 23202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case 2: 23212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Since nothing changed on layer, there should be no notification 23222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // or paint on the second update. 23232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, client_.lcd_notification_count()); 23242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, client_.paint_count()); 23252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // LCD text must not have changed. 23262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(layer_tree_host()->root_layer()->can_use_lcd_text()); 23272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Change layer opacity that should trigger lcd notification. 23282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->root_layer()->SetOpacity(0.5); 23292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No need to request a commit - setting opacity will do it. 23302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 23312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 23322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Verify that there is not extra commit due to layer invalidation. 23332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(3, layer_tree_host()->commit_number()); 23342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // LCD notification count should have incremented due to 23352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // change in layer opacity. 23362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2, client_.lcd_notification_count()); 23372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Paint count should be incremented due to invalidation. 23382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2, client_.paint_count()); 23392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // LCD text must have been disabled on the layer due to opacity. 23402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(layer_tree_host()->root_layer()->can_use_lcd_text()); 23412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 23422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 23432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 23442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 23452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private: 23472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NotificationClient client_; 23482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 23492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SINGLE_THREAD_TEST_F(LayerTreeHostTestLCDNotification) 23512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 23532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 2354