Что на самом деле делает vk :: DeviceQueueCreateFlags ()? - PullRequest
1 голос
/ 25 марта 2019

C-подобный способ инициализации этой структуры:

VkDeviceQueueCreateInfo queueCreateInfo = {};
    queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
    queueCreateInfo.queueFamilyIndex = queueFamily;
    queueCreateInfo.queueCount = 1;
    queueCreateInfo.pQueuePriorities = &queuePriority;

Способ C ++ с использованием и злоупотреблением заголовком vulkan.hpp:

vk::DeviceQueueCreateInfo deviceQueueCreateInfo(vk::DeviceQueueCreateFlags(), static_cast<uint32_t>(graphicsQueueFamilyIndex), 1, &queuePriority);

Кажется, что большая часть работы заключена в функции vk::DeviceQueueCreateFlags().

Однако просмотр источника в моем редакторе ничего полезного не дает. Я надеялся, что кто-то с большим опытом сможет предоставить некоторую информацию о том, что делает функция.

1 Ответ

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

Это псевдоним для vk::Flags, который является шаблоном для работы с битовыми полями Vulkan в типобезопасном поместье.

Вы хотите, чтобы перечисления были безопасными для типов; Вы не хотите неявных преобразований в / из целых чисел. Поэтому в C ++ вы делаете это, определяя перечисление как enum class.

Это нормально для регулярных перечислений. Но битовые поля особенные; они комбинации перечислителей из конкретного перечисления. Типичное решение после C ++ 11 - просто дать перегруженные операторы типа перечисления, чтобы вы могли применять & и | к самому типу перечисления.

Лично это решение всегда меня терло. На мой взгляд, сильный тип перечисления должен содержать один значений перечисления, а не несколько из них. Поэтому использование перегрузки операторов для эффективного допуска значения перечисления ложь меня не устраивало.

Очевидно, я не одинок в этом, потому что авторы vulkan.hpp выбрали другое решение. Они создали шаблон класса vk::Flags, который принимает два параметра шаблона. Одним из них является перечисление, которое содержит все допустимые битовые флаги. Второй параметр - это «перечисление», которое представляет объединение нескольких флагов. Это то, что на самом деле понимает файл спецификации vulkan.xml: разница между полем, содержащим возможные биты, и полем, которое представляет собой совокупность битов.

vk::Flags могут быть заданы биты из битового поля, и вы можете манипулировать им битами из этого битового поля с помощью некоторых побитовых операторов. И он неявно преобразуется в тип, представляющий агрегацию битов.

Так что DeviceQueueCreateInfo это просто псевдоним для Flags<DeviceQueueCreateFlagBits, VkDeviceQueueCreateFlags>, который является битовым полем, которое принимает биты создания устройства и объединяет их в совокупность флагов.

...