// GENERATED FILE - DO NOT EDIT.
// Generated by gen_packed_gl_enums.py using data from packed_cl_enums.json.
//
// Copyright 2017 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// PackedCLEnums_autogen.h:
//   Declares ANGLE-specific enums classes for CLenums and functions operating
//   on them.

#ifndef COMMON_PACKEDCLENUMS_AUTOGEN_H_
#define COMMON_PACKEDCLENUMS_AUTOGEN_H_

#include <angle_cl.h>
typedef cl_uint CLenum;

#include <cstdint>
#include <ostream>

namespace cl
{

template <typename Enum>
Enum FromCLenum(CLenum from);

enum class AddressingMode : uint8_t
{
    None           = 0,
    ClampToEdge    = 1,
    Clamp          = 2,
    Repeat         = 3,
    MirroredRepeat = 4,

    InvalidEnum = 5,
    EnumCount   = 5,
};

template <>
AddressingMode FromCLenum<AddressingMode>(CLenum from);
CLenum ToCLenum(AddressingMode from);
std::ostream &operator<<(std::ostream &os, AddressingMode value);

enum class CommandQueueInfo : uint8_t
{
    Context         = 0,
    Device          = 1,
    ReferenceCount  = 2,
    Properties      = 3,
    Size            = 4,
    DeviceDefault   = 5,
    PropertiesArray = 6,

    InvalidEnum = 7,
    EnumCount   = 7,
};

template <>
CommandQueueInfo FromCLenum<CommandQueueInfo>(CLenum from);
CLenum ToCLenum(CommandQueueInfo from);
std::ostream &operator<<(std::ostream &os, CommandQueueInfo value);

enum class ContextInfo : uint8_t
{
    ReferenceCount = 0,
    Devices        = 1,
    Properties     = 2,
    NumDevices     = 3,

    InvalidEnum = 4,
    EnumCount   = 4,
};

template <>
ContextInfo FromCLenum<ContextInfo>(CLenum from);
CLenum ToCLenum(ContextInfo from);
std::ostream &operator<<(std::ostream &os, ContextInfo value);

enum class DeviceInfo : uint8_t
{
    Type                                = 0,
    VendorID                            = 1,
    MaxComputeUnits                     = 2,
    MaxWorkItemDimensions               = 3,
    MaxWorkGroupSize                    = 4,
    MaxWorkItemSizes                    = 5,
    PreferredVectorWidthChar            = 6,
    PreferredVectorWidthShort           = 7,
    PreferredVectorWidthInt             = 8,
    PreferredVectorWidthLong            = 9,
    PreferredVectorWidthFloat           = 10,
    PreferredVectorWidthDouble          = 11,
    MaxClockFrequency                   = 12,
    AddressBits                         = 13,
    MaxReadImageArgs                    = 14,
    MaxWriteImageArgs                   = 15,
    MaxMemAllocSize                     = 16,
    Image2D_MaxWidth                    = 17,
    Image2D_MaxHeight                   = 18,
    Image3D_MaxWidth                    = 19,
    Image3D_MaxHeight                   = 20,
    Image3D_MaxDepth                    = 21,
    ImageSupport                        = 22,
    MaxParameterSize                    = 23,
    MaxSamplers                         = 24,
    MemBaseAddrAlign                    = 25,
    MinDataTypeAlignSize                = 26,
    SingleFpConfig                      = 27,
    GlobalMemCacheType                  = 28,
    GlobalMemCachelineSize              = 29,
    GlobalMemCacheSize                  = 30,
    GlobalMemSize                       = 31,
    MaxConstantBufferSize               = 32,
    MaxConstantArgs                     = 33,
    LocalMemType                        = 34,
    LocalMemSize                        = 35,
    ErrorCorrectionSupport              = 36,
    ProfilingTimerResolution            = 37,
    EndianLittle                        = 38,
    Available                           = 39,
    CompilerAvailable                   = 40,
    ExecutionCapabilities               = 41,
    QueueOnHostProperties               = 42,
    Name                                = 43,
    Vendor                              = 44,
    DriverVersion                       = 45,
    Profile                             = 46,
    Version                             = 47,
    Extensions                          = 48,
    Platform                            = 49,
    DoubleFpConfig                      = 50,
    HalfFpConfig                        = 51,
    PreferredVectorWidthHalf            = 52,
    HostUnifiedMemory                   = 53,
    NativeVectorWidthChar               = 54,
    NativeVectorWidthShort              = 55,
    NativeVectorWidthInt                = 56,
    NativeVectorWidthLong               = 57,
    NativeVectorWidthFloat              = 58,
    NativeVectorWidthDouble             = 59,
    NativeVectorWidthHalf               = 60,
    OpenCL_C_Version                    = 61,
    LinkerAvailable                     = 62,
    BuiltInKernels                      = 63,
    ImageMaxBufferSize                  = 64,
    ImageMaxArraySize                   = 65,
    ParentDevice                        = 66,
    PartitionMaxSubDevices              = 67,
    PartitionProperties                 = 68,
    PartitionAffinityDomain             = 69,
    PartitionType                       = 70,
    ReferenceCount                      = 71,
    PreferredInteropUserSync            = 72,
    PrintfBufferSize                    = 73,
    ImagePitchAlignment                 = 74,
    ImageBaseAddressAlignment           = 75,
    MaxReadWriteImageArgs               = 76,
    MaxGlobalVariableSize               = 77,
    QueueOnDeviceProperties             = 78,
    QueueOnDevicePreferredSize          = 79,
    QueueOnDeviceMaxSize                = 80,
    MaxOnDeviceQueues                   = 81,
    MaxOnDeviceEvents                   = 82,
    SVM_Capabilities                    = 83,
    GlobalVariablePreferredTotalSize    = 84,
    MaxPipeArgs                         = 85,
    PipeMaxActiveReservations           = 86,
    PipeMaxPacketSize                   = 87,
    PreferredPlatformAtomicAlignment    = 88,
    PreferredGlobalAtomicAlignment      = 89,
    PreferredLocalAtomicAlignment       = 90,
    IL_Version                          = 91,
    MaxNumSubGroups                     = 92,
    SubGroupIndependentForwardProgress  = 93,
    NumericVersion                      = 94,
    ExtensionsWithVersion               = 95,
    ILsWithVersion                      = 96,
    BuiltInKernelsWithVersion           = 97,
    AtomicMemoryCapabilities            = 98,
    AtomicFenceCapabilities             = 99,
    NonUniformWorkGroupSupport          = 100,
    OpenCL_C_AllVersions                = 101,
    PreferredWorkGroupSizeMultiple      = 102,
    WorkGroupCollectiveFunctionsSupport = 103,
    GenericAddressSpaceSupport          = 104,
    OpenCL_C_Features                   = 105,
    DeviceEnqueueCapabilities           = 106,
    PipeSupport                         = 107,
    LatestConformanceVersionPassed      = 108,

    InvalidEnum = 109,
    EnumCount   = 109,
};

template <>
DeviceInfo FromCLenum<DeviceInfo>(CLenum from);
CLenum ToCLenum(DeviceInfo from);
std::ostream &operator<<(std::ostream &os, DeviceInfo value);

enum class EventInfo : uint8_t
{
    CommandQueue           = 0,
    CommandType            = 1,
    ReferenceCount         = 2,
    CommandExecutionStatus = 3,
    Context                = 4,

    InvalidEnum = 5,
    EnumCount   = 5,
};

template <>
EventInfo FromCLenum<EventInfo>(CLenum from);
CLenum ToCLenum(EventInfo from);
std::ostream &operator<<(std::ostream &os, EventInfo value);

enum class FilterMode : uint8_t
{
    Nearest = 0,
    Linear  = 1,

    InvalidEnum = 2,
    EnumCount   = 2,
};

template <>
FilterMode FromCLenum<FilterMode>(CLenum from);
CLenum ToCLenum(FilterMode from);
std::ostream &operator<<(std::ostream &os, FilterMode value);

enum class ImageInfo : uint8_t
{
    Format       = 0,
    ElementSize  = 1,
    RowPitch     = 2,
    SlicePitch   = 3,
    Width        = 4,
    Height       = 5,
    Depth        = 6,
    ArraySize    = 7,
    Buffer       = 8,
    NumMipLevels = 9,
    NumSamples   = 10,

    InvalidEnum = 11,
    EnumCount   = 11,
};

template <>
ImageInfo FromCLenum<ImageInfo>(CLenum from);
CLenum ToCLenum(ImageInfo from);
std::ostream &operator<<(std::ostream &os, ImageInfo value);

enum class KernelArgInfo : uint8_t
{
    AddressQualifier = 0,
    AccessQualifier  = 1,
    TypeName         = 2,
    TypeQualifier    = 3,
    Name             = 4,

    InvalidEnum = 5,
    EnumCount   = 5,
};

template <>
KernelArgInfo FromCLenum<KernelArgInfo>(CLenum from);
CLenum ToCLenum(KernelArgInfo from);
std::ostream &operator<<(std::ostream &os, KernelArgInfo value);

enum class KernelExecInfo : uint8_t
{
    SVM_Ptrs            = 0,
    SVM_FineGrainSystem = 1,

    InvalidEnum = 2,
    EnumCount   = 2,
};

template <>
KernelExecInfo FromCLenum<KernelExecInfo>(CLenum from);
CLenum ToCLenum(KernelExecInfo from);
std::ostream &operator<<(std::ostream &os, KernelExecInfo value);

enum class KernelInfo : uint8_t
{
    FunctionName   = 0,
    NumArgs        = 1,
    ReferenceCount = 2,
    Context        = 3,
    Program        = 4,
    Attributes     = 5,

    InvalidEnum = 6,
    EnumCount   = 6,
};

template <>
KernelInfo FromCLenum<KernelInfo>(CLenum from);
CLenum ToCLenum(KernelInfo from);
std::ostream &operator<<(std::ostream &os, KernelInfo value);

enum class KernelSubGroupInfo : uint8_t
{
    MaxSubGroupSizeForNdrange = 0,
    SubGroupCountForNdrange   = 1,
    LocalSizeForSubGroupCount = 2,
    MaxNumSubGroups           = 3,
    CompileNumSubGroups       = 4,

    InvalidEnum = 5,
    EnumCount   = 5,
};

template <>
KernelSubGroupInfo FromCLenum<KernelSubGroupInfo>(CLenum from);
CLenum ToCLenum(KernelSubGroupInfo from);
std::ostream &operator<<(std::ostream &os, KernelSubGroupInfo value);

enum class KernelWorkGroupInfo : uint8_t
{
    WorkGroupSize                  = 0,
    CompileWorkGroupSize           = 1,
    LocalMemSize                   = 2,
    PreferredWorkGroupSizeMultiple = 3,
    PrivateMemSize                 = 4,
    GlobalWorkSize                 = 5,

    InvalidEnum = 6,
    EnumCount   = 6,
};

template <>
KernelWorkGroupInfo FromCLenum<KernelWorkGroupInfo>(CLenum from);
CLenum ToCLenum(KernelWorkGroupInfo from);
std::ostream &operator<<(std::ostream &os, KernelWorkGroupInfo value);

enum class MemInfo : uint8_t
{
    Type                = 0,
    Flags               = 1,
    Size                = 2,
    HostPtr             = 3,
    MapCount            = 4,
    ReferenceCount      = 5,
    Context             = 6,
    AssociatedMemObject = 7,
    Offset              = 8,
    UsesSVM_Pointer     = 9,
    Properties          = 10,

    InvalidEnum = 11,
    EnumCount   = 11,
};

template <>
MemInfo FromCLenum<MemInfo>(CLenum from);
CLenum ToCLenum(MemInfo from);
std::ostream &operator<<(std::ostream &os, MemInfo value);

enum class MemObjectType : uint8_t
{
    Buffer         = 0,
    Image2D        = 1,
    Image3D        = 2,
    Image2D_Array  = 3,
    Image1D        = 4,
    Image1D_Array  = 5,
    Image1D_Buffer = 6,
    Pipe           = 7,

    InvalidEnum = 8,
    EnumCount   = 8,
};

template <>
MemObjectType FromCLenum<MemObjectType>(CLenum from);
CLenum ToCLenum(MemObjectType from);
std::ostream &operator<<(std::ostream &os, MemObjectType value);

enum class PipeInfo : uint8_t
{
    PacketSize = 0,
    MaxPackets = 1,
    Properties = 2,

    InvalidEnum = 3,
    EnumCount   = 3,
};

template <>
PipeInfo FromCLenum<PipeInfo>(CLenum from);
CLenum ToCLenum(PipeInfo from);
std::ostream &operator<<(std::ostream &os, PipeInfo value);

enum class PlatformInfo : uint8_t
{
    Profile               = 0,
    Version               = 1,
    Name                  = 2,
    Vendor                = 3,
    Extensions            = 4,
    HostTimerResolution   = 5,
    NumericVersion        = 6,
    ExtensionsWithVersion = 7,
    IcdSuffix             = 8,

    InvalidEnum = 9,
    EnumCount   = 9,
};

template <>
PlatformInfo FromCLenum<PlatformInfo>(CLenum from);
CLenum ToCLenum(PlatformInfo from);
std::ostream &operator<<(std::ostream &os, PlatformInfo value);

enum class ProfilingInfo : uint8_t
{
    CommandQueued   = 0,
    CommandSubmit   = 1,
    CommandStart    = 2,
    CommandEnd      = 3,
    CommandComplete = 4,

    InvalidEnum = 5,
    EnumCount   = 5,
};

template <>
ProfilingInfo FromCLenum<ProfilingInfo>(CLenum from);
CLenum ToCLenum(ProfilingInfo from);
std::ostream &operator<<(std::ostream &os, ProfilingInfo value);

enum class ProgramBuildInfo : uint8_t
{
    Status                  = 0,
    Options                 = 1,
    Log                     = 2,
    BinaryType              = 3,
    GlobalVariableTotalSize = 4,

    InvalidEnum = 5,
    EnumCount   = 5,
};

template <>
ProgramBuildInfo FromCLenum<ProgramBuildInfo>(CLenum from);
CLenum ToCLenum(ProgramBuildInfo from);
std::ostream &operator<<(std::ostream &os, ProgramBuildInfo value);

enum class ProgramInfo : uint8_t
{
    ReferenceCount          = 0,
    Context                 = 1,
    NumDevices              = 2,
    Devices                 = 3,
    Source                  = 4,
    BinarySizes             = 5,
    Binaries                = 6,
    NumKernels              = 7,
    KernelNames             = 8,
    IL                      = 9,
    ScopeGlobalCtorsPresent = 10,
    ScopeGlobalDtorsPresent = 11,

    InvalidEnum = 12,
    EnumCount   = 12,
};

template <>
ProgramInfo FromCLenum<ProgramInfo>(CLenum from);
CLenum ToCLenum(ProgramInfo from);
std::ostream &operator<<(std::ostream &os, ProgramInfo value);

enum class SamplerInfo : uint8_t
{
    ReferenceCount   = 0,
    Context          = 1,
    NormalizedCoords = 2,
    AddressingMode   = 3,
    FilterMode       = 4,
    Properties       = 5,

    InvalidEnum = 6,
    EnumCount   = 6,
};

template <>
SamplerInfo FromCLenum<SamplerInfo>(CLenum from);
CLenum ToCLenum(SamplerInfo from);
std::ostream &operator<<(std::ostream &os, SamplerInfo value);

}  // namespace cl

#endif  // COMMON_PACKEDCLENUMS_AUTOGEN_H_
