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