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

Side by Side Diff: ui/compositor/layer_unittest.cc

Issue 16304003: Unified OutputSurface::SwapBuffers. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase to 205473 Created 7 years, 6 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
« no previous file with comments | « ui/compositor/compositor.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 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 "base/basictypes.h" 5 #include "base/basictypes.h"
6 #include "base/bind.h" 6 #include "base/bind.h"
7 #include "base/compiler_specific.h" 7 #include "base/compiler_specific.h"
8 #include "base/file_util.h" 8 #include "base/file_util.h"
9 #include "base/files/file_path.h" 9 #include "base/files/file_path.h"
10 #include "base/memory/scoped_ptr.h" 10 #include "base/memory/scoped_ptr.h"
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
119 119
120 bool ReadPixels(SkBitmap* bitmap) { 120 bool ReadPixels(SkBitmap* bitmap) {
121 return GetCompositor()->ReadPixels(bitmap, 121 return GetCompositor()->ReadPixels(bitmap,
122 gfx::Rect(GetCompositor()->size())); 122 gfx::Rect(GetCompositor()->size()));
123 } 123 }
124 124
125 void WaitForDraw() { 125 void WaitForDraw() {
126 ui::DrawWaiterForTest::Wait(GetCompositor()); 126 ui::DrawWaiterForTest::Wait(GetCompositor());
127 } 127 }
128 128
129 void WaitForCommit() {
130 ui::DrawWaiterForTest::WaitForCommit(GetCompositor());
131 }
132
129 // Invalidates the entire contents of the layer. 133 // Invalidates the entire contents of the layer.
130 void SchedulePaintForLayer(Layer* layer) { 134 void SchedulePaintForLayer(Layer* layer) {
131 layer->SchedulePaint( 135 layer->SchedulePaint(
132 gfx::Rect(0, 0, layer->bounds().width(), layer->bounds().height())); 136 gfx::Rect(0, 0, layer->bounds().width(), layer->bounds().height()));
133 } 137 }
134 138
135 const base::FilePath& test_data_directory() const { 139 const base::FilePath& test_data_directory() const {
136 return test_data_directory_; 140 return test_data_directory_;
137 } 141 }
138 142
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
247 return base::Closure(); 251 return base::Closure();
248 } 252 }
249 253
250 DISALLOW_COPY_AND_ASSIGN(NullLayerDelegate); 254 DISALLOW_COPY_AND_ASSIGN(NullLayerDelegate);
251 }; 255 };
252 256
253 // Remembers if it has been notified. 257 // Remembers if it has been notified.
254 class TestCompositorObserver : public CompositorObserver { 258 class TestCompositorObserver : public CompositorObserver {
255 public: 259 public:
256 TestCompositorObserver() 260 TestCompositorObserver()
257 : started_(false), ended_(false), aborted_(false) {} 261 : committed_(false), started_(false), ended_(false), aborted_(false) {}
258 262
263 bool committed() const { return committed_; }
259 bool notified() const { return started_ && ended_; } 264 bool notified() const { return started_ && ended_; }
260 bool aborted() const { return aborted_; } 265 bool aborted() const { return aborted_; }
261 266
262 void Reset() { 267 void Reset() {
268 committed_ = false;
263 started_ = false; 269 started_ = false;
264 ended_ = false; 270 ended_ = false;
265 aborted_ = false; 271 aborted_ = false;
266 } 272 }
267 273
268 private: 274 private:
269 virtual void OnCompositingDidCommit(Compositor* compositor) OVERRIDE { 275 virtual void OnCompositingDidCommit(Compositor* compositor) OVERRIDE {
276 committed_ = true;
270 } 277 }
271 278
272 virtual void OnCompositingStarted(Compositor* compositor, 279 virtual void OnCompositingStarted(Compositor* compositor,
273 base::TimeTicks start_time) OVERRIDE { 280 base::TimeTicks start_time) OVERRIDE {
274 started_ = true; 281 started_ = true;
275 } 282 }
276 283
277 virtual void OnCompositingEnded(Compositor* compositor) OVERRIDE { 284 virtual void OnCompositingEnded(Compositor* compositor) OVERRIDE {
278 ended_ = true; 285 ended_ = true;
279 } 286 }
280 287
281 virtual void OnCompositingAborted(Compositor* compositor) OVERRIDE { 288 virtual void OnCompositingAborted(Compositor* compositor) OVERRIDE {
282 aborted_ = true; 289 aborted_ = true;
283 } 290 }
284 291
285 virtual void OnCompositingLockStateChanged(Compositor* compositor) OVERRIDE { 292 virtual void OnCompositingLockStateChanged(Compositor* compositor) OVERRIDE {
286 } 293 }
287 294
288 virtual void OnUpdateVSyncParameters(Compositor* compositor, 295 virtual void OnUpdateVSyncParameters(Compositor* compositor,
289 base::TimeTicks timebase, 296 base::TimeTicks timebase,
290 base::TimeDelta interval) OVERRIDE { 297 base::TimeDelta interval) OVERRIDE {
291 } 298 }
292 299
300 bool committed_;
293 bool started_; 301 bool started_;
294 bool ended_; 302 bool ended_;
295 bool aborted_; 303 bool aborted_;
296 304
297 DISALLOW_COPY_AND_ASSIGN(TestCompositorObserver); 305 DISALLOW_COPY_AND_ASSIGN(TestCompositorObserver);
298 }; 306 };
299 307
300 } // namespace 308 } // namespace
301 309
302 #if defined(OS_WIN) 310 #if defined(OS_WIN)
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
411 // Invokes DrawTree on the compositor. 419 // Invokes DrawTree on the compositor.
412 void Draw() { 420 void Draw() {
413 compositor()->ScheduleDraw(); 421 compositor()->ScheduleDraw();
414 WaitForDraw(); 422 WaitForDraw();
415 } 423 }
416 424
417 void WaitForDraw() { 425 void WaitForDraw() {
418 DrawWaiterForTest::Wait(compositor()); 426 DrawWaiterForTest::Wait(compositor());
419 } 427 }
420 428
429 void WaitForCommit() {
430 DrawWaiterForTest::WaitForCommit(compositor());
431 }
432
421 // CompositorDelegate overrides. 433 // CompositorDelegate overrides.
422 virtual void ScheduleDraw() OVERRIDE { 434 virtual void ScheduleDraw() OVERRIDE {
423 DCHECK(!ui::Compositor::WasInitializedWithThread()); 435 DCHECK(!ui::Compositor::WasInitializedWithThread());
424 if (compositor_) { 436 if (compositor_) {
425 base::MessageLoop::current()->PostTask( 437 base::MessageLoop::current()->PostTask(
426 FROM_HERE, base::Bind(&Compositor::Draw, compositor_->AsWeakPtr())); 438 FROM_HERE, base::Bind(&Compositor::Draw, compositor_->AsWeakPtr()));
427 } 439 }
428 } 440 }
429 441
430 private: 442 private:
(...skipping 381 matching lines...) Expand 10 before | Expand all | Expand 10 after
812 gfx::Rect(10, 10, 350, 350))); 824 gfx::Rect(10, 10, 350, 350)));
813 l1->Add(l2.get()); 825 l1->Add(l2.get());
814 TestCompositorObserver observer; 826 TestCompositorObserver observer;
815 GetCompositor()->AddObserver(&observer); 827 GetCompositor()->AddObserver(&observer);
816 828
817 // Explicitly called DrawTree should cause the observers to be notified. 829 // Explicitly called DrawTree should cause the observers to be notified.
818 // NOTE: this call to DrawTree sets l1 to be the compositor's root layer. 830 // NOTE: this call to DrawTree sets l1 to be the compositor's root layer.
819 DrawTree(l1.get()); 831 DrawTree(l1.get());
820 EXPECT_TRUE(observer.notified()); 832 EXPECT_TRUE(observer.notified());
821 833
822 // As should scheduling a draw and waiting. 834 // ScheduleDraw without any visible change should cause a commit.
823 observer.Reset(); 835 observer.Reset();
824 l1->ScheduleDraw(); 836 l1->ScheduleDraw();
825 WaitForDraw(); 837 WaitForCommit();
826 EXPECT_TRUE(observer.notified()); 838 EXPECT_TRUE(observer.committed());
827 839
828 // Moving, but not resizing, a layer should alert the observers. 840 // Moving, but not resizing, a layer should alert the observers.
829 observer.Reset(); 841 observer.Reset();
830 l2->SetBounds(gfx::Rect(0, 0, 350, 350)); 842 l2->SetBounds(gfx::Rect(0, 0, 350, 350));
831 WaitForDraw(); 843 WaitForDraw();
832 EXPECT_TRUE(observer.notified()); 844 EXPECT_TRUE(observer.notified());
833 845
834 // So should resizing a layer. 846 // So should resizing a layer.
835 observer.Reset(); 847 observer.Reset();
836 l2->SetBounds(gfx::Rect(0, 0, 400, 400)); 848 l2->SetBounds(gfx::Rect(0, 0, 400, 400));
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
910 // WritePNGFile(bitmap, ref_img1); 922 // WritePNGFile(bitmap, ref_img1);
911 EXPECT_TRUE(MatchesPNGFile(bitmap, ref_img1, cc::ExactPixelComparator(true))); 923 EXPECT_TRUE(MatchesPNGFile(bitmap, ref_img1, cc::ExactPixelComparator(true)));
912 924
913 l0->StackAtTop(l11.get()); 925 l0->StackAtTop(l11.get());
914 DrawTree(l0.get()); 926 DrawTree(l0.get());
915 ASSERT_TRUE(ReadPixels(&bitmap)); 927 ASSERT_TRUE(ReadPixels(&bitmap));
916 ASSERT_FALSE(bitmap.empty()); 928 ASSERT_FALSE(bitmap.empty());
917 // WritePNGFile(bitmap, ref_img2); 929 // WritePNGFile(bitmap, ref_img2);
918 EXPECT_TRUE(MatchesPNGFile(bitmap, ref_img2, cc::ExactPixelComparator(true))); 930 EXPECT_TRUE(MatchesPNGFile(bitmap, ref_img2, cc::ExactPixelComparator(true)));
919 931
920 // l11 is already at the front, should have no effect. 932 // should restore to original configuration
933 l0->StackAbove(l12.get(), l11.get());
934 DrawTree(l0.get());
935 ASSERT_TRUE(ReadPixels(&bitmap));
936 ASSERT_FALSE(bitmap.empty());
937 EXPECT_TRUE(MatchesPNGFile(bitmap, ref_img1, cc::ExactPixelComparator(true)));
938
939 // l11 back to front
921 l0->StackAtTop(l11.get()); 940 l0->StackAtTop(l11.get());
922 DrawTree(l0.get()); 941 DrawTree(l0.get());
923 ASSERT_TRUE(ReadPixels(&bitmap)); 942 ASSERT_TRUE(ReadPixels(&bitmap));
924 ASSERT_FALSE(bitmap.empty()); 943 ASSERT_FALSE(bitmap.empty());
925 EXPECT_TRUE(MatchesPNGFile(bitmap, ref_img2, cc::ExactPixelComparator(true)));
926
927 // l11 is already at the front, should have no effect.
928 l0->StackAbove(l11.get(), l12.get());
929 DrawTree(l0.get());
930 ASSERT_TRUE(ReadPixels(&bitmap));
931 ASSERT_FALSE(bitmap.empty());
932 EXPECT_TRUE(MatchesPNGFile(bitmap, ref_img2, cc::ExactPixelComparator(true))); 944 EXPECT_TRUE(MatchesPNGFile(bitmap, ref_img2, cc::ExactPixelComparator(true)));
933 945
934 // should restore to original configuration 946 // should restore to original configuration
935 l0->StackAbove(l12.get(), l11.get()); 947 l0->StackAbove(l12.get(), l11.get());
936 DrawTree(l0.get()); 948 DrawTree(l0.get());
937 ASSERT_TRUE(ReadPixels(&bitmap)); 949 ASSERT_TRUE(ReadPixels(&bitmap));
938 ASSERT_FALSE(bitmap.empty()); 950 ASSERT_FALSE(bitmap.empty());
939 EXPECT_TRUE(MatchesPNGFile(bitmap, ref_img1, cc::ExactPixelComparator(true))); 951 EXPECT_TRUE(MatchesPNGFile(bitmap, ref_img1, cc::ExactPixelComparator(true)));
952
953 // l11 back to front
954 l0->StackAbove(l11.get(), l12.get());
955 DrawTree(l0.get());
956 ASSERT_TRUE(ReadPixels(&bitmap));
957 ASSERT_FALSE(bitmap.empty());
958 EXPECT_TRUE(MatchesPNGFile(bitmap, ref_img2, cc::ExactPixelComparator(true)));
940 } 959 }
941 960
942 // Opacity is rendered correctly. 961 // Opacity is rendered correctly.
943 // Checks that modifying the hierarchy correctly affects final composite. 962 // Checks that modifying the hierarchy correctly affects final composite.
944 TEST_F(LayerWithRealCompositorTest, MAYBE_Opacity) { 963 TEST_F(LayerWithRealCompositorTest, MAYBE_Opacity) {
945 GetCompositor()->SetScaleAndSize(1.0f, gfx::Size(50, 50)); 964 GetCompositor()->SetScaleAndSize(1.0f, gfx::Size(50, 50));
946 965
947 // l0 966 // l0
948 // +-l11 967 // +-l11
949 scoped_ptr<Layer> l0(CreateColorLayer(SK_ColorRED, 968 scoped_ptr<Layer> l0(CreateColorLayer(SK_ColorRED,
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
1026 SchedulePaintLayerDelegate child_delegate; 1045 SchedulePaintLayerDelegate child_delegate;
1027 scoped_ptr<Layer> child(CreateColorLayer(SK_ColorBLUE, 1046 scoped_ptr<Layer> child(CreateColorLayer(SK_ColorBLUE,
1028 gfx::Rect(0, 0, 200, 200))); 1047 gfx::Rect(0, 0, 200, 200)));
1029 child_delegate.set_layer(child.get()); 1048 child_delegate.set_layer(child.get());
1030 1049
1031 root->Add(child.get()); 1050 root->Add(child.get());
1032 1051
1033 SchedulePaintForLayer(root.get()); 1052 SchedulePaintForLayer(root.get());
1034 DrawTree(root.get()); 1053 DrawTree(root.get());
1035 child->SchedulePaint(gfx::Rect(0, 0, 20, 20)); 1054 child->SchedulePaint(gfx::Rect(0, 0, 20, 20));
1036 child_delegate.GetPaintCountAndClear(); 1055 EXPECT_EQ(1, child_delegate.GetPaintCountAndClear());
1037 1056
1038 // Set a rect so that when OnPaintLayer() is invoked SchedulePaint is invoked 1057 // Set a rect so that when OnPaintLayer() is invoked SchedulePaint is invoked
1039 // again. 1058 // again.
1040 child_delegate.SetSchedulePaintRect(gfx::Rect(10, 10, 30, 30)); 1059 child_delegate.SetSchedulePaintRect(gfx::Rect(10, 10, 30, 30));
1041 WaitForDraw(); 1060 WaitForCommit();
1042 // |child| should have been painted once.
1043 EXPECT_EQ(1, child_delegate.GetPaintCountAndClear()); 1061 EXPECT_EQ(1, child_delegate.GetPaintCountAndClear());
1044 1062
1045 // Because SchedulePaint() was invoked from OnPaintLayer() |child| should 1063 // Because SchedulePaint() was invoked from OnPaintLayer() |child| should
1046 // still need to be painted. 1064 // still need to be painted.
1047 WaitForDraw(); 1065 WaitForCommit();
1048 EXPECT_EQ(1, child_delegate.GetPaintCountAndClear()); 1066 EXPECT_EQ(1, child_delegate.GetPaintCountAndClear());
1049 EXPECT_TRUE(child_delegate.last_clip_rect().Contains( 1067 EXPECT_TRUE(child_delegate.last_clip_rect().Contains(
1050 gfx::Rect(10, 10, 30, 30))); 1068 gfx::Rect(10, 10, 30, 30)));
1051 } 1069 }
1052 1070
1053 TEST_F(LayerWithRealCompositorTest, MAYBE_ScaleUpDown) { 1071 TEST_F(LayerWithRealCompositorTest, MAYBE_ScaleUpDown) {
1054 scoped_ptr<Layer> root(CreateColorLayer(SK_ColorWHITE, 1072 scoped_ptr<Layer> root(CreateColorLayer(SK_ColorWHITE,
1055 gfx::Rect(10, 20, 200, 220))); 1073 gfx::Rect(10, 20, 200, 220)));
1056 TestLayerDelegate root_delegate; 1074 TestLayerDelegate root_delegate;
1057 root_delegate.AddColor(SK_ColorWHITE); 1075 root_delegate.AddColor(SK_ColorWHITE);
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
1220 DrawTree(root.get()); 1238 DrawTree(root.get());
1221 1239
1222 // Reset into invisible state. 1240 // Reset into invisible state.
1223 child->SetVisible(false); 1241 child->SetVisible(false);
1224 DrawTree(root.get()); 1242 DrawTree(root.get());
1225 delegate.Reset(); 1243 delegate.Reset();
1226 1244
1227 // Move layer. 1245 // Move layer.
1228 child->SetBounds(gfx::Rect(200, 200, 500, 500)); 1246 child->SetBounds(gfx::Rect(200, 200, 500, 500));
1229 child->SetVisible(true); 1247 child->SetVisible(true);
1230 WaitForDraw();
1231 DrawTree(root.get()); 1248 DrawTree(root.get());
1232 EXPECT_FALSE(delegate.painted()); 1249 EXPECT_FALSE(delegate.painted());
1233 1250
1234 // Reset into invisible state. 1251 // Reset into invisible state.
1235 child->SetVisible(false); 1252 child->SetVisible(false);
1236 DrawTree(root.get()); 1253 DrawTree(root.get());
1237 delegate.Reset(); 1254 delegate.Reset();
1238 1255
1239 // Resize layer. 1256 // Resize layer.
1240 child->SetBounds(gfx::Rect(200, 200, 400, 400)); 1257 child->SetBounds(gfx::Rect(200, 200, 400, 400));
1241 child->SetVisible(true); 1258 child->SetVisible(true);
1242 WaitForDraw();
1243 DrawTree(root.get()); 1259 DrawTree(root.get());
1244 EXPECT_TRUE(delegate.painted()); 1260 EXPECT_TRUE(delegate.painted());
1245 } 1261 }
1246 1262
1247 static scoped_ptr<cc::DelegatedFrameData> MakeFrameData(gfx::Size size) { 1263 static scoped_ptr<cc::DelegatedFrameData> MakeFrameData(gfx::Size size) {
1248 scoped_ptr<cc::DelegatedFrameData> frame_data(new cc::DelegatedFrameData); 1264 scoped_ptr<cc::DelegatedFrameData> frame_data(new cc::DelegatedFrameData);
1249 scoped_ptr<cc::RenderPass> render_pass(cc::RenderPass::Create()); 1265 scoped_ptr<cc::RenderPass> render_pass(cc::RenderPass::Create());
1250 render_pass->SetNew(cc::RenderPass::Id(1, 1), 1266 render_pass->SetNew(cc::RenderPass::Id(1, 1),
1251 gfx::Rect(size), 1267 gfx::Rect(size),
1252 gfx::RectF(), 1268 gfx::RectF(),
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
1359 l1->SetOpacity(0.5f); 1375 l1->SetOpacity(0.5f);
1360 1376
1361 // Change l1's cc::Layer. 1377 // Change l1's cc::Layer.
1362 l1->SwitchCCLayerForTest(); 1378 l1->SwitchCCLayerForTest();
1363 1379
1364 // Ensure that the opacity animation completed. 1380 // Ensure that the opacity animation completed.
1365 EXPECT_FLOAT_EQ(l1->opacity(), 0.5f); 1381 EXPECT_FLOAT_EQ(l1->opacity(), 0.5f);
1366 } 1382 }
1367 1383
1368 } // namespace ui 1384 } // namespace ui
OLDNEW
« no previous file with comments | « ui/compositor/compositor.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698