c++ - Vulkan Vulkan.hpp 从对象实例中获取对象类型

标签 c++ graphics enums vulkan

有没有办法从实例中获取对象类型枚举器(vk::ObjectType dor vulkan.hpp 和 VkObjectType for vulkan)?

例如假设我们有 3 个对象:

vk::Device d;
vk::Buffer b;
vk::Queue q;

和一个函数 f() 这样:

f(d) returns: eDevice
f(b) returns: eBuffer
f(q) returns: eQueue 

无论这是在 lunar sdk、第三方库中还是只是一个聪明的 hack 都没有关系。

最佳答案

如果你能做到这一点,那么 VkDebugUtilsObjectNameInfoEXT 就不需要采用 objectType,对吧 ;)

因此您有两个选择,它们都需要相同的东西:从 C/C++ 对象类型到实际 VkObjectType 枚举器的映射表。

有运行时选择,您可以在其中构建从 std::type_index 映射到 VkObjectType 的某种映射。使用 std::map,您将拥有:

std::map<std::type_index, VkObjectType> objectMap = {
    {std::type_index(typeid(VkInstance)), VK_OBJECT_TYPE_INSTANCE},
    {std::type_index(typeid(VkPhysicalDevice)), VK_OBJECT_TYPE_PHYSICAL_DEVICE},
    {std::type_index(typeid(VkDevice)), VK_OBJECT_TYPE_DEVICE},
    ...
};

template<typename T>
void SetName(VkDevice *device, T *obj, const char *name)
{
    VkDebugUtilsObjectNameInfoEXT nameInfo =
    {
         VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT,
         nullptr,
         objectMap[typeid(T)],
         (reinterpret_cast<std::uint64_t>(obj),
         name,
    };

    vkSetDebugUtilsObjectNameEXT(device, &nameInfo);
}

可以通过使用模板特化来获得更编译时的解决方案:

template<typename T>
struct VulkanObjectMap;

template struct VulkanObjectMap<VkInstance> { static VkObjectType value = VK_OBJECT_TYPE_INSTANCE; };
template struct VulkanObjectMap<VkPhysicalDevice> { static VkObjectType value = VK_OBJECT_TYPE_PHYSICAL_DEVICE; };
template struct VulkanObjectMap<VkDevice> { static VkObjectType value = VK_OBJECT_TYPE_DEVICE; };
...

template<typename T>
void SetName(VkDevice *device, T *obj, const char *name)
{
    VkDebugUtilsObjectNameInfoEXT nameInfo =
    {
         VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT,
         nullptr,
         VulkanObjectMap<T>::value,
         reinterpret_cast<std::uint64_t>(obj),
         name,
    };

    vkSetDebugUtilsObjectNameEXT(device, &nameInfo);
}

您可以使用宏来定义更美观的表格。

关于c++ - Vulkan Vulkan.hpp 从对象实例中获取对象类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56821294/

相关文章:

c - 在不添加长前缀的情况下确保 C 中枚举名称的唯一性

java - 启动枚举作为值

c++ - 创建依赖于其他共享对象的共享对象

c++ - Boost 跳过解析器是正确的方法吗?

c++ - 无法创建项目,无法识别的命令行选项 libc++ 错误

java - 如何在JavaFX饼图中显示值?

c++ - 冒泡排序数字

c++ - 为什么尽管源代码没有变化,但一个系统与另一个系统的碎片数量却有很大差异?

c++ - 即使 glfwInit() 返回 1,也无法让 GLFW 工作

c# - 如何使用类型填充组合框