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(); 68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) render_pass->CreateAndAppendSharedQuadState(); 698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) for (int i = 0; i < 4000; ++i) { 70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch PictureDrawQuad* quad = 71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_pass->CreateAndAppendDrawQuad<PictureDrawQuad>(); 72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch quad->shared_quad_state = render_pass->shared_quad_state_list.back(); 738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) frame->delegated_frame_data.reset(new DelegatedFrameData); 768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) frame->delegated_frame_data->render_pass_list.push_back(render_pass.Pass()); 778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) RunTest("DelegatedFrame_ManyQuads_1_4000", *frame); 798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(CCMessagesPerfTest, DelegatedFrame_ManyQuads_1_100000) { 828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scoped_ptr<CompositorFrame> frame(new CompositorFrame); 838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scoped_ptr<RenderPass> render_pass = RenderPass::Create(); 85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) render_pass->CreateAndAppendSharedQuadState(); 861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) for (int i = 0; i < 100000; ++i) { 87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch PictureDrawQuad* quad = 88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_pass->CreateAndAppendDrawQuad<PictureDrawQuad>(); 89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch quad->shared_quad_state = render_pass->shared_quad_state_list.back(); 908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) frame->delegated_frame_data.reset(new DelegatedFrameData); 938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) frame->delegated_frame_data->render_pass_list.push_back(render_pass.Pass()); 948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) RunTest("DelegatedFrame_ManyQuads_1_100000", *frame); 968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(CCMessagesPerfTest, DelegatedFrame_ManyQuads_4000_4000) { 998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scoped_ptr<CompositorFrame> frame(new CompositorFrame); 1008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scoped_ptr<RenderPass> render_pass = RenderPass::Create(); 1028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) for (int i = 0; i < 4000; ++i) { 103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) render_pass->CreateAndAppendSharedQuadState(); 104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch PictureDrawQuad* quad = 105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_pass->CreateAndAppendDrawQuad<PictureDrawQuad>(); 106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch quad->shared_quad_state = render_pass->shared_quad_state_list.back(); 1078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 1088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) frame->delegated_frame_data.reset(new DelegatedFrameData); 1108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) frame->delegated_frame_data->render_pass_list.push_back(render_pass.Pass()); 1118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) RunTest("DelegatedFrame_ManyQuads_4000_4000", *frame); 1138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 1148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(CCMessagesPerfTest, DelegatedFrame_ManyQuads_100000_100000) { 1168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scoped_ptr<CompositorFrame> frame(new CompositorFrame); 1178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scoped_ptr<RenderPass> render_pass = RenderPass::Create(); 1191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) for (int i = 0; i < 100000; ++i) { 120010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) render_pass->CreateAndAppendSharedQuadState(); 121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch PictureDrawQuad* quad = 122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_pass->CreateAndAppendDrawQuad<PictureDrawQuad>(); 123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch quad->shared_quad_state = render_pass->shared_quad_state_list.back(); 1248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 1258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) frame->delegated_frame_data.reset(new DelegatedFrameData); 1278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) frame->delegated_frame_data->render_pass_list.push_back(render_pass.Pass()); 1288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) RunTest("DelegatedFrame_ManyQuads_100000_100000", *frame); 1301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 1311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(CCMessagesPerfTest, 1331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DelegatedFrame_ManyRenderPasses_10000_100) { 1341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_ptr<CompositorFrame> frame(new CompositorFrame); 1351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) frame->delegated_frame_data.reset(new DelegatedFrameData); 1368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) for (int i = 0; i < 1000; ++i) { 1381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_ptr<RenderPass> render_pass = RenderPass::Create(); 1391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) for (int j = 0; j < 100; ++j) { 140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) render_pass->CreateAndAppendSharedQuadState(); 141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch PictureDrawQuad* quad = 142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch render_pass->CreateAndAppendDrawQuad<PictureDrawQuad>(); 143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch quad->shared_quad_state = render_pass->shared_quad_state_list.back(); 1441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 1451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) frame->delegated_frame_data->render_pass_list.push_back(render_pass.Pass()); 1468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 1478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) RunTest("DelegatedFrame_ManyRenderPasses_10000_100", *frame); 1498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 1508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 1518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} // namespace 1528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} // namespace content 153