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 "services/gfx/compositor/compositor_engine.h" | 5 #include "services/gfx/compositor/compositor_engine.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <sstream> | 8 #include <sstream> |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
208 } else { | 208 } else { |
209 base::MessageLoop::current()->PostDelayedTask( | 209 base::MessageLoop::current()->PostDelayedTask( |
210 FROM_HERE, base::Bind(&CompositorEngine::OnPresentScene, | 210 FROM_HERE, base::Bind(&CompositorEngine::OnPresentScene, |
211 weak_factory_.GetWeakPtr(), | 211 weak_factory_.GetWeakPtr(), |
212 scene_state->GetWeakPtr(), presentation_time), | 212 scene_state->GetWeakPtr(), presentation_time), |
213 base::TimeDelta::FromMicroseconds(presentation_time - now)); | 213 base::TimeDelta::FromMicroseconds(presentation_time - now)); |
214 } | 214 } |
215 } | 215 } |
216 | 216 |
217 void CompositorEngine::ScheduleFrame(SceneState* scene_state, | 217 void CompositorEngine::ScheduleFrame(SceneState* scene_state, |
218 const SceneFrameCallback& callback) { | 218 const FrameCallback& callback) { |
219 DCHECK(IsSceneStateRegisteredDebug(scene_state)); | 219 DCHECK(IsSceneStateRegisteredDebug(scene_state)); |
| 220 DVLOG(1) << "ScheduleFrame: scene=" << scene_state; |
220 | 221 |
221 scene_state->AddSceneFrameCallback(callback); | 222 if (!scene_state->frame_dispatcher().AddCallback(callback)) |
| 223 return; |
222 | 224 |
223 // TODO(jeffbrown): Be more selective and do this work only for scenes | 225 // TODO(jeffbrown): Be more selective and do this work only for scenes |
224 // which are strongly associated with the renderer so it doesn't receive | 226 // which are strongly associated with the renderer so it doesn't receive |
225 // conflicting timing signals coming from multiple renderers. | 227 // conflicting timing signals coming from multiple renderers. |
226 for (auto& renderer : renderers_) { | 228 for (auto& renderer : renderers_) { |
227 ScheduleFrameForRenderer(renderer, | 229 ScheduleFrameForRenderer(renderer, |
228 Scheduler::SchedulingMode::kUpdateAndSnapshot); | 230 Scheduler::SchedulingMode::kUpdateAndSnapshot); |
229 } | 231 } |
230 } | 232 } |
231 | 233 |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
269 DCHECK(IsRendererStateRegisteredDebug(renderer_state)); | 271 DCHECK(IsRendererStateRegisteredDebug(renderer_state)); |
270 DVLOG(1) << "ClearRootScene: renderer=" << renderer_state; | 272 DVLOG(1) << "ClearRootScene: renderer=" << renderer_state; |
271 | 273 |
272 // Update the root. | 274 // Update the root. |
273 if (renderer_state->ClearRootScene()) { | 275 if (renderer_state->ClearRootScene()) { |
274 ScheduleFrameForRenderer(renderer_state, | 276 ScheduleFrameForRenderer(renderer_state, |
275 Scheduler::SchedulingMode::kSnapshot); | 277 Scheduler::SchedulingMode::kSnapshot); |
276 } | 278 } |
277 } | 279 } |
278 | 280 |
| 281 void CompositorEngine::ScheduleFrame(RendererState* renderer_state, |
| 282 const FrameCallback& callback) { |
| 283 DCHECK(IsRendererStateRegisteredDebug(renderer_state)); |
| 284 DVLOG(1) << "ScheduleFrame: renderer=" << renderer_state; |
| 285 |
| 286 if (!renderer_state->frame_dispatcher().AddCallback(callback)) |
| 287 return; |
| 288 |
| 289 ScheduleFrameForRenderer(renderer_state, |
| 290 Scheduler::SchedulingMode::kUpdateAndSnapshot); |
| 291 } |
| 292 |
279 void CompositorEngine::HitTest( | 293 void CompositorEngine::HitTest( |
280 RendererState* renderer_state, | 294 RendererState* renderer_state, |
281 mojo::PointFPtr point, | 295 mojo::PointFPtr point, |
282 const mojo::gfx::composition::HitTester::HitTestCallback& callback) { | 296 const mojo::gfx::composition::HitTester::HitTestCallback& callback) { |
283 DCHECK(IsRendererStateRegisteredDebug(renderer_state)); | 297 DCHECK(IsRendererStateRegisteredDebug(renderer_state)); |
284 DCHECK(point); | 298 DCHECK(point); |
285 DVLOG(1) << "HitTest: renderer=" << renderer_state << ", point=" << point; | 299 DVLOG(1) << "HitTest: renderer=" << renderer_state << ", point=" << point; |
286 | 300 |
287 auto result = mojo::gfx::composition::HitTestResult::New(); | 301 auto result = mojo::gfx::composition::HitTestResult::New(); |
288 | 302 |
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
474 } | 488 } |
475 | 489 |
476 void CompositorEngine::OnOutputUpdateRequest( | 490 void CompositorEngine::OnOutputUpdateRequest( |
477 const base::WeakPtr<RendererState>& renderer_state_weak, | 491 const base::WeakPtr<RendererState>& renderer_state_weak, |
478 const mojo::gfx::composition::FrameInfo& frame_info) { | 492 const mojo::gfx::composition::FrameInfo& frame_info) { |
479 RendererState* renderer_state = renderer_state_weak.get(); | 493 RendererState* renderer_state = renderer_state_weak.get(); |
480 if (!renderer_state) | 494 if (!renderer_state) |
481 return; | 495 return; |
482 DCHECK(IsRendererStateRegisteredDebug(renderer_state)); | 496 DCHECK(IsRendererStateRegisteredDebug(renderer_state)); |
483 | 497 |
| 498 renderer_state->frame_dispatcher().DispatchCallbacks(frame_info); |
| 499 |
484 // TODO(jeffbrown): Be more selective and do this work only for scenes | 500 // TODO(jeffbrown): Be more selective and do this work only for scenes |
485 // associated with the renderer. | 501 // associated with the renderer. |
486 for (auto& pair : scenes_by_token_) { | 502 for (auto& pair : scenes_by_token_) { |
487 pair.second->DispatchSceneFrameCallbacks(frame_info); | 503 pair.second->frame_dispatcher().DispatchCallbacks(frame_info); |
488 } | 504 } |
489 } | 505 } |
490 | 506 |
491 void CompositorEngine::OnOutputSnapshotRequest( | 507 void CompositorEngine::OnOutputSnapshotRequest( |
492 const base::WeakPtr<RendererState>& renderer_state_weak, | 508 const base::WeakPtr<RendererState>& renderer_state_weak, |
493 const mojo::gfx::composition::FrameInfo& frame_info) { | 509 const mojo::gfx::composition::FrameInfo& frame_info) { |
494 RendererState* renderer_state = renderer_state_weak.get(); | 510 RendererState* renderer_state = renderer_state_weak.get(); |
495 if (!renderer_state) | 511 if (!renderer_state) |
496 return; | 512 return; |
497 DCHECK(IsRendererStateRegisteredDebug(renderer_state)); | 513 DCHECK(IsRendererStateRegisteredDebug(renderer_state)); |
(...skipping 11 matching lines...) Expand all Loading... |
509 | 525 |
510 SceneDef::Disposition disposition = | 526 SceneDef::Disposition disposition = |
511 PresentScene(scene_state, presentation_time); | 527 PresentScene(scene_state, presentation_time); |
512 if (disposition == SceneDef::Disposition::kFailed) | 528 if (disposition == SceneDef::Disposition::kFailed) |
513 DestroyScene(scene_state); | 529 DestroyScene(scene_state); |
514 else if (disposition == SceneDef::Disposition::kSucceeded) | 530 else if (disposition == SceneDef::Disposition::kSucceeded) |
515 InvalidateScene(scene_state); | 531 InvalidateScene(scene_state); |
516 } | 532 } |
517 | 533 |
518 } // namespace compositor | 534 } // namespace compositor |
OLD | NEW |