/*
 * Copyright (C) 2016 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 = "proto3";

package profiler.proto;
option java_package = "com.android.tools.profiler.proto";
option java_outer_classname = "GraphicsProfiler";

import "common.proto";

service GraphicsService {
  // Returns graphics data from the monitored Activity. This will return no data for
  // Activities that do not use a SurfaceView.
  rpc GetData(GraphicsDataRequest) returns (GraphicsDataResponse) {
  }

  // Starts collecting execution metrics of a running app's SurfaceView Activity, such
  // as frame stats. Does nothing if the app is already being monitored.
  rpc StartMonitoringGraphics(GraphicsStartRequest) returns (GraphicsStartResponse) {
  }

  // Stops monitoring a running app. Does nothing if the app is not being
  // monitored.
  rpc StopMonitoringGraphics(GraphicsStopRequest) returns (GraphicsStopResponse) {
  }
}

// Requests graphics data from the app's Activity, in the time range
// from |start_timestamp| (exclusive) to |end_timestamp| (inclusive), or
// mathematically written as in interval (start_timestamp, end_timestamp].
message GraphicsDataRequest {
  Session session = 1;
  int64 start_timestamp = 2;  // Use -2^63 if no data is too old to return.
  int64 end_timestamp = 3;  // Use 2^63 - 1 if no data is too recent to return.
}

// Response contains data on the frames rendered within the requested time.
message GraphicsDataResponse {
  repeated GraphicsData data = 1;
}

message GraphicsStartRequest {
  Session session = 1;
}

message GraphicsStartResponse {
  enum Status {
    UNSPECIFIED = 0;
    SUCCESS = 1;
    FAILURE = 2;
  }
  Status status = 1;
}

message GraphicsStopRequest {
  Session session = 1;
}

message GraphicsStopResponse {
  enum Status {
    UNSPECIFIED = 0;
    SUCCESS = 1;
    FAILURE = 2;
  }
  Status status = 1;
}

// Graphics data of a SurfaceView frame.
message GraphicsData {
  int64 end_timestamp = 1;
  FrameStats frame_stats = 2;
}

// Framestats of a SurfaceView frame.
message FrameStats {
  // The app draw timestamp in nanoseconds (when the app started to draw)
  int64 app_draw_timestamp = 1;
  // The vsync timestamp in nanoseconds immediately after SF submited the frame to the h/w
  int64 vsync_timestamp = 2;
  // The timestamp in nanoseconds immediately after SF submitted the frame to the h/w
  int64 set_timestamp = 3;
}
