@@ -23,24 +23,47 @@ using namespace vsg;
2323// DescriptorSetLayout
2424//
2525DescriptorSetLayout::DescriptorSetLayout ()
26+ : createFlags(0 )
2627{
2728}
2829
2930DescriptorSetLayout::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
3538DescriptorSetLayout::DescriptorSetLayout (const DescriptorSetLayoutBindings& descriptorSetLayoutBindings) :
36- bindings(descriptorSetLayoutBindings)
39+ bindings(descriptorSetLayoutBindings),
40+ createFlags(0 )
3741{
42+ bindingFlags.resize (bindings.size (), 0 );
3843}
3944
4045DescriptorSetLayout::~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+
4467void 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
7396void 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
88116void 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
103135void 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