// GENERATED FILE - DO NOT EDIT.
// Generated by gen_vk_internal_shaders.py using data from shaders/src/*
//
// Copyright 2018 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.
//
// vk_internal_shaders_autogen.cpp:
//   Pre-generated shader library for the ANGLE Vulkan back-end.

#include "libANGLE/renderer/vulkan/vk_internal_shaders_autogen.h"

#define USE_SYSTEM_ZLIB
#include "compression_utils_portable.h"

namespace rx
{
namespace vk
{
namespace
{
#include "libANGLE/renderer/vulkan/shaders/gen/Blit3DSrc.frag.00000000.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/Blit3DSrc.frag.00000001.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/Blit3DSrc.frag.00000002.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/BlitResolve.frag.00000000.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/BlitResolve.frag.00000001.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/BlitResolve.frag.00000002.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/BlitResolve.frag.00000003.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/BlitResolve.frag.00000004.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/BlitResolve.frag.00000005.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/BlitResolve.frag.00000006.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/BlitResolve.frag.00000007.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/BlitResolve.frag.00000008.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/BlitResolve.frag.00000009.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/BlitResolve.frag.0000000A.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/BlitResolve.frag.0000000B.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/BlitResolve.frag.0000000C.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/BlitResolve.frag.0000000D.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/BlitResolve.frag.0000000E.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/BlitResolve.frag.0000000F.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/BlitResolve.frag.00000010.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/BlitResolve.frag.00000011.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/BlitResolve.frag.00000012.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/BlitResolve.frag.00000013.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/BlitResolve.frag.00000014.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/BlitResolve.frag.00000015.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/BlitResolve.frag.00000016.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/BlitResolve.frag.00000017.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/BlitResolveStencilNoExport.comp.00000000.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/BlitResolveStencilNoExport.comp.00000001.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/BlitResolveStencilNoExport.comp.00000002.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/BlitResolveStencilNoExport.comp.00000003.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertIndex.comp.00000000.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertIndex.comp.00000001.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertIndex.comp.00000002.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertIndex.comp.00000003.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertIndexIndirectLineLoop.comp.00000000.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertIndexIndirectLineLoop.comp.00000001.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertIndexIndirectLineLoop.comp.00000002.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertIndirectLineLoop.comp.00000000.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000000.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000001.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000002.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000003.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000004.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000005.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000006.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000007.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/CopyImageToBuffer.comp.00000000.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/CopyImageToBuffer.comp.00000001.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/EtcToBc.comp.00000000.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/EtcToBc.comp.00000001.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ExportStencil.frag.00000000.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/FullScreenTri.vert.00000000.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/GenerateFragmentShadingRate.comp.00000000.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/GenerateMipmap.comp.00000000.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/GenerateMipmap.comp.00000001.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/GenerateMipmap.comp.00000002.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/GenerateMipmap.comp.00000003.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/GenerateMipmap.comp.00000004.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/GenerateMipmap.comp.00000005.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/GenerateMipmap.comp.00000006.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/GenerateMipmap.comp.00000007.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/GenerateMipmap.comp.00000008.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/GenerateMipmap.comp.00000009.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000000.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000001.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000002.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000003.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000004.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000005.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000006.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000007.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000008.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000009.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000A.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000B.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000C.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000D.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000E.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000000F.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000010.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000011.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000012.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000013.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000014.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000015.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000016.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000017.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000018.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000019.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000001A.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000001B.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000001C.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000001D.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000001E.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000001F.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000020.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000021.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000022.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000023.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000024.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000025.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000026.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000027.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000028.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000029.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000002A.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000002B.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000002C.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000002D.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000002E.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.0000002F.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000000.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000001.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000002.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000004.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000005.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000006.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000008.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000009.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000000A.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000010.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000011.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000012.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000014.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000015.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000016.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000018.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000019.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000001A.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000020.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000021.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000022.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000024.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000025.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000026.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000028.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000029.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000002A.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopyFloat.frag.00000000.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopyFloat.frag.00000001.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/OverlayDraw.frag.00000000.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/OverlayDraw.vert.00000000.inc"

// This is compressed SPIR-V binary blob and size
struct CompressedShaderBlob
{
    const uint8_t *code;
    uint32_t size;
};

constexpr CompressedShaderBlob kBlit3DSrc_frag_shaders[] = {
    {kBlit3DSrc_frag_00000000, sizeof(kBlit3DSrc_frag_00000000)},
    {kBlit3DSrc_frag_00000001, sizeof(kBlit3DSrc_frag_00000001)},
    {kBlit3DSrc_frag_00000002, sizeof(kBlit3DSrc_frag_00000002)},
};
constexpr CompressedShaderBlob kBlitResolve_frag_shaders[] = {
    {kBlitResolve_frag_00000000, sizeof(kBlitResolve_frag_00000000)},
    {kBlitResolve_frag_00000001, sizeof(kBlitResolve_frag_00000001)},
    {kBlitResolve_frag_00000002, sizeof(kBlitResolve_frag_00000002)},
    {kBlitResolve_frag_00000003, sizeof(kBlitResolve_frag_00000003)},
    {kBlitResolve_frag_00000004, sizeof(kBlitResolve_frag_00000004)},
    {kBlitResolve_frag_00000005, sizeof(kBlitResolve_frag_00000005)},
    {kBlitResolve_frag_00000006, sizeof(kBlitResolve_frag_00000006)},
    {kBlitResolve_frag_00000007, sizeof(kBlitResolve_frag_00000007)},
    {kBlitResolve_frag_00000008, sizeof(kBlitResolve_frag_00000008)},
    {kBlitResolve_frag_00000009, sizeof(kBlitResolve_frag_00000009)},
    {kBlitResolve_frag_0000000A, sizeof(kBlitResolve_frag_0000000A)},
    {kBlitResolve_frag_0000000B, sizeof(kBlitResolve_frag_0000000B)},
    {kBlitResolve_frag_0000000C, sizeof(kBlitResolve_frag_0000000C)},
    {kBlitResolve_frag_0000000D, sizeof(kBlitResolve_frag_0000000D)},
    {kBlitResolve_frag_0000000E, sizeof(kBlitResolve_frag_0000000E)},
    {kBlitResolve_frag_0000000F, sizeof(kBlitResolve_frag_0000000F)},
    {kBlitResolve_frag_00000010, sizeof(kBlitResolve_frag_00000010)},
    {kBlitResolve_frag_00000011, sizeof(kBlitResolve_frag_00000011)},
    {kBlitResolve_frag_00000012, sizeof(kBlitResolve_frag_00000012)},
    {kBlitResolve_frag_00000013, sizeof(kBlitResolve_frag_00000013)},
    {kBlitResolve_frag_00000014, sizeof(kBlitResolve_frag_00000014)},
    {kBlitResolve_frag_00000015, sizeof(kBlitResolve_frag_00000015)},
    {kBlitResolve_frag_00000016, sizeof(kBlitResolve_frag_00000016)},
    {kBlitResolve_frag_00000017, sizeof(kBlitResolve_frag_00000017)},
};
constexpr CompressedShaderBlob kBlitResolveStencilNoExport_comp_shaders[] = {
    {kBlitResolveStencilNoExport_comp_00000000, sizeof(kBlitResolveStencilNoExport_comp_00000000)},
    {kBlitResolveStencilNoExport_comp_00000001, sizeof(kBlitResolveStencilNoExport_comp_00000001)},
    {kBlitResolveStencilNoExport_comp_00000002, sizeof(kBlitResolveStencilNoExport_comp_00000002)},
    {kBlitResolveStencilNoExport_comp_00000003, sizeof(kBlitResolveStencilNoExport_comp_00000003)},
};
constexpr CompressedShaderBlob kConvertIndex_comp_shaders[] = {
    {kConvertIndex_comp_00000000, sizeof(kConvertIndex_comp_00000000)},
    {kConvertIndex_comp_00000001, sizeof(kConvertIndex_comp_00000001)},
    {kConvertIndex_comp_00000002, sizeof(kConvertIndex_comp_00000002)},
    {kConvertIndex_comp_00000003, sizeof(kConvertIndex_comp_00000003)},
};
constexpr CompressedShaderBlob kConvertIndexIndirectLineLoop_comp_shaders[] = {
    {kConvertIndexIndirectLineLoop_comp_00000000,
     sizeof(kConvertIndexIndirectLineLoop_comp_00000000)},
    {kConvertIndexIndirectLineLoop_comp_00000001,
     sizeof(kConvertIndexIndirectLineLoop_comp_00000001)},
    {kConvertIndexIndirectLineLoop_comp_00000002,
     sizeof(kConvertIndexIndirectLineLoop_comp_00000002)},
};
constexpr CompressedShaderBlob kConvertIndirectLineLoop_comp_shaders[] = {
    {kConvertIndirectLineLoop_comp_00000000, sizeof(kConvertIndirectLineLoop_comp_00000000)},
};
constexpr CompressedShaderBlob kConvertVertex_comp_shaders[] = {
    {kConvertVertex_comp_00000000, sizeof(kConvertVertex_comp_00000000)},
    {kConvertVertex_comp_00000001, sizeof(kConvertVertex_comp_00000001)},
    {kConvertVertex_comp_00000002, sizeof(kConvertVertex_comp_00000002)},
    {kConvertVertex_comp_00000003, sizeof(kConvertVertex_comp_00000003)},
    {kConvertVertex_comp_00000004, sizeof(kConvertVertex_comp_00000004)},
    {kConvertVertex_comp_00000005, sizeof(kConvertVertex_comp_00000005)},
    {kConvertVertex_comp_00000006, sizeof(kConvertVertex_comp_00000006)},
    {kConvertVertex_comp_00000007, sizeof(kConvertVertex_comp_00000007)},
};
constexpr CompressedShaderBlob kCopyImageToBuffer_comp_shaders[] = {
    {kCopyImageToBuffer_comp_00000000, sizeof(kCopyImageToBuffer_comp_00000000)},
    {kCopyImageToBuffer_comp_00000001, sizeof(kCopyImageToBuffer_comp_00000001)},
};
constexpr CompressedShaderBlob kEtcToBc_comp_shaders[] = {
    {kEtcToBc_comp_00000000, sizeof(kEtcToBc_comp_00000000)},
    {kEtcToBc_comp_00000001, sizeof(kEtcToBc_comp_00000001)},
};
constexpr CompressedShaderBlob kExportStencil_frag_shaders[] = {
    {kExportStencil_frag_00000000, sizeof(kExportStencil_frag_00000000)},
};
constexpr CompressedShaderBlob kFullScreenTri_vert_shaders[] = {
    {kFullScreenTri_vert_00000000, sizeof(kFullScreenTri_vert_00000000)},
};
constexpr CompressedShaderBlob kGenerateFragmentShadingRate_comp_shaders[] = {
    {kGenerateFragmentShadingRate_comp_00000000,
     sizeof(kGenerateFragmentShadingRate_comp_00000000)},
};
constexpr CompressedShaderBlob kGenerateMipmap_comp_shaders[] = {
    {kGenerateMipmap_comp_00000000, sizeof(kGenerateMipmap_comp_00000000)},
    {kGenerateMipmap_comp_00000001, sizeof(kGenerateMipmap_comp_00000001)},
    {kGenerateMipmap_comp_00000002, sizeof(kGenerateMipmap_comp_00000002)},
    {kGenerateMipmap_comp_00000003, sizeof(kGenerateMipmap_comp_00000003)},
    {kGenerateMipmap_comp_00000004, sizeof(kGenerateMipmap_comp_00000004)},
    {kGenerateMipmap_comp_00000005, sizeof(kGenerateMipmap_comp_00000005)},
    {kGenerateMipmap_comp_00000006, sizeof(kGenerateMipmap_comp_00000006)},
    {kGenerateMipmap_comp_00000007, sizeof(kGenerateMipmap_comp_00000007)},
    {kGenerateMipmap_comp_00000008, sizeof(kGenerateMipmap_comp_00000008)},
    {kGenerateMipmap_comp_00000009, sizeof(kGenerateMipmap_comp_00000009)},
};
constexpr CompressedShaderBlob kImageClear_frag_shaders[] = {
    {kImageClear_frag_00000000, sizeof(kImageClear_frag_00000000)},
    {kImageClear_frag_00000001, sizeof(kImageClear_frag_00000001)},
    {kImageClear_frag_00000002, sizeof(kImageClear_frag_00000002)},
    {kImageClear_frag_00000003, sizeof(kImageClear_frag_00000003)},
    {kImageClear_frag_00000004, sizeof(kImageClear_frag_00000004)},
    {kImageClear_frag_00000005, sizeof(kImageClear_frag_00000005)},
    {kImageClear_frag_00000006, sizeof(kImageClear_frag_00000006)},
    {kImageClear_frag_00000007, sizeof(kImageClear_frag_00000007)},
    {kImageClear_frag_00000008, sizeof(kImageClear_frag_00000008)},
    {kImageClear_frag_00000009, sizeof(kImageClear_frag_00000009)},
    {kImageClear_frag_0000000A, sizeof(kImageClear_frag_0000000A)},
    {kImageClear_frag_0000000B, sizeof(kImageClear_frag_0000000B)},
    {kImageClear_frag_0000000C, sizeof(kImageClear_frag_0000000C)},
    {kImageClear_frag_0000000D, sizeof(kImageClear_frag_0000000D)},
    {kImageClear_frag_0000000E, sizeof(kImageClear_frag_0000000E)},
    {kImageClear_frag_0000000F, sizeof(kImageClear_frag_0000000F)},
    {kImageClear_frag_00000010, sizeof(kImageClear_frag_00000010)},
    {kImageClear_frag_00000011, sizeof(kImageClear_frag_00000011)},
    {kImageClear_frag_00000012, sizeof(kImageClear_frag_00000012)},
    {kImageClear_frag_00000013, sizeof(kImageClear_frag_00000013)},
    {kImageClear_frag_00000014, sizeof(kImageClear_frag_00000014)},
    {kImageClear_frag_00000015, sizeof(kImageClear_frag_00000015)},
    {kImageClear_frag_00000016, sizeof(kImageClear_frag_00000016)},
    {kImageClear_frag_00000017, sizeof(kImageClear_frag_00000017)},
    {kImageClear_frag_00000018, sizeof(kImageClear_frag_00000018)},
    {kImageClear_frag_00000019, sizeof(kImageClear_frag_00000019)},
    {kImageClear_frag_0000001A, sizeof(kImageClear_frag_0000001A)},
    {kImageClear_frag_0000001B, sizeof(kImageClear_frag_0000001B)},
    {kImageClear_frag_0000001C, sizeof(kImageClear_frag_0000001C)},
    {kImageClear_frag_0000001D, sizeof(kImageClear_frag_0000001D)},
    {kImageClear_frag_0000001E, sizeof(kImageClear_frag_0000001E)},
    {kImageClear_frag_0000001F, sizeof(kImageClear_frag_0000001F)},
    {kImageClear_frag_00000020, sizeof(kImageClear_frag_00000020)},
    {kImageClear_frag_00000021, sizeof(kImageClear_frag_00000021)},
    {kImageClear_frag_00000022, sizeof(kImageClear_frag_00000022)},
    {kImageClear_frag_00000023, sizeof(kImageClear_frag_00000023)},
    {kImageClear_frag_00000024, sizeof(kImageClear_frag_00000024)},
    {kImageClear_frag_00000025, sizeof(kImageClear_frag_00000025)},
    {kImageClear_frag_00000026, sizeof(kImageClear_frag_00000026)},
    {kImageClear_frag_00000027, sizeof(kImageClear_frag_00000027)},
    {kImageClear_frag_00000028, sizeof(kImageClear_frag_00000028)},
    {kImageClear_frag_00000029, sizeof(kImageClear_frag_00000029)},
    {kImageClear_frag_0000002A, sizeof(kImageClear_frag_0000002A)},
    {kImageClear_frag_0000002B, sizeof(kImageClear_frag_0000002B)},
    {kImageClear_frag_0000002C, sizeof(kImageClear_frag_0000002C)},
    {kImageClear_frag_0000002D, sizeof(kImageClear_frag_0000002D)},
    {kImageClear_frag_0000002E, sizeof(kImageClear_frag_0000002E)},
    {kImageClear_frag_0000002F, sizeof(kImageClear_frag_0000002F)},
};
constexpr CompressedShaderBlob kImageCopy_frag_shaders[] = {
    {kImageCopy_frag_00000000, sizeof(kImageCopy_frag_00000000)},
    {kImageCopy_frag_00000001, sizeof(kImageCopy_frag_00000001)},
    {kImageCopy_frag_00000002, sizeof(kImageCopy_frag_00000002)},
    {nullptr, 0},  // 0x00000003
    {kImageCopy_frag_00000004, sizeof(kImageCopy_frag_00000004)},
    {kImageCopy_frag_00000005, sizeof(kImageCopy_frag_00000005)},
    {kImageCopy_frag_00000006, sizeof(kImageCopy_frag_00000006)},
    {nullptr, 0},  // 0x00000007
    {kImageCopy_frag_00000008, sizeof(kImageCopy_frag_00000008)},
    {kImageCopy_frag_00000009, sizeof(kImageCopy_frag_00000009)},
    {kImageCopy_frag_0000000A, sizeof(kImageCopy_frag_0000000A)},
    {nullptr, 0},  // 0x0000000B
    {nullptr, 0},  // 0x0000000C
    {nullptr, 0},  // 0x0000000D
    {nullptr, 0},  // 0x0000000E
    {nullptr, 0},  // 0x0000000F
    {kImageCopy_frag_00000010, sizeof(kImageCopy_frag_00000010)},
    {kImageCopy_frag_00000011, sizeof(kImageCopy_frag_00000011)},
    {kImageCopy_frag_00000012, sizeof(kImageCopy_frag_00000012)},
    {nullptr, 0},  // 0x00000013
    {kImageCopy_frag_00000014, sizeof(kImageCopy_frag_00000014)},
    {kImageCopy_frag_00000015, sizeof(kImageCopy_frag_00000015)},
    {kImageCopy_frag_00000016, sizeof(kImageCopy_frag_00000016)},
    {nullptr, 0},  // 0x00000017
    {kImageCopy_frag_00000018, sizeof(kImageCopy_frag_00000018)},
    {kImageCopy_frag_00000019, sizeof(kImageCopy_frag_00000019)},
    {kImageCopy_frag_0000001A, sizeof(kImageCopy_frag_0000001A)},
    {nullptr, 0},  // 0x0000001B
    {nullptr, 0},  // 0x0000001C
    {nullptr, 0},  // 0x0000001D
    {nullptr, 0},  // 0x0000001E
    {nullptr, 0},  // 0x0000001F
    {kImageCopy_frag_00000020, sizeof(kImageCopy_frag_00000020)},
    {kImageCopy_frag_00000021, sizeof(kImageCopy_frag_00000021)},
    {kImageCopy_frag_00000022, sizeof(kImageCopy_frag_00000022)},
    {nullptr, 0},  // 0x00000023
    {kImageCopy_frag_00000024, sizeof(kImageCopy_frag_00000024)},
    {kImageCopy_frag_00000025, sizeof(kImageCopy_frag_00000025)},
    {kImageCopy_frag_00000026, sizeof(kImageCopy_frag_00000026)},
    {nullptr, 0},  // 0x00000027
    {kImageCopy_frag_00000028, sizeof(kImageCopy_frag_00000028)},
    {kImageCopy_frag_00000029, sizeof(kImageCopy_frag_00000029)},
    {kImageCopy_frag_0000002A, sizeof(kImageCopy_frag_0000002A)},
};
constexpr CompressedShaderBlob kImageCopyFloat_frag_shaders[] = {
    {kImageCopyFloat_frag_00000000, sizeof(kImageCopyFloat_frag_00000000)},
    {kImageCopyFloat_frag_00000001, sizeof(kImageCopyFloat_frag_00000001)},
};
constexpr CompressedShaderBlob kOverlayDraw_frag_shaders[] = {
    {kOverlayDraw_frag_00000000, sizeof(kOverlayDraw_frag_00000000)},
};
constexpr CompressedShaderBlob kOverlayDraw_vert_shaders[] = {
    {kOverlayDraw_vert_00000000, sizeof(kOverlayDraw_vert_00000000)},
};

angle::Result GetShader(Context *context,
                        ShaderModulePtr shaders[],
                        const CompressedShaderBlob *compressedShaderBlobs,
                        size_t shadersCount,
                        uint32_t shaderFlags,
                        ShaderModulePtr *shaderOut)
{
    ASSERT(shaderFlags < shadersCount);
    ShaderModulePtr &shader = shaders[shaderFlags];

    if (shader)
    {
        ASSERT(shader->valid());
        *shaderOut = shader;
        return angle::Result::Continue;
    }

    // Create shader lazily. Access will need to be locked for multi-threading.
    const CompressedShaderBlob &compressedShaderCode = compressedShaderBlobs[shaderFlags];
    ASSERT(compressedShaderCode.code != nullptr);

    uLong uncompressedSize = zlib_internal::GetGzipUncompressedSize(compressedShaderCode.code,
                                                                    compressedShaderCode.size);
    std::vector<uint32_t> shaderCode((uncompressedSize + 3) / 4, 0);

    // Note: we assume a little-endian environment throughout ANGLE.
    int zResult = zlib_internal::GzipUncompressHelper(
        reinterpret_cast<uint8_t *>(shaderCode.data()), &uncompressedSize,
        compressedShaderCode.code, compressedShaderCode.size);

    if (zResult != Z_OK)
    {
        ERR() << "Failure to decompressed internal shader: " << zResult << "\n";
        return angle::Result::Stop;
    }

    ANGLE_TRY(InitShaderModule(context, &shader, shaderCode.data(), shaderCode.size() * 4));

    ASSERT(shader);
    ASSERT(shader->valid());
    *shaderOut = shader;
    return angle::Result::Continue;
}
}  // anonymous namespace

ShaderLibrary::ShaderLibrary() {}

ShaderLibrary::~ShaderLibrary() {}

void ShaderLibrary::destroy(VkDevice device)
{
    for (ShaderModulePtr &shader : mBlit3DSrc_frag_shaders)
    {
        if (shader)
        {
            shader->destroy(device);
        }
    }
    for (ShaderModulePtr &shader : mBlitResolve_frag_shaders)
    {
        if (shader)
        {
            shader->destroy(device);
        }
    }
    for (ShaderModulePtr &shader : mBlitResolveStencilNoExport_comp_shaders)
    {
        if (shader)
        {
            shader->destroy(device);
        }
    }
    for (ShaderModulePtr &shader : mConvertIndex_comp_shaders)
    {
        if (shader)
        {
            shader->destroy(device);
        }
    }
    for (ShaderModulePtr &shader : mConvertIndexIndirectLineLoop_comp_shaders)
    {
        if (shader)
        {
            shader->destroy(device);
        }
    }
    for (ShaderModulePtr &shader : mConvertIndirectLineLoop_comp_shaders)
    {
        if (shader)
        {
            shader->destroy(device);
        }
    }
    for (ShaderModulePtr &shader : mConvertVertex_comp_shaders)
    {
        if (shader)
        {
            shader->destroy(device);
        }
    }
    for (ShaderModulePtr &shader : mCopyImageToBuffer_comp_shaders)
    {
        if (shader)
        {
            shader->destroy(device);
        }
    }
    for (ShaderModulePtr &shader : mEtcToBc_comp_shaders)
    {
        if (shader)
        {
            shader->destroy(device);
        }
    }
    for (ShaderModulePtr &shader : mExportStencil_frag_shaders)
    {
        if (shader)
        {
            shader->destroy(device);
        }
    }
    for (ShaderModulePtr &shader : mFullScreenTri_vert_shaders)
    {
        if (shader)
        {
            shader->destroy(device);
        }
    }
    for (ShaderModulePtr &shader : mGenerateFragmentShadingRate_comp_shaders)
    {
        if (shader)
        {
            shader->destroy(device);
        }
    }
    for (ShaderModulePtr &shader : mGenerateMipmap_comp_shaders)
    {
        if (shader)
        {
            shader->destroy(device);
        }
    }
    for (ShaderModulePtr &shader : mImageClear_frag_shaders)
    {
        if (shader)
        {
            shader->destroy(device);
        }
    }
    for (ShaderModulePtr &shader : mImageCopy_frag_shaders)
    {
        if (shader)
        {
            shader->destroy(device);
        }
    }
    for (ShaderModulePtr &shader : mImageCopyFloat_frag_shaders)
    {
        if (shader)
        {
            shader->destroy(device);
        }
    }
    for (ShaderModulePtr &shader : mOverlayDraw_frag_shaders)
    {
        if (shader)
        {
            shader->destroy(device);
        }
    }
    for (ShaderModulePtr &shader : mOverlayDraw_vert_shaders)
    {
        if (shader)
        {
            shader->destroy(device);
        }
    }
}

angle::Result ShaderLibrary::getBlit3DSrc_frag(Context *context,
                                               uint32_t shaderFlags,
                                               ShaderModulePtr *shaderOut)
{
    return GetShader(context, mBlit3DSrc_frag_shaders, kBlit3DSrc_frag_shaders,
                     ArraySize(kBlit3DSrc_frag_shaders), shaderFlags, shaderOut);
}

angle::Result ShaderLibrary::getBlitResolve_frag(Context *context,
                                                 uint32_t shaderFlags,
                                                 ShaderModulePtr *shaderOut)
{
    return GetShader(context, mBlitResolve_frag_shaders, kBlitResolve_frag_shaders,
                     ArraySize(kBlitResolve_frag_shaders), shaderFlags, shaderOut);
}

angle::Result ShaderLibrary::getBlitResolveStencilNoExport_comp(Context *context,
                                                                uint32_t shaderFlags,
                                                                ShaderModulePtr *shaderOut)
{
    return GetShader(context, mBlitResolveStencilNoExport_comp_shaders,
                     kBlitResolveStencilNoExport_comp_shaders,
                     ArraySize(kBlitResolveStencilNoExport_comp_shaders), shaderFlags, shaderOut);
}

angle::Result ShaderLibrary::getConvertIndex_comp(Context *context,
                                                  uint32_t shaderFlags,
                                                  ShaderModulePtr *shaderOut)
{
    return GetShader(context, mConvertIndex_comp_shaders, kConvertIndex_comp_shaders,
                     ArraySize(kConvertIndex_comp_shaders), shaderFlags, shaderOut);
}

angle::Result ShaderLibrary::getConvertIndexIndirectLineLoop_comp(Context *context,
                                                                  uint32_t shaderFlags,
                                                                  ShaderModulePtr *shaderOut)
{
    return GetShader(context, mConvertIndexIndirectLineLoop_comp_shaders,
                     kConvertIndexIndirectLineLoop_comp_shaders,
                     ArraySize(kConvertIndexIndirectLineLoop_comp_shaders), shaderFlags, shaderOut);
}

angle::Result ShaderLibrary::getConvertIndirectLineLoop_comp(Context *context,
                                                             uint32_t shaderFlags,
                                                             ShaderModulePtr *shaderOut)
{
    return GetShader(context, mConvertIndirectLineLoop_comp_shaders,
                     kConvertIndirectLineLoop_comp_shaders,
                     ArraySize(kConvertIndirectLineLoop_comp_shaders), shaderFlags, shaderOut);
}

angle::Result ShaderLibrary::getConvertVertex_comp(Context *context,
                                                   uint32_t shaderFlags,
                                                   ShaderModulePtr *shaderOut)
{
    return GetShader(context, mConvertVertex_comp_shaders, kConvertVertex_comp_shaders,
                     ArraySize(kConvertVertex_comp_shaders), shaderFlags, shaderOut);
}

angle::Result ShaderLibrary::getCopyImageToBuffer_comp(Context *context,
                                                       uint32_t shaderFlags,
                                                       ShaderModulePtr *shaderOut)
{
    return GetShader(context, mCopyImageToBuffer_comp_shaders, kCopyImageToBuffer_comp_shaders,
                     ArraySize(kCopyImageToBuffer_comp_shaders), shaderFlags, shaderOut);
}

angle::Result ShaderLibrary::getEtcToBc_comp(Context *context,
                                             uint32_t shaderFlags,
                                             ShaderModulePtr *shaderOut)
{
    return GetShader(context, mEtcToBc_comp_shaders, kEtcToBc_comp_shaders,
                     ArraySize(kEtcToBc_comp_shaders), shaderFlags, shaderOut);
}

angle::Result ShaderLibrary::getExportStencil_frag(Context *context,
                                                   uint32_t shaderFlags,
                                                   ShaderModulePtr *shaderOut)
{
    return GetShader(context, mExportStencil_frag_shaders, kExportStencil_frag_shaders,
                     ArraySize(kExportStencil_frag_shaders), shaderFlags, shaderOut);
}

angle::Result ShaderLibrary::getFullScreenTri_vert(Context *context,
                                                   uint32_t shaderFlags,
                                                   ShaderModulePtr *shaderOut)
{
    return GetShader(context, mFullScreenTri_vert_shaders, kFullScreenTri_vert_shaders,
                     ArraySize(kFullScreenTri_vert_shaders), shaderFlags, shaderOut);
}

angle::Result ShaderLibrary::getGenerateFragmentShadingRate_comp(Context *context,
                                                                 uint32_t shaderFlags,
                                                                 ShaderModulePtr *shaderOut)
{
    return GetShader(context, mGenerateFragmentShadingRate_comp_shaders,
                     kGenerateFragmentShadingRate_comp_shaders,
                     ArraySize(kGenerateFragmentShadingRate_comp_shaders), shaderFlags, shaderOut);
}

angle::Result ShaderLibrary::getGenerateMipmap_comp(Context *context,
                                                    uint32_t shaderFlags,
                                                    ShaderModulePtr *shaderOut)
{
    return GetShader(context, mGenerateMipmap_comp_shaders, kGenerateMipmap_comp_shaders,
                     ArraySize(kGenerateMipmap_comp_shaders), shaderFlags, shaderOut);
}

angle::Result ShaderLibrary::getImageClear_frag(Context *context,
                                                uint32_t shaderFlags,
                                                ShaderModulePtr *shaderOut)
{
    return GetShader(context, mImageClear_frag_shaders, kImageClear_frag_shaders,
                     ArraySize(kImageClear_frag_shaders), shaderFlags, shaderOut);
}

angle::Result ShaderLibrary::getImageCopy_frag(Context *context,
                                               uint32_t shaderFlags,
                                               ShaderModulePtr *shaderOut)
{
    return GetShader(context, mImageCopy_frag_shaders, kImageCopy_frag_shaders,
                     ArraySize(kImageCopy_frag_shaders), shaderFlags, shaderOut);
}

angle::Result ShaderLibrary::getImageCopyFloat_frag(Context *context,
                                                    uint32_t shaderFlags,
                                                    ShaderModulePtr *shaderOut)
{
    return GetShader(context, mImageCopyFloat_frag_shaders, kImageCopyFloat_frag_shaders,
                     ArraySize(kImageCopyFloat_frag_shaders), shaderFlags, shaderOut);
}

angle::Result ShaderLibrary::getOverlayDraw_frag(Context *context,
                                                 uint32_t shaderFlags,
                                                 ShaderModulePtr *shaderOut)
{
    return GetShader(context, mOverlayDraw_frag_shaders, kOverlayDraw_frag_shaders,
                     ArraySize(kOverlayDraw_frag_shaders), shaderFlags, shaderOut);
}

angle::Result ShaderLibrary::getOverlayDraw_vert(Context *context,
                                                 uint32_t shaderFlags,
                                                 ShaderModulePtr *shaderOut)
{
    return GetShader(context, mOverlayDraw_vert_shaders, kOverlayDraw_vert_shaders,
                     ArraySize(kOverlayDraw_vert_shaders), shaderFlags, shaderOut);
}

}  // namespace vk
}  // namespace rx
