/**
* @project: orhi (OpenRHI)
* @author: Adrien Givry
* @licence: MIT
*/

#pragma once

#if defined(ORHI_COMPILE_VULKAN)

#include <orhi/types/EBlendFactor.h>  
#include <orhi/types/EBlendOp.h>  
#include <orhi/types/EBufferUsageFlags.h>  
#include <orhi/types/EColorComponentFlags.h>  
#include <orhi/types/EColorSpace.h>  
#include <orhi/types/ECommandBufferLevel.h>  
#include <orhi/types/ECommandBufferUsageFlags.h>  
#include <orhi/types/ECompareOp.h>  
#include <orhi/types/ECullModeFlags.h>  
#include <orhi/types/EDescriptorPoolCreateFlags.h>  
#include <orhi/types/EDescriptorType.h>  
#include <orhi/types/EDynamicState.h>  
#include <orhi/types/EFilter.h>  
#include <orhi/types/EFormat.h>  
#include <orhi/types/EFrontFace.h>  
#include <orhi/types/EIndexType.h>  
#include <orhi/types/ELogicOp.h>  
#include <orhi/types/EMemoryPropertyFlags.h>  
#include <orhi/types/EPipelineBindPoint.h>  
#include <orhi/types/EPipelineStageFlags.h>  
#include <orhi/types/EPolygonMode.h>  
#include <orhi/types/EPresentMode.h>  
#include <orhi/types/EPrimitiveTopology.h>  
#include <orhi/types/ESampleCountFlags.h>  
#include <orhi/types/ESamplerAddressMode.h>  
#include <orhi/types/ESamplerMipmapMode.h>  
#include <orhi/types/EShaderStageFlags.h>  
#include <orhi/types/EStencilOp.h>  
#include <orhi/types/ESurfaceTransformFlags.h>  
#include <orhi/types/ETextureAspectFlags.h>  
#include <orhi/types/ETextureLayout.h>  
#include <orhi/types/ETextureTiling.h>  
#include <orhi/types/ETextureType.h>  
#include <orhi/types/ETextureUsageType.h>  
#include <orhi/utils/EnumMapper.h>

#include <vulkan/vulkan.h>

template <>
struct orhi::utils::MappingFor<orhi::types::EBufferUsageFlags, VkBufferUsageFlags>
{
	using EnumType = orhi::types::EBufferUsageFlags;
	using type = std::tuple<
		EnumValuePair<EnumType::NONE, 0>,
		EnumValuePair<EnumType::TRANSFER_SRC_BIT, VK_BUFFER_USAGE_TRANSFER_SRC_BIT>,
		EnumValuePair<EnumType::TRANSFER_DST_BIT, VK_BUFFER_USAGE_TRANSFER_DST_BIT>,
		EnumValuePair<EnumType::UNIFORM_TEXEL_BUFFER_BIT, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT>,
		EnumValuePair<EnumType::STORAGE_TEXEL_BUFFER_BIT, VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT>,
		EnumValuePair<EnumType::UNIFORM_BUFFER_BIT, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT>,
		EnumValuePair<EnumType::STORAGE_BUFFER_BIT, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT>,
		EnumValuePair<EnumType::INDEX_BUFFER_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT>,
		EnumValuePair<EnumType::VERTEX_BUFFER_BIT, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT>,
		EnumValuePair<EnumType::INDIRECT_BUFFER_BIT, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT>,
		EnumValuePair<EnumType::SHADER_DEVICE_ADDRESS_BIT, VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT>,
		EnumValuePair<EnumType::VIDEO_DECODE_SRC_BIT_KHR, VK_BUFFER_USAGE_VIDEO_DECODE_SRC_BIT_KHR>,
		EnumValuePair<EnumType::VIDEO_DECODE_DST_BIT_KHR, VK_BUFFER_USAGE_VIDEO_DECODE_DST_BIT_KHR>,
		EnumValuePair<EnumType::TRANSFORM_FEEDBACK_BUFFER_BIT_EXT, VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT>,
		EnumValuePair<EnumType::TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT, VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT>,
		EnumValuePair<EnumType::CONDITIONAL_RENDERING_BIT_EXT, VK_BUFFER_USAGE_CONDITIONAL_RENDERING_BIT_EXT>,
		EnumValuePair<EnumType::ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR, VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR>,
		EnumValuePair<EnumType::ACCELERATION_STRUCTURE_STORAGE_BIT_KHR, VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR>,
		EnumValuePair<EnumType::SHADER_BINDING_TABLE_BIT_KHR, VK_BUFFER_USAGE_SHADER_BINDING_TABLE_BIT_KHR>,
		EnumValuePair<EnumType::VIDEO_ENCODE_DST_BIT_KHR, VK_BUFFER_USAGE_VIDEO_ENCODE_DST_BIT_KHR>,
		EnumValuePair<EnumType::VIDEO_ENCODE_SRC_BIT_KHR, VK_BUFFER_USAGE_VIDEO_ENCODE_SRC_BIT_KHR>,
		EnumValuePair<EnumType::SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT, VK_BUFFER_USAGE_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT>,
		EnumValuePair<EnumType::RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT, VK_BUFFER_USAGE_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT>,
		EnumValuePair<EnumType::PUSH_DESCRIPTORS_DESCRIPTOR_BUFFER_BIT_EXT, VK_BUFFER_USAGE_PUSH_DESCRIPTORS_DESCRIPTOR_BUFFER_BIT_EXT>,
		EnumValuePair<EnumType::MICROMAP_BUILD_INPUT_READ_ONLY_BIT_EXT, VK_BUFFER_USAGE_MICROMAP_BUILD_INPUT_READ_ONLY_BIT_EXT>,
		EnumValuePair<EnumType::MICROMAP_STORAGE_BIT_EXT, VK_BUFFER_USAGE_MICROMAP_STORAGE_BIT_EXT>,
		// EnumValuePair<EnumType::TILE_MEMORY_QCOM, VK_BUFFER_USAGE_TILE_MEMORY_QCOM>, // or VK_BUFFER_USAGE_TILE_MEMORY_BIT_QCOM?
		EnumValuePair<EnumType::RAY_TRACING_BIT_NV, VK_BUFFER_USAGE_RAY_TRACING_BIT_NV>,
		EnumValuePair<EnumType::SHADER_DEVICE_ADDRESS_BIT_EXT, VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_EXT>,
		EnumValuePair<EnumType::SHADER_DEVICE_ADDRESS_BIT_KHR, VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_KHR>,
		EnumValuePair<EnumType::ALL, VK_BUFFER_USAGE_FLAG_BITS_MAX_ENUM>
	>;
};

template <>
struct orhi::utils::MappingFor<orhi::types::ETextureUsageFlags, VkImageUsageFlags>
{
	using EnumType = orhi::types::ETextureUsageFlags;
	using type = std::tuple<
		EnumValuePair<EnumType::NONE, 0>,
		EnumValuePair<EnumType::TRANSFER_SRC_BIT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT>,
		EnumValuePair<EnumType::TRANSFER_DST_BIT, VK_IMAGE_USAGE_TRANSFER_DST_BIT>,
		EnumValuePair<EnumType::SAMPLED_BIT, VK_IMAGE_USAGE_SAMPLED_BIT>,
		EnumValuePair<EnumType::STORAGE_BIT, VK_IMAGE_USAGE_STORAGE_BIT>,
		EnumValuePair<EnumType::COLOR_ATTACHMENT_BIT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT>,
		EnumValuePair<EnumType::DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT>,
		EnumValuePair<EnumType::TRANSIENT_ATTACHMENT_BIT, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT>,
		EnumValuePair<EnumType::INPUT_ATTACHMENT_BIT, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT>,
		EnumValuePair<EnumType::ALL, VK_IMAGE_USAGE_FLAG_BITS_MAX_ENUM>
	>;
};

template <>
struct orhi::utils::MappingFor<orhi::types::EColorSpace, VkColorSpaceKHR>
{
	using EnumType = orhi::types::EColorSpace;
	using type = std::tuple<
		EnumValuePair<EnumType::SRGB_NONLINEAR_KHR, VK_COLOR_SPACE_SRGB_NONLINEAR_KHR>,
		EnumValuePair<EnumType::DISPLAY_P3_NONLINEAR_EXT, VK_COLOR_SPACE_DISPLAY_P3_NONLINEAR_EXT>,
		EnumValuePair<EnumType::EXTENDED_SRGB_LINEAR_EXT, VK_COLOR_SPACE_EXTENDED_SRGB_LINEAR_EXT>,
		EnumValuePair<EnumType::DISPLAY_P3_LINEAR_EXT, VK_COLOR_SPACE_DISPLAY_P3_LINEAR_EXT>,
		EnumValuePair<EnumType::DCI_P3_NONLINEAR_EXT, VK_COLOR_SPACE_DCI_P3_NONLINEAR_EXT>,
		EnumValuePair<EnumType::BT709_LINEAR_EXT, VK_COLOR_SPACE_BT709_LINEAR_EXT>,
		EnumValuePair<EnumType::BT709_NONLINEAR_EXT, VK_COLOR_SPACE_BT709_NONLINEAR_EXT>,
		EnumValuePair<EnumType::BT2020_LINEAR_EXT, VK_COLOR_SPACE_BT2020_LINEAR_EXT>,
		EnumValuePair<EnumType::HDR10_ST2084_EXT, VK_COLOR_SPACE_HDR10_ST2084_EXT>,
		EnumValuePair<EnumType::DOLBYVISION_EXT, VK_COLOR_SPACE_DOLBYVISION_EXT>,
		EnumValuePair<EnumType::HDR10_HLG_EXT, VK_COLOR_SPACE_HDR10_HLG_EXT>,
		EnumValuePair<EnumType::ADOBERGB_LINEAR_EXT, VK_COLOR_SPACE_ADOBERGB_LINEAR_EXT>,
		EnumValuePair<EnumType::ADOBERGB_NONLINEAR_EXT, VK_COLOR_SPACE_ADOBERGB_NONLINEAR_EXT>,
		EnumValuePair<EnumType::PASS_THROUGH_EXT, VK_COLOR_SPACE_PASS_THROUGH_EXT>,
		EnumValuePair<EnumType::EXTENDED_SRGB_NONLINEAR_EXT, VK_COLOR_SPACE_EXTENDED_SRGB_NONLINEAR_EXT>,
		EnumValuePair<EnumType::DISPLAY_NATIVE_AMD, VK_COLOR_SPACE_DISPLAY_NATIVE_AMD>,
		EnumValuePair<EnumType::DCI_P3_LINEAR_EXT, VK_COLOR_SPACE_DCI_P3_LINEAR_EXT>
	>;
};

template <>
struct orhi::utils::MappingFor<orhi::types::ECommandBufferLevel, VkCommandBufferLevel>
{
	using EnumType = orhi::types::ECommandBufferLevel;
	using type = std::tuple<
		EnumValuePair<EnumType::PRIMARY, VK_COMMAND_BUFFER_LEVEL_PRIMARY>,
		EnumValuePair<EnumType::SECONDARY, VK_COMMAND_BUFFER_LEVEL_SECONDARY>
	>;
};

template <>
struct orhi::utils::MappingFor<orhi::types::ECommandBufferUsageFlags, VkCommandBufferUsageFlags>
{
	using EnumType = orhi::types::ECommandBufferUsageFlags;
	using type = std::tuple<
		EnumValuePair<EnumType::NONE, 0>,
		EnumValuePair<EnumType::ONE_TIME_SUBMIT_BIT, VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT>,
		EnumValuePair<EnumType::RENDER_PASS_CONTINUE_BIT, VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT>,
		EnumValuePair<EnumType::SIMULTANEOUS_USE_BIT, VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT>,
		EnumValuePair<EnumType::ALL, VK_COMMAND_BUFFER_USAGE_FLAG_BITS_MAX_ENUM>
	>;
};

template <>
struct orhi::utils::MappingFor<orhi::types::EDescriptorType, VkDescriptorType>
{
	using EnumType = orhi::types::EDescriptorType;
	using type = std::tuple<
		EnumValuePair<EnumType::SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLER>,
		EnumValuePair<EnumType::COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER>,
		EnumValuePair<EnumType::SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE>,
		EnumValuePair<EnumType::STORAGE_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE>,
		EnumValuePair<EnumType::UNIFORM_TEXEL_BUFFER, VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER>,
		EnumValuePair<EnumType::STORAGE_TEXEL_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER>,
		EnumValuePair<EnumType::UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER>,
		EnumValuePair<EnumType::STORAGE_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER>,
		EnumValuePair<EnumType::UNIFORM_BUFFER_DYNAMIC, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC>,
		EnumValuePair<EnumType::STORAGE_BUFFER_DYNAMIC, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC>,
		EnumValuePair<EnumType::INPUT_ATTACHMENT, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT>,
		EnumValuePair<EnumType::INLINE_UNIFORM_BLOCK, VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK>,
		EnumValuePair<EnumType::ACCELERATION_STRUCTURE_KHR, VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR>,
		EnumValuePair<EnumType::ACCELERATION_STRUCTURE_NV, VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV>,
		EnumValuePair<EnumType::SAMPLE_WEIGHT_IMAGE_QCOM, VK_DESCRIPTOR_TYPE_SAMPLE_WEIGHT_IMAGE_QCOM>,
		EnumValuePair<EnumType::BLOCK_MATCH_IMAGE_QCOM, VK_DESCRIPTOR_TYPE_BLOCK_MATCH_IMAGE_QCOM>,
		EnumValuePair<EnumType::MUTABLE_EXT, VK_DESCRIPTOR_TYPE_MUTABLE_EXT>,
		EnumValuePair<EnumType::PARTITIONED_ACCELERATION_STRUCTURE_NV, VK_DESCRIPTOR_TYPE_PARTITIONED_ACCELERATION_STRUCTURE_NV>,
		EnumValuePair<EnumType::INLINE_UNIFORM_BLOCK_EXT, VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT>,
		EnumValuePair<EnumType::MUTABLE_VALVE, VK_DESCRIPTOR_TYPE_MUTABLE_VALVE>
	>;
};

template <>
struct orhi::utils::MappingFor<orhi::types::EFormat, VkFormat>
{
	using EnumType = orhi::types::EFormat;
	using type = std::tuple<
		EnumValuePair<EnumType::UNDEFINED, VK_FORMAT_UNDEFINED>,
		EnumValuePair<EnumType::R4G4_UNORM_PACK8, VK_FORMAT_R4G4_UNORM_PACK8>,
		EnumValuePair<EnumType::R4G4B4A4_UNORM_PACK16, VK_FORMAT_R4G4B4A4_UNORM_PACK16>,
		EnumValuePair<EnumType::B4G4R4A4_UNORM_PACK16, VK_FORMAT_B4G4R4A4_UNORM_PACK16>,
		EnumValuePair<EnumType::R5G6B5_UNORM_PACK16, VK_FORMAT_R5G6B5_UNORM_PACK16>,
		EnumValuePair<EnumType::B5G6R5_UNORM_PACK16, VK_FORMAT_B5G6R5_UNORM_PACK16>,
		EnumValuePair<EnumType::R5G5B5A1_UNORM_PACK16, VK_FORMAT_R5G5B5A1_UNORM_PACK16>,
		EnumValuePair<EnumType::B5G5R5A1_UNORM_PACK16, VK_FORMAT_B5G5R5A1_UNORM_PACK16>,
		EnumValuePair<EnumType::A1R5G5B5_UNORM_PACK16, VK_FORMAT_A1R5G5B5_UNORM_PACK16>,
		EnumValuePair<EnumType::R8_UNORM, VK_FORMAT_R8_UNORM>,
		EnumValuePair<EnumType::R8_SNORM, VK_FORMAT_R8_SNORM>,
		EnumValuePair<EnumType::R8_USCALED, VK_FORMAT_R8_USCALED>,
		EnumValuePair<EnumType::R8_SSCALED, VK_FORMAT_R8_SSCALED>,
		EnumValuePair<EnumType::R8_UINT, VK_FORMAT_R8_UINT>,
		EnumValuePair<EnumType::R8_SINT, VK_FORMAT_R8_SINT>,
		EnumValuePair<EnumType::R8_SRGB, VK_FORMAT_R8_SRGB>,
		EnumValuePair<EnumType::R8G8_UNORM, VK_FORMAT_R8G8_UNORM>,
		EnumValuePair<EnumType::R8G8_SNORM, VK_FORMAT_R8G8_SNORM>,
		EnumValuePair<EnumType::R8G8_USCALED, VK_FORMAT_R8G8_USCALED>,
		EnumValuePair<EnumType::R8G8_SSCALED, VK_FORMAT_R8G8_SSCALED>,
		EnumValuePair<EnumType::R8G8_UINT, VK_FORMAT_R8G8_UINT>,
		EnumValuePair<EnumType::R8G8_SINT, VK_FORMAT_R8G8_SINT>,
		EnumValuePair<EnumType::R8G8_SRGB, VK_FORMAT_R8G8_SRGB>,
		EnumValuePair<EnumType::R8G8B8_UNORM, VK_FORMAT_R8G8B8_UNORM>,
		EnumValuePair<EnumType::R8G8B8_SNORM, VK_FORMAT_R8G8B8_SNORM>,
		EnumValuePair<EnumType::R8G8B8_USCALED, VK_FORMAT_R8G8B8_USCALED>,
		EnumValuePair<EnumType::R8G8B8_SSCALED, VK_FORMAT_R8G8B8_SSCALED>,
		EnumValuePair<EnumType::R8G8B8_UINT, VK_FORMAT_R8G8B8_UINT>,
		EnumValuePair<EnumType::R8G8B8_SINT, VK_FORMAT_R8G8B8_SINT>,
		EnumValuePair<EnumType::R8G8B8_SRGB, VK_FORMAT_R8G8B8_SRGB>,
		EnumValuePair<EnumType::B8G8R8_UNORM, VK_FORMAT_B8G8R8_UNORM>,
		EnumValuePair<EnumType::B8G8R8_SNORM, VK_FORMAT_B8G8R8_SNORM>,
		EnumValuePair<EnumType::B8G8R8_USCALED, VK_FORMAT_B8G8R8_USCALED>,
		EnumValuePair<EnumType::B8G8R8_SSCALED, VK_FORMAT_B8G8R8_SSCALED>,
		EnumValuePair<EnumType::B8G8R8_UINT, VK_FORMAT_B8G8R8_UINT>,
		EnumValuePair<EnumType::B8G8R8_SINT, VK_FORMAT_B8G8R8_SINT>,
		EnumValuePair<EnumType::B8G8R8_SRGB, VK_FORMAT_B8G8R8_SRGB>,
		EnumValuePair<EnumType::R8G8B8A8_UNORM, VK_FORMAT_R8G8B8A8_UNORM>,
		EnumValuePair<EnumType::R8G8B8A8_SNORM, VK_FORMAT_R8G8B8A8_SNORM>,
		EnumValuePair<EnumType::R8G8B8A8_USCALED, VK_FORMAT_R8G8B8A8_USCALED>,
		EnumValuePair<EnumType::R8G8B8A8_SSCALED, VK_FORMAT_R8G8B8A8_SSCALED>,
		EnumValuePair<EnumType::R8G8B8A8_UINT, VK_FORMAT_R8G8B8A8_UINT>,
		EnumValuePair<EnumType::R8G8B8A8_SINT, VK_FORMAT_R8G8B8A8_SINT>,
		EnumValuePair<EnumType::R8G8B8A8_SRGB, VK_FORMAT_R8G8B8A8_SRGB>,
		EnumValuePair<EnumType::B8G8R8A8_UNORM, VK_FORMAT_B8G8R8A8_UNORM>,
		EnumValuePair<EnumType::B8G8R8A8_SNORM, VK_FORMAT_B8G8R8A8_SNORM>,
		EnumValuePair<EnumType::B8G8R8A8_USCALED, VK_FORMAT_B8G8R8A8_USCALED>,
		EnumValuePair<EnumType::B8G8R8A8_SSCALED, VK_FORMAT_B8G8R8A8_SSCALED>,
		EnumValuePair<EnumType::B8G8R8A8_UINT, VK_FORMAT_B8G8R8A8_UINT>,
		EnumValuePair<EnumType::B8G8R8A8_SINT, VK_FORMAT_B8G8R8A8_SINT>,
		EnumValuePair<EnumType::B8G8R8A8_SRGB, VK_FORMAT_B8G8R8A8_SRGB>,
		EnumValuePair<EnumType::A8B8G8R8_UNORM_PACK32, VK_FORMAT_A8B8G8R8_UNORM_PACK32>,
		EnumValuePair<EnumType::A8B8G8R8_SNORM_PACK32, VK_FORMAT_A8B8G8R8_SNORM_PACK32>,
		EnumValuePair<EnumType::A8B8G8R8_USCALED_PACK32, VK_FORMAT_A8B8G8R8_USCALED_PACK32>,
		EnumValuePair<EnumType::A8B8G8R8_SSCALED_PACK32, VK_FORMAT_A8B8G8R8_SSCALED_PACK32>,
		EnumValuePair<EnumType::A8B8G8R8_UINT_PACK32, VK_FORMAT_A8B8G8R8_UINT_PACK32>,
		EnumValuePair<EnumType::A8B8G8R8_SINT_PACK32, VK_FORMAT_A8B8G8R8_SINT_PACK32>,
		EnumValuePair<EnumType::A8B8G8R8_SRGB_PACK32, VK_FORMAT_A8B8G8R8_SRGB_PACK32>,
		EnumValuePair<EnumType::A2R10G10B10_UNORM_PACK32, VK_FORMAT_A2R10G10B10_UNORM_PACK32>,
		EnumValuePair<EnumType::A2R10G10B10_SNORM_PACK32, VK_FORMAT_A2R10G10B10_SNORM_PACK32>,
		EnumValuePair<EnumType::A2R10G10B10_USCALED_PACK32, VK_FORMAT_A2R10G10B10_USCALED_PACK32>,
		EnumValuePair<EnumType::A2R10G10B10_SSCALED_PACK32, VK_FORMAT_A2R10G10B10_SSCALED_PACK32>,
		EnumValuePair<EnumType::A2R10G10B10_UINT_PACK32, VK_FORMAT_A2R10G10B10_UINT_PACK32>,
		EnumValuePair<EnumType::A2R10G10B10_SINT_PACK32, VK_FORMAT_A2R10G10B10_SINT_PACK32>,
		EnumValuePair<EnumType::A2B10G10R10_UNORM_PACK32, VK_FORMAT_A2B10G10R10_UNORM_PACK32>,
		EnumValuePair<EnumType::A2B10G10R10_SNORM_PACK32, VK_FORMAT_A2B10G10R10_SNORM_PACK32>,
		EnumValuePair<EnumType::A2B10G10R10_USCALED_PACK32, VK_FORMAT_A2B10G10R10_USCALED_PACK32>,
		EnumValuePair<EnumType::A2B10G10R10_SSCALED_PACK32, VK_FORMAT_A2B10G10R10_SSCALED_PACK32>,
		EnumValuePair<EnumType::A2B10G10R10_UINT_PACK32, VK_FORMAT_A2B10G10R10_UINT_PACK32>,
		EnumValuePair<EnumType::A2B10G10R10_SINT_PACK32, VK_FORMAT_A2B10G10R10_SINT_PACK32>,
		EnumValuePair<EnumType::R16_UNORM, VK_FORMAT_R16_UNORM>,
		EnumValuePair<EnumType::R16_SNORM, VK_FORMAT_R16_SNORM>,
		EnumValuePair<EnumType::R16_USCALED, VK_FORMAT_R16_USCALED>,
		EnumValuePair<EnumType::R16_SSCALED, VK_FORMAT_R16_SSCALED>,
		EnumValuePair<EnumType::R16_UINT, VK_FORMAT_R16_UINT>,
		EnumValuePair<EnumType::R16_SINT, VK_FORMAT_R16_SINT>,
		EnumValuePair<EnumType::R16_SFLOAT, VK_FORMAT_R16_SFLOAT>,
		EnumValuePair<EnumType::R16G16_UNORM, VK_FORMAT_R16G16_UNORM>,
		EnumValuePair<EnumType::R16G16_SNORM, VK_FORMAT_R16G16_SNORM>,
		EnumValuePair<EnumType::R16G16_USCALED, VK_FORMAT_R16G16_USCALED>,
		EnumValuePair<EnumType::R16G16_SSCALED, VK_FORMAT_R16G16_SSCALED>,
		EnumValuePair<EnumType::R16G16_UINT, VK_FORMAT_R16G16_UINT>,
		EnumValuePair<EnumType::R16G16_SINT, VK_FORMAT_R16G16_SINT>,
		EnumValuePair<EnumType::R16G16_SFLOAT, VK_FORMAT_R16G16_SFLOAT>,
		EnumValuePair<EnumType::R16G16B16_UNORM, VK_FORMAT_R16G16B16_UNORM>,
		EnumValuePair<EnumType::R16G16B16_SNORM, VK_FORMAT_R16G16B16_SNORM>,
		EnumValuePair<EnumType::R16G16B16_USCALED, VK_FORMAT_R16G16B16_USCALED>,
		EnumValuePair<EnumType::R16G16B16_SSCALED, VK_FORMAT_R16G16B16_SSCALED>,
		EnumValuePair<EnumType::R16G16B16_UINT, VK_FORMAT_R16G16B16_UINT>,
		EnumValuePair<EnumType::R16G16B16_SINT, VK_FORMAT_R16G16B16_SINT>,
		EnumValuePair<EnumType::R16G16B16_SFLOAT, VK_FORMAT_R16G16B16_SFLOAT>,
		EnumValuePair<EnumType::R16G16B16A16_UNORM, VK_FORMAT_R16G16B16A16_UNORM>,
		EnumValuePair<EnumType::R16G16B16A16_SNORM, VK_FORMAT_R16G16B16A16_SNORM>,
		EnumValuePair<EnumType::R16G16B16A16_USCALED, VK_FORMAT_R16G16B16A16_USCALED>,
		EnumValuePair<EnumType::R16G16B16A16_SSCALED, VK_FORMAT_R16G16B16A16_SSCALED>,
		EnumValuePair<EnumType::R16G16B16A16_UINT, VK_FORMAT_R16G16B16A16_UINT>,
		EnumValuePair<EnumType::R16G16B16A16_SINT, VK_FORMAT_R16G16B16A16_SINT>,
		EnumValuePair<EnumType::R16G16B16A16_SFLOAT, VK_FORMAT_R16G16B16A16_SFLOAT>,
		EnumValuePair<EnumType::R32_UINT, VK_FORMAT_R32_UINT>,
		EnumValuePair<EnumType::R32_SINT, VK_FORMAT_R32_SINT>,
		EnumValuePair<EnumType::R32_SFLOAT, VK_FORMAT_R32_SFLOAT>,
		EnumValuePair<EnumType::R32G32_UINT, VK_FORMAT_R32G32_UINT>,
		EnumValuePair<EnumType::R32G32_SINT, VK_FORMAT_R32G32_SINT>,
		EnumValuePair<EnumType::R32G32_SFLOAT, VK_FORMAT_R32G32_SFLOAT>,
		EnumValuePair<EnumType::R32G32B32_UINT, VK_FORMAT_R32G32B32_UINT>,
		EnumValuePair<EnumType::R32G32B32_SINT, VK_FORMAT_R32G32B32_SINT>,
		EnumValuePair<EnumType::R32G32B32_SFLOAT, VK_FORMAT_R32G32B32_SFLOAT>,
		EnumValuePair<EnumType::R32G32B32A32_UINT, VK_FORMAT_R32G32B32A32_UINT>,
		EnumValuePair<EnumType::R32G32B32A32_SINT, VK_FORMAT_R32G32B32A32_SINT>,
		EnumValuePair<EnumType::R32G32B32A32_SFLOAT, VK_FORMAT_R32G32B32A32_SFLOAT>,
		EnumValuePair<EnumType::R64_UINT, VK_FORMAT_R64_UINT>,
		EnumValuePair<EnumType::R64_SINT, VK_FORMAT_R64_SINT>,
		EnumValuePair<EnumType::R64_SFLOAT, VK_FORMAT_R64_SFLOAT>,
		EnumValuePair<EnumType::R64G64_UINT, VK_FORMAT_R64G64_UINT>,
		EnumValuePair<EnumType::R64G64_SINT, VK_FORMAT_R64G64_SINT>,
		EnumValuePair<EnumType::R64G64_SFLOAT, VK_FORMAT_R64G64_SFLOAT>,
		EnumValuePair<EnumType::R64G64B64_UINT, VK_FORMAT_R64G64B64_UINT>,
		EnumValuePair<EnumType::R64G64B64_SINT, VK_FORMAT_R64G64B64_SINT>,
		EnumValuePair<EnumType::R64G64B64_SFLOAT, VK_FORMAT_R64G64B64_SFLOAT>,
		EnumValuePair<EnumType::R64G64B64A64_UINT, VK_FORMAT_R64G64B64A64_UINT>,
		EnumValuePair<EnumType::R64G64B64A64_SINT, VK_FORMAT_R64G64B64A64_SINT>,
		EnumValuePair<EnumType::R64G64B64A64_SFLOAT, VK_FORMAT_R64G64B64A64_SFLOAT>,
		EnumValuePair<EnumType::B10G11R11_UFLOAT_PACK32, VK_FORMAT_B10G11R11_UFLOAT_PACK32>,
		EnumValuePair<EnumType::E5B9G9R9_UFLOAT_PACK32, VK_FORMAT_E5B9G9R9_UFLOAT_PACK32>,
		EnumValuePair<EnumType::D16_UNORM, VK_FORMAT_D16_UNORM>,
		EnumValuePair<EnumType::X8_D24_UNORM_PACK32, VK_FORMAT_X8_D24_UNORM_PACK32>,
		EnumValuePair<EnumType::D32_SFLOAT, VK_FORMAT_D32_SFLOAT>,
		EnumValuePair<EnumType::S8_UINT, VK_FORMAT_S8_UINT>,
		EnumValuePair<EnumType::D16_UNORM_S8_UINT, VK_FORMAT_D16_UNORM_S8_UINT>,
		EnumValuePair<EnumType::D24_UNORM_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT>,
		EnumValuePair<EnumType::D32_SFLOAT_S8_UINT, VK_FORMAT_D32_SFLOAT_S8_UINT>,
		EnumValuePair<EnumType::BC1_RGB_UNORM_BLOCK, VK_FORMAT_BC1_RGB_UNORM_BLOCK>,
		EnumValuePair<EnumType::BC1_RGB_SRGB_BLOCK, VK_FORMAT_BC1_RGB_SRGB_BLOCK>,
		EnumValuePair<EnumType::BC1_RGBA_UNORM_BLOCK, VK_FORMAT_BC1_RGBA_UNORM_BLOCK>,
		EnumValuePair<EnumType::BC1_RGBA_SRGB_BLOCK, VK_FORMAT_BC1_RGBA_SRGB_BLOCK>,
		EnumValuePair<EnumType::BC2_UNORM_BLOCK, VK_FORMAT_BC2_UNORM_BLOCK>,
		EnumValuePair<EnumType::BC2_SRGB_BLOCK, VK_FORMAT_BC2_SRGB_BLOCK>,
		EnumValuePair<EnumType::BC3_UNORM_BLOCK, VK_FORMAT_BC3_UNORM_BLOCK>,
		EnumValuePair<EnumType::BC3_SRGB_BLOCK, VK_FORMAT_BC3_SRGB_BLOCK>,
		EnumValuePair<EnumType::BC4_UNORM_BLOCK, VK_FORMAT_BC4_UNORM_BLOCK>,
		EnumValuePair<EnumType::BC4_SNORM_BLOCK, VK_FORMAT_BC4_SNORM_BLOCK>,
		EnumValuePair<EnumType::BC5_UNORM_BLOCK, VK_FORMAT_BC5_UNORM_BLOCK>,
		EnumValuePair<EnumType::BC5_SNORM_BLOCK, VK_FORMAT_BC5_SNORM_BLOCK>,
		EnumValuePair<EnumType::BC6H_UFLOAT_BLOCK, VK_FORMAT_BC6H_UFLOAT_BLOCK>,
		EnumValuePair<EnumType::BC6H_SFLOAT_BLOCK, VK_FORMAT_BC6H_SFLOAT_BLOCK>,
		EnumValuePair<EnumType::BC7_UNORM_BLOCK, VK_FORMAT_BC7_UNORM_BLOCK>,
		EnumValuePair<EnumType::BC7_SRGB_BLOCK, VK_FORMAT_BC7_SRGB_BLOCK>,
		EnumValuePair<EnumType::ETC2_R8G8B8_UNORM_BLOCK, VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK>,
		EnumValuePair<EnumType::ETC2_R8G8B8_SRGB_BLOCK, VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK>,
		EnumValuePair<EnumType::ETC2_R8G8B8A1_UNORM_BLOCK, VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK>,
		EnumValuePair<EnumType::ETC2_R8G8B8A1_SRGB_BLOCK, VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK>,
		EnumValuePair<EnumType::ETC2_R8G8B8A8_UNORM_BLOCK, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK>,
		EnumValuePair<EnumType::ETC2_R8G8B8A8_SRGB_BLOCK, VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK>,
		EnumValuePair<EnumType::EAC_R11_UNORM_BLOCK, VK_FORMAT_EAC_R11_UNORM_BLOCK>,
		EnumValuePair<EnumType::EAC_R11_SNORM_BLOCK, VK_FORMAT_EAC_R11_SNORM_BLOCK>,
		EnumValuePair<EnumType::EAC_R11G11_UNORM_BLOCK, VK_FORMAT_EAC_R11G11_UNORM_BLOCK>,
		EnumValuePair<EnumType::EAC_R11G11_SNORM_BLOCK, VK_FORMAT_EAC_R11G11_SNORM_BLOCK>,
		EnumValuePair<EnumType::ASTC_4x4_UNORM_BLOCK, VK_FORMAT_ASTC_4x4_UNORM_BLOCK>,
		EnumValuePair<EnumType::ASTC_4x4_SRGB_BLOCK, VK_FORMAT_ASTC_4x4_SRGB_BLOCK>,
		EnumValuePair<EnumType::ASTC_5x4_UNORM_BLOCK, VK_FORMAT_ASTC_5x4_UNORM_BLOCK>,
		EnumValuePair<EnumType::ASTC_5x4_SRGB_BLOCK, VK_FORMAT_ASTC_5x4_SRGB_BLOCK>,
		EnumValuePair<EnumType::ASTC_5x5_UNORM_BLOCK, VK_FORMAT_ASTC_5x5_UNORM_BLOCK>,
		EnumValuePair<EnumType::ASTC_5x5_SRGB_BLOCK, VK_FORMAT_ASTC_5x5_SRGB_BLOCK>,
		EnumValuePair<EnumType::ASTC_6x5_UNORM_BLOCK, VK_FORMAT_ASTC_6x5_UNORM_BLOCK>,
		EnumValuePair<EnumType::ASTC_6x5_SRGB_BLOCK, VK_FORMAT_ASTC_6x5_SRGB_BLOCK>,
		EnumValuePair<EnumType::ASTC_6x6_UNORM_BLOCK, VK_FORMAT_ASTC_6x6_UNORM_BLOCK>,
		EnumValuePair<EnumType::ASTC_6x6_SRGB_BLOCK, VK_FORMAT_ASTC_6x6_SRGB_BLOCK>,
		EnumValuePair<EnumType::ASTC_8x5_UNORM_BLOCK, VK_FORMAT_ASTC_8x5_UNORM_BLOCK>,
		EnumValuePair<EnumType::ASTC_8x5_SRGB_BLOCK, VK_FORMAT_ASTC_8x5_SRGB_BLOCK>,
		EnumValuePair<EnumType::ASTC_8x6_UNORM_BLOCK, VK_FORMAT_ASTC_8x6_UNORM_BLOCK>,
		EnumValuePair<EnumType::ASTC_8x6_SRGB_BLOCK, VK_FORMAT_ASTC_8x6_SRGB_BLOCK>,
		EnumValuePair<EnumType::ASTC_8x8_UNORM_BLOCK, VK_FORMAT_ASTC_8x8_UNORM_BLOCK>,
		EnumValuePair<EnumType::ASTC_8x8_SRGB_BLOCK, VK_FORMAT_ASTC_8x8_SRGB_BLOCK>,
		EnumValuePair<EnumType::ASTC_10x5_UNORM_BLOCK, VK_FORMAT_ASTC_10x5_UNORM_BLOCK>,
		EnumValuePair<EnumType::ASTC_10x5_SRGB_BLOCK, VK_FORMAT_ASTC_10x5_SRGB_BLOCK>,
		EnumValuePair<EnumType::ASTC_10x6_UNORM_BLOCK, VK_FORMAT_ASTC_10x6_UNORM_BLOCK>,
		EnumValuePair<EnumType::ASTC_10x6_SRGB_BLOCK, VK_FORMAT_ASTC_10x6_SRGB_BLOCK>,
		EnumValuePair<EnumType::ASTC_10x8_UNORM_BLOCK, VK_FORMAT_ASTC_10x8_UNORM_BLOCK>,
		EnumValuePair<EnumType::ASTC_10x8_SRGB_BLOCK, VK_FORMAT_ASTC_10x8_SRGB_BLOCK>,
		EnumValuePair<EnumType::ASTC_10x10_UNORM_BLOCK, VK_FORMAT_ASTC_10x10_UNORM_BLOCK>,
		EnumValuePair<EnumType::ASTC_10x10_SRGB_BLOCK, VK_FORMAT_ASTC_10x10_SRGB_BLOCK>,
		EnumValuePair<EnumType::ASTC_12x10_UNORM_BLOCK, VK_FORMAT_ASTC_12x10_UNORM_BLOCK>,
		EnumValuePair<EnumType::ASTC_12x10_SRGB_BLOCK, VK_FORMAT_ASTC_12x10_SRGB_BLOCK>,
		EnumValuePair<EnumType::ASTC_12x12_UNORM_BLOCK, VK_FORMAT_ASTC_12x12_UNORM_BLOCK>,
		EnumValuePair<EnumType::ASTC_12x12_SRGB_BLOCK, VK_FORMAT_ASTC_12x12_SRGB_BLOCK>
	>;
};

template <>
struct orhi::utils::MappingFor<orhi::types::EIndexType, VkIndexType>
{
	using EnumType = orhi::types::EIndexType;
	using type = std::tuple<
		EnumValuePair<EnumType::UINT16, VK_INDEX_TYPE_UINT16>,
		EnumValuePair<EnumType::UINT32, VK_INDEX_TYPE_UINT32>,
		EnumValuePair<EnumType::UINT8, VK_INDEX_TYPE_UINT8_KHR>,
		EnumValuePair<EnumType::NONE_KHR, VK_INDEX_TYPE_NONE_KHR>,
		EnumValuePair<EnumType::NONE_NV, VK_INDEX_TYPE_NONE_NV>,
		EnumValuePair<EnumType::UINT8_EXT, VK_INDEX_TYPE_UINT8_EXT>,
		EnumValuePair<EnumType::UINT8_KHR, VK_INDEX_TYPE_UINT8_KHR>
	>;
};

template <>
struct orhi::utils::MappingFor<orhi::types::EMemoryPropertyFlags, VkMemoryPropertyFlags>
{
	using EnumType = orhi::types::EMemoryPropertyFlags;
	using type = std::tuple<
		EnumValuePair<EnumType::NONE, 0>,
		EnumValuePair<EnumType::DEVICE_LOCAL_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT>,
		EnumValuePair<EnumType::HOST_VISIBLE_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT>,
		EnumValuePair<EnumType::HOST_COHERENT_BIT, VK_MEMORY_PROPERTY_HOST_COHERENT_BIT>,
		EnumValuePair<EnumType::HOST_CACHED_BIT, VK_MEMORY_PROPERTY_HOST_CACHED_BIT>,
		EnumValuePair<EnumType::LAZILY_ALLOCATED_BIT, VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT>,
		EnumValuePair<EnumType::PROTECTED_BIT, VK_MEMORY_PROPERTY_PROTECTED_BIT>,
		EnumValuePair<EnumType::DEVICE_COHERENT_BIT_AMD, VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD>,
		EnumValuePair<EnumType::DEVICE_UNCACHED_BIT_AMD, VK_MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD>,
		EnumValuePair<EnumType::RDMA_CAPABLE_BIT_NV, VK_MEMORY_PROPERTY_RDMA_CAPABLE_BIT_NV>,
		EnumValuePair<EnumType::ALL, VK_MEMORY_PROPERTY_FLAG_BITS_MAX_ENUM>
	>;
};

template <>
struct orhi::utils::MappingFor<orhi::types::EPipelineBindPoint, VkPipelineBindPoint>
{
	using EnumType = orhi::types::EPipelineBindPoint;
	using type = std::tuple<
		EnumValuePair<EnumType::GRAPHICS, VK_PIPELINE_BIND_POINT_GRAPHICS>,
		EnumValuePair<EnumType::COMPUTE, VK_PIPELINE_BIND_POINT_COMPUTE>,
		EnumValuePair<EnumType::RAY_TRACING_KHR, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR>,
		EnumValuePair<EnumType::SUBPASS_SHADING_HUAWEI, VK_PIPELINE_BIND_POINT_SUBPASS_SHADING_HUAWEI>,
		EnumValuePair<EnumType::RAY_TRACING_NV, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV>
	>;
};

template <>
struct orhi::utils::MappingFor<orhi::types::EPresentMode, VkPresentModeKHR>
{
	using EnumType = orhi::types::EPresentMode;
	using type = std::tuple<
		EnumValuePair<EnumType::IMMEDIATE_KHR, VK_PRESENT_MODE_IMMEDIATE_KHR>,
		EnumValuePair<EnumType::MAILBOX_KHR, VK_PRESENT_MODE_MAILBOX_KHR>,
		EnumValuePair<EnumType::FIFO_KHR, VK_PRESENT_MODE_FIFO_KHR>,
		EnumValuePair<EnumType::FIFO_RELAXED_KHR, VK_PRESENT_MODE_FIFO_RELAXED_KHR>,
		EnumValuePair<EnumType::SHARED_DEMAND_REFRESH_KHR, VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR>,
		EnumValuePair<EnumType::SHARED_CONTINUOUS_REFRESH_KHR, VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR>,
		EnumValuePair<EnumType::FIFO_LATEST_READY_EXT, VK_PRESENT_MODE_FIFO_LATEST_READY_EXT>
	>;
};

template <>
struct orhi::utils::MappingFor<orhi::types::EShaderStageFlags, VkShaderStageFlags>
{
	using EnumType = orhi::types::EShaderStageFlags;
	using type = std::tuple<
		EnumValuePair<EnumType::NONE, 0>,
		EnumValuePair<EnumType::VERTEX_BIT, VK_SHADER_STAGE_VERTEX_BIT>,
		EnumValuePair<EnumType::TESSELLATION_CONTROL_BIT, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT>,
		EnumValuePair<EnumType::TESSELLATION_EVALUATION_BIT, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT>,
		EnumValuePair<EnumType::GEOMETRY_BIT, VK_SHADER_STAGE_GEOMETRY_BIT>,
		EnumValuePair<EnumType::FRAGMENT_BIT, VK_SHADER_STAGE_FRAGMENT_BIT>,
		EnumValuePair<EnumType::COMPUTE_BIT, VK_SHADER_STAGE_COMPUTE_BIT>,
		EnumValuePair<EnumType::ALL_GRAPHICS, VK_SHADER_STAGE_ALL_GRAPHICS>,
		EnumValuePair<EnumType::RAYGEN_BIT_KHR, VK_SHADER_STAGE_RAYGEN_BIT_KHR>,
		EnumValuePair<EnumType::ANY_HIT_BIT_KHR, VK_SHADER_STAGE_ANY_HIT_BIT_KHR>,
		EnumValuePair<EnumType::CLOSEST_HIT_BIT_KHR, VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR>,
		EnumValuePair<EnumType::MISS_BIT_KHR, VK_SHADER_STAGE_MISS_BIT_KHR>,
		EnumValuePair<EnumType::INTERSECTION_BIT_KHR, VK_SHADER_STAGE_INTERSECTION_BIT_KHR>,
		EnumValuePair<EnumType::CALLABLE_BIT_KHR, VK_SHADER_STAGE_CALLABLE_BIT_KHR>,
		EnumValuePair<EnumType::TASK_BIT_EXT, VK_SHADER_STAGE_TASK_BIT_EXT>,
		EnumValuePair<EnumType::MESH_BIT_EXT, VK_SHADER_STAGE_MESH_BIT_EXT>,
		EnumValuePair<EnumType::SUBPASS_SHADING_BIT_HUAWEI, VK_SHADER_STAGE_SUBPASS_SHADING_BIT_HUAWEI>,
		EnumValuePair<EnumType::CLUSTER_CULLING_BIT_HUAWEI, VK_SHADER_STAGE_CLUSTER_CULLING_BIT_HUAWEI>,
		EnumValuePair<EnumType::RAYGEN_BIT_NV, VK_SHADER_STAGE_RAYGEN_BIT_NV>,
		EnumValuePair<EnumType::ANY_HIT_BIT_NV, VK_SHADER_STAGE_ANY_HIT_BIT_NV>,
		EnumValuePair<EnumType::CLOSEST_HIT_BIT_NV, VK_SHADER_STAGE_CLOSEST_HIT_BIT_NV>,
		EnumValuePair<EnumType::MISS_BIT_NV, VK_SHADER_STAGE_MISS_BIT_NV>,
		EnumValuePair<EnumType::INTERSECTION_BIT_NV, VK_SHADER_STAGE_INTERSECTION_BIT_NV>,
		EnumValuePair<EnumType::CALLABLE_BIT_NV, VK_SHADER_STAGE_CALLABLE_BIT_NV>,
		EnumValuePair<EnumType::TASK_BIT_NV, VK_SHADER_STAGE_TASK_BIT_NV>,
		EnumValuePair<EnumType::MESH_BIT_NV, VK_SHADER_STAGE_MESH_BIT_NV>,
		EnumValuePair<EnumType::ALL, VK_SHADER_STAGE_ALL>
	>;
};

template <>
struct orhi::utils::MappingFor<orhi::types::EPipelineStageFlags, VkPipelineStageFlags>
{
	using EnumType = orhi::types::EPipelineStageFlags;
	using type = std::tuple<
		EnumValuePair<EnumType::NONE, 0>,
		EnumValuePair<EnumType::TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT>,
		EnumValuePair<EnumType::DRAW_INDIRECT_BIT, VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT>,
		EnumValuePair<EnumType::VERTEX_INPUT_BIT, VK_PIPELINE_STAGE_VERTEX_INPUT_BIT>,
		EnumValuePair<EnumType::VERTEX_SHADER_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT>,
		EnumValuePair<EnumType::TESSELLATION_CONTROL_SHADER_BIT, VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT>,
		EnumValuePair<EnumType::TESSELLATION_EVALUATION_SHADER_BIT, VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT>,
		EnumValuePair<EnumType::GEOMETRY_SHADER_BIT, VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT>,
		EnumValuePair<EnumType::FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT>,
		EnumValuePair<EnumType::EARLY_FRAGMENT_TESTS_BIT, VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT>,
		EnumValuePair<EnumType::LATE_FRAGMENT_TESTS_BIT, VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT>,
		EnumValuePair<EnumType::COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT>,
		EnumValuePair<EnumType::COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT>,
		EnumValuePair<EnumType::TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT>,
		EnumValuePair<EnumType::BOTTOM_OF_PIPE_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT>,
		EnumValuePair<EnumType::HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT>,
		EnumValuePair<EnumType::ALL_GRAPHICS_BIT, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT>,
		EnumValuePair<EnumType::ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT>,
		EnumValuePair<EnumType::TRANSFORM_FEEDBACK_BIT_EXT, VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT>,
		EnumValuePair<EnumType::CONDITIONAL_RENDERING_BIT_EXT, VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT>,
		EnumValuePair<EnumType::ACCELERATION_STRUCTURE_BUILD_BIT_KHR, VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR>,
		EnumValuePair<EnumType::RAY_TRACING_SHADER_BIT_KHR, VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR>,
		EnumValuePair<EnumType::TASK_SHADER_BIT_EXT, VK_PIPELINE_STAGE_TASK_SHADER_BIT_EXT>,
		EnumValuePair<EnumType::MESH_SHADER_BIT_EXT, VK_PIPELINE_STAGE_MESH_SHADER_BIT_EXT>,
		EnumValuePair<EnumType::FRAGMENT_DENSITY_PROCESS_BIT_EXT, VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT>,
		EnumValuePair<EnumType::FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR, VK_PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR>,
		EnumValuePair<EnumType::COMMAND_PREPROCESS_BIT_EXT, VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_EXT>,
		EnumValuePair<EnumType::SHADING_RATE_IMAGE_BIT_NV, VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV>,
		EnumValuePair<EnumType::RAY_TRACING_SHADER_BIT_NV, VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_NV>,
		EnumValuePair<EnumType::ACCELERATION_STRUCTURE_BUILD_BIT_NV, VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_NV>,
		EnumValuePair<EnumType::TASK_SHADER_BIT_NV, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV>,
		EnumValuePair<EnumType::MESH_SHADER_BIT_NV, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV>,
		EnumValuePair<EnumType::ALL, VK_PIPELINE_STAGE_FLAG_BITS_MAX_ENUM>
	>;
};

template <>
struct orhi::utils::MappingFor<orhi::types::ESurfaceTransformFlags, VkSurfaceTransformFlagsKHR>
{
	using EnumType = orhi::types::ESurfaceTransformFlags;
	using type = std::tuple<
		EnumValuePair<EnumType::NONE, 0>,
		EnumValuePair<EnumType::IDENTITY_BIT_KHR, VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR>,
		EnumValuePair<EnumType::ROTATE_90_BIT_KHR, VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR>,
		EnumValuePair<EnumType::ROTATE_180_BIT_KHR, VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR>,
		EnumValuePair<EnumType::ROTATE_270_BIT_KHR, VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR>,
		EnumValuePair<EnumType::HORIZONTAL_MIRROR_BIT_KHR, VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_BIT_KHR>,
		EnumValuePair<EnumType::HORIZONTAL_MIRROR_ROTATE_90_BIT_KHR, VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_90_BIT_KHR>,
		EnumValuePair<EnumType::HORIZONTAL_MIRROR_ROTATE_180_BIT_KHR, VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_180_BIT_KHR>,
		EnumValuePair<EnumType::HORIZONTAL_MIRROR_ROTATE_270_BIT_KHR, VK_SURFACE_TRANSFORM_HORIZONTAL_MIRROR_ROTATE_270_BIT_KHR>,
		EnumValuePair<EnumType::INHERIT_BIT_KHR, VK_SURFACE_TRANSFORM_INHERIT_BIT_KHR>,
		EnumValuePair<EnumType::ALL, VK_SURFACE_TRANSFORM_FLAG_BITS_MAX_ENUM_KHR>
	>;
};

template <>
struct orhi::utils::MappingFor<orhi::types::EPrimitiveTopology, VkPrimitiveTopology>
{
	using EnumType = orhi::types::EPrimitiveTopology;
	using type = std::tuple<
		EnumValuePair<EnumType::POINT_LIST, VK_PRIMITIVE_TOPOLOGY_POINT_LIST>,
		EnumValuePair<EnumType::LINE_LIST, VK_PRIMITIVE_TOPOLOGY_LINE_LIST>,
		EnumValuePair<EnumType::LINE_STRIP, VK_PRIMITIVE_TOPOLOGY_LINE_STRIP>,
		EnumValuePair<EnumType::TRIANGLE_LIST, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST>,
		EnumValuePair<EnumType::TRIANGLE_STRIP, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP>,
		EnumValuePair<EnumType::TRIANGLE_FAN, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN>,
		EnumValuePair<EnumType::LINE_LIST_WITH_ADJACENCY, VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY>,
		EnumValuePair<EnumType::LINE_STRIP_WITH_ADJACENCY, VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY>,
		EnumValuePair<EnumType::TRIANGLE_LIST_WITH_ADJACENCY, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY>,
		EnumValuePair<EnumType::TRIANGLE_STRIP_WITH_ADJACENCY, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY>,
		EnumValuePair<EnumType::PATCH_LIST, VK_PRIMITIVE_TOPOLOGY_PATCH_LIST>
	>;
};

template <>
struct orhi::utils::MappingFor<orhi::types::EPolygonMode, VkPolygonMode>
{
	using EnumType = orhi::types::EPolygonMode;
	using type = std::tuple<
		EnumValuePair<EnumType::FILL, VK_POLYGON_MODE_FILL>,
		EnumValuePair<EnumType::LINE, VK_POLYGON_MODE_LINE>,
		EnumValuePair<EnumType::POINT, VK_POLYGON_MODE_POINT>,
		EnumValuePair<EnumType::FILL_RECTANGLE_NV, VK_POLYGON_MODE_FILL_RECTANGLE_NV>
	>;
};

template <>
struct orhi::utils::MappingFor<orhi::types::ECullModeFlags, VkCullModeFlags>
{
	using EnumType = orhi::types::ECullModeFlags;
	using type = std::tuple<
		EnumValuePair<EnumType::NONE, VK_CULL_MODE_NONE>,
		EnumValuePair<EnumType::FRONT_BIT, VK_CULL_MODE_FRONT_BIT>,
		EnumValuePair<EnumType::BACK_BIT, VK_CULL_MODE_BACK_BIT>,
		EnumValuePair<EnumType::FRONT_AND_BACK, VK_CULL_MODE_FRONT_AND_BACK>
	>;
};

template <>
struct orhi::utils::MappingFor<orhi::types::EFrontFace, VkFrontFace>
{
	using EnumType = orhi::types::EFrontFace;
	using type = std::tuple<
		EnumValuePair<EnumType::COUNTER_CLOCKWISE, VK_FRONT_FACE_COUNTER_CLOCKWISE>,
		EnumValuePair<EnumType::CLOCKWISE, VK_FRONT_FACE_CLOCKWISE>
	>;
};

template <>
struct orhi::utils::MappingFor<orhi::types::ESampleCountFlags, VkSampleCountFlags>
{
	using EnumType = orhi::types::ESampleCountFlags;
	using type = std::tuple<
		EnumValuePair<EnumType::COUNT_1_BIT, VK_SAMPLE_COUNT_1_BIT>,
		EnumValuePair<EnumType::COUNT_2_BIT, VK_SAMPLE_COUNT_2_BIT>,
		EnumValuePair<EnumType::COUNT_4_BIT, VK_SAMPLE_COUNT_4_BIT>,
		EnumValuePair<EnumType::COUNT_8_BIT, VK_SAMPLE_COUNT_8_BIT>,
		EnumValuePair<EnumType::COUNT_16_BIT, VK_SAMPLE_COUNT_16_BIT>,
		EnumValuePair<EnumType::COUNT_32_BIT, VK_SAMPLE_COUNT_32_BIT>,
		EnumValuePair<EnumType::COUNT_64_BIT, VK_SAMPLE_COUNT_64_BIT>
	>;
};

template <>
struct orhi::utils::MappingFor<orhi::types::EBlendFactor, VkBlendFactor>
{
	using EnumType = orhi::types::EBlendFactor;
	using type = std::tuple<
		EnumValuePair<EnumType::ZERO, VK_BLEND_FACTOR_ZERO>,
		EnumValuePair<EnumType::ONE, VK_BLEND_FACTOR_ONE>,
		EnumValuePair<EnumType::SRC_COLOR, VK_BLEND_FACTOR_SRC_COLOR>,
		EnumValuePair<EnumType::ONE_MINUS_SRC_COLOR, VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR>,
		EnumValuePair<EnumType::DST_COLOR, VK_BLEND_FACTOR_DST_COLOR>,
		EnumValuePair<EnumType::ONE_MINUS_DST_COLOR, VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR>,
		EnumValuePair<EnumType::SRC_ALPHA, VK_BLEND_FACTOR_SRC_ALPHA>,
		EnumValuePair<EnumType::ONE_MINUS_SRC_ALPHA, VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA>,
		EnumValuePair<EnumType::DST_ALPHA, VK_BLEND_FACTOR_DST_ALPHA>,
		EnumValuePair<EnumType::ONE_MINUS_DST_ALPHA, VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA>,
		EnumValuePair<EnumType::CONSTANT_COLOR, VK_BLEND_FACTOR_CONSTANT_COLOR>,
		EnumValuePair<EnumType::ONE_MINUS_CONSTANT_COLOR, VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR>,
		EnumValuePair<EnumType::CONSTANT_ALPHA, VK_BLEND_FACTOR_CONSTANT_ALPHA>,
		EnumValuePair<EnumType::ONE_MINUS_CONSTANT_ALPHA, VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA>,
		EnumValuePair<EnumType::SRC_ALPHA_SATURATE, VK_BLEND_FACTOR_SRC_ALPHA_SATURATE>,
		EnumValuePair<EnumType::SRC1_COLOR, VK_BLEND_FACTOR_SRC1_COLOR>,
		EnumValuePair<EnumType::ONE_MINUS_SRC1_COLOR, VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR>,
		EnumValuePair<EnumType::SRC1_ALPHA, VK_BLEND_FACTOR_SRC1_ALPHA>,
		EnumValuePair<EnumType::ONE_MINUS_SRC1_ALPHA, VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA>
	>;
};

template <>
struct orhi::utils::MappingFor<orhi::types::EBlendOp, VkBlendOp>
{
	using EnumType = orhi::types::EBlendOp;
	using type = std::tuple<
		EnumValuePair<EnumType::ADD, VK_BLEND_OP_ADD>,
		EnumValuePair<EnumType::SUBTRACT, VK_BLEND_OP_SUBTRACT>,
		EnumValuePair<EnumType::REVERSE_SUBTRACT, VK_BLEND_OP_REVERSE_SUBTRACT>,
		EnumValuePair<EnumType::MIN, VK_BLEND_OP_MIN>,
		EnumValuePair<EnumType::MAX, VK_BLEND_OP_MAX>,
		EnumValuePair<EnumType::ZERO_EXT, VK_BLEND_OP_ZERO_EXT>,
		EnumValuePair<EnumType::SRC_EXT, VK_BLEND_OP_SRC_EXT>,
		EnumValuePair<EnumType::DST_EXT, VK_BLEND_OP_DST_EXT>,
		EnumValuePair<EnumType::SRC_OVER_EXT, VK_BLEND_OP_SRC_OVER_EXT>,
		EnumValuePair<EnumType::DST_OVER_EXT, VK_BLEND_OP_DST_OVER_EXT>,
		EnumValuePair<EnumType::SRC_IN_EXT, VK_BLEND_OP_SRC_IN_EXT>,
		EnumValuePair<EnumType::DST_IN_EXT, VK_BLEND_OP_DST_IN_EXT>,
		EnumValuePair<EnumType::SRC_OUT_EXT, VK_BLEND_OP_SRC_OUT_EXT>,
		EnumValuePair<EnumType::DST_OUT_EXT, VK_BLEND_OP_DST_OUT_EXT>,
		EnumValuePair<EnumType::SRC_ATOP_EXT, VK_BLEND_OP_SRC_ATOP_EXT>,
		EnumValuePair<EnumType::DST_ATOP_EXT, VK_BLEND_OP_DST_ATOP_EXT>,
		EnumValuePair<EnumType::XOR_EXT, VK_BLEND_OP_XOR_EXT>,
		EnumValuePair<EnumType::MULTIPLY_EXT, VK_BLEND_OP_MULTIPLY_EXT>,
		EnumValuePair<EnumType::SCREEN_EXT, VK_BLEND_OP_SCREEN_EXT>,
		EnumValuePair<EnumType::OVERLAY_EXT, VK_BLEND_OP_OVERLAY_EXT>,
		EnumValuePair<EnumType::DARKEN_EXT, VK_BLEND_OP_DARKEN_EXT>,
		EnumValuePair<EnumType::LIGHTEN_EXT, VK_BLEND_OP_LIGHTEN_EXT>,
		EnumValuePair<EnumType::COLORDODGE_EXT, VK_BLEND_OP_COLORDODGE_EXT>,
		EnumValuePair<EnumType::COLORBURN_EXT, VK_BLEND_OP_COLORBURN_EXT>,
		EnumValuePair<EnumType::HARDLIGHT_EXT, VK_BLEND_OP_HARDLIGHT_EXT>,
		EnumValuePair<EnumType::SOFTLIGHT_EXT, VK_BLEND_OP_SOFTLIGHT_EXT>,
		EnumValuePair<EnumType::DIFFERENCE_EXT, VK_BLEND_OP_DIFFERENCE_EXT>,
		EnumValuePair<EnumType::EXCLUSION_EXT, VK_BLEND_OP_EXCLUSION_EXT>,
		EnumValuePair<EnumType::INVERT_EXT, VK_BLEND_OP_INVERT_EXT>,
		EnumValuePair<EnumType::INVERT_RGB_EXT, VK_BLEND_OP_INVERT_RGB_EXT>,
		EnumValuePair<EnumType::LINEARDODGE_EXT, VK_BLEND_OP_LINEARDODGE_EXT>,
		EnumValuePair<EnumType::LINEARBURN_EXT, VK_BLEND_OP_LINEARBURN_EXT>,
		EnumValuePair<EnumType::VIVIDLIGHT_EXT, VK_BLEND_OP_VIVIDLIGHT_EXT>,
		EnumValuePair<EnumType::LINEARLIGHT_EXT, VK_BLEND_OP_LINEARLIGHT_EXT>,
		EnumValuePair<EnumType::PINLIGHT_EXT, VK_BLEND_OP_PINLIGHT_EXT>,
		EnumValuePair<EnumType::HARDMIX_EXT, VK_BLEND_OP_HARDMIX_EXT>,
		EnumValuePair<EnumType::HSL_HUE_EXT, VK_BLEND_OP_HSL_HUE_EXT>,
		EnumValuePair<EnumType::HSL_SATURATION_EXT, VK_BLEND_OP_HSL_SATURATION_EXT>,
		EnumValuePair<EnumType::HSL_COLOR_EXT, VK_BLEND_OP_HSL_COLOR_EXT>,
		EnumValuePair<EnumType::HSL_LUMINOSITY_EXT, VK_BLEND_OP_HSL_LUMINOSITY_EXT>,
		EnumValuePair<EnumType::PLUS_EXT, VK_BLEND_OP_PLUS_EXT>,
		EnumValuePair<EnumType::PLUS_CLAMPED_EXT, VK_BLEND_OP_PLUS_CLAMPED_EXT>,
		EnumValuePair<EnumType::PLUS_CLAMPED_ALPHA_EXT, VK_BLEND_OP_PLUS_CLAMPED_ALPHA_EXT>,
		EnumValuePair<EnumType::PLUS_DARKER_EXT, VK_BLEND_OP_PLUS_DARKER_EXT>,
		EnumValuePair<EnumType::MINUS_EXT, VK_BLEND_OP_MINUS_EXT>,
		EnumValuePair<EnumType::MINUS_CLAMPED_EXT, VK_BLEND_OP_MINUS_CLAMPED_EXT>,
		EnumValuePair<EnumType::CONTRAST_EXT, VK_BLEND_OP_CONTRAST_EXT>,
		EnumValuePair<EnumType::INVERT_OVG_EXT, VK_BLEND_OP_INVERT_OVG_EXT>,
		EnumValuePair<EnumType::RED_EXT, VK_BLEND_OP_RED_EXT>,
		EnumValuePair<EnumType::GREEN_EXT, VK_BLEND_OP_GREEN_EXT>,
		EnumValuePair<EnumType::BLUE_EXT, VK_BLEND_OP_BLUE_EXT>
	>;
};

template <>
struct orhi::utils::MappingFor<orhi::types::EColorComponentFlags, VkColorComponentFlags>
{
	using EnumType = orhi::types::EColorComponentFlags;
	using type = std::tuple<
		EnumValuePair<EnumType::NONE, 0>,
		EnumValuePair<EnumType::R_BIT, VK_COLOR_COMPONENT_R_BIT>,
		EnumValuePair<EnumType::G_BIT, VK_COLOR_COMPONENT_G_BIT>,
		EnumValuePair<EnumType::B_BIT, VK_COLOR_COMPONENT_B_BIT>,
		EnumValuePair<EnumType::A_BIT, VK_COLOR_COMPONENT_A_BIT>,
		EnumValuePair<EnumType::ALL, VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT>
	>;
};

template <>
struct orhi::utils::MappingFor<orhi::types::ELogicOp, VkLogicOp>
{
	using EnumType = orhi::types::ELogicOp;
	using type = std::tuple<
		EnumValuePair<EnumType::CLEAR, VK_LOGIC_OP_CLEAR>,
		EnumValuePair<EnumType::AND, VK_LOGIC_OP_AND>,
		EnumValuePair<EnumType::AND_REVERSE, VK_LOGIC_OP_AND_REVERSE>,
		EnumValuePair<EnumType::COPY, VK_LOGIC_OP_COPY>,
		EnumValuePair<EnumType::AND_INVERTED, VK_LOGIC_OP_AND_INVERTED>,
		EnumValuePair<EnumType::NO_OP, VK_LOGIC_OP_NO_OP>,
		EnumValuePair<EnumType::XOR, VK_LOGIC_OP_XOR>,
		EnumValuePair<EnumType::OR, VK_LOGIC_OP_OR>,
		EnumValuePair<EnumType::NOR, VK_LOGIC_OP_NOR>,
		EnumValuePair<EnumType::EQUIVALENT, VK_LOGIC_OP_EQUIVALENT>,
		EnumValuePair<EnumType::INVERT, VK_LOGIC_OP_INVERT>,
		EnumValuePair<EnumType::OR_REVERSE, VK_LOGIC_OP_OR_REVERSE>,
		EnumValuePair<EnumType::COPY_INVERTED, VK_LOGIC_OP_COPY_INVERTED>,
		EnumValuePair<EnumType::OR_INVERTED, VK_LOGIC_OP_OR_INVERTED>,
		EnumValuePair<EnumType::NAND, VK_LOGIC_OP_NAND>,
		EnumValuePair<EnumType::SET, VK_LOGIC_OP_SET>
	>;
};

template <>
struct orhi::utils::MappingFor<orhi::types::ECompareOp, VkCompareOp>
{
	using EnumType = orhi::types::ECompareOp;
	using type = std::tuple<
		EnumValuePair<EnumType::NEVER, VK_COMPARE_OP_NEVER>,
		EnumValuePair<EnumType::LESS, VK_COMPARE_OP_LESS>,
		EnumValuePair<EnumType::EQUAL, VK_COMPARE_OP_EQUAL>,
		EnumValuePair<EnumType::LESS_OR_EQUAL, VK_COMPARE_OP_LESS_OR_EQUAL>,
		EnumValuePair<EnumType::GREATER, VK_COMPARE_OP_GREATER>,
		EnumValuePair<EnumType::NOT_EQUAL, VK_COMPARE_OP_NOT_EQUAL>,
		EnumValuePair<EnumType::GREATER_OR_EQUAL, VK_COMPARE_OP_GREATER_OR_EQUAL>,
		EnumValuePair<EnumType::ALWAYS, VK_COMPARE_OP_ALWAYS>
	>;
};

template <>
struct orhi::utils::MappingFor<orhi::types::EStencilOp, VkStencilOp>
{
	using EnumType = orhi::types::EStencilOp;
	using type = std::tuple<
		EnumValuePair<EnumType::KEEP, VK_STENCIL_OP_KEEP>,
		EnumValuePair<EnumType::ZERO, VK_STENCIL_OP_ZERO>,
		EnumValuePair<EnumType::REPLACE, VK_STENCIL_OP_REPLACE>,
		EnumValuePair<EnumType::INCREMENT_AND_CLAMP, VK_STENCIL_OP_INCREMENT_AND_CLAMP>,
		EnumValuePair<EnumType::DECREMENT_AND_CLAMP, VK_STENCIL_OP_DECREMENT_AND_CLAMP>,
		EnumValuePair<EnumType::INVERT, VK_STENCIL_OP_INVERT>,
		EnumValuePair<EnumType::INCREMENT_AND_WRAP, VK_STENCIL_OP_INCREMENT_AND_WRAP>,
		EnumValuePair<EnumType::DECREMENT_AND_WRAP, VK_STENCIL_OP_DECREMENT_AND_WRAP>
	>;
};

template <>
struct orhi::utils::MappingFor<orhi::types::EDynamicState, VkDynamicState>
{
	using EnumType = orhi::types::EDynamicState;
	using type = std::tuple<
		EnumValuePair<EnumType::VIEWPORT, VK_DYNAMIC_STATE_VIEWPORT>,
		EnumValuePair<EnumType::SCISSOR, VK_DYNAMIC_STATE_SCISSOR>,
		EnumValuePair<EnumType::LINE_WIDTH, VK_DYNAMIC_STATE_LINE_WIDTH>,
		EnumValuePair<EnumType::DEPTH_BIAS, VK_DYNAMIC_STATE_DEPTH_BIAS>,
		EnumValuePair<EnumType::BLEND_CONSTANTS, VK_DYNAMIC_STATE_BLEND_CONSTANTS>,
		EnumValuePair<EnumType::DEPTH_BOUNDS, VK_DYNAMIC_STATE_DEPTH_BOUNDS>,
		EnumValuePair<EnumType::STENCIL_COMPARE_MASK, VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK>,
		EnumValuePair<EnumType::STENCIL_WRITE_MASK, VK_DYNAMIC_STATE_STENCIL_WRITE_MASK>,
		EnumValuePair<EnumType::STENCIL_REFERENCE, VK_DYNAMIC_STATE_STENCIL_REFERENCE>,
		EnumValuePair<EnumType::CULL_MODE, VK_DYNAMIC_STATE_CULL_MODE>,
		EnumValuePair<EnumType::FRONT_FACE, VK_DYNAMIC_STATE_FRONT_FACE>,
		EnumValuePair<EnumType::PRIMITIVE_TOPOLOGY, VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY>,
		EnumValuePair<EnumType::VIEWPORT_WITH_COUNT, VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT>,
		EnumValuePair<EnumType::SCISSOR_WITH_COUNT, VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT>,
		EnumValuePair<EnumType::VERTEX_INPUT_BINDING_STRIDE, VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE>,
		EnumValuePair<EnumType::DEPTH_TEST_ENABLE, VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE>,
		EnumValuePair<EnumType::DEPTH_WRITE_ENABLE, VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE>,
		EnumValuePair<EnumType::DEPTH_COMPARE_OP, VK_DYNAMIC_STATE_DEPTH_COMPARE_OP>,
		EnumValuePair<EnumType::DEPTH_BOUNDS_TEST_ENABLE, VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE>,
		EnumValuePair<EnumType::STENCIL_TEST_ENABLE, VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE>,
		EnumValuePair<EnumType::STENCIL_OP, VK_DYNAMIC_STATE_STENCIL_OP>,
		EnumValuePair<EnumType::RASTERIZER_DISCARD_ENABLE, VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE>,
		EnumValuePair<EnumType::DEPTH_BIAS_ENABLE, VK_DYNAMIC_STATE_DEPTH_BIAS_ENABLE>,
		EnumValuePair<EnumType::PRIMITIVE_RESTART_ENABLE, VK_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE>
	>;
};

template <>
struct orhi::utils::MappingFor<orhi::types::EDescriptorPoolCreateFlags, VkDescriptorPoolCreateFlags>
{
	using EnumType = orhi::types::EDescriptorPoolCreateFlags;
	using type = std::tuple<
		EnumValuePair<EnumType::NONE, 0>,
		EnumValuePair<EnumType::FREE_DESCRIPTOR_SET_BIT, VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT>,
		EnumValuePair<EnumType::UPDATE_AFTER_BIND_BIT, VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT>,
		EnumValuePair<EnumType::HOST_ONLY_BIT_EXT, VK_DESCRIPTOR_POOL_CREATE_HOST_ONLY_BIT_EXT>,
		EnumValuePair<EnumType::ALLOW_OVERALLOCATION_SETS_BIT_NV, VK_DESCRIPTOR_POOL_CREATE_ALLOW_OVERALLOCATION_SETS_BIT_NV>,
		EnumValuePair<EnumType::ALLOW_OVERALLOCATION_POOLS_BIT_NV, VK_DESCRIPTOR_POOL_CREATE_ALLOW_OVERALLOCATION_POOLS_BIT_NV>,
		EnumValuePair<EnumType::UPDATE_AFTER_BIND_BIT_EXT, VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT_EXT>,
		EnumValuePair<EnumType::HOST_ONLY_BIT_VALVE, VK_DESCRIPTOR_POOL_CREATE_HOST_ONLY_BIT_VALVE>
	>;
};

template <>
struct orhi::utils::MappingFor<orhi::types::ETextureType, VkImageType>
{
	using EnumType = orhi::types::ETextureType;
	using type = std::tuple<
		EnumValuePair<EnumType::TEXTURE_1D, VK_IMAGE_TYPE_1D>,
		EnumValuePair<EnumType::TEXTURE_2D, VK_IMAGE_TYPE_2D>,
		EnumValuePair<EnumType::TEXTURE_3D, VK_IMAGE_TYPE_3D>
	>;
};

template <>
struct orhi::utils::MappingFor<orhi::types::ETextureTiling, VkImageTiling>
{
	using EnumType = orhi::types::ETextureTiling;
	using type = std::tuple<
		EnumValuePair<EnumType::OPTIMAL, VK_IMAGE_TILING_OPTIMAL>,
		EnumValuePair<EnumType::LINEAR, VK_IMAGE_TILING_LINEAR>
	>;
};

template <>
struct orhi::utils::MappingFor<orhi::types::ETextureLayout, VkImageLayout>
{
	using EnumType = orhi::types::ETextureLayout;
	using type = std::tuple<
		EnumValuePair<EnumType::UNDEFINED, VK_IMAGE_LAYOUT_UNDEFINED>,
		EnumValuePair<EnumType::GENERAL, VK_IMAGE_LAYOUT_GENERAL>,
		EnumValuePair<EnumType::COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL>,
		EnumValuePair<EnumType::DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL>,
		EnumValuePair<EnumType::DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL>,
		EnumValuePair<EnumType::SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL>,
		EnumValuePair<EnumType::TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL>,
		EnumValuePair<EnumType::TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL>,
		EnumValuePair<EnumType::PREINITIALIZED, VK_IMAGE_LAYOUT_PREINITIALIZED>,
		EnumValuePair<EnumType::DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL>,
		EnumValuePair<EnumType::DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL>,
		EnumValuePair<EnumType::DEPTH_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL>,
		EnumValuePair<EnumType::DEPTH_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL>,
		EnumValuePair<EnumType::STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL>,
		EnumValuePair<EnumType::STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL>,
		EnumValuePair<EnumType::READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL>,
		EnumValuePair<EnumType::ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL>,
		EnumValuePair<EnumType::PRESENT_SRC_KHR, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR>
	>;
};

template <>
struct orhi::utils::MappingFor<orhi::types::EFilter, VkFilter>
{
	using EnumType = orhi::types::EFilter;
	using type = std::tuple<
		EnumValuePair<EnumType::NEAREST, VK_FILTER_NEAREST>,
		EnumValuePair<EnumType::LINEAR, VK_FILTER_LINEAR>
	>;
};

template <>
struct orhi::utils::MappingFor<orhi::types::ESamplerAddressMode, VkSamplerAddressMode>
{
	using EnumType = orhi::types::ESamplerAddressMode;
	using type = std::tuple<
		EnumValuePair<EnumType::REPEAT, VK_SAMPLER_ADDRESS_MODE_REPEAT>,
		EnumValuePair<EnumType::MIRRORED_REPEAT, VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT>,
		EnumValuePair<EnumType::CLAMP_TO_EDGE, VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE>,
		EnumValuePair<EnumType::CLAMP_TO_BORDER, VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER>,
		EnumValuePair<EnumType::MIRROR_CLAMP_TO_EDGE, VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE>
	>;
};

template <>
struct orhi::utils::MappingFor<orhi::types::ESamplerMipmapMode, VkSamplerMipmapMode>
{
	using EnumType = orhi::types::ESamplerMipmapMode;
	using type = std::tuple<
		EnumValuePair<EnumType::NEAREST, VK_SAMPLER_MIPMAP_MODE_NEAREST>,
		EnumValuePair<EnumType::LINEAR, VK_SAMPLER_MIPMAP_MODE_LINEAR>
	>;
};

template <>
struct orhi::utils::MappingFor<orhi::types::ETextureAspectFlags, VkImageAspectFlags>
{
	using EnumType = orhi::types::ETextureAspectFlags;
	using type = std::tuple<
		EnumValuePair<EnumType::COLOR, VK_IMAGE_ASPECT_COLOR_BIT>,
		EnumValuePair<EnumType::DEPTH, VK_IMAGE_ASPECT_DEPTH_BIT>,
		EnumValuePair<EnumType::STENCIL, VK_IMAGE_ASPECT_STENCIL_BIT>
	>;
};

#endif // #if defined(ORHI_COMPILE_VULKAN)
