12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/delegating_renderer.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/fake_output_surface.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/layer_tree_test.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/render_pass_test_common.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/render_pass_test_utils.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DelegatingRendererTest : public LayerTreeTest { 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DelegatingRendererTest() : LayerTreeTest(), output_surface_(NULL) {} 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~DelegatingRendererTest() {} 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual scoped_ptr<OutputSurface> CreateOutputSurface(bool fallback) 21a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OVERRIDE { 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<FakeOutputSurface> output_surface = 23a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) FakeOutputSurface::CreateDelegating3d(); 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) output_surface_ = output_surface.get(); 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return output_surface.PassAs<OutputSurface>(); 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestWebGraphicsContext3D* context3d_; 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FakeOutputSurface* output_surface_; 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DelegatingRendererTestDraw : public DelegatingRendererTest { 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_tree_host()->SetPageScaleFactorAndLimits(1.f, 0.5f, 4.f); 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual DrawResult PrepareToDrawOnThread( 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostImpl* host_impl, 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LayerTreeHostImpl::FrameData* frame, 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DrawResult draw_result) OVERRIDE { 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, output_surface_->num_sent_frames()); 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const CompositorFrame& last_frame = output_surface_->last_sent_frame(); 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(last_frame.delegated_frame_data); 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(last_frame.gl_frame_data); 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0.f, last_frame.metadata.min_page_scale_factor); 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0.f, last_frame.metadata.max_page_scale_factor); 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return DRAW_SUCCESS; 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 57b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ(0u, output_surface_->num_sent_frames()); 58b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 59b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 60b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, 61b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) bool result) OVERRIDE { 62b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_TRUE(result); 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, output_surface_->num_sent_frames()); 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const CompositorFrame& last_frame = output_surface_->last_sent_frame(); 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DelegatedFrameData* last_frame_data = last_frame.delegated_frame_data.get(); 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(last_frame.delegated_frame_data); 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(last_frame.gl_frame_data); 6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(host_impl->DeviceViewport().ToString(), 7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) last_frame_data->render_pass_list.back()->output_rect.ToString()); 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0.5f, last_frame.metadata.min_page_scale_factor); 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(4.f, last_frame.metadata.max_page_scale_factor); 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ( 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0u, last_frame.delegated_frame_data->resource_list.size()); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, last_frame.delegated_frame_data->render_pass_list.size()); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 82a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_DELEGATING_RENDERER_TEST_F(DelegatingRendererTestDraw); 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DelegatingRendererTestResources : public DelegatingRendererTest { 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void BeginTest() OVERRIDE { 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PostSetNeedsCommitToMainThread(); 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AfterTest() OVERRIDE {} 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual DrawResult PrepareToDrawOnThread(LayerTreeHostImpl* host_impl, 93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) LayerTreeHostImpl::FrameData* frame, 94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DrawResult draw_result) OVERRIDE { 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame->render_passes.clear(); 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) frame->render_passes_by_id.clear(); 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) TestRenderPass* child_pass = AddRenderPass(&frame->render_passes, 9903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) RenderPassId(2, 1), 10003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) gfx::Rect(3, 3, 10, 10), 10103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) gfx::Transform()); 10203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) child_pass->AppendOneOfEveryQuadType(host_impl->resource_provider(), 10303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) RenderPassId(0, 0)); 10403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 10503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) TestRenderPass* pass = AddRenderPass(&frame->render_passes, 10603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) RenderPassId(1, 1), 10703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) gfx::Rect(3, 3, 10, 10), 10803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) gfx::Transform()); 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pass->AppendOneOfEveryQuadType( 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_impl->resource_provider(), child_pass->id); 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return draw_result; 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { 115b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_EQ(0u, output_surface_->num_sent_frames()); 116b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 117b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 118b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void SwapBuffersOnThread(LayerTreeHostImpl* host_impl, 119b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) bool result) OVERRIDE { 120b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_TRUE(result); 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1u, output_surface_->num_sent_frames()); 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const CompositorFrame& last_frame = output_surface_->last_sent_frame(); 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(last_frame.delegated_frame_data); 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2u, last_frame.delegated_frame_data->render_pass_list.size()); 12703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Each render pass has 11 resources in it. And the root render pass has a 1283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // mask resource used when drawing the child render pass, as well as its 12903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // replica (it's added twice). The number 11 may change if 1303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // AppendOneOfEveryQuadType() is updated, and the value here should be 1313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // updated accordingly. 13203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ(24u, last_frame.delegated_frame_data->resource_list.size()); 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndTest(); 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 138a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)SINGLE_AND_MULTI_THREAD_DELEGATING_RENDERER_TEST_F( 139a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) DelegatingRendererTestResources); 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace cc 142