// Copyright (C) 2015 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.

@handle type string ApiId
@handle type string AtomStreamId
@handle type string BinaryId
@handle type string CaptureId
@handle type string DeviceId
@handle type string HierarchyId
@handle type string ImageInfoId
@handle type string MemoryInfoId
@handle type string SchemaId
@handle type string TimingInfoId

// Import imports capture data emitted by the graphics spy, returning the new
// capture identifier.
cmd CaptureId Import(string name, u8[] Data) { return ? }

// GetCaptures returns the full list of capture identifiers avaliable on the
// server.
cmd CaptureId[] GetCaptures() { return ? }

// GetDevices returns the full list of replay devices avaliable to the server.
// These include local replay devices and any connected Android devices.
// This list may change over time, as devices are connected and disconnected.
cmd DeviceId[] GetDevices() { return ? }

// GetState returns an identifier to a binary blob containing the graphics state
// immediately following the atom after.
// The binary blob can be fetched with a call to ResolveBinary, and decoded
// using the capture's schema.
cmd BinaryId GetState(CaptureId capture, u64 after)
{ return ? }

// GetHierarchy returns the atom hierarchy identifier for the given capture.
// Currently there is only one hierarchy per capture, but this is likely to
// change in the future.
cmd HierarchyId GetHierarchy(CaptureId capture)
{ return ? }

// GetMemoryInfo returns the MemoryInfo identifier describing the memory state
// for the given capture and range, immediately following the atom
// after.
cmd MemoryInfoId GetMemoryInfo(CaptureId capture, u64 after, MemoryRange rng)
{ return ? }

// GetFramebufferColor returns the ImageInfo identifier describing the bound
// color buffer for the given device, capture and graphics API immediately
// following the atom after. The provided RenderSettings structure can be used
// to adjust maximum desired dimensions of the image, as well as applying debug
// visualizations.
cmd ImageInfoId GetFramebufferColor(DeviceId       device,
                                    CaptureId      capture,
                                    ApiId          api,
                                    u64            after,
                                    RenderSettings settings)
{ return ? }

// GetFramebufferDepth returns the ImageInfo identifier describing the bound
// depth buffer for the given device, capture and graphics API immediately
// following the atom after.
cmd ImageInfoId GetFramebufferDepth(DeviceId  device,
                                    CaptureId capture,
                                    ApiId     api,
                                    u64       after)
{ return ? }

// GetTimingInfo performs timings of the given capture on the given device,
// returning an identifier to the results.
// This function is experimental and will change signature.
cmd TimingInfoId GetTimingInfo(DeviceId   device,
                               CaptureId  capture,
                               TimingMask mask)
{ return ? }

// PrerenderFramebuffers renders the framebuffer contents after each of the
// given atoms of interest in the given capture on the given device for the
// given graphics API, resized to fit within the given dimensions while keeping
// the respective framebuffers original aspect ratio. This function doesn't
// return any data, as it is used to pre-populate the cache of framebuffer
// thumbnails that later get queried by the client. This function is
// experimental and may change signature.
cmd BinaryId PrerenderFramebuffers(DeviceId   device,
                                   CaptureId  capture,
                                   ApiId      api,
                                   u32        width,
                                   u32        height,
                                   u64[]      atomIds)
{ return ? }

// ReplaceAtom creates and new capture based on an existing capture, but with
// a single atom replaced.
cmd CaptureId ReplaceAtom(CaptureId capture,
                          u64       atomId,
                          u16       atomType,
                          Binary    data)
{ return ? }

cmd AtomStream         ResolveAtomStream(AtomStreamId id) { return ? }
cmd Binary             ResolveBinary(BinaryId id) { return ? }
cmd Capture            ResolveCapture(CaptureId id) { return ? }
cmd Device             ResolveDevice(DeviceId id) { return ? }
cmd Hierarchy          ResolveHierarchy(HierarchyId id) { return ? }
cmd ImageInfo          ResolveImageInfo(ImageInfoId id) { return ? }
cmd MemoryInfo         ResolveMemoryInfo(MemoryInfoId id) { return ? }
cmd Schema             ResolveSchema(SchemaId id) { return ? }
cmd TimingInfo         ResolveTimingInfo(TimingInfoId id) { return ? }

// Device describes replay target avaliable to the server.
class Device {
  string Name             // The name of the device. i.e. "Bob's phone"
  string Model            // The model of the device. i.e. "Nexus 5"
  string OS               // The operating system of the device. i.e. "Android 5.0"
  u8     PointerSize      // Size in bytes of a pointer on the device's architecture.
  u8     PointerAlignment // Alignment in bytes of a pointer on the device's architecture.
  u64    MaxMemorySize    // The total amount of contiguous memory pre-allocated for replay.
  bool   RequiresShaderPatching // HACK. Will be removed.
}

// Capture describes single capture file held by the server.
class Capture {
  string              Name     // Name given to the capture. i.e. "KittyWorld"
  AtomStreamId        Atoms    // The identifier to the stream of atoms in this capture.
  ApiId[]             Apis     // List of graphics APIs used by this capture.
  SchemaId            Schema   // The schema used to decode types in this capture.
}

// Binary holds a blob of data.
class Binary {
  u8[] Data
}

// AtomStream holds a stream of atoms in binary form. The atoms can be unpacked
// using the capture's schema.
class AtomStream {
  u8[] Data // Encoded atom stream.
}

// Hierarchy holds the root to an AtomGroup hierarchy.
class Hierarchy {
  AtomGroup Root
}

// AtomGroup represents a named, contiguous span of atoms with support for
// sparse sub-groups. AtomGroups are used for expressing nested hierarchies of
// atoms formed from frame boundaries, draw call boundaries and user markers.
class AtomGroup {
  string            Name      // Name of this group.
  AtomRange         Range     // The span of atoms this group covers.
  AtomGroup[]       SubGroups // The list of sub-groups within this group.
}

// AtomRange describes a span of atoms in an AtomStream.
class AtomRange {
  u64 First // The index of the first atom in the range.
  u64 Count // The number of atoms in the range.
}

// MemoryInfo describes the state of a range of memory at a specific point in
// the atom stream. This structure is likely to change in the future.
class MemoryInfo {
  u8[]           Data    // The memory values for the span.
  MemoryRange[]  Stale   // The data ranges that have been observed but not current.
  MemoryRange[]  Current // The data ranges that were written to just before the observation.
  MemoryRange[]  Unknown // The data ranges that have never been observed.
}

// MemoryRange describes a range of memory.
class MemoryRange {
  u64 Base // The pointer to the first byte in the memory range.
  u64 Size // The size in bytes of the memory range.
}

// ImageInfo describes an image, such as a texture or framebuffer at a specific
// point in the atom stream.
class ImageInfo {
  ImageFormat Format // The format of the image.
  u32         Width  // The width of the image in pixels.
  u32         Height // The height of the image in pixels.
  BinaryId    Data   // The pixel data of the image.
}

// The enumerator of image formats. Will expand.
enum ImageFormat {
  RGBA8   = 0,
  Float32 = 1,
}

// TimingMask is a bitfield describing what should be timed.
// This is experimental and will change in the near future.
bitfield TimingMask {
  TimingPerCommand  = 0x1, // Time individual commands.
  TimingPerDrawCall = 0x2, // Time each draw call.
  TimingPerFrame    = 0x4, // Time each frame.
}

// TimingInfo holds the results of a resolved GetTimingInfo request.
// This is experimental and will change in the near future.
class TimingInfo {
  AtomTimer[]      PerCommand  // The timing results of each command.
  AtomRangeTimer[] PerDrawCall // The timing results of each draw call.
  AtomRangeTimer[] PerFrame    // The timing results of each frame.
}

// AtomTimer holds the timing information for a single atom.
// This is experimental and will change in the near future.
class AtomTimer {
  u64 AtomId      // The atom that was timed.
  u64 Nanoseconds // The time taken for that atom.
}

// AtomRangeTimer holds the timing information for a range of contiguous atoms.
// This is experimental and will change in the near future.
class AtomRangeTimer {
  u64 FromAtomId  // The first atom in the range that was timed.
  u64 ToAtomId    // The last atom in the range that was timed.
  u64 Nanoseconds // The time taken for all atoms in the range.
}

// RenderSettings contains settings and flags to be used in replaying and
// returning a bound render target's color buffer.
class RenderSettings {
  u32  MaxWidth  // The desired maximum width of the image. The returned image may be larger than this.
  u32  MaxHeight // The desired minimum height of the image. The returned image may be larger than this.
  bool Wireframe // True if the all geometry should be rendered as wireframe.
}

// The Schema describes all the array, map, enum, struct, class, atom and state
// types stored within the AtomStream and state. Clients use the Schema to know
// how to interpret these types.
class Schema {
  AtomInfo[]  Atoms // The schema description of all atoms in all APIs.
  ApiSchema[] Apis  // The per-API schema descriptions.
}

// ApiSchema describes the schema used by a single graphics API.
class ApiSchema {
  ApiId      Api   // The API identifier.
  StructInfo State // The state layout.
}

// TypeKind is the exhaustive list of all types supported by the schema.
enum TypeKind {
  // Primative types
  Bool               =  0,
  S8                 =  1,
  U8                 =  2,
  S16                =  3,
  U16                =  4,
  S32                =  5,
  U32                =  6,
  F32                =  7,
  S64                =  8,
  U64                =  9,
  F64                = 10,
  String             = 11,
  Enum               = 12,
  // Complex types
  Struct             = 14,
  Class              = 15,
  Array              = 16,
  StaticArray        = 17,
  Map                = 18,
  Pointer            = 19,
  Memory             = 20, // Currently unimplemented.
  Any                = 21, // Will be removed.
  ID                 = 22,
}

// TypeInfo is the base of all schema defined types.
@Interface class TypeInfo {
  string   Name // The name of the type.
  TypeKind Kind // The kind of the type.
}

// ArrayInfo describes an array instantiation.
class ArrayInfo : TypeInfo {
  TypeInfo* ElementType // The array's element type.
}

// StaticArrayInfo describes a static array instantiation.
class StaticArrayInfo : TypeInfo {
  TypeInfo*  ElementType // The array's element type.
  u32        Size        // The array's size.
}

// MapInfo describes a map instantiation.
class MapInfo : TypeInfo {
  TypeInfo* KeyType   // The map's key type.
  TypeInfo* ValueType // The map's value type.
}

// EnumInfo describes an enum type.
class EnumInfo : TypeInfo {
  EnumEntry[]  Entries // The list of enum entries.
  EnumInfo*[]  Extends // The list of enums this enum extends from. Will be removed.
}

// EnumEntry describes a single name-value entry in an enum.
class EnumEntry {
  string Name  // The name of the enum entry.
  u32    Value // The value of the enum entry. May be extended to u64.
}

// StructInfo describes the body of a single struct type.
class StructInfo : TypeInfo {
  FieldInfo*[] Fields // The list of fields in the struct.
}

// ClassInfo describes the body of a single class type.
class ClassInfo : TypeInfo {
  FieldInfo*[] Fields  // The list of fields in the class.
  ClassInfo*[] Extends // The list of classes this enum classes from. Likely to be removed.
}

// FieldInfo describes a single field entry in a class or struct.
class FieldInfo {
  string    Name // The name of the field.
  TypeInfo* Type // The type of the field.
}

// AtomInfo describes a single Atom type.
class AtomInfo {
  ApiId                 Api               // The graphics API that this Atom belongs to.
  u16                   Type              // The atom's unique type identifier.
  string                Name              // The name of the atom.
  ParameterInfo[]       Parameters        // The list of atom parameters.
  bool                  IsCommand         // True if the atom represents an API command.
  bool                  IsDrawCall        // True if the atom represents a draw call.
  bool                  IsEndOfFrame      // True if the atom represents the end of a frame.
  string                DocumentationUrl  // The URL to the atom's documentation.
}

// ParameterInfo describes a single Atom parameter.
class ParameterInfo {
  string        Name // Name of the parameter.
  TypeInfo*     Type // Type of the parameter.
  bool          Out  // True if the parameter is an output.
}

// SimpleInfo is used for all primative types.
class SimpleInfo : TypeInfo {}
