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

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

Issue 18191020: UI Resource Manager (Closed) Base URL: https://src.chromium.org/chrome/trunk/src/
Patch Set: Switched to resource client instead of callback Created 7 years, 5 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
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/layers/content_layer.h" 8 #include "cc/layers/content_layer.h"
9 #include "cc/layers/heads_up_display_layer.h" 9 #include "cc/layers/heads_up_display_layer.h"
10 #include "cc/layers/io_surface_layer.h" 10 #include "cc/layers/io_surface_layer.h"
11 #include "cc/layers/layer_impl.h" 11 #include "cc/layers/layer_impl.h"
12 #include "cc/layers/picture_layer.h" 12 #include "cc/layers/picture_layer.h"
13 #include "cc/layers/scrollbar_layer.h" 13 #include "cc/layers/scrollbar_layer.h"
14 #include "cc/layers/texture_layer.h" 14 #include "cc/layers/texture_layer.h"
15 #include "cc/layers/texture_layer_impl.h" 15 #include "cc/layers/texture_layer_impl.h"
16 #include "cc/layers/video_layer.h" 16 #include "cc/layers/video_layer.h"
17 #include "cc/layers/video_layer_impl.h" 17 #include "cc/layers/video_layer_impl.h"
18 #include "cc/output/filter_operations.h" 18 #include "cc/output/filter_operations.h"
19 #include "cc/test/fake_content_layer.h" 19 #include "cc/test/fake_content_layer.h"
20 #include "cc/test/fake_content_layer_client.h" 20 #include "cc/test/fake_content_layer_client.h"
21 #include "cc/test/fake_content_layer_impl.h" 21 #include "cc/test/fake_content_layer_impl.h"
22 #include "cc/test/fake_context_provider.h" 22 #include "cc/test/fake_context_provider.h"
23 #include "cc/test/fake_delegated_renderer_layer.h" 23 #include "cc/test/fake_delegated_renderer_layer.h"
24 #include "cc/test/fake_delegated_renderer_layer_impl.h" 24 #include "cc/test/fake_delegated_renderer_layer_impl.h"
25 #include "cc/test/fake_layer_tree_host_client.h" 25 #include "cc/test/fake_layer_tree_host_client.h"
26 #include "cc/test/fake_output_surface.h" 26 #include "cc/test/fake_output_surface.h"
27 #include "cc/test/fake_scoped_ui_resource.h"
27 #include "cc/test/fake_scrollbar.h" 28 #include "cc/test/fake_scrollbar.h"
28 #include "cc/test/fake_scrollbar_layer.h" 29 #include "cc/test/fake_scrollbar_layer.h"
29 #include "cc/test/fake_video_frame_provider.h" 30 #include "cc/test/fake_video_frame_provider.h"
30 #include "cc/test/layer_tree_test.h" 31 #include "cc/test/layer_tree_test.h"
31 #include "cc/test/render_pass_test_common.h" 32 #include "cc/test/render_pass_test_common.h"
32 #include "cc/test/test_web_graphics_context_3d.h" 33 #include "cc/test/test_web_graphics_context_3d.h"
33 #include "cc/trees/layer_tree_host_impl.h" 34 #include "cc/trees/layer_tree_host_impl.h"
34 #include "cc/trees/layer_tree_impl.h" 35 #include "cc/trees/layer_tree_impl.h"
35 #include "cc/trees/single_thread_proxy.h" 36 #include "cc/trees/single_thread_proxy.h"
36 #include "gpu/GLES2/gl2extchromium.h" 37 #include "gpu/GLES2/gl2extchromium.h"
(...skipping 1457 matching lines...) Expand 10 before | Expand all | Expand 10 after
1494 layer_tree_host()->root_layer()->AddChild(scroll_layer); 1495 layer_tree_host()->root_layer()->AddChild(scroll_layer);
1495 PostSetNeedsCommitToMainThread(); 1496 PostSetNeedsCommitToMainThread();
1496 } 1497 }
1497 1498
1498 virtual void AfterTest() OVERRIDE {} 1499 virtual void AfterTest() OVERRIDE {}
1499 1500
1500 virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE { 1501 virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
1501 LayerTreeHostContextTest::CommitCompleteOnThread(impl); 1502 LayerTreeHostContextTest::CommitCompleteOnThread(impl);
1502 1503
1503 ++commits_; 1504 ++commits_;
1504 size_t upload_count = scrollbar_layer_->last_update_full_upload_size() +
1505 scrollbar_layer_->last_update_partial_upload_size();
1506 switch (commits_) { 1505 switch (commits_) {
1507 case 1: 1506 case 1:
1508 // First (regular) update, we should upload 2 resources (thumb, and 1507 // First (regular) update, we should upload 2 resources (thumb, and
1509 // backtrack). 1508 // backtrack).
1510 EXPECT_EQ(1, scrollbar_layer_->update_count()); 1509 EXPECT_EQ(1, scrollbar_layer_->update_count());
1511 EXPECT_EQ(2u, upload_count);
1512 LoseContext(); 1510 LoseContext();
1513 break; 1511 break;
1514 case 2: 1512 case 2:
1515 // Second update, after the lost context, we should still upload 2 1513 // Second update, after the lost context, we should still upload 2
1516 // resources even if the contents haven't changed. 1514 // resources even if the contents haven't changed.
1517 EXPECT_EQ(2, scrollbar_layer_->update_count()); 1515 EXPECT_EQ(2, scrollbar_layer_->update_count());
1518 EXPECT_EQ(2u, upload_count);
1519 EndTest(); 1516 EndTest();
1520 break; 1517 break;
1521 default: 1518 default:
1522 NOTREACHED(); 1519 NOTREACHED();
1523 } 1520 }
1524 } 1521 }
1525 1522
1526 private: 1523 private:
1527 int commits_; 1524 int commits_;
1528 scoped_refptr<FakeScrollbarLayer> scrollbar_layer_; 1525 scoped_refptr<FakeScrollbarLayer> scrollbar_layer_;
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
1595 this, 1592 this,
1596 settings, 1593 settings,
1597 impl_thread ? impl_thread->message_loop_proxy() : NULL); 1594 impl_thread ? impl_thread->message_loop_proxy() : NULL);
1598 EXPECT_FALSE(layer_tree_host); 1595 EXPECT_FALSE(layer_tree_host);
1599 } 1596 }
1600 }; 1597 };
1601 1598
1602 SINGLE_AND_MULTI_THREAD_TEST_F( 1599 SINGLE_AND_MULTI_THREAD_TEST_F(
1603 LayerTreeHostTestCannotCreateIfCannotCreateOutputSurface); 1600 LayerTreeHostTestCannotCreateIfCannotCreateOutputSurface);
1604 1601
1602 class UIResourceLostTest : public LayerTreeHostContextTest {
1603 public:
1604 UIResourceLostTest() : time_step_(0) {}
1605 virtual void BeginTest() OVERRIDE { PostSetNeedsCommitToMainThread(); }
1606 virtual void AfterTest() OVERRIDE {}
1607
1608 protected:
1609 int time_step_;
1610 scoped_ptr<FakeScopedUIResource> ui_resource_;
1611 };
1612
1613 // Losing context after an UI resource has been created.
1614 class UIResourceLostAfterCommit : public UIResourceLostTest {
1615 public:
1616 virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
1617 LayerTreeHostContextTest::CommitCompleteOnThread(impl);
1618 switch (time_step_) {
1619 case 0:
1620 ui_resource_.reset(new FakeScopedUIResource(layer_tree_host()));
1621 // Expects a valid UIResourceId.
1622 EXPECT_NE(0, ui_resource_->id());
1623 PostSetNeedsCommitToMainThread();
1624 break;
1625 case 1:
1626 // The resource should have been created on LTHI after the commit.
1627 if (!layer_tree_host()->settings().impl_side_painting)
1628 EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id()));
1629 PostSetNeedsCommitToMainThread();
1630 break;
1631 case 2:
1632 LoseContext();
1633 // Resource Id on the impl-side should no longer be valid after
1634 // context is lost.
1635 EXPECT_EQ(0u, impl->ResourceIdForUIResource(ui_resource_->id()));
1636 break;
1637 case 3:
1638 // The resources should have been recreated. The bitmap callback should
1639 // have been called once with the resource_lost flag set to true.
1640 EXPECT_EQ(1, ui_resource_->lost_resource_count);
1641 // Resource Id on the impl-side have been recreated as well. Note
1642 // that the same UIResourceId persists after the context lost.
1643 if (!layer_tree_host()->settings().impl_side_painting)
1644 EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id()));
1645 PostSetNeedsCommitToMainThread();
1646 break;
1647 case 4:
1648 // Release resource before ending test.
1649 ui_resource_.reset();
1650 EndTest();
1651 break;
1652 }
1653 }
1654
1655 virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE {
1656 LayerTreeHostContextTest::DidActivateTreeOnThread(impl);
1657 switch (time_step_) {
1658 case 1:
1659 if (layer_tree_host()->settings().impl_side_painting)
1660 EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id()));
1661 break;
1662 case 3:
1663 if (layer_tree_host()->settings().impl_side_painting)
1664 EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id()));
1665 break;
1666 }
1667 ++time_step_;
1668 }
1669 };
1670
1671 SINGLE_AND_MULTI_THREAD_TEST_F(UIResourceLostAfterCommit);
1672
1673 // Losing context before UI resource requests can be commited. Three sequences
1674 // of creation/deletion are considered:
1675 // 1. Create one resource -> Context Lost => Expect the resource to have been
1676 // created.
1677 // 2. Delete an exisiting resource (test_id0_) -> create a second resource
1678 // (test_id1_) -> Context Lost => Expect the test_id0_ to be removed and
1679 // test_id1_ to have been created.
1680 // 3. Create one resource -> Delete that same resource -> Context Lost => Expect
1681 // the resource to not exist in the manager.
1682 class UIResourceLostBeforeCommit : public UIResourceLostTest {
1683 public:
1684 UIResourceLostBeforeCommit()
1685 : test_id0_(0),
1686 test_id1_(0) {}
1687
1688 virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
1689 LayerTreeHostContextTest::CommitCompleteOnThread(impl);
1690 switch (time_step_) {
1691 case 0:
1692 // Sequence 1:
1693 ui_resource_.reset(new FakeScopedUIResource(layer_tree_host()));
1694 LoseContext();
1695 // Resource Id on the impl-side should no longer be valid after
1696 // context is lost.
1697 EXPECT_EQ(0u, impl->ResourceIdForUIResource(ui_resource_->id()));
1698 break;
1699 case 1:
1700 // The resources should have been recreated.
1701 EXPECT_EQ(1, ui_resource_->resource_create_count);
1702 // No "resource lost" callback was called since the context lost
1703 // happened before commit.
1704 EXPECT_EQ(0, ui_resource_->lost_resource_count);
1705 // Resource Id on the impl-side have been recreated as well. Note
1706 // that the same UIResourceId persists after the context lost.
1707 if (!layer_tree_host()->settings().impl_side_painting)
1708 EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id()));
1709 PostSetNeedsCommitToMainThread();
1710 break;
1711 case 2:
1712 // Sequence 2:
1713 // Currently one resource has been created.
1714 test_id0_ = ui_resource_->id();
1715 // Delete this resource.
1716 ui_resource_.reset();
1717 // Create another resource.
1718 ui_resource_.reset(new FakeScopedUIResource(layer_tree_host()));
1719 test_id1_ = ui_resource_->id();
1720 // Sanity check that two resource creations return different ids.
1721 EXPECT_NE(test_id0_, test_id1_);
1722 // Lose the context before commit.
1723 LoseContext();
1724 break;
1725 case 3:
1726 if (!layer_tree_host()->settings().impl_side_painting) {
1727 // The previous resource should have been deleted.
1728 EXPECT_EQ(0u, impl->ResourceIdForUIResource(test_id0_));
1729 // The second resource should have been created.
1730 EXPECT_NE(0u, impl->ResourceIdForUIResource(test_id1_));
1731 }
1732
1733 // The second resource called the resource callback once. Since the
1734 // context lost happened before commit, the callback was not a "resource
1735 // lost" call.
1736 EXPECT_EQ(1, ui_resource_->resource_create_count);
1737 EXPECT_EQ(0, ui_resource_->lost_resource_count);
1738 // Clear the manager of resources.
1739 ui_resource_.reset();
1740 PostSetNeedsCommitToMainThread();
1741 break;
1742 case 4:
1743 // Sequence 3:
1744 ui_resource_.reset(new FakeScopedUIResource(layer_tree_host()));
1745 test_id0_ = ui_resource_->id();
1746 // Sanity check the UIResourceId should not be 0.
1747 EXPECT_NE(0, test_id0_);
1748 // Usually ScopedUIResource are deleted from the manager in their
1749 // destructor (so usually ui_resource_.reset()). But here we need
1750 // ui_resource_ for the next step, so call DeleteUIResource directly.
1751 layer_tree_host()->DeleteUIResource(test_id0_);
1752 LoseContext();
1753 break;
1754 case 5:
1755 // Expect the resource callback to have been called once.
1756 EXPECT_EQ(1, ui_resource_->resource_create_count);
1757 // No "resource lost" callbacks.
1758 EXPECT_EQ(0, ui_resource_->lost_resource_count);
1759 if (!layer_tree_host()->settings().impl_side_painting) {
1760 // The UI resource id should not be valid
1761 EXPECT_EQ(0u, impl->ResourceIdForUIResource(test_id0_));
1762 }
1763 PostSetNeedsCommitToMainThread();
1764 break;
1765 case 6:
1766 ui_resource_.reset();
1767 EndTest();
1768 break;
1769 }
1770 }
1771
1772 virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE {
1773 LayerTreeHostContextTest::DidActivateTreeOnThread(impl);
1774 switch (time_step_) {
1775 case 1:
1776 if (layer_tree_host()->settings().impl_side_painting)
1777 EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id()));
1778 break;
1779 case 3:
1780 if (layer_tree_host()->settings().impl_side_painting) {
1781 EXPECT_EQ(0u, impl->ResourceIdForUIResource(test_id0_));
1782 EXPECT_NE(0u, impl->ResourceIdForUIResource(test_id1_));
1783 }
1784 break;
1785 case 5:
1786 if (layer_tree_host()->settings().impl_side_painting)
1787 EXPECT_EQ(0u, impl->ResourceIdForUIResource(test_id0_));
1788 break;
1789 }
1790 ++time_step_;
1791 }
1792
1793 private:
1794 UIResourceId test_id0_;
1795 UIResourceId test_id1_;
1796 };
1797
1798 SINGLE_AND_MULTI_THREAD_TEST_F(UIResourceLostBeforeCommit);
1799
1800 // Losing UI resource before the pending trees is activated but after the
1801 // commit. Impl-side-painting only.
1802 class UIResourceLostBeforeActivateTree : public UIResourceLostTest {
1803 virtual void CommitCompleteOnThread(LayerTreeHostImpl* impl) OVERRIDE {
1804 LayerTreeHostContextTest::CommitCompleteOnThread(impl);
1805 switch (time_step_) {
1806 case 0:
1807 ui_resource_.reset(new FakeScopedUIResource(layer_tree_host()));
1808 PostSetNeedsCommitToMainThread();
1809 break;
1810 case 2:
1811 PostSetNeedsCommitToMainThread();
1812 break;
1813 case 3:
1814 test_id_ = ui_resource_->id();
1815 ui_resource_.reset();
1816 PostSetNeedsCommitToMainThread();
1817 break;
1818 case 4:
1819 PostSetNeedsCommitToMainThread();
1820 break;
1821 case 5:
1822 EndTest();
1823 break;
1824 }
1825 }
1826
1827 virtual void WillActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE {
1828 switch (time_step_) {
1829 case 0:
1830 break;
1831 case 1:
1832 // The resource creation callback has been called.
1833 EXPECT_EQ(1, ui_resource_->resource_create_count);
1834 // The resource is not yet lost (sanity check).
1835 EXPECT_EQ(0, ui_resource_->lost_resource_count);
1836 // The resource should not have been created yet on the impl-side.
1837 EXPECT_EQ(0u, impl->ResourceIdForUIResource(ui_resource_->id()));
1838 LoseContext();
1839 break;
1840 case 3:
1841 LoseContext();
1842 break;
1843 }
1844 }
1845
1846 virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE {
1847 LayerTreeHostContextTest::DidActivateTreeOnThread(impl);
1848 switch (time_step_) {
1849 case 1:
1850 // The pending requests on the impl-side should have been removed, and
1851 // so the resource should still not have been created.
1852 EXPECT_EQ(0u, impl->ResourceIdForUIResource(ui_resource_->id()));
1853 break;
1854 case 2:
1855 // The resource should have been created.
1856 EXPECT_NE(0u, impl->ResourceIdForUIResource(ui_resource_->id()));
1857 // The "lost resource" callback has been called once.
1858 EXPECT_EQ(1, ui_resource_->lost_resource_count);
1859 break;
1860 case 3:
1861 // The resource is deleted and should not be in the manager. Use
1862 // test_id_ since ui_resource_ has been deleted.
1863 EXPECT_EQ(0u, impl->ResourceIdForUIResource(test_id_));
1864 break;
1865 }
1866 ++time_step_;
1867 }
1868
1869 private:
1870 UIResourceId test_id_;
1871 };
1872
1873 TEST_F(UIResourceLostBeforeActivateTree,
1874 RunMultiThread_DirectRenderer_ImplSidePaint) {
1875 RunTest(true, false, true);
1876 }
1877
1878 TEST_F(UIResourceLostBeforeActivateTree,
1879 RunMultiThread_DelegatingRenderer_ImplSidePaint) {
1880 RunTest(true, true, true);
1881 }
1882
1605 } // namespace 1883 } // namespace
1606 } // namespace cc 1884 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698