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

Unified 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: address review comments 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 side-by-side diff with in-line comments
Download patch
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(

Powered by Google App Engine
This is Rietveld 408576698