// GENERATED FILE - DO NOT EDIT.
// Generated by gen_vk_internal_shaders.py using data from shaders/src/*
//
// Copyright 2019 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"

namespace rx
{
namespace vk
{
namespace
{
#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/BufferUtils.comp.00000000.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000001.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000002.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000003.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000004.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000005.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000006.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000007.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000008.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000009.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.0000000A.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.0000000B.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/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/ConvertVertex.comp.00000008.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000009.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000A.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000B.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000C.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000D.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000E.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000F.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000010.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000011.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000012.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000013.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000014.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000015.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000016.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000017.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000018.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000019.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000001A.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000001B.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000001C.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000001D.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000001E.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000001F.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000020.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000021.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000022.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000023.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000024.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000025.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000026.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000027.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000028.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000029.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/FullScreenQuad.vert.00000000.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/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.00000003.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.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.0000000B.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000000C.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.0000000D.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.00000013.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/OverlayCull.comp.00000000.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000001.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000002.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000003.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000004.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/OverlayCull.comp.00000005.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/OverlayDraw.comp.00000000.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/OverlayDraw.comp.00000001.inc"

// This is SPIR-V binary blob and the size.
struct ShaderBlob
{
    const uint32_t *code;
    size_t codeSize;
};

constexpr ShaderBlob 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 ShaderBlob 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 ShaderBlob kBufferUtils_comp_shaders[] = {
    {kBufferUtils_comp_00000000, sizeof(kBufferUtils_comp_00000000)},
    {kBufferUtils_comp_00000001, sizeof(kBufferUtils_comp_00000001)},
    {kBufferUtils_comp_00000002, sizeof(kBufferUtils_comp_00000002)},
    {kBufferUtils_comp_00000003, sizeof(kBufferUtils_comp_00000003)},
    {kBufferUtils_comp_00000004, sizeof(kBufferUtils_comp_00000004)},
    {kBufferUtils_comp_00000005, sizeof(kBufferUtils_comp_00000005)},
    {kBufferUtils_comp_00000006, sizeof(kBufferUtils_comp_00000006)},
    {kBufferUtils_comp_00000007, sizeof(kBufferUtils_comp_00000007)},
    {kBufferUtils_comp_00000008, sizeof(kBufferUtils_comp_00000008)},
    {kBufferUtils_comp_00000009, sizeof(kBufferUtils_comp_00000009)},
    {kBufferUtils_comp_0000000A, sizeof(kBufferUtils_comp_0000000A)},
    {kBufferUtils_comp_0000000B, sizeof(kBufferUtils_comp_0000000B)},
};
constexpr ShaderBlob 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 ShaderBlob kConvertIndexIndirectLineLoop_comp_shaders[] = {
    {kConvertIndexIndirectLineLoop_comp_00000000,
     sizeof(kConvertIndexIndirectLineLoop_comp_00000000)},
    {kConvertIndexIndirectLineLoop_comp_00000001,
     sizeof(kConvertIndexIndirectLineLoop_comp_00000001)},
};
constexpr ShaderBlob kConvertIndirectLineLoop_comp_shaders[] = {
    {kConvertIndirectLineLoop_comp_00000000, sizeof(kConvertIndirectLineLoop_comp_00000000)},
};
constexpr ShaderBlob 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)},
    {kConvertVertex_comp_00000008, sizeof(kConvertVertex_comp_00000008)},
    {kConvertVertex_comp_00000009, sizeof(kConvertVertex_comp_00000009)},
    {kConvertVertex_comp_0000000A, sizeof(kConvertVertex_comp_0000000A)},
    {kConvertVertex_comp_0000000B, sizeof(kConvertVertex_comp_0000000B)},
    {kConvertVertex_comp_0000000C, sizeof(kConvertVertex_comp_0000000C)},
    {kConvertVertex_comp_0000000D, sizeof(kConvertVertex_comp_0000000D)},
    {kConvertVertex_comp_0000000E, sizeof(kConvertVertex_comp_0000000E)},
    {kConvertVertex_comp_0000000F, sizeof(kConvertVertex_comp_0000000F)},
    {kConvertVertex_comp_00000010, sizeof(kConvertVertex_comp_00000010)},
    {kConvertVertex_comp_00000011, sizeof(kConvertVertex_comp_00000011)},
    {kConvertVertex_comp_00000012, sizeof(kConvertVertex_comp_00000012)},
    {kConvertVertex_comp_00000013, sizeof(kConvertVertex_comp_00000013)},
    {kConvertVertex_comp_00000014, sizeof(kConvertVertex_comp_00000014)},
    {kConvertVertex_comp_00000015, sizeof(kConvertVertex_comp_00000015)},
    {kConvertVertex_comp_00000016, sizeof(kConvertVertex_comp_00000016)},
    {kConvertVertex_comp_00000017, sizeof(kConvertVertex_comp_00000017)},
    {kConvertVertex_comp_00000018, sizeof(kConvertVertex_comp_00000018)},
    {kConvertVertex_comp_00000019, sizeof(kConvertVertex_comp_00000019)},
    {kConvertVertex_comp_0000001A, sizeof(kConvertVertex_comp_0000001A)},
    {kConvertVertex_comp_0000001B, sizeof(kConvertVertex_comp_0000001B)},
    {kConvertVertex_comp_0000001C, sizeof(kConvertVertex_comp_0000001C)},
    {kConvertVertex_comp_0000001D, sizeof(kConvertVertex_comp_0000001D)},
    {kConvertVertex_comp_0000001E, sizeof(kConvertVertex_comp_0000001E)},
    {kConvertVertex_comp_0000001F, sizeof(kConvertVertex_comp_0000001F)},
    {kConvertVertex_comp_00000020, sizeof(kConvertVertex_comp_00000020)},
    {kConvertVertex_comp_00000021, sizeof(kConvertVertex_comp_00000021)},
    {kConvertVertex_comp_00000022, sizeof(kConvertVertex_comp_00000022)},
    {kConvertVertex_comp_00000023, sizeof(kConvertVertex_comp_00000023)},
    {kConvertVertex_comp_00000024, sizeof(kConvertVertex_comp_00000024)},
    {kConvertVertex_comp_00000025, sizeof(kConvertVertex_comp_00000025)},
    {kConvertVertex_comp_00000026, sizeof(kConvertVertex_comp_00000026)},
    {kConvertVertex_comp_00000027, sizeof(kConvertVertex_comp_00000027)},
    {kConvertVertex_comp_00000028, sizeof(kConvertVertex_comp_00000028)},
    {kConvertVertex_comp_00000029, sizeof(kConvertVertex_comp_00000029)},
};
constexpr ShaderBlob kFullScreenQuad_vert_shaders[] = {
    {kFullScreenQuad_vert_00000000, sizeof(kFullScreenQuad_vert_00000000)},
};
constexpr ShaderBlob 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)},
};
constexpr ShaderBlob kImageCopy_frag_shaders[] = {
    {kImageCopy_frag_00000000, sizeof(kImageCopy_frag_00000000)},
    {kImageCopy_frag_00000001, sizeof(kImageCopy_frag_00000001)},
    {kImageCopy_frag_00000002, sizeof(kImageCopy_frag_00000002)},
    {kImageCopy_frag_00000003, sizeof(kImageCopy_frag_00000003)},
    {kImageCopy_frag_00000004, sizeof(kImageCopy_frag_00000004)},
    {kImageCopy_frag_00000005, sizeof(kImageCopy_frag_00000005)},
    {nullptr, 0},  // 0x00000006
    {nullptr, 0},  // 0x00000007
    {kImageCopy_frag_00000008, sizeof(kImageCopy_frag_00000008)},
    {kImageCopy_frag_00000009, sizeof(kImageCopy_frag_00000009)},
    {kImageCopy_frag_0000000A, sizeof(kImageCopy_frag_0000000A)},
    {kImageCopy_frag_0000000B, sizeof(kImageCopy_frag_0000000B)},
    {kImageCopy_frag_0000000C, sizeof(kImageCopy_frag_0000000C)},
    {kImageCopy_frag_0000000D, sizeof(kImageCopy_frag_0000000D)},
    {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)},
    {kImageCopy_frag_00000013, sizeof(kImageCopy_frag_00000013)},
    {kImageCopy_frag_00000014, sizeof(kImageCopy_frag_00000014)},
    {kImageCopy_frag_00000015, sizeof(kImageCopy_frag_00000015)},
};
constexpr ShaderBlob kOverlayCull_comp_shaders[] = {
    {kOverlayCull_comp_00000000, sizeof(kOverlayCull_comp_00000000)},
    {kOverlayCull_comp_00000001, sizeof(kOverlayCull_comp_00000001)},
    {kOverlayCull_comp_00000002, sizeof(kOverlayCull_comp_00000002)},
    {kOverlayCull_comp_00000003, sizeof(kOverlayCull_comp_00000003)},
    {kOverlayCull_comp_00000004, sizeof(kOverlayCull_comp_00000004)},
    {kOverlayCull_comp_00000005, sizeof(kOverlayCull_comp_00000005)},
};
constexpr ShaderBlob kOverlayDraw_comp_shaders[] = {
    {kOverlayDraw_comp_00000000, sizeof(kOverlayDraw_comp_00000000)},
    {kOverlayDraw_comp_00000001, sizeof(kOverlayDraw_comp_00000001)},
};

angle::Result GetShader(Context *context,
                        RefCounted<ShaderAndSerial> *shaders,
                        const ShaderBlob *shaderBlobs,
                        size_t shadersCount,
                        uint32_t shaderFlags,
                        RefCounted<ShaderAndSerial> **shaderOut)
{
    ASSERT(shaderFlags < shadersCount);
    RefCounted<ShaderAndSerial> &shader = shaders[shaderFlags];
    *shaderOut                          = &shader;

    if (shader.get().valid())
    {
        return angle::Result::Continue;
    }

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

    return InitShaderAndSerial(context, &shader.get(), shaderCode.code, shaderCode.codeSize);
}
}  // anonymous namespace

ShaderLibrary::ShaderLibrary() {}

ShaderLibrary::~ShaderLibrary() {}

void ShaderLibrary::destroy(VkDevice device)
{
    for (RefCounted<ShaderAndSerial> &shader : mBlitResolve_frag_shaders)
    {
        shader.get().destroy(device);
    }
    for (RefCounted<ShaderAndSerial> &shader : mBlitResolveStencilNoExport_comp_shaders)
    {
        shader.get().destroy(device);
    }
    for (RefCounted<ShaderAndSerial> &shader : mBufferUtils_comp_shaders)
    {
        shader.get().destroy(device);
    }
    for (RefCounted<ShaderAndSerial> &shader : mConvertIndex_comp_shaders)
    {
        shader.get().destroy(device);
    }
    for (RefCounted<ShaderAndSerial> &shader : mConvertIndexIndirectLineLoop_comp_shaders)
    {
        shader.get().destroy(device);
    }
    for (RefCounted<ShaderAndSerial> &shader : mConvertIndirectLineLoop_comp_shaders)
    {
        shader.get().destroy(device);
    }
    for (RefCounted<ShaderAndSerial> &shader : mConvertVertex_comp_shaders)
    {
        shader.get().destroy(device);
    }
    for (RefCounted<ShaderAndSerial> &shader : mFullScreenQuad_vert_shaders)
    {
        shader.get().destroy(device);
    }
    for (RefCounted<ShaderAndSerial> &shader : mImageClear_frag_shaders)
    {
        shader.get().destroy(device);
    }
    for (RefCounted<ShaderAndSerial> &shader : mImageCopy_frag_shaders)
    {
        shader.get().destroy(device);
    }
    for (RefCounted<ShaderAndSerial> &shader : mOverlayCull_comp_shaders)
    {
        shader.get().destroy(device);
    }
    for (RefCounted<ShaderAndSerial> &shader : mOverlayDraw_comp_shaders)
    {
        shader.get().destroy(device);
    }
}

angle::Result ShaderLibrary::getBlitResolve_frag(Context *context,
                                                 uint32_t shaderFlags,
                                                 RefCounted<ShaderAndSerial> **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,
    RefCounted<ShaderAndSerial> **shaderOut)
{
    return GetShader(context, mBlitResolveStencilNoExport_comp_shaders,
                     kBlitResolveStencilNoExport_comp_shaders,
                     ArraySize(kBlitResolveStencilNoExport_comp_shaders), shaderFlags, shaderOut);
}

angle::Result ShaderLibrary::getBufferUtils_comp(Context *context,
                                                 uint32_t shaderFlags,
                                                 RefCounted<ShaderAndSerial> **shaderOut)
{
    return GetShader(context, mBufferUtils_comp_shaders, kBufferUtils_comp_shaders,
                     ArraySize(kBufferUtils_comp_shaders), shaderFlags, shaderOut);
}

angle::Result ShaderLibrary::getConvertIndex_comp(Context *context,
                                                  uint32_t shaderFlags,
                                                  RefCounted<ShaderAndSerial> **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,
    RefCounted<ShaderAndSerial> **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,
    RefCounted<ShaderAndSerial> **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,
                                                   RefCounted<ShaderAndSerial> **shaderOut)
{
    return GetShader(context, mConvertVertex_comp_shaders, kConvertVertex_comp_shaders,
                     ArraySize(kConvertVertex_comp_shaders), shaderFlags, shaderOut);
}

angle::Result ShaderLibrary::getFullScreenQuad_vert(Context *context,
                                                    uint32_t shaderFlags,
                                                    RefCounted<ShaderAndSerial> **shaderOut)
{
    return GetShader(context, mFullScreenQuad_vert_shaders, kFullScreenQuad_vert_shaders,
                     ArraySize(kFullScreenQuad_vert_shaders), shaderFlags, shaderOut);
}

angle::Result ShaderLibrary::getImageClear_frag(Context *context,
                                                uint32_t shaderFlags,
                                                RefCounted<ShaderAndSerial> **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,
                                               RefCounted<ShaderAndSerial> **shaderOut)
{
    return GetShader(context, mImageCopy_frag_shaders, kImageCopy_frag_shaders,
                     ArraySize(kImageCopy_frag_shaders), shaderFlags, shaderOut);
}

angle::Result ShaderLibrary::getOverlayCull_comp(Context *context,
                                                 uint32_t shaderFlags,
                                                 RefCounted<ShaderAndSerial> **shaderOut)
{
    return GetShader(context, mOverlayCull_comp_shaders, kOverlayCull_comp_shaders,
                     ArraySize(kOverlayCull_comp_shaders), shaderFlags, shaderOut);
}

angle::Result ShaderLibrary::getOverlayDraw_comp(Context *context,
                                                 uint32_t shaderFlags,
                                                 RefCounted<ShaderAndSerial> **shaderOut)
{
    return GetShader(context, mOverlayDraw_comp_shaders, kOverlayDraw_comp_shaders,
                     ArraySize(kOverlayDraw_comp_shaders), shaderFlags, shaderOut);
}

}  // namespace vk
}  // namespace rx
