//
// Copyright 2016 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.
//
// Format:
//   A universal description of typed GPU storage. Across multiple
//   renderer back-ends, there are common formats and some distinct
//   permutations, this enum encapsulates them all. Formats apply to
//   textures, but could also apply to any typed data.

#ifndef LIBANGLE_RENDERER_FORMAT_H_
#define LIBANGLE_RENDERER_FORMAT_H_

#include "libANGLE/formatutils.h"
#include "libANGLE/renderer/renderer_utils.h"

namespace angle
{

struct Format final : angle::NonCopyable
{
    enum class ID;

    Format(ID id,
           GLenum glFormat,
           GLenum fboFormat,
           rx::MipGenerationFunction mipGen,
           rx::ColorReadFunction colorRead);

    static const Format &Get(ID id);

    ID id;

    // The closest matching GL internal format for the storage this format uses. Note that this
    // may be a different internal format than the one this ANGLE format is used for.
    GLenum glInternalFormat;

    // The format we should report to the GL layer when querying implementation formats from a FBO.
    // This might not be the same as the glInternalFormat, since some DXGI formats don't have
    // matching GL format enums, like BGRA4, BGR5A1 and B5G6R6.
    GLenum fboImplementationInternalFormat;

    rx::MipGenerationFunction mipGenerationFunction;
    rx::ColorReadFunction colorReadFunction;

    // A map from a gl::FormatType to a fast pixel copy function for this format.
    rx::FastCopyFunctionMap fastCopyFunctions;
};

}  // namespace angle

#include "libANGLE/renderer/Format_ID_autogen.inl"

#endif  // LIBANGLE_RENDERER_FORMAT_H_
