| 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 |