1 //
2 // Copyright (C) 2016 Google, Inc.
3 // Copyright (C) 2019, 2022-2024 Arm Limited.
4 // Modifications Copyright (C) 2020 Advanced Micro Devices, Inc. All rights reserved.
5 //
6 // All rights reserved.
7 //
8 // Redistribution and use in source and binary forms, with or without
9 // modification, are permitted provided that the following conditions
10 // are met:
11 //
12 // Redistributions of source code must retain the above copyright
13 // notice, this list of conditions and the following disclaimer.
14 //
15 // Redistributions in binary form must reproduce the above
16 // copyright notice, this list of conditions and the following
17 // disclaimer in the documentation and/or other materials provided
18 // with the distribution.
19 //
20 // Neither the name of Google Inc. nor the names of its
21 // contributors may be used to endorse or promote products derived
22 // from this software without specific prior written permission.
23 //
24 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
27 // FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
28 // COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
29 // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
30 // BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
31 // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
32 // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33 // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
34 // ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35 // POSSIBILITY OF SUCH DAMAGE.
36
37 #include <algorithm>
38
39 #include <gtest/gtest.h>
40
41 #include "TestFixture.h"
42
43 namespace glslangtest {
44 namespace {
45
46 struct IoMapData {
47 const char* fileName;
48 const char* entryPoint;
49 int baseSamplerBinding;
50 int baseTextureBinding;
51 int baseImageBinding;
52 int baseUboBinding;
53 int baseSsboBinding;
54 bool autoMapBindings;
55 bool flattenUniforms;
56 };
57
FileNameAsCustomTestSuffixIoMap(const::testing::TestParamInfo<IoMapData> & info)58 std::string FileNameAsCustomTestSuffixIoMap(
59 const ::testing::TestParamInfo<IoMapData>& info) {
60 std::string name = info.param.fileName;
61 // A valid test case suffix cannot have '.' and '-' inside.
62 std::replace(name.begin(), name.end(), '.', '_');
63 std::replace(name.begin(), name.end(), '-', '_');
64 return name;
65 }
66
67 using CompileVulkanToSpirvTest = GlslangTest<::testing::TestWithParam<std::string>>;
68 using CompileVulkanToSpirvTestNoLink = GlslangTest<::testing::TestWithParam<std::string>>;
69 using CompileVulkanToSpirvDeadCodeElimTest = GlslangTest<::testing::TestWithParam<std::string>>;
70 using CompileVulkan1_1ToSpirvTest = GlslangTest<::testing::TestWithParam<std::string>>;
71 using CompileToSpirv14Test = GlslangTest<::testing::TestWithParam<std::string>>;
72 using CompileToSpirv16Test = GlslangTest<::testing::TestWithParam<std::string>>;
73 using CompileOpenGLToSpirvTest = GlslangTest<::testing::TestWithParam<std::string>>;
74 using VulkanSemantics = GlslangTest<::testing::TestWithParam<std::string>>;
75 using OpenGLSemantics = GlslangTest<::testing::TestWithParam<std::string>>;
76 using VulkanAstSemantics = GlslangTest<::testing::TestWithParam<std::string>>;
77 using HlslIoMap = GlslangTest<::testing::TestWithParam<IoMapData>>;
78 using GlslIoMap = GlslangTest<::testing::TestWithParam<IoMapData>>;
79 using CompileVulkanToSpirvTestQCOM = GlslangTest<::testing::TestWithParam<std::string>>;
80 using CompileVulkanToSpirvTestAMD = GlslangTest<::testing::TestWithParam<std::string>>;
81 using CompileVulkanToSpirvTestNV = GlslangTest<::testing::TestWithParam<std::string>>;
82 using CompileVulkanToSpirv14TestNV = GlslangTest<::testing::TestWithParam<std::string>>;
83 using CompileUpgradeTextureToSampledTextureAndDropSamplersTest = GlslangTest<::testing::TestWithParam<std::string>>;
84 using GlslSpirvDebugInfoTest = GlslangTest<::testing::TestWithParam<std::string>>;
85 using GlslNonSemanticShaderDebugInfoTest = GlslangTest<::testing::TestWithParam<std::string>>;
86 using GlslNonSemanticShaderDebugInfoSpirv13Test = GlslangTest<::testing::TestWithParam<std::string>>;
87
88 // Compiling GLSL to SPIR-V under Vulkan semantics. Expected to successfully
89 // generate SPIR-V.
TEST_P(CompileVulkanToSpirvTest,FromFile)90 TEST_P(CompileVulkanToSpirvTest, FromFile)
91 {
92 loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
93 Source::GLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_0, glslang::EShTargetSpv_1_0,
94 Target::Spv);
95 }
96
97 // Compiling GLSL to SPIR-V under Vulkan semantics without linking. Expected to successfully generate SPIR-V.
TEST_P(CompileVulkanToSpirvTestNoLink,FromFile)98 TEST_P(CompileVulkanToSpirvTestNoLink, FromFile)
99 {
100 options().compileOnly = true;
101 // NOTE: Vulkan 1.3 is currently required to use the linkage capability
102 // TODO(ncesario) make sure this is actually necessary
103 loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(), Source::GLSL, Semantics::Vulkan,
104 glslang::EShTargetVulkan_1_3, glslang::EShTargetSpv_1_0, Target::Spv);
105 }
106
TEST_P(CompileVulkanToSpirvDeadCodeElimTest,FromFile)107 TEST_P(CompileVulkanToSpirvDeadCodeElimTest, FromFile)
108 {
109 loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
110 Source::GLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_0, glslang::EShTargetSpv_1_0,
111 Target::Spv);
112 }
113
114
TEST_P(CompileVulkan1_1ToSpirvTest,FromFile)115 TEST_P(CompileVulkan1_1ToSpirvTest, FromFile)
116 {
117 loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
118 Source::GLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_1, glslang::EShTargetSpv_1_3,
119 Target::Spv);
120 }
121
TEST_P(CompileToSpirv14Test,FromFile)122 TEST_P(CompileToSpirv14Test, FromFile)
123 {
124 loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
125 Source::GLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_1, glslang::EShTargetSpv_1_4,
126 Target::Spv);
127 }
128
TEST_P(CompileToSpirv16Test,FromFileTargetVulkan1_3)129 TEST_P(CompileToSpirv16Test, FromFileTargetVulkan1_3)
130 {
131 loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
132 Source::GLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_3, glslang::EShTargetSpv_1_6,
133 Target::Spv);
134 }
135
TEST_P(CompileToSpirv16Test,FromFileTargetVulkan1_4)136 TEST_P(CompileToSpirv16Test, FromFileTargetVulkan1_4)
137 {
138 loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
139 Source::GLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_4, glslang::EShTargetSpv_1_6,
140 Target::Spv);
141 }
142
143 // Compiling GLSL to SPIR-V under OpenGL semantics. Expected to successfully
144 // generate SPIR-V.
TEST_P(CompileOpenGLToSpirvTest,FromFile)145 TEST_P(CompileOpenGLToSpirvTest, FromFile)
146 {
147 loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
148 Source::GLSL, Semantics::OpenGL, glslang::EShTargetVulkan_1_0, glslang::EShTargetSpv_1_0,
149 Target::Spv);
150 }
151
152 // GLSL-level Vulkan semantics test. Expected to error out before generating
153 // SPIR-V.
TEST_P(VulkanSemantics,FromFile)154 TEST_P(VulkanSemantics, FromFile)
155 {
156 loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
157 Source::GLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_0, glslang::EShTargetSpv_1_0,
158 Target::Spv, false);
159 }
160
161 // GLSL-level Vulkan semantics test. Expected to error out before generating
162 // SPIR-V.
TEST_P(OpenGLSemantics,FromFile)163 TEST_P(OpenGLSemantics, FromFile)
164 {
165 loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
166 Source::GLSL, Semantics::OpenGL, glslang::EShTargetVulkan_1_0, glslang::EShTargetSpv_1_0,
167 Target::Spv, false);
168 }
169
170 // GLSL-level Vulkan semantics test that need to see the AST for validation.
TEST_P(VulkanAstSemantics,FromFile)171 TEST_P(VulkanAstSemantics, FromFile)
172 {
173 loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
174 Source::GLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_0, glslang::EShTargetSpv_1_0,
175 Target::AST);
176 }
177
178 // HLSL-level Vulkan semantics tests.
TEST_P(HlslIoMap,FromFile)179 TEST_P(HlslIoMap, FromFile)
180 {
181 loadFileCompileIoMapAndCheck(GlobalTestSettings.testRoot, GetParam().fileName,
182 Source::HLSL, Semantics::Vulkan,
183 Target::Spv, GetParam().entryPoint,
184 GetParam().baseSamplerBinding,
185 GetParam().baseTextureBinding,
186 GetParam().baseImageBinding,
187 GetParam().baseUboBinding,
188 GetParam().baseSsboBinding,
189 GetParam().autoMapBindings,
190 GetParam().flattenUniforms);
191 }
192
193 // GLSL-level Vulkan semantics tests.
TEST_P(GlslIoMap,FromFile)194 TEST_P(GlslIoMap, FromFile)
195 {
196 loadFileCompileIoMapAndCheck(GlobalTestSettings.testRoot, GetParam().fileName,
197 Source::GLSL, Semantics::Vulkan,
198 Target::Spv, GetParam().entryPoint,
199 GetParam().baseSamplerBinding,
200 GetParam().baseTextureBinding,
201 GetParam().baseImageBinding,
202 GetParam().baseUboBinding,
203 GetParam().baseSsboBinding,
204 GetParam().autoMapBindings,
205 GetParam().flattenUniforms);
206 }
207
208 // Compiling GLSL to SPIR-V under Vulkan semantics (QCOM extensions enabled).
209 // Expected to successfully generate SPIR-V.
TEST_P(CompileVulkanToSpirvTestQCOM,FromFile)210 TEST_P(CompileVulkanToSpirvTestQCOM, FromFile)
211 {
212 loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
213 Source::GLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_0, glslang::EShTargetSpv_1_0,
214 Target::Spv);
215 }
216
217 // Compiling GLSL to SPIR-V under Vulkan semantics (AMD extensions enabled).
218 // Expected to successfully generate SPIR-V.
TEST_P(CompileVulkanToSpirvTestAMD,FromFile)219 TEST_P(CompileVulkanToSpirvTestAMD, FromFile)
220 {
221 loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
222 Source::GLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_0, glslang::EShTargetSpv_1_0,
223 Target::Spv);
224 }
225
226 // Compiling GLSL to SPIR-V under Vulkan semantics (NV extensions enabled).
227 // Expected to successfully generate SPIR-V.
TEST_P(CompileVulkanToSpirvTestNV,FromFile)228 TEST_P(CompileVulkanToSpirvTestNV, FromFile)
229 {
230 loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
231 Source::GLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_0, glslang::EShTargetSpv_1_0,
232 Target::Spv);
233 }
234
TEST_P(CompileVulkanToSpirv14TestNV,FromFile)235 TEST_P(CompileVulkanToSpirv14TestNV, FromFile)
236 {
237 loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
238 Source::GLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_1, glslang::EShTargetSpv_1_4,
239 Target::Spv);
240 }
241
TEST_P(CompileUpgradeTextureToSampledTextureAndDropSamplersTest,FromFile)242 TEST_P(CompileUpgradeTextureToSampledTextureAndDropSamplersTest, FromFile)
243 {
244 loadCompileUpgradeTextureToSampledTextureAndDropSamplersAndCheck(GlobalTestSettings.testRoot,
245 GetParam(),
246 Source::GLSL,
247 Semantics::Vulkan,
248 Target::Spv);
249 }
250
TEST_P(GlslSpirvDebugInfoTest,FromFile)251 TEST_P(GlslSpirvDebugInfoTest, FromFile)
252 {
253 loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(), Source::GLSL, Semantics::Vulkan,
254 glslang::EShTargetVulkan_1_0, glslang::EShTargetSpv_1_0, Target::Spv, true, "",
255 "/baseResults/", false, true, false);
256 }
257
TEST_P(GlslNonSemanticShaderDebugInfoTest,FromFile)258 TEST_P(GlslNonSemanticShaderDebugInfoTest, FromFile)
259 {
260 loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(), Source::GLSL, Semantics::Vulkan,
261 glslang::EShTargetVulkan_1_0, glslang::EShTargetSpv_1_0, Target::Spv, true, "",
262 "/baseResults/", false, true, true);
263 }
264
TEST_P(GlslNonSemanticShaderDebugInfoSpirv13Test,FromFile)265 TEST_P(GlslNonSemanticShaderDebugInfoSpirv13Test, FromFile)
266 {
267 loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(), Source::GLSL, Semantics::Vulkan,
268 glslang::EShTargetVulkan_1_1, glslang::EShTargetSpv_1_3, Target::Spv, true, "",
269 "/baseResults/", false, true, true);
270 }
271
272 // clang-format off
273 INSTANTIATE_TEST_SUITE_P(
274 Glsl, CompileVulkanToSpirvTest,
275 ::testing::ValuesIn(std::vector<std::string>({
276 // Test looping constructs.
277 // No tests yet for making sure break and continue from a nested loop
278 // goes to the innermost target.
279 "spv.barrier.vert",
280 "spv.do-simple.vert",
281 "spv.do-while-continue-break.vert",
282 "spv.for-complex-condition.vert",
283 "spv.for-continue-break.vert",
284 "spv.for-simple.vert",
285 "spv.for-notest.vert",
286 "spv.for-nobody.vert",
287 "spv.while-continue-break.vert",
288 "spv.while-simple.vert",
289 // vulkan-specific tests
290 "rayQuery.rgen",
291 "rayQuery-no-cse.rgen",
292 "rayQuery-initialize.rgen",
293 "rayQuery-allOps.rgen",
294 "rayQuery-allOps.Error.rgen",
295 "rayQuery-committed.Error.rgen",
296 "rayQuery-allOps.comp",
297 "rayQuery-allOps.frag",
298 "rayQuery-initialization.Error.comp",
299 "rayQuery-global.rgen",
300 "rayQuery-types.comp",
301 "rayQuery-OpConvertUToAccelerationStructureKHR.comp",
302 "spv.set.vert",
303 "spv.double.comp",
304 "spv.100ops.frag",
305 "spv.130.frag",
306 "spv.140.frag",
307 "spv.150.geom",
308 "spv.150.vert",
309 "spv.16bitstorage.frag",
310 "spv.16bitstorage_Error.frag",
311 "spv.16bitstorage-int.frag",
312 "spv.16bitstorage_Error-int.frag",
313 "spv.16bitstorage-uint.frag",
314 "spv.16bitstorage_Error-uint.frag",
315 "spv.300BuiltIns.vert",
316 "spv.300layout.frag",
317 "spv.300layout.vert",
318 "spv.300layoutp.vert",
319 "spv.310.comp",
320 "spv.310.bitcast.frag",
321 "spv.330.geom",
322 "spv.400.frag",
323 "spv.400.tesc",
324 "spv.400.tese",
325 "spv.420.geom",
326 "spv.430.frag",
327 "spv.430.vert",
328 "spv.450.tesc",
329 "spv.450.geom",
330 "spv.450.noRedecl.tesc",
331 "spv.8bitstorage-int.frag",
332 "spv.8bitstorage_Error-int.frag",
333 "spv.8bitstorage-uint.frag",
334 "spv.8bitstorage_Error-uint.frag",
335 "spv.8bitstorage-ubo.vert",
336 "spv.8bitstorage-ssbo.vert",
337 "spv.8bit-16bit-construction.frag",
338 "spv.accessChain.frag",
339 "spv.aggOps.frag",
340 "spv.always-discard.frag",
341 "spv.always-discard2.frag",
342 "spv.arbPostDepthCoverage.frag",
343 "spv.arbPostDepthCoverage_Error.frag",
344 "spv.atomicCounter.comp",
345 "spv.bitCast.frag",
346 "spv.bool.vert",
347 "spv.boolInBlock.frag",
348 "spv.branch-return.vert",
349 "spv.bufferhandle11.frag",
350 "spv.bufferhandle12.frag",
351 "spv.bufferhandle13.frag",
352 "spv.bufferhandle14.frag",
353 "spv.bufferhandle15.frag",
354 "spv.bufferhandle16.frag",
355 "spv.bufferhandle17_Errors.frag",
356 "spv.bufferhandle18.frag",
357 "spv.bufferhandle19_Errors.frag",
358 "spv.bufferhandle2.frag",
359 "spv.bufferhandle3_Errors.frag",
360 "spv.bufferhandle4.frag",
361 "spv.bufferhandle5.frag",
362 "spv.bufferhandle6.frag",
363 "spv.bufferhandle7.frag",
364 "spv.bufferhandle8.frag",
365 "spv.bufferhandle9.frag",
366 "spv.bufferhandleUvec2.frag",
367 "spv.bufferhandle_Error.frag",
368 "spv.builtInXFB.vert",
369 "spv.conditionalDemote.frag",
370 "spv.conditionalDiscard.frag",
371 "spv.constructComposite.comp",
372 "spv.constStruct.vert",
373 "spv.constConstruct.vert",
374 "spv.controlFlowAttributes.frag",
375 "spv.conversion.frag",
376 "spv.dataOut.frag",
377 "spv.dataOutIndirect.frag",
378 "spv.dataOutIndirect.vert",
379 "spv.debugPrintf.frag",
380 "spv.debugPrintf_Error.frag",
381 "spv.demoteDisabled.frag",
382 "spv.deepRvalue.frag",
383 "spv.depthOut.frag",
384 "spv.depthUnchanged.frag",
385 "spv.discard-dce.frag",
386 "spv.doWhileLoop.frag",
387 "spv.earlyReturnDiscard.frag",
388 "spv.expect_assume.assumeEXT.comp",
389 "spv.expect_assume.expectEXT.comp",
390 "spv.expect_assume.expectEXT.exttypes.comp",
391 "spv.ext.ShaderTileImage.color.frag",
392 "spv.ext.ShaderTileImage.depth_stencil.frag",
393 "spv.ext.ShaderTileImage.subpassinput.frag",
394 "spv.ext.ShaderTileImage.typemismatch.frag",
395 "spv.ext.ShaderTileImage.overlap.frag",
396 "spv.ext.ShaderTileImage.wronglayout.frag",
397 "spv.extPostDepthCoverage.frag",
398 "spv.extPostDepthCoverage_Error.frag",
399 "spv.float16convertonlyarith.comp",
400 "spv.float16convertonlystorage.comp",
401 "spv.flowControl.frag",
402 "spv.forLoop.frag",
403 "spv.forwardFun.frag",
404 "spv.fragmentDensity.frag",
405 "spv.fragmentDensity.vert",
406 "spv.fragmentDensity-es.frag",
407 "spv.fragmentDensity-neg.frag",
408 "spv.fsi.frag",
409 "spv.fsi_Error.frag",
410 "spv.fullyCovered.frag",
411 "spv.functionCall.frag",
412 "spv.functionNestedOpaque.vert",
413 "spv.functionSemantics.frag",
414 "spv.functionParameterTypes.frag",
415 "spv.GeometryShaderPassthrough.geom",
416 "spv.funcall.array.frag",
417 "spv.load.bool.array.interface.block.frag",
418 "spv.int_dot.frag",
419 "spv.int_dot_Error.frag",
420 "spv.interpOps.frag",
421 "spv.int64.frag",
422 "spv.intOps.vert",
423 "spv.intrinsicsDebugBreak.frag",
424 "spv.intrinsicsSpirvByReference.vert",
425 "spv.intrinsicsSpirvDecorate.frag",
426 "spv.intrinsicsSpirvDecorateId.comp",
427 "spv.intrinsicsSpirvDecorateString.comp",
428 "spv.intrinsicsSpirvExecutionMode.frag",
429 "spv.intrinsicsSpirvInstruction.vert",
430 "spv.intrinsicsSpirvLiteral.vert",
431 "spv.intrinsicsSpirvStorageClass.rchit",
432 "spv.intrinsicsSpirvType.rgen",
433 "spv.intrinsicsSpirvTypeLocalVar.vert",
434 "spv.intrinsicsSpirvTypeWithTypeSpecifier.vert",
435 "spv.invariantAll.vert",
436 "spv.layer.tese",
437 "spv.layoutNested.vert",
438 "spv.length.frag",
439 "spv.localAggregates.frag",
440 "spv.loops.frag",
441 "spv.loopsArtificial.frag",
442 "spv.matFun.vert",
443 "spv.matrix.frag",
444 "spv.matrix2.frag",
445 "spv.maximalReconvergence.vert",
446 "spv.memoryQualifier.frag",
447 "spv.merge-unreachable.frag",
448 "spv.multiStruct.comp",
449 "spv.multiStructFuncall.frag",
450 "spv.newTexture.frag",
451 "spv.noDeadDecorations.vert",
452 "spv.nonSquare.vert",
453 "spv.nonuniform.frag",
454 "spv.nonuniform2.frag",
455 "spv.nonuniform3.frag",
456 "spv.nonuniform4.frag",
457 "spv.nonuniform5.frag",
458 "spv.noWorkgroup.comp",
459 "spv.nvAtomicFp16Vec.frag",
460 "spv.nullInit.comp",
461 "spv.offsets.frag",
462 "spv.Operations.frag",
463 "spv.paramMemory.frag",
464 "spv.paramMemory.420.frag",
465 "spv.precision.frag",
466 "spv.precisionArgs.frag",
467 "spv.precisionNonESSamp.frag",
468 "spv.precisionTexture.frag",
469 "spv.prepost.frag",
470 "spv.privateVariableTypes.frag",
471 "spv.qualifiers.vert",
472 "spv.sample.frag",
473 "spv.sampleId.frag",
474 "spv.samplePosition.frag",
475 "spv.sampleMaskOverrideCoverage.frag",
476 "spv.scalarlayout.frag",
477 "spv.scalarlayoutfloat16.frag",
478 "spv.shaderBallot.comp",
479 "spv.shaderDrawParams.vert",
480 "spv.shaderGroupVote.comp",
481 "spv.shaderStencilExport.frag",
482 "spv.shiftOps.frag",
483 "spv.simpleFunctionCall.frag",
484 "spv.simpleMat.vert",
485 "spv.sparseTexture.frag",
486 "spv.sparseTextureClamp.frag",
487 "spv.structAssignment.frag",
488 "spv.structCopy.comp",
489 "spv.structDeref.frag",
490 "spv.structure.frag",
491 "spv.switch.frag",
492 "spv.swizzle.frag",
493 "spv.swizzleInversion.frag",
494 "spv.test.frag",
495 "spv.test.vert",
496 "spv.texture.frag",
497 "spv.texture.vert",
498 "spv.textureBuffer.vert",
499 "spv.image.frag",
500 "spv.imageAtomic64.frag",
501 "spv.imageAtomic64.comp",
502 "spv.types.frag",
503 "spv.uint.frag",
504 "spv.uniformArray.frag",
505 "spv.variableArrayIndex.frag",
506 "spv.varyingArray.frag",
507 "spv.varyingArrayIndirect.frag",
508 "spv.vecMatConstruct.frag",
509 "spv.voidFunction.frag",
510 "spv.whileLoop.frag",
511 "spv.AofA.frag",
512 "spv.queryL.frag",
513 "spv.separate.frag",
514 "spv.shortCircuit.frag",
515 "spv.pushConstant.vert",
516 "spv.pushConstantAnon.vert",
517 "spv.subpass.frag",
518 "spv.specConstant.vert",
519 "spv.specConstant.comp",
520 "spv.specConstantComposite.vert",
521 "spv.specConstantOperations.vert",
522 "spv.specConstant.float16.comp",
523 "spv.specConstant.int16.comp",
524 "spv.specConstant.int8.comp",
525 "spv.specConstantOp.int16.comp",
526 "spv.specConstantOp.int8.comp",
527 "spv.specConstantOp.float16.comp",
528 "spv.storageBuffer.vert",
529 "spv.terminate.frag",
530 "spv.subgroupUniformControlFlow.vert",
531 "spv.subgroupSizeARB.frag",
532 "spv.precise.tese",
533 "spv.precise.tesc",
534 "spv.viewportindex.tese",
535 "spv.volatileAtomic.comp",
536 "spv.vulkan100.subgroupArithmetic.comp",
537 "spv.vulkan100.subgroupPartitioned.comp",
538 "spv.xfb.vert",
539 "spv.xfb2.vert",
540 "spv.xfb3.vert",
541 "spv.samplerlessTextureFunctions.frag",
542 "spv.smBuiltins.vert",
543 "spv.smBuiltins.frag",
544 "spv.ARMCoreBuiltIns.vert",
545 "spv.ARMCoreBuiltIns.frag",
546 "spv.builtin.PrimitiveShadingRateEXT.vert",
547 "spv.builtin.ShadingRateEXT.frag",
548 "spv.fragmentShaderBarycentric3.frag",
549 "spv.fragmentShaderBarycentric4.frag",
550 "spv.ext.textureShadowLod.frag",
551 "spv.ext.textureShadowLod.error.frag",
552 "spv.floatFetch.frag",
553 "spv.atomicRvalue.error.vert",
554 "spv.sampledImageBlock.frag",
555 "spv.multiple.var.same.const.frag",
556 "spv.textureoffset_non_const.vert",
557 "spv.sparsetextureoffset_non_const.vert",
558 "spv.sparsetextureoffset_non_const_fail.vert",
559 })),
560 FileNameAsCustomTestSuffix
561 );
562
563 INSTANTIATE_TEST_SUITE_P(
564 Glsl, CompileVulkanToSpirvTestNoLink,
565 ::testing::ValuesIn(std::vector<std::string>({
566 "spv.exportFunctions.comp",
567 })),
568 FileNameAsCustomTestSuffix
569 );
570
571 // Cases with deliberately unreachable code.
572 // By default the compiler will aggressively eliminate
573 // unreachable merges and continues.
574 INSTANTIATE_TEST_SUITE_P(
575 GlslWithDeadCode, CompileVulkanToSpirvDeadCodeElimTest,
576 ::testing::ValuesIn(std::vector<std::string>({
577 "spv.dead-after-continue.vert",
578 "spv.dead-after-discard.frag",
579 "spv.dead-after-return.vert",
580 "spv.dead-after-loop-break.vert",
581 "spv.dead-after-switch-break.vert",
582 "spv.dead-complex-continue-after-return.vert",
583 "spv.dead-complex-merge-after-return.vert",
584 })),
585 FileNameAsCustomTestSuffix
586 );
587
588 // clang-format off
589 INSTANTIATE_TEST_SUITE_P(
590 Glsl, CompileVulkan1_1ToSpirvTest,
591 ::testing::ValuesIn(std::vector<std::string>({
592 "spv.1.3.8bitstorage-ubo.vert",
593 "spv.1.3.8bitstorage-ssbo.vert",
594 "spv.1.3.coopmat.comp",
595 "spv.deviceGroup.frag",
596 "spv.drawParams.vert",
597 "spv.int8.frag",
598 "spv.vulkan110.int16.frag",
599 "spv.int32.frag",
600 "spv.explicittypes.frag",
601 "spv.float16NoRelaxed.vert",
602 "spv.float32.frag",
603 "spv.float64.frag",
604 "spv.memoryScopeSemantics.comp",
605 "spv.memoryScopeSemantics_Error.comp",
606 "spv.multiView.frag",
607 "spv.queueFamilyScope.comp",
608 "spv.RayGenShader11.rgen",
609 "spv.subgroup.frag",
610 "spv.subgroup.geom",
611 "spv.subgroup.tesc",
612 "spv.subgroup.tese",
613 "spv.subgroup.vert",
614 "spv.subgroupArithmetic.comp",
615 "spv.subgroupBasic.comp",
616 "spv.subgroupBallot.comp",
617 "spv.subgroupBallotNeg.comp",
618 "spv.subgroupClustered.comp",
619 "spv.subgroupClusteredNeg.comp",
620 "spv.subgroupPartitioned.comp",
621 "spv.subgroupRotate.comp",
622 "spv.subgroupShuffle.comp",
623 "spv.subgroupShuffleRelative.comp",
624 "spv.subgroupQuad.comp",
625 "spv.subgroupVote.comp",
626 "spv.subgroupExtendedTypesArithmetic.comp",
627 "spv.subgroupExtendedTypesArithmeticNeg.comp",
628 "spv.subgroupExtendedTypesBallot.comp",
629 "spv.subgroupExtendedTypesBallotNeg.comp",
630 "spv.subgroupExtendedTypesClustered.comp",
631 "spv.subgroupExtendedTypesClusteredNeg.comp",
632 "spv.subgroupExtendedTypesPartitioned.comp",
633 "spv.subgroupExtendedTypesPartitionedNeg.comp",
634 "spv.subgroupExtendedTypesRotate.comp",
635 "spv.subgroupExtendedTypesRotateNeg.comp",
636 "spv.subgroupExtendedTypesShuffle.comp",
637 "spv.subgroupExtendedTypesShuffleNeg.comp",
638 "spv.subgroupExtendedTypesShuffleRelative.comp",
639 "spv.subgroupExtendedTypesShuffleRelativeNeg.comp",
640 "spv.subgroupExtendedTypesQuad.comp",
641 "spv.subgroupExtendedTypesQuadNeg.comp",
642 "spv.subgroupExtendedTypesVote.comp",
643 "spv.subgroupExtendedTypesVoteNeg.comp",
644 "spv.vulkan110.storageBuffer.vert",
645
646 // These tests use the Vulkan memory model.
647 "spv.bufferhandle1.frag",
648 "spv.bufferhandle10.frag",
649 "spv.coopmat.comp",
650 "spv.coopmat_Error.comp",
651 "spv.coopmatKHR.comp",
652 "spv.coopmat_armlayout.comp",
653 "spv.coopmatKHR_arithmetic.comp",
654 "spv.coopmatKHR_arithmeticError.comp",
655 "spv.coopmatKHR_Error.comp",
656 "spv.coopmatKHR_constructor.comp",
657 "spv.coopmatKHR_constructorError.comp",
658 "spv.coopvec.comp",
659 "spv.coopvec2.comp",
660 "spv.coopvecloadstore.comp",
661 "spv.coopvec_Error.comp",
662 "spv.coopvecTraining.comp",
663 "spv.coopvecTraining_Error.comp",
664 "spv.intcoopmat.comp",
665 "spv.intrinsicsInteractWithCoopMat.comp",
666 "spv.replicate.comp",
667 "spv.replicatespec.comp",
668 "spv.atomicAdd.bufferReference.comp",
669 "spv.nontemporalbuffer.frag",
670 "spv.atomicFloat.comp",
671 })),
672 FileNameAsCustomTestSuffix
673 );
674
675 // clang-format off
676 INSTANTIATE_TEST_SUITE_P(
677 Glsl, CompileToSpirv14Test,
678 ::testing::ValuesIn(std::vector<std::string>({
679 "spv.1.4.LoopControl.frag",
680 "spv.1.4.NonWritable.frag",
681 "spv.1.4.OpEntryPoint.frag",
682 "spv.1.4.OpEntryPoint.opaqueParams.vert",
683 "spv.1.4.OpSelect.frag",
684 "spv.1.4.OpCopyLogical.comp",
685 "spv.1.4.OpCopyLogicalBool.comp",
686 "spv.1.4.OpCopyLogical.funcall.frag",
687 "spv.1.4.funcall.array.frag",
688 "spv.1.4.load.bool.array.interface.block.frag",
689 "spv.1.4.image.frag",
690 "spv.1.4.sparseTexture.frag",
691 "spv.1.4.texture.frag",
692 "spv.1.4.constructComposite.comp",
693 "spv.ext.AnyHitShader.rahit",
694 "spv.ext.AnyHitShader_Errors.rahit",
695 "spv.ext.ClosestHitShader.rchit",
696 "spv.ext.ClosestHitShader_Subgroup.rchit",
697 "spv.ext.ClosestHitShader_Errors.rchit",
698 "spv.ext.IntersectShader.rint",
699 "spv.ext.IntersectShader_Errors.rint",
700 "spv.ext.MissShader.rmiss",
701 "spv.ext.MissShader_Errors.rmiss",
702 "spv.ext.RayPrimCull_Errors.rgen",
703 "spv.ext.RayCallable.rcall",
704 "spv.ext.RayCallable_Errors.rcall",
705 "spv.ext.RayConstants.rgen",
706 "spv.ext.RayGenShader.rgen",
707 "spv.ext.RayGenShader_Errors.rgen",
708 "spv.ext.RayGenShader11.rgen",
709 "spv.ext.RayGenShaderArray.rgen",
710 "spv.ext.RayGenSBTlayout.rgen",
711 "spv.ext.RayGenSBTlayout140.rgen",
712 "spv.ext.RayGenSBTlayout430.rgen",
713 "spv.ext.RayGenSBTlayoutscalar.rgen",
714 "spv.ext.World3x4.rahit",
715 "spv.ext.AccelDecl.frag",
716 "spv.ext.RayQueryDecl.frag",
717
718 // SPV_KHR_workgroup_memory_explicit_layout depends on SPIR-V 1.4.
719 "spv.WorkgroupMemoryExplicitLayout.SingleBlock.comp",
720 "spv.WorkgroupMemoryExplicitLayout.MultiBlock.comp",
721 "spv.WorkgroupMemoryExplicitLayout.8BitAccess.comp",
722 "spv.WorkgroupMemoryExplicitLayout.16BitAccess.comp",
723 "spv.WorkgroupMemoryExplicitLayout.NonBlock.comp",
724 "spv.WorkgroupMemoryExplicitLayout.MixBlockNonBlock_Errors.comp",
725 "spv.WorkgroupMemoryExplicitLayout.std140.comp",
726 "spv.WorkgroupMemoryExplicitLayout.std430.comp",
727 "spv.WorkgroupMemoryExplicitLayout.scalar.comp",
728
729 // SPV_EXT_mesh_shader
730 "spv.ext.meshShaderBuiltins.mesh",
731 "spv.ext.meshShaderBuiltinsShadingRate.mesh",
732 "spv.ext.meshShaderRedeclBuiltins.mesh",
733 "spv.ext.meshShaderTaskMem.mesh",
734 "spv.ext.meshShaderUserDefined.mesh",
735 "spv.ext.meshTaskShader.task",
736 "spv.atomiAddEXT.error.mesh",
737 "spv.atomiAddEXT.task",
738 "spv.460.subgroupEXT.task",
739 "spv.460.subgroupEXT.mesh",
740
741 // SPV_NV_shader_execution_reorder
742
743 "spv.nv.hitobject-errors.rgen",
744 "spv.nv.hitobject-allops.rgen",
745 "spv.nv.hitobject-allops.rchit",
746 "spv.nv.hitobject-allops.rmiss",
747
748
749 // SPV_NV_displacment_micromap
750
751 "spv.nv.dmm-allops.rgen",
752 "spv.nv.dmm-allops.rchit",
753 "spv.nv.dmm-allops.rahit",
754 "spv.nv.dmm-allops.mesh",
755 "spv.nv.dmm-allops.comp",
756
757 // SPV_NV_cluster_acceleration_structure
758 "spv.nv.cluster-allops.rgen",
759 "spv.nv.cluster-allops.rchit",
760 "spv.nv.cluster-allops.rmiss",
761 "spv.nv.cluster-allops.rahit",
762 "spv.nv.cluster-allops.frag",
763
764 // SPV_NV_linear_swept_spheres
765
766 "spv.nv.lss-allops.rgen",
767 "spv.nv.lss-allops.rchit",
768 "spv.nv.lss-allops.rmiss",
769 "spv.nv.lss-allops.frag",
770
771 })),
772 FileNameAsCustomTestSuffix
773 );
774
775 // clang-format off
776 INSTANTIATE_TEST_SUITE_P(
777 Glsl, CompileToSpirv16Test,
778 ::testing::ValuesIn(std::vector<std::string>({
779 "spv.1.6.conditionalDiscard.frag",
780 "spv.1.6.helperInvocation.frag",
781 "spv.1.6.helperInvocation.memmodel.frag",
782 "spv.1.6.specConstant.comp",
783 "spv.1.6.samplerBuffer.frag",
784 "spv.1.6.separate.frag",
785 "spv.1.6.quad.frag",
786 "spv.coopmat2_constructor.comp",
787 "spv.coopmat2_error.comp",
788 "spv.coopmat2_tensor.comp",
789 "spv.1.6.nontemporalimage.frag"
790 })),
791 FileNameAsCustomTestSuffix
792 );
793
794
795 // clang-format off
796 INSTANTIATE_TEST_SUITE_P(
797 Hlsl, HlslIoMap,
798 ::testing::ValuesIn(std::vector<IoMapData>{
799 { "spv.register.autoassign.frag", "main_ep", 5, 10, 0, 20, 30, true, false },
800 { "spv.register.noautoassign.frag", "main_ep", 5, 10, 0, 15, 30, false, false },
801 { "spv.register.autoassign-2.frag", "main", 5, 10, 0, 15, 30, true, true },
802 { "spv.register.subpass.frag", "main", 0, 20, 0, 0, 0, true, true },
803 { "spv.buffer.autoassign.frag", "main", 5, 10, 0, 15, 30, true, true },
804 { "spv.ssbo.autoassign.frag", "main", 5, 10, 0, 15, 30, true, true },
805 { "spv.ssboAlias.frag", "main", 0, 0, 0, 0, 83, true, false },
806 { "spv.rw.autoassign.frag", "main", 5, 10, 20, 15, 30, true, true },
807 { "spv.register.autoassign.rangetest.frag", "main",
808 glslang::TQualifier::layoutBindingEnd-2,
809 glslang::TQualifier::layoutBindingEnd+5,
810 0, 20, 30, true, false },
811 }),
812 FileNameAsCustomTestSuffixIoMap
813 );
814
815 // clang-format off
816 INSTANTIATE_TEST_SUITE_P(
817 Hlsl, GlslIoMap,
818 ::testing::ValuesIn(std::vector<IoMapData>{
819 { "spv.glsl.register.autoassign.frag", "main", 5, 10, 0, 20, 30, true, false },
820 { "spv.glsl.register.noautoassign.frag", "main", 5, 10, 0, 15, 30, false, false },
821 }),
822 FileNameAsCustomTestSuffixIoMap
823 );
824
825 // clang-format off
826 INSTANTIATE_TEST_SUITE_P(
827 Glsl, CompileOpenGLToSpirvTest,
828 ::testing::ValuesIn(std::vector<std::string>({
829 "spv.460.frag",
830 "spv.460.vert",
831 "spv.460.comp",
832 "spv.atomic.comp",
833 "spv.atomicFloat_Error.comp",
834 "spv.glFragColor.frag",
835 "spv.rankShift.comp",
836 "spv.specConst.vert",
837 "spv.specTexture.frag",
838 "spv.OVR_multiview.vert",
839 "spv.uniformInitializer.frag",
840 "spv.uniformInitializerSpecConstant.frag",
841 "spv.uniformInitializerStruct.frag",
842 "spv.xfbOffsetOnBlockMembersAssignment.vert",
843 "spv.xfbOffsetOnStructMembersAssignment.vert",
844 "spv.xfbOverlapOffsetCheckWithBlockAndMember.vert",
845 "spv.xfbStrideJustOnce.vert",
846 })),
847 FileNameAsCustomTestSuffix
848 );
849
850 INSTANTIATE_TEST_SUITE_P(
851 Glsl, VulkanSemantics,
852 ::testing::ValuesIn(std::vector<std::string>({
853 "vulkan.frag",
854 "vulkan.vert",
855 "vulkan.comp",
856 "samplerlessTextureFunctions.frag",
857 "spv.intrinsicsFakeEnable.vert",
858 "spv.specConstArrayCheck.vert",
859 })),
860 FileNameAsCustomTestSuffix
861 );
862
863 INSTANTIATE_TEST_SUITE_P(
864 Glsl, OpenGLSemantics,
865 ::testing::ValuesIn(std::vector<std::string>({
866 "glspv.esversion.vert",
867 "glspv.version.frag",
868 "glspv.version.vert",
869 "glspv.frag",
870 "glspv.vert",
871 })),
872 FileNameAsCustomTestSuffix
873 );
874
875 INSTANTIATE_TEST_SUITE_P(
876 Glsl, VulkanAstSemantics,
877 ::testing::ValuesIn(std::vector<std::string>({
878 "vulkan.ast.vert",
879 })),
880 FileNameAsCustomTestSuffix
881 );
882
883 INSTANTIATE_TEST_SUITE_P(
884 Glsl, CompileVulkanToSpirvTestQCOM,
885 ::testing::ValuesIn(std::vector<std::string>({
886 "spv.tpipSampleWeighted.frag",
887 "spv.tpipBoxFilter.frag",
888 "spv.tpipBlockMatchSSD.frag",
889 "spv.tpipBlockMatchSAD.frag",
890 "spv.tpipTextureArrays.frag",
891 "spv.tpipBlockMatchGatherSAD.frag",
892 "spv.tpipBlockMatchGatherSSD.frag",
893 "spv.tpipBlockMatchWindowSAD.frag",
894 "spv.tpipBlockMatchWindowSSD.frag",
895 })),
896 FileNameAsCustomTestSuffix
897 );
898
899 INSTANTIATE_TEST_SUITE_P(
900 Glsl, CompileVulkanToSpirvTestAMD,
901 ::testing::ValuesIn(std::vector<std::string>({
902 "spv.16bitxfb.vert",
903 "spv.float16.frag",
904 "spv.float16Fetch.frag",
905 "spv.imageLoadStoreLod.frag",
906 "spv.int16.frag",
907 "spv.int16.amd.frag",
908 "spv.shaderBallotAMD.comp",
909 "spv.shaderFragMaskAMD.frag",
910 "spv.textureGatherBiasLod.frag",
911 })),
912 FileNameAsCustomTestSuffix
913 );
914
915 INSTANTIATE_TEST_SUITE_P(
916 Glsl, CompileVulkanToSpirvTestNV,
917 ::testing::ValuesIn(std::vector<std::string>({
918 "spv.sampleMaskOverrideCoverage.frag",
919 "spv.GeometryShaderPassthrough.geom",
920 "spv.viewportArray2.vert",
921 "spv.viewportArray2.tesc",
922 "spv.stereoViewRendering.vert",
923 "spv.stereoViewRendering.tesc",
924 "spv.multiviewPerViewAttributes.vert",
925 "spv.multiviewPerViewAttributes.tesc",
926 "spv.atomicInt64.comp",
927 "spv.atomicStoreInt64.comp",
928 "spv.shadingRate.frag",
929 "spv.RayGenShader.rgen",
930 "spv.RayGenShaderArray.rgen",
931 "spv.RayGenShader_Errors.rgen",
932 "spv.RayConstants.rgen",
933 "spv.IntersectShader.rint",
934 "spv.IntersectShader_Errors.rint",
935 "spv.AnyHitShader.rahit",
936 "spv.AnyHitShader_Errors.rahit",
937 "spv.ClosestHitShader.rchit",
938 "spv.ClosestHitShader_Errors.rchit",
939 "spv.MissShader.rmiss",
940 "spv.MissShader_Errors.rmiss",
941 "spv.RayCallable.rcall",
942 "spv.RayCallable_Errors.rcall",
943 "spv.fragmentShaderBarycentric.frag",
944 "spv.fragmentShaderBarycentric2.frag",
945 "spv.computeShaderDerivatives.comp",
946 "spv.computeShaderDerivatives2.comp",
947 "spv.computeShaderDerivativesSpec.comp",
948 "spv.computeShaderDerivativesSpec2.comp",
949 "spv.shaderImageFootprint.frag",
950 "spv.meshShaderBuiltins.mesh",
951 "spv.meshShaderUserDefined.mesh",
952 "spv.meshShaderPerViewBuiltins.mesh",
953 "spv.meshShaderPerViewUserDefined.mesh",
954 "spv.meshShaderPerView_Errors.mesh",
955 "spv.meshShaderSharedMem.mesh",
956 "spv.meshShaderTaskMem.mesh",
957 "spv.320.meshShaderUserDefined.mesh",
958 "spv.meshShaderRedeclBuiltins.mesh",
959 "spv.meshShaderRedeclPerViewBuiltins.mesh",
960 "spv.meshTaskShader.task",
961 "spv.perprimitiveNV.frag",
962 })),
963 FileNameAsCustomTestSuffix
964 );
965
966 INSTANTIATE_TEST_SUITE_P(
967 Glsl, CompileVulkanToSpirv14TestNV,
968 ::testing::ValuesIn(std::vector<std::string>({
969 "spv.RayGenShaderMotion.rgen",
970 "spv.IntersectShaderMotion.rint",
971 "spv.AnyHitShaderMotion.rahit",
972 "spv.ClosestHitShaderMotion.rchit",
973 "spv.MissShaderMotion.rmiss",
974 })),
975 FileNameAsCustomTestSuffix
976 );
977
978 INSTANTIATE_TEST_SUITE_P(
979 Glsl, CompileUpgradeTextureToSampledTextureAndDropSamplersTest,
980 ::testing::ValuesIn(std::vector<std::string>({
981 "spv.texture.sampler.transform.frag",
982 })),
983 FileNameAsCustomTestSuffix
984 );
985
986 INSTANTIATE_TEST_SUITE_P(
987 Glsl, GlslSpirvDebugInfoTest,
988 ::testing::ValuesIn(std::vector<std::string>({
989 "spv.pp.line.frag",
990 })),
991 FileNameAsCustomTestSuffix
992 );
993
994 INSTANTIATE_TEST_SUITE_P(
995 Glsl, GlslNonSemanticShaderDebugInfoTest,
996 ::testing::ValuesIn(std::vector<std::string>({
997 "spv.debuginfo.glsl.vert",
998 "spv.debuginfo.glsl.frag",
999 "spv.debuginfo.glsl.comp",
1000 "spv.debuginfo.glsl.geom",
1001 "spv.debuginfo.glsl.tesc",
1002 "spv.debuginfo.glsl.tese",
1003 "spv.debuginfo.bufferref.glsl.frag",
1004 "spv.debuginfo.const_params.glsl.comp",
1005 "spv.debuginfo.scalar_types.glsl.frag",
1006 "spv.debuginfo.rt_types.glsl.rgen",
1007 "spv.debuginfo.include.glsl.frag",
1008 "spv.debuginfo.multiline.glsl.frag",
1009 "spv.debuginfo.implicit_br.glsl.frag",
1010 })),
1011 FileNameAsCustomTestSuffix
1012 );
1013
1014 INSTANTIATE_TEST_SUITE_P(
1015 Glsl, GlslNonSemanticShaderDebugInfoSpirv13Test,
1016 ::testing::ValuesIn(std::vector<std::string>({
1017 "spv.debuginfo.coopmatKHR.comp",
1018 })),
1019 FileNameAsCustomTestSuffix
1020 );
1021 // clang-format on
1022
1023 } // anonymous namespace
1024 } // namespace glslangtest
1025