Index: cc/layers/delegated_renderer_layer_impl_unittest.cc |
diff --git a/cc/layers/delegated_renderer_layer_impl_unittest.cc b/cc/layers/delegated_renderer_layer_impl_unittest.cc |
index ce6ab56ac07aa18ab86abbebea450dd6a3d3b5a9..04e1b8520cdfbd6622937c95b0d2ab178606cd23 100644 |
--- a/cc/layers/delegated_renderer_layer_impl_unittest.cc |
+++ b/cc/layers/delegated_renderer_layer_impl_unittest.cc |
@@ -132,6 +132,169 @@ class DelegatedRendererLayerImplTestSimple |
DelegatedRendererLayerImpl* delegated_renderer_layer_; |
}; |
+TEST_F(DelegatedRendererLayerImplTest, |
+ ChangeContributingRenderPassForNewFrame) { |
+ FakeDelegatedRendererLayerImpl* fake_delegated_renderer_layer_impl; |
+ { |
+ scoped_ptr<LayerImpl> root_layer = |
+ SolidColorLayerImpl::Create(host_impl_->active_tree(), 1); |
+ scoped_ptr<FakeDelegatedRendererLayerImpl> delegated_renderer_layer = |
+ FakeDelegatedRendererLayerImpl::Create(host_impl_->active_tree(), 2); |
+ |
+ host_impl_->SetViewportSize(gfx::Size(100, 100)); |
+ root_layer->SetBounds(gfx::Size(100, 100)); |
+ root_layer->SetHasRenderSurface(true); |
+ |
+ delegated_renderer_layer->SetPosition(gfx::Point(3, 3)); |
+ delegated_renderer_layer->SetBounds(gfx::Size(10, 10)); |
+ delegated_renderer_layer->SetContentBounds(gfx::Size(10, 10)); |
+ delegated_renderer_layer->SetDrawsContent(true); |
+ delegated_renderer_layer->SetHasRenderSurface(true); |
+ gfx::Transform transform; |
+ transform.Translate(1.0, 1.0); |
+ delegated_renderer_layer->SetTransform(transform); |
+ |
+ RenderPassList delegated_render_passes; |
+ TestRenderPass* pass1 = |
+ AddRenderPass(&delegated_render_passes, RenderPassId(9, 6), |
+ gfx::Rect(6, 6, 6, 6), gfx::Transform(1, 0, 0, 1, 5, 6)); |
+ AddQuad(pass1, gfx::Rect(0, 0, 6, 6), 33u); |
+ TestRenderPass* pass2 = |
+ AddRenderPass(&delegated_render_passes, RenderPassId(9, 7), |
+ gfx::Rect(7, 7, 7, 7), gfx::Transform(1, 0, 0, 1, 7, 8)); |
+ AddQuad(pass2, gfx::Rect(0, 0, 7, 7), 22u); |
+ AddRenderPassQuad(pass2, pass1); |
+ TestRenderPass* pass3 = |
+ AddRenderPass(&delegated_render_passes, RenderPassId(9, 8), |
+ gfx::Rect(0, 0, 8, 8), gfx::Transform(1, 0, 0, 1, 9, 10)); |
+ AddRenderPassQuad(pass3, pass2); |
+ delegated_renderer_layer->SetFrameDataForRenderPasses( |
+ 1.f, delegated_render_passes); |
+ |
+ fake_delegated_renderer_layer_impl = delegated_renderer_layer.get(); |
+ |
+ root_layer->AddChild(delegated_renderer_layer.Pass()); |
+ |
+ host_impl_->active_tree()->SetRootLayer(root_layer.Pass()); |
+ |
+ LayerTreeHostImpl::FrameData frame; |
+ EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); |
+ |
+ // Root layer has one render pass, and delegated renderer layer has two |
+ // contributing render passes and its own render pass. |
+ ASSERT_EQ(4u, frame.render_passes.size()); |
+ |
+ host_impl_->DrawLayers(&frame, gfx::FrameTime::Now()); |
+ host_impl_->DidDrawAllLayers(frame); |
+ } |
+ { |
+ // New frame makes delegated renderer layer loses its contributing render |
+ // passes. |
+ RenderPassList delegated_render_passes; |
+ AddRenderPass(&delegated_render_passes, RenderPassId(9, 8), |
+ gfx::Rect(0, 0, 8, 8), gfx::Transform(1, 0, 0, 1, 9, 10)); |
+ fake_delegated_renderer_layer_impl->SetFrameDataForRenderPasses( |
+ 1.f, delegated_render_passes); |
+ |
+ // Force damage to redraw a new frame. |
+ host_impl_->SetViewportDamage(gfx::Rect(10, 10)); |
+ |
+ LayerTreeHostImpl::FrameData frame; |
+ EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); |
+ |
+ // Each non-DelegatedRendererLayer added one RenderPass. The |
+ // DelegatedRendererLayer added two contributing passes. |
+ ASSERT_EQ(1u, frame.render_passes.size()); |
+ |
+ host_impl_->DrawLayers(&frame, gfx::FrameTime::Now()); |
+ host_impl_->DidDrawAllLayers(frame); |
+ } |
+} |
+ |
+TEST_F(DelegatedRendererLayerImplTest, |
+ ChangeContributingRenderPassNonFullTreeSync) { |
+ FakeDelegatedRendererLayerImpl* fake_delegated_renderer_layer_impl; |
+ { |
+ host_impl_->CreatePendingTree(); |
+ scoped_ptr<LayerImpl> root_layer = |
+ SolidColorLayerImpl::Create(host_impl_->pending_tree(), 1); |
+ scoped_ptr<FakeDelegatedRendererLayerImpl> delegated_renderer_layer = |
+ FakeDelegatedRendererLayerImpl::Create(host_impl_->pending_tree(), 2); |
+ |
+ host_impl_->SetViewportSize(gfx::Size(100, 100)); |
+ root_layer->SetBounds(gfx::Size(100, 100)); |
+ root_layer->SetHasRenderSurface(true); |
+ |
+ delegated_renderer_layer->SetPosition(gfx::Point(3, 3)); |
+ delegated_renderer_layer->SetBounds(gfx::Size(10, 10)); |
+ delegated_renderer_layer->SetContentBounds(gfx::Size(10, 10)); |
+ delegated_renderer_layer->SetDrawsContent(true); |
+ delegated_renderer_layer->SetHasRenderSurface(true); |
+ gfx::Transform transform; |
+ transform.Translate(1.0, 1.0); |
+ delegated_renderer_layer->SetTransform(transform); |
+ |
+ RenderPassList delegated_render_passes; |
+ TestRenderPass* pass1 = |
+ AddRenderPass(&delegated_render_passes, RenderPassId(9, 6), |
+ gfx::Rect(6, 6, 6, 6), gfx::Transform(1, 0, 0, 1, 5, 6)); |
+ AddQuad(pass1, gfx::Rect(0, 0, 6, 6), 33u); |
+ TestRenderPass* pass2 = |
+ AddRenderPass(&delegated_render_passes, RenderPassId(9, 7), |
+ gfx::Rect(7, 7, 7, 7), gfx::Transform(1, 0, 0, 1, 7, 8)); |
+ AddQuad(pass2, gfx::Rect(0, 0, 7, 7), 22u); |
+ AddRenderPassQuad(pass2, pass1); |
+ TestRenderPass* pass3 = |
+ AddRenderPass(&delegated_render_passes, RenderPassId(9, 8), |
+ gfx::Rect(0, 0, 8, 8), gfx::Transform(1, 0, 0, 1, 9, 10)); |
+ AddRenderPassQuad(pass3, pass2); |
+ delegated_renderer_layer->SetFrameDataForRenderPasses( |
+ 1.f, delegated_render_passes); |
+ |
+ fake_delegated_renderer_layer_impl = delegated_renderer_layer.get(); |
+ |
+ root_layer->AddChild(delegated_renderer_layer.Pass()); |
+ |
+ host_impl_->pending_tree()->SetRootLayer(root_layer.Pass()); |
+ host_impl_->ActivateSyncTree(); |
+ |
+ LayerTreeHostImpl::FrameData frame; |
+ EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); |
+ |
+ // Root layer has one render pass, and delegated renderer layer has two |
+ // contributing render passes and its own render pass. |
+ ASSERT_EQ(4u, frame.render_passes.size()); |
+ |
+ host_impl_->DrawLayers(&frame, gfx::FrameTime::Now()); |
+ host_impl_->DidDrawAllLayers(frame); |
+ } |
+ { |
+ // Remove contributing render passes from the delegated renderer layer. |
+ host_impl_->CreatePendingTree(); |
+ host_impl_->pending_tree()->set_needs_full_tree_sync(false); |
+ RenderPassList delegated_render_passes; |
+ AddRenderPass(&delegated_render_passes, RenderPassId(9, 8), |
+ gfx::Rect(0, 0, 8, 8), gfx::Transform(1, 0, 0, 1, 9, 10)); |
+ |
+ fake_delegated_renderer_layer_impl->SetFrameDataForRenderPasses( |
+ 1.f, delegated_render_passes); |
+ |
+ // Force damage to redraw a new frame. |
+ |
+ host_impl_->ActivateSyncTree(); |
+ host_impl_->SetViewportDamage(gfx::Rect(100, 100)); |
+ LayerTreeHostImpl::FrameData frame; |
+ EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); |
+ |
+ // Root layer has one render pass, and delegated renderer layer no longer |
+ // has contributing render passes. |
+ ASSERT_EQ(1u, frame.render_passes.size()); |
+ |
+ host_impl_->DrawLayers(&frame, gfx::FrameTime::Now()); |
+ host_impl_->DidDrawAllLayers(frame); |
+ } |
+} |
+ |
TEST_F(DelegatedRendererLayerImplTestSimple, AddsContributingRenderPasses) { |
LayerTreeHostImpl::FrameData frame; |
EXPECT_EQ(DRAW_SUCCESS, host_impl_->PrepareToDraw(&frame)); |