| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/surfaces/surface_display_output_surface.h" | 5 #include "cc/surfaces/surface_display_output_surface.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 | 8 |
| 9 #include "cc/surfaces/onscreen_display_client.h" | 9 #include "cc/output/renderer_settings.h" |
| 10 #include "cc/scheduler/begin_frame_source.h" |
| 11 #include "cc/surfaces/display.h" |
| 10 #include "cc/surfaces/surface_id_allocator.h" | 12 #include "cc/surfaces/surface_id_allocator.h" |
| 11 #include "cc/surfaces/surface_manager.h" | 13 #include "cc/surfaces/surface_manager.h" |
| 12 #include "cc/test/fake_output_surface.h" | 14 #include "cc/test/fake_output_surface.h" |
| 13 #include "cc/test/fake_output_surface_client.h" | 15 #include "cc/test/fake_output_surface_client.h" |
| 14 #include "cc/test/ordered_simple_task_runner.h" | 16 #include "cc/test/ordered_simple_task_runner.h" |
| 15 #include "cc/test/test_context_provider.h" | 17 #include "cc/test/test_context_provider.h" |
| 16 #include "cc/test/test_gpu_memory_buffer_manager.h" | 18 #include "cc/test/test_gpu_memory_buffer_manager.h" |
| 17 #include "cc/test/test_shared_bitmap_manager.h" | 19 #include "cc/test/test_shared_bitmap_manager.h" |
| 18 #include "testing/gtest/include/gtest/gtest.h" | 20 #include "testing/gtest/include/gtest/gtest.h" |
| 19 | 21 |
| 20 namespace cc { | 22 namespace cc { |
| 21 namespace { | 23 namespace { |
| 22 | 24 |
| 23 class FakeOnscreenDisplayClient : public OnscreenDisplayClient { | |
| 24 public: | |
| 25 FakeOnscreenDisplayClient( | |
| 26 SurfaceManager* manager, | |
| 27 SharedBitmapManager* bitmap_manager, | |
| 28 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, | |
| 29 const RendererSettings& settings, | |
| 30 scoped_refptr<base::SingleThreadTaskRunner> task_runner, | |
| 31 uint32_t compositor_surface_namespace) | |
| 32 : OnscreenDisplayClient(FakeOutputSurface::Create3d(), | |
| 33 manager, | |
| 34 bitmap_manager, | |
| 35 gpu_memory_buffer_manager, | |
| 36 settings, | |
| 37 task_runner, | |
| 38 compositor_surface_namespace) { | |
| 39 // Ownership is passed to another object later, store a pointer | |
| 40 // to it now for future reference. | |
| 41 fake_output_surface_ = | |
| 42 static_cast<FakeOutputSurface*>(output_surface_.get()); | |
| 43 fake_output_surface_->set_max_frames_pending(2); | |
| 44 } | |
| 45 | |
| 46 FakeOutputSurface* output_surface() { return fake_output_surface_; } | |
| 47 | |
| 48 protected: | |
| 49 FakeOutputSurface* fake_output_surface_; | |
| 50 }; | |
| 51 | |
| 52 class SurfaceDisplayOutputSurfaceTest : public testing::Test { | 25 class SurfaceDisplayOutputSurfaceTest : public testing::Test { |
| 53 public: | 26 public: |
| 54 SurfaceDisplayOutputSurfaceTest() | 27 SurfaceDisplayOutputSurfaceTest() |
| 55 : now_src_(new base::SimpleTestTickClock()), | 28 : now_src_(new base::SimpleTestTickClock()), |
| 56 task_runner_(new OrderedSimpleTaskRunner(now_src_.get(), true)), | 29 task_runner_(new OrderedSimpleTaskRunner(now_src_.get(), true)), |
| 30 begin_frame_source_(new BackToBackBeginFrameSource(task_runner_.get())), |
| 57 allocator_(0), | 31 allocator_(0), |
| 58 display_size_(1920, 1080), | 32 display_size_(1920, 1080), |
| 59 display_rect_(display_size_), | 33 display_rect_(display_size_), |
| 60 display_client_(&surface_manager_, | 34 context_provider_(TestContextProvider::Create()) { |
| 61 &bitmap_manager_, | |
| 62 &gpu_memory_buffer_manager_, | |
| 63 renderer_settings_, | |
| 64 task_runner_, | |
| 65 allocator_.id_namespace()), | |
| 66 context_provider_(TestContextProvider::Create()), | |
| 67 surface_display_output_surface_(&surface_manager_, | |
| 68 &allocator_, | |
| 69 context_provider_, | |
| 70 nullptr) { | |
| 71 surface_manager_.RegisterSurfaceIdNamespace(allocator_.id_namespace()); | 35 surface_manager_.RegisterSurfaceIdNamespace(allocator_.id_namespace()); |
| 72 output_surface_ = display_client_.output_surface(); | 36 |
| 73 display_client_.set_surface_output_surface( | 37 std::unique_ptr<FakeOutputSurface> display_output_surface = |
| 74 &surface_display_output_surface_); | 38 FakeOutputSurface::Create3d(); |
| 75 surface_display_output_surface_.set_display_client(&display_client_); | 39 display_output_surface_ = display_output_surface.get(); |
| 40 display_output_surface_->set_max_frames_pending(2); |
| 41 |
| 42 display_.reset(new Display(&surface_manager_, &bitmap_manager_, |
| 43 &gpu_memory_buffer_manager_, renderer_settings_, |
| 44 allocator_.id_namespace(), task_runner_.get(), |
| 45 std::move(display_output_surface))); |
| 46 delegated_output_surface_.reset(new SurfaceDisplayOutputSurface( |
| 47 &surface_manager_, &allocator_, display_.get(), context_provider_, |
| 48 nullptr)); |
| 76 | 49 |
| 77 // Set the Display's begin frame source like a real browser compositor | 50 // Set the Display's begin frame source like a real browser compositor |
| 78 // output surface would. | 51 // output surface would. |
| 79 begin_frame_source_.reset( | 52 display_->SetBeginFrameSource(begin_frame_source_.get()); |
| 80 new BackToBackBeginFrameSource(task_runner_.get())); | 53 delegated_output_surface_->BindToClient(&delegated_output_surface_client_); |
| 81 display_client_.display()->SetBeginFrameSource(begin_frame_source_.get()); | 54 display_->Resize(display_size_); |
| 82 | 55 |
| 83 surface_display_output_surface_.BindToClient( | 56 EXPECT_FALSE( |
| 84 &surface_display_output_surface_client_); | 57 delegated_output_surface_client_.did_lose_output_surface_called()); |
| 85 | |
| 86 display_client_.display()->Resize(display_size_); | |
| 87 | |
| 88 EXPECT_FALSE(surface_display_output_surface_client_ | |
| 89 .did_lose_output_surface_called()); | |
| 90 } | 58 } |
| 91 | 59 |
| 92 ~SurfaceDisplayOutputSurfaceTest() override {} | 60 ~SurfaceDisplayOutputSurfaceTest() override {} |
| 93 | 61 |
| 94 void SwapBuffersWithDamage(const gfx::Rect& damage_rect_) { | 62 void SwapBuffersWithDamage(const gfx::Rect& damage_rect) { |
| 95 std::unique_ptr<RenderPass> render_pass(RenderPass::Create()); | 63 std::unique_ptr<RenderPass> render_pass(RenderPass::Create()); |
| 96 render_pass->SetNew(RenderPassId(1, 1), display_rect_, damage_rect_, | 64 render_pass->SetNew(RenderPassId(1, 1), display_rect_, damage_rect, |
| 97 gfx::Transform()); | 65 gfx::Transform()); |
| 98 | 66 |
| 99 std::unique_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); | 67 std::unique_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); |
| 100 frame_data->render_pass_list.push_back(std::move(render_pass)); | 68 frame_data->render_pass_list.push_back(std::move(render_pass)); |
| 101 | 69 |
| 102 CompositorFrame frame; | 70 CompositorFrame frame; |
| 103 frame.delegated_frame_data = std::move(frame_data); | 71 frame.delegated_frame_data = std::move(frame_data); |
| 104 | 72 |
| 105 surface_display_output_surface_.SwapBuffers(&frame); | 73 delegated_output_surface_->SwapBuffers(&frame); |
| 106 } | 74 } |
| 107 | 75 |
| 108 void SetUp() override { | 76 void SetUp() override { |
| 109 // Draw the first frame to start in an "unlocked" state. | 77 // Draw the first frame to start in an "unlocked" state. |
| 110 SwapBuffersWithDamage(display_rect_); | 78 SwapBuffersWithDamage(display_rect_); |
| 111 | 79 |
| 112 EXPECT_EQ(0u, output_surface_->num_sent_frames()); | 80 EXPECT_EQ(0u, display_output_surface_->num_sent_frames()); |
| 113 task_runner_->RunUntilIdle(); | 81 task_runner_->RunUntilIdle(); |
| 114 EXPECT_EQ(1u, output_surface_->num_sent_frames()); | 82 EXPECT_EQ(1u, display_output_surface_->num_sent_frames()); |
| 115 } | 83 } |
| 116 | 84 |
| 117 protected: | 85 protected: |
| 118 std::unique_ptr<base::SimpleTestTickClock> now_src_; | 86 std::unique_ptr<base::SimpleTestTickClock> now_src_; |
| 119 scoped_refptr<OrderedSimpleTaskRunner> task_runner_; | 87 scoped_refptr<OrderedSimpleTaskRunner> task_runner_; |
| 120 std::unique_ptr<BackToBackBeginFrameSource> begin_frame_source_; | 88 std::unique_ptr<BackToBackBeginFrameSource> begin_frame_source_; |
| 121 SurfaceIdAllocator allocator_; | 89 SurfaceIdAllocator allocator_; |
| 122 | 90 |
| 123 const gfx::Size display_size_; | 91 const gfx::Size display_size_; |
| 124 const gfx::Rect display_rect_; | 92 const gfx::Rect display_rect_; |
| 125 FakeOutputSurface* output_surface_; | |
| 126 SurfaceManager surface_manager_; | 93 SurfaceManager surface_manager_; |
| 127 TestSharedBitmapManager bitmap_manager_; | 94 TestSharedBitmapManager bitmap_manager_; |
| 128 TestGpuMemoryBufferManager gpu_memory_buffer_manager_; | 95 TestGpuMemoryBufferManager gpu_memory_buffer_manager_; |
| 129 RendererSettings renderer_settings_; | 96 RendererSettings renderer_settings_; |
| 130 FakeOnscreenDisplayClient display_client_; | |
| 131 | 97 |
| 132 scoped_refptr<TestContextProvider> context_provider_; | 98 scoped_refptr<TestContextProvider> context_provider_; |
| 133 | 99 FakeOutputSurface* display_output_surface_ = nullptr; |
| 134 FakeOutputSurfaceClient surface_display_output_surface_client_; | 100 std::unique_ptr<Display> display_; |
| 135 SurfaceDisplayOutputSurface surface_display_output_surface_; | 101 FakeOutputSurfaceClient delegated_output_surface_client_; |
| 102 std::unique_ptr<SurfaceDisplayOutputSurface> delegated_output_surface_; |
| 136 }; | 103 }; |
| 137 | 104 |
| 138 TEST_F(SurfaceDisplayOutputSurfaceTest, DamageTriggersSwapBuffers) { | 105 TEST_F(SurfaceDisplayOutputSurfaceTest, DamageTriggersSwapBuffers) { |
| 139 SwapBuffersWithDamage(display_rect_); | 106 SwapBuffersWithDamage(display_rect_); |
| 140 EXPECT_EQ(1u, output_surface_->num_sent_frames()); | 107 EXPECT_EQ(1u, display_output_surface_->num_sent_frames()); |
| 141 task_runner_->RunUntilIdle(); | 108 task_runner_->RunUntilIdle(); |
| 142 EXPECT_EQ(2u, output_surface_->num_sent_frames()); | 109 EXPECT_EQ(2u, display_output_surface_->num_sent_frames()); |
| 143 } | 110 } |
| 144 | 111 |
| 145 TEST_F(SurfaceDisplayOutputSurfaceTest, NoDamageDoesNotTriggerSwapBuffers) { | 112 TEST_F(SurfaceDisplayOutputSurfaceTest, NoDamageDoesNotTriggerSwapBuffers) { |
| 146 SwapBuffersWithDamage(gfx::Rect()); | 113 SwapBuffersWithDamage(gfx::Rect()); |
| 147 EXPECT_EQ(1u, output_surface_->num_sent_frames()); | 114 EXPECT_EQ(1u, display_output_surface_->num_sent_frames()); |
| 148 task_runner_->RunUntilIdle(); | 115 task_runner_->RunUntilIdle(); |
| 149 EXPECT_EQ(1u, output_surface_->num_sent_frames()); | 116 EXPECT_EQ(1u, display_output_surface_->num_sent_frames()); |
| 150 } | 117 } |
| 151 | 118 |
| 152 TEST_F(SurfaceDisplayOutputSurfaceTest, SuspendedDoesNotTriggerSwapBuffers) { | 119 TEST_F(SurfaceDisplayOutputSurfaceTest, SuspendedDoesNotTriggerSwapBuffers) { |
| 153 SwapBuffersWithDamage(display_rect_); | 120 SwapBuffersWithDamage(display_rect_); |
| 154 EXPECT_EQ(1u, output_surface_->num_sent_frames()); | 121 EXPECT_EQ(1u, display_output_surface_->num_sent_frames()); |
| 155 output_surface_->set_suspended_for_recycle(true); | 122 display_output_surface_->set_suspended_for_recycle(true); |
| 156 task_runner_->RunUntilIdle(); | 123 task_runner_->RunUntilIdle(); |
| 157 EXPECT_EQ(1u, output_surface_->num_sent_frames()); | 124 EXPECT_EQ(1u, display_output_surface_->num_sent_frames()); |
| 158 SwapBuffersWithDamage(display_rect_); | 125 SwapBuffersWithDamage(display_rect_); |
| 159 task_runner_->RunUntilIdle(); | 126 task_runner_->RunUntilIdle(); |
| 160 EXPECT_EQ(1u, output_surface_->num_sent_frames()); | 127 EXPECT_EQ(1u, display_output_surface_->num_sent_frames()); |
| 161 output_surface_->set_suspended_for_recycle(false); | 128 display_output_surface_->set_suspended_for_recycle(false); |
| 162 SwapBuffersWithDamage(display_rect_); | 129 SwapBuffersWithDamage(display_rect_); |
| 163 task_runner_->RunUntilIdle(); | 130 task_runner_->RunUntilIdle(); |
| 164 EXPECT_EQ(2u, output_surface_->num_sent_frames()); | 131 EXPECT_EQ(2u, display_output_surface_->num_sent_frames()); |
| 165 } | 132 } |
| 166 | 133 |
| 167 TEST_F(SurfaceDisplayOutputSurfaceTest, | 134 TEST_F(SurfaceDisplayOutputSurfaceTest, |
| 168 LockingResourcesDoesNotIndirectlyCauseDamage) { | 135 LockingResourcesDoesNotIndirectlyCauseDamage) { |
| 169 surface_display_output_surface_.ForceReclaimResources(); | 136 delegated_output_surface_->ForceReclaimResources(); |
| 170 EXPECT_EQ(1u, output_surface_->num_sent_frames()); | 137 EXPECT_EQ(1u, display_output_surface_->num_sent_frames()); |
| 171 task_runner_->RunPendingTasks(); | 138 task_runner_->RunPendingTasks(); |
| 172 EXPECT_EQ(1u, output_surface_->num_sent_frames()); | 139 EXPECT_EQ(1u, display_output_surface_->num_sent_frames()); |
| 173 | 140 |
| 174 SwapBuffersWithDamage(gfx::Rect()); | 141 SwapBuffersWithDamage(gfx::Rect()); |
| 175 EXPECT_EQ(1u, output_surface_->num_sent_frames()); | 142 EXPECT_EQ(1u, display_output_surface_->num_sent_frames()); |
| 176 task_runner_->RunUntilIdle(); | 143 task_runner_->RunUntilIdle(); |
| 177 EXPECT_EQ(1u, output_surface_->num_sent_frames()); | 144 EXPECT_EQ(1u, display_output_surface_->num_sent_frames()); |
| 178 } | 145 } |
| 179 | 146 |
| 180 } // namespace | 147 } // namespace |
| 181 } // namespace cc | 148 } // namespace cc |
| OLD | NEW |