@@ -175,14 +175,30 @@ std::vector<unsigned int> LoadSPIRVFromGLSL(const char* FilePath, SHADER_TYPE Sh
175175 return GLSLangUtils::GLSLtoSPIRV (Attribs);
176176}
177177
178- void TestSPIRVResourcesWithSPIRV (
179- const std::vector<unsigned int >& SPIRV,
180- const char * FilePath,
181- const std::vector<SPIRVShaderResourceRefAttribs>& RefResources,
182- SHADER_COMPILER Compiler,
183- SHADER_TYPE ShaderType = SHADER_TYPE_PIXEL,
184- SHADER_SOURCE_LANGUAGE SourceLanguage = SHADER_SOURCE_LANGUAGE_HLSL)
178+ void TestSPIRVResources (const char * FilePath,
179+ const std::vector<SPIRVShaderResourceRefAttribs>& RefResources,
180+ SHADER_COMPILER Compiler,
181+ SHADER_TYPE ShaderType = SHADER_TYPE_PIXEL,
182+ SHADER_SOURCE_LANGUAGE SourceLanguage = SHADER_SOURCE_LANGUAGE_HLSL,
183+ const std::function<void (std::vector<unsigned int > &SPIRV)> &PatchSPIRVCallback = nullptr)
185184{
185+ if (Compiler == SHADER_COMPILER_DXC)
186+ {
187+ VERIFY (SourceLanguage == SHADER_SOURCE_LANGUAGE_HLSL, " DXC only supports HLSL" );
188+ if (!SPIRVShaderResourcesTest::DXCompiler || !SPIRVShaderResourcesTest::DXCompiler->IsLoaded ())
189+ {
190+ GTEST_SKIP () << " DXC compiler is not available" ;
191+ }
192+ }
193+
194+ std::vector<unsigned int > SPIRV = (SourceLanguage == SHADER_SOURCE_LANGUAGE_GLSL) ?
195+ LoadSPIRVFromGLSL (FilePath, ShaderType) :
196+ LoadSPIRVFromHLSL (FilePath, ShaderType, Compiler);
197+ ASSERT_TRUE (!SPIRV.empty ()) << " Failed to compile shader: " << FilePath;
198+
199+ if (PatchSPIRVCallback)
200+ PatchSPIRVCallback (SPIRV);
201+
186202 ShaderDesc ShaderDesc;
187203 ShaderDesc.Name = " SPIRVResources test" ;
188204 ShaderDesc.ShaderType = ShaderType;
@@ -229,29 +245,6 @@ void TestSPIRVResourcesWithSPIRV(
229245 }
230246}
231247
232- void TestSPIRVResources (const char * FilePath,
233- const std::vector<SPIRVShaderResourceRefAttribs>& RefResources,
234- SHADER_COMPILER Compiler,
235- SHADER_TYPE ShaderType = SHADER_TYPE_PIXEL,
236- SHADER_SOURCE_LANGUAGE SourceLanguage = SHADER_SOURCE_LANGUAGE_HLSL)
237- {
238- if (Compiler == SHADER_COMPILER_DXC)
239- {
240- VERIFY (SourceLanguage == SHADER_SOURCE_LANGUAGE_HLSL, " DXC only supports HLSL" );
241- if (!SPIRVShaderResourcesTest::DXCompiler || !SPIRVShaderResourcesTest::DXCompiler->IsLoaded ())
242- {
243- GTEST_SKIP () << " DXC compiler is not available" ;
244- }
245- }
246-
247- const std::vector<unsigned int > SPIRV = (SourceLanguage == SHADER_SOURCE_LANGUAGE_GLSL) ?
248- LoadSPIRVFromGLSL (FilePath, ShaderType) :
249- LoadSPIRVFromHLSL (FilePath, ShaderType, Compiler);
250- ASSERT_TRUE (!SPIRV.empty ()) << " Failed to compile shader: " << FilePath;
251-
252- TestSPIRVResourcesWithSPIRV (SPIRV, FilePath, RefResources, Compiler, ShaderType, SourceLanguage);
253- }
254-
255248using SPIRVResourceType = SPIRVShaderResourceAttribs::ResourceType;
256249
257250void TestUniformBuffers (SHADER_COMPILER Compiler)
@@ -274,54 +267,31 @@ TEST_F(SPIRVShaderResourcesTest, UniformBuffers_DXC)
274267 TestUniformBuffers (SHADER_COMPILER_DXC);
275268}
276269
277- TEST_F (SPIRVShaderResourcesTest, ConvertUBOToPushConstant )
270+ void TestConvertUBOToPushConstant (SHADER_COMPILER Compiler )
278271{
279- const auto & SPIRV = LoadSPIRVFromHLSL (" UniformBuffers.psh" , SHADER_TYPE_PIXEL, SHADER_COMPILER_GLSLANG);
280- ASSERT_FALSE (SPIRV.empty ()) << " Failed to compile HLSL to SPIRV with glslang" ;
281-
282- // Convert CB1 from UniformBuffer to PushConstant
283- const auto & ConvertedSPIRV = ConvertUBOToPushConstants (SPIRV, " CB1" );
284- ASSERT_FALSE (ConvertedSPIRV.empty ()) << " Failed to convert UBO to push constant" ;
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+ });
285+ }
285286
286- TestSPIRVResourcesWithSPIRV (
287- ConvertedSPIRV,
288- " UniformBuffers.psh" ,
289- {
290- // CB1 should now be a PushConstant (48 bytes = 12 floats)
291- SPIRVShaderResourceRefAttribs{" CB1" , 1 , SPIRVResourceType::PushConstant, RESOURCE_DIM_BUFFER, 0 , 48 , 0 },
292- // CB2 remains as UniformBuffer
293- SPIRVShaderResourceRefAttribs{" CB2" , 1 , SPIRVResourceType::UniformBuffer, RESOURCE_DIM_BUFFER, 0 , 16 , 0 },
294- },
295- SHADER_COMPILER_GLSLANG,
296- SHADER_TYPE_PIXEL);
287+ TEST_F (SPIRVShaderResourcesTest, ConvertUBOToPushConstant)
288+ {
289+ TestConvertUBOToPushConstant (SHADER_COMPILER_GLSLANG);
297290}
298291
299292TEST_F (SPIRVShaderResourcesTest, ConvertUBOToPushConstant_DXC)
300293{
301- if (!DXCompiler || !DXCompiler->IsLoaded ())
302- {
303- LOG_INFO_MESSAGE (" HLSL->SPIRV with DXC skipped because DXCompiler is not available\n " );
304- return ;
305- }
306-
307- const auto & SPIRV = LoadSPIRVFromHLSL (" UniformBuffers.psh" , SHADER_TYPE_PIXEL, SHADER_COMPILER_DXC);
308- ASSERT_FALSE (SPIRV.empty ()) << " Failed to compile HLSL to SPIRV with DXC" ;
309-
310- // Convert CB1 from UniformBuffer to PushConstant
311- const auto & ConvertedSPIRV = ConvertUBOToPushConstants (SPIRV, " CB1" );
312- ASSERT_FALSE (ConvertedSPIRV.empty ()) << " Failed to convert UBO to push constant" ;
313-
314- TestSPIRVResourcesWithSPIRV (
315- ConvertedSPIRV,
316- " UniformBuffers.psh" ,
317- {
318- // CB1 should now be a PushConstant (48 bytes = 12 floats)
319- SPIRVShaderResourceRefAttribs{" CB1" , 1 , SPIRVResourceType::PushConstant, RESOURCE_DIM_BUFFER, 0 , 48 , 0 },
320- // CB2 remains as UniformBuffer
321- SPIRVShaderResourceRefAttribs{" CB2" , 1 , SPIRVResourceType::UniformBuffer, RESOURCE_DIM_BUFFER, 0 , 16 , 0 },
322- },
323- SHADER_COMPILER_DXC,
324- SHADER_TYPE_PIXEL);
294+ TestConvertUBOToPushConstant (SHADER_COMPILER_DXC);
325295}
326296
327297void TestStorageBuffers (SHADER_COMPILER Compiler)
0 commit comments