Skip to content

Commit 5458739

Browse files
committed
Merge branch 'master' of https://github.com/nolankramer/VulkanSceneGraph into nolankramer-master
2 parents eb0bfc3 + 0dc5f90 commit 5458739

File tree

2 files changed

+59
-7
lines changed

2 files changed

+59
-7
lines changed

include/vsg/state/DescriptorSetLayout.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ namespace vsg
2121
class Context;
2222

2323
using DescriptorSetLayoutBindings = std::vector<VkDescriptorSetLayoutBinding>;
24+
using DescriptorSetLayoutBindingFlags = std::vector<VkDescriptorBindingFlags>;
2425
using DescriptorPoolSizes = std::vector<VkDescriptorPoolSize>;
2526

2627
/// DescriptorSetLayout encapsulates VkDescriptorSetLayout and VkDescriptorSetLayoutCreateInfo settings used to set it up.
@@ -34,9 +35,17 @@ namespace vsg
3435
/// Vulkan VkDescriptorSetLayout handle
3536
virtual VkDescriptorSetLayout vk(uint32_t deviceID) const { return _implementation[deviceID]->_descriptorSetLayout; }
3637

38+
/// VkDescriptorSetLayoutCreateFlags flags
39+
VkDescriptorSetLayoutCreateFlags createFlags;
40+
41+
void addBinding(uint32_t binding, VkDescriptorType descriptorType, uint32_t descriptorCount, VkShaderStageFlags stageFlags, VkDescriptorBindingFlags flags = 0);
42+
3743
/// VkDescriptorSetLayoutCreateInfo settings
3844
DescriptorSetLayoutBindings bindings;
3945

46+
/// VkDescriptorSetLayoutBindingFlagsCreateInfo settings
47+
DescriptorSetLayoutBindingFlags bindingFlags;
48+
4049
/// map the descriptor bindings to the descriptor pool sizes that will be required to represent them.
4150
void getDescriptorPoolSizes(DescriptorPoolSizes& descriptorPoolSizes);
4251

@@ -59,7 +68,7 @@ namespace vsg
5968

6069
struct Implementation : public Inherit<Object, Implementation>
6170
{
62-
Implementation(Device* device, const DescriptorSetLayoutBindings& descriptorSetLayoutBindings);
71+
Implementation(Device* device, VkDescriptorSetLayoutCreateFlags createFlags, const DescriptorSetLayoutBindings& descriptorSetLayoutBindings, const DescriptorSetLayoutBindingFlags& descriptorSetLayoutBindingFlags);
6372

6473
virtual ~Implementation();
6574

src/vsg/state/DescriptorSetLayout.cpp

Lines changed: 49 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,24 +23,47 @@ using namespace vsg;
2323
// DescriptorSetLayout
2424
//
2525
DescriptorSetLayout::DescriptorSetLayout()
26+
: createFlags(0)
2627
{
2728
}
2829

2930
DescriptorSetLayout::DescriptorSetLayout(const DescriptorSetLayout& rhs, const CopyOp& copyop) :
3031
Inherit(rhs, copyop),
31-
bindings(rhs.bindings)
32+
bindings(rhs.bindings),
33+
bindingFlags(rhs.bindingFlags),
34+
createFlags(rhs.createFlags)
3235
{
3336
}
3437

3538
DescriptorSetLayout::DescriptorSetLayout(const DescriptorSetLayoutBindings& descriptorSetLayoutBindings) :
36-
bindings(descriptorSetLayoutBindings)
39+
bindings(descriptorSetLayoutBindings),
40+
createFlags(0)
3741
{
42+
bindingFlags.resize(bindings.size(), 0);
3843
}
3944

4045
DescriptorSetLayout::~DescriptorSetLayout()
4146
{
4247
}
4348

49+
void DescriptorSetLayout::addBinding(uint32_t binding, VkDescriptorType descriptorType, uint32_t descriptorCount, VkShaderStageFlags stageFlags, VkDescriptorBindingFlags flags)
50+
{
51+
VkDescriptorSetLayoutBinding layoutBinding = {};
52+
layoutBinding.binding = binding;
53+
layoutBinding.descriptorType = descriptorType;
54+
layoutBinding.descriptorCount = descriptorCount;
55+
layoutBinding.stageFlags = stageFlags;
56+
layoutBinding.pImmutableSamplers = nullptr;
57+
bindings.push_back(layoutBinding);
58+
59+
if (flags != 0)
60+
{
61+
if (binding >= bindingFlags.size())
62+
bindingFlags.resize(binding + 1, 0);
63+
bindingFlags[binding] = flags;
64+
}
65+
}
66+
4467
void DescriptorSetLayout::getDescriptorPoolSizes(DescriptorPoolSizes& descriptorPoolSizes)
4568
{
4669
for (auto& binding : bindings)
@@ -67,56 +90,76 @@ int DescriptorSetLayout::compare(const Object& rhs_object) const
6790
if (result != 0) return result;
6891

6992
const auto& rhs = static_cast<decltype(*this)>(rhs_object);
70-
return compare_value_container(bindings, rhs.bindings);
93+
return (createFlags == rhs.createFlags) && compare_value_container(bindings, rhs.bindings) && compare_value_container(bindingFlags, rhs.bindingFlags);
7194
}
7295

7396
void DescriptorSetLayout::read(Input& input)
7497
{
7598
Object::read(input);
7699

100+
createFlags = input.readValue<uint32_t>("createFlags");
77101
bindings.resize(input.readValue<uint32_t>("bindings"));
78102

103+
size_t i = 0;
79104
for (auto& dslb : bindings)
80105
{
81106
input.read("binding", dslb.binding);
82107
input.readValue<uint32_t>("descriptorType", dslb.descriptorType);
83108
input.read("descriptorCount", dslb.descriptorCount);
84109
input.readValue<uint32_t>("stageFlags", dslb.stageFlags);
110+
if (i >= bindingFlags.size()) bindingFlags.resize(i + 1);
111+
input.readValue<uint32_t>("flags", bindingFlags[i]);
112+
++i;
85113
}
86114
}
87115

88116
void DescriptorSetLayout::write(Output& output) const
89117
{
90118
Object::write(output);
91119

120+
output.writeValue<uint32_t>("createFlags", createFlags);
92121
output.writeValue<uint32_t>("bindings", bindings.size());
93122

123+
size_t i = 0;
94124
for (auto& dslb : bindings)
95125
{
96126
output.write("binding", dslb.binding);
97127
output.writeValue<uint32_t>("descriptorType", dslb.descriptorType);
98128
output.write("descriptorCount", dslb.descriptorCount);
99129
output.writeValue<uint32_t>("stageFlags", dslb.stageFlags);
130+
output.writeValue<uint32_t>("flags", (i < bindingFlags.size()) ? static_cast<uint32_t>(bindingFlags[i]) : 0);
131+
++i;
100132
}
101133
}
102134

103135
void DescriptorSetLayout::compile(Context& context)
104136
{
105-
if (!_implementation[context.deviceID]) _implementation[context.deviceID] = DescriptorSetLayout::Implementation::create(context.device, bindings);
137+
if (!_implementation[context.deviceID]) _implementation[context.deviceID] = DescriptorSetLayout::Implementation::create(context.device, createFlags, bindings, bindingFlags);
106138
}
107139

108140
//////////////////////////////////////
109141
//
110142
// DescriptorSetLayout::Implementation
111143
//
112-
DescriptorSetLayout::Implementation::Implementation(Device* device, const DescriptorSetLayoutBindings& descriptorSetLayoutBindings) :
144+
DescriptorSetLayout::Implementation::Implementation(Device* device, VkDescriptorSetLayoutCreateFlags createFlags, const DescriptorSetLayoutBindings& descriptorSetLayoutBindings, const DescriptorSetLayoutBindingFlags& descriptorSetLayoutBindingFlags) :
113145
_device(device)
114146
{
115147
VkDescriptorSetLayoutCreateInfo layoutInfo = {};
116148
layoutInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
117149
layoutInfo.bindingCount = static_cast<uint32_t>(descriptorSetLayoutBindings.size());
118150
layoutInfo.pBindings = descriptorSetLayoutBindings.data();
119-
layoutInfo.pNext = nullptr;
151+
layoutInfo.flags = createFlags;
152+
153+
if (!descriptorSetLayoutBindingFlags.empty())
154+
{
155+
VkDescriptorSetLayoutBindingFlagsCreateInfo bindingFlagsCreateInfo = {};
156+
bindingFlagsCreateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO;
157+
bindingFlagsCreateInfo.bindingCount = static_cast<uint32_t>(descriptorSetLayoutBindingFlags.size());
158+
bindingFlagsCreateInfo.pBindingFlags = descriptorSetLayoutBindingFlags.data();
159+
layoutInfo.pNext = &bindingFlagsCreateInfo;
160+
} else {
161+
layoutInfo.pNext = nullptr;
162+
}
120163

121164
if (VkResult result = vkCreateDescriptorSetLayout(*device, &layoutInfo, _device->getAllocationCallbacks(), &_descriptorSetLayout); result != VK_SUCCESS)
122165
{

0 commit comments

Comments
 (0)