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