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 "cc/surfaces/onscreen_display_client.h" | |
8 #include "cc/surfaces/surface_id_allocator.h" | |
9 #include "cc/surfaces/surface_manager.h" | |
10 #include "cc/test/fake_output_surface.h" | |
11 #include "cc/test/fake_output_surface_client.h" | |
12 #include "cc/test/ordered_simple_task_runner.h" | |
13 #include "cc/test/test_context_provider.h" | |
14 #include "cc/test/test_gpu_memory_buffer_manager.h" | |
15 #include "cc/test/test_shared_bitmap_manager.h" | |
16 #include "testing/gtest/include/gtest/gtest.h" | |
17 | |
18 namespace cc { | |
19 namespace { | |
20 | |
21 class FakeSurfaceManager : public SurfaceManager {}; | |
22 | |
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 : OnscreenDisplayClient(FakeOutputSurface::Create3d(), | |
32 manager, | |
33 bitmap_manager, | |
34 gpu_memory_buffer_manager, | |
35 settings, | |
36 task_runner) { | |
37 fake_output_surface_ = | |
38 static_cast<FakeOutputSurface*>(output_surface_.get()); | |
39 } | |
40 | |
41 FakeOutputSurface* output_surface() { return fake_output_surface_; } | |
42 | |
43 protected: | |
44 FakeOutputSurface* fake_output_surface_; | |
45 }; | |
46 | |
47 class TestSurfaceDisplayOutputSurface : public SurfaceDisplayOutputSurface { | |
brianderson
2015/05/12 17:01:20
I guess this class is pretty useless for the exist
| |
48 public: | |
49 TestSurfaceDisplayOutputSurface( | |
50 SurfaceManager* surface_manager, | |
51 SurfaceIdAllocator* allocator, | |
52 const scoped_refptr<ContextProvider>& context_provider) | |
53 : SurfaceDisplayOutputSurface(surface_manager, | |
54 allocator, | |
55 context_provider) {} | |
56 }; | |
57 | |
58 class SurfaceDisplayOutputSurfaceTest : public testing::Test { | |
59 public: | |
60 SurfaceDisplayOutputSurfaceTest() | |
61 : task_runner_(new OrderedSimpleTaskRunner()), | |
62 allocator_(0), | |
63 display_size_(1920, 1080), | |
64 display_rect_(display_size_), | |
65 display_client_(&surface_manager_, | |
66 &bitmap_manager_, | |
67 &gpu_memory_buffer_manager_, | |
68 renderer_settings_, | |
69 task_runner_), | |
70 context_provider_(TestContextProvider::Create()), | |
71 surface_display_output_surface_(&surface_manager_, | |
72 &allocator_, | |
73 context_provider_) { | |
74 output_surface_ = display_client_.output_surface(); | |
75 display_client_.set_surface_output_surface( | |
76 &surface_display_output_surface_); | |
77 surface_display_output_surface_.set_display_client(&display_client_); | |
78 surface_display_output_surface_.BindToClient( | |
79 &surface_display_output_surface_client_); | |
80 display_client_.display()->Resize(display_size_); | |
81 } | |
82 | |
83 ~SurfaceDisplayOutputSurfaceTest() override {} | |
84 | |
85 void SetUp() override { | |
86 // Draw the first frame to start in an "unlocked" state. | |
87 scoped_ptr<RenderPass> render_pass = RenderPass::Create(); | |
88 render_pass->output_rect = display_rect_; | |
89 render_pass->damage_rect = display_rect_; | |
90 | |
91 CompositorFrame frame1; | |
92 frame1.delegated_frame_data = make_scoped_ptr(new DelegatedFrameData); | |
93 frame1.delegated_frame_data->render_pass_list.push_back(render_pass.Pass()); | |
94 surface_display_output_surface_.SwapBuffers(&frame1); | |
95 | |
96 EXPECT_EQ(output_surface_->num_sent_frames(), 0u); | |
97 task_runner_->RunUntilIdle(); | |
98 EXPECT_EQ(output_surface_->num_sent_frames(), 1u); | |
99 } | |
100 | |
101 protected: | |
102 scoped_refptr<OrderedSimpleTaskRunner> task_runner_; | |
103 SurfaceIdAllocator allocator_; | |
104 | |
105 const gfx::Size display_size_; | |
106 const gfx::Rect display_rect_; | |
107 FakeOutputSurface* output_surface_; | |
108 FakeSurfaceManager surface_manager_; | |
109 TestSharedBitmapManager bitmap_manager_; | |
110 TestGpuMemoryBufferManager gpu_memory_buffer_manager_; | |
111 RendererSettings renderer_settings_; | |
112 FakeOnscreenDisplayClient display_client_; | |
113 | |
114 scoped_refptr<TestContextProvider> context_provider_; | |
115 | |
116 FakeOutputSurfaceClient surface_display_output_surface_client_; | |
117 TestSurfaceDisplayOutputSurface surface_display_output_surface_; | |
118 }; | |
119 | |
120 TEST_F(SurfaceDisplayOutputSurfaceTest, DamageTriggersSwapBuffers) { | |
121 scoped_ptr<RenderPass> render_pass = RenderPass::Create(); | |
122 render_pass->output_rect = display_rect_; | |
123 render_pass->damage_rect = display_rect_; | |
124 | |
125 EXPECT_EQ(output_surface_->num_sent_frames(), 1u); | |
126 task_runner_->RunUntilIdle(); | |
127 EXPECT_EQ(output_surface_->num_sent_frames(), 1u); | |
128 | |
129 CompositorFrame frame1; | |
130 frame1.delegated_frame_data = make_scoped_ptr(new DelegatedFrameData); | |
131 frame1.delegated_frame_data->render_pass_list.push_back(render_pass.Pass()); | |
132 surface_display_output_surface_.SwapBuffers(&frame1); | |
133 | |
134 EXPECT_EQ(output_surface_->num_sent_frames(), 1u); | |
135 task_runner_->RunUntilIdle(); | |
136 EXPECT_EQ(output_surface_->num_sent_frames(), 2u); | |
137 } | |
138 | |
139 TEST_F(SurfaceDisplayOutputSurfaceTest, NoDamageDoesNotTriggerSwapBuffers) { | |
140 scoped_ptr<RenderPass> render_pass = RenderPass::Create(); | |
141 render_pass->output_rect = display_rect_; | |
142 render_pass->damage_rect = gfx::Rect(); | |
143 | |
144 EXPECT_EQ(output_surface_->num_sent_frames(), 1u); | |
145 task_runner_->RunUntilIdle(); | |
146 EXPECT_EQ(output_surface_->num_sent_frames(), 1u); | |
147 | |
148 CompositorFrame frame1; | |
149 frame1.delegated_frame_data = make_scoped_ptr(new DelegatedFrameData); | |
150 frame1.delegated_frame_data->render_pass_list.push_back(render_pass.Pass()); | |
151 surface_display_output_surface_.SwapBuffers(&frame1); | |
152 | |
153 EXPECT_EQ(output_surface_->num_sent_frames(), 1u); | |
154 task_runner_->RunUntilIdle(); | |
155 EXPECT_EQ(output_surface_->num_sent_frames(), 1u); | |
156 } | |
157 | |
158 TEST_F(SurfaceDisplayOutputSurfaceTest, | |
159 LockingResourcesDoesNotIndirectlyCauseDamage) { | |
160 scoped_ptr<RenderPass> render_pass = RenderPass::Create(); | |
161 render_pass->output_rect = display_rect_; | |
162 render_pass->damage_rect = gfx::Rect(); | |
163 | |
164 EXPECT_EQ(output_surface_->num_sent_frames(), 1u); | |
165 task_runner_->RunUntilIdle(); | |
166 EXPECT_EQ(output_surface_->num_sent_frames(), 1u); | |
167 | |
168 surface_display_output_surface_.ForceReclaimResources(); | |
169 EXPECT_EQ(output_surface_->num_sent_frames(), 1u); | |
170 task_runner_->RunPendingTasks(); | |
171 task_runner_->RunPendingTasks(); | |
172 EXPECT_EQ(output_surface_->num_sent_frames(), 1u); | |
173 | |
174 CompositorFrame frame1; | |
175 frame1.delegated_frame_data = make_scoped_ptr(new DelegatedFrameData); | |
176 frame1.delegated_frame_data->render_pass_list.push_back(render_pass.Pass()); | |
177 surface_display_output_surface_.SwapBuffers(&frame1); | |
178 | |
179 EXPECT_EQ(output_surface_->num_sent_frames(), 1u); | |
180 task_runner_->RunUntilIdle(); | |
181 EXPECT_EQ(output_surface_->num_sent_frames(), 1u); | |
182 } | |
183 | |
184 } // namespace | |
185 } // namespace cc | |
OLD | NEW |