OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |