Skip to content

Commit f293204

Browse files
authored
fix and refactor vulkan constant and storage buffer mapping (#240)
1 parent d8e45fb commit f293204

File tree

1 file changed

+42
-52
lines changed

1 file changed

+42
-52
lines changed

code/render/coregraphics/vk/vkshader.cc

Lines changed: 42 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)