| OLD | NEW |
| (Empty) |
| 1 // Copyright 2015 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 "cc/surfaces/surface_display_output_surface.h" | |
| 6 | |
| 7 #include <memory> | |
| 8 | |
| 9 #include "cc/output/renderer_settings.h" | |
| 10 #include "cc/output/texture_mailbox_deleter.h" | |
| 11 #include "cc/scheduler/begin_frame_source.h" | |
| 12 #include "cc/scheduler/delay_based_time_source.h" | |
| 13 #include "cc/surfaces/display.h" | |
| 14 #include "cc/surfaces/display_scheduler.h" | |
| 15 #include "cc/surfaces/surface_id_allocator.h" | |
| 16 #include "cc/surfaces/surface_manager.h" | |
| 17 #include "cc/test/fake_output_surface.h" | |
| 18 #include "cc/test/fake_output_surface_client.h" | |
| 19 #include "cc/test/ordered_simple_task_runner.h" | |
| 20 #include "cc/test/test_context_provider.h" | |
| 21 #include "cc/test/test_gpu_memory_buffer_manager.h" | |
| 22 #include "cc/test/test_shared_bitmap_manager.h" | |
| 23 #include "testing/gtest/include/gtest/gtest.h" | |
| 24 | |
| 25 namespace cc { | |
| 26 namespace { | |
| 27 | |
| 28 static constexpr int kArbitraryClientId = 0; | |
| 29 | |
| 30 class SurfaceDisplayOutputSurfaceTest : public testing::Test { | |
| 31 public: | |
| 32 SurfaceDisplayOutputSurfaceTest() | |
| 33 : now_src_(new base::SimpleTestTickClock()), | |
| 34 task_runner_(new OrderedSimpleTaskRunner(now_src_.get(), true)), | |
| 35 allocator_(kArbitraryClientId), | |
| 36 display_size_(1920, 1080), | |
| 37 display_rect_(display_size_), | |
| 38 context_provider_(TestContextProvider::Create()) { | |
| 39 surface_manager_.RegisterSurfaceClientId(allocator_.client_id()); | |
| 40 | |
| 41 std::unique_ptr<FakeOutputSurface> display_output_surface = | |
| 42 FakeOutputSurface::Create3d(); | |
| 43 display_output_surface_ = display_output_surface.get(); | |
| 44 | |
| 45 std::unique_ptr<BeginFrameSource> begin_frame_source( | |
| 46 new BackToBackBeginFrameSource( | |
| 47 base::MakeUnique<DelayBasedTimeSource>(task_runner_.get()))); | |
| 48 | |
| 49 int max_frames_pending = 2; | |
| 50 std::unique_ptr<DisplayScheduler> scheduler(new DisplayScheduler( | |
| 51 begin_frame_source.get(), task_runner_.get(), max_frames_pending)); | |
| 52 | |
| 53 display_.reset(new Display( | |
| 54 &bitmap_manager_, &gpu_memory_buffer_manager_, RendererSettings(), | |
| 55 std::move(begin_frame_source), std::move(display_output_surface), | |
| 56 std::move(scheduler), | |
| 57 base::MakeUnique<TextureMailboxDeleter>(task_runner_.get()))); | |
| 58 delegated_output_surface_.reset(new SurfaceDisplayOutputSurface( | |
| 59 &surface_manager_, &allocator_, display_.get(), context_provider_, | |
| 60 nullptr)); | |
| 61 | |
| 62 delegated_output_surface_->BindToClient(&delegated_output_surface_client_); | |
| 63 display_->Resize(display_size_); | |
| 64 display_->SetVisible(true); | |
| 65 | |
| 66 EXPECT_FALSE( | |
| 67 delegated_output_surface_client_.did_lose_output_surface_called()); | |
| 68 } | |
| 69 | |
| 70 ~SurfaceDisplayOutputSurfaceTest() override {} | |
| 71 | |
| 72 void SwapBuffersWithDamage(const gfx::Rect& damage_rect) { | |
| 73 std::unique_ptr<RenderPass> render_pass(RenderPass::Create()); | |
| 74 render_pass->SetNew(RenderPassId(1, 1), display_rect_, damage_rect, | |
| 75 gfx::Transform()); | |
| 76 | |
| 77 std::unique_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); | |
| 78 frame_data->render_pass_list.push_back(std::move(render_pass)); | |
| 79 | |
| 80 CompositorFrame frame; | |
| 81 frame.delegated_frame_data = std::move(frame_data); | |
| 82 | |
| 83 delegated_output_surface_->SwapBuffers(std::move(frame)); | |
| 84 } | |
| 85 | |
| 86 void SetUp() override { | |
| 87 // Draw the first frame to start in an "unlocked" state. | |
| 88 SwapBuffersWithDamage(display_rect_); | |
| 89 | |
| 90 EXPECT_EQ(0u, display_output_surface_->num_sent_frames()); | |
| 91 task_runner_->RunUntilIdle(); | |
| 92 EXPECT_EQ(1u, display_output_surface_->num_sent_frames()); | |
| 93 } | |
| 94 | |
| 95 protected: | |
| 96 std::unique_ptr<base::SimpleTestTickClock> now_src_; | |
| 97 scoped_refptr<OrderedSimpleTaskRunner> task_runner_; | |
| 98 SurfaceIdAllocator allocator_; | |
| 99 | |
| 100 const gfx::Size display_size_; | |
| 101 const gfx::Rect display_rect_; | |
| 102 SurfaceManager surface_manager_; | |
| 103 TestSharedBitmapManager bitmap_manager_; | |
| 104 TestGpuMemoryBufferManager gpu_memory_buffer_manager_; | |
| 105 | |
| 106 scoped_refptr<TestContextProvider> context_provider_; | |
| 107 FakeOutputSurface* display_output_surface_ = nullptr; | |
| 108 std::unique_ptr<Display> display_; | |
| 109 FakeOutputSurfaceClient delegated_output_surface_client_; | |
| 110 std::unique_ptr<SurfaceDisplayOutputSurface> delegated_output_surface_; | |
| 111 }; | |
| 112 | |
| 113 TEST_F(SurfaceDisplayOutputSurfaceTest, DamageTriggersSwapBuffers) { | |
| 114 SwapBuffersWithDamage(display_rect_); | |
| 115 EXPECT_EQ(1u, display_output_surface_->num_sent_frames()); | |
| 116 task_runner_->RunUntilIdle(); | |
| 117 EXPECT_EQ(2u, display_output_surface_->num_sent_frames()); | |
| 118 } | |
| 119 | |
| 120 TEST_F(SurfaceDisplayOutputSurfaceTest, NoDamageDoesNotTriggerSwapBuffers) { | |
| 121 SwapBuffersWithDamage(gfx::Rect()); | |
| 122 EXPECT_EQ(1u, display_output_surface_->num_sent_frames()); | |
| 123 task_runner_->RunUntilIdle(); | |
| 124 EXPECT_EQ(1u, display_output_surface_->num_sent_frames()); | |
| 125 } | |
| 126 | |
| 127 TEST_F(SurfaceDisplayOutputSurfaceTest, SuspendedDoesNotTriggerSwapBuffers) { | |
| 128 SwapBuffersWithDamage(display_rect_); | |
| 129 EXPECT_EQ(1u, display_output_surface_->num_sent_frames()); | |
| 130 display_output_surface_->set_suspended_for_recycle(true); | |
| 131 task_runner_->RunUntilIdle(); | |
| 132 EXPECT_EQ(1u, display_output_surface_->num_sent_frames()); | |
| 133 SwapBuffersWithDamage(display_rect_); | |
| 134 task_runner_->RunUntilIdle(); | |
| 135 EXPECT_EQ(1u, display_output_surface_->num_sent_frames()); | |
| 136 display_output_surface_->set_suspended_for_recycle(false); | |
| 137 SwapBuffersWithDamage(display_rect_); | |
| 138 task_runner_->RunUntilIdle(); | |
| 139 EXPECT_EQ(2u, display_output_surface_->num_sent_frames()); | |
| 140 } | |
| 141 | |
| 142 TEST_F(SurfaceDisplayOutputSurfaceTest, | |
| 143 LockingResourcesDoesNotIndirectlyCauseDamage) { | |
| 144 delegated_output_surface_->ForceReclaimResources(); | |
| 145 EXPECT_EQ(1u, display_output_surface_->num_sent_frames()); | |
| 146 task_runner_->RunPendingTasks(); | |
| 147 EXPECT_EQ(1u, display_output_surface_->num_sent_frames()); | |
| 148 | |
| 149 SwapBuffersWithDamage(gfx::Rect()); | |
| 150 EXPECT_EQ(1u, display_output_surface_->num_sent_frames()); | |
| 151 task_runner_->RunUntilIdle(); | |
| 152 EXPECT_EQ(1u, display_output_surface_->num_sent_frames()); | |
| 153 } | |
| 154 | |
| 155 } // namespace | |
| 156 } // namespace cc | |
| OLD | NEW |