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

// TODO: Currently, most of the types are simply typedefs of uint64_t, so
// misusing one type as another won't be caught by the compiler. Should we wrap
// each type in a unique class to have stronger type guarantees?
// TODO: is there an enum for intrinsics?

package android.hardware.renderscript@1.0;

// OpaqueHandle is an object that is used entirely in the driver but still needs
// to be identified by the framework.
typedef uint64_t OpaqueHandle;

// A pointer is an actual local pointer that can be accessed by both the
// framework and the driver. This is possible because RenderScript is always
// running in Passthrough mode.
typedef pointer Ptr;

// This is an abstraction of size_t because it is not supported in HIDL.
typedef uint64_t Size;

// In RenderScript code, these are all defined as void*, but act only as
// handles.
typedef OpaqueHandle Allocation;
typedef OpaqueHandle AllocationAdapter;
typedef OpaqueHandle Closure;
typedef OpaqueHandle Element;
typedef OpaqueHandle NativeWindow;
typedef OpaqueHandle ObjectBase;
typedef OpaqueHandle Sampler;
typedef OpaqueHandle Script;
typedef OpaqueHandle ScriptFieldID;
typedef OpaqueHandle ScriptGroup;
typedef OpaqueHandle ScriptGroup2;
typedef OpaqueHandle ScriptInvokeID;
typedef OpaqueHandle ScriptKernelID;
typedef OpaqueHandle Type;

// types below are same as those in frameworks/rs/rsDefines.h

@export(name="RsContextType", value_prefix="RS_CONTEXT_TYPE_")
enum ContextType : int32_t {
    NORMAL,
    DEBUG,
    PROFILE,
};

@export(name="RsAllocationUsageType", value_prefix="RS_ALLOCATION_USAGE_")
enum AllocationUsageType : int32_t {
    SCRIPT                 = 0x0001,
    GRAPHICS_TEXTURE       = 0x0002,
    GRAPHICS_VERTEX        = 0x0004,
    GRAPHICS_CONSTANTS     = 0x0008,
    GRAPHICS_RENDER_TARGET = 0x0010,
    IO_INPUT               = 0x0020,
    IO_OUTPUT              = 0x0040,
    SHARED                 = 0x0080,
    OEM                    = 0x8000,
    ALL                    = 0x80FF,
};

@export(name="RsAllocationMipmapControl", value_prefix="RS_ALLOCATION_MIPMAP_")
enum AllocationMipmapControl : int32_t {
    NONE               = 0,
    FULL               = 1,
    ON_SYNC_TO_TEXTURE = 2,
};

@export(name="RsAllocationCubemapFace",
        value_prefix="RS_ALLOCATION_CUBEMAP_FACE_")
enum AllocationCubemapFace : int32_t {
    POSITIVE_X = 0,
    NEGATIVE_X = 1,
    POSITIVE_Y = 2,
    NEGATIVE_Y = 3,
    POSITIVE_Z = 4,
    NEGATIVE_Z = 5,
};

@export(name="RsDataType", value_prefix="RS_TYPE_")
enum DataType : int32_t {
    NONE = 0,
    FLOAT_16,
    FLOAT_32,
    FLOAT_64,
    SIGNED_8,
    SIGNED_16,
    SIGNED_32,
    SIGNED_64,
    UNSIGNED_8,
    UNSIGNED_16,
    UNSIGNED_32,
    UNSIGNED_64,
    BOOLEAN,
    UNSIGNED_5_6_5,
    UNSIGNED_5_5_5_1,
    UNSIGNED_4_4_4_4,
    MATRIX_4X4,
    MATRIX_3X3,
    MATRIX_2X2,
    ELEMENT = 1000,
    TYPE,
    ALLOCATION,
    SAMPLER,
    SCRIPT,
    MESH,
    PROGRAM_FRAGMENT,
    PROGRAM_VERTEX,
    PROGRAM_RASTER,
    PROGRAM_STORE,
    FONT,
    INVALID = 10000,
};

@export(name="RsDataKind", value_prefix="RS_KIND_")
enum DataKind : int32_t {
    USER,
    PIXEL_L = 7,
    PIXEL_A,
    PIXEL_LA,
    PIXEL_RGB,
    PIXEL_RGBA,
    PIXEL_DEPTH,
    PIXEL_YUV,
    INVALID = 100,
};

@export(name="RsYuvFormat", value_prefix="RS_")
enum YuvFormat : int32_t {
    YUV_NONE    = 0,
    YUV_YV12    = 0x32315659, // HAL_PIXEL_FORMAT_YV12 in system/graphics.h
    YUV_NV21    = 0x11,       // HAL_PIXEL_FORMAT_YCrCb_420_SP
    YUV_420_888 = 0x23,       // HAL_PIXEL_FORMAT_YCbCr_420_888
};

@export(name="RsSamplerValue", value_prefix="RS_SAMPLER_")
enum SamplerValue : int32_t {
    NEAREST,
    LINEAR,
    LINEAR_MIP_LINEAR,
    WRAP,
    CLAMP,
    LINEAR_MIP_NEAREST,
    MIRRORED_REPEAT,
    INVALID = 100,
};

@export(name="RsForEachStrategy", value_prefix="RS_FOR_EACH_STRATEGY_")
enum ForEachStrategy : int32_t {
    SERIAL      = 0,
    DONT_CARE   = 1,
    DST_LINEAR  = 2,
    TILE_SMALL  = 3,
    TILE_MEDIUM = 4,
    TILE_LARGE  = 5,
};

// Script to Script
struct ScriptCall {
    ForEachStrategy strategy;
    uint32_t        xStart;
    uint32_t        xEnd;
    uint32_t        yStart;
    uint32_t        yEnd;
    uint32_t        zStart;
    uint32_t        zEnd;
    uint32_t        arrayStart;
    uint32_t        arrayEnd;
    uint32_t        array2Start;
    uint32_t        array2End;
    uint32_t        array3Start;
    uint32_t        array3End;
    uint32_t        array4Start;
    uint32_t        array4End;
};

@export(name="RsContextFlags", value_prefix="RS_CONTEXT_")
enum ContextFlags : int32_t {
    SYNCHRONOUS     = 1<<0,
    LOW_LATENCY     = 1<<1,
    LOW_POWER       = 1<<2,
    WAIT_FOR_ATTACH = 1<<3,
};

// types below are same as those in frameworks/rs/rsInternalDefines.h

@export(name="RsMessageToClientType", value_prefix="RS_MESSAGE_TO_CLIENT_")
enum MessageToClientType : int32_t {
    NONE       = 0,
    EXCEPTION  = 1,
    RESIZE     = 2,
    ERROR      = 3,
    USER       = 4,
    NEW_BUFFER = 5,
};

@export(name="RsScriptIntrinsicID", value_prefix="RS_SCRIPT_INTRINSIC_")
enum ScriptIntrinsicID : int32_t {
    ID_UNDEFINED    = 0,
    ID_CONVOLVE_3X3 = 1,
    ID_COLOR_MATRIX = 2,
    ID_LUT          = 3,
    ID_CONVOLVE_5X5 = 4,
    ID_BLUR         = 5,
    ID_YUV_TO_RGB   = 6,
    ID_BLEND        = 7,
    ID_3DLUT        = 8,
    ID_HISTOGRAM    = 9,
    // unused 10, 11
    ID_RESIZE       = 12,
    ID_BLAS         = 13,
    ID_EXTBLAS      = 14,
    ID_OEM_START    = 0x10000000,
};

@export(name="RsThreadPriorities", value_prefix="RS_THREAD_PRIORITY_")
enum ThreadPriorities : int32_t {
    LOW             = 15,
    NORMAL_GRAPHICS = -8,
    NORMAL          = -1,
    LOW_LATENCY     = -4,
};

// types below are same as those in
// frameworks/compile/libbcc/include/bcinfo/MetadataExtractor.h

@export(name="", value_prefix="RS_MD_")
enum MetadataSignatureBitval : int32_t {
    SIG_None        = 0,
    SIG_In          = 1<<0,
    SIG_Out         = 1<<1,
    SIG_Usr         = 1<<2,
    SIG_X           = 1<<3,
    SIG_Y           = 1<<4,
    SIG_Kernel      = 1<<5,
    SIG_Z           = 1<<6,
    SIG_Ctxt        = 1<<7,
};
