Если бы вы могли это сделать, тогда 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);
}
Вы можете использовать макрос, чтобы сделать определение таблицы более привлекательным.