Skip to content
Snippets Groups Projects
Commit 3a562af5 authored by Artur Wasmut's avatar Artur Wasmut
Browse files

[#90] check insertion into maps in shader reflection stage. print nicely...

[#90] check insertion into maps in shader reflection stage. print nicely formatted warning message on collision. Check existing descriptor set layouts and return handle to it, before creating it anew.
parent 9ae8deba
No related branches found
No related tags found
1 merge request!93Resolve "DescriptorSetLayouts unabhängig von DescriptorSets machen!"
Pipeline #26963 failed
......@@ -65,10 +65,12 @@ namespace vkcv
ShaderStages shaderStages
) noexcept;
uint32_t bindingID;
DescriptorType descriptorType;
uint32_t descriptorCount;
ShaderStages shaderStages;
uint32_t bindingID;
DescriptorType descriptorType;
uint32_t descriptorCount;
ShaderStages shaderStages;
bool DescriptorBinding::operator ==(const DescriptorBinding &other) const;
};
typedef std::unordered_map<uint32_t, DescriptorBinding> DescriptorBindings;
......
......@@ -106,9 +106,15 @@ int main(int argc, const char** argv) {
const vkcv::VertexLayout firstMeshLayout (bindings);
// since we only use one descriptor set (namely, desc set 0), directly address it
// recreate copies of the bindings and the handles (to check whether they are properly reused instead of actually recreated)
std::unordered_map<uint32_t, vkcv::DescriptorBinding> set0Bindings = firstMeshProgram.getReflectedDescriptors().at(0);
auto set0BindingsExplicitCopy = set0Bindings;
vkcv::DescriptorSetLayoutHandle setLayoutHandle = core.createDescriptorSetLayout(set0Bindings);
vkcv::DescriptorSetLayoutHandle setLayoutHandleCopy = core.createDescriptorSetLayout(set0BindingsExplicitCopy);
vkcv::DescriptorSetHandle descriptorSet = core.createDescriptorSet(setLayoutHandle);
const vkcv::PipelineConfig firstMeshPipelineConfig {
......
#include "vkcv/DescriptorConfig.hpp"
namespace vkcv {
namespace vkcv
{
DescriptorBinding::DescriptorBinding(
uint32_t bindingID,
DescriptorType descriptorType,
uint32_t descriptorCount,
ShaderStages shaderStages) noexcept
:
ShaderStages shaderStages) noexcept:
bindingID(bindingID),
descriptorType(descriptorType),
descriptorCount(descriptorCount),
shaderStages(shaderStages) {}
shaderStages(shaderStages)
{}
bool DescriptorBinding::operator==(const DescriptorBinding &other) const
{
return (this->bindingID == other.bindingID) &&
(this->descriptorType == other.descriptorType) &&
(this->descriptorCount == other.descriptorCount) &&
(this->shaderStages == other.shaderStages);
}
}
......@@ -44,6 +44,17 @@ namespace vkcv
DescriptorSetLayoutHandle DescriptorManager::createDescriptorSetLayout(const DescriptorBindings &setBindingsMap)
{
for (auto i = 0; i < m_DescriptorSetLayouts.size(); i++)
{
if(m_DescriptorSetLayouts[i].descriptorBindings.size() != setBindingsMap.size())
continue;
if (m_DescriptorSetLayouts[i].descriptorBindings == setBindingsMap)
{
return DescriptorSetLayoutHandle(i, [&](uint64_t id) { destroyDescriptorSetLayoutById(id); });
}
}
//create the descriptor set's layout by iterating over its bindings
std::vector<vk::DescriptorSetLayoutBinding> bindingsVector = {};
for (auto bindingElem : setBindingsMap)
......
......@@ -155,7 +155,14 @@ namespace vkcv {
base_type.vecsize,
shaderStage);
m_DescriptorSets[setID].insert(std::make_pair(bindingID, binding));
auto insertionResult = m_DescriptorSets[setID].insert(std::make_pair(bindingID, binding));
if(!insertionResult.second)
{
vkcv_log(LogLevel::WARNING,
"Attempting to overwrite already existing binding %u at set ID %u.",
bindingID,
setID);
}
}
for (uint32_t i = 0; i < resources.storage_buffers.size(); i++)
......@@ -171,7 +178,14 @@ namespace vkcv {
base_type.vecsize,
shaderStage);
m_DescriptorSets[setID].insert(std::make_pair(bindingID, binding));
auto insertionResult = m_DescriptorSets[setID].insert(std::make_pair(bindingID, binding));
if(!insertionResult.second)
{
vkcv_log(LogLevel::WARNING,
"Attempting to overwrite already existing binding %u at set ID %u.",
bindingID,
setID);
}
}
for (uint32_t i = 0; i < resources.separate_samplers.size(); i++) {
......@@ -186,7 +200,14 @@ namespace vkcv {
base_type.vecsize,
shaderStage);
m_DescriptorSets[setID].insert(std::make_pair(bindingID, binding));
auto insertionResult = m_DescriptorSets[setID].insert(std::make_pair(bindingID, binding));
if(!insertionResult.second)
{
vkcv_log(LogLevel::WARNING,
"Attempting to overwrite already existing binding %u at set ID %u.",
bindingID,
setID);
}
}
for (uint32_t i = 0; i < resources.separate_images.size(); i++) {
......@@ -201,7 +222,14 @@ namespace vkcv {
base_type.vecsize,
shaderStage);
m_DescriptorSets[setID].insert(std::make_pair(bindingID, binding));
auto insertionResult = m_DescriptorSets[setID].insert(std::make_pair(bindingID, binding));
if(!insertionResult.second)
{
vkcv_log(LogLevel::WARNING,
"Attempting to overwrite already existing binding %u at set ID %u.",
bindingID,
setID);
}
}
for (uint32_t i = 0; i < resources.storage_images.size(); i++) {
......@@ -216,7 +244,14 @@ namespace vkcv {
base_type.vecsize,
shaderStage);
m_DescriptorSets[setID].insert(std::make_pair(bindingID, binding));
auto insertionResult = m_DescriptorSets[setID].insert(std::make_pair(bindingID, binding));
if(!insertionResult.second)
{
vkcv_log(LogLevel::WARNING,
"Attempting to overwrite already existing binding %u at set ID %u.",
bindingID,
setID);
}
}
//reflect push constants
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment