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

Unified Diff: cc/surfaces/display.cc

Issue 1251823005: cc: Make DisplayScheduler aware of resize and add tracing. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix tests; small logic changes Created 5 years, 5 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
« no previous file with comments | « no previous file | cc/surfaces/display_scheduler.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/surfaces/display.cc
diff --git a/cc/surfaces/display.cc b/cc/surfaces/display.cc
index 54a76efc3d76175fbb2b244f1ee73be4cd6fbe82..2b6e132f9c72ab2307c340506e48f456eade4444 100644
--- a/cc/surfaces/display.cc
+++ b/cc/surfaces/display.cc
@@ -62,17 +62,22 @@ void Display::SetSurfaceId(SurfaceId id, float device_scale_factor) {
if (current_surface_id_ == id && device_scale_factor_ == device_scale_factor)
return;
+ TRACE_EVENT0("cc", "Display::SetSurfaceId");
+
current_surface_id_ = id;
device_scale_factor_ = device_scale_factor;
UpdateRootSurfaceResourcesLocked();
if (scheduler_)
- scheduler_->EntireDisplayDamaged(id);
+ scheduler_->SetNewRootSurface(id);
}
void Display::Resize(const gfx::Size& size) {
if (size == current_surface_size_)
return;
+
+ TRACE_EVENT0("cc", "Display::Resize");
+
// Need to ensure all pending swaps have executed before the window is
// resized, or D3D11 will scale the swap output.
if (settings_.finish_rendering_on_resize) {
@@ -85,7 +90,7 @@ void Display::Resize(const gfx::Size& size) {
swapped_since_resize_ = false;
current_surface_size_ = size;
if (scheduler_)
- scheduler_->EntireDisplayDamaged(current_surface_id_);
+ scheduler_->DisplayResized();
}
void Display::SetExternalClip(const gfx::Rect& clip) {
@@ -146,22 +151,29 @@ void Display::UpdateRootSurfaceResourcesLocked() {
}
bool Display::DrawAndSwap() {
- if (current_surface_id_.is_null())
+ TRACE_EVENT0("cc", "Display::DrawAndSwap");
+
+ if (current_surface_id_.is_null()) {
+ TRACE_EVENT_INSTANT0("cc", "No root surface.", TRACE_EVENT_SCOPE_THREAD);
return false;
+ }
InitializeRenderer();
- if (!output_surface_)
+ if (!output_surface_) {
+ TRACE_EVENT_INSTANT0("cc", "No output surface", TRACE_EVENT_SCOPE_THREAD);
return false;
+ }
if (output_surface_->SurfaceIsSuspendForRecycle())
return false;
scoped_ptr<CompositorFrame> frame =
aggregator_->Aggregate(current_surface_id_);
- if (!frame)
+ if (!frame) {
+ TRACE_EVENT_INSTANT0("cc", "Empty aggregated frame.",
+ TRACE_EVENT_SCOPE_THREAD);
return false;
-
- TRACE_EVENT0("cc", "Display::DrawAndSwap");
+ }
// Run callbacks early to allow pipelining.
for (const auto& id_entry : aggregator_->previous_contained_surfaces()) {
@@ -169,6 +181,7 @@ bool Display::DrawAndSwap() {
if (surface)
surface->RunDrawCallbacks(SurfaceDrawStatus::DRAWN);
}
+
DelegatedFrameData* frame_data = frame->delegated_frame_data.get();
frame->metadata.latency_info.insert(frame->metadata.latency_info.end(),
@@ -187,9 +200,13 @@ bool Display::DrawAndSwap() {
have_damage =
!frame_data->render_pass_list.back()->damage_rect.size().IsEmpty();
}
- bool avoid_swap = surface_size != current_surface_size_;
+
+ bool size_matches = surface_size == current_surface_size_;
+ if (!size_matches)
+ TRACE_EVENT_INSTANT0("cc", "Size missmatch.", TRACE_EVENT_SCOPE_THREAD);
+
bool should_draw = !frame->metadata.latency_info.empty() ||
- have_copy_requests || (have_damage && !avoid_swap);
+ have_copy_requests || (have_damage && size_matches);
if (should_draw) {
gfx::Rect device_viewport_rect = gfx::Rect(current_surface_size_);
@@ -202,9 +219,12 @@ bool Display::DrawAndSwap() {
renderer_->DrawFrame(&frame_data->render_pass_list, device_scale_factor_,
device_viewport_rect, device_clip_rect,
disable_picture_quad_image_filtering);
+ } else {
+ TRACE_EVENT_INSTANT0("cc", "Draw skipped.", TRACE_EVENT_SCOPE_THREAD);
}
- if (should_draw && !avoid_swap) {
+ bool should_swap = should_draw && size_matches;
+ if (should_swap) {
swapped_since_resize_ = true;
for (auto& latency : frame->metadata.latency_info) {
TRACE_EVENT_FLOW_STEP0(
@@ -216,6 +236,7 @@ bool Display::DrawAndSwap() {
benchmark_instrumentation::IssueDisplayRenderingStatsEvent();
renderer_->SwapBuffers(frame->metadata);
} else {
+ TRACE_EVENT_INSTANT0("cc", "Swap skipped.", TRACE_EVENT_SCOPE_THREAD);
stored_latency_info_.insert(stored_latency_info_.end(),
frame->metadata.latency_info.begin(),
frame->metadata.latency_info.end());
« no previous file with comments | « no previous file | cc/surfaces/display_scheduler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698