| 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/threading/thread_task_runner_handle.h" | 10 #include "base/threading/thread_task_runner_handle.h" |
| (...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 219 TRACE_EVENT_INSTANT0("cc", "No root surface.", TRACE_EVENT_SCOPE_THREAD); | 219 TRACE_EVENT_INSTANT0("cc", "No root surface.", TRACE_EVENT_SCOPE_THREAD); |
| 220 return false; | 220 return false; |
| 221 } | 221 } |
| 222 | 222 |
| 223 InitializeRenderer(); | 223 InitializeRenderer(); |
| 224 if (!output_surface_) { | 224 if (!output_surface_) { |
| 225 TRACE_EVENT_INSTANT0("cc", "No output surface", TRACE_EVENT_SCOPE_THREAD); | 225 TRACE_EVENT_INSTANT0("cc", "No output surface", TRACE_EVENT_SCOPE_THREAD); |
| 226 return false; | 226 return false; |
| 227 } | 227 } |
| 228 | 228 |
| 229 std::unique_ptr<CompositorFrame> frame = | 229 CompositorFrame frame = aggregator_->Aggregate(current_surface_id_); |
| 230 aggregator_->Aggregate(current_surface_id_); | 230 if (!frame.delegated_frame_data) { |
| 231 if (!frame) { | |
| 232 TRACE_EVENT_INSTANT0("cc", "Empty aggregated frame.", | 231 TRACE_EVENT_INSTANT0("cc", "Empty aggregated frame.", |
| 233 TRACE_EVENT_SCOPE_THREAD); | 232 TRACE_EVENT_SCOPE_THREAD); |
| 234 return false; | 233 return false; |
| 235 } | 234 } |
| 236 | 235 |
| 237 // Run callbacks early to allow pipelining. | 236 // Run callbacks early to allow pipelining. |
| 238 for (const auto& id_entry : aggregator_->previous_contained_surfaces()) { | 237 for (const auto& id_entry : aggregator_->previous_contained_surfaces()) { |
| 239 Surface* surface = surface_manager_->GetSurfaceForId(id_entry.first); | 238 Surface* surface = surface_manager_->GetSurfaceForId(id_entry.first); |
| 240 if (surface) | 239 if (surface) |
| 241 surface->RunDrawCallbacks(SurfaceDrawStatus::DRAWN); | 240 surface->RunDrawCallbacks(SurfaceDrawStatus::DRAWN); |
| 242 } | 241 } |
| 243 | 242 |
| 244 DelegatedFrameData* frame_data = frame->delegated_frame_data.get(); | 243 DelegatedFrameData* frame_data = frame.delegated_frame_data.get(); |
| 245 | 244 |
| 246 frame->metadata.latency_info.insert(frame->metadata.latency_info.end(), | 245 frame.metadata.latency_info.insert(frame.metadata.latency_info.end(), |
| 247 stored_latency_info_.begin(), | 246 stored_latency_info_.begin(), |
| 248 stored_latency_info_.end()); | 247 stored_latency_info_.end()); |
| 249 stored_latency_info_.clear(); | 248 stored_latency_info_.clear(); |
| 250 bool have_copy_requests = false; | 249 bool have_copy_requests = false; |
| 251 for (const auto& pass : frame_data->render_pass_list) { | 250 for (const auto& pass : frame_data->render_pass_list) { |
| 252 have_copy_requests |= !pass->copy_requests.empty(); | 251 have_copy_requests |= !pass->copy_requests.empty(); |
| 253 } | 252 } |
| 254 | 253 |
| 255 gfx::Size surface_size; | 254 gfx::Size surface_size; |
| 256 bool have_damage = false; | 255 bool have_damage = false; |
| 257 if (!frame_data->render_pass_list.empty()) { | 256 if (!frame_data->render_pass_list.empty()) { |
| 258 RenderPass& last_render_pass = *frame_data->render_pass_list.back(); | 257 RenderPass& last_render_pass = *frame_data->render_pass_list.back(); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 293 renderer_->DrawFrame(&frame_data->render_pass_list, device_scale_factor_, | 292 renderer_->DrawFrame(&frame_data->render_pass_list, device_scale_factor_, |
| 294 device_viewport_rect, device_clip_rect, | 293 device_viewport_rect, device_clip_rect, |
| 295 disable_picture_quad_image_filtering); | 294 disable_picture_quad_image_filtering); |
| 296 } else { | 295 } else { |
| 297 TRACE_EVENT_INSTANT0("cc", "Draw skipped.", TRACE_EVENT_SCOPE_THREAD); | 296 TRACE_EVENT_INSTANT0("cc", "Draw skipped.", TRACE_EVENT_SCOPE_THREAD); |
| 298 } | 297 } |
| 299 | 298 |
| 300 bool should_swap = should_draw && size_matches; | 299 bool should_swap = should_draw && size_matches; |
| 301 if (should_swap) { | 300 if (should_swap) { |
| 302 swapped_since_resize_ = true; | 301 swapped_since_resize_ = true; |
| 303 for (auto& latency : frame->metadata.latency_info) { | 302 for (auto& latency : frame.metadata.latency_info) { |
| 304 TRACE_EVENT_WITH_FLOW1("input,benchmark", "LatencyInfo.Flow", | 303 TRACE_EVENT_WITH_FLOW1("input,benchmark", "LatencyInfo.Flow", |
| 305 TRACE_ID_DONT_MANGLE(latency.trace_id()), | 304 TRACE_ID_DONT_MANGLE(latency.trace_id()), |
| 306 TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, | 305 TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, |
| 307 "step", "Display::DrawAndSwap"); | 306 "step", "Display::DrawAndSwap"); |
| 308 } | 307 } |
| 309 benchmark_instrumentation::IssueDisplayRenderingStatsEvent(); | 308 benchmark_instrumentation::IssueDisplayRenderingStatsEvent(); |
| 310 renderer_->SwapBuffers(std::move(frame->metadata)); | 309 renderer_->SwapBuffers(std::move(frame.metadata)); |
| 311 } else { | 310 } else { |
| 312 if (have_damage && !size_matches) | 311 if (have_damage && !size_matches) |
| 313 aggregator_->SetFullDamageForSurface(current_surface_id_); | 312 aggregator_->SetFullDamageForSurface(current_surface_id_); |
| 314 TRACE_EVENT_INSTANT0("cc", "Swap skipped.", TRACE_EVENT_SCOPE_THREAD); | 313 TRACE_EVENT_INSTANT0("cc", "Swap skipped.", TRACE_EVENT_SCOPE_THREAD); |
| 315 stored_latency_info_.insert(stored_latency_info_.end(), | 314 stored_latency_info_.insert(stored_latency_info_.end(), |
| 316 frame->metadata.latency_info.begin(), | 315 frame.metadata.latency_info.begin(), |
| 317 frame->metadata.latency_info.end()); | 316 frame.metadata.latency_info.end()); |
| 318 DidSwapBuffers(); | 317 DidSwapBuffers(); |
| 319 DidSwapBuffersComplete(); | 318 DidSwapBuffersComplete(); |
| 320 } | 319 } |
| 321 | 320 |
| 322 return true; | 321 return true; |
| 323 } | 322 } |
| 324 | 323 |
| 325 void Display::DidSwapBuffers() { | 324 void Display::DidSwapBuffers() { |
| 326 if (scheduler_) | 325 if (scheduler_) |
| 327 scheduler_->DidSwapBuffers(); | 326 scheduler_->DidSwapBuffers(); |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 410 | 409 |
| 411 if (surface_id == current_surface_id_) | 410 if (surface_id == current_surface_id_) |
| 412 UpdateRootSurfaceResourcesLocked(); | 411 UpdateRootSurfaceResourcesLocked(); |
| 413 } | 412 } |
| 414 | 413 |
| 415 SurfaceId Display::CurrentSurfaceId() { | 414 SurfaceId Display::CurrentSurfaceId() { |
| 416 return current_surface_id_; | 415 return current_surface_id_; |
| 417 } | 416 } |
| 418 | 417 |
| 419 } // namespace cc | 418 } // namespace cc |
| OLD | NEW |