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

#include "common/PackedEGLEnums_autogen.h"
#include "common/debug.h"

namespace egl
{

template <>
CompositorTiming FromEGLenum<CompositorTiming>(EGLenum from)
{
    switch (from)
    {
        case EGL_COMPOSITE_DEADLINE_ANDROID:
            return CompositorTiming::CompositeDeadline;
        case EGL_COMPOSITE_INTERVAL_ANDROID:
            return CompositorTiming::CompositInterval;
        case EGL_COMPOSITE_TO_PRESENT_LATENCY_ANDROID:
            return CompositorTiming::CompositToPresentLatency;
        default:
            return CompositorTiming::InvalidEnum;
    }
}

EGLenum ToEGLenum(CompositorTiming from)
{
    switch (from)
    {
        case CompositorTiming::CompositeDeadline:
            return EGL_COMPOSITE_DEADLINE_ANDROID;
        case CompositorTiming::CompositInterval:
            return EGL_COMPOSITE_INTERVAL_ANDROID;
        case CompositorTiming::CompositToPresentLatency:
            return EGL_COMPOSITE_TO_PRESENT_LATENCY_ANDROID;
        default:
            UNREACHABLE();
            return 0;
    }
}

std::ostream &operator<<(std::ostream &os, CompositorTiming value)
{
    switch (value)
    {
        case CompositorTiming::CompositeDeadline:
            os << "EGL_COMPOSITE_DEADLINE_ANDROID";
            break;
        case CompositorTiming::CompositInterval:
            os << "EGL_COMPOSITE_INTERVAL_ANDROID";
            break;
        case CompositorTiming::CompositToPresentLatency:
            os << "EGL_COMPOSITE_TO_PRESENT_LATENCY_ANDROID";
            break;
        default:
            os << "GL_INVALID_ENUM";
            break;
    }
    return os;
}

template <>
ContextPriority FromEGLenum<ContextPriority>(EGLenum from)
{
    switch (from)
    {
        case EGL_CONTEXT_PRIORITY_LOW_IMG:
            return ContextPriority::Low;
        case EGL_CONTEXT_PRIORITY_MEDIUM_IMG:
            return ContextPriority::Medium;
        case EGL_CONTEXT_PRIORITY_HIGH_IMG:
            return ContextPriority::High;
        default:
            return ContextPriority::InvalidEnum;
    }
}

EGLenum ToEGLenum(ContextPriority from)
{
    switch (from)
    {
        case ContextPriority::Low:
            return EGL_CONTEXT_PRIORITY_LOW_IMG;
        case ContextPriority::Medium:
            return EGL_CONTEXT_PRIORITY_MEDIUM_IMG;
        case ContextPriority::High:
            return EGL_CONTEXT_PRIORITY_HIGH_IMG;
        default:
            UNREACHABLE();
            return 0;
    }
}

std::ostream &operator<<(std::ostream &os, ContextPriority value)
{
    switch (value)
    {
        case ContextPriority::Low:
            os << "EGL_CONTEXT_PRIORITY_LOW_IMG";
            break;
        case ContextPriority::Medium:
            os << "EGL_CONTEXT_PRIORITY_MEDIUM_IMG";
            break;
        case ContextPriority::High:
            os << "EGL_CONTEXT_PRIORITY_HIGH_IMG";
            break;
        default:
            os << "GL_INVALID_ENUM";
            break;
    }
    return os;
}

template <>
MessageType FromEGLenum<MessageType>(EGLenum from)
{
    switch (from)
    {
        case EGL_DEBUG_MSG_CRITICAL_KHR:
            return MessageType::Critical;
        case EGL_DEBUG_MSG_ERROR_KHR:
            return MessageType::Error;
        case EGL_DEBUG_MSG_WARN_KHR:
            return MessageType::Warn;
        case EGL_DEBUG_MSG_INFO_KHR:
            return MessageType::Info;
        default:
            return MessageType::InvalidEnum;
    }
}

EGLenum ToEGLenum(MessageType from)
{
    switch (from)
    {
        case MessageType::Critical:
            return EGL_DEBUG_MSG_CRITICAL_KHR;
        case MessageType::Error:
            return EGL_DEBUG_MSG_ERROR_KHR;
        case MessageType::Warn:
            return EGL_DEBUG_MSG_WARN_KHR;
        case MessageType::Info:
            return EGL_DEBUG_MSG_INFO_KHR;
        default:
            UNREACHABLE();
            return 0;
    }
}

std::ostream &operator<<(std::ostream &os, MessageType value)
{
    switch (value)
    {
        case MessageType::Critical:
            os << "EGL_DEBUG_MSG_CRITICAL_KHR";
            break;
        case MessageType::Error:
            os << "EGL_DEBUG_MSG_ERROR_KHR";
            break;
        case MessageType::Warn:
            os << "EGL_DEBUG_MSG_WARN_KHR";
            break;
        case MessageType::Info:
            os << "EGL_DEBUG_MSG_INFO_KHR";
            break;
        default:
            os << "GL_INVALID_ENUM";
            break;
    }
    return os;
}

template <>
ObjectType FromEGLenum<ObjectType>(EGLenum from)
{
    switch (from)
    {
        case EGL_OBJECT_THREAD_KHR:
            return ObjectType::Thread;
        case EGL_OBJECT_DISPLAY_KHR:
            return ObjectType::Display;
        case EGL_OBJECT_CONTEXT_KHR:
            return ObjectType::Context;
        case EGL_OBJECT_SURFACE_KHR:
            return ObjectType::Surface;
        case EGL_OBJECT_IMAGE_KHR:
            return ObjectType::Image;
        case EGL_OBJECT_SYNC_KHR:
            return ObjectType::Sync;
        case EGL_OBJECT_STREAM_KHR:
            return ObjectType::Stream;
        default:
            return ObjectType::InvalidEnum;
    }
}

EGLenum ToEGLenum(ObjectType from)
{
    switch (from)
    {
        case ObjectType::Thread:
            return EGL_OBJECT_THREAD_KHR;
        case ObjectType::Display:
            return EGL_OBJECT_DISPLAY_KHR;
        case ObjectType::Context:
            return EGL_OBJECT_CONTEXT_KHR;
        case ObjectType::Surface:
            return EGL_OBJECT_SURFACE_KHR;
        case ObjectType::Image:
            return EGL_OBJECT_IMAGE_KHR;
        case ObjectType::Sync:
            return EGL_OBJECT_SYNC_KHR;
        case ObjectType::Stream:
            return EGL_OBJECT_STREAM_KHR;
        default:
            UNREACHABLE();
            return 0;
    }
}

std::ostream &operator<<(std::ostream &os, ObjectType value)
{
    switch (value)
    {
        case ObjectType::Thread:
            os << "EGL_OBJECT_THREAD_KHR";
            break;
        case ObjectType::Display:
            os << "EGL_OBJECT_DISPLAY_KHR";
            break;
        case ObjectType::Context:
            os << "EGL_OBJECT_CONTEXT_KHR";
            break;
        case ObjectType::Surface:
            os << "EGL_OBJECT_SURFACE_KHR";
            break;
        case ObjectType::Image:
            os << "EGL_OBJECT_IMAGE_KHR";
            break;
        case ObjectType::Sync:
            os << "EGL_OBJECT_SYNC_KHR";
            break;
        case ObjectType::Stream:
            os << "EGL_OBJECT_STREAM_KHR";
            break;
        default:
            os << "GL_INVALID_ENUM";
            break;
    }
    return os;
}

template <>
TextureFormat FromEGLenum<TextureFormat>(EGLenum from)
{
    switch (from)
    {
        case EGL_NO_TEXTURE:
            return TextureFormat::NoTexture;
        case EGL_TEXTURE_RGB:
            return TextureFormat::RGB;
        case EGL_TEXTURE_RGBA:
            return TextureFormat::RGBA;
        default:
            return TextureFormat::InvalidEnum;
    }
}

EGLenum ToEGLenum(TextureFormat from)
{
    switch (from)
    {
        case TextureFormat::NoTexture:
            return EGL_NO_TEXTURE;
        case TextureFormat::RGB:
            return EGL_TEXTURE_RGB;
        case TextureFormat::RGBA:
            return EGL_TEXTURE_RGBA;
        default:
            UNREACHABLE();
            return 0;
    }
}

std::ostream &operator<<(std::ostream &os, TextureFormat value)
{
    switch (value)
    {
        case TextureFormat::NoTexture:
            os << "EGL_NO_TEXTURE";
            break;
        case TextureFormat::RGB:
            os << "EGL_TEXTURE_RGB";
            break;
        case TextureFormat::RGBA:
            os << "EGL_TEXTURE_RGBA";
            break;
        default:
            os << "GL_INVALID_ENUM";
            break;
    }
    return os;
}

template <>
Timestamp FromEGLenum<Timestamp>(EGLenum from)
{
    switch (from)
    {
        case EGL_REQUESTED_PRESENT_TIME_ANDROID:
            return Timestamp::RequestedPresentTime;
        case EGL_RENDERING_COMPLETE_TIME_ANDROID:
            return Timestamp::RenderingCompleteTime;
        case EGL_COMPOSITION_LATCH_TIME_ANDROID:
            return Timestamp::CompositionLatchTime;
        case EGL_FIRST_COMPOSITION_START_TIME_ANDROID:
            return Timestamp::FirstCompositionStartTime;
        case EGL_LAST_COMPOSITION_START_TIME_ANDROID:
            return Timestamp::LastCompositionStartTime;
        case EGL_FIRST_COMPOSITION_GPU_FINISHED_TIME_ANDROID:
            return Timestamp::FirstCompositionGPUFinishedTime;
        case EGL_DISPLAY_PRESENT_TIME_ANDROID:
            return Timestamp::DisplayPresentTime;
        case EGL_DEQUEUE_READY_TIME_ANDROID:
            return Timestamp::DequeueReadyTime;
        case EGL_READS_DONE_TIME_ANDROID:
            return Timestamp::ReadsDoneTime;
        default:
            return Timestamp::InvalidEnum;
    }
}

EGLenum ToEGLenum(Timestamp from)
{
    switch (from)
    {
        case Timestamp::RequestedPresentTime:
            return EGL_REQUESTED_PRESENT_TIME_ANDROID;
        case Timestamp::RenderingCompleteTime:
            return EGL_RENDERING_COMPLETE_TIME_ANDROID;
        case Timestamp::CompositionLatchTime:
            return EGL_COMPOSITION_LATCH_TIME_ANDROID;
        case Timestamp::FirstCompositionStartTime:
            return EGL_FIRST_COMPOSITION_START_TIME_ANDROID;
        case Timestamp::LastCompositionStartTime:
            return EGL_LAST_COMPOSITION_START_TIME_ANDROID;
        case Timestamp::FirstCompositionGPUFinishedTime:
            return EGL_FIRST_COMPOSITION_GPU_FINISHED_TIME_ANDROID;
        case Timestamp::DisplayPresentTime:
            return EGL_DISPLAY_PRESENT_TIME_ANDROID;
        case Timestamp::DequeueReadyTime:
            return EGL_DEQUEUE_READY_TIME_ANDROID;
        case Timestamp::ReadsDoneTime:
            return EGL_READS_DONE_TIME_ANDROID;
        default:
            UNREACHABLE();
            return 0;
    }
}

std::ostream &operator<<(std::ostream &os, Timestamp value)
{
    switch (value)
    {
        case Timestamp::RequestedPresentTime:
            os << "EGL_REQUESTED_PRESENT_TIME_ANDROID";
            break;
        case Timestamp::RenderingCompleteTime:
            os << "EGL_RENDERING_COMPLETE_TIME_ANDROID";
            break;
        case Timestamp::CompositionLatchTime:
            os << "EGL_COMPOSITION_LATCH_TIME_ANDROID";
            break;
        case Timestamp::FirstCompositionStartTime:
            os << "EGL_FIRST_COMPOSITION_START_TIME_ANDROID";
            break;
        case Timestamp::LastCompositionStartTime:
            os << "EGL_LAST_COMPOSITION_START_TIME_ANDROID";
            break;
        case Timestamp::FirstCompositionGPUFinishedTime:
            os << "EGL_FIRST_COMPOSITION_GPU_FINISHED_TIME_ANDROID";
            break;
        case Timestamp::DisplayPresentTime:
            os << "EGL_DISPLAY_PRESENT_TIME_ANDROID";
            break;
        case Timestamp::DequeueReadyTime:
            os << "EGL_DEQUEUE_READY_TIME_ANDROID";
            break;
        case Timestamp::ReadsDoneTime:
            os << "EGL_READS_DONE_TIME_ANDROID";
            break;
        default:
            os << "GL_INVALID_ENUM";
            break;
    }
    return os;
}

}  // namespace egl
