我正在尝试将现有的代码库转换为使用Lunar SDK中vulkan.hpp中定义的包装器。
尤其是我有以下代码行:
vkEnumerateInstanceLayerProperties(&layerCount, nullptr);
这是使用C语言处理vulkan的原生方式。
我尝试将其更改为:
vk::enumerateInstanceLayerProperties(&layerCount, nullptr);
这是vulkan.hpp的命名约定。但是,此操作无法编译,有多个错误,第一个是error: ‘unsigned int*’ is not a class, struct, or union type
vulkan.hpp中定义的签名为:
template <typename Allocator, typename Dispatch>
VULKAN_HPP_INLINE typename ResultValueType<std::vector<LayerProperties,Allocator>>::type enumerateInstanceLayerProperties(Allocator const& vectorAllocator, Dispatch const &d )
当时我的假设是第一个参数必须是向量:
std::vector<vk::LayerProperties> availableLayers;
vk::enumerateInstanceLayerProperties(availableLayers, nullptr);
但是它也无法编译,警告我以下内容:
error: request for member ‘vkEnumerateInstanceLayerProperties’ in ‘d’, whichis of non-class type ‘std::nullptr_t’
d
是该函数的第二个参数。
要成功编译这段代码,调度应该是什么?
答案 0 :(得分:4)
使用C ++标头,该函数根本不接受任何参数,而是直接返回向量vk::LayerProperties
,因此您只需分配结果即可:
std::vector<vk::LayerProperties> instanceLayerProps = vk::enumerateInstanceLayerProperties();
这也省去了您两次调用函数的麻烦,就像C头文件一样,在这里您首先需要获取计数来分配向量。这一切都在这里隐式完成。