#!/usr/bin/env python3
# Copyright (C) 2022 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.

from os import sys, path

import synth_common


class JankType:
  JANK_UNSPECIFIED = 0
  JANK_NONE = 1
  JANK_SF_SCHEDULING = 2
  JANK_PREDICTION_ERROR = 4
  JANK_DISPLAY_HAL = 8
  JANK_SF_CPU_DEADLINE_MISSED = 16
  JANK_SF_GPU_DEADLINE_MISSED = 32
  JANK_APP_DEADLINE_MISSED = 64
  JANK_BUFFER_STUFFING = 128
  JANK_UNKNOWN = 256
  JANK_SF_STUFFING = 512
  JANK_DROPPED = 1024


class PresentType:
  PRESENT_UNSPECIFIED = 0
  PRESENT_ON_TIME = 1
  PRESENT_LATE = 2
  PRESENT_EARLY = 3
  PRESENT_DROPPED = 4
  PRESENT_UNKNOWN = 5


class PredictionType:
  PREDICTION_UNSPECIFIED = 0
  PREDICTION_VALID = 1
  PREDICTION_EXPIRED = 2
  PREDICTION_UNKNOWN = 3


trace = synth_common.create_trace()

trace.add_packet(ts=5000000)
trace.add_process(1001, 0, "process1")
trace.add_process(1002, 0, "process2")
trace.add_process(1003, 0, "process3")
trace.add_process(1004, 0, "process4")

trace.add_actual_surface_frame_start_event(
    ts=21000000,
    cookie=6,
    token=100201,
    display_frame_token=100211,
    pid=1002,
    layer_name="Layer1",
    present_type=PresentType.PRESENT_ON_TIME,
    on_time_finish=1,
    gpu_composition=0,
    jank_type=JankType.JANK_NONE,
    prediction_type=PredictionType.PREDICTION_VALID)
trace.add_frame_end_event(ts=37000000, cookie=6)

trace.add_actual_surface_frame_start_event(
    ts=31000000,
    cookie=7,
    token=100202,
    display_frame_token=100212,
    pid=1002,
    layer_name="Layer1",
    present_type=PresentType.PRESENT_ON_TIME,
    on_time_finish=1,
    gpu_composition=0,
    jank_type=JankType.JANK_APP_DEADLINE_MISSED,
    prediction_type=PredictionType.PREDICTION_VALID)
trace.add_frame_end_event(ts=47000000, cookie=7)
trace.add_actual_surface_frame_start_event(
    ts=32000000,
    cookie=8,
    token=100202,
    display_frame_token=100212,
    pid=1002,
    layer_name="Layer1",
    present_type=PresentType.PRESENT_ON_TIME,
    on_time_finish=1,
    gpu_composition=0,
    jank_type=JankType.JANK_APP_DEADLINE_MISSED,
    prediction_type=PredictionType.PREDICTION_VALID)
trace.add_frame_end_event(ts=40000000, cookie=8)

# DisplayFrame with a janky SurfaceFrame
trace.add_actual_surface_frame_start_event(
    ts=41000000,
    cookie=10,
    token=100101,
    display_frame_token=100111,
    pid=1001,
    layer_name="Layer1",
    present_type=PresentType.PRESENT_LATE,
    on_time_finish=0,
    gpu_composition=0,
    jank_type=JankType.JANK_APP_DEADLINE_MISSED,
    prediction_type=PredictionType.PREDICTION_VALID)
trace.add_frame_end_event(ts=74000000, cookie=10)
trace.add_actual_surface_frame_start_event(
    ts=41000000,
    cookie=11,
    token=100102,
    display_frame_token=100112,
    pid=1001,
    layer_name="Layer1",
    present_type=PresentType.PRESENT_LATE,
    on_time_finish=0,
    gpu_composition=0,
    jank_type=JankType.JANK_APP_DEADLINE_MISSED | JankType.JANK_BUFFER_STUFFING,
    prediction_type=PredictionType.PREDICTION_VALID)
trace.add_frame_end_event(ts=75000000, cookie=11)

trace.add_actual_surface_frame_start_event(
    ts=81000000,
    cookie=15,
    token=100301,
    display_frame_token=100311,
    pid=1003,
    layer_name="Layer1",
    present_type=PresentType.PRESENT_LATE,
    on_time_finish=0,
    gpu_composition=0,
    jank_type=JankType.JANK_SF_CPU_DEADLINE_MISSED,
    prediction_type=PredictionType.PREDICTION_VALID)
trace.add_actual_surface_frame_start_event(
    ts=90000000,
    cookie=15,
    token=100302,
    display_frame_token=100312,
    pid=1003,
    layer_name="Layer1",
    present_type=PresentType.PRESENT_DROPPED,
    on_time_finish=0,
    gpu_composition=0,
    jank_type=JankType.JANK_DROPPED,
    prediction_type=PredictionType.PREDICTION_VALID)
trace.add_frame_end_event(ts=95000000, cookie=15)

trace.add_actual_surface_frame_start_event(
    ts=10000000,
    cookie=20,
    token=100402,
    display_frame_token=100412,
    pid=1004,
    layer_name="Layer1",
    present_type=PresentType.PRESENT_DROPPED,
    on_time_finish=0,
    gpu_composition=0,
    jank_type=JankType.JANK_SF_STUFFING,
    prediction_type=PredictionType.PREDICTION_VALID)
trace.add_frame_end_event(ts=12000000, cookie=20)

trace.add_actual_surface_frame_start_event(
    ts=12500000,
    cookie=25,
    token=100502,
    display_frame_token=100512,
    pid=1004,
    layer_name="Layer1",
    present_type=PresentType.PRESENT_DROPPED,
    on_time_finish=0,
    gpu_composition=0,
    jank_type=JankType.JANK_SF_SCHEDULING,
    prediction_type=PredictionType.PREDICTION_VALID)
trace.add_frame_end_event(ts=14000000, cookie=25)


trace.add_actual_surface_frame_start_event(
    ts=14500000,
    cookie=30,
    token=100602,
    display_frame_token=100612,
    pid=1004,
    layer_name="Layer1",
    present_type=PresentType.PRESENT_DROPPED,
    on_time_finish=0,
    gpu_composition=0,
    jank_type=JankType.JANK_SF_CPU_DEADLINE_MISSED,
    prediction_type=PredictionType.PREDICTION_VALID)
trace.add_frame_end_event(ts=15000000, cookie=30)


trace.add_actual_surface_frame_start_event(
    ts=15500000,
    cookie=35,
    token=100702,
    display_frame_token=100712,
    pid=1004,
    layer_name="Layer1",
    present_type=PresentType.PRESENT_DROPPED,
    on_time_finish=0,
    gpu_composition=0,
    jank_type=JankType.JANK_SF_GPU_DEADLINE_MISSED,
    prediction_type=PredictionType.PREDICTION_VALID)
trace.add_frame_end_event(ts=16000000, cookie=35)


trace.add_actual_surface_frame_start_event(
    ts=16500000,
    cookie=40,
    token=100802,
    display_frame_token=100812,
    pid=1004,
    layer_name="Layer1",
    present_type=PresentType.PRESENT_DROPPED,
    on_time_finish=0,
    gpu_composition=0,
    jank_type=JankType.JANK_SF_SCHEDULING | JankType.JANK_SF_STUFFING,
    prediction_type=PredictionType.PREDICTION_VALID)
trace.add_frame_end_event(ts=17000000, cookie=40)

sys.stdout.buffer.write(trace.trace.SerializeToString())
