vulkan vulkan.hpp从对象实例中获取opbject类型



是否有一种方法可以从实例中获取对象类型枚举器( vk::ObjectType dor vulkan.hpp和 VkObjectType(?

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

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

和a函数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);
}

可以通过使用模板专业化来实现更编译的时间解决方案:

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);
}

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

相关内容

  • 没有找到相关文章

最新更新