blob: f1f0df84f9608133dae8a43da7b4fc0833e96d6c [file] [log] [blame]
/*
* 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;
// Generated by SurfaceFlinger's FrameTimeline (go/adaptive-scheduling-fr).
// Used in comparing the expected timeline of a frame to the actual timeline.
// Key terms:
// 1) DisplayFrame - represents SurfaceFlinger's work on a frame(composited)
// 2) SurfaceFrame - represents App's work on its frame
// 3) Timeline = start to end of a component's(app/SF) work on a frame.
// SurfaceFlinger composites frames from many apps together, so
// One DisplayFrame can map to N SurfaceFrame(s)
// This relationship can be reconstructed by using
// DisplayFrame.token = SurfaceFrame.display_frame_token
message FrameTimelineEvent {
// Specifies the reason(s) most likely to have caused the jank.
// Used as a bitmask.
enum 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;
};
// Specifies how a frame was presented on screen w.r.t. timing.
// Can be different for SurfaceFrame and DisplayFrame.
enum PresentType {
PRESENT_UNSPECIFIED = 0;
PRESENT_ON_TIME = 1;
PRESENT_LATE = 2;
PRESENT_EARLY = 3;
PRESENT_DROPPED = 4;
PRESENT_UNKNOWN = 5;
};
// Specifies if the predictions for the frame are still valid, expired or
// unknown.
enum PredictionType {
PREDICTION_UNSPECIFIED = 0;
PREDICTION_VALID = 1;
PREDICTION_EXPIRED = 2;
PREDICTION_UNKNOWN = 3;
};
// Indicates the start of expected timeline slice for SurfaceFrames.
message ExpectedSurfaceFrameStart {
// Cookie used to correlate between the start and end messages of the same
// frame. Since all values except the ts are same for start and end, cookie
// helps in preventing redundant data transmission.
// The same cookie is used only by start and end messages of a single frame
// and is otherwise unique.
optional int64 cookie = 1;
// Token received by the app for its work. Can be shared between multiple
// layers of the same app (example: pip mode).
optional int64 token = 2;
// The corresponding DisplayFrame token is required to link the App's work
// with SurfaceFlinger's work. Many SurfaceFrames can be mapped to a single
// DisplayFrame.
// this.display_frame_token = DisplayFrame.token
optional int64 display_frame_token = 3;
// Pid of the app. Used in creating the timeline tracks (and slices) inside
// the respective process track group.
optional int32 pid = 4;
optional string layer_name = 5;
};
// Indicates the start of actual timeline slice for SurfaceFrames. Also
// includes the jank information.
message ActualSurfaceFrameStart {
// Cookie used to correlate between the start and end messages of the same
// frame. Since all values except the ts are same for start and end, cookie
// helps in preventing redundant data transmission.
// The same cookie is used only by start and end messages of a single frame
// and is otherwise unique.
optional int64 cookie = 1;
// Token received by the app for its work. Can be shared between multiple
// layers of the same app (example: pip mode).
optional int64 token = 2;
// The corresponding DisplayFrame token is required to link the App's work
// with SurfaceFlinger's work. Many SurfaceFrames can be mapped to a single
// DisplayFrame.
// this.display_frame_token = DisplayFrame.token
optional int64 display_frame_token = 3;
// Pid of the app. Used in creating the timeline tracks (and slices) inside
// the respective process track group.
optional int32 pid = 4;
optional string layer_name = 5;
optional PresentType present_type = 6;
optional bool on_time_finish = 7;
optional bool gpu_composition = 8;
// A bitmask of JankType. More than one reason can be attributed to a janky
// frame.
optional int32 jank_type = 9;
optional PredictionType prediction_type = 10;
optional bool is_buffer = 11;
};
// Indicates the start of expected timeline slice for DisplayFrames.
message ExpectedDisplayFrameStart {
// Cookie used to correlate between the start and end messages of the same
// frame. Since all values except the ts are same for start and end, cookie
// helps in preventing redundant data transmission.
// The same cookie is used only by start and end messages of a single frame
// and is otherwise unique.
optional int64 cookie = 1;
// Token received by SurfaceFlinger for its work
// this.token = SurfaceFrame.display_frame_token
optional int64 token = 2;
// Pid of SurfaceFlinger. Used in creating the timeline tracks (and slices)
// inside the SurfaceFlinger process group.
optional int32 pid = 3;
};
// Indicates the start of actual timeline slice for DisplayFrames. Also
// includes the jank information.
message ActualDisplayFrameStart {
// Cookie used to correlate between the start and end messages of the same
// frame. Since all values except the ts are same for start and end, cookie
// helps in preventing redundant data transmission.
// The same cookie is used only by start and end messages of a single frame
// and is otherwise unique.
optional int64 cookie = 1;
// Token received by SurfaceFlinger for its work
// this.token = SurfaceFrame.display_frame_token
optional int64 token = 2;
// Pid of SurfaceFlinger. Used in creating the timeline tracks (and slices)
// inside the SurfaceFlinger process group.
optional int32 pid = 3;
optional PresentType present_type = 4;
optional bool on_time_finish = 5;
optional bool gpu_composition = 6;
// A bitmask of JankType. More than one reason can be attributed to a janky
// frame.
optional int32 jank_type = 7;
optional PredictionType prediction_type = 8;
};
// FrameEnd just sends the cookie to indicate that the corresponding
// <display/surface>frame slice's end.
message FrameEnd { optional int64 cookie = 1; };
oneof event {
ExpectedDisplayFrameStart expected_display_frame_start = 1;
ActualDisplayFrameStart actual_display_frame_start = 2;
ExpectedSurfaceFrameStart expected_surface_frame_start = 3;
ActualSurfaceFrameStart actual_surface_frame_start = 4;
FrameEnd frame_end = 5;
}
}