diff options
Diffstat (limited to 'chromium/components/viz/service/surfaces/surface_unittest.cc')
-rw-r--r-- | chromium/components/viz/service/surfaces/surface_unittest.cc | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/chromium/components/viz/service/surfaces/surface_unittest.cc b/chromium/components/viz/service/surfaces/surface_unittest.cc new file mode 100644 index 00000000000..c332b2a5d83 --- /dev/null +++ b/chromium/components/viz/service/surfaces/surface_unittest.cc @@ -0,0 +1,114 @@ +// Copyright 2014 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 "components/viz/service/surfaces/surface.h" +#include "base/memory/ptr_util.h" +#include "cc/test/scheduler_test_common.h" +#include "components/viz/common/quads/copy_output_result.h" +#include "components/viz/common/surfaces/local_surface_id_allocator.h" +#include "components/viz/service/frame_sinks/compositor_frame_sink_support.h" +#include "components/viz/service/frame_sinks/frame_sink_manager_impl.h" +#include "components/viz/service/surfaces/surface_dependency_tracker.h" +#include "components/viz/test/begin_frame_args_test.h" +#include "components/viz/test/compositor_frame_helpers.h" +#include "components/viz/test/fake_external_begin_frame_source.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "ui/gfx/geometry/size.h" + +namespace viz { +namespace { + +constexpr FrameSinkId kArbitraryFrameSinkId(1, 1); +constexpr bool kIsRoot = true; +constexpr bool kNeedsSyncPoints = true; + +TEST(SurfaceTest, SurfaceLifetime) { + FrameSinkManagerImpl frame_sink_manager( + SurfaceManager::LifetimeType::SEQUENCES); + SurfaceManager* surface_manager = frame_sink_manager.surface_manager(); + auto support = CompositorFrameSinkSupport::Create( + nullptr, &frame_sink_manager, kArbitraryFrameSinkId, kIsRoot, + kNeedsSyncPoints); + + LocalSurfaceId local_surface_id(6, base::UnguessableToken::Create()); + SurfaceId surface_id(kArbitraryFrameSinkId, local_surface_id); + support->SubmitCompositorFrame(local_surface_id, test::MakeCompositorFrame()); + EXPECT_TRUE(surface_manager->GetSurfaceForId(surface_id)); + support->EvictCurrentSurface(); + + EXPECT_EQ(NULL, surface_manager->GetSurfaceForId(surface_id)); +} + +TEST(SurfaceTest, SurfaceIds) { + for (size_t i = 0; i < 3; ++i) { + LocalSurfaceIdAllocator allocator; + LocalSurfaceId id1 = allocator.GenerateId(); + LocalSurfaceId id2 = allocator.GenerateId(); + EXPECT_NE(id1, id2); + } +} + +void TestCopyResultCallback(bool* called, + std::unique_ptr<CopyOutputResult> result) { + *called = true; +} + +// Test that CopyOutputRequests can outlive the current frame and be +// aggregated on the next frame. +TEST(SurfaceTest, CopyRequestLifetime) { + FrameSinkManagerImpl frame_sink_manager; + SurfaceManager* surface_manager = frame_sink_manager.surface_manager(); + auto support = CompositorFrameSinkSupport::Create( + nullptr, &frame_sink_manager, kArbitraryFrameSinkId, kIsRoot, + kNeedsSyncPoints); + + LocalSurfaceId local_surface_id(6, base::UnguessableToken::Create()); + SurfaceId surface_id(kArbitraryFrameSinkId, local_surface_id); + cc::CompositorFrame frame = test::MakeCompositorFrame(); + support->SubmitCompositorFrame(local_surface_id, std::move(frame)); + Surface* surface = surface_manager->GetSurfaceForId(surface_id); + ASSERT_TRUE(!!surface); + + bool copy_called = false; + support->RequestCopyOfSurface(CopyOutputRequest::CreateRequest( + base::BindOnce(&TestCopyResultCallback, ©_called))); + EXPECT_TRUE(surface_manager->GetSurfaceForId(surface_id)); + EXPECT_FALSE(copy_called); + + int max_frame = 3, start_id = 200; + for (int i = 0; i < max_frame; ++i) { + cc::CompositorFrame frame = test::MakeEmptyCompositorFrame(); + frame.render_pass_list.push_back(cc::RenderPass::Create()); + frame.render_pass_list.back()->id = i * 3 + start_id; + frame.render_pass_list.push_back(cc::RenderPass::Create()); + frame.render_pass_list.back()->id = i * 3 + start_id + 1; + frame.render_pass_list.push_back(cc::RenderPass::Create()); + frame.render_pass_list.back()->SetNew(i * 3 + start_id + 2, + gfx::Rect(0, 0, 20, 20), gfx::Rect(), + gfx::Transform()); + support->SubmitCompositorFrame(local_surface_id, std::move(frame)); + } + + int last_pass_id = (max_frame - 1) * 3 + start_id + 2; + // The copy request should stay on the Surface until TakeCopyOutputRequests + // is called. + EXPECT_FALSE(copy_called); + EXPECT_EQ( + 1u, + surface->GetActiveFrame().render_pass_list.back()->copy_requests.size()); + + Surface::CopyRequestsMap copy_requests; + surface->TakeCopyOutputRequests(©_requests); + EXPECT_EQ(1u, copy_requests.size()); + // Last (root) pass should receive copy request. + ASSERT_EQ(1u, copy_requests.count(last_pass_id)); + EXPECT_FALSE(copy_called); + copy_requests.find(last_pass_id)->second->SendEmptyResult(); + EXPECT_TRUE(copy_called); + + support->EvictCurrentSurface(); +} + +} // namespace +} // namespace viz |