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 |