//
// Copyright (c) 2015 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.
//

// formatutilsgl.h: Queries for GL image formats and their translations to native
// GL formats.

#ifndef LIBANGLE_RENDERER_GL_FORMATUTILSGL_H_
#define LIBANGLE_RENDERER_GL_FORMATUTILSGL_H_

#include <map>
#include <string>
#include <vector>

#include "angle_gl.h"
#include "libANGLE/Version.h"
#include "libANGLE/renderer/gl/FunctionsGL.h"
#include "libANGLE/renderer/gl/WorkaroundsGL.h"

namespace rx
{

namespace nativegl
{

struct SupportRequirement
{
    SupportRequirement();

    // Version that this format became supported without extensions
    gl::Version version;

    // Extensions that are required if the minimum version is not met
    std::vector<std::string> versionExtensions;

    // Extensions that are always required to support this format
    std::vector<std::string> requiredExtensions;
};

struct InternalFormat
{
    InternalFormat();

    SupportRequirement texture;
    SupportRequirement filter;
    SupportRequirement renderbuffer;
    SupportRequirement framebufferAttachment;
};
const InternalFormat &GetInternalFormatInfo(GLenum internalFormat, StandardGL standard);

struct TexImageFormat
{
    GLenum internalFormat;
    GLenum format;
    GLenum type;
};
TexImageFormat GetTexImageFormat(const FunctionsGL *functions,
                                 const WorkaroundsGL &workarounds,
                                 GLenum internalFormat,
                                 GLenum format,
                                 GLenum type);

struct TexSubImageFormat
{
    GLenum format;
    GLenum type;
};
TexSubImageFormat GetTexSubImageFormat(const FunctionsGL *functions,
                                       const WorkaroundsGL &workarounds,
                                       GLenum format,
                                       GLenum type);

struct CompressedTexImageFormat
{
    GLenum internalFormat;
};
CompressedTexImageFormat GetCompressedTexImageFormat(const FunctionsGL *functions,
                                                     const WorkaroundsGL &workarounds,
                                                     GLenum internalFormat);

struct CompressedTexSubImageFormat
{
    GLenum format;
};
CompressedTexSubImageFormat GetCompressedSubTexImageFormat(const FunctionsGL *functions,
                                                           const WorkaroundsGL &workarounds,
                                                           GLenum format);

struct CopyTexImageImageFormat
{
    GLenum internalFormat;
};
CopyTexImageImageFormat GetCopyTexImageImageFormat(const FunctionsGL *functions,
                                                   const WorkaroundsGL &workarounds,
                                                   GLenum internalFormat,
                                                   GLenum framebufferType);

struct TexStorageFormat
{
    GLenum internalFormat;
};
TexStorageFormat GetTexStorageFormat(const FunctionsGL *functions,
                                     const WorkaroundsGL &workarounds,
                                     GLenum internalFormat);

struct RenderbufferFormat
{
    GLenum internalFormat;
};
RenderbufferFormat GetRenderbufferFormat(const FunctionsGL *functions,
                                         const WorkaroundsGL &workarounds,
                                         GLenum internalFormat);

struct ReadPixelsFormat
{
    GLenum format;
    GLenum type;
};
ReadPixelsFormat GetReadPixelsFormat(const FunctionsGL *functions,
                                     const WorkaroundsGL &workarounds,
                                     GLenum format,
                                     GLenum type);
}

}

#endif // LIBANGLE_RENDERER_GL_FORMATUTILSGL_H_
