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

Unified Diff: cc/trees/layer_tree_host_impl_unittest.cc

Issue 1418273002: cc: Move draw params from SetExternalDrawConstraints to OnDraw (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: EXPECT_SCOPED Created 5 years 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/trees/layer_tree_host_impl.cc ('k') | cc/trees/layer_tree_host_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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));
« no previous file with comments | « cc/trees/layer_tree_host_impl.cc ('k') | cc/trees/layer_tree_host_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698