| 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 6976087869b597287f5db6748b536a8f5ea0fa71..b2cc8160761dcda3e939f68d976800951d016fce 100644
|
| --- a/cc/trees/layer_tree_host_impl_unittest.cc
|
| +++ b/cc/trees/layer_tree_host_impl_unittest.cc
|
| @@ -1057,27 +1057,44 @@ class DidDrawCheckLayer : public TiledLayerImpl {
|
| return scoped_ptr<LayerImpl>(new DidDrawCheckLayer(tree_impl, id));
|
| }
|
|
|
| - virtual void DidDraw(ResourceProvider* provider) OVERRIDE {
|
| - did_draw_called_ = true;
|
| + virtual bool WillDraw(DrawMode draw_mode, ResourceProvider* provider)
|
| + OVERRIDE {
|
| + will_draw_called_ = true;
|
| + if (will_draw_returns_false_)
|
| + return false;
|
| + return TiledLayerImpl::WillDraw(draw_mode, provider);
|
| }
|
|
|
| - virtual void WillDraw(ResourceProvider* provider) OVERRIDE {
|
| - will_draw_called_ = true;
|
| + virtual void AppendQuads(QuadSink* quad_sink,
|
| + AppendQuadsData* append_quads_data) OVERRIDE {
|
| + append_quads_called_ = true;
|
| + TiledLayerImpl::AppendQuads(quad_sink, append_quads_data);
|
| + }
|
| +
|
| + virtual void DidDraw(ResourceProvider* provider) OVERRIDE {
|
| + did_draw_called_ = true;
|
| + TiledLayerImpl::DidDraw(provider);
|
| }
|
|
|
| - bool did_draw_called() const { return did_draw_called_; }
|
| bool will_draw_called() const { return will_draw_called_; }
|
| + bool append_quads_called() const { return append_quads_called_; }
|
| + bool did_draw_called() const { return did_draw_called_; }
|
| +
|
| + void set_will_draw_returns_false() { will_draw_returns_false_ = true; }
|
|
|
| void ClearDidDrawCheck() {
|
| - did_draw_called_ = false;
|
| will_draw_called_ = false;
|
| + append_quads_called_ = false;
|
| + did_draw_called_ = false;
|
| }
|
|
|
| protected:
|
| DidDrawCheckLayer(LayerTreeImpl* tree_impl, int id)
|
| : TiledLayerImpl(tree_impl, id),
|
| - did_draw_called_(false),
|
| - will_draw_called_(false) {
|
| + will_draw_returns_false_(false),
|
| + will_draw_called_(false),
|
| + append_quads_called_(false),
|
| + did_draw_called_(false) {
|
| SetAnchorPoint(gfx::PointF());
|
| SetBounds(gfx::Size(10, 10));
|
| SetContentBounds(gfx::Size(10, 10));
|
| @@ -1093,10 +1110,51 @@ class DidDrawCheckLayer : public TiledLayerImpl {
|
| }
|
|
|
| private:
|
| - bool did_draw_called_;
|
| + bool will_draw_returns_false_;
|
| bool will_draw_called_;
|
| + bool append_quads_called_;
|
| + bool did_draw_called_;
|
| };
|
|
|
| +TEST_F(LayerTreeHostImplTest, WillDrawReturningFalseDoesNotCall) {
|
| + // The root layer is always drawn, so run this test on a child layer that
|
| + // will be masked out by the root layer's bounds.
|
| + host_impl_->active_tree()->SetRootLayer(
|
| + DidDrawCheckLayer::Create(host_impl_->active_tree(), 1));
|
| + DidDrawCheckLayer* root = static_cast<DidDrawCheckLayer*>(
|
| + host_impl_->active_tree()->root_layer());
|
| +
|
| + root->AddChild(DidDrawCheckLayer::Create(host_impl_->active_tree(), 2));
|
| + DidDrawCheckLayer* layer =
|
| + static_cast<DidDrawCheckLayer*>(root->children()[0]);
|
| +
|
| + {
|
| + LayerTreeHostImpl::FrameData frame;
|
| + EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect(10, 10)));
|
| + host_impl_->DrawLayers(&frame, base::TimeTicks::Now());
|
| + host_impl_->DidDrawAllLayers(frame);
|
| +
|
| + EXPECT_TRUE(layer->will_draw_called());
|
| + EXPECT_TRUE(layer->append_quads_called());
|
| + EXPECT_TRUE(layer->did_draw_called());
|
| + }
|
| +
|
| + {
|
| + LayerTreeHostImpl::FrameData frame;
|
| +
|
| + layer->set_will_draw_returns_false();
|
| + layer->ClearDidDrawCheck();
|
| +
|
| + EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect(10, 10)));
|
| + host_impl_->DrawLayers(&frame, base::TimeTicks::Now());
|
| + host_impl_->DidDrawAllLayers(frame);
|
| +
|
| + EXPECT_TRUE(layer->will_draw_called());
|
| + EXPECT_FALSE(layer->append_quads_called());
|
| + EXPECT_FALSE(layer->did_draw_called());
|
| + }
|
| +}
|
| +
|
| TEST_F(LayerTreeHostImplTest, DidDrawNotCalledOnHiddenLayer) {
|
| // The root layer is always drawn, so run this test on a child layer that
|
| // will be masked out by the root layer's bounds.
|
| @@ -5749,5 +5807,38 @@ TEST_F(LayerTreeHostImplTest, ForcedDrawToSoftwareDeviceBasicRender) {
|
| EXPECT_TRUE(host_impl_->ActivationStateAsValue());
|
| }
|
|
|
| +TEST_F(LayerTreeHostImplTest,
|
| + ForcedDrawToSoftwareDeviceSkipsUnsupportedLayers) {
|
| + FakeOutputSurface* output_surface = FakeOutputSurface::CreateDeferredGL(
|
| + scoped_ptr<SoftwareOutputDevice>(new CountingSoftwareDevice())).release();
|
| + host_impl_->InitializeRenderer(
|
| + scoped_ptr<OutputSurface>(output_surface));
|
| +
|
| + output_surface->set_forced_draw_to_software_device(true);
|
| + EXPECT_TRUE(output_surface->ForcedDrawToSoftwareDevice());
|
| +
|
| + // SolidColorLayerImpl will be drawn.
|
| + scoped_ptr<SolidColorLayerImpl> root_layer =
|
| + SolidColorLayerImpl::Create(host_impl_->active_tree(), 1);
|
| +
|
| + // VideoLayerImpl will not be drawn.
|
| + FakeVideoFrameProvider provider;
|
| + scoped_ptr<VideoLayerImpl> video_layer =
|
| + VideoLayerImpl::Create(host_impl_->active_tree(), 2, &provider);
|
| + video_layer->SetBounds(gfx::Size(10, 10));
|
| + video_layer->SetContentBounds(gfx::Size(10, 10));
|
| + video_layer->SetDrawsContent(true);
|
| + root_layer->AddChild(video_layer.PassAs<LayerImpl>());
|
| + SetupRootLayerImpl(root_layer.PassAs<LayerImpl>());
|
| +
|
| + LayerTreeHostImpl::FrameData frame;
|
| + EXPECT_TRUE(host_impl_->PrepareToDraw(&frame, gfx::Rect()));
|
| + host_impl_->DrawLayers(&frame, base::TimeTicks::Now());
|
| + host_impl_->DidDrawAllLayers(frame);
|
| +
|
| + EXPECT_EQ(1u, frame.will_draw_layers.size());
|
| + EXPECT_EQ(host_impl_->active_tree()->root_layer(), frame.will_draw_layers[0]);
|
| +}
|
| +
|
| } // namespace
|
| } // namespace cc
|
|
|