@@ -65,6 +65,20 @@ UpdateOccupancy(uint32_t* occupancyList, uint32_t& slotsUsed, const CoreGraphics
65
65
if (AllBits (vis, CoreGraphics::CallableShaderVisibility)) { occupancyList[CallableShader]++; slotsUsed++; }
66
66
}
67
67
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
+
68
82
// ------------------------------------------------------------------------------
69
83
/* *
70
84
*/
@@ -95,7 +109,6 @@ ShaderSetup(
95
109
uint32_t numsets = 0 ;
96
110
97
111
// always create push constant range in layout, making all shaders using push constants compatible
98
- uint32_t maxPushConstantBytes = CoreGraphics::MaxPushConstantSize;
99
112
uint32_t pushRangeOffset = 0 ; // we must append previous push range size to offset
100
113
constantRange.Resize (NumShaders); // one per shader stage
101
114
uint i;
@@ -117,57 +130,43 @@ ShaderSetup(
117
130
for (i = 0 ; i < varblocks.size (); i++)
118
131
{
119
132
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 );
142
134
if (block->variables .empty ()) continue ;
135
+
143
136
if (AnyFX::HasFlags (block->qualifiers , AnyFX::Qualifiers::Push))
144
137
{
145
- n_assert (block->alignedSize <= maxPushConstantBytes);
146
- maxPushConstantBytes -= block->alignedSize ;
147
138
CoreGraphics::ResourcePipelinePushConstantRange range;
148
139
range.offset = pushRangeOffset;
149
140
range.size = block->alignedSize ;
150
141
range.vis = AllGraphicsVisibility; // only allow for fragment bit...
151
142
constantRange[0 ] = range; // okay, this is hacky
152
143
pushRangeOffset += block->alignedSize ;
144
+ n_assert (CoreGraphics::MaxPushConstantSize >= pushRangeOffset); // test if the next offset would still be in range
153
145
goto skipbuffer; // if push-constant block, do not add to resource table, but add constant bindings!
154
146
}
155
147
{
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" ))
162
155
{
163
- cbo.dynamicOffset = true ; numUniformDyn += slotsUsed ;
156
+ cbo.visibility = ShaderVisibilityFromString (block-> GetAnnotationString ( " Visibility " ). c_str ()) ;
164
157
}
165
- else
158
+
159
+ if (block->binding != 0xFFFFFFFF && !bindingTable[block->binding ])
166
160
{
167
- cbo.dynamicOffset = false ; numUniform += slotsUsed;
161
+ bindingTable[block->binding ] = true ;
162
+ UpdateOccupancy (numPerStageUniformBuffers, slotsUsed, cbo.visibility );
168
163
}
164
+ UpdateValueDescriptorSet (cbo.dynamicOffset , numUniform, numUniformDyn, block->set );
169
165
166
+ ResourceTableLayoutCreateInfo& rinfo = layoutCreateInfos.Emplace (block->set );
167
+ numsets = Math::max (numsets, block->set + 1 );
170
168
rinfo.constantBuffers .Append (cbo);
169
+
171
170
n_assert (block->alignedSize <= CoreGraphics::MaxConstantBufferSize);
172
171
}
173
172
skipbuffer:
@@ -196,39 +195,30 @@ ShaderSetup(
196
195
{
197
196
AnyFX::VkVarbuffer* buffer = static_cast <AnyFX::VkVarbuffer*>(varbuffers[i]);
198
197
resourceSlotMapping.Add (buffer->name .c_str (), buffer->binding );
198
+ if (buffer->alignedSize == 0 ) continue ;
199
+
199
200
VkDescriptorSetLayoutBinding& binding = buffer->bindingLayout ;
200
201
ResourceTableLayoutShaderRWBuffer rwbo;
201
- rwbo.slot = binding. binding ;
202
+ rwbo.slot = buffer-> binding ;
202
203
rwbo.num = binding.descriptorCount ;
203
204
rwbo.visibility = AllVisibility;
205
+ rwbo.dynamicOffset = false ;
204
206
uint32_t slotsUsed = 0 ;
205
207
206
- if (buffer->alignedSize == 0 ) continue ;
207
- ResourceTableLayoutCreateInfo& rinfo = layoutCreateInfos.Emplace (buffer->set );
208
- numsets = Math::max (numsets, buffer->set + 1 );
209
-
210
208
if (buffer->HasAnnotation (" Visibility" ))
211
209
{
212
210
rwbo.visibility = ShaderVisibilityFromString (buffer->GetAnnotationString (" Visibility" ).c_str ());
213
211
}
214
212
215
- bool occupiesNewBinding = !bindingTable[binding.binding ];
216
- bindingTable[binding.binding ] = true ;
217
-
218
- if (occupiesNewBinding)
213
+ if (!bindingTable[buffer->binding ])
219
214
{
215
+ bindingTable[buffer->binding ] = true ;
220
216
UpdateOccupancy (numPerStageStorageBuffers, slotsUsed, rwbo.visibility );
221
217
}
218
+ UpdateValueDescriptorSet (rwbo.dynamicOffset , numStorage, numStorageDyn, buffer->set );
222
219
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 );
232
222
rinfo.rwBuffers .Append (rwbo);
233
223
}
234
224
n_assert (CoreGraphics::MaxResourceTableDynamicOffsetReadWriteBuffers >= numStorageDyn);
0 commit comments