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

Side by Side Diff: cc/surfaces/display.cc

Issue 2339633003: Reland of cc: Remove frame queuing from the scheduler. (Closed)
Patch Set: post swap ack from CFS in fresh call stack Created 4 years, 3 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "cc/surfaces/display.h" 5 #include "cc/surfaces/display.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include "base/memory/ptr_util.h" 9 #include "base/memory/ptr_util.h"
10 #include "base/trace_event/trace_event.h" 10 #include "base/trace_event/trace_event.h"
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after
239 return false; 239 return false;
240 } 240 }
241 241
242 CompositorFrame frame = aggregator_->Aggregate(current_surface_id_); 242 CompositorFrame frame = aggregator_->Aggregate(current_surface_id_);
243 if (!frame.delegated_frame_data) { 243 if (!frame.delegated_frame_data) {
244 TRACE_EVENT_INSTANT0("cc", "Empty aggregated frame.", 244 TRACE_EVENT_INSTANT0("cc", "Empty aggregated frame.",
245 TRACE_EVENT_SCOPE_THREAD); 245 TRACE_EVENT_SCOPE_THREAD);
246 return false; 246 return false;
247 } 247 }
248 248
249 // Run callbacks early to allow pipelining. 249 // Run callbacks early to allow pipelining. Do not run root surface callback
250 // here so that browser compositor cannot reclaim resources until we're done
251 // with drawing.
250 for (const auto& id_entry : aggregator_->previous_contained_surfaces()) { 252 for (const auto& id_entry : aggregator_->previous_contained_surfaces()) {
251 Surface* surface = surface_manager_->GetSurfaceForId(id_entry.first); 253 Surface* surface = surface_manager_->GetSurfaceForId(id_entry.first);
252 if (surface) 254 if (surface && surface->surface_id() != current_surface_id_)
253 surface->RunDrawCallbacks(); 255 surface->RunDrawCallbacks();
254 } 256 }
255 257
256 DelegatedFrameData* frame_data = frame.delegated_frame_data.get(); 258 DelegatedFrameData* frame_data = frame.delegated_frame_data.get();
257 259
258 frame.metadata.latency_info.insert(frame.metadata.latency_info.end(), 260 frame.metadata.latency_info.insert(frame.metadata.latency_info.end(),
259 stored_latency_info_.begin(), 261 stored_latency_info_.begin(),
260 stored_latency_info_.end()); 262 stored_latency_info_.end());
261 stored_latency_info_.clear(); 263 stored_latency_info_.clear();
262 bool have_copy_requests = false; 264 bool have_copy_requests = false;
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
319 device_color_space_, device_viewport_rect, 321 device_color_space_, device_viewport_rect,
320 device_clip_rect); 322 device_clip_rect);
321 } else { 323 } else {
322 TRACE_EVENT_INSTANT0("cc", "Draw skipped.", TRACE_EVENT_SCOPE_THREAD); 324 TRACE_EVENT_INSTANT0("cc", "Draw skipped.", TRACE_EVENT_SCOPE_THREAD);
323 } 325 }
324 326
325 bool should_swap = should_draw && size_matches; 327 bool should_swap = should_draw && size_matches;
326 if (should_swap) { 328 if (should_swap) {
327 swapped_since_resize_ = true; 329 swapped_since_resize_ = true;
328 for (auto& latency : frame.metadata.latency_info) { 330 for (auto& latency : frame.metadata.latency_info) {
329 TRACE_EVENT_WITH_FLOW1("input,benchmark", "LatencyInfo.Flow", 331 TRACE_EVENT_WITH_FLOW1(
332 "input,benchmark", "LatencyInfo.Flow",
330 TRACE_ID_DONT_MANGLE(latency.trace_id()), 333 TRACE_ID_DONT_MANGLE(latency.trace_id()),
331 TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, 334 TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, "step",
332 "step", "Display::DrawAndSwap"); 335 "Display::DrawAndSwap");
333 } 336 }
334 benchmark_instrumentation::IssueDisplayRenderingStatsEvent(); 337 benchmark_instrumentation::IssueDisplayRenderingStatsEvent();
335 renderer_->SwapBuffers(std::move(frame.metadata)); 338 renderer_->SwapBuffers(std::move(frame.metadata));
336 if (scheduler_) 339 if (scheduler_)
337 scheduler_->DidSwapBuffers(); 340 scheduler_->DidSwapBuffers();
338 } else { 341 } else {
339 if (have_damage && !size_matches) 342 if (have_damage && !size_matches)
340 aggregator_->SetFullDamageForSurface(current_surface_id_); 343 aggregator_->SetFullDamageForSurface(current_surface_id_);
341 TRACE_EVENT_INSTANT0("cc", "Swap skipped.", TRACE_EVENT_SCOPE_THREAD); 344 TRACE_EVENT_INSTANT0("cc", "Swap skipped.", TRACE_EVENT_SCOPE_THREAD);
342 stored_latency_info_.insert(stored_latency_info_.end(), 345 stored_latency_info_.insert(stored_latency_info_.end(),
343 frame.metadata.latency_info.begin(), 346 frame.metadata.latency_info.begin(),
344 frame.metadata.latency_info.end()); 347 frame.metadata.latency_info.end());
345 if (scheduler_) { 348 if (scheduler_) {
346 scheduler_->DidSwapBuffers(); 349 scheduler_->DidSwapBuffers();
347 scheduler_->DidSwapBuffersComplete(); 350 scheduler_->DidSwapBuffersComplete();
348 } 351 }
349 } 352 }
350 353
354 // Run draw callback for root surface after drawing. It's safe for the browser
355 // compositor to reclaim resources now.
356 Surface* root_surface =
357 surface_manager_->GetSurfaceForId(current_surface_id_);
358 if (root_surface)
359 root_surface->RunDrawCallbacks();
360
351 client_->DisplayDidDrawAndSwap(); 361 client_->DisplayDidDrawAndSwap();
352 return true; 362 return true;
353 } 363 }
354 364
355 void Display::DidSwapBuffersComplete() { 365 void Display::DidSwapBuffersComplete() {
356 if (scheduler_) 366 if (scheduler_)
357 scheduler_->DidSwapBuffersComplete(); 367 scheduler_->DidSwapBuffersComplete();
358 if (renderer_) 368 if (renderer_)
359 renderer_->SwapBuffersComplete(); 369 renderer_->SwapBuffersComplete();
360 } 370 }
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
429 const SurfaceId& Display::CurrentSurfaceId() { 439 const SurfaceId& Display::CurrentSurfaceId() {
430 return current_surface_id_; 440 return current_surface_id_;
431 } 441 }
432 442
433 void Display::ForceImmediateDrawAndSwapIfPossible() { 443 void Display::ForceImmediateDrawAndSwapIfPossible() {
434 if (scheduler_) 444 if (scheduler_)
435 scheduler_->ForceImmediateSwapIfPossible(); 445 scheduler_->ForceImmediateSwapIfPossible();
436 } 446 }
437 447
438 } // namespace cc 448 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698