| 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());
|
|
|