Skip to content

Commit 534390e

Browse files
hzqstTheMostDiligent
authored andcommitted
Try to patch uniform buffer block to push constants one for each. nested structs included.
1 parent 52c8377 commit 534390e

File tree

2 files changed

+90
-15
lines changed

2 files changed

+90
-15
lines changed

Tests/DiligentCoreTest/assets/shaders/SPIRV/UniformBuffers.psh

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,41 @@ cbuffer CB2 : register(b2)
1414
float4 g_MaterialParams;
1515
};
1616

17+
// Test for nested constant buffers
18+
19+
struct InnerConstant_t
20+
{
21+
float4 g_Color;
22+
};
23+
24+
struct InnerConstant2_t
25+
{
26+
float4 g_MaterialParams;
27+
};
28+
29+
struct MergedConstant_t
30+
{
31+
InnerConstant_t InnerConstant;
32+
InnerConstant2_t InnerConstant2;
33+
};
34+
35+
cbuffer CB3
36+
{
37+
MergedConstant_t g_MergedConstant;
38+
};
39+
40+
cbuffer CB4
41+
{
42+
InnerConstant_t g_InnerConstant;
43+
InnerConstant2_t g_InnerConstant2;
44+
};
45+
1746
float4 main() : SV_Target
1847
{
19-
return g_Color * g_MaterialParams;
20-
}
48+
return g_Color *
49+
g_MaterialParams *
50+
g_MergedConstant.InnerConstant.g_Color *
51+
g_MergedConstant.InnerConstant2.g_MaterialParams *
52+
g_InnerConstant.g_Color *
53+
g_InnerConstant2.g_MaterialParams;
54+
}

Tests/DiligentCoreTest/src/ShaderTools/SPIRVShaderResourcesTest.cpp

Lines changed: 54 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,8 @@ void TestUniformBuffers(SHADER_COMPILER Compiler)
253253
{
254254
SPIRVShaderResourceRefAttribs{"CB1", 1, SPIRVResourceType::UniformBuffer, RESOURCE_DIM_BUFFER, 0, 48, 0},
255255
SPIRVShaderResourceRefAttribs{"CB2", 1, SPIRVResourceType::UniformBuffer, RESOURCE_DIM_BUFFER, 0, 16, 0},
256+
SPIRVShaderResourceRefAttribs{"CB3", 1, SPIRVResourceType::UniformBuffer, RESOURCE_DIM_BUFFER, 0, 32, 0},
257+
SPIRVShaderResourceRefAttribs{"CB4", 1, SPIRVResourceType::UniformBuffer, RESOURCE_DIM_BUFFER, 0, 32, 0},
256258
},
257259
Compiler);
258260
}
@@ -269,19 +271,58 @@ TEST_F(SPIRVShaderResourcesTest, UniformBuffers_DXC)
269271

270272
void TestConvertUBOToPushConstant(SHADER_COMPILER Compiler)
271273
{
272-
TestSPIRVResources("UniformBuffers.psh",
273-
{
274-
// CB1 should now be a PushConstant (48 bytes = 12 floats)
275-
SPIRVShaderResourceRefAttribs{"CB1", 1, SPIRVResourceType::PushConstant, RESOURCE_DIM_BUFFER, 0, 48, 0},
276-
// CB2 remains as UniformBuffer
277-
SPIRVShaderResourceRefAttribs{"CB2", 1, SPIRVResourceType::UniformBuffer, RESOURCE_DIM_BUFFER, 0, 16, 0},
278-
},
279-
Compiler,
280-
SHADER_TYPE_PIXEL,
281-
SHADER_SOURCE_LANGUAGE_HLSL,
282-
[](std::vector<unsigned int>& SPIRV) {
283-
SPIRV = ConvertUBOToPushConstants(SPIRV, "CB1");
284-
});
274+
std::vector<SPIRVShaderResourceRefAttribs> BaseRefAttribs = {
275+
SPIRVShaderResourceRefAttribs{"CB1", 1, SPIRVResourceType::UniformBuffer, RESOURCE_DIM_BUFFER, 0, 48, 0},
276+
SPIRVShaderResourceRefAttribs{"CB2", 1, SPIRVResourceType::UniformBuffer, RESOURCE_DIM_BUFFER, 0, 16, 0},
277+
SPIRVShaderResourceRefAttribs{"CB3", 1, SPIRVResourceType::UniformBuffer, RESOURCE_DIM_BUFFER, 0, 32, 0},
278+
SPIRVShaderResourceRefAttribs{"CB4", 1, SPIRVResourceType::UniformBuffer, RESOURCE_DIM_BUFFER, 0, 32, 0},
279+
};
280+
281+
//Try to patch uniform buffer block to push constants one for each
282+
for (size_t i = 0; i < BaseRefAttribs.size(); ++i)
283+
{
284+
const char* PatchedAttribName = BaseRefAttribs[i].Name;
285+
286+
std::vector<SPIRVShaderResourceRefAttribs> PatchedRefAttribs;
287+
288+
PatchedRefAttribs.reserve(BaseRefAttribs.size());
289+
290+
for (size_t j = 0; j < BaseRefAttribs.size(); ++j)
291+
{
292+
// Build a new attrib with Type changed to PushConstant, other members remain the same
293+
if (j == i)
294+
{
295+
PatchedRefAttribs.push_back({
296+
BaseRefAttribs[j].Name,
297+
BaseRefAttribs[j].ArraySize,
298+
SPIRVResourceType::PushConstant,
299+
BaseRefAttribs[j].ResourceDim,
300+
BaseRefAttribs[j].IsMS,
301+
BaseRefAttribs[j].BufferStaticSize,
302+
BaseRefAttribs[j].BufferStride});
303+
}
304+
else
305+
{
306+
PatchedRefAttribs.push_back({
307+
BaseRefAttribs[j].Name,
308+
BaseRefAttribs[j].ArraySize,
309+
BaseRefAttribs[j].Type,
310+
BaseRefAttribs[j].ResourceDim,
311+
BaseRefAttribs[j].IsMS,
312+
BaseRefAttribs[j].BufferStaticSize,
313+
BaseRefAttribs[j].BufferStride});
314+
}
315+
}
316+
317+
TestSPIRVResources("UniformBuffers.psh",
318+
PatchedRefAttribs,
319+
Compiler,
320+
SHADER_TYPE_PIXEL,
321+
SHADER_SOURCE_LANGUAGE_HLSL,
322+
[PatchedAttribName](std::vector<unsigned int>& SPIRV) {
323+
SPIRV = ConvertUBOToPushConstants(SPIRV, PatchedAttribName);
324+
});
325+
}
285326
}
286327

287328
TEST_F(SPIRVShaderResourcesTest, ConvertUBOToPushConstant_GLSLang)

0 commit comments

Comments
 (0)