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

Side by Side Diff: cc/trees/layer_tree_host_unittest_context.cc

Issue 23548022: [cc] Evict UIResources when the renderer is not visible (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix names Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698