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