@@ -65,6 +65,20 @@ UpdateOccupancy(uint32_t* occupancyList, uint32_t& slotsUsed, const CoreGraphics
6565 if (AllBits (vis, CoreGraphics::CallableShaderVisibility)) { occupancyList[CallableShader]++; slotsUsed++; }
6666}
6767
68+ // ------------------------------------------------------------------------------
69+ /* *
70+ */
71+ void
72+ UpdateValueDescriptorSet (bool & dynamic, uint32_t & num, uint32_t & numDyn, const unsigned set)
73+ {
74+ if (set == NEBULA_DYNAMIC_OFFSET_GROUP || set == NEBULA_INSTANCE_GROUP)
75+ {
76+ dynamic = true ;
77+ numDyn++;
78+ }
79+ num++;
80+ }
81+
6882// ------------------------------------------------------------------------------
6983/* *
7084*/
@@ -95,7 +109,6 @@ ShaderSetup(
95109 uint32_t numsets = 0 ;
96110
97111 // always create push constant range in layout, making all shaders using push constants compatible
98- uint32_t maxPushConstantBytes = CoreGraphics::MaxPushConstantSize;
99112 uint32_t pushRangeOffset = 0 ; // we must append previous push range size to offset
100113 constantRange.Resize (NumShaders); // one per shader stage
101114 uint i;
@@ -117,57 +130,43 @@ ShaderSetup(
117130 for (i = 0 ; i < varblocks.size (); i++)
118131 {
119132 AnyFX::VkVarblock* block = static_cast <AnyFX::VkVarblock*>(varblocks[i]);
120- VkDescriptorSetLayoutBinding& binding = block->bindingLayout ;
121- ResourceTableLayoutConstantBuffer cbo;
122- cbo.slot = binding.binding ;
123- cbo.num = binding.descriptorCount ;
124- cbo.visibility = AllVisibility;
125- uint32_t slotsUsed = 0 ;
126- if (block->HasAnnotation (" Visibility" ))
127- {
128- cbo.visibility = ShaderVisibilityFromString (block->GetAnnotationString (" Visibility" ).c_str ());
129- }
130-
131- if (binding.binding != 0xFFFFFFFF )
132- {
133- bool occupiesNewBinding = !bindingTable[binding.binding ];
134- bindingTable[binding.binding ] = true ;
135-
136- if (occupiesNewBinding)
137- {
138- UpdateOccupancy (numPerStageUniformBuffers, slotsUsed, cbo.visibility );
139- }
140- }
141-
133+ resourceSlotMapping.Add (block->name .c_str (), block->binding );
142134 if (block->variables .empty ()) continue ;
135+
143136 if (AnyFX::HasFlags (block->qualifiers , AnyFX::Qualifiers::Push))
144137 {
145- n_assert (block->alignedSize <= maxPushConstantBytes);
146- maxPushConstantBytes -= block->alignedSize ;
147138 CoreGraphics::ResourcePipelinePushConstantRange range;
148139 range.offset = pushRangeOffset;
149140 range.size = block->alignedSize ;
150141 range.vis = AllGraphicsVisibility; // only allow for fragment bit...
151142 constantRange[0 ] = range; // okay, this is hacky
152143 pushRangeOffset += block->alignedSize ;
144+ n_assert (CoreGraphics::MaxPushConstantSize >= pushRangeOffset); // test if the next offset would still be in range
153145 goto skipbuffer; // if push-constant block, do not add to resource table, but add constant bindings!
154146 }
155147 {
156- // add to resource map
157- resourceSlotMapping.Add (block->name .c_str (), block->binding );
158- ResourceTableLayoutCreateInfo& rinfo = layoutCreateInfos.Emplace (block->set );
159- numsets = Math::max (numsets, block->set + 1 );
160-
161- if (block->set == NEBULA_DYNAMIC_OFFSET_GROUP || block->set == NEBULA_INSTANCE_GROUP)
148+ ResourceTableLayoutConstantBuffer cbo;
149+ cbo.slot = block->binding ;
150+ cbo.num = block->bindingLayout .descriptorCount ;
151+ cbo.visibility = AllVisibility;
152+ cbo.dynamicOffset = false ;
153+ uint32_t slotsUsed = 0 ;
154+ if (block->HasAnnotation (" Visibility" ))
162155 {
163- cbo.dynamicOffset = true ; numUniformDyn += slotsUsed ;
156+ cbo.visibility = ShaderVisibilityFromString (block-> GetAnnotationString ( " Visibility " ). c_str ()) ;
164157 }
165- else
158+
159+ if (block->binding != 0xFFFFFFFF && !bindingTable[block->binding ])
166160 {
167- cbo.dynamicOffset = false ; numUniform += slotsUsed;
161+ bindingTable[block->binding ] = true ;
162+ UpdateOccupancy (numPerStageUniformBuffers, slotsUsed, cbo.visibility );
168163 }
164+ UpdateValueDescriptorSet (cbo.dynamicOffset , numUniform, numUniformDyn, block->set );
169165
166+ ResourceTableLayoutCreateInfo& rinfo = layoutCreateInfos.Emplace (block->set );
167+ numsets = Math::max (numsets, block->set + 1 );
170168 rinfo.constantBuffers .Append (cbo);
169+
171170 n_assert (block->alignedSize <= CoreGraphics::MaxConstantBufferSize);
172171 }
173172 skipbuffer:
@@ -196,39 +195,30 @@ ShaderSetup(
196195 {
197196 AnyFX::VkVarbuffer* buffer = static_cast <AnyFX::VkVarbuffer*>(varbuffers[i]);
198197 resourceSlotMapping.Add (buffer->name .c_str (), buffer->binding );
198+ if (buffer->alignedSize == 0 ) continue ;
199+
199200 VkDescriptorSetLayoutBinding& binding = buffer->bindingLayout ;
200201 ResourceTableLayoutShaderRWBuffer rwbo;
201- rwbo.slot = binding. binding ;
202+ rwbo.slot = buffer-> binding ;
202203 rwbo.num = binding.descriptorCount ;
203204 rwbo.visibility = AllVisibility;
205+ rwbo.dynamicOffset = false ;
204206 uint32_t slotsUsed = 0 ;
205207
206- if (buffer->alignedSize == 0 ) continue ;
207- ResourceTableLayoutCreateInfo& rinfo = layoutCreateInfos.Emplace (buffer->set );
208- numsets = Math::max (numsets, buffer->set + 1 );
209-
210208 if (buffer->HasAnnotation (" Visibility" ))
211209 {
212210 rwbo.visibility = ShaderVisibilityFromString (buffer->GetAnnotationString (" Visibility" ).c_str ());
213211 }
214212
215- bool occupiesNewBinding = !bindingTable[binding.binding ];
216- bindingTable[binding.binding ] = true ;
217-
218- if (occupiesNewBinding)
213+ if (!bindingTable[buffer->binding ])
219214 {
215+ bindingTable[buffer->binding ] = true ;
220216 UpdateOccupancy (numPerStageStorageBuffers, slotsUsed, rwbo.visibility );
221217 }
218+ UpdateValueDescriptorSet (rwbo.dynamicOffset , numStorage, numStorageDyn, buffer->set );
222219
223- if (buffer->set == NEBULA_DYNAMIC_OFFSET_GROUP || buffer->set == NEBULA_INSTANCE_GROUP)
224- {
225- rwbo.dynamicOffset = true ; numStorageDyn += slotsUsed;
226- }
227- else
228- {
229- rwbo.dynamicOffset = false ; numStorage += slotsUsed;
230- }
231-
220+ ResourceTableLayoutCreateInfo& rinfo = layoutCreateInfos.Emplace (buffer->set );
221+ numsets = Math::max (numsets, buffer->set + 1 );
232222 rinfo.rwBuffers .Append (rwbo);
233223 }
234224 n_assert (CoreGraphics::MaxResourceTableDynamicOffsetReadWriteBuffers >= numStorageDyn);
0 commit comments