Vulkan hpp wrappers, сигнатурный конфликт - PullRequest
1 голос
/ 16 марта 2019

Я пытаюсь преобразовать свою существующую кодовую базу, чтобы использовать обертки, определенные в vulkan.hpp в лунном SDK.

В частности, у меня была строка кода:

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 - второй параметр функции.

Какой должна быть диспетчеризация, чтобы успешно скомпилировать этот кусок кода?

1 Ответ

4 голосов
/ 16 марта 2019

Используя заголовки C ++, эта функция вообще не принимает никаких аргументов и вместо этого просто возвращает вектор vk::LayerProperties напрямую, поэтому вы просто присваиваете результат:

std::vector<vk::LayerProperties> instanceLayerProps = vk::enumerateInstanceLayerProperties();

Это также избавляет вас от необходимости дважды вызывать функцию, как в случае с заголовками C, где вам сначала нужно получить значение count, выделяющее ваш вектор. Здесь все сделано неявно.

...