/*
 * Copyright (C) 2020 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

syntax = "proto2";

package perfetto.protos;

message AndroidDisplayMetrics {
  // Stat that reports the number of duplicate frames submitted
  // to the display for rendering. That is frames that have the same
  // pixels values but where still submitted. It is tracked based on
  // comparing the MISR of the current frame vs previous frame.
  optional uint32 total_duplicate_frames = 1;

  // Stat reports whether there is any duplicate_frames tracked
  optional uint32 duplicate_frames_logged = 2;

  // Stat that reports the number of dpu underrrun occurs count.
  optional uint32 total_dpu_underrun_count = 3;


  message RefreshRateStat {
    // The refresh rate value (the number of frames per second)
    optional uint32 refresh_rate_fps = 1;

    // Calculate the number of refresh rate switches to this fps
    optional uint32 count = 2;

    // Calculate the total duration of refresh rate stays at this fps
    optional double total_dur_ms = 3;

    // Calculate the average duration of refresh rate stays at this fps
    optional double avg_dur_ms = 4;
  }

  // Calculate the total number of refresh rate changes
  optional uint32 refresh_rate_switches = 4;

  // The statistics for each refresh rate value
  repeated RefreshRateStat refresh_rate_stats = 5;

  // Stats to measure the runtime of updating the power state in
  // DisplayPowerController
  message UpdatePowerState {
    optional uint32 avg_runtime_micro_secs = 2;

    // Removed: avg_runtime_ms
    reserved 1;
  }

  optional UpdatePowerState update_power_state = 6;
}
