OLD | NEW |
1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "cc/layer_tree_host.h" | 5 #include "cc/layer_tree_host.h" |
6 | 6 |
7 #include "base/synchronization/lock.h" | 7 #include "base/synchronization/lock.h" |
8 #include "cc/content_layer.h" | 8 #include "cc/content_layer.h" |
9 #include "cc/content_layer_client.h" | 9 #include "cc/content_layer_client.h" |
10 #include "cc/layer_impl.h" | 10 #include "cc/layer_impl.h" |
(...skipping 991 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1002 m_settings.maxPartialTextureUpdates = 0; | 1002 m_settings.maxPartialTextureUpdates = 0; |
1003 // Linear fade animator prevents scrollbars from drawing immediately. | 1003 // Linear fade animator prevents scrollbars from drawing immediately. |
1004 m_settings.useLinearFadeScrollbarAnimator = false; | 1004 m_settings.useLinearFadeScrollbarAnimator = false; |
1005 } | 1005 } |
1006 | 1006 |
1007 virtual void setupTree() OVERRIDE | 1007 virtual void setupTree() OVERRIDE |
1008 { | 1008 { |
1009 m_layer = FakeContentLayer::Create(&m_client); | 1009 m_layer = FakeContentLayer::Create(&m_client); |
1010 m_layer->setBounds(gfx::Size(10, 20)); | 1010 m_layer->setBounds(gfx::Size(10, 20)); |
1011 | 1011 |
1012 m_scrollbar = FakeScrollbarLayer::Create(true, m_layer->id()); | 1012 bool paint_scrollbar = true; |
| 1013 bool has_thumb = false; |
| 1014 m_scrollbar = FakeScrollbarLayer::Create( |
| 1015 paint_scrollbar, has_thumb, m_layer->id()); |
1013 m_scrollbar->setPosition(gfx::Point(0, 10)); | 1016 m_scrollbar->setPosition(gfx::Point(0, 10)); |
1014 m_scrollbar->setBounds(gfx::Size(10, 10)); | 1017 m_scrollbar->setBounds(gfx::Size(10, 10)); |
1015 | 1018 |
1016 m_layer->addChild(m_scrollbar); | 1019 m_layer->addChild(m_scrollbar); |
1017 | 1020 |
1018 m_layerTreeHost->setRootLayer(m_layer); | 1021 m_layerTreeHost->setRootLayer(m_layer); |
1019 LayerTreeHostTest::setupTree(); | 1022 LayerTreeHostTest::setupTree(); |
1020 } | 1023 } |
1021 | 1024 |
1022 virtual void beginTest() OVERRIDE | 1025 virtual void beginTest() OVERRIDE |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1123 | 1126 |
1124 virtual void setupTree() OVERRIDE | 1127 virtual void setupTree() OVERRIDE |
1125 { | 1128 { |
1126 m_parent = FakeContentLayer::Create(&m_client); | 1129 m_parent = FakeContentLayer::Create(&m_client); |
1127 m_parent->setBounds(gfx::Size(10, 20)); | 1130 m_parent->setBounds(gfx::Size(10, 20)); |
1128 | 1131 |
1129 m_child = FakeContentLayer::Create(&m_client); | 1132 m_child = FakeContentLayer::Create(&m_client); |
1130 m_child->setPosition(gfx::Point(0, 10)); | 1133 m_child->setPosition(gfx::Point(0, 10)); |
1131 m_child->setBounds(gfx::Size(3, 10)); | 1134 m_child->setBounds(gfx::Size(3, 10)); |
1132 | 1135 |
1133 m_scrollbarWithPaints = | 1136 bool paint_scrollbar = true; |
1134 FakeScrollbarLayer::Create(true, m_parent->id()); | 1137 bool has_thumb = false; |
| 1138 m_scrollbarWithPaints = FakeScrollbarLayer::Create( |
| 1139 paint_scrollbar, has_thumb, m_parent->id()); |
1135 m_scrollbarWithPaints->setPosition(gfx::Point(3, 10)); | 1140 m_scrollbarWithPaints->setPosition(gfx::Point(3, 10)); |
1136 m_scrollbarWithPaints->setBounds(gfx::Size(3, 10)); | 1141 m_scrollbarWithPaints->setBounds(gfx::Size(3, 10)); |
1137 | 1142 |
1138 m_scrollbarWithoutPaints = | 1143 paint_scrollbar = false; |
1139 FakeScrollbarLayer::Create(false, m_parent->id()); | 1144 m_scrollbarWithoutPaints = FakeScrollbarLayer::Create( |
| 1145 paint_scrollbar, has_thumb, m_parent->id()); |
1140 m_scrollbarWithoutPaints->setPosition(gfx::Point(6, 10)); | 1146 m_scrollbarWithoutPaints->setPosition(gfx::Point(6, 10)); |
1141 m_scrollbarWithoutPaints->setBounds(gfx::Size(3, 10)); | 1147 m_scrollbarWithoutPaints->setBounds(gfx::Size(3, 10)); |
1142 | 1148 |
1143 m_parent->addChild(m_child); | 1149 m_parent->addChild(m_child); |
1144 m_parent->addChild(m_scrollbarWithPaints); | 1150 m_parent->addChild(m_scrollbarWithPaints); |
1145 m_parent->addChild(m_scrollbarWithoutPaints); | 1151 m_parent->addChild(m_scrollbarWithoutPaints); |
1146 | 1152 |
1147 m_layerTreeHost->setRootLayer(m_parent); | 1153 m_layerTreeHost->setRootLayer(m_parent); |
1148 LayerTreeHostTest::setupTree(); | 1154 LayerTreeHostTest::setupTree(); |
1149 } | 1155 } |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1299 scoped_refptr<FakeScrollbarLayer> m_scrollbarWithPaints; | 1305 scoped_refptr<FakeScrollbarLayer> m_scrollbarWithPaints; |
1300 scoped_refptr<FakeScrollbarLayer> m_scrollbarWithoutPaints; | 1306 scoped_refptr<FakeScrollbarLayer> m_scrollbarWithoutPaints; |
1301 int m_numCommits; | 1307 int m_numCommits; |
1302 }; | 1308 }; |
1303 | 1309 |
1304 TEST_F(LayerTreeHostTestAtomicCommitWithPartialUpdate, runMultiThread) | 1310 TEST_F(LayerTreeHostTestAtomicCommitWithPartialUpdate, runMultiThread) |
1305 { | 1311 { |
1306 runTest(true); | 1312 runTest(true); |
1307 } | 1313 } |
1308 | 1314 |
1309 // A loseOutputSurface(1) should lead to a didRecreateOutputSurface(true) | |
1310 class LayerTreeHostTestSetSingleLostContext : public LayerTreeHostTest { | |
1311 public: | |
1312 LayerTreeHostTestSetSingleLostContext() | |
1313 { | |
1314 } | |
1315 | |
1316 virtual void beginTest() OVERRIDE | |
1317 { | |
1318 postSetNeedsCommitToMainThread(); | |
1319 } | |
1320 | |
1321 virtual void didCommitAndDrawFrame() OVERRIDE | |
1322 { | |
1323 m_layerTreeHost->loseOutputSurface(1); | |
1324 } | |
1325 | |
1326 virtual void didRecreateOutputSurface(bool succeeded) OVERRIDE | |
1327 { | |
1328 EXPECT_TRUE(succeeded); | |
1329 endTest(); | |
1330 } | |
1331 | |
1332 virtual void afterTest() OVERRIDE | |
1333 { | |
1334 } | |
1335 }; | |
1336 | |
1337 TEST_F(LayerTreeHostTestSetSingleLostContext, runMultiThread) | |
1338 { | |
1339 runTest(true); | |
1340 } | |
1341 | |
1342 // A loseOutputSurface(10) should lead to a didRecreateOutputSurface(false), and | |
1343 // a finishAllRendering() should not hang. | |
1344 class LayerTreeHostTestSetRepeatedLostContext : public LayerTreeHostTest { | |
1345 public: | |
1346 LayerTreeHostTestSetRepeatedLostContext() | |
1347 { | |
1348 } | |
1349 | |
1350 virtual void beginTest() OVERRIDE | |
1351 { | |
1352 postSetNeedsCommitToMainThread(); | |
1353 } | |
1354 | |
1355 virtual void didCommitAndDrawFrame() OVERRIDE | |
1356 { | |
1357 m_layerTreeHost->loseOutputSurface(10); | |
1358 } | |
1359 | |
1360 virtual void didRecreateOutputSurface(bool succeeded) OVERRIDE | |
1361 { | |
1362 EXPECT_FALSE(succeeded); | |
1363 m_layerTreeHost->finishAllRendering(); | |
1364 endTest(); | |
1365 } | |
1366 | |
1367 virtual void afterTest() OVERRIDE | |
1368 { | |
1369 } | |
1370 }; | |
1371 | |
1372 TEST_F(LayerTreeHostTestSetRepeatedLostContext, runMultiThread) | |
1373 { | |
1374 runTest(true); | |
1375 } | |
1376 | |
1377 class LayerTreeHostTestFinishAllRendering : public LayerTreeHostTest { | 1315 class LayerTreeHostTestFinishAllRendering : public LayerTreeHostTest { |
1378 public: | 1316 public: |
1379 LayerTreeHostTestFinishAllRendering() | 1317 LayerTreeHostTestFinishAllRendering() |
1380 : m_once(false) | 1318 : m_once(false) |
1381 , m_drawCount(0) | 1319 , m_drawCount(0) |
1382 { | 1320 { |
1383 } | 1321 } |
1384 | 1322 |
1385 virtual void beginTest() OVERRIDE | 1323 virtual void beginTest() OVERRIDE |
1386 { | 1324 { |
(...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1742 scoped_refptr<EvictionTestLayer> m_layer; | 1680 scoped_refptr<EvictionTestLayer> m_layer; |
1743 LayerTreeHostImpl* m_implForEvictTextures; | 1681 LayerTreeHostImpl* m_implForEvictTextures; |
1744 int m_numCommits; | 1682 int m_numCommits; |
1745 }; | 1683 }; |
1746 | 1684 |
1747 TEST_F(LayerTreeHostTestEvictTextures, runMultiThread) | 1685 TEST_F(LayerTreeHostTestEvictTextures, runMultiThread) |
1748 { | 1686 { |
1749 runTest(true); | 1687 runTest(true); |
1750 } | 1688 } |
1751 | 1689 |
1752 class LayerTreeHostTestLostContextAfterEvictTextures : public LayerTreeHostTest
{ | |
1753 public: | |
1754 LayerTreeHostTestLostContextAfterEvictTextures() | |
1755 : m_layer(EvictionTestLayer::create()) | |
1756 , m_implForEvictTextures(0) | |
1757 , m_numCommits(0) | |
1758 { | |
1759 } | |
1760 | |
1761 virtual void beginTest() OVERRIDE | |
1762 { | |
1763 m_layerTreeHost->setRootLayer(m_layer); | |
1764 m_layerTreeHost->setViewportSize(gfx::Size(10, 20), gfx::Size(10, 20)); | |
1765 | |
1766 gfx::Transform identityMatrix; | |
1767 setLayerPropertiesForTesting(m_layer.get(), 0, identityMatrix, gfx::Poin
tF(0, 0), gfx::PointF(0, 0), gfx::Size(10, 20), true); | |
1768 | |
1769 postSetNeedsCommitToMainThread(); | |
1770 } | |
1771 | |
1772 void postEvictTextures() | |
1773 { | |
1774 if (implThread()) { | |
1775 implThread()->postTask(base::Bind(&LayerTreeHostTestLostContextAfter
EvictTextures::evictTexturesOnImplThread, | |
1776 base::Unretained(this))); | |
1777 } else { | |
1778 DebugScopedSetImplThread impl(proxy()); | |
1779 evictTexturesOnImplThread(); | |
1780 } | |
1781 } | |
1782 | |
1783 void evictTexturesOnImplThread() | |
1784 { | |
1785 DCHECK(m_implForEvictTextures); | |
1786 m_implForEvictTextures->enforceManagedMemoryPolicy(ManagedMemoryPolicy(0
)); | |
1787 } | |
1788 | |
1789 // Commit 1: Just commit and draw normally, then at the end, set ourselves | |
1790 // invisible (to prevent a commit that would recreate textures after | |
1791 // eviction, before the context recovery), and post a task that will evict | |
1792 // textures, then cause the context to be lost, and then set ourselves | |
1793 // visible again (to allow commits, since that's what causes context | |
1794 // recovery in single thread). | |
1795 virtual void didCommitAndDrawFrame() OVERRIDE | |
1796 { | |
1797 ++m_numCommits; | |
1798 switch (m_numCommits) { | |
1799 case 1: | |
1800 EXPECT_TRUE(m_layer->haveBackingTexture()); | |
1801 m_layerTreeHost->setVisible(false); | |
1802 postEvictTextures(); | |
1803 m_layerTreeHost->loseOutputSurface(1); | |
1804 m_layerTreeHost->setVisible(true); | |
1805 break; | |
1806 default: | |
1807 break; | |
1808 } | |
1809 } | |
1810 | |
1811 virtual void commitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE | |
1812 { | |
1813 m_implForEvictTextures = impl; | |
1814 } | |
1815 | |
1816 virtual void didRecreateOutputSurface(bool succeeded) OVERRIDE | |
1817 { | |
1818 EXPECT_TRUE(succeeded); | |
1819 endTest(); | |
1820 } | |
1821 | |
1822 virtual void afterTest() OVERRIDE | |
1823 { | |
1824 } | |
1825 | |
1826 private: | |
1827 FakeContentLayerClient m_client; | |
1828 scoped_refptr<EvictionTestLayer> m_layer; | |
1829 LayerTreeHostImpl* m_implForEvictTextures; | |
1830 int m_numCommits; | |
1831 }; | |
1832 | |
1833 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestLostContextAfterEvictTextures) | |
1834 | |
1835 class FakeWebGraphicsContext3DWithEndQueryCausingLostContext : public FakeWebGra
phicsContext3D { | |
1836 public: | |
1837 static scoped_ptr<FakeWebGraphicsContext3DWithEndQueryCausingLostContext> cr
eate(Attributes attrs) | |
1838 { | |
1839 return make_scoped_ptr(new FakeWebGraphicsContext3DWithEndQueryCausingLo
stContext(attrs)); | |
1840 } | |
1841 | |
1842 virtual void setContextLostCallback(WebGraphicsContextLostCallback* callback
) { m_contextLostCallback = callback; } | |
1843 virtual bool isContextLost() { return m_isContextLost; } | |
1844 | |
1845 virtual void beginQueryEXT(WebKit::WGC3Denum, WebKit::WebGLId) { } | |
1846 virtual void endQueryEXT(WebKit::WGC3Denum) | |
1847 { | |
1848 // Lose context. | |
1849 if (!m_isContextLost) { | |
1850 m_contextLostCallback->onContextLost(); | |
1851 m_isContextLost = true; | |
1852 } | |
1853 } | |
1854 virtual void getQueryObjectuivEXT(WebKit::WebGLId, WebKit::WGC3Denum pname,
WebKit::WGC3Duint* params) | |
1855 { | |
1856 // Context is lost. We need to behave as if result is available. | |
1857 if (pname == GL_QUERY_RESULT_AVAILABLE_EXT) | |
1858 *params = 1; | |
1859 } | |
1860 | |
1861 private: | |
1862 explicit FakeWebGraphicsContext3DWithEndQueryCausingLostContext(Attributes a
ttrs) | |
1863 : FakeWebGraphicsContext3D(attrs) | |
1864 , m_contextLostCallback(0) | |
1865 , m_isContextLost(false) { } | |
1866 | |
1867 WebGraphicsContextLostCallback* m_contextLostCallback; | |
1868 bool m_isContextLost; | |
1869 }; | |
1870 | |
1871 class LayerTreeHostTestLostContextWhileUpdatingResources : public LayerTreeHostT
est { | |
1872 public: | |
1873 LayerTreeHostTestLostContextWhileUpdatingResources() | |
1874 : m_parent(ContentLayerWithUpdateTracking::create(&m_client)) | |
1875 , m_numChildren(50) | |
1876 { | |
1877 for (int i = 0; i < m_numChildren; i++) | |
1878 m_children.push_back(ContentLayerWithUpdateTracking::create(&m_clien
t)); | |
1879 } | |
1880 | |
1881 virtual void beginTest() | |
1882 { | |
1883 m_layerTreeHost->setRootLayer(m_parent); | |
1884 m_layerTreeHost->setViewportSize(gfx::Size(m_numChildren, 1), gfx::Size(
m_numChildren, 1)); | |
1885 | |
1886 gfx::Transform identityMatrix; | |
1887 setLayerPropertiesForTesting(m_parent.get(), 0, identityMatrix, gfx::Poi
ntF(0, 0), gfx::PointF(0, 0), gfx::Size(m_numChildren, 1), true); | |
1888 for (int i = 0; i < m_numChildren; i++) | |
1889 setLayerPropertiesForTesting(m_children[i].get(), m_parent.get(), id
entityMatrix, gfx::PointF(0, 0), gfx::PointF(i, 0), gfx::Size(1, 1), false); | |
1890 | |
1891 postSetNeedsCommitToMainThread(); | |
1892 } | |
1893 | |
1894 virtual void commitCompleteOnThread(LayerTreeHostImpl* impl) | |
1895 { | |
1896 endTest(); | |
1897 } | |
1898 | |
1899 virtual void layout() | |
1900 { | |
1901 m_parent->setNeedsDisplay(); | |
1902 for (int i = 0; i < m_numChildren; i++) | |
1903 m_children[i]->setNeedsDisplay(); | |
1904 } | |
1905 | |
1906 virtual void afterTest() | |
1907 { | |
1908 } | |
1909 | |
1910 private: | |
1911 FakeContentLayerClient m_client; | |
1912 scoped_refptr<ContentLayerWithUpdateTracking> m_parent; | |
1913 int m_numChildren; | |
1914 std::vector<scoped_refptr<ContentLayerWithUpdateTracking> > m_children; | |
1915 }; | |
1916 | |
1917 TEST_F(LayerTreeHostTestLostContextWhileUpdatingResources, runMultiThread) | |
1918 { | |
1919 runTest(true); | |
1920 } | |
1921 | |
1922 class LayerTreeHostTestContinuousCommit : public LayerTreeHostTest { | 1690 class LayerTreeHostTestContinuousCommit : public LayerTreeHostTest { |
1923 public: | 1691 public: |
1924 LayerTreeHostTestContinuousCommit() | 1692 LayerTreeHostTestContinuousCommit() |
1925 : m_numCommitComplete(0) | 1693 : m_numCommitComplete(0) |
1926 , m_numDrawLayers(0) | 1694 , m_numDrawLayers(0) |
1927 { | 1695 { |
1928 } | 1696 } |
1929 | 1697 |
1930 virtual void beginTest() OVERRIDE | 1698 virtual void beginTest() OVERRIDE |
1931 { | 1699 { |
(...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2245 LayerTreeSettings settings; | 2013 LayerTreeSettings settings; |
2246 settings.maxPartialTextureUpdates = 4; | 2014 settings.maxPartialTextureUpdates = 4; |
2247 | 2015 |
2248 scoped_ptr<LayerTreeHost> host = LayerTreeHost::create(&client, settings, sc
oped_ptr<Thread>()); | 2016 scoped_ptr<LayerTreeHost> host = LayerTreeHost::create(&client, settings, sc
oped_ptr<Thread>()); |
2249 EXPECT_TRUE(host->initializeRendererIfNeeded()); | 2017 EXPECT_TRUE(host->initializeRendererIfNeeded()); |
2250 EXPECT_EQ(0u, host->settings().maxPartialTextureUpdates); | 2018 EXPECT_EQ(0u, host->settings().maxPartialTextureUpdates); |
2251 } | 2019 } |
2252 | 2020 |
2253 } // namespace | 2021 } // namespace |
2254 } // namespace cc | 2022 } // namespace cc |
OLD | NEW |