Commit 307d8f43 authored by Fady Samuel's avatar Fady Samuel Committed by Commit Bot

Add GraphicsPipeline Metics to DirectLayerTreeFrameSink

In a prior CL, GraphicsPipeline Metrics were added to AsyncLayerTreeFrameSink
but the browser process does not use that when OOP-D is off. This CL adds
those metrics to DirectLayerTreeFrameSink in order to allow us to do comparisons
in Finch trial.

Bug: 881262
Cq-Include-Trybots: luci.chromium.try:android_optional_gpu_tests_rel
Change-Id: I8d3a7c41603d1b84e8d72ef530189b7864361c40
Reviewed-on: https://chromium-review.googlesource.com/1227141Reviewed-by: default avatarSadrul Chowdhury <sadrul@chromium.org>
Commit-Queue: Fady Samuel <fsamuel@chromium.org>
Cr-Commit-Position: refs/heads/master@{#591499}
parent af75f37e
......@@ -177,6 +177,7 @@ viz_component("service") {
allow_circular_includes_from = [ ":gpu_service_dependencies" ]
deps = [
"//cc/base",
"//cc/paint",
"//components/crash/core/common:crash_key",
"//components/viz/common",
......
......@@ -9,6 +9,7 @@
#include "base/bind.h"
#include "base/compiler_specific.h"
#include "build/build_config.h"
#include "cc/base/histograms.h"
#include "cc/trees/layer_tree_frame_sink_client.h"
#include "components/viz/common/hit_test/hit_test_region_list.h"
#include "components/viz/common/quads/compositor_frame.h"
......@@ -23,6 +24,30 @@
namespace viz {
DirectLayerTreeFrameSink::PipelineReporting::PipelineReporting(
const BeginFrameArgs args,
base::TimeTicks now)
: trace_id_(args.trace_id), frame_time_(now) {}
DirectLayerTreeFrameSink::PipelineReporting::~PipelineReporting() = default;
void DirectLayerTreeFrameSink::PipelineReporting::Report() {
TRACE_EVENT_WITH_FLOW1("viz,benchmark", "Graphics.Pipeline",
TRACE_ID_GLOBAL(trace_id_),
TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT,
"step", "SubmitCompositorFrame");
// Note that client_name is constant during the lifetime of the process and
// it's either "Browser" or "Renderer".
UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES(
base::StringPrintf(
"GraphicsPipeline.%s.SubmitCompositorFrameAfterBeginFrame",
cc::GetClientNameForMetrics()),
base::TimeTicks::Now() - frame_time_,
base::TimeDelta::FromMicroseconds(1),
base::TimeDelta::FromMilliseconds(200), 50);
}
DirectLayerTreeFrameSink::DirectLayerTreeFrameSink(
const FrameSinkId& frame_sink_id,
CompositorFrameSinkSupportManager* support_manager,
......@@ -145,6 +170,15 @@ void DirectLayerTreeFrameSink::SubmitCompositorFrame(CompositorFrame frame) {
DCHECK_LE(BeginFrameArgs::kStartingFrameNumber,
frame.metadata.begin_frame_ack.sequence_number);
// It's possible to request an immediate composite from cc which will bypass
// BeginFrame. In that case, we cannot collect full graphics pipeline data.
auto it = pipeline_reporting_frame_times_.find(
frame.metadata.begin_frame_ack.trace_id);
if (it != pipeline_reporting_frame_times_.end()) {
it->second.Report();
pipeline_reporting_frame_times_.erase(it);
}
if (frame.size_in_pixels() != last_swap_frame_size_ ||
frame.device_scale_factor() != device_scale_factor_) {
parent_local_surface_id_allocator_.GenerateId();
......@@ -164,7 +198,14 @@ void DirectLayerTreeFrameSink::SubmitCompositorFrame(CompositorFrame frame) {
void DirectLayerTreeFrameSink::DidNotProduceFrame(const BeginFrameAck& ack) {
DCHECK(!ack.has_damage);
DCHECK_LE(BeginFrameArgs::kStartingFrameNumber, ack.sequence_number);
support_->DidNotProduceFrame(ack);
// TODO(yiyix): Remove duplicated calls of DidNotProduceFrame from the same
// BeginFrames. https://crbug.com/881949
auto it = pipeline_reporting_frame_times_.find(ack.trace_id);
if (it != pipeline_reporting_frame_times_.end()) {
support_->DidNotProduceFrame(ack);
pipeline_reporting_frame_times_.erase(it);
}
}
void DirectLayerTreeFrameSink::DidAllocateSharedBitmap(
......@@ -245,6 +286,27 @@ void DirectLayerTreeFrameSink::DidPresentCompositorFrame(
}
void DirectLayerTreeFrameSink::OnBeginFrame(const BeginFrameArgs& args) {
DCHECK_LE(pipeline_reporting_frame_times_.size(), 25u);
// Note that client_name is constant during the lifetime of the process and
// it's either "Browser" or "Renderer".
const char* client_name = cc::GetClientNameForMetrics();
if (client_name && args.trace_id != -1) {
base::TimeTicks current_time = base::TimeTicks::Now();
PipelineReporting report(args, current_time);
pipeline_reporting_frame_times_.emplace(args.trace_id, report);
// Missed BeginFrames use the frame time of the last received BeginFrame
// which is bogus from a reporting perspective if nothing has been updating
// on screen for a while.
if (args.type != BeginFrameArgs::MISSED) {
base::TimeDelta frame_difference = current_time - args.frame_time;
UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES(
base::StringPrintf("GraphicsPipeline.%s.ReceivedBeginFrame",
client_name),
frame_difference, base::TimeDelta::FromMicroseconds(1),
base::TimeDelta::FromMilliseconds(100), 50);
}
}
begin_frame_source_->OnBeginFrame(args);
}
......
......@@ -30,6 +30,26 @@ class VIZ_SERVICE_EXPORT DirectLayerTreeFrameSink
public ExternalBeginFrameSourceClient,
public DisplayClient {
public:
// This class is used to handle the graphics pipeline related metrics
// reporting.
class PipelineReporting {
public:
PipelineReporting(BeginFrameArgs args, base::TimeTicks now);
~PipelineReporting();
void Report();
int64_t trace_id() const { return trace_id_; }
private:
// The trace id of a BeginFrame which is used to track its progress on the
// client side.
int64_t trace_id_;
// The time stamp for the begin frame to arrive on client side.
base::TimeTicks frame_time_;
};
// The underlying Display, FrameSinkManagerImpl, and LocalSurfaceIdAllocator
// must outlive this class.
DirectLayerTreeFrameSink(
......@@ -103,6 +123,8 @@ class VIZ_SERVICE_EXPORT DirectLayerTreeFrameSink
float device_scale_factor_ = 1.f;
bool is_lost_ = false;
std::unique_ptr<ExternalBeginFrameSource> begin_frame_source_;
// Use this map to record the time when client received the BeginFrameArgs.
base::flat_map<int64_t, PipelineReporting> pipeline_reporting_frame_times_;
base::WeakPtrFactory<DirectLayerTreeFrameSink> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(DirectLayerTreeFrameSink);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment