Vulkan API — урок 15. Создание Presentation очереди (+листинг)

Теперь нам нужно модифицировать процедуру создания логического устройства для создания presentation  очереди и получить дескриптор VkQueue. И переменная для него:

VkQueue presentQueue;

Далее нам понадобится несколько VkDeviceQueueCreateInfo структур для создания очередей из обоих семейств. Самый элегантный путь пожалуй будет — создать набор из всех уникальных семейств, которые необходимы для требуемых очередей:

#include <set>

...

QueueFamilyIndices indices = findQueueFamilies(physicalDevice);

std::vector<VkDeviceQueueCreateInfo> queueCreateInfos;
std::set<int> uniqueQueueFamilies = {indices.graphicsFamily, indices.presentFamily};

float queuePriority = 1.0f;
for (int queueFamily : uniqueQueueFamilies) {
    VkDeviceQueueCreateInfo queueCreateInfo = {};
    queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
    queueCreateInfo.queueFamilyIndex = queueFamily;
    queueCreateInfo.queueCount = 1;
    queueCreateInfo.pQueuePriorities = &queuePriority;
    queueCreateInfos.push_back(queueCreateInfo);
}

И модифицируем VkDeviceCreateInfo, что бы он указывал на вектор:

createInfo.pQueueCreateInfos = queueCreateInfos.data();
createInfo.queueCreateInfoCount = (uint32_t) queueCreateInfos.size();

Если очередь всего одна, то просто передаем индекс лишь раз. И в конце добавляем вызов для получения дескриптора очереди:

vkGetDeviceQueue(device, indices.presentFamily, 0, &presentQueue);

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

 Ну и код соответственно.

Main Admin

4 Comments

  1. Почти неделю нет новых уроков. Надеюсь, перевод не заброшен? 🙁

    • Не волнуйтесь, скоро все будет. Сегодня заняться им тоже особо времени не будет, ну а после буду выкладывать по много текста. Основы Вулкана планирую закончить за две недели, начиная со следующей, а далее переходить к планомерному переводу книги «Jason Gregory — Game Engine Architecture (2nd edition)» (она рассказывает основы геймдева, по понятным причинам в 1к (на английском, на русском будет примерно +20% текста) страниц поместились лишь самые основы).
      Насчет задержек перевода, может кто из камрадов сталкивался с вопросом движения объекта по окружности или сфере? Как высчитывали координаты без использования синуса/косинуса? Если методом смещения, то как боролись с нарастающей погрешностью (кроме округления)?

      • Вот здесь подробно пытаются рассмотреть этот вопрос, про координаты точки на окружности без вычисления углов с помощью тригонометрических функций: http://math.hashcode.ru/questions/25565/%D0%BA%D0%B0%D0%BA-%D0%BD%D0%B0%D0%B9%D1%82%D0%B8-%D0%BA%D0%BE%D0%BE%D1%80%D0%B4%D0%B8%D0%BD%D0%B0%D1%82%D1%8B-%D0%BD%D0%B0-%D0%BE%D0%BA%D1%80%D1%83%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D0%B8

        Еще, если я правильно помню, в древних играх в эпоху когда считать синусы и косинусы в реальном времени было слишком дорого, пользовались таким трюком — заранее просчитывали значения углов и заносили их в таблицу, а потом уже внутри основного цикла эту таблицу использовали. Как-то так, извиняюсь за кривую формулировку.

        • Спасибо, ссылочка оказалась полезна, но имелось в виду кое что друго. На выходных попробую собрать мысли в кучу (что и самому полезно), и написать то что хочу реализовать (может кому окажется полезно).

          Обращение к памяти в современных реалиях не особо актуальны. Ходят слухи, что работа с таблицами объемом более 8КБ уже теряет смысл, ну и в любом случае обращение к памяти затребует время. Принятое решение и причины озвучу, а комменты перенесу под соответствующую тему.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *