Vulkan Vulkan.hpp получает тип объекта из экземпляра объекта - PullRequest
1 голос
/ 30 июня 2019

Есть ли способ получить перечислитель типа объекта (vk::ObjectType dor vulkan.hpp и VkObjectType для vulkan) из экземпляра?

Например, предположим, у нас есть 3 объекта:

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

и функция f () такая, что:

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

Неважно, находится ли это в лунном SDK, сторонней библиотеке или просто умном взломе.

1 Ответ

2 голосов
/ 30 июня 2019

Если бы вы могли это сделать, тогда 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);
}

Вы можете использовать макрос, чтобы сделать определение таблицы более привлекательным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...