[英]Vulkan Vulkan.hpp get opbject type from object instance
有沒有辦法從實例獲取對象類型枚舉器( vk::ObjectType
dor vulkan.hpp和VkObjectType
的VkObjectType)?
例如,假設我們有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
了;)
因此,您有兩種選擇, VkObjectType
選擇都需要相同的東西:從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);
}
您可以使用宏來使表定義更好看。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.