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