// GENERATED FILE - DO NOT EDIT.
// Generated by gen_packed_gl_enums.py using data from packed_egl_enums.json.
//
// Copyright 2019 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.
//
// PackedEGLEnums_autogen.h:
//   Declares ANGLE-specific enums classes for EGLenums and functions operating
//   on them.

#ifndef COMMON_PACKEDEGLENUMS_AUTOGEN_H_
#define COMMON_PACKEDEGLENUMS_AUTOGEN_H_

#include <EGL/egl.h>
#include <EGL/eglext.h>
#include <angle_gl.h>

#include <cstdint>
#include <ostream>

namespace egl
{

template <typename Enum>
Enum FromEGLenum(EGLenum from);

enum class CompositorTiming : uint8_t
{
    CompositeDeadline        = 0,
    CompositInterval         = 1,
    CompositToPresentLatency = 2,

    InvalidEnum = 3,
    EnumCount   = 3,
};

template <>
CompositorTiming FromEGLenum<CompositorTiming>(EGLenum from);
EGLenum ToEGLenum(CompositorTiming from);
std::ostream &operator<<(std::ostream &os, CompositorTiming value);

enum class MessageType : uint8_t
{
    Critical = 0,
    Error    = 1,
    Warn     = 2,
    Info     = 3,

    InvalidEnum = 4,
    EnumCount   = 4,
};

template <>
MessageType FromEGLenum<MessageType>(EGLenum from);
EGLenum ToEGLenum(MessageType from);
std::ostream &operator<<(std::ostream &os, MessageType value);

enum class ObjectType : uint8_t
{
    Thread  = 0,
    Display = 1,
    Context = 2,
    Surface = 3,
    Image   = 4,
    Sync    = 5,
    Stream  = 6,

    InvalidEnum = 7,
    EnumCount   = 7,
};

template <>
ObjectType FromEGLenum<ObjectType>(EGLenum from);
EGLenum ToEGLenum(ObjectType from);
std::ostream &operator<<(std::ostream &os, ObjectType value);

enum class TextureFormat : uint8_t
{
    NoTexture = 0,
    RGB       = 1,
    RGBA      = 2,

    InvalidEnum = 3,
    EnumCount   = 3,
};

template <>
TextureFormat FromEGLenum<TextureFormat>(EGLenum from);
EGLenum ToEGLenum(TextureFormat from);
std::ostream &operator<<(std::ostream &os, TextureFormat value);

enum class Timestamp : uint8_t
{
    RequestedPresentTime            = 0,
    RenderingCompleteTime           = 1,
    CompositionLatchTime            = 2,
    FirstCompositionStartTime       = 3,
    LastCompositionStartTime        = 4,
    FirstCompositionGPUFinishedTime = 5,
    DisplayPresentTime              = 6,
    DequeueReadyTime                = 7,
    ReadsDoneTime                   = 8,

    InvalidEnum = 9,
    EnumCount   = 9,
};

template <>
Timestamp FromEGLenum<Timestamp>(EGLenum from);
EGLenum ToEGLenum(Timestamp from);
std::ostream &operator<<(std::ostream &os, Timestamp value);

}  // namespace egl

#endif  // COMMON_PACKEDEGLENUMS_AUTOGEN_H_
