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/layers/texture_layer.h" | 5 #include "cc/layers/texture_layer.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/callback.h" | 9 #include "base/callback.h" |
10 #include "base/synchronization/waitable_event.h" | 10 #include "base/synchronization/waitable_event.h" |
11 #include "base/threading/thread.h" | |
12 #include "base/time/time.h" | |
13 #include "cc/debug/test_web_graphics_context_3d.h" | 11 #include "cc/debug/test_web_graphics_context_3d.h" |
14 #include "cc/layers/texture_layer_client.h" | 12 #include "cc/layers/texture_layer_client.h" |
15 #include "cc/layers/texture_layer_impl.h" | 13 #include "cc/layers/texture_layer_impl.h" |
16 #include "cc/resources/returned_resource.h" | 14 #include "cc/resources/returned_resource.h" |
17 #include "cc/test/fake_impl_proxy.h" | 15 #include "cc/test/fake_impl_proxy.h" |
18 #include "cc/test/fake_layer_tree_host_client.h" | 16 #include "cc/test/fake_layer_tree_host_client.h" |
19 #include "cc/test/fake_layer_tree_host_impl.h" | 17 #include "cc/test/fake_layer_tree_host_impl.h" |
20 #include "cc/test/fake_output_surface.h" | 18 #include "cc/test/fake_output_surface.h" |
21 #include "cc/test/layer_test_common.h" | 19 #include "cc/test/layer_test_common.h" |
22 #include "cc/test/layer_tree_test.h" | 20 #include "cc/test/layer_tree_test.h" |
(...skipping 833 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
856 base::ThreadChecker main_thread_; | 854 base::ThreadChecker main_thread_; |
857 int callback_count_; | 855 int callback_count_; |
858 int commit_count_; | 856 int commit_count_; |
859 scoped_refptr<Layer> root_; | 857 scoped_refptr<Layer> root_; |
860 scoped_refptr<TextureLayer> layer_; | 858 scoped_refptr<TextureLayer> layer_; |
861 }; | 859 }; |
862 | 860 |
863 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F( | 861 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F( |
864 TextureLayerImplWithMailboxThreadedCallback); | 862 TextureLayerImplWithMailboxThreadedCallback); |
865 | 863 |
866 | |
867 class TextureLayerNoMailboxIsActivatedDuringCommit : public LayerTreeTest, | |
868 public TextureLayerClient { | |
869 protected: | |
870 TextureLayerNoMailboxIsActivatedDuringCommit() | |
871 : wait_thread_("WAIT"), | |
872 wait_event_(false, false) { | |
873 wait_thread_.Start(); | |
874 } | |
875 | |
876 virtual void BeginTest() OVERRIDE { | |
877 activate_count_ = 0; | |
878 | |
879 gfx::Size bounds(100, 100); | |
880 root_ = Layer::Create(); | |
881 root_->SetAnchorPoint(gfx::PointF()); | |
882 root_->SetBounds(bounds); | |
883 | |
884 layer_ = TextureLayer::Create(this); | |
885 layer_->SetIsDrawable(true); | |
886 layer_->SetAnchorPoint(gfx::PointF()); | |
887 layer_->SetBounds(bounds); | |
888 | |
889 root_->AddChild(layer_); | |
890 layer_tree_host()->SetRootLayer(root_); | |
891 layer_tree_host()->SetViewportSize(bounds); | |
892 | |
893 PostSetNeedsCommitToMainThread(); | |
894 } | |
895 | |
896 // TextureLayerClient implementation. | |
897 virtual unsigned PrepareTexture() OVERRIDE { | |
898 return OffscreenContextProviderForMainThread() | |
899 ->Context3d()->createTexture(); | |
900 } | |
901 virtual WebKit::WebGraphicsContext3D* Context3d() OVERRIDE { | |
902 return OffscreenContextProviderForMainThread()->Context3d(); | |
903 } | |
904 virtual bool PrepareTextureMailbox(TextureMailbox* mailbox, | |
905 bool use_shared_memory) OVERRIDE { | |
906 return false; | |
907 } | |
908 | |
909 virtual void WillActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { | |
910 // Slow down activation so the main thread DidCommit() will run if | |
911 // not blocked. | |
912 wait_thread_.message_loop()->PostDelayedTask( | |
913 FROM_HERE, | |
914 base::Bind(&base::WaitableEvent::Signal, | |
915 base::Unretained(&wait_event_)), | |
916 base::TimeDelta::FromMilliseconds(10)); | |
917 wait_event_.Wait(); | |
918 } | |
919 | |
920 virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { | |
921 { | |
922 base::AutoLock lock(activate_lock_); | |
923 ++activate_count_; | |
924 } | |
925 | |
926 proxy()->MainThreadTaskRunner()->PostTask( | |
927 FROM_HERE, | |
928 base::Bind(&TextureLayerNoMailboxIsActivatedDuringCommit::DidActivate, | |
929 base::Unretained(this))); | |
930 } | |
931 | |
932 void DidActivate() { | |
933 base::AutoLock lock(activate_lock_); | |
934 switch (activate_count_) { | |
935 case 1: | |
936 // The first texture has been activated. Invalidate the layer so it | |
937 // grabs a new texture id from the client. | |
938 layer_->SetNeedsDisplay(); | |
939 // So this commit number should complete after the second activate. | |
940 EXPECT_EQ(1, layer_tree_host()->source_frame_number()); | |
941 break; | |
942 case 2: | |
943 // The second mailbox has been activated. Remove the layer from | |
944 // the tree to cause another commit/activation. The commit should | |
945 // finish *after* the layer is removed from the active tree. | |
946 layer_->RemoveFromParent(); | |
947 // So this commit number should complete after the third activate. | |
948 EXPECT_EQ(2, layer_tree_host()->source_frame_number()); | |
949 } | |
950 } | |
951 | |
952 virtual void DidCommit() OVERRIDE { | |
953 switch (layer_tree_host()->source_frame_number()) { | |
954 case 2: { | |
955 // The activate for the 2nd texture should have happened before now. | |
956 base::AutoLock lock(activate_lock_); | |
957 EXPECT_EQ(2, activate_count_); | |
958 break; | |
959 } | |
960 case 3: { | |
961 // The activate to remove the layer should have happened before now. | |
962 base::AutoLock lock(activate_lock_); | |
963 EXPECT_EQ(3, activate_count_); | |
964 | |
965 EndTest(); | |
966 break; | |
967 } | |
968 } | |
969 } | |
970 | |
971 | |
972 virtual void AfterTest() OVERRIDE {} | |
973 | |
974 base::Thread wait_thread_; | |
975 base::WaitableEvent wait_event_; | |
976 base::Lock activate_lock_; | |
977 int activate_count_; | |
978 int activate_commit_; | |
979 scoped_refptr<Layer> root_; | |
980 scoped_refptr<TextureLayer> layer_; | |
981 }; | |
982 | |
983 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F( | |
984 TextureLayerNoMailboxIsActivatedDuringCommit); | |
985 | |
986 class TextureLayerMailboxIsActivatedDuringCommit : public LayerTreeTest { | |
987 protected: | |
988 TextureLayerMailboxIsActivatedDuringCommit() | |
989 : wait_thread_("WAIT"), | |
990 wait_event_(false, false) { | |
991 wait_thread_.Start(); | |
992 } | |
993 | |
994 static void ReleaseCallback(unsigned sync_point, bool lost_resource) {} | |
995 | |
996 void SetMailbox(char mailbox_char) { | |
997 TextureMailbox mailbox( | |
998 std::string(64, mailbox_char), | |
999 base::Bind( | |
1000 &TextureLayerMailboxIsActivatedDuringCommit::ReleaseCallback)); | |
1001 layer_->SetTextureMailbox(mailbox); | |
1002 } | |
1003 | |
1004 virtual void BeginTest() OVERRIDE { | |
1005 activate_count_ = 0; | |
1006 | |
1007 gfx::Size bounds(100, 100); | |
1008 root_ = Layer::Create(); | |
1009 root_->SetAnchorPoint(gfx::PointF()); | |
1010 root_->SetBounds(bounds); | |
1011 | |
1012 layer_ = TextureLayer::CreateForMailbox(NULL); | |
1013 layer_->SetIsDrawable(true); | |
1014 layer_->SetAnchorPoint(gfx::PointF()); | |
1015 layer_->SetBounds(bounds); | |
1016 | |
1017 root_->AddChild(layer_); | |
1018 layer_tree_host()->SetRootLayer(root_); | |
1019 layer_tree_host()->SetViewportSize(bounds); | |
1020 SetMailbox('1'); | |
1021 | |
1022 PostSetNeedsCommitToMainThread(); | |
1023 } | |
1024 | |
1025 virtual void WillActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { | |
1026 // Slow down activation so the main thread DidCommit() will run if | |
1027 // not blocked. | |
1028 wait_thread_.message_loop()->PostDelayedTask( | |
1029 FROM_HERE, | |
1030 base::Bind(&base::WaitableEvent::Signal, | |
1031 base::Unretained(&wait_event_)), | |
1032 base::TimeDelta::FromMilliseconds(10)); | |
1033 wait_event_.Wait(); | |
1034 } | |
1035 | |
1036 virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { | |
1037 { | |
1038 base::AutoLock lock(activate_lock_); | |
1039 ++activate_count_; | |
1040 } | |
1041 | |
1042 proxy()->MainThreadTaskRunner()->PostTask( | |
1043 FROM_HERE, | |
1044 base::Bind(&TextureLayerMailboxIsActivatedDuringCommit::DidActivate, | |
1045 base::Unretained(this))); | |
1046 } | |
1047 | |
1048 void DidActivate() { | |
1049 base::AutoLock lock(activate_lock_); | |
1050 switch (activate_count_) { | |
1051 case 1: | |
1052 // The first mailbox has been activated. Set a new mailbox, and | |
1053 // expect the next commit to finish *after* it is activated. | |
1054 SetMailbox('2'); | |
1055 // So this commit number should complete after the second activate. | |
1056 EXPECT_EQ(1, layer_tree_host()->source_frame_number()); | |
1057 break; | |
1058 case 2: | |
1059 // The second mailbox has been activated. Remove the layer from | |
1060 // the tree to cause another commit/activation. The commit should | |
1061 // finish *after* the layer is removed from the active tree. | |
1062 layer_->RemoveFromParent(); | |
1063 // So this commit number should complete after the third activate. | |
1064 EXPECT_EQ(2, layer_tree_host()->source_frame_number()); | |
1065 } | |
1066 } | |
1067 | |
1068 virtual void DidCommit() OVERRIDE { | |
1069 switch (layer_tree_host()->source_frame_number()) { | |
1070 case 2: { | |
1071 // The activate for the 2nd mailbox should have happened before now. | |
1072 base::AutoLock lock(activate_lock_); | |
1073 EXPECT_EQ(2, activate_count_); | |
1074 break; | |
1075 } | |
1076 case 3: { | |
1077 // The activate to remove the layer should have happened before now. | |
1078 base::AutoLock lock(activate_lock_); | |
1079 EXPECT_EQ(3, activate_count_); | |
1080 | |
1081 EndTest(); | |
1082 break; | |
1083 } | |
1084 } | |
1085 } | |
1086 | |
1087 | |
1088 virtual void AfterTest() OVERRIDE {} | |
1089 | |
1090 base::Thread wait_thread_; | |
1091 base::WaitableEvent wait_event_; | |
1092 base::Lock activate_lock_; | |
1093 int activate_count_; | |
1094 scoped_refptr<Layer> root_; | |
1095 scoped_refptr<TextureLayer> layer_; | |
1096 }; | |
1097 | |
1098 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F( | |
1099 TextureLayerMailboxIsActivatedDuringCommit); | |
1100 | |
1101 class TextureLayerImplWithMailboxTest : public TextureLayerTest { | 864 class TextureLayerImplWithMailboxTest : public TextureLayerTest { |
1102 protected: | 865 protected: |
1103 TextureLayerImplWithMailboxTest() | 866 TextureLayerImplWithMailboxTest() |
1104 : fake_client_( | 867 : fake_client_( |
1105 FakeLayerTreeHostClient(FakeLayerTreeHostClient::DIRECT_3D)) {} | 868 FakeLayerTreeHostClient(FakeLayerTreeHostClient::DIRECT_3D)) {} |
1106 | 869 |
1107 virtual void SetUp() { | 870 virtual void SetUp() { |
1108 TextureLayerTest::SetUp(); | 871 TextureLayerTest::SetUp(); |
1109 layer_tree_host_.reset(new MockLayerTreeHost(&fake_client_)); | 872 layer_tree_host_.reset(new MockLayerTreeHost(&fake_client_)); |
1110 EXPECT_TRUE(host_impl_.InitializeRenderer(CreateFakeOutputSurface())); | 873 EXPECT_TRUE(host_impl_.InitializeRenderer(CreateFakeOutputSurface())); |
(...skipping 557 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1668 int callback_count_; | 1431 int callback_count_; |
1669 scoped_refptr<Layer> root_; | 1432 scoped_refptr<Layer> root_; |
1670 scoped_refptr<TextureLayer> layer_; | 1433 scoped_refptr<TextureLayer> layer_; |
1671 }; | 1434 }; |
1672 | 1435 |
1673 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F( | 1436 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F( |
1674 TextureLayerWithMailboxImplThreadDeleted); | 1437 TextureLayerWithMailboxImplThreadDeleted); |
1675 | 1438 |
1676 } // namespace | 1439 } // namespace |
1677 } // namespace cc | 1440 } // namespace cc |
OLD | NEW |