Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(201)

Side by Side Diff: services/gfx/compositor/compositor_engine.cc

Issue 1995873002: Mozart: Improve tracing and backpressure. (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698