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

Side by Side Diff: cc/layers/texture_layer_unittest.cc

Issue 139053002: cc: Release main thread earlier (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: old chunk mismatch Created 6 years, 11 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/layers/texture_layer.h" 5 #include "cc/layers/texture_layer.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <string> 8 #include <string>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 868 matching lines...) Expand 10 before | Expand all | Expand 10 after
879 }; 879 };
880 880
881 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F( 881 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F(
882 TextureLayerImplWithMailboxThreadedCallback); 882 TextureLayerImplWithMailboxThreadedCallback);
883 883
884 884
885 class TextureLayerNoMailboxIsActivatedDuringCommit : public LayerTreeTest, 885 class TextureLayerNoMailboxIsActivatedDuringCommit : public LayerTreeTest,
886 public TextureLayerClient { 886 public TextureLayerClient {
887 protected: 887 protected:
888 TextureLayerNoMailboxIsActivatedDuringCommit() 888 TextureLayerNoMailboxIsActivatedDuringCommit()
889 : wait_thread_("WAIT"), 889 : texture_(0u), activate_count_(0) {}
890 wait_event_(false, false),
891 texture_(0u) {
892 wait_thread_.Start();
893 }
894 890
895 virtual void BeginTest() OVERRIDE { 891 virtual void BeginTest() OVERRIDE {
896 activate_count_ = 0;
897
898 gfx::Size bounds(100, 100); 892 gfx::Size bounds(100, 100);
899 root_ = Layer::Create(); 893 root_ = Layer::Create();
900 root_->SetAnchorPoint(gfx::PointF()); 894 root_->SetAnchorPoint(gfx::PointF());
901 root_->SetBounds(bounds); 895 root_->SetBounds(bounds);
902 896
903 layer_ = TextureLayer::Create(this); 897 layer_ = TextureLayer::Create(this);
904 layer_->SetIsDrawable(true); 898 layer_->SetIsDrawable(true);
905 layer_->SetAnchorPoint(gfx::PointF()); 899 layer_->SetAnchorPoint(gfx::PointF());
906 layer_->SetBounds(bounds); 900 layer_->SetBounds(bounds);
907 901
(...skipping 16 matching lines...) Expand all
924 return texture_; 918 return texture_;
925 } 919 }
926 virtual bool PrepareTextureMailbox( 920 virtual bool PrepareTextureMailbox(
927 TextureMailbox* mailbox, 921 TextureMailbox* mailbox,
928 scoped_ptr<SingleReleaseCallback>* release_callback, 922 scoped_ptr<SingleReleaseCallback>* release_callback,
929 bool use_shared_memory) OVERRIDE { 923 bool use_shared_memory) OVERRIDE {
930 return false; 924 return false;
931 } 925 }
932 926
933 virtual void WillActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { 927 virtual void WillActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE {
934 // Slow down activation so the main thread DidCommit() will run if
935 // not blocked.
936 wait_thread_.message_loop()->PostDelayedTask(
937 FROM_HERE,
938 base::Bind(&base::WaitableEvent::Signal,
939 base::Unretained(&wait_event_)),
940 base::TimeDelta::FromMilliseconds(10));
941 wait_event_.Wait();
942
943 base::AutoLock lock(activate_lock_);
944 ++activate_count_; 928 ++activate_count_;
945 } 929 }
946 930
947 virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { 931 virtual void DidCommit() OVERRIDE {
948 // The main thread is awake now, and will run DidCommit() immediately. 932 switch (layer_tree_host()->source_frame_number()) {
949 // Run DidActivate() afterwards by posting it now.
950 proxy()->MainThreadTaskRunner()->PostTask(
951 FROM_HERE,
952 base::Bind(&TextureLayerNoMailboxIsActivatedDuringCommit::DidActivate,
953 base::Unretained(this)));
954 }
955
956 void DidActivate() {
957 base::AutoLock lock(activate_lock_);
958 switch (activate_count_) {
959 case 1: 933 case 1:
960 // The first texture has been activated. Invalidate the layer so it 934 // The first texture has been activated. Invalidate the layer so it
961 // grabs a new texture id from the client. 935 // grabs a new texture id from the client.
962 layer_->SetNeedsDisplay(); 936 layer_->SetNeedsDisplay();
963 // So this commit number should complete after the second activate.
964 EXPECT_EQ(1, layer_tree_host()->source_frame_number());
965 break; 937 break;
966 case 2: 938 case 2:
967 // The second mailbox has been activated. Remove the layer from 939 // The second mailbox has been activated. Remove the layer from
968 // the tree to cause another commit/activation. The commit should 940 // the tree to cause another commit/activation. The commit should
969 // finish *after* the layer is removed from the active tree. 941 // finish *after* the layer is removed from the active tree.
970 layer_->RemoveFromParent(); 942 layer_->RemoveFromParent();
971 // So this commit number should complete after the third activate.
972 EXPECT_EQ(2, layer_tree_host()->source_frame_number());
973 break; 943 break;
974 case 3: 944 case 3:
975 EndTest(); 945 EndTest();
976 break; 946 break;
977 } 947 }
978 } 948 }
979 949
980 virtual void DidCommit() OVERRIDE { 950 virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl)
981 switch (layer_tree_host()->source_frame_number()) { 951 OVERRIDE {
952 switch (host_impl->active_tree()->source_frame_number()) {
982 case 2: { 953 case 2: {
983 // The activate for the 2nd texture should have happened before now. 954 // The activate for the 2nd texture should have happened before now.
984 base::AutoLock lock(activate_lock_);
985 EXPECT_EQ(2, activate_count_); 955 EXPECT_EQ(2, activate_count_);
986 break; 956 break;
987 } 957 }
988 case 3: { 958 case 3: {
989 // The activate to remove the layer should have happened before now. 959 // The activate to remove the layer should have happened before now.
990 base::AutoLock lock(activate_lock_);
991 EXPECT_EQ(3, activate_count_); 960 EXPECT_EQ(3, activate_count_);
992 break; 961 break;
993 } 962 }
994 } 963 }
995 } 964 }
996 965
997
998 virtual void AfterTest() OVERRIDE {} 966 virtual void AfterTest() OVERRIDE {}
999 967
1000 base::Thread wait_thread_;
1001 base::WaitableEvent wait_event_;
1002 base::Lock activate_lock_;
1003 unsigned texture_; 968 unsigned texture_;
1004 int activate_count_; 969 int activate_count_;
1005 scoped_refptr<Layer> root_; 970 scoped_refptr<Layer> root_;
1006 scoped_refptr<TextureLayer> layer_; 971 scoped_refptr<TextureLayer> layer_;
1007 }; 972 };
1008 973
1009 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F( 974 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F(
1010 TextureLayerNoMailboxIsActivatedDuringCommit); 975 TextureLayerNoMailboxIsActivatedDuringCommit);
1011 976
1012 class TextureLayerMailboxIsActivatedDuringCommit : public LayerTreeTest { 977 class TextureLayerMailboxIsActivatedDuringCommit : public LayerTreeTest {
1013 protected: 978 protected:
1014 TextureLayerMailboxIsActivatedDuringCommit() 979 TextureLayerMailboxIsActivatedDuringCommit() : activate_count_(0) {}
1015 : wait_thread_("WAIT"),
1016 wait_event_(false, false) {
1017 wait_thread_.Start();
1018 }
1019 980
1020 static void ReleaseCallback(unsigned sync_point, bool lost_resource) {} 981 static void ReleaseCallback(unsigned sync_point, bool lost_resource) {}
1021 982
1022 void SetMailbox(char mailbox_char) { 983 void SetMailbox(char mailbox_char) {
1023 TextureMailbox mailbox(std::string(64, mailbox_char)); 984 TextureMailbox mailbox(std::string(64, mailbox_char));
1024 scoped_ptr<SingleReleaseCallback> callback = SingleReleaseCallback::Create( 985 scoped_ptr<SingleReleaseCallback> callback = SingleReleaseCallback::Create(
1025 base::Bind( 986 base::Bind(
1026 &TextureLayerMailboxIsActivatedDuringCommit::ReleaseCallback)); 987 &TextureLayerMailboxIsActivatedDuringCommit::ReleaseCallback));
1027 layer_->SetTextureMailbox(mailbox, callback.Pass()); 988 layer_->SetTextureMailbox(mailbox, callback.Pass());
1028 } 989 }
1029 990
1030 virtual void BeginTest() OVERRIDE { 991 virtual void BeginTest() OVERRIDE {
1031 activate_count_ = 0;
1032
1033 gfx::Size bounds(100, 100); 992 gfx::Size bounds(100, 100);
1034 root_ = Layer::Create(); 993 root_ = Layer::Create();
1035 root_->SetAnchorPoint(gfx::PointF()); 994 root_->SetAnchorPoint(gfx::PointF());
1036 root_->SetBounds(bounds); 995 root_->SetBounds(bounds);
1037 996
1038 layer_ = TextureLayer::CreateForMailbox(NULL); 997 layer_ = TextureLayer::CreateForMailbox(NULL);
1039 layer_->SetIsDrawable(true); 998 layer_->SetIsDrawable(true);
1040 layer_->SetAnchorPoint(gfx::PointF()); 999 layer_->SetAnchorPoint(gfx::PointF());
1041 layer_->SetBounds(bounds); 1000 layer_->SetBounds(bounds);
1042 1001
1043 root_->AddChild(layer_); 1002 root_->AddChild(layer_);
1044 layer_tree_host()->SetRootLayer(root_); 1003 layer_tree_host()->SetRootLayer(root_);
1045 layer_tree_host()->SetViewportSize(bounds); 1004 layer_tree_host()->SetViewportSize(bounds);
1046 SetMailbox('1'); 1005 SetMailbox('1');
1047 1006
1048 PostSetNeedsCommitToMainThread(); 1007 PostSetNeedsCommitToMainThread();
1049 } 1008 }
1050 1009
1051 virtual void WillActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { 1010 virtual void WillActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE {
1052 // Slow down activation so the main thread DidCommit() will run if
1053 // not blocked.
1054 wait_thread_.message_loop()->PostDelayedTask(
1055 FROM_HERE,
1056 base::Bind(&base::WaitableEvent::Signal,
1057 base::Unretained(&wait_event_)),
1058 base::TimeDelta::FromMilliseconds(10));
1059 wait_event_.Wait();
1060
1061 base::AutoLock lock(activate_lock_);
1062 ++activate_count_; 1011 ++activate_count_;
1063 } 1012 }
1064 1013
1065 virtual void DidActivateTreeOnThread(LayerTreeHostImpl* impl) OVERRIDE { 1014 virtual void DidCommit() OVERRIDE {
1066 // The main thread is awake now, and will run DidCommit() immediately. 1015 switch (layer_tree_host()->source_frame_number()) {
1067 // Run DidActivate() afterwards by posting it now.
1068 proxy()->MainThreadTaskRunner()->PostTask(
1069 FROM_HERE,
1070 base::Bind(&TextureLayerMailboxIsActivatedDuringCommit::DidActivate,
1071 base::Unretained(this)));
1072 }
1073
1074 void DidActivate() {
1075 base::AutoLock lock(activate_lock_);
1076 switch (activate_count_) {
1077 case 1: 1016 case 1:
1078 // The first mailbox has been activated. Set a new mailbox, and 1017 // The first mailbox has been activated. Set a new mailbox, and
1079 // expect the next commit to finish *after* it is activated. 1018 // expect the next commit to finish *after* it is activated.
1080 SetMailbox('2'); 1019 SetMailbox('2');
1081 // So this commit number should complete after the second activate.
1082 EXPECT_EQ(1, layer_tree_host()->source_frame_number());
1083 break; 1020 break;
1084 case 2: 1021 case 2:
1085 // The second mailbox has been activated. Remove the layer from 1022 // The second mailbox has been activated. Remove the layer from
1086 // the tree to cause another commit/activation. The commit should 1023 // the tree to cause another commit/activation. The commit should
1087 // finish *after* the layer is removed from the active tree. 1024 // finish *after* the layer is removed from the active tree.
1088 layer_->RemoveFromParent(); 1025 layer_->RemoveFromParent();
1089 // So this commit number should complete after the third activate.
1090 EXPECT_EQ(2, layer_tree_host()->source_frame_number());
1091 break; 1026 break;
1092 case 3: 1027 case 3:
1093 EndTest(); 1028 EndTest();
1094 break; 1029 break;
1095 } 1030 }
1096 } 1031 }
1097 1032
1098 virtual void DidCommit() OVERRIDE { 1033 virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl)
1099 switch (layer_tree_host()->source_frame_number()) { 1034 OVERRIDE {
1035 switch (host_impl->active_tree()->source_frame_number()) {
1100 case 2: { 1036 case 2: {
1101 // The activate for the 2nd mailbox should have happened before now. 1037 // The activate for the 2nd mailbox should have happened before now.
1102 base::AutoLock lock(activate_lock_);
1103 EXPECT_EQ(2, activate_count_); 1038 EXPECT_EQ(2, activate_count_);
1104 break; 1039 break;
1105 } 1040 }
1106 case 3: { 1041 case 3: {
1107 // The activate to remove the layer should have happened before now. 1042 // The activate to remove the layer should have happened before now.
1108 base::AutoLock lock(activate_lock_);
1109 EXPECT_EQ(3, activate_count_); 1043 EXPECT_EQ(3, activate_count_);
1110 break; 1044 break;
1111 } 1045 }
1112 } 1046 }
1113 } 1047 }
1114 1048
1115 1049
1116 virtual void AfterTest() OVERRIDE {} 1050 virtual void AfterTest() OVERRIDE {}
1117 1051
1118 base::Thread wait_thread_;
1119 base::WaitableEvent wait_event_;
1120 base::Lock activate_lock_;
1121 int activate_count_; 1052 int activate_count_;
1122 scoped_refptr<Layer> root_; 1053 scoped_refptr<Layer> root_;
1123 scoped_refptr<TextureLayer> layer_; 1054 scoped_refptr<TextureLayer> layer_;
1124 }; 1055 };
1125 1056
1126 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F( 1057 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F(
1127 TextureLayerMailboxIsActivatedDuringCommit); 1058 TextureLayerMailboxIsActivatedDuringCommit);
1128 1059
1129 class TextureLayerImplWithMailboxTest : public TextureLayerTest { 1060 class TextureLayerImplWithMailboxTest : public TextureLayerTest {
1130 protected: 1061 protected:
(...skipping 1024 matching lines...) Expand 10 before | Expand all | Expand 10 after
2155 int callback_count_; 2086 int callback_count_;
2156 scoped_refptr<Layer> root_; 2087 scoped_refptr<Layer> root_;
2157 scoped_refptr<TextureLayer> layer_; 2088 scoped_refptr<TextureLayer> layer_;
2158 }; 2089 };
2159 2090
2160 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F( 2091 SINGLE_AND_MULTI_THREAD_DIRECT_RENDERER_TEST_F(
2161 TextureLayerWithMailboxImplThreadDeleted); 2092 TextureLayerWithMailboxImplThreadDeleted);
2162 2093
2163 } // namespace 2094 } // namespace
2164 } // namespace cc 2095 } // namespace cc
OLDNEW
« no previous file with comments | « no previous file | cc/trees/layer_tree_host_unittest.cc » ('j') | cc/trees/layer_tree_host_unittest_delegated.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698