.. _program_listing_file_PrismEngine_src_descriptorSetLayout.cpp: Program Listing for File descriptorSetLayout.cpp ================================================ |exhale_lsh| :ref:`Return to documentation for file ` (``PrismEngine\src\descriptorSetLayout.cpp``) .. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS .. code-block:: cpp #include "descriptorSetLayout.h" void prism::PGC::DescriptorSetLayout::init(PGC::utils::Context* context, PGC::utils::Settings* settings) { this->context = context; this->settings = settings; create(); } prism::PGC::DescriptorSetLayout::~DescriptorSetLayout() { } void prism::PGC::DescriptorSetLayout::cleanup() { vkDestroyDescriptorSetLayout(context->device, context->descriptorSetLayout, nullptr); } void prism::PGC::DescriptorSetLayout::create() { std::vector bindings; for (int i = 0; i < settings->descriptorSetLayout.bindings.size(); i++) { utils::BindingConfig targetBinding = settings->descriptorSetLayout.bindings[i]; bindings.push_back(createDescriptorSetLayoutBinding(targetBinding.binding, targetBinding.descriptorType, targetBinding.descriptorCount, targetBinding.stageFlags, targetBinding.immutableSamplers)); } VkDescriptorSetLayoutCreateInfo layoutInfo{}; layoutInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; layoutInfo.bindingCount = static_cast(bindings.size()); layoutInfo.pBindings = bindings.data(); if (vkCreateDescriptorSetLayout(context->device, &layoutInfo, nullptr, &context->descriptorSetLayout) != VK_SUCCESS) { throw std::runtime_error("failed to create descriptor set layout!"); } // Пул для bindless текстур VkDescriptorPoolSize texturePoolSize{}; texturePoolSize.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; texturePoolSize.descriptorCount = settings->MAX_TEXTURES; VkDescriptorPoolCreateInfo texturePoolInfo{}; texturePoolInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; texturePoolInfo.flags = VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT_EXT; texturePoolInfo.poolSizeCount = 1; texturePoolInfo.pPoolSizes = &texturePoolSize; texturePoolInfo.maxSets = 1; if (vkCreateDescriptorPool(context->device, &texturePoolInfo, nullptr, &context->textureDescriptorPool) != VK_SUCCESS) { throw std::runtime_error("failed to create texture descriptor pool!"); } } VkDescriptorSetLayoutBinding prism::PGC::DescriptorSetLayout::createDescriptorSetLayoutBinding(uint32_t binding, VkDescriptorType descriptorType, uint32_t descriptorCount, VkShaderStageFlags stageFlags, const VkSampler* immutableSamplers) { VkDescriptorSetLayoutBinding uboLayoutBinding{}; uboLayoutBinding.binding = binding; uboLayoutBinding.descriptorCount = descriptorCount; uboLayoutBinding.descriptorType = descriptorType; uboLayoutBinding.pImmutableSamplers = immutableSamplers; uboLayoutBinding.stageFlags = stageFlags; return uboLayoutBinding; }