簡體   English   中英

Vulkan Vulkan.hpp從對象實例獲取opbject類型

[英]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_indexVkObjectType 使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM