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

Unified Diff: cc/trees/layer_tree_host_impl.cc

Issue 2317953002: cc: Merge the DrawLayer()/DrawFrame() and SwapBuffers() methods. (Closed)
Patch Set: merge-draw-swap-2: rebase 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/trees/layer_tree_host_impl.h ('k') | cc/trees/layer_tree_host_impl_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
« no previous file with comments | « cc/trees/layer_tree_host_impl.h ('k') | cc/trees/layer_tree_host_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698