Program Listing for File representation.hpp

Return to documentation for file (inexor/vulkan-renderer/tools/representation.hpp)

#pragma once

#include <volk.h>

#include <set>
#include <span>
#include <string_view>
#include <type_traits>

namespace inexor::vulkan_renderer::tools {

template <typename T>
[[nodiscard]] std::string_view as_string(T);

[[nodiscard]] std::string_view get_device_feature_description(std::size_t index);

template <typename T>
[[nodiscard]] constexpr VkObjectType get_vk_object_type(const T &) noexcept {
    using U = std::decay_t<T>;

    if constexpr (std::is_same_v<U, VkBuffer>)
        return VK_OBJECT_TYPE_BUFFER;
    else if constexpr (std::is_same_v<U, VkCommandBuffer>)
        return VK_OBJECT_TYPE_COMMAND_BUFFER;
    else if constexpr (std::is_same_v<U, VkCommandPool>)
        return VK_OBJECT_TYPE_COMMAND_POOL;
    else if constexpr (std::is_same_v<U, VkInstance>)
        return VK_OBJECT_TYPE_INSTANCE;
    else if constexpr (std::is_same_v<U, VkPhysicalDevice>)
        return VK_OBJECT_TYPE_PHYSICAL_DEVICE;
    else if constexpr (std::is_same_v<U, VkDescriptorPool>)
        return VK_OBJECT_TYPE_DESCRIPTOR_POOL;
    else if constexpr (std::is_same_v<U, VkDescriptorSet>)
        return VK_OBJECT_TYPE_DESCRIPTOR_SET;
    else if constexpr (std::is_same_v<U, VkDescriptorSetLayout>)
        return VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT;
    else if constexpr (std::is_same_v<U, VkDevice>)
        return VK_OBJECT_TYPE_DEVICE;
    else if constexpr (std::is_same_v<U, VkEvent>)
        return VK_OBJECT_TYPE_EVENT;
    else if constexpr (std::is_same_v<U, VkFence>)
        return VK_OBJECT_TYPE_FENCE;
    else if constexpr (std::is_same_v<U, VkFramebuffer>)
        return VK_OBJECT_TYPE_FRAMEBUFFER;
    else if constexpr (std::is_same_v<U, VkImage>)
        return VK_OBJECT_TYPE_IMAGE;
    else if constexpr (std::is_same_v<U, VkImageView>)
        return VK_OBJECT_TYPE_IMAGE_VIEW;
    else if constexpr (std::is_same_v<U, VkPipeline>)
        return VK_OBJECT_TYPE_PIPELINE;
    else if constexpr (std::is_same_v<U, VkPipelineCache>)
        return VK_OBJECT_TYPE_PIPELINE_CACHE;
    else if constexpr (std::is_same_v<U, VkPipelineLayout>)
        return VK_OBJECT_TYPE_PIPELINE_LAYOUT;
    else if constexpr (std::is_same_v<U, VkQueryPool>)
        return VK_OBJECT_TYPE_QUERY_POOL;
    else if constexpr (std::is_same_v<U, VkQueue>)
        return VK_OBJECT_TYPE_QUEUE;
    else if constexpr (std::is_same_v<U, VkRenderPass>)
        return VK_OBJECT_TYPE_RENDER_PASS;
    else if constexpr (std::is_same_v<U, VkSampler>)
        return VK_OBJECT_TYPE_SAMPLER;
    else if constexpr (std::is_same_v<U, VkSemaphore>)
        return VK_OBJECT_TYPE_SEMAPHORE;
    else if constexpr (std::is_same_v<U, VkShaderModule>)
        return VK_OBJECT_TYPE_SHADER_MODULE;
    else if constexpr (std::is_same_v<U, VkSurfaceKHR>)
        return VK_OBJECT_TYPE_SURFACE_KHR;
    else if constexpr (std::is_same_v<U, VkSwapchainKHR>)
        return VK_OBJECT_TYPE_SWAPCHAIN_KHR;
    else
        return VK_OBJECT_TYPE_UNKNOWN;
}

template <typename T>
[[nodiscard]] constexpr VkDebugReportObjectTypeEXT get_vk_debug_report_object_type(const T &) noexcept {
    using U = std::decay_t<T>;

    if constexpr (std::is_same_v<U, VkBuffer>)
        return VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT;
    else if constexpr (std::is_same_v<U, VkCommandBuffer>)
        return VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT;
    else if constexpr (std::is_same_v<U, VkCommandPool>)
        return VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT;
    else if constexpr (std::is_same_v<U, VkInstance>)
        return VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT;
    else if constexpr (std::is_same_v<U, VkPhysicalDevice>)
        return VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT;
    else if constexpr (std::is_same_v<U, VkDescriptorPool>)
        return VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT;
    else if constexpr (std::is_same_v<U, VkDescriptorSet>)
        return VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT;
    else if constexpr (std::is_same_v<U, VkDescriptorSetLayout>)
        return VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT;
    else if constexpr (std::is_same_v<U, VkDevice>)
        return VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT;
    else if constexpr (std::is_same_v<U, VkEvent>)
        return VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT;
    else if constexpr (std::is_same_v<U, VkFence>)
        return VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT;
    else if constexpr (std::is_same_v<U, VkFramebuffer>)
        return VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT;
    else if constexpr (std::is_same_v<U, VkImage>)
        return VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT;
    else if constexpr (std::is_same_v<U, VkImageView>)
        return VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT;
    else if constexpr (std::is_same_v<U, VkPipeline>)
        return VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT;
    else if constexpr (std::is_same_v<U, VkPipelineCache>)
        return VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT;
    else if constexpr (std::is_same_v<U, VkPipelineLayout>)
        return VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT;
    else if constexpr (std::is_same_v<U, VkQueryPool>)
        return VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT;
    else if constexpr (std::is_same_v<U, VkQueue>)
        return VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT;
    else if constexpr (std::is_same_v<U, VkRenderPass>)
        return VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT;
    else if constexpr (std::is_same_v<U, VkSampler>)
        return VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT;
    else if constexpr (std::is_same_v<U, VkSemaphore>)
        return VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT;
    else if constexpr (std::is_same_v<U, VkShaderModule>)
        return VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT;
    else if constexpr (std::is_same_v<U, VkSurfaceKHR>)
        return VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT;
    else if constexpr (std::is_same_v<U, VkSwapchainKHR>)
        return VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT;
    else
        return VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT;
}

template <typename FlagBitsType, typename FlagsType>
[[nodiscard]] std::set<FlagBitsType> parse_bit_flags(FlagsType flags, std::span<const FlagBitsType> all_bits) {
    std::set<FlagBitsType> result;
    for (const auto bit : all_bits) {
        if (flags & static_cast<FlagsType>(bit)) {
            result.insert(bit);
        }
    }
    return result;
}

[[nodiscard]] std::string_view result_to_description(VkResult result);

} // namespace inexor::vulkan_renderer::tools