1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "content/common/cc_messages.h" 6 7 #include "base/test/launcher/unit_test_launcher.h" 8 #include "base/test/test_suite.h" 9 #include "cc/output/compositor_frame.h" 10 #include "ipc/ipc_message.h" 11 #include "testing/gtest/include/gtest/gtest.h" 12 #include "testing/perf/perf_test.h" 13 14 using cc::CompositorFrame; 15 using cc::DelegatedFrameData; 16 using cc::DrawQuad; 17 using cc::PictureDrawQuad; 18 using cc::RenderPass; 19 using cc::SharedQuadState; 20 21 namespace content { 22 namespace { 23 24 static const int kTimeLimitMillis = 2000; 25 static const int kNumWarmupRuns = 20; 26 static const int kTimeCheckInterval = 10; 27 28 class CCMessagesPerfTest : public testing::Test { 29 protected: 30 static void RunTest(std::string test_name, const CompositorFrame& frame) { 31 for (int i = 0; i < kNumWarmupRuns; ++i) { 32 IPC::Message msg(1, 2, IPC::Message::PRIORITY_NORMAL); 33 IPC::ParamTraits<CompositorFrame>::Write(&msg, frame); 34 } 35 36 base::TimeTicks start = base::TimeTicks::HighResNow(); 37 base::TimeTicks end = 38 start + base::TimeDelta::FromMilliseconds(kTimeLimitMillis); 39 base::TimeDelta min_time; 40 int count = 0; 41 while (start < end) { 42 for (int i = 0; i < kTimeCheckInterval; ++i) { 43 IPC::Message msg(1, 2, IPC::Message::PRIORITY_NORMAL); 44 IPC::ParamTraits<CompositorFrame>::Write(&msg, frame); 45 ++count; 46 } 47 48 base::TimeTicks now = base::TimeTicks::HighResNow(); 49 if (now - start < min_time || min_time == base::TimeDelta()) 50 min_time = now - start; 51 start = base::TimeTicks::HighResNow(); 52 } 53 54 perf_test::PrintResult( 55 "min_frame_serialization_time", 56 "", 57 test_name, 58 min_time.InMillisecondsF() / kTimeCheckInterval * 1000, 59 "us", 60 true); 61 } 62 }; 63 64 TEST_F(CCMessagesPerfTest, DelegatedFrame_ManyQuads_1_4000) { 65 scoped_ptr<CompositorFrame> frame(new CompositorFrame); 66 67 scoped_ptr<RenderPass> render_pass = RenderPass::Create(); 68 render_pass->CreateAndAppendSharedQuadState(); 69 for (int i = 0; i < 4000; ++i) { 70 render_pass->quad_list.push_back( 71 PictureDrawQuad::Create().PassAs<DrawQuad>()); 72 render_pass->quad_list.back()->shared_quad_state = 73 render_pass->shared_quad_state_list.back(); 74 } 75 76 frame->delegated_frame_data.reset(new DelegatedFrameData); 77 frame->delegated_frame_data->render_pass_list.push_back(render_pass.Pass()); 78 79 RunTest("DelegatedFrame_ManyQuads_1_4000", *frame); 80 } 81 82 TEST_F(CCMessagesPerfTest, DelegatedFrame_ManyQuads_1_100000) { 83 scoped_ptr<CompositorFrame> frame(new CompositorFrame); 84 85 scoped_ptr<RenderPass> render_pass = RenderPass::Create(); 86 render_pass->CreateAndAppendSharedQuadState(); 87 for (int i = 0; i < 100000; ++i) { 88 render_pass->quad_list.push_back( 89 PictureDrawQuad::Create().PassAs<DrawQuad>()); 90 render_pass->quad_list.back()->shared_quad_state = 91 render_pass->shared_quad_state_list.back(); 92 } 93 94 frame->delegated_frame_data.reset(new DelegatedFrameData); 95 frame->delegated_frame_data->render_pass_list.push_back(render_pass.Pass()); 96 97 RunTest("DelegatedFrame_ManyQuads_1_100000", *frame); 98 } 99 100 TEST_F(CCMessagesPerfTest, DelegatedFrame_ManyQuads_4000_4000) { 101 scoped_ptr<CompositorFrame> frame(new CompositorFrame); 102 103 scoped_ptr<RenderPass> render_pass = RenderPass::Create(); 104 for (int i = 0; i < 4000; ++i) { 105 render_pass->CreateAndAppendSharedQuadState(); 106 render_pass->quad_list.push_back( 107 PictureDrawQuad::Create().PassAs<DrawQuad>()); 108 render_pass->quad_list.back()->shared_quad_state = 109 render_pass->shared_quad_state_list.back(); 110 } 111 112 frame->delegated_frame_data.reset(new DelegatedFrameData); 113 frame->delegated_frame_data->render_pass_list.push_back(render_pass.Pass()); 114 115 RunTest("DelegatedFrame_ManyQuads_4000_4000", *frame); 116 } 117 118 TEST_F(CCMessagesPerfTest, DelegatedFrame_ManyQuads_100000_100000) { 119 scoped_ptr<CompositorFrame> frame(new CompositorFrame); 120 121 scoped_ptr<RenderPass> render_pass = RenderPass::Create(); 122 for (int i = 0; i < 100000; ++i) { 123 render_pass->CreateAndAppendSharedQuadState(); 124 render_pass->quad_list.push_back( 125 PictureDrawQuad::Create().PassAs<DrawQuad>()); 126 render_pass->quad_list.back()->shared_quad_state = 127 render_pass->shared_quad_state_list.back(); 128 } 129 130 frame->delegated_frame_data.reset(new DelegatedFrameData); 131 frame->delegated_frame_data->render_pass_list.push_back(render_pass.Pass()); 132 133 RunTest("DelegatedFrame_ManyQuads_100000_100000", *frame); 134 } 135 136 TEST_F(CCMessagesPerfTest, 137 DelegatedFrame_ManyRenderPasses_10000_100) { 138 scoped_ptr<CompositorFrame> frame(new CompositorFrame); 139 frame->delegated_frame_data.reset(new DelegatedFrameData); 140 141 for (int i = 0; i < 1000; ++i) { 142 scoped_ptr<RenderPass> render_pass = RenderPass::Create(); 143 for (int j = 0; j < 100; ++j) { 144 render_pass->CreateAndAppendSharedQuadState(); 145 render_pass->quad_list.push_back( 146 PictureDrawQuad::Create().PassAs<DrawQuad>()); 147 render_pass->quad_list.back()->shared_quad_state = 148 render_pass->shared_quad_state_list.back(); 149 } 150 frame->delegated_frame_data->render_pass_list.push_back(render_pass.Pass()); 151 } 152 153 RunTest("DelegatedFrame_ManyRenderPasses_10000_100", *frame); 154 } 155 156 } // namespace 157 } // namespace content 158