Vulkan Vulkan.hpp 从对象实例获取对象类型
Vulkan Vulkan.hpp get opbject type from object instance
有没有办法从实例中获取对象类型枚举器(vk::ObjectType
dor vulkan.hpp 和 VkObjectType
for vulkan)?
例如假设我们有 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
,对吧 ;)
所以你有两个选择,它们都需要相同的东西:从 C/C++ 对象类型到实际 VkObjectType
枚举器的映射 table。
有运行时选项,您可以在其中构建从 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);
}
使用模板专业化可以得到更多compile-time的解决方案:
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);
}
您可以使用宏来定义 table 更美观。
有没有办法从实例中获取对象类型枚举器(vk::ObjectType
dor vulkan.hpp 和 VkObjectType
for vulkan)?
例如假设我们有 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
,对吧 ;)
所以你有两个选择,它们都需要相同的东西:从 C/C++ 对象类型到实际 VkObjectType
枚举器的映射 table。
有运行时选项,您可以在其中构建从 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);
}
使用模板专业化可以得到更多compile-time的解决方案:
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);
}
您可以使用宏来定义 table 更美观。