Chromium Code Reviews| Index: cc/surfaces/surface_aggregator_perftest.cc |
| diff --git a/cc/surfaces/surface_aggregator_perftest.cc b/cc/surfaces/surface_aggregator_perftest.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..a9d18baca4671b0852dc720f26850ce029bb7cb2 |
| --- /dev/null |
| +++ b/cc/surfaces/surface_aggregator_perftest.cc |
| @@ -0,0 +1,136 @@ |
| +// Copyright 2015 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "cc/debug/lap_timer.h" |
| +#include "cc/output/compositor_frame.h" |
| +#include "cc/output/delegated_frame_data.h" |
| +#include "cc/quads/surface_draw_quad.h" |
| +#include "cc/quads/texture_draw_quad.h" |
| +#include "cc/surfaces/surface_aggregator.h" |
| +#include "cc/surfaces/surface_factory.h" |
| +#include "cc/surfaces/surface_factory_client.h" |
| +#include "cc/surfaces/surface_manager.h" |
| +#include "cc/test/fake_output_surface.h" |
| +#include "cc/test/fake_output_surface_client.h" |
| +#include "cc/test/test_shared_bitmap_manager.h" |
| +#include "testing/gtest/include/gtest/gtest.h" |
| +#include "testing/perf/perf_test.h" |
| + |
| +namespace cc { |
| +namespace { |
| + |
| +static const int kTimeLimitMillis = 3000; |
| +static const int kWarmupRuns = 5; |
| +static const int kTimeCheckInterval = 10; |
|
jamesr
2015/04/15 23:59:49
these feel familiar - should they be part of a har
|
| + |
| +class EmptySurfaceFactoryClient : public SurfaceFactoryClient { |
| + public: |
| + void ReturnResources(const ReturnedResourceArray& resources) override {} |
| +}; |
| + |
| +class SurfaceAggregatorPerfTest : public testing::Test { |
| + public: |
| + SurfaceAggregatorPerfTest() |
| + : factory_(&manager_, &empty_client_), |
| + timer_(kWarmupRuns, |
| + base::TimeDelta::FromMilliseconds(kTimeLimitMillis), |
| + kTimeCheckInterval) { |
| + output_surface_ = FakeOutputSurface::CreateSoftware( |
| + make_scoped_ptr(new SoftwareOutputDevice)); |
| + output_surface_->BindToClient(&output_surface_client_); |
| + shared_bitmap_manager_.reset(new TestSharedBitmapManager); |
| + |
| + resource_provider_ = ResourceProvider::Create(output_surface_.get(), |
| + shared_bitmap_manager_.get(), |
| + NULL, NULL, 0, false, 1); |
|
jamesr
2015/04/15 23:59:49
s/NULL/nullptr/g
|
| + aggregator_.reset( |
| + new SurfaceAggregator(&manager_, resource_provider_.get())); |
| + } |
| + |
| + void RunTest(int num_surfaces, |
| + int num_textures, |
| + float opacity, |
| + const std::string& name) { |
| + for (int i = 1; i <= num_surfaces; i++) { |
| + factory_.Create(SurfaceId(i)); |
| + scoped_ptr<RenderPass> pass(RenderPass::Create()); |
| + scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); |
| + |
| + SharedQuadState* sqs = pass->CreateAndAppendSharedQuadState(); |
| + for (int j = 0; j < num_textures; j++) { |
| + TransferableResource resource; |
| + resource.id = j; |
| + resource.is_software = true; |
| + frame_data->resource_list.push_back(resource); |
| + |
| + TextureDrawQuad* quad = |
| + pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); |
| + const gfx::Rect rect; |
|
jamesr
2015/04/15 23:59:49
we should prooobably make these nonempty since dro
|
| + const gfx::Rect opaque_rect; |
| + const gfx::Rect visible_rect; |
| + bool needs_blending = false; |
| + bool premultiplied_alpha = false; |
| + const gfx::PointF uv_top_left; |
| + const gfx::PointF uv_bottom_right; |
| + SkColor background_color = SK_ColorGREEN; |
| + const float vertex_opacity[4] = {0.f, 0.f, 1.f, 1.f}; |
| + bool flipped = false; |
| + bool nearest_neighbor = false; |
| + quad->SetAll(sqs, rect, opaque_rect, visible_rect, needs_blending, j, |
| + premultiplied_alpha, uv_top_left, uv_bottom_right, |
| + background_color, vertex_opacity, flipped, |
| + nearest_neighbor); |
| + } |
| + sqs = pass->CreateAndAppendSharedQuadState(); |
| + sqs->opacity = opacity; |
| + if (i > 1) { |
| + SurfaceDrawQuad* surface_quad = |
| + pass->CreateAndAppendDrawQuad<SurfaceDrawQuad>(); |
| + surface_quad->SetNew(sqs, gfx::Rect(0, 0, 1, 1), gfx::Rect(0, 0, 1, 1), |
| + SurfaceId(i - 1)); |
| + } |
| + |
| + frame_data->render_pass_list.push_back(pass.Pass()); |
| + scoped_ptr<CompositorFrame> frame(new CompositorFrame); |
| + frame->delegated_frame_data = frame_data.Pass(); |
| + factory_.SubmitFrame(SurfaceId(i), frame.Pass(), |
| + SurfaceFactory::DrawCallback()); |
| + } |
| + |
| + timer_.Reset(); |
| + do { |
| + scoped_ptr<CompositorFrame> aggregated = |
| + aggregator_->Aggregate(SurfaceId(num_surfaces)); |
| + timer_.NextLap(); |
| + } while (!timer_.HasTimeLimitExpired()); |
| + |
| + perf_test::PrintResult("aggregator_speed", "", name, timer_.LapsPerSecond(), |
| + "runs/s", true); |
| + |
| + for (int i = 1; i <= num_surfaces; i++) |
| + factory_.Destroy(SurfaceId(i)); |
| + } |
| + |
| + protected: |
| + SurfaceManager manager_; |
| + EmptySurfaceFactoryClient empty_client_; |
| + SurfaceFactory factory_; |
| + FakeOutputSurfaceClient output_surface_client_; |
| + scoped_ptr<OutputSurface> output_surface_; |
| + scoped_ptr<SharedBitmapManager> shared_bitmap_manager_; |
| + scoped_ptr<ResourceProvider> resource_provider_; |
| + scoped_ptr<SurfaceAggregator> aggregator_; |
| + LapTimer timer_; |
| +}; |
| + |
| +TEST_F(SurfaceAggregatorPerfTest, ManySurfacesOpaque) { |
| + RunTest(20, 100, 1.f, "many_surfaces_opaque"); |
| +} |
| + |
| +TEST_F(SurfaceAggregatorPerfTest, ManySurfacesTransparent) { |
| + RunTest(20, 100, .5f, "many_surfaces_transparent"); |
| +} |
| + |
| +} // namespace |
| +} // namespace cc |