// GENERATED FILE - DO NOT EDIT.
// Generated by gen_load_functions_table.py using data from load_functions_data.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.
//
// load_functions_table:
//   Contains the GetLoadFunctionsMap for texture_format_util.h
//

#include "libANGLE/renderer/load_functions_table.h"

#include "image_util/copyimage.h"
#include "image_util/generatemip.h"
#include "image_util/loadimage.h"

using namespace rx;

namespace angle
{

namespace
{

// ES3 image loading functions vary based on:
//    - the GL internal format (supplied to glTex*Image*D)
//    - the GL data type given (supplied to glTex*Image*D)
//    - the target DXGI_FORMAT that the image will be loaded into (which is chosen based on the D3D
//    device's capabilities)
// This map type determines which loading function to use, based on these three parameters.
// Source formats and types are taken from Tables 3.2 and 3.3 of the ES 3 spec.
void UnimplementedLoadFunction(size_t width,
                               size_t height,
                               size_t depth,
                               const uint8_t *input,
                               size_t inputRowPitch,
                               size_t inputDepthPitch,
                               uint8_t *output,
                               size_t outputRowPitch,
                               size_t outputDepthPitch)
{
    UNIMPLEMENTED();
}

void UnreachableLoadFunction(size_t width,
                             size_t height,
                             size_t depth,
                             const uint8_t *input,
                             size_t inputRowPitch,
                             size_t inputDepthPitch,
                             uint8_t *output,
                             size_t outputRowPitch,
                             size_t outputDepthPitch)
{
    UNREACHABLE();
}

LoadImageFunctionInfo A1RGB5_ANGLEX_to_A1R5G5B5_UNORM(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadRGB5A1ToRGBA8, true);
        case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:
            return LoadImageFunctionInfo(LoadToNative<GLushort, 1>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo ALPHA_to_R16G16B16A16_FLOAT(GLenum type)
{
    switch (type)
    {
        case GL_HALF_FLOAT:
            return LoadImageFunctionInfo(LoadA16FToRGBA16F, true);
        case GL_HALF_FLOAT_OES:
            return LoadImageFunctionInfo(LoadA16FToRGBA16F, true);
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo ALPHA_to_R32G32B32A32_FLOAT(GLenum type)
{
    switch (type)
    {
        case GL_FLOAT:
            return LoadImageFunctionInfo(LoadA32FToRGBA32F, true);
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo ALPHA_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo ALPHA16F_EXT_to_R16_FLOAT(GLenum type)
{
    switch (type)
    {
        case GL_HALF_FLOAT:
            return LoadImageFunctionInfo(LoadToNative<GLhalf, 1>, false);
        case GL_HALF_FLOAT_OES:
            return LoadImageFunctionInfo(LoadToNative<GLhalf, 1>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo ALPHA16F_EXT_to_default(GLenum type)
{
    switch (type)
    {
        case GL_HALF_FLOAT:
            return LoadImageFunctionInfo(LoadA16FToRGBA16F, true);
        case GL_HALF_FLOAT_OES:
            return LoadImageFunctionInfo(LoadA16FToRGBA16F, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo ALPHA32F_EXT_to_R32_FLOAT(GLenum type)
{
    switch (type)
    {
        case GL_FLOAT:
            return LoadImageFunctionInfo(LoadToNative<GLfloat, 1>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo ALPHA32F_EXT_to_default(GLenum type)
{
    switch (type)
    {
        case GL_FLOAT:
            return LoadImageFunctionInfo(LoadA32FToRGBA32F, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo ALPHA8_EXT_to_A8_UNORM(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadToNative<GLubyte, 1>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo ALPHA8_EXT_to_R8G8B8A8_UNORM(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadA8ToRGBA8, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo ALPHA8_EXT_to_R8_UNORM(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadToNative<GLubyte, 1>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo BGR565_ANGLEX_to_B5G6R5_UNORM(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadRGB8ToBGR565, true);
        case GL_UNSIGNED_SHORT_5_6_5:
            return LoadImageFunctionInfo(LoadRGB565ToBGR565, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo BGR5_A1_ANGLEX_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadRGB5A1ToRGBA8, true);
        case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:
            return LoadImageFunctionInfo(LoadToNative<GLushort, 1>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo BGRA4_ANGLEX_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadToNative<GLubyte, 4>, false);
        case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT:
            return LoadImageFunctionInfo(LoadRGBA4ToRGBA8, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo BGRA8_EXT_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadToNative<GLubyte, 4>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo BGRA8_SRGB_ANGLEX_to_B8G8R8A8_UNORM_SRGB(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadToNative<GLubyte, 4>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo BGRA_EXT_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo BGRX8_ANGLEX_to_B8G8R8A8_UNORM(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadToNative<GLubyte, 4>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo BGRX8_ANGLEX_to_B8G8R8X8_UNORM(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadToNative<GLubyte, 4>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_R11_EAC_to_EAC_R11_UNORM_BLOCK(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<4, 4, 1, 8>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_R11_EAC_to_R16_FLOAT(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadEACR11ToR16F, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_R11_EAC_to_R16_UNORM(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadEACR11ToR16, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_RG11_EAC_to_EAC_R11G11_UNORM_BLOCK(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<4, 4, 1, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_RG11_EAC_to_R16G16_FLOAT(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadEACRG11ToRG16F, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_RG11_EAC_to_R16G16_UNORM(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadEACRG11ToRG16, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_RGB8_ETC2_to_ETC2_R8G8B8_UNORM_BLOCK(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<4, 4, 1, 8>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_RGB8_ETC2_to_R8G8B8A8_UNORM(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadETC2RGB8ToRGBA8, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_RGB8_LOSSY_DECODE_ETC2_ANGLE_to_BC1_RGB_UNORM_BLOCK(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadETC2RGB8ToBC1, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2_to_ETC2_R8G8B8A1_UNORM_BLOCK(
    GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<4, 4, 1, 8>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2_to_R8G8B8A8_UNORM(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadETC2RGB8A1ToRGBA8, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo
COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE_to_BC1_RGBA_UNORM_BLOCK(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadETC2RGB8A1ToBC1, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_RGBA8_ETC2_EAC_to_ETC2_R8G8B8A8_UNORM_BLOCK(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<4, 4, 1, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_RGBA8_ETC2_EAC_to_R8G8B8A8_UNORM(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadETC2RGBA8ToRGBA8, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_RGBA_ASTC_10x10_KHR_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<10, 10, 1, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_RGBA_ASTC_10x5_KHR_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<10, 5, 1, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_RGBA_ASTC_10x6_KHR_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<10, 6, 1, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_RGBA_ASTC_10x8_KHR_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<10, 8, 1, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_RGBA_ASTC_12x10_KHR_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<12, 10, 1, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_RGBA_ASTC_12x12_KHR_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<12, 12, 1, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_RGBA_ASTC_3x3x3_OES_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<3, 3, 3, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_RGBA_ASTC_4x3x3_OES_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<4, 3, 3, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_RGBA_ASTC_4x4_KHR_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<4, 4, 1, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_RGBA_ASTC_4x4x3_OES_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<4, 4, 3, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_RGBA_ASTC_4x4x4_OES_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<4, 4, 4, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_RGBA_ASTC_5x4_KHR_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<5, 4, 1, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_RGBA_ASTC_5x4x4_OES_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<5, 4, 4, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_RGBA_ASTC_5x5_KHR_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<5, 5, 1, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_RGBA_ASTC_5x5x4_OES_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<5, 5, 4, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_RGBA_ASTC_5x5x5_OES_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<5, 5, 5, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_RGBA_ASTC_6x5_KHR_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<6, 5, 1, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_RGBA_ASTC_6x5x5_OES_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<6, 5, 5, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_RGBA_ASTC_6x6_KHR_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<6, 6, 1, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_RGBA_ASTC_6x6x5_OES_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<6, 6, 5, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_RGBA_ASTC_6x6x6_OES_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<6, 6, 6, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_RGBA_ASTC_8x5_KHR_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<8, 5, 1, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_RGBA_ASTC_8x6_KHR_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<8, 6, 1, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_RGBA_ASTC_8x8_KHR_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<8, 8, 1, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_RGBA_BPTC_UNORM_EXT_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<4, 4, 1, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_RGBA_S3TC_DXT1_EXT_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<4, 4, 1, 8>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_RGBA_S3TC_DXT3_ANGLE_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<4, 4, 1, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_RGBA_S3TC_DXT5_ANGLE_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<4, 4, 1, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<4, 4, 1, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<4, 4, 1, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_RGB_S3TC_DXT1_EXT_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<4, 4, 1, 8>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_SIGNED_R11_EAC_to_EAC_R11_SNORM_BLOCK(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<4, 4, 1, 8>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_SIGNED_R11_EAC_to_R16_FLOAT(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadEACR11SToR16F, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_SIGNED_R11_EAC_to_R16_SNORM(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadEACR11SToR16, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_SIGNED_RG11_EAC_to_EAC_R11G11_SNORM_BLOCK(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<4, 4, 1, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_SIGNED_RG11_EAC_to_R16G16_FLOAT(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadEACRG11SToRG16F, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_SIGNED_RG11_EAC_to_R16G16_SNORM(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadEACRG11SToRG16, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<10, 10, 1, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<10, 5, 1, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<10, 6, 1, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<10, 8, 1, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<12, 10, 1, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<12, 12, 1, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_SRGB8_ALPHA8_ASTC_3x3x3_OES_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<3, 3, 3, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_SRGB8_ALPHA8_ASTC_4x3x3_OES_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<4, 3, 3, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<4, 4, 1, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x3_OES_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<4, 4, 3, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x4_OES_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<4, 4, 4, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<5, 4, 1, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_SRGB8_ALPHA8_ASTC_5x4x4_OES_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<5, 4, 4, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<5, 5, 1, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x4_OES_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<5, 5, 4, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x5_OES_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<5, 5, 5, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<6, 5, 1, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_SRGB8_ALPHA8_ASTC_6x5x5_OES_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<6, 5, 5, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<6, 6, 1, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x5_OES_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<6, 6, 5, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x6_OES_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<6, 6, 6, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<8, 5, 1, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<8, 6, 1, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<8, 8, 1, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_SRGB8_ALPHA8_ETC2_EAC_to_ETC2_R8G8B8A8_SRGB_BLOCK(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<4, 4, 1, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_SRGB8_ALPHA8_ETC2_EAC_to_R8G8B8A8_UNORM_SRGB(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadETC2SRGBA8ToSRGBA8, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_SRGB8_ETC2_to_ETC2_R8G8B8_SRGB_BLOCK(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<4, 4, 1, 8>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_SRGB8_ETC2_to_R8G8B8A8_UNORM_SRGB(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadETC2SRGB8ToRGBA8, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_SRGB8_LOSSY_DECODE_ETC2_ANGLE_to_BC1_RGB_UNORM_SRGB_BLOCK(
    GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadETC2SRGB8ToBC1, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2_to_ETC2_R8G8B8A1_SRGB_BLOCK(
    GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<4, 4, 1, 8>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2_to_R8G8B8A8_UNORM_SRGB(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadETC2SRGB8A1ToRGBA8, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo
COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE_to_BC1_RGBA_UNORM_SRGB_BLOCK(
    GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadETC2SRGB8A1ToBC1, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<4, 4, 1, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<4, 4, 1, 8>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<4, 4, 1, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<4, 4, 1, 16>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo COMPRESSED_SRGB_S3TC_DXT1_EXT_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<4, 4, 1, 8>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo DEPTH24_STENCIL8_to_D24_UNORM_S8_UINT(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_INT_24_8:
            return LoadImageFunctionInfo(LoadR32ToR24G8, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo DEPTH24_STENCIL8_to_D32_FLOAT_S8X24_UINT(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_INT_24_8:
            return LoadImageFunctionInfo(LoadD24S8ToD32FS8X24, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo DEPTH32F_STENCIL8_to_D24_UNORM_S8_UINT(GLenum type)
{
    switch (type)
    {
        case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
            return LoadImageFunctionInfo(LoadD32FS8X24ToD24S8, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo DEPTH32F_STENCIL8_to_D32_FLOAT_S8X24_UINT(GLenum type)
{
    switch (type)
    {
        case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
            return LoadImageFunctionInfo(LoadD32FS8X24ToD32FS8X24, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo DEPTH_COMPONENT16_to_D16_UNORM(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_INT:
            return LoadImageFunctionInfo(LoadR32ToR16, true);
        case GL_UNSIGNED_SHORT:
            return LoadImageFunctionInfo(LoadToNative<GLushort, 1>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo DEPTH_COMPONENT24_to_D24_UNORM_S8_UINT(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_INT:
            return LoadImageFunctionInfo(LoadR32ToR24G8, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo DEPTH_COMPONENT24_to_D32_FLOAT_S8X24_UINT(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_INT:
            return LoadImageFunctionInfo(LoadD32ToD32FX32, true);
        case GL_UNSIGNED_INT_24_8:
            return LoadImageFunctionInfo(LoadD24S8ToD32FS8X24, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo DEPTH_COMPONENT32F_to_D32_FLOAT(GLenum type)
{
    switch (type)
    {
        case GL_FLOAT:
            return LoadImageFunctionInfo(LoadD32FToD32F, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo DEPTH_COMPONENT32_OES_to_D32_FLOAT(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_INT:
            return LoadImageFunctionInfo(LoadD32ToD32F, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo DEPTH_COMPONENT32_OES_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_INT:
            return LoadImageFunctionInfo(LoadR32ToR24G8, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo ETC1_RGB8_LOSSY_DECODE_ANGLE_to_BC1_RGB_UNORM_BLOCK(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadETC1RGB8ToBC1, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo ETC1_RGB8_OES_to_ETC1_R8G8B8_UNORM_BLOCK(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<4, 4, 1, 8>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo ETC1_RGB8_OES_to_ETC2_R8G8B8_UNORM_BLOCK(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadCompressedToNative<4, 4, 1, 8>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo ETC1_RGB8_OES_to_R8G8B8A8_UNORM(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadETC1RGB8ToRGBA8, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo LUMINANCE_to_R16G16B16A16_FLOAT(GLenum type)
{
    switch (type)
    {
        case GL_HALF_FLOAT:
            return LoadImageFunctionInfo(LoadL16FToRGBA16F, true);
        case GL_HALF_FLOAT_OES:
            return LoadImageFunctionInfo(LoadL16FToRGBA16F, true);
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo LUMINANCE_to_R32G32B32A32_FLOAT(GLenum type)
{
    switch (type)
    {
        case GL_FLOAT:
            return LoadImageFunctionInfo(LoadL32FToRGBA32F, true);
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo LUMINANCE_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo LUMINANCE16F_EXT_to_R16_FLOAT(GLenum type)
{
    switch (type)
    {
        case GL_HALF_FLOAT:
            return LoadImageFunctionInfo(LoadToNative<GLhalf, 1>, false);
        case GL_HALF_FLOAT_OES:
            return LoadImageFunctionInfo(LoadToNative<GLhalf, 1>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo LUMINANCE16F_EXT_to_default(GLenum type)
{
    switch (type)
    {
        case GL_HALF_FLOAT:
            return LoadImageFunctionInfo(LoadL16FToRGBA16F, true);
        case GL_HALF_FLOAT_OES:
            return LoadImageFunctionInfo(LoadL16FToRGBA16F, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo LUMINANCE32F_EXT_to_R32_FLOAT(GLenum type)
{
    switch (type)
    {
        case GL_FLOAT:
            return LoadImageFunctionInfo(LoadToNative<GLfloat, 1>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo LUMINANCE32F_EXT_to_default(GLenum type)
{
    switch (type)
    {
        case GL_FLOAT:
            return LoadImageFunctionInfo(LoadL32FToRGBA32F, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo LUMINANCE8_ALPHA8_EXT_to_R8G8B8A8_UNORM(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadLA8ToRGBA8, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo LUMINANCE8_ALPHA8_EXT_to_R8G8_UNORM(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadToNative<GLubyte, 2>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo LUMINANCE8_EXT_to_R8G8B8A8_UNORM(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadL8ToRGBA8, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo LUMINANCE8_EXT_to_R8_UNORM(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadToNative<GLubyte, 1>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo LUMINANCE_ALPHA_to_R16G16B16A16_FLOAT(GLenum type)
{
    switch (type)
    {
        case GL_HALF_FLOAT:
            return LoadImageFunctionInfo(LoadLA16FToRGBA16F, true);
        case GL_HALF_FLOAT_OES:
            return LoadImageFunctionInfo(LoadLA16FToRGBA16F, true);
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo LUMINANCE_ALPHA_to_R32G32B32A32_FLOAT(GLenum type)
{
    switch (type)
    {
        case GL_FLOAT:
            return LoadImageFunctionInfo(LoadLA32FToRGBA32F, true);
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo LUMINANCE_ALPHA_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo LUMINANCE_ALPHA16F_EXT_to_R16G16_FLOAT(GLenum type)
{
    switch (type)
    {
        case GL_HALF_FLOAT:
            return LoadImageFunctionInfo(LoadToNative<GLhalf, 2>, false);
        case GL_HALF_FLOAT_OES:
            return LoadImageFunctionInfo(LoadToNative<GLhalf, 2>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo LUMINANCE_ALPHA16F_EXT_to_default(GLenum type)
{
    switch (type)
    {
        case GL_HALF_FLOAT:
            return LoadImageFunctionInfo(LoadLA16FToRGBA16F, true);
        case GL_HALF_FLOAT_OES:
            return LoadImageFunctionInfo(LoadLA16FToRGBA16F, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo LUMINANCE_ALPHA32F_EXT_to_R32G32_FLOAT(GLenum type)
{
    switch (type)
    {
        case GL_FLOAT:
            return LoadImageFunctionInfo(LoadToNative<GLfloat, 2>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo LUMINANCE_ALPHA32F_EXT_to_default(GLenum type)
{
    switch (type)
    {
        case GL_FLOAT:
            return LoadImageFunctionInfo(LoadLA32FToRGBA32F, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo R11F_G11F_B10F_to_R11G11B10_FLOAT(GLenum type)
{
    switch (type)
    {
        case GL_FLOAT:
            return LoadImageFunctionInfo(LoadRGB32FToRG11B10F, true);
        case GL_HALF_FLOAT:
            return LoadImageFunctionInfo(LoadRGB16FToRG11B10F, true);
        case GL_HALF_FLOAT_OES:
            return LoadImageFunctionInfo(LoadRGB16FToRG11B10F, true);
        case GL_UNSIGNED_INT_10F_11F_11F_REV:
            return LoadImageFunctionInfo(LoadToNative<GLuint, 1>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo R16F_to_R16_FLOAT(GLenum type)
{
    switch (type)
    {
        case GL_FLOAT:
            return LoadImageFunctionInfo(Load32FTo16F<1>, true);
        case GL_HALF_FLOAT:
            return LoadImageFunctionInfo(LoadToNative<GLhalf, 1>, false);
        case GL_HALF_FLOAT_OES:
            return LoadImageFunctionInfo(LoadToNative<GLhalf, 1>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo R16I_to_R16_SINT(GLenum type)
{
    switch (type)
    {
        case GL_SHORT:
            return LoadImageFunctionInfo(LoadToNative<GLshort, 1>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo R16UI_to_R16_UINT(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_SHORT:
            return LoadImageFunctionInfo(LoadToNative<GLushort, 1>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo R16_EXT_to_R16_UNORM(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_SHORT:
            return LoadImageFunctionInfo(LoadToNative<GLushort, 1>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo R16_SNORM_EXT_to_R16_SNORM(GLenum type)
{
    switch (type)
    {
        case GL_SHORT:
            return LoadImageFunctionInfo(LoadToNative<GLushort, 1>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo R16_SSCALED_ANGLEX_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo R16_USCALED_ANGLEX_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo R32F_to_R32_FLOAT(GLenum type)
{
    switch (type)
    {
        case GL_FLOAT:
            return LoadImageFunctionInfo(LoadToNative<GLfloat, 1>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo R32I_to_R32_SINT(GLenum type)
{
    switch (type)
    {
        case GL_INT:
            return LoadImageFunctionInfo(LoadToNative<GLint, 1>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo R32UI_to_R32_UINT(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_INT:
            return LoadImageFunctionInfo(LoadToNative<GLuint, 1>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo R8_to_R8_UNORM(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadToNative<GLubyte, 1>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo R8I_to_R8_SINT(GLenum type)
{
    switch (type)
    {
        case GL_BYTE:
            return LoadImageFunctionInfo(LoadToNative<GLbyte, 1>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo R8UI_to_R8_UINT(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadToNative<GLubyte, 1>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo R8_SNORM_to_R8_SNORM(GLenum type)
{
    switch (type)
    {
        case GL_BYTE:
            return LoadImageFunctionInfo(LoadToNative<GLbyte, 1>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo R8_SSCALED_ANGLEX_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo R8_USCALED_ANGLEX_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RG16F_to_R16G16_FLOAT(GLenum type)
{
    switch (type)
    {
        case GL_FLOAT:
            return LoadImageFunctionInfo(Load32FTo16F<2>, true);
        case GL_HALF_FLOAT:
            return LoadImageFunctionInfo(LoadToNative<GLhalf, 2>, false);
        case GL_HALF_FLOAT_OES:
            return LoadImageFunctionInfo(LoadToNative<GLhalf, 2>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RG16I_to_R16G16_SINT(GLenum type)
{
    switch (type)
    {
        case GL_SHORT:
            return LoadImageFunctionInfo(LoadToNative<GLshort, 2>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RG16UI_to_R16G16_UINT(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_SHORT:
            return LoadImageFunctionInfo(LoadToNative<GLushort, 2>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RG16_EXT_to_R16G16_UNORM(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_SHORT:
            return LoadImageFunctionInfo(LoadToNative<GLushort, 2>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RG16_SNORM_EXT_to_R16G16_SNORM(GLenum type)
{
    switch (type)
    {
        case GL_SHORT:
            return LoadImageFunctionInfo(LoadToNative<GLushort, 2>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RG16_SSCALED_ANGLEX_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RG16_USCALED_ANGLEX_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RG32F_to_R32G32_FLOAT(GLenum type)
{
    switch (type)
    {
        case GL_FLOAT:
            return LoadImageFunctionInfo(LoadToNative<GLfloat, 2>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RG32I_to_R32G32_SINT(GLenum type)
{
    switch (type)
    {
        case GL_INT:
            return LoadImageFunctionInfo(LoadToNative<GLint, 2>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RG32UI_to_R32G32_UINT(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_INT:
            return LoadImageFunctionInfo(LoadToNative<GLuint, 2>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RG8_to_R8G8_UNORM(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadToNative<GLubyte, 2>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RG8I_to_R8G8_SINT(GLenum type)
{
    switch (type)
    {
        case GL_BYTE:
            return LoadImageFunctionInfo(LoadToNative<GLbyte, 2>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RG8UI_to_R8G8_UINT(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadToNative<GLubyte, 2>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RG8_SNORM_to_R8G8_SNORM(GLenum type)
{
    switch (type)
    {
        case GL_BYTE:
            return LoadImageFunctionInfo(LoadToNative<GLbyte, 2>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RG8_SSCALED_ANGLEX_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RG8_USCALED_ANGLEX_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGB_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
        case GL_UNSIGNED_SHORT_5_6_5:
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGB10_A2_to_R10G10B10A2_UNORM(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_INT_2_10_10_10_REV:
            return LoadImageFunctionInfo(LoadToNative<GLuint, 1>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGB10_A2UI_to_R10G10B10A2_UINT(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_INT_2_10_10_10_REV:
            return LoadImageFunctionInfo(LoadToNative<GLuint, 1>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGB10_A2_SINT_ANGLEX_to_R10G10B10A2_SINT(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadRGB10A2ToRGBA8, true);
        case GL_UNSIGNED_INT_2_10_10_10_REV:
            return LoadImageFunctionInfo(LoadToNative<GLuint, 1>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGB10_A2_SNORM_ANGLEX_to_R10G10B10A2_SNORM(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadRGB10A2ToRGBA8, true);
        case GL_UNSIGNED_INT_2_10_10_10_REV:
            return LoadImageFunctionInfo(LoadToNative<GLuint, 1>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGB10_A2_SSCALED_ANGLEX_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGB10_A2_USCALED_ANGLEX_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGB10_UNORM_ANGLEX_to_R10G10B10A2_UNORM(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_INT_2_10_10_10_REV:
            return LoadImageFunctionInfo(LoadRGB10A2ToRGB10X2, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGB16F_to_R16G16B16A16_FLOAT(GLenum type)
{
    switch (type)
    {
        case GL_FLOAT:
            return LoadImageFunctionInfo(LoadRGB32FToRGBA16F, true);
        case GL_HALF_FLOAT:
            return LoadImageFunctionInfo(LoadToNative3To4<GLhalf, gl::Float16One>, true);
        case GL_HALF_FLOAT_OES:
            return LoadImageFunctionInfo(LoadToNative3To4<GLhalf, gl::Float16One>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGB16F_to_R16G16B16_FLOAT(GLenum type)
{
    switch (type)
    {
        case GL_FLOAT:
            return LoadImageFunctionInfo(LoadRGB32FToRGB16F, true);
        case GL_HALF_FLOAT:
            return LoadImageFunctionInfo(LoadToNative<GLhalf, 3>, false);
        case GL_HALF_FLOAT_OES:
            return LoadImageFunctionInfo(LoadToNative<GLhalf, 3>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGB16I_to_R16G16B16A16_SINT(GLenum type)
{
    switch (type)
    {
        case GL_SHORT:
            return LoadImageFunctionInfo(LoadToNative3To4<GLshort, 0x0001>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGB16I_to_R16G16B16_SINT(GLenum type)
{
    switch (type)
    {
        case GL_SHORT:
            return LoadImageFunctionInfo(LoadToNative<GLshort, 3>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGB16UI_to_R16G16B16A16_UINT(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_SHORT:
            return LoadImageFunctionInfo(LoadToNative3To4<GLushort, 0x0001>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGB16UI_to_R16G16B16_UINT(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_SHORT:
            return LoadImageFunctionInfo(LoadToNative<GLushort, 3>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGB16_EXT_to_R16G16B16A16_UNORM(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_SHORT:
            return LoadImageFunctionInfo(LoadToNative3To4<GLushort, 0xFFFF>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGB16_EXT_to_R16G16B16_UNORM(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_SHORT:
            return LoadImageFunctionInfo(LoadToNative<GLushort, 3>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGB16_SNORM_EXT_to_R16G16B16A16_SNORM(GLenum type)
{
    switch (type)
    {
        case GL_SHORT:
            return LoadImageFunctionInfo(LoadToNative3To4<GLushort, 0x7FFF>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGB16_SNORM_EXT_to_R16G16B16_SNORM(GLenum type)
{
    switch (type)
    {
        case GL_SHORT:
            return LoadImageFunctionInfo(LoadToNative<GLushort, 3>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGB16_SSCALED_ANGLEX_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGB16_USCALED_ANGLEX_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGB32F_to_R32G32B32A32_FLOAT(GLenum type)
{
    switch (type)
    {
        case GL_FLOAT:
            return LoadImageFunctionInfo(LoadToNative3To4<GLfloat, gl::Float32One>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGB32F_to_R32G32B32_FLOAT(GLenum type)
{
    switch (type)
    {
        case GL_FLOAT:
            return LoadImageFunctionInfo(LoadToNative<GLfloat, 3>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGB32I_to_R32G32B32A32_SINT(GLenum type)
{
    switch (type)
    {
        case GL_INT:
            return LoadImageFunctionInfo(LoadToNative3To4<GLint, 0x00000001>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGB32I_to_R32G32B32_SINT(GLenum type)
{
    switch (type)
    {
        case GL_INT:
            return LoadImageFunctionInfo(LoadToNative<GLint, 3>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGB32UI_to_R32G32B32A32_UINT(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_INT:
            return LoadImageFunctionInfo(LoadToNative3To4<GLuint, 0x00000001>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGB32UI_to_R32G32B32_UINT(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_INT:
            return LoadImageFunctionInfo(LoadToNative<GLuint, 3>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGB565_to_B5G6R5_UNORM(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadRGB8ToBGR565, true);
        case GL_UNSIGNED_SHORT_5_6_5:
            return LoadImageFunctionInfo(LoadToNative<GLushort, 1>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGB565_to_R5G6B5_UNORM(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadRGB8ToBGR565, true);
        case GL_UNSIGNED_SHORT_5_6_5:
            return LoadImageFunctionInfo(LoadToNative<GLushort, 1>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGB565_to_R8G8B8A8_UNORM(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadToNative3To4<GLubyte, 0xFF>, true);
        case GL_UNSIGNED_SHORT_5_6_5:
            return LoadImageFunctionInfo(LoadR5G6B5ToRGBA8, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGB5_A1_to_A1R5G5B5_UNORM(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadRGBA8ToBGR5A1, true);
        case GL_UNSIGNED_INT_2_10_10_10_REV:
            return LoadImageFunctionInfo(LoadRGB10A2ToBGR5A1, true);
        case GL_UNSIGNED_SHORT_5_5_5_1:
            return LoadImageFunctionInfo(LoadRGB5A1ToA1RGB5, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGB5_A1_to_B5G5R5A1_UNORM(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadRGBA8ToBGR5A1, true);
        case GL_UNSIGNED_INT_2_10_10_10_REV:
            return LoadImageFunctionInfo(LoadRGB10A2ToBGR5A1, true);
        case GL_UNSIGNED_SHORT_5_5_5_1:
            return LoadImageFunctionInfo(LoadRGB5A1ToA1RGB5, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGB5_A1_to_R5G5B5A1_UNORM(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadRGBA8ToRGB5A1, true);
        case GL_UNSIGNED_INT_2_10_10_10_REV:
            return LoadImageFunctionInfo(LoadRGB10A2ToRGB5A1, true);
        case GL_UNSIGNED_SHORT_5_5_5_1:
            return LoadImageFunctionInfo(LoadToNative<GLushort, 1>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGB5_A1_to_R8G8B8A8_UNORM(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadToNative<GLubyte, 4>, false);
        case GL_UNSIGNED_INT_2_10_10_10_REV:
            return LoadImageFunctionInfo(LoadRGB10A2ToRGBA8, true);
        case GL_UNSIGNED_SHORT_5_5_5_1:
            return LoadImageFunctionInfo(LoadRGB5A1ToRGBA8, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGB8_to_R8G8B8A8_UNORM(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadToNative3To4<GLubyte, 0xFF>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGB8_to_R8G8B8_UNORM(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadToNative<GLbyte, 3>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGB8I_to_R8G8B8A8_SINT(GLenum type)
{
    switch (type)
    {
        case GL_BYTE:
            return LoadImageFunctionInfo(LoadToNative3To4<GLbyte, 0x01>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGB8I_to_R8G8B8_SINT(GLenum type)
{
    switch (type)
    {
        case GL_BYTE:
            return LoadImageFunctionInfo(LoadToNative<GLbyte, 3>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGB8UI_to_R8G8B8A8_UINT(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadToNative3To4<GLubyte, 0x01>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGB8UI_to_R8G8B8_UINT(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadToNative<GLubyte, 3>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGB8_SNORM_to_R8G8B8A8_SNORM(GLenum type)
{
    switch (type)
    {
        case GL_BYTE:
            return LoadImageFunctionInfo(LoadToNative3To4<GLbyte, 0x7F>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGB8_SNORM_to_R8G8B8_SNORM(GLenum type)
{
    switch (type)
    {
        case GL_BYTE:
            return LoadImageFunctionInfo(LoadToNative<GLbyte, 3>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGB8_SSCALED_ANGLEX_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGB8_USCALED_ANGLEX_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGB9_E5_to_R9G9B9E5_SHAREDEXP(GLenum type)
{
    switch (type)
    {
        case GL_FLOAT:
            return LoadImageFunctionInfo(LoadRGB32FToRGB9E5, true);
        case GL_HALF_FLOAT:
            return LoadImageFunctionInfo(LoadRGB16FToRGB9E5, true);
        case GL_HALF_FLOAT_OES:
            return LoadImageFunctionInfo(LoadRGB16FToRGB9E5, true);
        case GL_UNSIGNED_INT_5_9_9_9_REV:
            return LoadImageFunctionInfo(LoadToNative<GLuint, 1>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGBA_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
        case GL_UNSIGNED_SHORT_4_4_4_4:
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
        case GL_UNSIGNED_SHORT_5_5_5_1:
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGBA16F_to_R16G16B16A16_FLOAT(GLenum type)
{
    switch (type)
    {
        case GL_FLOAT:
            return LoadImageFunctionInfo(Load32FTo16F<4>, true);
        case GL_HALF_FLOAT:
            return LoadImageFunctionInfo(LoadToNative<GLhalf, 4>, false);
        case GL_HALF_FLOAT_OES:
            return LoadImageFunctionInfo(LoadToNative<GLhalf, 4>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGBA16I_to_R16G16B16A16_SINT(GLenum type)
{
    switch (type)
    {
        case GL_SHORT:
            return LoadImageFunctionInfo(LoadToNative<GLshort, 4>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGBA16UI_to_R16G16B16A16_UINT(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_SHORT:
            return LoadImageFunctionInfo(LoadToNative<GLushort, 4>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGBA16_EXT_to_R16G16B16A16_UNORM(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_SHORT:
            return LoadImageFunctionInfo(LoadToNative<GLushort, 4>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGBA16_SNORM_EXT_to_R16G16B16A16_SNORM(GLenum type)
{
    switch (type)
    {
        case GL_SHORT:
            return LoadImageFunctionInfo(LoadToNative<GLushort, 4>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGBA16_SSCALED_ANGLEX_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGBA16_USCALED_ANGLEX_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGBA32F_to_R32G32B32A32_FLOAT(GLenum type)
{
    switch (type)
    {
        case GL_FLOAT:
            return LoadImageFunctionInfo(LoadToNative<GLfloat, 4>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGBA32I_to_R32G32B32A32_SINT(GLenum type)
{
    switch (type)
    {
        case GL_INT:
            return LoadImageFunctionInfo(LoadToNative<GLint, 4>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGBA32UI_to_R32G32B32A32_UINT(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_INT:
            return LoadImageFunctionInfo(LoadToNative<GLuint, 4>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGBA4_to_B4G4R4A4_UNORM(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadRGBA8ToBGRA4, true);
        case GL_UNSIGNED_SHORT_4_4_4_4:
            return LoadImageFunctionInfo(LoadRGBA4ToARGB4, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGBA4_to_R4G4B4A4_UNORM(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadRGBA8ToRGBA4, true);
        case GL_UNSIGNED_SHORT_4_4_4_4:
            return LoadImageFunctionInfo(LoadToNative<GLushort, 1>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGBA4_to_R8G8B8A8_UNORM(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadToNative<GLubyte, 4>, false);
        case GL_UNSIGNED_SHORT_4_4_4_4:
            return LoadImageFunctionInfo(LoadRGBA4ToRGBA8, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGBA8_to_R8G8B8A8_UNORM(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadToNative<GLubyte, 4>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGBA8I_to_R8G8B8A8_SINT(GLenum type)
{
    switch (type)
    {
        case GL_BYTE:
            return LoadImageFunctionInfo(LoadToNative<GLbyte, 4>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGBA8UI_to_R8G8B8A8_UINT(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadToNative<GLubyte, 4>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGBA8_SNORM_to_R8G8B8A8_SNORM(GLenum type)
{
    switch (type)
    {
        case GL_BYTE:
            return LoadImageFunctionInfo(LoadToNative<GLbyte, 4>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGBA8_SSCALED_ANGLEX_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo RGBA8_USCALED_ANGLEX_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo SRGB8_to_R8G8B8A8_UNORM_SRGB(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadToNative3To4<GLubyte, 0xFF>, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo SRGB8_to_R8G8B8_UNORM_SRGB(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadToNative<GLbyte, 3>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo SRGB8_ALPHA8_to_R8G8B8A8_UNORM_SRGB(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(LoadToNative<GLubyte, 4>, false);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

LoadImageFunctionInfo STENCIL_INDEX8_to_default(GLenum type)
{
    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            return LoadImageFunctionInfo(UnimplementedLoadFunction, true);
        default:
            UNREACHABLE();
            return LoadImageFunctionInfo(UnreachableLoadFunction, true);
    }
}

}  // namespace

LoadFunctionMap GetLoadFunctionsMap(GLenum internalFormat, FormatID angleFormat)
{
    // clang-format off
    switch (internalFormat)
    {
        case GL_A1RGB5_ANGLEX:
        {
            switch (angleFormat)
            {
                case FormatID::A1R5G5B5_UNORM:
                    return A1RGB5_ANGLEX_to_A1R5G5B5_UNORM;
                default:
                    break;
            }
            break;
        }
        case GL_ALPHA:
        {
            switch (angleFormat)
            {
                case FormatID::R16G16B16A16_FLOAT:
                    return ALPHA_to_R16G16B16A16_FLOAT;
                case FormatID::R32G32B32A32_FLOAT:
                    return ALPHA_to_R32G32B32A32_FLOAT;
                default:
                    return ALPHA_to_default;
            }
        }
        case GL_ALPHA16F_EXT:
        {
            switch (angleFormat)
            {
                case FormatID::R16_FLOAT:
                    return ALPHA16F_EXT_to_R16_FLOAT;
                default:
                    return ALPHA16F_EXT_to_default;
            }
        }
        case GL_ALPHA32F_EXT:
        {
            switch (angleFormat)
            {
                case FormatID::R32_FLOAT:
                    return ALPHA32F_EXT_to_R32_FLOAT;
                default:
                    return ALPHA32F_EXT_to_default;
            }
        }
        case GL_ALPHA8_EXT:
        {
            switch (angleFormat)
            {
                case FormatID::A8_UNORM:
                    return ALPHA8_EXT_to_A8_UNORM;
                case FormatID::R8G8B8A8_UNORM:
                    return ALPHA8_EXT_to_R8G8B8A8_UNORM;
                case FormatID::R8_UNORM:
                    return ALPHA8_EXT_to_R8_UNORM;
                default:
                    break;
            }
            break;
        }
        case GL_BGR565_ANGLEX:
        {
            switch (angleFormat)
            {
                case FormatID::B5G6R5_UNORM:
                    return BGR565_ANGLEX_to_B5G6R5_UNORM;
                default:
                    break;
            }
            break;
        }
        case GL_BGR5_A1_ANGLEX:
            return BGR5_A1_ANGLEX_to_default;
        case GL_BGRA4_ANGLEX:
            return BGRA4_ANGLEX_to_default;
        case GL_BGRA8_EXT:
            return BGRA8_EXT_to_default;
        case GL_BGRA8_SRGB_ANGLEX:
        {
            switch (angleFormat)
            {
                case FormatID::B8G8R8A8_UNORM_SRGB:
                    return BGRA8_SRGB_ANGLEX_to_B8G8R8A8_UNORM_SRGB;
                default:
                    break;
            }
            break;
        }
        case GL_BGRA_EXT:
            return BGRA_EXT_to_default;
        case GL_BGRX8_ANGLEX:
        {
            switch (angleFormat)
            {
                case FormatID::B8G8R8A8_UNORM:
                    return BGRX8_ANGLEX_to_B8G8R8A8_UNORM;
                case FormatID::B8G8R8X8_UNORM:
                    return BGRX8_ANGLEX_to_B8G8R8X8_UNORM;
                default:
                    break;
            }
            break;
        }
        case GL_COMPRESSED_R11_EAC:
        {
            switch (angleFormat)
            {
                case FormatID::EAC_R11_UNORM_BLOCK:
                    return COMPRESSED_R11_EAC_to_EAC_R11_UNORM_BLOCK;
                case FormatID::R16_FLOAT:
                    return COMPRESSED_R11_EAC_to_R16_FLOAT;
                case FormatID::R16_UNORM:
                    return COMPRESSED_R11_EAC_to_R16_UNORM;
                default:
                    break;
            }
            break;
        }
        case GL_COMPRESSED_RG11_EAC:
        {
            switch (angleFormat)
            {
                case FormatID::EAC_R11G11_UNORM_BLOCK:
                    return COMPRESSED_RG11_EAC_to_EAC_R11G11_UNORM_BLOCK;
                case FormatID::R16G16_FLOAT:
                    return COMPRESSED_RG11_EAC_to_R16G16_FLOAT;
                case FormatID::R16G16_UNORM:
                    return COMPRESSED_RG11_EAC_to_R16G16_UNORM;
                default:
                    break;
            }
            break;
        }
        case GL_COMPRESSED_RGB8_ETC2:
        {
            switch (angleFormat)
            {
                case FormatID::ETC2_R8G8B8_UNORM_BLOCK:
                    return COMPRESSED_RGB8_ETC2_to_ETC2_R8G8B8_UNORM_BLOCK;
                case FormatID::R8G8B8A8_UNORM:
                    return COMPRESSED_RGB8_ETC2_to_R8G8B8A8_UNORM;
                default:
                    break;
            }
            break;
        }
        case GL_COMPRESSED_RGB8_LOSSY_DECODE_ETC2_ANGLE:
        {
            switch (angleFormat)
            {
                case FormatID::BC1_RGB_UNORM_BLOCK:
                    return COMPRESSED_RGB8_LOSSY_DECODE_ETC2_ANGLE_to_BC1_RGB_UNORM_BLOCK;
                default:
                    break;
            }
            break;
        }
        case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
        {
            switch (angleFormat)
            {
                case FormatID::ETC2_R8G8B8A1_UNORM_BLOCK:
                    return COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2_to_ETC2_R8G8B8A1_UNORM_BLOCK;
                case FormatID::R8G8B8A8_UNORM:
                    return COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2_to_R8G8B8A8_UNORM;
                default:
                    break;
            }
            break;
        }
        case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE:
        {
            switch (angleFormat)
            {
                case FormatID::BC1_RGBA_UNORM_BLOCK:
                    return COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE_to_BC1_RGBA_UNORM_BLOCK;
                default:
                    break;
            }
            break;
        }
        case GL_COMPRESSED_RGBA8_ETC2_EAC:
        {
            switch (angleFormat)
            {
                case FormatID::ETC2_R8G8B8A8_UNORM_BLOCK:
                    return COMPRESSED_RGBA8_ETC2_EAC_to_ETC2_R8G8B8A8_UNORM_BLOCK;
                case FormatID::R8G8B8A8_UNORM:
                    return COMPRESSED_RGBA8_ETC2_EAC_to_R8G8B8A8_UNORM;
                default:
                    break;
            }
            break;
        }
        case GL_COMPRESSED_RGBA_ASTC_10x10_KHR:
            return COMPRESSED_RGBA_ASTC_10x10_KHR_to_default;
        case GL_COMPRESSED_RGBA_ASTC_10x5_KHR:
            return COMPRESSED_RGBA_ASTC_10x5_KHR_to_default;
        case GL_COMPRESSED_RGBA_ASTC_10x6_KHR:
            return COMPRESSED_RGBA_ASTC_10x6_KHR_to_default;
        case GL_COMPRESSED_RGBA_ASTC_10x8_KHR:
            return COMPRESSED_RGBA_ASTC_10x8_KHR_to_default;
        case GL_COMPRESSED_RGBA_ASTC_12x10_KHR:
            return COMPRESSED_RGBA_ASTC_12x10_KHR_to_default;
        case GL_COMPRESSED_RGBA_ASTC_12x12_KHR:
            return COMPRESSED_RGBA_ASTC_12x12_KHR_to_default;
        case GL_COMPRESSED_RGBA_ASTC_3x3x3_OES:
            return COMPRESSED_RGBA_ASTC_3x3x3_OES_to_default;
        case GL_COMPRESSED_RGBA_ASTC_4x3x3_OES:
            return COMPRESSED_RGBA_ASTC_4x3x3_OES_to_default;
        case GL_COMPRESSED_RGBA_ASTC_4x4_KHR:
            return COMPRESSED_RGBA_ASTC_4x4_KHR_to_default;
        case GL_COMPRESSED_RGBA_ASTC_4x4x3_OES:
            return COMPRESSED_RGBA_ASTC_4x4x3_OES_to_default;
        case GL_COMPRESSED_RGBA_ASTC_4x4x4_OES:
            return COMPRESSED_RGBA_ASTC_4x4x4_OES_to_default;
        case GL_COMPRESSED_RGBA_ASTC_5x4_KHR:
            return COMPRESSED_RGBA_ASTC_5x4_KHR_to_default;
        case GL_COMPRESSED_RGBA_ASTC_5x4x4_OES:
            return COMPRESSED_RGBA_ASTC_5x4x4_OES_to_default;
        case GL_COMPRESSED_RGBA_ASTC_5x5_KHR:
            return COMPRESSED_RGBA_ASTC_5x5_KHR_to_default;
        case GL_COMPRESSED_RGBA_ASTC_5x5x4_OES:
            return COMPRESSED_RGBA_ASTC_5x5x4_OES_to_default;
        case GL_COMPRESSED_RGBA_ASTC_5x5x5_OES:
            return COMPRESSED_RGBA_ASTC_5x5x5_OES_to_default;
        case GL_COMPRESSED_RGBA_ASTC_6x5_KHR:
            return COMPRESSED_RGBA_ASTC_6x5_KHR_to_default;
        case GL_COMPRESSED_RGBA_ASTC_6x5x5_OES:
            return COMPRESSED_RGBA_ASTC_6x5x5_OES_to_default;
        case GL_COMPRESSED_RGBA_ASTC_6x6_KHR:
            return COMPRESSED_RGBA_ASTC_6x6_KHR_to_default;
        case GL_COMPRESSED_RGBA_ASTC_6x6x5_OES:
            return COMPRESSED_RGBA_ASTC_6x6x5_OES_to_default;
        case GL_COMPRESSED_RGBA_ASTC_6x6x6_OES:
            return COMPRESSED_RGBA_ASTC_6x6x6_OES_to_default;
        case GL_COMPRESSED_RGBA_ASTC_8x5_KHR:
            return COMPRESSED_RGBA_ASTC_8x5_KHR_to_default;
        case GL_COMPRESSED_RGBA_ASTC_8x6_KHR:
            return COMPRESSED_RGBA_ASTC_8x6_KHR_to_default;
        case GL_COMPRESSED_RGBA_ASTC_8x8_KHR:
            return COMPRESSED_RGBA_ASTC_8x8_KHR_to_default;
        case GL_COMPRESSED_RGBA_BPTC_UNORM_EXT:
            return COMPRESSED_RGBA_BPTC_UNORM_EXT_to_default;
        case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
            return COMPRESSED_RGBA_S3TC_DXT1_EXT_to_default;
        case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
            return COMPRESSED_RGBA_S3TC_DXT3_ANGLE_to_default;
        case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
            return COMPRESSED_RGBA_S3TC_DXT5_ANGLE_to_default;
        case GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT:
            return COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT_to_default;
        case GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT:
            return COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT_to_default;
        case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
            return COMPRESSED_RGB_S3TC_DXT1_EXT_to_default;
        case GL_COMPRESSED_SIGNED_R11_EAC:
        {
            switch (angleFormat)
            {
                case FormatID::EAC_R11_SNORM_BLOCK:
                    return COMPRESSED_SIGNED_R11_EAC_to_EAC_R11_SNORM_BLOCK;
                case FormatID::R16_FLOAT:
                    return COMPRESSED_SIGNED_R11_EAC_to_R16_FLOAT;
                case FormatID::R16_SNORM:
                    return COMPRESSED_SIGNED_R11_EAC_to_R16_SNORM;
                default:
                    break;
            }
            break;
        }
        case GL_COMPRESSED_SIGNED_RG11_EAC:
        {
            switch (angleFormat)
            {
                case FormatID::EAC_R11G11_SNORM_BLOCK:
                    return COMPRESSED_SIGNED_RG11_EAC_to_EAC_R11G11_SNORM_BLOCK;
                case FormatID::R16G16_FLOAT:
                    return COMPRESSED_SIGNED_RG11_EAC_to_R16G16_FLOAT;
                case FormatID::R16G16_SNORM:
                    return COMPRESSED_SIGNED_RG11_EAC_to_R16G16_SNORM;
                default:
                    break;
            }
            break;
        }
        case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:
            return COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR_to_default;
        case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:
            return COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR_to_default;
        case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:
            return COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR_to_default;
        case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:
            return COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR_to_default;
        case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:
            return COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR_to_default;
        case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:
            return COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR_to_default;
        case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_3x3x3_OES:
            return COMPRESSED_SRGB8_ALPHA8_ASTC_3x3x3_OES_to_default;
        case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x3x3_OES:
            return COMPRESSED_SRGB8_ALPHA8_ASTC_4x3x3_OES_to_default;
        case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:
            return COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR_to_default;
        case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x3_OES:
            return COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x3_OES_to_default;
        case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x4_OES:
            return COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x4_OES_to_default;
        case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:
            return COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR_to_default;
        case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4x4_OES:
            return COMPRESSED_SRGB8_ALPHA8_ASTC_5x4x4_OES_to_default;
        case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:
            return COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR_to_default;
        case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x4_OES:
            return COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x4_OES_to_default;
        case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x5_OES:
            return COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x5_OES_to_default;
        case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:
            return COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR_to_default;
        case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5x5_OES:
            return COMPRESSED_SRGB8_ALPHA8_ASTC_6x5x5_OES_to_default;
        case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:
            return COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR_to_default;
        case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x5_OES:
            return COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x5_OES_to_default;
        case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x6_OES:
            return COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x6_OES_to_default;
        case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:
            return COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR_to_default;
        case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:
            return COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR_to_default;
        case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:
            return COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR_to_default;
        case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
        {
            switch (angleFormat)
            {
                case FormatID::ETC2_R8G8B8A8_SRGB_BLOCK:
                    return COMPRESSED_SRGB8_ALPHA8_ETC2_EAC_to_ETC2_R8G8B8A8_SRGB_BLOCK;
                case FormatID::R8G8B8A8_UNORM_SRGB:
                    return COMPRESSED_SRGB8_ALPHA8_ETC2_EAC_to_R8G8B8A8_UNORM_SRGB;
                default:
                    break;
            }
            break;
        }
        case GL_COMPRESSED_SRGB8_ETC2:
        {
            switch (angleFormat)
            {
                case FormatID::ETC2_R8G8B8_SRGB_BLOCK:
                    return COMPRESSED_SRGB8_ETC2_to_ETC2_R8G8B8_SRGB_BLOCK;
                case FormatID::R8G8B8A8_UNORM_SRGB:
                    return COMPRESSED_SRGB8_ETC2_to_R8G8B8A8_UNORM_SRGB;
                default:
                    break;
            }
            break;
        }
        case GL_COMPRESSED_SRGB8_LOSSY_DECODE_ETC2_ANGLE:
        {
            switch (angleFormat)
            {
                case FormatID::BC1_RGB_UNORM_SRGB_BLOCK:
                    return COMPRESSED_SRGB8_LOSSY_DECODE_ETC2_ANGLE_to_BC1_RGB_UNORM_SRGB_BLOCK;
                default:
                    break;
            }
            break;
        }
        case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
        {
            switch (angleFormat)
            {
                case FormatID::ETC2_R8G8B8A1_SRGB_BLOCK:
                    return COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2_to_ETC2_R8G8B8A1_SRGB_BLOCK;
                case FormatID::R8G8B8A8_UNORM_SRGB:
                    return COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2_to_R8G8B8A8_UNORM_SRGB;
                default:
                    break;
            }
            break;
        }
        case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE:
        {
            switch (angleFormat)
            {
                case FormatID::BC1_RGBA_UNORM_SRGB_BLOCK:
                    return COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE_to_BC1_RGBA_UNORM_SRGB_BLOCK;
                default:
                    break;
            }
            break;
        }
        case GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT:
            return COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT_to_default;
        case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
            return COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT_to_default;
        case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
            return COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT_to_default;
        case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
            return COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT_to_default;
        case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
            return COMPRESSED_SRGB_S3TC_DXT1_EXT_to_default;
        case GL_DEPTH24_STENCIL8:
        {
            switch (angleFormat)
            {
                case FormatID::D24_UNORM_S8_UINT:
                    return DEPTH24_STENCIL8_to_D24_UNORM_S8_UINT;
                case FormatID::D32_FLOAT_S8X24_UINT:
                    return DEPTH24_STENCIL8_to_D32_FLOAT_S8X24_UINT;
                default:
                    break;
            }
            break;
        }
        case GL_DEPTH32F_STENCIL8:
        {
            switch (angleFormat)
            {
                case FormatID::D24_UNORM_S8_UINT:
                    return DEPTH32F_STENCIL8_to_D24_UNORM_S8_UINT;
                case FormatID::D32_FLOAT_S8X24_UINT:
                    return DEPTH32F_STENCIL8_to_D32_FLOAT_S8X24_UINT;
                default:
                    break;
            }
            break;
        }
        case GL_DEPTH_COMPONENT16:
        {
            switch (angleFormat)
            {
                case FormatID::D16_UNORM:
                    return DEPTH_COMPONENT16_to_D16_UNORM;
                default:
                    break;
            }
            break;
        }
        case GL_DEPTH_COMPONENT24:
        {
            switch (angleFormat)
            {
                case FormatID::D24_UNORM_S8_UINT:
                    return DEPTH_COMPONENT24_to_D24_UNORM_S8_UINT;
                case FormatID::D32_FLOAT_S8X24_UINT:
                    return DEPTH_COMPONENT24_to_D32_FLOAT_S8X24_UINT;
                default:
                    break;
            }
            break;
        }
        case GL_DEPTH_COMPONENT32F:
        {
            switch (angleFormat)
            {
                case FormatID::D32_FLOAT:
                    return DEPTH_COMPONENT32F_to_D32_FLOAT;
                default:
                    break;
            }
            break;
        }
        case GL_DEPTH_COMPONENT32_OES:
        {
            switch (angleFormat)
            {
                case FormatID::D32_FLOAT:
                    return DEPTH_COMPONENT32_OES_to_D32_FLOAT;
                default:
                    return DEPTH_COMPONENT32_OES_to_default;
            }
        }
        case GL_ETC1_RGB8_LOSSY_DECODE_ANGLE:
        {
            switch (angleFormat)
            {
                case FormatID::BC1_RGB_UNORM_BLOCK:
                    return ETC1_RGB8_LOSSY_DECODE_ANGLE_to_BC1_RGB_UNORM_BLOCK;
                default:
                    break;
            }
            break;
        }
        case GL_ETC1_RGB8_OES:
        {
            switch (angleFormat)
            {
                case FormatID::ETC1_R8G8B8_UNORM_BLOCK:
                    return ETC1_RGB8_OES_to_ETC1_R8G8B8_UNORM_BLOCK;
                case FormatID::ETC2_R8G8B8_UNORM_BLOCK:
                    return ETC1_RGB8_OES_to_ETC2_R8G8B8_UNORM_BLOCK;
                case FormatID::R8G8B8A8_UNORM:
                    return ETC1_RGB8_OES_to_R8G8B8A8_UNORM;
                default:
                    break;
            }
            break;
        }
        case GL_LUMINANCE:
        {
            switch (angleFormat)
            {
                case FormatID::R16G16B16A16_FLOAT:
                    return LUMINANCE_to_R16G16B16A16_FLOAT;
                case FormatID::R32G32B32A32_FLOAT:
                    return LUMINANCE_to_R32G32B32A32_FLOAT;
                default:
                    return LUMINANCE_to_default;
            }
        }
        case GL_LUMINANCE16F_EXT:
        {
            switch (angleFormat)
            {
                case FormatID::R16_FLOAT:
                    return LUMINANCE16F_EXT_to_R16_FLOAT;
                default:
                    return LUMINANCE16F_EXT_to_default;
            }
        }
        case GL_LUMINANCE32F_EXT:
        {
            switch (angleFormat)
            {
                case FormatID::R32_FLOAT:
                    return LUMINANCE32F_EXT_to_R32_FLOAT;
                default:
                    return LUMINANCE32F_EXT_to_default;
            }
        }
        case GL_LUMINANCE8_ALPHA8_EXT:
        {
            switch (angleFormat)
            {
                case FormatID::R8G8B8A8_UNORM:
                    return LUMINANCE8_ALPHA8_EXT_to_R8G8B8A8_UNORM;
                case FormatID::R8G8_UNORM:
                    return LUMINANCE8_ALPHA8_EXT_to_R8G8_UNORM;
                default:
                    break;
            }
            break;
        }
        case GL_LUMINANCE8_EXT:
        {
            switch (angleFormat)
            {
                case FormatID::R8G8B8A8_UNORM:
                    return LUMINANCE8_EXT_to_R8G8B8A8_UNORM;
                case FormatID::R8_UNORM:
                    return LUMINANCE8_EXT_to_R8_UNORM;
                default:
                    break;
            }
            break;
        }
        case GL_LUMINANCE_ALPHA:
        {
            switch (angleFormat)
            {
                case FormatID::R16G16B16A16_FLOAT:
                    return LUMINANCE_ALPHA_to_R16G16B16A16_FLOAT;
                case FormatID::R32G32B32A32_FLOAT:
                    return LUMINANCE_ALPHA_to_R32G32B32A32_FLOAT;
                default:
                    return LUMINANCE_ALPHA_to_default;
            }
        }
        case GL_LUMINANCE_ALPHA16F_EXT:
        {
            switch (angleFormat)
            {
                case FormatID::R16G16_FLOAT:
                    return LUMINANCE_ALPHA16F_EXT_to_R16G16_FLOAT;
                default:
                    return LUMINANCE_ALPHA16F_EXT_to_default;
            }
        }
        case GL_LUMINANCE_ALPHA32F_EXT:
        {
            switch (angleFormat)
            {
                case FormatID::R32G32_FLOAT:
                    return LUMINANCE_ALPHA32F_EXT_to_R32G32_FLOAT;
                default:
                    return LUMINANCE_ALPHA32F_EXT_to_default;
            }
        }
        case GL_R11F_G11F_B10F:
        {
            switch (angleFormat)
            {
                case FormatID::R11G11B10_FLOAT:
                    return R11F_G11F_B10F_to_R11G11B10_FLOAT;
                default:
                    break;
            }
            break;
        }
        case GL_R16F:
        {
            switch (angleFormat)
            {
                case FormatID::R16_FLOAT:
                    return R16F_to_R16_FLOAT;
                default:
                    break;
            }
            break;
        }
        case GL_R16I:
        {
            switch (angleFormat)
            {
                case FormatID::R16_SINT:
                    return R16I_to_R16_SINT;
                default:
                    break;
            }
            break;
        }
        case GL_R16UI:
        {
            switch (angleFormat)
            {
                case FormatID::R16_UINT:
                    return R16UI_to_R16_UINT;
                default:
                    break;
            }
            break;
        }
        case GL_R16_EXT:
        {
            switch (angleFormat)
            {
                case FormatID::R16_UNORM:
                    return R16_EXT_to_R16_UNORM;
                default:
                    break;
            }
            break;
        }
        case GL_R16_SNORM_EXT:
        {
            switch (angleFormat)
            {
                case FormatID::R16_SNORM:
                    return R16_SNORM_EXT_to_R16_SNORM;
                default:
                    break;
            }
            break;
        }
        case GL_R16_SSCALED_ANGLEX:
            return R16_SSCALED_ANGLEX_to_default;
        case GL_R16_USCALED_ANGLEX:
            return R16_USCALED_ANGLEX_to_default;
        case GL_R32F:
        {
            switch (angleFormat)
            {
                case FormatID::R32_FLOAT:
                    return R32F_to_R32_FLOAT;
                default:
                    break;
            }
            break;
        }
        case GL_R32I:
        {
            switch (angleFormat)
            {
                case FormatID::R32_SINT:
                    return R32I_to_R32_SINT;
                default:
                    break;
            }
            break;
        }
        case GL_R32UI:
        {
            switch (angleFormat)
            {
                case FormatID::R32_UINT:
                    return R32UI_to_R32_UINT;
                default:
                    break;
            }
            break;
        }
        case GL_R8:
        {
            switch (angleFormat)
            {
                case FormatID::R8_UNORM:
                    return R8_to_R8_UNORM;
                default:
                    break;
            }
            break;
        }
        case GL_R8I:
        {
            switch (angleFormat)
            {
                case FormatID::R8_SINT:
                    return R8I_to_R8_SINT;
                default:
                    break;
            }
            break;
        }
        case GL_R8UI:
        {
            switch (angleFormat)
            {
                case FormatID::R8_UINT:
                    return R8UI_to_R8_UINT;
                default:
                    break;
            }
            break;
        }
        case GL_R8_SNORM:
        {
            switch (angleFormat)
            {
                case FormatID::R8_SNORM:
                    return R8_SNORM_to_R8_SNORM;
                default:
                    break;
            }
            break;
        }
        case GL_R8_SSCALED_ANGLEX:
            return R8_SSCALED_ANGLEX_to_default;
        case GL_R8_USCALED_ANGLEX:
            return R8_USCALED_ANGLEX_to_default;
        case GL_RG16F:
        {
            switch (angleFormat)
            {
                case FormatID::R16G16_FLOAT:
                    return RG16F_to_R16G16_FLOAT;
                default:
                    break;
            }
            break;
        }
        case GL_RG16I:
        {
            switch (angleFormat)
            {
                case FormatID::R16G16_SINT:
                    return RG16I_to_R16G16_SINT;
                default:
                    break;
            }
            break;
        }
        case GL_RG16UI:
        {
            switch (angleFormat)
            {
                case FormatID::R16G16_UINT:
                    return RG16UI_to_R16G16_UINT;
                default:
                    break;
            }
            break;
        }
        case GL_RG16_EXT:
        {
            switch (angleFormat)
            {
                case FormatID::R16G16_UNORM:
                    return RG16_EXT_to_R16G16_UNORM;
                default:
                    break;
            }
            break;
        }
        case GL_RG16_SNORM_EXT:
        {
            switch (angleFormat)
            {
                case FormatID::R16G16_SNORM:
                    return RG16_SNORM_EXT_to_R16G16_SNORM;
                default:
                    break;
            }
            break;
        }
        case GL_RG16_SSCALED_ANGLEX:
            return RG16_SSCALED_ANGLEX_to_default;
        case GL_RG16_USCALED_ANGLEX:
            return RG16_USCALED_ANGLEX_to_default;
        case GL_RG32F:
        {
            switch (angleFormat)
            {
                case FormatID::R32G32_FLOAT:
                    return RG32F_to_R32G32_FLOAT;
                default:
                    break;
            }
            break;
        }
        case GL_RG32I:
        {
            switch (angleFormat)
            {
                case FormatID::R32G32_SINT:
                    return RG32I_to_R32G32_SINT;
                default:
                    break;
            }
            break;
        }
        case GL_RG32UI:
        {
            switch (angleFormat)
            {
                case FormatID::R32G32_UINT:
                    return RG32UI_to_R32G32_UINT;
                default:
                    break;
            }
            break;
        }
        case GL_RG8:
        {
            switch (angleFormat)
            {
                case FormatID::R8G8_UNORM:
                    return RG8_to_R8G8_UNORM;
                default:
                    break;
            }
            break;
        }
        case GL_RG8I:
        {
            switch (angleFormat)
            {
                case FormatID::R8G8_SINT:
                    return RG8I_to_R8G8_SINT;
                default:
                    break;
            }
            break;
        }
        case GL_RG8UI:
        {
            switch (angleFormat)
            {
                case FormatID::R8G8_UINT:
                    return RG8UI_to_R8G8_UINT;
                default:
                    break;
            }
            break;
        }
        case GL_RG8_SNORM:
        {
            switch (angleFormat)
            {
                case FormatID::R8G8_SNORM:
                    return RG8_SNORM_to_R8G8_SNORM;
                default:
                    break;
            }
            break;
        }
        case GL_RG8_SSCALED_ANGLEX:
            return RG8_SSCALED_ANGLEX_to_default;
        case GL_RG8_USCALED_ANGLEX:
            return RG8_USCALED_ANGLEX_to_default;
        case GL_RGB:
            return RGB_to_default;
        case GL_RGB10_A2:
        {
            switch (angleFormat)
            {
                case FormatID::R10G10B10A2_UNORM:
                    return RGB10_A2_to_R10G10B10A2_UNORM;
                default:
                    break;
            }
            break;
        }
        case GL_RGB10_A2UI:
        {
            switch (angleFormat)
            {
                case FormatID::R10G10B10A2_UINT:
                    return RGB10_A2UI_to_R10G10B10A2_UINT;
                default:
                    break;
            }
            break;
        }
        case GL_RGB10_A2_SINT_ANGLEX:
        {
            switch (angleFormat)
            {
                case FormatID::R10G10B10A2_SINT:
                    return RGB10_A2_SINT_ANGLEX_to_R10G10B10A2_SINT;
                default:
                    break;
            }
            break;
        }
        case GL_RGB10_A2_SNORM_ANGLEX:
        {
            switch (angleFormat)
            {
                case FormatID::R10G10B10A2_SNORM:
                    return RGB10_A2_SNORM_ANGLEX_to_R10G10B10A2_SNORM;
                default:
                    break;
            }
            break;
        }
        case GL_RGB10_A2_SSCALED_ANGLEX:
            return RGB10_A2_SSCALED_ANGLEX_to_default;
        case GL_RGB10_A2_USCALED_ANGLEX:
            return RGB10_A2_USCALED_ANGLEX_to_default;
        case GL_RGB10_UNORM_ANGLEX:
        {
            switch (angleFormat)
            {
                case FormatID::R10G10B10A2_UNORM:
                    return RGB10_UNORM_ANGLEX_to_R10G10B10A2_UNORM;
                default:
                    break;
            }
            break;
        }
        case GL_RGB16F:
        {
            switch (angleFormat)
            {
                case FormatID::R16G16B16A16_FLOAT:
                    return RGB16F_to_R16G16B16A16_FLOAT;
                case FormatID::R16G16B16_FLOAT:
                    return RGB16F_to_R16G16B16_FLOAT;
                default:
                    break;
            }
            break;
        }
        case GL_RGB16I:
        {
            switch (angleFormat)
            {
                case FormatID::R16G16B16A16_SINT:
                    return RGB16I_to_R16G16B16A16_SINT;
                case FormatID::R16G16B16_SINT:
                    return RGB16I_to_R16G16B16_SINT;
                default:
                    break;
            }
            break;
        }
        case GL_RGB16UI:
        {
            switch (angleFormat)
            {
                case FormatID::R16G16B16A16_UINT:
                    return RGB16UI_to_R16G16B16A16_UINT;
                case FormatID::R16G16B16_UINT:
                    return RGB16UI_to_R16G16B16_UINT;
                default:
                    break;
            }
            break;
        }
        case GL_RGB16_EXT:
        {
            switch (angleFormat)
            {
                case FormatID::R16G16B16A16_UNORM:
                    return RGB16_EXT_to_R16G16B16A16_UNORM;
                case FormatID::R16G16B16_UNORM:
                    return RGB16_EXT_to_R16G16B16_UNORM;
                default:
                    break;
            }
            break;
        }
        case GL_RGB16_SNORM_EXT:
        {
            switch (angleFormat)
            {
                case FormatID::R16G16B16A16_SNORM:
                    return RGB16_SNORM_EXT_to_R16G16B16A16_SNORM;
                case FormatID::R16G16B16_SNORM:
                    return RGB16_SNORM_EXT_to_R16G16B16_SNORM;
                default:
                    break;
            }
            break;
        }
        case GL_RGB16_SSCALED_ANGLEX:
            return RGB16_SSCALED_ANGLEX_to_default;
        case GL_RGB16_USCALED_ANGLEX:
            return RGB16_USCALED_ANGLEX_to_default;
        case GL_RGB32F:
        {
            switch (angleFormat)
            {
                case FormatID::R32G32B32A32_FLOAT:
                    return RGB32F_to_R32G32B32A32_FLOAT;
                case FormatID::R32G32B32_FLOAT:
                    return RGB32F_to_R32G32B32_FLOAT;
                default:
                    break;
            }
            break;
        }
        case GL_RGB32I:
        {
            switch (angleFormat)
            {
                case FormatID::R32G32B32A32_SINT:
                    return RGB32I_to_R32G32B32A32_SINT;
                case FormatID::R32G32B32_SINT:
                    return RGB32I_to_R32G32B32_SINT;
                default:
                    break;
            }
            break;
        }
        case GL_RGB32UI:
        {
            switch (angleFormat)
            {
                case FormatID::R32G32B32A32_UINT:
                    return RGB32UI_to_R32G32B32A32_UINT;
                case FormatID::R32G32B32_UINT:
                    return RGB32UI_to_R32G32B32_UINT;
                default:
                    break;
            }
            break;
        }
        case GL_RGB565:
        {
            switch (angleFormat)
            {
                case FormatID::B5G6R5_UNORM:
                    return RGB565_to_B5G6R5_UNORM;
                case FormatID::R5G6B5_UNORM:
                    return RGB565_to_R5G6B5_UNORM;
                case FormatID::R8G8B8A8_UNORM:
                    return RGB565_to_R8G8B8A8_UNORM;
                default:
                    break;
            }
            break;
        }
        case GL_RGB5_A1:
        {
            switch (angleFormat)
            {
                case FormatID::A1R5G5B5_UNORM:
                    return RGB5_A1_to_A1R5G5B5_UNORM;
                case FormatID::B5G5R5A1_UNORM:
                    return RGB5_A1_to_B5G5R5A1_UNORM;
                case FormatID::R5G5B5A1_UNORM:
                    return RGB5_A1_to_R5G5B5A1_UNORM;
                case FormatID::R8G8B8A8_UNORM:
                    return RGB5_A1_to_R8G8B8A8_UNORM;
                default:
                    break;
            }
            break;
        }
        case GL_RGB8:
        {
            switch (angleFormat)
            {
                case FormatID::R8G8B8A8_UNORM:
                    return RGB8_to_R8G8B8A8_UNORM;
                case FormatID::R8G8B8_UNORM:
                    return RGB8_to_R8G8B8_UNORM;
                default:
                    break;
            }
            break;
        }
        case GL_RGB8I:
        {
            switch (angleFormat)
            {
                case FormatID::R8G8B8A8_SINT:
                    return RGB8I_to_R8G8B8A8_SINT;
                case FormatID::R8G8B8_SINT:
                    return RGB8I_to_R8G8B8_SINT;
                default:
                    break;
            }
            break;
        }
        case GL_RGB8UI:
        {
            switch (angleFormat)
            {
                case FormatID::R8G8B8A8_UINT:
                    return RGB8UI_to_R8G8B8A8_UINT;
                case FormatID::R8G8B8_UINT:
                    return RGB8UI_to_R8G8B8_UINT;
                default:
                    break;
            }
            break;
        }
        case GL_RGB8_SNORM:
        {
            switch (angleFormat)
            {
                case FormatID::R8G8B8A8_SNORM:
                    return RGB8_SNORM_to_R8G8B8A8_SNORM;
                case FormatID::R8G8B8_SNORM:
                    return RGB8_SNORM_to_R8G8B8_SNORM;
                default:
                    break;
            }
            break;
        }
        case GL_RGB8_SSCALED_ANGLEX:
            return RGB8_SSCALED_ANGLEX_to_default;
        case GL_RGB8_USCALED_ANGLEX:
            return RGB8_USCALED_ANGLEX_to_default;
        case GL_RGB9_E5:
        {
            switch (angleFormat)
            {
                case FormatID::R9G9B9E5_SHAREDEXP:
                    return RGB9_E5_to_R9G9B9E5_SHAREDEXP;
                default:
                    break;
            }
            break;
        }
        case GL_RGBA:
            return RGBA_to_default;
        case GL_RGBA16F:
        {
            switch (angleFormat)
            {
                case FormatID::R16G16B16A16_FLOAT:
                    return RGBA16F_to_R16G16B16A16_FLOAT;
                default:
                    break;
            }
            break;
        }
        case GL_RGBA16I:
        {
            switch (angleFormat)
            {
                case FormatID::R16G16B16A16_SINT:
                    return RGBA16I_to_R16G16B16A16_SINT;
                default:
                    break;
            }
            break;
        }
        case GL_RGBA16UI:
        {
            switch (angleFormat)
            {
                case FormatID::R16G16B16A16_UINT:
                    return RGBA16UI_to_R16G16B16A16_UINT;
                default:
                    break;
            }
            break;
        }
        case GL_RGBA16_EXT:
        {
            switch (angleFormat)
            {
                case FormatID::R16G16B16A16_UNORM:
                    return RGBA16_EXT_to_R16G16B16A16_UNORM;
                default:
                    break;
            }
            break;
        }
        case GL_RGBA16_SNORM_EXT:
        {
            switch (angleFormat)
            {
                case FormatID::R16G16B16A16_SNORM:
                    return RGBA16_SNORM_EXT_to_R16G16B16A16_SNORM;
                default:
                    break;
            }
            break;
        }
        case GL_RGBA16_SSCALED_ANGLEX:
            return RGBA16_SSCALED_ANGLEX_to_default;
        case GL_RGBA16_USCALED_ANGLEX:
            return RGBA16_USCALED_ANGLEX_to_default;
        case GL_RGBA32F:
        {
            switch (angleFormat)
            {
                case FormatID::R32G32B32A32_FLOAT:
                    return RGBA32F_to_R32G32B32A32_FLOAT;
                default:
                    break;
            }
            break;
        }
        case GL_RGBA32I:
        {
            switch (angleFormat)
            {
                case FormatID::R32G32B32A32_SINT:
                    return RGBA32I_to_R32G32B32A32_SINT;
                default:
                    break;
            }
            break;
        }
        case GL_RGBA32UI:
        {
            switch (angleFormat)
            {
                case FormatID::R32G32B32A32_UINT:
                    return RGBA32UI_to_R32G32B32A32_UINT;
                default:
                    break;
            }
            break;
        }
        case GL_RGBA4:
        {
            switch (angleFormat)
            {
                case FormatID::B4G4R4A4_UNORM:
                    return RGBA4_to_B4G4R4A4_UNORM;
                case FormatID::R4G4B4A4_UNORM:
                    return RGBA4_to_R4G4B4A4_UNORM;
                case FormatID::R8G8B8A8_UNORM:
                    return RGBA4_to_R8G8B8A8_UNORM;
                default:
                    break;
            }
            break;
        }
        case GL_RGBA8:
        {
            switch (angleFormat)
            {
                case FormatID::R8G8B8A8_UNORM:
                    return RGBA8_to_R8G8B8A8_UNORM;
                default:
                    break;
            }
            break;
        }
        case GL_RGBA8I:
        {
            switch (angleFormat)
            {
                case FormatID::R8G8B8A8_SINT:
                    return RGBA8I_to_R8G8B8A8_SINT;
                default:
                    break;
            }
            break;
        }
        case GL_RGBA8UI:
        {
            switch (angleFormat)
            {
                case FormatID::R8G8B8A8_UINT:
                    return RGBA8UI_to_R8G8B8A8_UINT;
                default:
                    break;
            }
            break;
        }
        case GL_RGBA8_SNORM:
        {
            switch (angleFormat)
            {
                case FormatID::R8G8B8A8_SNORM:
                    return RGBA8_SNORM_to_R8G8B8A8_SNORM;
                default:
                    break;
            }
            break;
        }
        case GL_RGBA8_SSCALED_ANGLEX:
            return RGBA8_SSCALED_ANGLEX_to_default;
        case GL_RGBA8_USCALED_ANGLEX:
            return RGBA8_USCALED_ANGLEX_to_default;
        case GL_SRGB8:
        {
            switch (angleFormat)
            {
                case FormatID::R8G8B8A8_UNORM_SRGB:
                    return SRGB8_to_R8G8B8A8_UNORM_SRGB;
                case FormatID::R8G8B8_UNORM_SRGB:
                    return SRGB8_to_R8G8B8_UNORM_SRGB;
                default:
                    break;
            }
            break;
        }
        case GL_SRGB8_ALPHA8:
        {
            switch (angleFormat)
            {
                case FormatID::R8G8B8A8_UNORM_SRGB:
                    return SRGB8_ALPHA8_to_R8G8B8A8_UNORM_SRGB;
                default:
                    break;
            }
            break;
        }
        case GL_STENCIL_INDEX8:
            return STENCIL_INDEX8_to_default;

        default:
            break;
    }
    // clang-format on
    ASSERT(internalFormat == GL_NONE || angleFormat == angle::FormatID::NONE);
    static LoadFunctionMap emptyLoadFunctionsMap;
    return emptyLoadFunctionsMap;

}  // GetLoadFunctionsMap

}  // namespace angle
