Chromium Code Reviews| 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 |
| 11 #include "base/bind.h" | 11 #include "base/bind.h" |
| 12 #include "base/bind_helpers.h" | 12 #include "base/bind_helpers.h" |
| 13 #include "base/time/time.h" | 13 #include "base/time/time.h" |
| 14 #include "base/trace_event/trace_event.h" | |
| 14 #include "mojo/services/gfx/composition/cpp/formatting.h" | 15 #include "mojo/services/gfx/composition/cpp/formatting.h" |
| 15 #include "mojo/skia/type_converters.h" | 16 #include "mojo/skia/type_converters.h" |
| 16 #include "services/gfx/compositor/backend/gpu_output.h" | 17 #include "services/gfx/compositor/backend/gpu_output.h" |
| 17 #include "services/gfx/compositor/graph/snapshot.h" | 18 #include "services/gfx/compositor/graph/snapshot.h" |
| 18 #include "services/gfx/compositor/render/render_frame.h" | 19 #include "services/gfx/compositor/render/render_frame.h" |
| 19 #include "services/gfx/compositor/renderer_impl.h" | 20 #include "services/gfx/compositor/renderer_impl.h" |
| 20 #include "services/gfx/compositor/scene_impl.h" | 21 #include "services/gfx/compositor/scene_impl.h" |
| 21 | 22 |
| 22 namespace compositor { | 23 namespace compositor { |
| 23 namespace { | 24 namespace { |
| (...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 343 base::Unretained(this), base::Unretained(scene_state)), | 344 base::Unretained(this), base::Unretained(scene_state)), |
| 344 errs); | 345 errs); |
| 345 if (disposition == SceneDef::Disposition::kFailed) { | 346 if (disposition == SceneDef::Disposition::kFailed) { |
| 346 LOG(ERROR) << "Scene published invalid updates: scene=" << scene_state; | 347 LOG(ERROR) << "Scene published invalid updates: scene=" << scene_state; |
| 347 LOG(ERROR) << errs.str(); | 348 LOG(ERROR) << errs.str(); |
| 348 // Caller is responsible for destroying the scene. | 349 // Caller is responsible for destroying the scene. |
| 349 } | 350 } |
| 350 return disposition; | 351 return disposition; |
| 351 } | 352 } |
| 352 | 353 |
| 354 void CompositorEngine::ComposeRenderer( | |
| 355 RendererState* renderer_state, | |
| 356 const mojo::gfx::composition::FrameInfo& frame_info) { | |
| 357 DCHECK(IsRendererStateRegisteredDebug(renderer_state)); | |
| 358 DVLOG(2) << "ComposeRenderer: renderer_state=" << renderer_state; | |
| 359 | |
| 360 TRACE_EVENT1("gfx", "CompositorEngine::ComposeRenderer", "renderer", | |
| 361 renderer_state->FormattedLabel()); | |
| 362 | |
| 363 int64_t composition_time = MojoGetTimeTicksNow(); | |
| 364 PresentRenderer(renderer_state, frame_info.presentation_time); | |
| 365 SnapshotRenderer(renderer_state); | |
| 366 PaintRenderer(renderer_state, frame_info, composition_time); | |
| 367 } | |
| 368 | |
| 353 void CompositorEngine::PresentRenderer(RendererState* renderer_state, | 369 void CompositorEngine::PresentRenderer(RendererState* renderer_state, |
| 354 int64_t presentation_time) { | 370 int64_t presentation_time) { |
| 355 DCHECK(IsRendererStateRegisteredDebug(renderer_state)); | 371 DCHECK(IsRendererStateRegisteredDebug(renderer_state)); |
| 356 DVLOG(2) << "PresentRenderer: renderer_state=" << renderer_state; | 372 DVLOG(2) << "PresentRenderer: renderer_state=" << renderer_state; |
| 357 | 373 |
| 374 TRACE_EVENT1("gfx", "CompositorEngine::PresentRenderer", "renderer", | |
| 375 renderer_state->FormattedLabel()); | |
| 376 | |
| 358 // TODO(jeffbrown): Be more selective and do this work only for scenes | 377 // TODO(jeffbrown): Be more selective and do this work only for scenes |
| 359 // associated with the renderer that actually have pending updates. | 378 // associated with the renderer that actually have pending updates. |
| 360 std::vector<SceneState*> dead_scenes; | 379 std::vector<SceneState*> dead_scenes; |
| 361 for (auto& pair : scenes_by_token_) { | 380 for (auto& pair : scenes_by_token_) { |
| 362 SceneState* scene_state = pair.second; | 381 SceneState* scene_state = pair.second; |
| 363 SceneDef::Disposition disposition = | 382 SceneDef::Disposition disposition = |
| 364 PresentScene(scene_state, presentation_time); | 383 PresentScene(scene_state, presentation_time); |
| 365 if (disposition == SceneDef::Disposition::kFailed) | 384 if (disposition == SceneDef::Disposition::kFailed) |
| 366 dead_scenes.push_back(scene_state); | 385 dead_scenes.push_back(scene_state); |
| 367 } | 386 } |
| 368 for (SceneState* scene_state : dead_scenes) | 387 for (SceneState* scene_state : dead_scenes) |
| 369 DestroyScene(scene_state); | 388 DestroyScene(scene_state); |
| 370 } | 389 } |
| 371 | 390 |
| 372 void CompositorEngine::SnapshotRenderer( | 391 void CompositorEngine::SnapshotRenderer(RendererState* renderer_state) { |
| 373 RendererState* renderer_state, | |
| 374 const mojo::gfx::composition::FrameInfo& frame_info) { | |
| 375 DCHECK(IsRendererStateRegisteredDebug(renderer_state)); | 392 DCHECK(IsRendererStateRegisteredDebug(renderer_state)); |
| 376 DVLOG(2) << "SnapshotRenderer: renderer_state=" << renderer_state; | 393 DVLOG(2) << "SnapshotRenderer: renderer_state=" << renderer_state; |
| 377 | 394 |
| 395 TRACE_EVENT1("gfx", "CompositorEngine::SnapshotRenderer", "renderer", | |
| 396 renderer_state->FormattedLabel()); | |
| 397 | |
| 378 if (VLOG_IS_ON(2)) { | 398 if (VLOG_IS_ON(2)) { |
| 379 std::ostringstream block_log; | 399 std::ostringstream block_log; |
| 380 SnapshotRendererInner(renderer_state, &block_log); | 400 SnapshotRendererInner(renderer_state, &block_log); |
| 381 if (!renderer_state->current_snapshot() || | 401 if (!renderer_state->current_snapshot() || |
| 382 renderer_state->current_snapshot()->is_blocked()) { | 402 renderer_state->current_snapshot()->is_blocked()) { |
| 383 DVLOG(2) << "Rendering completely blocked:" << std::endl | 403 DVLOG(2) << "Rendering completely blocked:" << std::endl |
| 384 << block_log.str(); | 404 << block_log.str(); |
| 385 } else if (!block_log.str().empty()) { | 405 } else if (!block_log.str().empty()) { |
| 386 DVLOG(2) << "Rendering partially blocked:" << std::endl | 406 DVLOG(2) << "Rendering partially blocked:" << std::endl |
| 387 << block_log.str(); | 407 << block_log.str(); |
| 388 } else { | 408 } else { |
| 389 DVLOG(2) << "Rendering unblocked"; | 409 DVLOG(2) << "Rendering unblocked"; |
| 390 } | 410 } |
| 391 } else { | 411 } else { |
| 392 SnapshotRendererInner(renderer_state, nullptr); | 412 SnapshotRendererInner(renderer_state, nullptr); |
| 393 } | 413 } |
| 394 | |
| 395 if (renderer_state->visible_snapshot()) { | |
| 396 DCHECK(!renderer_state->visible_snapshot()->is_blocked()); | |
| 397 renderer_state->output()->SubmitFrame( | |
| 398 renderer_state->visible_snapshot()->CreateFrame( | |
| 399 renderer_state->root_scene_viewport(), frame_info)); | |
| 400 } else { | |
| 401 SkIRect viewport = renderer_state->root_scene_viewport().To<SkIRect>(); | |
| 402 if (!viewport.isEmpty()) { | |
| 403 renderer_state->output()->SubmitFrame( | |
| 404 new RenderFrame(viewport, frame_info)); | |
| 405 } | |
| 406 } | |
| 407 } | 414 } |
| 408 | 415 |
| 409 void CompositorEngine::SnapshotRendererInner(RendererState* renderer_state, | 416 void CompositorEngine::SnapshotRendererInner(RendererState* renderer_state, |
| 410 std::ostream* block_log) { | 417 std::ostream* block_log) { |
| 411 if (!renderer_state->root_scene()) { | 418 if (!renderer_state->root_scene()) { |
| 412 if (block_log) | 419 if (block_log) |
| 413 *block_log << "No root scene" << std::endl; | 420 *block_log << "No root scene" << std::endl; |
| 414 renderer_state->SetSnapshot(nullptr); | 421 renderer_state->SetSnapshot(nullptr); |
| 415 return; | 422 return; |
| 416 } | 423 } |
| 417 | 424 |
| 418 renderer_state->SetSnapshot( | 425 renderer_state->SetSnapshot( |
| 419 universe_.SnapshotScene(renderer_state->root_scene()->scene_token(), | 426 universe_.SnapshotScene(renderer_state->root_scene()->scene_token(), |
| 420 renderer_state->root_scene_version(), block_log)); | 427 renderer_state->root_scene_version(), block_log)); |
| 421 } | 428 } |
| 422 | 429 |
| 430 void CompositorEngine::PaintRenderer( | |
| 431 RendererState* renderer_state, | |
| 432 const mojo::gfx::composition::FrameInfo& frame_info, | |
| 433 int64_t composition_time) { | |
| 434 DCHECK(IsRendererStateRegisteredDebug(renderer_state)); | |
| 435 DVLOG(2) << "PaintRenderer: renderer_state=" << renderer_state; | |
| 436 | |
| 437 TRACE_EVENT1("gfx", "CompositorEngine::PaintRenderer", "renderer", | |
| 438 renderer_state->FormattedLabel()); | |
| 439 | |
| 440 RenderFrame::Metadata frame_metadata(frame_info, composition_time); | |
| 441 | |
| 442 if (renderer_state->visible_snapshot()) { | |
|
mikejurka
2016/05/19 23:26:19
could you add a comment explaining this if/else br
jeffbrown
2016/05/20 01:09:48
ok
| |
| 443 DCHECK(!renderer_state->visible_snapshot()->is_blocked()); | |
| 444 renderer_state->output()->SubmitFrame( | |
| 445 renderer_state->visible_snapshot()->Paint( | |
| 446 frame_metadata, renderer_state->root_scene_viewport())); | |
| 447 } else { | |
| 448 SkIRect viewport = renderer_state->root_scene_viewport().To<SkIRect>(); | |
| 449 if (!viewport.isEmpty()) { | |
| 450 renderer_state->output()->SubmitFrame( | |
| 451 new RenderFrame(frame_metadata, viewport)); | |
| 452 } | |
| 453 } | |
| 454 } | |
| 455 | |
| 423 void CompositorEngine::ScheduleFrameForRenderer( | 456 void CompositorEngine::ScheduleFrameForRenderer( |
| 424 RendererState* renderer_state, | 457 RendererState* renderer_state, |
| 425 Scheduler::SchedulingMode scheduling_mode) { | 458 Scheduler::SchedulingMode scheduling_mode) { |
| 426 DCHECK(IsRendererStateRegisteredDebug(renderer_state)); | 459 DCHECK(IsRendererStateRegisteredDebug(renderer_state)); |
| 427 renderer_state->output()->GetScheduler()->ScheduleFrame(scheduling_mode); | 460 renderer_state->output()->GetScheduler()->ScheduleFrame(scheduling_mode); |
| 428 } | 461 } |
| 429 | 462 |
| 430 void CompositorEngine::OnOutputError( | 463 void CompositorEngine::OnOutputError( |
| 431 const base::WeakPtr<RendererState>& renderer_state_weak) { | 464 const base::WeakPtr<RendererState>& renderer_state_weak) { |
| 432 RendererState* renderer_state = renderer_state_weak.get(); | 465 RendererState* renderer_state = renderer_state_weak.get(); |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 456 } | 489 } |
| 457 | 490 |
| 458 void CompositorEngine::OnOutputSnapshotRequest( | 491 void CompositorEngine::OnOutputSnapshotRequest( |
| 459 const base::WeakPtr<RendererState>& renderer_state_weak, | 492 const base::WeakPtr<RendererState>& renderer_state_weak, |
| 460 const mojo::gfx::composition::FrameInfo& frame_info) { | 493 const mojo::gfx::composition::FrameInfo& frame_info) { |
| 461 RendererState* renderer_state = renderer_state_weak.get(); | 494 RendererState* renderer_state = renderer_state_weak.get(); |
| 462 if (!renderer_state) | 495 if (!renderer_state) |
| 463 return; | 496 return; |
| 464 DCHECK(IsRendererStateRegisteredDebug(renderer_state)); | 497 DCHECK(IsRendererStateRegisteredDebug(renderer_state)); |
| 465 | 498 |
| 466 PresentRenderer(renderer_state, frame_info.presentation_time); | 499 ComposeRenderer(renderer_state, frame_info); |
| 467 SnapshotRenderer(renderer_state, frame_info); | |
| 468 } | 500 } |
| 469 | 501 |
| 470 void CompositorEngine::OnPresentScene( | 502 void CompositorEngine::OnPresentScene( |
| 471 const base::WeakPtr<SceneState>& scene_state_weak, | 503 const base::WeakPtr<SceneState>& scene_state_weak, |
| 472 int64_t presentation_time) { | 504 int64_t presentation_time) { |
| 473 SceneState* scene_state = scene_state_weak.get(); | 505 SceneState* scene_state = scene_state_weak.get(); |
| 474 if (!scene_state) | 506 if (!scene_state) |
| 475 return; | 507 return; |
| 476 DCHECK(IsSceneStateRegisteredDebug(scene_state)); | 508 DCHECK(IsSceneStateRegisteredDebug(scene_state)); |
| 477 | 509 |
| 478 SceneDef::Disposition disposition = | 510 SceneDef::Disposition disposition = |
| 479 PresentScene(scene_state, presentation_time); | 511 PresentScene(scene_state, presentation_time); |
| 480 if (disposition == SceneDef::Disposition::kFailed) | 512 if (disposition == SceneDef::Disposition::kFailed) |
| 481 DestroyScene(scene_state); | 513 DestroyScene(scene_state); |
| 482 else if (disposition == SceneDef::Disposition::kSucceeded) | 514 else if (disposition == SceneDef::Disposition::kSucceeded) |
| 483 InvalidateScene(scene_state); | 515 InvalidateScene(scene_state); |
| 484 } | 516 } |
| 485 | 517 |
| 486 } // namespace compositor | 518 } // namespace compositor |
| OLD | NEW |