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 "base/test/null_task_runner.h" | 5 #include "base/test/null_task_runner.h" |
6 #include "cc/output/compositor_frame.h" | 6 #include "cc/output/compositor_frame.h" |
7 #include "cc/output/copy_output_result.h" | 7 #include "cc/output/copy_output_result.h" |
8 #include "cc/output/delegated_frame_data.h" | 8 #include "cc/output/delegated_frame_data.h" |
9 #include "cc/quads/render_pass.h" | 9 #include "cc/quads/render_pass.h" |
10 #include "cc/resources/shared_bitmap_manager.h" | 10 #include "cc/resources/shared_bitmap_manager.h" |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
82 void SetMemoryPolicy(const ManagedMemoryPolicy& policy) override {} | 82 void SetMemoryPolicy(const ManagedMemoryPolicy& policy) override {} |
83 }; | 83 }; |
84 | 84 |
85 class TestDisplayScheduler : public DisplayScheduler { | 85 class TestDisplayScheduler : public DisplayScheduler { |
86 public: | 86 public: |
87 TestDisplayScheduler(DisplaySchedulerClient* client, | 87 TestDisplayScheduler(DisplaySchedulerClient* client, |
88 BeginFrameSource* begin_frame_source, | 88 BeginFrameSource* begin_frame_source, |
89 base::NullTaskRunner* task_runner) | 89 base::NullTaskRunner* task_runner) |
90 : DisplayScheduler(client, begin_frame_source, task_runner, 1), | 90 : DisplayScheduler(client, begin_frame_source, task_runner, 1), |
91 damaged(false), | 91 damaged(false), |
92 entire_display_damaged(false), | 92 display_resized_(false), |
| 93 has_new_root_surface(false), |
93 swapped(false) {} | 94 swapped(false) {} |
94 | 95 |
95 ~TestDisplayScheduler() override {} | 96 ~TestDisplayScheduler() override {} |
96 | 97 |
97 void EntireDisplayDamaged(SurfaceId root_surface_id) override { | 98 void DisplayResized() override { display_resized_ = true; } |
98 entire_display_damaged = true; | 99 |
| 100 void SetNewRootSurface(SurfaceId root_surface_id) override { |
| 101 has_new_root_surface = true; |
99 } | 102 } |
100 | 103 |
101 void SurfaceDamaged(SurfaceId surface_id) override { | 104 void SurfaceDamaged(SurfaceId surface_id) override { |
102 damaged = true; | 105 damaged = true; |
103 needs_draw_ = true; | 106 needs_draw_ = true; |
104 } | 107 } |
105 | 108 |
106 void DidSwapBuffers() override { swapped = true; } | 109 void DidSwapBuffers() override { swapped = true; } |
107 | 110 |
108 void ResetDamageForTest() { | 111 void ResetDamageForTest() { |
109 damaged = false; | 112 damaged = false; |
110 entire_display_damaged = false; | 113 display_resized_ = false; |
| 114 has_new_root_surface = false; |
111 } | 115 } |
112 | 116 |
113 bool damaged; | 117 bool damaged; |
114 bool entire_display_damaged; | 118 bool display_resized_; |
| 119 bool has_new_root_surface; |
115 bool swapped; | 120 bool swapped; |
116 }; | 121 }; |
117 | 122 |
118 void CopyCallback(bool* called, scoped_ptr<CopyOutputResult> result) { | 123 void CopyCallback(bool* called, scoped_ptr<CopyOutputResult> result) { |
119 *called = true; | 124 *called = true; |
120 } | 125 } |
121 | 126 |
122 // Check that frame is damaged and swapped only under correct conditions. | 127 // Check that frame is damaged and swapped only under correct conditions. |
123 TEST_F(DisplayTest, DisplayDamaged) { | 128 TEST_F(DisplayTest, DisplayDamaged) { |
124 SetUpContext(nullptr); | 129 SetUpContext(nullptr); |
125 TestDisplayClient client; | 130 TestDisplayClient client; |
126 RendererSettings settings; | 131 RendererSettings settings; |
127 settings.partial_swap_enabled = true; | 132 settings.partial_swap_enabled = true; |
128 settings.finish_rendering_on_resize = true; | 133 settings.finish_rendering_on_resize = true; |
129 Display display(&client, &manager_, shared_bitmap_manager_.get(), nullptr, | 134 Display display(&client, &manager_, shared_bitmap_manager_.get(), nullptr, |
130 settings); | 135 settings); |
131 | 136 |
132 TestDisplayScheduler scheduler(&display, &fake_begin_frame_source_, | 137 TestDisplayScheduler scheduler(&display, &fake_begin_frame_source_, |
133 task_runner_.get()); | 138 task_runner_.get()); |
134 display.Initialize(output_surface_.Pass(), &scheduler); | 139 display.Initialize(output_surface_.Pass(), &scheduler); |
135 | 140 |
136 SurfaceId surface_id(7u); | 141 SurfaceId surface_id(7u); |
137 EXPECT_FALSE(scheduler.damaged); | 142 EXPECT_FALSE(scheduler.damaged); |
138 EXPECT_FALSE(scheduler.entire_display_damaged); | 143 EXPECT_FALSE(scheduler.has_new_root_surface); |
139 display.SetSurfaceId(surface_id, 1.f); | 144 display.SetSurfaceId(surface_id, 1.f); |
140 EXPECT_FALSE(scheduler.damaged); | 145 EXPECT_FALSE(scheduler.damaged); |
141 EXPECT_TRUE(scheduler.entire_display_damaged); | 146 EXPECT_FALSE(scheduler.display_resized_); |
| 147 EXPECT_TRUE(scheduler.has_new_root_surface); |
142 | 148 |
143 scheduler.ResetDamageForTest(); | 149 scheduler.ResetDamageForTest(); |
144 display.Resize(gfx::Size(100, 100)); | 150 display.Resize(gfx::Size(100, 100)); |
145 EXPECT_FALSE(scheduler.damaged); | 151 EXPECT_FALSE(scheduler.damaged); |
146 EXPECT_TRUE(scheduler.entire_display_damaged); | 152 EXPECT_TRUE(scheduler.display_resized_); |
| 153 EXPECT_FALSE(scheduler.has_new_root_surface); |
147 | 154 |
148 factory_.Create(surface_id); | 155 factory_.Create(surface_id); |
149 | 156 |
150 // First draw from surface should have full damage. | 157 // First draw from surface should have full damage. |
151 RenderPassList pass_list; | 158 RenderPassList pass_list; |
152 scoped_ptr<RenderPass> pass = RenderPass::Create(); | 159 scoped_ptr<RenderPass> pass = RenderPass::Create(); |
153 pass->output_rect = gfx::Rect(0, 0, 100, 100); | 160 pass->output_rect = gfx::Rect(0, 0, 100, 100); |
154 pass->damage_rect = gfx::Rect(10, 10, 1, 1); | 161 pass->damage_rect = gfx::Rect(10, 10, 1, 1); |
155 pass->id = RenderPassId(1, 1); | 162 pass->id = RenderPassId(1, 1); |
156 pass_list.push_back(pass.Pass()); | 163 pass_list.push_back(pass.Pass()); |
157 | 164 |
158 scheduler.ResetDamageForTest(); | 165 scheduler.ResetDamageForTest(); |
159 SubmitFrame(&pass_list, surface_id); | 166 SubmitFrame(&pass_list, surface_id); |
160 EXPECT_TRUE(scheduler.damaged); | 167 EXPECT_TRUE(scheduler.damaged); |
161 EXPECT_FALSE(scheduler.entire_display_damaged); | 168 EXPECT_FALSE(scheduler.display_resized_); |
| 169 EXPECT_FALSE(scheduler.has_new_root_surface); |
162 | 170 |
163 EXPECT_FALSE(scheduler.swapped); | 171 EXPECT_FALSE(scheduler.swapped); |
164 EXPECT_EQ(0u, output_surface_ptr_->num_sent_frames()); | 172 EXPECT_EQ(0u, output_surface_ptr_->num_sent_frames()); |
165 display.DrawAndSwap(); | 173 display.DrawAndSwap(); |
166 EXPECT_TRUE(scheduler.swapped); | 174 EXPECT_TRUE(scheduler.swapped); |
167 EXPECT_EQ(1u, output_surface_ptr_->num_sent_frames()); | 175 EXPECT_EQ(1u, output_surface_ptr_->num_sent_frames()); |
168 SoftwareFrameData* software_data = | 176 SoftwareFrameData* software_data = |
169 output_surface_ptr_->last_sent_frame().software_frame_data.get(); | 177 output_surface_ptr_->last_sent_frame().software_frame_data.get(); |
170 ASSERT_NE(nullptr, software_data); | 178 ASSERT_NE(nullptr, software_data); |
171 EXPECT_EQ(gfx::Size(100, 100).ToString(), software_data->size.ToString()); | 179 EXPECT_EQ(gfx::Size(100, 100).ToString(), software_data->size.ToString()); |
172 EXPECT_EQ(gfx::Rect(0, 0, 100, 100).ToString(), | 180 EXPECT_EQ(gfx::Rect(0, 0, 100, 100).ToString(), |
173 software_data->damage_rect.ToString()); | 181 software_data->damage_rect.ToString()); |
174 | 182 |
175 { | 183 { |
176 // Only damaged portion should be swapped. | 184 // Only damaged portion should be swapped. |
177 pass = RenderPass::Create(); | 185 pass = RenderPass::Create(); |
178 pass->output_rect = gfx::Rect(0, 0, 100, 100); | 186 pass->output_rect = gfx::Rect(0, 0, 100, 100); |
179 pass->damage_rect = gfx::Rect(10, 10, 1, 1); | 187 pass->damage_rect = gfx::Rect(10, 10, 1, 1); |
180 pass->id = RenderPassId(1, 1); | 188 pass->id = RenderPassId(1, 1); |
181 | 189 |
182 pass_list.push_back(pass.Pass()); | 190 pass_list.push_back(pass.Pass()); |
183 scheduler.ResetDamageForTest(); | 191 scheduler.ResetDamageForTest(); |
184 SubmitFrame(&pass_list, surface_id); | 192 SubmitFrame(&pass_list, surface_id); |
185 EXPECT_TRUE(scheduler.damaged); | 193 EXPECT_TRUE(scheduler.damaged); |
186 EXPECT_FALSE(scheduler.entire_display_damaged); | 194 EXPECT_FALSE(scheduler.display_resized_); |
| 195 EXPECT_FALSE(scheduler.has_new_root_surface); |
187 | 196 |
188 scheduler.swapped = false; | 197 scheduler.swapped = false; |
189 display.DrawAndSwap(); | 198 display.DrawAndSwap(); |
190 EXPECT_TRUE(scheduler.swapped); | 199 EXPECT_TRUE(scheduler.swapped); |
191 EXPECT_EQ(2u, output_surface_ptr_->num_sent_frames()); | 200 EXPECT_EQ(2u, output_surface_ptr_->num_sent_frames()); |
192 software_data = | 201 software_data = |
193 output_surface_ptr_->last_sent_frame().software_frame_data.get(); | 202 output_surface_ptr_->last_sent_frame().software_frame_data.get(); |
194 ASSERT_NE(nullptr, software_data); | 203 ASSERT_NE(nullptr, software_data); |
195 EXPECT_EQ(gfx::Size(100, 100).ToString(), software_data->size.ToString()); | 204 EXPECT_EQ(gfx::Size(100, 100).ToString(), software_data->size.ToString()); |
196 EXPECT_EQ(gfx::Rect(10, 10, 1, 1).ToString(), | 205 EXPECT_EQ(gfx::Rect(10, 10, 1, 1).ToString(), |
197 software_data->damage_rect.ToString()); | 206 software_data->damage_rect.ToString()); |
198 } | 207 } |
199 | 208 |
200 { | 209 { |
201 // Pass has no damage so shouldn't be swapped. | 210 // Pass has no damage so shouldn't be swapped. |
202 pass = RenderPass::Create(); | 211 pass = RenderPass::Create(); |
203 pass->output_rect = gfx::Rect(0, 0, 100, 100); | 212 pass->output_rect = gfx::Rect(0, 0, 100, 100); |
204 pass->damage_rect = gfx::Rect(10, 10, 0, 0); | 213 pass->damage_rect = gfx::Rect(10, 10, 0, 0); |
205 pass->id = RenderPassId(1, 1); | 214 pass->id = RenderPassId(1, 1); |
206 | 215 |
207 pass_list.push_back(pass.Pass()); | 216 pass_list.push_back(pass.Pass()); |
208 scheduler.ResetDamageForTest(); | 217 scheduler.ResetDamageForTest(); |
209 SubmitFrame(&pass_list, surface_id); | 218 SubmitFrame(&pass_list, surface_id); |
210 EXPECT_TRUE(scheduler.damaged); | 219 EXPECT_TRUE(scheduler.damaged); |
211 EXPECT_FALSE(scheduler.entire_display_damaged); | 220 EXPECT_FALSE(scheduler.display_resized_); |
| 221 EXPECT_FALSE(scheduler.has_new_root_surface); |
212 | 222 |
213 scheduler.swapped = false; | 223 scheduler.swapped = false; |
214 display.DrawAndSwap(); | 224 display.DrawAndSwap(); |
215 EXPECT_TRUE(scheduler.swapped); | 225 EXPECT_TRUE(scheduler.swapped); |
216 EXPECT_EQ(2u, output_surface_ptr_->num_sent_frames()); | 226 EXPECT_EQ(2u, output_surface_ptr_->num_sent_frames()); |
217 } | 227 } |
218 | 228 |
219 { | 229 { |
220 // Pass is wrong size so shouldn't be swapped. | 230 // Pass is wrong size so shouldn't be swapped. |
221 pass = RenderPass::Create(); | 231 pass = RenderPass::Create(); |
222 pass->output_rect = gfx::Rect(0, 0, 99, 99); | 232 pass->output_rect = gfx::Rect(0, 0, 99, 99); |
223 pass->damage_rect = gfx::Rect(10, 10, 10, 10); | 233 pass->damage_rect = gfx::Rect(10, 10, 10, 10); |
224 pass->id = RenderPassId(1, 1); | 234 pass->id = RenderPassId(1, 1); |
225 | 235 |
226 pass_list.push_back(pass.Pass()); | 236 pass_list.push_back(pass.Pass()); |
227 scheduler.ResetDamageForTest(); | 237 scheduler.ResetDamageForTest(); |
228 SubmitFrame(&pass_list, surface_id); | 238 SubmitFrame(&pass_list, surface_id); |
229 EXPECT_TRUE(scheduler.damaged); | 239 EXPECT_TRUE(scheduler.damaged); |
230 EXPECT_FALSE(scheduler.entire_display_damaged); | 240 EXPECT_FALSE(scheduler.display_resized_); |
| 241 EXPECT_FALSE(scheduler.has_new_root_surface); |
231 | 242 |
232 scheduler.swapped = false; | 243 scheduler.swapped = false; |
233 display.DrawAndSwap(); | 244 display.DrawAndSwap(); |
234 EXPECT_TRUE(scheduler.swapped); | 245 EXPECT_TRUE(scheduler.swapped); |
235 EXPECT_EQ(2u, output_surface_ptr_->num_sent_frames()); | 246 EXPECT_EQ(2u, output_surface_ptr_->num_sent_frames()); |
236 } | 247 } |
237 | 248 |
238 { | 249 { |
239 // Pass has copy output request so should be swapped. | 250 // Pass has copy output request so should be swapped. |
240 pass = RenderPass::Create(); | 251 pass = RenderPass::Create(); |
241 pass->output_rect = gfx::Rect(0, 0, 100, 100); | 252 pass->output_rect = gfx::Rect(0, 0, 100, 100); |
242 pass->damage_rect = gfx::Rect(10, 10, 0, 0); | 253 pass->damage_rect = gfx::Rect(10, 10, 0, 0); |
243 bool copy_called = false; | 254 bool copy_called = false; |
244 pass->copy_requests.push_back(CopyOutputRequest::CreateRequest( | 255 pass->copy_requests.push_back(CopyOutputRequest::CreateRequest( |
245 base::Bind(&CopyCallback, ©_called))); | 256 base::Bind(&CopyCallback, ©_called))); |
246 pass->id = RenderPassId(1, 1); | 257 pass->id = RenderPassId(1, 1); |
247 | 258 |
248 pass_list.push_back(pass.Pass()); | 259 pass_list.push_back(pass.Pass()); |
249 scheduler.ResetDamageForTest(); | 260 scheduler.ResetDamageForTest(); |
250 SubmitFrame(&pass_list, surface_id); | 261 SubmitFrame(&pass_list, surface_id); |
251 EXPECT_TRUE(scheduler.damaged); | 262 EXPECT_TRUE(scheduler.damaged); |
252 EXPECT_FALSE(scheduler.entire_display_damaged); | 263 EXPECT_FALSE(scheduler.display_resized_); |
| 264 EXPECT_FALSE(scheduler.has_new_root_surface); |
253 | 265 |
254 scheduler.swapped = false; | 266 scheduler.swapped = false; |
255 display.DrawAndSwap(); | 267 display.DrawAndSwap(); |
256 EXPECT_TRUE(scheduler.swapped); | 268 EXPECT_TRUE(scheduler.swapped); |
257 EXPECT_EQ(3u, output_surface_ptr_->num_sent_frames()); | 269 EXPECT_EQ(3u, output_surface_ptr_->num_sent_frames()); |
258 EXPECT_TRUE(copy_called); | 270 EXPECT_TRUE(copy_called); |
259 } | 271 } |
260 | 272 |
261 // Pass has latency info so should be swapped. | 273 // Pass has latency info so should be swapped. |
262 { | 274 { |
263 pass = RenderPass::Create(); | 275 pass = RenderPass::Create(); |
264 pass->output_rect = gfx::Rect(0, 0, 100, 100); | 276 pass->output_rect = gfx::Rect(0, 0, 100, 100); |
265 pass->damage_rect = gfx::Rect(10, 10, 0, 0); | 277 pass->damage_rect = gfx::Rect(10, 10, 0, 0); |
266 pass->id = RenderPassId(1, 1); | 278 pass->id = RenderPassId(1, 1); |
267 | 279 |
268 pass_list.push_back(pass.Pass()); | 280 pass_list.push_back(pass.Pass()); |
269 scheduler.ResetDamageForTest(); | 281 scheduler.ResetDamageForTest(); |
270 scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); | 282 scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); |
271 pass_list.swap(frame_data->render_pass_list); | 283 pass_list.swap(frame_data->render_pass_list); |
272 | 284 |
273 scoped_ptr<CompositorFrame> frame(new CompositorFrame); | 285 scoped_ptr<CompositorFrame> frame(new CompositorFrame); |
274 frame->delegated_frame_data = frame_data.Pass(); | 286 frame->delegated_frame_data = frame_data.Pass(); |
275 frame->metadata.latency_info.push_back(ui::LatencyInfo()); | 287 frame->metadata.latency_info.push_back(ui::LatencyInfo()); |
276 | 288 |
277 factory_.SubmitFrame(surface_id, frame.Pass(), | 289 factory_.SubmitFrame(surface_id, frame.Pass(), |
278 SurfaceFactory::DrawCallback()); | 290 SurfaceFactory::DrawCallback()); |
279 EXPECT_TRUE(scheduler.damaged); | 291 EXPECT_TRUE(scheduler.damaged); |
280 EXPECT_FALSE(scheduler.entire_display_damaged); | 292 EXPECT_FALSE(scheduler.display_resized_); |
| 293 EXPECT_FALSE(scheduler.has_new_root_surface); |
281 | 294 |
282 scheduler.swapped = false; | 295 scheduler.swapped = false; |
283 display.DrawAndSwap(); | 296 display.DrawAndSwap(); |
284 EXPECT_TRUE(scheduler.swapped); | 297 EXPECT_TRUE(scheduler.swapped); |
285 EXPECT_EQ(4u, output_surface_ptr_->num_sent_frames()); | 298 EXPECT_EQ(4u, output_surface_ptr_->num_sent_frames()); |
286 } | 299 } |
287 | 300 |
288 // Resize should cause a swap if no frame was swapped at the previous size. | 301 // Resize should cause a swap if no frame was swapped at the previous size. |
289 { | 302 { |
290 scheduler.swapped = false; | 303 scheduler.swapped = false; |
(...skipping 10 matching lines...) Expand all Loading... |
301 scheduler.ResetDamageForTest(); | 314 scheduler.ResetDamageForTest(); |
302 scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); | 315 scoped_ptr<DelegatedFrameData> frame_data(new DelegatedFrameData); |
303 pass_list.swap(frame_data->render_pass_list); | 316 pass_list.swap(frame_data->render_pass_list); |
304 | 317 |
305 scoped_ptr<CompositorFrame> frame(new CompositorFrame); | 318 scoped_ptr<CompositorFrame> frame(new CompositorFrame); |
306 frame->delegated_frame_data = frame_data.Pass(); | 319 frame->delegated_frame_data = frame_data.Pass(); |
307 | 320 |
308 factory_.SubmitFrame(surface_id, frame.Pass(), | 321 factory_.SubmitFrame(surface_id, frame.Pass(), |
309 SurfaceFactory::DrawCallback()); | 322 SurfaceFactory::DrawCallback()); |
310 EXPECT_TRUE(scheduler.damaged); | 323 EXPECT_TRUE(scheduler.damaged); |
311 EXPECT_FALSE(scheduler.entire_display_damaged); | 324 EXPECT_FALSE(scheduler.display_resized_); |
| 325 EXPECT_FALSE(scheduler.has_new_root_surface); |
312 | 326 |
313 scheduler.swapped = false; | 327 scheduler.swapped = false; |
314 display.Resize(gfx::Size(100, 100)); | 328 display.Resize(gfx::Size(100, 100)); |
315 EXPECT_TRUE(scheduler.swapped); | 329 EXPECT_TRUE(scheduler.swapped); |
316 EXPECT_EQ(5u, output_surface_ptr_->num_sent_frames()); | 330 EXPECT_EQ(5u, output_surface_ptr_->num_sent_frames()); |
317 } | 331 } |
318 | 332 |
319 factory_.Destroy(surface_id); | 333 factory_.Destroy(surface_id); |
320 } | 334 } |
321 | 335 |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
390 | 404 |
391 EXPECT_CALL(*context_ptr, shallowFinishCHROMIUM()); | 405 EXPECT_CALL(*context_ptr, shallowFinishCHROMIUM()); |
392 display.Resize(gfx::Size(250, 250)); | 406 display.Resize(gfx::Size(250, 250)); |
393 testing::Mock::VerifyAndClearExpectations(context_ptr); | 407 testing::Mock::VerifyAndClearExpectations(context_ptr); |
394 | 408 |
395 factory_.Destroy(surface_id); | 409 factory_.Destroy(surface_id); |
396 } | 410 } |
397 | 411 |
398 } // namespace | 412 } // namespace |
399 } // namespace cc | 413 } // namespace cc |
OLD | NEW |