@@ -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
270272void 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
287328TEST_F (SPIRVShaderResourcesTest, ConvertUBOToPushConstant_GLSLang)
0 commit comments