blob: 2ea12026232afb980643ddacda7a8f94d4f26af0 [file] [log] [blame]
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_EXO_FRAME_TIMING_HISTORY_H_
#define COMPONENTS_EXO_FRAME_TIMING_HISTORY_H_
#include <map>
#include "base/containers/small_map.h"
#include "base/time/time.h"
#include "cc/base/rolling_time_delta_history.h"
#include "components/viz/common/frame_sinks/begin_frame_args.h"
namespace exo {
// Records timing history of compositor frames and reports related metrics. Used
// by LayerTreeFrameSinkHolder to determine when to respond to BeginFrames.
class FrameTimingHistory {
public:
FrameTimingHistory();
FrameTimingHistory(const FrameTimingHistory&) = delete;
FrameTimingHistory& operator=(const FrameTimingHistory&) = delete;
~FrameTimingHistory();
// Estimates the duration from LayerTreeFrameSinkHolder submitting a frame to
// the remote side receiving it.
base::TimeDelta GetFrameTransferDurationEstimate() const;
// Notifies that a frame is submitted to the remote side.
void FrameSubmitted(const viz::BeginFrameId& begin_frame_id,
uint32_t frame_token);
// Notifies that a BeginFrame is responded with DidNotProduceFrame.
void FrameDidNotProduce(const viz::BeginFrameId& begin_frame_id);
// Notifies that a frame is received at the remote side.
void FrameReceivedAtRemoteSide(uint32_t frame_token,
base::TimeTicks received_time);
// The number of DidNotProduceFrame responses since the last time when a frame
// is submitted.
int32_t consecutive_did_not_produce_count() const {
return consecutive_did_not_produce_count_;
}
private:
base::small_map<std::map<uint32_t, base::TimeTicks>> pending_submitted_time_;
cc::RollingTimeDeltaHistory frame_transfer_duration_history_;
int32_t consecutive_did_not_produce_count_ = 0;
};
} // namespace exo
#endif // COMPONENTS_EXO_FRAME_TIMING_HISTORY_H_