#pragma once

#ifdef _WIN32

#pragma warning( disable : 4065 )

#endif

#include <vulkan/vulkan.h>


static inline uint32_t validate_VkAccessFlagBits(VkAccessFlagBits input_value)
{
    if (input_value > (VK_ACCESS_INDIRECT_COMMAND_READ_BIT | VK_ACCESS_INDEX_READ_BIT | VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT | VK_ACCESS_UNIFORM_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_HOST_READ_BIT | VK_ACCESS_HOST_WRITE_BIT | VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT))
        return 0;
    return 1;
}


static inline uint32_t validate_VkAttachmentDescriptionFlagBits(VkAttachmentDescriptionFlagBits input_value)
{
    if (input_value > (VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT))
        return 0;
    return 1;
}


static inline uint32_t validate_VkAttachmentLoadOp(VkAttachmentLoadOp input_value)
{
    switch ((VkAttachmentLoadOp)input_value)
    {
        case VK_ATTACHMENT_LOAD_OP_CLEAR:
        case VK_ATTACHMENT_LOAD_OP_DONT_CARE:
        case VK_ATTACHMENT_LOAD_OP_LOAD:
            return 1;
        default:
            return 0;
    }
}


static inline uint32_t validate_VkAttachmentStoreOp(VkAttachmentStoreOp input_value)
{
    switch ((VkAttachmentStoreOp)input_value)
    {
        case VK_ATTACHMENT_STORE_OP_DONT_CARE:
        case VK_ATTACHMENT_STORE_OP_STORE:
            return 1;
        default:
            return 0;
    }
}


static inline uint32_t validate_VkBlendFactor(VkBlendFactor input_value)
{
    switch ((VkBlendFactor)input_value)
    {
        case VK_BLEND_FACTOR_CONSTANT_ALPHA:
        case VK_BLEND_FACTOR_CONSTANT_COLOR:
        case VK_BLEND_FACTOR_DST_ALPHA:
        case VK_BLEND_FACTOR_DST_COLOR:
        case VK_BLEND_FACTOR_ONE:
        case VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA:
        case VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR:
        case VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA:
        case VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR:
        case VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA:
        case VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR:
        case VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA:
        case VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR:
        case VK_BLEND_FACTOR_SRC1_ALPHA:
        case VK_BLEND_FACTOR_SRC1_COLOR:
        case VK_BLEND_FACTOR_SRC_ALPHA:
        case VK_BLEND_FACTOR_SRC_ALPHA_SATURATE:
        case VK_BLEND_FACTOR_SRC_COLOR:
        case VK_BLEND_FACTOR_ZERO:
            return 1;
        default:
            return 0;
    }
}


static inline uint32_t validate_VkBlendOp(VkBlendOp input_value)
{
    switch ((VkBlendOp)input_value)
    {
        case VK_BLEND_OP_ADD:
        case VK_BLEND_OP_MAX:
        case VK_BLEND_OP_MIN:
        case VK_BLEND_OP_REVERSE_SUBTRACT:
        case VK_BLEND_OP_SUBTRACT:
            return 1;
        default:
            return 0;
    }
}


static inline uint32_t validate_VkBorderColor(VkBorderColor input_value)
{
    switch ((VkBorderColor)input_value)
    {
        case VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK:
        case VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE:
        case VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK:
        case VK_BORDER_COLOR_INT_OPAQUE_BLACK:
        case VK_BORDER_COLOR_INT_OPAQUE_WHITE:
        case VK_BORDER_COLOR_INT_TRANSPARENT_BLACK:
            return 1;
        default:
            return 0;
    }
}


static inline uint32_t validate_VkBufferCreateFlagBits(VkBufferCreateFlagBits input_value)
{
    if (input_value > (VK_BUFFER_CREATE_SPARSE_BINDING_BIT | VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_ALIASED_BIT))
        return 0;
    return 1;
}


static inline uint32_t validate_VkBufferUsageFlagBits(VkBufferUsageFlagBits input_value)
{
    if (input_value > (VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT))
        return 0;
    return 1;
}


static inline uint32_t validate_VkColorComponentFlagBits(VkColorComponentFlagBits input_value)
{
    if (input_value > (VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT))
        return 0;
    return 1;
}


static inline uint32_t validate_VkColorSpaceKHR(VkColorSpaceKHR input_value)
{
    switch ((VkColorSpaceKHR)input_value)
    {
        case VK_COLOR_SPACE_SRGB_NONLINEAR_KHR:
            return 1;
        default:
            return 0;
    }
}


static inline uint32_t validate_VkCommandBufferLevel(VkCommandBufferLevel input_value)
{
    switch ((VkCommandBufferLevel)input_value)
    {
        case VK_COMMAND_BUFFER_LEVEL_PRIMARY:
        case VK_COMMAND_BUFFER_LEVEL_SECONDARY:
            return 1;
        default:
            return 0;
    }
}


static inline uint32_t validate_VkCommandBufferResetFlagBits(VkCommandBufferResetFlagBits input_value)
{
    if (input_value > (VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT))
        return 0;
    return 1;
}


static inline uint32_t validate_VkCommandBufferUsageFlagBits(VkCommandBufferUsageFlagBits input_value)
{
    if (input_value > (VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT | VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT))
        return 0;
    return 1;
}


static inline uint32_t validate_VkCommandPoolCreateFlagBits(VkCommandPoolCreateFlagBits input_value)
{
    if (input_value > (VK_COMMAND_POOL_CREATE_TRANSIENT_BIT | VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT))
        return 0;
    return 1;
}


static inline uint32_t validate_VkCommandPoolResetFlagBits(VkCommandPoolResetFlagBits input_value)
{
    if (input_value > (VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT))
        return 0;
    return 1;
}


static inline uint32_t validate_VkCompareOp(VkCompareOp input_value)
{
    switch ((VkCompareOp)input_value)
    {
        case VK_COMPARE_OP_ALWAYS:
        case VK_COMPARE_OP_EQUAL:
        case VK_COMPARE_OP_GREATER:
        case VK_COMPARE_OP_GREATER_OR_EQUAL:
        case VK_COMPARE_OP_LESS:
        case VK_COMPARE_OP_LESS_OR_EQUAL:
        case VK_COMPARE_OP_NEVER:
        case VK_COMPARE_OP_NOT_EQUAL:
            return 1;
        default:
            return 0;
    }
}


static inline uint32_t validate_VkComponentSwizzle(VkComponentSwizzle input_value)
{
    switch ((VkComponentSwizzle)input_value)
    {
        case VK_COMPONENT_SWIZZLE_A:
        case VK_COMPONENT_SWIZZLE_B:
        case VK_COMPONENT_SWIZZLE_G:
        case VK_COMPONENT_SWIZZLE_IDENTITY:
        case VK_COMPONENT_SWIZZLE_ONE:
        case VK_COMPONENT_SWIZZLE_R:
        case VK_COMPONENT_SWIZZLE_ZERO:
            return 1;
        default:
            return 0;
    }
}


static inline uint32_t validate_VkCompositeAlphaFlagBitsKHR(VkCompositeAlphaFlagBitsKHR input_value)
{
    if (input_value > (VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR | VK_COMPOSITE_ALPHA_PRE_MULTIPLIED_BIT_KHR | VK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR | VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR))
        return 0;
    return 1;
}


static inline uint32_t validate_VkCullModeFlagBits(VkCullModeFlagBits input_value)
{
    if (input_value > (VK_CULL_MODE_NONE | VK_CULL_MODE_FRONT_BIT | VK_CULL_MODE_BACK_BIT | VK_CULL_MODE_FRONT_AND_BACK))
        return 0;
    return 1;
}


static inline uint32_t validate_VkDebugReportErrorEXT(VkDebugReportErrorEXT input_value)
{
    switch ((VkDebugReportErrorEXT)input_value)
    {
        case VK_DEBUG_REPORT_ERROR_CALLBACK_REF_EXT:
        case VK_DEBUG_REPORT_ERROR_NONE_EXT:
            return 1;
        default:
            return 0;
    }
}


static inline uint32_t validate_VkDebugReportFlagBitsEXT(VkDebugReportFlagBitsEXT input_value)
{
    if (input_value > (VK_DEBUG_REPORT_INFORMATION_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT | VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_DEBUG_BIT_EXT))
        return 0;
    return 1;
}


static inline uint32_t validate_VkDebugReportObjectTypeEXT(VkDebugReportObjectTypeEXT input_value)
{
    switch ((VkDebugReportObjectTypeEXT)input_value)
    {
        case VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT:
        case VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT:
        case VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT:
        case VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT:
        case VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT:
        case VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT:
        case VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT:
        case VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT:
        case VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT:
        case VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT:
        case VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT:
        case VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT:
        case VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT:
        case VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT:
        case VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT:
        case VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT:
        case VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT:
        case VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT:
        case VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT:
        case VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT:
        case VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT:
        case VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT:
        case VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT:
        case VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT:
        case VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT:
        case VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT:
        case VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT:
        case VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT:
        case VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT:
            return 1;
        default:
            return 0;
    }
}


static inline uint32_t validate_VkDependencyFlagBits(VkDependencyFlagBits input_value)
{
    if (input_value > (VK_DEPENDENCY_BY_REGION_BIT))
        return 0;
    return 1;
}


static inline uint32_t validate_VkDescriptorPoolCreateFlagBits(VkDescriptorPoolCreateFlagBits input_value)
{
    if (input_value > (VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT))
        return 0;
    return 1;
}


static inline uint32_t validate_VkDescriptorType(VkDescriptorType input_value)
{
    switch ((VkDescriptorType)input_value)
    {
        case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
        case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
        case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
        case VK_DESCRIPTOR_TYPE_SAMPLER:
        case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
        case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
        case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
        case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
        case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
        case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
        case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
            return 1;
        default:
            return 0;
    }
}


static inline uint32_t validate_VkDisplayPlaneAlphaFlagBitsKHR(VkDisplayPlaneAlphaFlagBitsKHR input_value)
{
    if (input_value > (VK_DISPLAY_PLANE_ALPHA_OPAQUE_BIT_KHR | VK_DISPLAY_PLANE_ALPHA_GLOBAL_BIT_KHR | VK_DISPLAY_PLANE_ALPHA_PER_PIXEL_BIT_KHR | VK_DISPLAY_PLANE_ALPHA_PER_PIXEL_PREMULTIPLIED_BIT_KHR))
        return 0;
    return 1;
}


static inline uint32_t validate_VkDynamicState(VkDynamicState input_value)
{
    switch ((VkDynamicState)input_value)
    {
        case VK_DYNAMIC_STATE_BLEND_CONSTANTS:
        case VK_DYNAMIC_STATE_DEPTH_BIAS:
        case VK_DYNAMIC_STATE_DEPTH_BOUNDS:
        case VK_DYNAMIC_STATE_LINE_WIDTH:
        case VK_DYNAMIC_STATE_SCISSOR:
        case VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK:
        case VK_DYNAMIC_STATE_STENCIL_REFERENCE:
        case VK_DYNAMIC_STATE_STENCIL_WRITE_MASK:
        case VK_DYNAMIC_STATE_VIEWPORT:
            return 1;
        default:
            return 0;
    }
}


static inline uint32_t validate_VkExternalMemoryFeatureFlagBitsNV(VkExternalMemoryFeatureFlagBitsNV input_value)
{
    if (input_value > (VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT_NV | VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT_NV | VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT_NV))
        return 0;
    return 1;
}


static inline uint32_t validate_VkExternalMemoryHandleTypeFlagBitsNV(VkExternalMemoryHandleTypeFlagBitsNV input_value)
{
    if (input_value > (VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_NV | VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_NV | VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_IMAGE_BIT_NV | VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_IMAGE_KMT_BIT_NV))
        return 0;
    return 1;
}


static inline uint32_t validate_VkFenceCreateFlagBits(VkFenceCreateFlagBits input_value)
{
    if (input_value > (VK_FENCE_CREATE_SIGNALED_BIT))
        return 0;
    return 1;
}


static inline uint32_t validate_VkFilter(VkFilter input_value)
{
    switch ((VkFilter)input_value)
    {
        case VK_FILTER_CUBIC_IMG:
        case VK_FILTER_LINEAR:
        case VK_FILTER_NEAREST:
            return 1;
        default:
            return 0;
    }
}


static inline uint32_t validate_VkFormat(VkFormat input_value)
{
    switch ((VkFormat)input_value)
    {
        case VK_FORMAT_A1R5G5B5_UNORM_PACK16:
        case VK_FORMAT_A2B10G10R10_SINT_PACK32:
        case VK_FORMAT_A2B10G10R10_SNORM_PACK32:
        case VK_FORMAT_A2B10G10R10_SSCALED_PACK32:
        case VK_FORMAT_A2B10G10R10_UINT_PACK32:
        case VK_FORMAT_A2B10G10R10_UNORM_PACK32:
        case VK_FORMAT_A2B10G10R10_USCALED_PACK32:
        case VK_FORMAT_A2R10G10B10_SINT_PACK32:
        case VK_FORMAT_A2R10G10B10_SNORM_PACK32:
        case VK_FORMAT_A2R10G10B10_SSCALED_PACK32:
        case VK_FORMAT_A2R10G10B10_UINT_PACK32:
        case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
        case VK_FORMAT_A2R10G10B10_USCALED_PACK32:
        case VK_FORMAT_A8B8G8R8_SINT_PACK32:
        case VK_FORMAT_A8B8G8R8_SNORM_PACK32:
        case VK_FORMAT_A8B8G8R8_SRGB_PACK32:
        case VK_FORMAT_A8B8G8R8_SSCALED_PACK32:
        case VK_FORMAT_A8B8G8R8_UINT_PACK32:
        case VK_FORMAT_A8B8G8R8_UNORM_PACK32:
        case VK_FORMAT_A8B8G8R8_USCALED_PACK32:
        case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
        case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
        case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
        case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
        case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
        case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
        case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
        case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
        case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
        case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
        case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
        case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
        case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
        case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
        case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
        case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
        case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
        case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
        case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
        case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
        case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
        case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
        case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
        case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
        case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
        case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
        case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
        case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
        case VK_FORMAT_B10G11R11_UFLOAT_PACK32:
        case VK_FORMAT_B4G4R4A4_UNORM_PACK16:
        case VK_FORMAT_B5G5R5A1_UNORM_PACK16:
        case VK_FORMAT_B5G6R5_UNORM_PACK16:
        case VK_FORMAT_B8G8R8A8_SINT:
        case VK_FORMAT_B8G8R8A8_SNORM:
        case VK_FORMAT_B8G8R8A8_SRGB:
        case VK_FORMAT_B8G8R8A8_SSCALED:
        case VK_FORMAT_B8G8R8A8_UINT:
        case VK_FORMAT_B8G8R8A8_UNORM:
        case VK_FORMAT_B8G8R8A8_USCALED:
        case VK_FORMAT_B8G8R8_SINT:
        case VK_FORMAT_B8G8R8_SNORM:
        case VK_FORMAT_B8G8R8_SRGB:
        case VK_FORMAT_B8G8R8_SSCALED:
        case VK_FORMAT_B8G8R8_UINT:
        case VK_FORMAT_B8G8R8_UNORM:
        case VK_FORMAT_B8G8R8_USCALED:
        case VK_FORMAT_BC1_RGBA_SRGB_BLOCK:
        case VK_FORMAT_BC1_RGBA_UNORM_BLOCK:
        case VK_FORMAT_BC1_RGB_SRGB_BLOCK:
        case VK_FORMAT_BC1_RGB_UNORM_BLOCK:
        case VK_FORMAT_BC2_SRGB_BLOCK:
        case VK_FORMAT_BC2_UNORM_BLOCK:
        case VK_FORMAT_BC3_SRGB_BLOCK:
        case VK_FORMAT_BC3_UNORM_BLOCK:
        case VK_FORMAT_BC4_SNORM_BLOCK:
        case VK_FORMAT_BC4_UNORM_BLOCK:
        case VK_FORMAT_BC5_SNORM_BLOCK:
        case VK_FORMAT_BC5_UNORM_BLOCK:
        case VK_FORMAT_BC6H_SFLOAT_BLOCK:
        case VK_FORMAT_BC6H_UFLOAT_BLOCK:
        case VK_FORMAT_BC7_SRGB_BLOCK:
        case VK_FORMAT_BC7_UNORM_BLOCK:
        case VK_FORMAT_D16_UNORM:
        case VK_FORMAT_D16_UNORM_S8_UINT:
        case VK_FORMAT_D24_UNORM_S8_UINT:
        case VK_FORMAT_D32_SFLOAT:
        case VK_FORMAT_D32_SFLOAT_S8_UINT:
        case VK_FORMAT_E5B9G9R9_UFLOAT_PACK32:
        case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
        case VK_FORMAT_EAC_R11G11_UNORM_BLOCK:
        case VK_FORMAT_EAC_R11_SNORM_BLOCK:
        case VK_FORMAT_EAC_R11_UNORM_BLOCK:
        case VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK:
        case VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK:
        case VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK:
        case VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK:
        case VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK:
        case VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK:
        case VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG:
        case VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG:
        case VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG:
        case VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG:
        case VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG:
        case VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG:
        case VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG:
        case VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG:
        case VK_FORMAT_R16G16B16A16_SFLOAT:
        case VK_FORMAT_R16G16B16A16_SINT:
        case VK_FORMAT_R16G16B16A16_SNORM:
        case VK_FORMAT_R16G16B16A16_SSCALED:
        case VK_FORMAT_R16G16B16A16_UINT:
        case VK_FORMAT_R16G16B16A16_UNORM:
        case VK_FORMAT_R16G16B16A16_USCALED:
        case VK_FORMAT_R16G16B16_SFLOAT:
        case VK_FORMAT_R16G16B16_SINT:
        case VK_FORMAT_R16G16B16_SNORM:
        case VK_FORMAT_R16G16B16_SSCALED:
        case VK_FORMAT_R16G16B16_UINT:
        case VK_FORMAT_R16G16B16_UNORM:
        case VK_FORMAT_R16G16B16_USCALED:
        case VK_FORMAT_R16G16_SFLOAT:
        case VK_FORMAT_R16G16_SINT:
        case VK_FORMAT_R16G16_SNORM:
        case VK_FORMAT_R16G16_SSCALED:
        case VK_FORMAT_R16G16_UINT:
        case VK_FORMAT_R16G16_UNORM:
        case VK_FORMAT_R16G16_USCALED:
        case VK_FORMAT_R16_SFLOAT:
        case VK_FORMAT_R16_SINT:
        case VK_FORMAT_R16_SNORM:
        case VK_FORMAT_R16_SSCALED:
        case VK_FORMAT_R16_UINT:
        case VK_FORMAT_R16_UNORM:
        case VK_FORMAT_R16_USCALED:
        case VK_FORMAT_R32G32B32A32_SFLOAT:
        case VK_FORMAT_R32G32B32A32_SINT:
        case VK_FORMAT_R32G32B32A32_UINT:
        case VK_FORMAT_R32G32B32_SFLOAT:
        case VK_FORMAT_R32G32B32_SINT:
        case VK_FORMAT_R32G32B32_UINT:
        case VK_FORMAT_R32G32_SFLOAT:
        case VK_FORMAT_R32G32_SINT:
        case VK_FORMAT_R32G32_UINT:
        case VK_FORMAT_R32_SFLOAT:
        case VK_FORMAT_R32_SINT:
        case VK_FORMAT_R32_UINT:
        case VK_FORMAT_R4G4B4A4_UNORM_PACK16:
        case VK_FORMAT_R4G4_UNORM_PACK8:
        case VK_FORMAT_R5G5B5A1_UNORM_PACK16:
        case VK_FORMAT_R5G6B5_UNORM_PACK16:
        case VK_FORMAT_R64G64B64A64_SFLOAT:
        case VK_FORMAT_R64G64B64A64_SINT:
        case VK_FORMAT_R64G64B64A64_UINT:
        case VK_FORMAT_R64G64B64_SFLOAT:
        case VK_FORMAT_R64G64B64_SINT:
        case VK_FORMAT_R64G64B64_UINT:
        case VK_FORMAT_R64G64_SFLOAT:
        case VK_FORMAT_R64G64_SINT:
        case VK_FORMAT_R64G64_UINT:
        case VK_FORMAT_R64_SFLOAT:
        case VK_FORMAT_R64_SINT:
        case VK_FORMAT_R64_UINT:
        case VK_FORMAT_R8G8B8A8_SINT:
        case VK_FORMAT_R8G8B8A8_SNORM:
        case VK_FORMAT_R8G8B8A8_SRGB:
        case VK_FORMAT_R8G8B8A8_SSCALED:
        case VK_FORMAT_R8G8B8A8_UINT:
        case VK_FORMAT_R8G8B8A8_UNORM:
        case VK_FORMAT_R8G8B8A8_USCALED:
        case VK_FORMAT_R8G8B8_SINT:
        case VK_FORMAT_R8G8B8_SNORM:
        case VK_FORMAT_R8G8B8_SRGB:
        case VK_FORMAT_R8G8B8_SSCALED:
        case VK_FORMAT_R8G8B8_UINT:
        case VK_FORMAT_R8G8B8_UNORM:
        case VK_FORMAT_R8G8B8_USCALED:
        case VK_FORMAT_R8G8_SINT:
        case VK_FORMAT_R8G8_SNORM:
        case VK_FORMAT_R8G8_SRGB:
        case VK_FORMAT_R8G8_SSCALED:
        case VK_FORMAT_R8G8_UINT:
        case VK_FORMAT_R8G8_UNORM:
        case VK_FORMAT_R8G8_USCALED:
        case VK_FORMAT_R8_SINT:
        case VK_FORMAT_R8_SNORM:
        case VK_FORMAT_R8_SRGB:
        case VK_FORMAT_R8_SSCALED:
        case VK_FORMAT_R8_UINT:
        case VK_FORMAT_R8_UNORM:
        case VK_FORMAT_R8_USCALED:
        case VK_FORMAT_S8_UINT:
        case VK_FORMAT_UNDEFINED:
        case VK_FORMAT_X8_D24_UNORM_PACK32:
            return 1;
        default:
            return 0;
    }
}


static inline uint32_t validate_VkFormatFeatureFlagBits(VkFormatFeatureFlagBits input_value)
{
    if (input_value > (VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT | VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT | VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG))
        return 0;
    return 1;
}


static inline uint32_t validate_VkFrontFace(VkFrontFace input_value)
{
    switch ((VkFrontFace)input_value)
    {
        case VK_FRONT_FACE_CLOCKWISE:
        case VK_FRONT_FACE_COUNTER_CLOCKWISE:
            return 1;
        default:
            return 0;
    }
}


static inline uint32_t validate_VkImageAspectFlagBits(VkImageAspectFlagBits input_value)
{
    if (input_value > (VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_METADATA_BIT))
        return 0;
    return 1;
}


static inline uint32_t validate_VkImageCreateFlagBits(VkImageCreateFlagBits input_value)
{
    if (input_value > (VK_IMAGE_CREATE_SPARSE_BINDING_BIT | VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT | VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT))
        return 0;
    return 1;
}


static inline uint32_t validate_VkImageLayout(VkImageLayout input_value)
{
    switch ((VkImageLayout)input_value)
    {
        case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL:
        case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL:
        case VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL:
        case VK_IMAGE_LAYOUT_GENERAL:
        case VK_IMAGE_LAYOUT_PREINITIALIZED:
        case VK_IMAGE_LAYOUT_PRESENT_SRC_KHR:
        case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
        case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL:
        case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL:
        case VK_IMAGE_LAYOUT_UNDEFINED:
            return 1;
        default:
            return 0;
    }
}


static inline uint32_t validate_VkImageTiling(VkImageTiling input_value)
{
    switch ((VkImageTiling)input_value)
    {
        case VK_IMAGE_TILING_LINEAR:
        case VK_IMAGE_TILING_OPTIMAL:
            return 1;
        default:
            return 0;
    }
}


static inline uint32_t validate_VkImageType(VkImageType input_value)
{
    switch ((VkImageType)input_value)
    {
        case VK_IMAGE_TYPE_1D:
        case VK_IMAGE_TYPE_2D:
        case VK_IMAGE_TYPE_3D:
            return 1;
        default:
            return 0;
    }
}


static inline uint32_t validate_VkImageUsageFlagBits(VkImageUsageFlagBits input_value)
{
    if (input_value > (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT))
        return 0;
    return 1;
}


static inline uint32_t validate_VkImageViewType(VkImageViewType input_value)
{
    switch ((VkImageViewType)input_value)
    {
        case VK_IMAGE_VIEW_TYPE_1D:
        case VK_IMAGE_VIEW_TYPE_1D_ARRAY:
        case VK_IMAGE_VIEW_TYPE_2D:
        case VK_IMAGE_VIEW_TYPE_2D_ARRAY:
        case VK_IMAGE_VIEW_TYPE_3D:
        case VK_IMAGE_VIEW_TYPE_CUBE:
        case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY:
            return 1;
        default:
            return 0;
    }
}


static inline uint32_t validate_VkIndexType(VkIndexType input_value)
{
    switch ((VkIndexType)input_value)
    {
        case VK_INDEX_TYPE_UINT16:
        case VK_INDEX_TYPE_UINT32:
            return 1;
        default:
            return 0;
    }
}


static inline uint32_t validate_VkInternalAllocationType(VkInternalAllocationType input_value)
{
    switch ((VkInternalAllocationType)input_value)
    {
        case VK_INTERNAL_ALLOCATION_TYPE_EXECUTABLE:
            return 1;
        default:
            return 0;
    }
}


static inline uint32_t validate_VkLogicOp(VkLogicOp input_value)
{
    switch ((VkLogicOp)input_value)
    {
        case VK_LOGIC_OP_AND:
        case VK_LOGIC_OP_AND_INVERTED:
        case VK_LOGIC_OP_AND_REVERSE:
        case VK_LOGIC_OP_CLEAR:
        case VK_LOGIC_OP_COPY:
        case VK_LOGIC_OP_COPY_INVERTED:
        case VK_LOGIC_OP_EQUIVALENT:
        case VK_LOGIC_OP_INVERT:
        case VK_LOGIC_OP_NAND:
        case VK_LOGIC_OP_NOR:
        case VK_LOGIC_OP_NO_OP:
        case VK_LOGIC_OP_OR:
        case VK_LOGIC_OP_OR_INVERTED:
        case VK_LOGIC_OP_OR_REVERSE:
        case VK_LOGIC_OP_SET:
        case VK_LOGIC_OP_XOR:
            return 1;
        default:
            return 0;
    }
}


static inline uint32_t validate_VkMemoryHeapFlagBits(VkMemoryHeapFlagBits input_value)
{
    if (input_value > (VK_MEMORY_HEAP_DEVICE_LOCAL_BIT))
        return 0;
    return 1;
}


static inline uint32_t validate_VkMemoryPropertyFlagBits(VkMemoryPropertyFlagBits input_value)
{
    if (input_value > (VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT | VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT))
        return 0;
    return 1;
}


static inline uint32_t validate_VkPhysicalDeviceType(VkPhysicalDeviceType input_value)
{
    switch ((VkPhysicalDeviceType)input_value)
    {
        case VK_PHYSICAL_DEVICE_TYPE_CPU:
        case VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU:
        case VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU:
        case VK_PHYSICAL_DEVICE_TYPE_OTHER:
        case VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU:
            return 1;
        default:
            return 0;
    }
}


static inline uint32_t validate_VkPipelineBindPoint(VkPipelineBindPoint input_value)
{
    switch ((VkPipelineBindPoint)input_value)
    {
        case VK_PIPELINE_BIND_POINT_COMPUTE:
        case VK_PIPELINE_BIND_POINT_GRAPHICS:
            return 1;
        default:
            return 0;
    }
}


static inline uint32_t validate_VkPipelineCacheHeaderVersion(VkPipelineCacheHeaderVersion input_value)
{
    switch ((VkPipelineCacheHeaderVersion)input_value)
    {
        case VK_PIPELINE_CACHE_HEADER_VERSION_ONE:
            return 1;
        default:
            return 0;
    }
}


static inline uint32_t validate_VkPipelineCreateFlagBits(VkPipelineCreateFlagBits input_value)
{
    if (input_value > (VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT | VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT | VK_PIPELINE_CREATE_DERIVATIVE_BIT))
        return 0;
    return 1;
}


static inline uint32_t validate_VkPipelineStageFlagBits(VkPipelineStageFlagBits input_value)
{
    if (input_value > (VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT | VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT | VK_PIPELINE_STAGE_VERTEX_INPUT_BIT | VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT | VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT | VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT | VK_PIPELINE_STAGE_HOST_BIT | VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT | VK_PIPELINE_STAGE_ALL_COMMANDS_BIT))
        return 0;
    return 1;
}


static inline uint32_t validate_VkPolygonMode(VkPolygonMode input_value)
{
    switch ((VkPolygonMode)input_value)
    {
        case VK_POLYGON_MODE_FILL:
        case VK_POLYGON_MODE_LINE:
        case VK_POLYGON_MODE_POINT:
            return 1;
        default:
            return 0;
    }
}


static inline uint32_t validate_VkPresentModeKHR(VkPresentModeKHR input_value)
{
    switch ((VkPresentModeKHR)input_value)
    {
        case VK_PRESENT_MODE_FIFO_KHR:
        case VK_PRESENT_MODE_FIFO_RELAXED_KHR:
        case VK_PRESENT_MODE_IMMEDIATE_KHR:
        case VK_PRESENT_MODE_MAILBOX_KHR:
            return 1;
        default:
            return 0;
    }
}


static inline uint32_t validate_VkPrimitiveTopology(VkPrimitiveTopology input_value)
{
    switch ((VkPrimitiveTopology)input_value)
    {
        case VK_PRIMITIVE_TOPOLOGY_LINE_LIST:
        case VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY:
        case VK_PRIMITIVE_TOPOLOGY_LINE_STRIP:
        case VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY:
        case VK_PRIMITIVE_TOPOLOGY_PATCH_LIST:
        case VK_PRIMITIVE_TOPOLOGY_POINT_LIST:
        case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN:
        case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST:
        case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY:
        case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP:
        case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY:
            return 1;
        default:
            return 0;
    }
}


static inline uint32_t validate_VkQueryControlFlagBits(VkQueryControlFlagBits input_value)
{
    if (input_value > (VK_QUERY_CONTROL_PRECISE_BIT))
        return 0;
    return 1;
}


static inline uint32_t validate_VkQueryPipelineStatisticFlagBits(VkQueryPipelineStatisticFlagBits input_value)
{
    if (input_value > (VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT | VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT | VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT | VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT | VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT | VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT))
        return 0;
    return 1;
}


static inline uint32_t validate_VkQueryResultFlagBits(VkQueryResultFlagBits input_value)
{
    if (input_value > (VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WAIT_BIT | VK_QUERY_RESULT_WITH_AVAILABILITY_BIT | VK_QUERY_RESULT_PARTIAL_BIT))
        return 0;
    return 1;
}


static inline uint32_t validate_VkQueryType(VkQueryType input_value)
{
    switch ((VkQueryType)input_value)
    {
        case VK_QUERY_TYPE_OCCLUSION:
        case VK_QUERY_TYPE_PIPELINE_STATISTICS:
        case VK_QUERY_TYPE_TIMESTAMP:
            return 1;
        default:
            return 0;
    }
}


static inline uint32_t validate_VkQueueFlagBits(VkQueueFlagBits input_value)
{
    if (input_value > (VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_TRANSFER_BIT | VK_QUEUE_SPARSE_BINDING_BIT))
        return 0;
    return 1;
}


static inline uint32_t validate_VkRasterizationOrderAMD(VkRasterizationOrderAMD input_value)
{
    switch ((VkRasterizationOrderAMD)input_value)
    {
        case VK_RASTERIZATION_ORDER_RELAXED_AMD:
        case VK_RASTERIZATION_ORDER_STRICT_AMD:
            return 1;
        default:
            return 0;
    }
}


static inline uint32_t validate_VkResult(VkResult input_value)
{
    switch ((VkResult)input_value)
    {
        case VK_ERROR_DEVICE_LOST:
        case VK_ERROR_EXTENSION_NOT_PRESENT:
        case VK_ERROR_FEATURE_NOT_PRESENT:
        case VK_ERROR_FORMAT_NOT_SUPPORTED:
        case VK_ERROR_FRAGMENTED_POOL:
        case VK_ERROR_INCOMPATIBLE_DISPLAY_KHR:
        case VK_ERROR_INCOMPATIBLE_DRIVER:
        case VK_ERROR_INITIALIZATION_FAILED:
        case VK_ERROR_INVALID_SHADER_NV:
        case VK_ERROR_LAYER_NOT_PRESENT:
        case VK_ERROR_MEMORY_MAP_FAILED:
        case VK_ERROR_NATIVE_WINDOW_IN_USE_KHR:
        case VK_ERROR_OUT_OF_DATE_KHR:
        case VK_ERROR_OUT_OF_DEVICE_MEMORY:
        case VK_ERROR_OUT_OF_HOST_MEMORY:
        case VK_ERROR_SURFACE_LOST_KHR:
        case VK_ERROR_TOO_MANY_OBJECTS:
        case VK_ERROR_VALIDATION_FAILED_EXT:
        case VK_EVENT_RESET:
        case VK_EVENT_SET:
        case VK_INCOMPLETE:
        case VK_NOT_READY:
        case VK_SUBOPTIMAL_KHR:
        case VK_SUCCESS:
        case VK_TIMEOUT:
            return 1;
        default:
            return 0;
    }
}


static inline uint32_t validate_VkSampleCountFlagBits(VkSampleCountFlagBits input_value)
{
    if (input_value > (VK_SAMPLE_COUNT_1_BIT | VK_SAMPLE_COUNT_2_BIT | VK_SAMPLE_COUNT_4_BIT | VK_SAMPLE_COUNT_8_BIT | VK_SAMPLE_COUNT_16_BIT | VK_SAMPLE_COUNT_32_BIT | VK_SAMPLE_COUNT_64_BIT))
        return 0;
    return 1;
}


static inline uint32_t validate_VkSamplerAddressMode(VkSamplerAddressMode input_value)
{
    switch ((VkSamplerAddressMode)input_value)
    {
        case VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER:
        case VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE:
        case VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT:
        case VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE:
        case VK_SAMPLER_ADDRESS_MODE_REPEAT:
            return 1;
        default:
            return 0;
    }
}


static inline uint32_t validate_VkSamplerMipmapMode(VkSamplerMipmapMode input_value)
{
    switch ((VkSamplerMipmapMode)input_value)
    {
        case VK_SAMPLER_MIPMAP_MODE_LINEAR:
        case VK_SAMPLER_MIPMAP_MODE_NEAREST:
            return 1;
        default:
            return 0;
    }
}


static inline uint32_t validate_VkShaderStageFlagBits(VkShaderStageFlagBits input_value)
{
    if (input_value > (VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT | VK_SHADER_STAGE_GEOMETRY_BIT | VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_COMPUTE_BIT | VK_SHADER_STAGE_ALL_GRAPHICS | VK_SHADER_STAGE_ALL))
        return 0;
    return 1;
}


static inline uint32_t validate_VkSharingMode(VkSharingMode input_value)
{
    switch ((VkSharingMode)input_value)
    {
        case VK_SHARING_MODE_CONCURRENT:
        case VK_SHARING_MODE_EXCLUSIVE:
            return 1;
        default:
            return 0;
    }
}


static inline uint32_t validate_VkSparseImageFormatFlagBits(VkSparseImageFormatFlagBits input_value)
{
    if (input_value > (VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT | VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT | VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT))
        return 0;
    return 1;
}


static inline uint32_t validate_VkSparseMemoryBindFlagBits(VkSparseMemoryBindFlagBits input_value)
{
    if (input_value > (VK_SPARSE_MEMORY_BIND_METADATA_BIT))
        return 0;
    return 1;
}


static inline uint32_t validate_VkStencilFaceFlagBits(VkStencilFaceFlagBits input_value)
{
    if (input_value > (VK_STENCIL_FACE_FRONT_BIT | VK_STENCIL_FACE_BACK_BIT | VK_STENCIL_FRONT_AND_BACK))
        return 0;
    return 1;
}


static inline uint32_t validate_VkStencilOp(VkStencilOp input_value)
{
    switch ((VkStencilOp)input_value)
    {
        case VK_STENCIL_OP_DECREMENT_AND_CLAMP:
        case VK_STENCIL_OP_DECREMENT_AND_WRAP:
        case VK_STENCIL_OP_INCREMENT_AND_CLAMP:
        case VK_STENCIL_OP_INCREMENT_AND_WRAP:
        case VK_STENCIL_OP_INVERT:
        case VK_STENCIL_OP_KEEP:
        case VK_STENCIL_OP_REPLACE:
        case VK_STENCIL_OP_ZERO:
            return 1;
        default:
            return 0;
    }
}


static inline uint32_t validate_VkStructureType(VkStructureType input_value)
{
    switch ((VkStructureType)input_value)
    {
        case VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR:
        case VK_STRUCTURE_TYPE_APPLICATION_INFO:
        case VK_STRUCTURE_TYPE_BIND_SPARSE_INFO:
        case VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO:
        case VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER:
        case VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO:
        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO:
        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO:
        case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO:
        case VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO:
        case VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO:
        case VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET:
        case VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT:
        case VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_NAME_INFO_EXT:
        case VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_TAG_INFO_EXT:
        case VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT:
        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV:
        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV:
        case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV:
        case VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO:
        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO:
        case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO:
        case VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO:
        case VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO:
        case VK_STRUCTURE_TYPE_DISPLAY_MODE_CREATE_INFO_KHR:
        case VK_STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR:
        case VK_STRUCTURE_TYPE_DISPLAY_SURFACE_CREATE_INFO_KHR:
        case VK_STRUCTURE_TYPE_EVENT_CREATE_INFO:
        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV:
        case VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV:
        case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV:
        case VK_STRUCTURE_TYPE_FENCE_CREATE_INFO:
        case VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO:
        case VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO:
        case VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO:
        case VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER:
        case VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO:
        case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV:
        case VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO:
        case VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO:
        case VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO:
        case VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE:
        case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO:
        case VK_STRUCTURE_TYPE_MEMORY_BARRIER:
        case VK_STRUCTURE_TYPE_MIR_SURFACE_CREATE_INFO_KHR:
        case VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO:
        case VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO:
        case VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO:
        case VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO:
        case VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO:
        case VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO:
        case VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO:
        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO:
        case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD:
        case VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO:
        case VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO:
        case VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO:
        case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO:
        case VK_STRUCTURE_TYPE_PRESENT_INFO_KHR:
        case VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO:
        case VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO:
        case VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO:
        case VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO:
        case VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO:
        case VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO:
        case VK_STRUCTURE_TYPE_SUBMIT_INFO:
        case VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR:
        case VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR:
        case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV:
        case VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR:
        case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET:
        case VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR:
        case VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR:
            return 1;
        default:
            return 0;
    }
}


static inline uint32_t validate_VkSubpassContents(VkSubpassContents input_value)
{
    switch ((VkSubpassContents)input_value)
    {
        case VK_SUBPASS_CONTENTS_INLINE:
        case VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS:
            return 1;
        default:
            return 0;
    }
}


static inline uint32_t validate_VkSurfaceTransformFlagBitsKHR(VkSurfaceTransformFlagBitsKHR input_value)
{
    if (input_value > (VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR | VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR | VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR | VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR | VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_BIT_KHR | VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_90_BIT_KHR | VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_180_BIT_KHR | VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_270_BIT_KHR | VK_SURFACE_TRANSFORM_INHERIT_BIT_KHR))
        return 0;
    return 1;
}


static inline uint32_t validate_VkSystemAllocationScope(VkSystemAllocationScope input_value)
{
    switch ((VkSystemAllocationScope)input_value)
    {
        case VK_SYSTEM_ALLOCATION_SCOPE_CACHE:
        case VK_SYSTEM_ALLOCATION_SCOPE_COMMAND:
        case VK_SYSTEM_ALLOCATION_SCOPE_DEVICE:
        case VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE:
        case VK_SYSTEM_ALLOCATION_SCOPE_OBJECT:
            return 1;
        default:
            return 0;
    }
}


static inline uint32_t validate_VkVertexInputRate(VkVertexInputRate input_value)
{
    switch ((VkVertexInputRate)input_value)
    {
        case VK_VERTEX_INPUT_RATE_INSTANCE:
        case VK_VERTEX_INPUT_RATE_VERTEX:
            return 1;
        default:
            return 0;
    }
}

