Index: cc/trees/layer_tree_host_impl.cc |
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc |
index a876eb1b4e6fa50f54708c0d70060b862c318631..5e30beafb92ae0040e07dffa71bd7357cde2f3db 100644 |
--- a/cc/trees/layer_tree_host_impl.cc |
+++ b/cc/trees/layer_tree_host_impl.cc |
@@ -1624,21 +1624,23 @@ CompositorFrameMetadata LayerTreeHostImpl::MakeCompositorFrameMetadata() const { |
return metadata; |
} |
-void LayerTreeHostImpl::DrawLayers(FrameData* frame) { |
+bool LayerTreeHostImpl::DrawLayers(FrameData* frame) { |
+ DCHECK(CanDraw()); |
+ DCHECK_EQ(frame->has_no_damage, frame->render_passes.empty()); |
+ |
TRACE_EVENT0("cc", "LayerTreeHostImpl::DrawLayers"); |
- base::TimeTicks frame_begin_time = CurrentBeginFrameArgs().frame_time; |
- DCHECK(CanDraw()); |
+ ResetRequiresHighResToDraw(); |
if (frame->has_no_damage) { |
- TRACE_EVENT_INSTANT0("cc", "EarlyOut_NoDamage", TRACE_EVENT_SCOPE_THREAD); |
DCHECK(!resourceless_software_draw_); |
- return; |
- } |
- DCHECK(!frame->render_passes.empty()); |
+ TRACE_EVENT_INSTANT0("cc", "EarlyOut_NoDamage", TRACE_EVENT_SCOPE_THREAD); |
+ active_tree()->BreakSwapPromises(SwapPromise::SWAP_FAILS); |
+ return false; |
+ } |
- fps_counter_->SaveTimeStamp(frame_begin_time, |
+ fps_counter_->SaveTimeStamp(CurrentBeginFrameArgs().frame_time, |
!output_surface_->context_provider()); |
rendering_stats_instrumentation_->IncrementFrameCount(1); |
@@ -1679,9 +1681,41 @@ void LayerTreeHostImpl::DrawLayers(FrameData* frame) { |
resource_provider_.get()); |
} |
- renderer_->DrawFrame(&frame->render_passes); |
- // The render passes should be consumed by the renderer. |
- DCHECK(frame->render_passes.empty()); |
+ CompositorFrameMetadata metadata = MakeCompositorFrameMetadata(); |
+ metadata.may_contain_video = frame->may_contain_video; |
+ active_tree()->FinishSwapPromises(&metadata); |
+ for (auto& latency : metadata.latency_info) { |
+ TRACE_EVENT_WITH_FLOW1("input,benchmark", "LatencyInfo.Flow", |
+ TRACE_ID_DONT_MANGLE(latency.trace_id()), |
+ TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, |
+ "step", "SwapBuffers"); |
+ // Only add the latency component once for renderer swap, not the browser |
+ // swap. |
+ if (!latency.FindLatency(ui::INPUT_EVENT_LATENCY_RENDERER_SWAP_COMPONENT, 0, |
+ nullptr)) { |
+ latency.AddLatencyNumber(ui::INPUT_EVENT_LATENCY_RENDERER_SWAP_COMPONENT, |
+ 0, 0); |
+ } |
+ } |
+ |
+ renderer_->DrawFrame(std::move(metadata), std::move(frame->render_passes)); |
+ |
+ // The next frame should start by assuming nothing has changed, and changes |
+ // are noted as they occur. |
+ // TODO(boliu): If we did a temporary software renderer frame, propogate the |
+ // damage forward to the next frame. |
+ for (size_t i = 0; i < frame->render_surface_layer_list->size(); i++) { |
+ auto* surface = (*frame->render_surface_layer_list)[i]->render_surface(); |
+ surface->damage_tracker()->DidDrawDamagedArea(); |
+ } |
+ active_tree_->ResetAllChangeTracking(); |
+ |
+ active_tree_->set_has_ever_been_drawn(true); |
+ devtools_instrumentation::DidDrawFrame(id_); |
+ benchmark_instrumentation::IssueImplThreadRenderingStatsEvent( |
+ rendering_stats_instrumentation_->impl_thread_rendering_stats()); |
+ rendering_stats_instrumentation_->AccumulateAndClearImplThreadStats(); |
+ return true; |
} |
void LayerTreeHostImpl::DidDrawAllLayers(const FrameData& frame) { |
@@ -1820,50 +1854,6 @@ void LayerTreeHostImpl::UpdateTreeResourcesForGpuRasterizationIfNeeded() { |
SetRequiresHighResToDraw(); |
} |
-bool LayerTreeHostImpl::SwapBuffers(const LayerTreeHostImpl::FrameData& frame) { |
- ResetRequiresHighResToDraw(); |
- |
- if (frame.has_no_damage) { |
- active_tree()->BreakSwapPromises(SwapPromise::SWAP_FAILS); |
- return false; |
- } |
- |
- CompositorFrameMetadata metadata = MakeCompositorFrameMetadata(); |
- metadata.may_contain_video = frame.may_contain_video; |
- active_tree()->FinishSwapPromises(&metadata); |
- for (auto& latency : metadata.latency_info) { |
- TRACE_EVENT_WITH_FLOW1("input,benchmark", "LatencyInfo.Flow", |
- TRACE_ID_DONT_MANGLE(latency.trace_id()), |
- TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, |
- "step", "SwapBuffers"); |
- // Only add the latency component once for renderer swap, not the browser |
- // swap. |
- if (!latency.FindLatency(ui::INPUT_EVENT_LATENCY_RENDERER_SWAP_COMPONENT, 0, |
- nullptr)) { |
- latency.AddLatencyNumber(ui::INPUT_EVENT_LATENCY_RENDERER_SWAP_COMPONENT, |
- 0, 0); |
- } |
- } |
- renderer_->SwapBuffers(std::move(metadata)); |
- |
- // The next frame should start by assuming nothing has changed, and changes |
- // are noted as they occur. |
- // TODO(boliu): If we did a temporary software renderer frame, propogate the |
- // damage forward to the next frame. |
- for (size_t i = 0; i < frame.render_surface_layer_list->size(); i++) { |
- auto* surface = (*frame.render_surface_layer_list)[i]->render_surface(); |
- surface->damage_tracker()->DidDrawDamagedArea(); |
- } |
- active_tree_->ResetAllChangeTracking(); |
- |
- active_tree_->set_has_ever_been_drawn(true); |
- devtools_instrumentation::DidDrawFrame(id_); |
- benchmark_instrumentation::IssueImplThreadRenderingStatsEvent( |
- rendering_stats_instrumentation_->impl_thread_rendering_stats()); |
- rendering_stats_instrumentation_->AccumulateAndClearImplThreadStats(); |
- return true; |
-} |
- |
void LayerTreeHostImpl::WillBeginImplFrame(const BeginFrameArgs& args) { |
current_begin_frame_tracker_.Start(args); |