| Index: services/gfx/compositor/compositor_engine.cc
|
| diff --git a/services/gfx/compositor/compositor_engine.cc b/services/gfx/compositor/compositor_engine.cc
|
| index 8ad5b0f36e45dfd569a199045a8de32cfedc89d0..bc05f2a09f4e8ca3778c1db0768fd9313285cdb1 100644
|
| --- a/services/gfx/compositor/compositor_engine.cc
|
| +++ b/services/gfx/compositor/compositor_engine.cc
|
| @@ -11,6 +11,7 @@
|
| #include "base/bind.h"
|
| #include "base/bind_helpers.h"
|
| #include "base/time/time.h"
|
| +#include "base/trace_event/trace_event.h"
|
| #include "mojo/services/gfx/composition/cpp/formatting.h"
|
| #include "mojo/skia/type_converters.h"
|
| #include "services/gfx/compositor/backend/gpu_output.h"
|
| @@ -350,11 +351,29 @@ SceneDef::Disposition CompositorEngine::PresentScene(
|
| return disposition;
|
| }
|
|
|
| +void CompositorEngine::ComposeRenderer(
|
| + RendererState* renderer_state,
|
| + const mojo::gfx::composition::FrameInfo& frame_info) {
|
| + DCHECK(IsRendererStateRegisteredDebug(renderer_state));
|
| + DVLOG(2) << "ComposeRenderer: renderer_state=" << renderer_state;
|
| +
|
| + TRACE_EVENT1("gfx", "CompositorEngine::ComposeRenderer", "renderer",
|
| + renderer_state->FormattedLabel());
|
| +
|
| + int64_t composition_time = MojoGetTimeTicksNow();
|
| + PresentRenderer(renderer_state, frame_info.presentation_time);
|
| + SnapshotRenderer(renderer_state);
|
| + PaintRenderer(renderer_state, frame_info, composition_time);
|
| +}
|
| +
|
| void CompositorEngine::PresentRenderer(RendererState* renderer_state,
|
| int64_t presentation_time) {
|
| DCHECK(IsRendererStateRegisteredDebug(renderer_state));
|
| DVLOG(2) << "PresentRenderer: renderer_state=" << renderer_state;
|
|
|
| + TRACE_EVENT1("gfx", "CompositorEngine::PresentRenderer", "renderer",
|
| + renderer_state->FormattedLabel());
|
| +
|
| // TODO(jeffbrown): Be more selective and do this work only for scenes
|
| // associated with the renderer that actually have pending updates.
|
| std::vector<SceneState*> dead_scenes;
|
| @@ -369,12 +388,13 @@ void CompositorEngine::PresentRenderer(RendererState* renderer_state,
|
| DestroyScene(scene_state);
|
| }
|
|
|
| -void CompositorEngine::SnapshotRenderer(
|
| - RendererState* renderer_state,
|
| - const mojo::gfx::composition::FrameInfo& frame_info) {
|
| +void CompositorEngine::SnapshotRenderer(RendererState* renderer_state) {
|
| DCHECK(IsRendererStateRegisteredDebug(renderer_state));
|
| DVLOG(2) << "SnapshotRenderer: renderer_state=" << renderer_state;
|
|
|
| + TRACE_EVENT1("gfx", "CompositorEngine::SnapshotRenderer", "renderer",
|
| + renderer_state->FormattedLabel());
|
| +
|
| if (VLOG_IS_ON(2)) {
|
| std::ostringstream block_log;
|
| SnapshotRendererInner(renderer_state, &block_log);
|
| @@ -391,19 +411,6 @@ void CompositorEngine::SnapshotRenderer(
|
| } else {
|
| SnapshotRendererInner(renderer_state, nullptr);
|
| }
|
| -
|
| - if (renderer_state->visible_snapshot()) {
|
| - DCHECK(!renderer_state->visible_snapshot()->is_blocked());
|
| - renderer_state->output()->SubmitFrame(
|
| - renderer_state->visible_snapshot()->CreateFrame(
|
| - renderer_state->root_scene_viewport(), frame_info));
|
| - } else {
|
| - SkIRect viewport = renderer_state->root_scene_viewport().To<SkIRect>();
|
| - if (!viewport.isEmpty()) {
|
| - renderer_state->output()->SubmitFrame(
|
| - new RenderFrame(viewport, frame_info));
|
| - }
|
| - }
|
| }
|
|
|
| void CompositorEngine::SnapshotRendererInner(RendererState* renderer_state,
|
| @@ -420,6 +427,34 @@ void CompositorEngine::SnapshotRendererInner(RendererState* renderer_state,
|
| renderer_state->root_scene_version(), block_log));
|
| }
|
|
|
| +void CompositorEngine::PaintRenderer(
|
| + RendererState* renderer_state,
|
| + const mojo::gfx::composition::FrameInfo& frame_info,
|
| + int64_t composition_time) {
|
| + DCHECK(IsRendererStateRegisteredDebug(renderer_state));
|
| + DVLOG(2) << "PaintRenderer: renderer_state=" << renderer_state;
|
| +
|
| + TRACE_EVENT1("gfx", "CompositorEngine::PaintRenderer", "renderer",
|
| + renderer_state->FormattedLabel());
|
| +
|
| + RenderFrame::Metadata frame_metadata(frame_info, composition_time);
|
| +
|
| + if (renderer_state->visible_snapshot()) {
|
| + // The renderer has snapshotted content; paint and submit it.
|
| + DCHECK(!renderer_state->visible_snapshot()->is_blocked());
|
| + renderer_state->output()->SubmitFrame(
|
| + renderer_state->visible_snapshot()->Paint(
|
| + frame_metadata, renderer_state->root_scene_viewport()));
|
| + } else {
|
| + // The renderer does not have any content; submit an empty (black) frame.
|
| + SkIRect viewport = renderer_state->root_scene_viewport().To<SkIRect>();
|
| + if (!viewport.isEmpty()) {
|
| + renderer_state->output()->SubmitFrame(
|
| + new RenderFrame(frame_metadata, viewport));
|
| + }
|
| + }
|
| +}
|
| +
|
| void CompositorEngine::ScheduleFrameForRenderer(
|
| RendererState* renderer_state,
|
| Scheduler::SchedulingMode scheduling_mode) {
|
| @@ -463,8 +498,7 @@ void CompositorEngine::OnOutputSnapshotRequest(
|
| return;
|
| DCHECK(IsRendererStateRegisteredDebug(renderer_state));
|
|
|
| - PresentRenderer(renderer_state, frame_info.presentation_time);
|
| - SnapshotRenderer(renderer_state, frame_info);
|
| + ComposeRenderer(renderer_state, frame_info);
|
| }
|
|
|
| void CompositorEngine::OnPresentScene(
|
|
|