/*
 * 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
@export(name="RsScriptCall")
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,
};
