Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/trees/layer_tree_host.h" | 5 #include "cc/trees/layer_tree_host.h" |
| 6 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "cc/debug/test_context_provider.h" | 8 #include "cc/debug/test_context_provider.h" |
| 9 #include "cc/debug/test_web_graphics_context_3d.h" | 9 #include "cc/debug/test_web_graphics_context_3d.h" |
| 10 #include "cc/layers/content_layer.h" | 10 #include "cc/layers/content_layer.h" |
| (...skipping 1528 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1539 // backtrack). | 1539 // backtrack). |
| 1540 EXPECT_EQ(1, scrollbar_layer_->update_count()); | 1540 EXPECT_EQ(1, scrollbar_layer_->update_count()); |
| 1541 LoseContext(); | 1541 LoseContext(); |
| 1542 break; | 1542 break; |
| 1543 case 2: | 1543 case 2: |
| 1544 // Second update, after the lost context, we should still upload 2 | 1544 // Second update, after the lost context, we should still upload 2 |
| 1545 // resources even if the contents haven't changed. | 1545 // resources even if the contents haven't changed. |
| 1546 EXPECT_EQ(2, scrollbar_layer_->update_count()); | 1546 EXPECT_EQ(2, scrollbar_layer_->update_count()); |
| 1547 EndTest(); | 1547 EndTest(); |
| 1548 break; | 1548 break; |
| 1549 case 3: | |
| 1550 // Single thread proxy issues extra commits after context lost. | |
| 1551 // http://crbug.com/287250 | |
| 1552 if (HasImplThread()) | |
| 1553 NOTREACHED(); | |
| 1554 break; | |
| 1549 default: | 1555 default: |
| 1550 NOTREACHED(); | 1556 NOTREACHED(); |
| 1551 } | 1557 } |
| 1552 } | 1558 } |
| 1553 | 1559 |
| 1554 private: | 1560 private: |
| 1555 int commits_; | 1561 int commits_; |
| 1556 scoped_refptr<FakePaintedScrollbarLayer> scrollbar_layer_; | 1562 scoped_refptr<FakePaintedScrollbarLayer> scrollbar_layer_; |
| 1557 }; | 1563 }; |
| 1558 | 1564 |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1715 // Expects a valid UIResourceId. | 1721 // Expects a valid UIResourceId. |
| 1716 EXPECT_NE(0, ui_resource_->id()); | 1722 EXPECT_NE(0, ui_resource_->id()); |
| 1717 PostSetNeedsCommitToMainThread(); | 1723 PostSetNeedsCommitToMainThread(); |
| 1718 break; | 1724 break; |
| 1719 case 4: | 1725 case 4: |
| 1720 // Release resource before ending the test. | 1726 // Release resource before ending the test. |
| 1721 ui_resource_.reset(); | 1727 ui_resource_.reset(); |
| 1722 EndTest(); | 1728 EndTest(); |
| 1723 break; | 1729 break; |
| 1724 case 5: | 1730 case 5: |
| 1725 // Make sure no extra commits happened. | 1731 // Single thread proxy issues extra commits after context lost. |
| 1732 // http://crbug.com/287250 | |
| 1733 if (HasImplThread()) | |
| 1734 NOTREACHED(); | |
| 1735 break; | |
| 1736 case 6: | |
| 1726 NOTREACHED(); | 1737 NOTREACHED(); |
| 1727 } | 1738 } |
| 1728 } | 1739 } |
| 1729 | 1740 |
| 1730 virtual void StepCompleteOnImplThread(LayerTreeHostImpl* impl) OVERRIDE { | 1741 virtual void StepCompleteOnImplThread(LayerTreeHostImpl* impl) OVERRIDE { |
| 1731 LayerTreeHostContextTest::CommitCompleteOnThread(impl); | 1742 LayerTreeHostContextTest::CommitCompleteOnThread(impl); |
| 1732 switch (time_step_) { | 1743 switch (time_step_) { |
| 1733 case 1: | 1744 case 1: |
| 1734 // The resource should have been created on LTHI after the commit. | 1745 // The resource should have been created on LTHI after the commit. |
| 1735 EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id())); | 1746 EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id())); |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1820 break; | 1831 break; |
| 1821 case 8: | 1832 case 8: |
| 1822 NOTREACHED(); | 1833 NOTREACHED(); |
| 1823 } | 1834 } |
| 1824 } | 1835 } |
| 1825 | 1836 |
| 1826 virtual void StepCompleteOnImplThread(LayerTreeHostImpl* impl) OVERRIDE { | 1837 virtual void StepCompleteOnImplThread(LayerTreeHostImpl* impl) OVERRIDE { |
| 1827 LayerTreeHostContextTest::CommitCompleteOnThread(impl); | 1838 LayerTreeHostContextTest::CommitCompleteOnThread(impl); |
| 1828 switch (time_step_) { | 1839 switch (time_step_) { |
| 1829 case 1: | 1840 case 1: |
| 1830 // Sequence 1 (continued): | 1841 // Sequence 1 (continued): |
|
ccameron
2013/09/09 09:16:43
This is somewhat simplified by the fact that resou
| |
| 1831 if (HasImplThread()) { | 1842 // The first context lost happens before the resources were created, |
| 1832 // The resources should have been recreated. | 1843 // and because it resulted in no resources being destroyed, it does not |
| 1833 EXPECT_EQ(2, ui_resource_->resource_create_count); | 1844 // trigger resource re-creation. |
| 1834 // The "resource lost" callback was called once for the resource in | 1845 EXPECT_EQ(1, ui_resource_->resource_create_count); |
| 1835 // the resource map. | 1846 EXPECT_EQ(0, ui_resource_->lost_resource_count); |
| 1836 EXPECT_EQ(1, ui_resource_->lost_resource_count); | 1847 // Resource Id on the impl-side has been created. |
| 1837 } else { | |
| 1838 // The extra commit that happens at context lost in the single thread | |
| 1839 // proxy changes the timing so that the resource recreation callback | |
| 1840 // is skipped. | |
| 1841 // http://crbug.com/287250 | |
| 1842 EXPECT_EQ(1, ui_resource_->resource_create_count); | |
| 1843 EXPECT_EQ(0, ui_resource_->lost_resource_count); | |
| 1844 } | |
| 1845 // Resource Id on the impl-side have been recreated as well. Note | |
| 1846 // that the same UIResourceId persists after the context lost. | |
| 1847 EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id())); | |
| 1848 PostSetNeedsCommitToMainThread(); | 1848 PostSetNeedsCommitToMainThread(); |
| 1849 break; | 1849 break; |
| 1850 case 3: | 1850 case 3: |
| 1851 // Sequence 2 (continued): | 1851 // Sequence 2 (continued): |
| 1852 // The previous resource should have been deleted. | 1852 // The previous resource should have been deleted. |
| 1853 EXPECT_EQ(0u, impl->ResourceIdForUIResource(test_id0_)); | 1853 EXPECT_EQ(0u, impl->ResourceIdForUIResource(test_id0_)); |
| 1854 // The second resource should have been created. | |
| 1855 EXPECT_NE(0u, impl->ResourceIdForUIResource(test_id1_)); | |
| 1856 if (HasImplThread()) { | 1854 if (HasImplThread()) { |
| 1857 // The second resource called the resource callback once and since the | 1855 // The second resource should have been created. |
| 1858 // context is lost, a "resource lost" callback was also issued. | 1856 EXPECT_NE(0u, impl->ResourceIdForUIResource(test_id1_)); |
| 1859 EXPECT_EQ(2, ui_resource_->resource_create_count); | |
| 1860 EXPECT_EQ(1, ui_resource_->lost_resource_count); | |
| 1861 } else { | 1857 } else { |
| 1862 // The extra commit that happens at context lost in the single thread | 1858 // The extra commit that happens at context lost in the single thread |
| 1863 // proxy changes the timing so that the resource recreation callback | 1859 // proxy changes the timing so that the resource has been destroyed. |
| 1864 // is skipped. | |
| 1865 // http://crbug.com/287250 | 1860 // http://crbug.com/287250 |
| 1866 EXPECT_EQ(1, ui_resource_->resource_create_count); | 1861 EXPECT_EQ(0u, impl->ResourceIdForUIResource(test_id1_)); |
| 1867 EXPECT_EQ(0, ui_resource_->lost_resource_count); | |
| 1868 } | 1862 } |
| 1863 // The second resource called the resource callback once and since the | |
| 1864 // context is lost, a "resource lost" callback was also issued. | |
| 1865 EXPECT_EQ(2, ui_resource_->resource_create_count); | |
| 1866 EXPECT_EQ(1, ui_resource_->lost_resource_count); | |
| 1869 break; | 1867 break; |
| 1870 case 5: | 1868 case 5: |
| 1871 // Sequence 3 (continued): | 1869 // Sequence 3 (continued): |
| 1872 // Expect the resource callback to have been called once. | 1870 // Expect the resource callback to have been called once. |
| 1873 EXPECT_EQ(1, ui_resource_->resource_create_count); | 1871 EXPECT_EQ(1, ui_resource_->resource_create_count); |
| 1874 // No "resource lost" callbacks. | 1872 // No "resource lost" callbacks. |
| 1875 EXPECT_EQ(0, ui_resource_->lost_resource_count); | 1873 EXPECT_EQ(0, ui_resource_->lost_resource_count); |
| 1876 // The UI resource id should not be valid | 1874 // The UI resource id should not be valid |
| 1877 EXPECT_EQ(0u, impl->ResourceIdForUIResource(test_id0_)); | 1875 EXPECT_EQ(0u, impl->ResourceIdForUIResource(test_id0_)); |
| 1878 break; | 1876 break; |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1970 TEST_F(UIResourceLostBeforeActivateTree, | 1968 TEST_F(UIResourceLostBeforeActivateTree, |
| 1971 RunMultiThread_DirectRenderer_ImplSidePaint) { | 1969 RunMultiThread_DirectRenderer_ImplSidePaint) { |
| 1972 RunTest(true, false, true); | 1970 RunTest(true, false, true); |
| 1973 } | 1971 } |
| 1974 | 1972 |
| 1975 TEST_F(UIResourceLostBeforeActivateTree, | 1973 TEST_F(UIResourceLostBeforeActivateTree, |
| 1976 RunMultiThread_DelegatingRenderer_ImplSidePaint) { | 1974 RunMultiThread_DelegatingRenderer_ImplSidePaint) { |
| 1977 RunTest(true, true, true); | 1975 RunTest(true, true, true); |
| 1978 } | 1976 } |
| 1979 | 1977 |
| 1978 // Resources evicted explicitly and by visibility changes. | |
| 1979 class UIResourceLostEviction : public UIResourceLostTestSimple { | |
| 1980 public: | |
| 1981 virtual void StepCompleteOnMainThread(int step) OVERRIDE { | |
| 1982 EXPECT_TRUE(layer_tree_host()->proxy()->IsMainThread()); | |
| 1983 switch (step) { | |
| 1984 case 0: | |
| 1985 ui_resource_ = FakeScopedUIResource::Create(layer_tree_host()); | |
| 1986 EXPECT_NE(0, ui_resource_->id()); | |
| 1987 PostSetNeedsCommitToMainThread(); | |
| 1988 break; | |
| 1989 case 2: | |
| 1990 // Make the tree not visible. | |
| 1991 PostSetVisibleToMainThread(false); | |
| 1992 break; | |
| 1993 case 3: | |
| 1994 // Release resource before ending the test. | |
| 1995 ui_resource_.reset(); | |
| 1996 EndTest(); | |
| 1997 break; | |
| 1998 case 4: | |
| 1999 NOTREACHED(); | |
| 2000 } | |
| 2001 } | |
| 2002 | |
| 2003 virtual void DidSetVisibleOnImplTree(LayerTreeHostImpl* impl, | |
| 2004 bool visible) OVERRIDE { | |
| 2005 TestWebGraphicsContext3D* context = static_cast<TestWebGraphicsContext3D*>( | |
| 2006 impl->output_surface()->context_provider()->Context3d()); | |
| 2007 if (!visible) { | |
| 2008 // All resources should have been evicted. | |
| 2009 ASSERT_EQ(0u, context->NumTextures()); | |
| 2010 EXPECT_EQ(0u, impl->ResourceIdForUIResource(ui_resource_->id())); | |
| 2011 EXPECT_EQ(2, ui_resource_->resource_create_count); | |
| 2012 EXPECT_EQ(1, ui_resource_->lost_resource_count); | |
| 2013 // Drawing is disabled both because of the evicted resources and | |
| 2014 // because the renderer is not visible. | |
| 2015 EXPECT_FALSE(impl->CanDraw()); | |
| 2016 // Make the renderer visible again. | |
| 2017 PostSetVisibleToMainThread(true); | |
| 2018 } | |
| 2019 } | |
| 2020 | |
| 2021 virtual void StepCompleteOnImplThread(LayerTreeHostImpl* impl) OVERRIDE { | |
| 2022 TestWebGraphicsContext3D* context = static_cast<TestWebGraphicsContext3D*>( | |
| 2023 impl->output_surface()->context_provider()->Context3d()); | |
| 2024 LayerTreeHostContextTest::CommitCompleteOnThread(impl); | |
| 2025 switch (time_step_) { | |
| 2026 case 1: | |
| 2027 // The resource should have been created on LTHI after the commit. | |
| 2028 ASSERT_EQ(1u, context->NumTextures()); | |
| 2029 EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id())); | |
| 2030 EXPECT_EQ(1, ui_resource_->resource_create_count); | |
| 2031 EXPECT_EQ(0, ui_resource_->lost_resource_count); | |
| 2032 EXPECT_TRUE(impl->CanDraw()); | |
| 2033 // Evict all UI resources. This will trigger a commit. | |
| 2034 impl->DeleteAllUIResources(); | |
| 2035 ASSERT_EQ(0u, context->NumTextures()); | |
| 2036 EXPECT_EQ(0u, impl->ResourceIdForUIResource(ui_resource_->id())); | |
| 2037 EXPECT_EQ(1, ui_resource_->resource_create_count); | |
| 2038 EXPECT_EQ(0, ui_resource_->lost_resource_count); | |
| 2039 EXPECT_FALSE(impl->CanDraw()); | |
| 2040 break; | |
| 2041 case 2: | |
| 2042 // The resource should have been recreated. | |
| 2043 ASSERT_EQ(1u, context->NumTextures()); | |
| 2044 EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id())); | |
| 2045 EXPECT_EQ(2, ui_resource_->resource_create_count); | |
| 2046 EXPECT_EQ(1, ui_resource_->lost_resource_count); | |
| 2047 EXPECT_TRUE(impl->CanDraw()); | |
| 2048 break; | |
| 2049 case 3: | |
| 2050 // The resource should have been recreated after visibility was | |
| 2051 // restored. | |
| 2052 ASSERT_EQ(1u, context->NumTextures()); | |
| 2053 EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id())); | |
| 2054 EXPECT_EQ(3, ui_resource_->resource_create_count); | |
| 2055 EXPECT_EQ(2, ui_resource_->lost_resource_count); | |
| 2056 EXPECT_TRUE(impl->CanDraw()); | |
| 2057 break; | |
| 2058 } | |
| 2059 } | |
| 2060 }; | |
| 2061 | |
| 2062 SINGLE_AND_MULTI_THREAD_TEST_F(UIResourceLostEviction); | |
| 2063 | |
| 1980 } // namespace | 2064 } // namespace |
| 1981 } // namespace cc | 2065 } // namespace cc |
| OLD | NEW |