Vulkan API — урок 42. Descriptor pool

Набор дескрипторов не может быть создан непосредственно, он должны быть выделен из пула, примерно как буферы команд. Эквивалент для наборов дескрипторов называется descriptor pool, что логично. Для его настройки напишем новую функцию createDescriptorPool.

void initVulkan() {
    ...
    createUniformBuffer();
    createDescriptorPool();
    ...
}

...

void createDescriptorPool() {

}

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

VkDescriptorPoolSize poolSize = {};
poolSize.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
poolSize.descriptorCount = 1;

На данный момент у нас есть только один дескриптор, типа uniform buffer. Ссылка на него будет использована в VkDescriptorPoolCreateInfo:

VkDescriptorPoolCreateInfo poolInfo = {};
poolInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
poolInfo.poolSizeCount = 1;
poolInfo.pPoolSizes = &poolSize;

Так же нам нужно определить максимальное количество наборов дескрипторов, для которых будет выделена память:

poolInfo.maxSets = 1;

Структура  имеет опционалный флаг, аналогично пулу команд, который определяет, могут ли наборы команд освобождены по отдельности или нет: VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT. Мы не будем касаться набора после создания, так что на данный флаг не обращаем внимания. Значение по умолчанию будет 0.

Ну и это все нужно где-то хранить, для этого используем все тот же VDeleter и vkCreateDescriptorPool.

VDeleter descriptorPool{device, vkDestroyDescriptorPool};

...

if (vkCreateDescriptorPool(device, &poolInfo, nullptr, descriptorPool.replace()) != VK_SUCCESS) {
    throw std::runtime_error("failed to create descriptor pool!");
}

В следующем уроке будет описано как заполнить и использовать набор, и к концу его практически все связанное с 3D будет рассказано (останется только»Depth buffering», но о нем после текстур).

Main Admin

2 Comments

    • Уезжал на несколько дней, урок уже почти готов, завтра будет.

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

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