| 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 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 97 scenes_by_token_.erase(scene_state->scene_token()->value); | 97 scenes_by_token_.erase(scene_state->scene_token()->value); |
| 98 delete scene_state; | 98 delete scene_state; |
| 99 } | 99 } |
| 100 | 100 |
| 101 void CompositorEngine::CreateRenderer( | 101 void CompositorEngine::CreateRenderer( |
| 102 mojo::InterfaceHandle<mojo::ContextProvider> context_provider, | 102 mojo::InterfaceHandle<mojo::ContextProvider> context_provider, |
| 103 mojo::InterfaceRequest<mojo::gfx::composition::Renderer> renderer_request, | 103 mojo::InterfaceRequest<mojo::gfx::composition::Renderer> renderer_request, |
| 104 const mojo::String& label) { | 104 const mojo::String& label) { |
| 105 DCHECK(context_provider); | 105 DCHECK(context_provider); |
| 106 uint32_t renderer_id = next_renderer_id_++; | 106 uint32_t renderer_id = next_renderer_id_++; |
| 107 CHECK(renderer_id); |
| 107 | 108 |
| 108 // Create the state and bind implementation to it. | 109 // Create the state and bind implementation to it. |
| 109 RendererState* renderer_state = | 110 RendererState* renderer_state = |
| 110 new RendererState(renderer_id, SanitizeLabel(label)); | 111 new RendererState(renderer_id, SanitizeLabel(label)); |
| 111 RendererImpl* renderer_impl = | 112 RendererImpl* renderer_impl = |
| 112 new RendererImpl(this, renderer_state, renderer_request.Pass()); | 113 new RendererImpl(this, renderer_state, renderer_request.Pass()); |
| 113 renderer_state->set_renderer_impl(renderer_impl); | 114 renderer_state->set_renderer_impl(renderer_impl); |
| 114 renderer_impl->set_connection_error_handler( | 115 renderer_impl->set_connection_error_handler( |
| 115 base::Bind(&CompositorEngine::OnRendererConnectionError, | 116 base::Bind(&CompositorEngine::OnRendererConnectionError, |
| 116 base::Unretained(this), renderer_state)); | 117 base::Unretained(this), renderer_state)); |
| (...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 302 SceneState* CompositorEngine::FindScene(uint32_t scene_token) { | 303 SceneState* CompositorEngine::FindScene(uint32_t scene_token) { |
| 303 auto it = scenes_by_token_.find(scene_token); | 304 auto it = scenes_by_token_.find(scene_token); |
| 304 return it != scenes_by_token_.end() ? it->second : nullptr; | 305 return it != scenes_by_token_.end() ? it->second : nullptr; |
| 305 } | 306 } |
| 306 | 307 |
| 307 void CompositorEngine::InvalidateScene(SceneState* scene_state) { | 308 void CompositorEngine::InvalidateScene(SceneState* scene_state) { |
| 308 DCHECK(IsSceneStateRegisteredDebug(scene_state)); | 309 DCHECK(IsSceneStateRegisteredDebug(scene_state)); |
| 309 DVLOG(2) << "InvalidateScene: scene=" << scene_state; | 310 DVLOG(2) << "InvalidateScene: scene=" << scene_state; |
| 310 | 311 |
| 311 for (auto& renderer : renderers_) { | 312 for (auto& renderer : renderers_) { |
| 312 if (renderer->snapshot() && | 313 if (renderer->current_snapshot() && |
| 313 renderer->snapshot()->InvalidateScene(scene_state->scene_def())) { | 314 renderer->current_snapshot()->HasDependency(scene_state->scene_def())) { |
| 314 ScheduleFrameForRenderer(renderer, Scheduler::SchedulingMode::kSnapshot); | 315 ScheduleFrameForRenderer(renderer, Scheduler::SchedulingMode::kSnapshot); |
| 315 } | 316 } |
| 316 } | 317 } |
| 317 } | 318 } |
| 318 | 319 |
| 319 SceneDef::Disposition CompositorEngine::PresentScene( | 320 SceneDef::Disposition CompositorEngine::PresentScene( |
| 320 SceneState* scene_state, | 321 SceneState* scene_state, |
| 321 int64_t presentation_time) { | 322 int64_t presentation_time) { |
| 322 DCHECK(IsSceneStateRegisteredDebug(scene_state)); | 323 DCHECK(IsSceneStateRegisteredDebug(scene_state)); |
| 323 DVLOG(2) << "PresentScene: scene=" << scene_state; | 324 DVLOG(2) << "PresentScene: scene=" << scene_state; |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 358 | 359 |
| 359 void CompositorEngine::SnapshotRenderer( | 360 void CompositorEngine::SnapshotRenderer( |
| 360 RendererState* renderer_state, | 361 RendererState* renderer_state, |
| 361 const mojo::gfx::composition::FrameInfo& frame_info) { | 362 const mojo::gfx::composition::FrameInfo& frame_info) { |
| 362 DCHECK(IsRendererStateRegisteredDebug(renderer_state)); | 363 DCHECK(IsRendererStateRegisteredDebug(renderer_state)); |
| 363 DVLOG(2) << "SnapshotRenderer: renderer_state=" << renderer_state; | 364 DVLOG(2) << "SnapshotRenderer: renderer_state=" << renderer_state; |
| 364 | 365 |
| 365 if (VLOG_IS_ON(2)) { | 366 if (VLOG_IS_ON(2)) { |
| 366 std::ostringstream block_log; | 367 std::ostringstream block_log; |
| 367 SnapshotRendererInner(renderer_state, frame_info, &block_log); | 368 SnapshotRendererInner(renderer_state, frame_info, &block_log); |
| 368 if (!renderer_state->frame()) { | 369 if (!renderer_state->current_snapshot() || |
| 370 renderer_state->current_snapshot()->is_blocked()) { |
| 369 DVLOG(2) << "Rendering completely blocked: " << block_log.str(); | 371 DVLOG(2) << "Rendering completely blocked: " << block_log.str(); |
| 370 } else if (!block_log.str().empty()) { | 372 } else if (!block_log.str().empty()) { |
| 371 DVLOG(2) << "Rendering partially blocked: " << block_log.str(); | 373 DVLOG(2) << "Rendering partially blocked: " << block_log.str(); |
| 372 } else { | 374 } else { |
| 373 DVLOG(2) << "Rendering unblocked"; | 375 DVLOG(2) << "Rendering unblocked"; |
| 374 } | 376 } |
| 375 } else { | 377 } else { |
| 376 SnapshotRendererInner(renderer_state, frame_info, nullptr); | 378 SnapshotRendererInner(renderer_state, frame_info, nullptr); |
| 377 } | 379 } |
| 380 |
| 381 if (renderer_state->current_snapshot() && |
| 382 !renderer_state->current_snapshot()->is_blocked()) { |
| 383 renderer_state->output()->SubmitFrame( |
| 384 renderer_state->current_snapshot()->CreateFrame( |
| 385 renderer_state->root_scene_viewport(), frame_info)); |
| 386 } |
| 378 } | 387 } |
| 379 | 388 |
| 380 void CompositorEngine::SnapshotRendererInner( | 389 void CompositorEngine::SnapshotRendererInner( |
| 381 RendererState* renderer_state, | 390 RendererState* renderer_state, |
| 382 const mojo::gfx::composition::FrameInfo& frame_info, | 391 const mojo::gfx::composition::FrameInfo& frame_info, |
| 383 std::ostream* block_log) { | 392 std::ostream* block_log) { |
| 384 if (!renderer_state->root_scene()) { | 393 if (!renderer_state->root_scene()) { |
| 385 if (block_log) | 394 if (block_log) |
| 386 *block_log << "No root scene" << std::endl; | 395 *block_log << "No root scene" << std::endl; |
| 387 renderer_state->SetSnapshot(nullptr); | 396 renderer_state->SetSnapshot(nullptr); |
| 388 return; | 397 return; |
| 389 } | 398 } |
| 390 | 399 |
| 391 SnapshotBuilder builder(block_log); | 400 SnapshotBuilder builder(block_log); |
| 392 renderer_state->SetSnapshot( | 401 renderer_state->SetSnapshot( |
| 393 builder.Build(renderer_state->root_scene()->scene_def(), | 402 builder.Build(renderer_state->root_scene()->scene_def())); |
| 394 renderer_state->root_scene_viewport(), frame_info)); | |
| 395 | |
| 396 if (renderer_state->frame()) | |
| 397 renderer_state->output()->SubmitFrame(renderer_state->frame()); | |
| 398 } | 403 } |
| 399 | 404 |
| 400 void CompositorEngine::ScheduleFrameForRenderer( | 405 void CompositorEngine::ScheduleFrameForRenderer( |
| 401 RendererState* renderer_state, | 406 RendererState* renderer_state, |
| 402 Scheduler::SchedulingMode scheduling_mode) { | 407 Scheduler::SchedulingMode scheduling_mode) { |
| 403 DCHECK(IsRendererStateRegisteredDebug(renderer_state)); | 408 DCHECK(IsRendererStateRegisteredDebug(renderer_state)); |
| 404 renderer_state->output()->GetScheduler()->ScheduleFrame(scheduling_mode); | 409 renderer_state->output()->GetScheduler()->ScheduleFrame(scheduling_mode); |
| 405 } | 410 } |
| 406 | 411 |
| 407 void CompositorEngine::OnOutputError( | 412 void CompositorEngine::OnOutputError( |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 454 | 459 |
| 455 SceneDef::Disposition disposition = | 460 SceneDef::Disposition disposition = |
| 456 PresentScene(scene_state, presentation_time); | 461 PresentScene(scene_state, presentation_time); |
| 457 if (disposition == SceneDef::Disposition::kFailed) | 462 if (disposition == SceneDef::Disposition::kFailed) |
| 458 DestroyScene(scene_state); | 463 DestroyScene(scene_state); |
| 459 else if (disposition == SceneDef::Disposition::kSucceeded) | 464 else if (disposition == SceneDef::Disposition::kSucceeded) |
| 460 InvalidateScene(scene_state); | 465 InvalidateScene(scene_state); |
| 461 } | 466 } |
| 462 | 467 |
| 463 } // namespace compositor | 468 } // namespace compositor |
| OLD | NEW |