| 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..066302b6be53707f90eb03b16ba32a7dbadb12f7 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"
|
| @@ -68,6 +69,12 @@
|
| #include "ui/gfx/geometry/size_conversions.h"
|
| #include "ui/gfx/geometry/vector2d_conversions.h"
|
|
|
| +#define EXPECT_SCOPED(statements) \
|
| + { \
|
| + SCOPED_TRACE(""); \
|
| + statements; \
|
| + }
|
| +
|
| using ::testing::Mock;
|
| using ::testing::Return;
|
| using ::testing::AnyNumber;
|
| @@ -91,7 +98,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 +125,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 +160,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 +402,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 +434,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 +450,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 +3399,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 +3425,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 +3470,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 +5860,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 +6019,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_;
|
| @@ -5984,10 +6034,10 @@ TEST_F(LayerTreeHostImplViewportCoveredTest, ViewportCovered) {
|
|
|
| host_impl_->SetViewportSize(DipSizeToPixelSize(viewport_size_));
|
| SetupActiveTreeLayers();
|
| - TestLayerCoversFullViewport();
|
| - TestEmptyLayer();
|
| - TestLayerInMiddleOfViewport();
|
| - TestLayerIsLargerThanViewport();
|
| + EXPECT_SCOPED(TestLayerCoversFullViewport());
|
| + EXPECT_SCOPED(TestEmptyLayer());
|
| + EXPECT_SCOPED(TestLayerInMiddleOfViewport());
|
| + EXPECT_SCOPED(TestLayerIsLargerThanViewport());
|
| }
|
|
|
| TEST_F(LayerTreeHostImplViewportCoveredTest, ViewportCoveredScaled) {
|
| @@ -5999,18 +6049,18 @@ TEST_F(LayerTreeHostImplViewportCoveredTest, ViewportCoveredScaled) {
|
| host_impl_->active_tree()->SetDeviceScaleFactor(2.f);
|
| host_impl_->SetViewportSize(DipSizeToPixelSize(viewport_size_));
|
| SetupActiveTreeLayers();
|
| - TestLayerCoversFullViewport();
|
| - TestEmptyLayer();
|
| - TestLayerInMiddleOfViewport();
|
| - TestLayerIsLargerThanViewport();
|
| + EXPECT_SCOPED(TestLayerCoversFullViewport());
|
| + EXPECT_SCOPED(TestEmptyLayer());
|
| + EXPECT_SCOPED(TestLayerInMiddleOfViewport());
|
| + EXPECT_SCOPED(TestLayerIsLargerThanViewport());
|
| }
|
|
|
| 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 +6068,17 @@ TEST_F(LayerTreeHostImplViewportCoveredTest, ActiveTreeGrowViewportInvalid) {
|
| EXPECT_TRUE(host_impl_->active_tree()->ViewportSizeInvalid());
|
|
|
| SetupActiveTreeLayers();
|
| - TestEmptyLayer();
|
| - TestLayerInMiddleOfViewport();
|
| - TestLayerIsLargerThanViewport();
|
| + EXPECT_SCOPED(TestEmptyLayerWithOnDraw());
|
| + EXPECT_SCOPED(TestLayerInMiddleOfViewportWithOnDraw());
|
| + EXPECT_SCOPED(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 +6096,9 @@ TEST_F(LayerTreeHostImplViewportCoveredTest, ActiveTreeShrinkViewportInvalid) {
|
| EXPECT_TRUE(host_impl_->active_tree()->ViewportSizeInvalid());
|
|
|
| SetupActiveTreeLayers();
|
| - TestEmptyLayer();
|
| - TestLayerInMiddleOfViewport();
|
| - TestLayerIsLargerThanViewport();
|
| + EXPECT_SCOPED(TestEmptyLayerWithOnDraw());
|
| + EXPECT_SCOPED(TestLayerInMiddleOfViewportWithOnDraw());
|
| + EXPECT_SCOPED(TestLayerIsLargerThanViewportWithOnDraw());
|
| }
|
|
|
| class FakeDrawableLayerImpl: public LayerImpl {
|
| @@ -6856,17 +6906,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 +6935,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 +6951,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 +8478,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 +8497,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 +8615,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 +8652,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 +8703,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));
|
|
|