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 |