// 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.

syntax = "proto3";

package device;

import "github.com/gogo/protobuf/gogoproto/gogo.proto";

// js_path = "proto";

option (gogoproto.goproto_enum_prefix_all) = false;

// Architecture is used to represent the set of known processor architectures.
enum Architecture {
    UnknownArchitecture = 0;
    ARMv7a = 1;
    ARMv8a = 2;
    X86 = 3;
    X86_64 = 4;
    MIPS = 5;
    MIPS64 = 6;
}

// Endian represents a byte ordering specification for multi-yte values.
enum Endian {
    UnknownEndian = 0;
    BigEndian = 1;
    LittleEndian = 2;
}

// OSKind is an enumerator of operating systems.
enum OSKind {
    UnknownOS = 0;
    Windows = 1;
    OSX = 2;
    Linux = 3;
    Android = 4;
}

// MemoryLayout holds information about how memory is fundamentally laid out for a device.
message MemoryLayout {
	// PointerAlignment is the alignment in bytes of a pointer type.
	int32 PointerAlignment = 1;
	// PointerSize is the size in bytes of a pointer type.
	int32 PointerSize = 2;
	// IntegerSize is the size in bytes of a int or unsigned int.
	int32 IntegerSize = 3;
	// SizeSize is the size in bytes of a size_t.
	int32 SizeSize = 4;
	// U64Alignment is the alignment of 64-bit values in a struct.
	int32 U64Alignment = 6;
	// Endian is the natural byte ordering of the memory layout.
	Endian Endian = 5;
}

// ABI represents an application binary interface specification.
// A device supports a set of ABI's, and an application has an abi it is compiled for.
message ABI {
	// Name is the human understandable name for the abi.
	string Name = 1;
	// OS is the type of OS this abi is targetted at, which normally controls things like calling convention.
	OSKind OS = 2;
	// Architecture is the processor type for the abi, controlling the instruction and feature set available.
	Architecture Architecture = 3;
	// MemoryLayout specifies things like size and alignment of types used directly buy the ABI.
	MemoryLayout MemoryLayout = 4 [(gogoproto.nullable) = false];
}

message OS {
	 // The kind of the operating system.
	OSKind Kind = 1;
	// The name of the operating system.
	string Name = 2;
	// The OS build description.
	string Build = 3;
	// The major version of the OS.
	int32 Major = 4;
	// The minor version of the OS.
	int32 Minor = 5;
	// The point version of the OS.
	int32 Point = 6;
}

// CPU represents a specific instance of a Architecture.
message CPU {
	// Name is the product name of this CPU.
	string Name = 1;
	// Architecture is the architecture that this CPU implements.
	Architecture Architecture = 2;
}

// GPU represents a specific graphics processing unit product.
message GPU {
	// Name is the product name of the GPU.
	string Name = 1;
}

// Chipset represents knowledge about a standard computer chipset.
message Chipset {
	// Name is the product name of this chipset.
	string Name = 1;
	// Cores is the set of CPU cores included in this chipset.
	repeated CPU Cores = 2 [(gogoproto.nullable) = false];
	// GPU is the graphics processing unit that is part of this chipset.
	GPU GPU = 3 [(gogoproto.nullable) = false];
}

// Hardware describes the physical configuration of a computing device.
message Hardware {
	// The product name for this hardware.
	string Name = 1;
	// The chipset used for this hardware.
	Chipset Chipset = 2 [(gogoproto.nullable) = false];
}

// Configuration describes a combination of hardware and software to make up a device.
// A configuration can have many instances, all of which should have similar behavioural characteristics.
message Configuration {
    // The OS the device is running
    OS OS = 1 [(gogoproto.nullable) = false];
    // The hardware description of this device
    Hardware Hardware = 2 [(gogoproto.nullable) = false];
    // The abi's the device supports
    repeated ABI ABIs = 3 [(gogoproto.nullable) = false];
	// The graphics drivers supported by the device.
	GraphicsDrivers GraphicsDrivers = 4 [(gogoproto.nullable) = false];
}

// Information represents an instance of a specific computer Configuration.
// An instance is persistable, and can be used to retain information about offline devices, and reconnect to them.
message Information {
    // The unique identifier of the device, if present.
	string Serial = 1;
    // The friendly name of this device, if present.
	string Name = 2;
    // How to connect to the device. The scheme controls the connection mechanism.
	string Address = 3;
    // The hardware and software configuration of the device.
	Configuration Configuration = 4 [(gogoproto.nullable) = false];
}

// GraphicsDrivers describes the graphics drivers available on a device.
message GraphicsDrivers {
	// The OpenGL or OpenGL ES driver support.
	OpenGLDriver OpenGL = 1;
	// The Vulkan driver support.
	VulkanDriver Vulkan = 2;
}

// OpenGLDriver describes the device driver support for the OpenGL or OpenGL ES
// APIs.
message OpenGLDriver {
	// Supported extensions. e.g. "GL_KHR_debug", "GL_EXT_sRGB [...]".
	repeated string Extensions = 1;
	// Driver name. e.g. "Adreno (TM) 320".
	string Renderer = 2;
	// Driver vendor name. e.g. "Qualcomm".
	string Vendor = 3;
	// Renderer version. e.g. "OpenGL ES 3.0 V@53.0 AU@  (CL@)".
	string Version = 4;
	// Value returned by glGetIntegerv(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT)
	uint32 UniformBufferAlignment = 5;
}

// VulkanDriver describes the device driver support for the Vulkan API.
message VulkanDriver {
	// Supported extensions.
	repeated string Extensions = 1;
	// Driver name. e.g. "Adreno (TM) 320".
	string Renderer = 2;
	// Driver vendor name. e.g. "Qualcomm".
	string Vendor = 3;
	// Renderer version. e.g. "OpenGL ES 3.0 V@53.0 AU@  (CL@)".
	string Version = 4;
}
