cc_messages_perftest.cc revision 0f1bc08d4cfcc34181b0b5cbf065c40f687bf740
18bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
28bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
38bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// found in the LICENSE file.
48bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
58bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "content/common/cc_messages.h"
68bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
78bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "base/test/launcher/unit_test_launcher.h"
88bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "base/test/test_suite.h"
98bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "cc/output/compositor_frame.h"
108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "ipc/ipc_message.h"
118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "testing/perf/perf_test.h"
138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)using cc::CompositorFrame;
158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)using cc::DelegatedFrameData;
168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)using cc::DrawQuad;
178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)using cc::PictureDrawQuad;
188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)using cc::RenderPass;
198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)using cc::SharedQuadState;
208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)namespace content {
228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)namespace {
238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)static const int kTimeLimitMillis = 2000;
251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)static const int kNumWarmupRuns = 20;
261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)static const int kTimeCheckInterval = 10;
271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class CCMessagesPerfTest : public testing::Test {
291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) protected:
301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  static void RunTest(std::string test_name, const CompositorFrame& frame) {
311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    for (int i = 0; i < kNumWarmupRuns; ++i) {
320f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      IPC::Message msg(1, 2, IPC::Message::PRIORITY_NORMAL);
331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      IPC::ParamTraits<CompositorFrame>::Write(&msg, frame);
341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    base::TimeTicks start = base::TimeTicks::HighResNow();
371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    base::TimeTicks end =
381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        start + base::TimeDelta::FromMilliseconds(kTimeLimitMillis);
391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    base::TimeDelta min_time;
401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    int count = 0;
411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    while (start < end) {
421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      for (int i = 0; i < kTimeCheckInterval; ++i) {
430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        IPC::Message msg(1, 2, IPC::Message::PRIORITY_NORMAL);
441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        IPC::ParamTraits<CompositorFrame>::Write(&msg, frame);
451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        ++count;
461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      }
471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      base::TimeTicks now = base::TimeTicks::HighResNow();
491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      if (now - start < min_time || min_time == base::TimeDelta())
501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        min_time = now - start;
511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      start = base::TimeTicks::HighResNow();
521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    perf_test::PrintResult(
551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        "min_frame_serialization_time",
561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        "",
571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        test_name,
581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        min_time.InMillisecondsF() / kTimeCheckInterval * 1000,
591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        "us",
601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        true);
611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)};
638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(CCMessagesPerfTest, DelegatedFrame_ManyQuads_1_4000) {
658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  scoped_ptr<CompositorFrame> frame(new CompositorFrame);
668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  scoped_ptr<RenderPass> render_pass = RenderPass::Create();
688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  render_pass->shared_quad_state_list.push_back(SharedQuadState::Create());
698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  for (int i = 0; i < 4000; ++i) {
708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    render_pass->quad_list.push_back(
718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        PictureDrawQuad::Create().PassAs<DrawQuad>());
720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    render_pass->quad_list.back()->shared_quad_state =
730f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        render_pass->shared_quad_state_list.back();
748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  frame->delegated_frame_data.reset(new DelegatedFrameData);
778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  frame->delegated_frame_data->render_pass_list.push_back(render_pass.Pass());
788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  RunTest("DelegatedFrame_ManyQuads_1_4000", *frame);
808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(CCMessagesPerfTest, DelegatedFrame_ManyQuads_1_100000) {
838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  scoped_ptr<CompositorFrame> frame(new CompositorFrame);
848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  scoped_ptr<RenderPass> render_pass = RenderPass::Create();
868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  render_pass->shared_quad_state_list.push_back(SharedQuadState::Create());
871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  for (int i = 0; i < 100000; ++i) {
888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    render_pass->quad_list.push_back(
898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        PictureDrawQuad::Create().PassAs<DrawQuad>());
900f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    render_pass->quad_list.back()->shared_quad_state =
910f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        render_pass->shared_quad_state_list.back();
928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  frame->delegated_frame_data.reset(new DelegatedFrameData);
958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  frame->delegated_frame_data->render_pass_list.push_back(render_pass.Pass());
968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  RunTest("DelegatedFrame_ManyQuads_1_100000", *frame);
988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(CCMessagesPerfTest, DelegatedFrame_ManyQuads_4000_4000) {
1018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  scoped_ptr<CompositorFrame> frame(new CompositorFrame);
1028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  scoped_ptr<RenderPass> render_pass = RenderPass::Create();
1048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  for (int i = 0; i < 4000; ++i) {
1058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    render_pass->shared_quad_state_list.push_back(SharedQuadState::Create());
1068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    render_pass->quad_list.push_back(
1078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        PictureDrawQuad::Create().PassAs<DrawQuad>());
1080f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    render_pass->quad_list.back()->shared_quad_state =
1090f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        render_pass->shared_quad_state_list.back();
1108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
1118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  frame->delegated_frame_data.reset(new DelegatedFrameData);
1138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  frame->delegated_frame_data->render_pass_list.push_back(render_pass.Pass());
1148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  RunTest("DelegatedFrame_ManyQuads_4000_4000", *frame);
1168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
1178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(CCMessagesPerfTest, DelegatedFrame_ManyQuads_100000_100000) {
1198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  scoped_ptr<CompositorFrame> frame(new CompositorFrame);
1208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  scoped_ptr<RenderPass> render_pass = RenderPass::Create();
1221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  for (int i = 0; i < 100000; ++i) {
1238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    render_pass->shared_quad_state_list.push_back(SharedQuadState::Create());
1248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    render_pass->quad_list.push_back(
1258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        PictureDrawQuad::Create().PassAs<DrawQuad>());
1260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    render_pass->quad_list.back()->shared_quad_state =
1270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        render_pass->shared_quad_state_list.back();
1288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
1298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  frame->delegated_frame_data.reset(new DelegatedFrameData);
1318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  frame->delegated_frame_data->render_pass_list.push_back(render_pass.Pass());
1328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  RunTest("DelegatedFrame_ManyQuads_100000_100000", *frame);
1341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(CCMessagesPerfTest,
1371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)       DelegatedFrame_ManyRenderPasses_10000_100) {
1381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  scoped_ptr<CompositorFrame> frame(new CompositorFrame);
1391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  frame->delegated_frame_data.reset(new DelegatedFrameData);
1408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  for (int i = 0; i < 1000; ++i) {
1421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    scoped_ptr<RenderPass> render_pass = RenderPass::Create();
1431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    for (int j = 0; j < 100; ++j) {
1441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      render_pass->shared_quad_state_list.push_back(SharedQuadState::Create());
1451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      render_pass->quad_list.push_back(
1461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          PictureDrawQuad::Create().PassAs<DrawQuad>());
1470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      render_pass->quad_list.back()->shared_quad_state =
1480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)          render_pass->shared_quad_state_list.back();
1491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
1501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    frame->delegated_frame_data->render_pass_list.push_back(render_pass.Pass());
1518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
1528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  RunTest("DelegatedFrame_ManyRenderPasses_10000_100", *frame);
1548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
1558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}  // namespace
1578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}  // namespace content
158