@@ -23,23 +23,20 @@ using namespace vsg;
2323// DescriptorSetLayout
2424//
2525DescriptorSetLayout::DescriptorSetLayout ()
26- : createFlags(0 )
2726{
2827}
2928
3029DescriptorSetLayout::DescriptorSetLayout (const DescriptorSetLayout& rhs, const CopyOp& copyop) :
3130 Inherit(rhs, copyop),
31+ createFlags(rhs.createFlags),
3232 bindings(rhs.bindings),
33- bindingFlags(rhs.bindingFlags),
34- createFlags(rhs.createFlags)
33+ bindingFlags(rhs.bindingFlags)
3534{
3635}
3736
3837DescriptorSetLayout::DescriptorSetLayout (const DescriptorSetLayoutBindings& descriptorSetLayoutBindings) :
39- bindings(descriptorSetLayoutBindings),
40- createFlags(0 )
38+ bindings(descriptorSetLayoutBindings)
4139{
42- bindingFlags.resize (bindings.size (), 0 );
4340}
4441
4542DescriptorSetLayout::~DescriptorSetLayout ()
@@ -58,8 +55,7 @@ void DescriptorSetLayout::addBinding(uint32_t binding, VkDescriptorType descript
5855
5956 if (flags != 0 )
6057 {
61- if (binding >= bindingFlags.size ())
62- bindingFlags.resize (binding + 1 , 0 );
58+ if (binding >= bindingFlags.size ()) bindingFlags.resize (binding + 1 , 0 );
6359 bindingFlags[binding] = flags;
6460 }
6561}
@@ -97,38 +93,47 @@ void DescriptorSetLayout::read(Input& input)
9793{
9894 Object::read (input);
9995
100- createFlags = input.readValue <uint32_t >(" createFlags" );
101- bindings.resize (input.readValue <uint32_t >(" bindings" ));
96+ if (input.version_greater_equal (1 ,1 ,12 ))
97+ {
98+ createFlags = input.readValue <uint32_t >(" createFlags" );
99+ }
102100
103- size_t i = 0 ;
101+ bindings. resize (input. readValue < uint32_t >( " bindings " )) ;
104102 for (auto & dslb : bindings)
105103 {
106104 input.read (" binding" , dslb.binding );
107105 input.readValue <uint32_t >(" descriptorType" , dslb.descriptorType );
108106 input.read (" descriptorCount" , dslb.descriptorCount );
109107 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;
108+ }
109+
110+ if (input.version_greater_equal (1 ,1 ,12 ))
111+ {
112+ input.readValues (" bindingFlags" , bindingFlags);
113113 }
114114}
115115
116116void DescriptorSetLayout::write (Output& output) const
117117{
118118 Object::write (output);
119119
120- output.writeValue <uint32_t >(" createFlags" , createFlags);
121- output.writeValue <uint32_t >(" bindings" , bindings.size ());
120+ if (output.version_greater_equal (1 ,1 ,12 ))
121+ {
122+ output.writeValue <uint32_t >(" createFlags" , createFlags);
123+ }
122124
123- size_t i = 0 ;
125+ output. writeValue < uint32_t >( " bindings " , bindings. size ()) ;
124126 for (auto & dslb : bindings)
125127 {
126128 output.write (" binding" , dslb.binding );
127129 output.writeValue <uint32_t >(" descriptorType" , dslb.descriptorType );
128130 output.write (" descriptorCount" , dslb.descriptorCount );
129131 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;
132+ }
133+
134+ if (output.version_greater_equal (1 ,1 ,12 ))
135+ {
136+ output.writeValues (" bindingFlags" , bindingFlags);
132137 }
133138}
134139
@@ -150,15 +155,17 @@ DescriptorSetLayout::Implementation::Implementation(Device* device, VkDescriptor
150155 layoutInfo.pBindings = descriptorSetLayoutBindings.data ();
151156 layoutInfo.flags = createFlags;
152157
153- if (!descriptorSetLayoutBindingFlags.empty ())
158+ VkDescriptorSetLayoutBindingFlagsCreateInfo bindingFlagsCreateInfo = {};
159+ if (descriptorSetLayoutBindingFlags.empty ())
160+ {
161+ layoutInfo.pNext = nullptr ;
162+ }
163+ else
154164 {
155- VkDescriptorSetLayoutBindingFlagsCreateInfo bindingFlagsCreateInfo = {};
156165 bindingFlagsCreateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO;
157166 bindingFlagsCreateInfo.bindingCount = static_cast <uint32_t >(descriptorSetLayoutBindingFlags.size ());
158167 bindingFlagsCreateInfo.pBindingFlags = descriptorSetLayoutBindingFlags.data ();
159168 layoutInfo.pNext = &bindingFlagsCreateInfo;
160- } else {
161- layoutInfo.pNext = nullptr ;
162169 }
163170
164171 if (VkResult result = vkCreateDescriptorSetLayout (*device, &layoutInfo, _device->getAllocationCallbacks (), &_descriptorSetLayout); result != VK_SUCCESS)
0 commit comments