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

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

Issue 2161323002: cc: Make LayerTreeHostImpl unittests use a delegating output surface. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 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 2011 The Chromium Authors. All rights reserved. 1 // Copyright 2011 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_impl.h" 5 #include "cc/trees/layer_tree_host_impl.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <cmath> 10 #include <cmath>
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
50 #include "cc/test/fake_mask_layer_impl.h" 50 #include "cc/test/fake_mask_layer_impl.h"
51 #include "cc/test/fake_output_surface.h" 51 #include "cc/test/fake_output_surface.h"
52 #include "cc/test/fake_output_surface_client.h" 52 #include "cc/test/fake_output_surface_client.h"
53 #include "cc/test/fake_picture_layer_impl.h" 53 #include "cc/test/fake_picture_layer_impl.h"
54 #include "cc/test/fake_raster_source.h" 54 #include "cc/test/fake_raster_source.h"
55 #include "cc/test/fake_video_frame_provider.h" 55 #include "cc/test/fake_video_frame_provider.h"
56 #include "cc/test/geometry_test_utils.h" 56 #include "cc/test/geometry_test_utils.h"
57 #include "cc/test/gpu_rasterization_enabled_settings.h" 57 #include "cc/test/gpu_rasterization_enabled_settings.h"
58 #include "cc/test/layer_test_common.h" 58 #include "cc/test/layer_test_common.h"
59 #include "cc/test/layer_tree_test.h" 59 #include "cc/test/layer_tree_test.h"
60 #include "cc/test/test_delegating_output_surface.h"
60 #include "cc/test/test_gpu_memory_buffer_manager.h" 61 #include "cc/test/test_gpu_memory_buffer_manager.h"
61 #include "cc/test/test_shared_bitmap_manager.h" 62 #include "cc/test/test_shared_bitmap_manager.h"
62 #include "cc/test/test_task_graph_runner.h" 63 #include "cc/test/test_task_graph_runner.h"
63 #include "cc/test/test_web_graphics_context_3d.h" 64 #include "cc/test/test_web_graphics_context_3d.h"
64 #include "cc/trees/effect_node.h" 65 #include "cc/trees/effect_node.h"
66 #include "cc/trees/layer_tree_host_common.h"
65 #include "cc/trees/layer_tree_impl.h" 67 #include "cc/trees/layer_tree_impl.h"
66 #include "cc/trees/single_thread_proxy.h" 68 #include "cc/trees/single_thread_proxy.h"
67 #include "cc/trees/transform_node.h" 69 #include "cc/trees/transform_node.h"
68 #include "media/base/media.h" 70 #include "media/base/media.h"
69 #include "testing/gmock/include/gmock/gmock.h" 71 #include "testing/gmock/include/gmock/gmock.h"
70 #include "testing/gtest/include/gtest/gtest.h" 72 #include "testing/gtest/include/gtest/gtest.h"
71 #include "third_party/skia/include/core/SkMallocPixelRef.h" 73 #include "third_party/skia/include/core/SkMallocPixelRef.h"
72 #include "ui/gfx/geometry/rect_conversions.h" 74 #include "ui/gfx/geometry/rect_conversions.h"
73 #include "ui/gfx/geometry/size_conversions.h" 75 #include "ui/gfx/geometry/size_conversions.h"
74 #include "ui/gfx/geometry/vector2d_conversions.h" 76 #include "ui/gfx/geometry/vector2d_conversions.h"
(...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after
449 std::unique_ptr<ScrollState> scroll_state( 451 std::unique_ptr<ScrollState> scroll_state(
450 new ScrollState(scroll_state_data)); 452 new ScrollState(scroll_state_data));
451 return scroll_state; 453 return scroll_state;
452 } 454 }
453 455
454 void DrawFrame() { 456 void DrawFrame() {
455 LayerTreeHostImpl::FrameData frame; 457 LayerTreeHostImpl::FrameData frame;
456 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); 458 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
457 host_impl_->DrawLayers(&frame); 459 host_impl_->DrawLayers(&frame);
458 host_impl_->DidDrawAllLayers(frame); 460 host_impl_->DidDrawAllLayers(frame);
461 host_impl_->SwapBuffers(frame);
459 } 462 }
460 463
461 void pinch_zoom_pan_viewport_forces_commit_redraw(float device_scale_factor); 464 void pinch_zoom_pan_viewport_forces_commit_redraw(float device_scale_factor);
462 void pinch_zoom_pan_viewport_test(float device_scale_factor); 465 void pinch_zoom_pan_viewport_test(float device_scale_factor);
463 void pinch_zoom_pan_viewport_and_scroll_test(float device_scale_factor); 466 void pinch_zoom_pan_viewport_and_scroll_test(float device_scale_factor);
464 void pinch_zoom_pan_viewport_and_scroll_boundary_test( 467 void pinch_zoom_pan_viewport_and_scroll_boundary_test(
465 float device_scale_factor); 468 float device_scale_factor);
466 469
467 void SetupMouseMoveAtWithDeviceScale(float device_scale_factor); 470 void SetupMouseMoveAtWithDeviceScale(float device_scale_factor);
468 471
469 scoped_refptr<AnimationTimeline> timeline() { return timeline_; } 472 scoped_refptr<AnimationTimeline> timeline() { return timeline_; }
470 473
471 protected: 474 protected:
472 virtual std::unique_ptr<OutputSurface> CreateOutputSurface() { 475 virtual std::unique_ptr<OutputSurface> CreateOutputSurface() {
473 return FakeOutputSurface::Create3d(); 476 return FakeOutputSurface::CreateDelegating3d();
474 } 477 }
475 478
476 void DrawOneFrame() { 479 void DrawOneFrame() {
477 LayerTreeHostImpl::FrameData frame_data; 480 LayerTreeHostImpl::FrameData frame_data;
478 host_impl_->PrepareToDraw(&frame_data); 481 host_impl_->PrepareToDraw(&frame_data);
479 host_impl_->DidDrawAllLayers(frame_data); 482 host_impl_->DidDrawAllLayers(frame_data);
480 } 483 }
481 484
482 static void SetScrollOffsetDelta(LayerImpl* layer_impl, 485 static void SetScrollOffsetDelta(LayerImpl* layer_impl,
483 const gfx::Vector2dF& delta) { 486 const gfx::Vector2dF& delta) {
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
563 on_can_draw_state_changed_called_ = false; 566 on_can_draw_state_changed_called_ = false;
564 567
565 host_impl_->SetViewportSize(gfx::Size(100, 100)); 568 host_impl_->SetViewportSize(gfx::Size(100, 100));
566 EXPECT_TRUE(host_impl_->CanDraw()); 569 EXPECT_TRUE(host_impl_->CanDraw());
567 EXPECT_TRUE(on_can_draw_state_changed_called_); 570 EXPECT_TRUE(on_can_draw_state_changed_called_);
568 on_can_draw_state_changed_called_ = false; 571 on_can_draw_state_changed_called_ = false;
569 } 572 }
570 573
571 TEST_F(LayerTreeHostImplTest, ResourcelessDrawWithEmptyViewport) { 574 TEST_F(LayerTreeHostImplTest, ResourcelessDrawWithEmptyViewport) {
572 CreateHostImpl(DefaultSettings(), 575 CreateHostImpl(DefaultSettings(),
573 FakeOutputSurface::CreateSoftware( 576 FakeOutputSurface::CreateDelegatingSoftware(
574 base::WrapUnique(new SoftwareOutputDevice()))); 577 base::WrapUnique(new SoftwareOutputDevice())));
575 SetupScrollAndContentsLayers(gfx::Size(100, 100)); 578 SetupScrollAndContentsLayers(gfx::Size(100, 100));
576 host_impl_->active_tree()->BuildPropertyTreesForTesting(); 579 host_impl_->active_tree()->BuildPropertyTreesForTesting();
577 580
578 EXPECT_TRUE(host_impl_->CanDraw()); 581 EXPECT_TRUE(host_impl_->CanDraw());
579 host_impl_->SetViewportSize(gfx::Size()); 582 host_impl_->SetViewportSize(gfx::Size());
580 EXPECT_FALSE(host_impl_->CanDraw()); 583 EXPECT_FALSE(host_impl_->CanDraw());
581 584
582 FakeOutputSurface* fake_output_surface = 585 FakeOutputSurface* fake_output_surface =
583 static_cast<FakeOutputSurface*>(host_impl_->output_surface()); 586 static_cast<FakeOutputSurface*>(host_impl_->output_surface());
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
726 EXPECT_EQ(MainThreadScrollingReason::kNoScrollingLayer, 729 EXPECT_EQ(MainThreadScrollingReason::kNoScrollingLayer,
727 status.main_thread_scrolling_reasons); 730 status.main_thread_scrolling_reasons);
728 } 731 }
729 732
730 TEST_F(LayerTreeHostImplTest, ScrollWithoutRenderer) { 733 TEST_F(LayerTreeHostImplTest, ScrollWithoutRenderer) {
731 std::unique_ptr<TestWebGraphicsContext3D> context_owned = 734 std::unique_ptr<TestWebGraphicsContext3D> context_owned =
732 TestWebGraphicsContext3D::Create(); 735 TestWebGraphicsContext3D::Create();
733 context_owned->set_context_lost(true); 736 context_owned->set_context_lost(true);
734 737
735 // Initialization will fail. 738 // Initialization will fail.
736 EXPECT_FALSE( 739 EXPECT_FALSE(CreateHostImpl(
737 CreateHostImpl(DefaultSettings(), 740 DefaultSettings(),
738 FakeOutputSurface::Create3d(std::move(context_owned)))); 741 FakeOutputSurface::CreateDelegating3d(std::move(context_owned))));
739 742
740 SetupScrollAndContentsLayers(gfx::Size(100, 100)); 743 SetupScrollAndContentsLayers(gfx::Size(100, 100));
741 744
742 // We should not crash when trying to scroll after the renderer initialization 745 // We should not crash when trying to scroll after the renderer initialization
743 // fails. 746 // fails.
744 InputHandler::ScrollStatus status = host_impl_->ScrollBegin( 747 InputHandler::ScrollStatus status = host_impl_->ScrollBegin(
745 BeginState(gfx::Point()).get(), InputHandler::WHEEL); 748 BeginState(gfx::Point()).get(), InputHandler::WHEEL);
746 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); 749 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread);
747 EXPECT_EQ(MainThreadScrollingReason::kNotScrollingOnMain, 750 EXPECT_EQ(MainThreadScrollingReason::kNotScrollingOnMain,
748 status.main_thread_scrolling_reasons); 751 status.main_thread_scrolling_reasons);
(...skipping 2672 matching lines...) Expand 10 before | Expand all | Expand 10 after
3421 DidDrawCheckLayer::Create(host_impl_->active_tree(), 2)); 3424 DidDrawCheckLayer::Create(host_impl_->active_tree(), 2));
3422 root->test_properties()->force_render_surface = true; 3425 root->test_properties()->force_render_surface = true;
3423 DidDrawCheckLayer* layer = 3426 DidDrawCheckLayer* layer =
3424 static_cast<DidDrawCheckLayer*>(root->test_properties()->children[0]); 3427 static_cast<DidDrawCheckLayer*>(root->test_properties()->children[0]);
3425 host_impl_->active_tree()->BuildPropertyTreesForTesting(); 3428 host_impl_->active_tree()->BuildPropertyTreesForTesting();
3426 3429
3427 { 3430 {
3428 LayerTreeHostImpl::FrameData frame; 3431 LayerTreeHostImpl::FrameData frame;
3429 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); 3432 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
3430 host_impl_->DrawLayers(&frame); 3433 host_impl_->DrawLayers(&frame);
3434 host_impl_->SwapBuffers(frame);
3431 host_impl_->DidDrawAllLayers(frame); 3435 host_impl_->DidDrawAllLayers(frame);
3432 3436
3433 EXPECT_TRUE(layer->will_draw_called()); 3437 EXPECT_TRUE(layer->will_draw_called());
3434 EXPECT_TRUE(layer->append_quads_called()); 3438 EXPECT_TRUE(layer->append_quads_called());
3435 EXPECT_TRUE(layer->did_draw_called()); 3439 EXPECT_TRUE(layer->did_draw_called());
3436 } 3440 }
3437 3441
3438 host_impl_->SetViewportDamage(gfx::Rect(10, 10)); 3442 host_impl_->SetViewportDamage(gfx::Rect(10, 10));
3439 3443
3440 { 3444 {
3441 LayerTreeHostImpl::FrameData frame; 3445 LayerTreeHostImpl::FrameData frame;
3442 3446
3443 layer->set_will_draw_returns_false(); 3447 layer->set_will_draw_returns_false();
3444 layer->ClearDidDrawCheck(); 3448 layer->ClearDidDrawCheck();
3445 3449
3446 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); 3450 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
3447 host_impl_->DrawLayers(&frame); 3451 host_impl_->DrawLayers(&frame);
3452 host_impl_->SwapBuffers(frame);
3448 host_impl_->DidDrawAllLayers(frame); 3453 host_impl_->DidDrawAllLayers(frame);
3449 3454
3450 EXPECT_TRUE(layer->will_draw_called()); 3455 EXPECT_TRUE(layer->will_draw_called());
3451 EXPECT_FALSE(layer->append_quads_called()); 3456 EXPECT_FALSE(layer->append_quads_called());
3452 EXPECT_FALSE(layer->did_draw_called()); 3457 EXPECT_FALSE(layer->did_draw_called());
3453 } 3458 }
3454 } 3459 }
3455 3460
3456 TEST_F(LayerTreeHostImplTest, DidDrawNotCalledOnHiddenLayer) { 3461 TEST_F(LayerTreeHostImplTest, DidDrawNotCalledOnHiddenLayer) {
3457 // The root layer is always drawn, so run this test on a child layer that 3462 // The root layer is always drawn, so run this test on a child layer that
(...skipping 13 matching lines...) Expand all
3471 layer->SetBounds(gfx::Size(10, 10)); 3476 layer->SetBounds(gfx::Size(10, 10));
3472 host_impl_->active_tree()->BuildPropertyTreesForTesting(); 3477 host_impl_->active_tree()->BuildPropertyTreesForTesting();
3473 3478
3474 LayerTreeHostImpl::FrameData frame; 3479 LayerTreeHostImpl::FrameData frame;
3475 3480
3476 EXPECT_FALSE(layer->will_draw_called()); 3481 EXPECT_FALSE(layer->will_draw_called());
3477 EXPECT_FALSE(layer->did_draw_called()); 3482 EXPECT_FALSE(layer->did_draw_called());
3478 3483
3479 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); 3484 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
3480 host_impl_->DrawLayers(&frame); 3485 host_impl_->DrawLayers(&frame);
3486 host_impl_->SwapBuffers(frame);
3481 host_impl_->DidDrawAllLayers(frame); 3487 host_impl_->DidDrawAllLayers(frame);
3482 3488
3483 EXPECT_FALSE(layer->will_draw_called()); 3489 EXPECT_FALSE(layer->will_draw_called());
3484 EXPECT_FALSE(layer->did_draw_called()); 3490 EXPECT_FALSE(layer->did_draw_called());
3485 3491
3486 EXPECT_TRUE(layer->visible_layer_rect().IsEmpty()); 3492 EXPECT_TRUE(layer->visible_layer_rect().IsEmpty());
3487 3493
3488 // Ensure visible_layer_rect for layer is not empty 3494 // Ensure visible_layer_rect for layer is not empty
3489 layer->SetPosition(gfx::PointF()); 3495 layer->SetPosition(gfx::PointF());
3490 layer->NoteLayerPropertyChanged(); 3496 layer->NoteLayerPropertyChanged();
3491 host_impl_->active_tree()->BuildPropertyTreesForTesting(); 3497 host_impl_->active_tree()->BuildPropertyTreesForTesting();
3492 3498
3493 EXPECT_FALSE(layer->will_draw_called()); 3499 EXPECT_FALSE(layer->will_draw_called());
3494 EXPECT_FALSE(layer->did_draw_called()); 3500 EXPECT_FALSE(layer->did_draw_called());
3495 3501
3496 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); 3502 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
3497 host_impl_->DrawLayers(&frame); 3503 host_impl_->DrawLayers(&frame);
3504 host_impl_->SwapBuffers(frame);
3498 host_impl_->DidDrawAllLayers(frame); 3505 host_impl_->DidDrawAllLayers(frame);
3499 3506
3500 EXPECT_TRUE(layer->will_draw_called()); 3507 EXPECT_TRUE(layer->will_draw_called());
3501 EXPECT_TRUE(layer->did_draw_called()); 3508 EXPECT_TRUE(layer->did_draw_called());
3502 3509
3503 EXPECT_FALSE(layer->visible_layer_rect().IsEmpty()); 3510 EXPECT_FALSE(layer->visible_layer_rect().IsEmpty());
3504 } 3511 }
3505 3512
3506 TEST_F(LayerTreeHostImplTest, WillDrawNotCalledOnOccludedLayer) { 3513 TEST_F(LayerTreeHostImplTest, WillDrawNotCalledOnOccludedLayer) {
3507 gfx::Size big_size(1000, 1000); 3514 gfx::Size big_size(1000, 1000);
(...skipping 22 matching lines...) Expand all
3530 3537
3531 LayerTreeHostImpl::FrameData frame; 3538 LayerTreeHostImpl::FrameData frame;
3532 3539
3533 EXPECT_FALSE(occluded_layer->will_draw_called()); 3540 EXPECT_FALSE(occluded_layer->will_draw_called());
3534 EXPECT_FALSE(occluded_layer->did_draw_called()); 3541 EXPECT_FALSE(occluded_layer->did_draw_called());
3535 EXPECT_FALSE(top_layer->will_draw_called()); 3542 EXPECT_FALSE(top_layer->will_draw_called());
3536 EXPECT_FALSE(top_layer->did_draw_called()); 3543 EXPECT_FALSE(top_layer->did_draw_called());
3537 3544
3538 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); 3545 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
3539 host_impl_->DrawLayers(&frame); 3546 host_impl_->DrawLayers(&frame);
3547 host_impl_->SwapBuffers(frame);
3540 host_impl_->DidDrawAllLayers(frame); 3548 host_impl_->DidDrawAllLayers(frame);
3541 3549
3542 EXPECT_FALSE(occluded_layer->will_draw_called()); 3550 EXPECT_FALSE(occluded_layer->will_draw_called());
3543 EXPECT_FALSE(occluded_layer->did_draw_called()); 3551 EXPECT_FALSE(occluded_layer->did_draw_called());
3544 EXPECT_TRUE(top_layer->will_draw_called()); 3552 EXPECT_TRUE(top_layer->will_draw_called());
3545 EXPECT_TRUE(top_layer->did_draw_called()); 3553 EXPECT_TRUE(top_layer->did_draw_called());
3546 } 3554 }
3547 3555
3548 TEST_F(LayerTreeHostImplTest, DidDrawCalledOnAllLayers) { 3556 TEST_F(LayerTreeHostImplTest, DidDrawCalledOnAllLayers) {
3549 host_impl_->active_tree()->SetRootLayerForTesting( 3557 host_impl_->active_tree()->SetRootLayerForTesting(
(...skipping 18 matching lines...) Expand all
3568 3576
3569 EXPECT_FALSE(root->did_draw_called()); 3577 EXPECT_FALSE(root->did_draw_called());
3570 EXPECT_FALSE(layer1->did_draw_called()); 3578 EXPECT_FALSE(layer1->did_draw_called());
3571 EXPECT_FALSE(layer2->did_draw_called()); 3579 EXPECT_FALSE(layer2->did_draw_called());
3572 3580
3573 LayerTreeHostImpl::FrameData frame; 3581 LayerTreeHostImpl::FrameData frame;
3574 FakeLayerTreeHostImpl::RecursiveUpdateNumChildren( 3582 FakeLayerTreeHostImpl::RecursiveUpdateNumChildren(
3575 *host_impl_->active_tree()->begin()); 3583 *host_impl_->active_tree()->begin());
3576 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); 3584 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
3577 host_impl_->DrawLayers(&frame); 3585 host_impl_->DrawLayers(&frame);
3586 host_impl_->SwapBuffers(frame);
3578 host_impl_->DidDrawAllLayers(frame); 3587 host_impl_->DidDrawAllLayers(frame);
3579 3588
3580 EXPECT_TRUE(root->did_draw_called()); 3589 EXPECT_TRUE(root->did_draw_called());
3581 EXPECT_TRUE(layer1->did_draw_called()); 3590 EXPECT_TRUE(layer1->did_draw_called());
3582 EXPECT_TRUE(layer2->did_draw_called()); 3591 EXPECT_TRUE(layer2->did_draw_called());
3583 3592
3584 EXPECT_NE(root->render_surface(), layer1->render_surface()); 3593 EXPECT_NE(root->render_surface(), layer1->render_surface());
3585 EXPECT_TRUE(layer1->render_surface()); 3594 EXPECT_TRUE(layer1->render_surface());
3586 } 3595 }
3587 3596
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after
3784 EXPECT_EQ(testcase.expected_result, host_impl_->PrepareToDraw(&frame)); 3793 EXPECT_EQ(testcase.expected_result, host_impl_->PrepareToDraw(&frame));
3785 host_impl_->DrawLayers(&frame); 3794 host_impl_->DrawLayers(&frame);
3786 host_impl_->DidDrawAllLayers(frame); 3795 host_impl_->DidDrawAllLayers(frame);
3787 host_impl_->SwapBuffers(frame); 3796 host_impl_->SwapBuffers(frame);
3788 } 3797 }
3789 } 3798 }
3790 3799
3791 TEST_F(LayerTreeHostImplTest, 3800 TEST_F(LayerTreeHostImplTest,
3792 PrepareToDrawWhenDrawAndSwapFullViewportEveryFrame) { 3801 PrepareToDrawWhenDrawAndSwapFullViewportEveryFrame) {
3793 CreateHostImpl(DefaultSettings(), 3802 CreateHostImpl(DefaultSettings(),
3794 FakeOutputSurface::CreateSoftware( 3803 FakeOutputSurface::CreateDelegatingSoftware(
3795 base::WrapUnique(new SoftwareOutputDevice()))); 3804 base::WrapUnique(new SoftwareOutputDevice())));
3796 3805
3797 const gfx::Transform external_transform; 3806 const gfx::Transform external_transform;
3798 const gfx::Rect external_viewport; 3807 const gfx::Rect external_viewport;
3799 const gfx::Rect external_clip; 3808 const gfx::Rect external_clip;
3800 const bool resourceless_software_draw = true; 3809 const bool resourceless_software_draw = true;
3801 host_impl_->SetExternalTilePriorityConstraints(external_viewport, 3810 host_impl_->SetExternalTilePriorityConstraints(external_viewport,
3802 external_transform); 3811 external_transform);
3803 3812
3804 std::vector<PrepareToDrawSuccessTestCase> cases; 3813 std::vector<PrepareToDrawSuccessTestCase> cases;
(...skipping 2661 matching lines...) Expand 10 before | Expand all | Expand 10 after
6466 6475
6467 // Opaque layer, drawn without blending. 6476 // Opaque layer, drawn without blending.
6468 layer1->SetContentsOpaque(true); 6477 layer1->SetContentsOpaque(true);
6469 layer1->SetExpectation(false, false); 6478 layer1->SetExpectation(false, false);
6470 layer1->SetUpdateRect(gfx::Rect(layer1->bounds())); 6479 layer1->SetUpdateRect(gfx::Rect(layer1->bounds()));
6471 host_impl_->active_tree()->BuildPropertyTreesForTesting(); 6480 host_impl_->active_tree()->BuildPropertyTreesForTesting();
6472 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); 6481 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
6473 host_impl_->DrawLayers(&frame); 6482 host_impl_->DrawLayers(&frame);
6474 EXPECT_TRUE(layer1->quads_appended()); 6483 EXPECT_TRUE(layer1->quads_appended());
6475 host_impl_->DidDrawAllLayers(frame); 6484 host_impl_->DidDrawAllLayers(frame);
6485 host_impl_->SwapBuffers(frame);
6476 6486
6477 // Layer with translucent content and painting, so drawn with blending. 6487 // Layer with translucent content and painting, so drawn with blending.
6478 layer1->SetContentsOpaque(false); 6488 layer1->SetContentsOpaque(false);
6479 layer1->SetExpectation(true, false); 6489 layer1->SetExpectation(true, false);
6480 layer1->SetUpdateRect(gfx::Rect(layer1->bounds())); 6490 layer1->SetUpdateRect(gfx::Rect(layer1->bounds()));
6481 host_impl_->active_tree()->BuildPropertyTreesForTesting(); 6491 host_impl_->active_tree()->BuildPropertyTreesForTesting();
6482 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); 6492 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
6483 host_impl_->DrawLayers(&frame); 6493 host_impl_->DrawLayers(&frame);
6494 host_impl_->SwapBuffers(frame);
6484 EXPECT_TRUE(layer1->quads_appended()); 6495 EXPECT_TRUE(layer1->quads_appended());
6485 host_impl_->DidDrawAllLayers(frame); 6496 host_impl_->DidDrawAllLayers(frame);
6486 6497
6487 // Layer with translucent opacity, drawn with blending. 6498 // Layer with translucent opacity, drawn with blending.
6488 layer1->SetContentsOpaque(true); 6499 layer1->SetContentsOpaque(true);
6489 layer1->test_properties()->opacity = 0.5f; 6500 layer1->test_properties()->opacity = 0.5f;
6490 layer1->NoteLayerPropertyChanged(); 6501 layer1->NoteLayerPropertyChanged();
6491 layer1->SetExpectation(true, false); 6502 layer1->SetExpectation(true, false);
6492 layer1->SetUpdateRect(gfx::Rect(layer1->bounds())); 6503 layer1->SetUpdateRect(gfx::Rect(layer1->bounds()));
6493 host_impl_->active_tree()->BuildPropertyTreesForTesting(); 6504 host_impl_->active_tree()->BuildPropertyTreesForTesting();
6494 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); 6505 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
6495 host_impl_->DrawLayers(&frame); 6506 host_impl_->DrawLayers(&frame);
6507 host_impl_->SwapBuffers(frame);
6496 EXPECT_TRUE(layer1->quads_appended()); 6508 EXPECT_TRUE(layer1->quads_appended());
6497 host_impl_->DidDrawAllLayers(frame); 6509 host_impl_->DidDrawAllLayers(frame);
6498 6510
6499 // Layer with translucent opacity and painting, drawn with blending. 6511 // Layer with translucent opacity and painting, drawn with blending.
6500 layer1->SetContentsOpaque(true); 6512 layer1->SetContentsOpaque(true);
6501 layer1->test_properties()->opacity = 0.5f; 6513 layer1->test_properties()->opacity = 0.5f;
6502 layer1->NoteLayerPropertyChanged(); 6514 layer1->NoteLayerPropertyChanged();
6503 layer1->SetExpectation(true, false); 6515 layer1->SetExpectation(true, false);
6504 layer1->SetUpdateRect(gfx::Rect(layer1->bounds())); 6516 layer1->SetUpdateRect(gfx::Rect(layer1->bounds()));
6505 host_impl_->active_tree()->BuildPropertyTreesForTesting(); 6517 host_impl_->active_tree()->BuildPropertyTreesForTesting();
6506 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); 6518 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
6507 host_impl_->DrawLayers(&frame); 6519 host_impl_->DrawLayers(&frame);
6520 host_impl_->SwapBuffers(frame);
6508 EXPECT_TRUE(layer1->quads_appended()); 6521 EXPECT_TRUE(layer1->quads_appended());
6509 host_impl_->DidDrawAllLayers(frame); 6522 host_impl_->DidDrawAllLayers(frame);
6510 6523
6511 layer1->test_properties()->AddChild(BlendStateCheckLayer::Create( 6524 layer1->test_properties()->AddChild(BlendStateCheckLayer::Create(
6512 host_impl_->active_tree(), 3, host_impl_->resource_provider())); 6525 host_impl_->active_tree(), 3, host_impl_->resource_provider()));
6513 BlendStateCheckLayer* layer2 = static_cast<BlendStateCheckLayer*>( 6526 BlendStateCheckLayer* layer2 = static_cast<BlendStateCheckLayer*>(
6514 layer1->test_properties()->children[0]); 6527 layer1->test_properties()->children[0]);
6515 layer2->SetPosition(gfx::PointF(4.f, 4.f)); 6528 layer2->SetPosition(gfx::PointF(4.f, 4.f));
6516 6529
6517 // 2 opaque layers, drawn without blending. 6530 // 2 opaque layers, drawn without blending.
6518 layer1->SetContentsOpaque(true); 6531 layer1->SetContentsOpaque(true);
6519 layer1->test_properties()->opacity = 1.f; 6532 layer1->test_properties()->opacity = 1.f;
6520 layer1->NoteLayerPropertyChanged(); 6533 layer1->NoteLayerPropertyChanged();
6521 layer1->SetExpectation(false, false); 6534 layer1->SetExpectation(false, false);
6522 layer1->SetUpdateRect(gfx::Rect(layer1->bounds())); 6535 layer1->SetUpdateRect(gfx::Rect(layer1->bounds()));
6523 layer2->SetContentsOpaque(true); 6536 layer2->SetContentsOpaque(true);
6524 layer2->test_properties()->opacity = 1.f; 6537 layer2->test_properties()->opacity = 1.f;
6525 layer2->NoteLayerPropertyChanged(); 6538 layer2->NoteLayerPropertyChanged();
6526 layer2->SetExpectation(false, false); 6539 layer2->SetExpectation(false, false);
6527 layer2->SetUpdateRect(gfx::Rect(layer1->bounds())); 6540 layer2->SetUpdateRect(gfx::Rect(layer1->bounds()));
6528 host_impl_->active_tree()->BuildPropertyTreesForTesting(); 6541 host_impl_->active_tree()->BuildPropertyTreesForTesting();
6529 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); 6542 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
6530 host_impl_->DrawLayers(&frame); 6543 host_impl_->DrawLayers(&frame);
6544 host_impl_->SwapBuffers(frame);
6531 EXPECT_TRUE(layer1->quads_appended()); 6545 EXPECT_TRUE(layer1->quads_appended());
6532 EXPECT_TRUE(layer2->quads_appended()); 6546 EXPECT_TRUE(layer2->quads_appended());
6533 host_impl_->DidDrawAllLayers(frame); 6547 host_impl_->DidDrawAllLayers(frame);
6534 6548
6535 // Parent layer with translucent content, drawn with blending. 6549 // Parent layer with translucent content, drawn with blending.
6536 // Child layer with opaque content, drawn without blending. 6550 // Child layer with opaque content, drawn without blending.
6537 layer1->SetContentsOpaque(false); 6551 layer1->SetContentsOpaque(false);
6538 layer1->SetExpectation(true, false); 6552 layer1->SetExpectation(true, false);
6539 layer1->SetUpdateRect(gfx::Rect(layer1->bounds())); 6553 layer1->SetUpdateRect(gfx::Rect(layer1->bounds()));
6540 layer2->SetExpectation(false, false); 6554 layer2->SetExpectation(false, false);
6541 layer2->SetUpdateRect(gfx::Rect(layer1->bounds())); 6555 layer2->SetUpdateRect(gfx::Rect(layer1->bounds()));
6542 host_impl_->active_tree()->BuildPropertyTreesForTesting(); 6556 host_impl_->active_tree()->BuildPropertyTreesForTesting();
6543 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); 6557 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
6544 host_impl_->DrawLayers(&frame); 6558 host_impl_->DrawLayers(&frame);
6559 host_impl_->SwapBuffers(frame);
6545 EXPECT_TRUE(layer1->quads_appended()); 6560 EXPECT_TRUE(layer1->quads_appended());
6546 EXPECT_TRUE(layer2->quads_appended()); 6561 EXPECT_TRUE(layer2->quads_appended());
6547 host_impl_->DidDrawAllLayers(frame); 6562 host_impl_->DidDrawAllLayers(frame);
6548 6563
6549 // Parent layer with translucent content but opaque painting, drawn without 6564 // Parent layer with translucent content but opaque painting, drawn without
6550 // blending. 6565 // blending.
6551 // Child layer with opaque content, drawn without blending. 6566 // Child layer with opaque content, drawn without blending.
6552 layer1->SetContentsOpaque(true); 6567 layer1->SetContentsOpaque(true);
6553 layer1->SetExpectation(false, false); 6568 layer1->SetExpectation(false, false);
6554 layer1->SetUpdateRect(gfx::Rect(layer1->bounds())); 6569 layer1->SetUpdateRect(gfx::Rect(layer1->bounds()));
6555 layer2->SetExpectation(false, false); 6570 layer2->SetExpectation(false, false);
6556 layer2->SetUpdateRect(gfx::Rect(layer1->bounds())); 6571 layer2->SetUpdateRect(gfx::Rect(layer1->bounds()));
6557 host_impl_->active_tree()->BuildPropertyTreesForTesting(); 6572 host_impl_->active_tree()->BuildPropertyTreesForTesting();
6558 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); 6573 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
6559 host_impl_->DrawLayers(&frame); 6574 host_impl_->DrawLayers(&frame);
6575 host_impl_->SwapBuffers(frame);
6560 EXPECT_TRUE(layer1->quads_appended()); 6576 EXPECT_TRUE(layer1->quads_appended());
6561 EXPECT_TRUE(layer2->quads_appended()); 6577 EXPECT_TRUE(layer2->quads_appended());
6562 host_impl_->DidDrawAllLayers(frame); 6578 host_impl_->DidDrawAllLayers(frame);
6563 6579
6564 // Parent layer with translucent opacity and opaque content. Since it has a 6580 // Parent layer with translucent opacity and opaque content. Since it has a
6565 // drawing child, it's drawn to a render surface which carries the opacity, 6581 // drawing child, it's drawn to a render surface which carries the opacity,
6566 // so it's itself drawn without blending. 6582 // so it's itself drawn without blending.
6567 // Child layer with opaque content, drawn without blending (parent surface 6583 // Child layer with opaque content, drawn without blending (parent surface
6568 // carries the inherited opacity). 6584 // carries the inherited opacity).
6569 layer1->SetContentsOpaque(true); 6585 layer1->SetContentsOpaque(true);
6570 layer1->test_properties()->opacity = 0.5f; 6586 layer1->test_properties()->opacity = 0.5f;
6571 layer1->NoteLayerPropertyChanged(); 6587 layer1->NoteLayerPropertyChanged();
6572 layer1->test_properties()->force_render_surface = true; 6588 layer1->test_properties()->force_render_surface = true;
6573 layer1->SetExpectation(false, true); 6589 layer1->SetExpectation(false, true);
6574 layer1->SetUpdateRect(gfx::Rect(layer1->bounds())); 6590 layer1->SetUpdateRect(gfx::Rect(layer1->bounds()));
6575 layer2->SetExpectation(false, false); 6591 layer2->SetExpectation(false, false);
6576 layer2->SetUpdateRect(gfx::Rect(layer1->bounds())); 6592 layer2->SetUpdateRect(gfx::Rect(layer1->bounds()));
6577 FakeLayerTreeHostImpl::RecursiveUpdateNumChildren( 6593 FakeLayerTreeHostImpl::RecursiveUpdateNumChildren(
6578 host_impl_->active_tree()->root_layer_for_testing()); 6594 host_impl_->active_tree()->root_layer_for_testing());
6579 host_impl_->active_tree()->BuildPropertyTreesForTesting(); 6595 host_impl_->active_tree()->BuildPropertyTreesForTesting();
6580 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); 6596 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
6581 host_impl_->DrawLayers(&frame); 6597 host_impl_->DrawLayers(&frame);
6598 host_impl_->SwapBuffers(frame);
6582 EXPECT_TRUE(layer1->quads_appended()); 6599 EXPECT_TRUE(layer1->quads_appended());
6583 EXPECT_TRUE(layer2->quads_appended()); 6600 EXPECT_TRUE(layer2->quads_appended());
6584 host_impl_->DidDrawAllLayers(frame); 6601 host_impl_->DidDrawAllLayers(frame);
6585 layer1->test_properties()->force_render_surface = false; 6602 layer1->test_properties()->force_render_surface = false;
6586 6603
6587 // Draw again, but with child non-opaque, to make sure 6604 // Draw again, but with child non-opaque, to make sure
6588 // layer1 not culled. 6605 // layer1 not culled.
6589 layer1->SetContentsOpaque(true); 6606 layer1->SetContentsOpaque(true);
6590 layer1->test_properties()->opacity = 1.f; 6607 layer1->test_properties()->opacity = 1.f;
6591 layer1->NoteLayerPropertyChanged(); 6608 layer1->NoteLayerPropertyChanged();
6592 layer1->SetExpectation(false, false); 6609 layer1->SetExpectation(false, false);
6593 layer1->SetUpdateRect(gfx::Rect(layer1->bounds())); 6610 layer1->SetUpdateRect(gfx::Rect(layer1->bounds()));
6594 layer2->SetContentsOpaque(true); 6611 layer2->SetContentsOpaque(true);
6595 layer2->test_properties()->opacity = 0.5f; 6612 layer2->test_properties()->opacity = 0.5f;
6596 layer2->NoteLayerPropertyChanged(); 6613 layer2->NoteLayerPropertyChanged();
6597 layer2->SetExpectation(true, false); 6614 layer2->SetExpectation(true, false);
6598 layer2->SetUpdateRect(gfx::Rect(layer1->bounds())); 6615 layer2->SetUpdateRect(gfx::Rect(layer1->bounds()));
6599 host_impl_->active_tree()->BuildPropertyTreesForTesting(); 6616 host_impl_->active_tree()->BuildPropertyTreesForTesting();
6600 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); 6617 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
6601 host_impl_->DrawLayers(&frame); 6618 host_impl_->DrawLayers(&frame);
6619 host_impl_->SwapBuffers(frame);
6602 EXPECT_TRUE(layer1->quads_appended()); 6620 EXPECT_TRUE(layer1->quads_appended());
6603 EXPECT_TRUE(layer2->quads_appended()); 6621 EXPECT_TRUE(layer2->quads_appended());
6604 host_impl_->DidDrawAllLayers(frame); 6622 host_impl_->DidDrawAllLayers(frame);
6605 6623
6606 // A second way of making the child non-opaque. 6624 // A second way of making the child non-opaque.
6607 layer1->SetContentsOpaque(true); 6625 layer1->SetContentsOpaque(true);
6608 layer1->test_properties()->opacity = 1.f; 6626 layer1->test_properties()->opacity = 1.f;
6609 layer1->NoteLayerPropertyChanged(); 6627 layer1->NoteLayerPropertyChanged();
6610 layer1->SetExpectation(false, false); 6628 layer1->SetExpectation(false, false);
6611 layer1->SetUpdateRect(gfx::Rect(layer1->bounds())); 6629 layer1->SetUpdateRect(gfx::Rect(layer1->bounds()));
6612 layer2->SetContentsOpaque(false); 6630 layer2->SetContentsOpaque(false);
6613 layer2->test_properties()->opacity = 1.f; 6631 layer2->test_properties()->opacity = 1.f;
6614 layer2->NoteLayerPropertyChanged(); 6632 layer2->NoteLayerPropertyChanged();
6615 layer2->SetExpectation(true, false); 6633 layer2->SetExpectation(true, false);
6616 layer2->SetUpdateRect(gfx::Rect(layer1->bounds())); 6634 layer2->SetUpdateRect(gfx::Rect(layer1->bounds()));
6617 host_impl_->active_tree()->BuildPropertyTreesForTesting(); 6635 host_impl_->active_tree()->BuildPropertyTreesForTesting();
6618 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); 6636 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
6619 host_impl_->DrawLayers(&frame); 6637 host_impl_->DrawLayers(&frame);
6638 host_impl_->SwapBuffers(frame);
6620 EXPECT_TRUE(layer1->quads_appended()); 6639 EXPECT_TRUE(layer1->quads_appended());
6621 EXPECT_TRUE(layer2->quads_appended()); 6640 EXPECT_TRUE(layer2->quads_appended());
6622 host_impl_->DidDrawAllLayers(frame); 6641 host_impl_->DidDrawAllLayers(frame);
6623 6642
6624 // And when the layer says its not opaque but is painted opaque, it is not 6643 // And when the layer says its not opaque but is painted opaque, it is not
6625 // blended. 6644 // blended.
6626 layer1->SetContentsOpaque(true); 6645 layer1->SetContentsOpaque(true);
6627 layer1->test_properties()->opacity = 1.f; 6646 layer1->test_properties()->opacity = 1.f;
6628 layer1->NoteLayerPropertyChanged(); 6647 layer1->NoteLayerPropertyChanged();
6629 layer1->SetExpectation(false, false); 6648 layer1->SetExpectation(false, false);
6630 layer1->SetUpdateRect(gfx::Rect(layer1->bounds())); 6649 layer1->SetUpdateRect(gfx::Rect(layer1->bounds()));
6631 layer2->SetContentsOpaque(true); 6650 layer2->SetContentsOpaque(true);
6632 layer2->test_properties()->opacity = 1.f; 6651 layer2->test_properties()->opacity = 1.f;
6633 layer2->NoteLayerPropertyChanged(); 6652 layer2->NoteLayerPropertyChanged();
6634 layer2->SetExpectation(false, false); 6653 layer2->SetExpectation(false, false);
6635 layer2->SetUpdateRect(gfx::Rect(layer1->bounds())); 6654 layer2->SetUpdateRect(gfx::Rect(layer1->bounds()));
6636 host_impl_->active_tree()->BuildPropertyTreesForTesting(); 6655 host_impl_->active_tree()->BuildPropertyTreesForTesting();
6637 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); 6656 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
6638 host_impl_->DrawLayers(&frame); 6657 host_impl_->DrawLayers(&frame);
6658 host_impl_->SwapBuffers(frame);
6639 EXPECT_TRUE(layer1->quads_appended()); 6659 EXPECT_TRUE(layer1->quads_appended());
6640 EXPECT_TRUE(layer2->quads_appended()); 6660 EXPECT_TRUE(layer2->quads_appended());
6641 host_impl_->DidDrawAllLayers(frame); 6661 host_impl_->DidDrawAllLayers(frame);
6642 6662
6643 // Layer with partially opaque contents, drawn with blending. 6663 // Layer with partially opaque contents, drawn with blending.
6644 layer1->SetContentsOpaque(false); 6664 layer1->SetContentsOpaque(false);
6645 layer1->SetQuadRect(gfx::Rect(5, 5, 5, 5)); 6665 layer1->SetQuadRect(gfx::Rect(5, 5, 5, 5));
6646 layer1->SetQuadVisibleRect(gfx::Rect(5, 5, 5, 5)); 6666 layer1->SetQuadVisibleRect(gfx::Rect(5, 5, 5, 5));
6647 layer1->SetOpaqueContentRect(gfx::Rect(5, 5, 2, 5)); 6667 layer1->SetOpaqueContentRect(gfx::Rect(5, 5, 2, 5));
6648 layer1->SetExpectation(true, false); 6668 layer1->SetExpectation(true, false);
6649 layer1->SetUpdateRect(gfx::Rect(layer1->bounds())); 6669 layer1->SetUpdateRect(gfx::Rect(layer1->bounds()));
6650 host_impl_->active_tree()->BuildPropertyTreesForTesting(); 6670 host_impl_->active_tree()->BuildPropertyTreesForTesting();
6651 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); 6671 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
6652 host_impl_->DrawLayers(&frame); 6672 host_impl_->DrawLayers(&frame);
6673 host_impl_->SwapBuffers(frame);
6653 EXPECT_TRUE(layer1->quads_appended()); 6674 EXPECT_TRUE(layer1->quads_appended());
6654 host_impl_->DidDrawAllLayers(frame); 6675 host_impl_->DidDrawAllLayers(frame);
6655 6676
6656 // Layer with partially opaque contents partially culled, drawn with blending. 6677 // Layer with partially opaque contents partially culled, drawn with blending.
6657 layer1->SetContentsOpaque(false); 6678 layer1->SetContentsOpaque(false);
6658 layer1->SetQuadRect(gfx::Rect(5, 5, 5, 5)); 6679 layer1->SetQuadRect(gfx::Rect(5, 5, 5, 5));
6659 layer1->SetQuadVisibleRect(gfx::Rect(5, 5, 5, 2)); 6680 layer1->SetQuadVisibleRect(gfx::Rect(5, 5, 5, 2));
6660 layer1->SetOpaqueContentRect(gfx::Rect(5, 5, 2, 5)); 6681 layer1->SetOpaqueContentRect(gfx::Rect(5, 5, 2, 5));
6661 layer1->SetExpectation(true, false); 6682 layer1->SetExpectation(true, false);
6662 layer1->SetUpdateRect(gfx::Rect(layer1->bounds())); 6683 layer1->SetUpdateRect(gfx::Rect(layer1->bounds()));
6663 host_impl_->active_tree()->BuildPropertyTreesForTesting(); 6684 host_impl_->active_tree()->BuildPropertyTreesForTesting();
6664 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); 6685 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
6665 host_impl_->DrawLayers(&frame); 6686 host_impl_->DrawLayers(&frame);
6687 host_impl_->SwapBuffers(frame);
6666 EXPECT_TRUE(layer1->quads_appended()); 6688 EXPECT_TRUE(layer1->quads_appended());
6667 host_impl_->DidDrawAllLayers(frame); 6689 host_impl_->DidDrawAllLayers(frame);
6668 6690
6669 // Layer with partially opaque contents culled, drawn with blending. 6691 // Layer with partially opaque contents culled, drawn with blending.
6670 layer1->SetContentsOpaque(false); 6692 layer1->SetContentsOpaque(false);
6671 layer1->SetQuadRect(gfx::Rect(5, 5, 5, 5)); 6693 layer1->SetQuadRect(gfx::Rect(5, 5, 5, 5));
6672 layer1->SetQuadVisibleRect(gfx::Rect(7, 5, 3, 5)); 6694 layer1->SetQuadVisibleRect(gfx::Rect(7, 5, 3, 5));
6673 layer1->SetOpaqueContentRect(gfx::Rect(5, 5, 2, 5)); 6695 layer1->SetOpaqueContentRect(gfx::Rect(5, 5, 2, 5));
6674 layer1->SetExpectation(true, false); 6696 layer1->SetExpectation(true, false);
6675 layer1->SetUpdateRect(gfx::Rect(layer1->bounds())); 6697 layer1->SetUpdateRect(gfx::Rect(layer1->bounds()));
6676 host_impl_->active_tree()->BuildPropertyTreesForTesting(); 6698 host_impl_->active_tree()->BuildPropertyTreesForTesting();
6677 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); 6699 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
6678 host_impl_->DrawLayers(&frame); 6700 host_impl_->DrawLayers(&frame);
6701 host_impl_->SwapBuffers(frame);
6679 EXPECT_TRUE(layer1->quads_appended()); 6702 EXPECT_TRUE(layer1->quads_appended());
6680 host_impl_->DidDrawAllLayers(frame); 6703 host_impl_->DidDrawAllLayers(frame);
6681 6704
6682 // Layer with partially opaque contents and translucent contents culled, drawn 6705 // Layer with partially opaque contents and translucent contents culled, drawn
6683 // without blending. 6706 // without blending.
6684 layer1->SetContentsOpaque(false); 6707 layer1->SetContentsOpaque(false);
6685 layer1->SetQuadRect(gfx::Rect(5, 5, 5, 5)); 6708 layer1->SetQuadRect(gfx::Rect(5, 5, 5, 5));
6686 layer1->SetQuadVisibleRect(gfx::Rect(5, 5, 2, 5)); 6709 layer1->SetQuadVisibleRect(gfx::Rect(5, 5, 2, 5));
6687 layer1->SetOpaqueContentRect(gfx::Rect(5, 5, 2, 5)); 6710 layer1->SetOpaqueContentRect(gfx::Rect(5, 5, 2, 5));
6688 layer1->SetExpectation(false, false); 6711 layer1->SetExpectation(false, false);
6689 layer1->SetUpdateRect(gfx::Rect(layer1->bounds())); 6712 layer1->SetUpdateRect(gfx::Rect(layer1->bounds()));
6690 host_impl_->active_tree()->BuildPropertyTreesForTesting(); 6713 host_impl_->active_tree()->BuildPropertyTreesForTesting();
6691 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); 6714 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
6692 host_impl_->DrawLayers(&frame); 6715 host_impl_->DrawLayers(&frame);
6716 host_impl_->SwapBuffers(frame);
6693 EXPECT_TRUE(layer1->quads_appended()); 6717 EXPECT_TRUE(layer1->quads_appended());
6694 host_impl_->DidDrawAllLayers(frame); 6718 host_impl_->DidDrawAllLayers(frame);
6695 } 6719 }
6696 6720
6697 class LayerTreeHostImplViewportCoveredTest : public LayerTreeHostImplTest { 6721 class LayerTreeHostImplViewportCoveredTest : public LayerTreeHostImplTest {
6698 protected: 6722 protected:
6699 LayerTreeHostImplViewportCoveredTest() : 6723 LayerTreeHostImplViewportCoveredTest() :
6700 gutter_quad_material_(DrawQuad::SOLID_COLOR), 6724 gutter_quad_material_(DrawQuad::SOLID_COLOR),
6701 child_(NULL), 6725 child_(NULL),
6702 did_activate_pending_tree_(false) {} 6726 did_activate_pending_tree_(false) {}
6703 6727
6704 std::unique_ptr<OutputSurface> CreateFakeOutputSurface(bool software) { 6728 std::unique_ptr<OutputSurface> CreateFakeOutputSurface(bool software) {
6705 if (software) { 6729 if (software) {
6706 return FakeOutputSurface::CreateSoftware( 6730 return FakeOutputSurface::CreateDelegatingSoftware(
6707 base::WrapUnique(new SoftwareOutputDevice())); 6731 base::WrapUnique(new SoftwareOutputDevice()));
6708 } 6732 }
6709 return FakeOutputSurface::Create3d(); 6733 return FakeOutputSurface::CreateDelegating3d();
6710 } 6734 }
6711 6735
6712 void SetupActiveTreeLayers() { 6736 void SetupActiveTreeLayers() {
6713 host_impl_->active_tree()->set_background_color(SK_ColorGRAY); 6737 host_impl_->active_tree()->set_background_color(SK_ColorGRAY);
6714 host_impl_->active_tree()->SetRootLayerForTesting( 6738 host_impl_->active_tree()->SetRootLayerForTesting(
6715 LayerImpl::Create(host_impl_->active_tree(), 1)); 6739 LayerImpl::Create(host_impl_->active_tree(), 1));
6716 host_impl_->active_tree() 6740 host_impl_->active_tree()
6717 ->root_layer_for_testing() 6741 ->root_layer_for_testing()
6718 ->test_properties() 6742 ->test_properties()
6719 ->force_render_surface = true; 6743 ->force_render_surface = true;
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after
6999 class FakeDrawableLayerImpl: public LayerImpl { 7023 class FakeDrawableLayerImpl: public LayerImpl {
7000 public: 7024 public:
7001 static std::unique_ptr<LayerImpl> Create(LayerTreeImpl* tree_impl, int id) { 7025 static std::unique_ptr<LayerImpl> Create(LayerTreeImpl* tree_impl, int id) {
7002 return base::WrapUnique(new FakeDrawableLayerImpl(tree_impl, id)); 7026 return base::WrapUnique(new FakeDrawableLayerImpl(tree_impl, id));
7003 } 7027 }
7004 protected: 7028 protected:
7005 FakeDrawableLayerImpl(LayerTreeImpl* tree_impl, int id) 7029 FakeDrawableLayerImpl(LayerTreeImpl* tree_impl, int id)
7006 : LayerImpl(tree_impl, id) {} 7030 : LayerImpl(tree_impl, id) {}
7007 }; 7031 };
7008 7032
7009 // Only reshape when we know we are going to draw. Otherwise, the reshape
7010 // can leave the window at the wrong size if we never draw and the proper
7011 // viewport size is never set.
7012 TEST_F(LayerTreeHostImplTest, ReshapeNotCalledUntilDraw) {
enne (OOO) 2016/07/19 23:00:50 I think this is fine to delete as preparing to dra
7013 scoped_refptr<TestContextProvider> provider(TestContextProvider::Create());
7014 std::unique_ptr<OutputSurface> output_surface(
7015 FakeOutputSurface::Create3d(provider));
7016 CreateHostImpl(DefaultSettings(), std::move(output_surface));
7017
7018 std::unique_ptr<LayerImpl> root =
7019 FakeDrawableLayerImpl::Create(host_impl_->active_tree(), 1);
7020 root->SetBounds(gfx::Size(10, 10));
7021 root->SetDrawsContent(true);
7022 root->test_properties()->force_render_surface = true;
7023 host_impl_->active_tree()->SetRootLayerForTesting(std::move(root));
7024 host_impl_->active_tree()->BuildPropertyTreesForTesting();
7025
7026 EXPECT_FALSE(provider->TestContext3d()->reshape_called());
7027 provider->TestContext3d()->clear_reshape_called();
7028
7029 LayerTreeHostImpl::FrameData frame;
7030 host_impl_->SetViewportSize(gfx::Size(10, 10));
7031 host_impl_->active_tree()->SetDeviceScaleFactor(1.f);
7032 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
7033 host_impl_->DrawLayers(&frame);
7034 EXPECT_TRUE(provider->TestContext3d()->reshape_called());
7035 EXPECT_EQ(provider->TestContext3d()->width(), 10);
7036 EXPECT_EQ(provider->TestContext3d()->height(), 10);
7037 EXPECT_EQ(provider->TestContext3d()->scale_factor(), 1.f);
7038 host_impl_->DidDrawAllLayers(frame);
7039 provider->TestContext3d()->clear_reshape_called();
7040
7041 host_impl_->SetViewportSize(gfx::Size(20, 30));
7042 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
7043 host_impl_->DrawLayers(&frame);
7044 EXPECT_TRUE(provider->TestContext3d()->reshape_called());
7045 EXPECT_EQ(provider->TestContext3d()->width(), 20);
7046 EXPECT_EQ(provider->TestContext3d()->height(), 30);
7047 EXPECT_EQ(provider->TestContext3d()->scale_factor(), 1.f);
7048 host_impl_->DidDrawAllLayers(frame);
7049 provider->TestContext3d()->clear_reshape_called();
7050
7051 host_impl_->active_tree()->SetDeviceScaleFactor(2.f);
7052 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
7053 host_impl_->DrawLayers(&frame);
7054 EXPECT_TRUE(provider->TestContext3d()->reshape_called());
7055 EXPECT_EQ(provider->TestContext3d()->width(), 20);
7056 EXPECT_EQ(provider->TestContext3d()->height(), 30);
7057 EXPECT_EQ(provider->TestContext3d()->scale_factor(), 2.f);
7058 host_impl_->DidDrawAllLayers(frame);
7059 provider->TestContext3d()->clear_reshape_called();
7060 }
7061
7062 // Make sure damage tracking propagates all the way to the graphics context, 7033 // Make sure damage tracking propagates all the way to the graphics context,
7063 // where it should request to swap only the sub-buffer that is damaged. 7034 // where it should request to swap only the sub-buffer that is damaged.
7064 TEST_F(LayerTreeHostImplTest, PartialSwapReceivesDamageRect) { 7035 TEST_F(LayerTreeHostImplTest, PartialSwapReceivesDamageRect) {
7065 scoped_refptr<TestContextProvider> context_provider( 7036 scoped_refptr<TestContextProvider> context_provider(
7066 TestContextProvider::Create()); 7037 TestContextProvider::Create());
7067 context_provider->BindToCurrentThread(); 7038 context_provider->BindToCurrentThread();
7068 context_provider->TestContext3d()->set_have_post_sub_buffer(true); 7039 context_provider->TestContext3d()->set_have_post_sub_buffer(true);
7069 7040
7070 std::unique_ptr<FakeOutputSurface> output_surface( 7041 std::unique_ptr<FakeOutputSurface> output_surface(
7071 FakeOutputSurface::Create3d(context_provider)); 7042 FakeOutputSurface::CreateDelegating3d(context_provider));
7072 FakeOutputSurface* fake_output_surface = output_surface.get(); 7043 FakeOutputSurface* fake_output_surface = output_surface.get();
7073 7044
7074 // This test creates its own LayerTreeHostImpl, so 7045 // This test creates its own LayerTreeHostImpl, so
7075 // that we can force partial swap enabled. 7046 // that we can force partial swap enabled.
7076 LayerTreeSettings settings = DefaultSettings(); 7047 LayerTreeSettings settings = DefaultSettings();
7077 settings.renderer_settings.partial_swap_enabled = true; 7048 settings.renderer_settings.partial_swap_enabled = true;
7078 std::unique_ptr<LayerTreeHostImpl> layer_tree_host_impl = 7049 std::unique_ptr<LayerTreeHostImpl> layer_tree_host_impl =
7079 LayerTreeHostImpl::Create( 7050 LayerTreeHostImpl::Create(
7080 settings, this, &task_runner_provider_, &stats_instrumentation_, 7051 settings, this, &task_runner_provider_, &stats_instrumentation_,
7081 &shared_bitmap_manager_, NULL, &task_graph_runner_, 7052 &shared_bitmap_manager_, NULL, &task_graph_runner_,
(...skipping 18 matching lines...) Expand all
7100 layer_tree_host_impl->active_tree()->SetRootLayerForTesting(std::move(root)); 7071 layer_tree_host_impl->active_tree()->SetRootLayerForTesting(std::move(root));
7101 layer_tree_host_impl->active_tree()->BuildPropertyTreesForTesting(); 7072 layer_tree_host_impl->active_tree()->BuildPropertyTreesForTesting();
7102 7073
7103 LayerTreeHostImpl::FrameData frame; 7074 LayerTreeHostImpl::FrameData frame;
7104 7075
7105 // First frame, the entire screen should get swapped. 7076 // First frame, the entire screen should get swapped.
7106 EXPECT_EQ(DRAW_SUCCESS, layer_tree_host_impl->PrepareToDraw(&frame)); 7077 EXPECT_EQ(DRAW_SUCCESS, layer_tree_host_impl->PrepareToDraw(&frame));
7107 layer_tree_host_impl->DrawLayers(&frame); 7078 layer_tree_host_impl->DrawLayers(&frame);
7108 layer_tree_host_impl->DidDrawAllLayers(frame); 7079 layer_tree_host_impl->DidDrawAllLayers(frame);
7109 layer_tree_host_impl->SwapBuffers(frame); 7080 layer_tree_host_impl->SwapBuffers(frame);
7110 gfx::Rect expected_swap_rect(0, 0, 500, 500); 7081 gfx::Rect expected_swap_rect(500, 500);
7111 EXPECT_EQ(expected_swap_rect.ToString(), 7082 EXPECT_EQ(expected_swap_rect.ToString(),
7112 fake_output_surface->last_swap_rect().ToString()); 7083 fake_output_surface->last_swap_rect().ToString());
7113 7084
7114 // Second frame, only the damaged area should get swapped. Damage should be 7085 // Second frame, only the damaged area should get swapped. Damage should be
7115 // the union of old and new child rects. 7086 // the union of old and new child rects: gfx::Rect(26, 28).
7116 // expected damage rect: gfx::Rect(26, 28);
7117 // expected swap rect: vertically flipped, with origin at bottom left corner.
7118 layer_tree_host_impl->active_tree() 7087 layer_tree_host_impl->active_tree()
7119 ->root_layer_for_testing() 7088 ->root_layer_for_testing()
7120 ->test_properties() 7089 ->test_properties()
7121 ->children[0] 7090 ->children[0]
7122 ->SetPosition(gfx::PointF()); 7091 ->SetPosition(gfx::PointF());
7123 layer_tree_host_impl->active_tree() 7092 layer_tree_host_impl->active_tree()
7124 ->root_layer_for_testing() 7093 ->root_layer_for_testing()
7125 ->test_properties() 7094 ->test_properties()
7126 ->children[0] 7095 ->children[0]
7127 ->NoteLayerPropertyChanged(); 7096 ->NoteLayerPropertyChanged();
7128 layer_tree_host_impl->active_tree()->BuildPropertyTreesForTesting(); 7097 layer_tree_host_impl->active_tree()->BuildPropertyTreesForTesting();
7129 EXPECT_EQ(DRAW_SUCCESS, layer_tree_host_impl->PrepareToDraw(&frame)); 7098 EXPECT_EQ(DRAW_SUCCESS, layer_tree_host_impl->PrepareToDraw(&frame));
7130 layer_tree_host_impl->DrawLayers(&frame); 7099 layer_tree_host_impl->DrawLayers(&frame);
7131 host_impl_->DidDrawAllLayers(frame); 7100 host_impl_->DidDrawAllLayers(frame);
7132 layer_tree_host_impl->SwapBuffers(frame); 7101 layer_tree_host_impl->SwapBuffers(frame);
7133 7102
7134 // Make sure that partial swap is constrained to the viewport dimensions 7103 expected_swap_rect = gfx::Rect(26, 28);
7135 // expected damage rect: gfx::Rect(500, 500);
7136 // expected swap rect: flipped damage rect, but also clamped to viewport
7137 expected_swap_rect = gfx::Rect(0, 500-28, 26, 28);
7138 EXPECT_EQ(expected_swap_rect.ToString(), 7104 EXPECT_EQ(expected_swap_rect.ToString(),
7139 fake_output_surface->last_swap_rect().ToString()); 7105 fake_output_surface->last_swap_rect().ToString());
7140 7106
7141 layer_tree_host_impl->SetViewportSize(gfx::Size(10, 10)); 7107 layer_tree_host_impl->SetViewportSize(gfx::Size(10, 10));
7142 // This will damage everything. 7108 // This will damage everything.
7143 layer_tree_host_impl->active_tree() 7109 layer_tree_host_impl->active_tree()
7144 ->root_layer_for_testing() 7110 ->root_layer_for_testing()
7145 ->SetBackgroundColor(SK_ColorBLACK); 7111 ->SetBackgroundColor(SK_ColorBLACK);
7146 EXPECT_EQ(DRAW_SUCCESS, layer_tree_host_impl->PrepareToDraw(&frame)); 7112 EXPECT_EQ(DRAW_SUCCESS, layer_tree_host_impl->PrepareToDraw(&frame));
7147 layer_tree_host_impl->DrawLayers(&frame); 7113 layer_tree_host_impl->DrawLayers(&frame);
7148 host_impl_->DidDrawAllLayers(frame); 7114 host_impl_->DidDrawAllLayers(frame);
7149 layer_tree_host_impl->SwapBuffers(frame); 7115 layer_tree_host_impl->SwapBuffers(frame);
7150 7116
7151 expected_swap_rect = gfx::Rect(0, 0, 10, 10); 7117 expected_swap_rect = gfx::Rect(10, 10);
7152 EXPECT_EQ(expected_swap_rect.ToString(), 7118 EXPECT_EQ(expected_swap_rect.ToString(),
7153 fake_output_surface->last_swap_rect().ToString()); 7119 fake_output_surface->last_swap_rect().ToString());
7154 7120
7155 layer_tree_host_impl->ReleaseOutputSurface(); 7121 layer_tree_host_impl->ReleaseOutputSurface();
7156 } 7122 }
7157 7123
7158 TEST_F(LayerTreeHostImplTest, RootLayerDoesntCreateExtraSurface) { 7124 TEST_F(LayerTreeHostImplTest, RootLayerDoesntCreateExtraSurface) {
7159 std::unique_ptr<LayerImpl> root = 7125 std::unique_ptr<LayerImpl> root =
7160 FakeDrawableLayerImpl::Create(host_impl_->active_tree(), 1); 7126 FakeDrawableLayerImpl::Create(host_impl_->active_tree(), 1);
7161 std::unique_ptr<LayerImpl> child = 7127 std::unique_ptr<LayerImpl> child =
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
7197 render_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>(); 7163 render_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
7198 my_quad->SetNew( 7164 my_quad->SetNew(
7199 shared_quad_state, quad_rect, visible_quad_rect, gray, false); 7165 shared_quad_state, quad_rect, visible_quad_rect, gray, false);
7200 } 7166 }
7201 7167
7202 private: 7168 private:
7203 FakeLayerWithQuads(LayerTreeImpl* tree_impl, int id) 7169 FakeLayerWithQuads(LayerTreeImpl* tree_impl, int id)
7204 : LayerImpl(tree_impl, id) {} 7170 : LayerImpl(tree_impl, id) {}
7205 }; 7171 };
7206 7172
7207 class MockContext : public TestWebGraphicsContext3D {
enne (OOO) 2016/07/19 23:00:50 I do think these should probably be display unit t
danakj 2016/07/20 01:03:25 I added GLRenderer unittests. Will do some softwar
7208 public:
7209 MOCK_METHOD1(useProgram, void(GLuint program));
7210 MOCK_METHOD5(uniform4f, void(GLint location,
7211 GLfloat x,
7212 GLfloat y,
7213 GLfloat z,
7214 GLfloat w));
7215 MOCK_METHOD4(uniformMatrix4fv, void(GLint location,
7216 GLsizei count,
7217 GLboolean transpose,
7218 const GLfloat* value));
7219 MOCK_METHOD4(drawElements, void(GLenum mode,
7220 GLsizei count,
7221 GLenum type,
7222 GLintptr offset));
7223 MOCK_METHOD1(enable, void(GLenum cap));
7224 MOCK_METHOD1(disable, void(GLenum cap));
7225 MOCK_METHOD4(scissor, void(GLint x,
7226 GLint y,
7227 GLsizei width,
7228 GLsizei height));
7229 };
7230
7231 class MockContextHarness {
7232 private:
7233 MockContext* context_;
7234
7235 public:
7236 explicit MockContextHarness(MockContext* context)
7237 : context_(context) {
7238 context_->set_have_post_sub_buffer(true);
7239
7240 // Catch "uninteresting" calls
7241 EXPECT_CALL(*context_, useProgram(_))
7242 .Times(0);
7243
7244 EXPECT_CALL(*context_, drawElements(_, _, _, _))
7245 .Times(0);
7246
7247 // These are not asserted
7248 EXPECT_CALL(*context_, uniformMatrix4fv(_, _, _, _))
7249 .WillRepeatedly(Return());
7250
7251 EXPECT_CALL(*context_, uniform4f(_, _, _, _, _))
7252 .WillRepeatedly(Return());
7253
7254 // Any un-sanctioned calls to enable() are OK
7255 EXPECT_CALL(*context_, enable(_))
7256 .WillRepeatedly(Return());
7257
7258 // Any un-sanctioned calls to disable() are OK
7259 EXPECT_CALL(*context_, disable(_))
7260 .WillRepeatedly(Return());
7261 }
7262
7263 void MustDrawSolidQuad() {
7264 EXPECT_CALL(*context_, drawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0))
7265 .WillOnce(Return())
7266 .RetiresOnSaturation();
7267
7268 EXPECT_CALL(*context_, useProgram(_))
7269 .WillOnce(Return())
7270 .RetiresOnSaturation();
7271 }
7272
7273 void MustSetScissor(int x, int y, int width, int height) {
7274 EXPECT_CALL(*context_, enable(GL_SCISSOR_TEST))
7275 .WillRepeatedly(Return());
7276
7277 EXPECT_CALL(*context_, scissor(x, y, width, height))
7278 .Times(AtLeast(1))
7279 .WillRepeatedly(Return());
7280 }
7281
7282 void MustSetNoScissor() {
7283 EXPECT_CALL(*context_, disable(GL_SCISSOR_TEST))
7284 .WillRepeatedly(Return());
7285
7286 EXPECT_CALL(*context_, enable(GL_SCISSOR_TEST))
7287 .Times(0);
7288
7289 EXPECT_CALL(*context_, scissor(_, _, _, _))
7290 .Times(0);
7291 }
7292 };
7293
7294 TEST_F(LayerTreeHostImplTest, NoPartialSwap) {
7295 std::unique_ptr<MockContext> mock_context_owned(new MockContext);
7296 MockContext* mock_context = mock_context_owned.get();
7297 MockContextHarness harness(mock_context);
7298
7299 // Run test case
7300 LayerTreeSettings settings = DefaultSettings();
7301 settings.renderer_settings.partial_swap_enabled = false;
7302 CreateHostImpl(settings,
7303 FakeOutputSurface::Create3d(std::move(mock_context_owned)));
7304 SetupRootLayerImpl(FakeLayerWithQuads::Create(host_impl_->active_tree(), 1));
7305 host_impl_->active_tree()->BuildPropertyTreesForTesting();
7306
7307 // Without partial swap, and no clipping, no scissor is set.
7308 harness.MustDrawSolidQuad();
7309 harness.MustSetNoScissor();
7310 {
7311 LayerTreeHostImpl::FrameData frame;
7312 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
7313 host_impl_->DrawLayers(&frame);
7314 host_impl_->DidDrawAllLayers(frame);
7315 }
7316 Mock::VerifyAndClearExpectations(&mock_context);
7317
7318 // Without partial swap, but a layer does clip its subtree, one scissor is
7319 // set.
7320 auto* root = host_impl_->active_tree()->root_layer_for_testing();
7321 root->SetMasksToBounds(true);
7322 host_impl_->active_tree()->BuildPropertyTreesForTesting();
7323 root->NoteLayerPropertyChanged();
7324 harness.MustDrawSolidQuad();
7325 harness.MustSetScissor(0, 0, 10, 10);
7326 {
7327 LayerTreeHostImpl::FrameData frame;
7328 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
7329 host_impl_->DrawLayers(&frame);
7330 host_impl_->DidDrawAllLayers(frame);
7331 }
7332 Mock::VerifyAndClearExpectations(&mock_context);
7333 }
7334
7335 TEST_F(LayerTreeHostImplTest, PartialSwap) {
7336 std::unique_ptr<MockContext> context_owned(new MockContext);
7337 MockContext* mock_context = context_owned.get();
7338 MockContextHarness harness(mock_context);
7339
7340 LayerTreeSettings settings = DefaultSettings();
7341 settings.renderer_settings.partial_swap_enabled = true;
7342 CreateHostImpl(settings,
7343 FakeOutputSurface::Create3d(std::move(context_owned)));
7344 SetupRootLayerImpl(FakeLayerWithQuads::Create(host_impl_->active_tree(), 1));
7345 host_impl_->active_tree()->BuildPropertyTreesForTesting();
7346
7347 // The first frame is not a partially-swapped one. No scissor should be set.
7348 harness.MustSetNoScissor();
7349 harness.MustDrawSolidQuad();
7350 {
7351 LayerTreeHostImpl::FrameData frame;
7352 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
7353 host_impl_->DrawLayers(&frame);
7354 host_impl_->DidDrawAllLayers(frame);
7355 }
7356 Mock::VerifyAndClearExpectations(&mock_context);
7357
7358 // Damage a portion of the frame.
7359 auto* root = host_impl_->active_tree()->root_layer_for_testing();
7360 root->SetUpdateRect(gfx::Rect(0, 0, 2, 3));
7361 host_impl_->active_tree()->BuildPropertyTreesForTesting();
7362
7363 // The second frame will be partially-swapped (the y coordinates are flipped).
7364 harness.MustSetScissor(0, 7, 2, 3);
7365 harness.MustDrawSolidQuad();
7366 {
7367 LayerTreeHostImpl::FrameData frame;
7368 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
7369 host_impl_->DrawLayers(&frame);
7370 host_impl_->DidDrawAllLayers(frame);
7371 }
7372 Mock::VerifyAndClearExpectations(&mock_context);
7373 }
7374
7375 static std::unique_ptr<LayerTreeHostImpl> SetupLayersForOpacity( 7173 static std::unique_ptr<LayerTreeHostImpl> SetupLayersForOpacity(
7376 LayerTreeSettings settings, 7174 LayerTreeSettings settings,
7377 bool partial_swap, 7175 bool partial_swap,
7378 LayerTreeHostImplClient* client, 7176 LayerTreeHostImplClient* client,
7379 TaskRunnerProvider* task_runner_provider, 7177 TaskRunnerProvider* task_runner_provider,
7380 SharedBitmapManager* manager, 7178 SharedBitmapManager* manager,
7381 TaskGraphRunner* task_graph_runner, 7179 TaskGraphRunner* task_graph_runner,
7382 RenderingStatsInstrumentation* stats_instrumentation, 7180 RenderingStatsInstrumentation* stats_instrumentation,
7383 OutputSurface* output_surface) { 7181 OutputSurface* output_surface) {
7384 settings.renderer_settings.partial_swap_enabled = partial_swap; 7182 settings.renderer_settings.partial_swap_enabled = partial_swap;
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
7447 return my_host_impl; 7245 return my_host_impl;
7448 } 7246 }
7449 7247
7450 TEST_F(LayerTreeHostImplTest, ContributingLayerEmptyScissorPartialSwap) { 7248 TEST_F(LayerTreeHostImplTest, ContributingLayerEmptyScissorPartialSwap) {
7451 TestSharedBitmapManager shared_bitmap_manager; 7249 TestSharedBitmapManager shared_bitmap_manager;
7452 TestTaskGraphRunner task_graph_runner; 7250 TestTaskGraphRunner task_graph_runner;
7453 scoped_refptr<TestContextProvider> provider(TestContextProvider::Create()); 7251 scoped_refptr<TestContextProvider> provider(TestContextProvider::Create());
7454 provider->BindToCurrentThread(); 7252 provider->BindToCurrentThread();
7455 provider->TestContext3d()->set_have_post_sub_buffer(true); 7253 provider->TestContext3d()->set_have_post_sub_buffer(true);
7456 std::unique_ptr<OutputSurface> output_surface( 7254 std::unique_ptr<OutputSurface> output_surface(
7457 FakeOutputSurface::Create3d(provider)); 7255 FakeOutputSurface::CreateDelegating3d(provider));
7458 std::unique_ptr<LayerTreeHostImpl> my_host_impl = SetupLayersForOpacity( 7256 std::unique_ptr<LayerTreeHostImpl> my_host_impl = SetupLayersForOpacity(
7459 DefaultSettings(), true, this, &task_runner_provider_, 7257 DefaultSettings(), true, this, &task_runner_provider_,
7460 &shared_bitmap_manager, &task_graph_runner, &stats_instrumentation_, 7258 &shared_bitmap_manager, &task_graph_runner, &stats_instrumentation_,
7461 output_surface.get()); 7259 output_surface.get());
7462 { 7260 {
7463 LayerTreeHostImpl::FrameData frame; 7261 LayerTreeHostImpl::FrameData frame;
7464 EXPECT_EQ(DRAW_SUCCESS, my_host_impl->PrepareToDraw(&frame)); 7262 EXPECT_EQ(DRAW_SUCCESS, my_host_impl->PrepareToDraw(&frame));
7465 7263
7466 // Verify all quads have been computed 7264 // Verify all quads have been computed
7467 ASSERT_EQ(2U, frame.render_passes.size()); 7265 ASSERT_EQ(2U, frame.render_passes.size());
(...skipping 10 matching lines...) Expand all
7478 my_host_impl->ReleaseOutputSurface(); 7276 my_host_impl->ReleaseOutputSurface();
7479 } 7277 }
7480 7278
7481 TEST_F(LayerTreeHostImplTest, ContributingLayerEmptyScissorNoPartialSwap) { 7279 TEST_F(LayerTreeHostImplTest, ContributingLayerEmptyScissorNoPartialSwap) {
7482 TestSharedBitmapManager shared_bitmap_manager; 7280 TestSharedBitmapManager shared_bitmap_manager;
7483 TestTaskGraphRunner task_graph_runner; 7281 TestTaskGraphRunner task_graph_runner;
7484 scoped_refptr<TestContextProvider> provider(TestContextProvider::Create()); 7282 scoped_refptr<TestContextProvider> provider(TestContextProvider::Create());
7485 provider->BindToCurrentThread(); 7283 provider->BindToCurrentThread();
7486 provider->TestContext3d()->set_have_post_sub_buffer(true); 7284 provider->TestContext3d()->set_have_post_sub_buffer(true);
7487 std::unique_ptr<OutputSurface> output_surface( 7285 std::unique_ptr<OutputSurface> output_surface(
7488 FakeOutputSurface::Create3d(provider)); 7286 FakeOutputSurface::CreateDelegating3d(provider));
7489 std::unique_ptr<LayerTreeHostImpl> my_host_impl = SetupLayersForOpacity( 7287 std::unique_ptr<LayerTreeHostImpl> my_host_impl = SetupLayersForOpacity(
7490 DefaultSettings(), false, this, &task_runner_provider_, 7288 DefaultSettings(), false, this, &task_runner_provider_,
7491 &shared_bitmap_manager, &task_graph_runner, &stats_instrumentation_, 7289 &shared_bitmap_manager, &task_graph_runner, &stats_instrumentation_,
7492 output_surface.get()); 7290 output_surface.get());
7493 { 7291 {
7494 LayerTreeHostImpl::FrameData frame; 7292 LayerTreeHostImpl::FrameData frame;
7495 EXPECT_EQ(DRAW_SUCCESS, my_host_impl->PrepareToDraw(&frame)); 7293 EXPECT_EQ(DRAW_SUCCESS, my_host_impl->PrepareToDraw(&frame));
7496 7294
7497 // Verify all quads have been computed 7295 // Verify all quads have been computed
7498 ASSERT_EQ(2U, frame.render_passes.size()); 7296 ASSERT_EQ(2U, frame.render_passes.size());
7499 ASSERT_EQ(1U, frame.render_passes[0]->quad_list.size()); 7297 ASSERT_EQ(1U, frame.render_passes[0]->quad_list.size());
7500 ASSERT_EQ(1U, frame.render_passes[1]->quad_list.size()); 7298 ASSERT_EQ(1U, frame.render_passes[1]->quad_list.size());
7501 EXPECT_EQ(DrawQuad::SOLID_COLOR, 7299 EXPECT_EQ(DrawQuad::SOLID_COLOR,
7502 frame.render_passes[0]->quad_list.front()->material); 7300 frame.render_passes[0]->quad_list.front()->material);
7503 EXPECT_EQ(DrawQuad::RENDER_PASS, 7301 EXPECT_EQ(DrawQuad::RENDER_PASS,
7504 frame.render_passes[1]->quad_list.front()->material); 7302 frame.render_passes[1]->quad_list.front()->material);
7505 7303
7506 my_host_impl->DrawLayers(&frame); 7304 my_host_impl->DrawLayers(&frame);
7507 my_host_impl->DidDrawAllLayers(frame); 7305 my_host_impl->DidDrawAllLayers(frame);
7508 } 7306 }
7509 my_host_impl->ReleaseOutputSurface(); 7307 my_host_impl->ReleaseOutputSurface();
7510 } 7308 }
7511 7309
7512 TEST_F(LayerTreeHostImplTest, LayersFreeTextures) { 7310 TEST_F(LayerTreeHostImplTest, LayersFreeTextures) {
7513 std::unique_ptr<TestWebGraphicsContext3D> context = 7311 std::unique_ptr<TestWebGraphicsContext3D> context =
7514 TestWebGraphicsContext3D::Create(); 7312 TestWebGraphicsContext3D::Create();
7515 TestWebGraphicsContext3D* context3d = context.get(); 7313 TestWebGraphicsContext3D* context3d = context.get();
7516 std::unique_ptr<OutputSurface> output_surface( 7314 std::unique_ptr<OutputSurface> output_surface(
7517 FakeOutputSurface::Create3d(std::move(context))); 7315 FakeOutputSurface::CreateDelegating3d(std::move(context)));
7518 CreateHostImpl(DefaultSettings(), std::move(output_surface)); 7316 CreateHostImpl(DefaultSettings(), std::move(output_surface));
7519 7317
7520 std::unique_ptr<LayerImpl> root_layer = 7318 std::unique_ptr<LayerImpl> root_layer =
7521 LayerImpl::Create(host_impl_->active_tree(), 1); 7319 LayerImpl::Create(host_impl_->active_tree(), 1);
7522 root_layer->SetBounds(gfx::Size(10, 10)); 7320 root_layer->SetBounds(gfx::Size(10, 10));
7523 root_layer->test_properties()->force_render_surface = true; 7321 root_layer->test_properties()->force_render_surface = true;
7524 7322
7525 scoped_refptr<VideoFrame> softwareFrame = 7323 scoped_refptr<VideoFrame> softwareFrame =
7526 media::VideoFrame::CreateColorFrame( 7324 media::VideoFrame::CreateColorFrame(
7527 gfx::Size(4, 4), 0x80, 0x80, 0x80, base::TimeDelta()); 7325 gfx::Size(4, 4), 0x80, 0x80, 0x80, base::TimeDelta());
(...skipping 27 matching lines...) Expand all
7555 class MockDrawQuadsToFillScreenContext : public TestWebGraphicsContext3D { 7353 class MockDrawQuadsToFillScreenContext : public TestWebGraphicsContext3D {
7556 public: 7354 public:
7557 MOCK_METHOD1(useProgram, void(GLuint program)); 7355 MOCK_METHOD1(useProgram, void(GLuint program));
7558 MOCK_METHOD4(drawElements, void(GLenum mode, 7356 MOCK_METHOD4(drawElements, void(GLenum mode,
7559 GLsizei count, 7357 GLsizei count,
7560 GLenum type, 7358 GLenum type,
7561 GLintptr offset)); 7359 GLintptr offset));
7562 }; 7360 };
7563 7361
7564 TEST_F(LayerTreeHostImplTest, HasTransparentBackground) { 7362 TEST_F(LayerTreeHostImplTest, HasTransparentBackground) {
7565 std::unique_ptr<MockDrawQuadsToFillScreenContext> mock_context_owned(
7566 new MockDrawQuadsToFillScreenContext);
7567 MockDrawQuadsToFillScreenContext* mock_context = mock_context_owned.get();
7568
7569 // Run test case
7570 LayerTreeSettings settings = DefaultSettings();
7571 settings.renderer_settings.partial_swap_enabled = false;
7572 CreateHostImpl(settings,
7573 FakeOutputSurface::Create3d(std::move(mock_context_owned)));
7574 SetupRootLayerImpl(LayerImpl::Create(host_impl_->active_tree(), 1)); 7363 SetupRootLayerImpl(LayerImpl::Create(host_impl_->active_tree(), 1));
7575 host_impl_->active_tree()->BuildPropertyTreesForTesting(); 7364 host_impl_->active_tree()->BuildPropertyTreesForTesting();
7576 7365
7577 host_impl_->active_tree()->set_background_color(SK_ColorWHITE); 7366 host_impl_->active_tree()->set_background_color(SK_ColorWHITE);
7578 7367
7579 // Verify one quad is drawn when transparent background set is not set. 7368 // Verify one quad is drawn when transparent background set is not set.
7580 host_impl_->active_tree()->set_has_transparent_background(false); 7369 host_impl_->active_tree()->set_has_transparent_background(false);
7581 EXPECT_CALL(*mock_context, useProgram(_))
7582 .Times(1);
7583 EXPECT_CALL(*mock_context, drawElements(_, _, _, _))
7584 .Times(1);
7585 LayerTreeHostImpl::FrameData frame; 7370 LayerTreeHostImpl::FrameData frame;
7586 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); 7371 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
7372 {
7373 const auto& root_pass = frame.render_passes.back();
7374 ASSERT_EQ(1u, root_pass->quad_list.size());
7375 EXPECT_EQ(DrawQuad::SOLID_COLOR, root_pass->quad_list.front()->material);
7376 }
7587 host_impl_->DrawLayers(&frame); 7377 host_impl_->DrawLayers(&frame);
7588 host_impl_->DidDrawAllLayers(frame); 7378 host_impl_->DidDrawAllLayers(frame);
7589 Mock::VerifyAndClearExpectations(&mock_context); 7379 host_impl_->SwapBuffers(frame);
7380
7381 // Cause damage so we would draw something if possible.
7382 host_impl_->SetFullRootLayerDamage();
7590 7383
7591 // Verify no quads are drawn when transparent background is set. 7384 // Verify no quads are drawn when transparent background is set.
7592 host_impl_->active_tree()->set_has_transparent_background(true); 7385 host_impl_->active_tree()->set_has_transparent_background(true);
7593 host_impl_->SetFullRootLayerDamage(); 7386 host_impl_->SetFullRootLayerDamage();
7594 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); 7387 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
7388 {
7389 const auto& root_pass = frame.render_passes.back();
7390 ASSERT_EQ(0u, root_pass->quad_list.size());
7391 }
7595 host_impl_->DrawLayers(&frame); 7392 host_impl_->DrawLayers(&frame);
7596 host_impl_->DidDrawAllLayers(frame); 7393 host_impl_->DidDrawAllLayers(frame);
7597 Mock::VerifyAndClearExpectations(&mock_context); 7394 host_impl_->SwapBuffers(frame);
7598 } 7395 }
7599 7396
7600 class LayerTreeHostImplTestWithDelegatingRenderer 7397 class LayerTreeHostImplTestWithDelegatingRenderer
7601 : public LayerTreeHostImplTest { 7398 : public LayerTreeHostImplTest {
7602 protected: 7399 protected:
7603 std::unique_ptr<OutputSurface> CreateOutputSurface() override { 7400 std::unique_ptr<OutputSurface> CreateOutputSurface() override {
7604 return FakeOutputSurface::CreateDelegating3d(); 7401 return FakeOutputSurface::CreateDelegating3d();
7605 } 7402 }
7606 7403
7607 void DrawFrameAndTestDamage(const gfx::Rect& expected_damage) { 7404 void DrawFrameAndTestDamage(const gfx::Rect& expected_damage) {
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
7803 return SoftwareOutputDevice::BeginPaint(damage_rect); 7600 return SoftwareOutputDevice::BeginPaint(damage_rect);
7804 } 7601 }
7805 void EndPaint() override { 7602 void EndPaint() override {
7806 SoftwareOutputDevice::EndPaint(); 7603 SoftwareOutputDevice::EndPaint();
7807 ++frames_ended_; 7604 ++frames_ended_;
7808 } 7605 }
7809 7606
7810 int frames_began_, frames_ended_; 7607 int frames_began_, frames_ended_;
7811 }; 7608 };
7812 7609
7813 TEST_F(LayerTreeHostImplTest, ForcedDrawToSoftwareDeviceBasicRender) {
enne (OOO) 2016/07/19 23:00:50 Do we have a resourceless software draw test somew
danakj 2016/07/20 01:03:25 LayerTreeHostTestResourcelessSoftwareDraw: https:/
7814 // No main thread evictions in resourceless software mode.
7815 set_reduce_memory_result(false);
7816 CountingSoftwareDevice* software_device = new CountingSoftwareDevice();
7817 EXPECT_TRUE(CreateHostImpl(
7818 DefaultSettings(),
7819 FakeOutputSurface::CreateSoftware(base::WrapUnique(software_device))));
7820 host_impl_->SetViewportSize(gfx::Size(50, 50));
7821
7822 SetupScrollAndContentsLayers(gfx::Size(100, 100));
7823
7824 const gfx::Transform external_transform;
7825 const gfx::Rect external_viewport;
7826 const gfx::Rect external_clip;
7827 const bool resourceless_software_draw = true;
7828 host_impl_->SetExternalTilePriorityConstraints(external_viewport,
7829 external_transform);
7830
7831 EXPECT_EQ(0, software_device->frames_began_);
7832 EXPECT_EQ(0, software_device->frames_ended_);
7833
7834 host_impl_->OnDraw(external_transform, external_viewport, external_clip,
7835 resourceless_software_draw);
7836
7837 EXPECT_EQ(1, software_device->frames_began_);
7838 EXPECT_EQ(1, software_device->frames_ended_);
7839
7840 // Call another API method that is likely to hit nullptr in this mode.
7841 std::unique_ptr<base::trace_event::TracedValue> state(
7842 new base::trace_event::TracedValue());
7843 host_impl_->ActivationStateAsValueInto(state.get());
7844 }
7845
7846 TEST_F(LayerTreeHostImplTest, 7610 TEST_F(LayerTreeHostImplTest,
7847 ForcedDrawToSoftwareDeviceSkipsUnsupportedLayers) { 7611 ForcedDrawToSoftwareDeviceSkipsUnsupportedLayers) {
7848 set_reduce_memory_result(false); 7612 set_reduce_memory_result(false);
7849 EXPECT_TRUE(CreateHostImpl( 7613 EXPECT_TRUE(CreateHostImpl(
7850 DefaultSettings(), FakeOutputSurface::CreateSoftware( 7614 DefaultSettings(), FakeOutputSurface::CreateDelegatingSoftware(
7851 base::WrapUnique(new CountingSoftwareDevice)))); 7615 base::WrapUnique(new CountingSoftwareDevice))));
7852 7616
7853 const gfx::Transform external_transform; 7617 const gfx::Transform external_transform;
7854 const gfx::Rect external_viewport; 7618 const gfx::Rect external_viewport;
7855 const gfx::Rect external_clip; 7619 const gfx::Rect external_clip;
7856 const bool resourceless_software_draw = true; 7620 const bool resourceless_software_draw = true;
7857 host_impl_->SetExternalTilePriorityConstraints(external_viewport, 7621 host_impl_->SetExternalTilePriorityConstraints(external_viewport,
7858 external_transform); 7622 external_transform);
7859 7623
7860 // SolidColorLayerImpl will be drawn. 7624 // SolidColorLayerImpl will be drawn.
(...skipping 24 matching lines...) Expand all
7885 host_impl_->ReleaseOutputSurface(); 7649 host_impl_->ReleaseOutputSurface();
7886 host_impl_ = nullptr; 7650 host_impl_ = nullptr;
7887 7651
7888 LayerTreeSettings settings = DefaultSettings(); 7652 LayerTreeSettings settings = DefaultSettings();
7889 host_impl_ = LayerTreeHostImpl::Create( 7653 host_impl_ = LayerTreeHostImpl::Create(
7890 settings, this, &task_runner_provider_, &stats_instrumentation_, 7654 settings, this, &task_runner_provider_, &stats_instrumentation_,
7891 &shared_bitmap_manager_, &gpu_memory_buffer_manager_, &task_graph_runner_, 7655 &shared_bitmap_manager_, &gpu_memory_buffer_manager_, &task_graph_runner_,
7892 AnimationHost::CreateForTesting(ThreadInstance::IMPL), 0); 7656 AnimationHost::CreateForTesting(ThreadInstance::IMPL), 0);
7893 7657
7894 output_surface_ = 7658 output_surface_ =
7895 FakeOutputSurface::Create3d(TestWebGraphicsContext3D::Create()); 7659 FakeOutputSurface::CreateDelegating3d(TestWebGraphicsContext3D::Create());
7896 host_impl_->SetVisible(true); 7660 host_impl_->SetVisible(true);
7897 host_impl_->InitializeRenderer(output_surface_.get()); 7661 host_impl_->InitializeRenderer(output_surface_.get());
7898 EXPECT_LT(0ul, host_impl_->memory_allocation_limit_bytes()); 7662 EXPECT_LT(0ul, host_impl_->memory_allocation_limit_bytes());
7899 } 7663 }
7900 7664
7901 TEST_F(LayerTreeHostImplTest, RequireHighResWhenVisible) { 7665 TEST_F(LayerTreeHostImplTest, RequireHighResWhenVisible) {
7902 ASSERT_TRUE(host_impl_->active_tree()); 7666 ASSERT_TRUE(host_impl_->active_tree());
7903 7667
7904 // RequiresHighResToDraw is set when new output surface is used. 7668 // RequiresHighResToDraw is set when new output surface is used.
7905 EXPECT_TRUE(host_impl_->RequiresHighResToDraw()); 7669 EXPECT_TRUE(host_impl_->RequiresHighResToDraw());
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
7970 EXPECT_FALSE(fake_host_impl_->prepare_tiles_needed()); 7734 EXPECT_FALSE(fake_host_impl_->prepare_tiles_needed());
7971 host_impl_->SetVisible(true); 7735 host_impl_->SetVisible(true);
7972 EXPECT_TRUE(fake_host_impl_->prepare_tiles_needed()); 7736 EXPECT_TRUE(fake_host_impl_->prepare_tiles_needed());
7973 } 7737 }
7974 7738
7975 TEST_F(LayerTreeHostImplTest, UIResourceManagement) { 7739 TEST_F(LayerTreeHostImplTest, UIResourceManagement) {
7976 std::unique_ptr<TestWebGraphicsContext3D> context = 7740 std::unique_ptr<TestWebGraphicsContext3D> context =
7977 TestWebGraphicsContext3D::Create(); 7741 TestWebGraphicsContext3D::Create();
7978 TestWebGraphicsContext3D* context3d = context.get(); 7742 TestWebGraphicsContext3D* context3d = context.get();
7979 std::unique_ptr<FakeOutputSurface> output_surface = 7743 std::unique_ptr<FakeOutputSurface> output_surface =
7980 FakeOutputSurface::Create3d(); 7744 FakeOutputSurface::CreateDelegating3d();
7981 CreateHostImpl(DefaultSettings(), std::move(output_surface)); 7745 CreateHostImpl(DefaultSettings(), std::move(output_surface));
7982 7746
7983 EXPECT_EQ(0u, context3d->NumTextures()); 7747 EXPECT_EQ(0u, context3d->NumTextures());
7984 7748
7985 UIResourceId ui_resource_id = 1; 7749 UIResourceId ui_resource_id = 1;
7986 bool is_opaque = false; 7750 bool is_opaque = false;
7987 UIResourceBitmap bitmap(gfx::Size(1, 1), is_opaque); 7751 UIResourceBitmap bitmap(gfx::Size(1, 1), is_opaque);
7988 host_impl_->CreateUIResource(ui_resource_id, bitmap); 7752 host_impl_->CreateUIResource(ui_resource_id, bitmap);
7989 EXPECT_EQ(1u, context3d->NumTextures()); 7753 EXPECT_EQ(1u, context3d->NumTextures());
7990 ResourceId id1 = host_impl_->ResourceIdForUIResource(ui_resource_id); 7754 ResourceId id1 = host_impl_->ResourceIdForUIResource(ui_resource_id);
(...skipping 22 matching lines...) Expand all
8013 7777
8014 // Should not change state for multiple deletion on one UIResourceId 7778 // Should not change state for multiple deletion on one UIResourceId
8015 host_impl_->DeleteUIResource(ui_resource_id); 7779 host_impl_->DeleteUIResource(ui_resource_id);
8016 EXPECT_EQ(0u, context3d->NumTextures()); 7780 EXPECT_EQ(0u, context3d->NumTextures());
8017 } 7781 }
8018 7782
8019 TEST_F(LayerTreeHostImplTest, CreateETC1UIResource) { 7783 TEST_F(LayerTreeHostImplTest, CreateETC1UIResource) {
8020 std::unique_ptr<TestWebGraphicsContext3D> context = 7784 std::unique_ptr<TestWebGraphicsContext3D> context =
8021 TestWebGraphicsContext3D::Create(); 7785 TestWebGraphicsContext3D::Create();
8022 TestWebGraphicsContext3D* context3d = context.get(); 7786 TestWebGraphicsContext3D* context3d = context.get();
8023 CreateHostImpl(DefaultSettings(), FakeOutputSurface::Create3d()); 7787 CreateHostImpl(DefaultSettings(), FakeOutputSurface::CreateDelegating3d());
8024 7788
8025 EXPECT_EQ(0u, context3d->NumTextures()); 7789 EXPECT_EQ(0u, context3d->NumTextures());
8026 7790
8027 gfx::Size size(4, 4); 7791 gfx::Size size(4, 4);
8028 // SkImageInfo has no support for ETC1. The |info| below contains the right 7792 // SkImageInfo has no support for ETC1. The |info| below contains the right
8029 // total pixel size for the bitmap but not the right height and width. The 7793 // total pixel size for the bitmap but not the right height and width. The
8030 // correct width/height are passed directly to UIResourceBitmap. 7794 // correct width/height are passed directly to UIResourceBitmap.
8031 SkImageInfo info = 7795 SkImageInfo info =
8032 SkImageInfo::Make(4, 2, kAlpha_8_SkColorType, kPremul_SkAlphaType); 7796 SkImageInfo::Make(4, 2, kAlpha_8_SkColorType, kPremul_SkAlphaType);
8033 sk_sp<SkPixelRef> pixel_ref(SkMallocPixelRef::NewAllocate(info, 0, 0)); 7797 sk_sp<SkPixelRef> pixel_ref(SkMallocPixelRef::NewAllocate(info, 0, 0));
8034 pixel_ref->setImmutable(); 7798 pixel_ref->setImmutable();
8035 UIResourceBitmap bitmap(std::move(pixel_ref), size); 7799 UIResourceBitmap bitmap(std::move(pixel_ref), size);
8036 UIResourceId ui_resource_id = 1; 7800 UIResourceId ui_resource_id = 1;
8037 host_impl_->CreateUIResource(ui_resource_id, bitmap); 7801 host_impl_->CreateUIResource(ui_resource_id, bitmap);
8038 EXPECT_EQ(1u, context3d->NumTextures()); 7802 EXPECT_EQ(1u, context3d->NumTextures());
8039 ResourceId id1 = host_impl_->ResourceIdForUIResource(ui_resource_id); 7803 ResourceId id1 = host_impl_->ResourceIdForUIResource(ui_resource_id);
8040 EXPECT_NE(0u, id1); 7804 EXPECT_NE(0u, id1);
8041 } 7805 }
8042 7806
8043 void ShutdownReleasesContext_Callback( 7807 void ShutdownReleasesContext_Callback(
8044 std::unique_ptr<CopyOutputResult> result) {} 7808 std::unique_ptr<CopyOutputResult> result) {}
8045 7809
8046 TEST_F(LayerTreeHostImplTest, ShutdownReleasesContext) { 7810 TEST_F(LayerTreeHostImplTest, ShutdownReleasesContext) {
8047 scoped_refptr<TestContextProvider> context_provider = 7811 scoped_refptr<TestContextProvider> context_provider =
8048 TestContextProvider::Create(); 7812 TestContextProvider::Create();
8049 7813
8050 CreateHostImpl(DefaultSettings(), 7814 CreateHostImpl(
8051 FakeOutputSurface::Create3d(context_provider)); 7815 DefaultSettings(),
7816 base::MakeUnique<TestDelegatingOutputSurface>(
7817 context_provider, TestContextProvider::CreateWorker(),
7818 FakeOutputSurface::Create3d(context_provider), nullptr, nullptr,
7819 RendererSettings(), base::ThreadTaskRunnerHandle::Get().get(),
7820 true /* synchronous_composite */));
8052 7821
8053 SetupRootLayerImpl(LayerImpl::Create(host_impl_->active_tree(), 1)); 7822 SetupRootLayerImpl(LayerImpl::Create(host_impl_->active_tree(), 1));
8054 7823
8055 LayerImpl* root = host_impl_->active_tree()->root_layer_for_testing(); 7824 LayerImpl* root = host_impl_->active_tree()->root_layer_for_testing();
8056 root->test_properties()->copy_requests.push_back( 7825 root->test_properties()->copy_requests.push_back(
8057 CopyOutputRequest::CreateRequest( 7826 CopyOutputRequest::CreateRequest(
8058 base::Bind(&ShutdownReleasesContext_Callback))); 7827 base::Bind(&ShutdownReleasesContext_Callback)));
8059 host_impl_->active_tree()->BuildPropertyTreesForTesting(); 7828 host_impl_->active_tree()->BuildPropertyTreesForTesting();
8060 7829
8061 LayerTreeHostImpl::FrameData frame; 7830 LayerTreeHostImpl::FrameData frame;
8062 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); 7831 EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame));
8063 host_impl_->DrawLayers(&frame); 7832 host_impl_->DrawLayers(&frame);
8064 host_impl_->DidDrawAllLayers(frame); 7833 host_impl_->DidDrawAllLayers(frame);
7834 host_impl_->SwapBuffers(frame);
8065 7835
8066 // The CopyOutputResult's callback has a ref on the ContextProvider and a 7836 // The CopyOutputResult's callback has a ref on the ContextProvider and a
8067 // texture in a texture mailbox. 7837 // texture in a texture mailbox.
8068 EXPECT_FALSE(context_provider->HasOneRef()); 7838 EXPECT_FALSE(context_provider->HasOneRef());
8069 EXPECT_EQ(1u, context_provider->TestContext3d()->NumTextures()); 7839 EXPECT_EQ(1u, context_provider->TestContext3d()->NumTextures());
8070 7840
8071 host_impl_->ReleaseOutputSurface(); 7841 host_impl_->ReleaseOutputSurface();
8072 host_impl_ = nullptr; 7842 host_impl_ = nullptr;
8073 7843
8074 // The CopyOutputResult's callback was cancelled, the CopyOutputResult 7844 // The CopyOutputResult's callback was cancelled, the CopyOutputResult
(...skipping 2705 matching lines...) Expand 10 before | Expand all | Expand 10 after
10780 EXPECT_FALSE(host_impl_->use_gpu_rasterization()); 10550 EXPECT_FALSE(host_impl_->use_gpu_rasterization());
10781 EXPECT_FALSE(host_impl_->use_msaa()); 10551 EXPECT_FALSE(host_impl_->use_msaa());
10782 10552
10783 std::unique_ptr<TestWebGraphicsContext3D> context_with_msaa = 10553 std::unique_ptr<TestWebGraphicsContext3D> context_with_msaa =
10784 TestWebGraphicsContext3D::Create(); 10554 TestWebGraphicsContext3D::Create();
10785 context_with_msaa->SetMaxSamples(8); 10555 context_with_msaa->SetMaxSamples(8);
10786 10556
10787 LayerTreeSettings msaaSettings = GpuRasterizationEnabledSettings(); 10557 LayerTreeSettings msaaSettings = GpuRasterizationEnabledSettings();
10788 msaaSettings.gpu_rasterization_msaa_sample_count = 4; 10558 msaaSettings.gpu_rasterization_msaa_sample_count = 4;
10789 EXPECT_TRUE(CreateHostImpl( 10559 EXPECT_TRUE(CreateHostImpl(
10790 msaaSettings, FakeOutputSurface::Create3d(std::move(context_with_msaa)))); 10560 msaaSettings,
10561 FakeOutputSurface::CreateDelegating3d(std::move(context_with_msaa))));
10791 host_impl_->SetHasGpuRasterizationTrigger(true); 10562 host_impl_->SetHasGpuRasterizationTrigger(true);
10792 host_impl_->SetContentIsSuitableForGpuRasterization(false); 10563 host_impl_->SetContentIsSuitableForGpuRasterization(false);
10793 EXPECT_EQ(GpuRasterizationStatus::MSAA_CONTENT, 10564 EXPECT_EQ(GpuRasterizationStatus::MSAA_CONTENT,
10794 host_impl_->gpu_rasterization_status()); 10565 host_impl_->gpu_rasterization_status());
10795 EXPECT_TRUE(host_impl_->use_gpu_rasterization()); 10566 EXPECT_TRUE(host_impl_->use_gpu_rasterization());
10796 EXPECT_TRUE(host_impl_->use_msaa()); 10567 EXPECT_TRUE(host_impl_->use_msaa());
10797 10568
10798 LayerTreeSettings settings = DefaultSettings(); 10569 LayerTreeSettings settings = DefaultSettings();
10799 settings.gpu_rasterization_enabled = false; 10570 settings.gpu_rasterization_enabled = false;
10800 EXPECT_TRUE(CreateHostImpl(settings, FakeOutputSurface::Create3d())); 10571 EXPECT_TRUE(
10572 CreateHostImpl(settings, FakeOutputSurface::CreateDelegating3d()));
10801 host_impl_->SetHasGpuRasterizationTrigger(true); 10573 host_impl_->SetHasGpuRasterizationTrigger(true);
10802 host_impl_->SetContentIsSuitableForGpuRasterization(true); 10574 host_impl_->SetContentIsSuitableForGpuRasterization(true);
10803 EXPECT_EQ(GpuRasterizationStatus::OFF_DEVICE, 10575 EXPECT_EQ(GpuRasterizationStatus::OFF_DEVICE,
10804 host_impl_->gpu_rasterization_status()); 10576 host_impl_->gpu_rasterization_status());
10805 EXPECT_FALSE(host_impl_->use_gpu_rasterization()); 10577 EXPECT_FALSE(host_impl_->use_gpu_rasterization());
10806 10578
10807 settings.gpu_rasterization_forced = true; 10579 settings.gpu_rasterization_forced = true;
10808 EXPECT_TRUE(CreateHostImpl(settings, FakeOutputSurface::Create3d())); 10580 EXPECT_TRUE(
10581 CreateHostImpl(settings, FakeOutputSurface::CreateDelegating3d()));
10809 10582
10810 host_impl_->SetHasGpuRasterizationTrigger(false); 10583 host_impl_->SetHasGpuRasterizationTrigger(false);
10811 host_impl_->SetContentIsSuitableForGpuRasterization(false); 10584 host_impl_->SetContentIsSuitableForGpuRasterization(false);
10812 EXPECT_EQ(GpuRasterizationStatus::ON_FORCED, 10585 EXPECT_EQ(GpuRasterizationStatus::ON_FORCED,
10813 host_impl_->gpu_rasterization_status()); 10586 host_impl_->gpu_rasterization_status());
10814 EXPECT_TRUE(host_impl_->use_gpu_rasterization()); 10587 EXPECT_TRUE(host_impl_->use_gpu_rasterization());
10815 } 10588 }
10816 10589
10817 class MsaaIsSlowLayerTreeHostImplTest : public LayerTreeHostImplTest { 10590 class MsaaIsSlowLayerTreeHostImplTest : public LayerTreeHostImplTest {
10818 public: 10591 public:
10819 void CreateHostImplWithMsaaIsSlow(bool msaa_is_slow) { 10592 void CreateHostImplWithMsaaIsSlow(bool msaa_is_slow) {
10820 LayerTreeSettings settings = DefaultSettings(); 10593 LayerTreeSettings settings = DefaultSettings();
10821 settings.gpu_rasterization_enabled = true; 10594 settings.gpu_rasterization_enabled = true;
10822 settings.gpu_rasterization_msaa_sample_count = 4; 10595 settings.gpu_rasterization_msaa_sample_count = 4;
10823 auto context_provider = TestContextProvider::Create(); 10596 auto context_provider = TestContextProvider::Create();
10824 context_provider->UnboundTestContext3d()->SetMaxSamples(4); 10597 context_provider->UnboundTestContext3d()->SetMaxSamples(4);
10825 context_provider->UnboundTestContext3d()->set_msaa_is_slow(msaa_is_slow); 10598 context_provider->UnboundTestContext3d()->set_msaa_is_slow(msaa_is_slow);
10826 auto msaa_is_normal_output_surface = 10599 auto msaa_is_normal_output_surface =
10827 FakeOutputSurface::Create3d(context_provider); 10600 FakeOutputSurface::CreateDelegating3d(context_provider);
10828 EXPECT_TRUE( 10601 EXPECT_TRUE(
10829 CreateHostImpl(settings, std::move(msaa_is_normal_output_surface))); 10602 CreateHostImpl(settings, std::move(msaa_is_normal_output_surface)));
10830 } 10603 }
10831 }; 10604 };
10832 10605
10833 TEST_F(MsaaIsSlowLayerTreeHostImplTest, GpuRasterizationStatusMsaaIsSlow) { 10606 TEST_F(MsaaIsSlowLayerTreeHostImplTest, GpuRasterizationStatusMsaaIsSlow) {
10834 // Ensure that without the msaa_is_slow cap we raster unsuitable content with 10607 // Ensure that without the msaa_is_slow cap we raster unsuitable content with
10835 // msaa. 10608 // msaa.
10836 CreateHostImplWithMsaaIsSlow(false); 10609 CreateHostImplWithMsaaIsSlow(false);
10837 host_impl_->SetHasGpuRasterizationTrigger(true); 10610 host_impl_->SetHasGpuRasterizationTrigger(true);
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after
11039 settings.gpu_rasterization_forced = true; 10812 settings.gpu_rasterization_forced = true;
11040 10813
11041 host_impl_ = LayerTreeHostImpl::Create( 10814 host_impl_ = LayerTreeHostImpl::Create(
11042 settings, this, &task_runner_provider_, &stats_instrumentation_, 10815 settings, this, &task_runner_provider_, &stats_instrumentation_,
11043 &shared_bitmap_manager_, &gpu_memory_buffer_manager_, &task_graph_runner_, 10816 &shared_bitmap_manager_, &gpu_memory_buffer_manager_, &task_graph_runner_,
11044 AnimationHost::CreateForTesting(ThreadInstance::IMPL), 0); 10817 AnimationHost::CreateForTesting(ThreadInstance::IMPL), 0);
11045 host_impl_->SetVisible(true); 10818 host_impl_->SetVisible(true);
11046 10819
11047 // InitializeRenderer with a gpu-raster enabled output surface. 10820 // InitializeRenderer with a gpu-raster enabled output surface.
11048 auto gpu_raster_output_surface = 10821 auto gpu_raster_output_surface =
11049 FakeOutputSurface::Create3d(TestWebGraphicsContext3D::Create()); 10822 FakeOutputSurface::CreateDelegating3d(TestWebGraphicsContext3D::Create());
11050 host_impl_->InitializeRenderer(gpu_raster_output_surface.get()); 10823 host_impl_->InitializeRenderer(gpu_raster_output_surface.get());
11051 EXPECT_TRUE(host_impl_->use_gpu_rasterization()); 10824 EXPECT_TRUE(host_impl_->use_gpu_rasterization());
11052 10825
11053 // Re-initialize with a software output surface. 10826 // Re-initialize with a software output surface.
11054 output_surface_ = FakeOutputSurface::CreateSoftware( 10827 output_surface_ = FakeOutputSurface::CreateDelegatingSoftware(
11055 base::WrapUnique(new SoftwareOutputDevice)); 10828 base::WrapUnique(new SoftwareOutputDevice));
11056 host_impl_->InitializeRenderer(output_surface_.get()); 10829 host_impl_->InitializeRenderer(output_surface_.get());
11057 EXPECT_FALSE(host_impl_->use_gpu_rasterization()); 10830 EXPECT_FALSE(host_impl_->use_gpu_rasterization());
11058 } 10831 }
11059 10832
11060 } // namespace 10833 } // namespace
11061 } // namespace cc 10834 } // namespace cc
OLDNEW
« cc/test/test_delegating_output_surface.cc ('K') | « cc/test/test_delegating_output_surface.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698