C++ Vulkan Vulkan.hpp从对象实例获取对象类型

C++ Vulkan Vulkan.hpp从对象实例获取对象类型,c++,graphics,enums,vulkan,C++,Graphics,Enums,Vulkan,有没有办法从实例中获取对象类型枚举器(vk::ObjectTypedor vulkan.hpp和VkObjectTypefor 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(第三方库)中,还是仅仅是一个聪明的黑客程序中 如果您可以

有没有办法从实例中获取对象类型枚举器(
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(第三方库)中,还是仅仅是一个聪明的黑客程序中

如果您可以这样做,那么
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);
}
std::map 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},
...
};
模板
void SetName(VkDevice*设备、T*obj、const char*名称)
{
VkDebugUtilsObjectNameInfoEXT nameInfo=
{
VK\结构\类型\调试\实用程序\对象\名称\信息\外部,
nullptr,
objectMap[typeid(T)],类型,
(重新解释铸造(obj),
名称
};
vkSetDebugUtilsObjectNameEXT(设备和名称信息);
}
通过使用模板专门化,可以获得更多的编译时解决方案:

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);
}
模板
结构VulkanObjectMap;
模板结构VulkanObjectMap{static VkObjectType value=VK_OBJECT_TYPE_INSTANCE;};
模板结构VulkanObjectMap{static VkObjectType value=VK_OBJECT_TYPE_PHYSICAL_DEVICE;};
模板结构VulkanObjectMap{static VkObjectType value=VK_OBJECT_TYPE_DEVICE;};
...
模板
void SetName(VkDevice*设备、T*obj、const char*名称)
{
VkDebugUtilsObjectNameInfoEXT nameInfo=
{
VK\结构\类型\调试\实用程序\对象\名称\信息\外部,
nullptr,
VulkanObjectMap::value,
重新解释铸造(obj),
名称
};
vkSetDebugUtilsObjectNameEXT(设备和名称信息);
}

您可以使用宏来更好地定义表格。

问题,是否有类似于vulkan.hpp对象的强制转换解释的方法?即
重新解释强制转换(obj)
where object是vk::*object而不是vk*object?@Makogan:我不知道;如何从他们那里获得指向真正的
vk*
对象的真正指针?你必须使用那个API。