Chromium Code Reviews| Index: cc/trees/layer_tree_host_impl_unittest.cc |
| diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc |
| index ca513c0848a0927b1ab3bbdc0efd5950663609ed..3bdf7787c527401fc2d5c28e5d0cdb48118568c0 100644 |
| --- a/cc/trees/layer_tree_host_impl_unittest.cc |
| +++ b/cc/trees/layer_tree_host_impl_unittest.cc |
| @@ -6,6 +6,7 @@ |
| #include <algorithm> |
| #include <cmath> |
| +#include <utility> |
| #include "base/bind.h" |
| #include "base/command_line.h" |
| @@ -91,7 +92,8 @@ class LayerTreeHostImplTest : public testing::Test, |
| did_request_next_frame_(false), |
| did_request_prepare_tiles_(false), |
| did_complete_page_scale_animation_(false), |
| - reduce_memory_result_(true) { |
| + reduce_memory_result_(true), |
| + skip_draw_layers_in_on_draw_(false) { |
| media::InitializeMediaLibrary(); |
| } |
| @@ -117,7 +119,6 @@ class LayerTreeHostImplTest : public testing::Test, |
| void SetEstimatedParentDrawTime(base::TimeDelta draw_time) override {} |
| void DidSwapBuffersOnImplThread() override {} |
| void DidSwapBuffersCompleteOnImplThread() override {} |
| - void OnResourcelessSoftareDrawStateChanged(bool resourceless_draw) override {} |
| void OnCanDrawStateChanged(bool can_draw) override { |
| on_can_draw_state_changed_called_ = true; |
| } |
| @@ -153,7 +154,18 @@ class LayerTreeHostImplTest : public testing::Test, |
| void DidCompletePageScaleAnimationOnImplThread() override { |
| did_complete_page_scale_animation_ = true; |
| } |
| - void OnDrawForOutputSurface() override {} |
| + void OnDrawForOutputSurface(bool resourceless_software_draw) override { |
| + scoped_ptr<LayerTreeHostImpl::FrameData> frame( |
| + new LayerTreeHostImpl::FrameData); |
| + EXPECT_EQ(DRAW_SUCCESS, PrepareToDrawFrame(frame.get())); |
| + last_on_draw_render_passes_.clear(); |
| + RenderPass::CopyAll(frame->render_passes, &last_on_draw_render_passes_); |
| + if (!skip_draw_layers_in_on_draw_) |
| + host_impl_->DrawLayers(frame.get()); |
| + host_impl_->DidDrawAllLayers(*frame); |
| + host_impl_->SwapBuffers(*frame); |
| + last_on_draw_frame_ = std::move(frame); |
| + } |
| void PostFrameTimingEventsOnImplThread( |
| scoped_ptr<FrameTimingTracker::CompositeTimingSet> composite_events, |
| scoped_ptr<FrameTimingTracker::MainFrameTimingSet> main_frame_events) |
| @@ -384,46 +396,6 @@ class LayerTreeHostImplTest : public testing::Test, |
| void pinch_zoom_pan_viewport_and_scroll_boundary_test( |
| float device_scale_factor); |
| - void CheckNotifyCalledIfCanDrawChanged(bool always_draw) { |
| - // Note: It is not possible to disable the renderer once it has been set, |
| - // so we do not need to test that disabling the renderer notifies us |
| - // that can_draw changed. |
| - EXPECT_FALSE(host_impl_->CanDraw()); |
| - on_can_draw_state_changed_called_ = false; |
| - |
| - // Set up the root layer, which allows us to draw. |
| - SetupScrollAndContentsLayers(gfx::Size(100, 100)); |
| - EXPECT_TRUE(host_impl_->CanDraw()); |
| - EXPECT_TRUE(on_can_draw_state_changed_called_); |
| - on_can_draw_state_changed_called_ = false; |
| - |
| - // Toggle the root layer to make sure it toggles can_draw |
| - host_impl_->active_tree()->SetRootLayer(nullptr); |
| - EXPECT_FALSE(host_impl_->CanDraw()); |
| - EXPECT_TRUE(on_can_draw_state_changed_called_); |
| - on_can_draw_state_changed_called_ = false; |
| - |
| - SetupScrollAndContentsLayers(gfx::Size(100, 100)); |
| - EXPECT_TRUE(host_impl_->CanDraw()); |
| - EXPECT_TRUE(on_can_draw_state_changed_called_); |
| - on_can_draw_state_changed_called_ = false; |
| - |
| - // Toggle the device viewport size to make sure it toggles can_draw. |
| - host_impl_->SetViewportSize(gfx::Size()); |
| - if (always_draw) { |
| - EXPECT_TRUE(host_impl_->CanDraw()); |
| - } else { |
| - EXPECT_FALSE(host_impl_->CanDraw()); |
| - } |
| - EXPECT_TRUE(on_can_draw_state_changed_called_); |
| - on_can_draw_state_changed_called_ = false; |
| - |
| - host_impl_->SetViewportSize(gfx::Size(100, 100)); |
| - EXPECT_TRUE(host_impl_->CanDraw()); |
| - EXPECT_TRUE(on_can_draw_state_changed_called_); |
| - on_can_draw_state_changed_called_ = false; |
| - } |
| - |
| void SetupMouseMoveAtWithDeviceScale(float device_scale_factor); |
| protected: |
| @@ -456,6 +428,9 @@ class LayerTreeHostImplTest : public testing::Test, |
| bool reduce_memory_result_; |
| base::Closure animation_task_; |
| base::TimeDelta requested_animation_delay_; |
| + bool skip_draw_layers_in_on_draw_; |
| + scoped_ptr<LayerTreeHostImpl::FrameData> last_on_draw_frame_; |
| + RenderPassList last_on_draw_render_passes_; |
| }; |
| // A test fixture for new animation timelines tests. |
| @@ -469,24 +444,60 @@ class LayerTreeHostImplTimelinesTest : public LayerTreeHostImplTest { |
| }; |
| TEST_F(LayerTreeHostImplTest, NotifyIfCanDrawChanged) { |
| - bool always_draw = false; |
| - CheckNotifyCalledIfCanDrawChanged(always_draw); |
| + // Note: It is not possible to disable the renderer once it has been set, |
| + // so we do not need to test that disabling the renderer notifies us |
| + // that can_draw changed. |
| + EXPECT_FALSE(host_impl_->CanDraw()); |
| + on_can_draw_state_changed_called_ = false; |
| + |
| + // Set up the root layer, which allows us to draw. |
| + SetupScrollAndContentsLayers(gfx::Size(100, 100)); |
| + EXPECT_TRUE(host_impl_->CanDraw()); |
| + EXPECT_TRUE(on_can_draw_state_changed_called_); |
| + on_can_draw_state_changed_called_ = false; |
| + |
| + // Toggle the root layer to make sure it toggles can_draw |
| + host_impl_->active_tree()->SetRootLayer(nullptr); |
| + EXPECT_FALSE(host_impl_->CanDraw()); |
| + EXPECT_TRUE(on_can_draw_state_changed_called_); |
| + on_can_draw_state_changed_called_ = false; |
| + |
| + SetupScrollAndContentsLayers(gfx::Size(100, 100)); |
| + EXPECT_TRUE(host_impl_->CanDraw()); |
| + EXPECT_TRUE(on_can_draw_state_changed_called_); |
| + on_can_draw_state_changed_called_ = false; |
| + |
| + // Toggle the device viewport size to make sure it toggles can_draw. |
| + host_impl_->SetViewportSize(gfx::Size()); |
| + EXPECT_FALSE(host_impl_->CanDraw()); |
| + EXPECT_TRUE(on_can_draw_state_changed_called_); |
| + on_can_draw_state_changed_called_ = false; |
| + |
| + host_impl_->SetViewportSize(gfx::Size(100, 100)); |
| + EXPECT_TRUE(host_impl_->CanDraw()); |
| + EXPECT_TRUE(on_can_draw_state_changed_called_); |
| + on_can_draw_state_changed_called_ = false; |
| } |
| -TEST_F(LayerTreeHostImplTest, CanDrawIncompleteFrames) { |
| +TEST_F(LayerTreeHostImplTest, ResourcelessDrawWithEmptyViewport) { |
| CreateHostImpl(DefaultSettings(), |
| FakeOutputSurface::CreateSoftware( |
| make_scoped_ptr(new SoftwareOutputDevice()))); |
| - const gfx::Transform external_transform; |
| - const gfx::Rect external_viewport; |
| - const gfx::Rect external_clip; |
| - const bool resourceless_software_draw = true; |
| - host_impl_->SetExternalDrawConstraints( |
| - external_transform, external_viewport, external_clip, external_viewport, |
| - external_transform, resourceless_software_draw); |
| + SetupScrollAndContentsLayers(gfx::Size(100, 100)); |
| + EXPECT_TRUE(host_impl_->CanDraw()); |
| + host_impl_->SetViewportSize(gfx::Size()); |
| + EXPECT_FALSE(host_impl_->CanDraw()); |
| - bool always_draw = true; |
| - CheckNotifyCalledIfCanDrawChanged(always_draw); |
| + FakeOutputSurface* fake_output_surface = |
| + static_cast<FakeOutputSurface*>(host_impl_->output_surface()); |
| + EXPECT_EQ(fake_output_surface->num_sent_frames(), 0u); |
| + gfx::Transform identity; |
| + gfx::Rect viewport(100, 100); |
| + const bool resourceless_software_draw = true; |
| + host_impl_->OnDraw(identity, viewport, viewport, resourceless_software_draw); |
| + ASSERT_EQ(fake_output_surface->num_sent_frames(), 1u); |
| + EXPECT_EQ(gfx::SizeF(100.f, 100.f), |
| + fake_output_surface->last_sent_frame().metadata.root_layer_size); |
| } |
| TEST_F(LayerTreeHostImplTest, ScrollDeltaNoLayers) { |
| @@ -3382,9 +3393,8 @@ TEST_F(LayerTreeHostImplTest, |
| const gfx::Rect external_viewport; |
| const gfx::Rect external_clip; |
| const bool resourceless_software_draw = true; |
| - host_impl_->SetExternalDrawConstraints( |
| - external_transform, external_viewport, external_clip, external_viewport, |
| - external_transform, resourceless_software_draw); |
| + host_impl_->SetExternalTilePriorityConstraints(external_viewport, |
| + external_transform); |
| std::vector<PrepareToDrawSuccessTestCase> cases; |
| @@ -3409,11 +3419,8 @@ TEST_F(LayerTreeHostImplTest, |
| static_cast<DidDrawCheckLayer*>(host_impl_->active_tree()->root_layer()); |
| root->SetForceRenderSurface(true); |
| - LayerTreeHostImpl::FrameData frame; |
| - EXPECT_EQ(DRAW_SUCCESS, PrepareToDrawFrame(&frame)); |
| - host_impl_->DrawLayers(&frame); |
| - host_impl_->DidDrawAllLayers(frame); |
| - host_impl_->SwapBuffers(frame); |
| + host_impl_->OnDraw(external_transform, external_viewport, external_clip, |
| + resourceless_software_draw); |
| for (size_t i = 0; i < cases.size(); ++i) { |
| const auto& testcase = cases[i]; |
| @@ -3457,11 +3464,8 @@ TEST_F(LayerTreeHostImplTest, |
| if (testcase.high_res_required) |
| host_impl_->SetRequiresHighResToDraw(); |
| - LayerTreeHostImpl::FrameData frame; |
| - EXPECT_EQ(testcase.expected_result, PrepareToDrawFrame(&frame)); |
| - host_impl_->DrawLayers(&frame); |
| - host_impl_->DidDrawAllLayers(frame); |
| - host_impl_->SwapBuffers(frame); |
| + host_impl_->OnDraw(external_transform, external_viewport, external_clip, |
| + resourceless_software_draw); |
| } |
| } |
| @@ -5850,65 +5854,115 @@ class LayerTreeHostImplViewportCoveredTest : public LayerTreeHostImplTest { |
| } |
| // Expect fullscreen gutter rect. |
| - void TestEmptyLayer() { |
| + void SetUpEmptylayer() { |
| gfx::Rect layer_rect(0, 0, 0, 0); |
| child_->SetPosition(gfx::PointF(layer_rect.origin())); |
| child_->SetBounds(layer_rect.size()); |
| child_->SetQuadRect(gfx::Rect(layer_rect.size())); |
| child_->SetQuadVisibleRect(gfx::Rect(layer_rect.size())); |
| + } |
| - LayerTreeHostImpl::FrameData frame; |
| - EXPECT_EQ(DRAW_SUCCESS, PrepareToDrawFrame(&frame)); |
| - ASSERT_EQ(1u, frame.render_passes.size()); |
| + void VerifyEmptyLayerRenderPasses(const RenderPassList& render_passes) { |
| + ASSERT_EQ(1u, render_passes.size()); |
| - EXPECT_EQ(1u, CountGutterQuads(frame.render_passes[0]->quad_list)); |
| - EXPECT_EQ(1u, frame.render_passes[0]->quad_list.size()); |
| - ValidateTextureDrawQuads(frame.render_passes[0]->quad_list); |
| + EXPECT_EQ(1u, CountGutterQuads(render_passes[0]->quad_list)); |
| + EXPECT_EQ(1u, render_passes[0]->quad_list.size()); |
| + ValidateTextureDrawQuads(render_passes[0]->quad_list); |
| - VerifyQuadsExactlyCoverViewport(frame.render_passes[0]->quad_list); |
| + VerifyQuadsExactlyCoverViewport(render_passes[0]->quad_list); |
| + } |
| + |
| + void TestEmptyLayer() { |
| + SetUpEmptylayer(); |
| + LayerTreeHostImpl::FrameData frame; |
| + EXPECT_EQ(DRAW_SUCCESS, PrepareToDrawFrame(&frame)); |
| + VerifyEmptyLayerRenderPasses(frame.render_passes); |
| host_impl_->DidDrawAllLayers(frame); |
| } |
| + void TestEmptyLayerWithOnDraw() { |
| + SetUpEmptylayer(); |
| + gfx::Transform identity; |
| + gfx::Rect viewport(viewport_size_); |
| + bool resourceless_software_draw = true; |
| + host_impl_->OnDraw(identity, viewport, viewport, |
| + resourceless_software_draw); |
| + VerifyEmptyLayerRenderPasses(last_on_draw_render_passes_); |
| + } |
| + |
| // Expect four surrounding gutter rects. |
| - void TestLayerInMiddleOfViewport() { |
| + void SetUpLayerInMiddleOfViewport() { |
| gfx::Rect layer_rect(500, 500, 200, 200); |
| child_->SetPosition(gfx::PointF(layer_rect.origin())); |
| child_->SetBounds(layer_rect.size()); |
| child_->SetQuadRect(gfx::Rect(layer_rect.size())); |
| child_->SetQuadVisibleRect(gfx::Rect(layer_rect.size())); |
| + } |
| - LayerTreeHostImpl::FrameData frame; |
| - EXPECT_EQ(DRAW_SUCCESS, PrepareToDrawFrame(&frame)); |
| - ASSERT_EQ(1u, frame.render_passes.size()); |
| + void VerifyLayerInMiddleOfViewport(const RenderPassList& render_passes) { |
| + ASSERT_EQ(1u, render_passes.size()); |
| - EXPECT_EQ(4u, CountGutterQuads(frame.render_passes[0]->quad_list)); |
| - EXPECT_EQ(5u, frame.render_passes[0]->quad_list.size()); |
| - ValidateTextureDrawQuads(frame.render_passes[0]->quad_list); |
| + EXPECT_EQ(4u, CountGutterQuads(render_passes[0]->quad_list)); |
| + EXPECT_EQ(5u, render_passes[0]->quad_list.size()); |
| + ValidateTextureDrawQuads(render_passes[0]->quad_list); |
| - VerifyQuadsExactlyCoverViewport(frame.render_passes[0]->quad_list); |
| + VerifyQuadsExactlyCoverViewport(render_passes[0]->quad_list); |
| + } |
| + |
| + void TestLayerInMiddleOfViewport() { |
| + SetUpLayerInMiddleOfViewport(); |
| + LayerTreeHostImpl::FrameData frame; |
| + EXPECT_EQ(DRAW_SUCCESS, PrepareToDrawFrame(&frame)); |
| + VerifyLayerInMiddleOfViewport(frame.render_passes); |
| host_impl_->DidDrawAllLayers(frame); |
| } |
| + void TestLayerInMiddleOfViewportWithOnDraw() { |
| + SetUpLayerInMiddleOfViewport(); |
| + gfx::Transform identity; |
| + gfx::Rect viewport(viewport_size_); |
| + bool resourceless_software_draw = true; |
| + host_impl_->OnDraw(identity, viewport, viewport, |
| + resourceless_software_draw); |
| + VerifyLayerInMiddleOfViewport(last_on_draw_render_passes_); |
| + } |
| + |
| // Expect no gutter rects. |
| - void TestLayerIsLargerThanViewport() { |
| + void SetUpLayerIsLargerThanViewport() { |
| gfx::Rect layer_rect(viewport_size_.width() + 10, |
| viewport_size_.height() + 10); |
| child_->SetPosition(gfx::PointF(layer_rect.origin())); |
| child_->SetBounds(layer_rect.size()); |
| child_->SetQuadRect(gfx::Rect(layer_rect.size())); |
| child_->SetQuadVisibleRect(gfx::Rect(layer_rect.size())); |
| + } |
| - LayerTreeHostImpl::FrameData frame; |
| - EXPECT_EQ(DRAW_SUCCESS, PrepareToDrawFrame(&frame)); |
| - ASSERT_EQ(1u, frame.render_passes.size()); |
| + void VerifyLayerIsLargerThanViewport(const RenderPassList& render_passes) { |
| + ASSERT_EQ(1u, render_passes.size()); |
| - EXPECT_EQ(0u, CountGutterQuads(frame.render_passes[0]->quad_list)); |
| - EXPECT_EQ(1u, frame.render_passes[0]->quad_list.size()); |
| - ValidateTextureDrawQuads(frame.render_passes[0]->quad_list); |
| + EXPECT_EQ(0u, CountGutterQuads(render_passes[0]->quad_list)); |
| + EXPECT_EQ(1u, render_passes[0]->quad_list.size()); |
| + ValidateTextureDrawQuads(render_passes[0]->quad_list); |
| + } |
| + void TestLayerIsLargerThanViewport() { |
| + SetUpLayerIsLargerThanViewport(); |
| + LayerTreeHostImpl::FrameData frame; |
| + EXPECT_EQ(DRAW_SUCCESS, PrepareToDrawFrame(&frame)); |
| + VerifyLayerIsLargerThanViewport(frame.render_passes); |
| host_impl_->DidDrawAllLayers(frame); |
| } |
| + void TestLayerIsLargerThanViewportWithOnDraw() { |
| + SetUpLayerIsLargerThanViewport(); |
| + gfx::Transform identity; |
| + gfx::Rect viewport(viewport_size_); |
| + bool resourceless_software_draw = true; |
| + host_impl_->OnDraw(identity, viewport, viewport, |
| + resourceless_software_draw); |
| + VerifyLayerIsLargerThanViewport(last_on_draw_render_passes_); |
| + } |
| + |
| void DidActivateSyncTree() override { did_activate_pending_tree_ = true; } |
| void set_gutter_quad_material(DrawQuad::Material material) { |
| @@ -5959,16 +6013,6 @@ class LayerTreeHostImplViewportCoveredTest : public LayerTreeHostImplTest { |
| size, host_impl_->active_tree()->device_scale_factor()); |
| } |
| - void SetResourcelessSoftwareDraw() { |
| - const gfx::Transform external_transform; |
| - const gfx::Rect external_viewport; |
| - const gfx::Rect external_clip; |
| - const bool resourceless_software_draw = true; |
| - host_impl_->SetExternalDrawConstraints( |
| - external_transform, external_viewport, external_clip, external_viewport, |
| - external_transform, resourceless_software_draw); |
| - } |
| - |
| DrawQuad::Material gutter_quad_material_; |
| gfx::Size gutter_texture_size_; |
| gfx::Size viewport_size_; |
| @@ -6007,10 +6051,10 @@ TEST_F(LayerTreeHostImplViewportCoveredTest, ViewportCoveredScaled) { |
| TEST_F(LayerTreeHostImplViewportCoveredTest, ActiveTreeGrowViewportInvalid) { |
| viewport_size_ = gfx::Size(1000, 1000); |
| + skip_draw_layers_in_on_draw_ = true; // Resourceless can't draw tiled quads. |
| bool software = true; |
| CreateHostImpl(DefaultSettings(), CreateFakeOutputSurface(software)); |
| - SetResourcelessSoftwareDraw(); |
| // Pending tree to force active_tree size invalid. Not used otherwise. |
| host_impl_->CreatePendingTree(); |
| @@ -6018,17 +6062,17 @@ TEST_F(LayerTreeHostImplViewportCoveredTest, ActiveTreeGrowViewportInvalid) { |
| EXPECT_TRUE(host_impl_->active_tree()->ViewportSizeInvalid()); |
| SetupActiveTreeLayers(); |
| - TestEmptyLayer(); |
| - TestLayerInMiddleOfViewport(); |
| - TestLayerIsLargerThanViewport(); |
| + TestEmptyLayerWithOnDraw(); |
|
danakj
2015/12/16 23:57:53
It would be nice to wrap each of these Test calls
boliu
2015/12/17 00:14:07
Done. Copied EXPECT_SCOPED define from scheduler_u
danakj
2015/12/17 00:31:24
Oh I thot it was a general gtest thing. Well, cool
|
| + TestLayerInMiddleOfViewportWithOnDraw(); |
| + TestLayerIsLargerThanViewportWithOnDraw(); |
| } |
| TEST_F(LayerTreeHostImplViewportCoveredTest, ActiveTreeShrinkViewportInvalid) { |
| viewport_size_ = gfx::Size(1000, 1000); |
| + skip_draw_layers_in_on_draw_ = true; // Resourceless can't draw tiled quads. |
| bool software = true; |
| CreateHostImpl(DefaultSettings(), CreateFakeOutputSurface(software)); |
| - SetResourcelessSoftwareDraw(); |
| // Set larger viewport and activate it to active tree. |
| host_impl_->CreatePendingTree(); |
| @@ -6046,9 +6090,9 @@ TEST_F(LayerTreeHostImplViewportCoveredTest, ActiveTreeShrinkViewportInvalid) { |
| EXPECT_TRUE(host_impl_->active_tree()->ViewportSizeInvalid()); |
| SetupActiveTreeLayers(); |
| - TestEmptyLayer(); |
| - TestLayerInMiddleOfViewport(); |
| - TestLayerIsLargerThanViewport(); |
| + TestEmptyLayerWithOnDraw(); |
| + TestLayerInMiddleOfViewportWithOnDraw(); |
| + TestLayerIsLargerThanViewportWithOnDraw(); |
| } |
| class FakeDrawableLayerImpl: public LayerImpl { |
| @@ -6856,17 +6900,14 @@ TEST_F(LayerTreeHostImplTest, ForcedDrawToSoftwareDeviceBasicRender) { |
| const gfx::Rect external_viewport; |
| const gfx::Rect external_clip; |
| const bool resourceless_software_draw = true; |
| - host_impl_->SetExternalDrawConstraints(external_transform, |
| - external_viewport, |
| - external_clip, |
| - external_viewport, |
| - external_transform, |
| - resourceless_software_draw); |
| + host_impl_->SetExternalTilePriorityConstraints(external_viewport, |
| + external_transform); |
| EXPECT_EQ(0, software_device->frames_began_); |
| EXPECT_EQ(0, software_device->frames_ended_); |
| - DrawFrame(); |
| + host_impl_->OnDraw(external_transform, external_viewport, external_clip, |
| + resourceless_software_draw); |
| EXPECT_EQ(1, software_device->frames_began_); |
| EXPECT_EQ(1, software_device->frames_ended_); |
| @@ -6888,12 +6929,8 @@ TEST_F(LayerTreeHostImplTest, |
| const gfx::Rect external_viewport; |
| const gfx::Rect external_clip; |
| const bool resourceless_software_draw = true; |
| - host_impl_->SetExternalDrawConstraints(external_transform, |
| - external_viewport, |
| - external_clip, |
| - external_viewport, |
| - external_transform, |
| - resourceless_software_draw); |
| + host_impl_->SetExternalTilePriorityConstraints(external_viewport, |
| + external_transform); |
| // SolidColorLayerImpl will be drawn. |
| scoped_ptr<SolidColorLayerImpl> root_layer = |
| @@ -6908,13 +6945,12 @@ TEST_F(LayerTreeHostImplTest, |
| root_layer->AddChild(std::move(video_layer)); |
| SetupRootLayerImpl(std::move(root_layer)); |
| - LayerTreeHostImpl::FrameData frame; |
| - EXPECT_EQ(DRAW_SUCCESS, PrepareToDrawFrame(&frame)); |
| - host_impl_->DrawLayers(&frame); |
| - host_impl_->DidDrawAllLayers(frame); |
| + host_impl_->OnDraw(external_transform, external_viewport, external_clip, |
| + resourceless_software_draw); |
| - EXPECT_EQ(1u, frame.will_draw_layers.size()); |
| - EXPECT_EQ(host_impl_->active_tree()->root_layer(), frame.will_draw_layers[0]); |
| + EXPECT_EQ(1u, last_on_draw_frame_->will_draw_layers.size()); |
| + EXPECT_EQ(host_impl_->active_tree()->root_layer(), |
| + last_on_draw_frame_->will_draw_layers[0]); |
| } |
| // Checks that we have a non-0 default allocation if we pass a context that |
| @@ -8436,24 +8472,18 @@ TEST_F(LayerTreeHostImplTest, ExternalTransformReflectedInNextDraw) { |
| LayerImpl* layer = SetupScrollAndContentsLayers(layer_size); |
| layer->SetDrawsContent(true); |
| - host_impl_->SetExternalDrawConstraints(external_transform, |
| - external_viewport, |
| - external_clip, |
| - external_viewport, |
| - external_transform, |
| - resourceless_software_draw); |
| - DrawFrame(); |
| + host_impl_->SetExternalTilePriorityConstraints(external_viewport, |
| + external_transform); |
| + host_impl_->OnDraw(external_transform, external_viewport, external_clip, |
| + resourceless_software_draw); |
| EXPECT_TRANSFORMATION_MATRIX_EQ( |
| external_transform, layer->draw_properties().target_space_transform); |
| external_transform.Translate(20, 20); |
| - host_impl_->SetExternalDrawConstraints(external_transform, |
| - external_viewport, |
| - external_clip, |
| - external_viewport, |
| - external_transform, |
| - resourceless_software_draw); |
| - DrawFrame(); |
| + host_impl_->SetExternalTilePriorityConstraints(external_viewport, |
| + external_transform); |
| + host_impl_->OnDraw(external_transform, external_viewport, external_clip, |
| + resourceless_software_draw); |
| EXPECT_TRANSFORMATION_MATRIX_EQ( |
| external_transform, layer->draw_properties().target_space_transform); |
| } |
| @@ -8461,66 +8491,103 @@ TEST_F(LayerTreeHostImplTest, ExternalTransformReflectedInNextDraw) { |
| TEST_F(LayerTreeHostImplTest, ExternalTransformSetNeedsRedraw) { |
| SetupRootLayerImpl(LayerImpl::Create(host_impl_->active_tree(), 1)); |
| - const gfx::Size layer_size(100, 100); |
| - const gfx::Transform external_transform; |
| - const gfx::Rect external_viewport(layer_size); |
| - const gfx::Rect external_clip1(layer_size); |
| - const gfx::Rect external_clip2(50, 50); |
| + const gfx::Size viewport_size(100, 100); |
| + host_impl_->SetViewportSize(viewport_size); |
| + |
| + const gfx::Transform transform_for_tile_priority; |
| + const gfx::Transform draw_transform; |
| + const gfx::Rect viewport_for_tile_priority1(viewport_size); |
| + const gfx::Rect viewport_for_tile_priority2(50, 50); |
| + const gfx::Rect draw_viewport(viewport_size); |
| + const gfx::Rect clip(viewport_size); |
| bool resourceless_software_draw = false; |
| - resourceless_software_draw = false; |
| - host_impl_->SetExternalDrawConstraints( |
| - external_transform, external_viewport, external_clip1, external_viewport, |
| - external_transform, resourceless_software_draw); |
| - { |
| - // Clear any damage. |
| - LayerTreeHostImpl::FrameData frame; |
| - EXPECT_EQ(DRAW_SUCCESS, PrepareToDrawFrame(&frame)); |
| - host_impl_->DrawLayers(&frame); |
| - host_impl_->DidDrawAllLayers(frame); |
| - host_impl_->SwapBuffers(frame); |
| - } |
| + // Clear any damage. |
| + host_impl_->SetExternalTilePriorityConstraints(viewport_for_tile_priority1, |
| + transform_for_tile_priority); |
| + host_impl_->OnDraw(draw_transform, draw_viewport, clip, |
| + resourceless_software_draw); |
| + last_on_draw_frame_.reset(); |
| // Setting new constraints needs redraw. |
| did_request_redraw_ = false; |
| - host_impl_->SetExternalDrawConstraints( |
| - external_transform, external_viewport, external_clip2, external_viewport, |
| - external_transform, resourceless_software_draw); |
| + host_impl_->SetExternalTilePriorityConstraints(viewport_for_tile_priority2, |
| + transform_for_tile_priority); |
| EXPECT_TRUE(did_request_redraw_); |
| - { |
| - LayerTreeHostImpl::FrameData frame; |
| - EXPECT_EQ(DRAW_SUCCESS, PrepareToDrawFrame(&frame)); |
| - EXPECT_FALSE(frame.has_no_damage); |
| - host_impl_->DrawLayers(&frame); |
| - host_impl_->DidDrawAllLayers(frame); |
| - host_impl_->SwapBuffers(frame); |
| - } |
| + host_impl_->OnDraw(draw_transform, draw_viewport, clip, |
| + resourceless_software_draw); |
| + EXPECT_FALSE(last_on_draw_frame_->has_no_damage); |
| +} |
| - // Resourceless software draw toggles do not need redraw. Damage is |
| - // set externally by SynchronousCompositorOutputSurface in this case. |
| +TEST_F(LayerTreeHostImplTest, OnDrawConstraintSetNeedsRedraw) { |
| + SetupRootLayerImpl(LayerImpl::Create(host_impl_->active_tree(), 1)); |
| - // Setting resourceless_software_draw do not need redraw. |
| + const gfx::Size viewport_size(100, 100); |
| + host_impl_->SetViewportSize(viewport_size); |
| + |
| + const gfx::Transform draw_transform; |
| + const gfx::Rect draw_viewport1(viewport_size); |
| + const gfx::Rect draw_viewport2(50, 50); |
| + const gfx::Rect clip(viewport_size); |
| + bool resourceless_software_draw = false; |
| + |
| + // Clear any damage. |
| + host_impl_->OnDraw(draw_transform, draw_viewport1, clip, |
| + resourceless_software_draw); |
| + last_on_draw_frame_.reset(); |
| + |
| + // Same draw params does not swap. |
| did_request_redraw_ = false; |
| - resourceless_software_draw = true; |
| - host_impl_->SetExternalDrawConstraints( |
| - external_transform, external_viewport, external_clip1, external_viewport, |
| - external_transform, resourceless_software_draw); |
| + host_impl_->OnDraw(draw_transform, draw_viewport1, clip, |
| + resourceless_software_draw); |
| EXPECT_FALSE(did_request_redraw_); |
| - // Can't call PrepareToDrawFrame with no change for resourceless software |
| - // draw. |
| + EXPECT_TRUE(last_on_draw_frame_->has_no_damage); |
| + last_on_draw_frame_.reset(); |
| - // Unsetting resourceless_software_draw do not need redraw. |
| + // Different draw params does swap. |
| did_request_redraw_ = false; |
| - resourceless_software_draw = false; |
| - host_impl_->SetExternalDrawConstraints( |
| - external_transform, external_viewport, external_clip2, external_viewport, |
| - external_transform, resourceless_software_draw); |
| - EXPECT_FALSE(did_request_redraw_); |
| - { |
| - LayerTreeHostImpl::FrameData frame; |
| - EXPECT_EQ(DRAW_SUCCESS, PrepareToDrawFrame(&frame)); |
| - EXPECT_TRUE(frame.has_no_damage); |
| + host_impl_->OnDraw(draw_transform, draw_viewport2, clip, |
| + resourceless_software_draw); |
| + EXPECT_TRUE(did_request_redraw_); |
| + EXPECT_FALSE(last_on_draw_frame_->has_no_damage); |
| +} |
| + |
| +class ResourcelessSoftwareLayerTreeHostImplTest : public LayerTreeHostImplTest { |
| + protected: |
| + scoped_ptr<OutputSurface> CreateOutputSurface() override { |
| + return FakeOutputSurface::Create3dWithResourcelessSoftwareSupport(); |
| } |
| +}; |
| + |
| +TEST_F(ResourcelessSoftwareLayerTreeHostImplTest, |
| + ResourcelessSoftwareSetNeedsRedraw) { |
| + SetupRootLayerImpl(LayerImpl::Create(host_impl_->active_tree(), 1)); |
| + |
| + const gfx::Size viewport_size(100, 100); |
| + host_impl_->SetViewportSize(viewport_size); |
| + |
| + const gfx::Transform draw_transform; |
| + const gfx::Rect draw_viewport(viewport_size); |
| + const gfx::Rect clip(viewport_size); |
| + bool resourceless_software_draw = false; |
| + |
| + // Clear any damage. |
| + host_impl_->OnDraw(draw_transform, draw_viewport, clip, |
| + resourceless_software_draw); |
| + last_on_draw_frame_.reset(); |
| + |
| + // Always swap even if same draw params. |
| + resourceless_software_draw = true; |
| + host_impl_->OnDraw(draw_transform, draw_viewport, clip, |
| + resourceless_software_draw); |
| + EXPECT_FALSE(last_on_draw_frame_->has_no_damage); |
| + last_on_draw_frame_.reset(); |
| + |
| + // Next hardware draw has damage. |
| + resourceless_software_draw = false; |
| + host_impl_->OnDraw(draw_transform, draw_viewport, clip, |
| + resourceless_software_draw); |
| + EXPECT_FALSE(last_on_draw_frame_->has_no_damage); |
| } |
| TEST_F(LayerTreeHostImplTest, ExternalViewportAffectsVisibleRects) { |
| @@ -8542,21 +8609,19 @@ TEST_F(LayerTreeHostImplTest, ExternalViewportAffectsVisibleRects) { |
| gfx::Rect external_viewport(10, 20); |
| gfx::Rect external_clip(layer_size); |
| bool resourceless_software_draw = false; |
| - host_impl_->SetExternalDrawConstraints( |
| - external_transform, external_viewport, external_clip, external_viewport, |
| - external_transform, resourceless_software_draw); |
| - |
| - // Visible rects should now be clipped by the external viewport. |
| - host_impl_->active_tree()->UpdateDrawProperties(update_lcd_text); |
| + host_impl_->SetExternalTilePriorityConstraints(external_viewport, |
| + external_transform); |
| + host_impl_->OnDraw(external_transform, external_viewport, external_clip, |
| + resourceless_software_draw); |
| EXPECT_EQ(gfx::Rect(10, 20), content_layer->visible_layer_rect()); |
| // Clear the external viewport. |
| external_viewport = gfx::Rect(); |
| - host_impl_->SetExternalDrawConstraints( |
| - external_transform, external_viewport, external_clip, external_viewport, |
| - external_transform, resourceless_software_draw); |
| + host_impl_->SetExternalTilePriorityConstraints(external_viewport, |
| + external_transform); |
| - host_impl_->active_tree()->UpdateDrawProperties(update_lcd_text); |
| + host_impl_->OnDraw(external_transform, external_viewport, external_clip, |
| + resourceless_software_draw); |
| EXPECT_EQ(gfx::Rect(90, 90), content_layer->visible_layer_rect()); |
| } |
| @@ -8581,22 +8646,22 @@ TEST_F(LayerTreeHostImplTest, ExternalTransformAffectsVisibleRects) { |
| gfx::Rect external_viewport; |
| gfx::Rect external_clip(layer_size); |
| bool resourceless_software_draw = false; |
| - host_impl_->SetExternalDrawConstraints( |
| - external_transform, external_viewport, external_clip, external_viewport, |
| - external_transform, resourceless_software_draw); |
| + host_impl_->SetExternalTilePriorityConstraints(external_viewport, |
| + external_transform); |
| // Visible rects should now be shifted and scaled because of the external |
| // transform. |
| - host_impl_->active_tree()->UpdateDrawProperties(update_lcd_text); |
| + host_impl_->OnDraw(external_transform, external_viewport, external_clip, |
| + resourceless_software_draw); |
| EXPECT_EQ(gfx::Rect(20, 20), content_layer->visible_layer_rect()); |
| // Clear the external transform. |
| external_transform = gfx::Transform(); |
| - host_impl_->SetExternalDrawConstraints( |
| - external_transform, external_viewport, external_clip, external_viewport, |
| - external_transform, resourceless_software_draw); |
| + host_impl_->SetExternalTilePriorityConstraints(external_viewport, |
| + external_transform); |
| - host_impl_->active_tree()->UpdateDrawProperties(update_lcd_text); |
| + host_impl_->OnDraw(external_transform, external_viewport, external_clip, |
| + resourceless_software_draw); |
| EXPECT_EQ(gfx::Rect(50, 50), content_layer->visible_layer_rect()); |
| } |
| @@ -8632,23 +8697,23 @@ TEST_F(LayerTreeHostImplTest, ExternalTransformAffectsSublayerScaleFactor) { |
| gfx::Rect external_viewport; |
| gfx::Rect external_clip(layer_size); |
| bool resourceless_software_draw = false; |
| - host_impl_->SetExternalDrawConstraints( |
| - external_transform, external_viewport, external_clip, external_viewport, |
| - external_transform, resourceless_software_draw); |
| + host_impl_->SetExternalTilePriorityConstraints(external_viewport, |
| + external_transform); |
| // Transform node's sublayer scale should include the device transform scale. |
| - host_impl_->active_tree()->UpdateDrawProperties(update_lcd_text); |
| + host_impl_->OnDraw(external_transform, external_viewport, external_clip, |
| + resourceless_software_draw); |
| node = host_impl_->active_tree()->property_trees()->transform_tree.Node( |
| test_layer->transform_tree_index()); |
| EXPECT_EQ(node->data.sublayer_scale, gfx::Vector2dF(2.f, 2.f)); |
| // Clear the external transform. |
| external_transform = gfx::Transform(); |
| - host_impl_->SetExternalDrawConstraints( |
| - external_transform, external_viewport, external_clip, external_viewport, |
| - external_transform, resourceless_software_draw); |
| + host_impl_->SetExternalTilePriorityConstraints(external_viewport, |
| + external_transform); |
| - host_impl_->active_tree()->UpdateDrawProperties(update_lcd_text); |
| + host_impl_->OnDraw(external_transform, external_viewport, external_clip, |
| + resourceless_software_draw); |
| node = host_impl_->active_tree()->property_trees()->transform_tree.Node( |
| test_layer->transform_tree_index()); |
| EXPECT_EQ(node->data.sublayer_scale, gfx::Vector2dF(1.f, 1.f)); |