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