Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • 119-graphicspipeline-refactoring
  • 129-projekte-und-assets-auslagern
  • 132-denoising-module
  • 143-ar-vr-support-via-openxr
  • 43-multi-threading
  • 91-compute-first-network
  • 95-arm64-raspberry-pi-4-support
  • develop
  • master
  • optimizations
  • 0.1.0
  • 0.2.0
12 results

Target

Select target project
  • vulkan2021/vkcv-framework
1 result
Select Git revision
  • 119-graphicspipeline-refactoring
  • 129-projekte-und-assets-auslagern
  • 132-denoising-module
  • 143-ar-vr-support-via-openxr
  • 43-multi-threading
  • 91-compute-first-network
  • 95-arm64-raspberry-pi-4-support
  • develop
  • master
  • optimizations
  • 0.1.0
  • 0.2.0
12 results
Show changes
Commits on Source (4)
......@@ -219,7 +219,7 @@ namespace vkcv
ResourcesHandle createResourceDescription(const std::vector<DescriptorSetConfig> &descriptorSets);
void writeResourceDescription(ResourcesHandle handle, size_t setIndex, const DescriptorWrites& writes);
vk::DescriptorSetLayout getDescritorSetLayout(ResourcesHandle handle, size_t setIndex);
vk::DescriptorSetLayout getDescriptorSetLayout(ResourcesHandle handle, size_t setIndex);
/**
* @brief start recording command buffers and increment frame index
......
......@@ -105,13 +105,19 @@ int main(int argc, const char** argv) {
});
vkcv::ResourcesHandle set = core.createResourceDescription({ setConfig });
//only exemplary code for testing
for (int i = 0; i < 1001; i++) {
vkcv::ResourcesHandle furtherSets = core.createResourceDescription({ setConfig });
}
//end of exemplary code
const vkcv::PipelineConfig trianglePipelineDefinition(
triangleShaderProgram,
windowWidth,
windowHeight,
trianglePass,
mesh.vertexGroups[0].vertexBuffer.attributes,
{ core.getDescritorSetLayout(set, 0) });
{ core.getDescriptorSetLayout(set, 0) });
vkcv::PipelineHandle trianglePipeline = core.createGraphicsPipeline(trianglePipelineDefinition);
if (!trianglePipeline) {
......
......@@ -366,7 +366,7 @@ namespace vkcv
*m_SamplerManager);
}
vk::DescriptorSetLayout Core::getDescritorSetLayout(ResourcesHandle handle, size_t setIndex) {
vk::DescriptorSetLayout Core::getDescriptorSetLayout(ResourcesHandle handle, size_t setIndex) {
return m_DescriptorManager->getDescriptorSetLayout(handle, setIndex);
}
}
......@@ -11,23 +11,20 @@ namespace vkcv
m_Device{ device }
{
/**
* Allocate a set size for the initial pool, namely 1000 units of each descriptor type below.
* Allocate the set size for the descriptor pools, namely 1000 units of each descriptor type below.
* Finally, create an initial pool.
*/
const std::vector<vk::DescriptorPoolSize> poolSizes = {vk::DescriptorPoolSize(vk::DescriptorType::eSampler, 1000),
vk::DescriptorPoolSize(vk::DescriptorType::eSampledImage, 1000),
vk::DescriptorPoolSize(vk::DescriptorType::eUniformBuffer, 1000),
vk::DescriptorPoolSize(vk::DescriptorType::eStorageBuffer, 1000)};
m_PoolSizes = { vk::DescriptorPoolSize(vk::DescriptorType::eSampler, 1000),
vk::DescriptorPoolSize(vk::DescriptorType::eSampledImage, 1000),
vk::DescriptorPoolSize(vk::DescriptorType::eUniformBuffer, 1000),
vk::DescriptorPoolSize(vk::DescriptorType::eStorageBuffer, 1000) };
vk::DescriptorPoolCreateInfo poolInfo({},
1000,
static_cast<uint32_t>(poolSizes.size()),
poolSizes.data());
m_PoolInfo = vk::DescriptorPoolCreateInfo({},
1000,
static_cast<uint32_t>(m_PoolSizes.size()),
m_PoolSizes.data());
if(m_Device.createDescriptorPool(&poolInfo, nullptr, &m_Pool) != vk::Result::eSuccess)
{
std::cout << "FAILED TO ALLOCATED DESCRIPTOR POOL." << std::endl;
m_Pool = nullptr;
};
allocateDescriptorPool();
}
DescriptorManager::~DescriptorManager() noexcept
......@@ -35,8 +32,9 @@ namespace vkcv
for (uint64_t id = 0; id < m_ResourceDescriptions.size(); id++) {
destroyResourceDescriptionById(id);
}
m_Device.destroy(m_Pool);
for (const auto &pool : m_Pools) {
m_Device.destroy(pool);
}
}
ResourcesHandle DescriptorManager::createResourceDescription(const std::vector<DescriptorSetConfig> &descriptorSets)
......@@ -69,16 +67,24 @@ namespace vkcv
}
//create and allocate the set(s) based on the layouts that have been gathered above
vk_sets.resize(vk_setLayouts.size());
vk::DescriptorSetAllocateInfo allocInfo(m_Pool, vk_sets.size(), vk_setLayouts.data());
vk::DescriptorSetAllocateInfo allocInfo(m_Pools.back(), vk_sets.size(), vk_setLayouts.data());
auto result = m_Device.allocateDescriptorSets(&allocInfo, vk_sets.data());
if(result != vk::Result::eSuccess)
{
std::cout << "FAILED TO ALLOCATE DESCRIPTOR SET" << std::endl;
std::cout << vk::to_string(result) << std::endl;
for(const auto &layout : vk_setLayouts)
m_Device.destroy(layout);
//create a new descriptor pool if the previous one ran out of memory
if (result == vk::Result::eErrorOutOfPoolMemory) {
allocateDescriptorPool();
allocInfo.setDescriptorPool(m_Pools.back());
result = m_Device.allocateDescriptorSets(&allocInfo, vk_sets.data());
}
if (result != vk::Result::eSuccess) {
std::cout << "FAILED TO ALLOCATE DESCRIPTOR SET" << std::endl;
std::cout << vk::to_string(result) << std::endl;
for (const auto& layout : vk_setLayouts)
m_Device.destroy(layout);
return ResourcesHandle();
return ResourcesHandle();
}
};
const uint64_t id = m_ResourceDescriptions.size();
......@@ -94,7 +100,7 @@ namespace vkcv
};
void DescriptorManager::writeResourceDescription(
ResourcesHandle handle,
const ResourcesHandle &handle,
size_t setIndex,
const DescriptorWrites &writes,
const ImageManager &imageManager,
......@@ -224,11 +230,11 @@ namespace vkcv
m_Device.updateDescriptorSets(vulkanWrites, nullptr);
}
vk::DescriptorSet DescriptorManager::getDescriptorSet(ResourcesHandle handle, size_t index) {
vk::DescriptorSet DescriptorManager::getDescriptorSet(const ResourcesHandle &handle, size_t index) const {
return m_ResourceDescriptions[handle.getId()].descriptorSets[index];
}
vk::DescriptorSetLayout DescriptorManager::getDescriptorSetLayout(ResourcesHandle handle, size_t index) {
vk::DescriptorSetLayout DescriptorManager::getDescriptorSetLayout(const ResourcesHandle &handle, size_t index) const {
return m_ResourceDescriptions[handle.getId()].descriptorSetLayouts[index];
}
......@@ -285,4 +291,15 @@ namespace vkcv
resourceDescription.descriptorSetLayouts.clear();
}
vk::DescriptorPool DescriptorManager::allocateDescriptorPool() {
vk::DescriptorPool pool;
if (m_Device.createDescriptorPool(&m_PoolInfo, nullptr, &pool) != vk::Result::eSuccess)
{
std::cout << "FAILED TO ALLOCATE DESCRIPTOR POOL." << std::endl;
pool = nullptr;
};
m_Pools.push_back(pool);
return pool;
}
}
\ No newline at end of file
/**
* @authors Artur Wasmut, Susanne D�tsch, Simeon Hermann
* @file src/vkcv/DescriptorManager.cpp
* @brief Creation and handling of descriptor sets and the respective descriptor pools
*/
#include <vulkan/vulkan.hpp>
#include "vkcv/Handles.hpp"
......@@ -26,19 +31,23 @@ namespace vkcv
ResourcesHandle createResourceDescription(const std::vector<DescriptorSetConfig> & descriptorSets);
void writeResourceDescription(
ResourcesHandle handle,
const ResourcesHandle &handle,
size_t setIndex,
const DescriptorWrites& writes,
const ImageManager& imageManager,
const BufferManager& bufferManager,
const SamplerManager& samplerManager);
const DescriptorWrites &writes,
const ImageManager &imageManager,
const BufferManager &bufferManager,
const SamplerManager &samplerManager);
vk::DescriptorSet getDescriptorSet(ResourcesHandle handle, size_t index);
vk::DescriptorSetLayout getDescriptorSetLayout(ResourcesHandle handle, size_t index);
[[nodiscard]]
vk::DescriptorSet getDescriptorSet(const ResourcesHandle &handle, size_t index) const;
[[nodiscard]]
vk::DescriptorSetLayout getDescriptorSetLayout(const ResourcesHandle &handle, size_t index) const;
private:
vk::Device m_Device;
vk::DescriptorPool m_Pool;
std::vector<vk::DescriptorPool> m_Pools;
std::vector<vk::DescriptorPoolSize> m_PoolSizes;
vk::DescriptorPoolCreateInfo m_PoolInfo;
/**
......@@ -72,7 +81,18 @@ namespace vkcv
*/
static vk::ShaderStageFlagBits convertShaderStageFlag(ShaderStage stage);
/**
* Destroys a specific resource description
* @param[in] the handle id of the respective resource description
*/
void destroyResourceDescriptionById(uint64_t id);
/**
* creates a descriptor pool based on the poolSizes and poolInfo defined in the constructor
* is called initially in the constructor and then every time the pool runs out memory
* @return a DescriptorPool object
*/
vk::DescriptorPool allocateDescriptorPool();
};
}
\ No newline at end of file