Program Listing for File VkTypeMapping.cpp¶
↰ Return to documentation for file (Source\Azura\RenderSystem\Src\Vulkan\VkTypeMapping.cpp
)
#include "Vulkan/VkTypeMapping.h"
#include "Utils/Macros.h"
namespace Azura {
namespace Vulkan {
#define RAW_STORAGE_TO_VK_FORMAT_MAPPING(FUNC) \
FUNC(RawStorageFormat::UNKNOWN, VK_FORMAT_UNDEFINED) \
FUNC(RawStorageFormat::R32_UNORM, VK_FORMAT_UNDEFINED) \
FUNC(RawStorageFormat::R32_SNORM, VK_FORMAT_UNDEFINED) \
\
FUNC(RawStorageFormat::B8G8R8A8_UNORM, VK_FORMAT_B8G8R8A8_UNORM) \
FUNC(RawStorageFormat::B8G8R8A8_SNORM, VK_FORMAT_B8G8R8A8_SNORM) \
FUNC(RawStorageFormat::B8G8R8A8_USCALED, VK_FORMAT_B8G8R8A8_USCALED) \
FUNC(RawStorageFormat::B8G8R8A8_SSCALED, VK_FORMAT_B8G8R8A8_SSCALED) \
FUNC(RawStorageFormat::B8G8R8A8_UINT, VK_FORMAT_B8G8R8A8_UINT) \
FUNC(RawStorageFormat::B8G8R8A8_SINT, VK_FORMAT_B8G8R8A8_SINT) \
FUNC(RawStorageFormat::B8G8R8A8_SRGB, VK_FORMAT_B8G8R8A8_SRGB) \
FUNC(RawStorageFormat::R8G8B8_UNORM, VK_FORMAT_R8G8B8_UNORM) \
FUNC(RawStorageFormat::R8G8B8A8_UNORM, VK_FORMAT_R8G8B8A8_UNORM) \
FUNC(RawStorageFormat::R16_FLOAT, VK_FORMAT_R16_SFLOAT) \
FUNC(RawStorageFormat::R16_UINT, VK_FORMAT_R16_UINT) \
FUNC(RawStorageFormat::R16_SINT, VK_FORMAT_R16_SINT) \
FUNC(RawStorageFormat::R16_UNORM, VK_FORMAT_R16_UNORM) \
FUNC(RawStorageFormat::R16_SNORM, VK_FORMAT_R16_SNORM) \
FUNC(RawStorageFormat::R16_USCALED, VK_FORMAT_R16_USCALED) \
FUNC(RawStorageFormat::R16_SSCALED, VK_FORMAT_R16_SSCALED) \
FUNC(RawStorageFormat::R32_FLOAT, VK_FORMAT_R32_SFLOAT) \
FUNC(RawStorageFormat::R32_UINT, VK_FORMAT_R32_UINT) \
FUNC(RawStorageFormat::R32_SINT, VK_FORMAT_R32_SINT) \
FUNC(RawStorageFormat::R16G16_FLOAT, VK_FORMAT_R16G16_SFLOAT) \
FUNC(RawStorageFormat::R16G16_UINT, VK_FORMAT_R16G16_UINT) \
FUNC(RawStorageFormat::R16G16_SINT, VK_FORMAT_R16G16_SINT) \
FUNC(RawStorageFormat::R16G16_UNORM, VK_FORMAT_R16G16_UNORM) \
FUNC(RawStorageFormat::R16G16_SNORM, VK_FORMAT_R16G16_SNORM) \
FUNC(RawStorageFormat::R16G16_USCALED, VK_FORMAT_R16G16_USCALED) \
FUNC(RawStorageFormat::R16G16_SSCALED, VK_FORMAT_R16G16_SSCALED) \
FUNC(RawStorageFormat::R11G11B10_FLOAT, VK_FORMAT_B10G11R11_UFLOAT_PACK32) \
FUNC(RawStorageFormat::R16G16B16_FLOAT, VK_FORMAT_R16G16B16_SFLOAT) \
FUNC(RawStorageFormat::R16G16B16_UINT, VK_FORMAT_R16G16B16_UINT) \
FUNC(RawStorageFormat::R16G16B16_SINT, VK_FORMAT_R16G16B16_SINT) \
FUNC(RawStorageFormat::R16G16B16_UNORM, VK_FORMAT_R16G16B16_UNORM) \
FUNC(RawStorageFormat::R16G16B16_SNORM, VK_FORMAT_R16G16B16_SNORM) \
FUNC(RawStorageFormat::R16G16B16_USCALED, VK_FORMAT_R16G16B16_USCALED) \
FUNC(RawStorageFormat::R16G16B16_SSCALED, VK_FORMAT_R16G16B16_SSCALED) \
FUNC(RawStorageFormat::R64_FLOAT, VK_FORMAT_R64_SFLOAT) \
FUNC(RawStorageFormat::R64_UINT, VK_FORMAT_R64_UINT) \
FUNC(RawStorageFormat::R64_SINT, VK_FORMAT_R64_SINT) \
FUNC(RawStorageFormat::R32G32_FLOAT, VK_FORMAT_R32G32_SFLOAT) \
FUNC(RawStorageFormat::R32G32_UINT, VK_FORMAT_R32G32_UINT) \
FUNC(RawStorageFormat::R32G32_SINT, VK_FORMAT_R32G32_SINT) \
FUNC(RawStorageFormat::R16G16B16A16_FLOAT, VK_FORMAT_R16G16B16A16_SFLOAT) \
FUNC(RawStorageFormat::R16G16B16A16_UINT, VK_FORMAT_R16G16B16A16_UINT) \
FUNC(RawStorageFormat::R16G16B16A16_SINT, VK_FORMAT_R16G16B16A16_SINT) \
FUNC(RawStorageFormat::R16G16B16A16_UNORM, VK_FORMAT_R16G16B16A16_UNORM) \
FUNC(RawStorageFormat::R16G16B16A16_SNORM, VK_FORMAT_R16G16B16A16_SNORM) \
FUNC(RawStorageFormat::R16G16B16A16_USCALED, VK_FORMAT_R16G16B16A16_USCALED) \
FUNC(RawStorageFormat::R16G16B16A16_SSCALED, VK_FORMAT_R16G16B16A16_SSCALED) \
FUNC(RawStorageFormat::R32G32B32_FLOAT, VK_FORMAT_R32G32B32_SFLOAT) \
FUNC(RawStorageFormat::R32G32B32_UINT, VK_FORMAT_R32G32B32_UINT) \
FUNC(RawStorageFormat::R32G32B32_SINT, VK_FORMAT_R32G32B32_SINT) \
FUNC(RawStorageFormat::R64G64_FLOAT, VK_FORMAT_R64G64_SFLOAT) \
FUNC(RawStorageFormat::R64G64_UINT, VK_FORMAT_R64G64_UINT) \
FUNC(RawStorageFormat::R64G64_SINT, VK_FORMAT_R64G64_SINT) \
FUNC(RawStorageFormat::R32G32B32A32_FLOAT, VK_FORMAT_R32G32B32A32_SFLOAT) \
FUNC(RawStorageFormat::R32G32B32A32_UINT, VK_FORMAT_R32G32B32A32_UINT) \
FUNC(RawStorageFormat::R32G32B32A32_SINT, VK_FORMAT_R32G32B32A32_SINT) \
FUNC(RawStorageFormat::R64G64B64_FLOAT, VK_FORMAT_R64G64B64_SFLOAT) \
FUNC(RawStorageFormat::R64G64B64_UINT, VK_FORMAT_R64G64B64_UINT) \
FUNC(RawStorageFormat::R64G64B64_SINT, VK_FORMAT_R64G64B64_SINT) \
FUNC(RawStorageFormat::R64G64B64A64_FLOAT, VK_FORMAT_R64G64B64A64_SFLOAT) \
FUNC(RawStorageFormat::R64G64B64A64_UINT, VK_FORMAT_R64G64B64A64_UINT) \
FUNC(RawStorageFormat::R64G64B64A64_SINT, VK_FORMAT_R64G64B64A64_SINT) \
FUNC(RawStorageFormat::D24_UNORM_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT) \
FUNC(RawStorageFormat::D32_FLOAT_S8X24_UINT, VK_FORMAT_D32_SFLOAT_S8_UINT) \
FUNC(RawStorageFormat::D32_FLOAT, VK_FORMAT_D32_SFLOAT)
#define RAW_STORAGE_TO_VK_INDEX_TYPE_MAPPING(FUNC) \
FUNC(RawStorageFormat::R16_UINT, VK_INDEX_TYPE_UINT16) \
FUNC(RawStorageFormat::R32_UINT, VK_INDEX_TYPE_UINT32)
#define COLOR_SPACE_TO_VK_COLOR_SPACE_MAPPING(FUNC) \
FUNC(ColorSpace::SRGB, VK_COLOR_SPACE_SRGB_NONLINEAR_KHR) \
FUNC(ColorSpace::HDR10, VK_COLOR_SPACE_HDR10_HLG_EXT)
#define PRESENT_MODES_TO_VK_PRESENT_MODE_MAPPING(FUNC) \
FUNC(PresentModes::Immediate, VK_PRESENT_MODE_IMMEDIATE_KHR) \
FUNC(PresentModes::Mailbox, VK_PRESENT_MODE_MAILBOX_KHR) \
FUNC(PresentModes::FIFO, VK_PRESENT_MODE_FIFO_KHR) \
FUNC(PresentModes::FIFORelaxed, VK_PRESENT_MODE_FIFO_RELAXED_KHR) \
FUNC(PresentModes::SharedDemandRefresh, VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR) \
FUNC(PresentModes::SharedContinuous, VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR)
#define SHADER_STAGE_TO_SHADER_STAGE_FLAGS_MAPPING(FUNC) \
FUNC(ShaderStage::All, VK_SHADER_STAGE_ALL) \
FUNC(ShaderStage::Vertex, VK_SHADER_STAGE_VERTEX_BIT) \
FUNC(ShaderStage::Pixel, VK_SHADER_STAGE_FRAGMENT_BIT) \
FUNC(ShaderStage::Compute, VK_SHADER_STAGE_COMPUTE_BIT) \
FUNC(ShaderStage::Geometry, VK_SHADER_STAGE_GEOMETRY_BIT)
#define PRIMITIVE_TOPOLOGY_TO_VK_PRIMITIVE_TOPOLOGY_MAPPING(FUNC) \
FUNC(PrimitiveTopology::PointList, VK_PRIMITIVE_TOPOLOGY_POINT_LIST) \
FUNC(PrimitiveTopology::LineList, VK_PRIMITIVE_TOPOLOGY_LINE_LIST) \
FUNC(PrimitiveTopology::LineStrip, VK_PRIMITIVE_TOPOLOGY_LINE_STRIP) \
FUNC(PrimitiveTopology::TriangleList, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST) \
FUNC(PrimitiveTopology::TriangleStrip, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP) \
FUNC(PrimitiveTopology::TriangleFan, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN) \
FUNC(PrimitiveTopology::LineListWithAdjacency, VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY) \
FUNC(PrimitiveTopology::LineStripWithAdjacency, VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY) \
FUNC(PrimitiveTopology::TriangleListWithAdjacency, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY) \
FUNC(PrimitiveTopology::TriangleStripWithAdjacency, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY) \
FUNC(PrimitiveTopology::PatchList, VK_PRIMITIVE_TOPOLOGY_PATCH_LIST)
#define CULL_MODE_TO_VK_CULL_MODE_MAPPING(FUNC) \
FUNC(CullMode::None, VK_CULL_MODE_NONE) \
FUNC(CullMode::FrontBit, VK_CULL_MODE_FRONT_BIT) \
FUNC(CullMode::BackBit, VK_CULL_MODE_BACK_BIT) \
FUNC(CullMode::FrontAndBack, VK_CULL_MODE_FRONT_AND_BACK)
#define FRONT_FACE_TO_VK_FRONT_FACE_MAPPING(FUNC) \
FUNC(FrontFace::CounterClockwise, VK_FRONT_FACE_COUNTER_CLOCKWISE) \
FUNC(FrontFace::Clockwise, VK_FRONT_FACE_CLOCKWISE)
#define BUFFER_USAGE_RATE_TO_VK_VERTEX_INPUT_RATE_MAPPING(FUNC) \
FUNC(BufferUsageRate::PerVertex, VK_VERTEX_INPUT_RATE_VERTEX) \
FUNC(BufferUsageRate::PerInstance, VK_VERTEX_INPUT_RATE_INSTANCE)
#define IMAGE_TYPE_TO_VK_IMAGE_TYPE(FUNC) \
FUNC(ImageType::Image1D, VK_IMAGE_TYPE_1D) \
FUNC(ImageType::Image2D, VK_IMAGE_TYPE_2D) \
FUNC(ImageType::Image3D, VK_IMAGE_TYPE_3D)
#define IMAGE_VIEW_TYPE_TO_VK_IMAGE_TYPE(FUNC) \
FUNC(ImageViewType::ImageView1D, VK_IMAGE_VIEW_TYPE_1D) \
FUNC(ImageViewType::ImageView2D, VK_IMAGE_VIEW_TYPE_2D) \
FUNC(ImageViewType::ImageView3D, VK_IMAGE_VIEW_TYPE_3D) \
FUNC(ImageViewType::ImageViewCubeMap, VK_IMAGE_VIEW_TYPE_CUBE) \
FUNC(ImageViewType::ImageView1DArray, VK_IMAGE_VIEW_TYPE_1D_ARRAY) \
FUNC(ImageViewType::ImageView2DArray, VK_IMAGE_VIEW_TYPE_2D_ARRAY) \
FUNC(ImageViewType::ImageViewCubeMapArray, VK_IMAGE_VIEW_TYPE_CUBE_ARRAY)
#define BLEND_OP_TO_VK_BLEND_OP(FUNC) \
FUNC(BlendOp::Add, VK_BLEND_OP_ADD) \
FUNC(BlendOp::Subtract, VK_BLEND_OP_SUBTRACT) \
FUNC(BlendOp::ReverseSubtract, VK_BLEND_OP_REVERSE_SUBTRACT) \
FUNC(BlendOp::Min, VK_BLEND_OP_MIN) \
FUNC(BlendOp::Max, VK_BLEND_OP_MAX)
#define BLEND_FACTOR_TO_VK_BLEND_FACTOR(FUNC) \
FUNC(BlendFactor::Zero, VK_BLEND_FACTOR_ZERO) \
FUNC(BlendFactor::One, VK_BLEND_FACTOR_ONE) \
FUNC(BlendFactor::SrcColor, VK_BLEND_FACTOR_SRC_COLOR) \
FUNC(BlendFactor::OneMinusSrcColor, VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR) \
FUNC(BlendFactor::DstColor, VK_BLEND_FACTOR_DST_COLOR) \
FUNC(BlendFactor::OneMinusDstColor, VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR) \
FUNC(BlendFactor::SrcAlpha, VK_BLEND_FACTOR_SRC_ALPHA) \
FUNC(BlendFactor::OneMinusSrcAlpha, VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA) \
FUNC(BlendFactor::DstAlpha, VK_BLEND_FACTOR_DST_ALPHA) \
FUNC(BlendFactor::OneMinusDstAlpha, VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA) \
FUNC(BlendFactor::ConstantColor, VK_BLEND_FACTOR_CONSTANT_COLOR) \
FUNC(BlendFactor::OneMinusConstantColor, VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR) \
FUNC(BlendFactor::ConstantAlpha, VK_BLEND_FACTOR_CONSTANT_ALPHA) \
FUNC(BlendFactor::OneMinusConstantAlpha, VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA) \
FUNC(BlendFactor::SrcAlphaSaturate, VK_BLEND_FACTOR_SRC_ALPHA_SATURATE) \
FUNC(BlendFactor::Src1Color, VK_BLEND_FACTOR_SRC1_COLOR) \
FUNC(BlendFactor::OneMinusSrc1Color, VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR) \
FUNC(BlendFactor::Src1Alpha, VK_BLEND_FACTOR_SRC1_ALPHA) \
FUNC(BlendFactor::OneMinusSrc1Alpha, VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA)
#define CREATE_MAPPER_CPP(FROM_FORMAT, TO_FORMAT, MAPPING_TABLE, CASE_MAPPING_FUNC) \
CREATE_MAPPER_H(FROM_FORMAT, TO_FORMAT) { \
switch (inputFormat) { MAPPING_TABLE(CASE_MAPPING_FUNC) } \
return std::nullopt; \
}
// TODO(vasumahesh1): Enable some mappings when fully mapped (Currently compilers raises warnings for some mappings not
// present - This is intentional)
CREATE_MAPPER_CPP(RawStorageFormat, VkFormat, RAW_STORAGE_TO_VK_FORMAT_MAPPING, FORWARD_MAPPING)
// CREATE_MAPPER_CPP(VkFormat, RawStorageFormat, RAW_STORAGE_TO_VK_FORMAT_MAPPING, REVERSE_MAPPING)
CREATE_MAPPER_CPP(RawStorageFormat, VkIndexType, RAW_STORAGE_TO_VK_INDEX_TYPE_MAPPING, FORWARD_MAPPING) // NOLINT - Exception case as VkIndexType is different from VkFormat.
// CREATE_MAPPER_CPP(RawStorageFormat, VkIndexType, RAW_STORAGE_TO_VK_INDEX_TYPE_MAPPING, REVERSE_MAPPING)
CREATE_MAPPER_CPP(ColorSpace, VkColorSpaceKHR, COLOR_SPACE_TO_VK_COLOR_SPACE_MAPPING, FORWARD_MAPPING)
// CREATE_MAPPER_CPP(VkColorSpaceKHR, ColorSpace, COLOR_SPACE_TO_VK_COLOR_SPACE_MAPPING, REVERSE_MAPPING)
CREATE_MAPPER_CPP(PresentModes, VkPresentModeKHR, PRESENT_MODES_TO_VK_PRESENT_MODE_MAPPING, FORWARD_MAPPING)
// CREATE_MAPPER_CPP(VkPresentModeKHR, PresentModes, PRESENT_MODES_TO_VK_PRESENT_MODE_MAPPING, REVERSE_MAPPING)
CREATE_MAPPER_CPP(ShaderStage, VkShaderStageFlagBits, SHADER_STAGE_TO_SHADER_STAGE_FLAGS_MAPPING, FORWARD_MAPPING)
// CREATE_MAPPER_CPP(VkShaderStageFlagBits, ShaderStage, SHADER_STAGE_TO_SHADER_STAGE_FLAGS_MAPPING, REVERSE_MAPPING)
CREATE_MAPPER_CPP(PrimitiveTopology,
VkPrimitiveTopology,
PRIMITIVE_TOPOLOGY_TO_VK_PRIMITIVE_TOPOLOGY_MAPPING,
FORWARD_MAPPING)
// CREATE_MAPPER_CPP(VkPrimitiveTopology, PrimitiveTopology, PRIMITIVE_TOPOLOGY_TO_VK_PRIMITIVE_TOPOLOGY_MAPPING,
// REVERSE_MAPPING)
CREATE_MAPPER_CPP(CullMode, VkCullModeFlags, CULL_MODE_TO_VK_CULL_MODE_MAPPING, FORWARD_MAPPING)
// CREATE_MAPPER_CPP(VkCullModeFlags, CullMode, CULL_MODE_TO_VK_CULL_MODE_MAPPING, REVERSE_MAPPING)
CREATE_MAPPER_CPP(FrontFace, VkFrontFace, FRONT_FACE_TO_VK_FRONT_FACE_MAPPING, FORWARD_MAPPING)
// CREATE_MAPPER_CPP(VkFrontFace, FrontFace, FRONT_FACE_TO_VK_FRONT_FACE_MAPPING, REVERSE_MAPPING)
CREATE_MAPPER_CPP(BufferUsageRate,
VkVertexInputRate,
BUFFER_USAGE_RATE_TO_VK_VERTEX_INPUT_RATE_MAPPING,
FORWARD_MAPPING)
// CREATE_MAPPER_CPP(VkFrontFace, FrontFace, FRONT_FACE_TO_VK_FRONT_FACE_MAPPING, REVERSE_MAPPING)
CREATE_MAPPER_CPP(ImageType, VkImageType, IMAGE_TYPE_TO_VK_IMAGE_TYPE, FORWARD_MAPPING);
// CREATE_MAPPER_CPP(ImageType, VkImageType, IMAGE_TYPE_TO_VK_IMAGE_TYPE, REVERSE_MAPPING)
CREATE_MAPPER_CPP(ImageViewType, VkImageViewType, IMAGE_VIEW_TYPE_TO_VK_IMAGE_TYPE, FORWARD_MAPPING);
// CREATE_MAPPER_CPP(ImageType, VkImageType, IMAGE_TYPE_TO_VK_IMAGE_TYPE, REVERSE_MAPPING)
CREATE_MAPPER_CPP(BlendFactor, VkBlendFactor, BLEND_FACTOR_TO_VK_BLEND_FACTOR, FORWARD_MAPPING);
// CREATE_MAPPER_CPP(BlendFactor, VkBlendFactor, BLEND_FACTOR_TO_VK_BLEND_FACTOR, REVERSE_MAPPING);
CREATE_MAPPER_CPP(BlendOp, VkBlendOp, BLEND_OP_TO_VK_BLEND_OP, FORWARD_MAPPING);
// CREATE_MAPPER_CPP(BlendOp, VkBlendOp, BLEND_OP_TO_VK_BLEND_OP, REVERSE_MAPPING); // NOLINT
VkShaderStageFlagBits GetCombinedShaderStageFlag(ShaderStage stage) {
if (ENUM_HAS(stage, ShaderStage::All)) {
return ToVkShaderStageFlagBits(ShaderStage::All).value();
}
U32 result = 0;
if (ENUM_HAS(stage, ShaderStage::Vertex)) {
result = result | ToVkShaderStageFlagBits(ShaderStage::Vertex).value();
}
if (ENUM_HAS(stage, ShaderStage::Pixel)) {
result = result | ToVkShaderStageFlagBits(ShaderStage::Pixel).value();
}
if (ENUM_HAS(stage, ShaderStage::Compute)) {
result = result | ToVkShaderStageFlagBits(ShaderStage::Compute).value();
}
if (ENUM_HAS(stage, ShaderStage::Geometry)) {
result = result | ToVkShaderStageFlagBits(ShaderStage::Geometry).value();
}
// TODO(vasumahesh1):[ENUM]: Check safety
return static_cast<VkShaderStageFlagBits>(result);
}
} // namespace Vulkan
} // namespace Azura