From fa8eb9878c10f616b6e04252076264028269f8b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D1=80=D0=B0=D0=BD=D0=B8=D0=BC=D0=B8=D1=80=20=D0=9A?= =?UTF-8?q?=D0=B0=D1=80=D0=B0=D1=9F=D0=B8=D1=9B?= Date: Sat, 5 Jan 2019 08:15:11 -0800 Subject: [PATCH] Updated spirv-tools. --- 3rdparty/glslang/SPIRV/SpvTools.cpp | 4 +- .../Test/baseResults/spv.int16.amd.frag.out | 1 + 3rdparty/glslang/known_good.json | 4 +- 3rdparty/spirv-tools/Android.mk | 19 +- 3rdparty/spirv-tools/BUILD.gn | 83 +- 3rdparty/spirv-tools/CHANGES | 115 +- 3rdparty/spirv-tools/CMakeLists.txt | 26 +- 3rdparty/spirv-tools/CODE_OF_CONDUCT.md | 1 + 3rdparty/spirv-tools/DEPS | 2 +- 3rdparty/spirv-tools/README.md | 14 +- 3rdparty/spirv-tools/build/CMakeCache.txt | 437 +++ .../CMakeFiles/3.5.1/CMakeCCompiler.cmake | 67 + .../CMakeFiles/3.5.1/CMakeCXXCompiler.cmake | 68 + .../3.5.1/CMakeDetermineCompilerABI_C.bin | Bin 0 -> 8424 bytes .../3.5.1/CMakeDetermineCompilerABI_CXX.bin | Bin 0 -> 8432 bytes .../build/CMakeFiles/3.5.1/CMakeSystem.cmake | 15 + .../3.5.1/CompilerIdC/CMakeCCompilerId.c | 544 +++ .../build/CMakeFiles/3.5.1/CompilerIdC/a.out | Bin 0 -> 8576 bytes .../CompilerIdCXX/CMakeCXXCompilerId.cpp | 533 +++ .../CMakeFiles/3.5.1/CompilerIdCXX/a.out | Bin 0 -> 8592 bytes .../CMakeDirectoryInformation.cmake | 16 + .../build/CMakeFiles/CMakeOutput.log | 566 +++ .../build/CMakeFiles/CMakeRuleHashes.txt | 24 + .../build/CMakeFiles/Makefile.cmake | 183 + .../spirv-tools/build/CMakeFiles/Makefile2 | 1284 ++++++ .../spirv-tools/build/CMakeFiles/Progress/1 | 1 + .../spirv-tools/build/CMakeFiles/Progress/2 | 1 + .../spirv-tools/build/CMakeFiles/Progress/3 | 1 + .../spirv-tools/build/CMakeFiles/Progress/4 | 1 + .../spirv-tools/build/CMakeFiles/Progress/5 | 1 + .../spirv-tools/build/CMakeFiles/Progress/6 | 1 + .../spirv-tools/build/CMakeFiles/Progress/7 | 1 + .../spirv-tools/build/CMakeFiles/Progress/8 | 1 + .../spirv-tools/build/CMakeFiles/Progress/9 | 1 + .../build/CMakeFiles/Progress/count.txt | 1 + .../build/CMakeFiles/TargetDirectories.txt | 176 + .../build/CMakeFiles/cmake.check_cache | 1 + .../build/CMakeFiles/feature_tests.bin | Bin 0 -> 12480 bytes .../build/CMakeFiles/feature_tests.c | 34 + .../build/CMakeFiles/feature_tests.cxx | 405 ++ .../build/CMakeFiles/progress.marks | 1 + .../DependInfo.cmake | 11 + .../spirv-tools-pkg-config.dir/build.make | 78 + .../cmake_clean.cmake | 8 + .../depend.internal | 3 + .../spirv-tools-pkg-config.dir/depend.make | 3 + .../spirv-tools-pkg-config.dir/progress.make | 1 + .../DependInfo.cmake | 11 + .../build.make | 78 + .../cmake_clean.cmake | 8 + .../depend.internal | 3 + .../depend.make | 3 + .../progress.make | 1 + .../spirv-tools/build/CTestTestfile.cmake | 13 + 3rdparty/spirv-tools/build/DebugInfo.h | 137 + 3rdparty/spirv-tools/build/Makefile | 502 +++ .../spirv-tools/build/SPIRV-Tools-shared.pc | 12 + 3rdparty/spirv-tools/build/SPIRV-Tools.pc | 12 + 3rdparty/spirv-tools/build/build-version.inc | 1 + .../spirv-tools/build/cmake_install.cmake | 70 + .../spirv-tools/build/core.insts-unified1.inc | 410 ++ .../spirv-tools/build/debuginfo.insts.inc | 38 + .../spirv-tools/build/enum_string_mapping.inc | 325 ++ .../CMakeDirectoryInformation.cmake | 16 + .../build/examples/CMakeFiles/progress.marks | 1 + .../build/examples/CTestTestfile.cmake | 7 + 3rdparty/spirv-tools/build/examples/Makefile | 194 + .../build/examples/cmake_install.cmake | 40 + .../CMakeDirectoryInformation.cmake | 16 + .../cpp-interface/CMakeFiles/progress.marks | 1 + .../DependInfo.cmake | 33 + .../spirv-tools-cpp-example.dir/build.make | 115 + .../cmake_clean.cmake | 10 + .../spirv-tools-cpp-example.dir/depend.make | 2 + .../spirv-tools-cpp-example.dir/flags.make | 10 + .../spirv-tools-cpp-example.dir/link.txt | 1 + .../spirv-tools-cpp-example.dir/progress.make | 3 + .../cpp-interface/CTestTestfile.cmake | 6 + .../build/examples/cpp-interface/Makefile | 240 ++ .../cpp-interface/cmake_install.cmake | 34 + 3rdparty/spirv-tools/build/extension_enum.inc | 35 + .../CMakeDirectoryInformation.cmake | 16 + .../build/external/CMakeFiles/progress.marks | 1 + .../build/external/CTestTestfile.cmake | 6 + 3rdparty/spirv-tools/build/external/Makefile | 194 + .../build/external/cmake_install.cmake | 34 + 3rdparty/spirv-tools/build/generators.inc | 20 + .../spirv-tools/build/glsl.std.450.insts.inc | 86 + .../spirv-tools/build/opencl.std.insts.inc | 166 + .../build/operand.kinds-unified1.inc | 749 ++++ .../CMakeDirectoryInformation.cmake | 16 + .../SPIRV-Tools-shared.dir/DependInfo.cmake | 103 + .../SPIRV-Tools-shared.dir/build.make | 1883 +++++++++ .../SPIRV-Tools-shared.dir/cmake_clean.cmake | 86 + .../SPIRV-Tools-shared.dir/depend.make | 2 + .../SPIRV-Tools-shared.dir/flags.make | 10 + .../SPIRV-Tools-shared.dir/link.txt | 1 + .../SPIRV-Tools-shared.dir/progress.make | 77 + .../SPIRV-Tools.dir/CXX.includecache | 1660 ++++++++ .../SPIRV-Tools.dir/DependInfo.cmake | 101 + .../SPIRV-Tools.dir/assembly_grammar.cpp.o | Bin 0 -> 345240 bytes .../CMakeFiles/SPIRV-Tools.dir/binary.cpp.o | Bin 0 -> 1117040 bytes .../CMakeFiles/SPIRV-Tools.dir/build.make | 1884 +++++++++ .../SPIRV-Tools.dir/cmake_clean.cmake | 86 + .../SPIRV-Tools.dir/cmake_clean_target.cmake | 3 + .../SPIRV-Tools.dir/depend.internal | 1239 ++++++ .../CMakeFiles/SPIRV-Tools.dir/depend.make | 1239 ++++++ .../SPIRV-Tools.dir/diagnostic.cpp.o | Bin 0 -> 185128 bytes .../SPIRV-Tools.dir/disassemble.cpp.o | Bin 0 -> 567920 bytes .../SPIRV-Tools.dir/enum_string_mapping.cpp.o | Bin 0 -> 88360 bytes .../CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o | Bin 0 -> 157536 bytes .../SPIRV-Tools.dir/extensions.cpp.o | Bin 0 -> 208624 bytes .../CMakeFiles/SPIRV-Tools.dir/flags.make | 10 + .../SPIRV-Tools.dir/id_descriptor.cpp.o | Bin 0 -> 363408 bytes .../CMakeFiles/SPIRV-Tools.dir/libspirv.cpp.o | Bin 0 -> 294232 bytes .../CMakeFiles/SPIRV-Tools.dir/link.txt | 2 + .../SPIRV-Tools.dir/name_mapper.cpp.o | Bin 0 -> 683760 bytes .../CMakeFiles/SPIRV-Tools.dir/progress.make | 77 + .../SPIRV-Tools.dir/util/bit_vector.cpp.o | Bin 0 -> 153328 bytes .../SPIRV-Tools.dir/util/parse_number.cpp.o | Bin 0 -> 390288 bytes .../SPIRV-Tools.dir/util/string_utils.cpp.o | Bin 0 -> 97472 bytes .../build/source/CMakeFiles/progress.marks | 1 + .../DependInfo.cmake | 11 + .../spirv-tools-build-version.dir/build.make | 82 + .../cmake_clean.cmake | 9 + .../progress.make | 2 + .../DependInfo.cmake | 11 + .../spirv-tools-debuginfo.dir/build.make | 82 + .../cmake_clean.cmake | 9 + .../spirv-tools-debuginfo.dir/progress.make | 2 + .../DependInfo.cmake | 11 + .../build.make | 82 + .../cmake_clean.cmake | 9 + .../progress.make | 2 + .../DependInfo.cmake | 11 + .../build.make | 82 + .../cmake_clean.cmake | 9 + .../progress.make | 2 + .../DependInfo.cmake | 11 + .../build.make | 82 + .../cmake_clean.cmake | 9 + .../progress.make | 2 + .../DependInfo.cmake | 11 + .../build.make | 82 + .../cmake_clean.cmake | 9 + .../progress.make | 2 + .../DependInfo.cmake | 11 + .../build.make | 82 + .../cmake_clean.cmake | 9 + .../progress.make | 2 + .../DependInfo.cmake | 11 + .../spirv-tools-vimsyntax.dir/build.make | 85 + .../cmake_clean.cmake | 9 + .../spirv-tools-vimsyntax.dir/progress.make | 2 + .../build/source/CTestTestfile.cmake | 11 + 3rdparty/spirv-tools/build/source/Makefile | 2433 ++++++++++++ .../build/source/cmake_install.cmake | 62 + .../CMakeDirectoryInformation.cmake | 16 + .../source/comp/CMakeFiles/progress.marks | 1 + .../build/source/comp/CTestTestfile.cmake | 6 + .../spirv-tools/build/source/comp/Makefile | 194 + .../build/source/comp/cmake_install.cmake | 34 + .../CMakeDirectoryInformation.cmake | 16 + .../SPIRV-Tools-link.dir/DependInfo.cmake | 34 + .../SPIRV-Tools-link.dir/build.make | 114 + .../SPIRV-Tools-link.dir/cmake_clean.cmake | 10 + .../cmake_clean_target.cmake | 3 + .../SPIRV-Tools-link.dir/depend.make | 2 + .../SPIRV-Tools-link.dir/flags.make | 10 + .../CMakeFiles/SPIRV-Tools-link.dir/link.txt | 2 + .../SPIRV-Tools-link.dir/progress.make | 3 + .../source/link/CMakeFiles/progress.marks | 1 + .../build/source/link/CTestTestfile.cmake | 7 + .../spirv-tools/build/source/link/Makefile | 240 ++ .../build/source/link/cmake_install.cmake | 38 + .../CMakeDirectoryInformation.cmake | 16 + .../SPIRV-Tools-opt.dir/DependInfo.cmake | 115 + .../CMakeFiles/SPIRV-Tools-opt.dir/build.make | 2328 +++++++++++ .../SPIRV-Tools-opt.dir/cmake_clean.cmake | 92 + .../cmake_clean_target.cmake | 3 + .../SPIRV-Tools-opt.dir/depend.make | 2 + .../CMakeFiles/SPIRV-Tools-opt.dir/flags.make | 10 + .../CMakeFiles/SPIRV-Tools-opt.dir/link.txt | 2 + .../SPIRV-Tools-opt.dir/progress.make | 85 + .../source/opt/CMakeFiles/progress.marks | 1 + .../build/source/opt/CTestTestfile.cmake | 7 + .../spirv-tools/build/source/opt/Makefile | 2700 +++++++++++++ .../build/source/opt/cmake_install.cmake | 38 + .../build/spv-amd-gcn-shader.insts.inc | 7 + .../build/spv-amd-shader-ballot.insts.inc | 8 + ...shader-explicit-vertex-parameter.insts.inc | 5 + .../spv-amd-shader-trinary-minmax.insts.inc | 13 + .../CMakeDirectoryInformation.cmake | 16 + .../build/test/CMakeFiles/progress.marks | 1 + .../build/test/CTestTestfile.cmake | 13 + 3rdparty/spirv-tools/build/test/Makefile | 194 + .../build/test/cmake_install.cmake | 46 + .../CMakeDirectoryInformation.cmake | 16 + .../build/test/comp/CMakeFiles/progress.marks | 1 + .../build/test/comp/CTestTestfile.cmake | 6 + 3rdparty/spirv-tools/build/test/comp/Makefile | 194 + .../build/test/comp/cmake_install.cmake | 34 + .../CMakeDirectoryInformation.cmake | 16 + .../build/test/link/CMakeFiles/progress.marks | 1 + .../build/test/link/CTestTestfile.cmake | 6 + 3rdparty/spirv-tools/build/test/link/Makefile | 194 + .../build/test/link/cmake_install.cmake | 34 + .../CMakeDirectoryInformation.cmake | 16 + .../build/test/opt/CMakeFiles/progress.marks | 1 + .../build/test/opt/CTestTestfile.cmake | 8 + 3rdparty/spirv-tools/build/test/opt/Makefile | 194 + .../build/test/opt/cmake_install.cmake | 41 + .../CMakeDirectoryInformation.cmake | 16 + .../dominator_tree/CMakeFiles/progress.marks | 1 + .../opt/dominator_tree/CTestTestfile.cmake | 6 + .../build/test/opt/dominator_tree/Makefile | 194 + .../opt/dominator_tree/cmake_install.cmake | 34 + .../CMakeDirectoryInformation.cmake | 16 + .../CMakeFiles/progress.marks | 1 + .../loop_optimizations/CTestTestfile.cmake | 6 + .../test/opt/loop_optimizations/Makefile | 194 + .../loop_optimizations/cmake_install.cmake | 34 + .../CMakeDirectoryInformation.cmake | 16 + .../test/stats/CMakeFiles/progress.marks | 1 + .../build/test/stats/CTestTestfile.cmake | 6 + .../spirv-tools/build/test/stats/Makefile | 194 + .../build/test/stats/cmake_install.cmake | 34 + .../CMakeDirectoryInformation.cmake | 16 + .../test/tools/CMakeFiles/progress.marks | 1 + .../build/test/tools/CTestTestfile.cmake | 7 + .../spirv-tools/build/test/tools/Makefile | 194 + .../build/test/tools/cmake_install.cmake | 40 + .../CMakeDirectoryInformation.cmake | 16 + .../test/tools/opt/CMakeFiles/progress.marks | 1 + .../build/test/tools/opt/CTestTestfile.cmake | 7 + .../spirv-tools/build/test/tools/opt/Makefile | 194 + .../build/test/tools/opt/cmake_install.cmake | 34 + .../CMakeDirectoryInformation.cmake | 16 + .../build/test/util/CMakeFiles/progress.marks | 1 + .../build/test/util/CTestTestfile.cmake | 6 + 3rdparty/spirv-tools/build/test/util/Makefile | 194 + .../build/test/util/cmake_install.cmake | 34 + .../CMakeDirectoryInformation.cmake | 16 + .../build/test/val/CMakeFiles/progress.marks | 1 + .../build/test/val/CTestTestfile.cmake | 6 + 3rdparty/spirv-tools/build/test/val/Makefile | 194 + .../build/test/val/cmake_install.cmake | 34 + .../CMakeDirectoryInformation.cmake | 16 + .../build/tools/CMakeFiles/progress.marks | 1 + .../CMakeFiles/spirv-as.dir/DependInfo.cmake | 32 + .../tools/CMakeFiles/spirv-as.dir/build.make | 114 + .../CMakeFiles/spirv-as.dir/cmake_clean.cmake | 10 + .../tools/CMakeFiles/spirv-as.dir/depend.make | 2 + .../tools/CMakeFiles/spirv-as.dir/flags.make | 10 + .../tools/CMakeFiles/spirv-as.dir/link.txt | 1 + .../CMakeFiles/spirv-as.dir/progress.make | 3 + .../CMakeFiles/spirv-cfg.dir/DependInfo.cmake | 34 + .../tools/CMakeFiles/spirv-cfg.dir/build.make | 141 + .../spirv-cfg.dir/cmake_clean.cmake | 11 + .../CMakeFiles/spirv-cfg.dir/depend.make | 2 + .../tools/CMakeFiles/spirv-cfg.dir/flags.make | 10 + .../tools/CMakeFiles/spirv-cfg.dir/link.txt | 1 + .../CMakeFiles/spirv-cfg.dir/progress.make | 4 + .../CMakeFiles/spirv-dis.dir/DependInfo.cmake | 32 + .../tools/CMakeFiles/spirv-dis.dir/build.make | 114 + .../spirv-dis.dir/cmake_clean.cmake | 10 + .../CMakeFiles/spirv-dis.dir/depend.make | 2 + .../tools/CMakeFiles/spirv-dis.dir/flags.make | 10 + .../tools/CMakeFiles/spirv-dis.dir/link.txt | 1 + .../CMakeFiles/spirv-dis.dir/progress.make | 3 + .../spirv-link.dir/DependInfo.cmake | 35 + .../CMakeFiles/spirv-link.dir/build.make | 117 + .../spirv-link.dir/cmake_clean.cmake | 10 + .../CMakeFiles/spirv-link.dir/depend.make | 2 + .../CMakeFiles/spirv-link.dir/flags.make | 10 + .../tools/CMakeFiles/spirv-link.dir/link.txt | 1 + .../CMakeFiles/spirv-link.dir/progress.make | 3 + .../CMakeFiles/spirv-opt.dir/DependInfo.cmake | 35 + .../tools/CMakeFiles/spirv-opt.dir/build.make | 142 + .../spirv-opt.dir/cmake_clean.cmake | 11 + .../CMakeFiles/spirv-opt.dir/depend.make | 2 + .../tools/CMakeFiles/spirv-opt.dir/flags.make | 10 + .../tools/CMakeFiles/spirv-opt.dir/link.txt | 1 + .../CMakeFiles/spirv-opt.dir/progress.make | 4 + .../spirv-stats.dir/DependInfo.cmake | 35 + .../CMakeFiles/spirv-stats.dir/build.make | 168 + .../spirv-stats.dir/cmake_clean.cmake | 12 + .../CMakeFiles/spirv-stats.dir/depend.make | 2 + .../CMakeFiles/spirv-stats.dir/flags.make | 10 + .../tools/CMakeFiles/spirv-stats.dir/link.txt | 1 + .../CMakeFiles/spirv-stats.dir/progress.make | 5 + .../CMakeFiles/spirv-val.dir/DependInfo.cmake | 33 + .../tools/CMakeFiles/spirv-val.dir/build.make | 141 + .../spirv-val.dir/cmake_clean.cmake | 11 + .../CMakeFiles/spirv-val.dir/depend.make | 2 + .../tools/CMakeFiles/spirv-val.dir/flags.make | 10 + .../tools/CMakeFiles/spirv-val.dir/link.txt | 1 + .../CMakeFiles/spirv-val.dir/progress.make | 4 + .../build/tools/CTestTestfile.cmake | 8 + 3rdparty/spirv-tools/build/tools/Makefile | 639 +++ .../build/tools/cmake_install.cmake | 153 + .../CMakeDirectoryInformation.cmake | 16 + .../tools/emacs/CMakeFiles/progress.marks | 1 + .../build/tools/emacs/CTestTestfile.cmake | 6 + .../spirv-tools/build/tools/emacs/Makefile | 194 + .../build/tools/emacs/cmake_install.cmake | 34 + .../CMakeDirectoryInformation.cmake | 16 + .../tools/lesspipe/CMakeFiles/progress.marks | 1 + .../build/tools/lesspipe/CTestTestfile.cmake | 6 + .../spirv-tools/build/tools/lesspipe/Makefile | 194 + .../build/tools/lesspipe/cmake_install.cmake | 38 + 3rdparty/spirv-tools/external/CMakeLists.txt | 74 +- .../external/SPIRV-Headers/CMakeLists.txt | 10 +- .../external/SPIRV-Headers/CODE_OF_CONDUCT.md | 1 + .../SPIRV-Headers/include/spirv/1.0/spirv.cs | 993 +++++ .../SPIRV-Headers/include/spirv/1.1/spirv.cs | 1015 +++++ .../SPIRV-Headers/include/spirv/1.2/spirv.cs | 1021 +++++ .../SPIRV-Headers/include/spirv/1.2/spirv.py | 0 .../SPIRV-Headers/include/spirv/spir-v.xml | 3 +- .../include/spirv/unified1/OpenCL.std.h | 2 +- .../spirv/unified1/spirv.core.grammar.json | 675 +++- .../include/spirv/unified1/spirv.cs | 1198 ++++++ .../include/spirv/unified1/spirv.h | 114 +- .../include/spirv/unified1/spirv.hpp | 114 +- .../include/spirv/unified1/spirv.hpp11 | 114 +- .../include/spirv/unified1/spirv.json | 120 +- .../include/spirv/unified1/spirv.lua | 112 +- .../include/spirv/unified1/spirv.py | 112 +- .../include/spirv/unified1/spv.d | 1200 ++++++ .../tools/buildHeaders/CMakeLists.txt | 0 .../tools/buildHeaders/bin/makeHeaders | 2 +- .../tools/buildHeaders/header.cpp | 121 +- .../SPIRV-Headers/tools/buildHeaders/header.h | 14 +- .../tools/buildHeaders/jsonToSpirv.cpp | 2 +- .../tools/buildHeaders/jsonToSpirv.h | 2 +- .../SPIRV-Headers/tools/buildHeaders/main.cpp | 18 +- .../include/generated/build-version.inc | 2 +- .../include/generated/core.insts-unified1.inc | 14 + .../include/generated/enum_string_mapping.inc | 52 +- .../include/generated/extension_enum.inc | 10 + .../include/generated/generators.inc | 1 + .../generated/operand.kinds-unified1.inc | 165 +- .../include/spirv-tools/instrument.hpp | 135 + .../include/spirv-tools/libspirv.h | 101 +- .../include/spirv-tools/libspirv.hpp | 66 +- .../include/spirv-tools/optimizer.hpp | 82 +- .../kokoro/shaderc-smoketest/build.sh | 71 + .../kokoro/shaderc-smoketest/continuous.cfg | 17 + .../kokoro/shaderc-smoketest/presubmit.cfg | 17 + 3rdparty/spirv-tools/source/CMakeLists.txt | 103 +- 3rdparty/spirv-tools/source/binary.cpp | 8 +- 3rdparty/spirv-tools/source/ext_inst.cpp | 2 - 3rdparty/spirv-tools/source/libspirv.cpp | 2 +- 3rdparty/spirv-tools/source/opcode.cpp | 26 +- 3rdparty/spirv-tools/source/opcode.h | 8 + 3rdparty/spirv-tools/source/operand.cpp | 15 + 3rdparty/spirv-tools/source/operand.h | 3 + .../spirv-tools/source/opt/CMakeLists.txt | 22 +- .../opt/aggressive_dead_code_elim_pass.cpp | 83 +- .../opt/aggressive_dead_code_elim_pass.h | 14 +- .../spirv-tools/source/opt/basic_block.cpp | 22 +- 3rdparty/spirv-tools/source/opt/basic_block.h | 13 +- .../source/opt/block_merge_pass.cpp | 34 +- .../spirv-tools/source/opt/block_merge_pass.h | 5 +- 3rdparty/spirv-tools/source/opt/ccp_pass.cpp | 2 +- 3rdparty/spirv-tools/source/opt/ccp_pass.h | 3 +- 3rdparty/spirv-tools/source/opt/cfg.cpp | 17 +- 3rdparty/spirv-tools/source/opt/cfg.h | 10 +- .../source/opt/cfg_cleanup_pass.cpp | 2 +- .../spirv-tools/source/opt/cfg_cleanup_pass.h | 3 +- .../source/opt/combine_access_chains.h | 3 +- .../source/opt/common_uniform_elim_pass.cpp | 14 +- 3rdparty/spirv-tools/source/opt/constants.cpp | 1 + 3rdparty/spirv-tools/source/opt/constants.h | 2 +- .../source/opt/copy_prop_arrays.cpp | 218 +- .../spirv-tools/source/opt/copy_prop_arrays.h | 30 +- .../source/opt/dead_branch_elim_pass.cpp | 93 +- .../source/opt/dead_branch_elim_pass.h | 13 +- .../source/opt/dead_insert_elim_pass.cpp | 2 +- .../source/opt/dead_insert_elim_pass.h | 3 +- .../source/opt/dead_variable_elimination.h | 3 +- .../source/opt/decoration_manager.cpp | 60 +- .../source/opt/decoration_manager.h | 60 +- .../source/opt/def_use_manager.cpp | 12 +- .../opt/eliminate_dead_functions_pass.cpp | 2 +- .../opt/eliminate_dead_functions_pass.h | 3 +- 3rdparty/spirv-tools/source/opt/fold.cpp | 59 +- .../spirv-tools/source/opt/folding_rules.cpp | 2 +- 3rdparty/spirv-tools/source/opt/function.cpp | 104 +- 3rdparty/spirv-tools/source/opt/function.h | 13 + .../spirv-tools/source/opt/if_conversion.cpp | 7 + .../spirv-tools/source/opt/if_conversion.h | 3 +- .../source/opt/inline_exhaustive_pass.cpp | 18 +- .../source/opt/inline_exhaustive_pass.h | 4 +- .../source/opt/inline_opaque_pass.cpp | 19 +- .../source/opt/inline_opaque_pass.h | 2 +- .../spirv-tools/source/opt/inline_pass.cpp | 761 ++-- 3rdparty/spirv-tools/source/opt/inline_pass.h | 53 +- .../source/opt/inst_bindless_check_pass.cpp | 263 ++ .../source/opt/inst_bindless_check_pass.h | 93 + .../spirv-tools/source/opt/instruction.cpp | 9 +- 3rdparty/spirv-tools/source/opt/instruction.h | 34 +- .../source/opt/instrument_pass.cpp | 710 ++++ .../spirv-tools/source/opt/instrument_pass.h | 357 ++ 3rdparty/spirv-tools/source/opt/ir_builder.h | 137 +- .../spirv-tools/source/opt/ir_context.cpp | 210 +- 3rdparty/spirv-tools/source/opt/ir_context.h | 156 +- 3rdparty/spirv-tools/source/opt/licm_pass.cpp | 83 +- 3rdparty/spirv-tools/source/opt/licm_pass.h | 27 +- .../opt/local_access_chain_convert_pass.cpp | 9 +- .../opt/local_access_chain_convert_pass.h | 3 +- .../source/opt/local_redundancy_elimination.h | 3 +- .../opt/local_single_block_elim_pass.cpp | 9 +- .../source/opt/local_single_block_elim_pass.h | 4 +- .../opt/local_single_store_elim_pass.cpp | 9 +- .../source/opt/local_single_store_elim_pass.h | 4 +- .../source/opt/local_ssa_elim_pass.cpp | 9 +- .../source/opt/local_ssa_elim_pass.h | 4 +- .../source/opt/loop_descriptor.cpp | 1 + .../spirv-tools/source/opt/loop_descriptor.h | 2 +- .../spirv-tools/source/opt/loop_fission.cpp | 1 + .../spirv-tools/source/opt/loop_peeling.cpp | 17 +- .../spirv-tools/source/opt/loop_unroller.cpp | 76 +- .../spirv-tools/source/opt/loop_unroller.h | 8 + .../source/opt/loop_unswitch_pass.cpp | 456 +-- .../spirv-tools/source/opt/loop_utils.cpp | 5 + 3rdparty/spirv-tools/source/opt/mem_pass.cpp | 2 +- .../source/opt/merge_return_pass.cpp | 502 ++- .../source/opt/merge_return_pass.h | 101 +- 3rdparty/spirv-tools/source/opt/module.cpp | 13 + 3rdparty/spirv-tools/source/opt/module.h | 14 +- 3rdparty/spirv-tools/source/opt/optimizer.cpp | 113 +- 3rdparty/spirv-tools/source/opt/pass.cpp | 73 - 3rdparty/spirv-tools/source/opt/pass.h | 28 +- 3rdparty/spirv-tools/source/opt/passes.h | 4 + .../spirv-tools/source/opt/pch_source_opt.cpp | 15 + .../spirv-tools/source/opt/pch_source_opt.h | 32 + .../source/opt/private_to_local_pass.h | 3 +- .../source/opt/process_lines_pass.cpp | 157 + .../source/opt/process_lines_pass.h | 87 + .../source/opt/reduce_load_size.cpp | 3 +- .../spirv-tools/source/opt/reduce_load_size.h | 3 +- 3rdparty/spirv-tools/source/opt/reflect.h | 3 +- .../source/opt/scalar_replacement_pass.cpp | 19 +- .../source/opt/scalar_replacement_pass.h | 8 +- .../source/opt/simplification_pass.h | 3 +- .../source/opt/ssa_rewrite_pass.cpp | 20 +- .../source/opt/strip_reflect_info_pass.cpp | 8 + .../source/opt/strip_reflect_info_pass.h | 3 +- .../source/opt/struct_cfg_analysis.cpp | 128 + .../source/opt/struct_cfg_analysis.h | 101 + .../spirv-tools/source/opt/type_manager.cpp | 11 +- 3rdparty/spirv-tools/source/opt/types.cpp | 13 +- 3rdparty/spirv-tools/source/opt/types.h | 5 + .../source/opt/upgrade_memory_model.cpp | 585 +++ .../source/opt/upgrade_memory_model.h | 129 + .../spirv-tools/source/opt/vector_dce.cpp | 68 +- 3rdparty/spirv-tools/source/opt/vector_dce.h | 3 +- 3rdparty/spirv-tools/source/pch_source.cpp | 15 + 3rdparty/spirv-tools/source/pch_source.h | 15 + .../spirv-tools/source/reduce/CMakeLists.txt | 74 + .../change_operand_reduction_opportunity.cpp | 32 + .../change_operand_reduction_opportunity.h | 56 + ...operand_to_undef_reduction_opportunity.cpp | 41 + ...e_operand_to_undef_reduction_opportunity.h | 53 + .../operand_to_const_reduction_pass.cpp | 83 + .../reduce/operand_to_const_reduction_pass.h | 48 + ...perand_to_dominating_id_reduction_pass.cpp | 114 + .../operand_to_dominating_id_reduction_pass.h | 59 + .../operand_to_undef_reduction_pass.cpp | 94 + .../reduce/operand_to_undef_reduction_pass.h | 45 + .../source/reduce/pch_source_reduce.cpp | 15 + .../source/reduce/pch_source_reduce.h | 23 + .../spirv-tools/source/reduce/reducer.cpp | 154 + 3rdparty/spirv-tools/source/reduce/reducer.h | 97 + .../source/reduce/reduction_opportunity.cpp | 27 + .../source/reduce/reduction_opportunity.h | 47 + .../source/reduce/reduction_pass.cpp | 86 + .../source/reduce/reduction_pass.h | 73 + .../source/reduce/reduction_util.cpp | 44 + .../source/reduce/reduction_util.h | 33 + ...move_instruction_reduction_opportunity.cpp | 29 + ...remove_instruction_reduction_opportunity.h | 46 + ...move_opname_instruction_reduction_pass.cpp | 44 + ...remove_opname_instruction_reduction_pass.h | 48 + ...nreferenced_instruction_reduction_pass.cpp | 60 + ..._unreferenced_instruction_reduction_pass.h | 50 + ...oop_to_selection_reduction_opportunity.cpp | 360 ++ ..._loop_to_selection_reduction_opportunity.h | 116 + ...tured_loop_to_selection_reduction_pass.cpp | 95 + ...uctured_loop_to_selection_reduction_pass.h | 61 + .../source/spirv_optimizer_options.cpp | 41 + .../source/spirv_optimizer_options.h | 40 + .../source/spirv_reducer_options.cpp | 31 + .../source/spirv_reducer_options.h | 35 + .../spirv-tools/source/spirv_target_env.cpp | 59 +- .../spirv-tools/source/spirv_target_env.h | 6 + .../source/spirv_validator_options.cpp | 8 + .../source/spirv_validator_options.h | 3 + 3rdparty/spirv-tools/source/text_handler.cpp | 2 +- 3rdparty/spirv-tools/source/util/hex_float.h | 4 +- .../spirv-tools/source/util/string_utils.cpp | 17 + .../spirv-tools/source/util/string_utils.h | 5 + 3rdparty/spirv-tools/source/val/construct.cpp | 5 +- 3rdparty/spirv-tools/source/val/validate.cpp | 79 +- 3rdparty/spirv-tools/source/val/validate.h | 16 +- .../source/val/validate_adjacency.cpp | 124 +- .../source/val/validate_annotation.cpp | 107 +- .../source/val/validate_atomics.cpp | 183 +- .../source/val/validate_barriers.cpp | 178 +- .../source/val/validate_builtins.cpp | 129 +- .../source/val/validate_capability.cpp | 26 + .../spirv-tools/source/val/validate_cfg.cpp | 32 +- .../source/val/validate_composites.cpp | 13 +- .../source/val/validate_constants.cpp | 57 +- .../source/val/validate_conversion.cpp | 17 +- .../spirv-tools/source/val/validate_debug.cpp | 9 + .../source/val/validate_decorations.cpp | 514 ++- .../source/val/validate_derivatives.cpp | 34 +- ...e_ext_inst.cpp => validate_extensions.cpp} | 53 +- .../spirv-tools/source/val/validate_id.cpp | 26 +- .../spirv-tools/source/val/validate_image.cpp | 199 +- .../source/val/validate_instruction.cpp | 106 +- .../source/val/validate_memory.cpp | 619 ++- .../source/val/validate_memory_semantics.cpp | 241 ++ .../source/val/validate_memory_semantics.h | 28 + .../source/val/validate_mode_setting.cpp | 344 ++ .../source/val/validate_non_uniform.cpp | 48 +- .../source/val/validate_scopes.cpp | 195 + .../spirv-tools/source/val/validate_scopes.h | 30 + .../spirv-tools/source/val/validate_type.cpp | 52 +- .../source/val/validation_state.cpp | 121 +- .../spirv-tools/source/val/validation_state.h | 59 +- 3rdparty/spirv-tools/test/CMakeLists.txt | 40 +- .../spirv-tools/test/binary_parse_test.cpp | 62 +- .../spirv-tools/test/c_interface_test.cpp | 2 +- .../test/comp/markv_codec_test.cpp | 22 +- .../spirv-tools/test/cpp_interface_test.cpp | 17 +- 3rdparty/spirv-tools/test/fuzzers/BUILD.gn | 20 +- .../fuzzers/spvtools_binary_parser_fuzzer.cpp | 44 + .../test/operand_capabilities_test.cpp | 42 +- .../spirv-tools/test/operand_pattern_test.cpp | 6 +- 3rdparty/spirv-tools/test/opt/CMakeLists.txt | 389 +- .../opt/aggressive_dead_code_elim_test.cpp | 460 ++- .../spirv-tools/test/opt/block_merge_test.cpp | 52 +- 3rdparty/spirv-tools/test/opt/ccp_test.cpp | 9 +- .../spirv-tools/test/opt/cfg_cleanup_test.cpp | 8 + .../test/opt/combine_access_chains_test.cpp | 23 +- .../test/opt/common_uniform_elim_test.cpp | 57 +- .../test/opt/copy_prop_array_test.cpp | 313 +- .../test/opt/dead_branch_elim_test.cpp | 677 +++- .../test/opt/decoration_manager_test.cpp | 1 + .../test/opt/dominator_tree/CMakeLists.txt | 1 + .../opt/dominator_tree/pch_test_opt_dom.cpp | 15 + .../opt/dominator_tree/pch_test_opt_dom.h | 25 + .../test/opt/flatten_decoration_test.cpp | 1 + 3rdparty/spirv-tools/test/opt/fold_test.cpp | 95 +- .../spirv-tools/test/opt/function_test.cpp | 173 + .../test/opt/if_conversion_test.cpp | 41 +- 3rdparty/spirv-tools/test/opt/inline_test.cpp | 320 +- .../test/opt/inst_bindless_check_test.cpp | 1850 +++++++++ .../spirv-tools/test/opt/instruction_test.cpp | 29 + 3rdparty/spirv-tools/test/opt/ir_builder.cpp | 71 +- .../spirv-tools/test/opt/ir_context_test.cpp | 440 +++ .../opt/local_access_chain_convert_test.cpp | 3 - .../opt/local_redundancy_elimination_test.cpp | 2 - .../test/opt/local_single_block_elim.cpp | 2 + .../test/opt/local_single_store_elim_test.cpp | 2 + .../test/opt/local_ssa_elim_test.cpp | 68 +- .../opt/loop_optimizations/CMakeLists.txt | 1 + .../opt/loop_optimizations/fusion_legal.cpp | 15 +- .../opt/loop_optimizations/fusion_pass.cpp | 9 +- .../hoist_single_nested_loops.cpp | 46 + .../hoist_without_preheader.cpp | 77 +- .../test/opt/loop_optimizations/lcssa.cpp | 9 +- .../loop_optimizations/pch_test_opt_loop.cpp | 15 + .../loop_optimizations/pch_test_opt_loop.h | 25 + .../test/opt/loop_optimizations/peeling.cpp | 23 +- .../opt/loop_optimizations/unroll_simple.cpp | 46 + .../test/opt/loop_optimizations/unswitch.cpp | 298 +- 3rdparty/spirv-tools/test/opt/module_test.cpp | 89 + 3rdparty/spirv-tools/test/opt/pass_fixture.h | 25 +- .../test/opt/pass_merge_return_test.cpp | 696 ++-- 3rdparty/spirv-tools/test/opt/pass_test.cpp | 242 -- 3rdparty/spirv-tools/test/opt/pass_utils.cpp | 20 + 3rdparty/spirv-tools/test/opt/pass_utils.h | 16 + .../spirv-tools/test/opt/pch_test_opt.cpp | 15 + 3rdparty/spirv-tools/test/opt/pch_test_opt.h | 25 + .../test/opt/private_to_local_test.cpp | 3 - .../test/opt/process_lines_test.cpp | 695 ++++ .../test/opt/reduce_load_size_test.cpp | 30 +- .../test/opt/redundancy_elimination_test.cpp | 3 - .../test/opt/replace_invalid_opc_test.cpp | 32 +- .../test/opt/scalar_replacement_test.cpp | 79 +- .../test/opt/simplification_test.cpp | 3 - .../test/opt/strength_reduction_test.cpp | 2 - .../test/opt/strip_reflect_info_test.cpp | 21 + .../test/opt/struct_cfg_analysis_test.cpp | 466 +++ .../test/opt/type_manager_test.cpp | 17 +- 3rdparty/spirv-tools/test/opt/types_test.cpp | 1 + .../test/opt/upgrade_memory_model_test.cpp | 1435 +++++++ .../spirv-tools/test/opt/vector_dce_test.cpp | 57 +- .../test/opt/workaround1209_test.cpp | 2 - 3rdparty/spirv-tools/test/pch_test.cpp | 15 + 3rdparty/spirv-tools/test/pch_test.h | 18 + .../spirv-tools/test/reduce/CMakeLists.txt | 28 + ...perand_to_constant_reduction_pass_test.cpp | 156 + ...d_to_dominating_id_reduction_pass_test.cpp | 196 + .../operand_to_undef_reduction_pass_test.cpp | 226 ++ .../test/reduce/reduce_test_util.cpp | 72 + .../test/reduce/reduce_test_util.h | 82 + .../spirv-tools/test/reduce/reducer_test.cpp | 310 ++ ...opname_instruction_reduction_pass_test.cpp | 216 ++ ...renced_instruction_reduction_pass_test.cpp | 230 ++ ..._loop_to_selection_reduction_pass_test.cpp | 3440 +++++++++++++++++ .../validation_during_reduction_test.cpp | 376 ++ .../spirv-tools/test/stats/CMakeLists.txt | 9 +- .../test/stats/stats_aggregate_test.cpp | 10 +- .../test/text_to_binary.extension_test.cpp | 144 + .../spirv-tools/test/tools/opt/CMakeLists.txt | 2 +- 3rdparty/spirv-tools/test/tools/opt/flags.py | 7 +- .../spirv-tools/test/tools/opt/oconfig.py | 15 + 3rdparty/spirv-tools/test/util/CMakeLists.txt | 12 +- 3rdparty/spirv-tools/test/val/CMakeLists.txt | 6 + .../spirv-tools/test/val/pch_test_val.cpp | 15 + 3rdparty/spirv-tools/test/val/pch_test_val.h | 19 + .../test/val/val_adjacency_test.cpp | 185 +- .../test/val/val_arithmetics_test.cpp | 8 +- .../spirv-tools/test/val/val_atomics_test.cpp | 979 ++++- .../test/val/val_barriers_test.cpp | 505 ++- .../spirv-tools/test/val/val_bitwise_test.cpp | 1 + .../test/val/val_builtins_test.cpp | 183 +- .../test/val/val_capability_test.cpp | 130 +- .../spirv-tools/test/val/val_cfg_test.cpp | 329 +- .../test/val/val_composites_test.cpp | 54 +- .../test/val/val_constants_test.cpp | 285 ++ .../test/val/val_conversion_test.cpp | 217 +- .../spirv-tools/test/val/val_data_test.cpp | 84 +- .../test/val/val_decoration_test.cpp | 2032 +++++++++- .../test/val/val_derivatives_test.cpp | 11 +- .../test/val/val_ext_inst_test.cpp | 54 +- .../test/val/val_extensions_test.cpp | 23 + 3rdparty/spirv-tools/test/val/val_id_test.cpp | 1978 ++++++++-- .../spirv-tools/test/val/val_image_test.cpp | 643 ++- .../test/val/val_interfaces_test.cpp | 5 + .../spirv-tools/test/val/val_layout_test.cpp | 52 + .../spirv-tools/test/val/val_limits_test.cpp | 76 +- .../test/val/val_logicals_test.cpp | 1 + .../spirv-tools/test/val/val_memory_test.cpp | 1542 ++++++++ .../spirv-tools/test/val/val_modes_test.cpp | 801 ++++ .../test/val/val_non_uniform_test.cpp | 129 +- .../test/val/val_primitives_test.cpp | 4 + .../spirv-tools/test/val/val_ssa_test.cpp | 25 +- .../spirv-tools/test/val/val_state_test.cpp | 2 +- .../spirv-tools/test/val/val_storage_test.cpp | 55 +- .../test/val/val_validation_state_test.cpp | 164 +- .../spirv-tools/test/val/val_version_test.cpp | 24 +- .../spirv-tools/test/val/val_webgpu_test.cpp | 240 +- 3rdparty/spirv-tools/tools/CMakeLists.txt | 3 +- .../tools/lesspipe/spirv-lesspipe.sh | 2 +- 3rdparty/spirv-tools/tools/opt/opt.cpp | 141 +- 3rdparty/spirv-tools/tools/reduce/reduce.cpp | 242 ++ .../spirv-tools/tools/stats/spirv_stats.cpp | 4 +- .../spirv-tools/tools/stats/spirv_stats.h | 2 +- 3rdparty/spirv-tools/tools/stats/stats.cpp | 13 +- 3rdparty/spirv-tools/tools/val/val.cpp | 15 +- 3rdparty/spirv-tools/utils/check_copyright.py | 4 +- scripts/shaderc.lua | 13 +- 668 files changed, 74641 insertions(+), 4828 deletions(-) create mode 100644 3rdparty/spirv-tools/CODE_OF_CONDUCT.md create mode 100644 3rdparty/spirv-tools/build/CMakeCache.txt create mode 100644 3rdparty/spirv-tools/build/CMakeFiles/3.5.1/CMakeCCompiler.cmake create mode 100644 3rdparty/spirv-tools/build/CMakeFiles/3.5.1/CMakeCXXCompiler.cmake create mode 100755 3rdparty/spirv-tools/build/CMakeFiles/3.5.1/CMakeDetermineCompilerABI_C.bin create mode 100755 3rdparty/spirv-tools/build/CMakeFiles/3.5.1/CMakeDetermineCompilerABI_CXX.bin create mode 100644 3rdparty/spirv-tools/build/CMakeFiles/3.5.1/CMakeSystem.cmake create mode 100644 3rdparty/spirv-tools/build/CMakeFiles/3.5.1/CompilerIdC/CMakeCCompilerId.c create mode 100755 3rdparty/spirv-tools/build/CMakeFiles/3.5.1/CompilerIdC/a.out create mode 100644 3rdparty/spirv-tools/build/CMakeFiles/3.5.1/CompilerIdCXX/CMakeCXXCompilerId.cpp create mode 100755 3rdparty/spirv-tools/build/CMakeFiles/3.5.1/CompilerIdCXX/a.out create mode 100644 3rdparty/spirv-tools/build/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 3rdparty/spirv-tools/build/CMakeFiles/CMakeOutput.log create mode 100644 3rdparty/spirv-tools/build/CMakeFiles/CMakeRuleHashes.txt create mode 100644 3rdparty/spirv-tools/build/CMakeFiles/Makefile.cmake create mode 100644 3rdparty/spirv-tools/build/CMakeFiles/Makefile2 create mode 100644 3rdparty/spirv-tools/build/CMakeFiles/Progress/1 create mode 100644 3rdparty/spirv-tools/build/CMakeFiles/Progress/2 create mode 100644 3rdparty/spirv-tools/build/CMakeFiles/Progress/3 create mode 100644 3rdparty/spirv-tools/build/CMakeFiles/Progress/4 create mode 100644 3rdparty/spirv-tools/build/CMakeFiles/Progress/5 create mode 100644 3rdparty/spirv-tools/build/CMakeFiles/Progress/6 create mode 100644 3rdparty/spirv-tools/build/CMakeFiles/Progress/7 create mode 100644 3rdparty/spirv-tools/build/CMakeFiles/Progress/8 create mode 100644 3rdparty/spirv-tools/build/CMakeFiles/Progress/9 create mode 100644 3rdparty/spirv-tools/build/CMakeFiles/Progress/count.txt create mode 100644 3rdparty/spirv-tools/build/CMakeFiles/TargetDirectories.txt create mode 100644 3rdparty/spirv-tools/build/CMakeFiles/cmake.check_cache create mode 100755 3rdparty/spirv-tools/build/CMakeFiles/feature_tests.bin create mode 100644 3rdparty/spirv-tools/build/CMakeFiles/feature_tests.c create mode 100644 3rdparty/spirv-tools/build/CMakeFiles/feature_tests.cxx create mode 100644 3rdparty/spirv-tools/build/CMakeFiles/progress.marks create mode 100644 3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-pkg-config.dir/DependInfo.cmake create mode 100644 3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-pkg-config.dir/build.make create mode 100644 3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-pkg-config.dir/cmake_clean.cmake create mode 100644 3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-pkg-config.dir/depend.internal create mode 100644 3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-pkg-config.dir/depend.make create mode 100644 3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-pkg-config.dir/progress.make create mode 100644 3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-shared-pkg-config.dir/DependInfo.cmake create mode 100644 3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-shared-pkg-config.dir/build.make create mode 100644 3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-shared-pkg-config.dir/cmake_clean.cmake create mode 100644 3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-shared-pkg-config.dir/depend.internal create mode 100644 3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-shared-pkg-config.dir/depend.make create mode 100644 3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-shared-pkg-config.dir/progress.make create mode 100644 3rdparty/spirv-tools/build/CTestTestfile.cmake create mode 100644 3rdparty/spirv-tools/build/DebugInfo.h create mode 100644 3rdparty/spirv-tools/build/Makefile create mode 100644 3rdparty/spirv-tools/build/SPIRV-Tools-shared.pc create mode 100644 3rdparty/spirv-tools/build/SPIRV-Tools.pc create mode 100644 3rdparty/spirv-tools/build/build-version.inc create mode 100644 3rdparty/spirv-tools/build/cmake_install.cmake create mode 100644 3rdparty/spirv-tools/build/core.insts-unified1.inc create mode 100644 3rdparty/spirv-tools/build/debuginfo.insts.inc create mode 100644 3rdparty/spirv-tools/build/enum_string_mapping.inc create mode 100644 3rdparty/spirv-tools/build/examples/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 3rdparty/spirv-tools/build/examples/CMakeFiles/progress.marks create mode 100644 3rdparty/spirv-tools/build/examples/CTestTestfile.cmake create mode 100644 3rdparty/spirv-tools/build/examples/Makefile create mode 100644 3rdparty/spirv-tools/build/examples/cmake_install.cmake create mode 100644 3rdparty/spirv-tools/build/examples/cpp-interface/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 3rdparty/spirv-tools/build/examples/cpp-interface/CMakeFiles/progress.marks create mode 100644 3rdparty/spirv-tools/build/examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/DependInfo.cmake create mode 100644 3rdparty/spirv-tools/build/examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/build.make create mode 100644 3rdparty/spirv-tools/build/examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/cmake_clean.cmake create mode 100644 3rdparty/spirv-tools/build/examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/depend.make create mode 100644 3rdparty/spirv-tools/build/examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/flags.make create mode 100644 3rdparty/spirv-tools/build/examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/link.txt create mode 100644 3rdparty/spirv-tools/build/examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/progress.make create mode 100644 3rdparty/spirv-tools/build/examples/cpp-interface/CTestTestfile.cmake create mode 100644 3rdparty/spirv-tools/build/examples/cpp-interface/Makefile create mode 100644 3rdparty/spirv-tools/build/examples/cpp-interface/cmake_install.cmake create mode 100644 3rdparty/spirv-tools/build/extension_enum.inc create mode 100644 3rdparty/spirv-tools/build/external/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 3rdparty/spirv-tools/build/external/CMakeFiles/progress.marks create mode 100644 3rdparty/spirv-tools/build/external/CTestTestfile.cmake create mode 100644 3rdparty/spirv-tools/build/external/Makefile create mode 100644 3rdparty/spirv-tools/build/external/cmake_install.cmake create mode 100644 3rdparty/spirv-tools/build/generators.inc create mode 100644 3rdparty/spirv-tools/build/glsl.std.450.insts.inc create mode 100644 3rdparty/spirv-tools/build/opencl.std.insts.inc create mode 100644 3rdparty/spirv-tools/build/operand.kinds-unified1.inc create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/DependInfo.cmake create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/build.make create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/cmake_clean.cmake create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/depend.make create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/link.txt create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/progress.make create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/CXX.includecache create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/DependInfo.cmake create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/assembly_grammar.cpp.o create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/binary.cpp.o create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/build.make create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/cmake_clean.cmake create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/cmake_clean_target.cmake create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/depend.internal create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/depend.make create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/diagnostic.cpp.o create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.o create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/enum_string_mapping.cpp.o create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/extensions.cpp.o create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/flags.make create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/id_descriptor.cpp.o create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/libspirv.cpp.o create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/link.txt create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/name_mapper.cpp.o create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/progress.make create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/util/bit_vector.cpp.o create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/util/parse_number.cpp.o create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/util/string_utils.cpp.o create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/progress.marks create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-build-version.dir/DependInfo.cmake create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-build-version.dir/build.make create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-build-version.dir/cmake_clean.cmake create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-build-version.dir/progress.make create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-debuginfo.dir/DependInfo.cmake create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-debuginfo.dir/build.make create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-debuginfo.dir/cmake_clean.cmake create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-debuginfo.dir/progress.make create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-header-DebugInfo.dir/DependInfo.cmake create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-header-DebugInfo.dir/build.make create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-header-DebugInfo.dir/cmake_clean.cmake create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-header-DebugInfo.dir/progress.make create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/DependInfo.cmake create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/build.make create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/cmake_clean.cmake create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/progress.make create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/DependInfo.cmake create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/build.make create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/cmake_clean.cmake create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/progress.make create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/DependInfo.cmake create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/build.make create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/cmake_clean.cmake create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/progress.make create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/DependInfo.cmake create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/build.make create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/cmake_clean.cmake create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/progress.make create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-vimsyntax.dir/DependInfo.cmake create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-vimsyntax.dir/build.make create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-vimsyntax.dir/cmake_clean.cmake create mode 100644 3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-vimsyntax.dir/progress.make create mode 100644 3rdparty/spirv-tools/build/source/CTestTestfile.cmake create mode 100644 3rdparty/spirv-tools/build/source/Makefile create mode 100644 3rdparty/spirv-tools/build/source/cmake_install.cmake create mode 100644 3rdparty/spirv-tools/build/source/comp/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 3rdparty/spirv-tools/build/source/comp/CMakeFiles/progress.marks create mode 100644 3rdparty/spirv-tools/build/source/comp/CTestTestfile.cmake create mode 100644 3rdparty/spirv-tools/build/source/comp/Makefile create mode 100644 3rdparty/spirv-tools/build/source/comp/cmake_install.cmake create mode 100644 3rdparty/spirv-tools/build/source/link/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 3rdparty/spirv-tools/build/source/link/CMakeFiles/SPIRV-Tools-link.dir/DependInfo.cmake create mode 100644 3rdparty/spirv-tools/build/source/link/CMakeFiles/SPIRV-Tools-link.dir/build.make create mode 100644 3rdparty/spirv-tools/build/source/link/CMakeFiles/SPIRV-Tools-link.dir/cmake_clean.cmake create mode 100644 3rdparty/spirv-tools/build/source/link/CMakeFiles/SPIRV-Tools-link.dir/cmake_clean_target.cmake create mode 100644 3rdparty/spirv-tools/build/source/link/CMakeFiles/SPIRV-Tools-link.dir/depend.make create mode 100644 3rdparty/spirv-tools/build/source/link/CMakeFiles/SPIRV-Tools-link.dir/flags.make create mode 100644 3rdparty/spirv-tools/build/source/link/CMakeFiles/SPIRV-Tools-link.dir/link.txt create mode 100644 3rdparty/spirv-tools/build/source/link/CMakeFiles/SPIRV-Tools-link.dir/progress.make create mode 100644 3rdparty/spirv-tools/build/source/link/CMakeFiles/progress.marks create mode 100644 3rdparty/spirv-tools/build/source/link/CTestTestfile.cmake create mode 100644 3rdparty/spirv-tools/build/source/link/Makefile create mode 100644 3rdparty/spirv-tools/build/source/link/cmake_install.cmake create mode 100644 3rdparty/spirv-tools/build/source/opt/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 3rdparty/spirv-tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/DependInfo.cmake create mode 100644 3rdparty/spirv-tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make create mode 100644 3rdparty/spirv-tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/cmake_clean.cmake create mode 100644 3rdparty/spirv-tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/cmake_clean_target.cmake create mode 100644 3rdparty/spirv-tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/depend.make create mode 100644 3rdparty/spirv-tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make create mode 100644 3rdparty/spirv-tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/link.txt create mode 100644 3rdparty/spirv-tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/progress.make create mode 100644 3rdparty/spirv-tools/build/source/opt/CMakeFiles/progress.marks create mode 100644 3rdparty/spirv-tools/build/source/opt/CTestTestfile.cmake create mode 100644 3rdparty/spirv-tools/build/source/opt/Makefile create mode 100644 3rdparty/spirv-tools/build/source/opt/cmake_install.cmake create mode 100644 3rdparty/spirv-tools/build/spv-amd-gcn-shader.insts.inc create mode 100644 3rdparty/spirv-tools/build/spv-amd-shader-ballot.insts.inc create mode 100644 3rdparty/spirv-tools/build/spv-amd-shader-explicit-vertex-parameter.insts.inc create mode 100644 3rdparty/spirv-tools/build/spv-amd-shader-trinary-minmax.insts.inc create mode 100644 3rdparty/spirv-tools/build/test/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 3rdparty/spirv-tools/build/test/CMakeFiles/progress.marks create mode 100644 3rdparty/spirv-tools/build/test/CTestTestfile.cmake create mode 100644 3rdparty/spirv-tools/build/test/Makefile create mode 100644 3rdparty/spirv-tools/build/test/cmake_install.cmake create mode 100644 3rdparty/spirv-tools/build/test/comp/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 3rdparty/spirv-tools/build/test/comp/CMakeFiles/progress.marks create mode 100644 3rdparty/spirv-tools/build/test/comp/CTestTestfile.cmake create mode 100644 3rdparty/spirv-tools/build/test/comp/Makefile create mode 100644 3rdparty/spirv-tools/build/test/comp/cmake_install.cmake create mode 100644 3rdparty/spirv-tools/build/test/link/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 3rdparty/spirv-tools/build/test/link/CMakeFiles/progress.marks create mode 100644 3rdparty/spirv-tools/build/test/link/CTestTestfile.cmake create mode 100644 3rdparty/spirv-tools/build/test/link/Makefile create mode 100644 3rdparty/spirv-tools/build/test/link/cmake_install.cmake create mode 100644 3rdparty/spirv-tools/build/test/opt/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 3rdparty/spirv-tools/build/test/opt/CMakeFiles/progress.marks create mode 100644 3rdparty/spirv-tools/build/test/opt/CTestTestfile.cmake create mode 100644 3rdparty/spirv-tools/build/test/opt/Makefile create mode 100644 3rdparty/spirv-tools/build/test/opt/cmake_install.cmake create mode 100644 3rdparty/spirv-tools/build/test/opt/dominator_tree/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 3rdparty/spirv-tools/build/test/opt/dominator_tree/CMakeFiles/progress.marks create mode 100644 3rdparty/spirv-tools/build/test/opt/dominator_tree/CTestTestfile.cmake create mode 100644 3rdparty/spirv-tools/build/test/opt/dominator_tree/Makefile create mode 100644 3rdparty/spirv-tools/build/test/opt/dominator_tree/cmake_install.cmake create mode 100644 3rdparty/spirv-tools/build/test/opt/loop_optimizations/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 3rdparty/spirv-tools/build/test/opt/loop_optimizations/CMakeFiles/progress.marks create mode 100644 3rdparty/spirv-tools/build/test/opt/loop_optimizations/CTestTestfile.cmake create mode 100644 3rdparty/spirv-tools/build/test/opt/loop_optimizations/Makefile create mode 100644 3rdparty/spirv-tools/build/test/opt/loop_optimizations/cmake_install.cmake create mode 100644 3rdparty/spirv-tools/build/test/stats/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 3rdparty/spirv-tools/build/test/stats/CMakeFiles/progress.marks create mode 100644 3rdparty/spirv-tools/build/test/stats/CTestTestfile.cmake create mode 100644 3rdparty/spirv-tools/build/test/stats/Makefile create mode 100644 3rdparty/spirv-tools/build/test/stats/cmake_install.cmake create mode 100644 3rdparty/spirv-tools/build/test/tools/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 3rdparty/spirv-tools/build/test/tools/CMakeFiles/progress.marks create mode 100644 3rdparty/spirv-tools/build/test/tools/CTestTestfile.cmake create mode 100644 3rdparty/spirv-tools/build/test/tools/Makefile create mode 100644 3rdparty/spirv-tools/build/test/tools/cmake_install.cmake create mode 100644 3rdparty/spirv-tools/build/test/tools/opt/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 3rdparty/spirv-tools/build/test/tools/opt/CMakeFiles/progress.marks create mode 100644 3rdparty/spirv-tools/build/test/tools/opt/CTestTestfile.cmake create mode 100644 3rdparty/spirv-tools/build/test/tools/opt/Makefile create mode 100644 3rdparty/spirv-tools/build/test/tools/opt/cmake_install.cmake create mode 100644 3rdparty/spirv-tools/build/test/util/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 3rdparty/spirv-tools/build/test/util/CMakeFiles/progress.marks create mode 100644 3rdparty/spirv-tools/build/test/util/CTestTestfile.cmake create mode 100644 3rdparty/spirv-tools/build/test/util/Makefile create mode 100644 3rdparty/spirv-tools/build/test/util/cmake_install.cmake create mode 100644 3rdparty/spirv-tools/build/test/val/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 3rdparty/spirv-tools/build/test/val/CMakeFiles/progress.marks create mode 100644 3rdparty/spirv-tools/build/test/val/CTestTestfile.cmake create mode 100644 3rdparty/spirv-tools/build/test/val/Makefile create mode 100644 3rdparty/spirv-tools/build/test/val/cmake_install.cmake create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/progress.marks create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-as.dir/DependInfo.cmake create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-as.dir/build.make create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-as.dir/cmake_clean.cmake create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-as.dir/depend.make create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-as.dir/flags.make create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-as.dir/link.txt create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-as.dir/progress.make create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-cfg.dir/DependInfo.cmake create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-cfg.dir/build.make create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-cfg.dir/cmake_clean.cmake create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-cfg.dir/depend.make create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-cfg.dir/flags.make create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-cfg.dir/link.txt create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-cfg.dir/progress.make create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-dis.dir/DependInfo.cmake create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-dis.dir/build.make create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-dis.dir/cmake_clean.cmake create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-dis.dir/depend.make create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-dis.dir/flags.make create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-dis.dir/link.txt create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-dis.dir/progress.make create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-link.dir/DependInfo.cmake create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-link.dir/build.make create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-link.dir/cmake_clean.cmake create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-link.dir/depend.make create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-link.dir/flags.make create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-link.dir/link.txt create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-link.dir/progress.make create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-opt.dir/DependInfo.cmake create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-opt.dir/build.make create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-opt.dir/cmake_clean.cmake create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-opt.dir/depend.make create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-opt.dir/flags.make create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-opt.dir/link.txt create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-opt.dir/progress.make create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-stats.dir/DependInfo.cmake create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-stats.dir/build.make create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-stats.dir/cmake_clean.cmake create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-stats.dir/depend.make create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-stats.dir/flags.make create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-stats.dir/link.txt create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-stats.dir/progress.make create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-val.dir/DependInfo.cmake create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-val.dir/build.make create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-val.dir/cmake_clean.cmake create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-val.dir/depend.make create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-val.dir/flags.make create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-val.dir/link.txt create mode 100644 3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-val.dir/progress.make create mode 100644 3rdparty/spirv-tools/build/tools/CTestTestfile.cmake create mode 100644 3rdparty/spirv-tools/build/tools/Makefile create mode 100644 3rdparty/spirv-tools/build/tools/cmake_install.cmake create mode 100644 3rdparty/spirv-tools/build/tools/emacs/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 3rdparty/spirv-tools/build/tools/emacs/CMakeFiles/progress.marks create mode 100644 3rdparty/spirv-tools/build/tools/emacs/CTestTestfile.cmake create mode 100644 3rdparty/spirv-tools/build/tools/emacs/Makefile create mode 100644 3rdparty/spirv-tools/build/tools/emacs/cmake_install.cmake create mode 100644 3rdparty/spirv-tools/build/tools/lesspipe/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 3rdparty/spirv-tools/build/tools/lesspipe/CMakeFiles/progress.marks create mode 100644 3rdparty/spirv-tools/build/tools/lesspipe/CTestTestfile.cmake create mode 100644 3rdparty/spirv-tools/build/tools/lesspipe/Makefile create mode 100644 3rdparty/spirv-tools/build/tools/lesspipe/cmake_install.cmake create mode 100644 3rdparty/spirv-tools/external/SPIRV-Headers/CODE_OF_CONDUCT.md create mode 100644 3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/1.0/spirv.cs create mode 100644 3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/1.1/spirv.cs create mode 100644 3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/1.2/spirv.cs mode change 100755 => 100644 3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/1.2/spirv.py mode change 100755 => 100644 3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/unified1/spirv.core.grammar.json create mode 100644 3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/unified1/spirv.cs mode change 100755 => 100644 3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/unified1/spirv.py create mode 100644 3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/unified1/spv.d mode change 100755 => 100644 3rdparty/spirv-tools/external/SPIRV-Headers/tools/buildHeaders/CMakeLists.txt mode change 100755 => 100644 3rdparty/spirv-tools/external/SPIRV-Headers/tools/buildHeaders/header.cpp mode change 100755 => 100644 3rdparty/spirv-tools/external/SPIRV-Headers/tools/buildHeaders/header.h mode change 100755 => 100644 3rdparty/spirv-tools/external/SPIRV-Headers/tools/buildHeaders/jsonToSpirv.cpp mode change 100755 => 100644 3rdparty/spirv-tools/external/SPIRV-Headers/tools/buildHeaders/jsonToSpirv.h mode change 100755 => 100644 3rdparty/spirv-tools/external/SPIRV-Headers/tools/buildHeaders/main.cpp create mode 100644 3rdparty/spirv-tools/include/spirv-tools/instrument.hpp create mode 100644 3rdparty/spirv-tools/kokoro/shaderc-smoketest/build.sh create mode 100644 3rdparty/spirv-tools/kokoro/shaderc-smoketest/continuous.cfg create mode 100644 3rdparty/spirv-tools/kokoro/shaderc-smoketest/presubmit.cfg create mode 100644 3rdparty/spirv-tools/source/opt/inst_bindless_check_pass.cpp create mode 100644 3rdparty/spirv-tools/source/opt/inst_bindless_check_pass.h create mode 100644 3rdparty/spirv-tools/source/opt/instrument_pass.cpp create mode 100644 3rdparty/spirv-tools/source/opt/instrument_pass.h create mode 100644 3rdparty/spirv-tools/source/opt/pch_source_opt.cpp create mode 100644 3rdparty/spirv-tools/source/opt/pch_source_opt.h create mode 100644 3rdparty/spirv-tools/source/opt/process_lines_pass.cpp create mode 100644 3rdparty/spirv-tools/source/opt/process_lines_pass.h create mode 100644 3rdparty/spirv-tools/source/opt/struct_cfg_analysis.cpp create mode 100644 3rdparty/spirv-tools/source/opt/struct_cfg_analysis.h create mode 100644 3rdparty/spirv-tools/source/opt/upgrade_memory_model.cpp create mode 100644 3rdparty/spirv-tools/source/opt/upgrade_memory_model.h create mode 100644 3rdparty/spirv-tools/source/pch_source.cpp create mode 100644 3rdparty/spirv-tools/source/pch_source.h create mode 100644 3rdparty/spirv-tools/source/reduce/CMakeLists.txt create mode 100644 3rdparty/spirv-tools/source/reduce/change_operand_reduction_opportunity.cpp create mode 100644 3rdparty/spirv-tools/source/reduce/change_operand_reduction_opportunity.h create mode 100644 3rdparty/spirv-tools/source/reduce/change_operand_to_undef_reduction_opportunity.cpp create mode 100644 3rdparty/spirv-tools/source/reduce/change_operand_to_undef_reduction_opportunity.h create mode 100644 3rdparty/spirv-tools/source/reduce/operand_to_const_reduction_pass.cpp create mode 100644 3rdparty/spirv-tools/source/reduce/operand_to_const_reduction_pass.h create mode 100644 3rdparty/spirv-tools/source/reduce/operand_to_dominating_id_reduction_pass.cpp create mode 100644 3rdparty/spirv-tools/source/reduce/operand_to_dominating_id_reduction_pass.h create mode 100644 3rdparty/spirv-tools/source/reduce/operand_to_undef_reduction_pass.cpp create mode 100644 3rdparty/spirv-tools/source/reduce/operand_to_undef_reduction_pass.h create mode 100644 3rdparty/spirv-tools/source/reduce/pch_source_reduce.cpp create mode 100644 3rdparty/spirv-tools/source/reduce/pch_source_reduce.h create mode 100644 3rdparty/spirv-tools/source/reduce/reducer.cpp create mode 100644 3rdparty/spirv-tools/source/reduce/reducer.h create mode 100644 3rdparty/spirv-tools/source/reduce/reduction_opportunity.cpp create mode 100644 3rdparty/spirv-tools/source/reduce/reduction_opportunity.h create mode 100644 3rdparty/spirv-tools/source/reduce/reduction_pass.cpp create mode 100644 3rdparty/spirv-tools/source/reduce/reduction_pass.h create mode 100644 3rdparty/spirv-tools/source/reduce/reduction_util.cpp create mode 100644 3rdparty/spirv-tools/source/reduce/reduction_util.h create mode 100644 3rdparty/spirv-tools/source/reduce/remove_instruction_reduction_opportunity.cpp create mode 100644 3rdparty/spirv-tools/source/reduce/remove_instruction_reduction_opportunity.h create mode 100644 3rdparty/spirv-tools/source/reduce/remove_opname_instruction_reduction_pass.cpp create mode 100644 3rdparty/spirv-tools/source/reduce/remove_opname_instruction_reduction_pass.h create mode 100644 3rdparty/spirv-tools/source/reduce/remove_unreferenced_instruction_reduction_pass.cpp create mode 100644 3rdparty/spirv-tools/source/reduce/remove_unreferenced_instruction_reduction_pass.h create mode 100644 3rdparty/spirv-tools/source/reduce/structured_loop_to_selection_reduction_opportunity.cpp create mode 100644 3rdparty/spirv-tools/source/reduce/structured_loop_to_selection_reduction_opportunity.h create mode 100644 3rdparty/spirv-tools/source/reduce/structured_loop_to_selection_reduction_pass.cpp create mode 100644 3rdparty/spirv-tools/source/reduce/structured_loop_to_selection_reduction_pass.h create mode 100644 3rdparty/spirv-tools/source/spirv_optimizer_options.cpp create mode 100644 3rdparty/spirv-tools/source/spirv_optimizer_options.h create mode 100644 3rdparty/spirv-tools/source/spirv_reducer_options.cpp create mode 100644 3rdparty/spirv-tools/source/spirv_reducer_options.h rename 3rdparty/spirv-tools/source/val/{validate_ext_inst.cpp => validate_extensions.cpp} (97%) create mode 100644 3rdparty/spirv-tools/source/val/validate_memory_semantics.cpp create mode 100644 3rdparty/spirv-tools/source/val/validate_memory_semantics.h create mode 100644 3rdparty/spirv-tools/source/val/validate_scopes.cpp create mode 100644 3rdparty/spirv-tools/source/val/validate_scopes.h create mode 100644 3rdparty/spirv-tools/test/fuzzers/spvtools_binary_parser_fuzzer.cpp create mode 100644 3rdparty/spirv-tools/test/opt/dominator_tree/pch_test_opt_dom.cpp create mode 100644 3rdparty/spirv-tools/test/opt/dominator_tree/pch_test_opt_dom.h create mode 100644 3rdparty/spirv-tools/test/opt/function_test.cpp create mode 100644 3rdparty/spirv-tools/test/opt/inst_bindless_check_test.cpp create mode 100644 3rdparty/spirv-tools/test/opt/loop_optimizations/pch_test_opt_loop.cpp create mode 100644 3rdparty/spirv-tools/test/opt/loop_optimizations/pch_test_opt_loop.h delete mode 100644 3rdparty/spirv-tools/test/opt/pass_test.cpp create mode 100644 3rdparty/spirv-tools/test/opt/pch_test_opt.cpp create mode 100644 3rdparty/spirv-tools/test/opt/pch_test_opt.h create mode 100644 3rdparty/spirv-tools/test/opt/process_lines_test.cpp create mode 100644 3rdparty/spirv-tools/test/opt/struct_cfg_analysis_test.cpp create mode 100644 3rdparty/spirv-tools/test/opt/upgrade_memory_model_test.cpp create mode 100644 3rdparty/spirv-tools/test/pch_test.cpp create mode 100644 3rdparty/spirv-tools/test/pch_test.h create mode 100644 3rdparty/spirv-tools/test/reduce/CMakeLists.txt create mode 100644 3rdparty/spirv-tools/test/reduce/operand_to_constant_reduction_pass_test.cpp create mode 100644 3rdparty/spirv-tools/test/reduce/operand_to_dominating_id_reduction_pass_test.cpp create mode 100644 3rdparty/spirv-tools/test/reduce/operand_to_undef_reduction_pass_test.cpp create mode 100644 3rdparty/spirv-tools/test/reduce/reduce_test_util.cpp create mode 100644 3rdparty/spirv-tools/test/reduce/reduce_test_util.h create mode 100644 3rdparty/spirv-tools/test/reduce/reducer_test.cpp create mode 100644 3rdparty/spirv-tools/test/reduce/remove_opname_instruction_reduction_pass_test.cpp create mode 100644 3rdparty/spirv-tools/test/reduce/remove_unreferenced_instruction_reduction_pass_test.cpp create mode 100644 3rdparty/spirv-tools/test/reduce/structured_loop_to_selection_reduction_pass_test.cpp create mode 100644 3rdparty/spirv-tools/test/reduce/validation_during_reduction_test.cpp create mode 100644 3rdparty/spirv-tools/test/val/pch_test_val.cpp create mode 100644 3rdparty/spirv-tools/test/val/pch_test_val.h create mode 100644 3rdparty/spirv-tools/test/val/val_constants_test.cpp create mode 100644 3rdparty/spirv-tools/test/val/val_memory_test.cpp create mode 100644 3rdparty/spirv-tools/test/val/val_modes_test.cpp create mode 100644 3rdparty/spirv-tools/tools/reduce/reduce.cpp diff --git a/3rdparty/glslang/SPIRV/SpvTools.cpp b/3rdparty/glslang/SPIRV/SpvTools.cpp index 1803134e5..eec06e0ac 100644 --- a/3rdparty/glslang/SPIRV/SpvTools.cpp +++ b/3rdparty/glslang/SPIRV/SpvTools.cpp @@ -157,7 +157,7 @@ void SpirvToolsLegalize(const glslang::TIntermediate&, std::vector // information when instructions are deleted or moved. Later, remove // redundant information to minimize final SPRIR-V size. if (options->generateDebugInfo) { -// BK - optimizer.RegisterPass(spvtools::CreatePropagateLineInfoPass()); + optimizer.RegisterPass(spvtools::CreatePropagateLineInfoPass()); } optimizer.RegisterPass(spvtools::CreateDeadBranchElimPass()); optimizer.RegisterPass(spvtools::CreateMergeReturnPass()); @@ -188,7 +188,7 @@ void SpirvToolsLegalize(const glslang::TIntermediate&, std::vector optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass()); optimizer.RegisterPass(spvtools::CreateCFGCleanupPass()); if (options->generateDebugInfo) { -// BK - optimizer.RegisterPass(spvtools::CreateRedundantLineInfoElimPass()); + optimizer.RegisterPass(spvtools::CreateRedundantLineInfoElimPass()); } optimizer.Run(spirv.data(), spirv.size(), &spirv); diff --git a/3rdparty/glslang/Test/baseResults/spv.int16.amd.frag.out b/3rdparty/glslang/Test/baseResults/spv.int16.amd.frag.out index 26c701db6..4451baf9e 100644 --- a/3rdparty/glslang/Test/baseResults/spv.int16.amd.frag.out +++ b/3rdparty/glslang/Test/baseResults/spv.int16.amd.frag.out @@ -1,4 +1,5 @@ spv.int16.amd.frag +Validation failed // Module Version 10000 // Generated by (magic number): 80007 // Id's are bound by 560 diff --git a/3rdparty/glslang/known_good.json b/3rdparty/glslang/known_good.json index 0c4b67b77..b5c668c34 100644 --- a/3rdparty/glslang/known_good.json +++ b/3rdparty/glslang/known_good.json @@ -5,14 +5,14 @@ "site" : "github", "subrepo" : "KhronosGroup/SPIRV-Tools", "subdir" : "External/spirv-tools", - "commit" : "24328a0554654d9e205b532288044d6d203c3f2c" + "commit" : "a87d3ce48e88a653e855c3245a6b68deeae58efc" }, { "name" : "spirv-tools/external/spirv-headers", "site" : "github", "subrepo" : "KhronosGroup/SPIRV-Headers", "subdir" : "External/spirv-tools/external/spirv-headers", - "commit" : "17da9f8231f78cf519b4958c2229463a63ead9e2" + "commit" : "4618b86e9e4b027a22040732dfee35e399cd2c47" } ] } diff --git a/3rdparty/spirv-tools/Android.mk b/3rdparty/spirv-tools/Android.mk index cc336a892..8597c5056 100644 --- a/3rdparty/spirv-tools/Android.mk +++ b/3rdparty/spirv-tools/Android.mk @@ -1,6 +1,9 @@ LOCAL_PATH := $(call my-dir) SPVTOOLS_OUT_PATH=$(if $(call host-path-is-absolute,$(TARGET_OUT)),$(TARGET_OUT),$(abspath $(TARGET_OUT))) -SPVHEADERS_LOCAL_PATH := $(LOCAL_PATH)/external/spirv-headers + +ifeq ($(SPVHEADERS_LOCAL_PATH),) + SPVHEADERS_LOCAL_PATH := $(LOCAL_PATH)/external/spirv-headers +endif SPVTOOLS_SRC_FILES := \ source/assembly_grammar.cpp \ @@ -19,6 +22,7 @@ SPVTOOLS_SRC_FILES := \ source/print.cpp \ source/software_version.cpp \ source/spirv_endian.cpp \ + source/spirv_optimizer_options.cpp \ source/spirv_target_env.cpp \ source/spirv_validator_options.cpp \ source/table.cpp \ @@ -50,7 +54,7 @@ SPVTOOLS_SRC_FILES := \ source/val/validate_debug.cpp \ source/val/validate_decorations.cpp \ source/val/validate_derivatives.cpp \ - source/val/validate_ext_inst.cpp \ + source/val/validate_extensions.cpp \ source/val/validate_execution_limitations.cpp \ source/val/validate_function.cpp \ source/val/validate_id.cpp \ @@ -58,12 +62,14 @@ SPVTOOLS_SRC_FILES := \ source/val/validate_interfaces.cpp \ source/val/validate_instruction.cpp \ source/val/validate_memory.cpp \ + source/val/validate_memory_semantics.cpp \ source/val/validate_mode_setting.cpp \ source/val/validate_layout.cpp \ source/val/validate_literals.cpp \ source/val/validate_logicals.cpp \ source/val/validate_non_uniform.cpp \ source/val/validate_primitives.cpp \ + source/val/validate_scopes.cpp \ source/val/validate_type.cpp SPVTOOLS_OPT_SRC_FILES := \ @@ -101,8 +107,10 @@ SPVTOOLS_OPT_SRC_FILES := \ source/opt/inline_pass.cpp \ source/opt/inline_exhaustive_pass.cpp \ source/opt/inline_opaque_pass.cpp \ + source/opt/inst_bindless_check_pass.cpp \ source/opt/instruction.cpp \ source/opt/instruction_list.cpp \ + source/opt/instrument_pass.cpp \ source/opt/ir_context.cpp \ source/opt/ir_loader.cpp \ source/opt/licm_pass.cpp \ @@ -128,6 +136,7 @@ SPVTOOLS_OPT_SRC_FILES := \ source/opt/pass.cpp \ source/opt/pass_manager.cpp \ source/opt/private_to_local_pass.cpp \ + source/opt/process_lines_pass.cpp \ source/opt/propagator.cpp \ source/opt/reduce_load_size.cpp \ source/opt/redundancy_elimination.cpp \ @@ -143,9 +152,11 @@ SPVTOOLS_OPT_SRC_FILES := \ source/opt/strength_reduction_pass.cpp \ source/opt/strip_debug_info_pass.cpp \ source/opt/strip_reflect_info_pass.cpp \ + source/opt/struct_cfg_analysis.cpp \ source/opt/type_manager.cpp \ source/opt/types.cpp \ source/opt/unify_const_pass.cpp \ + source/opt/upgrade_memory_model.cpp \ source/opt/value_number_table.cpp \ source/opt/vector_dce.cpp \ source/opt/workaround1209.cpp @@ -310,7 +321,7 @@ include $(CLEAR_VARS) LOCAL_MODULE := SPIRV-Tools LOCAL_C_INCLUDES := \ $(LOCAL_PATH)/include \ - $(LOCAL_PATH)/external/spirv-headers/include \ + $(SPVHEADERS_LOCAL_PATH)/include \ $(SPVTOOLS_OUT_PATH) LOCAL_EXPORT_C_INCLUDES := \ $(LOCAL_PATH)/include @@ -323,7 +334,7 @@ LOCAL_MODULE := SPIRV-Tools-opt LOCAL_C_INCLUDES := \ $(LOCAL_PATH)/include \ $(LOCAL_PATH)/source \ - $(LOCAL_PATH)/external/spirv-headers/include \ + $(SPVHEADERS_LOCAL_PATH)/include \ $(SPVTOOLS_OUT_PATH) LOCAL_CXXFLAGS:=-std=c++11 -fno-exceptions -fno-rtti -Werror LOCAL_STATIC_LIBRARIES:=SPIRV-Tools diff --git a/3rdparty/spirv-tools/BUILD.gn b/3rdparty/spirv-tools/BUILD.gn index 9fa9493df..5f0eba954 100644 --- a/3rdparty/spirv-tools/BUILD.gn +++ b/3rdparty/spirv-tools/BUILD.gn @@ -273,19 +273,36 @@ foreach(table, spvtools_vendor_tables) { } } -config("spvtools_config") { +config("spvtools_public_config") { + include_dirs = [ "include" ] +} + +config("spvtools_internal_config") { include_dirs = [ ".", - "include", "$target_gen_dir", "${spirv_headers}/include", ] + configs = [ ":spvtools_public_config" ] + if (is_clang) { cflags = [ "-Wno-implicit-fallthrough" ] } } +source_set("spvtools_headers") { + sources = [ + "include/spirv-tools/libspirv.h", + "include/spirv-tools/libspirv.hpp", + "include/spirv-tools/linker.hpp", + "include/spirv-tools/optimizer.hpp", + "include/spirv-tools/instrument.hpp", + ] + + public_configs = [ ":spvtools_public_config" ] +} + static_library("spvtools") { deps = [ ":spvtools_core_enums_unified1", @@ -330,6 +347,8 @@ static_library("spvtools") { "source/spirv_definition.h", "source/spirv_endian.cpp", "source/spirv_endian.h", + "source/spirv_optimizer_options.cpp", + "source/spirv_optimizer_options.h", "source/spirv_target_env.cpp", "source/spirv_target_env.h", "source/spirv_validator_options.cpp", @@ -356,9 +375,15 @@ static_library("spvtools") { "source/util/timer.h", ] - public_configs = [ ":spvtools_config" ] + public_deps = [ + ":spvtools_headers", + ] + configs -= [ "//build/config/compiler:chromium_code" ] - configs += [ "//build/config/compiler:no_chromium_code" ] + configs += [ + "//build/config/compiler:no_chromium_code", + ":spvtools_internal_config", + ] } static_library("spvtools_val") { @@ -386,7 +411,7 @@ static_library("spvtools_val") { "source/val/validate_decorations.cpp", "source/val/validate_derivatives.cpp", "source/val/validate_execution_limitations.cpp", - "source/val/validate_ext_inst.cpp", + "source/val/validate_extensions.cpp", "source/val/validate_function.cpp", "source/val/validate_id.cpp", "source/val/validate_image.cpp", @@ -396,9 +421,11 @@ static_library("spvtools_val") { "source/val/validate_literals.cpp", "source/val/validate_logicals.cpp", "source/val/validate_memory.cpp", + "source/val/validate_memory_semantics.cpp", "source/val/validate_mode_setting.cpp", "source/val/validate_non_uniform.cpp", "source/val/validate_primitives.cpp", + "source/val/validate_scopes.cpp", "source/val/validate_type.cpp", "source/val/validation_state.cpp", ] @@ -406,10 +433,15 @@ static_library("spvtools_val") { deps = [ ":spvtools", ] + public_deps = [ + ":spvtools_headers", + ] - public_configs = [ ":spvtools_config" ] configs -= [ "//build/config/compiler:chromium_code" ] - configs += [ "//build/config/compiler:no_chromium_code" ] + configs += [ + "//build/config/compiler:no_chromium_code", + ":spvtools_internal_config", + ] } static_library("spvtools_opt") { @@ -482,10 +514,14 @@ static_library("spvtools_opt") { "source/opt/inline_opaque_pass.h", "source/opt/inline_pass.cpp", "source/opt/inline_pass.h", + "source/opt/inst_bindless_check_pass.cpp", + "source/opt/inst_bindless_check_pass.h", "source/opt/instruction.cpp", "source/opt/instruction.h", "source/opt/instruction_list.cpp", "source/opt/instruction_list.h", + "source/opt/instrument_pass.cpp", + "source/opt/instrument_pass.h", "source/opt/ir_builder.h", "source/opt/ir_context.cpp", "source/opt/ir_context.h", @@ -539,6 +575,8 @@ static_library("spvtools_opt") { "source/opt/passes.h", "source/opt/private_to_local_pass.cpp", "source/opt/private_to_local_pass.h", + "source/opt/process_lines_pass.cpp", + "source/opt/process_lines_pass.h", "source/opt/propagator.cpp", "source/opt/propagator.h", "source/opt/reduce_load_size.cpp", @@ -570,6 +608,8 @@ static_library("spvtools_opt") { "source/opt/strip_debug_info_pass.h", "source/opt/strip_reflect_info_pass.cpp", "source/opt/strip_reflect_info_pass.h", + "source/opt/struct_cfg_analysis.cpp", + "source/opt/struct_cfg_analysis.h", "source/opt/tree_iterator.h", "source/opt/type_manager.cpp", "source/opt/type_manager.h", @@ -577,6 +617,8 @@ static_library("spvtools_opt") { "source/opt/types.h", "source/opt/unify_const_pass.cpp", "source/opt/unify_const_pass.h", + "source/opt/upgrade_memory_model.cpp", + "source/opt/upgrade_memory_model.h", "source/opt/value_number_table.cpp", "source/opt/value_number_table.h", "source/opt/vector_dce.cpp", @@ -584,13 +626,19 @@ static_library("spvtools_opt") { "source/opt/workaround1209.cpp", "source/opt/workaround1209.h", ] + deps = [ ":spvtools", ] + public_deps = [ + ":spvtools_headers", + ] - public_configs = [ ":spvtools_config" ] configs -= [ "//build/config/compiler:chromium_code" ] - configs += [ "//build/config/compiler:no_chromium_code" ] + configs += [ + "//build/config/compiler:no_chromium_code", + ":spvtools_internal_config", + ] } group("SPIRV-Tools") { @@ -641,12 +689,6 @@ if (!build_with_chromium) { } } -config("spvtools_test_config") { - if (is_clang) { - cflags = [ "-Wno-self-assign" ] - } -} - test("spvtools_test") { sources = [ "test/assembly_context_test.cpp", @@ -728,10 +770,11 @@ test("spvtools_test") { sources += [ "${googletest_dir}/googletest/src/gtest_main.cc" ] } - configs += [ - ":spvtools_config", - ":spvtools_test_config", - ] + if (is_clang) { + cflags_cc = [ "-Wno-self-assign" ] + } + + configs += [ ":spvtools_internal_config" ] } if (spirv_tools_standalone) { @@ -752,5 +795,5 @@ executable("spirv-as") { ":spvtools", ":spvtools_build_version", ] - configs += [ ":spvtools_config" ] + configs += [ ":spvtools_internal_config" ] } diff --git a/3rdparty/spirv-tools/CHANGES b/3rdparty/spirv-tools/CHANGES index ef499027f..7f9008f01 100644 --- a/3rdparty/spirv-tools/CHANGES +++ b/3rdparty/spirv-tools/CHANGES @@ -1,7 +1,98 @@ Revision history for SPIRV-Tools -v2018.5-dev 2018-07-08 +v2018.7-dev 2018-12-10 - General: + - Created a new tool called spirv-reduce. + - Add cmake option to turn off SPIRV_TIMER_ENABLED (#2103) + - New optimization pass to update the memory model from GLSL450 to VulkanKHR. + - Optimizer + - Added the instrumentation passes for bindless validation. + - Added passes to help preserve OpLine information (#2027) + - Add basic support for EXT_fragment_invocation_density (#2100) + - Fix invalid OpPhi generated by merge-return. (#2172) + Fixes: + - #2018: Don't inline functions with a return in a structured CFG contstruct. + - #2047: Fix bug in folding when volatile stores are present. + - #2053: Fix check for when folding floating pointer values is allowed. + - #2130: Don't inline recursive functions. + - Validator + - Changed the naming convention of outputing ids with names in diagnostic messages. + - Added validation rules for UniformConstant variables in Vulkan. + - #1949: Validate uniform variable type in Vulkan + - Ensure for OpVariable that result type and storage class operand agree (#2052) + - Validator: Support VK_EXT_scalar_block_layout + - Added Vulkan memory model semantics validation + - Added validation checkes spefic to WebGPU environment. + - Add support for VK_EXT_Transform_feedback capabilities (#2088) + - Add validation for OpArrayLength. (#2117) + - Ensure that function parameter's type is not void (#2118) + - Validate pointer variables (#2111) + - Add check for QueueFamilyKHMR memory scope (#2144) + - Validate PushConstants annotation and type (#2140) + - Allow Float16/Int8 for Vulkan 1.0 (#2153) + - Check binding annotations in resource variables (#2151, #2167) + - Validate OpForwardPointer (#2156) + Fixes: + - #2049: Allow InstanceId for NV ray tracing + - Reduce + - Initial commit wit a few passes to reduce test cases. + Fixes: + + +v2018.6 2018-11-07 + - General: + - Added support for the Nvidia Turing and ray tracing extensions. + - Make C++11 the CXX standard in CMakeLists.txt. + - Enabled a parallel build for MSVC. + - Enable pre-compiled headers for MSVC. + - Added a code of conduct. + - EFFCEE and RE2 are now required when build the tests. + - Optimizer + - Unrolling loops marked for unrolling in the legalization passes. + - Improved the compile time of loop unrolling. + - Changee merge-return to create a dummy loop around the function. + - Small improvement to merge-blocks to allow it to merge more often. + - Enforce an upper bound for the ids, and add option to set it. + - #1966: Report error if there are unreachable block before running merge return + Fixes: + - #1917: Allow 0 (meaning unlimited) as a parameter to --scalar-replacement + - #1915: Improve handling of group decorations. + - #1942: Fix incorrect uses of the constant manager. Avoids type mismatches in generated code. + - #1997: Fix dead branch elimination when there is a loop in folded selection. + - #1991: Fixes legality check in if-conversion. + - #1987: Add nullptr check to array copy propagation. + - #1984: Better handling of OpUnreachable in ADCE. + - #1983: Run merge return on reachable functions only. + - #1956: Handled atomic operations in ADCE. + - #1963: Fold integer divisions by 0 to 0. + - #2019: Handle MemberDecorateStringGOOGLE in ADCE and strip reflect. + - Validator + - Added validation for OpGroupNonUniformBallotBitCount. + - Added validation for the Vulkan memory model. + - Added support for VK_KHR_shader_atddomic_int64. + - Added validation for execution modes. + - Added validation for runtime array layouts. + - Added validation for 8-bit storage. + - Added validation of OpPhi instructions with pointer result type. + - Added checks for the Vulkan memory model. + - Validate MakeTexelAvailableKHR and MakeTexelVisibleKHR + - Allow atomic function pointer for OpenCL. + - FPRounding mode checks were implemented. + - Added validation for the id bound with an option to set the max id bound. + Fixes: + - #1882: Improve the validation of decorations to reduce memory usage. + - #1891: Fix an potential infinite loop in dead-branch-elimination. + - #1405: Validate the storage class of boolean objects. + - #1880: Identify arrays of type void as invalid. + - #487: Validate OpImageTexelPointer. + - #1922: Validate OpPhi instructions are at the start of a block correctly. + - #1923: Validate function scope variable are at the start of the entry block. + +v2018.5 2018-09-07 + - General: + - Support SPV_KHR_vulkan_memory_model + - Update Dim capabilities, to match SPIR-V 1.3 Rev 4 + - Automated build bots no run tests for the VS2013 case - Support Chromium GN build - Use Kokoro bots: - Disable Travis-CI bots @@ -11,26 +102,48 @@ v2018.5-dev 2018-07-08 - Fixes for ClangTidy, and whitespace (passes 'git cl presumit --all -uf') - Fix unused param compile warnings/errors when Effcee not present - Avoid including time headers when timer functionality is disabled + - Avoid too-stringent warnings flags for Clang on Windows + - Internal refactoring + - Add hooks for automated fuzzing + - Add testing of command line executables - #1688: Use binary mode on stdin; fixes "spirv-dis git clone https://github.com/KhronosGroup/SPIRV-Headers.git external/spirv-headers +git clone https://github.com/google/effcee.git external/effcee +git clone https://github.com/google/re2.git external/re2 git clone https://github.com/google/googletest.git external/googletest # optional mkdir build && cd build @@ -269,7 +273,7 @@ The following CMake options are supported: See [`CMakeLists.txt`](CMakeLists.txt) for details. * `SPIRV_WERROR={ON|OFF}`, default `ON` - Forces a compilation error on any warnings encountered by enabling the compiler-specific compiler front-end - option. + option. No compiler front-end options are enabled when this option is OFF. Additionally, you can pass additional C preprocessor definitions to SPIRV-Tools via setting `SPIRV_TOOLS_EXTRA_DEFINITIONS`. For example, by setting it to diff --git a/3rdparty/spirv-tools/build/CMakeCache.txt b/3rdparty/spirv-tools/build/CMakeCache.txt new file mode 100644 index 000000000..6b6c2a04c --- /dev/null +++ b/3rdparty/spirv-tools/build/CMakeCache.txt @@ -0,0 +1,437 @@ +# This is the CMakeCache file. +# For build in directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build +# It was generated by CMake: /usr/bin/cmake +# You can edit this file to change values found and used by cmake. +# If you do not want to change any of the values, simply exit the editor. +# If you do want to change a value, simply edit, save, and exit the editor. +# The syntax for the file is as follows: +# KEY:TYPE=VALUE +# KEY is the name of a variable in the cache. +# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. +# VALUE is the current value for the KEY. + +######################## +# EXTERNAL cache entries +######################## + +//Path to a program. +CMAKE_AR:FILEPATH=/usr/bin/ar + +//Choose the type of build, options are: None(CMAKE_CXX_FLAGS or +// CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel. +CMAKE_BUILD_TYPE:STRING= + +//Enable/Disable color output during build. +CMAKE_COLOR_MAKEFILE:BOOL=ON + +//CXX compiler +CMAKE_CXX_COMPILER:FILEPATH=/usr/bin/c++ + +//Flags used by the compiler during all build types. +CMAKE_CXX_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_CXX_FLAGS_DEBUG:STRING=-g + +//Flags used by the compiler during release builds for minimum +// size. +CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds. +CMAKE_CXX_FLAGS_RELEASE:STRING=-O3 -DNDEBUG + +//Flags used by the compiler during release builds with debug info. +CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//C compiler +CMAKE_C_COMPILER:FILEPATH=/usr/bin/cc + +//Flags used by the compiler during all build types. +CMAKE_C_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_C_FLAGS_DEBUG:STRING=-g + +//Flags used by the compiler during release builds for minimum +// size. +CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds. +CMAKE_C_FLAGS_RELEASE:STRING=-O3 -DNDEBUG + +//Flags used by the compiler during release builds with debug info. +CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Flags used by the linker. +CMAKE_EXE_LINKER_FLAGS:STRING= + +//Flags used by the linker during debug builds. +CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during release minsize builds. +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during release builds. +CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during Release with Debug Info builds. +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Enable/Disable output of compile commands during generation. +CMAKE_EXPORT_COMPILE_COMMANDS:BOOL=OFF + +//user executables (bin) +CMAKE_INSTALL_BINDIR:PATH=bin + +//read-only architecture-independent data (DATAROOTDIR) +CMAKE_INSTALL_DATADIR:PATH= + +//read-only architecture-independent data root (share) +CMAKE_INSTALL_DATAROOTDIR:PATH=share + +//documentation root (DATAROOTDIR/doc/PROJECT_NAME) +CMAKE_INSTALL_DOCDIR:PATH= + +//C header files (include) +CMAKE_INSTALL_INCLUDEDIR:PATH=include + +//info documentation (DATAROOTDIR/info) +CMAKE_INSTALL_INFODIR:PATH= + +//object code libraries (lib) +CMAKE_INSTALL_LIBDIR:PATH=lib + +//program executables (libexec) +CMAKE_INSTALL_LIBEXECDIR:PATH=libexec + +//locale-dependent data (DATAROOTDIR/locale) +CMAKE_INSTALL_LOCALEDIR:PATH= + +//modifiable single-machine data (var) +CMAKE_INSTALL_LOCALSTATEDIR:PATH=var + +//man documentation (DATAROOTDIR/man) +CMAKE_INSTALL_MANDIR:PATH= + +//C header files for non-gcc (/usr/include) +CMAKE_INSTALL_OLDINCLUDEDIR:PATH=/usr/include + +//Install path prefix, prepended onto install directories. +CMAKE_INSTALL_PREFIX:PATH=/usr/local + +//system admin executables (sbin) +CMAKE_INSTALL_SBINDIR:PATH=sbin + +//modifiable architecture-independent data (com) +CMAKE_INSTALL_SHAREDSTATEDIR:PATH=com + +//read-only single-machine data (etc) +CMAKE_INSTALL_SYSCONFDIR:PATH=etc + +//Path to a program. +CMAKE_LINKER:FILEPATH=/usr/bin/ld + +//Path to a program. +CMAKE_MAKE_PROGRAM:FILEPATH=/usr/bin/make + +//Flags used by the linker during the creation of modules. +CMAKE_MODULE_LINKER_FLAGS:STRING= + +//Flags used by the linker during debug builds. +CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during release minsize builds. +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during release builds. +CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during Release with Debug Info builds. +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_NM:FILEPATH=/usr/bin/nm + +//Path to a program. +CMAKE_OBJCOPY:FILEPATH=/usr/bin/objcopy + +//Path to a program. +CMAKE_OBJDUMP:FILEPATH=/usr/bin/objdump + +//Value Computed by CMake +CMAKE_PROJECT_NAME:STATIC=spirv-tools + +//Path to a program. +CMAKE_RANLIB:FILEPATH=/usr/bin/ranlib + +//Flags used by the linker during the creation of dll's. +CMAKE_SHARED_LINKER_FLAGS:STRING= + +//Flags used by the linker during debug builds. +CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during release minsize builds. +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during release builds. +CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during Release with Debug Info builds. +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//If set, runtime paths are not added when installing shared libraries, +// but are added when building. +CMAKE_SKIP_INSTALL_RPATH:BOOL=NO + +//If set, runtime paths are not added when using shared libraries. +CMAKE_SKIP_RPATH:BOOL=NO + +//Flags used by the linker during the creation of static libraries. +CMAKE_STATIC_LINKER_FLAGS:STRING= + +//Flags used by the linker during debug builds. +CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during release minsize builds. +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during release builds. +CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during Release with Debug Info builds. +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_STRIP:FILEPATH=/usr/bin/strip + +//If this value is on, makefiles will be generated without the +// .SILENT directive, and all commands will be echoed to the console +// during the make. This is useful for debugging only. With Visual +// Studio IDE projects all commands are done without /nologo. +CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE + +//Path to a program. +NOSETESTS_EXE:FILEPATH=NOSETESTS_EXE-NOTFOUND + +//Path to a program. +PYTHON_EXECUTABLE:FILEPATH=/usr/bin/python + +//Run RE2 Tests +RE2_BUILD_TESTING:STRING=OFF + +//Skip installation +SKIP_SPIRV_TOOLS_INSTALL:BOOL=OFF + +//Dependencies for the target +SPIRV-Tools-link_LIB_DEPENDS:STATIC=general;SPIRV-Tools-opt; + +//Dependencies for the target +SPIRV-Tools-opt_LIB_DEPENDS:STATIC=general;SPIRV-Tools; + +//Dependencies for target +SPIRV-Tools-shared_LIB_DEPENDS:STATIC= + +//Dependencies for target +SPIRV-Tools_LIB_DEPENDS:STATIC= + +//Build SPIR-V compressing codec +SPIRV_BUILD_COMPRESSION:BOOL=OFF + +//In a debug build, check if the IR context is in a valid state. +SPIRV_CHECK_CONTEXT:BOOL=ON + +//Enable color terminal output +SPIRV_COLOR_TERMINAL:BOOL=ON + +//Enable excessive debug output +SPIRV_LOG_DEBUG:BOOL=OFF + +//Skip building the executable and tests along with the library +SPIRV_SKIP_EXECUTABLES:BOOL=OFF + +//Skip building tests along with the library +SPIRV_SKIP_TESTS:BOOL=OFF + +//Install Emacs helper to disassemble/assemble SPIR-V binaries +// on file load/save. +SPIRV_TOOLS_INSTALL_EMACS_HELPERS:BOOL=OFF + +//Enable -Weverything +SPIRV_WARN_EVERYTHING:BOOL=OFF + +//Enable error on warning +SPIRV_WERROR:BOOL=ON + +//Value Computed by CMake +spirv-tools_BINARY_DIR:STATIC=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + +//Value Computed by CMake +spirv-tools_SOURCE_DIR:STATIC=/home/bkaradzic/Private/projects/_github/SPIRV-Tools + + +######################## +# INTERNAL cache entries +######################## + +//ADVANCED property for variable: CMAKE_AR +CMAKE_AR-ADVANCED:INTERNAL=1 +//This is the directory where this CMakeCache.txt was created +CMAKE_CACHEFILE_DIR:INTERNAL=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build +//Major version of cmake used to create the current loaded cache +CMAKE_CACHE_MAJOR_VERSION:INTERNAL=3 +//Minor version of cmake used to create the current loaded cache +CMAKE_CACHE_MINOR_VERSION:INTERNAL=5 +//Patch version of cmake used to create the current loaded cache +CMAKE_CACHE_PATCH_VERSION:INTERNAL=1 +//ADVANCED property for variable: CMAKE_COLOR_MAKEFILE +CMAKE_COLOR_MAKEFILE-ADVANCED:INTERNAL=1 +//Path to CMake executable. +CMAKE_COMMAND:INTERNAL=/usr/bin/cmake +//Path to cpack program executable. +CMAKE_CPACK_COMMAND:INTERNAL=/usr/bin/cpack +//Path to ctest program executable. +CMAKE_CTEST_COMMAND:INTERNAL=/usr/bin/ctest +//ADVANCED property for variable: CMAKE_CXX_COMPILER +CMAKE_CXX_COMPILER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS +CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG +CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL +CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE +CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO +CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_COMPILER +CMAKE_C_COMPILER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS +CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG +CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL +CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE +CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO +CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//Executable file format +CMAKE_EXECUTABLE_FORMAT:INTERNAL=ELF +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS +CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG +CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE +CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXPORT_COMPILE_COMMANDS +CMAKE_EXPORT_COMPILE_COMMANDS-ADVANCED:INTERNAL=1 +//Name of external makefile project generator. +CMAKE_EXTRA_GENERATOR:INTERNAL= +//Name of generator. +CMAKE_GENERATOR:INTERNAL=Unix Makefiles +//Name of generator platform. +CMAKE_GENERATOR_PLATFORM:INTERNAL= +//Name of generator toolset. +CMAKE_GENERATOR_TOOLSET:INTERNAL= +//Source directory with the top level CMakeLists.txt file for this +// project +CMAKE_HOME_DIRECTORY:INTERNAL=/home/bkaradzic/Private/projects/_github/SPIRV-Tools +//ADVANCED property for variable: CMAKE_INSTALL_BINDIR +CMAKE_INSTALL_BINDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_DATADIR +CMAKE_INSTALL_DATADIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_DATAROOTDIR +CMAKE_INSTALL_DATAROOTDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_DOCDIR +CMAKE_INSTALL_DOCDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_INCLUDEDIR +CMAKE_INSTALL_INCLUDEDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_INFODIR +CMAKE_INSTALL_INFODIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_LIBDIR +CMAKE_INSTALL_LIBDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_LIBEXECDIR +CMAKE_INSTALL_LIBEXECDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_LOCALEDIR +CMAKE_INSTALL_LOCALEDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_LOCALSTATEDIR +CMAKE_INSTALL_LOCALSTATEDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_MANDIR +CMAKE_INSTALL_MANDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_OLDINCLUDEDIR +CMAKE_INSTALL_OLDINCLUDEDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_SBINDIR +CMAKE_INSTALL_SBINDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_SHAREDSTATEDIR +CMAKE_INSTALL_SHAREDSTATEDIR-ADVANCED:INTERNAL=1 +//Install .so files without execute permission. +CMAKE_INSTALL_SO_NO_EXE:INTERNAL=1 +//ADVANCED property for variable: CMAKE_INSTALL_SYSCONFDIR +CMAKE_INSTALL_SYSCONFDIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_LINKER +CMAKE_LINKER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MAKE_PROGRAM +CMAKE_MAKE_PROGRAM-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS +CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG +CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE +CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_NM +CMAKE_NM-ADVANCED:INTERNAL=1 +//number of local generators +CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=22 +//ADVANCED property for variable: CMAKE_OBJCOPY +CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJDUMP +CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_RANLIB +CMAKE_RANLIB-ADVANCED:INTERNAL=1 +//Path to CMake installation. +CMAKE_ROOT:INTERNAL=/usr/share/cmake-3.5 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS +CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG +CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE +CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH +CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_RPATH +CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS +CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG +CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE +CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STRIP +CMAKE_STRIP-ADVANCED:INTERNAL=1 +//uname command +CMAKE_UNAME:INTERNAL=/bin/uname +//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE +CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 +//Details about finding PythonInterp +FIND_PACKAGE_MESSAGE_DETAILS_PythonInterp:INTERNAL=[/usr/bin/python][v2.7.12()] +//ADVANCED property for variable: PYTHON_EXECUTABLE +PYTHON_EXECUTABLE-ADVANCED:INTERNAL=1 +//CMAKE_INSTALL_PREFIX during last run +_GNUInstallDirs_LAST_CMAKE_INSTALL_PREFIX:INTERNAL=/usr/local + diff --git a/3rdparty/spirv-tools/build/CMakeFiles/3.5.1/CMakeCCompiler.cmake b/3rdparty/spirv-tools/build/CMakeFiles/3.5.1/CMakeCCompiler.cmake new file mode 100644 index 000000000..08a8a2df7 --- /dev/null +++ b/3rdparty/spirv-tools/build/CMakeFiles/3.5.1/CMakeCCompiler.cmake @@ -0,0 +1,67 @@ +set(CMAKE_C_COMPILER "/usr/bin/cc") +set(CMAKE_C_COMPILER_ARG1 "") +set(CMAKE_C_COMPILER_ID "GNU") +set(CMAKE_C_COMPILER_VERSION "7.3.0") +set(CMAKE_C_COMPILER_WRAPPER "") +set(CMAKE_C_STANDARD_COMPUTED_DEFAULT "11") +set(CMAKE_C_COMPILE_FEATURES "c_function_prototypes;c_restrict;c_variadic_macros;c_static_assert") +set(CMAKE_C90_COMPILE_FEATURES "c_function_prototypes") +set(CMAKE_C99_COMPILE_FEATURES "c_restrict;c_variadic_macros") +set(CMAKE_C11_COMPILE_FEATURES "c_static_assert") + +set(CMAKE_C_PLATFORM_ID "Linux") +set(CMAKE_C_SIMULATE_ID "") +set(CMAKE_C_SIMULATE_VERSION "") + +set(CMAKE_AR "/usr/bin/ar") +set(CMAKE_RANLIB "/usr/bin/ranlib") +set(CMAKE_LINKER "/usr/bin/ld") +set(CMAKE_COMPILER_IS_GNUCC 1) +set(CMAKE_C_COMPILER_LOADED 1) +set(CMAKE_C_COMPILER_WORKS TRUE) +set(CMAKE_C_ABI_COMPILED TRUE) +set(CMAKE_COMPILER_IS_MINGW ) +set(CMAKE_COMPILER_IS_CYGWIN ) +if(CMAKE_COMPILER_IS_CYGWIN) + set(CYGWIN 1) + set(UNIX 1) +endif() + +set(CMAKE_C_COMPILER_ENV_VAR "CC") + +if(CMAKE_COMPILER_IS_MINGW) + set(MINGW 1) +endif() +set(CMAKE_C_COMPILER_ID_RUN 1) +set(CMAKE_C_SOURCE_FILE_EXTENSIONS c;m) +set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) +set(CMAKE_C_LINKER_PREFERENCE 10) + +# Save compiler ABI information. +set(CMAKE_C_SIZEOF_DATA_PTR "8") +set(CMAKE_C_COMPILER_ABI "ELF") +set(CMAKE_C_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") + +if(CMAKE_C_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_C_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}") +endif() + +if(CMAKE_C_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") +endif() + +set(CMAKE_C_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_C_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_C_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + +set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "c") +set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "/usr/lib/gcc/x86_64-linux-gnu/7;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib") +set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") diff --git a/3rdparty/spirv-tools/build/CMakeFiles/3.5.1/CMakeCXXCompiler.cmake b/3rdparty/spirv-tools/build/CMakeFiles/3.5.1/CMakeCXXCompiler.cmake new file mode 100644 index 000000000..7f67e5e04 --- /dev/null +++ b/3rdparty/spirv-tools/build/CMakeFiles/3.5.1/CMakeCXXCompiler.cmake @@ -0,0 +1,68 @@ +set(CMAKE_CXX_COMPILER "/usr/bin/c++") +set(CMAKE_CXX_COMPILER_ARG1 "") +set(CMAKE_CXX_COMPILER_ID "GNU") +set(CMAKE_CXX_COMPILER_VERSION "7.3.0") +set(CMAKE_CXX_COMPILER_WRAPPER "") +set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "14") +set(CMAKE_CXX_COMPILE_FEATURES "cxx_template_template_parameters;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") +set(CMAKE_CXX98_COMPILE_FEATURES "cxx_template_template_parameters") +set(CMAKE_CXX11_COMPILE_FEATURES "cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates") +set(CMAKE_CXX14_COMPILE_FEATURES "cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") + +set(CMAKE_CXX_PLATFORM_ID "Linux") +set(CMAKE_CXX_SIMULATE_ID "") +set(CMAKE_CXX_SIMULATE_VERSION "") + +set(CMAKE_AR "/usr/bin/ar") +set(CMAKE_RANLIB "/usr/bin/ranlib") +set(CMAKE_LINKER "/usr/bin/ld") +set(CMAKE_COMPILER_IS_GNUCXX 1) +set(CMAKE_CXX_COMPILER_LOADED 1) +set(CMAKE_CXX_COMPILER_WORKS TRUE) +set(CMAKE_CXX_ABI_COMPILED TRUE) +set(CMAKE_COMPILER_IS_MINGW ) +set(CMAKE_COMPILER_IS_CYGWIN ) +if(CMAKE_COMPILER_IS_CYGWIN) + set(CYGWIN 1) + set(UNIX 1) +endif() + +set(CMAKE_CXX_COMPILER_ENV_VAR "CXX") + +if(CMAKE_COMPILER_IS_MINGW) + set(MINGW 1) +endif() +set(CMAKE_CXX_COMPILER_ID_RUN 1) +set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC) +set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;mm;CPP) +set(CMAKE_CXX_LINKER_PREFERENCE 30) +set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1) + +# Save compiler ABI information. +set(CMAKE_CXX_SIZEOF_DATA_PTR "8") +set(CMAKE_CXX_COMPILER_ABI "ELF") +set(CMAKE_CXX_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") + +if(CMAKE_CXX_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_CXX_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}") +endif() + +if(CMAKE_CXX_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") +endif() + +set(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_CXX_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + +set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "stdc++;m;c") +set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "/usr/lib/gcc/x86_64-linux-gnu/7;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib") +set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") diff --git a/3rdparty/spirv-tools/build/CMakeFiles/3.5.1/CMakeDetermineCompilerABI_C.bin b/3rdparty/spirv-tools/build/CMakeFiles/3.5.1/CMakeDetermineCompilerABI_C.bin new file mode 100755 index 0000000000000000000000000000000000000000..84a836c10aad618572959b82a5cba1d15ccb120f GIT binary patch literal 8424 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 aaXnuAJiM>b`{m@ncd2FVUp9v}7XA%Du5tPR literal 0 HcmV?d00001 diff --git a/3rdparty/spirv-tools/build/CMakeFiles/3.5.1/CMakeDetermineCompilerABI_CXX.bin b/3rdparty/spirv-tools/build/CMakeFiles/3.5.1/CMakeDetermineCompilerABI_CXX.bin new file mode 100755 index 0000000000000000000000000000000000000000..e988a2ebfa83dc0b59d2aa90941b723a3e92776a GIT binary patch literal 8432 zcmeHMeQZI<5+=l~pi> zeTr>hWq_2zPvIpfjU35k;hLmd*ttNKz^~P50Ig1iXGlI^z>Fld5GB@^Pm0JIa&v{D zl7yac0D0KfS`Sx24)IJ*igrjs5)W16)d^mm;E_Bp8b*@(hke6ezwp=ZR6s*rLBZPj zGcVB=Q|}c$g!$!iu7Xr}hGeq=Gm^ynBJi-C|7!9I!#+{p-Nt26^pB)a*`v|Oa7*)} z(NKLf5>HRoPqwzyw=~PCgxtjYjsDSg=dJ->6OE$;8n(Fxez*p({9t^~Pmk~a$N1|D zN2_brHg7uJJO2$V!+Ay?4#li@+RYxSsc@H+tomjNQ?Lxjx(a^&z=iA2R0?{Vb118zv zm4H>-;DdlkHu(4Nf_DP$WworqJ5<2x6}V)<4|9ASYqj8gfJ@-VY99rBHPkRK)(x$X zuL54pJWLUI7<5ce!4Gk%OhJ`B!k;kSAiZo|Q9Ek^NBh4C`yImm5XURoxl%aj7L3FR8A+wJ(MUYPw9fu+Efh|M z$08{`ob2yzizedX{@`#l%(QSQs0V?9!f*o0SS%429yOr%Kt2?SYw1)tWcCiub?^{J za5$ABI#y>}+0L#`f1B1MH_4Cjju^dkz#Cxqhb9J&V{D}K`Uvb?PIg@A%T+@>hwn7L z3zTZbI>2{=#uCfand@%#aOsv65>pS&>!piZIrx@)0Za2K`&c!YWVh77vudLPIn>9| z;Dd`$wR+VWV=@#us^i&}{Hp z21Vv;*VRn=;@QA$EIAywuFh2*pFR)$syaFE2;3%Q(S+QFdUL+evv0TWDPJb*8}Rja z9ocfGOoGlFsYm%_XXaLC=0exQSNPnV`oy)k`%X5i9=f4Rjqg!=x-wV0GPl~nL$>A* z>db;e{p_{$Rdwbq_ufI@GrmFJKA*NQo3HaG%qRB;7C5zzf>pp+=dO;P?WxHAaAH&o zP3XzJ4XuONJ&p&5BYWX{kAP!?YX^QqO5wNsNj5tTvJRSu`%o6-Yamq^&2u16fb`;K z4hi>dOpg71%rWV8Y*<vu#z`^H8xU3xS-3@-Rr|_jteU^m}Swb_G1r zkrKbB?pvj*r{SeC)zdmt-tAG6o>rfy!RM*-dnB*}d%wrc+j$h|KLkJK_X=I!OZP_L z-U!?qf&ZrwSSnL^cjtu^+dq77jI>fnI`6F#I-Td}x=8n{4WbRSs5`0#8ew0kWfhz9r296i6PZ@CZkJm+W+RpLf_0tPD#w)DxhatcvvjdU;3CD}q+X2As;xAItZ|#411{ywa=DX$+r@L<2HY;5a|4(dx3R{HUK93`SkH7v z`y=3Xah?x^y*1ABA>elH{4KY)+22NzdP+}^j>;n}AF0vwm^Om3niK|T653caF&vC) zAw7{yX~Fa)8%e|_qG3H8lDD;NZL~MyF(56NOa`YQRHG-S*l02s3u~ctEH(uclcr%n zr@*wWJNR6Oy&VT8M5+N0#rRb2~QqVl#>Y_IF!TVVg-$dzzJyv)mTafgYr;A zFcuks>JvJ8hQ?t4Qik{;lVLr_V2$Qp>;E`|=V*ABU7@D-##eAvpezWyx50< zG)S8ak-M*u9m(gQ9Pa|8)46g|@Fl^wwqL+(KV-0}#HaJ;oZwSGg<91A7X{xh9MXN} zm<=EAJl64h8893ZY#%1N|D6+j>&Z(Dt6>b!4E)S|I`=LKzLc{xG87*t`5gz$$3|=F1gsIxqMw zT+2VK^}h~9W(*I}a|FE<^iBID=2V5LK;?q5385;$O>3MaMN}XWQApyEylLUnIZzUOYA3lN9_fFF3}V!NItMohqSYSTYEE}RL9D?H zqAvJ!E~H}OlUxl2R5#h692Xl;IT?yVi(0UD&HN$ixR|&Hp%B|h{h@sg-!HrRhweAL Ox#`6+R9>IRa`8`*plrwh literal 0 HcmV?d00001 diff --git a/3rdparty/spirv-tools/build/CMakeFiles/3.5.1/CMakeSystem.cmake b/3rdparty/spirv-tools/build/CMakeFiles/3.5.1/CMakeSystem.cmake new file mode 100644 index 000000000..daf4b4c75 --- /dev/null +++ b/3rdparty/spirv-tools/build/CMakeFiles/3.5.1/CMakeSystem.cmake @@ -0,0 +1,15 @@ +set(CMAKE_HOST_SYSTEM "Linux-4.15.0-36-generic") +set(CMAKE_HOST_SYSTEM_NAME "Linux") +set(CMAKE_HOST_SYSTEM_VERSION "4.15.0-36-generic") +set(CMAKE_HOST_SYSTEM_PROCESSOR "x86_64") + + + +set(CMAKE_SYSTEM "Linux-4.15.0-36-generic") +set(CMAKE_SYSTEM_NAME "Linux") +set(CMAKE_SYSTEM_VERSION "4.15.0-36-generic") +set(CMAKE_SYSTEM_PROCESSOR "x86_64") + +set(CMAKE_CROSSCOMPILING "FALSE") + +set(CMAKE_SYSTEM_LOADED 1) diff --git a/3rdparty/spirv-tools/build/CMakeFiles/3.5.1/CompilerIdC/CMakeCCompilerId.c b/3rdparty/spirv-tools/build/CMakeFiles/3.5.1/CompilerIdC/CMakeCCompilerId.c new file mode 100644 index 000000000..570a15e99 --- /dev/null +++ b/3rdparty/spirv-tools/build/CMakeFiles/3.5.1/CompilerIdC/CMakeCCompilerId.c @@ -0,0 +1,544 @@ +#ifdef __cplusplus +# error "A C++ compiler has been selected for C." +#endif + +#if defined(__18CXX) +# define ID_VOID_MAIN +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif + /* __INTEL_COMPILER = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_C) +# define COMPILER_ID "SunPro" +# if __SUNPRO_C >= 0x5100 + /* __SUNPRO_C = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# endif + +#elif defined(__HP_cc) +# define COMPILER_ID "HP" + /* __HP_cc = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) + +#elif defined(__DECC) +# define COMPILER_ID "Compaq" + /* __DECC_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) + +#elif defined(__IBMC__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ >= 800 +# define COMPILER_ID "XL" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__IBMC__) && !defined(__COMPILER_VER__) && __IBMC__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__FUJITSU) || defined(__FCC_VERSION) || defined(__fcc_version) +# define COMPILER_ID "Fujitsu" + +#elif defined(__TINYC__) +# define COMPILER_ID "TinyCC" + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__GNUC__) +# define COMPILER_ID "GNU" +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) +# define COMPILER_ID "ADSP" +#if defined(__VISUALDSPVERSION__) + /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ +# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) +# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__ ) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" + +#elif defined(__ARMCC_VERSION) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(SDCC) +# define COMPILER_ID "SDCC" + /* SDCC = VRP */ +# define COMPILER_VERSION_MAJOR DEC(SDCC/100) +# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) +# define COMPILER_VERSION_PATCH DEC(SDCC % 10) + +#elif defined(_SGI_COMPILER_VERSION) || defined(_COMPILER_VERSION) +# define COMPILER_ID "MIPSpro" +# if defined(_SGI_COMPILER_VERSION) + /* _SGI_COMPILER_VERSION = VRP */ +# define COMPILER_VERSION_MAJOR DEC(_SGI_COMPILER_VERSION/100) +# define COMPILER_VERSION_MINOR DEC(_SGI_COMPILER_VERSION/10 % 10) +# define COMPILER_VERSION_PATCH DEC(_SGI_COMPILER_VERSION % 10) +# else + /* _COMPILER_VERSION = VRP */ +# define COMPILER_VERSION_MAJOR DEC(_COMPILER_VERSION/100) +# define COMPILER_VERSION_MINOR DEC(_COMPILER_VERSION/10 % 10) +# define COMPILER_VERSION_PATCH DEC(_COMPILER_VERSION % 10) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__sgi) +# define COMPILER_ID "MIPSpro" + +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXE) || defined(__CRAYXC) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__sgi) || defined(__sgi__) || defined(_SGI) +# define PLATFORM_ID "IRIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# else /* unknown platform */ +# define PLATFORM_ID "" +# endif + +#else /* unknown platform */ +# define PLATFORM_ID "" + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID "" +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number components. */ +#ifdef COMPILER_VERSION_MAJOR +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + + +const char* info_language_dialect_default = "INFO" ":" "dialect_default[" +#if !defined(__STDC_VERSION__) + "90" +#elif __STDC_VERSION__ >= 201000L + "11" +#elif __STDC_VERSION__ >= 199901L + "99" +#else +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +#ifdef ID_VOID_MAIN +void main() {} +#else +int main(int argc, char* argv[]) +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXE) || defined(__CRAYXC) + require += info_cray[argc]; +#endif + require += info_language_dialect_default[argc]; + (void)argv; + return require; +} +#endif diff --git a/3rdparty/spirv-tools/build/CMakeFiles/3.5.1/CompilerIdC/a.out b/3rdparty/spirv-tools/build/CMakeFiles/3.5.1/CompilerIdC/a.out new file mode 100755 index 0000000000000000000000000000000000000000..815e3ee33d0997d1b54a5ac7a945c6bde294d2f0 GIT binary patch literal 8576 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 b?hmhP_>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_CC) +# define COMPILER_ID "SunPro" +# if __SUNPRO_CC >= 0x5100 + /* __SUNPRO_CC = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# endif + +#elif defined(__HP_aCC) +# define COMPILER_ID "HP" + /* __HP_aCC = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100) + +#elif defined(__DECCXX) +# define COMPILER_ID "Compaq" + /* __DECCXX_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000) + +#elif defined(__IBMCPP__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800 +# define COMPILER_ID "XL" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__FUJITSU) || defined(__FCC_VERSION) || defined(__fcc_version) +# define COMPILER_ID "Fujitsu" + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__GNUC__) +# define COMPILER_ID "GNU" +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) +# define COMPILER_ID "ADSP" +#if defined(__VISUALDSPVERSION__) + /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ +# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) +# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__ ) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" + +#elif defined(__ARMCC_VERSION) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(_SGI_COMPILER_VERSION) || defined(_COMPILER_VERSION) +# define COMPILER_ID "MIPSpro" +# if defined(_SGI_COMPILER_VERSION) + /* _SGI_COMPILER_VERSION = VRP */ +# define COMPILER_VERSION_MAJOR DEC(_SGI_COMPILER_VERSION/100) +# define COMPILER_VERSION_MINOR DEC(_SGI_COMPILER_VERSION/10 % 10) +# define COMPILER_VERSION_PATCH DEC(_SGI_COMPILER_VERSION % 10) +# else + /* _COMPILER_VERSION = VRP */ +# define COMPILER_VERSION_MAJOR DEC(_COMPILER_VERSION/100) +# define COMPILER_VERSION_MINOR DEC(_COMPILER_VERSION/10 % 10) +# define COMPILER_VERSION_PATCH DEC(_COMPILER_VERSION % 10) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__sgi) +# define COMPILER_ID "MIPSpro" + +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXE) || defined(__CRAYXC) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__sgi) || defined(__sgi__) || defined(_SGI) +# define PLATFORM_ID "IRIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# else /* unknown platform */ +# define PLATFORM_ID "" +# endif + +#else /* unknown platform */ +# define PLATFORM_ID "" + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID "" +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number components. */ +#ifdef COMPILER_VERSION_MAJOR +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + + +const char* info_language_dialect_default = "INFO" ":" "dialect_default[" +#if __cplusplus >= 201402L + "14" +#elif __cplusplus >= 201103L + "11" +#else + "98" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +int main(int argc, char* argv[]) +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXE) || defined(__CRAYXC) + require += info_cray[argc]; +#endif + require += info_language_dialect_default[argc]; + (void)argv; + return require; +} diff --git a/3rdparty/spirv-tools/build/CMakeFiles/3.5.1/CompilerIdCXX/a.out b/3rdparty/spirv-tools/build/CMakeFiles/3.5.1/CompilerIdCXX/a.out new file mode 100755 index 0000000000000000000000000000000000000000..d549690470b9021e1c93a55a67939635be061436 GIT binary patch literal 8592 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 literal 0 HcmV?d00001 diff --git a/3rdparty/spirv-tools/build/CMakeFiles/CMakeDirectoryInformation.cmake b/3rdparty/spirv-tools/build/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 000000000..b636c3f88 --- /dev/null +++ b/3rdparty/spirv-tools/build/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/bkaradzic/Private/projects/_github/SPIRV-Tools") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/3rdparty/spirv-tools/build/CMakeFiles/CMakeOutput.log b/3rdparty/spirv-tools/build/CMakeFiles/CMakeOutput.log new file mode 100644 index 000000000..a7aaa5970 --- /dev/null +++ b/3rdparty/spirv-tools/build/CMakeFiles/CMakeOutput.log @@ -0,0 +1,566 @@ +The system is: Linux - 4.15.0-36-generic - x86_64 +Compiling the C compiler identification source file "CMakeCCompilerId.c" succeeded. +Compiler: /usr/bin/cc +Build flags: +Id flags: + +The output was: +0 + + +Compilation of the C compiler identification source "CMakeCCompilerId.c" produced "a.out" + +The C compiler identification is GNU, found in "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/3.5.1/CompilerIdC/a.out" + +Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" succeeded. +Compiler: /usr/bin/c++ +Build flags: +Id flags: + +The output was: +0 + + +Compilation of the CXX compiler identification source "CMakeCXXCompilerId.cpp" produced "a.out" + +The CXX compiler identification is GNU, found in "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/3.5.1/CompilerIdCXX/a.out" + +Determining if the C compiler works passed with the following output: +Change Dir: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_29485/fast" +/usr/bin/make -f CMakeFiles/cmTC_29485.dir/build.make CMakeFiles/cmTC_29485.dir/build +make[1]: Entering directory '/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_29485.dir/testCCompiler.c.o +/usr/bin/cc -o CMakeFiles/cmTC_29485.dir/testCCompiler.c.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/CMakeTmp/testCCompiler.c +Linking C executable cmTC_29485 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_29485.dir/link.txt --verbose=1 +/usr/bin/cc CMakeFiles/cmTC_29485.dir/testCCompiler.c.o -o cmTC_29485 -rdynamic +make[1]: Leaving directory '/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/CMakeTmp' + + +Detecting C compiler ABI info compiled with the following output: +Change Dir: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_26ef8/fast" +/usr/bin/make -f CMakeFiles/cmTC_26ef8.dir/build.make CMakeFiles/cmTC_26ef8.dir/build +make[1]: Entering directory '/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_26ef8.dir/CMakeCCompilerABI.c.o +/usr/bin/cc -o CMakeFiles/cmTC_26ef8.dir/CMakeCCompilerABI.c.o -c /usr/share/cmake-3.5/Modules/CMakeCCompilerABI.c +Linking C executable cmTC_26ef8 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_26ef8.dir/link.txt --verbose=1 +/usr/bin/cc -v CMakeFiles/cmTC_26ef8.dir/CMakeCCompilerABI.c.o -o cmTC_26ef8 -rdynamic +Using built-in specs. +COLLECT_GCC=/usr/bin/cc +COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper +OFFLOAD_TARGET_NAMES=nvptx-none +OFFLOAD_TARGET_DEFAULT=1 +Target: x86_64-linux-gnu +Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.3.0-21ubuntu1~16.04' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu +Thread model: posix +gcc version 7.3.0 (Ubuntu 7.3.0-21ubuntu1~16.04) +COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/ +LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../:/lib/:/usr/lib/ +COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_26ef8' '-rdynamic' '-mtune=generic' '-march=x86-64' + /usr/lib/gcc/x86_64-linux-gnu/7/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/7/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper -plugin-opt=-fresolution=/tmp/ccQFAwlw.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -export-dynamic -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro -o cmTC_26ef8 /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/7/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/7 -L/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/7/../../.. CMakeFiles/cmTC_26ef8.dir/CMakeCCompilerABI.c.o -lgcc --push-state --as-needed -lgcc_s --pop-state -lc -lgcc --push-state --as-needed -lgcc_s --pop-state /usr/lib/gcc/x86_64-linux-gnu/7/crtend.o /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crtn.o +COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_26ef8' '-rdynamic' '-mtune=generic' '-march=x86-64' +make[1]: Leaving directory '/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/CMakeTmp' + + +Parsed C implicit link information from above output: + link line regex: [^( *|.*[/\])(ld|([^/\]+-)?ld|collect2)[^/\]*( |$)] + ignore line: [Change Dir: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/CMakeTmp] + ignore line: [] + ignore line: [Run Build Command:"/usr/bin/make" "cmTC_26ef8/fast"] + ignore line: [/usr/bin/make -f CMakeFiles/cmTC_26ef8.dir/build.make CMakeFiles/cmTC_26ef8.dir/build] + ignore line: [make[1]: Entering directory '/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/CMakeTmp'] + ignore line: [Building C object CMakeFiles/cmTC_26ef8.dir/CMakeCCompilerABI.c.o] + ignore line: [/usr/bin/cc -o CMakeFiles/cmTC_26ef8.dir/CMakeCCompilerABI.c.o -c /usr/share/cmake-3.5/Modules/CMakeCCompilerABI.c] + ignore line: [Linking C executable cmTC_26ef8] + ignore line: [/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_26ef8.dir/link.txt --verbose=1] + ignore line: [/usr/bin/cc -v CMakeFiles/cmTC_26ef8.dir/CMakeCCompilerABI.c.o -o cmTC_26ef8 -rdynamic ] + ignore line: [Using built-in specs.] + ignore line: [COLLECT_GCC=/usr/bin/cc] + ignore line: [COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper] + ignore line: [OFFLOAD_TARGET_NAMES=nvptx-none] + ignore line: [OFFLOAD_TARGET_DEFAULT=1] + ignore line: [Target: x86_64-linux-gnu] + ignore line: [Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.3.0-21ubuntu1~16.04' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu] + ignore line: [Thread model: posix] + ignore line: [gcc version 7.3.0 (Ubuntu 7.3.0-21ubuntu1~16.04) ] + ignore line: [COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/] + ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../:/lib/:/usr/lib/] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_26ef8' '-rdynamic' '-mtune=generic' '-march=x86-64'] + link line: [ /usr/lib/gcc/x86_64-linux-gnu/7/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/7/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper -plugin-opt=-fresolution=/tmp/ccQFAwlw.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -export-dynamic -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro -o cmTC_26ef8 /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/7/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/7 -L/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/7/../../.. CMakeFiles/cmTC_26ef8.dir/CMakeCCompilerABI.c.o -lgcc --push-state --as-needed -lgcc_s --pop-state -lc -lgcc --push-state --as-needed -lgcc_s --pop-state /usr/lib/gcc/x86_64-linux-gnu/7/crtend.o /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crtn.o] + arg [/usr/lib/gcc/x86_64-linux-gnu/7/collect2] ==> ignore + arg [-plugin] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/7/liblto_plugin.so] ==> ignore + arg [-plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper] ==> ignore + arg [-plugin-opt=-fresolution=/tmp/ccQFAwlw.res] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore + arg [-plugin-opt=-pass-through=-lc] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore + arg [--sysroot=/] ==> ignore + arg [--build-id] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [-m] ==> ignore + arg [elf_x86_64] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [--as-needed] ==> ignore + arg [-export-dynamic] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/lib64/ld-linux-x86-64.so.2] ==> ignore + arg [-zrelro] ==> ignore + arg [-o] ==> ignore + arg [cmTC_26ef8] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crt1.o] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crti.o] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/7/crtbegin.o] ==> ignore + arg [-L/usr/lib/gcc/x86_64-linux-gnu/7] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/7] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib] + arg [-L/lib/x86_64-linux-gnu] ==> dir [/lib/x86_64-linux-gnu] + arg [-L/lib/../lib] ==> dir [/lib/../lib] + arg [-L/usr/lib/x86_64-linux-gnu] ==> dir [/usr/lib/x86_64-linux-gnu] + arg [-L/usr/lib/../lib] ==> dir [/usr/lib/../lib] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/7/../../..] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/7/../../..] + arg [CMakeFiles/cmTC_26ef8.dir/CMakeCCompilerABI.c.o] ==> ignore + arg [-lgcc] ==> lib [gcc] + arg [--push-state] ==> ignore + arg [--as-needed] ==> ignore + arg [-lgcc_s] ==> lib [gcc_s] + arg [--pop-state] ==> ignore + arg [-lc] ==> lib [c] + arg [-lgcc] ==> lib [gcc] + arg [--push-state] ==> ignore + arg [--as-needed] ==> ignore + arg [-lgcc_s] ==> lib [gcc_s] + arg [--pop-state] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/7/crtend.o] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crtn.o] ==> ignore + remove lib [gcc] + remove lib [gcc_s] + remove lib [gcc] + remove lib [gcc_s] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/7] ==> [/usr/lib/gcc/x86_64-linux-gnu/7] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu] ==> [/usr/lib/x86_64-linux-gnu] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib] ==> [/usr/lib] + collapse library dir [/lib/x86_64-linux-gnu] ==> [/lib/x86_64-linux-gnu] + collapse library dir [/lib/../lib] ==> [/lib] + collapse library dir [/usr/lib/x86_64-linux-gnu] ==> [/usr/lib/x86_64-linux-gnu] + collapse library dir [/usr/lib/../lib] ==> [/usr/lib] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/7/../../..] ==> [/usr/lib] + implicit libs: [c] + implicit dirs: [/usr/lib/gcc/x86_64-linux-gnu/7;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib] + implicit fwks: [] + + + + +Detecting C [-std=c11] compiler features compiled with the following output: +Change Dir: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_4dd30/fast" +/usr/bin/make -f CMakeFiles/cmTC_4dd30.dir/build.make CMakeFiles/cmTC_4dd30.dir/build +make[1]: Entering directory '/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_4dd30.dir/feature_tests.c.o +/usr/bin/cc -std=c11 -o CMakeFiles/cmTC_4dd30.dir/feature_tests.c.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/feature_tests.c +Linking C executable cmTC_4dd30 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_4dd30.dir/link.txt --verbose=1 +/usr/bin/cc CMakeFiles/cmTC_4dd30.dir/feature_tests.c.o -o cmTC_4dd30 -rdynamic +make[1]: Leaving directory '/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/CMakeTmp' + + + Feature record: C_FEATURE:1c_function_prototypes + Feature record: C_FEATURE:1c_restrict + Feature record: C_FEATURE:1c_static_assert + Feature record: C_FEATURE:1c_variadic_macros + + +Detecting C [-std=c99] compiler features compiled with the following output: +Change Dir: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_51ae2/fast" +/usr/bin/make -f CMakeFiles/cmTC_51ae2.dir/build.make CMakeFiles/cmTC_51ae2.dir/build +make[1]: Entering directory '/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_51ae2.dir/feature_tests.c.o +/usr/bin/cc -std=c99 -o CMakeFiles/cmTC_51ae2.dir/feature_tests.c.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/feature_tests.c +Linking C executable cmTC_51ae2 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_51ae2.dir/link.txt --verbose=1 +/usr/bin/cc CMakeFiles/cmTC_51ae2.dir/feature_tests.c.o -o cmTC_51ae2 -rdynamic +make[1]: Leaving directory '/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/CMakeTmp' + + + Feature record: C_FEATURE:1c_function_prototypes + Feature record: C_FEATURE:1c_restrict + Feature record: C_FEATURE:0c_static_assert + Feature record: C_FEATURE:1c_variadic_macros + + +Detecting C [-std=c90] compiler features compiled with the following output: +Change Dir: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_511a5/fast" +/usr/bin/make -f CMakeFiles/cmTC_511a5.dir/build.make CMakeFiles/cmTC_511a5.dir/build +make[1]: Entering directory '/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/CMakeTmp' +Building C object CMakeFiles/cmTC_511a5.dir/feature_tests.c.o +/usr/bin/cc -std=c90 -o CMakeFiles/cmTC_511a5.dir/feature_tests.c.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/feature_tests.c +Linking C executable cmTC_511a5 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_511a5.dir/link.txt --verbose=1 +/usr/bin/cc CMakeFiles/cmTC_511a5.dir/feature_tests.c.o -o cmTC_511a5 -rdynamic +make[1]: Leaving directory '/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/CMakeTmp' + + + Feature record: C_FEATURE:1c_function_prototypes + Feature record: C_FEATURE:0c_restrict + Feature record: C_FEATURE:0c_static_assert + Feature record: C_FEATURE:0c_variadic_macros +Determining if the CXX compiler works passed with the following output: +Change Dir: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_10dab/fast" +/usr/bin/make -f CMakeFiles/cmTC_10dab.dir/build.make CMakeFiles/cmTC_10dab.dir/build +make[1]: Entering directory '/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_10dab.dir/testCXXCompiler.cxx.o +/usr/bin/c++ -o CMakeFiles/cmTC_10dab.dir/testCXXCompiler.cxx.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/CMakeTmp/testCXXCompiler.cxx +Linking CXX executable cmTC_10dab +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_10dab.dir/link.txt --verbose=1 +/usr/bin/c++ CMakeFiles/cmTC_10dab.dir/testCXXCompiler.cxx.o -o cmTC_10dab -rdynamic +make[1]: Leaving directory '/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/CMakeTmp' + + +Detecting CXX compiler ABI info compiled with the following output: +Change Dir: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_3fb04/fast" +/usr/bin/make -f CMakeFiles/cmTC_3fb04.dir/build.make CMakeFiles/cmTC_3fb04.dir/build +make[1]: Entering directory '/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_3fb04.dir/CMakeCXXCompilerABI.cpp.o +/usr/bin/c++ -o CMakeFiles/cmTC_3fb04.dir/CMakeCXXCompilerABI.cpp.o -c /usr/share/cmake-3.5/Modules/CMakeCXXCompilerABI.cpp +Linking CXX executable cmTC_3fb04 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_3fb04.dir/link.txt --verbose=1 +/usr/bin/c++ -v CMakeFiles/cmTC_3fb04.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_3fb04 -rdynamic +Using built-in specs. +COLLECT_GCC=/usr/bin/c++ +COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper +OFFLOAD_TARGET_NAMES=nvptx-none +OFFLOAD_TARGET_DEFAULT=1 +Target: x86_64-linux-gnu +Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.3.0-21ubuntu1~16.04' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu +Thread model: posix +gcc version 7.3.0 (Ubuntu 7.3.0-21ubuntu1~16.04) +COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/ +LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../:/lib/:/usr/lib/ +COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_3fb04' '-rdynamic' '-shared-libgcc' '-mtune=generic' '-march=x86-64' + /usr/lib/gcc/x86_64-linux-gnu/7/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/7/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper -plugin-opt=-fresolution=/tmp/cc1abdYG.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -export-dynamic -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro -o cmTC_3fb04 /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/7/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/7 -L/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/7/../../.. CMakeFiles/cmTC_3fb04.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/7/crtend.o /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crtn.o +COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_3fb04' '-rdynamic' '-shared-libgcc' '-mtune=generic' '-march=x86-64' +make[1]: Leaving directory '/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/CMakeTmp' + + +Parsed CXX implicit link information from above output: + link line regex: [^( *|.*[/\])(ld|([^/\]+-)?ld|collect2)[^/\]*( |$)] + ignore line: [Change Dir: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/CMakeTmp] + ignore line: [] + ignore line: [Run Build Command:"/usr/bin/make" "cmTC_3fb04/fast"] + ignore line: [/usr/bin/make -f CMakeFiles/cmTC_3fb04.dir/build.make CMakeFiles/cmTC_3fb04.dir/build] + ignore line: [make[1]: Entering directory '/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/CMakeTmp'] + ignore line: [Building CXX object CMakeFiles/cmTC_3fb04.dir/CMakeCXXCompilerABI.cpp.o] + ignore line: [/usr/bin/c++ -o CMakeFiles/cmTC_3fb04.dir/CMakeCXXCompilerABI.cpp.o -c /usr/share/cmake-3.5/Modules/CMakeCXXCompilerABI.cpp] + ignore line: [Linking CXX executable cmTC_3fb04] + ignore line: [/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_3fb04.dir/link.txt --verbose=1] + ignore line: [/usr/bin/c++ -v CMakeFiles/cmTC_3fb04.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_3fb04 -rdynamic ] + ignore line: [Using built-in specs.] + ignore line: [COLLECT_GCC=/usr/bin/c++] + ignore line: [COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper] + ignore line: [OFFLOAD_TARGET_NAMES=nvptx-none] + ignore line: [OFFLOAD_TARGET_DEFAULT=1] + ignore line: [Target: x86_64-linux-gnu] + ignore line: [Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.3.0-21ubuntu1~16.04' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu] + ignore line: [Thread model: posix] + ignore line: [gcc version 7.3.0 (Ubuntu 7.3.0-21ubuntu1~16.04) ] + ignore line: [COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/] + ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/7/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/7/../../../:/lib/:/usr/lib/] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_3fb04' '-rdynamic' '-shared-libgcc' '-mtune=generic' '-march=x86-64'] + link line: [ /usr/lib/gcc/x86_64-linux-gnu/7/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/7/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper -plugin-opt=-fresolution=/tmp/cc1abdYG.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -export-dynamic -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro -o cmTC_3fb04 /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/7/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/7 -L/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/7/../../.. CMakeFiles/cmTC_3fb04.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/7/crtend.o /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crtn.o] + arg [/usr/lib/gcc/x86_64-linux-gnu/7/collect2] ==> ignore + arg [-plugin] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/7/liblto_plugin.so] ==> ignore + arg [-plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper] ==> ignore + arg [-plugin-opt=-fresolution=/tmp/cc1abdYG.res] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc] ==> ignore + arg [-plugin-opt=-pass-through=-lc] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc] ==> ignore + arg [--sysroot=/] ==> ignore + arg [--build-id] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [-m] ==> ignore + arg [elf_x86_64] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [--as-needed] ==> ignore + arg [-export-dynamic] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/lib64/ld-linux-x86-64.so.2] ==> ignore + arg [-zrelro] ==> ignore + arg [-o] ==> ignore + arg [cmTC_3fb04] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crt1.o] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crti.o] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/7/crtbegin.o] ==> ignore + arg [-L/usr/lib/gcc/x86_64-linux-gnu/7] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/7] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib] + arg [-L/lib/x86_64-linux-gnu] ==> dir [/lib/x86_64-linux-gnu] + arg [-L/lib/../lib] ==> dir [/lib/../lib] + arg [-L/usr/lib/x86_64-linux-gnu] ==> dir [/usr/lib/x86_64-linux-gnu] + arg [-L/usr/lib/../lib] ==> dir [/usr/lib/../lib] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/7/../../..] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/7/../../..] + arg [CMakeFiles/cmTC_3fb04.dir/CMakeCXXCompilerABI.cpp.o] ==> ignore + arg [-lstdc++] ==> lib [stdc++] + arg [-lm] ==> lib [m] + arg [-lgcc_s] ==> lib [gcc_s] + arg [-lgcc] ==> lib [gcc] + arg [-lc] ==> lib [c] + arg [-lgcc_s] ==> lib [gcc_s] + arg [-lgcc] ==> lib [gcc] + arg [/usr/lib/gcc/x86_64-linux-gnu/7/crtend.o] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crtn.o] ==> ignore + remove lib [gcc_s] + remove lib [gcc] + remove lib [gcc_s] + remove lib [gcc] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/7] ==> [/usr/lib/gcc/x86_64-linux-gnu/7] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu] ==> [/usr/lib/x86_64-linux-gnu] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib] ==> [/usr/lib] + collapse library dir [/lib/x86_64-linux-gnu] ==> [/lib/x86_64-linux-gnu] + collapse library dir [/lib/../lib] ==> [/lib] + collapse library dir [/usr/lib/x86_64-linux-gnu] ==> [/usr/lib/x86_64-linux-gnu] + collapse library dir [/usr/lib/../lib] ==> [/usr/lib] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/7/../../..] ==> [/usr/lib] + implicit libs: [stdc++;m;c] + implicit dirs: [/usr/lib/gcc/x86_64-linux-gnu/7;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib] + implicit fwks: [] + + + + +Detecting CXX [-std=c++14] compiler features compiled with the following output: +Change Dir: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_9a032/fast" +/usr/bin/make -f CMakeFiles/cmTC_9a032.dir/build.make CMakeFiles/cmTC_9a032.dir/build +make[1]: Entering directory '/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_9a032.dir/feature_tests.cxx.o +/usr/bin/c++ -std=c++14 -o CMakeFiles/cmTC_9a032.dir/feature_tests.cxx.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/feature_tests.cxx +Linking CXX executable cmTC_9a032 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_9a032.dir/link.txt --verbose=1 +/usr/bin/c++ CMakeFiles/cmTC_9a032.dir/feature_tests.cxx.o -o cmTC_9a032 -rdynamic +make[1]: Leaving directory '/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/CMakeTmp' + + + Feature record: CXX_FEATURE:1cxx_aggregate_default_initializers + Feature record: CXX_FEATURE:1cxx_alias_templates + Feature record: CXX_FEATURE:1cxx_alignas + Feature record: CXX_FEATURE:1cxx_alignof + Feature record: CXX_FEATURE:1cxx_attributes + Feature record: CXX_FEATURE:1cxx_attribute_deprecated + Feature record: CXX_FEATURE:1cxx_auto_type + Feature record: CXX_FEATURE:1cxx_binary_literals + Feature record: CXX_FEATURE:1cxx_constexpr + Feature record: CXX_FEATURE:1cxx_contextual_conversions + Feature record: CXX_FEATURE:1cxx_decltype + Feature record: CXX_FEATURE:1cxx_decltype_auto + Feature record: CXX_FEATURE:1cxx_decltype_incomplete_return_types + Feature record: CXX_FEATURE:1cxx_default_function_template_args + Feature record: CXX_FEATURE:1cxx_defaulted_functions + Feature record: CXX_FEATURE:1cxx_defaulted_move_initializers + Feature record: CXX_FEATURE:1cxx_delegating_constructors + Feature record: CXX_FEATURE:1cxx_deleted_functions + Feature record: CXX_FEATURE:1cxx_digit_separators + Feature record: CXX_FEATURE:1cxx_enum_forward_declarations + Feature record: CXX_FEATURE:1cxx_explicit_conversions + Feature record: CXX_FEATURE:1cxx_extended_friend_declarations + Feature record: CXX_FEATURE:1cxx_extern_templates + Feature record: CXX_FEATURE:1cxx_final + Feature record: CXX_FEATURE:1cxx_func_identifier + Feature record: CXX_FEATURE:1cxx_generalized_initializers + Feature record: CXX_FEATURE:1cxx_generic_lambdas + Feature record: CXX_FEATURE:1cxx_inheriting_constructors + Feature record: CXX_FEATURE:1cxx_inline_namespaces + Feature record: CXX_FEATURE:1cxx_lambdas + Feature record: CXX_FEATURE:1cxx_lambda_init_captures + Feature record: CXX_FEATURE:1cxx_local_type_template_args + Feature record: CXX_FEATURE:1cxx_long_long_type + Feature record: CXX_FEATURE:1cxx_noexcept + Feature record: CXX_FEATURE:1cxx_nonstatic_member_init + Feature record: CXX_FEATURE:1cxx_nullptr + Feature record: CXX_FEATURE:1cxx_override + Feature record: CXX_FEATURE:1cxx_range_for + Feature record: CXX_FEATURE:1cxx_raw_string_literals + Feature record: CXX_FEATURE:1cxx_reference_qualified_functions + Feature record: CXX_FEATURE:1cxx_relaxed_constexpr + Feature record: CXX_FEATURE:1cxx_return_type_deduction + Feature record: CXX_FEATURE:1cxx_right_angle_brackets + Feature record: CXX_FEATURE:1cxx_rvalue_references + Feature record: CXX_FEATURE:1cxx_sizeof_member + Feature record: CXX_FEATURE:1cxx_static_assert + Feature record: CXX_FEATURE:1cxx_strong_enums + Feature record: CXX_FEATURE:1cxx_template_template_parameters + Feature record: CXX_FEATURE:1cxx_thread_local + Feature record: CXX_FEATURE:1cxx_trailing_return_types + Feature record: CXX_FEATURE:1cxx_unicode_literals + Feature record: CXX_FEATURE:1cxx_uniform_initialization + Feature record: CXX_FEATURE:1cxx_unrestricted_unions + Feature record: CXX_FEATURE:1cxx_user_literals + Feature record: CXX_FEATURE:1cxx_variable_templates + Feature record: CXX_FEATURE:1cxx_variadic_macros + Feature record: CXX_FEATURE:1cxx_variadic_templates + + +Detecting CXX [-std=c++11] compiler features compiled with the following output: +Change Dir: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_086c5/fast" +/usr/bin/make -f CMakeFiles/cmTC_086c5.dir/build.make CMakeFiles/cmTC_086c5.dir/build +make[1]: Entering directory '/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_086c5.dir/feature_tests.cxx.o +/usr/bin/c++ -std=c++11 -o CMakeFiles/cmTC_086c5.dir/feature_tests.cxx.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/feature_tests.cxx +Linking CXX executable cmTC_086c5 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_086c5.dir/link.txt --verbose=1 +/usr/bin/c++ CMakeFiles/cmTC_086c5.dir/feature_tests.cxx.o -o cmTC_086c5 -rdynamic +make[1]: Leaving directory '/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/CMakeTmp' + + + Feature record: CXX_FEATURE:0cxx_aggregate_default_initializers + Feature record: CXX_FEATURE:1cxx_alias_templates + Feature record: CXX_FEATURE:1cxx_alignas + Feature record: CXX_FEATURE:1cxx_alignof + Feature record: CXX_FEATURE:1cxx_attributes + Feature record: CXX_FEATURE:0cxx_attribute_deprecated + Feature record: CXX_FEATURE:1cxx_auto_type + Feature record: CXX_FEATURE:0cxx_binary_literals + Feature record: CXX_FEATURE:1cxx_constexpr + Feature record: CXX_FEATURE:0cxx_contextual_conversions + Feature record: CXX_FEATURE:1cxx_decltype + Feature record: CXX_FEATURE:0cxx_decltype_auto + Feature record: CXX_FEATURE:1cxx_decltype_incomplete_return_types + Feature record: CXX_FEATURE:1cxx_default_function_template_args + Feature record: CXX_FEATURE:1cxx_defaulted_functions + Feature record: CXX_FEATURE:1cxx_defaulted_move_initializers + Feature record: CXX_FEATURE:1cxx_delegating_constructors + Feature record: CXX_FEATURE:1cxx_deleted_functions + Feature record: CXX_FEATURE:0cxx_digit_separators + Feature record: CXX_FEATURE:1cxx_enum_forward_declarations + Feature record: CXX_FEATURE:1cxx_explicit_conversions + Feature record: CXX_FEATURE:1cxx_extended_friend_declarations + Feature record: CXX_FEATURE:1cxx_extern_templates + Feature record: CXX_FEATURE:1cxx_final + Feature record: CXX_FEATURE:1cxx_func_identifier + Feature record: CXX_FEATURE:1cxx_generalized_initializers + Feature record: CXX_FEATURE:0cxx_generic_lambdas + Feature record: CXX_FEATURE:1cxx_inheriting_constructors + Feature record: CXX_FEATURE:1cxx_inline_namespaces + Feature record: CXX_FEATURE:1cxx_lambdas + Feature record: CXX_FEATURE:0cxx_lambda_init_captures + Feature record: CXX_FEATURE:1cxx_local_type_template_args + Feature record: CXX_FEATURE:1cxx_long_long_type + Feature record: CXX_FEATURE:1cxx_noexcept + Feature record: CXX_FEATURE:1cxx_nonstatic_member_init + Feature record: CXX_FEATURE:1cxx_nullptr + Feature record: CXX_FEATURE:1cxx_override + Feature record: CXX_FEATURE:1cxx_range_for + Feature record: CXX_FEATURE:1cxx_raw_string_literals + Feature record: CXX_FEATURE:1cxx_reference_qualified_functions + Feature record: CXX_FEATURE:0cxx_relaxed_constexpr + Feature record: CXX_FEATURE:0cxx_return_type_deduction + Feature record: CXX_FEATURE:1cxx_right_angle_brackets + Feature record: CXX_FEATURE:1cxx_rvalue_references + Feature record: CXX_FEATURE:1cxx_sizeof_member + Feature record: CXX_FEATURE:1cxx_static_assert + Feature record: CXX_FEATURE:1cxx_strong_enums + Feature record: CXX_FEATURE:1cxx_template_template_parameters + Feature record: CXX_FEATURE:1cxx_thread_local + Feature record: CXX_FEATURE:1cxx_trailing_return_types + Feature record: CXX_FEATURE:1cxx_unicode_literals + Feature record: CXX_FEATURE:1cxx_uniform_initialization + Feature record: CXX_FEATURE:1cxx_unrestricted_unions + Feature record: CXX_FEATURE:1cxx_user_literals + Feature record: CXX_FEATURE:0cxx_variable_templates + Feature record: CXX_FEATURE:1cxx_variadic_macros + Feature record: CXX_FEATURE:1cxx_variadic_templates + + +Detecting CXX [-std=c++98] compiler features compiled with the following output: +Change Dir: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_7f9e5/fast" +/usr/bin/make -f CMakeFiles/cmTC_7f9e5.dir/build.make CMakeFiles/cmTC_7f9e5.dir/build +make[1]: Entering directory '/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_7f9e5.dir/feature_tests.cxx.o +/usr/bin/c++ -std=c++98 -o CMakeFiles/cmTC_7f9e5.dir/feature_tests.cxx.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/feature_tests.cxx +Linking CXX executable cmTC_7f9e5 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_7f9e5.dir/link.txt --verbose=1 +/usr/bin/c++ CMakeFiles/cmTC_7f9e5.dir/feature_tests.cxx.o -o cmTC_7f9e5 -rdynamic +make[1]: Leaving directory '/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/CMakeTmp' + + + Feature record: CXX_FEATURE:0cxx_aggregate_default_initializers + Feature record: CXX_FEATURE:0cxx_alias_templates + Feature record: CXX_FEATURE:0cxx_alignas + Feature record: CXX_FEATURE:0cxx_alignof + Feature record: CXX_FEATURE:0cxx_attributes + Feature record: CXX_FEATURE:0cxx_attribute_deprecated + Feature record: CXX_FEATURE:0cxx_auto_type + Feature record: CXX_FEATURE:0cxx_binary_literals + Feature record: CXX_FEATURE:0cxx_constexpr + Feature record: CXX_FEATURE:0cxx_contextual_conversions + Feature record: CXX_FEATURE:0cxx_decltype + Feature record: CXX_FEATURE:0cxx_decltype_auto + Feature record: CXX_FEATURE:0cxx_decltype_incomplete_return_types + Feature record: CXX_FEATURE:0cxx_default_function_template_args + Feature record: CXX_FEATURE:0cxx_defaulted_functions + Feature record: CXX_FEATURE:0cxx_defaulted_move_initializers + Feature record: CXX_FEATURE:0cxx_delegating_constructors + Feature record: CXX_FEATURE:0cxx_deleted_functions + Feature record: CXX_FEATURE:0cxx_digit_separators + Feature record: CXX_FEATURE:0cxx_enum_forward_declarations + Feature record: CXX_FEATURE:0cxx_explicit_conversions + Feature record: CXX_FEATURE:0cxx_extended_friend_declarations + Feature record: CXX_FEATURE:0cxx_extern_templates + Feature record: CXX_FEATURE:0cxx_final + Feature record: CXX_FEATURE:0cxx_func_identifier + Feature record: CXX_FEATURE:0cxx_generalized_initializers + Feature record: CXX_FEATURE:0cxx_generic_lambdas + Feature record: CXX_FEATURE:0cxx_inheriting_constructors + Feature record: CXX_FEATURE:0cxx_inline_namespaces + Feature record: CXX_FEATURE:0cxx_lambdas + Feature record: CXX_FEATURE:0cxx_lambda_init_captures + Feature record: CXX_FEATURE:0cxx_local_type_template_args + Feature record: CXX_FEATURE:0cxx_long_long_type + Feature record: CXX_FEATURE:0cxx_noexcept + Feature record: CXX_FEATURE:0cxx_nonstatic_member_init + Feature record: CXX_FEATURE:0cxx_nullptr + Feature record: CXX_FEATURE:0cxx_override + Feature record: CXX_FEATURE:0cxx_range_for + Feature record: CXX_FEATURE:0cxx_raw_string_literals + Feature record: CXX_FEATURE:0cxx_reference_qualified_functions + Feature record: CXX_FEATURE:0cxx_relaxed_constexpr + Feature record: CXX_FEATURE:0cxx_return_type_deduction + Feature record: CXX_FEATURE:0cxx_right_angle_brackets + Feature record: CXX_FEATURE:0cxx_rvalue_references + Feature record: CXX_FEATURE:0cxx_sizeof_member + Feature record: CXX_FEATURE:0cxx_static_assert + Feature record: CXX_FEATURE:0cxx_strong_enums + Feature record: CXX_FEATURE:1cxx_template_template_parameters + Feature record: CXX_FEATURE:0cxx_thread_local + Feature record: CXX_FEATURE:0cxx_trailing_return_types + Feature record: CXX_FEATURE:0cxx_unicode_literals + Feature record: CXX_FEATURE:0cxx_uniform_initialization + Feature record: CXX_FEATURE:0cxx_unrestricted_unions + Feature record: CXX_FEATURE:0cxx_user_literals + Feature record: CXX_FEATURE:0cxx_variable_templates + Feature record: CXX_FEATURE:0cxx_variadic_macros + Feature record: CXX_FEATURE:0cxx_variadic_templates diff --git a/3rdparty/spirv-tools/build/CMakeFiles/CMakeRuleHashes.txt b/3rdparty/spirv-tools/build/CMakeFiles/CMakeRuleHashes.txt new file mode 100644 index 000000000..24df65417 --- /dev/null +++ b/3rdparty/spirv-tools/build/CMakeFiles/CMakeRuleHashes.txt @@ -0,0 +1,24 @@ +# Hashes of file build rules. +a3a67ea3d224fda21fd5a52538aac45e CMakeFiles/spirv-tools-pkg-config +e0651873fcee64545700dd83cf425d7d CMakeFiles/spirv-tools-shared-pkg-config +c4bbdb4ddc901c2270fe08710c6d7296 DebugInfo.h +5896e8e3f9b3d42d3ca7be3c26e73115 build-version.inc +831c4409dccccfbe3caf54e152aeab9a core.insts-unified1.inc +e82743ac5171b193e896f59fda57456a debuginfo.insts.inc +3c535b06d6924a641a46b65343e372c8 extension_enum.inc +e5ee8fcfaf5e0d0ee14e42827f5a28d7 generators.inc +c9648bb7599ab3c63c9cbf3f63105dc3 glsl.std.450.insts.inc +ca9006b7e8de20db43363fbdf4154a32 opencl.std.insts.inc +fbc7975cd1db0b770eb5a317b85548b4 source/CMakeFiles/spirv-tools-build-version +fbc7975cd1db0b770eb5a317b85548b4 source/CMakeFiles/spirv-tools-debuginfo +fbc7975cd1db0b770eb5a317b85548b4 source/CMakeFiles/spirv-tools-header-DebugInfo +fbc7975cd1db0b770eb5a317b85548b4 source/CMakeFiles/spirv-tools-spv-amd-gcn-shader +fbc7975cd1db0b770eb5a317b85548b4 source/CMakeFiles/spirv-tools-spv-amd-shader-ballot +fbc7975cd1db0b770eb5a317b85548b4 source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter +fbc7975cd1db0b770eb5a317b85548b4 source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax +fbc7975cd1db0b770eb5a317b85548b4 source/CMakeFiles/spirv-tools-vimsyntax +c691cb79776968d34fbe636de95762ba spv-amd-gcn-shader.insts.inc +98898bc0b78e884c61f122035917814a spv-amd-shader-ballot.insts.inc +887286f1e7d97d480c4ca2319a7a28ea spv-amd-shader-explicit-vertex-parameter.insts.inc +95834c67f02254c5ea078b11a2de5321 spv-amd-shader-trinary-minmax.insts.inc +b5344da2df0958bc57287a90ddcfaaef spvasm.vim diff --git a/3rdparty/spirv-tools/build/CMakeFiles/Makefile.cmake b/3rdparty/spirv-tools/build/CMakeFiles/Makefile.cmake new file mode 100644 index 000000000..1cd86f106 --- /dev/null +++ b/3rdparty/spirv-tools/build/CMakeFiles/Makefile.cmake @@ -0,0 +1,183 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# The generator used is: +set(CMAKE_DEPENDS_GENERATOR "Unix Makefiles") + +# The top level Makefile was generated from the following files: +set(CMAKE_MAKEFILE_DEPENDS + "CMakeCache.txt" + "../CMakeLists.txt" + "CMakeFiles/3.5.1/CMakeCCompiler.cmake" + "CMakeFiles/3.5.1/CMakeCXXCompiler.cmake" + "CMakeFiles/3.5.1/CMakeSystem.cmake" + "CMakeFiles/feature_tests.c" + "CMakeFiles/feature_tests.cxx" + "../cmake/setup_build.cmake" + "../examples/CMakeLists.txt" + "../examples/cpp-interface/CMakeLists.txt" + "../external/CMakeLists.txt" + "../source/CMakeLists.txt" + "../source/comp/CMakeLists.txt" + "../source/link/CMakeLists.txt" + "../source/opt/CMakeLists.txt" + "../test/CMakeLists.txt" + "../test/comp/CMakeLists.txt" + "../test/link/CMakeLists.txt" + "../test/opt/CMakeLists.txt" + "../test/opt/dominator_tree/CMakeLists.txt" + "../test/opt/loop_optimizations/CMakeLists.txt" + "../test/stats/CMakeLists.txt" + "../test/tools/CMakeLists.txt" + "../test/tools/opt/CMakeLists.txt" + "../test/util/CMakeLists.txt" + "../test/val/CMakeLists.txt" + "../tools/CMakeLists.txt" + "../tools/emacs/CMakeLists.txt" + "../tools/lesspipe/CMakeLists.txt" + "/usr/share/cmake-3.5/Modules/CMakeCCompiler.cmake.in" + "/usr/share/cmake-3.5/Modules/CMakeCCompilerABI.c" + "/usr/share/cmake-3.5/Modules/CMakeCInformation.cmake" + "/usr/share/cmake-3.5/Modules/CMakeCXXCompiler.cmake.in" + "/usr/share/cmake-3.5/Modules/CMakeCXXCompilerABI.cpp" + "/usr/share/cmake-3.5/Modules/CMakeCXXInformation.cmake" + "/usr/share/cmake-3.5/Modules/CMakeCommonLanguageInclude.cmake" + "/usr/share/cmake-3.5/Modules/CMakeCompilerIdDetection.cmake" + "/usr/share/cmake-3.5/Modules/CMakeDetermineCCompiler.cmake" + "/usr/share/cmake-3.5/Modules/CMakeDetermineCXXCompiler.cmake" + "/usr/share/cmake-3.5/Modules/CMakeDetermineCompileFeatures.cmake" + "/usr/share/cmake-3.5/Modules/CMakeDetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/CMakeDetermineCompilerABI.cmake" + "/usr/share/cmake-3.5/Modules/CMakeDetermineCompilerId.cmake" + "/usr/share/cmake-3.5/Modules/CMakeDetermineSystem.cmake" + "/usr/share/cmake-3.5/Modules/CMakeFindBinUtils.cmake" + "/usr/share/cmake-3.5/Modules/CMakeGenericSystem.cmake" + "/usr/share/cmake-3.5/Modules/CMakeLanguageInformation.cmake" + "/usr/share/cmake-3.5/Modules/CMakeParseArguments.cmake" + "/usr/share/cmake-3.5/Modules/CMakeParseImplicitLinkInfo.cmake" + "/usr/share/cmake-3.5/Modules/CMakeSystem.cmake.in" + "/usr/share/cmake-3.5/Modules/CMakeSystemSpecificInformation.cmake" + "/usr/share/cmake-3.5/Modules/CMakeSystemSpecificInitialize.cmake" + "/usr/share/cmake-3.5/Modules/CMakeTestCCompiler.cmake" + "/usr/share/cmake-3.5/Modules/CMakeTestCXXCompiler.cmake" + "/usr/share/cmake-3.5/Modules/CMakeTestCompilerCommon.cmake" + "/usr/share/cmake-3.5/Modules/CMakeUnixFindMake.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/ADSP-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/ARMCC-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/AppleClang-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/Borland-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/Clang-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/Clang-DetermineCompilerInternal.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/Comeau-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/Compaq-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/Compaq-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/Cray-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/Embarcadero-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/Fujitsu-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/GHS-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/GNU-C-FeatureTests.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/GNU-C.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/GNU-CXX-FeatureTests.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/GNU-CXX.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/GNU-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/GNU.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/HP-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/HP-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/IAR-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/IBMCPP-C-DetermineVersionInternal.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/IBMCPP-CXX-DetermineVersionInternal.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/Intel-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/MIPSpro-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/MSVC-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/OpenWatcom-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/PGI-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/PathScale-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/SCO-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/SDCC-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/SunPro-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/SunPro-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/TI-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/TinyCC-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/VisualAge-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/VisualAge-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/Watcom-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/XL-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/XL-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/zOS-C-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/Compiler/zOS-CXX-DetermineCompiler.cmake" + "/usr/share/cmake-3.5/Modules/FindPackageHandleStandardArgs.cmake" + "/usr/share/cmake-3.5/Modules/FindPackageMessage.cmake" + "/usr/share/cmake-3.5/Modules/FindPythonInterp.cmake" + "/usr/share/cmake-3.5/Modules/GNUInstallDirs.cmake" + "/usr/share/cmake-3.5/Modules/Internal/FeatureTesting.cmake" + "/usr/share/cmake-3.5/Modules/MultiArchCross.cmake" + "/usr/share/cmake-3.5/Modules/Platform/Linux-CXX.cmake" + "/usr/share/cmake-3.5/Modules/Platform/Linux-GNU-C.cmake" + "/usr/share/cmake-3.5/Modules/Platform/Linux-GNU-CXX.cmake" + "/usr/share/cmake-3.5/Modules/Platform/Linux-GNU.cmake" + "/usr/share/cmake-3.5/Modules/Platform/Linux.cmake" + "/usr/share/cmake-3.5/Modules/Platform/UnixPaths.cmake" + ) + +# The corresponding makefile is: +set(CMAKE_MAKEFILE_OUTPUTS + "Makefile" + "CMakeFiles/cmake.check_cache" + ) + +# Byproducts of CMake generate step: +set(CMAKE_MAKEFILE_PRODUCTS + "CMakeFiles/3.5.1/CMakeSystem.cmake" + "CMakeFiles/3.5.1/CMakeCCompiler.cmake" + "CMakeFiles/3.5.1/CMakeCXXCompiler.cmake" + "CMakeFiles/3.5.1/CMakeCCompiler.cmake" + "CMakeFiles/3.5.1/CMakeCXXCompiler.cmake" + "CMakeFiles/CMakeDirectoryInformation.cmake" + "external/CMakeFiles/CMakeDirectoryInformation.cmake" + "source/CMakeFiles/CMakeDirectoryInformation.cmake" + "source/comp/CMakeFiles/CMakeDirectoryInformation.cmake" + "source/opt/CMakeFiles/CMakeDirectoryInformation.cmake" + "source/link/CMakeFiles/CMakeDirectoryInformation.cmake" + "tools/CMakeFiles/CMakeDirectoryInformation.cmake" + "tools/lesspipe/CMakeFiles/CMakeDirectoryInformation.cmake" + "tools/emacs/CMakeFiles/CMakeDirectoryInformation.cmake" + "test/CMakeFiles/CMakeDirectoryInformation.cmake" + "test/comp/CMakeFiles/CMakeDirectoryInformation.cmake" + "test/link/CMakeFiles/CMakeDirectoryInformation.cmake" + "test/opt/CMakeFiles/CMakeDirectoryInformation.cmake" + "test/opt/dominator_tree/CMakeFiles/CMakeDirectoryInformation.cmake" + "test/opt/loop_optimizations/CMakeFiles/CMakeDirectoryInformation.cmake" + "test/stats/CMakeFiles/CMakeDirectoryInformation.cmake" + "test/tools/CMakeFiles/CMakeDirectoryInformation.cmake" + "test/tools/opt/CMakeFiles/CMakeDirectoryInformation.cmake" + "test/util/CMakeFiles/CMakeDirectoryInformation.cmake" + "test/val/CMakeFiles/CMakeDirectoryInformation.cmake" + "examples/CMakeFiles/CMakeDirectoryInformation.cmake" + "examples/cpp-interface/CMakeFiles/CMakeDirectoryInformation.cmake" + ) + +# Dependency information for all targets: +set(CMAKE_DEPEND_INFO_FILES + "CMakeFiles/spirv-tools-shared-pkg-config.dir/DependInfo.cmake" + "CMakeFiles/spirv-tools-pkg-config.dir/DependInfo.cmake" + "source/CMakeFiles/spirv-tools-debuginfo.dir/DependInfo.cmake" + "source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/DependInfo.cmake" + "source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/DependInfo.cmake" + "source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/DependInfo.cmake" + "source/CMakeFiles/spirv-tools-header-DebugInfo.dir/DependInfo.cmake" + "source/CMakeFiles/spirv-tools-build-version.dir/DependInfo.cmake" + "source/CMakeFiles/SPIRV-Tools.dir/DependInfo.cmake" + "source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/DependInfo.cmake" + "source/CMakeFiles/SPIRV-Tools-shared.dir/DependInfo.cmake" + "source/CMakeFiles/spirv-tools-vimsyntax.dir/DependInfo.cmake" + "source/opt/CMakeFiles/SPIRV-Tools-opt.dir/DependInfo.cmake" + "source/link/CMakeFiles/SPIRV-Tools-link.dir/DependInfo.cmake" + "tools/CMakeFiles/spirv-cfg.dir/DependInfo.cmake" + "tools/CMakeFiles/spirv-dis.dir/DependInfo.cmake" + "tools/CMakeFiles/spirv-as.dir/DependInfo.cmake" + "tools/CMakeFiles/spirv-val.dir/DependInfo.cmake" + "tools/CMakeFiles/spirv-link.dir/DependInfo.cmake" + "tools/CMakeFiles/spirv-opt.dir/DependInfo.cmake" + "tools/CMakeFiles/spirv-stats.dir/DependInfo.cmake" + "examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/DependInfo.cmake" + ) diff --git a/3rdparty/spirv-tools/build/CMakeFiles/Makefile2 b/3rdparty/spirv-tools/build/CMakeFiles/Makefile2 new file mode 100644 index 000000000..462840811 --- /dev/null +++ b/3rdparty/spirv-tools/build/CMakeFiles/Makefile2 @@ -0,0 +1,1284 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Default target executed when no arguments are given to make. +default_target: all + +.PHONY : default_target + +# The main recursive all target +all: + +.PHONY : all + +# The main recursive preinstall target +preinstall: + +.PHONY : preinstall + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + +#============================================================================= +# Target rules for target CMakeFiles/spirv-tools-shared-pkg-config.dir + +# All Build rule for target. +CMakeFiles/spirv-tools-shared-pkg-config.dir/all: + $(MAKE) -f CMakeFiles/spirv-tools-shared-pkg-config.dir/build.make CMakeFiles/spirv-tools-shared-pkg-config.dir/depend + $(MAKE) -f CMakeFiles/spirv-tools-shared-pkg-config.dir/build.make CMakeFiles/spirv-tools-shared-pkg-config.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num= "Built target spirv-tools-shared-pkg-config" +.PHONY : CMakeFiles/spirv-tools-shared-pkg-config.dir/all + +# Include target in all. +all: CMakeFiles/spirv-tools-shared-pkg-config.dir/all + +.PHONY : all + +# Build rule for subdir invocation for target. +CMakeFiles/spirv-tools-shared-pkg-config.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 + $(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/spirv-tools-shared-pkg-config.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 +.PHONY : CMakeFiles/spirv-tools-shared-pkg-config.dir/rule + +# Convenience name for target. +spirv-tools-shared-pkg-config: CMakeFiles/spirv-tools-shared-pkg-config.dir/rule + +.PHONY : spirv-tools-shared-pkg-config + +# clean rule for target. +CMakeFiles/spirv-tools-shared-pkg-config.dir/clean: + $(MAKE) -f CMakeFiles/spirv-tools-shared-pkg-config.dir/build.make CMakeFiles/spirv-tools-shared-pkg-config.dir/clean +.PHONY : CMakeFiles/spirv-tools-shared-pkg-config.dir/clean + +# clean rule for target. +clean: CMakeFiles/spirv-tools-shared-pkg-config.dir/clean + +.PHONY : clean + +#============================================================================= +# Target rules for target CMakeFiles/spirv-tools-pkg-config.dir + +# All Build rule for target. +CMakeFiles/spirv-tools-pkg-config.dir/all: + $(MAKE) -f CMakeFiles/spirv-tools-pkg-config.dir/build.make CMakeFiles/spirv-tools-pkg-config.dir/depend + $(MAKE) -f CMakeFiles/spirv-tools-pkg-config.dir/build.make CMakeFiles/spirv-tools-pkg-config.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num= "Built target spirv-tools-pkg-config" +.PHONY : CMakeFiles/spirv-tools-pkg-config.dir/all + +# Include target in all. +all: CMakeFiles/spirv-tools-pkg-config.dir/all + +.PHONY : all + +# Build rule for subdir invocation for target. +CMakeFiles/spirv-tools-pkg-config.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 + $(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/spirv-tools-pkg-config.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 +.PHONY : CMakeFiles/spirv-tools-pkg-config.dir/rule + +# Convenience name for target. +spirv-tools-pkg-config: CMakeFiles/spirv-tools-pkg-config.dir/rule + +.PHONY : spirv-tools-pkg-config + +# clean rule for target. +CMakeFiles/spirv-tools-pkg-config.dir/clean: + $(MAKE) -f CMakeFiles/spirv-tools-pkg-config.dir/build.make CMakeFiles/spirv-tools-pkg-config.dir/clean +.PHONY : CMakeFiles/spirv-tools-pkg-config.dir/clean + +# clean rule for target. +clean: CMakeFiles/spirv-tools-pkg-config.dir/clean + +.PHONY : clean + +#============================================================================= +# Directory level rules for directory external + +# Convenience name for "all" pass in the directory. +external/all: + +.PHONY : external/all + +# Convenience name for "clean" pass in the directory. +external/clean: + +.PHONY : external/clean + +# Convenience name for "preinstall" pass in the directory. +external/preinstall: + +.PHONY : external/preinstall + +#============================================================================= +# Directory level rules for directory source + +# Convenience name for "all" pass in the directory. +source/all: source/CMakeFiles/SPIRV-Tools.dir/all +source/all: source/CMakeFiles/SPIRV-Tools-shared.dir/all +source/all: source/comp/all +source/all: source/opt/all +source/all: source/link/all + +.PHONY : source/all + +# Convenience name for "clean" pass in the directory. +source/clean: source/CMakeFiles/spirv-tools-debuginfo.dir/clean +source/clean: source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/clean +source/clean: source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/clean +source/clean: source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/clean +source/clean: source/CMakeFiles/spirv-tools-header-DebugInfo.dir/clean +source/clean: source/CMakeFiles/spirv-tools-build-version.dir/clean +source/clean: source/CMakeFiles/SPIRV-Tools.dir/clean +source/clean: source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/clean +source/clean: source/CMakeFiles/SPIRV-Tools-shared.dir/clean +source/clean: source/CMakeFiles/spirv-tools-vimsyntax.dir/clean +source/clean: source/comp/clean +source/clean: source/opt/clean +source/clean: source/link/clean + +.PHONY : source/clean + +# Convenience name for "preinstall" pass in the directory. +source/preinstall: source/comp/preinstall +source/preinstall: source/opt/preinstall +source/preinstall: source/link/preinstall + +.PHONY : source/preinstall + +#============================================================================= +# Target rules for target source/CMakeFiles/spirv-tools-debuginfo.dir + +# All Build rule for target. +source/CMakeFiles/spirv-tools-debuginfo.dir/all: + $(MAKE) -f source/CMakeFiles/spirv-tools-debuginfo.dir/build.make source/CMakeFiles/spirv-tools-debuginfo.dir/depend + $(MAKE) -f source/CMakeFiles/spirv-tools-debuginfo.dir/build.make source/CMakeFiles/spirv-tools-debuginfo.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num= "Built target spirv-tools-debuginfo" +.PHONY : source/CMakeFiles/spirv-tools-debuginfo.dir/all + +# Build rule for subdir invocation for target. +source/CMakeFiles/spirv-tools-debuginfo.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 + $(MAKE) -f CMakeFiles/Makefile2 source/CMakeFiles/spirv-tools-debuginfo.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 +.PHONY : source/CMakeFiles/spirv-tools-debuginfo.dir/rule + +# Convenience name for target. +spirv-tools-debuginfo: source/CMakeFiles/spirv-tools-debuginfo.dir/rule + +.PHONY : spirv-tools-debuginfo + +# clean rule for target. +source/CMakeFiles/spirv-tools-debuginfo.dir/clean: + $(MAKE) -f source/CMakeFiles/spirv-tools-debuginfo.dir/build.make source/CMakeFiles/spirv-tools-debuginfo.dir/clean +.PHONY : source/CMakeFiles/spirv-tools-debuginfo.dir/clean + +# clean rule for target. +clean: source/CMakeFiles/spirv-tools-debuginfo.dir/clean + +.PHONY : clean + +#============================================================================= +# Target rules for target source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir + +# All Build rule for target. +source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/all: + $(MAKE) -f source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/build.make source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/depend + $(MAKE) -f source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/build.make source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num= "Built target spirv-tools-spv-amd-shader-ballot" +.PHONY : source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/all + +# Build rule for subdir invocation for target. +source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 + $(MAKE) -f CMakeFiles/Makefile2 source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 +.PHONY : source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/rule + +# Convenience name for target. +spirv-tools-spv-amd-shader-ballot: source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/rule + +.PHONY : spirv-tools-spv-amd-shader-ballot + +# clean rule for target. +source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/clean: + $(MAKE) -f source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/build.make source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/clean +.PHONY : source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/clean + +# clean rule for target. +clean: source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/clean + +.PHONY : clean + +#============================================================================= +# Target rules for target source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir + +# All Build rule for target. +source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/all: + $(MAKE) -f source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/build.make source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/depend + $(MAKE) -f source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/build.make source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num= "Built target spirv-tools-spv-amd-shader-trinary-minmax" +.PHONY : source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/all + +# Build rule for subdir invocation for target. +source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 + $(MAKE) -f CMakeFiles/Makefile2 source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 +.PHONY : source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/rule + +# Convenience name for target. +spirv-tools-spv-amd-shader-trinary-minmax: source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/rule + +.PHONY : spirv-tools-spv-amd-shader-trinary-minmax + +# clean rule for target. +source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/clean: + $(MAKE) -f source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/build.make source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/clean +.PHONY : source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/clean + +# clean rule for target. +clean: source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/clean + +.PHONY : clean + +#============================================================================= +# Target rules for target source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir + +# All Build rule for target. +source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/all: + $(MAKE) -f source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/build.make source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/depend + $(MAKE) -f source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/build.make source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num= "Built target spirv-tools-spv-amd-gcn-shader" +.PHONY : source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/all + +# Build rule for subdir invocation for target. +source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 + $(MAKE) -f CMakeFiles/Makefile2 source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 +.PHONY : source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/rule + +# Convenience name for target. +spirv-tools-spv-amd-gcn-shader: source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/rule + +.PHONY : spirv-tools-spv-amd-gcn-shader + +# clean rule for target. +source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/clean: + $(MAKE) -f source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/build.make source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/clean +.PHONY : source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/clean + +# clean rule for target. +clean: source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/clean + +.PHONY : clean + +#============================================================================= +# Target rules for target source/CMakeFiles/spirv-tools-header-DebugInfo.dir + +# All Build rule for target. +source/CMakeFiles/spirv-tools-header-DebugInfo.dir/all: + $(MAKE) -f source/CMakeFiles/spirv-tools-header-DebugInfo.dir/build.make source/CMakeFiles/spirv-tools-header-DebugInfo.dir/depend + $(MAKE) -f source/CMakeFiles/spirv-tools-header-DebugInfo.dir/build.make source/CMakeFiles/spirv-tools-header-DebugInfo.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=97 "Built target spirv-tools-header-DebugInfo" +.PHONY : source/CMakeFiles/spirv-tools-header-DebugInfo.dir/all + +# Build rule for subdir invocation for target. +source/CMakeFiles/spirv-tools-header-DebugInfo.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 1 + $(MAKE) -f CMakeFiles/Makefile2 source/CMakeFiles/spirv-tools-header-DebugInfo.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 +.PHONY : source/CMakeFiles/spirv-tools-header-DebugInfo.dir/rule + +# Convenience name for target. +spirv-tools-header-DebugInfo: source/CMakeFiles/spirv-tools-header-DebugInfo.dir/rule + +.PHONY : spirv-tools-header-DebugInfo + +# clean rule for target. +source/CMakeFiles/spirv-tools-header-DebugInfo.dir/clean: + $(MAKE) -f source/CMakeFiles/spirv-tools-header-DebugInfo.dir/build.make source/CMakeFiles/spirv-tools-header-DebugInfo.dir/clean +.PHONY : source/CMakeFiles/spirv-tools-header-DebugInfo.dir/clean + +# clean rule for target. +clean: source/CMakeFiles/spirv-tools-header-DebugInfo.dir/clean + +.PHONY : clean + +#============================================================================= +# Target rules for target source/CMakeFiles/spirv-tools-build-version.dir + +# All Build rule for target. +source/CMakeFiles/spirv-tools-build-version.dir/all: + $(MAKE) -f source/CMakeFiles/spirv-tools-build-version.dir/build.make source/CMakeFiles/spirv-tools-build-version.dir/depend + $(MAKE) -f source/CMakeFiles/spirv-tools-build-version.dir/build.make source/CMakeFiles/spirv-tools-build-version.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num= "Built target spirv-tools-build-version" +.PHONY : source/CMakeFiles/spirv-tools-build-version.dir/all + +# Build rule for subdir invocation for target. +source/CMakeFiles/spirv-tools-build-version.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 + $(MAKE) -f CMakeFiles/Makefile2 source/CMakeFiles/spirv-tools-build-version.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 +.PHONY : source/CMakeFiles/spirv-tools-build-version.dir/rule + +# Convenience name for target. +spirv-tools-build-version: source/CMakeFiles/spirv-tools-build-version.dir/rule + +.PHONY : spirv-tools-build-version + +# clean rule for target. +source/CMakeFiles/spirv-tools-build-version.dir/clean: + $(MAKE) -f source/CMakeFiles/spirv-tools-build-version.dir/build.make source/CMakeFiles/spirv-tools-build-version.dir/clean +.PHONY : source/CMakeFiles/spirv-tools-build-version.dir/clean + +# clean rule for target. +clean: source/CMakeFiles/spirv-tools-build-version.dir/clean + +.PHONY : clean + +#============================================================================= +# Target rules for target source/CMakeFiles/SPIRV-Tools.dir + +# All Build rule for target. +source/CMakeFiles/SPIRV-Tools.dir/all: + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/depend + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28 "Built target SPIRV-Tools" +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/all + +# Include target in all. +all: source/CMakeFiles/SPIRV-Tools.dir/all + +.PHONY : all + +# Build rule for subdir invocation for target. +source/CMakeFiles/SPIRV-Tools.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 28 + $(MAKE) -f CMakeFiles/Makefile2 source/CMakeFiles/SPIRV-Tools.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/rule + +# Convenience name for target. +SPIRV-Tools: source/CMakeFiles/SPIRV-Tools.dir/rule + +.PHONY : SPIRV-Tools + +# clean rule for target. +source/CMakeFiles/SPIRV-Tools.dir/clean: + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/clean +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/clean + +# clean rule for target. +clean: source/CMakeFiles/SPIRV-Tools.dir/clean + +.PHONY : clean + +#============================================================================= +# Target rules for target source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir + +# All Build rule for target. +source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/all: + $(MAKE) -f source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/build.make source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/depend + $(MAKE) -f source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/build.make source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=98 "Built target spirv-tools-spv-amd-shader-explicit-vertex-parameter" +.PHONY : source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/all + +# Build rule for subdir invocation for target. +source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 1 + $(MAKE) -f CMakeFiles/Makefile2 source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 +.PHONY : source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/rule + +# Convenience name for target. +spirv-tools-spv-amd-shader-explicit-vertex-parameter: source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/rule + +.PHONY : spirv-tools-spv-amd-shader-explicit-vertex-parameter + +# clean rule for target. +source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/clean: + $(MAKE) -f source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/build.make source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/clean +.PHONY : source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/clean + +# clean rule for target. +clean: source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/clean + +.PHONY : clean + +#============================================================================= +# Target rules for target source/CMakeFiles/SPIRV-Tools-shared.dir + +# All Build rule for target. +source/CMakeFiles/SPIRV-Tools-shared.dir/all: + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/depend + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89 "Built target SPIRV-Tools-shared" +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/all + +# Include target in all. +all: source/CMakeFiles/SPIRV-Tools-shared.dir/all + +.PHONY : all + +# Build rule for subdir invocation for target. +source/CMakeFiles/SPIRV-Tools-shared.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 29 + $(MAKE) -f CMakeFiles/Makefile2 source/CMakeFiles/SPIRV-Tools-shared.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/rule + +# Convenience name for target. +SPIRV-Tools-shared: source/CMakeFiles/SPIRV-Tools-shared.dir/rule + +.PHONY : SPIRV-Tools-shared + +# clean rule for target. +source/CMakeFiles/SPIRV-Tools-shared.dir/clean: + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/clean +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/clean + +# clean rule for target. +clean: source/CMakeFiles/SPIRV-Tools-shared.dir/clean + +.PHONY : clean + +#============================================================================= +# Target rules for target source/CMakeFiles/spirv-tools-vimsyntax.dir + +# All Build rule for target. +source/CMakeFiles/spirv-tools-vimsyntax.dir/all: + $(MAKE) -f source/CMakeFiles/spirv-tools-vimsyntax.dir/build.make source/CMakeFiles/spirv-tools-vimsyntax.dir/depend + $(MAKE) -f source/CMakeFiles/spirv-tools-vimsyntax.dir/build.make source/CMakeFiles/spirv-tools-vimsyntax.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num= "Built target spirv-tools-vimsyntax" +.PHONY : source/CMakeFiles/spirv-tools-vimsyntax.dir/all + +# Build rule for subdir invocation for target. +source/CMakeFiles/spirv-tools-vimsyntax.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 + $(MAKE) -f CMakeFiles/Makefile2 source/CMakeFiles/spirv-tools-vimsyntax.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 +.PHONY : source/CMakeFiles/spirv-tools-vimsyntax.dir/rule + +# Convenience name for target. +spirv-tools-vimsyntax: source/CMakeFiles/spirv-tools-vimsyntax.dir/rule + +.PHONY : spirv-tools-vimsyntax + +# clean rule for target. +source/CMakeFiles/spirv-tools-vimsyntax.dir/clean: + $(MAKE) -f source/CMakeFiles/spirv-tools-vimsyntax.dir/build.make source/CMakeFiles/spirv-tools-vimsyntax.dir/clean +.PHONY : source/CMakeFiles/spirv-tools-vimsyntax.dir/clean + +# clean rule for target. +clean: source/CMakeFiles/spirv-tools-vimsyntax.dir/clean + +.PHONY : clean + +#============================================================================= +# Directory level rules for directory source/comp + +# Convenience name for "all" pass in the directory. +source/comp/all: + +.PHONY : source/comp/all + +# Convenience name for "clean" pass in the directory. +source/comp/clean: + +.PHONY : source/comp/clean + +# Convenience name for "preinstall" pass in the directory. +source/comp/preinstall: + +.PHONY : source/comp/preinstall + +#============================================================================= +# Directory level rules for directory source/opt + +# Convenience name for "all" pass in the directory. +source/opt/all: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/all + +.PHONY : source/opt/all + +# Convenience name for "clean" pass in the directory. +source/opt/clean: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/clean + +.PHONY : source/opt/clean + +# Convenience name for "preinstall" pass in the directory. +source/opt/preinstall: + +.PHONY : source/opt/preinstall + +#============================================================================= +# Target rules for target source/opt/CMakeFiles/SPIRV-Tools-opt.dir + +# All Build rule for target. +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/all: source/CMakeFiles/SPIRV-Tools.dir/all + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/depend + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60 "Built target SPIRV-Tools-opt" +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/all + +# Include target in all. +all: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/all + +.PHONY : all + +# Build rule for subdir invocation for target. +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 59 + $(MAKE) -f CMakeFiles/Makefile2 source/opt/CMakeFiles/SPIRV-Tools-opt.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/rule + +# Convenience name for target. +SPIRV-Tools-opt: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/rule + +.PHONY : SPIRV-Tools-opt + +# clean rule for target. +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/clean: + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/clean +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/clean + +# clean rule for target. +clean: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/clean + +.PHONY : clean + +#============================================================================= +# Directory level rules for directory source/link + +# Convenience name for "all" pass in the directory. +source/link/all: source/link/CMakeFiles/SPIRV-Tools-link.dir/all + +.PHONY : source/link/all + +# Convenience name for "clean" pass in the directory. +source/link/clean: source/link/CMakeFiles/SPIRV-Tools-link.dir/clean + +.PHONY : source/link/clean + +# Convenience name for "preinstall" pass in the directory. +source/link/preinstall: + +.PHONY : source/link/preinstall + +#============================================================================= +# Target rules for target source/link/CMakeFiles/SPIRV-Tools-link.dir + +# All Build rule for target. +source/link/CMakeFiles/SPIRV-Tools-link.dir/all: source/CMakeFiles/SPIRV-Tools.dir/all +source/link/CMakeFiles/SPIRV-Tools-link.dir/all: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/all + $(MAKE) -f source/link/CMakeFiles/SPIRV-Tools-link.dir/build.make source/link/CMakeFiles/SPIRV-Tools-link.dir/depend + $(MAKE) -f source/link/CMakeFiles/SPIRV-Tools-link.dir/build.make source/link/CMakeFiles/SPIRV-Tools-link.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=29 "Built target SPIRV-Tools-link" +.PHONY : source/link/CMakeFiles/SPIRV-Tools-link.dir/all + +# Include target in all. +all: source/link/CMakeFiles/SPIRV-Tools-link.dir/all + +.PHONY : all + +# Build rule for subdir invocation for target. +source/link/CMakeFiles/SPIRV-Tools-link.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 60 + $(MAKE) -f CMakeFiles/Makefile2 source/link/CMakeFiles/SPIRV-Tools-link.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 +.PHONY : source/link/CMakeFiles/SPIRV-Tools-link.dir/rule + +# Convenience name for target. +SPIRV-Tools-link: source/link/CMakeFiles/SPIRV-Tools-link.dir/rule + +.PHONY : SPIRV-Tools-link + +# clean rule for target. +source/link/CMakeFiles/SPIRV-Tools-link.dir/clean: + $(MAKE) -f source/link/CMakeFiles/SPIRV-Tools-link.dir/build.make source/link/CMakeFiles/SPIRV-Tools-link.dir/clean +.PHONY : source/link/CMakeFiles/SPIRV-Tools-link.dir/clean + +# clean rule for target. +clean: source/link/CMakeFiles/SPIRV-Tools-link.dir/clean + +.PHONY : clean + +#============================================================================= +# Directory level rules for directory tools + +# Convenience name for "all" pass in the directory. +tools/all: tools/CMakeFiles/spirv-cfg.dir/all +tools/all: tools/CMakeFiles/spirv-dis.dir/all +tools/all: tools/CMakeFiles/spirv-as.dir/all +tools/all: tools/CMakeFiles/spirv-val.dir/all +tools/all: tools/CMakeFiles/spirv-link.dir/all +tools/all: tools/CMakeFiles/spirv-opt.dir/all +tools/all: tools/CMakeFiles/spirv-stats.dir/all +tools/all: tools/lesspipe/all +tools/all: tools/emacs/all + +.PHONY : tools/all + +# Convenience name for "clean" pass in the directory. +tools/clean: tools/CMakeFiles/spirv-cfg.dir/clean +tools/clean: tools/CMakeFiles/spirv-dis.dir/clean +tools/clean: tools/CMakeFiles/spirv-as.dir/clean +tools/clean: tools/CMakeFiles/spirv-val.dir/clean +tools/clean: tools/CMakeFiles/spirv-link.dir/clean +tools/clean: tools/CMakeFiles/spirv-opt.dir/clean +tools/clean: tools/CMakeFiles/spirv-stats.dir/clean +tools/clean: tools/lesspipe/clean +tools/clean: tools/emacs/clean + +.PHONY : tools/clean + +# Convenience name for "preinstall" pass in the directory. +tools/preinstall: tools/lesspipe/preinstall +tools/preinstall: tools/emacs/preinstall + +.PHONY : tools/preinstall + +#============================================================================= +# Target rules for target tools/CMakeFiles/spirv-cfg.dir + +# All Build rule for target. +tools/CMakeFiles/spirv-cfg.dir/all: source/CMakeFiles/SPIRV-Tools.dir/all + $(MAKE) -f tools/CMakeFiles/spirv-cfg.dir/build.make tools/CMakeFiles/spirv-cfg.dir/depend + $(MAKE) -f tools/CMakeFiles/spirv-cfg.dir/build.make tools/CMakeFiles/spirv-cfg.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=90,91 "Built target spirv-cfg" +.PHONY : tools/CMakeFiles/spirv-cfg.dir/all + +# Include target in all. +all: tools/CMakeFiles/spirv-cfg.dir/all + +.PHONY : all + +# Build rule for subdir invocation for target. +tools/CMakeFiles/spirv-cfg.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 30 + $(MAKE) -f CMakeFiles/Makefile2 tools/CMakeFiles/spirv-cfg.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 +.PHONY : tools/CMakeFiles/spirv-cfg.dir/rule + +# Convenience name for target. +spirv-cfg: tools/CMakeFiles/spirv-cfg.dir/rule + +.PHONY : spirv-cfg + +# clean rule for target. +tools/CMakeFiles/spirv-cfg.dir/clean: + $(MAKE) -f tools/CMakeFiles/spirv-cfg.dir/build.make tools/CMakeFiles/spirv-cfg.dir/clean +.PHONY : tools/CMakeFiles/spirv-cfg.dir/clean + +# clean rule for target. +clean: tools/CMakeFiles/spirv-cfg.dir/clean + +.PHONY : clean + +#============================================================================= +# Target rules for target tools/CMakeFiles/spirv-dis.dir + +# All Build rule for target. +tools/CMakeFiles/spirv-dis.dir/all: source/CMakeFiles/SPIRV-Tools.dir/all + $(MAKE) -f tools/CMakeFiles/spirv-dis.dir/build.make tools/CMakeFiles/spirv-dis.dir/depend + $(MAKE) -f tools/CMakeFiles/spirv-dis.dir/build.make tools/CMakeFiles/spirv-dis.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num= "Built target spirv-dis" +.PHONY : tools/CMakeFiles/spirv-dis.dir/all + +# Include target in all. +all: tools/CMakeFiles/spirv-dis.dir/all + +.PHONY : all + +# Build rule for subdir invocation for target. +tools/CMakeFiles/spirv-dis.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 28 + $(MAKE) -f CMakeFiles/Makefile2 tools/CMakeFiles/spirv-dis.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 +.PHONY : tools/CMakeFiles/spirv-dis.dir/rule + +# Convenience name for target. +spirv-dis: tools/CMakeFiles/spirv-dis.dir/rule + +.PHONY : spirv-dis + +# clean rule for target. +tools/CMakeFiles/spirv-dis.dir/clean: + $(MAKE) -f tools/CMakeFiles/spirv-dis.dir/build.make tools/CMakeFiles/spirv-dis.dir/clean +.PHONY : tools/CMakeFiles/spirv-dis.dir/clean + +# clean rule for target. +clean: tools/CMakeFiles/spirv-dis.dir/clean + +.PHONY : clean + +#============================================================================= +# Target rules for target tools/CMakeFiles/spirv-as.dir + +# All Build rule for target. +tools/CMakeFiles/spirv-as.dir/all: source/CMakeFiles/SPIRV-Tools.dir/all + $(MAKE) -f tools/CMakeFiles/spirv-as.dir/build.make tools/CMakeFiles/spirv-as.dir/depend + $(MAKE) -f tools/CMakeFiles/spirv-as.dir/build.make tools/CMakeFiles/spirv-as.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num= "Built target spirv-as" +.PHONY : tools/CMakeFiles/spirv-as.dir/all + +# Include target in all. +all: tools/CMakeFiles/spirv-as.dir/all + +.PHONY : all + +# Build rule for subdir invocation for target. +tools/CMakeFiles/spirv-as.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 28 + $(MAKE) -f CMakeFiles/Makefile2 tools/CMakeFiles/spirv-as.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 +.PHONY : tools/CMakeFiles/spirv-as.dir/rule + +# Convenience name for target. +spirv-as: tools/CMakeFiles/spirv-as.dir/rule + +.PHONY : spirv-as + +# clean rule for target. +tools/CMakeFiles/spirv-as.dir/clean: + $(MAKE) -f tools/CMakeFiles/spirv-as.dir/build.make tools/CMakeFiles/spirv-as.dir/clean +.PHONY : tools/CMakeFiles/spirv-as.dir/clean + +# clean rule for target. +clean: tools/CMakeFiles/spirv-as.dir/clean + +.PHONY : clean + +#============================================================================= +# Target rules for target tools/CMakeFiles/spirv-val.dir + +# All Build rule for target. +tools/CMakeFiles/spirv-val.dir/all: source/CMakeFiles/SPIRV-Tools.dir/all + $(MAKE) -f tools/CMakeFiles/spirv-val.dir/build.make tools/CMakeFiles/spirv-val.dir/depend + $(MAKE) -f tools/CMakeFiles/spirv-val.dir/build.make tools/CMakeFiles/spirv-val.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=99,100 "Built target spirv-val" +.PHONY : tools/CMakeFiles/spirv-val.dir/all + +# Include target in all. +all: tools/CMakeFiles/spirv-val.dir/all + +.PHONY : all + +# Build rule for subdir invocation for target. +tools/CMakeFiles/spirv-val.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 30 + $(MAKE) -f CMakeFiles/Makefile2 tools/CMakeFiles/spirv-val.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 +.PHONY : tools/CMakeFiles/spirv-val.dir/rule + +# Convenience name for target. +spirv-val: tools/CMakeFiles/spirv-val.dir/rule + +.PHONY : spirv-val + +# clean rule for target. +tools/CMakeFiles/spirv-val.dir/clean: + $(MAKE) -f tools/CMakeFiles/spirv-val.dir/build.make tools/CMakeFiles/spirv-val.dir/clean +.PHONY : tools/CMakeFiles/spirv-val.dir/clean + +# clean rule for target. +clean: tools/CMakeFiles/spirv-val.dir/clean + +.PHONY : clean + +#============================================================================= +# Target rules for target tools/CMakeFiles/spirv-link.dir + +# All Build rule for target. +tools/CMakeFiles/spirv-link.dir/all: source/CMakeFiles/SPIRV-Tools.dir/all +tools/CMakeFiles/spirv-link.dir/all: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/all +tools/CMakeFiles/spirv-link.dir/all: source/link/CMakeFiles/SPIRV-Tools-link.dir/all + $(MAKE) -f tools/CMakeFiles/spirv-link.dir/build.make tools/CMakeFiles/spirv-link.dir/depend + $(MAKE) -f tools/CMakeFiles/spirv-link.dir/build.make tools/CMakeFiles/spirv-link.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=92 "Built target spirv-link" +.PHONY : tools/CMakeFiles/spirv-link.dir/all + +# Include target in all. +all: tools/CMakeFiles/spirv-link.dir/all + +.PHONY : all + +# Build rule for subdir invocation for target. +tools/CMakeFiles/spirv-link.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 61 + $(MAKE) -f CMakeFiles/Makefile2 tools/CMakeFiles/spirv-link.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 +.PHONY : tools/CMakeFiles/spirv-link.dir/rule + +# Convenience name for target. +spirv-link: tools/CMakeFiles/spirv-link.dir/rule + +.PHONY : spirv-link + +# clean rule for target. +tools/CMakeFiles/spirv-link.dir/clean: + $(MAKE) -f tools/CMakeFiles/spirv-link.dir/build.make tools/CMakeFiles/spirv-link.dir/clean +.PHONY : tools/CMakeFiles/spirv-link.dir/clean + +# clean rule for target. +clean: tools/CMakeFiles/spirv-link.dir/clean + +.PHONY : clean + +#============================================================================= +# Target rules for target tools/CMakeFiles/spirv-opt.dir + +# All Build rule for target. +tools/CMakeFiles/spirv-opt.dir/all: source/CMakeFiles/SPIRV-Tools.dir/all +tools/CMakeFiles/spirv-opt.dir/all: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/all + $(MAKE) -f tools/CMakeFiles/spirv-opt.dir/build.make tools/CMakeFiles/spirv-opt.dir/depend + $(MAKE) -f tools/CMakeFiles/spirv-opt.dir/build.make tools/CMakeFiles/spirv-opt.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=93 "Built target spirv-opt" +.PHONY : tools/CMakeFiles/spirv-opt.dir/all + +# Include target in all. +all: tools/CMakeFiles/spirv-opt.dir/all + +.PHONY : all + +# Build rule for subdir invocation for target. +tools/CMakeFiles/spirv-opt.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 60 + $(MAKE) -f CMakeFiles/Makefile2 tools/CMakeFiles/spirv-opt.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 +.PHONY : tools/CMakeFiles/spirv-opt.dir/rule + +# Convenience name for target. +spirv-opt: tools/CMakeFiles/spirv-opt.dir/rule + +.PHONY : spirv-opt + +# clean rule for target. +tools/CMakeFiles/spirv-opt.dir/clean: + $(MAKE) -f tools/CMakeFiles/spirv-opt.dir/build.make tools/CMakeFiles/spirv-opt.dir/clean +.PHONY : tools/CMakeFiles/spirv-opt.dir/clean + +# clean rule for target. +clean: tools/CMakeFiles/spirv-opt.dir/clean + +.PHONY : clean + +#============================================================================= +# Target rules for target tools/CMakeFiles/spirv-stats.dir + +# All Build rule for target. +tools/CMakeFiles/spirv-stats.dir/all: source/CMakeFiles/SPIRV-Tools.dir/all + $(MAKE) -f tools/CMakeFiles/spirv-stats.dir/build.make tools/CMakeFiles/spirv-stats.dir/depend + $(MAKE) -f tools/CMakeFiles/spirv-stats.dir/build.make tools/CMakeFiles/spirv-stats.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=94,95 "Built target spirv-stats" +.PHONY : tools/CMakeFiles/spirv-stats.dir/all + +# Include target in all. +all: tools/CMakeFiles/spirv-stats.dir/all + +.PHONY : all + +# Build rule for subdir invocation for target. +tools/CMakeFiles/spirv-stats.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 30 + $(MAKE) -f CMakeFiles/Makefile2 tools/CMakeFiles/spirv-stats.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 +.PHONY : tools/CMakeFiles/spirv-stats.dir/rule + +# Convenience name for target. +spirv-stats: tools/CMakeFiles/spirv-stats.dir/rule + +.PHONY : spirv-stats + +# clean rule for target. +tools/CMakeFiles/spirv-stats.dir/clean: + $(MAKE) -f tools/CMakeFiles/spirv-stats.dir/build.make tools/CMakeFiles/spirv-stats.dir/clean +.PHONY : tools/CMakeFiles/spirv-stats.dir/clean + +# clean rule for target. +clean: tools/CMakeFiles/spirv-stats.dir/clean + +.PHONY : clean + +#============================================================================= +# Directory level rules for directory tools/lesspipe + +# Convenience name for "all" pass in the directory. +tools/lesspipe/all: + +.PHONY : tools/lesspipe/all + +# Convenience name for "clean" pass in the directory. +tools/lesspipe/clean: + +.PHONY : tools/lesspipe/clean + +# Convenience name for "preinstall" pass in the directory. +tools/lesspipe/preinstall: + +.PHONY : tools/lesspipe/preinstall + +#============================================================================= +# Directory level rules for directory tools/emacs + +# Convenience name for "all" pass in the directory. +tools/emacs/all: + +.PHONY : tools/emacs/all + +# Convenience name for "clean" pass in the directory. +tools/emacs/clean: + +.PHONY : tools/emacs/clean + +# Convenience name for "preinstall" pass in the directory. +tools/emacs/preinstall: + +.PHONY : tools/emacs/preinstall + +#============================================================================= +# Directory level rules for directory test + +# Convenience name for "all" pass in the directory. +test/all: test/comp/all +test/all: test/link/all +test/all: test/opt/all +test/all: test/stats/all +test/all: test/tools/all +test/all: test/util/all +test/all: test/val/all + +.PHONY : test/all + +# Convenience name for "clean" pass in the directory. +test/clean: test/comp/clean +test/clean: test/link/clean +test/clean: test/opt/clean +test/clean: test/stats/clean +test/clean: test/tools/clean +test/clean: test/util/clean +test/clean: test/val/clean + +.PHONY : test/clean + +# Convenience name for "preinstall" pass in the directory. +test/preinstall: test/comp/preinstall +test/preinstall: test/link/preinstall +test/preinstall: test/opt/preinstall +test/preinstall: test/stats/preinstall +test/preinstall: test/tools/preinstall +test/preinstall: test/util/preinstall +test/preinstall: test/val/preinstall + +.PHONY : test/preinstall + +#============================================================================= +# Directory level rules for directory test/comp + +# Convenience name for "all" pass in the directory. +test/comp/all: + +.PHONY : test/comp/all + +# Convenience name for "clean" pass in the directory. +test/comp/clean: + +.PHONY : test/comp/clean + +# Convenience name for "preinstall" pass in the directory. +test/comp/preinstall: + +.PHONY : test/comp/preinstall + +#============================================================================= +# Directory level rules for directory test/link + +# Convenience name for "all" pass in the directory. +test/link/all: + +.PHONY : test/link/all + +# Convenience name for "clean" pass in the directory. +test/link/clean: + +.PHONY : test/link/clean + +# Convenience name for "preinstall" pass in the directory. +test/link/preinstall: + +.PHONY : test/link/preinstall + +#============================================================================= +# Directory level rules for directory test/opt + +# Convenience name for "all" pass in the directory. +test/opt/all: test/opt/dominator_tree/all +test/opt/all: test/opt/loop_optimizations/all + +.PHONY : test/opt/all + +# Convenience name for "clean" pass in the directory. +test/opt/clean: test/opt/dominator_tree/clean +test/opt/clean: test/opt/loop_optimizations/clean + +.PHONY : test/opt/clean + +# Convenience name for "preinstall" pass in the directory. +test/opt/preinstall: test/opt/dominator_tree/preinstall +test/opt/preinstall: test/opt/loop_optimizations/preinstall + +.PHONY : test/opt/preinstall + +#============================================================================= +# Directory level rules for directory test/opt/dominator_tree + +# Convenience name for "all" pass in the directory. +test/opt/dominator_tree/all: + +.PHONY : test/opt/dominator_tree/all + +# Convenience name for "clean" pass in the directory. +test/opt/dominator_tree/clean: + +.PHONY : test/opt/dominator_tree/clean + +# Convenience name for "preinstall" pass in the directory. +test/opt/dominator_tree/preinstall: + +.PHONY : test/opt/dominator_tree/preinstall + +#============================================================================= +# Directory level rules for directory test/opt/loop_optimizations + +# Convenience name for "all" pass in the directory. +test/opt/loop_optimizations/all: + +.PHONY : test/opt/loop_optimizations/all + +# Convenience name for "clean" pass in the directory. +test/opt/loop_optimizations/clean: + +.PHONY : test/opt/loop_optimizations/clean + +# Convenience name for "preinstall" pass in the directory. +test/opt/loop_optimizations/preinstall: + +.PHONY : test/opt/loop_optimizations/preinstall + +#============================================================================= +# Directory level rules for directory test/stats + +# Convenience name for "all" pass in the directory. +test/stats/all: + +.PHONY : test/stats/all + +# Convenience name for "clean" pass in the directory. +test/stats/clean: + +.PHONY : test/stats/clean + +# Convenience name for "preinstall" pass in the directory. +test/stats/preinstall: + +.PHONY : test/stats/preinstall + +#============================================================================= +# Directory level rules for directory test/tools + +# Convenience name for "all" pass in the directory. +test/tools/all: test/tools/opt/all + +.PHONY : test/tools/all + +# Convenience name for "clean" pass in the directory. +test/tools/clean: test/tools/opt/clean + +.PHONY : test/tools/clean + +# Convenience name for "preinstall" pass in the directory. +test/tools/preinstall: test/tools/opt/preinstall + +.PHONY : test/tools/preinstall + +#============================================================================= +# Directory level rules for directory test/tools/opt + +# Convenience name for "all" pass in the directory. +test/tools/opt/all: + +.PHONY : test/tools/opt/all + +# Convenience name for "clean" pass in the directory. +test/tools/opt/clean: + +.PHONY : test/tools/opt/clean + +# Convenience name for "preinstall" pass in the directory. +test/tools/opt/preinstall: + +.PHONY : test/tools/opt/preinstall + +#============================================================================= +# Directory level rules for directory test/util + +# Convenience name for "all" pass in the directory. +test/util/all: + +.PHONY : test/util/all + +# Convenience name for "clean" pass in the directory. +test/util/clean: + +.PHONY : test/util/clean + +# Convenience name for "preinstall" pass in the directory. +test/util/preinstall: + +.PHONY : test/util/preinstall + +#============================================================================= +# Directory level rules for directory test/val + +# Convenience name for "all" pass in the directory. +test/val/all: + +.PHONY : test/val/all + +# Convenience name for "clean" pass in the directory. +test/val/clean: + +.PHONY : test/val/clean + +# Convenience name for "preinstall" pass in the directory. +test/val/preinstall: + +.PHONY : test/val/preinstall + +#============================================================================= +# Directory level rules for directory examples + +# Convenience name for "all" pass in the directory. +examples/all: examples/cpp-interface/all + +.PHONY : examples/all + +# Convenience name for "clean" pass in the directory. +examples/clean: examples/cpp-interface/clean + +.PHONY : examples/clean + +# Convenience name for "preinstall" pass in the directory. +examples/preinstall: examples/cpp-interface/preinstall + +.PHONY : examples/preinstall + +#============================================================================= +# Directory level rules for directory examples/cpp-interface + +# Convenience name for "all" pass in the directory. +examples/cpp-interface/all: examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/all + +.PHONY : examples/cpp-interface/all + +# Convenience name for "clean" pass in the directory. +examples/cpp-interface/clean: examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/clean + +.PHONY : examples/cpp-interface/clean + +# Convenience name for "preinstall" pass in the directory. +examples/cpp-interface/preinstall: + +.PHONY : examples/cpp-interface/preinstall + +#============================================================================= +# Target rules for target examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir + +# All Build rule for target. +examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/all: source/CMakeFiles/SPIRV-Tools.dir/all +examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/all: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/all + $(MAKE) -f examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/build.make examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/depend + $(MAKE) -f examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/build.make examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/build + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=96 "Built target spirv-tools-cpp-example" +.PHONY : examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/all + +# Include target in all. +all: examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/all + +.PHONY : all + +# Build rule for subdir invocation for target. +examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 60 + $(MAKE) -f CMakeFiles/Makefile2 examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 +.PHONY : examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/rule + +# Convenience name for target. +spirv-tools-cpp-example: examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/rule + +.PHONY : spirv-tools-cpp-example + +# clean rule for target. +examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/clean: + $(MAKE) -f examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/build.make examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/clean +.PHONY : examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/clean + +# clean rule for target. +clean: examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/clean + +.PHONY : clean + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/3rdparty/spirv-tools/build/CMakeFiles/Progress/1 b/3rdparty/spirv-tools/build/CMakeFiles/Progress/1 new file mode 100644 index 000000000..7b4d68d70 --- /dev/null +++ b/3rdparty/spirv-tools/build/CMakeFiles/Progress/1 @@ -0,0 +1 @@ +empty \ No newline at end of file diff --git a/3rdparty/spirv-tools/build/CMakeFiles/Progress/2 b/3rdparty/spirv-tools/build/CMakeFiles/Progress/2 new file mode 100644 index 000000000..7b4d68d70 --- /dev/null +++ b/3rdparty/spirv-tools/build/CMakeFiles/Progress/2 @@ -0,0 +1 @@ +empty \ No newline at end of file diff --git a/3rdparty/spirv-tools/build/CMakeFiles/Progress/3 b/3rdparty/spirv-tools/build/CMakeFiles/Progress/3 new file mode 100644 index 000000000..7b4d68d70 --- /dev/null +++ b/3rdparty/spirv-tools/build/CMakeFiles/Progress/3 @@ -0,0 +1 @@ +empty \ No newline at end of file diff --git a/3rdparty/spirv-tools/build/CMakeFiles/Progress/4 b/3rdparty/spirv-tools/build/CMakeFiles/Progress/4 new file mode 100644 index 000000000..7b4d68d70 --- /dev/null +++ b/3rdparty/spirv-tools/build/CMakeFiles/Progress/4 @@ -0,0 +1 @@ +empty \ No newline at end of file diff --git a/3rdparty/spirv-tools/build/CMakeFiles/Progress/5 b/3rdparty/spirv-tools/build/CMakeFiles/Progress/5 new file mode 100644 index 000000000..7b4d68d70 --- /dev/null +++ b/3rdparty/spirv-tools/build/CMakeFiles/Progress/5 @@ -0,0 +1 @@ +empty \ No newline at end of file diff --git a/3rdparty/spirv-tools/build/CMakeFiles/Progress/6 b/3rdparty/spirv-tools/build/CMakeFiles/Progress/6 new file mode 100644 index 000000000..7b4d68d70 --- /dev/null +++ b/3rdparty/spirv-tools/build/CMakeFiles/Progress/6 @@ -0,0 +1 @@ +empty \ No newline at end of file diff --git a/3rdparty/spirv-tools/build/CMakeFiles/Progress/7 b/3rdparty/spirv-tools/build/CMakeFiles/Progress/7 new file mode 100644 index 000000000..7b4d68d70 --- /dev/null +++ b/3rdparty/spirv-tools/build/CMakeFiles/Progress/7 @@ -0,0 +1 @@ +empty \ No newline at end of file diff --git a/3rdparty/spirv-tools/build/CMakeFiles/Progress/8 b/3rdparty/spirv-tools/build/CMakeFiles/Progress/8 new file mode 100644 index 000000000..7b4d68d70 --- /dev/null +++ b/3rdparty/spirv-tools/build/CMakeFiles/Progress/8 @@ -0,0 +1 @@ +empty \ No newline at end of file diff --git a/3rdparty/spirv-tools/build/CMakeFiles/Progress/9 b/3rdparty/spirv-tools/build/CMakeFiles/Progress/9 new file mode 100644 index 000000000..7b4d68d70 --- /dev/null +++ b/3rdparty/spirv-tools/build/CMakeFiles/Progress/9 @@ -0,0 +1 @@ +empty \ No newline at end of file diff --git a/3rdparty/spirv-tools/build/CMakeFiles/Progress/count.txt b/3rdparty/spirv-tools/build/CMakeFiles/Progress/count.txt new file mode 100644 index 000000000..6529ff889 --- /dev/null +++ b/3rdparty/spirv-tools/build/CMakeFiles/Progress/count.txt @@ -0,0 +1 @@ +98 diff --git a/3rdparty/spirv-tools/build/CMakeFiles/TargetDirectories.txt b/3rdparty/spirv-tools/build/CMakeFiles/TargetDirectories.txt new file mode 100644 index 000000000..8c686956b --- /dev/null +++ b/3rdparty/spirv-tools/build/CMakeFiles/TargetDirectories.txt @@ -0,0 +1,176 @@ +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/install.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/rebuild_cache.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/spirv-tools-shared-pkg-config.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/edit_cache.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/spirv-tools-pkg-config.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/list_install_components.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/install/local.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/test.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/install/strip.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/external/CMakeFiles/install.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/external/CMakeFiles/edit_cache.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/external/CMakeFiles/install/strip.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/external/CMakeFiles/list_install_components.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/external/CMakeFiles/test.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/external/CMakeFiles/install/local.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/external/CMakeFiles/rebuild_cache.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/install.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/spirv-tools-debuginfo.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/rebuild_cache.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/install/strip.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/spirv-tools-header-DebugInfo.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/spirv-tools-build-version.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/edit_cache.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/list_install_components.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/test.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/spirv-tools-vimsyntax.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/install/local.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/comp/CMakeFiles/install.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/comp/CMakeFiles/edit_cache.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/comp/CMakeFiles/install/strip.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/comp/CMakeFiles/list_install_components.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/comp/CMakeFiles/test.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/comp/CMakeFiles/install/local.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/comp/CMakeFiles/rebuild_cache.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/install.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/rebuild_cache.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/install/strip.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/list_install_components.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/test.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/install/local.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/edit_cache.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/link/CMakeFiles/install.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/link/CMakeFiles/rebuild_cache.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/link/CMakeFiles/install/strip.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/link/CMakeFiles/SPIRV-Tools-link.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/link/CMakeFiles/edit_cache.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/link/CMakeFiles/list_install_components.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/link/CMakeFiles/test.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/link/CMakeFiles/install/local.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/CMakeFiles/rebuild_cache.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/CMakeFiles/list_install_components.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/CMakeFiles/edit_cache.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/CMakeFiles/install/strip.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/CMakeFiles/install.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/CMakeFiles/spirv-cfg.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/CMakeFiles/spirv-dis.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/CMakeFiles/spirv-as.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/CMakeFiles/spirv-val.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/CMakeFiles/spirv-link.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/CMakeFiles/spirv-opt.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/CMakeFiles/install/local.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/CMakeFiles/test.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/CMakeFiles/spirv-stats.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/lesspipe/CMakeFiles/install.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/lesspipe/CMakeFiles/edit_cache.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/lesspipe/CMakeFiles/install/strip.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/lesspipe/CMakeFiles/list_install_components.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/lesspipe/CMakeFiles/test.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/lesspipe/CMakeFiles/install/local.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/lesspipe/CMakeFiles/rebuild_cache.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/emacs/CMakeFiles/install.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/emacs/CMakeFiles/edit_cache.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/emacs/CMakeFiles/install/strip.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/emacs/CMakeFiles/list_install_components.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/emacs/CMakeFiles/test.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/emacs/CMakeFiles/install/local.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/emacs/CMakeFiles/rebuild_cache.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/CMakeFiles/install.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/CMakeFiles/edit_cache.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/CMakeFiles/install/strip.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/CMakeFiles/list_install_components.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/CMakeFiles/test.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/CMakeFiles/install/local.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/CMakeFiles/rebuild_cache.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/comp/CMakeFiles/install.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/comp/CMakeFiles/edit_cache.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/comp/CMakeFiles/install/strip.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/comp/CMakeFiles/list_install_components.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/comp/CMakeFiles/test.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/comp/CMakeFiles/install/local.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/comp/CMakeFiles/rebuild_cache.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/link/CMakeFiles/install.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/link/CMakeFiles/edit_cache.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/link/CMakeFiles/install/strip.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/link/CMakeFiles/list_install_components.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/link/CMakeFiles/test.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/link/CMakeFiles/install/local.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/link/CMakeFiles/rebuild_cache.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/opt/CMakeFiles/install.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/opt/CMakeFiles/edit_cache.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/opt/CMakeFiles/install/strip.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/opt/CMakeFiles/list_install_components.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/opt/CMakeFiles/test.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/opt/CMakeFiles/install/local.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/opt/CMakeFiles/rebuild_cache.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/opt/dominator_tree/CMakeFiles/install.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/opt/dominator_tree/CMakeFiles/edit_cache.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/opt/dominator_tree/CMakeFiles/install/strip.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/opt/dominator_tree/CMakeFiles/list_install_components.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/opt/dominator_tree/CMakeFiles/test.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/opt/dominator_tree/CMakeFiles/install/local.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/opt/dominator_tree/CMakeFiles/rebuild_cache.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/opt/loop_optimizations/CMakeFiles/install.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/opt/loop_optimizations/CMakeFiles/edit_cache.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/opt/loop_optimizations/CMakeFiles/install/strip.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/opt/loop_optimizations/CMakeFiles/list_install_components.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/opt/loop_optimizations/CMakeFiles/test.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/opt/loop_optimizations/CMakeFiles/install/local.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/opt/loop_optimizations/CMakeFiles/rebuild_cache.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/stats/CMakeFiles/install.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/stats/CMakeFiles/edit_cache.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/stats/CMakeFiles/install/strip.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/stats/CMakeFiles/list_install_components.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/stats/CMakeFiles/test.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/stats/CMakeFiles/install/local.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/stats/CMakeFiles/rebuild_cache.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/tools/CMakeFiles/install.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/tools/CMakeFiles/edit_cache.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/tools/CMakeFiles/install/strip.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/tools/CMakeFiles/list_install_components.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/tools/CMakeFiles/test.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/tools/CMakeFiles/install/local.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/tools/CMakeFiles/rebuild_cache.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/tools/opt/CMakeFiles/install.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/tools/opt/CMakeFiles/edit_cache.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/tools/opt/CMakeFiles/install/strip.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/tools/opt/CMakeFiles/list_install_components.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/tools/opt/CMakeFiles/test.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/tools/opt/CMakeFiles/install/local.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/tools/opt/CMakeFiles/rebuild_cache.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/util/CMakeFiles/install.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/util/CMakeFiles/edit_cache.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/util/CMakeFiles/install/strip.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/util/CMakeFiles/list_install_components.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/util/CMakeFiles/test.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/util/CMakeFiles/install/local.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/util/CMakeFiles/rebuild_cache.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/val/CMakeFiles/install.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/val/CMakeFiles/edit_cache.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/val/CMakeFiles/install/strip.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/val/CMakeFiles/list_install_components.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/val/CMakeFiles/test.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/val/CMakeFiles/install/local.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/val/CMakeFiles/rebuild_cache.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/examples/CMakeFiles/install.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/examples/CMakeFiles/edit_cache.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/examples/CMakeFiles/install/strip.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/examples/CMakeFiles/list_install_components.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/examples/CMakeFiles/test.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/examples/CMakeFiles/install/local.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/examples/CMakeFiles/rebuild_cache.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/examples/cpp-interface/CMakeFiles/install.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/examples/cpp-interface/CMakeFiles/rebuild_cache.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/examples/cpp-interface/CMakeFiles/install/strip.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/examples/cpp-interface/CMakeFiles/edit_cache.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/examples/cpp-interface/CMakeFiles/list_install_components.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/examples/cpp-interface/CMakeFiles/test.dir +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/examples/cpp-interface/CMakeFiles/install/local.dir diff --git a/3rdparty/spirv-tools/build/CMakeFiles/cmake.check_cache b/3rdparty/spirv-tools/build/CMakeFiles/cmake.check_cache new file mode 100644 index 000000000..3dccd7317 --- /dev/null +++ b/3rdparty/spirv-tools/build/CMakeFiles/cmake.check_cache @@ -0,0 +1 @@ +# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/3rdparty/spirv-tools/build/CMakeFiles/feature_tests.bin b/3rdparty/spirv-tools/build/CMakeFiles/feature_tests.bin new file mode 100755 index 0000000000000000000000000000000000000000..96a9680a515cc892ede5ed0515cab433d304116f GIT binary patch literal 12480 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 literal 0 HcmV?d00001 diff --git a/3rdparty/spirv-tools/build/CMakeFiles/feature_tests.c b/3rdparty/spirv-tools/build/CMakeFiles/feature_tests.c new file mode 100644 index 000000000..6590dded2 --- /dev/null +++ b/3rdparty/spirv-tools/build/CMakeFiles/feature_tests.c @@ -0,0 +1,34 @@ + + const char features[] = {"\n" +"C_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 +"1" +#else +"0" +#endif +"c_function_prototypes\n" +"C_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +"1" +#else +"0" +#endif +"c_restrict\n" +"C_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201000L +"1" +#else +"0" +#endif +"c_static_assert\n" +"C_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +"1" +#else +"0" +#endif +"c_variadic_macros\n" + +}; + +int main(int argc, char** argv) { (void)argv; return features[argc]; } diff --git a/3rdparty/spirv-tools/build/CMakeFiles/feature_tests.cxx b/3rdparty/spirv-tools/build/CMakeFiles/feature_tests.cxx new file mode 100644 index 000000000..b93418c6e --- /dev/null +++ b/3rdparty/spirv-tools/build/CMakeFiles/feature_tests.cxx @@ -0,0 +1,405 @@ + + const char features[] = {"\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 500 && __cplusplus >= 201402L +"1" +#else +"0" +#endif +"cxx_aggregate_default_initializers\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_alias_templates\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_alignas\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_alignof\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_attributes\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L +"1" +#else +"0" +#endif +"cxx_attribute_deprecated\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_auto_type\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L +"1" +#else +"0" +#endif +"cxx_binary_literals\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_constexpr\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L +"1" +#else +"0" +#endif +"cxx_contextual_conversions\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_decltype\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L +"1" +#else +"0" +#endif +"cxx_decltype_auto\n" +"CXX_FEATURE:" +#if ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) >= 40801) && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_decltype_incomplete_return_types\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_default_function_template_args\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_defaulted_functions\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_defaulted_move_initializers\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_delegating_constructors\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_deleted_functions\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L +"1" +#else +"0" +#endif +"cxx_digit_separators\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_enum_forward_declarations\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_explicit_conversions\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_extended_friend_declarations\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_extern_templates\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_final\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_func_identifier\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_generalized_initializers\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L +"1" +#else +"0" +#endif +"cxx_generic_lambdas\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_inheriting_constructors\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_inline_namespaces\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_lambdas\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L +"1" +#else +"0" +#endif +"cxx_lambda_init_captures\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_local_type_template_args\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_long_long_type\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_noexcept\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_nonstatic_member_init\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_nullptr\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_override\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_range_for\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_raw_string_literals\n" +"CXX_FEATURE:" +#if ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) >= 40801) && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_reference_qualified_functions\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 500 && __cplusplus >= 201402L +"1" +#else +"0" +#endif +"cxx_relaxed_constexpr\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L +"1" +#else +"0" +#endif +"cxx_return_type_deduction\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_right_angle_brackets\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_rvalue_references\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_sizeof_member\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_static_assert\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_strong_enums\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && __cplusplus +"1" +#else +"0" +#endif +"cxx_template_template_parameters\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_thread_local\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_trailing_return_types\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_unicode_literals\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_uniform_initialization\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_unrestricted_unions\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_user_literals\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 500 && __cplusplus >= 201402L +"1" +#else +"0" +#endif +"cxx_variable_templates\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_variadic_macros\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_variadic_templates\n" + +}; + +int main(int argc, char** argv) { (void)argv; return features[argc]; } diff --git a/3rdparty/spirv-tools/build/CMakeFiles/progress.marks b/3rdparty/spirv-tools/build/CMakeFiles/progress.marks new file mode 100644 index 000000000..6529ff889 --- /dev/null +++ b/3rdparty/spirv-tools/build/CMakeFiles/progress.marks @@ -0,0 +1 @@ +98 diff --git a/3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-pkg-config.dir/DependInfo.cmake b/3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-pkg-config.dir/DependInfo.cmake new file mode 100644 index 000000000..19fab2149 --- /dev/null +++ b/3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-pkg-config.dir/DependInfo.cmake @@ -0,0 +1,11 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) +# The set of files for implicit dependencies of each language: + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-pkg-config.dir/build.make b/3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-pkg-config.dir/build.make new file mode 100644 index 000000000..5c104e1ca --- /dev/null +++ b/3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-pkg-config.dir/build.make @@ -0,0 +1,78 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + +# Utility rule file for spirv-tools-pkg-config. + +# Include the progress variables for this target. +include CMakeFiles/spirv-tools-pkg-config.dir/progress.make + +CMakeFiles/spirv-tools-pkg-config: ../CHANGES +CMakeFiles/spirv-tools-pkg-config: ../cmake/SPIRV-Tools.pc.in +CMakeFiles/spirv-tools-pkg-config: ../cmake/write_pkg_config.cmake + /usr/bin/cmake -DCHANGES_FILE=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/CHANGES -DTEMPLATE_FILE=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/cmake/SPIRV-Tools.pc.in -DOUT_FILE=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/SPIRV-Tools.pc -DCMAKE_INSTALL_PREFIX=/usr/local -DCMAKE_INSTALL_LIBDIR=lib -DCMAKE_INSTALL_INCLUDEDIR=include -DSPIRV_LIBRARIES=-lSPIRV-Tools\ -lSPIRV-Tools-link\ -lSPIRV-Tools-opt -P /home/bkaradzic/Private/projects/_github/SPIRV-Tools/cmake/write_pkg_config.cmake + +spirv-tools-pkg-config: CMakeFiles/spirv-tools-pkg-config +spirv-tools-pkg-config: CMakeFiles/spirv-tools-pkg-config.dir/build.make + +.PHONY : spirv-tools-pkg-config + +# Rule to build all files generated by this target. +CMakeFiles/spirv-tools-pkg-config.dir/build: spirv-tools-pkg-config + +.PHONY : CMakeFiles/spirv-tools-pkg-config.dir/build + +CMakeFiles/spirv-tools-pkg-config.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/spirv-tools-pkg-config.dir/cmake_clean.cmake +.PHONY : CMakeFiles/spirv-tools-pkg-config.dir/clean + +CMakeFiles/spirv-tools-pkg-config.dir/depend: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/bkaradzic/Private/projects/_github/SPIRV-Tools /home/bkaradzic/Private/projects/_github/SPIRV-Tools /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/spirv-tools-pkg-config.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : CMakeFiles/spirv-tools-pkg-config.dir/depend + diff --git a/3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-pkg-config.dir/cmake_clean.cmake b/3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-pkg-config.dir/cmake_clean.cmake new file mode 100644 index 000000000..154f139e2 --- /dev/null +++ b/3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-pkg-config.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/spirv-tools-pkg-config" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/spirv-tools-pkg-config.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-pkg-config.dir/depend.internal b/3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-pkg-config.dir/depend.internal new file mode 100644 index 000000000..d827cd848 --- /dev/null +++ b/3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-pkg-config.dir/depend.internal @@ -0,0 +1,3 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + diff --git a/3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-pkg-config.dir/depend.make b/3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-pkg-config.dir/depend.make new file mode 100644 index 000000000..d827cd848 --- /dev/null +++ b/3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-pkg-config.dir/depend.make @@ -0,0 +1,3 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + diff --git a/3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-pkg-config.dir/progress.make b/3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-pkg-config.dir/progress.make new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-pkg-config.dir/progress.make @@ -0,0 +1 @@ + diff --git a/3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-shared-pkg-config.dir/DependInfo.cmake b/3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-shared-pkg-config.dir/DependInfo.cmake new file mode 100644 index 000000000..19fab2149 --- /dev/null +++ b/3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-shared-pkg-config.dir/DependInfo.cmake @@ -0,0 +1,11 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) +# The set of files for implicit dependencies of each language: + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-shared-pkg-config.dir/build.make b/3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-shared-pkg-config.dir/build.make new file mode 100644 index 000000000..f6123abb5 --- /dev/null +++ b/3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-shared-pkg-config.dir/build.make @@ -0,0 +1,78 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + +# Utility rule file for spirv-tools-shared-pkg-config. + +# Include the progress variables for this target. +include CMakeFiles/spirv-tools-shared-pkg-config.dir/progress.make + +CMakeFiles/spirv-tools-shared-pkg-config: ../CHANGES +CMakeFiles/spirv-tools-shared-pkg-config: ../cmake/SPIRV-Tools-shared.pc.in +CMakeFiles/spirv-tools-shared-pkg-config: ../cmake/write_pkg_config.cmake + /usr/bin/cmake -DCHANGES_FILE=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/CHANGES -DTEMPLATE_FILE=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/cmake/SPIRV-Tools-shared.pc.in -DOUT_FILE=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/SPIRV-Tools-shared.pc -DCMAKE_INSTALL_PREFIX=/usr/local -DCMAKE_INSTALL_LIBDIR=lib -DCMAKE_INSTALL_INCLUDEDIR=include -DSPIRV_SHARED_LIBRARIES=-lSPIRV-Tools-shared -P /home/bkaradzic/Private/projects/_github/SPIRV-Tools/cmake/write_pkg_config.cmake + +spirv-tools-shared-pkg-config: CMakeFiles/spirv-tools-shared-pkg-config +spirv-tools-shared-pkg-config: CMakeFiles/spirv-tools-shared-pkg-config.dir/build.make + +.PHONY : spirv-tools-shared-pkg-config + +# Rule to build all files generated by this target. +CMakeFiles/spirv-tools-shared-pkg-config.dir/build: spirv-tools-shared-pkg-config + +.PHONY : CMakeFiles/spirv-tools-shared-pkg-config.dir/build + +CMakeFiles/spirv-tools-shared-pkg-config.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/spirv-tools-shared-pkg-config.dir/cmake_clean.cmake +.PHONY : CMakeFiles/spirv-tools-shared-pkg-config.dir/clean + +CMakeFiles/spirv-tools-shared-pkg-config.dir/depend: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/bkaradzic/Private/projects/_github/SPIRV-Tools /home/bkaradzic/Private/projects/_github/SPIRV-Tools /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/spirv-tools-shared-pkg-config.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : CMakeFiles/spirv-tools-shared-pkg-config.dir/depend + diff --git a/3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-shared-pkg-config.dir/cmake_clean.cmake b/3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-shared-pkg-config.dir/cmake_clean.cmake new file mode 100644 index 000000000..a172748be --- /dev/null +++ b/3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-shared-pkg-config.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +file(REMOVE_RECURSE + "CMakeFiles/spirv-tools-shared-pkg-config" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/spirv-tools-shared-pkg-config.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-shared-pkg-config.dir/depend.internal b/3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-shared-pkg-config.dir/depend.internal new file mode 100644 index 000000000..d827cd848 --- /dev/null +++ b/3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-shared-pkg-config.dir/depend.internal @@ -0,0 +1,3 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + diff --git a/3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-shared-pkg-config.dir/depend.make b/3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-shared-pkg-config.dir/depend.make new file mode 100644 index 000000000..d827cd848 --- /dev/null +++ b/3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-shared-pkg-config.dir/depend.make @@ -0,0 +1,3 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + diff --git a/3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-shared-pkg-config.dir/progress.make b/3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-shared-pkg-config.dir/progress.make new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/3rdparty/spirv-tools/build/CMakeFiles/spirv-tools-shared-pkg-config.dir/progress.make @@ -0,0 +1 @@ + diff --git a/3rdparty/spirv-tools/build/CTestTestfile.cmake b/3rdparty/spirv-tools/build/CTestTestfile.cmake new file mode 100644 index 000000000..78fa07154 --- /dev/null +++ b/3rdparty/spirv-tools/build/CTestTestfile.cmake @@ -0,0 +1,13 @@ +# CMake generated Testfile for +# Source directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools +# Build directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. +add_test(spirv-tools-copyrights "/usr/bin/python" "utils/check_copyright.py") +set_tests_properties(spirv-tools-copyrights PROPERTIES WORKING_DIRECTORY "/home/bkaradzic/Private/projects/_github/SPIRV-Tools") +subdirs(external) +subdirs(source) +subdirs(tools) +subdirs(test) +subdirs(examples) diff --git a/3rdparty/spirv-tools/build/DebugInfo.h b/3rdparty/spirv-tools/build/DebugInfo.h new file mode 100644 index 000000000..9639ea107 --- /dev/null +++ b/3rdparty/spirv-tools/build/DebugInfo.h @@ -0,0 +1,137 @@ +// Copyright (c) 2017 The Khronos Group Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and/or associated documentation files (the "Materials"), +// to deal in the Materials without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Materials, and to permit persons to whom the +// Materials are furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Materials. +// +// MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS +// STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND +// HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/ +// +// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM,OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS +// IN THE MATERIALS. + +#ifndef SPIRV_EXTINST_DebugInfo_H_ +#define SPIRV_EXTINST_DebugInfo_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +enum { DebugInfoVersion = 100, DebugInfoVersion_BitWidthPadding = 0x7fffffff }; +enum { DebugInfoRevision = 1, DebugInfoRevision_BitWidthPadding = 0x7fffffff }; + +enum DebugInfoInstructions { + DebugInfoDebugInfoNone = 0, + DebugInfoDebugCompilationUnit = 1, + DebugInfoDebugTypeBasic = 2, + DebugInfoDebugTypePointer = 3, + DebugInfoDebugTypeQualifier = 4, + DebugInfoDebugTypeArray = 5, + DebugInfoDebugTypeVector = 6, + DebugInfoDebugTypedef = 7, + DebugInfoDebugTypeFunction = 8, + DebugInfoDebugTypeEnum = 9, + DebugInfoDebugTypeComposite = 10, + DebugInfoDebugTypeMember = 11, + DebugInfoDebugTypeInheritance = 12, + DebugInfoDebugTypePtrToMember = 13, + DebugInfoDebugTypeTemplate = 14, + DebugInfoDebugTypeTemplateParameter = 15, + DebugInfoDebugTypeTemplateTemplateParameter = 16, + DebugInfoDebugTypeTemplateParameterPack = 17, + DebugInfoDebugGlobalVariable = 18, + DebugInfoDebugFunctionDeclaration = 19, + DebugInfoDebugFunction = 20, + DebugInfoDebugLexicalBlock = 21, + DebugInfoDebugLexicalBlockDiscriminator = 22, + DebugInfoDebugScope = 23, + DebugInfoDebugNoScope = 24, + DebugInfoDebugInlinedAt = 25, + DebugInfoDebugLocalVariable = 26, + DebugInfoDebugInlinedVariable = 27, + DebugInfoDebugDeclare = 28, + DebugInfoDebugValue = 29, + DebugInfoDebugOperation = 30, + DebugInfoDebugExpression = 31, + DebugInfoDebugMacroDef = 32, + DebugInfoDebugMacroUndef = 33, + DebugInfoInstructionsMax = 0x7ffffff +}; + + +enum DebugInfoDebugInfoFlags { + DebugInfoFlagIsProtected = 0x01, + DebugInfoFlagIsPrivate = 0x02, + DebugInfoFlagIsPublic = 0x03, + DebugInfoFlagIsLocal = 0x04, + DebugInfoFlagIsDefinition = 0x08, + DebugInfoFlagFwdDecl = 0x10, + DebugInfoFlagArtificial = 0x20, + DebugInfoFlagExplicit = 0x40, + DebugInfoFlagPrototyped = 0x80, + DebugInfoFlagObjectPointer = 0x100, + DebugInfoFlagStaticMember = 0x200, + DebugInfoFlagIndirectVariable = 0x400, + DebugInfoFlagLValueReference = 0x800, + DebugInfoFlagRValueReference = 0x1000, + DebugInfoFlagIsOptimized = 0x2000, + DebugInfoDebugInfoFlagsMax = 0x7ffffff +}; + +enum DebugInfoDebugBaseTypeAttributeEncoding { + DebugInfoUnspecified = 0, + DebugInfoAddress = 1, + DebugInfoBoolean = 2, + DebugInfoFloat = 4, + DebugInfoSigned = 5, + DebugInfoSignedChar = 6, + DebugInfoUnsigned = 7, + DebugInfoUnsignedChar = 8, + DebugInfoDebugBaseTypeAttributeEncodingMax = 0x7ffffff +}; + +enum DebugInfoDebugCompositeType { + DebugInfoClass = 0, + DebugInfoStructure = 1, + DebugInfoUnion = 2, + DebugInfoDebugCompositeTypeMax = 0x7ffffff +}; + +enum DebugInfoDebugTypeQualifier { + DebugInfoConstType = 0, + DebugInfoVolatileType = 1, + DebugInfoRestrictType = 2, + DebugInfoDebugTypeQualifierMax = 0x7ffffff +}; + +enum DebugInfoDebugOperation { + DebugInfoDeref = 0, + DebugInfoPlus = 1, + DebugInfoMinus = 2, + DebugInfoPlusUconst = 3, + DebugInfoBitPiece = 4, + DebugInfoSwap = 5, + DebugInfoXderef = 6, + DebugInfoStackValue = 7, + DebugInfoConstu = 8, + DebugInfoDebugOperationMax = 0x7ffffff +}; + + +#ifdef __cplusplus +} +#endif + +#endif // SPIRV_EXTINST_DebugInfo_H_ diff --git a/3rdparty/spirv-tools/build/Makefile b/3rdparty/spirv-tools/build/Makefile new file mode 100644 index 000000000..869168b18 --- /dev/null +++ b/3rdparty/spirv-tools/build/Makefile @@ -0,0 +1,502 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Default target executed when no arguments are given to make. +default_target: all + +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache + +.PHONY : rebuild_cache/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..." + /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache + +.PHONY : edit_cache/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Available install components are: \"Unspecified\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components + +.PHONY : list_install_components/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: install/local + +.PHONY : install/local/fast + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running tests..." + /usr/bin/ctest --force-new-ctest-process $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test + +.PHONY : test/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: install/strip + +.PHONY : install/strip/fast + +# The main all target +all: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles/progress.marks + $(MAKE) -f CMakeFiles/Makefile2 all + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + $(MAKE) -f CMakeFiles/Makefile2 clean +.PHONY : clean + +# The main clean target +clean/fast: clean + +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + $(MAKE) -f CMakeFiles/Makefile2 preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + $(MAKE) -f CMakeFiles/Makefile2 preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +#============================================================================= +# Target rules for targets named spirv-tools-shared-pkg-config + +# Build rule for target. +spirv-tools-shared-pkg-config: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 spirv-tools-shared-pkg-config +.PHONY : spirv-tools-shared-pkg-config + +# fast build rule for target. +spirv-tools-shared-pkg-config/fast: + $(MAKE) -f CMakeFiles/spirv-tools-shared-pkg-config.dir/build.make CMakeFiles/spirv-tools-shared-pkg-config.dir/build +.PHONY : spirv-tools-shared-pkg-config/fast + +#============================================================================= +# Target rules for targets named spirv-tools-pkg-config + +# Build rule for target. +spirv-tools-pkg-config: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 spirv-tools-pkg-config +.PHONY : spirv-tools-pkg-config + +# fast build rule for target. +spirv-tools-pkg-config/fast: + $(MAKE) -f CMakeFiles/spirv-tools-pkg-config.dir/build.make CMakeFiles/spirv-tools-pkg-config.dir/build +.PHONY : spirv-tools-pkg-config/fast + +#============================================================================= +# Target rules for targets named spirv-tools-debuginfo + +# Build rule for target. +spirv-tools-debuginfo: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 spirv-tools-debuginfo +.PHONY : spirv-tools-debuginfo + +# fast build rule for target. +spirv-tools-debuginfo/fast: + $(MAKE) -f source/CMakeFiles/spirv-tools-debuginfo.dir/build.make source/CMakeFiles/spirv-tools-debuginfo.dir/build +.PHONY : spirv-tools-debuginfo/fast + +#============================================================================= +# Target rules for targets named spirv-tools-spv-amd-shader-ballot + +# Build rule for target. +spirv-tools-spv-amd-shader-ballot: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 spirv-tools-spv-amd-shader-ballot +.PHONY : spirv-tools-spv-amd-shader-ballot + +# fast build rule for target. +spirv-tools-spv-amd-shader-ballot/fast: + $(MAKE) -f source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/build.make source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/build +.PHONY : spirv-tools-spv-amd-shader-ballot/fast + +#============================================================================= +# Target rules for targets named spirv-tools-spv-amd-shader-trinary-minmax + +# Build rule for target. +spirv-tools-spv-amd-shader-trinary-minmax: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 spirv-tools-spv-amd-shader-trinary-minmax +.PHONY : spirv-tools-spv-amd-shader-trinary-minmax + +# fast build rule for target. +spirv-tools-spv-amd-shader-trinary-minmax/fast: + $(MAKE) -f source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/build.make source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/build +.PHONY : spirv-tools-spv-amd-shader-trinary-minmax/fast + +#============================================================================= +# Target rules for targets named spirv-tools-spv-amd-gcn-shader + +# Build rule for target. +spirv-tools-spv-amd-gcn-shader: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 spirv-tools-spv-amd-gcn-shader +.PHONY : spirv-tools-spv-amd-gcn-shader + +# fast build rule for target. +spirv-tools-spv-amd-gcn-shader/fast: + $(MAKE) -f source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/build.make source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/build +.PHONY : spirv-tools-spv-amd-gcn-shader/fast + +#============================================================================= +# Target rules for targets named spirv-tools-header-DebugInfo + +# Build rule for target. +spirv-tools-header-DebugInfo: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 spirv-tools-header-DebugInfo +.PHONY : spirv-tools-header-DebugInfo + +# fast build rule for target. +spirv-tools-header-DebugInfo/fast: + $(MAKE) -f source/CMakeFiles/spirv-tools-header-DebugInfo.dir/build.make source/CMakeFiles/spirv-tools-header-DebugInfo.dir/build +.PHONY : spirv-tools-header-DebugInfo/fast + +#============================================================================= +# Target rules for targets named spirv-tools-build-version + +# Build rule for target. +spirv-tools-build-version: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 spirv-tools-build-version +.PHONY : spirv-tools-build-version + +# fast build rule for target. +spirv-tools-build-version/fast: + $(MAKE) -f source/CMakeFiles/spirv-tools-build-version.dir/build.make source/CMakeFiles/spirv-tools-build-version.dir/build +.PHONY : spirv-tools-build-version/fast + +#============================================================================= +# Target rules for targets named SPIRV-Tools + +# Build rule for target. +SPIRV-Tools: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 SPIRV-Tools +.PHONY : SPIRV-Tools + +# fast build rule for target. +SPIRV-Tools/fast: + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/build +.PHONY : SPIRV-Tools/fast + +#============================================================================= +# Target rules for targets named spirv-tools-spv-amd-shader-explicit-vertex-parameter + +# Build rule for target. +spirv-tools-spv-amd-shader-explicit-vertex-parameter: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 spirv-tools-spv-amd-shader-explicit-vertex-parameter +.PHONY : spirv-tools-spv-amd-shader-explicit-vertex-parameter + +# fast build rule for target. +spirv-tools-spv-amd-shader-explicit-vertex-parameter/fast: + $(MAKE) -f source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/build.make source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/build +.PHONY : spirv-tools-spv-amd-shader-explicit-vertex-parameter/fast + +#============================================================================= +# Target rules for targets named SPIRV-Tools-shared + +# Build rule for target. +SPIRV-Tools-shared: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 SPIRV-Tools-shared +.PHONY : SPIRV-Tools-shared + +# fast build rule for target. +SPIRV-Tools-shared/fast: + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/build +.PHONY : SPIRV-Tools-shared/fast + +#============================================================================= +# Target rules for targets named spirv-tools-vimsyntax + +# Build rule for target. +spirv-tools-vimsyntax: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 spirv-tools-vimsyntax +.PHONY : spirv-tools-vimsyntax + +# fast build rule for target. +spirv-tools-vimsyntax/fast: + $(MAKE) -f source/CMakeFiles/spirv-tools-vimsyntax.dir/build.make source/CMakeFiles/spirv-tools-vimsyntax.dir/build +.PHONY : spirv-tools-vimsyntax/fast + +#============================================================================= +# Target rules for targets named SPIRV-Tools-opt + +# Build rule for target. +SPIRV-Tools-opt: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 SPIRV-Tools-opt +.PHONY : SPIRV-Tools-opt + +# fast build rule for target. +SPIRV-Tools-opt/fast: + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build +.PHONY : SPIRV-Tools-opt/fast + +#============================================================================= +# Target rules for targets named SPIRV-Tools-link + +# Build rule for target. +SPIRV-Tools-link: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 SPIRV-Tools-link +.PHONY : SPIRV-Tools-link + +# fast build rule for target. +SPIRV-Tools-link/fast: + $(MAKE) -f source/link/CMakeFiles/SPIRV-Tools-link.dir/build.make source/link/CMakeFiles/SPIRV-Tools-link.dir/build +.PHONY : SPIRV-Tools-link/fast + +#============================================================================= +# Target rules for targets named spirv-cfg + +# Build rule for target. +spirv-cfg: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 spirv-cfg +.PHONY : spirv-cfg + +# fast build rule for target. +spirv-cfg/fast: + $(MAKE) -f tools/CMakeFiles/spirv-cfg.dir/build.make tools/CMakeFiles/spirv-cfg.dir/build +.PHONY : spirv-cfg/fast + +#============================================================================= +# Target rules for targets named spirv-dis + +# Build rule for target. +spirv-dis: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 spirv-dis +.PHONY : spirv-dis + +# fast build rule for target. +spirv-dis/fast: + $(MAKE) -f tools/CMakeFiles/spirv-dis.dir/build.make tools/CMakeFiles/spirv-dis.dir/build +.PHONY : spirv-dis/fast + +#============================================================================= +# Target rules for targets named spirv-as + +# Build rule for target. +spirv-as: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 spirv-as +.PHONY : spirv-as + +# fast build rule for target. +spirv-as/fast: + $(MAKE) -f tools/CMakeFiles/spirv-as.dir/build.make tools/CMakeFiles/spirv-as.dir/build +.PHONY : spirv-as/fast + +#============================================================================= +# Target rules for targets named spirv-val + +# Build rule for target. +spirv-val: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 spirv-val +.PHONY : spirv-val + +# fast build rule for target. +spirv-val/fast: + $(MAKE) -f tools/CMakeFiles/spirv-val.dir/build.make tools/CMakeFiles/spirv-val.dir/build +.PHONY : spirv-val/fast + +#============================================================================= +# Target rules for targets named spirv-link + +# Build rule for target. +spirv-link: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 spirv-link +.PHONY : spirv-link + +# fast build rule for target. +spirv-link/fast: + $(MAKE) -f tools/CMakeFiles/spirv-link.dir/build.make tools/CMakeFiles/spirv-link.dir/build +.PHONY : spirv-link/fast + +#============================================================================= +# Target rules for targets named spirv-opt + +# Build rule for target. +spirv-opt: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 spirv-opt +.PHONY : spirv-opt + +# fast build rule for target. +spirv-opt/fast: + $(MAKE) -f tools/CMakeFiles/spirv-opt.dir/build.make tools/CMakeFiles/spirv-opt.dir/build +.PHONY : spirv-opt/fast + +#============================================================================= +# Target rules for targets named spirv-stats + +# Build rule for target. +spirv-stats: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 spirv-stats +.PHONY : spirv-stats + +# fast build rule for target. +spirv-stats/fast: + $(MAKE) -f tools/CMakeFiles/spirv-stats.dir/build.make tools/CMakeFiles/spirv-stats.dir/build +.PHONY : spirv-stats/fast + +#============================================================================= +# Target rules for targets named spirv-tools-cpp-example + +# Build rule for target. +spirv-tools-cpp-example: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 spirv-tools-cpp-example +.PHONY : spirv-tools-cpp-example + +# fast build rule for target. +spirv-tools-cpp-example/fast: + $(MAKE) -f examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/build.make examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/build +.PHONY : spirv-tools-cpp-example/fast + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... install" + @echo "... rebuild_cache" + @echo "... spirv-tools-shared-pkg-config" + @echo "... edit_cache" + @echo "... spirv-tools-pkg-config" + @echo "... list_install_components" + @echo "... install/local" + @echo "... test" + @echo "... install/strip" + @echo "... spirv-tools-debuginfo" + @echo "... spirv-tools-spv-amd-shader-ballot" + @echo "... spirv-tools-spv-amd-shader-trinary-minmax" + @echo "... spirv-tools-spv-amd-gcn-shader" + @echo "... spirv-tools-header-DebugInfo" + @echo "... spirv-tools-build-version" + @echo "... SPIRV-Tools" + @echo "... spirv-tools-spv-amd-shader-explicit-vertex-parameter" + @echo "... SPIRV-Tools-shared" + @echo "... spirv-tools-vimsyntax" + @echo "... SPIRV-Tools-opt" + @echo "... SPIRV-Tools-link" + @echo "... spirv-cfg" + @echo "... spirv-dis" + @echo "... spirv-as" + @echo "... spirv-val" + @echo "... spirv-link" + @echo "... spirv-opt" + @echo "... spirv-stats" + @echo "... spirv-tools-cpp-example" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/3rdparty/spirv-tools/build/SPIRV-Tools-shared.pc b/3rdparty/spirv-tools/build/SPIRV-Tools-shared.pc new file mode 100644 index 000000000..e6d734f45 --- /dev/null +++ b/3rdparty/spirv-tools/build/SPIRV-Tools-shared.pc @@ -0,0 +1,12 @@ +prefix=/usr/local +exec_prefix=${prefix} +libdir=${prefix}/lib +includedir=${prefix}/include + +Name: SPIRV-Tools +Description: Tools for SPIR-V +Version: 2018.6.0 +URL: https://github.com/KhronosGroup/SPIRV-Tools + +Libs: -L${libdir} -lSPIRV-Tools-shared +Cflags: -I${includedir} diff --git a/3rdparty/spirv-tools/build/SPIRV-Tools.pc b/3rdparty/spirv-tools/build/SPIRV-Tools.pc new file mode 100644 index 000000000..79f0f0a14 --- /dev/null +++ b/3rdparty/spirv-tools/build/SPIRV-Tools.pc @@ -0,0 +1,12 @@ +prefix=/usr/local +exec_prefix=${prefix} +libdir=${prefix}/lib +includedir=${prefix}/include + +Name: SPIRV-Tools +Description: Tools for SPIR-V +Version: 2018.6.0 +URL: https://github.com/KhronosGroup/SPIRV-Tools + +Libs: -L${libdir} -lSPIRV-Tools -lSPIRV-Tools-link -lSPIRV-Tools-opt +Cflags: -I${includedir} diff --git a/3rdparty/spirv-tools/build/build-version.inc b/3rdparty/spirv-tools/build/build-version.inc new file mode 100644 index 000000000..a7fe36a5e --- /dev/null +++ b/3rdparty/spirv-tools/build/build-version.inc @@ -0,0 +1 @@ +"v2018.6-dev", "SPIRV-Tools v2018.6-dev v2018.5-62-g5bc3078" diff --git a/3rdparty/spirv-tools/build/cmake_install.cmake b/3rdparty/spirv-tools/build/cmake_install.cmake new file mode 100644 index 000000000..ba9b6c47d --- /dev/null +++ b/3rdparty/spirv-tools/build/cmake_install.cmake @@ -0,0 +1,70 @@ +# Install script for directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Debug") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "1") +endif() + +if(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/include/spirv-tools" TYPE FILE FILES + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/include/spirv-tools/libspirv.h" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/include/spirv-tools/libspirv.hpp" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/include/spirv-tools/optimizer.hpp" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/include/spirv-tools/linker.hpp" + ) +endif() + +if(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/pkgconfig" TYPE FILE FILES + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/SPIRV-Tools.pc" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/SPIRV-Tools-shared.pc" + ) +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + # Include the install script for each subdirectory. + include("/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/external/cmake_install.cmake") + include("/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/cmake_install.cmake") + include("/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/cmake_install.cmake") + include("/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/cmake_install.cmake") + include("/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/examples/cmake_install.cmake") + +endif() + +if(CMAKE_INSTALL_COMPONENT) + set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") +else() + set(CMAKE_INSTALL_MANIFEST "install_manifest.txt") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +file(WRITE "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/${CMAKE_INSTALL_MANIFEST}" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") diff --git a/3rdparty/spirv-tools/build/core.insts-unified1.inc b/3rdparty/spirv-tools/build/core.insts-unified1.inc new file mode 100644 index 000000000..e7e16db6b --- /dev/null +++ b/3rdparty/spirv-tools/build/core.insts-unified1.inc @@ -0,0 +1,410 @@ +static const SpvCapability pygen_variable_caps_Addresses[] = {SpvCapabilityAddresses}; +static const SpvCapability pygen_variable_caps_AddressesVariablePointersVariablePointersStorageBuffer[] = {SpvCapabilityAddresses, SpvCapabilityVariablePointers, SpvCapabilityVariablePointersStorageBuffer}; +static const SpvCapability pygen_variable_caps_DerivativeControl[] = {SpvCapabilityDerivativeControl}; +static const SpvCapability pygen_variable_caps_DeviceEnqueue[] = {SpvCapabilityDeviceEnqueue}; +static const SpvCapability pygen_variable_caps_FragmentMaskAMD[] = {SpvCapabilityFragmentMaskAMD}; +static const SpvCapability pygen_variable_caps_Geometry[] = {SpvCapabilityGeometry}; +static const SpvCapability pygen_variable_caps_GeometryStreams[] = {SpvCapabilityGeometryStreams}; +static const SpvCapability pygen_variable_caps_GroupNonUniform[] = {SpvCapabilityGroupNonUniform}; +static const SpvCapability pygen_variable_caps_GroupNonUniformArithmeticGroupNonUniformClustered[] = {SpvCapabilityGroupNonUniformArithmetic, SpvCapabilityGroupNonUniformClustered}; +static const SpvCapability pygen_variable_caps_GroupNonUniformBallot[] = {SpvCapabilityGroupNonUniformBallot}; +static const SpvCapability pygen_variable_caps_GroupNonUniformPartitionedNV[] = {SpvCapabilityGroupNonUniformPartitionedNV}; +static const SpvCapability pygen_variable_caps_GroupNonUniformQuad[] = {SpvCapabilityGroupNonUniformQuad}; +static const SpvCapability pygen_variable_caps_GroupNonUniformShuffle[] = {SpvCapabilityGroupNonUniformShuffle}; +static const SpvCapability pygen_variable_caps_GroupNonUniformShuffleRelative[] = {SpvCapabilityGroupNonUniformShuffleRelative}; +static const SpvCapability pygen_variable_caps_GroupNonUniformVote[] = {SpvCapabilityGroupNonUniformVote}; +static const SpvCapability pygen_variable_caps_Groups[] = {SpvCapabilityGroups}; +static const SpvCapability pygen_variable_caps_ImageQuery[] = {SpvCapabilityImageQuery}; +static const SpvCapability pygen_variable_caps_Kernel[] = {SpvCapabilityKernel}; +static const SpvCapability pygen_variable_caps_KernelImageQuery[] = {SpvCapabilityKernel, SpvCapabilityImageQuery}; +static const SpvCapability pygen_variable_caps_LiteralSampler[] = {SpvCapabilityLiteralSampler}; +static const SpvCapability pygen_variable_caps_Matrix[] = {SpvCapabilityMatrix}; +static const SpvCapability pygen_variable_caps_NamedBarrier[] = {SpvCapabilityNamedBarrier}; +static const SpvCapability pygen_variable_caps_PipeStorage[] = {SpvCapabilityPipeStorage}; +static const SpvCapability pygen_variable_caps_Pipes[] = {SpvCapabilityPipes}; +static const SpvCapability pygen_variable_caps_Shader[] = {SpvCapabilityShader}; +static const SpvCapability pygen_variable_caps_SparseResidency[] = {SpvCapabilitySparseResidency}; +static const SpvCapability pygen_variable_caps_SubgroupBallotKHR[] = {SpvCapabilitySubgroupBallotKHR}; +static const SpvCapability pygen_variable_caps_SubgroupBufferBlockIOINTEL[] = {SpvCapabilitySubgroupBufferBlockIOINTEL}; +static const SpvCapability pygen_variable_caps_SubgroupDispatch[] = {SpvCapabilitySubgroupDispatch}; +static const SpvCapability pygen_variable_caps_SubgroupImageBlockIOINTEL[] = {SpvCapabilitySubgroupImageBlockIOINTEL}; +static const SpvCapability pygen_variable_caps_SubgroupShuffleINTEL[] = {SpvCapabilitySubgroupShuffleINTEL}; +static const SpvCapability pygen_variable_caps_SubgroupVoteKHR[] = {SpvCapabilitySubgroupVoteKHR}; + +static const spvtools::Extension pygen_variable_exts_SPV_AMD_shader_ballot[] = {spvtools::Extension::kSPV_AMD_shader_ballot}; +static const spvtools::Extension pygen_variable_exts_SPV_AMD_shader_fragment_mask[] = {spvtools::Extension::kSPV_AMD_shader_fragment_mask}; +static const spvtools::Extension pygen_variable_exts_SPV_GOOGLE_decorate_stringSPV_GOOGLE_hlsl_functionality1[] = {spvtools::Extension::kSPV_GOOGLE_decorate_string, spvtools::Extension::kSPV_GOOGLE_hlsl_functionality1}; +static const spvtools::Extension pygen_variable_exts_SPV_GOOGLE_hlsl_functionality1[] = {spvtools::Extension::kSPV_GOOGLE_hlsl_functionality1}; +static const spvtools::Extension pygen_variable_exts_SPV_KHR_shader_ballot[] = {spvtools::Extension::kSPV_KHR_shader_ballot}; +static const spvtools::Extension pygen_variable_exts_SPV_KHR_subgroup_vote[] = {spvtools::Extension::kSPV_KHR_subgroup_vote}; +static const spvtools::Extension pygen_variable_exts_SPV_NV_shader_subgroup_partitioned[] = {spvtools::Extension::kSPV_NV_shader_subgroup_partitioned}; + +static const spv_opcode_desc_t kOpcodeTableEntries[] = { + {"Nop", SpvOpNop, 0, nullptr, 0, {}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Undef", SpvOpUndef, 0, nullptr, 2, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SourceContinued", SpvOpSourceContinued, 0, nullptr, 1, {SPV_OPERAND_TYPE_LITERAL_STRING}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Source", SpvOpSource, 0, nullptr, 4, {SPV_OPERAND_TYPE_SOURCE_LANGUAGE, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_OPTIONAL_ID, SPV_OPERAND_TYPE_OPTIONAL_LITERAL_STRING}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SourceExtension", SpvOpSourceExtension, 0, nullptr, 1, {SPV_OPERAND_TYPE_LITERAL_STRING}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Name", SpvOpName, 0, nullptr, 2, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_STRING}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"MemberName", SpvOpMemberName, 0, nullptr, 3, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_STRING}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"String", SpvOpString, 0, nullptr, 2, {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_LITERAL_STRING}, 1, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Line", SpvOpLine, 0, nullptr, 3, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Extension", SpvOpExtension, 0, nullptr, 1, {SPV_OPERAND_TYPE_LITERAL_STRING}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ExtInstImport", SpvOpExtInstImport, 0, nullptr, 2, {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_LITERAL_STRING}, 1, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ExtInst", SpvOpExtInst, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_EXTENSION_INSTRUCTION_NUMBER}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"MemoryModel", SpvOpMemoryModel, 0, nullptr, 2, {SPV_OPERAND_TYPE_ADDRESSING_MODEL, SPV_OPERAND_TYPE_MEMORY_MODEL}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"EntryPoint", SpvOpEntryPoint, 0, nullptr, 4, {SPV_OPERAND_TYPE_EXECUTION_MODEL, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_STRING, SPV_OPERAND_TYPE_VARIABLE_ID}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ExecutionMode", SpvOpExecutionMode, 0, nullptr, 2, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_EXECUTION_MODE}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Capability", SpvOpCapability, 0, nullptr, 1, {SPV_OPERAND_TYPE_CAPABILITY}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"TypeVoid", SpvOpTypeVoid, 0, nullptr, 1, {SPV_OPERAND_TYPE_RESULT_ID}, 1, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"TypeBool", SpvOpTypeBool, 0, nullptr, 1, {SPV_OPERAND_TYPE_RESULT_ID}, 1, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"TypeInt", SpvOpTypeInt, 0, nullptr, 3, {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER}, 1, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"TypeFloat", SpvOpTypeFloat, 0, nullptr, 2, {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_LITERAL_INTEGER}, 1, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"TypeVector", SpvOpTypeVector, 0, nullptr, 3, {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_INTEGER}, 1, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"TypeMatrix", SpvOpTypeMatrix, 1, pygen_variable_caps_Matrix, 3, {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_INTEGER}, 1, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"TypeImage", SpvOpTypeImage, 0, nullptr, 9, {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_DIMENSIONALITY, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT, SPV_OPERAND_TYPE_OPTIONAL_ACCESS_QUALIFIER}, 1, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"TypeSampler", SpvOpTypeSampler, 0, nullptr, 1, {SPV_OPERAND_TYPE_RESULT_ID}, 1, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"TypeSampledImage", SpvOpTypeSampledImage, 0, nullptr, 2, {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"TypeArray", SpvOpTypeArray, 0, nullptr, 3, {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"TypeRuntimeArray", SpvOpTypeRuntimeArray, 1, pygen_variable_caps_Shader, 2, {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"TypeStruct", SpvOpTypeStruct, 0, nullptr, 2, {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_VARIABLE_ID}, 1, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"TypeOpaque", SpvOpTypeOpaque, 1, pygen_variable_caps_Kernel, 2, {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_LITERAL_STRING}, 1, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"TypePointer", SpvOpTypePointer, 0, nullptr, 3, {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_STORAGE_CLASS, SPV_OPERAND_TYPE_ID}, 1, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"TypeFunction", SpvOpTypeFunction, 0, nullptr, 3, {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_VARIABLE_ID}, 1, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"TypeEvent", SpvOpTypeEvent, 1, pygen_variable_caps_Kernel, 1, {SPV_OPERAND_TYPE_RESULT_ID}, 1, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"TypeDeviceEvent", SpvOpTypeDeviceEvent, 1, pygen_variable_caps_DeviceEnqueue, 1, {SPV_OPERAND_TYPE_RESULT_ID}, 1, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"TypeReserveId", SpvOpTypeReserveId, 1, pygen_variable_caps_Pipes, 1, {SPV_OPERAND_TYPE_RESULT_ID}, 1, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"TypeQueue", SpvOpTypeQueue, 1, pygen_variable_caps_DeviceEnqueue, 1, {SPV_OPERAND_TYPE_RESULT_ID}, 1, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"TypePipe", SpvOpTypePipe, 1, pygen_variable_caps_Pipes, 2, {SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ACCESS_QUALIFIER}, 1, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"TypeForwardPointer", SpvOpTypeForwardPointer, 1, pygen_variable_caps_Addresses, 2, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_STORAGE_CLASS}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ConstantTrue", SpvOpConstantTrue, 0, nullptr, 2, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ConstantFalse", SpvOpConstantFalse, 0, nullptr, 2, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Constant", SpvOpConstant, 0, nullptr, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_TYPED_LITERAL_NUMBER}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ConstantComposite", SpvOpConstantComposite, 0, nullptr, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_VARIABLE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ConstantSampler", SpvOpConstantSampler, 1, pygen_variable_caps_LiteralSampler, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ConstantNull", SpvOpConstantNull, 0, nullptr, 2, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SpecConstantTrue", SpvOpSpecConstantTrue, 0, nullptr, 2, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SpecConstantFalse", SpvOpSpecConstantFalse, 0, nullptr, 2, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SpecConstant", SpvOpSpecConstant, 0, nullptr, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_TYPED_LITERAL_NUMBER}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SpecConstantComposite", SpvOpSpecConstantComposite, 0, nullptr, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_VARIABLE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SpecConstantOp", SpvOpSpecConstantOp, 0, nullptr, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SPEC_CONSTANT_OP_NUMBER}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Function", SpvOpFunction, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_FUNCTION_CONTROL, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"FunctionParameter", SpvOpFunctionParameter, 0, nullptr, 2, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"FunctionEnd", SpvOpFunctionEnd, 0, nullptr, 0, {}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"FunctionCall", SpvOpFunctionCall, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_VARIABLE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Variable", SpvOpVariable, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_STORAGE_CLASS, SPV_OPERAND_TYPE_OPTIONAL_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ImageTexelPointer", SpvOpImageTexelPointer, 0, nullptr, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Load", SpvOpLoad, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Store", SpvOpStore, 0, nullptr, 3, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"CopyMemory", SpvOpCopyMemory, 0, nullptr, 3, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"CopyMemorySized", SpvOpCopyMemorySized, 1, pygen_variable_caps_Addresses, 4, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"AccessChain", SpvOpAccessChain, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_VARIABLE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"InBoundsAccessChain", SpvOpInBoundsAccessChain, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_VARIABLE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"PtrAccessChain", SpvOpPtrAccessChain, 3, pygen_variable_caps_AddressesVariablePointersVariablePointersStorageBuffer, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_VARIABLE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ArrayLength", SpvOpArrayLength, 1, pygen_variable_caps_Shader, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_INTEGER}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"GenericPtrMemSemantics", SpvOpGenericPtrMemSemantics, 1, pygen_variable_caps_Kernel, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"InBoundsPtrAccessChain", SpvOpInBoundsPtrAccessChain, 1, pygen_variable_caps_Addresses, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_VARIABLE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Decorate", SpvOpDecorate, 0, nullptr, 2, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_DECORATION}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"MemberDecorate", SpvOpMemberDecorate, 0, nullptr, 3, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_DECORATION}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"DecorationGroup", SpvOpDecorationGroup, 0, nullptr, 1, {SPV_OPERAND_TYPE_RESULT_ID}, 1, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"GroupDecorate", SpvOpGroupDecorate, 0, nullptr, 2, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_VARIABLE_ID}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"GroupMemberDecorate", SpvOpGroupMemberDecorate, 0, nullptr, 2, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_VARIABLE_ID_LITERAL_INTEGER}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"VectorExtractDynamic", SpvOpVectorExtractDynamic, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"VectorInsertDynamic", SpvOpVectorInsertDynamic, 0, nullptr, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"VectorShuffle", SpvOpVectorShuffle, 0, nullptr, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_VARIABLE_LITERAL_INTEGER}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"CompositeConstruct", SpvOpCompositeConstruct, 0, nullptr, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_VARIABLE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"CompositeExtract", SpvOpCompositeExtract, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_VARIABLE_LITERAL_INTEGER}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"CompositeInsert", SpvOpCompositeInsert, 0, nullptr, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_VARIABLE_LITERAL_INTEGER}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"CopyObject", SpvOpCopyObject, 0, nullptr, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Transpose", SpvOpTranspose, 1, pygen_variable_caps_Matrix, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SampledImage", SpvOpSampledImage, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ImageSampleImplicitLod", SpvOpImageSampleImplicitLod, 1, pygen_variable_caps_Shader, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_IMAGE}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ImageSampleExplicitLod", SpvOpImageSampleExplicitLod, 0, nullptr, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_IMAGE}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ImageSampleDrefImplicitLod", SpvOpImageSampleDrefImplicitLod, 1, pygen_variable_caps_Shader, 6, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_IMAGE}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ImageSampleDrefExplicitLod", SpvOpImageSampleDrefExplicitLod, 1, pygen_variable_caps_Shader, 6, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_IMAGE}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ImageSampleProjImplicitLod", SpvOpImageSampleProjImplicitLod, 1, pygen_variable_caps_Shader, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_IMAGE}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ImageSampleProjExplicitLod", SpvOpImageSampleProjExplicitLod, 1, pygen_variable_caps_Shader, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_IMAGE}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ImageSampleProjDrefImplicitLod", SpvOpImageSampleProjDrefImplicitLod, 1, pygen_variable_caps_Shader, 6, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_IMAGE}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ImageSampleProjDrefExplicitLod", SpvOpImageSampleProjDrefExplicitLod, 1, pygen_variable_caps_Shader, 6, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_IMAGE}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ImageFetch", SpvOpImageFetch, 0, nullptr, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_IMAGE}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ImageGather", SpvOpImageGather, 1, pygen_variable_caps_Shader, 6, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_IMAGE}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ImageDrefGather", SpvOpImageDrefGather, 1, pygen_variable_caps_Shader, 6, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_IMAGE}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ImageRead", SpvOpImageRead, 0, nullptr, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_IMAGE}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ImageWrite", SpvOpImageWrite, 0, nullptr, 4, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_IMAGE}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Image", SpvOpImage, 0, nullptr, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ImageQueryFormat", SpvOpImageQueryFormat, 1, pygen_variable_caps_Kernel, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ImageQueryOrder", SpvOpImageQueryOrder, 1, pygen_variable_caps_Kernel, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ImageQuerySizeLod", SpvOpImageQuerySizeLod, 2, pygen_variable_caps_KernelImageQuery, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ImageQuerySize", SpvOpImageQuerySize, 2, pygen_variable_caps_KernelImageQuery, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ImageQueryLod", SpvOpImageQueryLod, 1, pygen_variable_caps_ImageQuery, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ImageQueryLevels", SpvOpImageQueryLevels, 2, pygen_variable_caps_KernelImageQuery, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ImageQuerySamples", SpvOpImageQuerySamples, 2, pygen_variable_caps_KernelImageQuery, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ConvertFToU", SpvOpConvertFToU, 0, nullptr, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ConvertFToS", SpvOpConvertFToS, 0, nullptr, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ConvertSToF", SpvOpConvertSToF, 0, nullptr, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ConvertUToF", SpvOpConvertUToF, 0, nullptr, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"UConvert", SpvOpUConvert, 0, nullptr, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SConvert", SpvOpSConvert, 0, nullptr, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"FConvert", SpvOpFConvert, 0, nullptr, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"QuantizeToF16", SpvOpQuantizeToF16, 0, nullptr, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ConvertPtrToU", SpvOpConvertPtrToU, 1, pygen_variable_caps_Addresses, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SatConvertSToU", SpvOpSatConvertSToU, 1, pygen_variable_caps_Kernel, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SatConvertUToS", SpvOpSatConvertUToS, 1, pygen_variable_caps_Kernel, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ConvertUToPtr", SpvOpConvertUToPtr, 1, pygen_variable_caps_Addresses, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"PtrCastToGeneric", SpvOpPtrCastToGeneric, 1, pygen_variable_caps_Kernel, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"GenericCastToPtr", SpvOpGenericCastToPtr, 1, pygen_variable_caps_Kernel, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"GenericCastToPtrExplicit", SpvOpGenericCastToPtrExplicit, 1, pygen_variable_caps_Kernel, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_STORAGE_CLASS}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Bitcast", SpvOpBitcast, 0, nullptr, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SNegate", SpvOpSNegate, 0, nullptr, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"FNegate", SpvOpFNegate, 0, nullptr, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"IAdd", SpvOpIAdd, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"FAdd", SpvOpFAdd, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ISub", SpvOpISub, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"FSub", SpvOpFSub, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"IMul", SpvOpIMul, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"FMul", SpvOpFMul, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"UDiv", SpvOpUDiv, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SDiv", SpvOpSDiv, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"FDiv", SpvOpFDiv, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"UMod", SpvOpUMod, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SRem", SpvOpSRem, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SMod", SpvOpSMod, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"FRem", SpvOpFRem, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"FMod", SpvOpFMod, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"VectorTimesScalar", SpvOpVectorTimesScalar, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"MatrixTimesScalar", SpvOpMatrixTimesScalar, 1, pygen_variable_caps_Matrix, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"VectorTimesMatrix", SpvOpVectorTimesMatrix, 1, pygen_variable_caps_Matrix, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"MatrixTimesVector", SpvOpMatrixTimesVector, 1, pygen_variable_caps_Matrix, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"MatrixTimesMatrix", SpvOpMatrixTimesMatrix, 1, pygen_variable_caps_Matrix, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"OuterProduct", SpvOpOuterProduct, 1, pygen_variable_caps_Matrix, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Dot", SpvOpDot, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"IAddCarry", SpvOpIAddCarry, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ISubBorrow", SpvOpISubBorrow, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"UMulExtended", SpvOpUMulExtended, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SMulExtended", SpvOpSMulExtended, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Any", SpvOpAny, 0, nullptr, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"All", SpvOpAll, 0, nullptr, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"IsNan", SpvOpIsNan, 0, nullptr, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"IsInf", SpvOpIsInf, 0, nullptr, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"IsFinite", SpvOpIsFinite, 1, pygen_variable_caps_Kernel, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"IsNormal", SpvOpIsNormal, 1, pygen_variable_caps_Kernel, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SignBitSet", SpvOpSignBitSet, 1, pygen_variable_caps_Kernel, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"LessOrGreater", SpvOpLessOrGreater, 1, pygen_variable_caps_Kernel, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Ordered", SpvOpOrdered, 1, pygen_variable_caps_Kernel, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Unordered", SpvOpUnordered, 1, pygen_variable_caps_Kernel, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"LogicalEqual", SpvOpLogicalEqual, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"LogicalNotEqual", SpvOpLogicalNotEqual, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"LogicalOr", SpvOpLogicalOr, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"LogicalAnd", SpvOpLogicalAnd, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"LogicalNot", SpvOpLogicalNot, 0, nullptr, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Select", SpvOpSelect, 0, nullptr, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"IEqual", SpvOpIEqual, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"INotEqual", SpvOpINotEqual, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"UGreaterThan", SpvOpUGreaterThan, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SGreaterThan", SpvOpSGreaterThan, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"UGreaterThanEqual", SpvOpUGreaterThanEqual, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SGreaterThanEqual", SpvOpSGreaterThanEqual, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ULessThan", SpvOpULessThan, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SLessThan", SpvOpSLessThan, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ULessThanEqual", SpvOpULessThanEqual, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SLessThanEqual", SpvOpSLessThanEqual, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"FOrdEqual", SpvOpFOrdEqual, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"FUnordEqual", SpvOpFUnordEqual, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"FOrdNotEqual", SpvOpFOrdNotEqual, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"FUnordNotEqual", SpvOpFUnordNotEqual, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"FOrdLessThan", SpvOpFOrdLessThan, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"FUnordLessThan", SpvOpFUnordLessThan, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"FOrdGreaterThan", SpvOpFOrdGreaterThan, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"FUnordGreaterThan", SpvOpFUnordGreaterThan, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"FOrdLessThanEqual", SpvOpFOrdLessThanEqual, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"FUnordLessThanEqual", SpvOpFUnordLessThanEqual, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"FOrdGreaterThanEqual", SpvOpFOrdGreaterThanEqual, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"FUnordGreaterThanEqual", SpvOpFUnordGreaterThanEqual, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ShiftRightLogical", SpvOpShiftRightLogical, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ShiftRightArithmetic", SpvOpShiftRightArithmetic, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ShiftLeftLogical", SpvOpShiftLeftLogical, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"BitwiseOr", SpvOpBitwiseOr, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"BitwiseXor", SpvOpBitwiseXor, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"BitwiseAnd", SpvOpBitwiseAnd, 0, nullptr, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Not", SpvOpNot, 0, nullptr, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"BitFieldInsert", SpvOpBitFieldInsert, 1, pygen_variable_caps_Shader, 6, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"BitFieldSExtract", SpvOpBitFieldSExtract, 1, pygen_variable_caps_Shader, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"BitFieldUExtract", SpvOpBitFieldUExtract, 1, pygen_variable_caps_Shader, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"BitReverse", SpvOpBitReverse, 1, pygen_variable_caps_Shader, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"BitCount", SpvOpBitCount, 0, nullptr, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"DPdx", SpvOpDPdx, 1, pygen_variable_caps_Shader, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"DPdy", SpvOpDPdy, 1, pygen_variable_caps_Shader, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Fwidth", SpvOpFwidth, 1, pygen_variable_caps_Shader, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"DPdxFine", SpvOpDPdxFine, 1, pygen_variable_caps_DerivativeControl, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"DPdyFine", SpvOpDPdyFine, 1, pygen_variable_caps_DerivativeControl, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"FwidthFine", SpvOpFwidthFine, 1, pygen_variable_caps_DerivativeControl, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"DPdxCoarse", SpvOpDPdxCoarse, 1, pygen_variable_caps_DerivativeControl, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"DPdyCoarse", SpvOpDPdyCoarse, 1, pygen_variable_caps_DerivativeControl, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"FwidthCoarse", SpvOpFwidthCoarse, 1, pygen_variable_caps_DerivativeControl, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"EmitVertex", SpvOpEmitVertex, 1, pygen_variable_caps_Geometry, 0, {}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"EndPrimitive", SpvOpEndPrimitive, 1, pygen_variable_caps_Geometry, 0, {}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"EmitStreamVertex", SpvOpEmitStreamVertex, 1, pygen_variable_caps_GeometryStreams, 1, {SPV_OPERAND_TYPE_ID}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"EndStreamPrimitive", SpvOpEndStreamPrimitive, 1, pygen_variable_caps_GeometryStreams, 1, {SPV_OPERAND_TYPE_ID}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ControlBarrier", SpvOpControlBarrier, 0, nullptr, 3, {SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"MemoryBarrier", SpvOpMemoryBarrier, 0, nullptr, 2, {SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"AtomicLoad", SpvOpAtomicLoad, 0, nullptr, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"AtomicStore", SpvOpAtomicStore, 0, nullptr, 4, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID, SPV_OPERAND_TYPE_ID}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"AtomicExchange", SpvOpAtomicExchange, 0, nullptr, 6, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"AtomicCompareExchange", SpvOpAtomicCompareExchange, 0, nullptr, 8, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID, SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"AtomicCompareExchangeWeak", SpvOpAtomicCompareExchangeWeak, 1, pygen_variable_caps_Kernel, 8, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID, SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"AtomicIIncrement", SpvOpAtomicIIncrement, 0, nullptr, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"AtomicIDecrement", SpvOpAtomicIDecrement, 0, nullptr, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"AtomicIAdd", SpvOpAtomicIAdd, 0, nullptr, 6, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"AtomicISub", SpvOpAtomicISub, 0, nullptr, 6, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"AtomicSMin", SpvOpAtomicSMin, 0, nullptr, 6, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"AtomicUMin", SpvOpAtomicUMin, 0, nullptr, 6, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"AtomicSMax", SpvOpAtomicSMax, 0, nullptr, 6, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"AtomicUMax", SpvOpAtomicUMax, 0, nullptr, 6, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"AtomicAnd", SpvOpAtomicAnd, 0, nullptr, 6, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"AtomicOr", SpvOpAtomicOr, 0, nullptr, 6, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"AtomicXor", SpvOpAtomicXor, 0, nullptr, 6, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Phi", SpvOpPhi, 0, nullptr, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_VARIABLE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"LoopMerge", SpvOpLoopMerge, 0, nullptr, 3, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LOOP_CONTROL}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SelectionMerge", SpvOpSelectionMerge, 0, nullptr, 2, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_SELECTION_CONTROL}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Label", SpvOpLabel, 0, nullptr, 1, {SPV_OPERAND_TYPE_RESULT_ID}, 1, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Branch", SpvOpBranch, 0, nullptr, 1, {SPV_OPERAND_TYPE_ID}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"BranchConditional", SpvOpBranchConditional, 0, nullptr, 4, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_VARIABLE_LITERAL_INTEGER}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Switch", SpvOpSwitch, 0, nullptr, 3, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_VARIABLE_LITERAL_INTEGER_ID}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Kill", SpvOpKill, 1, pygen_variable_caps_Shader, 0, {}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Return", SpvOpReturn, 0, nullptr, 0, {}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ReturnValue", SpvOpReturnValue, 0, nullptr, 1, {SPV_OPERAND_TYPE_ID}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Unreachable", SpvOpUnreachable, 0, nullptr, 0, {}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"LifetimeStart", SpvOpLifetimeStart, 1, pygen_variable_caps_Kernel, 2, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_INTEGER}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"LifetimeStop", SpvOpLifetimeStop, 1, pygen_variable_caps_Kernel, 2, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_INTEGER}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"GroupAsyncCopy", SpvOpGroupAsyncCopy, 1, pygen_variable_caps_Kernel, 8, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"GroupWaitEvents", SpvOpGroupWaitEvents, 1, pygen_variable_caps_Kernel, 3, {SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"GroupAll", SpvOpGroupAll, 1, pygen_variable_caps_Groups, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"GroupAny", SpvOpGroupAny, 1, pygen_variable_caps_Groups, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"GroupBroadcast", SpvOpGroupBroadcast, 1, pygen_variable_caps_Groups, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"GroupIAdd", SpvOpGroupIAdd, 1, pygen_variable_caps_Groups, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_GROUP_OPERATION, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"GroupFAdd", SpvOpGroupFAdd, 1, pygen_variable_caps_Groups, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_GROUP_OPERATION, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"GroupFMin", SpvOpGroupFMin, 1, pygen_variable_caps_Groups, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_GROUP_OPERATION, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"GroupUMin", SpvOpGroupUMin, 1, pygen_variable_caps_Groups, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_GROUP_OPERATION, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"GroupSMin", SpvOpGroupSMin, 1, pygen_variable_caps_Groups, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_GROUP_OPERATION, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"GroupFMax", SpvOpGroupFMax, 1, pygen_variable_caps_Groups, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_GROUP_OPERATION, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"GroupUMax", SpvOpGroupUMax, 1, pygen_variable_caps_Groups, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_GROUP_OPERATION, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"GroupSMax", SpvOpGroupSMax, 1, pygen_variable_caps_Groups, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_GROUP_OPERATION, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ReadPipe", SpvOpReadPipe, 1, pygen_variable_caps_Pipes, 6, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"WritePipe", SpvOpWritePipe, 1, pygen_variable_caps_Pipes, 6, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ReservedReadPipe", SpvOpReservedReadPipe, 1, pygen_variable_caps_Pipes, 8, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ReservedWritePipe", SpvOpReservedWritePipe, 1, pygen_variable_caps_Pipes, 8, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ReserveReadPipePackets", SpvOpReserveReadPipePackets, 1, pygen_variable_caps_Pipes, 6, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ReserveWritePipePackets", SpvOpReserveWritePipePackets, 1, pygen_variable_caps_Pipes, 6, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"CommitReadPipe", SpvOpCommitReadPipe, 1, pygen_variable_caps_Pipes, 4, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"CommitWritePipe", SpvOpCommitWritePipe, 1, pygen_variable_caps_Pipes, 4, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"IsValidReserveId", SpvOpIsValidReserveId, 1, pygen_variable_caps_Pipes, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"GetNumPipePackets", SpvOpGetNumPipePackets, 1, pygen_variable_caps_Pipes, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"GetMaxPipePackets", SpvOpGetMaxPipePackets, 1, pygen_variable_caps_Pipes, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"GroupReserveReadPipePackets", SpvOpGroupReserveReadPipePackets, 1, pygen_variable_caps_Pipes, 7, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"GroupReserveWritePipePackets", SpvOpGroupReserveWritePipePackets, 1, pygen_variable_caps_Pipes, 7, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"GroupCommitReadPipe", SpvOpGroupCommitReadPipe, 1, pygen_variable_caps_Pipes, 5, {SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"GroupCommitWritePipe", SpvOpGroupCommitWritePipe, 1, pygen_variable_caps_Pipes, 5, {SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"EnqueueMarker", SpvOpEnqueueMarker, 1, pygen_variable_caps_DeviceEnqueue, 6, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"EnqueueKernel", SpvOpEnqueueKernel, 1, pygen_variable_caps_DeviceEnqueue, 13, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_VARIABLE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"GetKernelNDrangeSubGroupCount", SpvOpGetKernelNDrangeSubGroupCount, 1, pygen_variable_caps_DeviceEnqueue, 7, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"GetKernelNDrangeMaxSubGroupSize", SpvOpGetKernelNDrangeMaxSubGroupSize, 1, pygen_variable_caps_DeviceEnqueue, 7, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"GetKernelWorkGroupSize", SpvOpGetKernelWorkGroupSize, 1, pygen_variable_caps_DeviceEnqueue, 6, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"GetKernelPreferredWorkGroupSizeMultiple", SpvOpGetKernelPreferredWorkGroupSizeMultiple, 1, pygen_variable_caps_DeviceEnqueue, 6, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"RetainEvent", SpvOpRetainEvent, 1, pygen_variable_caps_DeviceEnqueue, 1, {SPV_OPERAND_TYPE_ID}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ReleaseEvent", SpvOpReleaseEvent, 1, pygen_variable_caps_DeviceEnqueue, 1, {SPV_OPERAND_TYPE_ID}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"CreateUserEvent", SpvOpCreateUserEvent, 1, pygen_variable_caps_DeviceEnqueue, 2, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"IsValidEvent", SpvOpIsValidEvent, 1, pygen_variable_caps_DeviceEnqueue, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SetUserEventStatus", SpvOpSetUserEventStatus, 1, pygen_variable_caps_DeviceEnqueue, 2, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"CaptureEventProfilingInfo", SpvOpCaptureEventProfilingInfo, 1, pygen_variable_caps_DeviceEnqueue, 3, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"GetDefaultQueue", SpvOpGetDefaultQueue, 1, pygen_variable_caps_DeviceEnqueue, 2, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"BuildNDRange", SpvOpBuildNDRange, 1, pygen_variable_caps_DeviceEnqueue, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ImageSparseSampleImplicitLod", SpvOpImageSparseSampleImplicitLod, 1, pygen_variable_caps_SparseResidency, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_IMAGE}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ImageSparseSampleExplicitLod", SpvOpImageSparseSampleExplicitLod, 1, pygen_variable_caps_SparseResidency, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_IMAGE}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ImageSparseSampleDrefImplicitLod", SpvOpImageSparseSampleDrefImplicitLod, 1, pygen_variable_caps_SparseResidency, 6, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_IMAGE}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ImageSparseSampleDrefExplicitLod", SpvOpImageSparseSampleDrefExplicitLod, 1, pygen_variable_caps_SparseResidency, 6, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_IMAGE}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ImageSparseSampleProjImplicitLod", SpvOpImageSparseSampleProjImplicitLod, 1, pygen_variable_caps_SparseResidency, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_IMAGE}, 1, 1, 0, nullptr, 0xffffffffu}, + {"ImageSparseSampleProjExplicitLod", SpvOpImageSparseSampleProjExplicitLod, 1, pygen_variable_caps_SparseResidency, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_IMAGE}, 1, 1, 0, nullptr, 0xffffffffu}, + {"ImageSparseSampleProjDrefImplicitLod", SpvOpImageSparseSampleProjDrefImplicitLod, 1, pygen_variable_caps_SparseResidency, 6, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_IMAGE}, 1, 1, 0, nullptr, 0xffffffffu}, + {"ImageSparseSampleProjDrefExplicitLod", SpvOpImageSparseSampleProjDrefExplicitLod, 1, pygen_variable_caps_SparseResidency, 6, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_IMAGE}, 1, 1, 0, nullptr, 0xffffffffu}, + {"ImageSparseFetch", SpvOpImageSparseFetch, 1, pygen_variable_caps_SparseResidency, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_IMAGE}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ImageSparseGather", SpvOpImageSparseGather, 1, pygen_variable_caps_SparseResidency, 6, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_IMAGE}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ImageSparseDrefGather", SpvOpImageSparseDrefGather, 1, pygen_variable_caps_SparseResidency, 6, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_IMAGE}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ImageSparseTexelsResident", SpvOpImageSparseTexelsResident, 1, pygen_variable_caps_SparseResidency, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"NoLine", SpvOpNoLine, 0, nullptr, 0, {}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"AtomicFlagTestAndSet", SpvOpAtomicFlagTestAndSet, 1, pygen_variable_caps_Kernel, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"AtomicFlagClear", SpvOpAtomicFlagClear, 1, pygen_variable_caps_Kernel, 3, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ImageSparseRead", SpvOpImageSparseRead, 1, pygen_variable_caps_SparseResidency, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_IMAGE}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SizeOf", SpvOpSizeOf, 1, pygen_variable_caps_Addresses, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1,1)}, + {"TypePipeStorage", SpvOpTypePipeStorage, 1, pygen_variable_caps_PipeStorage, 1, {SPV_OPERAND_TYPE_RESULT_ID}, 1, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1,1)}, + {"ConstantPipeStorage", SpvOpConstantPipeStorage, 1, pygen_variable_caps_PipeStorage, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1,1)}, + {"CreatePipeFromPipeStorage", SpvOpCreatePipeFromPipeStorage, 1, pygen_variable_caps_PipeStorage, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1,1)}, + {"GetKernelLocalSizeForSubgroupCount", SpvOpGetKernelLocalSizeForSubgroupCount, 1, pygen_variable_caps_SubgroupDispatch, 7, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1,1)}, + {"GetKernelMaxNumSubgroups", SpvOpGetKernelMaxNumSubgroups, 1, pygen_variable_caps_SubgroupDispatch, 6, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1,1)}, + {"TypeNamedBarrier", SpvOpTypeNamedBarrier, 1, pygen_variable_caps_NamedBarrier, 1, {SPV_OPERAND_TYPE_RESULT_ID}, 1, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1,1)}, + {"NamedBarrierInitialize", SpvOpNamedBarrierInitialize, 1, pygen_variable_caps_NamedBarrier, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1,1)}, + {"MemoryNamedBarrier", SpvOpMemoryNamedBarrier, 1, pygen_variable_caps_NamedBarrier, 3, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1,1)}, + {"ModuleProcessed", SpvOpModuleProcessed, 0, nullptr, 1, {SPV_OPERAND_TYPE_LITERAL_STRING}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1,1)}, + {"ExecutionModeId", SpvOpExecutionModeId, 0, nullptr, 2, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_EXECUTION_MODE}, 0, 0, 0, nullptr, SPV_SPIRV_VERSION_WORD(1,2)}, + {"DecorateId", SpvOpDecorateId, 0, nullptr, 2, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_DECORATION}, 0, 0, 1, pygen_variable_exts_SPV_GOOGLE_hlsl_functionality1, SPV_SPIRV_VERSION_WORD(1,2)}, + {"GroupNonUniformElect", SpvOpGroupNonUniformElect, 1, pygen_variable_caps_GroupNonUniform, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1,3)}, + {"GroupNonUniformAll", SpvOpGroupNonUniformAll, 1, pygen_variable_caps_GroupNonUniformVote, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1,3)}, + {"GroupNonUniformAny", SpvOpGroupNonUniformAny, 1, pygen_variable_caps_GroupNonUniformVote, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1,3)}, + {"GroupNonUniformAllEqual", SpvOpGroupNonUniformAllEqual, 1, pygen_variable_caps_GroupNonUniformVote, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1,3)}, + {"GroupNonUniformBroadcast", SpvOpGroupNonUniformBroadcast, 1, pygen_variable_caps_GroupNonUniformBallot, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1,3)}, + {"GroupNonUniformBroadcastFirst", SpvOpGroupNonUniformBroadcastFirst, 1, pygen_variable_caps_GroupNonUniformBallot, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1,3)}, + {"GroupNonUniformBallot", SpvOpGroupNonUniformBallot, 1, pygen_variable_caps_GroupNonUniformBallot, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1,3)}, + {"GroupNonUniformInverseBallot", SpvOpGroupNonUniformInverseBallot, 1, pygen_variable_caps_GroupNonUniformBallot, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1,3)}, + {"GroupNonUniformBallotBitExtract", SpvOpGroupNonUniformBallotBitExtract, 1, pygen_variable_caps_GroupNonUniformBallot, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1,3)}, + {"GroupNonUniformBallotBitCount", SpvOpGroupNonUniformBallotBitCount, 1, pygen_variable_caps_GroupNonUniformBallot, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_GROUP_OPERATION, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1,3)}, + {"GroupNonUniformBallotFindLSB", SpvOpGroupNonUniformBallotFindLSB, 1, pygen_variable_caps_GroupNonUniformBallot, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1,3)}, + {"GroupNonUniformBallotFindMSB", SpvOpGroupNonUniformBallotFindMSB, 1, pygen_variable_caps_GroupNonUniformBallot, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1,3)}, + {"GroupNonUniformShuffle", SpvOpGroupNonUniformShuffle, 1, pygen_variable_caps_GroupNonUniformShuffle, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1,3)}, + {"GroupNonUniformShuffleXor", SpvOpGroupNonUniformShuffleXor, 1, pygen_variable_caps_GroupNonUniformShuffle, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1,3)}, + {"GroupNonUniformShuffleUp", SpvOpGroupNonUniformShuffleUp, 1, pygen_variable_caps_GroupNonUniformShuffleRelative, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1,3)}, + {"GroupNonUniformShuffleDown", SpvOpGroupNonUniformShuffleDown, 1, pygen_variable_caps_GroupNonUniformShuffleRelative, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1,3)}, + {"GroupNonUniformIAdd", SpvOpGroupNonUniformIAdd, 2, pygen_variable_caps_GroupNonUniformArithmeticGroupNonUniformClustered, 6, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_GROUP_OPERATION, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1,3)}, + {"GroupNonUniformFAdd", SpvOpGroupNonUniformFAdd, 2, pygen_variable_caps_GroupNonUniformArithmeticGroupNonUniformClustered, 6, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_GROUP_OPERATION, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1,3)}, + {"GroupNonUniformIMul", SpvOpGroupNonUniformIMul, 2, pygen_variable_caps_GroupNonUniformArithmeticGroupNonUniformClustered, 6, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_GROUP_OPERATION, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1,3)}, + {"GroupNonUniformFMul", SpvOpGroupNonUniformFMul, 2, pygen_variable_caps_GroupNonUniformArithmeticGroupNonUniformClustered, 6, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_GROUP_OPERATION, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1,3)}, + {"GroupNonUniformSMin", SpvOpGroupNonUniformSMin, 2, pygen_variable_caps_GroupNonUniformArithmeticGroupNonUniformClustered, 6, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_GROUP_OPERATION, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1,3)}, + {"GroupNonUniformUMin", SpvOpGroupNonUniformUMin, 2, pygen_variable_caps_GroupNonUniformArithmeticGroupNonUniformClustered, 6, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_GROUP_OPERATION, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1,3)}, + {"GroupNonUniformFMin", SpvOpGroupNonUniformFMin, 2, pygen_variable_caps_GroupNonUniformArithmeticGroupNonUniformClustered, 6, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_GROUP_OPERATION, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1,3)}, + {"GroupNonUniformSMax", SpvOpGroupNonUniformSMax, 2, pygen_variable_caps_GroupNonUniformArithmeticGroupNonUniformClustered, 6, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_GROUP_OPERATION, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1,3)}, + {"GroupNonUniformUMax", SpvOpGroupNonUniformUMax, 2, pygen_variable_caps_GroupNonUniformArithmeticGroupNonUniformClustered, 6, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_GROUP_OPERATION, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1,3)}, + {"GroupNonUniformFMax", SpvOpGroupNonUniformFMax, 2, pygen_variable_caps_GroupNonUniformArithmeticGroupNonUniformClustered, 6, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_GROUP_OPERATION, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1,3)}, + {"GroupNonUniformBitwiseAnd", SpvOpGroupNonUniformBitwiseAnd, 2, pygen_variable_caps_GroupNonUniformArithmeticGroupNonUniformClustered, 6, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_GROUP_OPERATION, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1,3)}, + {"GroupNonUniformBitwiseOr", SpvOpGroupNonUniformBitwiseOr, 2, pygen_variable_caps_GroupNonUniformArithmeticGroupNonUniformClustered, 6, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_GROUP_OPERATION, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1,3)}, + {"GroupNonUniformBitwiseXor", SpvOpGroupNonUniformBitwiseXor, 2, pygen_variable_caps_GroupNonUniformArithmeticGroupNonUniformClustered, 6, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_GROUP_OPERATION, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1,3)}, + {"GroupNonUniformLogicalAnd", SpvOpGroupNonUniformLogicalAnd, 2, pygen_variable_caps_GroupNonUniformArithmeticGroupNonUniformClustered, 6, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_GROUP_OPERATION, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1,3)}, + {"GroupNonUniformLogicalOr", SpvOpGroupNonUniformLogicalOr, 2, pygen_variable_caps_GroupNonUniformArithmeticGroupNonUniformClustered, 6, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_GROUP_OPERATION, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1,3)}, + {"GroupNonUniformLogicalXor", SpvOpGroupNonUniformLogicalXor, 2, pygen_variable_caps_GroupNonUniformArithmeticGroupNonUniformClustered, 6, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_GROUP_OPERATION, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1,3)}, + {"GroupNonUniformQuadBroadcast", SpvOpGroupNonUniformQuadBroadcast, 1, pygen_variable_caps_GroupNonUniformQuad, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1,3)}, + {"GroupNonUniformQuadSwap", SpvOpGroupNonUniformQuadSwap, 1, pygen_variable_caps_GroupNonUniformQuad, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, SPV_SPIRV_VERSION_WORD(1,3)}, + {"SubgroupBallotKHR", SpvOpSubgroupBallotKHR, 1, pygen_variable_caps_SubgroupBallotKHR, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 1, pygen_variable_exts_SPV_KHR_shader_ballot, 0xffffffffu}, + {"SubgroupFirstInvocationKHR", SpvOpSubgroupFirstInvocationKHR, 1, pygen_variable_caps_SubgroupBallotKHR, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 1, pygen_variable_exts_SPV_KHR_shader_ballot, 0xffffffffu}, + {"SubgroupAllKHR", SpvOpSubgroupAllKHR, 1, pygen_variable_caps_SubgroupVoteKHR, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 1, pygen_variable_exts_SPV_KHR_subgroup_vote, 0xffffffffu}, + {"SubgroupAnyKHR", SpvOpSubgroupAnyKHR, 1, pygen_variable_caps_SubgroupVoteKHR, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 1, pygen_variable_exts_SPV_KHR_subgroup_vote, 0xffffffffu}, + {"SubgroupAllEqualKHR", SpvOpSubgroupAllEqualKHR, 1, pygen_variable_caps_SubgroupVoteKHR, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 1, pygen_variable_exts_SPV_KHR_subgroup_vote, 0xffffffffu}, + {"SubgroupReadInvocationKHR", SpvOpSubgroupReadInvocationKHR, 1, pygen_variable_caps_SubgroupBallotKHR, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 1, pygen_variable_exts_SPV_KHR_shader_ballot, 0xffffffffu}, + {"GroupIAddNonUniformAMD", SpvOpGroupIAddNonUniformAMD, 1, pygen_variable_caps_Groups, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_GROUP_OPERATION, SPV_OPERAND_TYPE_ID}, 1, 1, 1, pygen_variable_exts_SPV_AMD_shader_ballot, 0xffffffffu}, + {"GroupFAddNonUniformAMD", SpvOpGroupFAddNonUniformAMD, 1, pygen_variable_caps_Groups, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_GROUP_OPERATION, SPV_OPERAND_TYPE_ID}, 1, 1, 1, pygen_variable_exts_SPV_AMD_shader_ballot, 0xffffffffu}, + {"GroupFMinNonUniformAMD", SpvOpGroupFMinNonUniformAMD, 1, pygen_variable_caps_Groups, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_GROUP_OPERATION, SPV_OPERAND_TYPE_ID}, 1, 1, 1, pygen_variable_exts_SPV_AMD_shader_ballot, 0xffffffffu}, + {"GroupUMinNonUniformAMD", SpvOpGroupUMinNonUniformAMD, 1, pygen_variable_caps_Groups, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_GROUP_OPERATION, SPV_OPERAND_TYPE_ID}, 1, 1, 1, pygen_variable_exts_SPV_AMD_shader_ballot, 0xffffffffu}, + {"GroupSMinNonUniformAMD", SpvOpGroupSMinNonUniformAMD, 1, pygen_variable_caps_Groups, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_GROUP_OPERATION, SPV_OPERAND_TYPE_ID}, 1, 1, 1, pygen_variable_exts_SPV_AMD_shader_ballot, 0xffffffffu}, + {"GroupFMaxNonUniformAMD", SpvOpGroupFMaxNonUniformAMD, 1, pygen_variable_caps_Groups, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_GROUP_OPERATION, SPV_OPERAND_TYPE_ID}, 1, 1, 1, pygen_variable_exts_SPV_AMD_shader_ballot, 0xffffffffu}, + {"GroupUMaxNonUniformAMD", SpvOpGroupUMaxNonUniformAMD, 1, pygen_variable_caps_Groups, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_GROUP_OPERATION, SPV_OPERAND_TYPE_ID}, 1, 1, 1, pygen_variable_exts_SPV_AMD_shader_ballot, 0xffffffffu}, + {"GroupSMaxNonUniformAMD", SpvOpGroupSMaxNonUniformAMD, 1, pygen_variable_caps_Groups, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_GROUP_OPERATION, SPV_OPERAND_TYPE_ID}, 1, 1, 1, pygen_variable_exts_SPV_AMD_shader_ballot, 0xffffffffu}, + {"FragmentMaskFetchAMD", SpvOpFragmentMaskFetchAMD, 1, pygen_variable_caps_FragmentMaskAMD, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 1, pygen_variable_exts_SPV_AMD_shader_fragment_mask, 0xffffffffu}, + {"FragmentFetchAMD", SpvOpFragmentFetchAMD, 1, pygen_variable_caps_FragmentMaskAMD, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 1, pygen_variable_exts_SPV_AMD_shader_fragment_mask, 0xffffffffu}, + {"GroupNonUniformPartitionNV", SpvOpGroupNonUniformPartitionNV, 1, pygen_variable_caps_GroupNonUniformPartitionedNV, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 1, pygen_variable_exts_SPV_NV_shader_subgroup_partitioned, 0xffffffffu}, + {"SubgroupShuffleINTEL", SpvOpSubgroupShuffleINTEL, 1, pygen_variable_caps_SubgroupShuffleINTEL, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, 0xffffffffu}, + {"SubgroupShuffleDownINTEL", SpvOpSubgroupShuffleDownINTEL, 1, pygen_variable_caps_SubgroupShuffleINTEL, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, 0xffffffffu}, + {"SubgroupShuffleUpINTEL", SpvOpSubgroupShuffleUpINTEL, 1, pygen_variable_caps_SubgroupShuffleINTEL, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, 0xffffffffu}, + {"SubgroupShuffleXorINTEL", SpvOpSubgroupShuffleXorINTEL, 1, pygen_variable_caps_SubgroupShuffleINTEL, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, 0xffffffffu}, + {"SubgroupBlockReadINTEL", SpvOpSubgroupBlockReadINTEL, 1, pygen_variable_caps_SubgroupBufferBlockIOINTEL, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, 0xffffffffu}, + {"SubgroupBlockWriteINTEL", SpvOpSubgroupBlockWriteINTEL, 1, pygen_variable_caps_SubgroupBufferBlockIOINTEL, 2, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 0, 0, 0, nullptr, 0xffffffffu}, + {"SubgroupImageBlockReadINTEL", SpvOpSubgroupImageBlockReadINTEL, 1, pygen_variable_caps_SubgroupImageBlockIOINTEL, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, 0xffffffffu}, + {"SubgroupImageBlockWriteINTEL", SpvOpSubgroupImageBlockWriteINTEL, 1, pygen_variable_caps_SubgroupImageBlockIOINTEL, 3, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 0, 0, 0, nullptr, 0xffffffffu}, + {"DecorateStringGOOGLE", SpvOpDecorateStringGOOGLE, 0, nullptr, 2, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_DECORATION}, 0, 0, 2, pygen_variable_exts_SPV_GOOGLE_decorate_stringSPV_GOOGLE_hlsl_functionality1, 0xffffffffu}, + {"MemberDecorateStringGOOGLE", SpvOpMemberDecorateStringGOOGLE, 0, nullptr, 3, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_DECORATION}, 0, 0, 2, pygen_variable_exts_SPV_GOOGLE_decorate_stringSPV_GOOGLE_hlsl_functionality1, 0xffffffffu} +}; diff --git a/3rdparty/spirv-tools/build/debuginfo.insts.inc b/3rdparty/spirv-tools/build/debuginfo.insts.inc new file mode 100644 index 000000000..e28cc97d2 --- /dev/null +++ b/3rdparty/spirv-tools/build/debuginfo.insts.inc @@ -0,0 +1,38 @@ + + +static const spv_ext_inst_desc_t debuginfo_entries[] = { + {"DebugInfoNone", 0, 0, nullptr, {SPV_OPERAND_TYPE_NONE}}, + {"DebugCompilationUnit", 1, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}}, + {"DebugTypeBasic", 2, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_DEBUG_BASE_TYPE_ATTRIBUTE_ENCODING, SPV_OPERAND_TYPE_NONE}}, + {"DebugTypePointer", 3, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_STORAGE_CLASS, SPV_OPERAND_TYPE_DEBUG_INFO_FLAGS, SPV_OPERAND_TYPE_NONE}}, + {"DebugTypeQualifier", 4, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_DEBUG_TYPE_QUALIFIER, SPV_OPERAND_TYPE_NONE}}, + {"DebugTypeArray", 5, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_VARIABLE_ID, SPV_OPERAND_TYPE_NONE}}, + {"DebugTypeVector", 6, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}}, + {"DebugTypedef", 7, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"DebugTypeFunction", 8, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_VARIABLE_ID, SPV_OPERAND_TYPE_NONE}}, + {"DebugTypeEnum", 9, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_DEBUG_INFO_FLAGS, SPV_OPERAND_TYPE_VARIABLE_ID, SPV_OPERAND_TYPE_NONE}}, + {"DebugTypeComposite", 10, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_DEBUG_COMPOSITE_TYPE, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_DEBUG_INFO_FLAGS, SPV_OPERAND_TYPE_VARIABLE_ID, SPV_OPERAND_TYPE_NONE}}, + {"DebugTypeMember", 11, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_DEBUG_INFO_FLAGS, SPV_OPERAND_TYPE_OPTIONAL_ID, SPV_OPERAND_TYPE_NONE}}, + {"DebugTypeInheritance", 12, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_DEBUG_INFO_FLAGS, SPV_OPERAND_TYPE_NONE}}, + {"DebugTypePtrToMember", 13, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"DebugTypeTemplate", 14, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_VARIABLE_ID, SPV_OPERAND_TYPE_NONE}}, + {"DebugTypeTemplateParameter", 15, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}}, + {"DebugTypeTemplateTemplateParameter", 16, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}}, + {"DebugTypeTemplateParameterPack", 17, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_VARIABLE_ID, SPV_OPERAND_TYPE_NONE}}, + {"DebugGlobalVariable", 18, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_DEBUG_INFO_FLAGS, SPV_OPERAND_TYPE_OPTIONAL_ID, SPV_OPERAND_TYPE_NONE}}, + {"DebugFunctionDeclaration", 19, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_DEBUG_INFO_FLAGS, SPV_OPERAND_TYPE_NONE}}, + {"DebugFunction", 20, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_DEBUG_INFO_FLAGS, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_ID, SPV_OPERAND_TYPE_NONE}}, + {"DebugLexicalBlock", 21, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_ID, SPV_OPERAND_TYPE_NONE}}, + {"DebugLexicalBlockDiscriminator", 22, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"DebugScope", 23, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_ID, SPV_OPERAND_TYPE_NONE}}, + {"DebugNoScope", 24, 0, nullptr, {SPV_OPERAND_TYPE_NONE}}, + {"DebugInlinedAt", 25, 0, nullptr, {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_ID, SPV_OPERAND_TYPE_NONE}}, + {"DebugLocalVariable", 26, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}}, + {"DebugInlinedVariable", 27, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"DebugDeclare", 28, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"DebugValue", 29, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_VARIABLE_ID, SPV_OPERAND_TYPE_NONE}}, + {"DebugOperation", 30, 0, nullptr, {SPV_OPERAND_TYPE_DEBUG_OPERATION, SPV_OPERAND_TYPE_VARIABLE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}}, + {"DebugExpression", 31, 0, nullptr, {SPV_OPERAND_TYPE_VARIABLE_ID, SPV_OPERAND_TYPE_NONE}}, + {"DebugMacroDef", 32, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_ID, SPV_OPERAND_TYPE_NONE}}, + {"DebugMacroUndef", 33, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}} +}; diff --git a/3rdparty/spirv-tools/build/enum_string_mapping.inc b/3rdparty/spirv-tools/build/enum_string_mapping.inc new file mode 100644 index 000000000..964b142d9 --- /dev/null +++ b/3rdparty/spirv-tools/build/enum_string_mapping.inc @@ -0,0 +1,325 @@ +const char* ExtensionToString(Extension extension) { + switch (extension) { + case Extension::kSPV_AMD_gcn_shader: + return "SPV_AMD_gcn_shader"; + case Extension::kSPV_AMD_gpu_shader_half_float: + return "SPV_AMD_gpu_shader_half_float"; + case Extension::kSPV_AMD_gpu_shader_half_float_fetch: + return "SPV_AMD_gpu_shader_half_float_fetch"; + case Extension::kSPV_AMD_gpu_shader_int16: + return "SPV_AMD_gpu_shader_int16"; + case Extension::kSPV_AMD_shader_ballot: + return "SPV_AMD_shader_ballot"; + case Extension::kSPV_AMD_shader_explicit_vertex_parameter: + return "SPV_AMD_shader_explicit_vertex_parameter"; + case Extension::kSPV_AMD_shader_fragment_mask: + return "SPV_AMD_shader_fragment_mask"; + case Extension::kSPV_AMD_shader_image_load_store_lod: + return "SPV_AMD_shader_image_load_store_lod"; + case Extension::kSPV_AMD_shader_trinary_minmax: + return "SPV_AMD_shader_trinary_minmax"; + case Extension::kSPV_AMD_texture_gather_bias_lod: + return "SPV_AMD_texture_gather_bias_lod"; + case Extension::kSPV_EXT_descriptor_indexing: + return "SPV_EXT_descriptor_indexing"; + case Extension::kSPV_EXT_fragment_fully_covered: + return "SPV_EXT_fragment_fully_covered"; + case Extension::kSPV_EXT_shader_stencil_export: + return "SPV_EXT_shader_stencil_export"; + case Extension::kSPV_EXT_shader_viewport_index_layer: + return "SPV_EXT_shader_viewport_index_layer"; + case Extension::kSPV_GOOGLE_decorate_string: + return "SPV_GOOGLE_decorate_string"; + case Extension::kSPV_GOOGLE_hlsl_functionality1: + return "SPV_GOOGLE_hlsl_functionality1"; + case Extension::kSPV_INTEL_subgroups: + return "SPV_INTEL_subgroups"; + case Extension::kSPV_KHR_16bit_storage: + return "SPV_KHR_16bit_storage"; + case Extension::kSPV_KHR_8bit_storage: + return "SPV_KHR_8bit_storage"; + case Extension::kSPV_KHR_device_group: + return "SPV_KHR_device_group"; + case Extension::kSPV_KHR_multiview: + return "SPV_KHR_multiview"; + case Extension::kSPV_KHR_post_depth_coverage: + return "SPV_KHR_post_depth_coverage"; + case Extension::kSPV_KHR_shader_atomic_counter_ops: + return "SPV_KHR_shader_atomic_counter_ops"; + case Extension::kSPV_KHR_shader_ballot: + return "SPV_KHR_shader_ballot"; + case Extension::kSPV_KHR_shader_draw_parameters: + return "SPV_KHR_shader_draw_parameters"; + case Extension::kSPV_KHR_storage_buffer_storage_class: + return "SPV_KHR_storage_buffer_storage_class"; + case Extension::kSPV_KHR_subgroup_vote: + return "SPV_KHR_subgroup_vote"; + case Extension::kSPV_KHR_variable_pointers: + return "SPV_KHR_variable_pointers"; + case Extension::kSPV_NVX_multiview_per_view_attributes: + return "SPV_NVX_multiview_per_view_attributes"; + case Extension::kSPV_NV_geometry_shader_passthrough: + return "SPV_NV_geometry_shader_passthrough"; + case Extension::kSPV_NV_sample_mask_override_coverage: + return "SPV_NV_sample_mask_override_coverage"; + case Extension::kSPV_NV_shader_subgroup_partitioned: + return "SPV_NV_shader_subgroup_partitioned"; + case Extension::kSPV_NV_stereo_view_rendering: + return "SPV_NV_stereo_view_rendering"; + case Extension::kSPV_NV_viewport_array2: + return "SPV_NV_viewport_array2"; + case Extension::kSPV_VALIDATOR_ignore_type_decl_unique: + return "SPV_VALIDATOR_ignore_type_decl_unique"; + }; + + return ""; +} + + + bool GetExtensionFromString(const char* str, Extension* extension) { + static const char* known_ext_strs[] = { "SPV_AMD_gcn_shader", "SPV_AMD_gpu_shader_half_float", "SPV_AMD_gpu_shader_half_float_fetch", "SPV_AMD_gpu_shader_int16", "SPV_AMD_shader_ballot", "SPV_AMD_shader_explicit_vertex_parameter", "SPV_AMD_shader_fragment_mask", "SPV_AMD_shader_image_load_store_lod", "SPV_AMD_shader_trinary_minmax", "SPV_AMD_texture_gather_bias_lod", "SPV_EXT_descriptor_indexing", "SPV_EXT_fragment_fully_covered", "SPV_EXT_shader_stencil_export", "SPV_EXT_shader_viewport_index_layer", "SPV_GOOGLE_decorate_string", "SPV_GOOGLE_hlsl_functionality1", "SPV_INTEL_subgroups", "SPV_KHR_16bit_storage", "SPV_KHR_8bit_storage", "SPV_KHR_device_group", "SPV_KHR_multiview", "SPV_KHR_post_depth_coverage", "SPV_KHR_shader_atomic_counter_ops", "SPV_KHR_shader_ballot", "SPV_KHR_shader_draw_parameters", "SPV_KHR_storage_buffer_storage_class", "SPV_KHR_subgroup_vote", "SPV_KHR_variable_pointers", "SPV_NVX_multiview_per_view_attributes", "SPV_NV_geometry_shader_passthrough", "SPV_NV_sample_mask_override_coverage", "SPV_NV_shader_subgroup_partitioned", "SPV_NV_stereo_view_rendering", "SPV_NV_viewport_array2", "SPV_VALIDATOR_ignore_type_decl_unique" }; + static const Extension known_ext_ids[] = { Extension::kSPV_AMD_gcn_shader, Extension::kSPV_AMD_gpu_shader_half_float, Extension::kSPV_AMD_gpu_shader_half_float_fetch, Extension::kSPV_AMD_gpu_shader_int16, Extension::kSPV_AMD_shader_ballot, Extension::kSPV_AMD_shader_explicit_vertex_parameter, Extension::kSPV_AMD_shader_fragment_mask, Extension::kSPV_AMD_shader_image_load_store_lod, Extension::kSPV_AMD_shader_trinary_minmax, Extension::kSPV_AMD_texture_gather_bias_lod, Extension::kSPV_EXT_descriptor_indexing, Extension::kSPV_EXT_fragment_fully_covered, Extension::kSPV_EXT_shader_stencil_export, Extension::kSPV_EXT_shader_viewport_index_layer, Extension::kSPV_GOOGLE_decorate_string, Extension::kSPV_GOOGLE_hlsl_functionality1, Extension::kSPV_INTEL_subgroups, Extension::kSPV_KHR_16bit_storage, Extension::kSPV_KHR_8bit_storage, Extension::kSPV_KHR_device_group, Extension::kSPV_KHR_multiview, Extension::kSPV_KHR_post_depth_coverage, Extension::kSPV_KHR_shader_atomic_counter_ops, Extension::kSPV_KHR_shader_ballot, Extension::kSPV_KHR_shader_draw_parameters, Extension::kSPV_KHR_storage_buffer_storage_class, Extension::kSPV_KHR_subgroup_vote, Extension::kSPV_KHR_variable_pointers, Extension::kSPV_NVX_multiview_per_view_attributes, Extension::kSPV_NV_geometry_shader_passthrough, Extension::kSPV_NV_sample_mask_override_coverage, Extension::kSPV_NV_shader_subgroup_partitioned, Extension::kSPV_NV_stereo_view_rendering, Extension::kSPV_NV_viewport_array2, Extension::kSPV_VALIDATOR_ignore_type_decl_unique }; + const auto b = std::begin(known_ext_strs); + const auto e = std::end(known_ext_strs); + const auto found = std::equal_range( + b, e, str, [](const char* str1, const char* str2) { + return std::strcmp(str1, str2) < 0; + }); + if (found.first == e || found.first == found.second) return false; + + *extension = known_ext_ids[found.first - b]; + return true; + } + + +const char* CapabilityToString(SpvCapability capability) { + switch (capability) { + case SpvCapabilityMatrix: + return "Matrix"; + case SpvCapabilityShader: + return "Shader"; + case SpvCapabilityGeometry: + return "Geometry"; + case SpvCapabilityTessellation: + return "Tessellation"; + case SpvCapabilityAddresses: + return "Addresses"; + case SpvCapabilityLinkage: + return "Linkage"; + case SpvCapabilityKernel: + return "Kernel"; + case SpvCapabilityVector16: + return "Vector16"; + case SpvCapabilityFloat16Buffer: + return "Float16Buffer"; + case SpvCapabilityFloat16: + return "Float16"; + case SpvCapabilityFloat64: + return "Float64"; + case SpvCapabilityInt64: + return "Int64"; + case SpvCapabilityInt64Atomics: + return "Int64Atomics"; + case SpvCapabilityImageBasic: + return "ImageBasic"; + case SpvCapabilityImageReadWrite: + return "ImageReadWrite"; + case SpvCapabilityImageMipmap: + return "ImageMipmap"; + case SpvCapabilityPipes: + return "Pipes"; + case SpvCapabilityGroups: + return "Groups"; + case SpvCapabilityDeviceEnqueue: + return "DeviceEnqueue"; + case SpvCapabilityLiteralSampler: + return "LiteralSampler"; + case SpvCapabilityAtomicStorage: + return "AtomicStorage"; + case SpvCapabilityInt16: + return "Int16"; + case SpvCapabilityTessellationPointSize: + return "TessellationPointSize"; + case SpvCapabilityGeometryPointSize: + return "GeometryPointSize"; + case SpvCapabilityImageGatherExtended: + return "ImageGatherExtended"; + case SpvCapabilityStorageImageMultisample: + return "StorageImageMultisample"; + case SpvCapabilityUniformBufferArrayDynamicIndexing: + return "UniformBufferArrayDynamicIndexing"; + case SpvCapabilitySampledImageArrayDynamicIndexing: + return "SampledImageArrayDynamicIndexing"; + case SpvCapabilityStorageBufferArrayDynamicIndexing: + return "StorageBufferArrayDynamicIndexing"; + case SpvCapabilityStorageImageArrayDynamicIndexing: + return "StorageImageArrayDynamicIndexing"; + case SpvCapabilityClipDistance: + return "ClipDistance"; + case SpvCapabilityCullDistance: + return "CullDistance"; + case SpvCapabilityImageCubeArray: + return "ImageCubeArray"; + case SpvCapabilitySampleRateShading: + return "SampleRateShading"; + case SpvCapabilityImageRect: + return "ImageRect"; + case SpvCapabilitySampledRect: + return "SampledRect"; + case SpvCapabilityGenericPointer: + return "GenericPointer"; + case SpvCapabilityInt8: + return "Int8"; + case SpvCapabilityInputAttachment: + return "InputAttachment"; + case SpvCapabilitySparseResidency: + return "SparseResidency"; + case SpvCapabilityMinLod: + return "MinLod"; + case SpvCapabilitySampled1D: + return "Sampled1D"; + case SpvCapabilityImage1D: + return "Image1D"; + case SpvCapabilitySampledCubeArray: + return "SampledCubeArray"; + case SpvCapabilitySampledBuffer: + return "SampledBuffer"; + case SpvCapabilityImageBuffer: + return "ImageBuffer"; + case SpvCapabilityImageMSArray: + return "ImageMSArray"; + case SpvCapabilityStorageImageExtendedFormats: + return "StorageImageExtendedFormats"; + case SpvCapabilityImageQuery: + return "ImageQuery"; + case SpvCapabilityDerivativeControl: + return "DerivativeControl"; + case SpvCapabilityInterpolationFunction: + return "InterpolationFunction"; + case SpvCapabilityTransformFeedback: + return "TransformFeedback"; + case SpvCapabilityGeometryStreams: + return "GeometryStreams"; + case SpvCapabilityStorageImageReadWithoutFormat: + return "StorageImageReadWithoutFormat"; + case SpvCapabilityStorageImageWriteWithoutFormat: + return "StorageImageWriteWithoutFormat"; + case SpvCapabilityMultiViewport: + return "MultiViewport"; + case SpvCapabilitySubgroupDispatch: + return "SubgroupDispatch"; + case SpvCapabilityNamedBarrier: + return "NamedBarrier"; + case SpvCapabilityPipeStorage: + return "PipeStorage"; + case SpvCapabilityGroupNonUniform: + return "GroupNonUniform"; + case SpvCapabilityGroupNonUniformVote: + return "GroupNonUniformVote"; + case SpvCapabilityGroupNonUniformArithmetic: + return "GroupNonUniformArithmetic"; + case SpvCapabilityGroupNonUniformBallot: + return "GroupNonUniformBallot"; + case SpvCapabilityGroupNonUniformShuffle: + return "GroupNonUniformShuffle"; + case SpvCapabilityGroupNonUniformShuffleRelative: + return "GroupNonUniformShuffleRelative"; + case SpvCapabilityGroupNonUniformClustered: + return "GroupNonUniformClustered"; + case SpvCapabilityGroupNonUniformQuad: + return "GroupNonUniformQuad"; + case SpvCapabilitySubgroupBallotKHR: + return "SubgroupBallotKHR"; + case SpvCapabilityDrawParameters: + return "DrawParameters"; + case SpvCapabilitySubgroupVoteKHR: + return "SubgroupVoteKHR"; + case SpvCapabilityStorageBuffer16BitAccess: + return "StorageBuffer16BitAccess"; + case SpvCapabilityUniformAndStorageBuffer16BitAccess: + return "UniformAndStorageBuffer16BitAccess"; + case SpvCapabilityStoragePushConstant16: + return "StoragePushConstant16"; + case SpvCapabilityStorageInputOutput16: + return "StorageInputOutput16"; + case SpvCapabilityDeviceGroup: + return "DeviceGroup"; + case SpvCapabilityMultiView: + return "MultiView"; + case SpvCapabilityVariablePointersStorageBuffer: + return "VariablePointersStorageBuffer"; + case SpvCapabilityVariablePointers: + return "VariablePointers"; + case SpvCapabilityAtomicStorageOps: + return "AtomicStorageOps"; + case SpvCapabilitySampleMaskPostDepthCoverage: + return "SampleMaskPostDepthCoverage"; + case SpvCapabilityStorageBuffer8BitAccess: + return "StorageBuffer8BitAccess"; + case SpvCapabilityUniformAndStorageBuffer8BitAccess: + return "UniformAndStorageBuffer8BitAccess"; + case SpvCapabilityStoragePushConstant8: + return "StoragePushConstant8"; + case SpvCapabilityFloat16ImageAMD: + return "Float16ImageAMD"; + case SpvCapabilityImageGatherBiasLodAMD: + return "ImageGatherBiasLodAMD"; + case SpvCapabilityFragmentMaskAMD: + return "FragmentMaskAMD"; + case SpvCapabilityStencilExportEXT: + return "StencilExportEXT"; + case SpvCapabilityImageReadWriteLodAMD: + return "ImageReadWriteLodAMD"; + case SpvCapabilitySampleMaskOverrideCoverageNV: + return "SampleMaskOverrideCoverageNV"; + case SpvCapabilityGeometryShaderPassthroughNV: + return "GeometryShaderPassthroughNV"; + case SpvCapabilityShaderViewportIndexLayerEXT: + return "ShaderViewportIndexLayerEXT"; + case SpvCapabilityShaderViewportMaskNV: + return "ShaderViewportMaskNV"; + case SpvCapabilityShaderStereoViewNV: + return "ShaderStereoViewNV"; + case SpvCapabilityPerViewAttributesNV: + return "PerViewAttributesNV"; + case SpvCapabilityFragmentFullyCoveredEXT: + return "FragmentFullyCoveredEXT"; + case SpvCapabilityShaderNonUniformEXT: + return "ShaderNonUniformEXT"; + case SpvCapabilityRuntimeDescriptorArrayEXT: + return "RuntimeDescriptorArrayEXT"; + case SpvCapabilityInputAttachmentArrayDynamicIndexingEXT: + return "InputAttachmentArrayDynamicIndexingEXT"; + case SpvCapabilityUniformTexelBufferArrayDynamicIndexingEXT: + return "UniformTexelBufferArrayDynamicIndexingEXT"; + case SpvCapabilityStorageTexelBufferArrayDynamicIndexingEXT: + return "StorageTexelBufferArrayDynamicIndexingEXT"; + case SpvCapabilityUniformBufferArrayNonUniformIndexingEXT: + return "UniformBufferArrayNonUniformIndexingEXT"; + case SpvCapabilitySampledImageArrayNonUniformIndexingEXT: + return "SampledImageArrayNonUniformIndexingEXT"; + case SpvCapabilityStorageBufferArrayNonUniformIndexingEXT: + return "StorageBufferArrayNonUniformIndexingEXT"; + case SpvCapabilityStorageImageArrayNonUniformIndexingEXT: + return "StorageImageArrayNonUniformIndexingEXT"; + case SpvCapabilityInputAttachmentArrayNonUniformIndexingEXT: + return "InputAttachmentArrayNonUniformIndexingEXT"; + case SpvCapabilityUniformTexelBufferArrayNonUniformIndexingEXT: + return "UniformTexelBufferArrayNonUniformIndexingEXT"; + case SpvCapabilityStorageTexelBufferArrayNonUniformIndexingEXT: + return "StorageTexelBufferArrayNonUniformIndexingEXT"; + case SpvCapabilitySubgroupShuffleINTEL: + return "SubgroupShuffleINTEL"; + case SpvCapabilitySubgroupBufferBlockIOINTEL: + return "SubgroupBufferBlockIOINTEL"; + case SpvCapabilitySubgroupImageBlockIOINTEL: + return "SubgroupImageBlockIOINTEL"; + case SpvCapabilityGroupNonUniformPartitionedNV: + return "GroupNonUniformPartitionedNV"; + case SpvCapabilityMax: + assert(0 && "Attempting to convert SpvCapabilityMax to string"); + return ""; + }; + + return ""; +} diff --git a/3rdparty/spirv-tools/build/examples/CMakeFiles/CMakeDirectoryInformation.cmake b/3rdparty/spirv-tools/build/examples/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 000000000..b636c3f88 --- /dev/null +++ b/3rdparty/spirv-tools/build/examples/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/bkaradzic/Private/projects/_github/SPIRV-Tools") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/3rdparty/spirv-tools/build/examples/CMakeFiles/progress.marks b/3rdparty/spirv-tools/build/examples/CMakeFiles/progress.marks new file mode 100644 index 000000000..abdfb053e --- /dev/null +++ b/3rdparty/spirv-tools/build/examples/CMakeFiles/progress.marks @@ -0,0 +1 @@ +60 diff --git a/3rdparty/spirv-tools/build/examples/CTestTestfile.cmake b/3rdparty/spirv-tools/build/examples/CTestTestfile.cmake new file mode 100644 index 000000000..45ac88f32 --- /dev/null +++ b/3rdparty/spirv-tools/build/examples/CTestTestfile.cmake @@ -0,0 +1,7 @@ +# CMake generated Testfile for +# Source directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/examples +# Build directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/examples +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. +subdirs(cpp-interface) diff --git a/3rdparty/spirv-tools/build/examples/Makefile b/3rdparty/spirv-tools/build/examples/Makefile new file mode 100644 index 000000000..62fd5f0ab --- /dev/null +++ b/3rdparty/spirv-tools/build/examples/Makefile @@ -0,0 +1,194 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Default target executed when no arguments are given to make. +default_target: all + +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..." + /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache + +.PHONY : edit_cache/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: install/strip + +.PHONY : install/strip/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Available install components are: \"Unspecified\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components + +.PHONY : list_install_components/fast + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running tests..." + /usr/bin/ctest --force-new-ctest-process $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test + +.PHONY : test/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: install/local + +.PHONY : install/local/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache + +.PHONY : rebuild_cache/fast + +# The main all target +all: cmake_check_build_system + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/examples/CMakeFiles/progress.marks + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 examples/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 examples/clean +.PHONY : clean + +# The main clean target +clean/fast: clean + +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 examples/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 examples/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... install" + @echo "... edit_cache" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... test" + @echo "... install/local" + @echo "... rebuild_cache" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/3rdparty/spirv-tools/build/examples/cmake_install.cmake b/3rdparty/spirv-tools/build/examples/cmake_install.cmake new file mode 100644 index 000000000..b3e63864c --- /dev/null +++ b/3rdparty/spirv-tools/build/examples/cmake_install.cmake @@ -0,0 +1,40 @@ +# Install script for directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/examples + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Debug") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "1") +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + # Include the install script for each subdirectory. + include("/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/examples/cpp-interface/cmake_install.cmake") + +endif() + diff --git a/3rdparty/spirv-tools/build/examples/cpp-interface/CMakeFiles/CMakeDirectoryInformation.cmake b/3rdparty/spirv-tools/build/examples/cpp-interface/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 000000000..b636c3f88 --- /dev/null +++ b/3rdparty/spirv-tools/build/examples/cpp-interface/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/bkaradzic/Private/projects/_github/SPIRV-Tools") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/3rdparty/spirv-tools/build/examples/cpp-interface/CMakeFiles/progress.marks b/3rdparty/spirv-tools/build/examples/cpp-interface/CMakeFiles/progress.marks new file mode 100644 index 000000000..abdfb053e --- /dev/null +++ b/3rdparty/spirv-tools/build/examples/cpp-interface/CMakeFiles/progress.marks @@ -0,0 +1 @@ +60 diff --git a/3rdparty/spirv-tools/build/examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/DependInfo.cmake b/3rdparty/spirv-tools/build/examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/DependInfo.cmake new file mode 100644 index 000000000..75a1b4d2c --- /dev/null +++ b/3rdparty/spirv-tools/build/examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/DependInfo.cmake @@ -0,0 +1,33 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + "CXX" + ) +# The set of files for implicit dependencies of each language: +set(CMAKE_DEPENDS_CHECK_CXX + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/examples/cpp-interface/main.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/main.cpp.o" + ) +set(CMAKE_CXX_COMPILER_ID "GNU") + +# Preprocessor definitions for this target. +set(CMAKE_TARGET_DEFINITIONS_CXX + "SPIRV_CHECK_CONTEXT" + "SPIRV_COLOR_TERMINAL" + "SPIRV_LINUX" + "SPIRV_TIMER_ENABLED" + ) + +# The include file search paths: +set(CMAKE_CXX_TARGET_INCLUDE_PATH + "../" + "../include" + "../external/SPIRV-Headers/include" + ) + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/DependInfo.cmake" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/DependInfo.cmake" + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/3rdparty/spirv-tools/build/examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/build.make b/3rdparty/spirv-tools/build/examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/build.make new file mode 100644 index 000000000..378cd7ba3 --- /dev/null +++ b/3rdparty/spirv-tools/build/examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/build.make @@ -0,0 +1,115 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + +# Include any dependencies generated for this target. +include examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/depend.make + +# Include the progress variables for this target. +include examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/progress.make + +# Include the compile flags for this target's objects. +include examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/flags.make + +examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/main.cpp.o: examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/flags.make +examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/main.cpp.o: ../examples/cpp-interface/main.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/main.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/examples/cpp-interface && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/spirv-tools-cpp-example.dir/main.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/examples/cpp-interface/main.cpp + +examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/main.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/spirv-tools-cpp-example.dir/main.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/examples/cpp-interface && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/examples/cpp-interface/main.cpp > CMakeFiles/spirv-tools-cpp-example.dir/main.cpp.i + +examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/main.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/spirv-tools-cpp-example.dir/main.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/examples/cpp-interface && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/examples/cpp-interface/main.cpp -o CMakeFiles/spirv-tools-cpp-example.dir/main.cpp.s + +examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/main.cpp.o.requires: + +.PHONY : examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/main.cpp.o.requires + +examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/main.cpp.o.provides: examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/main.cpp.o.requires + $(MAKE) -f examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/build.make examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/main.cpp.o.provides.build +.PHONY : examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/main.cpp.o.provides + +examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/main.cpp.o.provides.build: examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/main.cpp.o + + +# Object files for target spirv-tools-cpp-example +spirv__tools__cpp__example_OBJECTS = \ +"CMakeFiles/spirv-tools-cpp-example.dir/main.cpp.o" + +# External object files for target spirv-tools-cpp-example +spirv__tools__cpp__example_EXTERNAL_OBJECTS = + +examples/cpp-interface/spirv-tools-cpp-example: examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/main.cpp.o +examples/cpp-interface/spirv-tools-cpp-example: examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/build.make +examples/cpp-interface/spirv-tools-cpp-example: source/opt/libSPIRV-Tools-opt.a +examples/cpp-interface/spirv-tools-cpp-example: source/libSPIRV-Tools.a +examples/cpp-interface/spirv-tools-cpp-example: examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --bold --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Linking CXX executable spirv-tools-cpp-example" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/examples/cpp-interface && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/spirv-tools-cpp-example.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/build: examples/cpp-interface/spirv-tools-cpp-example + +.PHONY : examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/build + +examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/requires: examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/main.cpp.o.requires + +.PHONY : examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/requires + +examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/clean: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/examples/cpp-interface && $(CMAKE_COMMAND) -P CMakeFiles/spirv-tools-cpp-example.dir/cmake_clean.cmake +.PHONY : examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/clean + +examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/depend: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/bkaradzic/Private/projects/_github/SPIRV-Tools /home/bkaradzic/Private/projects/_github/SPIRV-Tools/examples/cpp-interface /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/examples/cpp-interface /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/depend + diff --git a/3rdparty/spirv-tools/build/examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/cmake_clean.cmake b/3rdparty/spirv-tools/build/examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/cmake_clean.cmake new file mode 100644 index 000000000..6800a1705 --- /dev/null +++ b/3rdparty/spirv-tools/build/examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/cmake_clean.cmake @@ -0,0 +1,10 @@ +file(REMOVE_RECURSE + "CMakeFiles/spirv-tools-cpp-example.dir/main.cpp.o" + "spirv-tools-cpp-example.pdb" + "spirv-tools-cpp-example" +) + +# Per-language clean rules from dependency scanning. +foreach(lang CXX) + include(CMakeFiles/spirv-tools-cpp-example.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/3rdparty/spirv-tools/build/examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/depend.make b/3rdparty/spirv-tools/build/examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/depend.make new file mode 100644 index 000000000..9275d7ca6 --- /dev/null +++ b/3rdparty/spirv-tools/build/examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for spirv-tools-cpp-example. +# This may be replaced when dependencies are built. diff --git a/3rdparty/spirv-tools/build/examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/flags.make b/3rdparty/spirv-tools/build/examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/flags.make new file mode 100644 index 000000000..8ed1499e3 --- /dev/null +++ b/3rdparty/spirv-tools/build/examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# compile CXX with /usr/bin/c++ +CXX_FLAGS = -g -fPIE -Wall -Wextra -Wnon-virtual-dtor -Wno-missing-field-initializers -Werror -std=c++11 -fno-exceptions -fno-rtti -Wno-long-long -Wshadow -Wundef -Wconversion -Wno-sign-conversion -std=gnu++11 + +CXX_DEFINES = -DSPIRV_CHECK_CONTEXT -DSPIRV_COLOR_TERMINAL -DSPIRV_LINUX -DSPIRV_TIMER_ENABLED + +CXX_INCLUDES = -I/home/bkaradzic/Private/projects/_github/SPIRV-Tools -I/home/bkaradzic/Private/projects/_github/SPIRV-Tools/include -I/home/bkaradzic/Private/projects/_github/SPIRV-Tools/external/SPIRV-Headers/include + diff --git a/3rdparty/spirv-tools/build/examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/link.txt b/3rdparty/spirv-tools/build/examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/link.txt new file mode 100644 index 000000000..bdc594555 --- /dev/null +++ b/3rdparty/spirv-tools/build/examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/c++ -g CMakeFiles/spirv-tools-cpp-example.dir/main.cpp.o -o spirv-tools-cpp-example -rdynamic ../../source/opt/libSPIRV-Tools-opt.a ../../source/libSPIRV-Tools.a diff --git a/3rdparty/spirv-tools/build/examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/progress.make b/3rdparty/spirv-tools/build/examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/progress.make new file mode 100644 index 000000000..f07b37ae0 --- /dev/null +++ b/3rdparty/spirv-tools/build/examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/progress.make @@ -0,0 +1,3 @@ +CMAKE_PROGRESS_1 = +CMAKE_PROGRESS_2 = 96 + diff --git a/3rdparty/spirv-tools/build/examples/cpp-interface/CTestTestfile.cmake b/3rdparty/spirv-tools/build/examples/cpp-interface/CTestTestfile.cmake new file mode 100644 index 000000000..dcfd6e9cf --- /dev/null +++ b/3rdparty/spirv-tools/build/examples/cpp-interface/CTestTestfile.cmake @@ -0,0 +1,6 @@ +# CMake generated Testfile for +# Source directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/examples/cpp-interface +# Build directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/examples/cpp-interface +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. diff --git a/3rdparty/spirv-tools/build/examples/cpp-interface/Makefile b/3rdparty/spirv-tools/build/examples/cpp-interface/Makefile new file mode 100644 index 000000000..98e53b0e0 --- /dev/null +++ b/3rdparty/spirv-tools/build/examples/cpp-interface/Makefile @@ -0,0 +1,240 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Default target executed when no arguments are given to make. +default_target: all + +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache + +.PHONY : rebuild_cache/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: install/strip + +.PHONY : install/strip/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..." + /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache + +.PHONY : edit_cache/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Available install components are: \"Unspecified\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components + +.PHONY : list_install_components/fast + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running tests..." + /usr/bin/ctest --force-new-ctest-process $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test + +.PHONY : test/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: install/local + +.PHONY : install/local/fast + +# The main all target +all: cmake_check_build_system + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/examples/cpp-interface/CMakeFiles/progress.marks + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 examples/cpp-interface/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 examples/cpp-interface/clean +.PHONY : clean + +# The main clean target +clean/fast: clean + +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 examples/cpp-interface/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 examples/cpp-interface/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Convenience name for target. +examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/rule: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/rule +.PHONY : examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/rule + +# Convenience name for target. +spirv-tools-cpp-example: examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/rule + +.PHONY : spirv-tools-cpp-example + +# fast build rule for target. +spirv-tools-cpp-example/fast: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/build.make examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/build +.PHONY : spirv-tools-cpp-example/fast + +main.o: main.cpp.o + +.PHONY : main.o + +# target to build an object file +main.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/build.make examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/main.cpp.o +.PHONY : main.cpp.o + +main.i: main.cpp.i + +.PHONY : main.i + +# target to preprocess a source file +main.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/build.make examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/main.cpp.i +.PHONY : main.cpp.i + +main.s: main.cpp.s + +.PHONY : main.s + +# target to generate assembly for a file +main.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/build.make examples/cpp-interface/CMakeFiles/spirv-tools-cpp-example.dir/main.cpp.s +.PHONY : main.cpp.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... install" + @echo "... rebuild_cache" + @echo "... install/strip" + @echo "... spirv-tools-cpp-example" + @echo "... edit_cache" + @echo "... list_install_components" + @echo "... test" + @echo "... install/local" + @echo "... main.o" + @echo "... main.i" + @echo "... main.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/3rdparty/spirv-tools/build/examples/cpp-interface/cmake_install.cmake b/3rdparty/spirv-tools/build/examples/cpp-interface/cmake_install.cmake new file mode 100644 index 000000000..7fd5fb46e --- /dev/null +++ b/3rdparty/spirv-tools/build/examples/cpp-interface/cmake_install.cmake @@ -0,0 +1,34 @@ +# Install script for directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/examples/cpp-interface + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Debug") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "1") +endif() + diff --git a/3rdparty/spirv-tools/build/extension_enum.inc b/3rdparty/spirv-tools/build/extension_enum.inc new file mode 100644 index 000000000..c1cf94a7b --- /dev/null +++ b/3rdparty/spirv-tools/build/extension_enum.inc @@ -0,0 +1,35 @@ +kSPV_AMD_gcn_shader, +kSPV_AMD_gpu_shader_half_float, +kSPV_AMD_gpu_shader_half_float_fetch, +kSPV_AMD_gpu_shader_int16, +kSPV_AMD_shader_ballot, +kSPV_AMD_shader_explicit_vertex_parameter, +kSPV_AMD_shader_fragment_mask, +kSPV_AMD_shader_image_load_store_lod, +kSPV_AMD_shader_trinary_minmax, +kSPV_AMD_texture_gather_bias_lod, +kSPV_EXT_descriptor_indexing, +kSPV_EXT_fragment_fully_covered, +kSPV_EXT_shader_stencil_export, +kSPV_EXT_shader_viewport_index_layer, +kSPV_GOOGLE_decorate_string, +kSPV_GOOGLE_hlsl_functionality1, +kSPV_INTEL_subgroups, +kSPV_KHR_16bit_storage, +kSPV_KHR_8bit_storage, +kSPV_KHR_device_group, +kSPV_KHR_multiview, +kSPV_KHR_post_depth_coverage, +kSPV_KHR_shader_atomic_counter_ops, +kSPV_KHR_shader_ballot, +kSPV_KHR_shader_draw_parameters, +kSPV_KHR_storage_buffer_storage_class, +kSPV_KHR_subgroup_vote, +kSPV_KHR_variable_pointers, +kSPV_NVX_multiview_per_view_attributes, +kSPV_NV_geometry_shader_passthrough, +kSPV_NV_sample_mask_override_coverage, +kSPV_NV_shader_subgroup_partitioned, +kSPV_NV_stereo_view_rendering, +kSPV_NV_viewport_array2, +kSPV_VALIDATOR_ignore_type_decl_unique diff --git a/3rdparty/spirv-tools/build/external/CMakeFiles/CMakeDirectoryInformation.cmake b/3rdparty/spirv-tools/build/external/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 000000000..b636c3f88 --- /dev/null +++ b/3rdparty/spirv-tools/build/external/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/bkaradzic/Private/projects/_github/SPIRV-Tools") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/3rdparty/spirv-tools/build/external/CMakeFiles/progress.marks b/3rdparty/spirv-tools/build/external/CMakeFiles/progress.marks new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/3rdparty/spirv-tools/build/external/CMakeFiles/progress.marks @@ -0,0 +1 @@ +0 diff --git a/3rdparty/spirv-tools/build/external/CTestTestfile.cmake b/3rdparty/spirv-tools/build/external/CTestTestfile.cmake new file mode 100644 index 000000000..01e14d30e --- /dev/null +++ b/3rdparty/spirv-tools/build/external/CTestTestfile.cmake @@ -0,0 +1,6 @@ +# CMake generated Testfile for +# Source directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/external +# Build directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/external +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. diff --git a/3rdparty/spirv-tools/build/external/Makefile b/3rdparty/spirv-tools/build/external/Makefile new file mode 100644 index 000000000..c763573f0 --- /dev/null +++ b/3rdparty/spirv-tools/build/external/Makefile @@ -0,0 +1,194 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Default target executed when no arguments are given to make. +default_target: all + +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..." + /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache + +.PHONY : edit_cache/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: install/strip + +.PHONY : install/strip/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Available install components are: \"Unspecified\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components + +.PHONY : list_install_components/fast + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running tests..." + /usr/bin/ctest --force-new-ctest-process $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test + +.PHONY : test/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: install/local + +.PHONY : install/local/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache + +.PHONY : rebuild_cache/fast + +# The main all target +all: cmake_check_build_system + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/external/CMakeFiles/progress.marks + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 external/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 external/clean +.PHONY : clean + +# The main clean target +clean/fast: clean + +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 external/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 external/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... install" + @echo "... edit_cache" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... test" + @echo "... install/local" + @echo "... rebuild_cache" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/3rdparty/spirv-tools/build/external/cmake_install.cmake b/3rdparty/spirv-tools/build/external/cmake_install.cmake new file mode 100644 index 000000000..125328eaf --- /dev/null +++ b/3rdparty/spirv-tools/build/external/cmake_install.cmake @@ -0,0 +1,34 @@ +# Install script for directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/external + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Debug") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "1") +endif() + diff --git a/3rdparty/spirv-tools/build/generators.inc b/3rdparty/spirv-tools/build/generators.inc new file mode 100644 index 000000000..39709d3aa --- /dev/null +++ b/3rdparty/spirv-tools/build/generators.inc @@ -0,0 +1,20 @@ +{0, "Khronos", "", "Khronos"}, +{1, "LunarG", "", "LunarG"}, +{2, "Valve", "", "Valve"}, +{3, "Codeplay", "", "Codeplay"}, +{4, "NVIDIA", "", "NVIDIA"}, +{5, "ARM", "", "ARM"}, +{6, "Khronos", "LLVM/SPIR-V Translator", "Khronos LLVM/SPIR-V Translator"}, +{7, "Khronos", "SPIR-V Tools Assembler", "Khronos SPIR-V Tools Assembler"}, +{8, "Khronos", "Glslang Reference Front End", "Khronos Glslang Reference Front End"}, +{9, "Qualcomm", "", "Qualcomm"}, +{10, "AMD", "", "AMD"}, +{11, "Intel", "", "Intel"}, +{12, "Imagination", "", "Imagination"}, +{13, "Google", "Shaderc over Glslang", "Google Shaderc over Glslang"}, +{14, "Google", "spiregg", "Google spiregg"}, +{15, "Google", "rspirv", "Google rspirv"}, +{16, "X-LEGEND", "Mesa-IR/SPIR-V Translator", "X-LEGEND Mesa-IR/SPIR-V Translator"}, +{17, "Khronos", "SPIR-V Tools Linker", "Khronos SPIR-V Tools Linker"}, +{18, "Wine", "VKD3D Shader Compiler", "Wine VKD3D Shader Compiler"}, +{19, "Clay", "Clay Shader Compiler", "Clay Clay Shader Compiler"}, diff --git a/3rdparty/spirv-tools/build/glsl.std.450.insts.inc b/3rdparty/spirv-tools/build/glsl.std.450.insts.inc new file mode 100644 index 000000000..6bb2e7662 --- /dev/null +++ b/3rdparty/spirv-tools/build/glsl.std.450.insts.inc @@ -0,0 +1,86 @@ +static const SpvCapability pygen_variable_caps_Float64[] = {SpvCapabilityFloat64}; +static const SpvCapability pygen_variable_caps_InterpolationFunction[] = {SpvCapabilityInterpolationFunction}; + +static const spv_ext_inst_desc_t glsl_entries[] = { + {"Round", 1, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"RoundEven", 2, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"Trunc", 3, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"FAbs", 4, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"SAbs", 5, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"FSign", 6, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"SSign", 7, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"Floor", 8, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"Ceil", 9, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"Fract", 10, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"Radians", 11, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"Degrees", 12, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"Sin", 13, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"Cos", 14, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"Tan", 15, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"Asin", 16, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"Acos", 17, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"Atan", 18, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"Sinh", 19, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"Cosh", 20, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"Tanh", 21, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"Asinh", 22, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"Acosh", 23, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"Atanh", 24, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"Atan2", 25, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"Pow", 26, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"Exp", 27, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"Log", 28, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"Exp2", 29, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"Log2", 30, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"Sqrt", 31, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"InverseSqrt", 32, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"Determinant", 33, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"MatrixInverse", 34, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"Modf", 35, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"ModfStruct", 36, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"FMin", 37, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"UMin", 38, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"SMin", 39, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"FMax", 40, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"UMax", 41, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"SMax", 42, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"FClamp", 43, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"UClamp", 44, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"SClamp", 45, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"FMix", 46, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"IMix", 47, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"Step", 48, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"SmoothStep", 49, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"Fma", 50, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"Frexp", 51, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"FrexpStruct", 52, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"Ldexp", 53, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"PackSnorm4x8", 54, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"PackUnorm4x8", 55, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"PackSnorm2x16", 56, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"PackUnorm2x16", 57, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"PackHalf2x16", 58, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"PackDouble2x32", 59, 1, pygen_variable_caps_Float64, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"UnpackSnorm2x16", 60, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"UnpackUnorm2x16", 61, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"UnpackHalf2x16", 62, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"UnpackSnorm4x8", 63, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"UnpackUnorm4x8", 64, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"UnpackDouble2x32", 65, 1, pygen_variable_caps_Float64, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"Length", 66, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"Distance", 67, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"Cross", 68, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"Normalize", 69, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"FaceForward", 70, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"Reflect", 71, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"Refract", 72, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"FindILsb", 73, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"FindSMsb", 74, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"FindUMsb", 75, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"InterpolateAtCentroid", 76, 1, pygen_variable_caps_InterpolationFunction, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"InterpolateAtSample", 77, 1, pygen_variable_caps_InterpolationFunction, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"InterpolateAtOffset", 78, 1, pygen_variable_caps_InterpolationFunction, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"NMin", 79, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"NMax", 80, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"NClamp", 81, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}} +}; diff --git a/3rdparty/spirv-tools/build/opencl.std.insts.inc b/3rdparty/spirv-tools/build/opencl.std.insts.inc new file mode 100644 index 000000000..abc76efc3 --- /dev/null +++ b/3rdparty/spirv-tools/build/opencl.std.insts.inc @@ -0,0 +1,166 @@ + + +static const spv_ext_inst_desc_t opencl_entries[] = { + {"acos", 0, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"acosh", 1, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"acospi", 2, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"asin", 3, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"asinh", 4, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"asinpi", 5, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"atan", 6, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"atan2", 7, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"atanh", 8, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"atanpi", 9, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"atan2pi", 10, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"cbrt", 11, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"ceil", 12, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"copysign", 13, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"cos", 14, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"cosh", 15, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"cospi", 16, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"erfc", 17, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"erf", 18, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"exp", 19, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"exp2", 20, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"exp10", 21, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"expm1", 22, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"fabs", 23, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"fdim", 24, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"floor", 25, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"fma", 26, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"fmax", 27, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"fmin", 28, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"fmod", 29, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"fract", 30, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"frexp", 31, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"hypot", 32, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"ilogb", 33, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"ldexp", 34, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"lgamma", 35, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"lgamma_r", 36, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"log", 37, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"log2", 38, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"log10", 39, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"log1p", 40, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"logb", 41, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"mad", 42, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"maxmag", 43, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"minmag", 44, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"modf", 45, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"nan", 46, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"nextafter", 47, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"pow", 48, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"pown", 49, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"powr", 50, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"remainder", 51, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"remquo", 52, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"rint", 53, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"rootn", 54, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"round", 55, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"rsqrt", 56, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"sin", 57, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"sincos", 58, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"sinh", 59, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"sinpi", 60, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"sqrt", 61, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"tan", 62, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"tanh", 63, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"tanpi", 64, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"tgamma", 65, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"trunc", 66, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"half_cos", 67, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"half_divide", 68, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"half_exp", 69, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"half_exp2", 70, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"half_exp10", 71, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"half_log", 72, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"half_log2", 73, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"half_log10", 74, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"half_powr", 75, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"half_recip", 76, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"half_rsqrt", 77, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"half_sin", 78, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"half_sqrt", 79, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"half_tan", 80, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"native_cos", 81, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"native_divide", 82, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"native_exp", 83, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"native_exp2", 84, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"native_exp10", 85, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"native_log", 86, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"native_log2", 87, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"native_log10", 88, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"native_powr", 89, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"native_recip", 90, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"native_rsqrt", 91, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"native_sin", 92, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"native_sqrt", 93, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"native_tan", 94, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"fclamp", 95, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"degrees", 96, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"fmax_common", 97, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"fmin_common", 98, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"mix", 99, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"radians", 100, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"step", 101, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"smoothstep", 102, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"sign", 103, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"cross", 104, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"distance", 105, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"length", 106, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"normalize", 107, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"fast_distance", 108, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"fast_length", 109, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"fast_normalize", 110, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"s_abs", 141, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"s_abs_diff", 142, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"s_add_sat", 143, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"u_add_sat", 144, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"s_hadd", 145, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"u_hadd", 146, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"s_rhadd", 147, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"u_rhadd", 148, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"s_clamp", 149, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"u_clamp", 150, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"clz", 151, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"ctz", 152, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"s_mad_hi", 153, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"u_mad_sat", 154, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"s_mad_sat", 155, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"s_max", 156, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"u_max", 157, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"s_min", 158, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"u_min", 159, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"s_mul_hi", 160, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"rotate", 161, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"s_sub_sat", 162, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"u_sub_sat", 163, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"u_upsample", 164, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"s_upsample", 165, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"popcount", 166, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"s_mad24", 167, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"u_mad24", 168, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"s_mul24", 169, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"u_mul24", 170, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"vloadn", 171, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}}, + {"vstoren", 172, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"vload_half", 173, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"vload_halfn", 174, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}}, + {"vstore_half", 175, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"vstore_half_r", 176, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_FP_ROUNDING_MODE, SPV_OPERAND_TYPE_NONE}}, + {"vstore_halfn", 177, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"vstore_halfn_r", 178, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_FP_ROUNDING_MODE, SPV_OPERAND_TYPE_NONE}}, + {"vloada_halfn", 179, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_NONE}}, + {"vstorea_halfn", 180, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"vstorea_halfn_r", 181, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_FP_ROUNDING_MODE, SPV_OPERAND_TYPE_NONE}}, + {"shuffle", 182, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"shuffle2", 183, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"printf", 184, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_VARIABLE_ID, SPV_OPERAND_TYPE_NONE}}, + {"prefetch", 185, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"bitselect", 186, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"select", 187, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"u_abs", 201, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"u_abs_diff", 202, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"u_mul_hi", 203, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"u_mad_hi", 204, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}} +}; diff --git a/3rdparty/spirv-tools/build/operand.kinds-unified1.inc b/3rdparty/spirv-tools/build/operand.kinds-unified1.inc new file mode 100644 index 000000000..e40c74b21 --- /dev/null +++ b/3rdparty/spirv-tools/build/operand.kinds-unified1.inc @@ -0,0 +1,749 @@ +static const SpvCapability pygen_variable_caps_Addresses[] = {SpvCapabilityAddresses}; +static const SpvCapability pygen_variable_caps_AtomicStorage[] = {SpvCapabilityAtomicStorage}; +static const SpvCapability pygen_variable_caps_ClipDistance[] = {SpvCapabilityClipDistance}; +static const SpvCapability pygen_variable_caps_CullDistance[] = {SpvCapabilityCullDistance}; +static const SpvCapability pygen_variable_caps_DeviceEnqueue[] = {SpvCapabilityDeviceEnqueue}; +static const SpvCapability pygen_variable_caps_DeviceGroup[] = {SpvCapabilityDeviceGroup}; +static const SpvCapability pygen_variable_caps_DrawParameters[] = {SpvCapabilityDrawParameters}; +static const SpvCapability pygen_variable_caps_FragmentFullyCoveredEXT[] = {SpvCapabilityFragmentFullyCoveredEXT}; +static const SpvCapability pygen_variable_caps_GenericPointer[] = {SpvCapabilityGenericPointer}; +static const SpvCapability pygen_variable_caps_Geometry[] = {SpvCapabilityGeometry}; +static const SpvCapability pygen_variable_caps_GeometryTessellation[] = {SpvCapabilityGeometry, SpvCapabilityTessellation}; +static const SpvCapability pygen_variable_caps_GeometryShaderPassthroughNV[] = {SpvCapabilityGeometryShaderPassthroughNV}; +static const SpvCapability pygen_variable_caps_GeometryStreams[] = {SpvCapabilityGeometryStreams}; +static const SpvCapability pygen_variable_caps_GroupNonUniform[] = {SpvCapabilityGroupNonUniform}; +static const SpvCapability pygen_variable_caps_GroupNonUniformClustered[] = {SpvCapabilityGroupNonUniformClustered}; +static const SpvCapability pygen_variable_caps_GroupNonUniformPartitionedNV[] = {SpvCapabilityGroupNonUniformPartitionedNV}; +static const SpvCapability pygen_variable_caps_ImageBasic[] = {SpvCapabilityImageBasic}; +static const SpvCapability pygen_variable_caps_ImageBuffer[] = {SpvCapabilityImageBuffer}; +static const SpvCapability pygen_variable_caps_ImageBufferShaderNonUniformEXT[] = {SpvCapabilityImageBuffer, SpvCapabilityShaderNonUniformEXT}; +static const SpvCapability pygen_variable_caps_ImageGatherExtended[] = {SpvCapabilityImageGatherExtended}; +static const SpvCapability pygen_variable_caps_InputAttachment[] = {SpvCapabilityInputAttachment}; +static const SpvCapability pygen_variable_caps_InputAttachmentShaderNonUniformEXT[] = {SpvCapabilityInputAttachment, SpvCapabilityShaderNonUniformEXT}; +static const SpvCapability pygen_variable_caps_Int64[] = {SpvCapabilityInt64}; +static const SpvCapability pygen_variable_caps_Kernel[] = {SpvCapabilityKernel}; +static const SpvCapability pygen_variable_caps_KernelGroupNonUniform[] = {SpvCapabilityKernel, SpvCapabilityGroupNonUniform}; +static const SpvCapability pygen_variable_caps_KernelGroupNonUniformSubgroupBallotKHR[] = {SpvCapabilityKernel, SpvCapabilityGroupNonUniform, SpvCapabilitySubgroupBallotKHR}; +static const SpvCapability pygen_variable_caps_KernelGroupNonUniformArithmeticGroupNonUniformBallot[] = {SpvCapabilityKernel, SpvCapabilityGroupNonUniformArithmetic, SpvCapabilityGroupNonUniformBallot}; +static const SpvCapability pygen_variable_caps_Linkage[] = {SpvCapabilityLinkage}; +static const SpvCapability pygen_variable_caps_Matrix[] = {SpvCapabilityMatrix}; +static const SpvCapability pygen_variable_caps_MinLod[] = {SpvCapabilityMinLod}; +static const SpvCapability pygen_variable_caps_MultiView[] = {SpvCapabilityMultiView}; +static const SpvCapability pygen_variable_caps_MultiViewport[] = {SpvCapabilityMultiViewport}; +static const SpvCapability pygen_variable_caps_PerViewAttributesNV[] = {SpvCapabilityPerViewAttributesNV}; +static const SpvCapability pygen_variable_caps_Pipes[] = {SpvCapabilityPipes}; +static const SpvCapability pygen_variable_caps_SampleMaskOverrideCoverageNV[] = {SpvCapabilitySampleMaskOverrideCoverageNV}; +static const SpvCapability pygen_variable_caps_SampleMaskPostDepthCoverage[] = {SpvCapabilitySampleMaskPostDepthCoverage}; +static const SpvCapability pygen_variable_caps_SampleRateShading[] = {SpvCapabilitySampleRateShading}; +static const SpvCapability pygen_variable_caps_Sampled1D[] = {SpvCapabilitySampled1D}; +static const SpvCapability pygen_variable_caps_SampledBuffer[] = {SpvCapabilitySampledBuffer}; +static const SpvCapability pygen_variable_caps_SampledBufferShaderNonUniformEXT[] = {SpvCapabilitySampledBuffer, SpvCapabilityShaderNonUniformEXT}; +static const SpvCapability pygen_variable_caps_SampledCubeArray[] = {SpvCapabilitySampledCubeArray}; +static const SpvCapability pygen_variable_caps_SampledRect[] = {SpvCapabilitySampledRect}; +static const SpvCapability pygen_variable_caps_Shader[] = {SpvCapabilityShader}; +static const SpvCapability pygen_variable_caps_ShaderKernel[] = {SpvCapabilityShader, SpvCapabilityKernel}; +static const SpvCapability pygen_variable_caps_ShaderNonUniformEXT[] = {SpvCapabilityShaderNonUniformEXT}; +static const SpvCapability pygen_variable_caps_ShaderStereoViewNV[] = {SpvCapabilityShaderStereoViewNV}; +static const SpvCapability pygen_variable_caps_ShaderViewportIndexLayerNV[] = {SpvCapabilityShaderViewportIndexLayerNV}; +static const SpvCapability pygen_variable_caps_ShaderViewportMaskNV[] = {SpvCapabilityShaderViewportMaskNV}; +static const SpvCapability pygen_variable_caps_StencilExportEXT[] = {SpvCapabilityStencilExportEXT}; +static const SpvCapability pygen_variable_caps_StorageBuffer16BitAccessStorageUniformBufferBlock16[] = {SpvCapabilityStorageBuffer16BitAccess, SpvCapabilityStorageUniformBufferBlock16}; +static const SpvCapability pygen_variable_caps_StorageBuffer8BitAccess[] = {SpvCapabilityStorageBuffer8BitAccess}; +static const SpvCapability pygen_variable_caps_StorageImageExtendedFormats[] = {SpvCapabilityStorageImageExtendedFormats}; +static const SpvCapability pygen_variable_caps_SubgroupBallotKHRGroupNonUniformBallot[] = {SpvCapabilitySubgroupBallotKHR, SpvCapabilityGroupNonUniformBallot}; +static const SpvCapability pygen_variable_caps_SubgroupDispatch[] = {SpvCapabilitySubgroupDispatch}; +static const SpvCapability pygen_variable_caps_Tessellation[] = {SpvCapabilityTessellation}; +static const SpvCapability pygen_variable_caps_TransformFeedback[] = {SpvCapabilityTransformFeedback}; +static const SpvCapability pygen_variable_caps_VariablePointersStorageBuffer[] = {SpvCapabilityVariablePointersStorageBuffer}; + +static const spvtools::Extension pygen_variable_exts_SPV_AMD_gpu_shader_half_float_fetch[] = {spvtools::Extension::kSPV_AMD_gpu_shader_half_float_fetch}; +static const spvtools::Extension pygen_variable_exts_SPV_AMD_shader_explicit_vertex_parameter[] = {spvtools::Extension::kSPV_AMD_shader_explicit_vertex_parameter}; +static const spvtools::Extension pygen_variable_exts_SPV_AMD_shader_fragment_mask[] = {spvtools::Extension::kSPV_AMD_shader_fragment_mask}; +static const spvtools::Extension pygen_variable_exts_SPV_AMD_shader_image_load_store_lod[] = {spvtools::Extension::kSPV_AMD_shader_image_load_store_lod}; +static const spvtools::Extension pygen_variable_exts_SPV_AMD_texture_gather_bias_lod[] = {spvtools::Extension::kSPV_AMD_texture_gather_bias_lod}; +static const spvtools::Extension pygen_variable_exts_SPV_EXT_descriptor_indexing[] = {spvtools::Extension::kSPV_EXT_descriptor_indexing}; +static const spvtools::Extension pygen_variable_exts_SPV_EXT_fragment_fully_covered[] = {spvtools::Extension::kSPV_EXT_fragment_fully_covered}; +static const spvtools::Extension pygen_variable_exts_SPV_EXT_shader_stencil_export[] = {spvtools::Extension::kSPV_EXT_shader_stencil_export}; +static const spvtools::Extension pygen_variable_exts_SPV_EXT_shader_viewport_index_layer[] = {spvtools::Extension::kSPV_EXT_shader_viewport_index_layer}; +static const spvtools::Extension pygen_variable_exts_SPV_GOOGLE_hlsl_functionality1[] = {spvtools::Extension::kSPV_GOOGLE_hlsl_functionality1}; +static const spvtools::Extension pygen_variable_exts_SPV_INTEL_subgroups[] = {spvtools::Extension::kSPV_INTEL_subgroups}; +static const spvtools::Extension pygen_variable_exts_SPV_KHR_16bit_storage[] = {spvtools::Extension::kSPV_KHR_16bit_storage}; +static const spvtools::Extension pygen_variable_exts_SPV_KHR_8bit_storage[] = {spvtools::Extension::kSPV_KHR_8bit_storage}; +static const spvtools::Extension pygen_variable_exts_SPV_KHR_device_group[] = {spvtools::Extension::kSPV_KHR_device_group}; +static const spvtools::Extension pygen_variable_exts_SPV_KHR_multiview[] = {spvtools::Extension::kSPV_KHR_multiview}; +static const spvtools::Extension pygen_variable_exts_SPV_KHR_post_depth_coverage[] = {spvtools::Extension::kSPV_KHR_post_depth_coverage}; +static const spvtools::Extension pygen_variable_exts_SPV_KHR_shader_atomic_counter_ops[] = {spvtools::Extension::kSPV_KHR_shader_atomic_counter_ops}; +static const spvtools::Extension pygen_variable_exts_SPV_KHR_shader_ballot[] = {spvtools::Extension::kSPV_KHR_shader_ballot}; +static const spvtools::Extension pygen_variable_exts_SPV_KHR_shader_draw_parameters[] = {spvtools::Extension::kSPV_KHR_shader_draw_parameters}; +static const spvtools::Extension pygen_variable_exts_SPV_KHR_storage_buffer_storage_classSPV_KHR_variable_pointers[] = {spvtools::Extension::kSPV_KHR_storage_buffer_storage_class, spvtools::Extension::kSPV_KHR_variable_pointers}; +static const spvtools::Extension pygen_variable_exts_SPV_KHR_subgroup_vote[] = {spvtools::Extension::kSPV_KHR_subgroup_vote}; +static const spvtools::Extension pygen_variable_exts_SPV_KHR_variable_pointers[] = {spvtools::Extension::kSPV_KHR_variable_pointers}; +static const spvtools::Extension pygen_variable_exts_SPV_NVX_multiview_per_view_attributes[] = {spvtools::Extension::kSPV_NVX_multiview_per_view_attributes}; +static const spvtools::Extension pygen_variable_exts_SPV_NV_geometry_shader_passthrough[] = {spvtools::Extension::kSPV_NV_geometry_shader_passthrough}; +static const spvtools::Extension pygen_variable_exts_SPV_NV_sample_mask_override_coverage[] = {spvtools::Extension::kSPV_NV_sample_mask_override_coverage}; +static const spvtools::Extension pygen_variable_exts_SPV_NV_shader_subgroup_partitioned[] = {spvtools::Extension::kSPV_NV_shader_subgroup_partitioned}; +static const spvtools::Extension pygen_variable_exts_SPV_NV_stereo_view_rendering[] = {spvtools::Extension::kSPV_NV_stereo_view_rendering}; +static const spvtools::Extension pygen_variable_exts_SPV_NV_viewport_array2[] = {spvtools::Extension::kSPV_NV_viewport_array2}; + +static const spv_operand_desc_t pygen_variable_ImageOperandsEntries[] = { + {"None", 0x0000, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Bias", 0x0001, 1, pygen_variable_caps_Shader, 0, nullptr, {SPV_OPERAND_TYPE_ID}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Lod", 0x0002, 0, nullptr, 0, nullptr, {SPV_OPERAND_TYPE_ID}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Grad", 0x0004, 0, nullptr, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ConstOffset", 0x0008, 0, nullptr, 0, nullptr, {SPV_OPERAND_TYPE_ID}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Offset", 0x0010, 1, pygen_variable_caps_ImageGatherExtended, 0, nullptr, {SPV_OPERAND_TYPE_ID}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ConstOffsets", 0x0020, 1, pygen_variable_caps_ImageGatherExtended, 0, nullptr, {SPV_OPERAND_TYPE_ID}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Sample", 0x0040, 0, nullptr, 0, nullptr, {SPV_OPERAND_TYPE_ID}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"MinLod", 0x0080, 1, pygen_variable_caps_MinLod, 0, nullptr, {SPV_OPERAND_TYPE_ID}, SPV_SPIRV_VERSION_WORD(1, 0)} +}; + +static const spv_operand_desc_t pygen_variable_FPFastMathModeEntries[] = { + {"None", 0x0000, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"NotNaN", 0x0001, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"NotInf", 0x0002, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"NSZ", 0x0004, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"AllowRecip", 0x0008, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Fast", 0x0010, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)} +}; + +static const spv_operand_desc_t pygen_variable_SelectionControlEntries[] = { + {"None", 0x0000, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Flatten", 0x0001, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"DontFlatten", 0x0002, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)} +}; + +static const spv_operand_desc_t pygen_variable_LoopControlEntries[] = { + {"None", 0x0000, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Unroll", 0x0001, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"DontUnroll", 0x0002, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"DependencyInfinite", 0x0004, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1,1)}, + {"DependencyLength", 0x0008, 0, nullptr, 0, nullptr, {SPV_OPERAND_TYPE_LITERAL_INTEGER}, SPV_SPIRV_VERSION_WORD(1,1)} +}; + +static const spv_operand_desc_t pygen_variable_FunctionControlEntries[] = { + {"None", 0x0000, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Inline", 0x0001, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"DontInline", 0x0002, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Pure", 0x0004, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Const", 0x0008, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)} +}; + +static const spv_operand_desc_t pygen_variable_MemorySemanticsEntries[] = { + {"None", 0x0000, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Relaxed", 0x0000, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Acquire", 0x0002, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Release", 0x0004, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"AcquireRelease", 0x0008, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SequentiallyConsistent", 0x0010, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"UniformMemory", 0x0040, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SubgroupMemory", 0x0080, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"WorkgroupMemory", 0x0100, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"CrossWorkgroupMemory", 0x0200, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"AtomicCounterMemory", 0x0400, 1, pygen_variable_caps_AtomicStorage, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ImageMemory", 0x0800, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)} +}; + +static const spv_operand_desc_t pygen_variable_MemoryAccessEntries[] = { + {"None", 0x0000, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Volatile", 0x0001, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Aligned", 0x0002, 0, nullptr, 0, nullptr, {SPV_OPERAND_TYPE_LITERAL_INTEGER}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Nontemporal", 0x0004, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)} +}; + +static const spv_operand_desc_t pygen_variable_KernelProfilingInfoEntries[] = { + {"None", 0x0000, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"CmdExecTime", 0x0001, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)} +}; + +static const spv_operand_desc_t pygen_variable_SourceLanguageEntries[] = { + {"Unknown", 0, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ESSL", 1, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"GLSL", 2, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"OpenCL_C", 3, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"OpenCL_CPP", 4, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"HLSL", 5, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)} +}; + +static const spv_operand_desc_t pygen_variable_ExecutionModelEntries[] = { + {"Vertex", 0, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"TessellationControl", 1, 1, pygen_variable_caps_Tessellation, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"TessellationEvaluation", 2, 1, pygen_variable_caps_Tessellation, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Geometry", 3, 1, pygen_variable_caps_Geometry, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Fragment", 4, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"GLCompute", 5, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Kernel", 6, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)} +}; + +static const spv_operand_desc_t pygen_variable_AddressingModelEntries[] = { + {"Logical", 0, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Physical32", 1, 1, pygen_variable_caps_Addresses, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Physical64", 2, 1, pygen_variable_caps_Addresses, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)} +}; + +static const spv_operand_desc_t pygen_variable_MemoryModelEntries[] = { + {"Simple", 0, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"GLSL450", 1, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"OpenCL", 2, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)} +}; + +static const spv_operand_desc_t pygen_variable_ExecutionModeEntries[] = { + {"Invocations", 0, 1, pygen_variable_caps_Geometry, 0, nullptr, {SPV_OPERAND_TYPE_LITERAL_INTEGER}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SpacingEqual", 1, 1, pygen_variable_caps_Tessellation, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SpacingFractionalEven", 2, 1, pygen_variable_caps_Tessellation, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SpacingFractionalOdd", 3, 1, pygen_variable_caps_Tessellation, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"VertexOrderCw", 4, 1, pygen_variable_caps_Tessellation, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"VertexOrderCcw", 5, 1, pygen_variable_caps_Tessellation, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"PixelCenterInteger", 6, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"OriginUpperLeft", 7, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"OriginLowerLeft", 8, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"EarlyFragmentTests", 9, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"PointMode", 10, 1, pygen_variable_caps_Tessellation, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Xfb", 11, 1, pygen_variable_caps_TransformFeedback, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"DepthReplacing", 12, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"DepthGreater", 14, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"DepthLess", 15, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"DepthUnchanged", 16, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"LocalSize", 17, 0, nullptr, 0, nullptr, {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"LocalSizeHint", 18, 1, pygen_variable_caps_Kernel, 0, nullptr, {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"InputPoints", 19, 1, pygen_variable_caps_Geometry, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"InputLines", 20, 1, pygen_variable_caps_Geometry, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"InputLinesAdjacency", 21, 1, pygen_variable_caps_Geometry, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Triangles", 22, 2, pygen_variable_caps_GeometryTessellation, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"InputTrianglesAdjacency", 23, 1, pygen_variable_caps_Geometry, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Quads", 24, 1, pygen_variable_caps_Tessellation, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Isolines", 25, 1, pygen_variable_caps_Tessellation, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"OutputVertices", 26, 2, pygen_variable_caps_GeometryTessellation, 0, nullptr, {SPV_OPERAND_TYPE_LITERAL_INTEGER}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"OutputPoints", 27, 1, pygen_variable_caps_Geometry, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"OutputLineStrip", 28, 1, pygen_variable_caps_Geometry, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"OutputTriangleStrip", 29, 1, pygen_variable_caps_Geometry, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"VecTypeHint", 30, 1, pygen_variable_caps_Kernel, 0, nullptr, {SPV_OPERAND_TYPE_LITERAL_INTEGER}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ContractionOff", 31, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Initializer", 33, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1,1)}, + {"Finalizer", 34, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1,1)}, + {"SubgroupSize", 35, 1, pygen_variable_caps_SubgroupDispatch, 0, nullptr, {SPV_OPERAND_TYPE_LITERAL_INTEGER}, SPV_SPIRV_VERSION_WORD(1,1)}, + {"SubgroupsPerWorkgroup", 36, 1, pygen_variable_caps_SubgroupDispatch, 0, nullptr, {SPV_OPERAND_TYPE_LITERAL_INTEGER}, SPV_SPIRV_VERSION_WORD(1,1)}, + {"SubgroupsPerWorkgroupId", 37, 1, pygen_variable_caps_SubgroupDispatch, 0, nullptr, {SPV_OPERAND_TYPE_ID}, SPV_SPIRV_VERSION_WORD(1,2)}, + {"LocalSizeId", 38, 0, nullptr, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, SPV_SPIRV_VERSION_WORD(1,2)}, + {"LocalSizeHintId", 39, 1, pygen_variable_caps_Kernel, 0, nullptr, {SPV_OPERAND_TYPE_ID}, SPV_SPIRV_VERSION_WORD(1,2)}, + {"PostDepthCoverage", 4446, 1, pygen_variable_caps_SampleMaskPostDepthCoverage, 1, pygen_variable_exts_SPV_KHR_post_depth_coverage, {}, 0xffffffffu}, + {"StencilRefReplacingEXT", 5027, 1, pygen_variable_caps_StencilExportEXT, 1, pygen_variable_exts_SPV_EXT_shader_stencil_export, {}, 0xffffffffu} +}; + +static const spv_operand_desc_t pygen_variable_StorageClassEntries[] = { + {"UniformConstant", 0, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Input", 1, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Uniform", 2, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Output", 3, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Workgroup", 4, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"CrossWorkgroup", 5, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Private", 6, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Function", 7, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Generic", 8, 1, pygen_variable_caps_GenericPointer, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"PushConstant", 9, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"AtomicCounter", 10, 1, pygen_variable_caps_AtomicStorage, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Image", 11, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"StorageBuffer", 12, 1, pygen_variable_caps_Shader, 2, pygen_variable_exts_SPV_KHR_storage_buffer_storage_classSPV_KHR_variable_pointers, {}, SPV_SPIRV_VERSION_WORD(1,3)} +}; + +static const spv_operand_desc_t pygen_variable_DimEntries[] = { + {"1D", 0, 1, pygen_variable_caps_Sampled1D, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"2D", 1, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"3D", 2, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Cube", 3, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Rect", 4, 1, pygen_variable_caps_SampledRect, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Buffer", 5, 1, pygen_variable_caps_SampledBuffer, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SubpassData", 6, 1, pygen_variable_caps_InputAttachment, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)} +}; + +static const spv_operand_desc_t pygen_variable_SamplerAddressingModeEntries[] = { + {"None", 0, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ClampToEdge", 1, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Clamp", 2, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Repeat", 3, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"RepeatMirrored", 4, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)} +}; + +static const spv_operand_desc_t pygen_variable_SamplerFilterModeEntries[] = { + {"Nearest", 0, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Linear", 1, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)} +}; + +static const spv_operand_desc_t pygen_variable_ImageFormatEntries[] = { + {"Unknown", 0, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Rgba32f", 1, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Rgba16f", 2, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"R32f", 3, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Rgba8", 4, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Rgba8Snorm", 5, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Rg32f", 6, 1, pygen_variable_caps_StorageImageExtendedFormats, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Rg16f", 7, 1, pygen_variable_caps_StorageImageExtendedFormats, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"R11fG11fB10f", 8, 1, pygen_variable_caps_StorageImageExtendedFormats, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"R16f", 9, 1, pygen_variable_caps_StorageImageExtendedFormats, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Rgba16", 10, 1, pygen_variable_caps_StorageImageExtendedFormats, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Rgb10A2", 11, 1, pygen_variable_caps_StorageImageExtendedFormats, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Rg16", 12, 1, pygen_variable_caps_StorageImageExtendedFormats, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Rg8", 13, 1, pygen_variable_caps_StorageImageExtendedFormats, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"R16", 14, 1, pygen_variable_caps_StorageImageExtendedFormats, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"R8", 15, 1, pygen_variable_caps_StorageImageExtendedFormats, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Rgba16Snorm", 16, 1, pygen_variable_caps_StorageImageExtendedFormats, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Rg16Snorm", 17, 1, pygen_variable_caps_StorageImageExtendedFormats, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Rg8Snorm", 18, 1, pygen_variable_caps_StorageImageExtendedFormats, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"R16Snorm", 19, 1, pygen_variable_caps_StorageImageExtendedFormats, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"R8Snorm", 20, 1, pygen_variable_caps_StorageImageExtendedFormats, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Rgba32i", 21, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Rgba16i", 22, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Rgba8i", 23, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"R32i", 24, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Rg32i", 25, 1, pygen_variable_caps_StorageImageExtendedFormats, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Rg16i", 26, 1, pygen_variable_caps_StorageImageExtendedFormats, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Rg8i", 27, 1, pygen_variable_caps_StorageImageExtendedFormats, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"R16i", 28, 1, pygen_variable_caps_StorageImageExtendedFormats, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"R8i", 29, 1, pygen_variable_caps_StorageImageExtendedFormats, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Rgba32ui", 30, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Rgba16ui", 31, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Rgba8ui", 32, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"R32ui", 33, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Rgb10a2ui", 34, 1, pygen_variable_caps_StorageImageExtendedFormats, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Rg32ui", 35, 1, pygen_variable_caps_StorageImageExtendedFormats, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Rg16ui", 36, 1, pygen_variable_caps_StorageImageExtendedFormats, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Rg8ui", 37, 1, pygen_variable_caps_StorageImageExtendedFormats, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"R16ui", 38, 1, pygen_variable_caps_StorageImageExtendedFormats, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"R8ui", 39, 1, pygen_variable_caps_StorageImageExtendedFormats, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)} +}; + +static const spv_operand_desc_t pygen_variable_ImageChannelOrderEntries[] = { + {"R", 0, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"A", 1, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"RG", 2, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"RA", 3, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"RGB", 4, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"RGBA", 5, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"BGRA", 6, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ARGB", 7, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Intensity", 8, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Luminance", 9, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Rx", 10, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"RGx", 11, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"RGBx", 12, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Depth", 13, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"DepthStencil", 14, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"sRGB", 15, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"sRGBx", 16, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"sRGBA", 17, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"sBGRA", 18, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ABGR", 19, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)} +}; + +static const spv_operand_desc_t pygen_variable_ImageChannelDataTypeEntries[] = { + {"SnormInt8", 0, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SnormInt16", 1, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"UnormInt8", 2, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"UnormInt16", 3, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"UnormShort565", 4, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"UnormShort555", 5, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"UnormInt101010", 6, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SignedInt8", 7, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SignedInt16", 8, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SignedInt32", 9, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"UnsignedInt8", 10, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"UnsignedInt16", 11, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"UnsignedInt32", 12, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"HalfFloat", 13, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Float", 14, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"UnormInt24", 15, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"UnormInt101010_2", 16, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)} +}; + +static const spv_operand_desc_t pygen_variable_FPRoundingModeEntries[] = { + {"RTE", 0, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"RTZ", 1, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"RTP", 2, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"RTN", 3, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)} +}; + +static const spv_operand_desc_t pygen_variable_LinkageTypeEntries[] = { + {"Export", 0, 1, pygen_variable_caps_Linkage, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Import", 1, 1, pygen_variable_caps_Linkage, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)} +}; + +static const spv_operand_desc_t pygen_variable_AccessQualifierEntries[] = { + {"ReadOnly", 0, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"WriteOnly", 1, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ReadWrite", 2, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)} +}; + +static const spv_operand_desc_t pygen_variable_FunctionParameterAttributeEntries[] = { + {"Zext", 0, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Sext", 1, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ByVal", 2, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Sret", 3, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"NoAlias", 4, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"NoCapture", 5, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"NoWrite", 6, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"NoReadWrite", 7, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)} +}; + +static const spv_operand_desc_t pygen_variable_DecorationEntries[] = { + {"RelaxedPrecision", 0, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SpecId", 1, 2, pygen_variable_caps_ShaderKernel, 0, nullptr, {SPV_OPERAND_TYPE_LITERAL_INTEGER}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Block", 2, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"BufferBlock", 3, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"RowMajor", 4, 1, pygen_variable_caps_Matrix, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ColMajor", 5, 1, pygen_variable_caps_Matrix, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ArrayStride", 6, 1, pygen_variable_caps_Shader, 0, nullptr, {SPV_OPERAND_TYPE_LITERAL_INTEGER}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"MatrixStride", 7, 1, pygen_variable_caps_Matrix, 0, nullptr, {SPV_OPERAND_TYPE_LITERAL_INTEGER}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"GLSLShared", 8, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"GLSLPacked", 9, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"CPacked", 10, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"BuiltIn", 11, 0, nullptr, 0, nullptr, {SPV_OPERAND_TYPE_BUILT_IN}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"NoPerspective", 13, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Flat", 14, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Patch", 15, 1, pygen_variable_caps_Tessellation, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Centroid", 16, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Sample", 17, 1, pygen_variable_caps_SampleRateShading, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Invariant", 18, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Restrict", 19, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Aliased", 20, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Volatile", 21, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Constant", 22, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Coherent", 23, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"NonWritable", 24, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"NonReadable", 25, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Uniform", 26, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SaturatedConversion", 28, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Stream", 29, 1, pygen_variable_caps_GeometryStreams, 0, nullptr, {SPV_OPERAND_TYPE_LITERAL_INTEGER}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Location", 30, 1, pygen_variable_caps_Shader, 0, nullptr, {SPV_OPERAND_TYPE_LITERAL_INTEGER}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Component", 31, 1, pygen_variable_caps_Shader, 0, nullptr, {SPV_OPERAND_TYPE_LITERAL_INTEGER}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Index", 32, 1, pygen_variable_caps_Shader, 0, nullptr, {SPV_OPERAND_TYPE_LITERAL_INTEGER}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Binding", 33, 1, pygen_variable_caps_Shader, 0, nullptr, {SPV_OPERAND_TYPE_LITERAL_INTEGER}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"DescriptorSet", 34, 1, pygen_variable_caps_Shader, 0, nullptr, {SPV_OPERAND_TYPE_LITERAL_INTEGER}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Offset", 35, 1, pygen_variable_caps_Shader, 0, nullptr, {SPV_OPERAND_TYPE_LITERAL_INTEGER}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"XfbBuffer", 36, 1, pygen_variable_caps_TransformFeedback, 0, nullptr, {SPV_OPERAND_TYPE_LITERAL_INTEGER}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"XfbStride", 37, 1, pygen_variable_caps_TransformFeedback, 0, nullptr, {SPV_OPERAND_TYPE_LITERAL_INTEGER}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"FuncParamAttr", 38, 1, pygen_variable_caps_Kernel, 0, nullptr, {SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"FPRoundingMode", 39, 0, nullptr, 0, nullptr, {SPV_OPERAND_TYPE_FP_ROUNDING_MODE}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"FPFastMathMode", 40, 1, pygen_variable_caps_Kernel, 0, nullptr, {SPV_OPERAND_TYPE_FP_FAST_MATH_MODE}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"LinkageAttributes", 41, 1, pygen_variable_caps_Linkage, 0, nullptr, {SPV_OPERAND_TYPE_LITERAL_STRING, SPV_OPERAND_TYPE_LINKAGE_TYPE}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"NoContraction", 42, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"InputAttachmentIndex", 43, 1, pygen_variable_caps_InputAttachment, 0, nullptr, {SPV_OPERAND_TYPE_LITERAL_INTEGER}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Alignment", 44, 1, pygen_variable_caps_Kernel, 0, nullptr, {SPV_OPERAND_TYPE_LITERAL_INTEGER}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"MaxByteOffset", 45, 1, pygen_variable_caps_Addresses, 0, nullptr, {SPV_OPERAND_TYPE_LITERAL_INTEGER}, SPV_SPIRV_VERSION_WORD(1,1)}, + {"AlignmentId", 46, 1, pygen_variable_caps_Kernel, 0, nullptr, {SPV_OPERAND_TYPE_ID}, SPV_SPIRV_VERSION_WORD(1,2)}, + {"MaxByteOffsetId", 47, 1, pygen_variable_caps_Addresses, 0, nullptr, {SPV_OPERAND_TYPE_ID}, SPV_SPIRV_VERSION_WORD(1,2)}, + {"ExplicitInterpAMD", 4999, 0, nullptr, 1, pygen_variable_exts_SPV_AMD_shader_explicit_vertex_parameter, {}, 0xffffffffu}, + {"OverrideCoverageNV", 5248, 1, pygen_variable_caps_SampleMaskOverrideCoverageNV, 1, pygen_variable_exts_SPV_NV_sample_mask_override_coverage, {}, 0xffffffffu}, + {"PassthroughNV", 5250, 1, pygen_variable_caps_GeometryShaderPassthroughNV, 1, pygen_variable_exts_SPV_NV_geometry_shader_passthrough, {}, 0xffffffffu}, + {"ViewportRelativeNV", 5252, 1, pygen_variable_caps_ShaderViewportMaskNV, 0, nullptr, {}, 0xffffffffu}, + {"SecondaryViewportRelativeNV", 5256, 1, pygen_variable_caps_ShaderStereoViewNV, 1, pygen_variable_exts_SPV_NV_stereo_view_rendering, {SPV_OPERAND_TYPE_LITERAL_INTEGER}, 0xffffffffu}, + {"NonUniformEXT", 5300, 1, pygen_variable_caps_ShaderNonUniformEXT, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"HlslCounterBufferGOOGLE", 5634, 0, nullptr, 1, pygen_variable_exts_SPV_GOOGLE_hlsl_functionality1, {SPV_OPERAND_TYPE_ID}, 0xffffffffu}, + {"HlslSemanticGOOGLE", 5635, 0, nullptr, 1, pygen_variable_exts_SPV_GOOGLE_hlsl_functionality1, {SPV_OPERAND_TYPE_LITERAL_STRING}, 0xffffffffu} +}; + +static const spv_operand_desc_t pygen_variable_BuiltInEntries[] = { + {"Position", 0, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"PointSize", 1, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ClipDistance", 3, 1, pygen_variable_caps_ClipDistance, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"CullDistance", 4, 1, pygen_variable_caps_CullDistance, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"VertexId", 5, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"InstanceId", 6, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"PrimitiveId", 7, 2, pygen_variable_caps_GeometryTessellation, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"InvocationId", 8, 2, pygen_variable_caps_GeometryTessellation, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Layer", 9, 1, pygen_variable_caps_Geometry, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ViewportIndex", 10, 1, pygen_variable_caps_MultiViewport, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"TessLevelOuter", 11, 1, pygen_variable_caps_Tessellation, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"TessLevelInner", 12, 1, pygen_variable_caps_Tessellation, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"TessCoord", 13, 1, pygen_variable_caps_Tessellation, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"PatchVertices", 14, 1, pygen_variable_caps_Tessellation, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"FragCoord", 15, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"PointCoord", 16, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"FrontFacing", 17, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SampleId", 18, 1, pygen_variable_caps_SampleRateShading, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SamplePosition", 19, 1, pygen_variable_caps_SampleRateShading, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SampleMask", 20, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"FragDepth", 22, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"HelperInvocation", 23, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"NumWorkgroups", 24, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"WorkgroupSize", 25, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"WorkgroupId", 26, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"LocalInvocationId", 27, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"GlobalInvocationId", 28, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"LocalInvocationIndex", 29, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"WorkDim", 30, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"GlobalSize", 31, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"EnqueuedWorkgroupSize", 32, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"GlobalOffset", 33, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"GlobalLinearId", 34, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SubgroupSize", 36, 3, pygen_variable_caps_KernelGroupNonUniformSubgroupBallotKHR, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SubgroupMaxSize", 37, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"NumSubgroups", 38, 2, pygen_variable_caps_KernelGroupNonUniform, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"NumEnqueuedSubgroups", 39, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SubgroupId", 40, 2, pygen_variable_caps_KernelGroupNonUniform, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SubgroupLocalInvocationId", 41, 3, pygen_variable_caps_KernelGroupNonUniformSubgroupBallotKHR, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"VertexIndex", 42, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"InstanceIndex", 43, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SubgroupEqMask", 4416, 2, pygen_variable_caps_SubgroupBallotKHRGroupNonUniformBallot, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1,3)}, + {"SubgroupEqMaskKHR", 4416, 2, pygen_variable_caps_SubgroupBallotKHRGroupNonUniformBallot, 1, pygen_variable_exts_SPV_KHR_shader_ballot, {}, SPV_SPIRV_VERSION_WORD(1,3)}, + {"SubgroupGeMask", 4417, 2, pygen_variable_caps_SubgroupBallotKHRGroupNonUniformBallot, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1,3)}, + {"SubgroupGeMaskKHR", 4417, 2, pygen_variable_caps_SubgroupBallotKHRGroupNonUniformBallot, 1, pygen_variable_exts_SPV_KHR_shader_ballot, {}, SPV_SPIRV_VERSION_WORD(1,3)}, + {"SubgroupGtMask", 4418, 2, pygen_variable_caps_SubgroupBallotKHRGroupNonUniformBallot, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1,3)}, + {"SubgroupGtMaskKHR", 4418, 2, pygen_variable_caps_SubgroupBallotKHRGroupNonUniformBallot, 1, pygen_variable_exts_SPV_KHR_shader_ballot, {}, SPV_SPIRV_VERSION_WORD(1,3)}, + {"SubgroupLeMask", 4419, 2, pygen_variable_caps_SubgroupBallotKHRGroupNonUniformBallot, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1,3)}, + {"SubgroupLeMaskKHR", 4419, 2, pygen_variable_caps_SubgroupBallotKHRGroupNonUniformBallot, 1, pygen_variable_exts_SPV_KHR_shader_ballot, {}, SPV_SPIRV_VERSION_WORD(1,3)}, + {"SubgroupLtMask", 4420, 2, pygen_variable_caps_SubgroupBallotKHRGroupNonUniformBallot, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1,3)}, + {"SubgroupLtMaskKHR", 4420, 2, pygen_variable_caps_SubgroupBallotKHRGroupNonUniformBallot, 1, pygen_variable_exts_SPV_KHR_shader_ballot, {}, SPV_SPIRV_VERSION_WORD(1,3)}, + {"BaseVertex", 4424, 1, pygen_variable_caps_DrawParameters, 1, pygen_variable_exts_SPV_KHR_shader_draw_parameters, {}, SPV_SPIRV_VERSION_WORD(1,3)}, + {"BaseInstance", 4425, 1, pygen_variable_caps_DrawParameters, 1, pygen_variable_exts_SPV_KHR_shader_draw_parameters, {}, SPV_SPIRV_VERSION_WORD(1,3)}, + {"DrawIndex", 4426, 1, pygen_variable_caps_DrawParameters, 1, pygen_variable_exts_SPV_KHR_shader_draw_parameters, {}, SPV_SPIRV_VERSION_WORD(1,3)}, + {"DeviceIndex", 4438, 1, pygen_variable_caps_DeviceGroup, 1, pygen_variable_exts_SPV_KHR_device_group, {}, SPV_SPIRV_VERSION_WORD(1,3)}, + {"ViewIndex", 4440, 1, pygen_variable_caps_MultiView, 1, pygen_variable_exts_SPV_KHR_multiview, {}, SPV_SPIRV_VERSION_WORD(1,3)}, + {"BaryCoordNoPerspAMD", 4992, 0, nullptr, 1, pygen_variable_exts_SPV_AMD_shader_explicit_vertex_parameter, {}, 0xffffffffu}, + {"BaryCoordNoPerspCentroidAMD", 4993, 0, nullptr, 1, pygen_variable_exts_SPV_AMD_shader_explicit_vertex_parameter, {}, 0xffffffffu}, + {"BaryCoordNoPerspSampleAMD", 4994, 0, nullptr, 1, pygen_variable_exts_SPV_AMD_shader_explicit_vertex_parameter, {}, 0xffffffffu}, + {"BaryCoordSmoothAMD", 4995, 0, nullptr, 1, pygen_variable_exts_SPV_AMD_shader_explicit_vertex_parameter, {}, 0xffffffffu}, + {"BaryCoordSmoothCentroidAMD", 4996, 0, nullptr, 1, pygen_variable_exts_SPV_AMD_shader_explicit_vertex_parameter, {}, 0xffffffffu}, + {"BaryCoordSmoothSampleAMD", 4997, 0, nullptr, 1, pygen_variable_exts_SPV_AMD_shader_explicit_vertex_parameter, {}, 0xffffffffu}, + {"BaryCoordPullModelAMD", 4998, 0, nullptr, 1, pygen_variable_exts_SPV_AMD_shader_explicit_vertex_parameter, {}, 0xffffffffu}, + {"FragStencilRefEXT", 5014, 1, pygen_variable_caps_StencilExportEXT, 1, pygen_variable_exts_SPV_EXT_shader_stencil_export, {}, 0xffffffffu}, + {"ViewportMaskNV", 5253, 1, pygen_variable_caps_ShaderViewportMaskNV, 0, nullptr, {}, 0xffffffffu}, + {"SecondaryPositionNV", 5257, 1, pygen_variable_caps_ShaderStereoViewNV, 1, pygen_variable_exts_SPV_NV_stereo_view_rendering, {}, 0xffffffffu}, + {"SecondaryViewportMaskNV", 5258, 1, pygen_variable_caps_ShaderStereoViewNV, 1, pygen_variable_exts_SPV_NV_stereo_view_rendering, {}, 0xffffffffu}, + {"PositionPerViewNV", 5261, 1, pygen_variable_caps_PerViewAttributesNV, 0, nullptr, {}, 0xffffffffu}, + {"ViewportMaskPerViewNV", 5262, 1, pygen_variable_caps_PerViewAttributesNV, 0, nullptr, {}, 0xffffffffu}, + {"FullyCoveredEXT", 5264, 1, pygen_variable_caps_FragmentFullyCoveredEXT, 1, pygen_variable_exts_SPV_EXT_fragment_fully_covered, {}, 0xffffffffu} +}; + +static const spv_operand_desc_t pygen_variable_ScopeEntries[] = { + {"CrossDevice", 0, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Device", 1, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Workgroup", 2, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Subgroup", 3, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Invocation", 4, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)} +}; + +static const spv_operand_desc_t pygen_variable_GroupOperationEntries[] = { + {"Reduce", 0, 3, pygen_variable_caps_KernelGroupNonUniformArithmeticGroupNonUniformBallot, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"InclusiveScan", 1, 3, pygen_variable_caps_KernelGroupNonUniformArithmeticGroupNonUniformBallot, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ExclusiveScan", 2, 3, pygen_variable_caps_KernelGroupNonUniformArithmeticGroupNonUniformBallot, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ClusteredReduce", 3, 1, pygen_variable_caps_GroupNonUniformClustered, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1,3)}, + {"PartitionedReduceNV", 6, 1, pygen_variable_caps_GroupNonUniformPartitionedNV, 1, pygen_variable_exts_SPV_NV_shader_subgroup_partitioned, {}, 0xffffffffu}, + {"PartitionedInclusiveScanNV", 7, 1, pygen_variable_caps_GroupNonUniformPartitionedNV, 1, pygen_variable_exts_SPV_NV_shader_subgroup_partitioned, {}, 0xffffffffu}, + {"PartitionedExclusiveScanNV", 8, 1, pygen_variable_caps_GroupNonUniformPartitionedNV, 1, pygen_variable_exts_SPV_NV_shader_subgroup_partitioned, {}, 0xffffffffu} +}; + +static const spv_operand_desc_t pygen_variable_KernelEnqueueFlagsEntries[] = { + {"NoWait", 0, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"WaitKernel", 1, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"WaitWorkGroup", 2, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)} +}; + +static const spv_operand_desc_t pygen_variable_CapabilityEntries[] = { + {"Matrix", 0, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Shader", 1, 1, pygen_variable_caps_Matrix, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Geometry", 2, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Tessellation", 3, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Addresses", 4, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Linkage", 5, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Kernel", 6, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Vector16", 7, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Float16Buffer", 8, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Float16", 9, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Float64", 10, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Int64", 11, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Int64Atomics", 12, 1, pygen_variable_caps_Int64, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ImageBasic", 13, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ImageReadWrite", 14, 1, pygen_variable_caps_ImageBasic, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ImageMipmap", 15, 1, pygen_variable_caps_ImageBasic, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Pipes", 17, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Groups", 18, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"DeviceEnqueue", 19, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"LiteralSampler", 20, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"AtomicStorage", 21, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Int16", 22, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"TessellationPointSize", 23, 1, pygen_variable_caps_Tessellation, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"GeometryPointSize", 24, 1, pygen_variable_caps_Geometry, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ImageGatherExtended", 25, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"StorageImageMultisample", 27, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"UniformBufferArrayDynamicIndexing", 28, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SampledImageArrayDynamicIndexing", 29, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"StorageBufferArrayDynamicIndexing", 30, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"StorageImageArrayDynamicIndexing", 31, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ClipDistance", 32, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"CullDistance", 33, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ImageCubeArray", 34, 1, pygen_variable_caps_SampledCubeArray, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SampleRateShading", 35, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ImageRect", 36, 1, pygen_variable_caps_SampledRect, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SampledRect", 37, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"GenericPointer", 38, 1, pygen_variable_caps_Addresses, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Int8", 39, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"InputAttachment", 40, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SparseResidency", 41, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"MinLod", 42, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Sampled1D", 43, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Image1D", 44, 1, pygen_variable_caps_Sampled1D, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SampledCubeArray", 45, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SampledBuffer", 46, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ImageBuffer", 47, 1, pygen_variable_caps_SampledBuffer, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ImageMSArray", 48, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"StorageImageExtendedFormats", 49, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ImageQuery", 50, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"DerivativeControl", 51, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"InterpolationFunction", 52, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"TransformFeedback", 53, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"GeometryStreams", 54, 1, pygen_variable_caps_Geometry, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"StorageImageReadWithoutFormat", 55, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"StorageImageWriteWithoutFormat", 56, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"MultiViewport", 57, 1, pygen_variable_caps_Geometry, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SubgroupDispatch", 58, 1, pygen_variable_caps_DeviceEnqueue, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1,1)}, + {"NamedBarrier", 59, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1,1)}, + {"PipeStorage", 60, 1, pygen_variable_caps_Pipes, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1,1)}, + {"GroupNonUniform", 61, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1,3)}, + {"GroupNonUniformVote", 62, 1, pygen_variable_caps_GroupNonUniform, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1,3)}, + {"GroupNonUniformArithmetic", 63, 1, pygen_variable_caps_GroupNonUniform, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1,3)}, + {"GroupNonUniformBallot", 64, 1, pygen_variable_caps_GroupNonUniform, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1,3)}, + {"GroupNonUniformShuffle", 65, 1, pygen_variable_caps_GroupNonUniform, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1,3)}, + {"GroupNonUniformShuffleRelative", 66, 1, pygen_variable_caps_GroupNonUniform, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1,3)}, + {"GroupNonUniformClustered", 67, 1, pygen_variable_caps_GroupNonUniform, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1,3)}, + {"GroupNonUniformQuad", 68, 1, pygen_variable_caps_GroupNonUniform, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1,3)}, + {"SubgroupBallotKHR", 4423, 0, nullptr, 1, pygen_variable_exts_SPV_KHR_shader_ballot, {}, 0xffffffffu}, + {"DrawParameters", 4427, 1, pygen_variable_caps_Shader, 1, pygen_variable_exts_SPV_KHR_shader_draw_parameters, {}, SPV_SPIRV_VERSION_WORD(1,3)}, + {"SubgroupVoteKHR", 4431, 0, nullptr, 1, pygen_variable_exts_SPV_KHR_subgroup_vote, {}, 0xffffffffu}, + {"StorageBuffer16BitAccess", 4433, 0, nullptr, 1, pygen_variable_exts_SPV_KHR_16bit_storage, {}, SPV_SPIRV_VERSION_WORD(1,3)}, + {"StorageUniformBufferBlock16", 4433, 0, nullptr, 1, pygen_variable_exts_SPV_KHR_16bit_storage, {}, SPV_SPIRV_VERSION_WORD(1,3)}, + {"StorageUniform16", 4434, 2, pygen_variable_caps_StorageBuffer16BitAccessStorageUniformBufferBlock16, 1, pygen_variable_exts_SPV_KHR_16bit_storage, {}, SPV_SPIRV_VERSION_WORD(1,3)}, + {"UniformAndStorageBuffer16BitAccess", 4434, 2, pygen_variable_caps_StorageBuffer16BitAccessStorageUniformBufferBlock16, 1, pygen_variable_exts_SPV_KHR_16bit_storage, {}, SPV_SPIRV_VERSION_WORD(1,3)}, + {"StoragePushConstant16", 4435, 0, nullptr, 1, pygen_variable_exts_SPV_KHR_16bit_storage, {}, SPV_SPIRV_VERSION_WORD(1,3)}, + {"StorageInputOutput16", 4436, 0, nullptr, 1, pygen_variable_exts_SPV_KHR_16bit_storage, {}, SPV_SPIRV_VERSION_WORD(1,3)}, + {"DeviceGroup", 4437, 0, nullptr, 1, pygen_variable_exts_SPV_KHR_device_group, {}, SPV_SPIRV_VERSION_WORD(1,3)}, + {"MultiView", 4439, 1, pygen_variable_caps_Shader, 1, pygen_variable_exts_SPV_KHR_multiview, {}, SPV_SPIRV_VERSION_WORD(1,3)}, + {"VariablePointersStorageBuffer", 4441, 1, pygen_variable_caps_Shader, 1, pygen_variable_exts_SPV_KHR_variable_pointers, {}, SPV_SPIRV_VERSION_WORD(1,3)}, + {"VariablePointers", 4442, 1, pygen_variable_caps_VariablePointersStorageBuffer, 1, pygen_variable_exts_SPV_KHR_variable_pointers, {}, SPV_SPIRV_VERSION_WORD(1,3)}, + {"AtomicStorageOps", 4445, 0, nullptr, 1, pygen_variable_exts_SPV_KHR_shader_atomic_counter_ops, {}, 0xffffffffu}, + {"SampleMaskPostDepthCoverage", 4447, 0, nullptr, 1, pygen_variable_exts_SPV_KHR_post_depth_coverage, {}, 0xffffffffu}, + {"StorageBuffer8BitAccess", 4448, 0, nullptr, 1, pygen_variable_exts_SPV_KHR_8bit_storage, {}, 0xffffffffu}, + {"UniformAndStorageBuffer8BitAccess", 4449, 1, pygen_variable_caps_StorageBuffer8BitAccess, 1, pygen_variable_exts_SPV_KHR_8bit_storage, {}, 0xffffffffu}, + {"StoragePushConstant8", 4450, 0, nullptr, 1, pygen_variable_exts_SPV_KHR_8bit_storage, {}, 0xffffffffu}, + {"Float16ImageAMD", 5008, 1, pygen_variable_caps_Shader, 1, pygen_variable_exts_SPV_AMD_gpu_shader_half_float_fetch, {}, 0xffffffffu}, + {"ImageGatherBiasLodAMD", 5009, 1, pygen_variable_caps_Shader, 1, pygen_variable_exts_SPV_AMD_texture_gather_bias_lod, {}, 0xffffffffu}, + {"FragmentMaskAMD", 5010, 1, pygen_variable_caps_Shader, 1, pygen_variable_exts_SPV_AMD_shader_fragment_mask, {}, 0xffffffffu}, + {"StencilExportEXT", 5013, 1, pygen_variable_caps_Shader, 1, pygen_variable_exts_SPV_EXT_shader_stencil_export, {}, 0xffffffffu}, + {"ImageReadWriteLodAMD", 5015, 1, pygen_variable_caps_Shader, 1, pygen_variable_exts_SPV_AMD_shader_image_load_store_lod, {}, 0xffffffffu}, + {"SampleMaskOverrideCoverageNV", 5249, 1, pygen_variable_caps_SampleRateShading, 1, pygen_variable_exts_SPV_NV_sample_mask_override_coverage, {}, 0xffffffffu}, + {"GeometryShaderPassthroughNV", 5251, 1, pygen_variable_caps_Geometry, 1, pygen_variable_exts_SPV_NV_geometry_shader_passthrough, {}, 0xffffffffu}, + {"ShaderViewportIndexLayerEXT", 5254, 1, pygen_variable_caps_MultiViewport, 1, pygen_variable_exts_SPV_EXT_shader_viewport_index_layer, {}, 0xffffffffu}, + {"ShaderViewportIndexLayerNV", 5254, 1, pygen_variable_caps_MultiViewport, 1, pygen_variable_exts_SPV_NV_viewport_array2, {}, 0xffffffffu}, + {"ShaderViewportMaskNV", 5255, 1, pygen_variable_caps_ShaderViewportIndexLayerNV, 1, pygen_variable_exts_SPV_NV_viewport_array2, {}, 0xffffffffu}, + {"ShaderStereoViewNV", 5259, 1, pygen_variable_caps_ShaderViewportMaskNV, 1, pygen_variable_exts_SPV_NV_stereo_view_rendering, {}, 0xffffffffu}, + {"PerViewAttributesNV", 5260, 1, pygen_variable_caps_MultiView, 1, pygen_variable_exts_SPV_NVX_multiview_per_view_attributes, {}, 0xffffffffu}, + {"FragmentFullyCoveredEXT", 5265, 1, pygen_variable_caps_Shader, 1, pygen_variable_exts_SPV_EXT_fragment_fully_covered, {}, 0xffffffffu}, + {"GroupNonUniformPartitionedNV", 5297, 0, nullptr, 1, pygen_variable_exts_SPV_NV_shader_subgroup_partitioned, {}, 0xffffffffu}, + {"ShaderNonUniformEXT", 5301, 1, pygen_variable_caps_Shader, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, 0xffffffffu}, + {"RuntimeDescriptorArrayEXT", 5302, 1, pygen_variable_caps_Shader, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, 0xffffffffu}, + {"InputAttachmentArrayDynamicIndexingEXT", 5303, 1, pygen_variable_caps_InputAttachment, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, 0xffffffffu}, + {"UniformTexelBufferArrayDynamicIndexingEXT", 5304, 1, pygen_variable_caps_SampledBuffer, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, 0xffffffffu}, + {"StorageTexelBufferArrayDynamicIndexingEXT", 5305, 1, pygen_variable_caps_ImageBuffer, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, 0xffffffffu}, + {"UniformBufferArrayNonUniformIndexingEXT", 5306, 1, pygen_variable_caps_ShaderNonUniformEXT, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, 0xffffffffu}, + {"SampledImageArrayNonUniformIndexingEXT", 5307, 1, pygen_variable_caps_ShaderNonUniformEXT, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, 0xffffffffu}, + {"StorageBufferArrayNonUniformIndexingEXT", 5308, 1, pygen_variable_caps_ShaderNonUniformEXT, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, 0xffffffffu}, + {"StorageImageArrayNonUniformIndexingEXT", 5309, 1, pygen_variable_caps_ShaderNonUniformEXT, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, 0xffffffffu}, + {"InputAttachmentArrayNonUniformIndexingEXT", 5310, 2, pygen_variable_caps_InputAttachmentShaderNonUniformEXT, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, 0xffffffffu}, + {"UniformTexelBufferArrayNonUniformIndexingEXT", 5311, 2, pygen_variable_caps_SampledBufferShaderNonUniformEXT, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, 0xffffffffu}, + {"StorageTexelBufferArrayNonUniformIndexingEXT", 5312, 2, pygen_variable_caps_ImageBufferShaderNonUniformEXT, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, 0xffffffffu}, + {"SubgroupShuffleINTEL", 5568, 0, nullptr, 1, pygen_variable_exts_SPV_INTEL_subgroups, {}, 0xffffffffu}, + {"SubgroupBufferBlockIOINTEL", 5569, 0, nullptr, 1, pygen_variable_exts_SPV_INTEL_subgroups, {}, 0xffffffffu}, + {"SubgroupImageBlockIOINTEL", 5570, 0, nullptr, 1, pygen_variable_exts_SPV_INTEL_subgroups, {}, 0xffffffffu} +}; + +static const spv_operand_desc_t pygen_variable_DebugInfoFlagsEntries[] = { + {"FlagIsProtected", 0x01, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"FlagIsPrivate", 0x02, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"FlagIsPublic", 0x03, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"FlagIsLocal", 0x04, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"FlagIsDefinition", 0x08, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"FlagFwdDecl", 0x10, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"FlagArtificial", 0x20, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"FlagExplicit", 0x40, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"FlagPrototyped", 0x80, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"FlagObjectPointer", 0x100, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"FlagStaticMember", 0x200, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"FlagIndirectVariable", 0x400, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"FlagLValueReference", 0x800, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"FlagRValueReference", 0x1000, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"FlagIsOptimized", 0x2000, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)} +}; + +static const spv_operand_desc_t pygen_variable_DebugBaseTypeAttributeEncodingEntries[] = { + {"Unspecified", 0, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Address", 1, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Boolean", 2, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Float", 4, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Signed", 5, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"SignedChar", 6, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Unsigned", 7, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"UnsignedChar", 8, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)} +}; + +static const spv_operand_desc_t pygen_variable_DebugCompositeTypeEntries[] = { + {"Class", 0, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Structure", 1, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Union", 2, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)} +}; + +static const spv_operand_desc_t pygen_variable_DebugTypeQualifierEntries[] = { + {"ConstType", 0, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"VolatileType", 1, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"RestrictType", 2, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)} +}; + +static const spv_operand_desc_t pygen_variable_DebugOperationEntries[] = { + {"Deref", 0, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Plus", 1, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Minus", 2, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"PlusUconst", 3, 0, nullptr, 0, nullptr, {SPV_OPERAND_TYPE_LITERAL_INTEGER}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"BitPiece", 4, 0, nullptr, 0, nullptr, {SPV_OPERAND_TYPE_LITERAL_INTEGER, SPV_OPERAND_TYPE_LITERAL_INTEGER}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Swap", 5, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Xderef", 6, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"StackValue", 7, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Constu", 8, 0, nullptr, 0, nullptr, {SPV_OPERAND_TYPE_LITERAL_INTEGER}, SPV_SPIRV_VERSION_WORD(1, 0)} +}; + +static const spv_operand_desc_group_t pygen_variable_OperandInfoTable[] = { + {SPV_OPERAND_TYPE_IMAGE, ARRAY_SIZE(pygen_variable_ImageOperandsEntries), pygen_variable_ImageOperandsEntries}, + {SPV_OPERAND_TYPE_FP_FAST_MATH_MODE, ARRAY_SIZE(pygen_variable_FPFastMathModeEntries), pygen_variable_FPFastMathModeEntries}, + {SPV_OPERAND_TYPE_SELECTION_CONTROL, ARRAY_SIZE(pygen_variable_SelectionControlEntries), pygen_variable_SelectionControlEntries}, + {SPV_OPERAND_TYPE_LOOP_CONTROL, ARRAY_SIZE(pygen_variable_LoopControlEntries), pygen_variable_LoopControlEntries}, + {SPV_OPERAND_TYPE_FUNCTION_CONTROL, ARRAY_SIZE(pygen_variable_FunctionControlEntries), pygen_variable_FunctionControlEntries}, + {SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID, ARRAY_SIZE(pygen_variable_MemorySemanticsEntries), pygen_variable_MemorySemanticsEntries}, + {SPV_OPERAND_TYPE_MEMORY_ACCESS, ARRAY_SIZE(pygen_variable_MemoryAccessEntries), pygen_variable_MemoryAccessEntries}, + {SPV_OPERAND_TYPE_KERNEL_PROFILING_INFO, ARRAY_SIZE(pygen_variable_KernelProfilingInfoEntries), pygen_variable_KernelProfilingInfoEntries}, + {SPV_OPERAND_TYPE_SOURCE_LANGUAGE, ARRAY_SIZE(pygen_variable_SourceLanguageEntries), pygen_variable_SourceLanguageEntries}, + {SPV_OPERAND_TYPE_EXECUTION_MODEL, ARRAY_SIZE(pygen_variable_ExecutionModelEntries), pygen_variable_ExecutionModelEntries}, + {SPV_OPERAND_TYPE_ADDRESSING_MODEL, ARRAY_SIZE(pygen_variable_AddressingModelEntries), pygen_variable_AddressingModelEntries}, + {SPV_OPERAND_TYPE_MEMORY_MODEL, ARRAY_SIZE(pygen_variable_MemoryModelEntries), pygen_variable_MemoryModelEntries}, + {SPV_OPERAND_TYPE_EXECUTION_MODE, ARRAY_SIZE(pygen_variable_ExecutionModeEntries), pygen_variable_ExecutionModeEntries}, + {SPV_OPERAND_TYPE_STORAGE_CLASS, ARRAY_SIZE(pygen_variable_StorageClassEntries), pygen_variable_StorageClassEntries}, + {SPV_OPERAND_TYPE_DIMENSIONALITY, ARRAY_SIZE(pygen_variable_DimEntries), pygen_variable_DimEntries}, + {SPV_OPERAND_TYPE_SAMPLER_ADDRESSING_MODE, ARRAY_SIZE(pygen_variable_SamplerAddressingModeEntries), pygen_variable_SamplerAddressingModeEntries}, + {SPV_OPERAND_TYPE_SAMPLER_FILTER_MODE, ARRAY_SIZE(pygen_variable_SamplerFilterModeEntries), pygen_variable_SamplerFilterModeEntries}, + {SPV_OPERAND_TYPE_SAMPLER_IMAGE_FORMAT, ARRAY_SIZE(pygen_variable_ImageFormatEntries), pygen_variable_ImageFormatEntries}, + {SPV_OPERAND_TYPE_IMAGE_CHANNEL_ORDER, ARRAY_SIZE(pygen_variable_ImageChannelOrderEntries), pygen_variable_ImageChannelOrderEntries}, + {SPV_OPERAND_TYPE_IMAGE_CHANNEL_DATA_TYPE, ARRAY_SIZE(pygen_variable_ImageChannelDataTypeEntries), pygen_variable_ImageChannelDataTypeEntries}, + {SPV_OPERAND_TYPE_FP_ROUNDING_MODE, ARRAY_SIZE(pygen_variable_FPRoundingModeEntries), pygen_variable_FPRoundingModeEntries}, + {SPV_OPERAND_TYPE_LINKAGE_TYPE, ARRAY_SIZE(pygen_variable_LinkageTypeEntries), pygen_variable_LinkageTypeEntries}, + {SPV_OPERAND_TYPE_ACCESS_QUALIFIER, ARRAY_SIZE(pygen_variable_AccessQualifierEntries), pygen_variable_AccessQualifierEntries}, + {SPV_OPERAND_TYPE_FUNCTION_PARAMETER_ATTRIBUTE, ARRAY_SIZE(pygen_variable_FunctionParameterAttributeEntries), pygen_variable_FunctionParameterAttributeEntries}, + {SPV_OPERAND_TYPE_DECORATION, ARRAY_SIZE(pygen_variable_DecorationEntries), pygen_variable_DecorationEntries}, + {SPV_OPERAND_TYPE_BUILT_IN, ARRAY_SIZE(pygen_variable_BuiltInEntries), pygen_variable_BuiltInEntries}, + {SPV_OPERAND_TYPE_SCOPE_ID, ARRAY_SIZE(pygen_variable_ScopeEntries), pygen_variable_ScopeEntries}, + {SPV_OPERAND_TYPE_GROUP_OPERATION, ARRAY_SIZE(pygen_variable_GroupOperationEntries), pygen_variable_GroupOperationEntries}, + {SPV_OPERAND_TYPE_KERNEL_ENQ_FLAGS, ARRAY_SIZE(pygen_variable_KernelEnqueueFlagsEntries), pygen_variable_KernelEnqueueFlagsEntries}, + {SPV_OPERAND_TYPE_CAPABILITY, ARRAY_SIZE(pygen_variable_CapabilityEntries), pygen_variable_CapabilityEntries}, + {SPV_OPERAND_TYPE_DEBUG_INFO_FLAGS, ARRAY_SIZE(pygen_variable_DebugInfoFlagsEntries), pygen_variable_DebugInfoFlagsEntries}, + {SPV_OPERAND_TYPE_DEBUG_BASE_TYPE_ATTRIBUTE_ENCODING, ARRAY_SIZE(pygen_variable_DebugBaseTypeAttributeEncodingEntries), pygen_variable_DebugBaseTypeAttributeEncodingEntries}, + {SPV_OPERAND_TYPE_DEBUG_COMPOSITE_TYPE, ARRAY_SIZE(pygen_variable_DebugCompositeTypeEntries), pygen_variable_DebugCompositeTypeEntries}, + {SPV_OPERAND_TYPE_DEBUG_TYPE_QUALIFIER, ARRAY_SIZE(pygen_variable_DebugTypeQualifierEntries), pygen_variable_DebugTypeQualifierEntries}, + {SPV_OPERAND_TYPE_DEBUG_OPERATION, ARRAY_SIZE(pygen_variable_DebugOperationEntries), pygen_variable_DebugOperationEntries}, + {SPV_OPERAND_TYPE_OPTIONAL_IMAGE, ARRAY_SIZE(pygen_variable_ImageOperandsEntries), pygen_variable_ImageOperandsEntries}, + {SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS, ARRAY_SIZE(pygen_variable_MemoryAccessEntries), pygen_variable_MemoryAccessEntries}, + {SPV_OPERAND_TYPE_OPTIONAL_ACCESS_QUALIFIER, ARRAY_SIZE(pygen_variable_AccessQualifierEntries), pygen_variable_AccessQualifierEntries} +}; diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/CMakeDirectoryInformation.cmake b/3rdparty/spirv-tools/build/source/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 000000000..b636c3f88 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/bkaradzic/Private/projects/_github/SPIRV-Tools") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/DependInfo.cmake b/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/DependInfo.cmake new file mode 100644 index 000000000..2f7cbc19a --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/DependInfo.cmake @@ -0,0 +1,103 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + "CXX" + ) +# The set of files for implicit dependencies of each language: +set(CMAKE_DEPENDS_CHECK_CXX + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/assembly_grammar.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/assembly_grammar.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/binary.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/binary.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/diagnostic.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/diagnostic.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/disassemble.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/disassemble.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/enum_string_mapping.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/enum_string_mapping.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/ext_inst.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/ext_inst.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/extensions.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/extensions.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/id_descriptor.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/id_descriptor.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/libspirv.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/libspirv.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/name_mapper.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/name_mapper.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opcode.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/opcode.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/operand.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/operand.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/parsed_operand.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/parsed_operand.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/print.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/print.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/software_version.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/software_version.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spirv_endian.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_endian.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spirv_optimizer_options.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_optimizer_options.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spirv_target_env.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_target_env.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spirv_validator_options.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_validator_options.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/table.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/table.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/text.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/text.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/text_handler.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/text_handler.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/util/bit_vector.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/util/bit_vector.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/util/parse_number.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/util/parse_number.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/util/string_utils.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/util/string_utils.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/util/timer.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/util/timer.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/basic_block.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/val/basic_block.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/construct.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/val/construct.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/function.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/val/function.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/instruction.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/val/instruction.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_adjacency.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_adjacency.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_annotation.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_annotation.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_arithmetics.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_arithmetics.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_atomics.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_atomics.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_barriers.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_barriers.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_bitwise.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_bitwise.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_builtins.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_builtins.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_capability.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_capability.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_cfg.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_cfg.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_composites.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_composites.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_constants.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_constants.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_conversion.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_conversion.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_datarules.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_datarules.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_debug.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_debug.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_decorations.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_decorations.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_derivatives.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_derivatives.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_execution_limitations.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_execution_limitations.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_ext_inst.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_ext_inst.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_function.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_function.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_id.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_id.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_image.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_image.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_instruction.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_instruction.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_interfaces.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_interfaces.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_layout.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_layout.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_literals.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_literals.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_logicals.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_logicals.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_memory.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_memory.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_mode_setting.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_mode_setting.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_non_uniform.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_non_uniform.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_primitives.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_primitives.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_type.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_type.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validation_state.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/val/validation_state.cpp.o" + ) +set(CMAKE_CXX_COMPILER_ID "GNU") + +# Preprocessor definitions for this target. +set(CMAKE_TARGET_DEFINITIONS_CXX + "SPIRV_CHECK_CONTEXT" + "SPIRV_COLOR_TERMINAL" + "SPIRV_LINUX" + "SPIRV_TIMER_ENABLED" + "SPIRV_TOOLS_IMPLEMENTATION" + "SPIRV_TOOLS_SHAREDLIB" + ) + +# The include file search paths: +set(CMAKE_CXX_TARGET_INCLUDE_PATH + "../" + "../include" + "." + "../external/SPIRV-Headers/include" + ) + +# Pairs of files generated by the same build rule. +set(CMAKE_MULTIPLE_OUTPUT_PAIRS + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/enum_string_mapping.inc" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/extension_enum.inc" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/operand.kinds-unified1.inc" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/core.insts-unified1.inc" + ) + + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/build.make b/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/build.make new file mode 100644 index 000000000..a57a3fee7 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/build.make @@ -0,0 +1,1883 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + +# Include any dependencies generated for this target. +include source/CMakeFiles/SPIRV-Tools-shared.dir/depend.make + +# Include the progress variables for this target. +include source/CMakeFiles/SPIRV-Tools-shared.dir/progress.make + +# Include the compile flags for this target's objects. +include source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make + +extension_enum.inc: ../utils/generate_grammar_tables.py +extension_enum.inc: ../external/SPIRV-Headers/include/spirv/unified1/spirv.core.grammar.json +extension_enum.inc: ../source/extinst.debuginfo.grammar.json + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --blue --bold --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Generate enum-string mapping for SPIR-V vunified1." + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/python /home/bkaradzic/Private/projects/_github/SPIRV-Tools/utils/generate_grammar_tables.py --spirv-core-grammar=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/external/SPIRV-Headers/include/spirv/unified1/spirv.core.grammar.json --extinst-debuginfo-grammar=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/extinst.debuginfo.grammar.json --extension-enum-output=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/extension_enum.inc --enum-string-mapping-output=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/enum_string_mapping.inc + +enum_string_mapping.inc: extension_enum.inc + @$(CMAKE_COMMAND) -E touch_nocreate enum_string_mapping.inc + +opencl.std.insts.inc: ../utils/generate_grammar_tables.py +opencl.std.insts.inc: ../external/SPIRV-Headers/include/spirv/unified1/spirv.core.grammar.json +opencl.std.insts.inc: ../external/SPIRV-Headers/include/spirv/unified1/extinst.opencl.std.100.grammar.json + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --blue --bold --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Generate info tables for OpenCL extended instructions and operands vunified1." + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/python /home/bkaradzic/Private/projects/_github/SPIRV-Tools/utils/generate_grammar_tables.py --extinst-opencl-grammar=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/external/SPIRV-Headers/include/spirv/unified1/extinst.opencl.std.100.grammar.json --opencl-insts-output=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/opencl.std.insts.inc + +glsl.std.450.insts.inc: ../utils/generate_grammar_tables.py +glsl.std.450.insts.inc: ../external/SPIRV-Headers/include/spirv/unified1/spirv.core.grammar.json +glsl.std.450.insts.inc: ../external/SPIRV-Headers/include/spirv/unified1/extinst.glsl.std.450.grammar.json + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --blue --bold --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_3) "Generate info tables for GLSL extended instructions and operands vunified1." + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/python /home/bkaradzic/Private/projects/_github/SPIRV-Tools/utils/generate_grammar_tables.py --extinst-glsl-grammar=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/external/SPIRV-Headers/include/spirv/unified1/extinst.glsl.std.450.grammar.json --glsl-insts-output=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/glsl.std.450.insts.inc + +spv-amd-shader-explicit-vertex-parameter.insts.inc: ../utils/generate_grammar_tables.py +spv-amd-shader-explicit-vertex-parameter.insts.inc: ../source/extinst.spv-amd-shader-explicit-vertex-parameter.grammar.json + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --blue --bold --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_4) "Generate extended instruction tables for spv-amd-shader-explicit-vertex-parameter." + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/python /home/bkaradzic/Private/projects/_github/SPIRV-Tools/utils/generate_grammar_tables.py --extinst-vendor-grammar=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/extinst.spv-amd-shader-explicit-vertex-parameter.grammar.json --vendor-insts-output=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/spv-amd-shader-explicit-vertex-parameter.insts.inc + +spv-amd-shader-trinary-minmax.insts.inc: ../utils/generate_grammar_tables.py +spv-amd-shader-trinary-minmax.insts.inc: ../source/extinst.spv-amd-shader-trinary-minmax.grammar.json + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --blue --bold --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_5) "Generate extended instruction tables for spv-amd-shader-trinary-minmax." + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/python /home/bkaradzic/Private/projects/_github/SPIRV-Tools/utils/generate_grammar_tables.py --extinst-vendor-grammar=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/extinst.spv-amd-shader-trinary-minmax.grammar.json --vendor-insts-output=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/spv-amd-shader-trinary-minmax.insts.inc + +spv-amd-gcn-shader.insts.inc: ../utils/generate_grammar_tables.py +spv-amd-gcn-shader.insts.inc: ../source/extinst.spv-amd-gcn-shader.grammar.json + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --blue --bold --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_6) "Generate extended instruction tables for spv-amd-gcn-shader." + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/python /home/bkaradzic/Private/projects/_github/SPIRV-Tools/utils/generate_grammar_tables.py --extinst-vendor-grammar=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/extinst.spv-amd-gcn-shader.grammar.json --vendor-insts-output=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/spv-amd-gcn-shader.insts.inc + +spv-amd-shader-ballot.insts.inc: ../utils/generate_grammar_tables.py +spv-amd-shader-ballot.insts.inc: ../source/extinst.spv-amd-shader-ballot.grammar.json + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --blue --bold --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_7) "Generate extended instruction tables for spv-amd-shader-ballot." + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/python /home/bkaradzic/Private/projects/_github/SPIRV-Tools/utils/generate_grammar_tables.py --extinst-vendor-grammar=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/extinst.spv-amd-shader-ballot.grammar.json --vendor-insts-output=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/spv-amd-shader-ballot.insts.inc + +debuginfo.insts.inc: ../utils/generate_grammar_tables.py +debuginfo.insts.inc: ../source/extinst.debuginfo.grammar.json + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --blue --bold --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_8) "Generate extended instruction tables for debuginfo." + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/python /home/bkaradzic/Private/projects/_github/SPIRV-Tools/utils/generate_grammar_tables.py --extinst-vendor-grammar=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/extinst.debuginfo.grammar.json --vendor-insts-output=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/debuginfo.insts.inc + +DebugInfo.h: ../utils/generate_language_headers.py +DebugInfo.h: ../source/extinst.debuginfo.grammar.json + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --blue --bold --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_9) "Generate language specific header for DebugInfo." + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/python /home/bkaradzic/Private/projects/_github/SPIRV-Tools/utils/generate_language_headers.py --extinst-name=DebugInfo --extinst-grammar=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/extinst.debuginfo.grammar.json --extinst-output-base=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/DebugInfo + +core.insts-unified1.inc: ../utils/generate_grammar_tables.py +core.insts-unified1.inc: ../external/SPIRV-Headers/include/spirv/unified1/spirv.core.grammar.json +core.insts-unified1.inc: ../source/extinst.debuginfo.grammar.json + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --blue --bold --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_10) "Generate info tables for SPIR-V vunified1 core instructions and operands." + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/python /home/bkaradzic/Private/projects/_github/SPIRV-Tools/utils/generate_grammar_tables.py --spirv-core-grammar=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/external/SPIRV-Headers/include/spirv/unified1/spirv.core.grammar.json --extinst-debuginfo-grammar=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/extinst.debuginfo.grammar.json --core-insts-output=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/core.insts-unified1.inc --operand-kinds-output=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/operand.kinds-unified1.inc + +operand.kinds-unified1.inc: core.insts-unified1.inc + @$(CMAKE_COMMAND) -E touch_nocreate operand.kinds-unified1.inc + +generators.inc: ../utils/generate_registry_tables.py +generators.inc: ../external/SPIRV-Headers/include/spirv/spir-v.xml + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --blue --bold --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_11) "Generate tables based on the SPIR-V XML registry." + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/python /home/bkaradzic/Private/projects/_github/SPIRV-Tools/utils/generate_registry_tables.py --xml=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/external/SPIRV-Headers/include/spirv/spir-v.xml --generator-output=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/generators.inc + +build-version.inc: ../utils/update_build_version.py +build-version.inc: ../CHANGES + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --blue --bold --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_12) "Update build-version.inc in the SPIRV-Tools build directory (if necessary)." + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/python /home/bkaradzic/Private/projects/_github/SPIRV-Tools/utils/update_build_version.py /home/bkaradzic/Private/projects/_github/SPIRV-Tools /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/build-version.inc + +source/CMakeFiles/SPIRV-Tools-shared.dir/util/bit_vector.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/util/bit_vector.cpp.o: ../source/util/bit_vector.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_13) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/util/bit_vector.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/util/bit_vector.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/util/bit_vector.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/util/bit_vector.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/util/bit_vector.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/util/bit_vector.cpp > CMakeFiles/SPIRV-Tools-shared.dir/util/bit_vector.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/util/bit_vector.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/util/bit_vector.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/util/bit_vector.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/util/bit_vector.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/util/bit_vector.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/util/bit_vector.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/util/bit_vector.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/util/bit_vector.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/util/bit_vector.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/util/bit_vector.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/util/bit_vector.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/util/bit_vector.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/util/parse_number.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/util/parse_number.cpp.o: ../source/util/parse_number.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_14) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/util/parse_number.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/util/parse_number.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/util/parse_number.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/util/parse_number.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/util/parse_number.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/util/parse_number.cpp > CMakeFiles/SPIRV-Tools-shared.dir/util/parse_number.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/util/parse_number.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/util/parse_number.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/util/parse_number.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/util/parse_number.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/util/parse_number.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/util/parse_number.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/util/parse_number.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/util/parse_number.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/util/parse_number.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/util/parse_number.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/util/parse_number.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/util/parse_number.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/util/string_utils.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/util/string_utils.cpp.o: ../source/util/string_utils.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_15) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/util/string_utils.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/util/string_utils.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/util/string_utils.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/util/string_utils.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/util/string_utils.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/util/string_utils.cpp > CMakeFiles/SPIRV-Tools-shared.dir/util/string_utils.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/util/string_utils.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/util/string_utils.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/util/string_utils.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/util/string_utils.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/util/string_utils.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/util/string_utils.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/util/string_utils.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/util/string_utils.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/util/string_utils.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/util/string_utils.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/util/string_utils.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/util/string_utils.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/assembly_grammar.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/assembly_grammar.cpp.o: ../source/assembly_grammar.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_16) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/assembly_grammar.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/assembly_grammar.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/assembly_grammar.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/assembly_grammar.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/assembly_grammar.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/assembly_grammar.cpp > CMakeFiles/SPIRV-Tools-shared.dir/assembly_grammar.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/assembly_grammar.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/assembly_grammar.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/assembly_grammar.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/assembly_grammar.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/assembly_grammar.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/assembly_grammar.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/assembly_grammar.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/assembly_grammar.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/assembly_grammar.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/assembly_grammar.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/assembly_grammar.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/assembly_grammar.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/binary.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/binary.cpp.o: ../source/binary.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_17) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/binary.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/binary.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/binary.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/binary.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/binary.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/binary.cpp > CMakeFiles/SPIRV-Tools-shared.dir/binary.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/binary.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/binary.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/binary.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/binary.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/binary.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/binary.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/binary.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/binary.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/binary.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/binary.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/binary.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/binary.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/diagnostic.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/diagnostic.cpp.o: ../source/diagnostic.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_18) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/diagnostic.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/diagnostic.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/diagnostic.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/diagnostic.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/diagnostic.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/diagnostic.cpp > CMakeFiles/SPIRV-Tools-shared.dir/diagnostic.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/diagnostic.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/diagnostic.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/diagnostic.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/diagnostic.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/diagnostic.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/diagnostic.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/diagnostic.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/diagnostic.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/diagnostic.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/diagnostic.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/diagnostic.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/diagnostic.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/disassemble.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/disassemble.cpp.o: ../source/disassemble.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_19) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/disassemble.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/disassemble.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/disassemble.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/disassemble.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/disassemble.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/disassemble.cpp > CMakeFiles/SPIRV-Tools-shared.dir/disassemble.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/disassemble.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/disassemble.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/disassemble.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/disassemble.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/disassemble.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/disassemble.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/disassemble.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/disassemble.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/disassemble.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/disassemble.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/disassemble.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/disassemble.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/enum_string_mapping.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/enum_string_mapping.cpp.o: ../source/enum_string_mapping.cpp +source/CMakeFiles/SPIRV-Tools-shared.dir/enum_string_mapping.cpp.o: enum_string_mapping.inc + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_20) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/enum_string_mapping.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/enum_string_mapping.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/enum_string_mapping.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/enum_string_mapping.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/enum_string_mapping.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/enum_string_mapping.cpp > CMakeFiles/SPIRV-Tools-shared.dir/enum_string_mapping.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/enum_string_mapping.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/enum_string_mapping.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/enum_string_mapping.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/enum_string_mapping.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/enum_string_mapping.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/enum_string_mapping.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/enum_string_mapping.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/enum_string_mapping.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/enum_string_mapping.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/enum_string_mapping.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/enum_string_mapping.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/enum_string_mapping.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/ext_inst.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/ext_inst.cpp.o: ../source/ext_inst.cpp +source/CMakeFiles/SPIRV-Tools-shared.dir/ext_inst.cpp.o: opencl.std.insts.inc +source/CMakeFiles/SPIRV-Tools-shared.dir/ext_inst.cpp.o: glsl.std.450.insts.inc +source/CMakeFiles/SPIRV-Tools-shared.dir/ext_inst.cpp.o: spv-amd-shader-explicit-vertex-parameter.insts.inc +source/CMakeFiles/SPIRV-Tools-shared.dir/ext_inst.cpp.o: spv-amd-shader-trinary-minmax.insts.inc +source/CMakeFiles/SPIRV-Tools-shared.dir/ext_inst.cpp.o: spv-amd-gcn-shader.insts.inc +source/CMakeFiles/SPIRV-Tools-shared.dir/ext_inst.cpp.o: spv-amd-shader-ballot.insts.inc +source/CMakeFiles/SPIRV-Tools-shared.dir/ext_inst.cpp.o: debuginfo.insts.inc +source/CMakeFiles/SPIRV-Tools-shared.dir/ext_inst.cpp.o: DebugInfo.h + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_21) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/ext_inst.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/ext_inst.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/ext_inst.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/ext_inst.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/ext_inst.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/ext_inst.cpp > CMakeFiles/SPIRV-Tools-shared.dir/ext_inst.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/ext_inst.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/ext_inst.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/ext_inst.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/ext_inst.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/ext_inst.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/ext_inst.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/ext_inst.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/ext_inst.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/ext_inst.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/ext_inst.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/ext_inst.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/ext_inst.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/extensions.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/extensions.cpp.o: ../source/extensions.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_22) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/extensions.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/extensions.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/extensions.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/extensions.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/extensions.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/extensions.cpp > CMakeFiles/SPIRV-Tools-shared.dir/extensions.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/extensions.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/extensions.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/extensions.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/extensions.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/extensions.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/extensions.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/extensions.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/extensions.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/extensions.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/extensions.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/extensions.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/extensions.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/id_descriptor.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/id_descriptor.cpp.o: ../source/id_descriptor.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_23) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/id_descriptor.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/id_descriptor.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/id_descriptor.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/id_descriptor.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/id_descriptor.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/id_descriptor.cpp > CMakeFiles/SPIRV-Tools-shared.dir/id_descriptor.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/id_descriptor.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/id_descriptor.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/id_descriptor.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/id_descriptor.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/id_descriptor.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/id_descriptor.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/id_descriptor.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/id_descriptor.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/id_descriptor.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/id_descriptor.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/id_descriptor.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/id_descriptor.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/libspirv.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/libspirv.cpp.o: ../source/libspirv.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_24) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/libspirv.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/libspirv.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/libspirv.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/libspirv.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/libspirv.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/libspirv.cpp > CMakeFiles/SPIRV-Tools-shared.dir/libspirv.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/libspirv.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/libspirv.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/libspirv.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/libspirv.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/libspirv.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/libspirv.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/libspirv.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/libspirv.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/libspirv.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/libspirv.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/libspirv.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/libspirv.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/name_mapper.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/name_mapper.cpp.o: ../source/name_mapper.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_25) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/name_mapper.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/name_mapper.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/name_mapper.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/name_mapper.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/name_mapper.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/name_mapper.cpp > CMakeFiles/SPIRV-Tools-shared.dir/name_mapper.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/name_mapper.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/name_mapper.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/name_mapper.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/name_mapper.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/name_mapper.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/name_mapper.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/name_mapper.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/name_mapper.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/name_mapper.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/name_mapper.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/name_mapper.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/name_mapper.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/opcode.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/opcode.cpp.o: ../source/opcode.cpp +source/CMakeFiles/SPIRV-Tools-shared.dir/opcode.cpp.o: core.insts-unified1.inc +source/CMakeFiles/SPIRV-Tools-shared.dir/opcode.cpp.o: generators.inc + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_26) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/opcode.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/opcode.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opcode.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/opcode.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/opcode.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opcode.cpp > CMakeFiles/SPIRV-Tools-shared.dir/opcode.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/opcode.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/opcode.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opcode.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/opcode.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/opcode.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/opcode.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/opcode.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/opcode.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/opcode.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/opcode.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/opcode.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/opcode.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/operand.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/operand.cpp.o: ../source/operand.cpp +source/CMakeFiles/SPIRV-Tools-shared.dir/operand.cpp.o: operand.kinds-unified1.inc + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_27) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/operand.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/operand.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/operand.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/operand.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/operand.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/operand.cpp > CMakeFiles/SPIRV-Tools-shared.dir/operand.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/operand.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/operand.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/operand.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/operand.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/operand.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/operand.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/operand.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/operand.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/operand.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/operand.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/operand.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/operand.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/parsed_operand.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/parsed_operand.cpp.o: ../source/parsed_operand.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_28) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/parsed_operand.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/parsed_operand.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/parsed_operand.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/parsed_operand.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/parsed_operand.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/parsed_operand.cpp > CMakeFiles/SPIRV-Tools-shared.dir/parsed_operand.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/parsed_operand.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/parsed_operand.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/parsed_operand.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/parsed_operand.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/parsed_operand.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/parsed_operand.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/parsed_operand.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/parsed_operand.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/parsed_operand.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/parsed_operand.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/parsed_operand.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/parsed_operand.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/print.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/print.cpp.o: ../source/print.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_29) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/print.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/print.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/print.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/print.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/print.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/print.cpp > CMakeFiles/SPIRV-Tools-shared.dir/print.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/print.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/print.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/print.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/print.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/print.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/print.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/print.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/print.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/print.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/print.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/print.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/print.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/software_version.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/software_version.cpp.o: ../source/software_version.cpp +source/CMakeFiles/SPIRV-Tools-shared.dir/software_version.cpp.o: build-version.inc + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_30) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/software_version.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/software_version.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/software_version.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/software_version.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/software_version.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/software_version.cpp > CMakeFiles/SPIRV-Tools-shared.dir/software_version.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/software_version.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/software_version.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/software_version.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/software_version.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/software_version.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/software_version.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/software_version.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/software_version.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/software_version.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/software_version.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/software_version.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/software_version.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_endian.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_endian.cpp.o: ../source/spirv_endian.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_31) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_endian.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/spirv_endian.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spirv_endian.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_endian.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/spirv_endian.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spirv_endian.cpp > CMakeFiles/SPIRV-Tools-shared.dir/spirv_endian.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_endian.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/spirv_endian.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spirv_endian.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/spirv_endian.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_endian.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_endian.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_endian.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_endian.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_endian.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_endian.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_endian.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_endian.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_optimizer_options.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_optimizer_options.cpp.o: ../source/spirv_optimizer_options.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_32) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_optimizer_options.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/spirv_optimizer_options.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spirv_optimizer_options.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_optimizer_options.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/spirv_optimizer_options.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spirv_optimizer_options.cpp > CMakeFiles/SPIRV-Tools-shared.dir/spirv_optimizer_options.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_optimizer_options.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/spirv_optimizer_options.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spirv_optimizer_options.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/spirv_optimizer_options.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_optimizer_options.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_optimizer_options.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_optimizer_options.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_optimizer_options.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_optimizer_options.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_optimizer_options.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_optimizer_options.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_optimizer_options.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_target_env.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_target_env.cpp.o: ../source/spirv_target_env.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_33) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_target_env.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/spirv_target_env.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spirv_target_env.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_target_env.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/spirv_target_env.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spirv_target_env.cpp > CMakeFiles/SPIRV-Tools-shared.dir/spirv_target_env.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_target_env.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/spirv_target_env.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spirv_target_env.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/spirv_target_env.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_target_env.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_target_env.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_target_env.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_target_env.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_target_env.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_target_env.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_target_env.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_target_env.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_validator_options.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_validator_options.cpp.o: ../source/spirv_validator_options.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_34) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_validator_options.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/spirv_validator_options.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spirv_validator_options.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_validator_options.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/spirv_validator_options.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spirv_validator_options.cpp > CMakeFiles/SPIRV-Tools-shared.dir/spirv_validator_options.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_validator_options.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/spirv_validator_options.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spirv_validator_options.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/spirv_validator_options.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_validator_options.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_validator_options.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_validator_options.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_validator_options.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_validator_options.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_validator_options.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_validator_options.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_validator_options.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/table.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/table.cpp.o: ../source/table.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_35) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/table.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/table.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/table.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/table.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/table.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/table.cpp > CMakeFiles/SPIRV-Tools-shared.dir/table.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/table.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/table.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/table.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/table.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/table.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/table.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/table.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/table.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/table.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/table.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/table.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/table.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/text.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/text.cpp.o: ../source/text.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_36) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/text.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/text.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/text.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/text.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/text.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/text.cpp > CMakeFiles/SPIRV-Tools-shared.dir/text.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/text.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/text.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/text.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/text.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/text.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/text.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/text.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/text.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/text.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/text.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/text.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/text.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/text_handler.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/text_handler.cpp.o: ../source/text_handler.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_37) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/text_handler.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/text_handler.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/text_handler.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/text_handler.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/text_handler.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/text_handler.cpp > CMakeFiles/SPIRV-Tools-shared.dir/text_handler.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/text_handler.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/text_handler.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/text_handler.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/text_handler.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/text_handler.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/text_handler.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/text_handler.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/text_handler.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/text_handler.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/text_handler.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/text_handler.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/text_handler.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate.cpp.o: ../source/val/validate.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_38) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/val/validate.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate.cpp > CMakeFiles/SPIRV-Tools-shared.dir/val/validate.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/val/validate.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_adjacency.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_adjacency.cpp.o: ../source/val/validate_adjacency.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_39) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_adjacency.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_adjacency.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_adjacency.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_adjacency.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/val/validate_adjacency.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_adjacency.cpp > CMakeFiles/SPIRV-Tools-shared.dir/val/validate_adjacency.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_adjacency.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/val/validate_adjacency.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_adjacency.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_adjacency.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_adjacency.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_adjacency.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_adjacency.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_adjacency.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_adjacency.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_adjacency.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_adjacency.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_adjacency.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_annotation.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_annotation.cpp.o: ../source/val/validate_annotation.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_40) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_annotation.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_annotation.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_annotation.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_annotation.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/val/validate_annotation.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_annotation.cpp > CMakeFiles/SPIRV-Tools-shared.dir/val/validate_annotation.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_annotation.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/val/validate_annotation.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_annotation.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_annotation.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_annotation.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_annotation.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_annotation.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_annotation.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_annotation.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_annotation.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_annotation.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_annotation.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_arithmetics.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_arithmetics.cpp.o: ../source/val/validate_arithmetics.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_41) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_arithmetics.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_arithmetics.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_arithmetics.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_arithmetics.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/val/validate_arithmetics.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_arithmetics.cpp > CMakeFiles/SPIRV-Tools-shared.dir/val/validate_arithmetics.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_arithmetics.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/val/validate_arithmetics.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_arithmetics.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_arithmetics.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_arithmetics.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_arithmetics.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_arithmetics.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_arithmetics.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_arithmetics.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_arithmetics.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_arithmetics.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_arithmetics.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_atomics.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_atomics.cpp.o: ../source/val/validate_atomics.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_42) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_atomics.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_atomics.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_atomics.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_atomics.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/val/validate_atomics.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_atomics.cpp > CMakeFiles/SPIRV-Tools-shared.dir/val/validate_atomics.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_atomics.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/val/validate_atomics.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_atomics.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_atomics.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_atomics.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_atomics.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_atomics.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_atomics.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_atomics.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_atomics.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_atomics.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_atomics.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_barriers.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_barriers.cpp.o: ../source/val/validate_barriers.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_43) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_barriers.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_barriers.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_barriers.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_barriers.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/val/validate_barriers.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_barriers.cpp > CMakeFiles/SPIRV-Tools-shared.dir/val/validate_barriers.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_barriers.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/val/validate_barriers.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_barriers.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_barriers.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_barriers.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_barriers.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_barriers.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_barriers.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_barriers.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_barriers.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_barriers.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_barriers.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_bitwise.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_bitwise.cpp.o: ../source/val/validate_bitwise.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_44) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_bitwise.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_bitwise.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_bitwise.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_bitwise.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/val/validate_bitwise.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_bitwise.cpp > CMakeFiles/SPIRV-Tools-shared.dir/val/validate_bitwise.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_bitwise.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/val/validate_bitwise.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_bitwise.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_bitwise.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_bitwise.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_bitwise.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_bitwise.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_bitwise.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_bitwise.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_bitwise.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_bitwise.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_bitwise.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_builtins.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_builtins.cpp.o: ../source/val/validate_builtins.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_45) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_builtins.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_builtins.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_builtins.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_builtins.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/val/validate_builtins.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_builtins.cpp > CMakeFiles/SPIRV-Tools-shared.dir/val/validate_builtins.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_builtins.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/val/validate_builtins.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_builtins.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_builtins.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_builtins.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_builtins.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_builtins.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_builtins.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_builtins.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_builtins.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_builtins.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_builtins.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_capability.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_capability.cpp.o: ../source/val/validate_capability.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_46) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_capability.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_capability.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_capability.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_capability.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/val/validate_capability.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_capability.cpp > CMakeFiles/SPIRV-Tools-shared.dir/val/validate_capability.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_capability.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/val/validate_capability.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_capability.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_capability.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_capability.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_capability.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_capability.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_capability.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_capability.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_capability.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_capability.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_capability.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_cfg.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_cfg.cpp.o: ../source/val/validate_cfg.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_47) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_cfg.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_cfg.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_cfg.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_cfg.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/val/validate_cfg.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_cfg.cpp > CMakeFiles/SPIRV-Tools-shared.dir/val/validate_cfg.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_cfg.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/val/validate_cfg.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_cfg.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_cfg.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_cfg.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_cfg.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_cfg.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_cfg.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_cfg.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_cfg.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_cfg.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_cfg.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_composites.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_composites.cpp.o: ../source/val/validate_composites.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_48) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_composites.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_composites.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_composites.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_composites.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/val/validate_composites.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_composites.cpp > CMakeFiles/SPIRV-Tools-shared.dir/val/validate_composites.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_composites.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/val/validate_composites.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_composites.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_composites.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_composites.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_composites.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_composites.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_composites.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_composites.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_composites.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_composites.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_composites.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_constants.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_constants.cpp.o: ../source/val/validate_constants.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_49) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_constants.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_constants.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_constants.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_constants.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/val/validate_constants.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_constants.cpp > CMakeFiles/SPIRV-Tools-shared.dir/val/validate_constants.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_constants.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/val/validate_constants.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_constants.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_constants.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_constants.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_constants.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_constants.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_constants.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_constants.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_constants.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_constants.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_constants.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_conversion.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_conversion.cpp.o: ../source/val/validate_conversion.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_50) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_conversion.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_conversion.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_conversion.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_conversion.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/val/validate_conversion.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_conversion.cpp > CMakeFiles/SPIRV-Tools-shared.dir/val/validate_conversion.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_conversion.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/val/validate_conversion.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_conversion.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_conversion.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_conversion.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_conversion.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_conversion.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_conversion.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_conversion.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_conversion.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_conversion.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_conversion.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_datarules.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_datarules.cpp.o: ../source/val/validate_datarules.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_51) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_datarules.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_datarules.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_datarules.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_datarules.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/val/validate_datarules.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_datarules.cpp > CMakeFiles/SPIRV-Tools-shared.dir/val/validate_datarules.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_datarules.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/val/validate_datarules.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_datarules.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_datarules.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_datarules.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_datarules.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_datarules.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_datarules.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_datarules.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_datarules.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_datarules.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_datarules.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_debug.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_debug.cpp.o: ../source/val/validate_debug.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_52) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_debug.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_debug.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_debug.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_debug.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/val/validate_debug.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_debug.cpp > CMakeFiles/SPIRV-Tools-shared.dir/val/validate_debug.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_debug.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/val/validate_debug.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_debug.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_debug.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_debug.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_debug.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_debug.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_debug.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_debug.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_debug.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_debug.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_debug.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_decorations.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_decorations.cpp.o: ../source/val/validate_decorations.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_53) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_decorations.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_decorations.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_decorations.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_decorations.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/val/validate_decorations.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_decorations.cpp > CMakeFiles/SPIRV-Tools-shared.dir/val/validate_decorations.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_decorations.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/val/validate_decorations.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_decorations.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_decorations.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_decorations.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_decorations.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_decorations.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_decorations.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_decorations.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_decorations.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_decorations.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_decorations.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_derivatives.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_derivatives.cpp.o: ../source/val/validate_derivatives.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_54) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_derivatives.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_derivatives.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_derivatives.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_derivatives.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/val/validate_derivatives.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_derivatives.cpp > CMakeFiles/SPIRV-Tools-shared.dir/val/validate_derivatives.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_derivatives.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/val/validate_derivatives.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_derivatives.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_derivatives.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_derivatives.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_derivatives.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_derivatives.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_derivatives.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_derivatives.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_derivatives.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_derivatives.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_derivatives.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_ext_inst.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_ext_inst.cpp.o: ../source/val/validate_ext_inst.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_55) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_ext_inst.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_ext_inst.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_ext_inst.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_ext_inst.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/val/validate_ext_inst.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_ext_inst.cpp > CMakeFiles/SPIRV-Tools-shared.dir/val/validate_ext_inst.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_ext_inst.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/val/validate_ext_inst.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_ext_inst.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_ext_inst.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_ext_inst.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_ext_inst.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_ext_inst.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_ext_inst.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_ext_inst.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_ext_inst.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_ext_inst.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_ext_inst.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_execution_limitations.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_execution_limitations.cpp.o: ../source/val/validate_execution_limitations.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_56) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_execution_limitations.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_execution_limitations.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_execution_limitations.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_execution_limitations.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/val/validate_execution_limitations.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_execution_limitations.cpp > CMakeFiles/SPIRV-Tools-shared.dir/val/validate_execution_limitations.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_execution_limitations.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/val/validate_execution_limitations.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_execution_limitations.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_execution_limitations.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_execution_limitations.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_execution_limitations.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_execution_limitations.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_execution_limitations.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_execution_limitations.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_execution_limitations.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_execution_limitations.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_execution_limitations.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_function.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_function.cpp.o: ../source/val/validate_function.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_57) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_function.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_function.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_function.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_function.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/val/validate_function.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_function.cpp > CMakeFiles/SPIRV-Tools-shared.dir/val/validate_function.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_function.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/val/validate_function.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_function.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_function.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_function.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_function.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_function.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_function.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_function.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_function.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_function.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_function.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_id.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_id.cpp.o: ../source/val/validate_id.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_58) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_id.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_id.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_id.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_id.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/val/validate_id.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_id.cpp > CMakeFiles/SPIRV-Tools-shared.dir/val/validate_id.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_id.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/val/validate_id.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_id.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_id.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_id.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_id.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_id.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_id.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_id.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_id.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_id.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_id.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_image.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_image.cpp.o: ../source/val/validate_image.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_59) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_image.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_image.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_image.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_image.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/val/validate_image.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_image.cpp > CMakeFiles/SPIRV-Tools-shared.dir/val/validate_image.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_image.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/val/validate_image.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_image.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_image.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_image.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_image.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_image.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_image.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_image.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_image.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_image.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_image.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_interfaces.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_interfaces.cpp.o: ../source/val/validate_interfaces.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_60) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_interfaces.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_interfaces.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_interfaces.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_interfaces.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/val/validate_interfaces.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_interfaces.cpp > CMakeFiles/SPIRV-Tools-shared.dir/val/validate_interfaces.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_interfaces.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/val/validate_interfaces.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_interfaces.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_interfaces.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_interfaces.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_interfaces.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_interfaces.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_interfaces.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_interfaces.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_interfaces.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_interfaces.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_interfaces.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_instruction.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_instruction.cpp.o: ../source/val/validate_instruction.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_61) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_instruction.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_instruction.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_instruction.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_instruction.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/val/validate_instruction.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_instruction.cpp > CMakeFiles/SPIRV-Tools-shared.dir/val/validate_instruction.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_instruction.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/val/validate_instruction.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_instruction.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_instruction.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_instruction.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_instruction.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_instruction.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_instruction.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_instruction.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_instruction.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_instruction.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_instruction.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_layout.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_layout.cpp.o: ../source/val/validate_layout.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_62) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_layout.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_layout.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_layout.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_layout.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/val/validate_layout.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_layout.cpp > CMakeFiles/SPIRV-Tools-shared.dir/val/validate_layout.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_layout.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/val/validate_layout.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_layout.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_layout.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_layout.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_layout.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_layout.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_layout.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_layout.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_layout.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_layout.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_layout.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_literals.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_literals.cpp.o: ../source/val/validate_literals.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_63) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_literals.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_literals.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_literals.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_literals.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/val/validate_literals.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_literals.cpp > CMakeFiles/SPIRV-Tools-shared.dir/val/validate_literals.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_literals.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/val/validate_literals.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_literals.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_literals.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_literals.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_literals.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_literals.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_literals.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_literals.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_literals.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_literals.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_literals.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_logicals.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_logicals.cpp.o: ../source/val/validate_logicals.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_64) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_logicals.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_logicals.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_logicals.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_logicals.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/val/validate_logicals.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_logicals.cpp > CMakeFiles/SPIRV-Tools-shared.dir/val/validate_logicals.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_logicals.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/val/validate_logicals.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_logicals.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_logicals.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_logicals.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_logicals.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_logicals.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_logicals.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_logicals.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_logicals.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_logicals.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_logicals.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_memory.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_memory.cpp.o: ../source/val/validate_memory.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_65) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_memory.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_memory.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_memory.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_memory.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/val/validate_memory.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_memory.cpp > CMakeFiles/SPIRV-Tools-shared.dir/val/validate_memory.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_memory.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/val/validate_memory.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_memory.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_memory.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_memory.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_memory.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_memory.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_memory.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_memory.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_memory.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_memory.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_memory.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_mode_setting.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_mode_setting.cpp.o: ../source/val/validate_mode_setting.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_66) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_mode_setting.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_mode_setting.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_mode_setting.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_mode_setting.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/val/validate_mode_setting.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_mode_setting.cpp > CMakeFiles/SPIRV-Tools-shared.dir/val/validate_mode_setting.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_mode_setting.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/val/validate_mode_setting.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_mode_setting.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_mode_setting.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_mode_setting.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_mode_setting.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_mode_setting.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_mode_setting.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_mode_setting.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_mode_setting.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_mode_setting.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_mode_setting.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_non_uniform.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_non_uniform.cpp.o: ../source/val/validate_non_uniform.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_67) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_non_uniform.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_non_uniform.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_non_uniform.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_non_uniform.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/val/validate_non_uniform.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_non_uniform.cpp > CMakeFiles/SPIRV-Tools-shared.dir/val/validate_non_uniform.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_non_uniform.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/val/validate_non_uniform.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_non_uniform.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_non_uniform.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_non_uniform.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_non_uniform.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_non_uniform.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_non_uniform.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_non_uniform.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_non_uniform.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_non_uniform.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_non_uniform.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_primitives.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_primitives.cpp.o: ../source/val/validate_primitives.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_68) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_primitives.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_primitives.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_primitives.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_primitives.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/val/validate_primitives.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_primitives.cpp > CMakeFiles/SPIRV-Tools-shared.dir/val/validate_primitives.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_primitives.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/val/validate_primitives.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_primitives.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_primitives.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_primitives.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_primitives.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_primitives.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_primitives.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_primitives.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_primitives.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_primitives.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_primitives.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_type.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_type.cpp.o: ../source/val/validate_type.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_69) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_type.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_type.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_type.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_type.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/val/validate_type.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_type.cpp > CMakeFiles/SPIRV-Tools-shared.dir/val/validate_type.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_type.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/val/validate_type.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_type.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_type.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_type.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_type.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_type.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_type.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_type.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_type.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_type.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_type.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/basic_block.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/val/basic_block.cpp.o: ../source/val/basic_block.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_70) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/val/basic_block.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/val/basic_block.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/basic_block.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/basic_block.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/val/basic_block.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/basic_block.cpp > CMakeFiles/SPIRV-Tools-shared.dir/val/basic_block.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/basic_block.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/val/basic_block.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/basic_block.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/val/basic_block.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/basic_block.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/basic_block.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/basic_block.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/val/basic_block.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/basic_block.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/basic_block.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/basic_block.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/val/basic_block.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/construct.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/val/construct.cpp.o: ../source/val/construct.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_71) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/val/construct.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/val/construct.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/construct.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/construct.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/val/construct.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/construct.cpp > CMakeFiles/SPIRV-Tools-shared.dir/val/construct.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/construct.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/val/construct.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/construct.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/val/construct.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/construct.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/construct.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/construct.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/val/construct.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/construct.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/construct.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/construct.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/val/construct.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/function.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/val/function.cpp.o: ../source/val/function.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_72) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/val/function.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/val/function.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/function.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/function.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/val/function.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/function.cpp > CMakeFiles/SPIRV-Tools-shared.dir/val/function.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/function.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/val/function.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/function.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/val/function.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/function.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/function.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/function.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/val/function.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/function.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/function.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/function.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/val/function.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/instruction.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/val/instruction.cpp.o: ../source/val/instruction.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_73) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/val/instruction.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/val/instruction.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/instruction.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/instruction.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/val/instruction.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/instruction.cpp > CMakeFiles/SPIRV-Tools-shared.dir/val/instruction.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/instruction.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/val/instruction.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/instruction.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/val/instruction.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/instruction.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/instruction.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/instruction.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/val/instruction.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/instruction.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/instruction.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/instruction.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/val/instruction.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validation_state.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validation_state.cpp.o: ../source/val/validation_state.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_74) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/val/validation_state.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/val/validation_state.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validation_state.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validation_state.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/val/validation_state.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validation_state.cpp > CMakeFiles/SPIRV-Tools-shared.dir/val/validation_state.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validation_state.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/val/validation_state.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validation_state.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/val/validation_state.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validation_state.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validation_state.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validation_state.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validation_state.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validation_state.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/val/validation_state.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/val/validation_state.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validation_state.cpp.o + + +source/CMakeFiles/SPIRV-Tools-shared.dir/util/timer.cpp.o: source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make +source/CMakeFiles/SPIRV-Tools-shared.dir/util/timer.cpp.o: ../source/util/timer.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_75) "Building CXX object source/CMakeFiles/SPIRV-Tools-shared.dir/util/timer.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-shared.dir/util/timer.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/util/timer.cpp + +source/CMakeFiles/SPIRV-Tools-shared.dir/util/timer.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-shared.dir/util/timer.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/util/timer.cpp > CMakeFiles/SPIRV-Tools-shared.dir/util/timer.cpp.i + +source/CMakeFiles/SPIRV-Tools-shared.dir/util/timer.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-shared.dir/util/timer.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/util/timer.cpp -o CMakeFiles/SPIRV-Tools-shared.dir/util/timer.cpp.s + +source/CMakeFiles/SPIRV-Tools-shared.dir/util/timer.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/util/timer.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/util/timer.cpp.o.provides: source/CMakeFiles/SPIRV-Tools-shared.dir/util/timer.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/util/timer.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/util/timer.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools-shared.dir/util/timer.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools-shared.dir/util/timer.cpp.o + + +# Object files for target SPIRV-Tools-shared +SPIRV__Tools__shared_OBJECTS = \ +"CMakeFiles/SPIRV-Tools-shared.dir/util/bit_vector.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/util/parse_number.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/util/string_utils.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/assembly_grammar.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/binary.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/diagnostic.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/disassemble.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/enum_string_mapping.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/ext_inst.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/extensions.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/id_descriptor.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/libspirv.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/name_mapper.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/opcode.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/operand.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/parsed_operand.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/print.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/software_version.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/spirv_endian.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/spirv_optimizer_options.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/spirv_target_env.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/spirv_validator_options.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/table.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/text.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/text_handler.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/val/validate.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/val/validate_adjacency.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/val/validate_annotation.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/val/validate_arithmetics.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/val/validate_atomics.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/val/validate_barriers.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/val/validate_bitwise.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/val/validate_builtins.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/val/validate_capability.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/val/validate_cfg.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/val/validate_composites.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/val/validate_constants.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/val/validate_conversion.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/val/validate_datarules.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/val/validate_debug.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/val/validate_decorations.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/val/validate_derivatives.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/val/validate_ext_inst.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/val/validate_execution_limitations.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/val/validate_function.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/val/validate_id.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/val/validate_image.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/val/validate_interfaces.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/val/validate_instruction.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/val/validate_layout.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/val/validate_literals.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/val/validate_logicals.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/val/validate_memory.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/val/validate_mode_setting.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/val/validate_non_uniform.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/val/validate_primitives.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/val/validate_type.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/val/basic_block.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/val/construct.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/val/function.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/val/instruction.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/val/validation_state.cpp.o" \ +"CMakeFiles/SPIRV-Tools-shared.dir/util/timer.cpp.o" + +# External object files for target SPIRV-Tools-shared +SPIRV__Tools__shared_EXTERNAL_OBJECTS = + +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/util/bit_vector.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/util/parse_number.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/util/string_utils.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/assembly_grammar.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/binary.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/diagnostic.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/disassemble.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/enum_string_mapping.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/ext_inst.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/extensions.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/id_descriptor.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/libspirv.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/name_mapper.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/opcode.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/operand.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/parsed_operand.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/print.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/software_version.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_endian.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_optimizer_options.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_target_env.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_validator_options.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/table.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/text.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/text_handler.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_adjacency.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_annotation.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_arithmetics.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_atomics.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_barriers.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_bitwise.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_builtins.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_capability.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_cfg.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_composites.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_constants.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_conversion.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_datarules.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_debug.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_decorations.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_derivatives.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_ext_inst.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_execution_limitations.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_function.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_id.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_image.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_interfaces.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_instruction.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_layout.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_literals.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_logicals.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_memory.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_mode_setting.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_non_uniform.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_primitives.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_type.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/val/basic_block.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/val/construct.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/val/function.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/val/instruction.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validation_state.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/util/timer.cpp.o +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/build.make +source/libSPIRV-Tools-shared.so: source/CMakeFiles/SPIRV-Tools-shared.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --bold --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_76) "Linking CXX shared library libSPIRV-Tools-shared.so" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/SPIRV-Tools-shared.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +source/CMakeFiles/SPIRV-Tools-shared.dir/build: source/libSPIRV-Tools-shared.so + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/build + +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/util/bit_vector.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/util/parse_number.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/util/string_utils.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/assembly_grammar.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/binary.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/diagnostic.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/disassemble.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/enum_string_mapping.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/ext_inst.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/extensions.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/id_descriptor.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/libspirv.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/name_mapper.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/opcode.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/operand.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/parsed_operand.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/print.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/software_version.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_endian.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_optimizer_options.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_target_env.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_validator_options.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/table.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/text.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/text_handler.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_adjacency.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_annotation.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_arithmetics.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_atomics.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_barriers.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_bitwise.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_builtins.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_capability.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_cfg.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_composites.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_constants.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_conversion.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_datarules.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_debug.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_decorations.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_derivatives.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_ext_inst.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_execution_limitations.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_function.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_id.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_image.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_interfaces.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_instruction.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_layout.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_literals.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_logicals.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_memory.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_mode_setting.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_non_uniform.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_primitives.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_type.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/val/basic_block.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/val/construct.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/val/function.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/val/instruction.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/val/validation_state.cpp.o.requires +source/CMakeFiles/SPIRV-Tools-shared.dir/requires: source/CMakeFiles/SPIRV-Tools-shared.dir/util/timer.cpp.o.requires + +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/requires + +source/CMakeFiles/SPIRV-Tools-shared.dir/clean: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && $(CMAKE_COMMAND) -P CMakeFiles/SPIRV-Tools-shared.dir/cmake_clean.cmake +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/clean + +source/CMakeFiles/SPIRV-Tools-shared.dir/depend: extension_enum.inc +source/CMakeFiles/SPIRV-Tools-shared.dir/depend: enum_string_mapping.inc +source/CMakeFiles/SPIRV-Tools-shared.dir/depend: opencl.std.insts.inc +source/CMakeFiles/SPIRV-Tools-shared.dir/depend: glsl.std.450.insts.inc +source/CMakeFiles/SPIRV-Tools-shared.dir/depend: spv-amd-shader-explicit-vertex-parameter.insts.inc +source/CMakeFiles/SPIRV-Tools-shared.dir/depend: spv-amd-shader-trinary-minmax.insts.inc +source/CMakeFiles/SPIRV-Tools-shared.dir/depend: spv-amd-gcn-shader.insts.inc +source/CMakeFiles/SPIRV-Tools-shared.dir/depend: spv-amd-shader-ballot.insts.inc +source/CMakeFiles/SPIRV-Tools-shared.dir/depend: debuginfo.insts.inc +source/CMakeFiles/SPIRV-Tools-shared.dir/depend: DebugInfo.h +source/CMakeFiles/SPIRV-Tools-shared.dir/depend: core.insts-unified1.inc +source/CMakeFiles/SPIRV-Tools-shared.dir/depend: operand.kinds-unified1.inc +source/CMakeFiles/SPIRV-Tools-shared.dir/depend: generators.inc +source/CMakeFiles/SPIRV-Tools-shared.dir/depend: build-version.inc + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/bkaradzic/Private/projects/_github/SPIRV-Tools /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/depend + diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/cmake_clean.cmake b/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/cmake_clean.cmake new file mode 100644 index 000000000..5a2f81137 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/cmake_clean.cmake @@ -0,0 +1,86 @@ +file(REMOVE_RECURSE + "../extension_enum.inc" + "../enum_string_mapping.inc" + "../opencl.std.insts.inc" + "../glsl.std.450.insts.inc" + "../spv-amd-shader-explicit-vertex-parameter.insts.inc" + "../spv-amd-shader-trinary-minmax.insts.inc" + "../spv-amd-gcn-shader.insts.inc" + "../spv-amd-shader-ballot.insts.inc" + "../debuginfo.insts.inc" + "../DebugInfo.h" + "../core.insts-unified1.inc" + "../operand.kinds-unified1.inc" + "../generators.inc" + "../build-version.inc" + "CMakeFiles/SPIRV-Tools-shared.dir/util/bit_vector.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/util/parse_number.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/util/string_utils.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/assembly_grammar.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/binary.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/diagnostic.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/disassemble.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/enum_string_mapping.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/ext_inst.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/extensions.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/id_descriptor.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/libspirv.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/name_mapper.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/opcode.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/operand.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/parsed_operand.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/print.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/software_version.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/spirv_endian.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/spirv_optimizer_options.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/spirv_target_env.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/spirv_validator_options.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/table.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/text.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/text_handler.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/val/validate.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/val/validate_adjacency.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/val/validate_annotation.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/val/validate_arithmetics.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/val/validate_atomics.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/val/validate_barriers.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/val/validate_bitwise.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/val/validate_builtins.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/val/validate_capability.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/val/validate_cfg.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/val/validate_composites.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/val/validate_constants.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/val/validate_conversion.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/val/validate_datarules.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/val/validate_debug.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/val/validate_decorations.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/val/validate_derivatives.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/val/validate_ext_inst.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/val/validate_execution_limitations.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/val/validate_function.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/val/validate_id.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/val/validate_image.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/val/validate_interfaces.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/val/validate_instruction.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/val/validate_layout.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/val/validate_literals.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/val/validate_logicals.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/val/validate_memory.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/val/validate_mode_setting.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/val/validate_non_uniform.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/val/validate_primitives.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/val/validate_type.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/val/basic_block.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/val/construct.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/val/function.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/val/instruction.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/val/validation_state.cpp.o" + "CMakeFiles/SPIRV-Tools-shared.dir/util/timer.cpp.o" + "libSPIRV-Tools-shared.pdb" + "libSPIRV-Tools-shared.so" +) + +# Per-language clean rules from dependency scanning. +foreach(lang CXX) + include(CMakeFiles/SPIRV-Tools-shared.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/depend.make b/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/depend.make new file mode 100644 index 000000000..19ef83551 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for SPIRV-Tools-shared. +# This may be replaced when dependencies are built. diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make b/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make new file mode 100644 index 000000000..a8fbff8cf --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# compile CXX with /usr/bin/c++ +CXX_FLAGS = -g -fPIC -fvisibility=hidden -Wall -Wextra -Wnon-virtual-dtor -Wno-missing-field-initializers -Werror -std=c++11 -fno-exceptions -fno-rtti -Wno-long-long -Wshadow -Wundef -Wconversion -Wno-sign-conversion -std=gnu++11 + +CXX_DEFINES = -DSPIRV_CHECK_CONTEXT -DSPIRV_COLOR_TERMINAL -DSPIRV_LINUX -DSPIRV_TIMER_ENABLED -DSPIRV_TOOLS_IMPLEMENTATION -DSPIRV_TOOLS_SHAREDLIB -DSPIRV_Tools_shared_EXPORTS + +CXX_INCLUDES = -I/home/bkaradzic/Private/projects/_github/SPIRV-Tools -I/home/bkaradzic/Private/projects/_github/SPIRV-Tools/include -I/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build -I/home/bkaradzic/Private/projects/_github/SPIRV-Tools/external/SPIRV-Headers/include + diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/link.txt b/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/link.txt new file mode 100644 index 000000000..41a37933a --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/c++ -fPIC -g -shared -Wl,-soname,libSPIRV-Tools-shared.so -o libSPIRV-Tools-shared.so CMakeFiles/SPIRV-Tools-shared.dir/util/bit_vector.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/util/parse_number.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/util/string_utils.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/assembly_grammar.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/binary.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/diagnostic.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/disassemble.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/enum_string_mapping.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/ext_inst.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/extensions.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/id_descriptor.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/libspirv.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/name_mapper.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/opcode.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/operand.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/parsed_operand.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/print.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/software_version.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/spirv_endian.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/spirv_optimizer_options.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/spirv_target_env.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/spirv_validator_options.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/table.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/text.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/text_handler.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/val/validate.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_adjacency.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_annotation.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_arithmetics.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_atomics.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_barriers.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_bitwise.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_builtins.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_capability.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_cfg.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_composites.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_constants.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_conversion.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_datarules.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_debug.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_decorations.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_derivatives.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_ext_inst.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_execution_limitations.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_function.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_id.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_image.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_interfaces.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_instruction.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_layout.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_literals.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_logicals.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_memory.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_mode_setting.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_non_uniform.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_primitives.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/val/validate_type.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/val/basic_block.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/val/construct.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/val/function.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/val/instruction.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/val/validation_state.cpp.o CMakeFiles/SPIRV-Tools-shared.dir/util/timer.cpp.o diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/progress.make b/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/progress.make new file mode 100644 index 000000000..a112fa159 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools-shared.dir/progress.make @@ -0,0 +1,77 @@ +CMAKE_PROGRESS_1 = 61 +CMAKE_PROGRESS_2 = +CMAKE_PROGRESS_3 = +CMAKE_PROGRESS_4 = 62 +CMAKE_PROGRESS_5 = +CMAKE_PROGRESS_6 = +CMAKE_PROGRESS_7 = 63 +CMAKE_PROGRESS_8 = +CMAKE_PROGRESS_9 = 64 +CMAKE_PROGRESS_10 = +CMAKE_PROGRESS_11 = +CMAKE_PROGRESS_12 = 65 +CMAKE_PROGRESS_13 = +CMAKE_PROGRESS_14 = +CMAKE_PROGRESS_15 = 66 +CMAKE_PROGRESS_16 = +CMAKE_PROGRESS_17 = 67 +CMAKE_PROGRESS_18 = +CMAKE_PROGRESS_19 = +CMAKE_PROGRESS_20 = 68 +CMAKE_PROGRESS_21 = +CMAKE_PROGRESS_22 = +CMAKE_PROGRESS_23 = 69 +CMAKE_PROGRESS_24 = +CMAKE_PROGRESS_25 = 70 +CMAKE_PROGRESS_26 = +CMAKE_PROGRESS_27 = +CMAKE_PROGRESS_28 = 71 +CMAKE_PROGRESS_29 = +CMAKE_PROGRESS_30 = +CMAKE_PROGRESS_31 = 72 +CMAKE_PROGRESS_32 = +CMAKE_PROGRESS_33 = 73 +CMAKE_PROGRESS_34 = +CMAKE_PROGRESS_35 = +CMAKE_PROGRESS_36 = 74 +CMAKE_PROGRESS_37 = +CMAKE_PROGRESS_38 = +CMAKE_PROGRESS_39 = 75 +CMAKE_PROGRESS_40 = +CMAKE_PROGRESS_41 = 76 +CMAKE_PROGRESS_42 = +CMAKE_PROGRESS_43 = +CMAKE_PROGRESS_44 = 77 +CMAKE_PROGRESS_45 = +CMAKE_PROGRESS_46 = +CMAKE_PROGRESS_47 = 78 +CMAKE_PROGRESS_48 = +CMAKE_PROGRESS_49 = 79 +CMAKE_PROGRESS_50 = +CMAKE_PROGRESS_51 = +CMAKE_PROGRESS_52 = 80 +CMAKE_PROGRESS_53 = +CMAKE_PROGRESS_54 = +CMAKE_PROGRESS_55 = 81 +CMAKE_PROGRESS_56 = +CMAKE_PROGRESS_57 = 82 +CMAKE_PROGRESS_58 = +CMAKE_PROGRESS_59 = +CMAKE_PROGRESS_60 = 83 +CMAKE_PROGRESS_61 = +CMAKE_PROGRESS_62 = +CMAKE_PROGRESS_63 = 84 +CMAKE_PROGRESS_64 = +CMAKE_PROGRESS_65 = 85 +CMAKE_PROGRESS_66 = +CMAKE_PROGRESS_67 = +CMAKE_PROGRESS_68 = 86 +CMAKE_PROGRESS_69 = +CMAKE_PROGRESS_70 = +CMAKE_PROGRESS_71 = 87 +CMAKE_PROGRESS_72 = +CMAKE_PROGRESS_73 = 88 +CMAKE_PROGRESS_74 = +CMAKE_PROGRESS_75 = +CMAKE_PROGRESS_76 = 89 + diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/CXX.includecache b/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/CXX.includecache new file mode 100644 index 000000000..01ea803f6 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/CXX.includecache @@ -0,0 +1,1660 @@ +#IncludeRegexLine: ^[ ]*#[ ]*(include|import)[ ]*[<"]([^">]+)([">]) + +#IncludeRegexScan: ^.*$ + +#IncludeRegexComplain: ^$ + +#IncludeRegexTransform: + +..//source/assembly_grammar.h +source/enum_set.h +../source/source/enum_set.h +source/latest_version_spirv_header.h +../source/source/latest_version_spirv_header.h +source/operand.h +../source/source/operand.h +source/table.h +../source/source/table.h +spirv-tools/libspirv.h +../source/spirv-tools/libspirv.h + +..//source/binary.h +source/spirv_definition.h +../source/source/spirv_definition.h +spirv-tools/libspirv.h +../source/spirv-tools/libspirv.h + +..//source/cfa.h +algorithm +- +cassert +- +cstdint +- +functional +- +map +- +unordered_map +- +unordered_set +- +utility +- +vector +- + +..//source/diagnostic.h +sstream +- +string +- +spirv-tools/libspirv.hpp +../source/spirv-tools/libspirv.hpp + +..//source/disassemble.h +string +- +spirv-tools/libspirv.h +../source/spirv-tools/libspirv.h + +..//source/enum_set.h +cstdint +- +functional +- +memory +- +set +- +utility +- +source/latest_version_spirv_header.h +../source/source/latest_version_spirv_header.h +source/util/make_unique.h +../source/source/util/make_unique.h + +..//source/enum_string_mapping.h +string +- +source/extensions.h +../source/source/extensions.h +source/latest_version_spirv_header.h +../source/source/latest_version_spirv_header.h + +..//source/ext_inst.h +source/table.h +../source/source/table.h +spirv-tools/libspirv.h +../source/spirv-tools/libspirv.h + +..//source/extensions.h +string +- +source/enum_set.h +../source/source/enum_set.h +spirv-tools/libspirv.h +../source/spirv-tools/libspirv.h +extension_enum.inc +../source/extension_enum.inc + +..//source/id_descriptor.h +unordered_map +- +vector +- +spirv-tools/libspirv.hpp +../source/spirv-tools/libspirv.hpp + +..//source/instruction.h +cstdint +- +vector +- +source/latest_version_spirv_header.h +../source/source/latest_version_spirv_header.h +spirv-tools/libspirv.h +../source/spirv-tools/libspirv.h + +..//source/latest_version_glsl_std_450_header.h +spirv/unified1/GLSL.std.450.h +../source/spirv/unified1/GLSL.std.450.h + +..//source/latest_version_opencl_std_header.h +spirv/unified1/OpenCL.std.h +../source/spirv/unified1/OpenCL.std.h + +..//source/latest_version_spirv_header.h +spirv/unified1/spirv.h +../source/spirv/unified1/spirv.h + +..//source/macro.h + +..//source/name_mapper.h +functional +- +string +- +unordered_map +- +unordered_set +- +source/assembly_grammar.h +../source/source/assembly_grammar.h +spirv-tools/libspirv.h +../source/spirv-tools/libspirv.h + +..//source/opcode.h +source/instruction.h +../source/source/instruction.h +source/latest_version_spirv_header.h +../source/source/latest_version_spirv_header.h +source/table.h +../source/source/table.h +spirv-tools/libspirv.h +../source/spirv-tools/libspirv.h + +..//source/operand.h +functional +- +vector +- +source/table.h +../source/source/table.h +spirv-tools/libspirv.h +../source/spirv-tools/libspirv.h + +..//source/parsed_operand.h +ostream +- +spirv-tools/libspirv.h +../source/spirv-tools/libspirv.h + +..//source/print.h +iostream +- +sstream +- + +..//source/spirv_constant.h +source/latest_version_spirv_header.h +../source/source/latest_version_spirv_header.h +spirv-tools/libspirv.h +../source/spirv-tools/libspirv.h + +..//source/spirv_definition.h +cstdint +- +source/latest_version_spirv_header.h +../source/source/latest_version_spirv_header.h + +..//source/spirv_endian.h +spirv-tools/libspirv.h +../source/spirv-tools/libspirv.h + +..//source/spirv_optimizer_options.h +source/spirv_validator_options.h +../source/source/spirv_validator_options.h +spirv-tools/libspirv.h +../source/spirv-tools/libspirv.h + +..//source/spirv_target_env.h +spirv-tools/libspirv.h +../source/spirv-tools/libspirv.h + +..//source/spirv_validator_options.h +spirv-tools/libspirv.h +../source/spirv-tools/libspirv.h + +..//source/table.h +source/latest_version_spirv_header.h +../source/source/latest_version_spirv_header.h +source/extensions.h +../source/source/extensions.h +spirv-tools/libspirv.hpp +../source/spirv-tools/libspirv.hpp + +..//source/text.h +string +- +source/operand.h +../source/source/operand.h +source/spirv_constant.h +../source/source/spirv_constant.h +spirv-tools/libspirv.h +../source/spirv-tools/libspirv.h + +..//source/text_handler.h +iomanip +- +set +- +sstream +- +string +- +type_traits +- +unordered_map +- +utility +- +source/diagnostic.h +../source/source/diagnostic.h +source/instruction.h +../source/source/instruction.h +source/text.h +../source/source/text.h +spirv-tools/libspirv.h +../source/spirv-tools/libspirv.h + +..//source/util/bit_vector.h +cstdint +- +iosfwd +- +vector +- + +..//source/util/bitutils.h +cstdint +- +cstring +- + +..//source/util/hex_float.h +cassert +- +cctype +- +cmath +- +cstdint +- +iomanip +- +limits +- +sstream +- +vector +- +source/util/bitutils.h +../source/util/source/util/bitutils.h + +..//source/util/make_unique.h +memory +- +utility +- + +..//source/util/parse_number.h +functional +- +string +- +tuple +- +source/util/hex_float.h +../source/util/source/util/hex_float.h +spirv-tools/libspirv.h +../source/util/spirv-tools/libspirv.h + +..//source/util/string_utils.h +sstream +- +string +- +source/util/string_utils.h +../source/util/source/util/string_utils.h + +..//source/util/timer.h +sys/resource.h +- +cassert +- +iostream +- + +..//source/val/basic_block.h +cstdint +- +bitset +- +functional +- +memory +- +vector +- +source/latest_version_spirv_header.h +../source/val/source/latest_version_spirv_header.h + +..//source/val/construct.h +cstdint +- +set +- +vector +- +source/val/basic_block.h +../source/val/source/val/basic_block.h + +..//source/val/decoration.h +cstdint +- +unordered_map +- +vector +- +source/latest_version_spirv_header.h +../source/val/source/latest_version_spirv_header.h + +..//source/val/function.h +functional +- +list +- +map +- +set +- +string +- +unordered_map +- +unordered_set +- +utility +- +vector +- +source/latest_version_spirv_header.h +../source/val/source/latest_version_spirv_header.h +source/val/basic_block.h +../source/val/source/val/basic_block.h +source/val/construct.h +../source/val/source/val/construct.h +spirv-tools/libspirv.h +../source/val/spirv-tools/libspirv.h + +..//source/val/instruction.h +cassert +- +cstdint +- +functional +- +utility +- +vector +- +source/table.h +../source/val/source/table.h +spirv-tools/libspirv.h +../source/val/spirv-tools/libspirv.h + +..//source/val/validate.h +functional +- +memory +- +utility +- +vector +- +source/instruction.h +../source/val/source/instruction.h +source/table.h +../source/val/source/table.h +spirv-tools/libspirv.h +../source/val/spirv-tools/libspirv.h + +..//source/val/validation_state.h +map +- +set +- +string +- +tuple +- +unordered_map +- +unordered_set +- +vector +- +source/assembly_grammar.h +../source/val/source/assembly_grammar.h +source/diagnostic.h +../source/val/source/diagnostic.h +source/disassemble.h +../source/val/source/disassemble.h +source/enum_set.h +../source/val/source/enum_set.h +source/latest_version_spirv_header.h +../source/val/source/latest_version_spirv_header.h +source/spirv_definition.h +../source/val/source/spirv_definition.h +source/spirv_validator_options.h +../source/val/source/spirv_validator_options.h +source/val/decoration.h +../source/val/source/val/decoration.h +source/val/function.h +../source/val/source/val/function.h +source/val/instruction.h +../source/val/source/val/instruction.h +spirv-tools/libspirv.h +../source/val/spirv-tools/libspirv.h + +../external/SPIRV-Headers/include/spirv/unified1/GLSL.std.450.h + +../external/SPIRV-Headers/include/spirv/unified1/OpenCL.std.h + +../external/SPIRV-Headers/include/spirv/unified1/spirv.h + +../include/spirv-tools/libspirv.h +stdbool.h +- +stddef.h +- +stdint.h +- + +../include/spirv-tools/libspirv.hpp +functional +- +memory +- +string +- +vector +- +spirv-tools/libspirv.h +../include/spirv-tools/spirv-tools/libspirv.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/assembly_grammar.cpp +source/assembly_grammar.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/assembly_grammar.h +algorithm +- +cassert +- +cstring +- +source/ext_inst.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/ext_inst.h +source/opcode.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/opcode.h +source/operand.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/operand.h +source/table.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/table.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/binary.cpp +source/binary.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/binary.h +algorithm +- +cassert +- +cstring +- +iterator +- +limits +- +string +- +unordered_map +- +vector +- +source/assembly_grammar.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/assembly_grammar.h +source/diagnostic.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/diagnostic.h +source/ext_inst.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/ext_inst.h +source/latest_version_spirv_header.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/latest_version_spirv_header.h +source/opcode.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/opcode.h +source/operand.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/operand.h +source/spirv_constant.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/spirv_constant.h +source/spirv_endian.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/spirv_endian.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/diagnostic.cpp +source/diagnostic.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/diagnostic.h +cassert +- +cstring +- +iostream +- +sstream +- +utility +- +source/table.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/table.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/disassemble.cpp +algorithm +- +cassert +- +cstring +- +iomanip +- +memory +- +unordered_map +- +utility +- +source/assembly_grammar.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/assembly_grammar.h +source/binary.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/binary.h +source/diagnostic.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/diagnostic.h +source/disassemble.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/disassemble.h +source/ext_inst.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/ext_inst.h +source/name_mapper.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/name_mapper.h +source/opcode.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/opcode.h +source/parsed_operand.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/parsed_operand.h +source/print.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/print.h +source/spirv_constant.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/spirv_constant.h +source/spirv_endian.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/spirv_endian.h +source/util/hex_float.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/util/hex_float.h +source/util/make_unique.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/util/make_unique.h +spirv-tools/libspirv.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spirv-tools/libspirv.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/enum_string_mapping.cpp +source/enum_string_mapping.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/enum_string_mapping.h +algorithm +- +cassert +- +cstring +- +string +- +unordered_map +- +source/extensions.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/extensions.h +enum_string_mapping.inc +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/enum_string_mapping.inc + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/ext_inst.cpp +source/ext_inst.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/ext_inst.h +cassert +- +cstring +- +DebugInfo.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/DebugInfo.h +source/latest_version_glsl_std_450_header.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/latest_version_glsl_std_450_header.h +source/latest_version_opencl_std_header.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/latest_version_opencl_std_header.h +source/macro.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/macro.h +source/spirv_definition.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/spirv_definition.h +debuginfo.insts.inc +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/debuginfo.insts.inc +glsl.std.450.insts.inc +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/glsl.std.450.insts.inc +opencl.std.insts.inc +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opencl.std.insts.inc +spv-amd-gcn-shader.insts.inc +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spv-amd-gcn-shader.insts.inc +spv-amd-shader-ballot.insts.inc +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spv-amd-shader-ballot.insts.inc +spv-amd-shader-explicit-vertex-parameter.insts.inc +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spv-amd-shader-explicit-vertex-parameter.insts.inc +spv-amd-shader-trinary-minmax.insts.inc +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spv-amd-shader-trinary-minmax.insts.inc + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/extensions.cpp +source/extensions.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/extensions.h +cassert +- +sstream +- +string +- +source/enum_string_mapping.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/enum_string_mapping.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/id_descriptor.cpp +source/id_descriptor.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/id_descriptor.h +cassert +- +iostream +- +source/opcode.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/opcode.h +source/operand.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/operand.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/libspirv.cpp +spirv-tools/libspirv.hpp +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spirv-tools/libspirv.hpp +iostream +- +string +- +utility +- +vector +- +source/table.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/table.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/name_mapper.cpp +source/name_mapper.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/name_mapper.h +algorithm +- +cassert +- +iterator +- +sstream +- +string +- +unordered_map +- +unordered_set +- +spirv-tools/libspirv.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spirv-tools/libspirv.h +source/latest_version_spirv_header.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/latest_version_spirv_header.h +source/parsed_operand.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/parsed_operand.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opcode.cpp +source/opcode.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/opcode.h +assert.h +- +string.h +- +algorithm +- +cstdlib +- +source/instruction.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/instruction.h +source/macro.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/macro.h +source/spirv_constant.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/spirv_constant.h +source/spirv_endian.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/spirv_endian.h +source/spirv_target_env.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/spirv_target_env.h +spirv-tools/libspirv.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spirv-tools/libspirv.h +core.insts-unified1.inc +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/core.insts-unified1.inc +generators.inc +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/generators.inc + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/operand.cpp +source/operand.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/operand.h +assert.h +- +string.h +- +algorithm +- +source/macro.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/macro.h +source/spirv_constant.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/spirv_constant.h +source/spirv_target_env.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/spirv_target_env.h +operand.kinds-unified1.inc +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/operand.kinds-unified1.inc + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/parsed_operand.cpp +source/parsed_operand.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/parsed_operand.h +cassert +- +source/util/hex_float.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/util/hex_float.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/print.cpp +source/print.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/print.h +windows.h +- + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/software_version.cpp +spirv-tools/libspirv.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spirv-tools/libspirv.h +build-version.inc +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/build-version.inc + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spirv_endian.cpp +source/spirv_endian.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/spirv_endian.h +cstring +- + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spirv_optimizer_options.cpp +cassert +- +cstring +- +source/spirv_optimizer_options.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/spirv_optimizer_options.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spirv_target_env.cpp +source/spirv_target_env.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/spirv_target_env.h +cassert +- +cstring +- +source/spirv_constant.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/spirv_constant.h +spirv-tools/libspirv.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spirv-tools/libspirv.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spirv_validator_options.cpp +cassert +- +cstring +- +source/spirv_validator_options.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/spirv_validator_options.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/table.cpp +source/table.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/table.h +utility +- + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/text.cpp +source/text.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/text.h +algorithm +- +cassert +- +cctype +- +cstdio +- +cstdlib +- +cstring +- +memory +- +set +- +sstream +- +string +- +unordered_map +- +utility +- +vector +- +source/assembly_grammar.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/assembly_grammar.h +source/binary.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/binary.h +source/diagnostic.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/diagnostic.h +source/ext_inst.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/ext_inst.h +source/instruction.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/instruction.h +source/opcode.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/opcode.h +source/operand.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/operand.h +source/spirv_constant.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/spirv_constant.h +source/spirv_target_env.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/spirv_target_env.h +source/table.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/table.h +source/text_handler.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/text_handler.h +source/util/bitutils.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/util/bitutils.h +source/util/parse_number.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/util/parse_number.h +spirv-tools/libspirv.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spirv-tools/libspirv.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/text_handler.cpp +source/text_handler.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/text_handler.h +algorithm +- +cassert +- +cstdlib +- +cstring +- +tuple +- +source/assembly_grammar.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/assembly_grammar.h +source/binary.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/binary.h +source/ext_inst.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/ext_inst.h +source/instruction.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/instruction.h +source/opcode.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/opcode.h +source/text.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/text.h +source/util/bitutils.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/util/bitutils.h +source/util/hex_float.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/util/hex_float.h +source/util/parse_number.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/source/util/parse_number.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/util/bit_vector.cpp +source/util/bit_vector.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/util/source/util/bit_vector.h +cassert +- +iostream +- + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/util/parse_number.cpp +source/util/parse_number.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/util/source/util/parse_number.h +functional +- +iomanip +- +memory +- +sstream +- +string +- +tuple +- +source/util/hex_float.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/util/source/util/hex_float.h +source/util/make_unique.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/util/source/util/make_unique.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/util/string_utils.cpp +algorithm +- +cstdint +- +type_traits +- +source/util/string_utils.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/util/source/util/string_utils.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/util/timer.cpp +source/util/timer.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/util/source/util/timer.h +sys/resource.h +- +sys/time.h +- +iomanip +- +iostream +- +string +- + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/basic_block.cpp +source/val/basic_block.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/basic_block.h +algorithm +- +utility +- +vector +- + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/construct.cpp +source/val/construct.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/construct.h +cassert +- +cstddef +- +unordered_set +- +source/val/function.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/function.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/function.cpp +source/val/function.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/function.h +cassert +- +algorithm +- +sstream +- +unordered_map +- +unordered_set +- +utility +- +source/cfa.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/cfa.h +source/val/basic_block.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/basic_block.h +source/val/construct.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/construct.h +source/val/validate.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validate.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/instruction.cpp +source/val/instruction.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/instruction.h +utility +- + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate.cpp +source/val/validate.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validate.h +cassert +- +cstdio +- +algorithm +- +functional +- +iterator +- +memory +- +sstream +- +string +- +vector +- +source/binary.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/binary.h +source/diagnostic.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/diagnostic.h +source/enum_string_mapping.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/enum_string_mapping.h +source/extensions.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/extensions.h +source/instruction.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/instruction.h +source/opcode.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/opcode.h +source/operand.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/operand.h +source/spirv_constant.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/spirv_constant.h +source/spirv_endian.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/spirv_endian.h +source/spirv_target_env.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/spirv_target_env.h +source/spirv_validator_options.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/spirv_validator_options.h +source/val/construct.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/construct.h +source/val/function.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/function.h +source/val/instruction.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/instruction.h +source/val/validation_state.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validation_state.h +spirv-tools/libspirv.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/spirv-tools/libspirv.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_adjacency.cpp +source/val/validate.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validate.h +string +- +source/diagnostic.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/diagnostic.h +source/opcode.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/opcode.h +source/val/instruction.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/instruction.h +source/val/validation_state.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validation_state.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_annotation.cpp +source/val/validate.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validate.h +source/opcode.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/opcode.h +source/val/instruction.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/instruction.h +source/val/validation_state.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validation_state.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_arithmetics.cpp +source/val/validate.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validate.h +vector +- +source/diagnostic.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/diagnostic.h +source/opcode.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/opcode.h +source/val/instruction.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/instruction.h +source/val/validation_state.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validation_state.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_atomics.cpp +source/val/validate.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validate.h +source/diagnostic.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/diagnostic.h +source/opcode.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/opcode.h +source/spirv_target_env.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/spirv_target_env.h +source/util/bitutils.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/util/bitutils.h +source/val/instruction.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/instruction.h +source/val/validation_state.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validation_state.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_barriers.cpp +source/val/validate.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validate.h +string +- +source/diagnostic.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/diagnostic.h +source/opcode.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/opcode.h +source/spirv_constant.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/spirv_constant.h +source/spirv_target_env.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/spirv_target_env.h +source/util/bitutils.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/util/bitutils.h +source/val/instruction.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/instruction.h +source/val/validation_state.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validation_state.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_bitwise.cpp +source/val/validate.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validate.h +source/diagnostic.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/diagnostic.h +source/opcode.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/opcode.h +source/val/instruction.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/instruction.h +source/val/validation_state.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validation_state.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_builtins.cpp +source/val/validate.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validate.h +functional +- +list +- +map +- +set +- +sstream +- +stack +- +string +- +unordered_map +- +vector +- +source/diagnostic.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/diagnostic.h +source/opcode.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/opcode.h +source/spirv_target_env.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/spirv_target_env.h +source/util/bitutils.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/util/bitutils.h +source/val/instruction.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/instruction.h +source/val/validation_state.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validation_state.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_capability.cpp +source/val/validate.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validate.h +cassert +- +string +- +unordered_set +- +source/diagnostic.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/diagnostic.h +source/opcode.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/opcode.h +source/val/instruction.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/instruction.h +source/val/validation_state.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validation_state.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_cfg.cpp +source/val/validate.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validate.h +algorithm +- +cassert +- +functional +- +iostream +- +iterator +- +map +- +string +- +tuple +- +unordered_map +- +unordered_set +- +utility +- +vector +- +source/cfa.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/cfa.h +source/opcode.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/opcode.h +source/spirv_validator_options.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/spirv_validator_options.h +source/val/basic_block.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/basic_block.h +source/val/construct.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/construct.h +source/val/function.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/function.h +source/val/validation_state.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validation_state.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_composites.cpp +source/val/validate.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validate.h +source/diagnostic.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/diagnostic.h +source/opcode.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/opcode.h +source/val/instruction.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/instruction.h +source/val/validation_state.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validation_state.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_constants.cpp +source/val/validate.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validate.h +source/opcode.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/opcode.h +source/val/instruction.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/instruction.h +source/val/validation_state.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validation_state.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_conversion.cpp +source/val/validate.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validate.h +source/diagnostic.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/diagnostic.h +source/opcode.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/opcode.h +source/val/instruction.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/instruction.h +source/val/validation_state.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validation_state.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_datarules.cpp +source/val/validate.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validate.h +cassert +- +sstream +- +string +- +source/diagnostic.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/diagnostic.h +source/opcode.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/opcode.h +source/operand.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/operand.h +source/val/instruction.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/instruction.h +source/val/validation_state.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validation_state.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_debug.cpp +source/val/validate.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validate.h +source/val/instruction.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/instruction.h +source/val/validation_state.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validation_state.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_decorations.cpp +source/val/validate.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validate.h +algorithm +- +cassert +- +string +- +unordered_map +- +utility +- +vector +- +source/diagnostic.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/diagnostic.h +source/opcode.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/opcode.h +source/spirv_target_env.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/spirv_target_env.h +source/spirv_validator_options.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/spirv_validator_options.h +source/val/validation_state.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validation_state.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_derivatives.cpp +source/val/validate.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validate.h +string +- +source/diagnostic.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/diagnostic.h +source/opcode.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/opcode.h +source/val/instruction.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/instruction.h +source/val/validation_state.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validation_state.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_execution_limitations.cpp +source/val/validate.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validate.h +source/val/function.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/function.h +source/val/validation_state.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validation_state.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_ext_inst.cpp +source/val/validate.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validate.h +sstream +- +string +- +vector +- +source/diagnostic.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/diagnostic.h +source/latest_version_glsl_std_450_header.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/latest_version_glsl_std_450_header.h +source/latest_version_opencl_std_header.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/latest_version_opencl_std_header.h +source/opcode.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/opcode.h +source/val/instruction.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/instruction.h +source/val/validation_state.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validation_state.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_function.cpp +source/val/validate.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validate.h +algorithm +- +source/opcode.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/opcode.h +source/val/instruction.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/instruction.h +source/val/validation_state.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validation_state.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_id.cpp +source/val/validate.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validate.h +cassert +- +algorithm +- +iostream +- +iterator +- +stack +- +string +- +unordered_set +- +utility +- +vector +- +source/diagnostic.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/diagnostic.h +source/instruction.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/instruction.h +source/opcode.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/opcode.h +source/operand.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/operand.h +source/spirv_validator_options.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/spirv_validator_options.h +source/val/function.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/function.h +source/val/validation_state.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validation_state.h +spirv-tools/libspirv.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/spirv-tools/libspirv.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_image.cpp +source/val/validate.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validate.h +string +- +source/diagnostic.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/diagnostic.h +source/opcode.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/opcode.h +source/spirv_target_env.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/spirv_target_env.h +source/util/bitutils.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/util/bitutils.h +source/val/instruction.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/instruction.h +source/val/validation_state.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validation_state.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_instruction.cpp +source/val/validate.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validate.h +algorithm +- +cassert +- +sstream +- +string +- +vector +- +source/binary.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/binary.h +source/diagnostic.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/diagnostic.h +source/enum_set.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/enum_set.h +source/enum_string_mapping.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/enum_string_mapping.h +source/extensions.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/extensions.h +source/opcode.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/opcode.h +source/operand.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/operand.h +source/spirv_constant.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/spirv_constant.h +source/spirv_definition.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/spirv_definition.h +source/spirv_target_env.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/spirv_target_env.h +source/spirv_validator_options.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/spirv_validator_options.h +source/util/string_utils.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/util/string_utils.h +source/val/function.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/function.h +source/val/validation_state.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validation_state.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_interfaces.cpp +source/val/validate.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validate.h +algorithm +- +vector +- +source/diagnostic.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/diagnostic.h +source/val/function.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/function.h +source/val/instruction.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/instruction.h +source/val/validation_state.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validation_state.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_layout.cpp +source/val/validate.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validate.h +cassert +- +source/diagnostic.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/diagnostic.h +source/opcode.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/opcode.h +source/operand.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/operand.h +source/val/function.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/function.h +source/val/instruction.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/instruction.h +source/val/validation_state.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validation_state.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_literals.cpp +source/val/validate.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validate.h +cassert +- +source/diagnostic.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/diagnostic.h +source/opcode.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/opcode.h +source/val/instruction.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/instruction.h +source/val/validation_state.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validation_state.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_logicals.cpp +source/val/validate.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validate.h +source/diagnostic.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/diagnostic.h +source/opcode.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/opcode.h +source/val/instruction.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/instruction.h +source/val/validation_state.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validation_state.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_memory.cpp +source/val/validate.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validate.h +algorithm +- +string +- +vector +- +source/opcode.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/opcode.h +source/val/instruction.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/instruction.h +source/val/validation_state.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validation_state.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_mode_setting.cpp +source/val/validate.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validate.h +algorithm +- +source/opcode.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/opcode.h +source/spirv_target_env.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/spirv_target_env.h +source/val/instruction.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/instruction.h +source/val/validation_state.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validation_state.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_non_uniform.cpp +source/val/validate.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validate.h +source/diagnostic.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/diagnostic.h +source/opcode.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/opcode.h +source/spirv_constant.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/spirv_constant.h +source/spirv_target_env.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/spirv_target_env.h +source/util/bitutils.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/util/bitutils.h +source/val/instruction.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/instruction.h +source/val/validation_state.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validation_state.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_primitives.cpp +source/val/validate.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validate.h +string +- +source/diagnostic.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/diagnostic.h +source/opcode.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/opcode.h +source/val/instruction.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/instruction.h +source/val/validation_state.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validation_state.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_type.cpp +source/val/validate.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validate.h +source/opcode.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/opcode.h +source/val/instruction.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/instruction.h +source/val/validation_state.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validation_state.h + +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validation_state.cpp +source/val/validation_state.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/validation_state.h +cassert +- +stack +- +utility +- +source/opcode.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/opcode.h +source/spirv_target_env.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/spirv_target_env.h +source/val/basic_block.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/basic_block.h +source/val/construct.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/construct.h +source/val/function.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/source/val/function.h +spirv-tools/libspirv.h +/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/spirv-tools/libspirv.h + +DebugInfo.h + +build-version.inc + +core.insts-unified1.inc + +debuginfo.insts.inc + +enum_string_mapping.inc + +extension_enum.inc + +generators.inc + +glsl.std.450.insts.inc + +opencl.std.insts.inc + +operand.kinds-unified1.inc + +spv-amd-gcn-shader.insts.inc + +spv-amd-shader-ballot.insts.inc + +spv-amd-shader-explicit-vertex-parameter.insts.inc + +spv-amd-shader-trinary-minmax.insts.inc + diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/DependInfo.cmake b/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/DependInfo.cmake new file mode 100644 index 000000000..5899a7173 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/DependInfo.cmake @@ -0,0 +1,101 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + "CXX" + ) +# The set of files for implicit dependencies of each language: +set(CMAKE_DEPENDS_CHECK_CXX + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/assembly_grammar.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/assembly_grammar.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/binary.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/binary.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/diagnostic.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/diagnostic.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/disassemble.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/enum_string_mapping.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/enum_string_mapping.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/ext_inst.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/extensions.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/extensions.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/id_descriptor.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/id_descriptor.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/libspirv.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/libspirv.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/name_mapper.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/name_mapper.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opcode.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/opcode.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/operand.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/operand.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/parsed_operand.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/parsed_operand.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/print.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/print.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/software_version.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/software_version.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spirv_endian.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/spirv_endian.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spirv_optimizer_options.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/spirv_optimizer_options.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spirv_target_env.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/spirv_target_env.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spirv_validator_options.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/spirv_validator_options.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/table.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/table.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/text.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/text.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/text_handler.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/util/bit_vector.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/util/bit_vector.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/util/parse_number.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/util/parse_number.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/util/string_utils.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/util/string_utils.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/util/timer.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/util/timer.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/basic_block.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/val/basic_block.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/construct.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/val/construct.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/function.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/val/function.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/instruction.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/val/instruction.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_adjacency.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_annotation.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_arithmetics.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_atomics.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_barriers.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_bitwise.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_builtins.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_capability.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_cfg.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_composites.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_constants.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_conversion.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_datarules.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_debug.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_decorations.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_derivatives.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_execution_limitations.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_ext_inst.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_function.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_id.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_image.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_instruction.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_interfaces.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_layout.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_literals.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_logicals.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_memory.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_mode_setting.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_non_uniform.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_primitives.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_type.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validation_state.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.o" + ) +set(CMAKE_CXX_COMPILER_ID "GNU") + +# Preprocessor definitions for this target. +set(CMAKE_TARGET_DEFINITIONS_CXX + "SPIRV_CHECK_CONTEXT" + "SPIRV_COLOR_TERMINAL" + "SPIRV_LINUX" + "SPIRV_TIMER_ENABLED" + ) + +# The include file search paths: +set(CMAKE_CXX_TARGET_INCLUDE_PATH + "../" + "../include" + "." + "../external/SPIRV-Headers/include" + ) + +# Pairs of files generated by the same build rule. +set(CMAKE_MULTIPLE_OUTPUT_PAIRS + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/enum_string_mapping.inc" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/extension_enum.inc" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/operand.kinds-unified1.inc" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/core.insts-unified1.inc" + ) + + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/assembly_grammar.cpp.o b/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/assembly_grammar.cpp.o new file mode 100644 index 0000000000000000000000000000000000000000..e87f575f975537e22d0c6e48f76b61e333637903 GIT binary patch literal 345240 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 |{AkBmebFB7^ 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 boD}Q|(O^nCf7v zqp41&I-BZZs;jAPrn;NzVXCL8UZ#4R>SO94QwN(WG}YHsKU4ip9b&4;)Bsb5nkqIm z(9~h34mUN()L>IXObsnL5VQbW<}-%`|naspCw|GBw-O98*Phnl-@GAX9@)4KX#$)H!yx zRc7j3Q{|@4Gqu9h`KB%~b&;uyO|7*Pq>XlF^pvTmO+903lc{G-J!k59Q(k@BDeK2) zRCY4eugWr^l&v6f*@+T7Hj$iDQZs$?eMM^u^y{Q5{Hs98kGbP$Xok-tKm2@X;L zKfaO)_%pki;8#g2=>emrqGz1E5Yr?R`06=MnLz1GFcayf0l(gy367Ms?&8~?nSig+ z22NT>@y9KLfIs4i*PTWpoN>32xCO}|;P1L-0{+ryCiqMx`nkq{e}5GO{6)u%(ixZL zTT=r({7YBiJ(S*E``!N6t`0Cc@MmX|r${c9JX!K2$t98}N}eFeuT$d5h2$d1Qptsq z3nb@D&Wm?J-MQ>N`sF`bwuH^CYWCW_`xK_k!K;{A*US&6lhy z8Aw)>%t%(3tRY!bvX*3R$vTp|N$xILS8@-@dXn`e8%Q>kY$VxOa!<)7l6y%um24*2 zT(X7a-jXdPTS>N-Y$Mq=A=@dvkL13R`$_IEd4S}BlI#GdTrp*bC3nu+OD!A?}yrrfk7I zxM_ne)p8wjoJ98Cb|LO8+n<8@BLN>p%08etR5O#q;Litgd=9!lZ5JXk{{kS_hNxfd z0TglmJ1-r{)tji+KMA=j({a6Qd-rcf_l@7C%0XO)>l2)AhhW zdy?NX_Kc&ji=YSCL$WOxX_9;>$%^e55EoY@yJq27=$xJp&NUHFriF3kM@75`!FeL$ zv02X5)QIvH;IAS|+@jTJnb6tBYR_by^xkjY=VoX6hJ85fT8Pp&>(tHYZFx#kUzWNf z?>_z0T0*4}3Ylnq__?K>I|nV&`v_ zIS$T_P(vT!#S!P?816239H8kDdkva5K=g z5hLN_3NrqNsy6|Bkqpg(>MWL{G-uaC{wS>ayR)!P-mt1jYhL9I*N$W95!~4VFZ}_W ztkdBuZ|qDswm)UeySXiz66o(m;N@W>?5CwjtJLl8E|efsW1+N}H0%%%I&lfA;)=MYi?H1|npb5pbl$@G699}hpM_lSZ-eyp09mQ8nB~u?`%K{qb}-H#ng$$BJR850 zK6!qW3FeJqxuq!sm8h=1t!@Aq1Uza50Z*aQJhusg32+$%$4c5=mqki91lkI(@Ow)p>-co^gh`Igc+2Cy?@YewO%8*nGlU!=@BaBZ*wYP2IlHgy5-Mx z#)w@eSTL`%K32k?^0eCIx3S`|?@JKoPkbhVG2vSHnsQw{KO!Bu-()?|aOu&zdG!1wd zZW{2D8F(iIGX04_E1=sne}p6m`1?}n)FVvtlSpZP!3VbnM^N^WBqI~>m-U*8-Bdrn z7f7c0D{~no59XiX@lPH#=6UePKWR*}BnbFtnrZ&AWDxMD-_rbXw;xD*2oI-mt8jYl}rJ2dhNVaJkDDV}Uwt!17g;uxFH}pa& z^qoMVyu-Vtl+sIE+7e2+^p+B!|F*aP-rsMnz4v*{ku)<7e7)btu}5=epL6!vkG0oc z@8!K1$Ax#v&u8E#_04kIL-=w1E2Mne1;k29>G>GWhj;v;l>h4s<$gT!pD#K}C-wvH zWUYE!W4=>sEWI6{$Ft;KG&6l^(c4L9_8$!0KjiLb={xX=I<&J?9onUyd!(K-H~D_e zyZYty9Zg@FL~`Mm{}S%g;Aqla9fQ2t<5qX?&)~jj|DKN$ z?cY;H;s=&`0e`+7^Y2ftbxL5ml3u{D)cJhpO-S1)Q?QxSiNv-`c9?)uk zD^zX8d;D)n%sOt2f`n~M#|DsS z;PiKKV`#Wg;$Y&FS;Tt5WqUl^oTS!R`Yn89Hnna*EwhbZ`)+$TmbJT|rPt#l_vfT7 znEm&M1}PZON!*7)YI;|FuwVvhCj&(^LN)JpHM8`!wq}KULMPz9$#@ZjPK8oHCj&ve zH&n~jt`?U5B|Z-7V!)2-e!_s5x04Rq-h0fm_zIfN(#PT>PrDgoQoQG))E=kINotLy z7x0l8?G^bBe?Yw@3FT&lD=SXWk5-L1h?+~qog2l!Y#P~i92wQ#?Hh0F{4l2VyE;v zMvt_|UUQOKTfzgn7C#ZCKfeALfYecSJB&0k(*7e@k`Mf zzhseyw{sPM`zLt79s%I8^sn)e89iRIaB`*-O5`nu;x{y)LS%#!<((Bt?i2VApJ`YQXl zL3-ZNr=P&48M=SByPu_hY46{o^DD1=+>e-Tg8+BYb3XxaOeAiPU|f3NZ^z|d%*p}A z8NsbLZp!fy&JcT#E6_D{`DI&D3KS33xw}(&hc&Yj3 z`9c1{ky>NvPvg_aS^yb+6Y_nJw|kZ7@E7sxE%->?M3-KUck}qP`R2I*2)s7(|E-diw|*UP6yQ*VL0*W9i$YkDt-UUt#w_@47pV*!PCJ^Lad` z4fQ2hDf@q5-_hXKU~z8!pk2&woH1S6E$JSw;RSqT#An}(xXpY#{eqO_c+BxR9?vu1 zJbxPh;7F~plu=y!SPN(KY4Uv!W`W5i4=`M;J%YCU9BvXs@!#<}gD6-Fo4;E!iM|=X z-i?nmimP%+R`laFhiHx!@c5GX=6QhlS^6*d^syE;>K*b85R-t?Py7(V0OJGfYXd_g z7awt!yzPX2+x9zB3`mPNU-WP;!KC-FULJK+V2=@V0t|>!hOBL^x{q&VTXxC!J$<*x z_ZbY-I0uS>aqSTd6f?uhK#>(O1I79|P*({Tv6Go;{}V;_*pbq+)EZ0AeK>?nWzmrJ zaDdu#>Gxj*_yMl`_*QDmdoKMZe*<#u?>F)Hs+a!cR-)scOK*IUqTx?(W!ri#z3xSL zKN|FztsKDgrITYmg2AOfx7AQ^-tIS|-t`2)|56wdtj=OEWL9mt!+|{I2=t zc`%gw~rG|_gs1fN8+59{>Lksy}9Soi(iDUV&uMdCA-Rz!S9P+`k$}Vk$jUG znXg~Tk?Fbg23|kwrT_IxrU>RpV+sd2_Y8S#k6`ZKgV)R4Gt9A>dp3!4zx&yHaq?OG z`d7INfXusObW=ZTR?GHVQY=*Xy(RT`IQRCjRvtHgM8Em>m^n?Yv6SJG1%CN(AK$?t z|AKtq)Av>RCfGiiO=m1-djw7YL8)T8<}v=VX*#Qwrcbl!KZjrMvM=IYcw>K3AMQx; zs$GL@lDCJ|^Z1te<~gQ7j?@}Uul}g%L!|0HzLlN%W%<6R?>FW9jJNyufQ{4F>23H3!uUgsgxtRu2=AWI{kNLeq}Eva zL-u|{T`E3#wc7~~JaE$7kFQ|C{u&;W1)Bc%G#3!xbl_`=xBiK{wWr74x?4g9egRh= z!AE*a>OoEz9o5V6DIQP$xPJ5RHglRu`d9_ueI0{{+ath572FdmkS# z_yoEE(&33)7(QI8`X5JaMPan|I#eZ#(US&{o_-b2$~KS9mRIef=MCN-zKh5I zGT%HO=N}xYHI_0Kdu!Ewd@HzzzSqn5WZ$pI_bFhoFD(OuF%Y~xwwsgG+HF!7Fc=$R zFc|BX!F>(3yfS{+<0`jpu=Mxwk->HRi|!wtT5-+UurQ5&X)>k$s zcn#jTPxg7)FT9;+jw9A<=+#d)x2D!u`el4%I=^Zm@A;5-+N0?1z2;LGsgPpsJt-*c zc7JFe-gX@>-GYzI$lnw8_V8{VdGpP4xs31B8cSb*PamJ;@a+E79XL6QUrl`EMh<|t zhj;P#IrGi)pdOa~GCqBLQtEld5Ki8KU+=_6Zv1trhj;P#JM+zR%fF`9So&3b`uL7mlv2@hlZ_t~!^FMOX#E0%LnfIjDSo)Ue z{iN(cG(1O$21vNvq@xl!l!zEK*B616-b*z90IK;oJ~9qO^Kv4XZ4Y0;;~VCi=fS|T zl&J{%SOo_J6z9EQknYAGdjvx={U=HIt)Djz<5CNQblsMpv#`co2lfamd~>8idtDZY zlft~7H4}Y0)ael7&tP*&{~oUY5kAtXBY2;eW3@cKY`%H^z5IhCwZ_ta#;1=@3NYOV z{we*R`1P1in|hwjdiL-x9{W*jk6`RrdMiGCe3JDXWgPcX=-y|Vhf-@SeK9`LH7bK1 z&r2_TKpqrncJJ3%OuTv>^E%jL(V>t3Z67E8m3pY%kY_cY1Mpbn*QEZsm$#)ajh<%8 zg7hWz-n^oD`kcJm+kGo9{~uKTgg-T%C%$j80f-s@p})oV{VBfu5U$(fMst!{W9dnJ z`d9@

GR*q>;MsI_8(KN7;4bcW_x+@47)f&NaMo<8JUa2>aLT#;17seW?6%_{b!2 zyJ@msbmQOt4&V2u`11e2#~!k!;YVtXrQ1J)ZmBsE-Z;|^Kui@1#uc2WKfpGWVoW{vt;HH1XN5F!pSxyu` zvH~90d{)2tH=tQr`ZRp{SOtgUk5XGnfBs53y${7F@R7Q>`GhLvBRtCHo9A*F->Eg0 z*750M6*9&T9|FA}y7$R^00-nhC}mO;!50*#@qX}EH6Ur`La|5i#J}S1fC#nM`+4#Y zxU>P1-hK6RQ2&*Gj?Y)RMdV5$Uk0U6y$Ft2zYK^6X`1J8fHt#xSV6jKRt^Bv) zvaEa}Iys@LS0?O=nj$}o!1R|zV7#q$<^RZ8ecSFLFTV?we;OZYHSy|u<-NUMx#Cr5 zNsjO4@o(mv=fRM%bld091J;5b^nFmivG{Ll@J>Cj-O7<#o5Q`*0f)l^R4j>G&|2-6 z`E|Sb#oKx=z4Jxhb+5pgJtoabYVCElVxnE8w|5B&PG5QfP{;B)U;t*Cu}6Rb{uoaR z>R=8TgF1LB^TAv*_Q0sgky>MVm}oBoOuS()cpH~G;P5{%(g&EP#vWIh6JW@2^{4qV zX$v!X*dy<5W_lWF3lX*LIM0a!p5FUxcAUv=>=AVQBY09e&P+C@<2>cdc4mP3{t-9W z_ei|%Qb{*8Uw;7b9tEltIL)9;f- za5JCSvN9kz5m3DI|6rH6;`62+d)?!-sX&F5v$(lxpDl#Hv?O~FY$hse#+i&vE}Z+rU2*fQT)&Nvtd*34ElBe5tpGxAQ2QZ=MGuz|uNCeSA{t`O{-K`6>Kb!w2ulcpPn< z^arx0`=w?+$Kx~Ro998zEd8s*D*9ME-*p``JlP{a28aL3EWiZh{02qG7NzMgi_(ak z1sNO|3{@PUfw^$Sri zsW0-$4@&_~Fc04)z1qep*k%qA0-X2!V<27H9FZpwmImP-%=^8$L zd{X9;nZ4{04EVp`vcL^tQ{Z4bPIR`ObF~7j8F2g4%;mAGEqr|>MN9skRO;z}V_yLO z4s)7XW9b=uWYG8hzBET((34Klt`@l3{-h-+XnpjBKy0|_`usN|b$?3- zN)dj~zi8c)-Z0%Odj9DkYOn{;l^m%xmM$gM{ZD38^i77lHFf_pt->MT@P_H)(euSi zp}I$1-7LKX8X(ke^ZXZSVVb@)EjwG!!$u;hzrLiu7Jod&imvGS@?-ej^JTGcpW^vH zpx$rblYaXH*kpbWe>^Eq@m=_6`MXfQg$v#L38`r(t~|?L)d%|V^EO)~p{=}+%Dq(T z6mY>FJIzUIjiu6`Wj=Rlam)Mg8Xcl9zY(W^o1c^_Xzt!~X>lu_9Hzfa&u4!(RN)V} z3R(L8FD4DrXLUN2ithPyde49^)j|4PWXS#^GGx6ypVuM#JS)(iJ{50xHa_WBppB_l z;*XXOplsNc|1`?C5P_K?o5Gbd_NqQm!q1v5(johp8?v9q1$$)7NotLyGGuS$a~QIp z#cOoPJ|7t}T1(m?dj^N>Q~waE@TjYhrMn)E44LwcJ)fejzgug699e6BLf~Yf7&C>f5>wYLw_eUaY?ISc+#(L0ReN^9c${VI%SI_(37J5@KEG+%=#5cWP zSBJqEAD}mww42^!J@5XHP;J4U!qV%%lr$#q)|MKK^Bz|lJ=c1E<20VJ#~->;VCnm# zwcW0Ldm9}CNH3V59O9l!zx^Tw%ipBuThFCaTfg7dd9OKnWvcA;yj>^c1@7t#%vF8* z9kf2DkOk7v6g~5Le*G(<=G|s)POY)@U!u(eVYKJB%?KcA!bo_b}fRGIU7j_J>P+=y7RO6$5^N91+{Y2CI5hOp?1J%XK$rCYvi zrv78E=MaLl{oPw|vIE6W!$&r3Uh?+vP9DSNo9EBs9~`MQmX6`m$0u3OCuAT~Z{p?K z0p#|0f;ma8-H$s@GtV7v2jy1tQg7mooX1b5Qgl&J3wv=~V0Tfl#mnu$E&Lj|76W^O z*R%bp+kox&rk;Ck&-SC+p0lO0J-4HO+p%lsb}+Zlmh0t-t-TnC=WKftO0JY=wm>>~ zwYO~>t9#62Q425Ub{s)nS3S;@Z`+4*-tax&>uvy*fzn=3O8{a4+I1AGdgqw z`vvTt3I^+7+6>>J0ImowhXt}93vu0E&#VSBZjfxce#-Fh9Y>>6WZv@}St(n%QjRI4 zKOLiXn>;S_9)+Rf;d&LgSod>Nshq68+k5Ee%F z;-$JE6;{S9fa&$|Tg`Qj!2}-gCS8?V^oi#MU1yC`tZ@L4sZgAEw@VA=P|dVrA_mIH-{V7xLSyyfBdj1cXvGp3t-=!H)Ncn15^4~EB@ zK*gEX)d@V?e-b}U|`Tgod^Zd-hDDtIr7i8g;E6@F`YS9=Mr$Rfpp zvsJ#-m2v)bsl6-}9S~%aO}U|$&44j^`wSj?c`AZ$Wbj{s8U%m=XFmqg#Lf~Gj>Ir6 z=weJAxC#6lKZHOCQ$zNvX`TJE^cF)?r1AE0&w$D8A@u|l>5pmN~ zKsj;`r|VK^pq_gz2ON2&P^OUc8oV&PFYvk@p`T8;M(p$7BIPenp|yO`YlGroU3uQm zxG@bj+}8!Snx!V)^}N@o%reDT{HzW=J7S;@79qidu51l2Hvox2|L^v7vQiYLe?E8$ zuhZ#<(_B#MV3FN>BZrR|T_*Gwg1ZbTy9ND=!6j6{k#m#wOOZ%0G`_*t$Y1-X1PmQMEdOQ8o@GzWw`C7)@ezAszHf^CzAN_oK1eox1KpNajBzt5_{ z?QPGtC+0hTfBbj6y|>1mkI%>bvFnZ4?}M@5@%f4WhL$ICJTvmkNC-k@-y1sTX}mx2 z-|_yHV$a9nHU9kJ*!}VP;=kkb8?VorZQ5$%<1ub8m~UX%$PuqE{yTnuynpfE@%esQ zR88?hJ6cl`PI{qg?Cug9N% zZmfPNZX-wh{`mOC*Gs&=6Or1W@QVE&js3nZ_WS18?|6Oj_Qw0W+3%;v>W{<2-q`i{ zcx?7Nj?d%wUmdGIK0fjL*SK3#+ z`R09xz1E_Av*l*P+qYOzs4 z{A6zG&OOuB>QZB0qqi0~L9w^}g;$3tcMJD}^O9gr`b{xl+AhU%RhS zE7w=|tyIeM<rOL{(-zYWl3)j%Ldsj++ty$Nr%hgp=TdiK2E6tZHr8&P^ zYv@(hR7Q^r&1&7BEi_7g^J1-JE;d(cOC{SXeE}P_v{Wtfep7$pT*=p$qTmW`T&++x zm(edYHFyFmfbX1NsT7;#YDMdi8_@3pfZUdp7ue9*mHGJ+tHN_=Ub*Nun)PyJLGLOy znsen!lTF0JDOM}XFOVxcaz;5*WeB3rJ5 zz?T6qOcs~^XKQZQuKkNCoRXCE;ldo6!253 zlo~L+3U*!1#X6RumZNf1s^|Vm-_1GOaIxW+>U9nluH!-c zsF=6QT0<%LZ#-^)eGfdj3bRXmJys5vex(7JAq?Voa3fY7Zf#kOa#yv6)l*^XWMLZM zL~~&I0btOh=S`{91L>_m`&XpH#cxTa-uZ?Hk*Xkm;p3^)%O1p`mwLj_>`C>$`e849 zMQUqv>l+@iCtn_4dFjh~-}ut>o*j3MuKvP0Ri3Lx1nxy_fJOecg^LuITy1Q;+pLruW#xz59Ar_Tp^sgT4E%xU%PEvwL59 zMQ_i$Qu7Zye8ppW-twaKkV37j=`9cA+W&uF`cSI( z7%#s8&;GO5`|3w}`Osh7cdYkzHn8`nexrBc()WcvJ+(7EJAOWWeP8dw0?Os{{82pp zuO8a8U>@%8@ZtaTjy=+Q*CXjZPVE)p`Fr5$sor69Hl60BE#XTy0Z5+C(yigrm#0(j zeB{C2N8YNy5P9MuFZIRrGx^As;YU8~rCzGw)*CMVCZO=)^d8>+m~i>WQn+236KUzs zr&4C9(@*9zSB0N>?Uktq(^t1N_I?6-Yw?4r)PubX+JQ*tF7f{DE!F&K8nsLDw(v_| znNFYKd}UFv;E>x+!?KcKH>t|G(vPiUpW;PM{u(@$xc zj9<9Q4p*cHuW^GL!8*UZ#g1a6__sKt0vwUS`>9mwtunUrTUQ>@CPl8lopiKjf2sG4>D@c@Vx)avBxLvQGXuO11V@Vh#sPMu_<>aF>pk1P2>f(6 zu*wtJipZ4w6Nl|dEyMPAgfaov$RPhKUn0O4DSoXRD*>D0R()CrGN{|k@9U_a)Iy?6DNf2ucgDxJBe_nQEabo$VatzS%E$$BD_ z6Ck7Q;rBk2PW7Hn-^$w~bqBnQwI&zWm4|r+@0D>1XZGmCfnPsi_Vjhv^u7_K#zOjO8+0dOu=;s>*0cFC24-n zO-H2VU*D1l%J&oSTcO}TuSk945fHX!Y@QHq&j&pFNMyb-u@5L3h!lfrAzf^EfXL{4 zz#+p(OaIXgL!|g4T#G_9M2f$P89Cd#qvt9R*1G3J8he`^>ByUZ(JhI{&7ecgU_?gx z9h?9e=t%MBWC8?~BendI+ub7r@wXtHj`uF~Jmw6@3?Wk^mwyyw>S@I!&wRpOU44-o zUQF_qn9KjZ@zX~dwN;V1WDX7*@ybb+t{g5m?gYaF{D7ZD zyR(xxnaCgVL*tM`;+$YC2FHfUGw0ChX>!rpgIj$cfv>MEH}-aOfd=5`J0a zOnx(aWVvv`Z$Qd{-sk{qG@!MncDiL=PEcOaJW*~ARaYPo(g8T+1W!h^k<(5eG3BM~ zRDQp|tQ{QUY^FGH5e^oPY)>D`$qE=sI zF<#_NQj7LR7u+Pq<4Ef*`HY_(>c?8k_-;{6oyIRd8-V0NpQ2AJM_HwQ>E4yXQo~;@ zEagrYv)OUXYUYrigFG~RX&O^Kg~br9DuZAsVIi4;t;|6`kMi>c3Zq!P!nFV%78QWp z$2x87-ftkFunZaNTyD9rQ1bj~3S9j%ijHN>m_`?;&IML-WCqNwT-cHFD1(04ny%bf)xjlgmouV#W>K}Yj|!X;h~ zusi_73LMf5-Nj`^gxvX?GE3F-0N7a|zByEW*7S%F^}Ll*{bF7~tg+r&)^)o63N`@J z4nCBT?e}%vVQZSG0U?i+OG|UuBT99Hmb<`o7^ggT*V;v3+d{pOog6NQ7B!c1MW!#< zdx;QbBg+r^UQxD7j%!a~L`pXb8%65DS%R z)345F+1%xhr@oK}Bp(#K1X#ifj%YnH2O>WQ8s`f&+3-4kPY6uoz`W`e3pHT0dcmwD zvxVFRy+esx$Yh~-u7t%a;4mmkjv=#cUBF~k7D{)O3g@&*nZrOFCFr`Al$645oCA%t zKbt)W6unaFd~x(=u!>0)jdOo-crZdl43~;k=)XYkP2TBGOlGGB$A|styC<{$Xl@$6 zM*ZCQboOL+%1n7OF(;JCIaUF($cKstYC|8`YhfAtoxfaYm_BxZLomGnNX)N{T?-*v zu5>(+vOozi*af-cdP0mro3v{dT1dVppfblm5|-~Qm(JI!Sh=`#C-k7CGhHVaYAd#* zi-o0me}1W2X!`S|rrYkjSRIbET`nzG>lgiM9Rt}qHQ6)Sp_%F2#JE2;F`P{tp%G?z zBnH=E>Y^=5-;pk?uN0fvWztwfKtR(_vIg`|YvV>H{i%tW@!{O~Nz*)lMRsaxV#*)O z;#C& z^f|&18!8BXF!+f(7r6UY>@YD&yoGJWZZG3AV<)h?v}`~5iJ7S(>_UU%CuasvW(}vL z+%vHStU@50;9|}Dvsg9YEx})dg7rbAkew$&QJF%b{Gq}%0G3C`5v1Dra-(#nTK87a z8O&s%p}0U0{^?Uw{xY|ORcr}F6Mn@nHhkEW6k$~u^JPR4NnL1O0vzP&MYCD}h{8QiH?L6+Svtw~`i)2}Ko652V5c z@Fy_XnCBnt39LMGxl2#>W-dL*pmat?jExL`1^e>JQiaAElT|`o9WO`6%!*oH)I=H6 z6kBH)E$ZQF96)Z)=Dz~!3;FO2@0r&lAYaReltrZq9CO&L! zNMah0>tefg@(e(wa@$;3!Io&ul)xn|FK6wruXi1c_UV$LNrU~Pisr?61qU^|M1FUZ zWrb88bM$Cf9^>vcHxb~BV8&f)<+>eM3crnEpVJAxQ!IJ17hrc&Yz|+n6kq{FGaD@4 z)oK|QLT--9YOIHa<9nKL7v=e5QqeA;1d(hGgR&AxrZaO`#4vDTy<7vuJ4luVRG6UMneqJ0sCrTj&Jwu5A5#xDS1%f~TYXIBR2$YbJ z%2ifj^+@YU?D~2+2PopEs+_)bc5`_wbssJA*hG}+skHrA1g6AZ(;!;Mx+mO1e1JZL zw@8>t1Bb~TnFrJ3iTEH)4Rl7U1Z04W)yY!xG>n8xOHc-3#_R%XC~FL)V%g#b3<`_o zCD3HTM9Z-C?{_;|h(dud&?;sqh??N;D(@PtE|g(`I*2_3LhA-pC6v449EO}V^eE7F z^!vJ>sAx1v*%H!Qm|Mwa;&p~s6cNMBm=!E^fweOG0V8o94&BCZcTwBHI+0u;96KEX z{FrX(Y($Y1fd(hY&;cDWGMO=mWJV~fpc)I@aJ{%lY6_^J1LU8{geh3zC_Ah{MqfuL z8RH(YP-1zNgJPDQy91h#a5hY-OngKC%cE2cbWL17n~7 z{1+(rpc%7z#V&f1>6cx037in6v_h9cOgl(>c9orM*pj3*XePmKJC~)TwcI)kpPQv+ zZs5>8atCi=CGQ-Z$_<_v&HB0FD5}hZ6oR6_Xtz&@wfzb7?p)@OckfD7*c=F_6z!4S zH1b``Z(H#$7@;LyJz(Mdz$$(}xZ`r=99qhWsFz^MT|FPjsr8YKG`=A9sWYQ0+v%qM zpO(>df?dcWtHwc~4GOko<>z6aS6X;yowjN0qmGrN&Qd)qAYX-MI;s(j!G<9mLr{^M zP~uVWWETtSR&=Nc;;;$P!?IC$v_pCI7a)Em{Q>Dm0|MPK`nyorw9pjQaz{w}pi}~Y zJWDm8bj8w)$?T?>ae$I(wb#I?U#69Xs3M~TvROy1WWVUB&}~#NsL}Wk{z= zOW-xEn&yc0mCB8*W^U!&KvdDd7KPQmT7q*NjBKV(X9jqsR&9X6gxskKa#@7e0C@~_ zh$b^24@NXEOevID5Z_VAGAEA~mX1-GVz`V1a~Ba-IK6TdUEU&Uv*Xu0`xjv8N~y6@ zT*Qe#3#m@2aXl!aE$YBr zc{O_hmXnU2QQO1_cqvF?y#NapqeD0hBS&ZjEAVVxF>)qVFv0$sLy3- zDA~%jI=~*v-RX(hAIOZxA|?j9PU&3>5*UVJE39jlyGUnF)CxczUSnkzh)wY%t(}FQ z4fQQH4v-~85t}p9>Rt*XTsws@#ty1ui~*sq(LkG#+*AjRE;p+yOM&T*ftXohZ1DJY zJ4oC&D_{fYs}3*#rh>o_WQ|`~xu7#JQvo}N?V0lb`>bSBR?YgOnuO;f^1H6FLRezh z0egulL7Q5U2Ccl6veiktY+{UT2Mtc3J_YL;p%Mg?PZpYsr8+c%z*UfQ2{|uzL%H!g z2S;D<@1+D4V_~lomIWDYJdFuIA(&BcHjXgv{n(X%F_t*ibbyDN@jzk|vfRNRcay`2WZyDQ| zl@PbX0S*`j&>yTX5Yft>-X8PVg2<@$z(P#mj8yaz+lXSwIuWfLHtaZUt5+wdvFJi9 z^2t$uAjUOIQIuJhqW;zg4YW8VK~6)QrbKkscc&A0YP; zBFZTIIAE>XWY0H{DQmO4X-QnOfHB0(5ddhHFE*P{cRbvYB77QQ6iVn<36B*BM^@wL zV1C+n8Z0uott&P^gh!~|(q*^~!cs>Nyp0k$F>vI#dJ8pZ_vXpyL_Ly*vm=8uqc9N) z8y5_L93Do9p#qHO%rx&0L||fgE%VX=5RpwG8gS})9vP>heaG<-n*_@(6V=>X$#z~2pHOq~dzhdzunuBg+{R+iFVEvlB`apo> z$wZZxSC%2|GJWl05Uow0K&5cg@B^#PV+=(J9~C7VXV^jV<^~26I~QzQU9<=fnuIbP#=W|wq3Tm>eQnlu$<8&gQ*4U!*);E*JjN{u)-E7a-W z0kYQg77F8Q6`Rhf) zbve54OooU!pzFzZ%CK~W^PM|~%oq7k@n46M83rqGTL5at7B8+%az{Qwy4#2az-l0k z>C_-9Bx5)|*w84PCQQTz*3VM)x5eJMR)(Ji{WHLZ7=JWXGfmX2#34%)!41JGk;@Ap z%}}JY5Rjk_I^}uTiqfHPl5)RAXxmHmWBvQZ;xh2>%^M^3&;Y`%EZIg}t5pL;5uM~= z-v|wqlR{d9da>%v621+C6%X7^|Fo$Xk5~2O! z8x;{w=G8Q#GG|0h5vc69s;Wn8<5E$r5~D&lig5xWa65G{VhOfS6mBv}uI%wvRb?V!1Q zl%f(67S1>Q(U=hM1tQ2YL1-_AtSP$VjY8ZwRpidw7`A2i!naLmcGTPsxe^x5_$FRO zWJuvXp=c_3Kl140WU=tP?b8avYOgR-)_n`Wc;r32p)yJyM_fVA$O;2;ws4cD+g zvPvFRdPr-0G!_mvk@E?OvClVK1;~OA)_Av=`0Emo$=pnQDbbu<=-hjLRW%Ug6%UE5&w+Pl{!O|MX zD#9r>hn1H?L>OqnfjV8NY%Br1A2O4eX*OH6iLq3c%O}K|Bp3!jR12|uf}1FWa5W&> znm-FfPFF4I5$UuMO#uCr!9;a$@4-sI(ObZUh;GFbD9mR=q@t!aa9f0ZjK~!YQlKZGqJX*3WGsZ-8tsKF? zIzOTCwjt(RssuOi5DoXV!JtZ<7%T;Xtz#M(YYWz)#BE`x1lk$4Y5!?C_9*+&uH~l; zQ1_xx>!hfXlg?&Ml&hi89x7aJ!SU;foGF>ZS_&xKQ5lIPYlS9()Iq`KjEQfz(|q&g(Y4Sj063kUqI2Ek z)C7DG7;z{!J~E-x)J4s}{Rjk&mq5 zP~d?MV-~3CFwL2R*XE(ti?lxTa`gBqLMelxl4AQ;(4jnluFyKMGq7!5)f zn6-fcoR|_iisnkatyP5VGLX3!u$c0;GKL#O@mNhQHWNkz`9i^VKDIz&e$C!`JSfC5mhDn!z% zRb9vKLA~^_;UW=N1FI(lZSlZg7Q;p6%yMwCkvV7<#AWf_2La0^7;S*}cJmcdK~B_! z#tUNjkTbFKYVHG3C#bM9(w^g9uU6>{I9Do`5w})D1?k}E{+7#Cz#CKFVZ#2=w5GvK zRd!)S_q#(F5m=!h?gxTz8nYa49uyi$rf8&NRgX9xD@lt0db`ON>ORo{R0L)LRbolP zsAbJnJP>X5VKa}L`R|JCSRHr*Y-Hnhn7}yJv$=A9dD75+MvedmLGYW7TsxbFGl~^D z_VR5Y4`CdjbHIdiSb^~7t8C1svKPELkIhj)P5DS7+@u9mgw2 zbkrpZxj?XNQy5t8ZxU(}l3yS@$X;@6sa(z%5Sv}>$Y+cld1xkNCo_9k@gi_)H1}O> zNlSgSloK7VkLN_gn*<=Y8UX1AyV*D<;bGp0*2v%LJ5l9k0EuCf7%$ODY{#HEBs7dj zi70XE!ahUUO5ml_;tW5E&<{W+h}8%O=49K2*kk}QY2RVOWE)>LAAw+DSgJD*VnBjG z&p0KqxFj$rP6hahdJ>tsLk^`Fc7P$(MRsEwVqyYjLjgV*hfacg%!*wuTC-9?_zClB zVqn!Y8+dPL@g6R^sDD9=M37_`O{=HK+3Y}&#GtFqRK$@Q3kq|=Ed{7g9dnQ@(xGHs zwq1a8++mKMOtO#!wP6i0@_$R%W_?`;2t0FuT)i7Npb+Te?=+!<=iygxq84}61H)Ja zQNSh4H@KX+GSh@Io}o&2*z6E;jIFD%d5wy>uvcSiY+$dGJ*y+}s4xgd4lMv`ER+*N za?oTMQ+o=?%UO1I1uoW>Oo9?~`E)Qx5Hm%DFU}0IL)ps!l#B(;uz*o+90ZB@@yTlL zq&WorkSu7CY-dOyw6O<`5mbUhfEAsP*RdG1vbU(%lHP$~Y287%B}Y_(@k|BOq*@y# zP(l0^Y`_vQk1;ZQcmyFpgC%&J8nxAo_JA727z3NE1~>p;NHLhHx_OpnwG#QjT`-2V z?zh?o673q)8I_WEmlT2Isav<}3C?w@8{_KmfJYLMcA}wC$bSI{4%Y8WOFI03m(W^G zP$I!D9d4Ld{3gUGyyr4L%@qUuHDiqKH?L@2byQGU00o9LWKdl3%!&BojSk*DF(cOD z6Sa^zlko&Ybs+*r%|nJ(W=j%yQp{&(kr;;gegRmF6Jn>*LVlCkg_1cxjC*2)FWt;- zP@8u4IxDdYq8Ne|xh$?IOgF|8*YqzjbR;q}&{ld31~N!1t~<4@KD9+|5?bHEk`(uv z$Z&`-Oj4bMfQhTf1q|zWA;o>pIJ?QPpi3@eEcD`$OOCl@SjeChmr}Zj!Rmxzy;@Bo zs7F2Uur)yxdM}S?6~UM?1frlnGk_gz-a%9ax9zQOJ%qvHmJw&~ax@?ER_ATzAR!x1Px=f&#aJtJ?t{HvlU7(U{X<^X zi_NT&V=%1I!bL}JD+?Q}Wg9<5NFc*&soZH~sjx6apE&JI7i2zwM9eBcBw&jd85`=t`UB<{ zyNWKj+^N%8z?lOPM&D7};ZJop8U zrSaLF8PDAb(gczHGa;wqaB1LI94_rotl0 z!6XTpjsEtG+t`-QWV4|F*|G#pxc(t%(Wa|daIK3^+!erPa?!ZTtOX;mpU;u z%v?lPCIT-Njmp;*8yQmUil?sjw~JM~o}mCd#Z({zD5p9;KZQu8UBAV|_W<0&txo}E zGs+R@gi+yS9@{~!2PHfXz{f(t4L62@A>9Op!gy6y68SxG91I9E4O6AEV(IM=458KZ znqjDcS;xe3085c^n?X)NIHIdR!dXl+R;w2Ynn;|i-cXFr>O^!RINQWbPe~M)U^HyE z+hK&gFm1odOGTSD5C8Z%YY%U7gvz)CBpX9!!Ok+vkS9zpMP)t@H)Y_G09=f zpr{YUt$u)x31-1&1Y)^~=-GKS1AsjU;z29qY=~lz;ewn{qRX8Dych+*eG9Ipxki?m zWfa<#Ei_!D7726&1jPslF|#sExYZFRhKq(^x6Ze)?zTcz4nfF=DI|I6V(~f?EKE)S z%`!;=%ZlM=LbFghMqnJ{Q=FShly+_8cnNz)<9Hc)>3YP(i) zi2KHfPOUvDgQo3qQXqlERT}Pp)+A+QIyy$Nje%4IHYZDUaxsHVSXs})1-GFbj2rtF z@uyJs2xuGOM7RketDtVsT>udFf8&W^Ox`6OGF+zV@Co8swsA5w3RdG7osj$}(xDh? zHshjRA{fv3Y+4hs4!C8>C^(0dNkRt5EVWqVZt4gbHGAcBM`uYQR|zv`17te@fqgCq zLb9bS1EIK`%sP>ZKoaxRy@6Kna0lZ;M?q=SdVs5QF#~2<1C}w!@trfHrw7NuY{AWw z%dH#WF>=KKA}l%(Jj1sJ`=PZLkV_II--biSZ6GE>h9h#ULWE4|bGwZLmj8QgBXu|bul29HF-pf=suojohCmhD3gE>@x49i{$fahGW z9&+DqzY;Ck*{tfqj0d=K*)~MUW*|;sq@~YqzS$s;%Mx1yXPS+`PP5FgC`7Gg2wA~S z98|1c%UYfnprOKB5PzSVD%XC?Wwyhe3=|=tv8(ekD0!?><%$yU8mt8sper^3BxL6i z8M%n@^N<|KE*B+xHgnMkN#*FSgc=Hn%_i&ueqe;VSjM5~B*Gd-*KG`~YYuXn!Bmjs zNc*s^Yawo#9Kr-}Hq8jccLo^VMKFin)qQ4W>&{|aI2xk|Q z!q9Pv2`=YKfrwybx#9qB&z|5^7^)D86LND3QcKd|u-_4pzmw**Y=PE}ZXK^GozUdL z4RR_WvOReVqdx@z7=tAwRW+BgiDxhU{)BH0o64M$ml4VL=aQwsi2XC*$zH|{6`Ew z9Lc%~ThFm%9+z0?(RT2)j9p$l^4LDC^kl%WwsUfS;@Sl+g1mr96SbqAY*N84#N1cR zemOdeG_8Vvfmdj}} z#!CW?D#;yS4F@8EJtm>#q~-F;!lFtRLh`AYMPCwo!4yb_jZNNY6xp3PSiEo{LzAhE z8Z^UayeuETo|?A^a>&vJ96 zQo3zHb2#HC_wd^;967Y-(7>)e3%mAUBfYIC56J04Wkr9?Pv(Yp?U}Ds_mnOaAqAwQ zTz}V_%`(oQYA&AJ1CN-dBo)Tfi1NPx(ho8vP**V*6{cRlWfwEw7>T;Uw3^n^VA^Ei zcj;bA#;Hw+umrkx+95ft)gW4k_#~Ew?qm-Sp#T*R=3oSf-Ke>l)irG|C81S<1JZDA zEIXc;%N8r zo=tG(Qa3I)N6R< z#i9ed2{jfg?Rt}0Y5k+JubZeX0bVuEu7abIni}O+5ls60WROOLexjjZxfKMB4(#v5 z_93FXM4o~fYs;8u97=1>AVA?1P>I;@$4#dcAU9jl-29Rg^R3zbqB${bDO6y}xD47G+9Zzs`kQT3T1eX8Z-!=6Q?5poI5CTEeQS=2SVgl&^NGkT zOgOFdb8IDK5CSE^>UA9+5_UY+PlhtPO_*Ak1SbUU72*Md?Npqz8>us4!4{}9VdfzA zH{QNQ(7gL*&tWyqy|7%|hn(oE5U%V4vO9}?y0On+Kr*nE*?sxR+|-?Wrm-zI_RUhW zxUV6>40JHsf#o2NRCwx=h)`=;Dv<@EOFs^|h(x}KY(ixlfi@KB8q^i&0Aqu#%Cpfb zwEe4%kQrY9ME#h9m|kDPDA7l(l!b$N%qIva&$p92`i7+Pwo%98H8Y z(eY>?IFPA@3mWdU4H3WrxHo6Tph}$eJeW|4Kc)7e6Ui|;Ho=Mn*-$B%)zFnt$)lt(OjPi)hS@eow^o>*%2bw~r6|6C;QnJ(V3C<6K}lb@HlAC|PoGN$IpiB_v5R z2m%=(AtXTS;8iL?R@ZN%_kzKoi;onyXY1Y$+C13~?a=j0H2Dk}w+==ikf%VjIt6a>!{nYhOrN=V;n;#7Lh%2ThT-o$nXl=9})Y=R3JQfSQ*z1<*TBS>}Goc zoiZrVqX7mJtB6DoGzi_y&9d*}?U}<8JxF>5Oe0Cuo!_AePo$Ph7V_3hxZC0zaLca! zvCO+7=7@WoIL#309=eLU83l}o!#Su8K7AZsC~OA>-1Kb!uMz_qEsLxu6V@CO2Q(6% zG>BhCm)lkG*_Z7)*n6SAQ<6R8S4%3qH9wz-^^I-0QHMs-MN91_Von$E(2bmo5a|-j z`9?xX)k@fGx$Ag)rx|dMBw~czq-A&{;$C2W4muQzJ(=H5B2c-g5Q+(xId@%d%j zym#}`D2!=df;gWW7%zrdUBQO!5UPiua)P0rjgJGv*1|>Pq+je@nWH4A_^!iW8cl}? zeX;Cu{n8dlw~#Kt)cV!}FeH0O+g-Eq`m6&9j812uUK6!I9=;&R11`8w<K& zvcopV^i(Sdqe(|XZflY7*&~zw2(#ym4Njl($0mle(7{N8WYSp&G^Y@nVIw&RK`*_% z4ATNT2rB=F!L5Y%rp8L*<;u(;Y{?S0m>W!T$s4h|)@?2fU~?HY)B< z22P;;s0H}e7?KZH&l?3P0Y;UM_eFZ6PxITkfjlX zSMdOqxk_!N32SDAx0kqCGLBtr&{)AB_gd}lspT-{Hmy7LiJ2TN0btaLyhr86*_8^c zTjpJ2I_m+#JZrK)u8)97YT6|w;vJ?w4P|*z8=B)W}7efT< z9a8aX(O-mgy$*Z{Z8%Ns6xgD~c$a~V0L36@VBHYGbn(0g2J@Mqq}|SVH+&76W}`)| z6Xi(43;-P9u);8If|JLql6@Er4FNy`d&juzE!o$j+}$A)enaXF9M!ytKUGNFY^cyt2V8(>`;O{zVt zIy)f6uth@&1d5fJu*AZqA%ZV9zdf&*gEl!|WaXKa7H1|Cl%@iZBW9QNn3q!;lqlah zq%f)^lV~dE;b|**zW7T{l8wqO861%UnQg`T56(E}yqs~ci;YUiGxWI3ihDbTt0Up9 zM4T{oO%#)l!{P*ZP_ZOwX^0U3BZ>Zq>q#FWx}Wx$Qh>nG=H!KQvidn|W-OZHxaV9B z)?#I(Z>0-opd=nJ%a;P(eon*&@eWoAVaZJ+*OjH7Ak}GGS&w$H!7D%>?&d^MN|srK^#mgXwvuU}WIa~TW2cy9kbLeP)<_{4`V%+Z zknsSOB5FX;DgMk5ogfpf;L1c5BUSd5ix%Nk^^J7(IcUzW)WiZE3niEJ>$DK47` zoVn-9aK}lIVVX<^+41L@_!w#y#zY&Ha$}K7@@7@N0wc1|vFzBy)ZHTW9Mzl7>6fuO zF-F#4;}M}DUs^_U%0&ohRbZlQr{klNsRc-f;J9e_B7%=D=Nv2nh6?q%^`B~odmf-5 zmtqWoV1#6GHt@~*MG@a9e(eB1^wTDUdLctsh#8LVz`$Q1CpMzP8CQ|MxgEKah-m>_ zqaY8_2(U0M0QsRpXVpO&G?%>Hw?+>YaG6pk6&v!`%1klJB1v!6@17jZOTue^;Gjg8 z4IIKV2M3K@(4=$SApNaPeJk`q7l^=_mnne}bD|Tr$gGCi#fe!O1nCsF11^pRiKeWd z$_~v;_+-R%?!@q={7@Rm(v=QvSi&Bu-*0X;HV z8bkK{cnJwM1P=#-YDVp1UQD6G>Wpx2_Mc;F2tQv~YG?()Ge*H4*vziGU!%jV0Jx5d zI9ptD&WIiHhn+YpMAozP?K@+$6j}1$X8S0sn29MVj8O>#wuZBQp#h`W2~a;_bq@84M%+TAVRnBK#)^r$*vhc(CqTbpNkT}AWdttV<^_^1 zEW|`e&gdXSsD=lH;RY5U@=L%b3*;Ko;F#1m!Ge=2B!RNjNY7?<%`32-3M>C+qF8VOW2i7DSBfW7n(MGs)FsH4K)@+v2b&z!qbFNh?1X!!-JF4pgx&i2(1ei zw?RiC_BST@Rm{|Z5H7ft794_~D3PNyMN|HbN8-`9LsP>F9d6Z&$Qg@h?p5%Yj5qBg z-#9RkL{OkfmYBEX*0lkH4_WipQiZv-{qlV7Ors8=IRy`MehwZCI3?C#S_`n`WrPnE zw6Ih@SAzK|MZEnPl!_!mh!hFciOO9RC1e^@g0k$h#2R?v_u*@1;wUBPSphmiwc=G z@*>uT1_olSg!=?wYhoPnRh5F5hZI(G$kYSxa-$||0Xx}RBr;q>0$doO^n^yn8JBEf z5?csyQju!|*)ENxy+V==HRzQ!6{x~$JLBeT-Sm+zmL-vrWeA4%%82v?(@H2+th(zf^rF~B$5T7(w1*C$q3>px~m{AGGig5<6Q}u zkJJ#y%SdftXas=`CE?iok3~?Qe|+66Y<#t2fY*;L5pref0)om&B-+XlZWx%n5sC&y z(ZQo@pF;a`LJ-v29YYTAywIS+8&dcd4MwQ-ZRYPKYl^7|=K;^opISxNu?>I~hKS7s zO?$FL8%;o5!=>{DCR%4!6ue3B6?S@&e2$RiG~MssR0qRh>YXYf`BudXr$-~@QQ#{! zkbbojBuo;L5KNuTl66Xe#NCW|#C*C-i;YlZCC;+{pI_n@KqBg6VdmIu^@y9gQqp z!T|MTEA;s;Rx@FDd4+N1CC;IEQ^c))jpRF@9UB~<&JE=yz)1Wix0wzO4Q2Cr|9LZm zqq&hBLQ4yr=CNH$P~JIeXnka_G+pj2+LzE}CeBw|`7y%A11%yQG$ z9~oKRflUDH5bEI@LH8Z?P2}E*SpshiGGT(#ERA1m%EElJf{5w%@v$gk;gQL%_gPMDx_i;-F|TW&us~ z(wAOr?wP2W*@qbh@D|o6*lL&#!lAfM};Q~IkYC@1b}plG$NbrAd7<<%VBABHhyYM!$7bgBV_zY4zCqi%(bgORfKn=Ltz`3ZpV7EZfPYi~77Q42Ec$gtD`6T=| z!5A58)t@KE*a%RDuvK7Zz>X;}&Nmu3&&`Rkk(LX1jX--Ds1$(m1Xk5x9%;qsb*=k& zD-5^n*pw`3KuRQvgsDljelcX3#+(HlX4|)<9f+M}`V*OTD2u8q!WRLex}Z@4OfSPA z-DScd>B(6BBxC{8gQMCg((2rAyU*2Rxg)@5STESAlb#E%CuS4pC1MzC3}}ZT*Q+p?H&SO-*4;vP<~=lugHR30!%L7_ zVlS~wif2UM;6x=nwl4ZEAR35Ccz%R%5~$kT?|z^Izx!CAz64tCQFG7{unS{nXiedP z2OLduYOxoBp zxylLJ9yVae6%N6^j2N}`i$3r;I&R_(D%=kVhv*!0wJ=8VF$9I*|YWVR)= zJ2GLoQ<7G09eVf05T6>mN0S81Ei)!1Cd=@5Gwwbic*?>cS!(8FwldM5q zbdM4Jwb0Z0vUbQBu&=-xppF-uDo`+aydy~EAf$?T-HsZ!7pjts23JVnV0{K2v$yP8 zZ> zL^vBM5-~)R#B*-uf~DI6CX)#{x>}@sC#NQ6CN=bhW=2_+6zSGb0%|$O0j$59F*rZK zLA}U1(i>CQNo@4yUY9z7T}+1!o67_sY^U%jG)Mpw*1G-YApNB&Lgt{83>fE0SQ%sv zyFx22P_3G`>SFg{nJ}}N#_Ui~PL}FnF4x(y01P%Sa<^*<5+_LXO>8eUPjM4@(QvYp zV0A48b0iEtBIr~zP6AQ(Lg20@?PRORZhvof-3NQve7E_3^FY*wnO#uL> zan7eof)PU@Ex;Mgf3R=PiSV$nbc_L)jodgvF3inaq|KJsaNY;OmE+eVn1&kjV$EnM zVw~788nB8q{tE#}(11;FZ%EWiV-87Hu?~_#Fn+Ev%4%$~vMAXR4xNRVS?E_-$ay(r zpm;qyJL=U!y)3pgX3&jYh9%1&Q%asnMB4}CPzYhuTy?h*CPgq44=`vEF+kDy76=^& zLI$rTBkWUIB8_ucuFd_)_)n}{pfyk+7X~0T;L2eHeGn`}V^#7poP#;l!4feMJz&Ze zF~G_kf=*SLB{P2UxM`XGa4<$-2eEJrDh^AL1g`Evq)-SARgx4qTq@y>S&K_FED<<3 zJd7*|c}P7pK9P)AJNsKa+F_z_hEdKs5TnzWZv&4RT}A=&gzXgiZr>u zr0Nby%vq`wOTI}eEePvTvv0M5>$&;4=)6e{UC#!8qd2~B90}t12Jjx6-#eXGM_`6X z#v?IKt(C0@w{q`RGEsuOHmh)Kwt0M98j=vHOmECqa=9Craw)ekUIA+1{z6G5+GO-V zL0dQP7WZgNq+1hG87~OAL0Q8z4~DR$-+dU?iCUo}c9dZ(h{)G9s(^k5>!cLO>Pdcf zL178kXr%lM72o2<>pV_E%kp@TQN&ofuOcTVHL}=ZkyZqKz6h=YPKxsk>lH=MGR0K4 z3JQfEJ=H*MV?ZM%2iw9(Zl2!=3DVSROBblT<#{Wm`bFdnMq65N@knk8G2)ysnojHq z?HtQ%Ofp&YGZFI;XLZpcf7m6vmUY%((qd^+>f+6k# zre1@PP^u90gz2<9-(3l*mL>qCOAAB?!pzfJT^DfUBr_3&v|+SxsM-vcag@$nX|)WD zDT1o5nS8i&>_^dPXq#-p=~0q( z1UwKq);@no61mIE4vOtTu8Z)XR6W98@URI7yy}g>RN8~M5wKtF8WtS?zAU0C>C2Ff z@IORiQp9t>@8zOdY$B;7GBG@cM&p*CJMIz;Rb)GNy0G9%7qUjH$G^|FW>jj`*Mg(e zjz{8aL@d>UEqVm(7A?R>R+g54Q^0EeK;{ z2lj+kR#7LmWLWP(<{w1^?FR+snzK2&4SCSj!fG(|qH6KF25Kj54b~?`%_DFuQ%UoN z)?_CJM@J{7TQ|Vb2^a#wC}?_W!k8s=z_WGYnaQwvEwe4l>DzDnE(l--3m+>(sIUzT zXEOVPh|(kpo%2ToZJW*A3M9<>h}?2Z#GcmPnVZ8p#o~+HY7tB44sTFz4oWmRk{@wv zd*>0~;*(^UDnd9Og|tFgG~lH#F60(+Ep*x0ZW0eOIar6AVJwD3#86*xcvJl2H9THhl?oA^54C_N^x( zq{Wd43DtNoIntwnna-iYO3}VUD=Rj3GgKL#FV-b$l}HuAPecrzJPu-4+IViuy7tgV zfzF$5)Za&s9$P9b&(0NY5Ynh?_3!mJ9tX{yjH%o{m`uu9T3;v(#8inmBddDzFf}cR z${YCM=VnJ|_h+*jhQc zP*b35(18h<#8G&SELrE_xTT)vG4umbrHzNZ8Fd@Cg6%vrm6$R?5)+T2(c(8IW7`gf zMdu_rE65H~b5G>-S6El5Q(hNgRSxDKHWYyOJMS`*vx^ zqXZ?`skOR9@pj^xi2FQce8ylBucv@nnud0-0aelRNU1bOAI1c{FgZb&^QpkiM%Pzt zqf!1@N487DG9@|C%1!E6wdf#)(Zbx9{Cz3+e;4@osC zWpxR@b&}n1#{AVfUck_DX|#@LFTIq z_HaEK5&MlU%NB{ior6=k!4qKWt??|O^(5_zj10AlRydi-ruft3OM(SXqW0T3RO6b1 zUBHOZ??&wyX`a+EluH;5YY7Q-mGm0WZ<6anHZ(`IwTNhGlP1#)QG~xxTd@IDL8QT3 zXddR>=S`w>EA)~b_5`$?=R|I;fhm;Opt(E>)$Ug3z9PKwwFe0q{wHERi3~h1F)ztU&0}Aaz_(pedw_llG!)VsCf<-i zrohw)v?;@z59NgH0=f%g4QW&5ge^a(O?K$j+X{>;t8>pJ4&a5k;65(=xRu@_QdW`lt#zHTcc^QemOduX8h6t=7g$ zNW-N+P4BT}^mlyM45GS8B_g|y(lq*94mF&p!Wraz!VW#08$3Bak%y13-fSpf7%xM- z^1{+|b%ZNeT}c2y0f@&^9f)ElS@LHrQua)X z`guLA?j6Xp#cW=9CbGM0GOxq_aBW)Mxs(ZQwXtopc1m+Yysr(7s3%N0hi2uGLlEN-_ z33}B^zOwE`-_&4J*b^wObRsqh$_sR@+!@1)A$b_XWngcBGlNl*%62HbuZuTn1OaxZ zHsPbp4($wcMC9HSE$n}ZdYB-iNSo<7lqE? zG~Av}%uHwf?D){cuy{a`z%&thhp@R$SK;1aE%;h%9LH7A`zBG^pYYEcC{Vi+r>^E5ad~8328@!AKmMuFCe!#`#mo znMVG{p{&!TdZn~9j!g5gF@>ZQEtU;Z)%qdFdwJb@uADa3n`|P?$xfg-U1qvDp=6z)x7q$nMd0{28b# zV}1d`tpbOM6BxY)M20UzX8839L+ZxOc4X7o1Xp3S6jyaP9!P?t_W0`?g!_naX#%uR zFQQANgCUou9rPz?hLyD2D%fbGuaKbB8234xX_J@@!*{vkHi&#qV@pV&e6eL}+4$Fq z8bjkt-7u1IY{tcYGq-i%z)Mwe5E>E9qNIo~TPNkZkS40QpyWMn(|7zPi2vb10ZS(h zKHa`7Sw+dfQ^^=q{oPvZP?Z&3nFo;@%0U7X6|?9A<1?Z9IsltYCOlt3h))yP+3c(c zG^?9yG{de+Py-W*F!@7%yTTyFE`5Xs9s(cfwQ9M{lqQP*Xx-Wx;7DYvCJ=}xsF4}u zWf4c{;>(EAr12YUb}bX82g_7lszt~PqzOTr(8je{c1tDr(Dj?y}1Hf=wo33*k%FPaUTr{6+VGe*+M2fyFhHGK{3^&QZ zSCC9y*LpZGvFrI4cJ0gi9nl`z;IILy&=Q;@(;rT1hryI^MTbe@MkU06U7&?_h@yy1 z_y(`;M~=t!m?ShLKG%YN(S$BUF56sKmNxI zr4328D8^c{%wX)xU@(j&yT~+S24gof_OuX5o3A955?_i^kw_&=s}@mNOPe;dh$L6#seck6i`?=1Rud2%~KIRo%^iJ8GI&pM*_pHoO zv>1ubDWRHsf?1&w5(w_9j&orXBJZ0{is=GKBU0zk8FQdL_^}&Vzr7umXpK>Lc`v)! z@uoMdC~_0QrV1KOw(lxHUNxJUcvI%EWmDj3D8cTh456gbln|P6IoQk`rFEyYJwt9E z)zHozF}asoqGmmoX>OQV2)y>lbV|&^GozwlB~-A?r2b$2CRuQYQ4L)o)*Ri=?2L|n z*7&bU$AA~~GqinZ4jFRC^u1oEc8Y1Hn62_n$C&p}<|aqC@e~`hPB7i9Sr0B$$g?b> zG;Vju<2s9VwU^_(BK0>+Dx+mGJXt!daRbYtWHw>}5;Gk_OLdLWpGZp-Y5%*fZ7Iog zX_MHl9Tj1*DRG?WLQSQ~qw+lvN|}ywxQ?q9z@xe^aW{%ND2;}hG9qY}wyW!?yQtf1 zQE_g@I%(VU_U2=P1#+Gzu%%9->DBHNc!~g3nn5FMT7qy3oQT>=vJRCu;qfZ3;2>yji?Hf@%OgSpgnH4u(8$?- z$!7|L*?w2-Hf(yOrUgw!pq*dRQ|tn26EBgg5u2g48u2`S24>M@CJc4_)(A3q^gsigOejHqc=WYN^ zGbUHOLb+37CfCc#ex6iD>c!MHFo|V$%^yVm5Gszq$yY5U@ z1>53@2S&-(D5;zyxkry~G;yPAAKHVsT}m6f=W8IPEg9G~!<%}X-p)-9dmNTMz=gAd z#&G0~VQt(}`RaS%asEw1&fajr_O-XThL)6NrRrgB>bKm?@Ak}VPJNx-&Cw~GafyGR z3oSRHeFdoUXn zFq8?01yiAiOxx}$sfZj5I9g0rb*gX3Flkmo^UP*DU}sjS43V`;v=)gLD^aSZh72`p zOdQfUM%WlD#bOSPT+lvlaCl+UrffrT=W=wjQ-y2V0Q{d!3pXi@M$&Y<$a56u)P$so zN@nW~O?Lsak%CN247Oq8QtDy7Kx-z#Q5*#$%o_=v2o<^CQh+sV@l<1x>BE==&n5jIU)8&O;;nq$jMg=XfjaLIN?RxjD^GSBKmXI|KylI?4qmaFcw z1FhGB<(Np@W>CI1eKXri$fZRrWfvW;Bx4b7Te9=;+?tIvpIKJb+Lz>`61U?sc1WAM zg!J+}2DJ;?*x_TACJd2{ydzD#86<&br~!+1hcth#!xzC zVPqnuO)5GPLyIRVvv`px?3+Zs%SR!lvsFS$zep1?Vcf!+y=-Tl09E@-1yAFBWNd4Iv>$YG#W#7Qh|L^kSY9KsmMt(6S>URMm^iu%5Q91)(FRT z&wIa_O}(f^Pjk-g*^Y8lT!E|M*w9r`W_VEdx6VhxvIeFwOEPcj;w_S}o4SOW&v250 zwmi)Q1NbZ=#d8cjAX!82#5 zXw`nMn$4+pjnLKSmKdFC5Om}kgnE{IAb7SJ!5eHwHO*EYAp(`k8iu$h}~2Q(ne^1jBsGjC(sZ{22t5+I(plrQH&BX~sK{1>#$)nI&KT;{vU1xZ zv?d@kv(FgBhv*KIwxN;42P!5`FiVIi`hzxn--ZJ1YdLr%oxf>9F|C)h70-#`Avnfn zC#c#)AKc%A4(_J*CA~I4tE+PQn6owm!A%mxU||E(tPKf{T14F7gHlAkJM<=day(Mg z(T3jtX4SV<9XbcFr`?K)_fWA`IJ<+o`HPIo#%f`roDA%yP4|C&UW)ay2B5Z zS|ftmIJUsU!}4ILk?b75qY{nAP8gG!ZcTq@HuW`V3eR%@lnm$8 zh@gC7C;FRNY?P5H-W_k{7xodZAOCf`Gw;@~{a{YZ)Gn>p- zl@#_`Nff+A;4aySY;B?`I{Diglua@=aYx*tpJJIB2HnjX{9$BK$;fIRTd!q+KIng9 zJg~;h|8cQF4MAH7^5LRhBo`Nr{0D8EdoZASxusX4ULaa39s&BEan9XaNxzzB}D znjuZI{T9xIjiY7n<|IY?0bV~li5CReNIa8lc*a9>YFj10g|93lN9r<%q>NZ9jJ>gv z=CS{8RRdX#QHwL*(Kn+9L*%3%aj}h)Mr~9F2Xwrx z7V=Cy+&S@^`H^i-tD~VWp662V5VOlCLv}z=%aG9-EM&;euJc)}eKg5$nH4o=sKp&T zyN|5#rcMe8(Rc~b0;G4ZM?^b=rVJgGGiHb!Rd6O{j%^ayoEAAQbtbMXTJsT-&2w~~ zU1TY{m10Pyw+1DiWYi`zHCwjKHba?#n;lEI%@$sb6xweJ4aG*(#HEgunIzk%cXH>1 zt~58c9;JxX$!Qt1Utg*{LXM_8*uOMZo15M=HQB-~etejpXQq*wH^lyDrbGu#Ib6mR zs72i{%d`UQURrhoU#Csfo|yz02*2{%f^~^l?e}=hHIPy>_ZC9wsgE8b+L13Ga(&^ zmX0@X;3oS7P;$!GNQki$%CNt45}+A0mjXw3lggI2nSIIhF!j*1ZaNC?FjIJQtC21k zw9}-`xg!zVTfA zG@G&#O2kTK)4QM6P?toX7h~{yMLh@Gt`-|iO1}1>uphDo1|wx z-IyZYrpsUzEVI~Hbz3qknvR`an86hS{cDE)$h0JrdZmCN(?ReMR4V#n>xbOh7g^60 zq@~UUJX?4Iw!s%%-NwU2-tyasJNwBzL(?2+U?w=)^*E7R+lk%C>JUqP13MAY`^qFb zF_5QKcI(+##yNvM!UWnjb{Oq5N$07DRHM{8p(qLlu9*iYn-kfh%q&dekhaZqr?D#Q z^Vl&dJ85(Qj!}zsHiS1h+}oa~08tP!xu5{gs|nexgry0vGT|U{6u1)^X$G2^|4fD! zo7QbG^`%)gcCeh0T!!T~${B1*7a;MI2NLYj48!P9%q+@^G|P(efp+`zcrVrHZYrnF z5GN^fOgVi<_F!5>lqnK9UP5K#Wk1{X~Tw|$@T$aVgx*194W{0#9oeB4$m4&T|;~NA_p+P;J zN-4Brnr3tw({t+3(7QmOL)*4ZE7k0sM$75PS87zJew})?<6_6#+t{09=fAslD!RI#`PS+;$kGe;_ zWChIg2MnjHzWGPpM+cw(+i<#K%|GfsGU#5x_=~O%<{x#BYUAl|F78cT_wm8!2a3C& z{+q;oko$a8e^37+alguSzdopcqqrx#?ol1Q=MRW`bJu-h@cF;Ry@BgKCg@%v$~Xi9 zapoWW{!u~q=Hl)bzXQd+vHN^>@cEm>{TkOjBj~ z;_mzX(dNa0Kr!==et%NXf6c|cqw5~k*7M&$alg=YPvqw-5xYs;hljY&h>mjd(BmR= zg)7r1=!Y$NxPK|`)!pY)gU<&F8;3xky!l7Jv3JnDQXcND#of<;H;Q{m8cLiIJ&ayq z;_y~+AMCzAYLNASaerLgOStZxgZ|qh?!8?1sBYf#Uy6Ib5ci&*d!UGM@Q>q4;@;B; zY4}8S^`37n?tXE6qqyf5$G7L>QkxcliJmWTUnara9{E5yBt`~IBZ`?rbvHLkl; zmK+lIIj(!uOfMdbo^Koifo$`SeqR(<7A76m6!(U%``F<7JBqtsSurdR_u1k;-qjz) zFEH<4A@0|@?n8s`-zM&vA@P^)#or-uzuJ91J@|Z4Q>oK6EadsY-t#rZy{Zw?@JR_i z-%;HC;%}I^mv*1OF8KUxara9@G6ZTp6c68=HswTyek1eZGBA|7vmf`^KGlxc`!e{u1`Z z{^_7z9`4=6-LIS)EAAED@9P)*zPaM=mrhoTyZzC0=7i5qaj)*`PYvq-McmuD?zaTp zOI&OmBBue9PwI(#b0ehhciNQQb9ufJJu+6@A9B+mrJ?BiY%;Xzc)rN^^*de=_eg2L zyknQRU*^7}!`;y{3P+!B-eSJvl*ss%*JUpuA-dX|fAl+}5^O-3=NpTABtIDUe&X(@ zf0DTSrGtfeJij52_wN(;R<8dkoK5${e!sZKyYAzH>7cCjxPQB_vAFxC!+zrKS6@yN zcfUAZDDK@{|3!83!heIfS8?6B*=W#wPA3>VXc=WhC+hD&$W`z1{N zpJsl-uIRumVa$Ay(Id@aPtU!=rCRj(W5Ol7c>FoxHg4!|_19~{%hIp8l<%j%&3jF{ zHka~a^mmjKFV+@lCCqo-Dt`rkhEPBia`@_Kc6-F~n*ysP;Pm@GCT{eX6gd;_=ITju zhW{WQu{J8=-wR(V^49i7d@$V``6|+nwl*W9h_2|sbp8YWjSk!ngm0q*vwZmMF#fB& zH$&cQ?GPljocwM4^O|s5ju0O}_l7q;k5zRSjTg|p;d6u!6K;N@19P0a;GfZfyMi~) zU(tbkoV(zk(E*c+!msGS+;B)FIxx?N&-dXAeE32i{;&^Uf8fJ+`tXl@_%0v5$A|Cp;ih&AzoG-5hC?FJ z-pEv_b9CVIP#|~FfiHddS3dlp5C7VSf9u1)_u+?q_z@reqYwYthadIfrnL}$MF)A*n#U6%dN5y zm-DS5$2x}aUY1`P!pu#MS7a?8tw@e`J7?=Gbka9&#=607~gDphcI5altG=scuUJWhw&WCyM*zzmiG+fM=b9Z#tn!L zbO}rU%p+ow56>4YA8mfZu4vB+66zGKlM+HP=?~9GMkG3LK1lLyv}ffBb&d{Dr!c}5 z9k?(8HTtO&6XA*ugy&x)799xBzs$q)FLRsu%%34wbiihs5N2+o1L66dxlN1_k;OSeDpN- z;ouKsE-^_@|q3A%HFj?l|^&RteKJtk^ zyuA+(uQyqLM<4klA0A%MvYzmImU*&|p78pY<-7XGck|)hefV`gyoV1DulJ2$bil9P z@9m?fj}Pzb!~6O0{yzMAA3nf`5A@+T`0znKJjI9K=)+Tec$yC%?8DQ2c!m!j;=_mf z@L@hY(}xfD;Uj$bNFP4RhmZE*V|@5nA3n~9XZi4KAD-jG$NTUJVY~@7m0|)@J+3XV z1k0y+Tx;}!#3QxpvaI|qp1hX$^L_L@=c8x6m7nhE(HiJuANdZ{q>JRAe#A?XyPpzS65;yO?M&y;hPdt)8 zYf=-_$PW^EZ5d<}k0ifK)qbUEnd|k>sPPiEQ4xTI4ld4J95)ejo7| zXWUb3&?*%TzgONC2xv($!t&cauJOLW^7$Uumh0D+&+@p|9M@cF^e^x@eZIY>TD~xh zZ?}Ar$2A;^P*Xm}8DCcY$(BFv$?Lb@V)k5ly7t0HwRVgf5Xt}XkKmWRu4w0xc?uX>8c7(L;@eeY#8 zjh@%T_-xCc^|-!wx8-k!@!x#p+fbJ>CJ-L)6D@zo(^FFZT5I{+9?y`!qA8+d0`GcU z{olp%k32qD{(9c>T^?8YKP}(maUG!d#o}D#tkEp2`C8K|A8m3 zdiweBdo14>CjX2N-%h-QCmsCbV=I5e1C$NzRfQT7G0ym@hGz@Qk9+cV9yi_HZTW8= z*LeKU@{=CdkvTeYm-PSP@%Hl9Lze&Lan-ZK@_imJCVyQ)4WvlvIm_~YJb8`BHJ1PF zanBc(u7S~iI!r#t@_#+9{@iBymmb%6|JU;1_-reY=t~7}j59tPFZ^lCgX6QR zKZXQi0>SZF)!*Op@N_uY^6+%H-16{v|IPB?I4^m_UhOEs#{_{aJUH%5%>#QKvphKNTub<+P0f2Xbq50a-Zaa@^Tm^v2gjo+*zI**v&i|hBk`EP zDUp)(8FY8Q<$riw^U-$8gX7v7FNG*zV*-D9@|vz1SstEWCRiRE2Uk7sSsonkzEU(E zwLCaJuJTPTk zXN*c4IXPu$R_drxsabUfkEMNKY2%;d*d`H9Fc+u#-hL3~P$`D-yxoJ@-66PnX>wd_ zins5a-I-?W7}|ksve|1eIko|9tI;KOXy)Lq<42|0ZJv{3>k;ddk(F&Wh%_>>bl)Rm zLZ%1m+r2ovt(J^TBSPlzptfUZKL@+bkbSgqggwZ~cfq}R<5D^#cWaZ7oRUI2c*fPw z9y@`ypUj~h!L#i)PTu~!_As8{xh>s0^T9pdHZ`efBWat9NL#7#HopEZO^%DBZGhd) z5cwq5Y!g6!K245mID$gV_qkj*#EWa-cls;s7d5zhybWF2+O%`;kv%$h?MdMh8c5-O zO*A`*CnnOlR*7b>CzE&@1-Fp&`-nJ-$Be!pP4B;bC_S|9?F^)YEQQG)d{%M8d+!pR$8FWm0nlkKJ!Bsh~mS zCLc~bbjI!(r=G;bt|r#&1rG!=dx$0WOym?5vMp);(^U8;yDvINDK62Zxen$(Ie8{n z4xY(~G9!`S&w&e1k}+oklR6UFS_l-}-i=Pt!k3Ow@^oA=gt z?M%Stnf8JeQbRbZ`^?L{{HBDqbk2HPj`mnern>)C%HUKw*>X(QWZL{U|0#g7a87JP zPnYcGNZFVU1*I+bX`4;j23lSqN4EbTOm|R@IcZPxb{-oXn{SeR6APL$owQFedyZ3O z!v8K+hWa~SWs^yfP5ysa5apQ|{%_|0ILZJ2Cw*rRYfK0p))-ciLhW6k67+1+Dutd+ ztN)wOI}4xLkZTkSIa45eyBrRq{ZnZ}#fE0rW2bk~D3Ojg?wOI3WIJTRoeWbFRg|>U z3!aof2lPeWy^q8i=qBUobOb<7Mv^@px1GGPXU#>QQBBdXnq(*1AxiJ?!7A?sHO&-T3X(;%d zMicboIS8eoFY}=+_)z4G7IfD`fpXgvHI0HQpC@L*0aR2qN66ZKQDakwdNG*P@jx_E z8BAGvBA*xbK5?UJsn)IMm1}g$q&k521oybsbQJmI3!8%I^^p!& zjr;^D_u28-R6P`X!Kmkr(zSy?5obI``_)EP9NM8eqcr8D1L}vHdhD#K3rPl}CywfF z>rwJ)SQQ&*>H#q>c5C0hCs_u1CA3Ml#tg2udZeY~WMyQeaGh+X2RL;VWzxBnRYfMFA?JofJ~PBOIL@eX zRiCy)PozwhmrvrzHz+ol{ z)&{ZXq-E0eHl4}ykRQ5tj;m+l#d}C2CREj#yd}3-IiruT5g+>A;3t^0=6-^c*7EfY zxxFN}FNmu@c6|0QtxRZZ_3ZXzvdkGLJ|$xC2vRE9=o}aNH_?n`*-XL!Egc4gT1{vtYwhjPJDny=i2m*dx`lX?OUMNz}>WVTbVkml=HM!41B1awwX~ zIcHKe*_MOt+MZ31yKQV}cl4|p!0m#5I_vh6IZ%N5>e@{{D}TktnxhHW&>$L3voXvB z;nz>00n1>M{;Yh`F04V}-}s2{HO7opYt4TKX`&G|6zn6WePad_$7D@R%}P(A;}H_O z^-Aes8kFHD@KA$Lj^Hs#FDy5Nr+8y=h*gUNsia4=QSMpoO@lMPR(^YK$2rMEd7E0# z%EE-Fic_#rFq{*+iU1}7km?lr2ag~%? zc}`Y+PNTLKu%~?|`5HP+A>AZnwC&f?QLg>6v#6m&2T9YZT1jMQr9aIfd1Ng!nLaZ+ zg>%Tr%n=zp?II^GmZ&{!$J%GiVU(F_ii{s2r5Gx>w>-xcMe9QWKV{ z`6VV-7O2F{N7?6Cjzh;JH2i(c#|0{AeP8C)cKPsmfqY=hgJ~HJlm5&#iXKC&Q zm2$=)8#KF$#oZL6rqz5l^|h&>*=JsBHnv`u)DanU7TUP+#wH)RUg$(=5?)QV%m@j~ z3~06++l|eeXYF0GqDkv1AHf)FdM`SkTf++D z`~?)H`dkX)MovNORDfqR(BYLWex;umGWkgOjp=}7dm3c!13LN8XwH2enK2~ioGGLT zp@ue{ByEq&&b^#F>pl)xF!J%;PT?C;X|>f%;}dP3`&TPy##%m zkD#%mTeb{}TvG&<`na=CX-w`MbPGJ=nOcXaer%GGlumue%$&(IKuLxpuPc*}kBn6k>Ou!|jpfG9HmBxSKKx|+sNx?}p>-uCA&R+*Zsd)%t4WB0!L%p5 zSJ|wWl9rmCLGyEsRZ1%Byz563-1!<>j`e%9?HC2kW8}Sv{?4tFMb=}llSLtUhE;Z4 zeyVIzn_COO*x+&-{dRhmJ<@Xf6l%@8p8~aL{^~5A(%}^cpewH$*{MR~&s7)A(aE-e zpoR0y>Pqipyd<17d^luuN&qsMgpZ`B&a$!S(1_fa$$8W@`OAf|q<8H2oZNMK{jvh} zCCzG{{B_Jai!CglA?uaZe$|;5@@FuG$CEv)4oX`!C~ApLA#v6X0m`UBbzD&Rm57uT z$qQ#bBgoC;5qoX9<$LOdd-)y}d1*aZT<4}LVriJ$M^fJhK^yt zx8BGYXDSuDYQ~fT5v#>fqt5mtJzob?SH3?dr13#TiMDF!(>(Qg$6AOMG7y@fvdH}c z?wwPW+{B9^X$~1%X;wyB>d4g5gEP|nQoXULnMiYTnqL6tmeWE8>w@i$$T3Am0xHlV zw3!@FA5ixn>mCw>OyQM;YQ;8+9rZMymL_Vnv~ff|3#%SW$@^P zZ<$Qt=%o*8=?%`ZLx#EL15ZBhVhKFpJ$W|erRh|XH&b&mtd^uswycX>*cltD4K}Aq zXGVoa(hv?U{~bkJ0gN9)DKx~!;mFn>oiQ<(4I-!Xkc2LYJfA8;Qh9gEE843MNt0)7 z&+E(vJ!?-6tDn!R+@R`*%MDZ6YiZ%dcHZfPihYVyvo_w0yM@H-goy2{GmTiIH#I#y zOZ^0e@R@hyI@18XDaSiIQJZHngL8nO|9}1dyA(%8=a)p+>&R{|w9}pU1 zj_{e}h2STQ>fYIoIpkA8q)(tc71{e|y9r*k2%dl`NQTp+oUx%AhK2-mm4mYQKDF4vmuKzEN4!+l%{-N@X9d1tlP(DDoQD^pE zSta-5fUEp2;3|I@xXMp50Y;bk>E*olDTnuQ_%{yk=kVu?ST$CU8*VY@Mdr8r@IyXa z_unzEH@nxU|BJHv03mxyLnXN{3!Jw7vlne6XfKtg?ak~(+gjO6Ic;BLFWqlQc_-oh z&{imcMI42tNat;jSZkn`4@Z}FnQBl%D>^;fJuAiQm#9#4Fmo&iv=bD z|5f;G;JWkMLg2dN)(YUdqtpiAy5rL};H~9;AMnm{e+YO_xjzNGpWGLfa>m@6taF3# zvcS`X*91OPcw^wY&vHlL<3zq6@LPlr13p*yB;bz=pAGye;R}JU6TSlY7U3I!Zx_A| z_-DfR0slt$A>cm*@6B}NT|V65S2=o29##FW{AeFO#)q3ct$N&gHp}7Fo%d!t+zsa(hig4)!gIXC z2ReEtIJ~UGCpp}Wm&p#-eH$@7XuWOt6i43mkDGqn_qyrLeeYC94{bYWFMRKH4tLXG zJBLqm^kn+*dwuv?A6}Srn#=gd)vr4yBJb!U@1~!d9e-9b%IPwCOc}4~#Ff9zhfnw6 zxBKur9PXyK*$#KhlbH_JeHe{D?{qkAXK63P=QzBV!zViYMu(d{)Af7DI{Yq&-|lcX zU)OQ?-HyDQPVRB|C`aDa&G_?eG;2 z|Ipzp9j^TjlTTfFw|sNcVP!{;X)|hkx%KiYhc|ZQpK-VwZqNDf)ed*l=kpGC%cZpr zclE#E!%f>({qO33$>DB2`-;Qe_il8!EAR4}PB^&bts6e3O|AY(b>z1?Jlo-~IefOm z-Tb(~;cmWu&f#u)*y`}t9sT?& zziA_x%jnrXeF-F&*jk>BR{Q~USE zpYJ$a`^|>C@p7Kece&~9T}O}ZV{Y`k?{GI?>~MHF$DcbL?xx!h9bVs&|H$EPyUvxb z>&SoX$h-d8<#1Pz+YYbl=yB^`w_mf@(c^}L8;?nj9ygu1<+dCC?S16SIDDV;Ue`bS z9iCtRRC4sY=}PxuH}Pw1ty*rl;r6M+-SX{#!`*hvXAXDc<#QkY#TjtdKVLfXZn|>6 z%k4*e<;c7KIp}aV{k#1mSN>~9-u2Hn4tM3xPdT zZs&>oh4lNF{B3?Nk-rUJO8<|$n?Xt7YyQiiH1Kir8R&lQM$hB)zxqS_JBBZz|MjBd z9PFj<9dHqS99?RcP+m$ZK#fP`Z)~#SfgAb9o-}Oy-%Sj-BY~@Y7VxJ1`Mvi6S9xs* z>U*zS$%0zHD{ucD^KGE#${QH$1)hG0!9n29q%qKXO7)-A1k2v_zIV$PEPpZZVdBBE zz@IwG^0k0JTa7_H@Iw_DbO7GI7lWR_AAXYcrvR_fmB9$$u`L*wzN)$Odv_k=`x(HO zNP%klXy#J+MgQUZM}V)}%=`)9rQc_6+S2AyJ!J;){TslqeVVyx1DH$Yzq^8gDKlNJ z`b}Bk@}1W*_!oHp$_#Y;PW4}TKJyAup?Xw42KZGSS-uJIFC;u$0iXOW>(y~Ueebr) z%x?hsXHPI65B%%m%%=i>q8|Ha9`M8_%+(&Q?@f~Tz6A1vK4ATukyl|o9|2F30$c6j zsz0Va%l`uMj}&Eo68Js;@_R3f=3muQq$$gn2mbp-EY}G5=?%M4Lox{^9I20l5%wb@XeK3J`H$w5&qs=fIpkV^0R1*Mw>rR8z9I1a(qO*@SbsS4{E2|W96<}-n>tjPRs;BQNKt^}^~tARI`hVXXaD!&VO9eM9D;3|I# zc(*njo|hM8|7v)udlOT+(%1lDsY@J*%@OjljtDjyGg zr?j8D0snELRTJm~eDZYW!-0SD5c6@s`!r#GC-CVjn9l`%&*RKj0-y9J^VPt=oWT4I z;LV<3{vPlp3CzC+-sNrPM}TkK#{7KA$HsXn{jc)HfUlJDAr|=8ud$w9z&lI-XdLkK z=sZ?)O#($!&BwU0w1}IGSpr<; zR{%e{nEk&4xXSMVK1J*dr+};czrcTxer^RZY-xC^d==pLr?Y<&fvbEn@a)nop9%c6 z+RVoSUnA}CJAs#wc$o{l-EXYt8Q?1a0`P%Xar}M=T;=xxpW2-D{|j8@&nw368gA>> z@O@3-Dqk1)05Je316TQ;z+-!`|HlJY`I~^h@fQ2%A>g}LF@GHR%MUYu8@S4U0KCF| zEdL{LmH!p^bJA|PTcH>n%W`djt9&Qmhi9?;NZ{p5 zvp=(emzMhL4&Zl`XZd@97wXOW*8x}gjliF6#_~S_SNRjbwH&D=?N$vRm9GK(6ER?S z1+MbFfv-Ex{<#gf%FhP=oAiI51FrJxfe*fy^&bST@`r){mcsHSO7bs$ZyDenA7#0= zz*T=I;FadE`~=`CKMi=Lr&xX^aFt&Te3i6I4**yBuYsq2$@+_5#=rQzrGX!o{%;H5 zFG~Bi9q=K&Snn9%cXeYv0r=HdFkb@v`5Tz806ta9+joE;znkTE0{=<+5x)cfU}nWhzGteiRD`WpCSFG-oW3;Wd95V{^}9tIl!xneSRwN zc?Vd2DR7lv34E!Hr@RMT9U6#)QuJTiXPmuKXC~%cu2K)hu_qTw*FYT`Fz~|Ls{~QIb@+X1cC-#tvqEEv| z<*Ne!YmI~taFy=@{Pi@J9|Jt9HS-C;e;0esLf|UD7vf3~-g706e)U%P$13@{55tdW7Y- z0#Ci1!)+Vzv{zXE2ym4@20TXcOIc~>YWS%9Rlxt~!TJ+`t9(b`KP+eY;lQKnFdqke z^L@sY>GIsVn~QTeLC%j{>l1mG&) z5%>d9EI$Ug%1;1Zs0GU}1>Q#bjZXv5l=}Sz;Ll4x_dc2Epx-sH8>g#>ftPxh-}?mc z>%L(AJaCoY0KDQ%mfs2dP0_Ol_`!Er{xI;0jhG(={!b0&QBqFpcXgBT*`mPbOTBp& zaP@yR;N7L(X#!m3TLJ$thyBwJxXKR#zC-fkMBpkv4R}KtH(UT*?cs}nuX>36^Ad2C z-wgat8Gk$ge1^0W4gzmKp7s9)T-!^9DzLl8%U&rDuK<3j*p(^+|MdlazA5k z{Mh}>hXcR$D&}K>U*3iJEx;Q}J7Es+*9WoueBgnN%pV8-+Got423~J0^Yy^5uF8BP z@LT_4{uA)ur5*bRaD8uKsh>6c^}WS`Cw|2GF9&{c3iI~B9}zp`b-;UF&+<0_SN{wH zuKvje{_rELXEN}ja=!-nElDi@67YYdeBTQE1*vyF@Zr0G-(8N&$wR zpYyNeUk!hKZ!zG_9$>i|z%`%N0p3*ltsQ~C`yA`(<-@NBUh!j=9|t_X1b^>D;7ez) z{H?%WZo~X;A3hIwY$eve0{CvRhpYqsTy>V;=EFY#e!olvI|O{Q^zVKF{>^vn|7a;E zG`^-ueOelL#Vss<4e%Ocn3t){zp6*=yfuK|F7B~1-|$})-xS=sl&`40KP!-(IVi7 zo@DvwfWPns^Yy?RHfO#E_*XK%{3Y!z?Q4QQx~v>&?aXTczg_x+ zt$?e1d*H+W!+Hh-uPEWH?Rxd+3#B;xXMntp7taBnCFSI!z#DXCJAz%t+|QV(qge)L_|vmJPB9P1CELRD*vtelHe&G4Phs zt|$Y%B0Ddr)mP7cxj{$Gip7}E1dwyd66!5VfnXdt!Ch_|!@L%h({71l}8gY959(dh7 zEdLwu&m`SO)ns>#_sZY!eF@;|pEAHpPGk96z#smVc^vTme=|=8-ctHOJ%PtdJ7*N| zGF|z5Cjmbw`DG69(tY^74*~zRFY^_^zn1*_BJfY7fAkjc69ZV!Zs6zL!2BEF8-@Q0 zoc5KqSJc(~tMT%g@RGoXPhq(j;Eiu$9tZq^o0+!(Ug9?9J%IO^&O8lxGs$0Bz(+{E zJRNxYEY>p*_^dmaF9kkiHuL9!H>ov;0TEANhj$LEzC}GCvOdp|6-nUBkZ` z{-dRQD+#=)K=5GM6B>lk; zfRF0H^80{qmicuDfftc+pC5tGmv-7o;LDO(e?Z26E~IE(O8+-&%kg_5@XhU*mjeD_ zBJ(SOZM!&mjPe&U*=B%|M64itASUP@LvzSyoArIz~9SaJs$vnP3AA{0=`$~Nqh=? zc{JaFtI6KDscc^AzA;*JhppykblKo=Lz}{$}7iq

~`1R87TMYcOR;>SN;I~Qp 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 literal 0 HcmV?d00001 diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/binary.cpp.o b/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/binary.cpp.o new file mode 100644 index 0000000000000000000000000000000000000000..4206a89ccd8f3cc137f5079804326bcbbf9d5d08 GIT binary patch literal 1117040 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

d$imzew}F_*MN`1o%f#1wrHA%bFil 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 literal 0 HcmV?d00001 diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/build.make b/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/build.make new file mode 100644 index 000000000..b05778622 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/build.make @@ -0,0 +1,1884 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + +# Include any dependencies generated for this target. +include source/CMakeFiles/SPIRV-Tools.dir/depend.make + +# Include the progress variables for this target. +include source/CMakeFiles/SPIRV-Tools.dir/progress.make + +# Include the compile flags for this target's objects. +include source/CMakeFiles/SPIRV-Tools.dir/flags.make + +extension_enum.inc: ../utils/generate_grammar_tables.py +extension_enum.inc: ../external/SPIRV-Headers/include/spirv/unified1/spirv.core.grammar.json +extension_enum.inc: ../source/extinst.debuginfo.grammar.json + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --blue --bold --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Generate enum-string mapping for SPIR-V vunified1." + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/python /home/bkaradzic/Private/projects/_github/SPIRV-Tools/utils/generate_grammar_tables.py --spirv-core-grammar=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/external/SPIRV-Headers/include/spirv/unified1/spirv.core.grammar.json --extinst-debuginfo-grammar=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/extinst.debuginfo.grammar.json --extension-enum-output=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/extension_enum.inc --enum-string-mapping-output=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/enum_string_mapping.inc + +enum_string_mapping.inc: extension_enum.inc + @$(CMAKE_COMMAND) -E touch_nocreate enum_string_mapping.inc + +opencl.std.insts.inc: ../utils/generate_grammar_tables.py +opencl.std.insts.inc: ../external/SPIRV-Headers/include/spirv/unified1/spirv.core.grammar.json +opencl.std.insts.inc: ../external/SPIRV-Headers/include/spirv/unified1/extinst.opencl.std.100.grammar.json + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --blue --bold --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Generate info tables for OpenCL extended instructions and operands vunified1." + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/python /home/bkaradzic/Private/projects/_github/SPIRV-Tools/utils/generate_grammar_tables.py --extinst-opencl-grammar=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/external/SPIRV-Headers/include/spirv/unified1/extinst.opencl.std.100.grammar.json --opencl-insts-output=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/opencl.std.insts.inc + +glsl.std.450.insts.inc: ../utils/generate_grammar_tables.py +glsl.std.450.insts.inc: ../external/SPIRV-Headers/include/spirv/unified1/spirv.core.grammar.json +glsl.std.450.insts.inc: ../external/SPIRV-Headers/include/spirv/unified1/extinst.glsl.std.450.grammar.json + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --blue --bold --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_3) "Generate info tables for GLSL extended instructions and operands vunified1." + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/python /home/bkaradzic/Private/projects/_github/SPIRV-Tools/utils/generate_grammar_tables.py --extinst-glsl-grammar=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/external/SPIRV-Headers/include/spirv/unified1/extinst.glsl.std.450.grammar.json --glsl-insts-output=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/glsl.std.450.insts.inc + +spv-amd-shader-explicit-vertex-parameter.insts.inc: ../utils/generate_grammar_tables.py +spv-amd-shader-explicit-vertex-parameter.insts.inc: ../source/extinst.spv-amd-shader-explicit-vertex-parameter.grammar.json + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --blue --bold --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_4) "Generate extended instruction tables for spv-amd-shader-explicit-vertex-parameter." + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/python /home/bkaradzic/Private/projects/_github/SPIRV-Tools/utils/generate_grammar_tables.py --extinst-vendor-grammar=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/extinst.spv-amd-shader-explicit-vertex-parameter.grammar.json --vendor-insts-output=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/spv-amd-shader-explicit-vertex-parameter.insts.inc + +spv-amd-shader-trinary-minmax.insts.inc: ../utils/generate_grammar_tables.py +spv-amd-shader-trinary-minmax.insts.inc: ../source/extinst.spv-amd-shader-trinary-minmax.grammar.json + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --blue --bold --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_5) "Generate extended instruction tables for spv-amd-shader-trinary-minmax." + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/python /home/bkaradzic/Private/projects/_github/SPIRV-Tools/utils/generate_grammar_tables.py --extinst-vendor-grammar=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/extinst.spv-amd-shader-trinary-minmax.grammar.json --vendor-insts-output=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/spv-amd-shader-trinary-minmax.insts.inc + +spv-amd-gcn-shader.insts.inc: ../utils/generate_grammar_tables.py +spv-amd-gcn-shader.insts.inc: ../source/extinst.spv-amd-gcn-shader.grammar.json + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --blue --bold --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_6) "Generate extended instruction tables for spv-amd-gcn-shader." + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/python /home/bkaradzic/Private/projects/_github/SPIRV-Tools/utils/generate_grammar_tables.py --extinst-vendor-grammar=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/extinst.spv-amd-gcn-shader.grammar.json --vendor-insts-output=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/spv-amd-gcn-shader.insts.inc + +spv-amd-shader-ballot.insts.inc: ../utils/generate_grammar_tables.py +spv-amd-shader-ballot.insts.inc: ../source/extinst.spv-amd-shader-ballot.grammar.json + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --blue --bold --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_7) "Generate extended instruction tables for spv-amd-shader-ballot." + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/python /home/bkaradzic/Private/projects/_github/SPIRV-Tools/utils/generate_grammar_tables.py --extinst-vendor-grammar=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/extinst.spv-amd-shader-ballot.grammar.json --vendor-insts-output=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/spv-amd-shader-ballot.insts.inc + +debuginfo.insts.inc: ../utils/generate_grammar_tables.py +debuginfo.insts.inc: ../source/extinst.debuginfo.grammar.json + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --blue --bold --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_8) "Generate extended instruction tables for debuginfo." + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/python /home/bkaradzic/Private/projects/_github/SPIRV-Tools/utils/generate_grammar_tables.py --extinst-vendor-grammar=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/extinst.debuginfo.grammar.json --vendor-insts-output=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/debuginfo.insts.inc + +DebugInfo.h: ../utils/generate_language_headers.py +DebugInfo.h: ../source/extinst.debuginfo.grammar.json + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --blue --bold --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_9) "Generate language specific header for DebugInfo." + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/python /home/bkaradzic/Private/projects/_github/SPIRV-Tools/utils/generate_language_headers.py --extinst-name=DebugInfo --extinst-grammar=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/extinst.debuginfo.grammar.json --extinst-output-base=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/DebugInfo + +core.insts-unified1.inc: ../utils/generate_grammar_tables.py +core.insts-unified1.inc: ../external/SPIRV-Headers/include/spirv/unified1/spirv.core.grammar.json +core.insts-unified1.inc: ../source/extinst.debuginfo.grammar.json + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --blue --bold --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_10) "Generate info tables for SPIR-V vunified1 core instructions and operands." + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/python /home/bkaradzic/Private/projects/_github/SPIRV-Tools/utils/generate_grammar_tables.py --spirv-core-grammar=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/external/SPIRV-Headers/include/spirv/unified1/spirv.core.grammar.json --extinst-debuginfo-grammar=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/extinst.debuginfo.grammar.json --core-insts-output=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/core.insts-unified1.inc --operand-kinds-output=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/operand.kinds-unified1.inc + +operand.kinds-unified1.inc: core.insts-unified1.inc + @$(CMAKE_COMMAND) -E touch_nocreate operand.kinds-unified1.inc + +generators.inc: ../utils/generate_registry_tables.py +generators.inc: ../external/SPIRV-Headers/include/spirv/spir-v.xml + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --blue --bold --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_11) "Generate tables based on the SPIR-V XML registry." + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/python /home/bkaradzic/Private/projects/_github/SPIRV-Tools/utils/generate_registry_tables.py --xml=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/external/SPIRV-Headers/include/spirv/spir-v.xml --generator-output=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/generators.inc + +build-version.inc: ../utils/update_build_version.py +build-version.inc: ../CHANGES + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --blue --bold --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_12) "Update build-version.inc in the SPIRV-Tools build directory (if necessary)." + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/python /home/bkaradzic/Private/projects/_github/SPIRV-Tools/utils/update_build_version.py /home/bkaradzic/Private/projects/_github/SPIRV-Tools /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/build-version.inc + +source/CMakeFiles/SPIRV-Tools.dir/util/bit_vector.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/util/bit_vector.cpp.o: ../source/util/bit_vector.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_13) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/util/bit_vector.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/util/bit_vector.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/util/bit_vector.cpp + +source/CMakeFiles/SPIRV-Tools.dir/util/bit_vector.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/util/bit_vector.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/util/bit_vector.cpp > CMakeFiles/SPIRV-Tools.dir/util/bit_vector.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/util/bit_vector.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/util/bit_vector.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/util/bit_vector.cpp -o CMakeFiles/SPIRV-Tools.dir/util/bit_vector.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/util/bit_vector.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/util/bit_vector.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/util/bit_vector.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/util/bit_vector.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/util/bit_vector.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/util/bit_vector.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/util/bit_vector.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/util/bit_vector.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/util/parse_number.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/util/parse_number.cpp.o: ../source/util/parse_number.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_14) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/util/parse_number.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/util/parse_number.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/util/parse_number.cpp + +source/CMakeFiles/SPIRV-Tools.dir/util/parse_number.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/util/parse_number.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/util/parse_number.cpp > CMakeFiles/SPIRV-Tools.dir/util/parse_number.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/util/parse_number.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/util/parse_number.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/util/parse_number.cpp -o CMakeFiles/SPIRV-Tools.dir/util/parse_number.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/util/parse_number.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/util/parse_number.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/util/parse_number.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/util/parse_number.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/util/parse_number.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/util/parse_number.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/util/parse_number.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/util/parse_number.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/util/string_utils.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/util/string_utils.cpp.o: ../source/util/string_utils.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_15) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/util/string_utils.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/util/string_utils.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/util/string_utils.cpp + +source/CMakeFiles/SPIRV-Tools.dir/util/string_utils.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/util/string_utils.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/util/string_utils.cpp > CMakeFiles/SPIRV-Tools.dir/util/string_utils.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/util/string_utils.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/util/string_utils.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/util/string_utils.cpp -o CMakeFiles/SPIRV-Tools.dir/util/string_utils.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/util/string_utils.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/util/string_utils.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/util/string_utils.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/util/string_utils.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/util/string_utils.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/util/string_utils.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/util/string_utils.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/util/string_utils.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/assembly_grammar.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/assembly_grammar.cpp.o: ../source/assembly_grammar.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_16) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/assembly_grammar.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/assembly_grammar.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/assembly_grammar.cpp + +source/CMakeFiles/SPIRV-Tools.dir/assembly_grammar.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/assembly_grammar.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/assembly_grammar.cpp > CMakeFiles/SPIRV-Tools.dir/assembly_grammar.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/assembly_grammar.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/assembly_grammar.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/assembly_grammar.cpp -o CMakeFiles/SPIRV-Tools.dir/assembly_grammar.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/assembly_grammar.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/assembly_grammar.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/assembly_grammar.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/assembly_grammar.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/assembly_grammar.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/assembly_grammar.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/assembly_grammar.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/assembly_grammar.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/binary.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/binary.cpp.o: ../source/binary.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_17) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/binary.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/binary.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/binary.cpp + +source/CMakeFiles/SPIRV-Tools.dir/binary.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/binary.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/binary.cpp > CMakeFiles/SPIRV-Tools.dir/binary.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/binary.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/binary.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/binary.cpp -o CMakeFiles/SPIRV-Tools.dir/binary.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/binary.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/binary.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/binary.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/binary.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/binary.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/binary.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/binary.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/binary.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/diagnostic.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/diagnostic.cpp.o: ../source/diagnostic.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_18) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/diagnostic.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/diagnostic.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/diagnostic.cpp + +source/CMakeFiles/SPIRV-Tools.dir/diagnostic.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/diagnostic.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/diagnostic.cpp > CMakeFiles/SPIRV-Tools.dir/diagnostic.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/diagnostic.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/diagnostic.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/diagnostic.cpp -o CMakeFiles/SPIRV-Tools.dir/diagnostic.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/diagnostic.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/diagnostic.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/diagnostic.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/diagnostic.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/diagnostic.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/diagnostic.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/diagnostic.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/diagnostic.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.o: ../source/disassemble.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_19) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/disassemble.cpp + +source/CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/disassemble.cpp > CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/disassemble.cpp -o CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/enum_string_mapping.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/enum_string_mapping.cpp.o: ../source/enum_string_mapping.cpp +source/CMakeFiles/SPIRV-Tools.dir/enum_string_mapping.cpp.o: enum_string_mapping.inc + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_20) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/enum_string_mapping.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/enum_string_mapping.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/enum_string_mapping.cpp + +source/CMakeFiles/SPIRV-Tools.dir/enum_string_mapping.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/enum_string_mapping.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/enum_string_mapping.cpp > CMakeFiles/SPIRV-Tools.dir/enum_string_mapping.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/enum_string_mapping.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/enum_string_mapping.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/enum_string_mapping.cpp -o CMakeFiles/SPIRV-Tools.dir/enum_string_mapping.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/enum_string_mapping.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/enum_string_mapping.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/enum_string_mapping.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/enum_string_mapping.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/enum_string_mapping.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/enum_string_mapping.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/enum_string_mapping.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/enum_string_mapping.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o: ../source/ext_inst.cpp +source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o: opencl.std.insts.inc +source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o: glsl.std.450.insts.inc +source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o: spv-amd-shader-explicit-vertex-parameter.insts.inc +source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o: spv-amd-shader-trinary-minmax.insts.inc +source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o: spv-amd-gcn-shader.insts.inc +source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o: spv-amd-shader-ballot.insts.inc +source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o: debuginfo.insts.inc +source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o: DebugInfo.h + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_21) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/ext_inst.cpp + +source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/ext_inst.cpp > CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/ext_inst.cpp -o CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/extensions.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/extensions.cpp.o: ../source/extensions.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_22) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/extensions.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/extensions.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/extensions.cpp + +source/CMakeFiles/SPIRV-Tools.dir/extensions.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/extensions.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/extensions.cpp > CMakeFiles/SPIRV-Tools.dir/extensions.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/extensions.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/extensions.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/extensions.cpp -o CMakeFiles/SPIRV-Tools.dir/extensions.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/extensions.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/extensions.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/extensions.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/extensions.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/extensions.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/extensions.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/extensions.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/extensions.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/id_descriptor.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/id_descriptor.cpp.o: ../source/id_descriptor.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_23) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/id_descriptor.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/id_descriptor.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/id_descriptor.cpp + +source/CMakeFiles/SPIRV-Tools.dir/id_descriptor.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/id_descriptor.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/id_descriptor.cpp > CMakeFiles/SPIRV-Tools.dir/id_descriptor.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/id_descriptor.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/id_descriptor.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/id_descriptor.cpp -o CMakeFiles/SPIRV-Tools.dir/id_descriptor.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/id_descriptor.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/id_descriptor.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/id_descriptor.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/id_descriptor.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/id_descriptor.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/id_descriptor.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/id_descriptor.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/id_descriptor.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/libspirv.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/libspirv.cpp.o: ../source/libspirv.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_24) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/libspirv.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/libspirv.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/libspirv.cpp + +source/CMakeFiles/SPIRV-Tools.dir/libspirv.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/libspirv.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/libspirv.cpp > CMakeFiles/SPIRV-Tools.dir/libspirv.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/libspirv.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/libspirv.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/libspirv.cpp -o CMakeFiles/SPIRV-Tools.dir/libspirv.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/libspirv.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/libspirv.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/libspirv.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/libspirv.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/libspirv.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/libspirv.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/libspirv.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/libspirv.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/name_mapper.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/name_mapper.cpp.o: ../source/name_mapper.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_25) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/name_mapper.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/name_mapper.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/name_mapper.cpp + +source/CMakeFiles/SPIRV-Tools.dir/name_mapper.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/name_mapper.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/name_mapper.cpp > CMakeFiles/SPIRV-Tools.dir/name_mapper.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/name_mapper.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/name_mapper.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/name_mapper.cpp -o CMakeFiles/SPIRV-Tools.dir/name_mapper.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/name_mapper.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/name_mapper.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/name_mapper.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/name_mapper.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/name_mapper.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/name_mapper.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/name_mapper.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/name_mapper.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/opcode.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/opcode.cpp.o: ../source/opcode.cpp +source/CMakeFiles/SPIRV-Tools.dir/opcode.cpp.o: core.insts-unified1.inc +source/CMakeFiles/SPIRV-Tools.dir/opcode.cpp.o: generators.inc + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_26) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/opcode.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/opcode.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opcode.cpp + +source/CMakeFiles/SPIRV-Tools.dir/opcode.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/opcode.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opcode.cpp > CMakeFiles/SPIRV-Tools.dir/opcode.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/opcode.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/opcode.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opcode.cpp -o CMakeFiles/SPIRV-Tools.dir/opcode.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/opcode.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/opcode.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/opcode.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/opcode.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/opcode.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/opcode.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/opcode.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/opcode.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/operand.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/operand.cpp.o: ../source/operand.cpp +source/CMakeFiles/SPIRV-Tools.dir/operand.cpp.o: operand.kinds-unified1.inc + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_27) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/operand.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/operand.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/operand.cpp + +source/CMakeFiles/SPIRV-Tools.dir/operand.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/operand.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/operand.cpp > CMakeFiles/SPIRV-Tools.dir/operand.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/operand.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/operand.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/operand.cpp -o CMakeFiles/SPIRV-Tools.dir/operand.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/operand.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/operand.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/operand.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/operand.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/operand.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/operand.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/operand.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/operand.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/parsed_operand.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/parsed_operand.cpp.o: ../source/parsed_operand.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_28) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/parsed_operand.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/parsed_operand.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/parsed_operand.cpp + +source/CMakeFiles/SPIRV-Tools.dir/parsed_operand.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/parsed_operand.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/parsed_operand.cpp > CMakeFiles/SPIRV-Tools.dir/parsed_operand.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/parsed_operand.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/parsed_operand.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/parsed_operand.cpp -o CMakeFiles/SPIRV-Tools.dir/parsed_operand.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/parsed_operand.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/parsed_operand.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/parsed_operand.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/parsed_operand.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/parsed_operand.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/parsed_operand.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/parsed_operand.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/parsed_operand.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/print.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/print.cpp.o: ../source/print.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_29) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/print.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/print.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/print.cpp + +source/CMakeFiles/SPIRV-Tools.dir/print.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/print.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/print.cpp > CMakeFiles/SPIRV-Tools.dir/print.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/print.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/print.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/print.cpp -o CMakeFiles/SPIRV-Tools.dir/print.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/print.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/print.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/print.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/print.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/print.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/print.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/print.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/print.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/software_version.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/software_version.cpp.o: ../source/software_version.cpp +source/CMakeFiles/SPIRV-Tools.dir/software_version.cpp.o: build-version.inc + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_30) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/software_version.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/software_version.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/software_version.cpp + +source/CMakeFiles/SPIRV-Tools.dir/software_version.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/software_version.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/software_version.cpp > CMakeFiles/SPIRV-Tools.dir/software_version.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/software_version.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/software_version.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/software_version.cpp -o CMakeFiles/SPIRV-Tools.dir/software_version.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/software_version.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/software_version.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/software_version.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/software_version.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/software_version.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/software_version.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/software_version.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/software_version.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/spirv_endian.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/spirv_endian.cpp.o: ../source/spirv_endian.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_31) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/spirv_endian.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/spirv_endian.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spirv_endian.cpp + +source/CMakeFiles/SPIRV-Tools.dir/spirv_endian.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/spirv_endian.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spirv_endian.cpp > CMakeFiles/SPIRV-Tools.dir/spirv_endian.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/spirv_endian.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/spirv_endian.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spirv_endian.cpp -o CMakeFiles/SPIRV-Tools.dir/spirv_endian.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/spirv_endian.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/spirv_endian.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/spirv_endian.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/spirv_endian.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/spirv_endian.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/spirv_endian.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/spirv_endian.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/spirv_endian.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/spirv_optimizer_options.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/spirv_optimizer_options.cpp.o: ../source/spirv_optimizer_options.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_32) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/spirv_optimizer_options.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/spirv_optimizer_options.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spirv_optimizer_options.cpp + +source/CMakeFiles/SPIRV-Tools.dir/spirv_optimizer_options.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/spirv_optimizer_options.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spirv_optimizer_options.cpp > CMakeFiles/SPIRV-Tools.dir/spirv_optimizer_options.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/spirv_optimizer_options.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/spirv_optimizer_options.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spirv_optimizer_options.cpp -o CMakeFiles/SPIRV-Tools.dir/spirv_optimizer_options.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/spirv_optimizer_options.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/spirv_optimizer_options.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/spirv_optimizer_options.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/spirv_optimizer_options.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/spirv_optimizer_options.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/spirv_optimizer_options.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/spirv_optimizer_options.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/spirv_optimizer_options.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/spirv_target_env.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/spirv_target_env.cpp.o: ../source/spirv_target_env.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_33) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/spirv_target_env.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/spirv_target_env.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spirv_target_env.cpp + +source/CMakeFiles/SPIRV-Tools.dir/spirv_target_env.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/spirv_target_env.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spirv_target_env.cpp > CMakeFiles/SPIRV-Tools.dir/spirv_target_env.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/spirv_target_env.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/spirv_target_env.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spirv_target_env.cpp -o CMakeFiles/SPIRV-Tools.dir/spirv_target_env.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/spirv_target_env.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/spirv_target_env.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/spirv_target_env.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/spirv_target_env.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/spirv_target_env.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/spirv_target_env.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/spirv_target_env.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/spirv_target_env.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/spirv_validator_options.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/spirv_validator_options.cpp.o: ../source/spirv_validator_options.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_34) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/spirv_validator_options.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/spirv_validator_options.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spirv_validator_options.cpp + +source/CMakeFiles/SPIRV-Tools.dir/spirv_validator_options.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/spirv_validator_options.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spirv_validator_options.cpp > CMakeFiles/SPIRV-Tools.dir/spirv_validator_options.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/spirv_validator_options.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/spirv_validator_options.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spirv_validator_options.cpp -o CMakeFiles/SPIRV-Tools.dir/spirv_validator_options.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/spirv_validator_options.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/spirv_validator_options.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/spirv_validator_options.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/spirv_validator_options.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/spirv_validator_options.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/spirv_validator_options.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/spirv_validator_options.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/spirv_validator_options.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/table.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/table.cpp.o: ../source/table.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_35) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/table.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/table.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/table.cpp + +source/CMakeFiles/SPIRV-Tools.dir/table.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/table.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/table.cpp > CMakeFiles/SPIRV-Tools.dir/table.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/table.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/table.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/table.cpp -o CMakeFiles/SPIRV-Tools.dir/table.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/table.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/table.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/table.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/table.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/table.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/table.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/table.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/table.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/text.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/text.cpp.o: ../source/text.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_36) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/text.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/text.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/text.cpp + +source/CMakeFiles/SPIRV-Tools.dir/text.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/text.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/text.cpp > CMakeFiles/SPIRV-Tools.dir/text.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/text.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/text.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/text.cpp -o CMakeFiles/SPIRV-Tools.dir/text.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/text.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/text.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/text.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/text.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/text.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/text.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/text.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/text.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.o: ../source/text_handler.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_37) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/text_handler.cpp + +source/CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/text_handler.cpp > CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/text_handler.cpp -o CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o: ../source/val/validate.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_38) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate.cpp + +source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate.cpp > CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate.cpp -o CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.o: ../source/val/validate_adjacency.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_39) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_adjacency.cpp + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_adjacency.cpp > CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_adjacency.cpp -o CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.o: ../source/val/validate_annotation.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_40) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_annotation.cpp + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_annotation.cpp > CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_annotation.cpp -o CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.o: ../source/val/validate_arithmetics.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_41) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_arithmetics.cpp + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_arithmetics.cpp > CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_arithmetics.cpp -o CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.o: ../source/val/validate_atomics.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_42) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_atomics.cpp + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_atomics.cpp > CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_atomics.cpp -o CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o: ../source/val/validate_barriers.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_43) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_barriers.cpp + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_barriers.cpp > CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_barriers.cpp -o CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.o: ../source/val/validate_bitwise.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_44) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_bitwise.cpp + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_bitwise.cpp > CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_bitwise.cpp -o CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.o: ../source/val/validate_builtins.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_45) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_builtins.cpp + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_builtins.cpp > CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_builtins.cpp -o CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.o: ../source/val/validate_capability.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_46) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_capability.cpp + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_capability.cpp > CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_capability.cpp -o CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.o: ../source/val/validate_cfg.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_47) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_cfg.cpp + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_cfg.cpp > CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_cfg.cpp -o CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.o: ../source/val/validate_composites.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_48) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_composites.cpp + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_composites.cpp > CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_composites.cpp -o CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.o: ../source/val/validate_constants.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_49) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_constants.cpp + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_constants.cpp > CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_constants.cpp -o CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.o: ../source/val/validate_conversion.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_50) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_conversion.cpp + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_conversion.cpp > CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_conversion.cpp -o CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.o: ../source/val/validate_datarules.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_51) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_datarules.cpp + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_datarules.cpp > CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_datarules.cpp -o CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.o: ../source/val/validate_debug.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_52) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_debug.cpp + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_debug.cpp > CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_debug.cpp -o CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.o: ../source/val/validate_decorations.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_53) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_decorations.cpp + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_decorations.cpp > CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_decorations.cpp -o CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.o: ../source/val/validate_derivatives.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_54) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_derivatives.cpp + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_derivatives.cpp > CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_derivatives.cpp -o CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o: ../source/val/validate_ext_inst.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_55) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_ext_inst.cpp + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_ext_inst.cpp > CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_ext_inst.cpp -o CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.o: ../source/val/validate_execution_limitations.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_56) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_execution_limitations.cpp + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_execution_limitations.cpp > CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_execution_limitations.cpp -o CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.o: ../source/val/validate_function.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_57) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_function.cpp + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_function.cpp > CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_function.cpp -o CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.o: ../source/val/validate_id.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_58) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_id.cpp + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_id.cpp > CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_id.cpp -o CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.o: ../source/val/validate_image.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_59) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_image.cpp + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_image.cpp > CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_image.cpp -o CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.o: ../source/val/validate_interfaces.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_60) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_interfaces.cpp + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_interfaces.cpp > CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_interfaces.cpp -o CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o: ../source/val/validate_instruction.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_61) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_instruction.cpp + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_instruction.cpp > CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_instruction.cpp -o CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.o: ../source/val/validate_layout.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_62) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_layout.cpp + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_layout.cpp > CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_layout.cpp -o CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.o: ../source/val/validate_literals.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_63) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_literals.cpp + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_literals.cpp > CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_literals.cpp -o CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.o: ../source/val/validate_logicals.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_64) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_logicals.cpp + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_logicals.cpp > CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_logicals.cpp -o CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.o: ../source/val/validate_memory.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_65) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_memory.cpp + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_memory.cpp > CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_memory.cpp -o CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.o: ../source/val/validate_mode_setting.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_66) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_mode_setting.cpp + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_mode_setting.cpp > CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_mode_setting.cpp -o CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o: ../source/val/validate_non_uniform.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_67) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_non_uniform.cpp + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_non_uniform.cpp > CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_non_uniform.cpp -o CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.o: ../source/val/validate_primitives.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_68) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_primitives.cpp + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_primitives.cpp > CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_primitives.cpp -o CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.o: ../source/val/validate_type.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_69) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_type.cpp + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_type.cpp > CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_type.cpp -o CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/val/basic_block.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/val/basic_block.cpp.o: ../source/val/basic_block.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_70) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/val/basic_block.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/val/basic_block.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/basic_block.cpp + +source/CMakeFiles/SPIRV-Tools.dir/val/basic_block.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/val/basic_block.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/basic_block.cpp > CMakeFiles/SPIRV-Tools.dir/val/basic_block.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/val/basic_block.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/val/basic_block.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/basic_block.cpp -o CMakeFiles/SPIRV-Tools.dir/val/basic_block.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/val/basic_block.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/basic_block.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/val/basic_block.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/val/basic_block.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/basic_block.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/basic_block.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/val/basic_block.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/val/basic_block.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/val/construct.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/val/construct.cpp.o: ../source/val/construct.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_71) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/val/construct.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/val/construct.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/construct.cpp + +source/CMakeFiles/SPIRV-Tools.dir/val/construct.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/val/construct.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/construct.cpp > CMakeFiles/SPIRV-Tools.dir/val/construct.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/val/construct.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/val/construct.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/construct.cpp -o CMakeFiles/SPIRV-Tools.dir/val/construct.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/val/construct.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/construct.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/val/construct.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/val/construct.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/construct.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/construct.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/val/construct.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/val/construct.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/val/function.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/val/function.cpp.o: ../source/val/function.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_72) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/val/function.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/val/function.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/function.cpp + +source/CMakeFiles/SPIRV-Tools.dir/val/function.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/val/function.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/function.cpp > CMakeFiles/SPIRV-Tools.dir/val/function.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/val/function.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/val/function.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/function.cpp -o CMakeFiles/SPIRV-Tools.dir/val/function.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/val/function.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/function.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/val/function.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/val/function.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/function.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/function.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/val/function.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/val/function.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/val/instruction.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/val/instruction.cpp.o: ../source/val/instruction.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_73) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/val/instruction.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/val/instruction.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/instruction.cpp + +source/CMakeFiles/SPIRV-Tools.dir/val/instruction.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/val/instruction.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/instruction.cpp > CMakeFiles/SPIRV-Tools.dir/val/instruction.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/val/instruction.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/val/instruction.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/instruction.cpp -o CMakeFiles/SPIRV-Tools.dir/val/instruction.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/val/instruction.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/instruction.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/val/instruction.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/val/instruction.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/instruction.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/instruction.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/val/instruction.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/val/instruction.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.o: ../source/val/validation_state.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_74) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validation_state.cpp + +source/CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validation_state.cpp > CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validation_state.cpp -o CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.o + + +source/CMakeFiles/SPIRV-Tools.dir/util/timer.cpp.o: source/CMakeFiles/SPIRV-Tools.dir/flags.make +source/CMakeFiles/SPIRV-Tools.dir/util/timer.cpp.o: ../source/util/timer.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_75) "Building CXX object source/CMakeFiles/SPIRV-Tools.dir/util/timer.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools.dir/util/timer.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/util/timer.cpp + +source/CMakeFiles/SPIRV-Tools.dir/util/timer.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools.dir/util/timer.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/util/timer.cpp > CMakeFiles/SPIRV-Tools.dir/util/timer.cpp.i + +source/CMakeFiles/SPIRV-Tools.dir/util/timer.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools.dir/util/timer.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/util/timer.cpp -o CMakeFiles/SPIRV-Tools.dir/util/timer.cpp.s + +source/CMakeFiles/SPIRV-Tools.dir/util/timer.cpp.o.requires: + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/util/timer.cpp.o.requires + +source/CMakeFiles/SPIRV-Tools.dir/util/timer.cpp.o.provides: source/CMakeFiles/SPIRV-Tools.dir/util/timer.cpp.o.requires + $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/util/timer.cpp.o.provides.build +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/util/timer.cpp.o.provides + +source/CMakeFiles/SPIRV-Tools.dir/util/timer.cpp.o.provides.build: source/CMakeFiles/SPIRV-Tools.dir/util/timer.cpp.o + + +# Object files for target SPIRV-Tools +SPIRV__Tools_OBJECTS = \ +"CMakeFiles/SPIRV-Tools.dir/util/bit_vector.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/util/parse_number.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/util/string_utils.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/assembly_grammar.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/binary.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/diagnostic.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/enum_string_mapping.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/extensions.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/id_descriptor.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/libspirv.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/name_mapper.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/opcode.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/operand.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/parsed_operand.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/print.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/software_version.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/spirv_endian.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/spirv_optimizer_options.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/spirv_target_env.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/spirv_validator_options.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/table.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/text.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/val/basic_block.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/val/construct.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/val/function.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/val/instruction.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.o" \ +"CMakeFiles/SPIRV-Tools.dir/util/timer.cpp.o" + +# External object files for target SPIRV-Tools +SPIRV__Tools_EXTERNAL_OBJECTS = + +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/util/bit_vector.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/util/parse_number.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/util/string_utils.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/assembly_grammar.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/binary.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/diagnostic.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/enum_string_mapping.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/extensions.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/id_descriptor.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/libspirv.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/name_mapper.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/opcode.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/operand.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/parsed_operand.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/print.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/software_version.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/spirv_endian.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/spirv_optimizer_options.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/spirv_target_env.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/spirv_validator_options.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/table.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/text.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/val/basic_block.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/val/construct.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/val/function.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/val/instruction.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/util/timer.cpp.o +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/build.make +source/libSPIRV-Tools.a: source/CMakeFiles/SPIRV-Tools.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --bold --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_76) "Linking CXX static library libSPIRV-Tools.a" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && $(CMAKE_COMMAND) -P CMakeFiles/SPIRV-Tools.dir/cmake_clean_target.cmake + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/SPIRV-Tools.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +source/CMakeFiles/SPIRV-Tools.dir/build: source/libSPIRV-Tools.a + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/build + +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/util/bit_vector.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/util/parse_number.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/util/string_utils.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/assembly_grammar.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/binary.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/diagnostic.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/enum_string_mapping.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/extensions.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/id_descriptor.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/libspirv.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/name_mapper.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/opcode.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/operand.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/parsed_operand.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/print.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/software_version.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/spirv_endian.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/spirv_optimizer_options.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/spirv_target_env.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/spirv_validator_options.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/table.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/text.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/val/basic_block.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/val/construct.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/val/function.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/val/instruction.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.o.requires +source/CMakeFiles/SPIRV-Tools.dir/requires: source/CMakeFiles/SPIRV-Tools.dir/util/timer.cpp.o.requires + +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/requires + +source/CMakeFiles/SPIRV-Tools.dir/clean: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && $(CMAKE_COMMAND) -P CMakeFiles/SPIRV-Tools.dir/cmake_clean.cmake +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/clean + +source/CMakeFiles/SPIRV-Tools.dir/depend: extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/depend: enum_string_mapping.inc +source/CMakeFiles/SPIRV-Tools.dir/depend: opencl.std.insts.inc +source/CMakeFiles/SPIRV-Tools.dir/depend: glsl.std.450.insts.inc +source/CMakeFiles/SPIRV-Tools.dir/depend: spv-amd-shader-explicit-vertex-parameter.insts.inc +source/CMakeFiles/SPIRV-Tools.dir/depend: spv-amd-shader-trinary-minmax.insts.inc +source/CMakeFiles/SPIRV-Tools.dir/depend: spv-amd-gcn-shader.insts.inc +source/CMakeFiles/SPIRV-Tools.dir/depend: spv-amd-shader-ballot.insts.inc +source/CMakeFiles/SPIRV-Tools.dir/depend: debuginfo.insts.inc +source/CMakeFiles/SPIRV-Tools.dir/depend: DebugInfo.h +source/CMakeFiles/SPIRV-Tools.dir/depend: core.insts-unified1.inc +source/CMakeFiles/SPIRV-Tools.dir/depend: operand.kinds-unified1.inc +source/CMakeFiles/SPIRV-Tools.dir/depend: generators.inc +source/CMakeFiles/SPIRV-Tools.dir/depend: build-version.inc + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/bkaradzic/Private/projects/_github/SPIRV-Tools /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/depend + diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/cmake_clean.cmake b/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/cmake_clean.cmake new file mode 100644 index 000000000..aff4ad456 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/cmake_clean.cmake @@ -0,0 +1,86 @@ +file(REMOVE_RECURSE + "../extension_enum.inc" + "../enum_string_mapping.inc" + "../opencl.std.insts.inc" + "../glsl.std.450.insts.inc" + "../spv-amd-shader-explicit-vertex-parameter.insts.inc" + "../spv-amd-shader-trinary-minmax.insts.inc" + "../spv-amd-gcn-shader.insts.inc" + "../spv-amd-shader-ballot.insts.inc" + "../debuginfo.insts.inc" + "../DebugInfo.h" + "../core.insts-unified1.inc" + "../operand.kinds-unified1.inc" + "../generators.inc" + "../build-version.inc" + "CMakeFiles/SPIRV-Tools.dir/util/bit_vector.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/util/parse_number.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/util/string_utils.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/assembly_grammar.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/binary.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/diagnostic.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/enum_string_mapping.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/extensions.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/id_descriptor.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/libspirv.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/name_mapper.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/opcode.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/operand.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/parsed_operand.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/print.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/software_version.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/spirv_endian.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/spirv_optimizer_options.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/spirv_target_env.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/spirv_validator_options.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/table.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/text.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/val/basic_block.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/val/construct.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/val/function.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/val/instruction.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.o" + "CMakeFiles/SPIRV-Tools.dir/util/timer.cpp.o" + "libSPIRV-Tools.pdb" + "libSPIRV-Tools.a" +) + +# Per-language clean rules from dependency scanning. +foreach(lang CXX) + include(CMakeFiles/SPIRV-Tools.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/cmake_clean_target.cmake b/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/cmake_clean_target.cmake new file mode 100644 index 000000000..51908038a --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/cmake_clean_target.cmake @@ -0,0 +1,3 @@ +file(REMOVE_RECURSE + "libSPIRV-Tools.a" +) diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/depend.internal b/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/depend.internal new file mode 100644 index 000000000..e398281bf --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/depend.internal @@ -0,0 +1,1239 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +source/CMakeFiles/SPIRV-Tools.dir/assembly_grammar.cpp.o + ..//source/assembly_grammar.h + ..//source/enum_set.h + ..//source/ext_inst.h + ..//source/extensions.h + ..//source/instruction.h + ..//source/latest_version_spirv_header.h + ..//source/opcode.h + ..//source/operand.h + ..//source/table.h + ..//source/util/make_unique.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/assembly_grammar.cpp + extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/binary.cpp.o + ..//source/assembly_grammar.h + ..//source/binary.h + ..//source/diagnostic.h + ..//source/enum_set.h + ..//source/ext_inst.h + ..//source/extensions.h + ..//source/instruction.h + ..//source/latest_version_spirv_header.h + ..//source/opcode.h + ..//source/operand.h + ..//source/spirv_constant.h + ..//source/spirv_definition.h + ..//source/spirv_endian.h + ..//source/table.h + ..//source/util/make_unique.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/binary.cpp + extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/diagnostic.cpp.o + ..//source/diagnostic.h + ..//source/enum_set.h + ..//source/extensions.h + ..//source/latest_version_spirv_header.h + ..//source/table.h + ..//source/util/make_unique.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/diagnostic.cpp + extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.o + ..//source/assembly_grammar.h + ..//source/binary.h + ..//source/diagnostic.h + ..//source/disassemble.h + ..//source/enum_set.h + ..//source/ext_inst.h + ..//source/extensions.h + ..//source/instruction.h + ..//source/latest_version_spirv_header.h + ..//source/name_mapper.h + ..//source/opcode.h + ..//source/operand.h + ..//source/parsed_operand.h + ..//source/print.h + ..//source/spirv_constant.h + ..//source/spirv_definition.h + ..//source/spirv_endian.h + ..//source/table.h + ..//source/util/bitutils.h + ..//source/util/hex_float.h + ..//source/util/make_unique.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/disassemble.cpp + extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/enum_string_mapping.cpp.o + ..//source/enum_set.h + ..//source/enum_string_mapping.h + ..//source/extensions.h + ..//source/latest_version_spirv_header.h + ..//source/util/make_unique.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/enum_string_mapping.cpp + enum_string_mapping.inc + extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o + ..//source/enum_set.h + ..//source/ext_inst.h + ..//source/extensions.h + ..//source/latest_version_glsl_std_450_header.h + ..//source/latest_version_opencl_std_header.h + ..//source/latest_version_spirv_header.h + ..//source/macro.h + ..//source/spirv_definition.h + ..//source/table.h + ..//source/util/make_unique.h + ../external/SPIRV-Headers/include/spirv/unified1/GLSL.std.450.h + ../external/SPIRV-Headers/include/spirv/unified1/OpenCL.std.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/ext_inst.cpp + DebugInfo.h + debuginfo.insts.inc + extension_enum.inc + glsl.std.450.insts.inc + opencl.std.insts.inc + spv-amd-gcn-shader.insts.inc + spv-amd-shader-ballot.insts.inc + spv-amd-shader-explicit-vertex-parameter.insts.inc + spv-amd-shader-trinary-minmax.insts.inc +source/CMakeFiles/SPIRV-Tools.dir/extensions.cpp.o + ..//source/enum_set.h + ..//source/enum_string_mapping.h + ..//source/extensions.h + ..//source/latest_version_spirv_header.h + ..//source/util/make_unique.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/extensions.cpp + extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/id_descriptor.cpp.o + ..//source/enum_set.h + ..//source/extensions.h + ..//source/id_descriptor.h + ..//source/instruction.h + ..//source/latest_version_spirv_header.h + ..//source/opcode.h + ..//source/operand.h + ..//source/table.h + ..//source/util/make_unique.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/id_descriptor.cpp + extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/libspirv.cpp.o + ..//source/enum_set.h + ..//source/extensions.h + ..//source/latest_version_spirv_header.h + ..//source/table.h + ..//source/util/make_unique.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/libspirv.cpp + extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/name_mapper.cpp.o + ..//source/assembly_grammar.h + ..//source/enum_set.h + ..//source/extensions.h + ..//source/latest_version_spirv_header.h + ..//source/name_mapper.h + ..//source/operand.h + ..//source/parsed_operand.h + ..//source/table.h + ..//source/util/make_unique.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/name_mapper.cpp + extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/opcode.cpp.o + ..//source/enum_set.h + ..//source/extensions.h + ..//source/instruction.h + ..//source/latest_version_spirv_header.h + ..//source/macro.h + ..//source/opcode.h + ..//source/spirv_constant.h + ..//source/spirv_endian.h + ..//source/spirv_target_env.h + ..//source/table.h + ..//source/util/make_unique.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opcode.cpp + core.insts-unified1.inc + extension_enum.inc + generators.inc +source/CMakeFiles/SPIRV-Tools.dir/operand.cpp.o + ..//source/enum_set.h + ..//source/extensions.h + ..//source/latest_version_spirv_header.h + ..//source/macro.h + ..//source/operand.h + ..//source/spirv_constant.h + ..//source/spirv_target_env.h + ..//source/table.h + ..//source/util/make_unique.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/operand.cpp + extension_enum.inc + operand.kinds-unified1.inc +source/CMakeFiles/SPIRV-Tools.dir/parsed_operand.cpp.o + ..//source/parsed_operand.h + ..//source/util/bitutils.h + ..//source/util/hex_float.h + ../include/spirv-tools/libspirv.h + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/parsed_operand.cpp +source/CMakeFiles/SPIRV-Tools.dir/print.cpp.o + ..//source/print.h + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/print.cpp +source/CMakeFiles/SPIRV-Tools.dir/software_version.cpp.o + ../include/spirv-tools/libspirv.h + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/software_version.cpp + build-version.inc +source/CMakeFiles/SPIRV-Tools.dir/spirv_endian.cpp.o + ..//source/spirv_endian.h + ../include/spirv-tools/libspirv.h + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spirv_endian.cpp +source/CMakeFiles/SPIRV-Tools.dir/spirv_optimizer_options.cpp.o + ..//source/spirv_optimizer_options.h + ..//source/spirv_validator_options.h + ../include/spirv-tools/libspirv.h + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spirv_optimizer_options.cpp +source/CMakeFiles/SPIRV-Tools.dir/spirv_target_env.cpp.o + ..//source/latest_version_spirv_header.h + ..//source/spirv_constant.h + ..//source/spirv_target_env.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spirv_target_env.cpp +source/CMakeFiles/SPIRV-Tools.dir/spirv_validator_options.cpp.o + ..//source/spirv_validator_options.h + ../include/spirv-tools/libspirv.h + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/spirv_validator_options.cpp +source/CMakeFiles/SPIRV-Tools.dir/table.cpp.o + ..//source/enum_set.h + ..//source/extensions.h + ..//source/latest_version_spirv_header.h + ..//source/table.h + ..//source/util/make_unique.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/table.cpp + extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/text.cpp.o + ..//source/assembly_grammar.h + ..//source/binary.h + ..//source/diagnostic.h + ..//source/enum_set.h + ..//source/ext_inst.h + ..//source/extensions.h + ..//source/instruction.h + ..//source/latest_version_spirv_header.h + ..//source/opcode.h + ..//source/operand.h + ..//source/spirv_constant.h + ..//source/spirv_definition.h + ..//source/spirv_target_env.h + ..//source/table.h + ..//source/text.h + ..//source/text_handler.h + ..//source/util/bitutils.h + ..//source/util/hex_float.h + ..//source/util/make_unique.h + ..//source/util/parse_number.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/text.cpp + extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.o + ..//source/assembly_grammar.h + ..//source/binary.h + ..//source/diagnostic.h + ..//source/enum_set.h + ..//source/ext_inst.h + ..//source/extensions.h + ..//source/instruction.h + ..//source/latest_version_spirv_header.h + ..//source/opcode.h + ..//source/operand.h + ..//source/spirv_constant.h + ..//source/spirv_definition.h + ..//source/table.h + ..//source/text.h + ..//source/text_handler.h + ..//source/util/bitutils.h + ..//source/util/hex_float.h + ..//source/util/make_unique.h + ..//source/util/parse_number.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/text_handler.cpp + extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/util/bit_vector.cpp.o + ..//source/util/bit_vector.h + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/util/bit_vector.cpp +source/CMakeFiles/SPIRV-Tools.dir/util/parse_number.cpp.o + ..//source/util/bitutils.h + ..//source/util/hex_float.h + ..//source/util/make_unique.h + ..//source/util/parse_number.h + ../include/spirv-tools/libspirv.h + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/util/parse_number.cpp +source/CMakeFiles/SPIRV-Tools.dir/util/string_utils.cpp.o + ..//source/util/string_utils.h + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/util/string_utils.cpp +source/CMakeFiles/SPIRV-Tools.dir/util/timer.cpp.o + ..//source/util/timer.h + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/util/timer.cpp +source/CMakeFiles/SPIRV-Tools.dir/val/basic_block.cpp.o + ..//source/latest_version_spirv_header.h + ..//source/val/basic_block.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/basic_block.cpp +source/CMakeFiles/SPIRV-Tools.dir/val/construct.cpp.o + ..//source/latest_version_spirv_header.h + ..//source/val/basic_block.h + ..//source/val/construct.h + ..//source/val/function.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/construct.cpp +source/CMakeFiles/SPIRV-Tools.dir/val/function.cpp.o + ..//source/cfa.h + ..//source/enum_set.h + ..//source/extensions.h + ..//source/instruction.h + ..//source/latest_version_spirv_header.h + ..//source/table.h + ..//source/util/make_unique.h + ..//source/val/basic_block.h + ..//source/val/construct.h + ..//source/val/function.h + ..//source/val/validate.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/function.cpp + extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/val/instruction.cpp.o + ..//source/enum_set.h + ..//source/extensions.h + ..//source/latest_version_spirv_header.h + ..//source/table.h + ..//source/util/make_unique.h + ..//source/val/instruction.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/instruction.cpp + extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o + ..//source/assembly_grammar.h + ..//source/binary.h + ..//source/diagnostic.h + ..//source/disassemble.h + ..//source/enum_set.h + ..//source/enum_string_mapping.h + ..//source/extensions.h + ..//source/instruction.h + ..//source/latest_version_spirv_header.h + ..//source/opcode.h + ..//source/operand.h + ..//source/spirv_constant.h + ..//source/spirv_definition.h + ..//source/spirv_endian.h + ..//source/spirv_target_env.h + ..//source/spirv_validator_options.h + ..//source/table.h + ..//source/util/make_unique.h + ..//source/val/basic_block.h + ..//source/val/construct.h + ..//source/val/decoration.h + ..//source/val/function.h + ..//source/val/instruction.h + ..//source/val/validate.h + ..//source/val/validation_state.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate.cpp + extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.o + ..//source/assembly_grammar.h + ..//source/diagnostic.h + ..//source/disassemble.h + ..//source/enum_set.h + ..//source/extensions.h + ..//source/instruction.h + ..//source/latest_version_spirv_header.h + ..//source/opcode.h + ..//source/operand.h + ..//source/spirv_definition.h + ..//source/spirv_validator_options.h + ..//source/table.h + ..//source/util/make_unique.h + ..//source/val/basic_block.h + ..//source/val/construct.h + ..//source/val/decoration.h + ..//source/val/function.h + ..//source/val/instruction.h + ..//source/val/validate.h + ..//source/val/validation_state.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_adjacency.cpp + extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.o + ..//source/assembly_grammar.h + ..//source/diagnostic.h + ..//source/disassemble.h + ..//source/enum_set.h + ..//source/extensions.h + ..//source/instruction.h + ..//source/latest_version_spirv_header.h + ..//source/opcode.h + ..//source/operand.h + ..//source/spirv_definition.h + ..//source/spirv_validator_options.h + ..//source/table.h + ..//source/util/make_unique.h + ..//source/val/basic_block.h + ..//source/val/construct.h + ..//source/val/decoration.h + ..//source/val/function.h + ..//source/val/instruction.h + ..//source/val/validate.h + ..//source/val/validation_state.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_annotation.cpp + extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.o + ..//source/assembly_grammar.h + ..//source/diagnostic.h + ..//source/disassemble.h + ..//source/enum_set.h + ..//source/extensions.h + ..//source/instruction.h + ..//source/latest_version_spirv_header.h + ..//source/opcode.h + ..//source/operand.h + ..//source/spirv_definition.h + ..//source/spirv_validator_options.h + ..//source/table.h + ..//source/util/make_unique.h + ..//source/val/basic_block.h + ..//source/val/construct.h + ..//source/val/decoration.h + ..//source/val/function.h + ..//source/val/instruction.h + ..//source/val/validate.h + ..//source/val/validation_state.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_arithmetics.cpp + extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.o + ..//source/assembly_grammar.h + ..//source/diagnostic.h + ..//source/disassemble.h + ..//source/enum_set.h + ..//source/extensions.h + ..//source/instruction.h + ..//source/latest_version_spirv_header.h + ..//source/opcode.h + ..//source/operand.h + ..//source/spirv_definition.h + ..//source/spirv_target_env.h + ..//source/spirv_validator_options.h + ..//source/table.h + ..//source/util/bitutils.h + ..//source/util/make_unique.h + ..//source/val/basic_block.h + ..//source/val/construct.h + ..//source/val/decoration.h + ..//source/val/function.h + ..//source/val/instruction.h + ..//source/val/validate.h + ..//source/val/validation_state.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_atomics.cpp + extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o + ..//source/assembly_grammar.h + ..//source/diagnostic.h + ..//source/disassemble.h + ..//source/enum_set.h + ..//source/extensions.h + ..//source/instruction.h + ..//source/latest_version_spirv_header.h + ..//source/opcode.h + ..//source/operand.h + ..//source/spirv_constant.h + ..//source/spirv_definition.h + ..//source/spirv_target_env.h + ..//source/spirv_validator_options.h + ..//source/table.h + ..//source/util/bitutils.h + ..//source/util/make_unique.h + ..//source/val/basic_block.h + ..//source/val/construct.h + ..//source/val/decoration.h + ..//source/val/function.h + ..//source/val/instruction.h + ..//source/val/validate.h + ..//source/val/validation_state.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_barriers.cpp + extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.o + ..//source/assembly_grammar.h + ..//source/diagnostic.h + ..//source/disassemble.h + ..//source/enum_set.h + ..//source/extensions.h + ..//source/instruction.h + ..//source/latest_version_spirv_header.h + ..//source/opcode.h + ..//source/operand.h + ..//source/spirv_definition.h + ..//source/spirv_validator_options.h + ..//source/table.h + ..//source/util/make_unique.h + ..//source/val/basic_block.h + ..//source/val/construct.h + ..//source/val/decoration.h + ..//source/val/function.h + ..//source/val/instruction.h + ..//source/val/validate.h + ..//source/val/validation_state.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_bitwise.cpp + extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.o + ..//source/assembly_grammar.h + ..//source/diagnostic.h + ..//source/disassemble.h + ..//source/enum_set.h + ..//source/extensions.h + ..//source/instruction.h + ..//source/latest_version_spirv_header.h + ..//source/opcode.h + ..//source/operand.h + ..//source/spirv_definition.h + ..//source/spirv_target_env.h + ..//source/spirv_validator_options.h + ..//source/table.h + ..//source/util/bitutils.h + ..//source/util/make_unique.h + ..//source/val/basic_block.h + ..//source/val/construct.h + ..//source/val/decoration.h + ..//source/val/function.h + ..//source/val/instruction.h + ..//source/val/validate.h + ..//source/val/validation_state.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_builtins.cpp + extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.o + ..//source/assembly_grammar.h + ..//source/diagnostic.h + ..//source/disassemble.h + ..//source/enum_set.h + ..//source/extensions.h + ..//source/instruction.h + ..//source/latest_version_spirv_header.h + ..//source/opcode.h + ..//source/operand.h + ..//source/spirv_definition.h + ..//source/spirv_validator_options.h + ..//source/table.h + ..//source/util/make_unique.h + ..//source/val/basic_block.h + ..//source/val/construct.h + ..//source/val/decoration.h + ..//source/val/function.h + ..//source/val/instruction.h + ..//source/val/validate.h + ..//source/val/validation_state.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_capability.cpp + extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.o + ..//source/assembly_grammar.h + ..//source/cfa.h + ..//source/diagnostic.h + ..//source/disassemble.h + ..//source/enum_set.h + ..//source/extensions.h + ..//source/instruction.h + ..//source/latest_version_spirv_header.h + ..//source/opcode.h + ..//source/operand.h + ..//source/spirv_definition.h + ..//source/spirv_validator_options.h + ..//source/table.h + ..//source/util/make_unique.h + ..//source/val/basic_block.h + ..//source/val/construct.h + ..//source/val/decoration.h + ..//source/val/function.h + ..//source/val/instruction.h + ..//source/val/validate.h + ..//source/val/validation_state.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_cfg.cpp + extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.o + ..//source/assembly_grammar.h + ..//source/diagnostic.h + ..//source/disassemble.h + ..//source/enum_set.h + ..//source/extensions.h + ..//source/instruction.h + ..//source/latest_version_spirv_header.h + ..//source/opcode.h + ..//source/operand.h + ..//source/spirv_definition.h + ..//source/spirv_validator_options.h + ..//source/table.h + ..//source/util/make_unique.h + ..//source/val/basic_block.h + ..//source/val/construct.h + ..//source/val/decoration.h + ..//source/val/function.h + ..//source/val/instruction.h + ..//source/val/validate.h + ..//source/val/validation_state.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_composites.cpp + extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.o + ..//source/assembly_grammar.h + ..//source/diagnostic.h + ..//source/disassemble.h + ..//source/enum_set.h + ..//source/extensions.h + ..//source/instruction.h + ..//source/latest_version_spirv_header.h + ..//source/opcode.h + ..//source/operand.h + ..//source/spirv_definition.h + ..//source/spirv_validator_options.h + ..//source/table.h + ..//source/util/make_unique.h + ..//source/val/basic_block.h + ..//source/val/construct.h + ..//source/val/decoration.h + ..//source/val/function.h + ..//source/val/instruction.h + ..//source/val/validate.h + ..//source/val/validation_state.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_constants.cpp + extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.o + ..//source/assembly_grammar.h + ..//source/diagnostic.h + ..//source/disassemble.h + ..//source/enum_set.h + ..//source/extensions.h + ..//source/instruction.h + ..//source/latest_version_spirv_header.h + ..//source/opcode.h + ..//source/operand.h + ..//source/spirv_definition.h + ..//source/spirv_validator_options.h + ..//source/table.h + ..//source/util/make_unique.h + ..//source/val/basic_block.h + ..//source/val/construct.h + ..//source/val/decoration.h + ..//source/val/function.h + ..//source/val/instruction.h + ..//source/val/validate.h + ..//source/val/validation_state.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_conversion.cpp + extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.o + ..//source/assembly_grammar.h + ..//source/diagnostic.h + ..//source/disassemble.h + ..//source/enum_set.h + ..//source/extensions.h + ..//source/instruction.h + ..//source/latest_version_spirv_header.h + ..//source/opcode.h + ..//source/operand.h + ..//source/spirv_definition.h + ..//source/spirv_validator_options.h + ..//source/table.h + ..//source/util/make_unique.h + ..//source/val/basic_block.h + ..//source/val/construct.h + ..//source/val/decoration.h + ..//source/val/function.h + ..//source/val/instruction.h + ..//source/val/validate.h + ..//source/val/validation_state.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_datarules.cpp + extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.o + ..//source/assembly_grammar.h + ..//source/diagnostic.h + ..//source/disassemble.h + ..//source/enum_set.h + ..//source/extensions.h + ..//source/instruction.h + ..//source/latest_version_spirv_header.h + ..//source/operand.h + ..//source/spirv_definition.h + ..//source/spirv_validator_options.h + ..//source/table.h + ..//source/util/make_unique.h + ..//source/val/basic_block.h + ..//source/val/construct.h + ..//source/val/decoration.h + ..//source/val/function.h + ..//source/val/instruction.h + ..//source/val/validate.h + ..//source/val/validation_state.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_debug.cpp + extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.o + ..//source/assembly_grammar.h + ..//source/diagnostic.h + ..//source/disassemble.h + ..//source/enum_set.h + ..//source/extensions.h + ..//source/instruction.h + ..//source/latest_version_spirv_header.h + ..//source/opcode.h + ..//source/operand.h + ..//source/spirv_definition.h + ..//source/spirv_target_env.h + ..//source/spirv_validator_options.h + ..//source/table.h + ..//source/util/make_unique.h + ..//source/val/basic_block.h + ..//source/val/construct.h + ..//source/val/decoration.h + ..//source/val/function.h + ..//source/val/instruction.h + ..//source/val/validate.h + ..//source/val/validation_state.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_decorations.cpp + extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.o + ..//source/assembly_grammar.h + ..//source/diagnostic.h + ..//source/disassemble.h + ..//source/enum_set.h + ..//source/extensions.h + ..//source/instruction.h + ..//source/latest_version_spirv_header.h + ..//source/opcode.h + ..//source/operand.h + ..//source/spirv_definition.h + ..//source/spirv_validator_options.h + ..//source/table.h + ..//source/util/make_unique.h + ..//source/val/basic_block.h + ..//source/val/construct.h + ..//source/val/decoration.h + ..//source/val/function.h + ..//source/val/instruction.h + ..//source/val/validate.h + ..//source/val/validation_state.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_derivatives.cpp + extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.o + ..//source/assembly_grammar.h + ..//source/diagnostic.h + ..//source/disassemble.h + ..//source/enum_set.h + ..//source/extensions.h + ..//source/instruction.h + ..//source/latest_version_spirv_header.h + ..//source/operand.h + ..//source/spirv_definition.h + ..//source/spirv_validator_options.h + ..//source/table.h + ..//source/util/make_unique.h + ..//source/val/basic_block.h + ..//source/val/construct.h + ..//source/val/decoration.h + ..//source/val/function.h + ..//source/val/instruction.h + ..//source/val/validate.h + ..//source/val/validation_state.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_execution_limitations.cpp + extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o + ..//source/assembly_grammar.h + ..//source/diagnostic.h + ..//source/disassemble.h + ..//source/enum_set.h + ..//source/extensions.h + ..//source/instruction.h + ..//source/latest_version_glsl_std_450_header.h + ..//source/latest_version_opencl_std_header.h + ..//source/latest_version_spirv_header.h + ..//source/opcode.h + ..//source/operand.h + ..//source/spirv_definition.h + ..//source/spirv_validator_options.h + ..//source/table.h + ..//source/util/make_unique.h + ..//source/val/basic_block.h + ..//source/val/construct.h + ..//source/val/decoration.h + ..//source/val/function.h + ..//source/val/instruction.h + ..//source/val/validate.h + ..//source/val/validation_state.h + ../external/SPIRV-Headers/include/spirv/unified1/GLSL.std.450.h + ../external/SPIRV-Headers/include/spirv/unified1/OpenCL.std.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_ext_inst.cpp + extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.o + ..//source/assembly_grammar.h + ..//source/diagnostic.h + ..//source/disassemble.h + ..//source/enum_set.h + ..//source/extensions.h + ..//source/instruction.h + ..//source/latest_version_spirv_header.h + ..//source/opcode.h + ..//source/operand.h + ..//source/spirv_definition.h + ..//source/spirv_validator_options.h + ..//source/table.h + ..//source/util/make_unique.h + ..//source/val/basic_block.h + ..//source/val/construct.h + ..//source/val/decoration.h + ..//source/val/function.h + ..//source/val/instruction.h + ..//source/val/validate.h + ..//source/val/validation_state.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_function.cpp + extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.o + ..//source/assembly_grammar.h + ..//source/diagnostic.h + ..//source/disassemble.h + ..//source/enum_set.h + ..//source/extensions.h + ..//source/instruction.h + ..//source/latest_version_spirv_header.h + ..//source/opcode.h + ..//source/operand.h + ..//source/spirv_definition.h + ..//source/spirv_validator_options.h + ..//source/table.h + ..//source/util/make_unique.h + ..//source/val/basic_block.h + ..//source/val/construct.h + ..//source/val/decoration.h + ..//source/val/function.h + ..//source/val/instruction.h + ..//source/val/validate.h + ..//source/val/validation_state.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_id.cpp + extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.o + ..//source/assembly_grammar.h + ..//source/diagnostic.h + ..//source/disassemble.h + ..//source/enum_set.h + ..//source/extensions.h + ..//source/instruction.h + ..//source/latest_version_spirv_header.h + ..//source/opcode.h + ..//source/operand.h + ..//source/spirv_definition.h + ..//source/spirv_target_env.h + ..//source/spirv_validator_options.h + ..//source/table.h + ..//source/util/bitutils.h + ..//source/util/make_unique.h + ..//source/val/basic_block.h + ..//source/val/construct.h + ..//source/val/decoration.h + ..//source/val/function.h + ..//source/val/instruction.h + ..//source/val/validate.h + ..//source/val/validation_state.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_image.cpp + extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o + ..//source/assembly_grammar.h + ..//source/binary.h + ..//source/diagnostic.h + ..//source/disassemble.h + ..//source/enum_set.h + ..//source/enum_string_mapping.h + ..//source/extensions.h + ..//source/instruction.h + ..//source/latest_version_spirv_header.h + ..//source/opcode.h + ..//source/operand.h + ..//source/spirv_constant.h + ..//source/spirv_definition.h + ..//source/spirv_target_env.h + ..//source/spirv_validator_options.h + ..//source/table.h + ..//source/util/make_unique.h + ..//source/util/string_utils.h + ..//source/val/basic_block.h + ..//source/val/construct.h + ..//source/val/decoration.h + ..//source/val/function.h + ..//source/val/instruction.h + ..//source/val/validate.h + ..//source/val/validation_state.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_instruction.cpp + extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.o + ..//source/assembly_grammar.h + ..//source/diagnostic.h + ..//source/disassemble.h + ..//source/enum_set.h + ..//source/extensions.h + ..//source/instruction.h + ..//source/latest_version_spirv_header.h + ..//source/operand.h + ..//source/spirv_definition.h + ..//source/spirv_validator_options.h + ..//source/table.h + ..//source/util/make_unique.h + ..//source/val/basic_block.h + ..//source/val/construct.h + ..//source/val/decoration.h + ..//source/val/function.h + ..//source/val/instruction.h + ..//source/val/validate.h + ..//source/val/validation_state.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_interfaces.cpp + extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.o + ..//source/assembly_grammar.h + ..//source/diagnostic.h + ..//source/disassemble.h + ..//source/enum_set.h + ..//source/extensions.h + ..//source/instruction.h + ..//source/latest_version_spirv_header.h + ..//source/opcode.h + ..//source/operand.h + ..//source/spirv_definition.h + ..//source/spirv_validator_options.h + ..//source/table.h + ..//source/util/make_unique.h + ..//source/val/basic_block.h + ..//source/val/construct.h + ..//source/val/decoration.h + ..//source/val/function.h + ..//source/val/instruction.h + ..//source/val/validate.h + ..//source/val/validation_state.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_layout.cpp + extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.o + ..//source/assembly_grammar.h + ..//source/diagnostic.h + ..//source/disassemble.h + ..//source/enum_set.h + ..//source/extensions.h + ..//source/instruction.h + ..//source/latest_version_spirv_header.h + ..//source/opcode.h + ..//source/operand.h + ..//source/spirv_definition.h + ..//source/spirv_validator_options.h + ..//source/table.h + ..//source/util/make_unique.h + ..//source/val/basic_block.h + ..//source/val/construct.h + ..//source/val/decoration.h + ..//source/val/function.h + ..//source/val/instruction.h + ..//source/val/validate.h + ..//source/val/validation_state.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_literals.cpp + extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.o + ..//source/assembly_grammar.h + ..//source/diagnostic.h + ..//source/disassemble.h + ..//source/enum_set.h + ..//source/extensions.h + ..//source/instruction.h + ..//source/latest_version_spirv_header.h + ..//source/opcode.h + ..//source/operand.h + ..//source/spirv_definition.h + ..//source/spirv_validator_options.h + ..//source/table.h + ..//source/util/make_unique.h + ..//source/val/basic_block.h + ..//source/val/construct.h + ..//source/val/decoration.h + ..//source/val/function.h + ..//source/val/instruction.h + ..//source/val/validate.h + ..//source/val/validation_state.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_logicals.cpp + extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.o + ..//source/assembly_grammar.h + ..//source/diagnostic.h + ..//source/disassemble.h + ..//source/enum_set.h + ..//source/extensions.h + ..//source/instruction.h + ..//source/latest_version_spirv_header.h + ..//source/opcode.h + ..//source/operand.h + ..//source/spirv_definition.h + ..//source/spirv_validator_options.h + ..//source/table.h + ..//source/util/make_unique.h + ..//source/val/basic_block.h + ..//source/val/construct.h + ..//source/val/decoration.h + ..//source/val/function.h + ..//source/val/instruction.h + ..//source/val/validate.h + ..//source/val/validation_state.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_memory.cpp + extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.o + ..//source/assembly_grammar.h + ..//source/diagnostic.h + ..//source/disassemble.h + ..//source/enum_set.h + ..//source/extensions.h + ..//source/instruction.h + ..//source/latest_version_spirv_header.h + ..//source/opcode.h + ..//source/operand.h + ..//source/spirv_definition.h + ..//source/spirv_target_env.h + ..//source/spirv_validator_options.h + ..//source/table.h + ..//source/util/make_unique.h + ..//source/val/basic_block.h + ..//source/val/construct.h + ..//source/val/decoration.h + ..//source/val/function.h + ..//source/val/instruction.h + ..//source/val/validate.h + ..//source/val/validation_state.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_mode_setting.cpp + extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o + ..//source/assembly_grammar.h + ..//source/diagnostic.h + ..//source/disassemble.h + ..//source/enum_set.h + ..//source/extensions.h + ..//source/instruction.h + ..//source/latest_version_spirv_header.h + ..//source/opcode.h + ..//source/operand.h + ..//source/spirv_constant.h + ..//source/spirv_definition.h + ..//source/spirv_target_env.h + ..//source/spirv_validator_options.h + ..//source/table.h + ..//source/util/bitutils.h + ..//source/util/make_unique.h + ..//source/val/basic_block.h + ..//source/val/construct.h + ..//source/val/decoration.h + ..//source/val/function.h + ..//source/val/instruction.h + ..//source/val/validate.h + ..//source/val/validation_state.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_non_uniform.cpp + extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.o + ..//source/assembly_grammar.h + ..//source/diagnostic.h + ..//source/disassemble.h + ..//source/enum_set.h + ..//source/extensions.h + ..//source/instruction.h + ..//source/latest_version_spirv_header.h + ..//source/opcode.h + ..//source/operand.h + ..//source/spirv_definition.h + ..//source/spirv_validator_options.h + ..//source/table.h + ..//source/util/make_unique.h + ..//source/val/basic_block.h + ..//source/val/construct.h + ..//source/val/decoration.h + ..//source/val/function.h + ..//source/val/instruction.h + ..//source/val/validate.h + ..//source/val/validation_state.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_primitives.cpp + extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.o + ..//source/assembly_grammar.h + ..//source/diagnostic.h + ..//source/disassemble.h + ..//source/enum_set.h + ..//source/extensions.h + ..//source/instruction.h + ..//source/latest_version_spirv_header.h + ..//source/opcode.h + ..//source/operand.h + ..//source/spirv_definition.h + ..//source/spirv_validator_options.h + ..//source/table.h + ..//source/util/make_unique.h + ..//source/val/basic_block.h + ..//source/val/construct.h + ..//source/val/decoration.h + ..//source/val/function.h + ..//source/val/instruction.h + ..//source/val/validate.h + ..//source/val/validation_state.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validate_type.cpp + extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.o + ..//source/assembly_grammar.h + ..//source/diagnostic.h + ..//source/disassemble.h + ..//source/enum_set.h + ..//source/extensions.h + ..//source/instruction.h + ..//source/latest_version_spirv_header.h + ..//source/opcode.h + ..//source/operand.h + ..//source/spirv_definition.h + ..//source/spirv_target_env.h + ..//source/spirv_validator_options.h + ..//source/table.h + ..//source/util/make_unique.h + ..//source/val/basic_block.h + ..//source/val/construct.h + ..//source/val/decoration.h + ..//source/val/function.h + ..//source/val/instruction.h + ..//source/val/validation_state.h + ../external/SPIRV-Headers/include/spirv/unified1/spirv.h + ../include/spirv-tools/libspirv.h + ../include/spirv-tools/libspirv.hpp + /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/val/validation_state.cpp + extension_enum.inc diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/depend.make b/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/depend.make new file mode 100644 index 000000000..719ea4265 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/depend.make @@ -0,0 +1,1239 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +source/CMakeFiles/SPIRV-Tools.dir/assembly_grammar.cpp.o: ../source/assembly_grammar.h +source/CMakeFiles/SPIRV-Tools.dir/assembly_grammar.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/assembly_grammar.cpp.o: ../source/ext_inst.h +source/CMakeFiles/SPIRV-Tools.dir/assembly_grammar.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/assembly_grammar.cpp.o: ../source/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/assembly_grammar.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/assembly_grammar.cpp.o: ../source/opcode.h +source/CMakeFiles/SPIRV-Tools.dir/assembly_grammar.cpp.o: ../source/operand.h +source/CMakeFiles/SPIRV-Tools.dir/assembly_grammar.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/assembly_grammar.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/assembly_grammar.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/assembly_grammar.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/assembly_grammar.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/assembly_grammar.cpp.o: ../source/assembly_grammar.cpp +source/CMakeFiles/SPIRV-Tools.dir/assembly_grammar.cpp.o: extension_enum.inc + +source/CMakeFiles/SPIRV-Tools.dir/binary.cpp.o: ../source/assembly_grammar.h +source/CMakeFiles/SPIRV-Tools.dir/binary.cpp.o: ../source/binary.h +source/CMakeFiles/SPIRV-Tools.dir/binary.cpp.o: ../source/diagnostic.h +source/CMakeFiles/SPIRV-Tools.dir/binary.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/binary.cpp.o: ../source/ext_inst.h +source/CMakeFiles/SPIRV-Tools.dir/binary.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/binary.cpp.o: ../source/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/binary.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/binary.cpp.o: ../source/opcode.h +source/CMakeFiles/SPIRV-Tools.dir/binary.cpp.o: ../source/operand.h +source/CMakeFiles/SPIRV-Tools.dir/binary.cpp.o: ../source/spirv_constant.h +source/CMakeFiles/SPIRV-Tools.dir/binary.cpp.o: ../source/spirv_definition.h +source/CMakeFiles/SPIRV-Tools.dir/binary.cpp.o: ../source/spirv_endian.h +source/CMakeFiles/SPIRV-Tools.dir/binary.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/binary.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/binary.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/binary.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/binary.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/binary.cpp.o: ../source/binary.cpp +source/CMakeFiles/SPIRV-Tools.dir/binary.cpp.o: extension_enum.inc + +source/CMakeFiles/SPIRV-Tools.dir/diagnostic.cpp.o: ../source/diagnostic.h +source/CMakeFiles/SPIRV-Tools.dir/diagnostic.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/diagnostic.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/diagnostic.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/diagnostic.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/diagnostic.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/diagnostic.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/diagnostic.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/diagnostic.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/diagnostic.cpp.o: ../source/diagnostic.cpp +source/CMakeFiles/SPIRV-Tools.dir/diagnostic.cpp.o: extension_enum.inc + +source/CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.o: ../source/assembly_grammar.h +source/CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.o: ../source/binary.h +source/CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.o: ../source/diagnostic.h +source/CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.o: ../source/disassemble.h +source/CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.o: ../source/ext_inst.h +source/CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.o: ../source/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.o: ../source/name_mapper.h +source/CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.o: ../source/opcode.h +source/CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.o: ../source/operand.h +source/CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.o: ../source/parsed_operand.h +source/CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.o: ../source/print.h +source/CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.o: ../source/spirv_constant.h +source/CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.o: ../source/spirv_definition.h +source/CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.o: ../source/spirv_endian.h +source/CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.o: ../source/util/bitutils.h +source/CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.o: ../source/util/hex_float.h +source/CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.o: ../source/disassemble.cpp +source/CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.o: extension_enum.inc + +source/CMakeFiles/SPIRV-Tools.dir/enum_string_mapping.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/enum_string_mapping.cpp.o: ../source/enum_string_mapping.h +source/CMakeFiles/SPIRV-Tools.dir/enum_string_mapping.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/enum_string_mapping.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/enum_string_mapping.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/enum_string_mapping.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/enum_string_mapping.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/enum_string_mapping.cpp.o: ../source/enum_string_mapping.cpp +source/CMakeFiles/SPIRV-Tools.dir/enum_string_mapping.cpp.o: enum_string_mapping.inc +source/CMakeFiles/SPIRV-Tools.dir/enum_string_mapping.cpp.o: extension_enum.inc + +source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o: ../source/ext_inst.h +source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o: ../source/latest_version_glsl_std_450_header.h +source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o: ../source/latest_version_opencl_std_header.h +source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o: ../source/macro.h +source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o: ../source/spirv_definition.h +source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/GLSL.std.450.h +source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/OpenCL.std.h +source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o: ../source/ext_inst.cpp +source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o: DebugInfo.h +source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o: debuginfo.insts.inc +source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o: extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o: glsl.std.450.insts.inc +source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o: opencl.std.insts.inc +source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o: spv-amd-gcn-shader.insts.inc +source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o: spv-amd-shader-ballot.insts.inc +source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o: spv-amd-shader-explicit-vertex-parameter.insts.inc +source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o: spv-amd-shader-trinary-minmax.insts.inc + +source/CMakeFiles/SPIRV-Tools.dir/extensions.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/extensions.cpp.o: ../source/enum_string_mapping.h +source/CMakeFiles/SPIRV-Tools.dir/extensions.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/extensions.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/extensions.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/extensions.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/extensions.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/extensions.cpp.o: ../source/extensions.cpp +source/CMakeFiles/SPIRV-Tools.dir/extensions.cpp.o: extension_enum.inc + +source/CMakeFiles/SPIRV-Tools.dir/id_descriptor.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/id_descriptor.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/id_descriptor.cpp.o: ../source/id_descriptor.h +source/CMakeFiles/SPIRV-Tools.dir/id_descriptor.cpp.o: ../source/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/id_descriptor.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/id_descriptor.cpp.o: ../source/opcode.h +source/CMakeFiles/SPIRV-Tools.dir/id_descriptor.cpp.o: ../source/operand.h +source/CMakeFiles/SPIRV-Tools.dir/id_descriptor.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/id_descriptor.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/id_descriptor.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/id_descriptor.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/id_descriptor.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/id_descriptor.cpp.o: ../source/id_descriptor.cpp +source/CMakeFiles/SPIRV-Tools.dir/id_descriptor.cpp.o: extension_enum.inc + +source/CMakeFiles/SPIRV-Tools.dir/libspirv.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/libspirv.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/libspirv.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/libspirv.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/libspirv.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/libspirv.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/libspirv.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/libspirv.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/libspirv.cpp.o: ../source/libspirv.cpp +source/CMakeFiles/SPIRV-Tools.dir/libspirv.cpp.o: extension_enum.inc + +source/CMakeFiles/SPIRV-Tools.dir/name_mapper.cpp.o: ../source/assembly_grammar.h +source/CMakeFiles/SPIRV-Tools.dir/name_mapper.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/name_mapper.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/name_mapper.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/name_mapper.cpp.o: ../source/name_mapper.h +source/CMakeFiles/SPIRV-Tools.dir/name_mapper.cpp.o: ../source/operand.h +source/CMakeFiles/SPIRV-Tools.dir/name_mapper.cpp.o: ../source/parsed_operand.h +source/CMakeFiles/SPIRV-Tools.dir/name_mapper.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/name_mapper.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/name_mapper.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/name_mapper.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/name_mapper.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/name_mapper.cpp.o: ../source/name_mapper.cpp +source/CMakeFiles/SPIRV-Tools.dir/name_mapper.cpp.o: extension_enum.inc + +source/CMakeFiles/SPIRV-Tools.dir/opcode.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/opcode.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/opcode.cpp.o: ../source/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/opcode.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/opcode.cpp.o: ../source/macro.h +source/CMakeFiles/SPIRV-Tools.dir/opcode.cpp.o: ../source/opcode.h +source/CMakeFiles/SPIRV-Tools.dir/opcode.cpp.o: ../source/spirv_constant.h +source/CMakeFiles/SPIRV-Tools.dir/opcode.cpp.o: ../source/spirv_endian.h +source/CMakeFiles/SPIRV-Tools.dir/opcode.cpp.o: ../source/spirv_target_env.h +source/CMakeFiles/SPIRV-Tools.dir/opcode.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/opcode.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/opcode.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/opcode.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/opcode.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/opcode.cpp.o: ../source/opcode.cpp +source/CMakeFiles/SPIRV-Tools.dir/opcode.cpp.o: core.insts-unified1.inc +source/CMakeFiles/SPIRV-Tools.dir/opcode.cpp.o: extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/opcode.cpp.o: generators.inc + +source/CMakeFiles/SPIRV-Tools.dir/operand.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/operand.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/operand.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/operand.cpp.o: ../source/macro.h +source/CMakeFiles/SPIRV-Tools.dir/operand.cpp.o: ../source/operand.h +source/CMakeFiles/SPIRV-Tools.dir/operand.cpp.o: ../source/spirv_constant.h +source/CMakeFiles/SPIRV-Tools.dir/operand.cpp.o: ../source/spirv_target_env.h +source/CMakeFiles/SPIRV-Tools.dir/operand.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/operand.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/operand.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/operand.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/operand.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/operand.cpp.o: ../source/operand.cpp +source/CMakeFiles/SPIRV-Tools.dir/operand.cpp.o: extension_enum.inc +source/CMakeFiles/SPIRV-Tools.dir/operand.cpp.o: operand.kinds-unified1.inc + +source/CMakeFiles/SPIRV-Tools.dir/parsed_operand.cpp.o: ../source/parsed_operand.h +source/CMakeFiles/SPIRV-Tools.dir/parsed_operand.cpp.o: ../source/util/bitutils.h +source/CMakeFiles/SPIRV-Tools.dir/parsed_operand.cpp.o: ../source/util/hex_float.h +source/CMakeFiles/SPIRV-Tools.dir/parsed_operand.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/parsed_operand.cpp.o: ../source/parsed_operand.cpp + +source/CMakeFiles/SPIRV-Tools.dir/print.cpp.o: ../source/print.h +source/CMakeFiles/SPIRV-Tools.dir/print.cpp.o: ../source/print.cpp + +source/CMakeFiles/SPIRV-Tools.dir/software_version.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/software_version.cpp.o: ../source/software_version.cpp +source/CMakeFiles/SPIRV-Tools.dir/software_version.cpp.o: build-version.inc + +source/CMakeFiles/SPIRV-Tools.dir/spirv_endian.cpp.o: ../source/spirv_endian.h +source/CMakeFiles/SPIRV-Tools.dir/spirv_endian.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/spirv_endian.cpp.o: ../source/spirv_endian.cpp + +source/CMakeFiles/SPIRV-Tools.dir/spirv_optimizer_options.cpp.o: ../source/spirv_optimizer_options.h +source/CMakeFiles/SPIRV-Tools.dir/spirv_optimizer_options.cpp.o: ../source/spirv_validator_options.h +source/CMakeFiles/SPIRV-Tools.dir/spirv_optimizer_options.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/spirv_optimizer_options.cpp.o: ../source/spirv_optimizer_options.cpp + +source/CMakeFiles/SPIRV-Tools.dir/spirv_target_env.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/spirv_target_env.cpp.o: ../source/spirv_constant.h +source/CMakeFiles/SPIRV-Tools.dir/spirv_target_env.cpp.o: ../source/spirv_target_env.h +source/CMakeFiles/SPIRV-Tools.dir/spirv_target_env.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/spirv_target_env.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/spirv_target_env.cpp.o: ../source/spirv_target_env.cpp + +source/CMakeFiles/SPIRV-Tools.dir/spirv_validator_options.cpp.o: ../source/spirv_validator_options.h +source/CMakeFiles/SPIRV-Tools.dir/spirv_validator_options.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/spirv_validator_options.cpp.o: ../source/spirv_validator_options.cpp + +source/CMakeFiles/SPIRV-Tools.dir/table.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/table.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/table.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/table.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/table.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/table.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/table.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/table.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/table.cpp.o: ../source/table.cpp +source/CMakeFiles/SPIRV-Tools.dir/table.cpp.o: extension_enum.inc + +source/CMakeFiles/SPIRV-Tools.dir/text.cpp.o: ../source/assembly_grammar.h +source/CMakeFiles/SPIRV-Tools.dir/text.cpp.o: ../source/binary.h +source/CMakeFiles/SPIRV-Tools.dir/text.cpp.o: ../source/diagnostic.h +source/CMakeFiles/SPIRV-Tools.dir/text.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/text.cpp.o: ../source/ext_inst.h +source/CMakeFiles/SPIRV-Tools.dir/text.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/text.cpp.o: ../source/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/text.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/text.cpp.o: ../source/opcode.h +source/CMakeFiles/SPIRV-Tools.dir/text.cpp.o: ../source/operand.h +source/CMakeFiles/SPIRV-Tools.dir/text.cpp.o: ../source/spirv_constant.h +source/CMakeFiles/SPIRV-Tools.dir/text.cpp.o: ../source/spirv_definition.h +source/CMakeFiles/SPIRV-Tools.dir/text.cpp.o: ../source/spirv_target_env.h +source/CMakeFiles/SPIRV-Tools.dir/text.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/text.cpp.o: ../source/text.h +source/CMakeFiles/SPIRV-Tools.dir/text.cpp.o: ../source/text_handler.h +source/CMakeFiles/SPIRV-Tools.dir/text.cpp.o: ../source/util/bitutils.h +source/CMakeFiles/SPIRV-Tools.dir/text.cpp.o: ../source/util/hex_float.h +source/CMakeFiles/SPIRV-Tools.dir/text.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/text.cpp.o: ../source/util/parse_number.h +source/CMakeFiles/SPIRV-Tools.dir/text.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/text.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/text.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/text.cpp.o: ../source/text.cpp +source/CMakeFiles/SPIRV-Tools.dir/text.cpp.o: extension_enum.inc + +source/CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.o: ../source/assembly_grammar.h +source/CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.o: ../source/binary.h +source/CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.o: ../source/diagnostic.h +source/CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.o: ../source/ext_inst.h +source/CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.o: ../source/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.o: ../source/opcode.h +source/CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.o: ../source/operand.h +source/CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.o: ../source/spirv_constant.h +source/CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.o: ../source/spirv_definition.h +source/CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.o: ../source/text.h +source/CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.o: ../source/text_handler.h +source/CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.o: ../source/util/bitutils.h +source/CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.o: ../source/util/hex_float.h +source/CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.o: ../source/util/parse_number.h +source/CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.o: ../source/text_handler.cpp +source/CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.o: extension_enum.inc + +source/CMakeFiles/SPIRV-Tools.dir/util/bit_vector.cpp.o: ../source/util/bit_vector.h +source/CMakeFiles/SPIRV-Tools.dir/util/bit_vector.cpp.o: ../source/util/bit_vector.cpp + +source/CMakeFiles/SPIRV-Tools.dir/util/parse_number.cpp.o: ../source/util/bitutils.h +source/CMakeFiles/SPIRV-Tools.dir/util/parse_number.cpp.o: ../source/util/hex_float.h +source/CMakeFiles/SPIRV-Tools.dir/util/parse_number.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/util/parse_number.cpp.o: ../source/util/parse_number.h +source/CMakeFiles/SPIRV-Tools.dir/util/parse_number.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/util/parse_number.cpp.o: ../source/util/parse_number.cpp + +source/CMakeFiles/SPIRV-Tools.dir/util/string_utils.cpp.o: ../source/util/string_utils.h +source/CMakeFiles/SPIRV-Tools.dir/util/string_utils.cpp.o: ../source/util/string_utils.cpp + +source/CMakeFiles/SPIRV-Tools.dir/util/timer.cpp.o: ../source/util/timer.h +source/CMakeFiles/SPIRV-Tools.dir/util/timer.cpp.o: ../source/util/timer.cpp + +source/CMakeFiles/SPIRV-Tools.dir/val/basic_block.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/val/basic_block.cpp.o: ../source/val/basic_block.h +source/CMakeFiles/SPIRV-Tools.dir/val/basic_block.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/basic_block.cpp.o: ../source/val/basic_block.cpp + +source/CMakeFiles/SPIRV-Tools.dir/val/construct.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/val/construct.cpp.o: ../source/val/basic_block.h +source/CMakeFiles/SPIRV-Tools.dir/val/construct.cpp.o: ../source/val/construct.h +source/CMakeFiles/SPIRV-Tools.dir/val/construct.cpp.o: ../source/val/function.h +source/CMakeFiles/SPIRV-Tools.dir/val/construct.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/construct.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/construct.cpp.o: ../source/val/construct.cpp + +source/CMakeFiles/SPIRV-Tools.dir/val/function.cpp.o: ../source/cfa.h +source/CMakeFiles/SPIRV-Tools.dir/val/function.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/val/function.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/val/function.cpp.o: ../source/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/function.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/val/function.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/val/function.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/val/function.cpp.o: ../source/val/basic_block.h +source/CMakeFiles/SPIRV-Tools.dir/val/function.cpp.o: ../source/val/construct.h +source/CMakeFiles/SPIRV-Tools.dir/val/function.cpp.o: ../source/val/function.h +source/CMakeFiles/SPIRV-Tools.dir/val/function.cpp.o: ../source/val/validate.h +source/CMakeFiles/SPIRV-Tools.dir/val/function.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/function.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/function.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/val/function.cpp.o: ../source/val/function.cpp +source/CMakeFiles/SPIRV-Tools.dir/val/function.cpp.o: extension_enum.inc + +source/CMakeFiles/SPIRV-Tools.dir/val/instruction.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/val/instruction.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/val/instruction.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/val/instruction.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/val/instruction.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/val/instruction.cpp.o: ../source/val/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/instruction.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/instruction.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/instruction.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/val/instruction.cpp.o: ../source/val/instruction.cpp +source/CMakeFiles/SPIRV-Tools.dir/val/instruction.cpp.o: extension_enum.inc + +source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o: ../source/assembly_grammar.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o: ../source/binary.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o: ../source/diagnostic.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o: ../source/disassemble.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o: ../source/enum_string_mapping.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o: ../source/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o: ../source/opcode.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o: ../source/operand.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o: ../source/spirv_constant.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o: ../source/spirv_definition.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o: ../source/spirv_endian.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o: ../source/spirv_target_env.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o: ../source/spirv_validator_options.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o: ../source/val/basic_block.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o: ../source/val/construct.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o: ../source/val/decoration.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o: ../source/val/function.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o: ../source/val/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o: ../source/val/validate.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o: ../source/val/validation_state.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o: ../source/val/validate.cpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o: extension_enum.inc + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.o: ../source/assembly_grammar.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.o: ../source/diagnostic.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.o: ../source/disassemble.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.o: ../source/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.o: ../source/opcode.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.o: ../source/operand.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.o: ../source/spirv_definition.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.o: ../source/spirv_validator_options.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.o: ../source/val/basic_block.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.o: ../source/val/construct.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.o: ../source/val/decoration.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.o: ../source/val/function.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.o: ../source/val/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.o: ../source/val/validate.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.o: ../source/val/validation_state.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.o: ../source/val/validate_adjacency.cpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.o: extension_enum.inc + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.o: ../source/assembly_grammar.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.o: ../source/diagnostic.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.o: ../source/disassemble.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.o: ../source/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.o: ../source/opcode.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.o: ../source/operand.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.o: ../source/spirv_definition.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.o: ../source/spirv_validator_options.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.o: ../source/val/basic_block.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.o: ../source/val/construct.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.o: ../source/val/decoration.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.o: ../source/val/function.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.o: ../source/val/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.o: ../source/val/validate.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.o: ../source/val/validation_state.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.o: ../source/val/validate_annotation.cpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.o: extension_enum.inc + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.o: ../source/assembly_grammar.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.o: ../source/diagnostic.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.o: ../source/disassemble.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.o: ../source/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.o: ../source/opcode.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.o: ../source/operand.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.o: ../source/spirv_definition.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.o: ../source/spirv_validator_options.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.o: ../source/val/basic_block.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.o: ../source/val/construct.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.o: ../source/val/decoration.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.o: ../source/val/function.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.o: ../source/val/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.o: ../source/val/validate.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.o: ../source/val/validation_state.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.o: ../source/val/validate_arithmetics.cpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.o: extension_enum.inc + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.o: ../source/assembly_grammar.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.o: ../source/diagnostic.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.o: ../source/disassemble.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.o: ../source/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.o: ../source/opcode.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.o: ../source/operand.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.o: ../source/spirv_definition.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.o: ../source/spirv_target_env.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.o: ../source/spirv_validator_options.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.o: ../source/util/bitutils.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.o: ../source/val/basic_block.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.o: ../source/val/construct.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.o: ../source/val/decoration.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.o: ../source/val/function.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.o: ../source/val/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.o: ../source/val/validate.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.o: ../source/val/validation_state.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.o: ../source/val/validate_atomics.cpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.o: extension_enum.inc + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o: ../source/assembly_grammar.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o: ../source/diagnostic.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o: ../source/disassemble.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o: ../source/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o: ../source/opcode.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o: ../source/operand.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o: ../source/spirv_constant.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o: ../source/spirv_definition.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o: ../source/spirv_target_env.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o: ../source/spirv_validator_options.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o: ../source/util/bitutils.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o: ../source/val/basic_block.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o: ../source/val/construct.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o: ../source/val/decoration.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o: ../source/val/function.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o: ../source/val/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o: ../source/val/validate.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o: ../source/val/validation_state.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o: ../source/val/validate_barriers.cpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o: extension_enum.inc + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.o: ../source/assembly_grammar.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.o: ../source/diagnostic.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.o: ../source/disassemble.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.o: ../source/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.o: ../source/opcode.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.o: ../source/operand.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.o: ../source/spirv_definition.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.o: ../source/spirv_validator_options.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.o: ../source/val/basic_block.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.o: ../source/val/construct.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.o: ../source/val/decoration.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.o: ../source/val/function.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.o: ../source/val/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.o: ../source/val/validate.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.o: ../source/val/validation_state.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.o: ../source/val/validate_bitwise.cpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.o: extension_enum.inc + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.o: ../source/assembly_grammar.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.o: ../source/diagnostic.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.o: ../source/disassemble.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.o: ../source/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.o: ../source/opcode.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.o: ../source/operand.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.o: ../source/spirv_definition.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.o: ../source/spirv_target_env.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.o: ../source/spirv_validator_options.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.o: ../source/util/bitutils.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.o: ../source/val/basic_block.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.o: ../source/val/construct.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.o: ../source/val/decoration.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.o: ../source/val/function.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.o: ../source/val/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.o: ../source/val/validate.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.o: ../source/val/validation_state.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.o: ../source/val/validate_builtins.cpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.o: extension_enum.inc + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.o: ../source/assembly_grammar.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.o: ../source/diagnostic.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.o: ../source/disassemble.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.o: ../source/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.o: ../source/opcode.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.o: ../source/operand.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.o: ../source/spirv_definition.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.o: ../source/spirv_validator_options.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.o: ../source/val/basic_block.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.o: ../source/val/construct.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.o: ../source/val/decoration.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.o: ../source/val/function.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.o: ../source/val/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.o: ../source/val/validate.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.o: ../source/val/validation_state.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.o: ../source/val/validate_capability.cpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.o: extension_enum.inc + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.o: ../source/assembly_grammar.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.o: ../source/cfa.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.o: ../source/diagnostic.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.o: ../source/disassemble.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.o: ../source/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.o: ../source/opcode.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.o: ../source/operand.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.o: ../source/spirv_definition.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.o: ../source/spirv_validator_options.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.o: ../source/val/basic_block.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.o: ../source/val/construct.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.o: ../source/val/decoration.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.o: ../source/val/function.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.o: ../source/val/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.o: ../source/val/validate.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.o: ../source/val/validation_state.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.o: ../source/val/validate_cfg.cpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.o: extension_enum.inc + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.o: ../source/assembly_grammar.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.o: ../source/diagnostic.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.o: ../source/disassemble.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.o: ../source/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.o: ../source/opcode.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.o: ../source/operand.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.o: ../source/spirv_definition.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.o: ../source/spirv_validator_options.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.o: ../source/val/basic_block.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.o: ../source/val/construct.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.o: ../source/val/decoration.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.o: ../source/val/function.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.o: ../source/val/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.o: ../source/val/validate.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.o: ../source/val/validation_state.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.o: ../source/val/validate_composites.cpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.o: extension_enum.inc + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.o: ../source/assembly_grammar.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.o: ../source/diagnostic.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.o: ../source/disassemble.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.o: ../source/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.o: ../source/opcode.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.o: ../source/operand.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.o: ../source/spirv_definition.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.o: ../source/spirv_validator_options.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.o: ../source/val/basic_block.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.o: ../source/val/construct.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.o: ../source/val/decoration.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.o: ../source/val/function.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.o: ../source/val/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.o: ../source/val/validate.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.o: ../source/val/validation_state.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.o: ../source/val/validate_constants.cpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.o: extension_enum.inc + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.o: ../source/assembly_grammar.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.o: ../source/diagnostic.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.o: ../source/disassemble.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.o: ../source/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.o: ../source/opcode.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.o: ../source/operand.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.o: ../source/spirv_definition.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.o: ../source/spirv_validator_options.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.o: ../source/val/basic_block.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.o: ../source/val/construct.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.o: ../source/val/decoration.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.o: ../source/val/function.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.o: ../source/val/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.o: ../source/val/validate.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.o: ../source/val/validation_state.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.o: ../source/val/validate_conversion.cpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.o: extension_enum.inc + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.o: ../source/assembly_grammar.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.o: ../source/diagnostic.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.o: ../source/disassemble.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.o: ../source/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.o: ../source/opcode.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.o: ../source/operand.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.o: ../source/spirv_definition.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.o: ../source/spirv_validator_options.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.o: ../source/val/basic_block.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.o: ../source/val/construct.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.o: ../source/val/decoration.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.o: ../source/val/function.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.o: ../source/val/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.o: ../source/val/validate.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.o: ../source/val/validation_state.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.o: ../source/val/validate_datarules.cpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.o: extension_enum.inc + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.o: ../source/assembly_grammar.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.o: ../source/diagnostic.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.o: ../source/disassemble.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.o: ../source/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.o: ../source/operand.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.o: ../source/spirv_definition.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.o: ../source/spirv_validator_options.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.o: ../source/val/basic_block.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.o: ../source/val/construct.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.o: ../source/val/decoration.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.o: ../source/val/function.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.o: ../source/val/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.o: ../source/val/validate.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.o: ../source/val/validation_state.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.o: ../source/val/validate_debug.cpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.o: extension_enum.inc + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.o: ../source/assembly_grammar.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.o: ../source/diagnostic.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.o: ../source/disassemble.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.o: ../source/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.o: ../source/opcode.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.o: ../source/operand.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.o: ../source/spirv_definition.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.o: ../source/spirv_target_env.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.o: ../source/spirv_validator_options.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.o: ../source/val/basic_block.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.o: ../source/val/construct.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.o: ../source/val/decoration.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.o: ../source/val/function.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.o: ../source/val/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.o: ../source/val/validate.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.o: ../source/val/validation_state.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.o: ../source/val/validate_decorations.cpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.o: extension_enum.inc + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.o: ../source/assembly_grammar.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.o: ../source/diagnostic.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.o: ../source/disassemble.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.o: ../source/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.o: ../source/opcode.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.o: ../source/operand.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.o: ../source/spirv_definition.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.o: ../source/spirv_validator_options.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.o: ../source/val/basic_block.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.o: ../source/val/construct.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.o: ../source/val/decoration.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.o: ../source/val/function.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.o: ../source/val/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.o: ../source/val/validate.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.o: ../source/val/validation_state.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.o: ../source/val/validate_derivatives.cpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.o: extension_enum.inc + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.o: ../source/assembly_grammar.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.o: ../source/diagnostic.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.o: ../source/disassemble.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.o: ../source/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.o: ../source/operand.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.o: ../source/spirv_definition.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.o: ../source/spirv_validator_options.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.o: ../source/val/basic_block.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.o: ../source/val/construct.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.o: ../source/val/decoration.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.o: ../source/val/function.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.o: ../source/val/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.o: ../source/val/validate.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.o: ../source/val/validation_state.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.o: ../source/val/validate_execution_limitations.cpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.o: extension_enum.inc + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o: ../source/assembly_grammar.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o: ../source/diagnostic.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o: ../source/disassemble.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o: ../source/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o: ../source/latest_version_glsl_std_450_header.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o: ../source/latest_version_opencl_std_header.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o: ../source/opcode.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o: ../source/operand.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o: ../source/spirv_definition.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o: ../source/spirv_validator_options.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o: ../source/val/basic_block.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o: ../source/val/construct.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o: ../source/val/decoration.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o: ../source/val/function.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o: ../source/val/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o: ../source/val/validate.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o: ../source/val/validation_state.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/GLSL.std.450.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/OpenCL.std.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o: ../source/val/validate_ext_inst.cpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o: extension_enum.inc + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.o: ../source/assembly_grammar.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.o: ../source/diagnostic.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.o: ../source/disassemble.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.o: ../source/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.o: ../source/opcode.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.o: ../source/operand.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.o: ../source/spirv_definition.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.o: ../source/spirv_validator_options.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.o: ../source/val/basic_block.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.o: ../source/val/construct.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.o: ../source/val/decoration.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.o: ../source/val/function.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.o: ../source/val/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.o: ../source/val/validate.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.o: ../source/val/validation_state.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.o: ../source/val/validate_function.cpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.o: extension_enum.inc + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.o: ../source/assembly_grammar.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.o: ../source/diagnostic.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.o: ../source/disassemble.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.o: ../source/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.o: ../source/opcode.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.o: ../source/operand.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.o: ../source/spirv_definition.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.o: ../source/spirv_validator_options.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.o: ../source/val/basic_block.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.o: ../source/val/construct.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.o: ../source/val/decoration.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.o: ../source/val/function.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.o: ../source/val/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.o: ../source/val/validate.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.o: ../source/val/validation_state.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.o: ../source/val/validate_id.cpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.o: extension_enum.inc + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.o: ../source/assembly_grammar.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.o: ../source/diagnostic.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.o: ../source/disassemble.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.o: ../source/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.o: ../source/opcode.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.o: ../source/operand.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.o: ../source/spirv_definition.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.o: ../source/spirv_target_env.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.o: ../source/spirv_validator_options.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.o: ../source/util/bitutils.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.o: ../source/val/basic_block.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.o: ../source/val/construct.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.o: ../source/val/decoration.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.o: ../source/val/function.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.o: ../source/val/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.o: ../source/val/validate.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.o: ../source/val/validation_state.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.o: ../source/val/validate_image.cpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.o: extension_enum.inc + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o: ../source/assembly_grammar.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o: ../source/binary.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o: ../source/diagnostic.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o: ../source/disassemble.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o: ../source/enum_string_mapping.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o: ../source/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o: ../source/opcode.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o: ../source/operand.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o: ../source/spirv_constant.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o: ../source/spirv_definition.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o: ../source/spirv_target_env.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o: ../source/spirv_validator_options.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o: ../source/util/string_utils.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o: ../source/val/basic_block.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o: ../source/val/construct.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o: ../source/val/decoration.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o: ../source/val/function.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o: ../source/val/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o: ../source/val/validate.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o: ../source/val/validation_state.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o: ../source/val/validate_instruction.cpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o: extension_enum.inc + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.o: ../source/assembly_grammar.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.o: ../source/diagnostic.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.o: ../source/disassemble.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.o: ../source/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.o: ../source/operand.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.o: ../source/spirv_definition.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.o: ../source/spirv_validator_options.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.o: ../source/val/basic_block.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.o: ../source/val/construct.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.o: ../source/val/decoration.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.o: ../source/val/function.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.o: ../source/val/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.o: ../source/val/validate.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.o: ../source/val/validation_state.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.o: ../source/val/validate_interfaces.cpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.o: extension_enum.inc + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.o: ../source/assembly_grammar.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.o: ../source/diagnostic.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.o: ../source/disassemble.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.o: ../source/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.o: ../source/opcode.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.o: ../source/operand.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.o: ../source/spirv_definition.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.o: ../source/spirv_validator_options.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.o: ../source/val/basic_block.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.o: ../source/val/construct.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.o: ../source/val/decoration.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.o: ../source/val/function.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.o: ../source/val/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.o: ../source/val/validate.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.o: ../source/val/validation_state.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.o: ../source/val/validate_layout.cpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.o: extension_enum.inc + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.o: ../source/assembly_grammar.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.o: ../source/diagnostic.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.o: ../source/disassemble.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.o: ../source/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.o: ../source/opcode.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.o: ../source/operand.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.o: ../source/spirv_definition.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.o: ../source/spirv_validator_options.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.o: ../source/val/basic_block.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.o: ../source/val/construct.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.o: ../source/val/decoration.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.o: ../source/val/function.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.o: ../source/val/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.o: ../source/val/validate.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.o: ../source/val/validation_state.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.o: ../source/val/validate_literals.cpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.o: extension_enum.inc + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.o: ../source/assembly_grammar.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.o: ../source/diagnostic.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.o: ../source/disassemble.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.o: ../source/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.o: ../source/opcode.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.o: ../source/operand.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.o: ../source/spirv_definition.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.o: ../source/spirv_validator_options.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.o: ../source/val/basic_block.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.o: ../source/val/construct.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.o: ../source/val/decoration.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.o: ../source/val/function.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.o: ../source/val/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.o: ../source/val/validate.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.o: ../source/val/validation_state.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.o: ../source/val/validate_logicals.cpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.o: extension_enum.inc + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.o: ../source/assembly_grammar.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.o: ../source/diagnostic.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.o: ../source/disassemble.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.o: ../source/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.o: ../source/opcode.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.o: ../source/operand.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.o: ../source/spirv_definition.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.o: ../source/spirv_validator_options.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.o: ../source/val/basic_block.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.o: ../source/val/construct.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.o: ../source/val/decoration.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.o: ../source/val/function.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.o: ../source/val/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.o: ../source/val/validate.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.o: ../source/val/validation_state.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.o: ../source/val/validate_memory.cpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.o: extension_enum.inc + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.o: ../source/assembly_grammar.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.o: ../source/diagnostic.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.o: ../source/disassemble.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.o: ../source/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.o: ../source/opcode.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.o: ../source/operand.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.o: ../source/spirv_definition.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.o: ../source/spirv_target_env.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.o: ../source/spirv_validator_options.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.o: ../source/val/basic_block.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.o: ../source/val/construct.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.o: ../source/val/decoration.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.o: ../source/val/function.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.o: ../source/val/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.o: ../source/val/validate.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.o: ../source/val/validation_state.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.o: ../source/val/validate_mode_setting.cpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.o: extension_enum.inc + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o: ../source/assembly_grammar.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o: ../source/diagnostic.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o: ../source/disassemble.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o: ../source/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o: ../source/opcode.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o: ../source/operand.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o: ../source/spirv_constant.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o: ../source/spirv_definition.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o: ../source/spirv_target_env.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o: ../source/spirv_validator_options.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o: ../source/util/bitutils.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o: ../source/val/basic_block.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o: ../source/val/construct.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o: ../source/val/decoration.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o: ../source/val/function.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o: ../source/val/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o: ../source/val/validate.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o: ../source/val/validation_state.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o: ../source/val/validate_non_uniform.cpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o: extension_enum.inc + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.o: ../source/assembly_grammar.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.o: ../source/diagnostic.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.o: ../source/disassemble.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.o: ../source/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.o: ../source/opcode.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.o: ../source/operand.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.o: ../source/spirv_definition.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.o: ../source/spirv_validator_options.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.o: ../source/val/basic_block.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.o: ../source/val/construct.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.o: ../source/val/decoration.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.o: ../source/val/function.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.o: ../source/val/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.o: ../source/val/validate.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.o: ../source/val/validation_state.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.o: ../source/val/validate_primitives.cpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.o: extension_enum.inc + +source/CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.o: ../source/assembly_grammar.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.o: ../source/diagnostic.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.o: ../source/disassemble.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.o: ../source/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.o: ../source/opcode.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.o: ../source/operand.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.o: ../source/spirv_definition.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.o: ../source/spirv_validator_options.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.o: ../source/val/basic_block.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.o: ../source/val/construct.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.o: ../source/val/decoration.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.o: ../source/val/function.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.o: ../source/val/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.o: ../source/val/validate.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.o: ../source/val/validation_state.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.o: ../source/val/validate_type.cpp +source/CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.o: extension_enum.inc + +source/CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.o: ../source/assembly_grammar.h +source/CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.o: ../source/diagnostic.h +source/CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.o: ../source/disassemble.h +source/CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.o: ../source/enum_set.h +source/CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.o: ../source/extensions.h +source/CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.o: ../source/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.o: ../source/latest_version_spirv_header.h +source/CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.o: ../source/opcode.h +source/CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.o: ../source/operand.h +source/CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.o: ../source/spirv_definition.h +source/CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.o: ../source/spirv_target_env.h +source/CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.o: ../source/spirv_validator_options.h +source/CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.o: ../source/table.h +source/CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.o: ../source/util/make_unique.h +source/CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.o: ../source/val/basic_block.h +source/CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.o: ../source/val/construct.h +source/CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.o: ../source/val/decoration.h +source/CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.o: ../source/val/function.h +source/CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.o: ../source/val/instruction.h +source/CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.o: ../source/val/validation_state.h +source/CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.o: ../external/SPIRV-Headers/include/spirv/unified1/spirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.o: ../include/spirv-tools/libspirv.h +source/CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.o: ../include/spirv-tools/libspirv.hpp +source/CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.o: ../source/val/validation_state.cpp +source/CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.o: extension_enum.inc + diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/diagnostic.cpp.o b/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/diagnostic.cpp.o new file mode 100644 index 0000000000000000000000000000000000000000..1640b97f88dcf016803d9d005732cc78581a78c7 GIT binary patch literal 185128 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ø|9A)Is7qKv`2j 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 z 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 literal 0 HcmV?d00001 diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/enum_string_mapping.cpp.o b/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/enum_string_mapping.cpp.o new file mode 100644 index 0000000000000000000000000000000000000000..9dcbe52fa79c85f78a99de5656c335c5bca0fd99 GIT binary patch literal 88360 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�M6lm7g8dJp*f02*SWHyII2-Zvjv*!> zEaUin809;jCw-y+Dp8)qylRvmjn6yueYQW#l#kT@Luh|iwv@E~xBCh9zs<{8r!8?w zzJ2z*$=H|4)rGRFqLiOfBqg?KL7dsviYWE(IzS}#zHqkw?aYJgzdefm8}AW=t6^79 zY=27>``2fPq<$^YY1Eu|X!+~S`|hFs zS60WoA1VIhGR0C5imm@Tn}?Ry_21^MWWraSIYi3qzS4*0iR*8#x$ai>^k)0)d4=fz cfO&1#O159uut@fEcbGTKv9rFM^_lJe3u1!rQ2+n{ literal 0 HcmV?d00001 diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o b/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o new file mode 100644 index 0000000000000000000000000000000000000000..645c4fbeafce3b9501869485a3cc1356a19e20b9 GIT binary patch literal 157536 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

#rqJbAoGFgD?2NvcIO_V;sJ?r4qn{nq7Y?e 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 literal 0 HcmV?d00001 diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/extensions.cpp.o b/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/extensions.cpp.o new file mode 100644 index 0000000000000000000000000000000000000000..aed8d263966934acd974ae7d639812cf4e52ad53 GIT binary patch literal 208624 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

*4{lLEkJGd@FJ8ywJ<_FhBD39wR^jja+59l`z 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 ~l?j1zhEq0w4WPj?de`RsI9uYYSL@ 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ⅇ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 literal 0 HcmV?d00001 diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/util/string_utils.cpp.o b/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/util/string_utils.cpp.o new file mode 100644 index 0000000000000000000000000000000000000000..fb3bc7075c7429746c01fc886a552f9c241c5b34 GIT binary patch literal 97472 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 z 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 literal 0 HcmV?d00001 diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/progress.marks b/3rdparty/spirv-tools/build/source/CMakeFiles/progress.marks new file mode 100644 index 000000000..8643cf6de --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/progress.marks @@ -0,0 +1 @@ +89 diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-build-version.dir/DependInfo.cmake b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-build-version.dir/DependInfo.cmake new file mode 100644 index 000000000..19fab2149 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-build-version.dir/DependInfo.cmake @@ -0,0 +1,11 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) +# The set of files for implicit dependencies of each language: + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-build-version.dir/build.make b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-build-version.dir/build.make new file mode 100644 index 000000000..e5aa94040 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-build-version.dir/build.make @@ -0,0 +1,82 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + +# Utility rule file for spirv-tools-build-version. + +# Include the progress variables for this target. +include source/CMakeFiles/spirv-tools-build-version.dir/progress.make + +source/CMakeFiles/spirv-tools-build-version: build-version.inc + + +build-version.inc: ../utils/update_build_version.py +build-version.inc: ../CHANGES + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --blue --bold --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Update build-version.inc in the SPIRV-Tools build directory (if necessary)." + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/python /home/bkaradzic/Private/projects/_github/SPIRV-Tools/utils/update_build_version.py /home/bkaradzic/Private/projects/_github/SPIRV-Tools /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/build-version.inc + +spirv-tools-build-version: source/CMakeFiles/spirv-tools-build-version +spirv-tools-build-version: build-version.inc +spirv-tools-build-version: source/CMakeFiles/spirv-tools-build-version.dir/build.make + +.PHONY : spirv-tools-build-version + +# Rule to build all files generated by this target. +source/CMakeFiles/spirv-tools-build-version.dir/build: spirv-tools-build-version + +.PHONY : source/CMakeFiles/spirv-tools-build-version.dir/build + +source/CMakeFiles/spirv-tools-build-version.dir/clean: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && $(CMAKE_COMMAND) -P CMakeFiles/spirv-tools-build-version.dir/cmake_clean.cmake +.PHONY : source/CMakeFiles/spirv-tools-build-version.dir/clean + +source/CMakeFiles/spirv-tools-build-version.dir/depend: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/bkaradzic/Private/projects/_github/SPIRV-Tools /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/spirv-tools-build-version.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : source/CMakeFiles/spirv-tools-build-version.dir/depend + diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-build-version.dir/cmake_clean.cmake b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-build-version.dir/cmake_clean.cmake new file mode 100644 index 000000000..feb846fe0 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-build-version.dir/cmake_clean.cmake @@ -0,0 +1,9 @@ +file(REMOVE_RECURSE + "CMakeFiles/spirv-tools-build-version" + "../build-version.inc" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/spirv-tools-build-version.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-build-version.dir/progress.make b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-build-version.dir/progress.make new file mode 100644 index 000000000..225de343d --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-build-version.dir/progress.make @@ -0,0 +1,2 @@ +CMAKE_PROGRESS_1 = + diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-debuginfo.dir/DependInfo.cmake b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-debuginfo.dir/DependInfo.cmake new file mode 100644 index 000000000..19fab2149 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-debuginfo.dir/DependInfo.cmake @@ -0,0 +1,11 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) +# The set of files for implicit dependencies of each language: + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-debuginfo.dir/build.make b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-debuginfo.dir/build.make new file mode 100644 index 000000000..cd2b7b3c3 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-debuginfo.dir/build.make @@ -0,0 +1,82 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + +# Utility rule file for spirv-tools-debuginfo. + +# Include the progress variables for this target. +include source/CMakeFiles/spirv-tools-debuginfo.dir/progress.make + +source/CMakeFiles/spirv-tools-debuginfo: debuginfo.insts.inc + + +debuginfo.insts.inc: ../utils/generate_grammar_tables.py +debuginfo.insts.inc: ../source/extinst.debuginfo.grammar.json + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --blue --bold --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Generate extended instruction tables for debuginfo." + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/python /home/bkaradzic/Private/projects/_github/SPIRV-Tools/utils/generate_grammar_tables.py --extinst-vendor-grammar=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/extinst.debuginfo.grammar.json --vendor-insts-output=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/debuginfo.insts.inc + +spirv-tools-debuginfo: source/CMakeFiles/spirv-tools-debuginfo +spirv-tools-debuginfo: debuginfo.insts.inc +spirv-tools-debuginfo: source/CMakeFiles/spirv-tools-debuginfo.dir/build.make + +.PHONY : spirv-tools-debuginfo + +# Rule to build all files generated by this target. +source/CMakeFiles/spirv-tools-debuginfo.dir/build: spirv-tools-debuginfo + +.PHONY : source/CMakeFiles/spirv-tools-debuginfo.dir/build + +source/CMakeFiles/spirv-tools-debuginfo.dir/clean: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && $(CMAKE_COMMAND) -P CMakeFiles/spirv-tools-debuginfo.dir/cmake_clean.cmake +.PHONY : source/CMakeFiles/spirv-tools-debuginfo.dir/clean + +source/CMakeFiles/spirv-tools-debuginfo.dir/depend: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/bkaradzic/Private/projects/_github/SPIRV-Tools /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/spirv-tools-debuginfo.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : source/CMakeFiles/spirv-tools-debuginfo.dir/depend + diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-debuginfo.dir/cmake_clean.cmake b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-debuginfo.dir/cmake_clean.cmake new file mode 100644 index 000000000..cc07f7737 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-debuginfo.dir/cmake_clean.cmake @@ -0,0 +1,9 @@ +file(REMOVE_RECURSE + "CMakeFiles/spirv-tools-debuginfo" + "../debuginfo.insts.inc" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/spirv-tools-debuginfo.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-debuginfo.dir/progress.make b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-debuginfo.dir/progress.make new file mode 100644 index 000000000..225de343d --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-debuginfo.dir/progress.make @@ -0,0 +1,2 @@ +CMAKE_PROGRESS_1 = + diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-header-DebugInfo.dir/DependInfo.cmake b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-header-DebugInfo.dir/DependInfo.cmake new file mode 100644 index 000000000..19fab2149 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-header-DebugInfo.dir/DependInfo.cmake @@ -0,0 +1,11 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) +# The set of files for implicit dependencies of each language: + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-header-DebugInfo.dir/build.make b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-header-DebugInfo.dir/build.make new file mode 100644 index 000000000..e4a4ecea6 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-header-DebugInfo.dir/build.make @@ -0,0 +1,82 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + +# Utility rule file for spirv-tools-header-DebugInfo. + +# Include the progress variables for this target. +include source/CMakeFiles/spirv-tools-header-DebugInfo.dir/progress.make + +source/CMakeFiles/spirv-tools-header-DebugInfo: DebugInfo.h + + +DebugInfo.h: ../utils/generate_language_headers.py +DebugInfo.h: ../source/extinst.debuginfo.grammar.json + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --blue --bold --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Generate language specific header for DebugInfo." + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/python /home/bkaradzic/Private/projects/_github/SPIRV-Tools/utils/generate_language_headers.py --extinst-name=DebugInfo --extinst-grammar=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/extinst.debuginfo.grammar.json --extinst-output-base=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/DebugInfo + +spirv-tools-header-DebugInfo: source/CMakeFiles/spirv-tools-header-DebugInfo +spirv-tools-header-DebugInfo: DebugInfo.h +spirv-tools-header-DebugInfo: source/CMakeFiles/spirv-tools-header-DebugInfo.dir/build.make + +.PHONY : spirv-tools-header-DebugInfo + +# Rule to build all files generated by this target. +source/CMakeFiles/spirv-tools-header-DebugInfo.dir/build: spirv-tools-header-DebugInfo + +.PHONY : source/CMakeFiles/spirv-tools-header-DebugInfo.dir/build + +source/CMakeFiles/spirv-tools-header-DebugInfo.dir/clean: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && $(CMAKE_COMMAND) -P CMakeFiles/spirv-tools-header-DebugInfo.dir/cmake_clean.cmake +.PHONY : source/CMakeFiles/spirv-tools-header-DebugInfo.dir/clean + +source/CMakeFiles/spirv-tools-header-DebugInfo.dir/depend: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/bkaradzic/Private/projects/_github/SPIRV-Tools /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/spirv-tools-header-DebugInfo.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : source/CMakeFiles/spirv-tools-header-DebugInfo.dir/depend + diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-header-DebugInfo.dir/cmake_clean.cmake b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-header-DebugInfo.dir/cmake_clean.cmake new file mode 100644 index 000000000..adebc2079 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-header-DebugInfo.dir/cmake_clean.cmake @@ -0,0 +1,9 @@ +file(REMOVE_RECURSE + "CMakeFiles/spirv-tools-header-DebugInfo" + "../DebugInfo.h" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/spirv-tools-header-DebugInfo.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-header-DebugInfo.dir/progress.make b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-header-DebugInfo.dir/progress.make new file mode 100644 index 000000000..ac6b5844b --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-header-DebugInfo.dir/progress.make @@ -0,0 +1,2 @@ +CMAKE_PROGRESS_1 = 97 + diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/DependInfo.cmake b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/DependInfo.cmake new file mode 100644 index 000000000..19fab2149 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/DependInfo.cmake @@ -0,0 +1,11 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) +# The set of files for implicit dependencies of each language: + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/build.make b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/build.make new file mode 100644 index 000000000..94b110db4 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/build.make @@ -0,0 +1,82 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + +# Utility rule file for spirv-tools-spv-amd-gcn-shader. + +# Include the progress variables for this target. +include source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/progress.make + +source/CMakeFiles/spirv-tools-spv-amd-gcn-shader: spv-amd-gcn-shader.insts.inc + + +spv-amd-gcn-shader.insts.inc: ../utils/generate_grammar_tables.py +spv-amd-gcn-shader.insts.inc: ../source/extinst.spv-amd-gcn-shader.grammar.json + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --blue --bold --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Generate extended instruction tables for spv-amd-gcn-shader." + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/python /home/bkaradzic/Private/projects/_github/SPIRV-Tools/utils/generate_grammar_tables.py --extinst-vendor-grammar=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/extinst.spv-amd-gcn-shader.grammar.json --vendor-insts-output=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/spv-amd-gcn-shader.insts.inc + +spirv-tools-spv-amd-gcn-shader: source/CMakeFiles/spirv-tools-spv-amd-gcn-shader +spirv-tools-spv-amd-gcn-shader: spv-amd-gcn-shader.insts.inc +spirv-tools-spv-amd-gcn-shader: source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/build.make + +.PHONY : spirv-tools-spv-amd-gcn-shader + +# Rule to build all files generated by this target. +source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/build: spirv-tools-spv-amd-gcn-shader + +.PHONY : source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/build + +source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/clean: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && $(CMAKE_COMMAND) -P CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/cmake_clean.cmake +.PHONY : source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/clean + +source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/depend: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/bkaradzic/Private/projects/_github/SPIRV-Tools /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/depend + diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/cmake_clean.cmake b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/cmake_clean.cmake new file mode 100644 index 000000000..3cd25a9ca --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/cmake_clean.cmake @@ -0,0 +1,9 @@ +file(REMOVE_RECURSE + "CMakeFiles/spirv-tools-spv-amd-gcn-shader" + "../spv-amd-gcn-shader.insts.inc" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/progress.make b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/progress.make new file mode 100644 index 000000000..225de343d --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/progress.make @@ -0,0 +1,2 @@ +CMAKE_PROGRESS_1 = + diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/DependInfo.cmake b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/DependInfo.cmake new file mode 100644 index 000000000..19fab2149 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/DependInfo.cmake @@ -0,0 +1,11 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) +# The set of files for implicit dependencies of each language: + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/build.make b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/build.make new file mode 100644 index 000000000..85d2373eb --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/build.make @@ -0,0 +1,82 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + +# Utility rule file for spirv-tools-spv-amd-shader-ballot. + +# Include the progress variables for this target. +include source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/progress.make + +source/CMakeFiles/spirv-tools-spv-amd-shader-ballot: spv-amd-shader-ballot.insts.inc + + +spv-amd-shader-ballot.insts.inc: ../utils/generate_grammar_tables.py +spv-amd-shader-ballot.insts.inc: ../source/extinst.spv-amd-shader-ballot.grammar.json + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --blue --bold --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Generate extended instruction tables for spv-amd-shader-ballot." + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/python /home/bkaradzic/Private/projects/_github/SPIRV-Tools/utils/generate_grammar_tables.py --extinst-vendor-grammar=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/extinst.spv-amd-shader-ballot.grammar.json --vendor-insts-output=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/spv-amd-shader-ballot.insts.inc + +spirv-tools-spv-amd-shader-ballot: source/CMakeFiles/spirv-tools-spv-amd-shader-ballot +spirv-tools-spv-amd-shader-ballot: spv-amd-shader-ballot.insts.inc +spirv-tools-spv-amd-shader-ballot: source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/build.make + +.PHONY : spirv-tools-spv-amd-shader-ballot + +# Rule to build all files generated by this target. +source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/build: spirv-tools-spv-amd-shader-ballot + +.PHONY : source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/build + +source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/clean: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && $(CMAKE_COMMAND) -P CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/cmake_clean.cmake +.PHONY : source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/clean + +source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/depend: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/bkaradzic/Private/projects/_github/SPIRV-Tools /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/depend + diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/cmake_clean.cmake b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/cmake_clean.cmake new file mode 100644 index 000000000..688a45782 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/cmake_clean.cmake @@ -0,0 +1,9 @@ +file(REMOVE_RECURSE + "CMakeFiles/spirv-tools-spv-amd-shader-ballot" + "../spv-amd-shader-ballot.insts.inc" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/progress.make b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/progress.make new file mode 100644 index 000000000..225de343d --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/progress.make @@ -0,0 +1,2 @@ +CMAKE_PROGRESS_1 = + diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/DependInfo.cmake b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/DependInfo.cmake new file mode 100644 index 000000000..19fab2149 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/DependInfo.cmake @@ -0,0 +1,11 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) +# The set of files for implicit dependencies of each language: + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/build.make b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/build.make new file mode 100644 index 000000000..145a32f80 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/build.make @@ -0,0 +1,82 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + +# Utility rule file for spirv-tools-spv-amd-shader-explicit-vertex-parameter. + +# Include the progress variables for this target. +include source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/progress.make + +source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter: spv-amd-shader-explicit-vertex-parameter.insts.inc + + +spv-amd-shader-explicit-vertex-parameter.insts.inc: ../utils/generate_grammar_tables.py +spv-amd-shader-explicit-vertex-parameter.insts.inc: ../source/extinst.spv-amd-shader-explicit-vertex-parameter.grammar.json + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --blue --bold --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Generate extended instruction tables for spv-amd-shader-explicit-vertex-parameter." + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/python /home/bkaradzic/Private/projects/_github/SPIRV-Tools/utils/generate_grammar_tables.py --extinst-vendor-grammar=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/extinst.spv-amd-shader-explicit-vertex-parameter.grammar.json --vendor-insts-output=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/spv-amd-shader-explicit-vertex-parameter.insts.inc + +spirv-tools-spv-amd-shader-explicit-vertex-parameter: source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter +spirv-tools-spv-amd-shader-explicit-vertex-parameter: spv-amd-shader-explicit-vertex-parameter.insts.inc +spirv-tools-spv-amd-shader-explicit-vertex-parameter: source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/build.make + +.PHONY : spirv-tools-spv-amd-shader-explicit-vertex-parameter + +# Rule to build all files generated by this target. +source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/build: spirv-tools-spv-amd-shader-explicit-vertex-parameter + +.PHONY : source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/build + +source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/clean: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && $(CMAKE_COMMAND) -P CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/cmake_clean.cmake +.PHONY : source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/clean + +source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/depend: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/bkaradzic/Private/projects/_github/SPIRV-Tools /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/depend + diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/cmake_clean.cmake b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/cmake_clean.cmake new file mode 100644 index 000000000..7798d5195 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/cmake_clean.cmake @@ -0,0 +1,9 @@ +file(REMOVE_RECURSE + "CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter" + "../spv-amd-shader-explicit-vertex-parameter.insts.inc" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/progress.make b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/progress.make new file mode 100644 index 000000000..9e973d36e --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/progress.make @@ -0,0 +1,2 @@ +CMAKE_PROGRESS_1 = 98 + diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/DependInfo.cmake b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/DependInfo.cmake new file mode 100644 index 000000000..19fab2149 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/DependInfo.cmake @@ -0,0 +1,11 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) +# The set of files for implicit dependencies of each language: + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/build.make b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/build.make new file mode 100644 index 000000000..cb3eeef58 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/build.make @@ -0,0 +1,82 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + +# Utility rule file for spirv-tools-spv-amd-shader-trinary-minmax. + +# Include the progress variables for this target. +include source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/progress.make + +source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax: spv-amd-shader-trinary-minmax.insts.inc + + +spv-amd-shader-trinary-minmax.insts.inc: ../utils/generate_grammar_tables.py +spv-amd-shader-trinary-minmax.insts.inc: ../source/extinst.spv-amd-shader-trinary-minmax.grammar.json + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --blue --bold --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Generate extended instruction tables for spv-amd-shader-trinary-minmax." + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/python /home/bkaradzic/Private/projects/_github/SPIRV-Tools/utils/generate_grammar_tables.py --extinst-vendor-grammar=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/extinst.spv-amd-shader-trinary-minmax.grammar.json --vendor-insts-output=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/spv-amd-shader-trinary-minmax.insts.inc + +spirv-tools-spv-amd-shader-trinary-minmax: source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax +spirv-tools-spv-amd-shader-trinary-minmax: spv-amd-shader-trinary-minmax.insts.inc +spirv-tools-spv-amd-shader-trinary-minmax: source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/build.make + +.PHONY : spirv-tools-spv-amd-shader-trinary-minmax + +# Rule to build all files generated by this target. +source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/build: spirv-tools-spv-amd-shader-trinary-minmax + +.PHONY : source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/build + +source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/clean: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && $(CMAKE_COMMAND) -P CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/cmake_clean.cmake +.PHONY : source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/clean + +source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/depend: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/bkaradzic/Private/projects/_github/SPIRV-Tools /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/depend + diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/cmake_clean.cmake b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/cmake_clean.cmake new file mode 100644 index 000000000..3ef5ed41a --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/cmake_clean.cmake @@ -0,0 +1,9 @@ +file(REMOVE_RECURSE + "CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax" + "../spv-amd-shader-trinary-minmax.insts.inc" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/progress.make b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/progress.make new file mode 100644 index 000000000..225de343d --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/progress.make @@ -0,0 +1,2 @@ +CMAKE_PROGRESS_1 = + diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-vimsyntax.dir/DependInfo.cmake b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-vimsyntax.dir/DependInfo.cmake new file mode 100644 index 000000000..19fab2149 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-vimsyntax.dir/DependInfo.cmake @@ -0,0 +1,11 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) +# The set of files for implicit dependencies of each language: + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-vimsyntax.dir/build.make b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-vimsyntax.dir/build.make new file mode 100644 index 000000000..ee9cf9ea7 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-vimsyntax.dir/build.make @@ -0,0 +1,85 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + +# Utility rule file for spirv-tools-vimsyntax. + +# Include the progress variables for this target. +include source/CMakeFiles/spirv-tools-vimsyntax.dir/progress.make + +source/CMakeFiles/spirv-tools-vimsyntax: spvasm.vim + + +spvasm.vim: ../utils/generate_vim_syntax.py +spvasm.vim: ../external/SPIRV-Headers/include/spirv/unified1/spirv.core.grammar.json +spvasm.vim: ../external/SPIRV-Headers/include/spirv/unified1/extinst.glsl.std.450.grammar.json +spvasm.vim: ../external/SPIRV-Headers/include/spirv/unified1/extinst.opencl.std.100.grammar.json +spvasm.vim: ../source/extinst.debuginfo.grammar.json + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --blue --bold --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Generate spvasm.vim: Vim syntax file for SPIR-V assembly." + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && /usr/bin/python /home/bkaradzic/Private/projects/_github/SPIRV-Tools/utils/generate_vim_syntax.py --spirv-core-grammar=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/external/SPIRV-Headers/include/spirv/unified1/spirv.core.grammar.json --extinst-debuginfo-grammar=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/extinst.debuginfo.grammar.json --extinst-glsl-grammar=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/external/SPIRV-Headers/include/spirv/unified1/extinst.glsl.std.450.grammar.json --extinst-opencl-grammar=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/external/SPIRV-Headers/include/spirv/unified1/extinst.opencl.std.100.grammar.json >/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/spvasm.vim + +spirv-tools-vimsyntax: source/CMakeFiles/spirv-tools-vimsyntax +spirv-tools-vimsyntax: spvasm.vim +spirv-tools-vimsyntax: source/CMakeFiles/spirv-tools-vimsyntax.dir/build.make + +.PHONY : spirv-tools-vimsyntax + +# Rule to build all files generated by this target. +source/CMakeFiles/spirv-tools-vimsyntax.dir/build: spirv-tools-vimsyntax + +.PHONY : source/CMakeFiles/spirv-tools-vimsyntax.dir/build + +source/CMakeFiles/spirv-tools-vimsyntax.dir/clean: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source && $(CMAKE_COMMAND) -P CMakeFiles/spirv-tools-vimsyntax.dir/cmake_clean.cmake +.PHONY : source/CMakeFiles/spirv-tools-vimsyntax.dir/clean + +source/CMakeFiles/spirv-tools-vimsyntax.dir/depend: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/bkaradzic/Private/projects/_github/SPIRV-Tools /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/spirv-tools-vimsyntax.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : source/CMakeFiles/spirv-tools-vimsyntax.dir/depend + diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-vimsyntax.dir/cmake_clean.cmake b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-vimsyntax.dir/cmake_clean.cmake new file mode 100644 index 000000000..63729c8bc --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-vimsyntax.dir/cmake_clean.cmake @@ -0,0 +1,9 @@ +file(REMOVE_RECURSE + "CMakeFiles/spirv-tools-vimsyntax" + "../spvasm.vim" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/spirv-tools-vimsyntax.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-vimsyntax.dir/progress.make b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-vimsyntax.dir/progress.make new file mode 100644 index 000000000..225de343d --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/spirv-tools-vimsyntax.dir/progress.make @@ -0,0 +1,2 @@ +CMAKE_PROGRESS_1 = + diff --git a/3rdparty/spirv-tools/build/source/CTestTestfile.cmake b/3rdparty/spirv-tools/build/source/CTestTestfile.cmake new file mode 100644 index 000000000..b094b2e0c --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CTestTestfile.cmake @@ -0,0 +1,11 @@ +# CMake generated Testfile for +# Source directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source +# Build directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. +add_test(spirv-tools-symbol-exports-SPIRV-Tools "/usr/bin/python" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/utils/check_symbol_exports.py" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/libSPIRV-Tools.a") +add_test(spirv-tools-symbol-exports-SPIRV-Tools-shared "/usr/bin/python" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/utils/check_symbol_exports.py" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/libSPIRV-Tools-shared.so") +subdirs(comp) +subdirs(opt) +subdirs(link) diff --git a/3rdparty/spirv-tools/build/source/Makefile b/3rdparty/spirv-tools/build/source/Makefile new file mode 100644 index 000000000..485e6469c --- /dev/null +++ b/3rdparty/spirv-tools/build/source/Makefile @@ -0,0 +1,2433 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Default target executed when no arguments are given to make. +default_target: all + +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache + +.PHONY : rebuild_cache/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: install/strip + +.PHONY : install/strip/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..." + /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache + +.PHONY : edit_cache/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Available install components are: \"Unspecified\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components + +.PHONY : list_install_components/fast + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running tests..." + /usr/bin/ctest --force-new-ctest-process $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test + +.PHONY : test/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: install/local + +.PHONY : install/local/fast + +# The main all target +all: cmake_check_build_system + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/progress.marks + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 source/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 source/clean +.PHONY : clean + +# The main clean target +clean/fast: clean + +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 source/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 source/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Convenience name for target. +source/CMakeFiles/spirv-tools-debuginfo.dir/rule: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 source/CMakeFiles/spirv-tools-debuginfo.dir/rule +.PHONY : source/CMakeFiles/spirv-tools-debuginfo.dir/rule + +# Convenience name for target. +spirv-tools-debuginfo: source/CMakeFiles/spirv-tools-debuginfo.dir/rule + +.PHONY : spirv-tools-debuginfo + +# fast build rule for target. +spirv-tools-debuginfo/fast: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/spirv-tools-debuginfo.dir/build.make source/CMakeFiles/spirv-tools-debuginfo.dir/build +.PHONY : spirv-tools-debuginfo/fast + +# Convenience name for target. +source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/rule: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/rule +.PHONY : source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/rule + +# Convenience name for target. +spirv-tools-spv-amd-shader-ballot: source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/rule + +.PHONY : spirv-tools-spv-amd-shader-ballot + +# fast build rule for target. +spirv-tools-spv-amd-shader-ballot/fast: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/build.make source/CMakeFiles/spirv-tools-spv-amd-shader-ballot.dir/build +.PHONY : spirv-tools-spv-amd-shader-ballot/fast + +# Convenience name for target. +source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/rule: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/rule +.PHONY : source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/rule + +# Convenience name for target. +spirv-tools-spv-amd-shader-trinary-minmax: source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/rule + +.PHONY : spirv-tools-spv-amd-shader-trinary-minmax + +# fast build rule for target. +spirv-tools-spv-amd-shader-trinary-minmax/fast: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/build.make source/CMakeFiles/spirv-tools-spv-amd-shader-trinary-minmax.dir/build +.PHONY : spirv-tools-spv-amd-shader-trinary-minmax/fast + +# Convenience name for target. +source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/rule: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/rule +.PHONY : source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/rule + +# Convenience name for target. +spirv-tools-spv-amd-gcn-shader: source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/rule + +.PHONY : spirv-tools-spv-amd-gcn-shader + +# fast build rule for target. +spirv-tools-spv-amd-gcn-shader/fast: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/build.make source/CMakeFiles/spirv-tools-spv-amd-gcn-shader.dir/build +.PHONY : spirv-tools-spv-amd-gcn-shader/fast + +# Convenience name for target. +source/CMakeFiles/spirv-tools-header-DebugInfo.dir/rule: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 source/CMakeFiles/spirv-tools-header-DebugInfo.dir/rule +.PHONY : source/CMakeFiles/spirv-tools-header-DebugInfo.dir/rule + +# Convenience name for target. +spirv-tools-header-DebugInfo: source/CMakeFiles/spirv-tools-header-DebugInfo.dir/rule + +.PHONY : spirv-tools-header-DebugInfo + +# fast build rule for target. +spirv-tools-header-DebugInfo/fast: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/spirv-tools-header-DebugInfo.dir/build.make source/CMakeFiles/spirv-tools-header-DebugInfo.dir/build +.PHONY : spirv-tools-header-DebugInfo/fast + +# Convenience name for target. +source/CMakeFiles/spirv-tools-build-version.dir/rule: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 source/CMakeFiles/spirv-tools-build-version.dir/rule +.PHONY : source/CMakeFiles/spirv-tools-build-version.dir/rule + +# Convenience name for target. +spirv-tools-build-version: source/CMakeFiles/spirv-tools-build-version.dir/rule + +.PHONY : spirv-tools-build-version + +# fast build rule for target. +spirv-tools-build-version/fast: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/spirv-tools-build-version.dir/build.make source/CMakeFiles/spirv-tools-build-version.dir/build +.PHONY : spirv-tools-build-version/fast + +# Convenience name for target. +source/CMakeFiles/SPIRV-Tools.dir/rule: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 source/CMakeFiles/SPIRV-Tools.dir/rule +.PHONY : source/CMakeFiles/SPIRV-Tools.dir/rule + +# Convenience name for target. +SPIRV-Tools: source/CMakeFiles/SPIRV-Tools.dir/rule + +.PHONY : SPIRV-Tools + +# fast build rule for target. +SPIRV-Tools/fast: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/build +.PHONY : SPIRV-Tools/fast + +# Convenience name for target. +source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/rule: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/rule +.PHONY : source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/rule + +# Convenience name for target. +spirv-tools-spv-amd-shader-explicit-vertex-parameter: source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/rule + +.PHONY : spirv-tools-spv-amd-shader-explicit-vertex-parameter + +# fast build rule for target. +spirv-tools-spv-amd-shader-explicit-vertex-parameter/fast: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/build.make source/CMakeFiles/spirv-tools-spv-amd-shader-explicit-vertex-parameter.dir/build +.PHONY : spirv-tools-spv-amd-shader-explicit-vertex-parameter/fast + +# Convenience name for target. +source/CMakeFiles/SPIRV-Tools-shared.dir/rule: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 source/CMakeFiles/SPIRV-Tools-shared.dir/rule +.PHONY : source/CMakeFiles/SPIRV-Tools-shared.dir/rule + +# Convenience name for target. +SPIRV-Tools-shared: source/CMakeFiles/SPIRV-Tools-shared.dir/rule + +.PHONY : SPIRV-Tools-shared + +# fast build rule for target. +SPIRV-Tools-shared/fast: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/build +.PHONY : SPIRV-Tools-shared/fast + +# Convenience name for target. +source/CMakeFiles/spirv-tools-vimsyntax.dir/rule: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 source/CMakeFiles/spirv-tools-vimsyntax.dir/rule +.PHONY : source/CMakeFiles/spirv-tools-vimsyntax.dir/rule + +# Convenience name for target. +spirv-tools-vimsyntax: source/CMakeFiles/spirv-tools-vimsyntax.dir/rule + +.PHONY : spirv-tools-vimsyntax + +# fast build rule for target. +spirv-tools-vimsyntax/fast: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/spirv-tools-vimsyntax.dir/build.make source/CMakeFiles/spirv-tools-vimsyntax.dir/build +.PHONY : spirv-tools-vimsyntax/fast + +assembly_grammar.o: assembly_grammar.cpp.o + +.PHONY : assembly_grammar.o + +# target to build an object file +assembly_grammar.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/assembly_grammar.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/assembly_grammar.cpp.o +.PHONY : assembly_grammar.cpp.o + +assembly_grammar.i: assembly_grammar.cpp.i + +.PHONY : assembly_grammar.i + +# target to preprocess a source file +assembly_grammar.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/assembly_grammar.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/assembly_grammar.cpp.i +.PHONY : assembly_grammar.cpp.i + +assembly_grammar.s: assembly_grammar.cpp.s + +.PHONY : assembly_grammar.s + +# target to generate assembly for a file +assembly_grammar.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/assembly_grammar.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/assembly_grammar.cpp.s +.PHONY : assembly_grammar.cpp.s + +binary.o: binary.cpp.o + +.PHONY : binary.o + +# target to build an object file +binary.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/binary.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/binary.cpp.o +.PHONY : binary.cpp.o + +binary.i: binary.cpp.i + +.PHONY : binary.i + +# target to preprocess a source file +binary.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/binary.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/binary.cpp.i +.PHONY : binary.cpp.i + +binary.s: binary.cpp.s + +.PHONY : binary.s + +# target to generate assembly for a file +binary.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/binary.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/binary.cpp.s +.PHONY : binary.cpp.s + +diagnostic.o: diagnostic.cpp.o + +.PHONY : diagnostic.o + +# target to build an object file +diagnostic.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/diagnostic.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/diagnostic.cpp.o +.PHONY : diagnostic.cpp.o + +diagnostic.i: diagnostic.cpp.i + +.PHONY : diagnostic.i + +# target to preprocess a source file +diagnostic.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/diagnostic.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/diagnostic.cpp.i +.PHONY : diagnostic.cpp.i + +diagnostic.s: diagnostic.cpp.s + +.PHONY : diagnostic.s + +# target to generate assembly for a file +diagnostic.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/diagnostic.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/diagnostic.cpp.s +.PHONY : diagnostic.cpp.s + +disassemble.o: disassemble.cpp.o + +.PHONY : disassemble.o + +# target to build an object file +disassemble.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/disassemble.cpp.o +.PHONY : disassemble.cpp.o + +disassemble.i: disassemble.cpp.i + +.PHONY : disassemble.i + +# target to preprocess a source file +disassemble.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/disassemble.cpp.i +.PHONY : disassemble.cpp.i + +disassemble.s: disassemble.cpp.s + +.PHONY : disassemble.s + +# target to generate assembly for a file +disassemble.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/disassemble.cpp.s +.PHONY : disassemble.cpp.s + +enum_string_mapping.o: enum_string_mapping.cpp.o + +.PHONY : enum_string_mapping.o + +# target to build an object file +enum_string_mapping.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/enum_string_mapping.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/enum_string_mapping.cpp.o +.PHONY : enum_string_mapping.cpp.o + +enum_string_mapping.i: enum_string_mapping.cpp.i + +.PHONY : enum_string_mapping.i + +# target to preprocess a source file +enum_string_mapping.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/enum_string_mapping.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/enum_string_mapping.cpp.i +.PHONY : enum_string_mapping.cpp.i + +enum_string_mapping.s: enum_string_mapping.cpp.s + +.PHONY : enum_string_mapping.s + +# target to generate assembly for a file +enum_string_mapping.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/enum_string_mapping.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/enum_string_mapping.cpp.s +.PHONY : enum_string_mapping.cpp.s + +ext_inst.o: ext_inst.cpp.o + +.PHONY : ext_inst.o + +# target to build an object file +ext_inst.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/ext_inst.cpp.o +.PHONY : ext_inst.cpp.o + +ext_inst.i: ext_inst.cpp.i + +.PHONY : ext_inst.i + +# target to preprocess a source file +ext_inst.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/ext_inst.cpp.i +.PHONY : ext_inst.cpp.i + +ext_inst.s: ext_inst.cpp.s + +.PHONY : ext_inst.s + +# target to generate assembly for a file +ext_inst.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/ext_inst.cpp.s +.PHONY : ext_inst.cpp.s + +extensions.o: extensions.cpp.o + +.PHONY : extensions.o + +# target to build an object file +extensions.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/extensions.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/extensions.cpp.o +.PHONY : extensions.cpp.o + +extensions.i: extensions.cpp.i + +.PHONY : extensions.i + +# target to preprocess a source file +extensions.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/extensions.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/extensions.cpp.i +.PHONY : extensions.cpp.i + +extensions.s: extensions.cpp.s + +.PHONY : extensions.s + +# target to generate assembly for a file +extensions.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/extensions.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/extensions.cpp.s +.PHONY : extensions.cpp.s + +id_descriptor.o: id_descriptor.cpp.o + +.PHONY : id_descriptor.o + +# target to build an object file +id_descriptor.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/id_descriptor.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/id_descriptor.cpp.o +.PHONY : id_descriptor.cpp.o + +id_descriptor.i: id_descriptor.cpp.i + +.PHONY : id_descriptor.i + +# target to preprocess a source file +id_descriptor.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/id_descriptor.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/id_descriptor.cpp.i +.PHONY : id_descriptor.cpp.i + +id_descriptor.s: id_descriptor.cpp.s + +.PHONY : id_descriptor.s + +# target to generate assembly for a file +id_descriptor.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/id_descriptor.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/id_descriptor.cpp.s +.PHONY : id_descriptor.cpp.s + +libspirv.o: libspirv.cpp.o + +.PHONY : libspirv.o + +# target to build an object file +libspirv.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/libspirv.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/libspirv.cpp.o +.PHONY : libspirv.cpp.o + +libspirv.i: libspirv.cpp.i + +.PHONY : libspirv.i + +# target to preprocess a source file +libspirv.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/libspirv.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/libspirv.cpp.i +.PHONY : libspirv.cpp.i + +libspirv.s: libspirv.cpp.s + +.PHONY : libspirv.s + +# target to generate assembly for a file +libspirv.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/libspirv.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/libspirv.cpp.s +.PHONY : libspirv.cpp.s + +name_mapper.o: name_mapper.cpp.o + +.PHONY : name_mapper.o + +# target to build an object file +name_mapper.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/name_mapper.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/name_mapper.cpp.o +.PHONY : name_mapper.cpp.o + +name_mapper.i: name_mapper.cpp.i + +.PHONY : name_mapper.i + +# target to preprocess a source file +name_mapper.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/name_mapper.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/name_mapper.cpp.i +.PHONY : name_mapper.cpp.i + +name_mapper.s: name_mapper.cpp.s + +.PHONY : name_mapper.s + +# target to generate assembly for a file +name_mapper.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/name_mapper.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/name_mapper.cpp.s +.PHONY : name_mapper.cpp.s + +opcode.o: opcode.cpp.o + +.PHONY : opcode.o + +# target to build an object file +opcode.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/opcode.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/opcode.cpp.o +.PHONY : opcode.cpp.o + +opcode.i: opcode.cpp.i + +.PHONY : opcode.i + +# target to preprocess a source file +opcode.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/opcode.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/opcode.cpp.i +.PHONY : opcode.cpp.i + +opcode.s: opcode.cpp.s + +.PHONY : opcode.s + +# target to generate assembly for a file +opcode.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/opcode.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/opcode.cpp.s +.PHONY : opcode.cpp.s + +operand.o: operand.cpp.o + +.PHONY : operand.o + +# target to build an object file +operand.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/operand.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/operand.cpp.o +.PHONY : operand.cpp.o + +operand.i: operand.cpp.i + +.PHONY : operand.i + +# target to preprocess a source file +operand.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/operand.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/operand.cpp.i +.PHONY : operand.cpp.i + +operand.s: operand.cpp.s + +.PHONY : operand.s + +# target to generate assembly for a file +operand.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/operand.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/operand.cpp.s +.PHONY : operand.cpp.s + +parsed_operand.o: parsed_operand.cpp.o + +.PHONY : parsed_operand.o + +# target to build an object file +parsed_operand.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/parsed_operand.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/parsed_operand.cpp.o +.PHONY : parsed_operand.cpp.o + +parsed_operand.i: parsed_operand.cpp.i + +.PHONY : parsed_operand.i + +# target to preprocess a source file +parsed_operand.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/parsed_operand.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/parsed_operand.cpp.i +.PHONY : parsed_operand.cpp.i + +parsed_operand.s: parsed_operand.cpp.s + +.PHONY : parsed_operand.s + +# target to generate assembly for a file +parsed_operand.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/parsed_operand.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/parsed_operand.cpp.s +.PHONY : parsed_operand.cpp.s + +print.o: print.cpp.o + +.PHONY : print.o + +# target to build an object file +print.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/print.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/print.cpp.o +.PHONY : print.cpp.o + +print.i: print.cpp.i + +.PHONY : print.i + +# target to preprocess a source file +print.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/print.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/print.cpp.i +.PHONY : print.cpp.i + +print.s: print.cpp.s + +.PHONY : print.s + +# target to generate assembly for a file +print.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/print.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/print.cpp.s +.PHONY : print.cpp.s + +software_version.o: software_version.cpp.o + +.PHONY : software_version.o + +# target to build an object file +software_version.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/software_version.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/software_version.cpp.o +.PHONY : software_version.cpp.o + +software_version.i: software_version.cpp.i + +.PHONY : software_version.i + +# target to preprocess a source file +software_version.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/software_version.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/software_version.cpp.i +.PHONY : software_version.cpp.i + +software_version.s: software_version.cpp.s + +.PHONY : software_version.s + +# target to generate assembly for a file +software_version.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/software_version.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/software_version.cpp.s +.PHONY : software_version.cpp.s + +spirv_endian.o: spirv_endian.cpp.o + +.PHONY : spirv_endian.o + +# target to build an object file +spirv_endian.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/spirv_endian.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_endian.cpp.o +.PHONY : spirv_endian.cpp.o + +spirv_endian.i: spirv_endian.cpp.i + +.PHONY : spirv_endian.i + +# target to preprocess a source file +spirv_endian.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/spirv_endian.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_endian.cpp.i +.PHONY : spirv_endian.cpp.i + +spirv_endian.s: spirv_endian.cpp.s + +.PHONY : spirv_endian.s + +# target to generate assembly for a file +spirv_endian.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/spirv_endian.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_endian.cpp.s +.PHONY : spirv_endian.cpp.s + +spirv_optimizer_options.o: spirv_optimizer_options.cpp.o + +.PHONY : spirv_optimizer_options.o + +# target to build an object file +spirv_optimizer_options.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/spirv_optimizer_options.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_optimizer_options.cpp.o +.PHONY : spirv_optimizer_options.cpp.o + +spirv_optimizer_options.i: spirv_optimizer_options.cpp.i + +.PHONY : spirv_optimizer_options.i + +# target to preprocess a source file +spirv_optimizer_options.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/spirv_optimizer_options.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_optimizer_options.cpp.i +.PHONY : spirv_optimizer_options.cpp.i + +spirv_optimizer_options.s: spirv_optimizer_options.cpp.s + +.PHONY : spirv_optimizer_options.s + +# target to generate assembly for a file +spirv_optimizer_options.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/spirv_optimizer_options.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_optimizer_options.cpp.s +.PHONY : spirv_optimizer_options.cpp.s + +spirv_target_env.o: spirv_target_env.cpp.o + +.PHONY : spirv_target_env.o + +# target to build an object file +spirv_target_env.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/spirv_target_env.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_target_env.cpp.o +.PHONY : spirv_target_env.cpp.o + +spirv_target_env.i: spirv_target_env.cpp.i + +.PHONY : spirv_target_env.i + +# target to preprocess a source file +spirv_target_env.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/spirv_target_env.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_target_env.cpp.i +.PHONY : spirv_target_env.cpp.i + +spirv_target_env.s: spirv_target_env.cpp.s + +.PHONY : spirv_target_env.s + +# target to generate assembly for a file +spirv_target_env.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/spirv_target_env.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_target_env.cpp.s +.PHONY : spirv_target_env.cpp.s + +spirv_validator_options.o: spirv_validator_options.cpp.o + +.PHONY : spirv_validator_options.o + +# target to build an object file +spirv_validator_options.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/spirv_validator_options.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_validator_options.cpp.o +.PHONY : spirv_validator_options.cpp.o + +spirv_validator_options.i: spirv_validator_options.cpp.i + +.PHONY : spirv_validator_options.i + +# target to preprocess a source file +spirv_validator_options.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/spirv_validator_options.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_validator_options.cpp.i +.PHONY : spirv_validator_options.cpp.i + +spirv_validator_options.s: spirv_validator_options.cpp.s + +.PHONY : spirv_validator_options.s + +# target to generate assembly for a file +spirv_validator_options.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/spirv_validator_options.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/spirv_validator_options.cpp.s +.PHONY : spirv_validator_options.cpp.s + +table.o: table.cpp.o + +.PHONY : table.o + +# target to build an object file +table.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/table.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/table.cpp.o +.PHONY : table.cpp.o + +table.i: table.cpp.i + +.PHONY : table.i + +# target to preprocess a source file +table.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/table.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/table.cpp.i +.PHONY : table.cpp.i + +table.s: table.cpp.s + +.PHONY : table.s + +# target to generate assembly for a file +table.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/table.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/table.cpp.s +.PHONY : table.cpp.s + +text.o: text.cpp.o + +.PHONY : text.o + +# target to build an object file +text.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/text.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/text.cpp.o +.PHONY : text.cpp.o + +text.i: text.cpp.i + +.PHONY : text.i + +# target to preprocess a source file +text.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/text.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/text.cpp.i +.PHONY : text.cpp.i + +text.s: text.cpp.s + +.PHONY : text.s + +# target to generate assembly for a file +text.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/text.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/text.cpp.s +.PHONY : text.cpp.s + +text_handler.o: text_handler.cpp.o + +.PHONY : text_handler.o + +# target to build an object file +text_handler.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/text_handler.cpp.o +.PHONY : text_handler.cpp.o + +text_handler.i: text_handler.cpp.i + +.PHONY : text_handler.i + +# target to preprocess a source file +text_handler.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/text_handler.cpp.i +.PHONY : text_handler.cpp.i + +text_handler.s: text_handler.cpp.s + +.PHONY : text_handler.s + +# target to generate assembly for a file +text_handler.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/text_handler.cpp.s +.PHONY : text_handler.cpp.s + +util/bit_vector.o: util/bit_vector.cpp.o + +.PHONY : util/bit_vector.o + +# target to build an object file +util/bit_vector.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/util/bit_vector.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/util/bit_vector.cpp.o +.PHONY : util/bit_vector.cpp.o + +util/bit_vector.i: util/bit_vector.cpp.i + +.PHONY : util/bit_vector.i + +# target to preprocess a source file +util/bit_vector.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/util/bit_vector.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/util/bit_vector.cpp.i +.PHONY : util/bit_vector.cpp.i + +util/bit_vector.s: util/bit_vector.cpp.s + +.PHONY : util/bit_vector.s + +# target to generate assembly for a file +util/bit_vector.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/util/bit_vector.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/util/bit_vector.cpp.s +.PHONY : util/bit_vector.cpp.s + +util/parse_number.o: util/parse_number.cpp.o + +.PHONY : util/parse_number.o + +# target to build an object file +util/parse_number.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/util/parse_number.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/util/parse_number.cpp.o +.PHONY : util/parse_number.cpp.o + +util/parse_number.i: util/parse_number.cpp.i + +.PHONY : util/parse_number.i + +# target to preprocess a source file +util/parse_number.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/util/parse_number.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/util/parse_number.cpp.i +.PHONY : util/parse_number.cpp.i + +util/parse_number.s: util/parse_number.cpp.s + +.PHONY : util/parse_number.s + +# target to generate assembly for a file +util/parse_number.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/util/parse_number.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/util/parse_number.cpp.s +.PHONY : util/parse_number.cpp.s + +util/string_utils.o: util/string_utils.cpp.o + +.PHONY : util/string_utils.o + +# target to build an object file +util/string_utils.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/util/string_utils.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/util/string_utils.cpp.o +.PHONY : util/string_utils.cpp.o + +util/string_utils.i: util/string_utils.cpp.i + +.PHONY : util/string_utils.i + +# target to preprocess a source file +util/string_utils.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/util/string_utils.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/util/string_utils.cpp.i +.PHONY : util/string_utils.cpp.i + +util/string_utils.s: util/string_utils.cpp.s + +.PHONY : util/string_utils.s + +# target to generate assembly for a file +util/string_utils.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/util/string_utils.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/util/string_utils.cpp.s +.PHONY : util/string_utils.cpp.s + +util/timer.o: util/timer.cpp.o + +.PHONY : util/timer.o + +# target to build an object file +util/timer.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/util/timer.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/util/timer.cpp.o +.PHONY : util/timer.cpp.o + +util/timer.i: util/timer.cpp.i + +.PHONY : util/timer.i + +# target to preprocess a source file +util/timer.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/util/timer.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/util/timer.cpp.i +.PHONY : util/timer.cpp.i + +util/timer.s: util/timer.cpp.s + +.PHONY : util/timer.s + +# target to generate assembly for a file +util/timer.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/util/timer.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/util/timer.cpp.s +.PHONY : util/timer.cpp.s + +val/basic_block.o: val/basic_block.cpp.o + +.PHONY : val/basic_block.o + +# target to build an object file +val/basic_block.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/basic_block.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/basic_block.cpp.o +.PHONY : val/basic_block.cpp.o + +val/basic_block.i: val/basic_block.cpp.i + +.PHONY : val/basic_block.i + +# target to preprocess a source file +val/basic_block.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/basic_block.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/basic_block.cpp.i +.PHONY : val/basic_block.cpp.i + +val/basic_block.s: val/basic_block.cpp.s + +.PHONY : val/basic_block.s + +# target to generate assembly for a file +val/basic_block.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/basic_block.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/basic_block.cpp.s +.PHONY : val/basic_block.cpp.s + +val/construct.o: val/construct.cpp.o + +.PHONY : val/construct.o + +# target to build an object file +val/construct.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/construct.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/construct.cpp.o +.PHONY : val/construct.cpp.o + +val/construct.i: val/construct.cpp.i + +.PHONY : val/construct.i + +# target to preprocess a source file +val/construct.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/construct.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/construct.cpp.i +.PHONY : val/construct.cpp.i + +val/construct.s: val/construct.cpp.s + +.PHONY : val/construct.s + +# target to generate assembly for a file +val/construct.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/construct.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/construct.cpp.s +.PHONY : val/construct.cpp.s + +val/function.o: val/function.cpp.o + +.PHONY : val/function.o + +# target to build an object file +val/function.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/function.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/function.cpp.o +.PHONY : val/function.cpp.o + +val/function.i: val/function.cpp.i + +.PHONY : val/function.i + +# target to preprocess a source file +val/function.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/function.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/function.cpp.i +.PHONY : val/function.cpp.i + +val/function.s: val/function.cpp.s + +.PHONY : val/function.s + +# target to generate assembly for a file +val/function.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/function.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/function.cpp.s +.PHONY : val/function.cpp.s + +val/instruction.o: val/instruction.cpp.o + +.PHONY : val/instruction.o + +# target to build an object file +val/instruction.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/instruction.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/instruction.cpp.o +.PHONY : val/instruction.cpp.o + +val/instruction.i: val/instruction.cpp.i + +.PHONY : val/instruction.i + +# target to preprocess a source file +val/instruction.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/instruction.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/instruction.cpp.i +.PHONY : val/instruction.cpp.i + +val/instruction.s: val/instruction.cpp.s + +.PHONY : val/instruction.s + +# target to generate assembly for a file +val/instruction.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/instruction.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/instruction.cpp.s +.PHONY : val/instruction.cpp.s + +val/validate.o: val/validate.cpp.o + +.PHONY : val/validate.o + +# target to build an object file +val/validate.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate.cpp.o +.PHONY : val/validate.cpp.o + +val/validate.i: val/validate.cpp.i + +.PHONY : val/validate.i + +# target to preprocess a source file +val/validate.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate.cpp.i +.PHONY : val/validate.cpp.i + +val/validate.s: val/validate.cpp.s + +.PHONY : val/validate.s + +# target to generate assembly for a file +val/validate.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate.cpp.s +.PHONY : val/validate.cpp.s + +val/validate_adjacency.o: val/validate_adjacency.cpp.o + +.PHONY : val/validate_adjacency.o + +# target to build an object file +val/validate_adjacency.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_adjacency.cpp.o +.PHONY : val/validate_adjacency.cpp.o + +val/validate_adjacency.i: val/validate_adjacency.cpp.i + +.PHONY : val/validate_adjacency.i + +# target to preprocess a source file +val/validate_adjacency.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_adjacency.cpp.i +.PHONY : val/validate_adjacency.cpp.i + +val/validate_adjacency.s: val/validate_adjacency.cpp.s + +.PHONY : val/validate_adjacency.s + +# target to generate assembly for a file +val/validate_adjacency.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_adjacency.cpp.s +.PHONY : val/validate_adjacency.cpp.s + +val/validate_annotation.o: val/validate_annotation.cpp.o + +.PHONY : val/validate_annotation.o + +# target to build an object file +val/validate_annotation.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_annotation.cpp.o +.PHONY : val/validate_annotation.cpp.o + +val/validate_annotation.i: val/validate_annotation.cpp.i + +.PHONY : val/validate_annotation.i + +# target to preprocess a source file +val/validate_annotation.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_annotation.cpp.i +.PHONY : val/validate_annotation.cpp.i + +val/validate_annotation.s: val/validate_annotation.cpp.s + +.PHONY : val/validate_annotation.s + +# target to generate assembly for a file +val/validate_annotation.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_annotation.cpp.s +.PHONY : val/validate_annotation.cpp.s + +val/validate_arithmetics.o: val/validate_arithmetics.cpp.o + +.PHONY : val/validate_arithmetics.o + +# target to build an object file +val/validate_arithmetics.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_arithmetics.cpp.o +.PHONY : val/validate_arithmetics.cpp.o + +val/validate_arithmetics.i: val/validate_arithmetics.cpp.i + +.PHONY : val/validate_arithmetics.i + +# target to preprocess a source file +val/validate_arithmetics.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_arithmetics.cpp.i +.PHONY : val/validate_arithmetics.cpp.i + +val/validate_arithmetics.s: val/validate_arithmetics.cpp.s + +.PHONY : val/validate_arithmetics.s + +# target to generate assembly for a file +val/validate_arithmetics.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_arithmetics.cpp.s +.PHONY : val/validate_arithmetics.cpp.s + +val/validate_atomics.o: val/validate_atomics.cpp.o + +.PHONY : val/validate_atomics.o + +# target to build an object file +val/validate_atomics.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_atomics.cpp.o +.PHONY : val/validate_atomics.cpp.o + +val/validate_atomics.i: val/validate_atomics.cpp.i + +.PHONY : val/validate_atomics.i + +# target to preprocess a source file +val/validate_atomics.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_atomics.cpp.i +.PHONY : val/validate_atomics.cpp.i + +val/validate_atomics.s: val/validate_atomics.cpp.s + +.PHONY : val/validate_atomics.s + +# target to generate assembly for a file +val/validate_atomics.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_atomics.cpp.s +.PHONY : val/validate_atomics.cpp.s + +val/validate_barriers.o: val/validate_barriers.cpp.o + +.PHONY : val/validate_barriers.o + +# target to build an object file +val/validate_barriers.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_barriers.cpp.o +.PHONY : val/validate_barriers.cpp.o + +val/validate_barriers.i: val/validate_barriers.cpp.i + +.PHONY : val/validate_barriers.i + +# target to preprocess a source file +val/validate_barriers.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_barriers.cpp.i +.PHONY : val/validate_barriers.cpp.i + +val/validate_barriers.s: val/validate_barriers.cpp.s + +.PHONY : val/validate_barriers.s + +# target to generate assembly for a file +val/validate_barriers.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_barriers.cpp.s +.PHONY : val/validate_barriers.cpp.s + +val/validate_bitwise.o: val/validate_bitwise.cpp.o + +.PHONY : val/validate_bitwise.o + +# target to build an object file +val/validate_bitwise.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_bitwise.cpp.o +.PHONY : val/validate_bitwise.cpp.o + +val/validate_bitwise.i: val/validate_bitwise.cpp.i + +.PHONY : val/validate_bitwise.i + +# target to preprocess a source file +val/validate_bitwise.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_bitwise.cpp.i +.PHONY : val/validate_bitwise.cpp.i + +val/validate_bitwise.s: val/validate_bitwise.cpp.s + +.PHONY : val/validate_bitwise.s + +# target to generate assembly for a file +val/validate_bitwise.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_bitwise.cpp.s +.PHONY : val/validate_bitwise.cpp.s + +val/validate_builtins.o: val/validate_builtins.cpp.o + +.PHONY : val/validate_builtins.o + +# target to build an object file +val/validate_builtins.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_builtins.cpp.o +.PHONY : val/validate_builtins.cpp.o + +val/validate_builtins.i: val/validate_builtins.cpp.i + +.PHONY : val/validate_builtins.i + +# target to preprocess a source file +val/validate_builtins.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_builtins.cpp.i +.PHONY : val/validate_builtins.cpp.i + +val/validate_builtins.s: val/validate_builtins.cpp.s + +.PHONY : val/validate_builtins.s + +# target to generate assembly for a file +val/validate_builtins.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_builtins.cpp.s +.PHONY : val/validate_builtins.cpp.s + +val/validate_capability.o: val/validate_capability.cpp.o + +.PHONY : val/validate_capability.o + +# target to build an object file +val/validate_capability.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_capability.cpp.o +.PHONY : val/validate_capability.cpp.o + +val/validate_capability.i: val/validate_capability.cpp.i + +.PHONY : val/validate_capability.i + +# target to preprocess a source file +val/validate_capability.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_capability.cpp.i +.PHONY : val/validate_capability.cpp.i + +val/validate_capability.s: val/validate_capability.cpp.s + +.PHONY : val/validate_capability.s + +# target to generate assembly for a file +val/validate_capability.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_capability.cpp.s +.PHONY : val/validate_capability.cpp.s + +val/validate_cfg.o: val/validate_cfg.cpp.o + +.PHONY : val/validate_cfg.o + +# target to build an object file +val/validate_cfg.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_cfg.cpp.o +.PHONY : val/validate_cfg.cpp.o + +val/validate_cfg.i: val/validate_cfg.cpp.i + +.PHONY : val/validate_cfg.i + +# target to preprocess a source file +val/validate_cfg.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_cfg.cpp.i +.PHONY : val/validate_cfg.cpp.i + +val/validate_cfg.s: val/validate_cfg.cpp.s + +.PHONY : val/validate_cfg.s + +# target to generate assembly for a file +val/validate_cfg.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_cfg.cpp.s +.PHONY : val/validate_cfg.cpp.s + +val/validate_composites.o: val/validate_composites.cpp.o + +.PHONY : val/validate_composites.o + +# target to build an object file +val/validate_composites.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_composites.cpp.o +.PHONY : val/validate_composites.cpp.o + +val/validate_composites.i: val/validate_composites.cpp.i + +.PHONY : val/validate_composites.i + +# target to preprocess a source file +val/validate_composites.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_composites.cpp.i +.PHONY : val/validate_composites.cpp.i + +val/validate_composites.s: val/validate_composites.cpp.s + +.PHONY : val/validate_composites.s + +# target to generate assembly for a file +val/validate_composites.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_composites.cpp.s +.PHONY : val/validate_composites.cpp.s + +val/validate_constants.o: val/validate_constants.cpp.o + +.PHONY : val/validate_constants.o + +# target to build an object file +val/validate_constants.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_constants.cpp.o +.PHONY : val/validate_constants.cpp.o + +val/validate_constants.i: val/validate_constants.cpp.i + +.PHONY : val/validate_constants.i + +# target to preprocess a source file +val/validate_constants.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_constants.cpp.i +.PHONY : val/validate_constants.cpp.i + +val/validate_constants.s: val/validate_constants.cpp.s + +.PHONY : val/validate_constants.s + +# target to generate assembly for a file +val/validate_constants.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_constants.cpp.s +.PHONY : val/validate_constants.cpp.s + +val/validate_conversion.o: val/validate_conversion.cpp.o + +.PHONY : val/validate_conversion.o + +# target to build an object file +val/validate_conversion.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_conversion.cpp.o +.PHONY : val/validate_conversion.cpp.o + +val/validate_conversion.i: val/validate_conversion.cpp.i + +.PHONY : val/validate_conversion.i + +# target to preprocess a source file +val/validate_conversion.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_conversion.cpp.i +.PHONY : val/validate_conversion.cpp.i + +val/validate_conversion.s: val/validate_conversion.cpp.s + +.PHONY : val/validate_conversion.s + +# target to generate assembly for a file +val/validate_conversion.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_conversion.cpp.s +.PHONY : val/validate_conversion.cpp.s + +val/validate_datarules.o: val/validate_datarules.cpp.o + +.PHONY : val/validate_datarules.o + +# target to build an object file +val/validate_datarules.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_datarules.cpp.o +.PHONY : val/validate_datarules.cpp.o + +val/validate_datarules.i: val/validate_datarules.cpp.i + +.PHONY : val/validate_datarules.i + +# target to preprocess a source file +val/validate_datarules.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_datarules.cpp.i +.PHONY : val/validate_datarules.cpp.i + +val/validate_datarules.s: val/validate_datarules.cpp.s + +.PHONY : val/validate_datarules.s + +# target to generate assembly for a file +val/validate_datarules.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_datarules.cpp.s +.PHONY : val/validate_datarules.cpp.s + +val/validate_debug.o: val/validate_debug.cpp.o + +.PHONY : val/validate_debug.o + +# target to build an object file +val/validate_debug.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_debug.cpp.o +.PHONY : val/validate_debug.cpp.o + +val/validate_debug.i: val/validate_debug.cpp.i + +.PHONY : val/validate_debug.i + +# target to preprocess a source file +val/validate_debug.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_debug.cpp.i +.PHONY : val/validate_debug.cpp.i + +val/validate_debug.s: val/validate_debug.cpp.s + +.PHONY : val/validate_debug.s + +# target to generate assembly for a file +val/validate_debug.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_debug.cpp.s +.PHONY : val/validate_debug.cpp.s + +val/validate_decorations.o: val/validate_decorations.cpp.o + +.PHONY : val/validate_decorations.o + +# target to build an object file +val/validate_decorations.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_decorations.cpp.o +.PHONY : val/validate_decorations.cpp.o + +val/validate_decorations.i: val/validate_decorations.cpp.i + +.PHONY : val/validate_decorations.i + +# target to preprocess a source file +val/validate_decorations.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_decorations.cpp.i +.PHONY : val/validate_decorations.cpp.i + +val/validate_decorations.s: val/validate_decorations.cpp.s + +.PHONY : val/validate_decorations.s + +# target to generate assembly for a file +val/validate_decorations.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_decorations.cpp.s +.PHONY : val/validate_decorations.cpp.s + +val/validate_derivatives.o: val/validate_derivatives.cpp.o + +.PHONY : val/validate_derivatives.o + +# target to build an object file +val/validate_derivatives.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_derivatives.cpp.o +.PHONY : val/validate_derivatives.cpp.o + +val/validate_derivatives.i: val/validate_derivatives.cpp.i + +.PHONY : val/validate_derivatives.i + +# target to preprocess a source file +val/validate_derivatives.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_derivatives.cpp.i +.PHONY : val/validate_derivatives.cpp.i + +val/validate_derivatives.s: val/validate_derivatives.cpp.s + +.PHONY : val/validate_derivatives.s + +# target to generate assembly for a file +val/validate_derivatives.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_derivatives.cpp.s +.PHONY : val/validate_derivatives.cpp.s + +val/validate_execution_limitations.o: val/validate_execution_limitations.cpp.o + +.PHONY : val/validate_execution_limitations.o + +# target to build an object file +val/validate_execution_limitations.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_execution_limitations.cpp.o +.PHONY : val/validate_execution_limitations.cpp.o + +val/validate_execution_limitations.i: val/validate_execution_limitations.cpp.i + +.PHONY : val/validate_execution_limitations.i + +# target to preprocess a source file +val/validate_execution_limitations.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_execution_limitations.cpp.i +.PHONY : val/validate_execution_limitations.cpp.i + +val/validate_execution_limitations.s: val/validate_execution_limitations.cpp.s + +.PHONY : val/validate_execution_limitations.s + +# target to generate assembly for a file +val/validate_execution_limitations.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_execution_limitations.cpp.s +.PHONY : val/validate_execution_limitations.cpp.s + +val/validate_ext_inst.o: val/validate_ext_inst.cpp.o + +.PHONY : val/validate_ext_inst.o + +# target to build an object file +val/validate_ext_inst.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_ext_inst.cpp.o +.PHONY : val/validate_ext_inst.cpp.o + +val/validate_ext_inst.i: val/validate_ext_inst.cpp.i + +.PHONY : val/validate_ext_inst.i + +# target to preprocess a source file +val/validate_ext_inst.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_ext_inst.cpp.i +.PHONY : val/validate_ext_inst.cpp.i + +val/validate_ext_inst.s: val/validate_ext_inst.cpp.s + +.PHONY : val/validate_ext_inst.s + +# target to generate assembly for a file +val/validate_ext_inst.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_ext_inst.cpp.s +.PHONY : val/validate_ext_inst.cpp.s + +val/validate_function.o: val/validate_function.cpp.o + +.PHONY : val/validate_function.o + +# target to build an object file +val/validate_function.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_function.cpp.o +.PHONY : val/validate_function.cpp.o + +val/validate_function.i: val/validate_function.cpp.i + +.PHONY : val/validate_function.i + +# target to preprocess a source file +val/validate_function.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_function.cpp.i +.PHONY : val/validate_function.cpp.i + +val/validate_function.s: val/validate_function.cpp.s + +.PHONY : val/validate_function.s + +# target to generate assembly for a file +val/validate_function.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_function.cpp.s +.PHONY : val/validate_function.cpp.s + +val/validate_id.o: val/validate_id.cpp.o + +.PHONY : val/validate_id.o + +# target to build an object file +val/validate_id.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_id.cpp.o +.PHONY : val/validate_id.cpp.o + +val/validate_id.i: val/validate_id.cpp.i + +.PHONY : val/validate_id.i + +# target to preprocess a source file +val/validate_id.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_id.cpp.i +.PHONY : val/validate_id.cpp.i + +val/validate_id.s: val/validate_id.cpp.s + +.PHONY : val/validate_id.s + +# target to generate assembly for a file +val/validate_id.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_id.cpp.s +.PHONY : val/validate_id.cpp.s + +val/validate_image.o: val/validate_image.cpp.o + +.PHONY : val/validate_image.o + +# target to build an object file +val/validate_image.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_image.cpp.o +.PHONY : val/validate_image.cpp.o + +val/validate_image.i: val/validate_image.cpp.i + +.PHONY : val/validate_image.i + +# target to preprocess a source file +val/validate_image.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_image.cpp.i +.PHONY : val/validate_image.cpp.i + +val/validate_image.s: val/validate_image.cpp.s + +.PHONY : val/validate_image.s + +# target to generate assembly for a file +val/validate_image.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_image.cpp.s +.PHONY : val/validate_image.cpp.s + +val/validate_instruction.o: val/validate_instruction.cpp.o + +.PHONY : val/validate_instruction.o + +# target to build an object file +val/validate_instruction.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_instruction.cpp.o +.PHONY : val/validate_instruction.cpp.o + +val/validate_instruction.i: val/validate_instruction.cpp.i + +.PHONY : val/validate_instruction.i + +# target to preprocess a source file +val/validate_instruction.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_instruction.cpp.i +.PHONY : val/validate_instruction.cpp.i + +val/validate_instruction.s: val/validate_instruction.cpp.s + +.PHONY : val/validate_instruction.s + +# target to generate assembly for a file +val/validate_instruction.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_instruction.cpp.s +.PHONY : val/validate_instruction.cpp.s + +val/validate_interfaces.o: val/validate_interfaces.cpp.o + +.PHONY : val/validate_interfaces.o + +# target to build an object file +val/validate_interfaces.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_interfaces.cpp.o +.PHONY : val/validate_interfaces.cpp.o + +val/validate_interfaces.i: val/validate_interfaces.cpp.i + +.PHONY : val/validate_interfaces.i + +# target to preprocess a source file +val/validate_interfaces.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_interfaces.cpp.i +.PHONY : val/validate_interfaces.cpp.i + +val/validate_interfaces.s: val/validate_interfaces.cpp.s + +.PHONY : val/validate_interfaces.s + +# target to generate assembly for a file +val/validate_interfaces.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_interfaces.cpp.s +.PHONY : val/validate_interfaces.cpp.s + +val/validate_layout.o: val/validate_layout.cpp.o + +.PHONY : val/validate_layout.o + +# target to build an object file +val/validate_layout.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_layout.cpp.o +.PHONY : val/validate_layout.cpp.o + +val/validate_layout.i: val/validate_layout.cpp.i + +.PHONY : val/validate_layout.i + +# target to preprocess a source file +val/validate_layout.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_layout.cpp.i +.PHONY : val/validate_layout.cpp.i + +val/validate_layout.s: val/validate_layout.cpp.s + +.PHONY : val/validate_layout.s + +# target to generate assembly for a file +val/validate_layout.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_layout.cpp.s +.PHONY : val/validate_layout.cpp.s + +val/validate_literals.o: val/validate_literals.cpp.o + +.PHONY : val/validate_literals.o + +# target to build an object file +val/validate_literals.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_literals.cpp.o +.PHONY : val/validate_literals.cpp.o + +val/validate_literals.i: val/validate_literals.cpp.i + +.PHONY : val/validate_literals.i + +# target to preprocess a source file +val/validate_literals.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_literals.cpp.i +.PHONY : val/validate_literals.cpp.i + +val/validate_literals.s: val/validate_literals.cpp.s + +.PHONY : val/validate_literals.s + +# target to generate assembly for a file +val/validate_literals.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_literals.cpp.s +.PHONY : val/validate_literals.cpp.s + +val/validate_logicals.o: val/validate_logicals.cpp.o + +.PHONY : val/validate_logicals.o + +# target to build an object file +val/validate_logicals.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_logicals.cpp.o +.PHONY : val/validate_logicals.cpp.o + +val/validate_logicals.i: val/validate_logicals.cpp.i + +.PHONY : val/validate_logicals.i + +# target to preprocess a source file +val/validate_logicals.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_logicals.cpp.i +.PHONY : val/validate_logicals.cpp.i + +val/validate_logicals.s: val/validate_logicals.cpp.s + +.PHONY : val/validate_logicals.s + +# target to generate assembly for a file +val/validate_logicals.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_logicals.cpp.s +.PHONY : val/validate_logicals.cpp.s + +val/validate_memory.o: val/validate_memory.cpp.o + +.PHONY : val/validate_memory.o + +# target to build an object file +val/validate_memory.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_memory.cpp.o +.PHONY : val/validate_memory.cpp.o + +val/validate_memory.i: val/validate_memory.cpp.i + +.PHONY : val/validate_memory.i + +# target to preprocess a source file +val/validate_memory.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_memory.cpp.i +.PHONY : val/validate_memory.cpp.i + +val/validate_memory.s: val/validate_memory.cpp.s + +.PHONY : val/validate_memory.s + +# target to generate assembly for a file +val/validate_memory.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_memory.cpp.s +.PHONY : val/validate_memory.cpp.s + +val/validate_mode_setting.o: val/validate_mode_setting.cpp.o + +.PHONY : val/validate_mode_setting.o + +# target to build an object file +val/validate_mode_setting.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_mode_setting.cpp.o +.PHONY : val/validate_mode_setting.cpp.o + +val/validate_mode_setting.i: val/validate_mode_setting.cpp.i + +.PHONY : val/validate_mode_setting.i + +# target to preprocess a source file +val/validate_mode_setting.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_mode_setting.cpp.i +.PHONY : val/validate_mode_setting.cpp.i + +val/validate_mode_setting.s: val/validate_mode_setting.cpp.s + +.PHONY : val/validate_mode_setting.s + +# target to generate assembly for a file +val/validate_mode_setting.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_mode_setting.cpp.s +.PHONY : val/validate_mode_setting.cpp.s + +val/validate_non_uniform.o: val/validate_non_uniform.cpp.o + +.PHONY : val/validate_non_uniform.o + +# target to build an object file +val/validate_non_uniform.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_non_uniform.cpp.o +.PHONY : val/validate_non_uniform.cpp.o + +val/validate_non_uniform.i: val/validate_non_uniform.cpp.i + +.PHONY : val/validate_non_uniform.i + +# target to preprocess a source file +val/validate_non_uniform.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_non_uniform.cpp.i +.PHONY : val/validate_non_uniform.cpp.i + +val/validate_non_uniform.s: val/validate_non_uniform.cpp.s + +.PHONY : val/validate_non_uniform.s + +# target to generate assembly for a file +val/validate_non_uniform.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_non_uniform.cpp.s +.PHONY : val/validate_non_uniform.cpp.s + +val/validate_primitives.o: val/validate_primitives.cpp.o + +.PHONY : val/validate_primitives.o + +# target to build an object file +val/validate_primitives.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_primitives.cpp.o +.PHONY : val/validate_primitives.cpp.o + +val/validate_primitives.i: val/validate_primitives.cpp.i + +.PHONY : val/validate_primitives.i + +# target to preprocess a source file +val/validate_primitives.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_primitives.cpp.i +.PHONY : val/validate_primitives.cpp.i + +val/validate_primitives.s: val/validate_primitives.cpp.s + +.PHONY : val/validate_primitives.s + +# target to generate assembly for a file +val/validate_primitives.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_primitives.cpp.s +.PHONY : val/validate_primitives.cpp.s + +val/validate_type.o: val/validate_type.cpp.o + +.PHONY : val/validate_type.o + +# target to build an object file +val/validate_type.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_type.cpp.o +.PHONY : val/validate_type.cpp.o + +val/validate_type.i: val/validate_type.cpp.i + +.PHONY : val/validate_type.i + +# target to preprocess a source file +val/validate_type.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_type.cpp.i +.PHONY : val/validate_type.cpp.i + +val/validate_type.s: val/validate_type.cpp.s + +.PHONY : val/validate_type.s + +# target to generate assembly for a file +val/validate_type.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validate_type.cpp.s +.PHONY : val/validate_type.cpp.s + +val/validation_state.o: val/validation_state.cpp.o + +.PHONY : val/validation_state.o + +# target to build an object file +val/validation_state.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validation_state.cpp.o +.PHONY : val/validation_state.cpp.o + +val/validation_state.i: val/validation_state.cpp.i + +.PHONY : val/validation_state.i + +# target to preprocess a source file +val/validation_state.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validation_state.cpp.i +.PHONY : val/validation_state.cpp.i + +val/validation_state.s: val/validation_state.cpp.s + +.PHONY : val/validation_state.s + +# target to generate assembly for a file +val/validation_state.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools.dir/build.make source/CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/CMakeFiles/SPIRV-Tools-shared.dir/build.make source/CMakeFiles/SPIRV-Tools-shared.dir/val/validation_state.cpp.s +.PHONY : val/validation_state.cpp.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... install" + @echo "... spirv-tools-debuginfo" + @echo "... rebuild_cache" + @echo "... spirv-tools-spv-amd-shader-ballot" + @echo "... spirv-tools-spv-amd-shader-trinary-minmax" + @echo "... spirv-tools-spv-amd-gcn-shader" + @echo "... install/strip" + @echo "... spirv-tools-header-DebugInfo" + @echo "... spirv-tools-build-version" + @echo "... edit_cache" + @echo "... SPIRV-Tools" + @echo "... list_install_components" + @echo "... spirv-tools-spv-amd-shader-explicit-vertex-parameter" + @echo "... test" + @echo "... SPIRV-Tools-shared" + @echo "... spirv-tools-vimsyntax" + @echo "... install/local" + @echo "... assembly_grammar.o" + @echo "... assembly_grammar.i" + @echo "... assembly_grammar.s" + @echo "... binary.o" + @echo "... binary.i" + @echo "... binary.s" + @echo "... diagnostic.o" + @echo "... diagnostic.i" + @echo "... diagnostic.s" + @echo "... disassemble.o" + @echo "... disassemble.i" + @echo "... disassemble.s" + @echo "... enum_string_mapping.o" + @echo "... enum_string_mapping.i" + @echo "... enum_string_mapping.s" + @echo "... ext_inst.o" + @echo "... ext_inst.i" + @echo "... ext_inst.s" + @echo "... extensions.o" + @echo "... extensions.i" + @echo "... extensions.s" + @echo "... id_descriptor.o" + @echo "... id_descriptor.i" + @echo "... id_descriptor.s" + @echo "... libspirv.o" + @echo "... libspirv.i" + @echo "... libspirv.s" + @echo "... name_mapper.o" + @echo "... name_mapper.i" + @echo "... name_mapper.s" + @echo "... opcode.o" + @echo "... opcode.i" + @echo "... opcode.s" + @echo "... operand.o" + @echo "... operand.i" + @echo "... operand.s" + @echo "... parsed_operand.o" + @echo "... parsed_operand.i" + @echo "... parsed_operand.s" + @echo "... print.o" + @echo "... print.i" + @echo "... print.s" + @echo "... software_version.o" + @echo "... software_version.i" + @echo "... software_version.s" + @echo "... spirv_endian.o" + @echo "... spirv_endian.i" + @echo "... spirv_endian.s" + @echo "... spirv_optimizer_options.o" + @echo "... spirv_optimizer_options.i" + @echo "... spirv_optimizer_options.s" + @echo "... spirv_target_env.o" + @echo "... spirv_target_env.i" + @echo "... spirv_target_env.s" + @echo "... spirv_validator_options.o" + @echo "... spirv_validator_options.i" + @echo "... spirv_validator_options.s" + @echo "... table.o" + @echo "... table.i" + @echo "... table.s" + @echo "... text.o" + @echo "... text.i" + @echo "... text.s" + @echo "... text_handler.o" + @echo "... text_handler.i" + @echo "... text_handler.s" + @echo "... util/bit_vector.o" + @echo "... util/bit_vector.i" + @echo "... util/bit_vector.s" + @echo "... util/parse_number.o" + @echo "... util/parse_number.i" + @echo "... util/parse_number.s" + @echo "... util/string_utils.o" + @echo "... util/string_utils.i" + @echo "... util/string_utils.s" + @echo "... util/timer.o" + @echo "... util/timer.i" + @echo "... util/timer.s" + @echo "... val/basic_block.o" + @echo "... val/basic_block.i" + @echo "... val/basic_block.s" + @echo "... val/construct.o" + @echo "... val/construct.i" + @echo "... val/construct.s" + @echo "... val/function.o" + @echo "... val/function.i" + @echo "... val/function.s" + @echo "... val/instruction.o" + @echo "... val/instruction.i" + @echo "... val/instruction.s" + @echo "... val/validate.o" + @echo "... val/validate.i" + @echo "... val/validate.s" + @echo "... val/validate_adjacency.o" + @echo "... val/validate_adjacency.i" + @echo "... val/validate_adjacency.s" + @echo "... val/validate_annotation.o" + @echo "... val/validate_annotation.i" + @echo "... val/validate_annotation.s" + @echo "... val/validate_arithmetics.o" + @echo "... val/validate_arithmetics.i" + @echo "... val/validate_arithmetics.s" + @echo "... val/validate_atomics.o" + @echo "... val/validate_atomics.i" + @echo "... val/validate_atomics.s" + @echo "... val/validate_barriers.o" + @echo "... val/validate_barriers.i" + @echo "... val/validate_barriers.s" + @echo "... val/validate_bitwise.o" + @echo "... val/validate_bitwise.i" + @echo "... val/validate_bitwise.s" + @echo "... val/validate_builtins.o" + @echo "... val/validate_builtins.i" + @echo "... val/validate_builtins.s" + @echo "... val/validate_capability.o" + @echo "... val/validate_capability.i" + @echo "... val/validate_capability.s" + @echo "... val/validate_cfg.o" + @echo "... val/validate_cfg.i" + @echo "... val/validate_cfg.s" + @echo "... val/validate_composites.o" + @echo "... val/validate_composites.i" + @echo "... val/validate_composites.s" + @echo "... val/validate_constants.o" + @echo "... val/validate_constants.i" + @echo "... val/validate_constants.s" + @echo "... val/validate_conversion.o" + @echo "... val/validate_conversion.i" + @echo "... val/validate_conversion.s" + @echo "... val/validate_datarules.o" + @echo "... val/validate_datarules.i" + @echo "... val/validate_datarules.s" + @echo "... val/validate_debug.o" + @echo "... val/validate_debug.i" + @echo "... val/validate_debug.s" + @echo "... val/validate_decorations.o" + @echo "... val/validate_decorations.i" + @echo "... val/validate_decorations.s" + @echo "... val/validate_derivatives.o" + @echo "... val/validate_derivatives.i" + @echo "... val/validate_derivatives.s" + @echo "... val/validate_execution_limitations.o" + @echo "... val/validate_execution_limitations.i" + @echo "... val/validate_execution_limitations.s" + @echo "... val/validate_ext_inst.o" + @echo "... val/validate_ext_inst.i" + @echo "... val/validate_ext_inst.s" + @echo "... val/validate_function.o" + @echo "... val/validate_function.i" + @echo "... val/validate_function.s" + @echo "... val/validate_id.o" + @echo "... val/validate_id.i" + @echo "... val/validate_id.s" + @echo "... val/validate_image.o" + @echo "... val/validate_image.i" + @echo "... val/validate_image.s" + @echo "... val/validate_instruction.o" + @echo "... val/validate_instruction.i" + @echo "... val/validate_instruction.s" + @echo "... val/validate_interfaces.o" + @echo "... val/validate_interfaces.i" + @echo "... val/validate_interfaces.s" + @echo "... val/validate_layout.o" + @echo "... val/validate_layout.i" + @echo "... val/validate_layout.s" + @echo "... val/validate_literals.o" + @echo "... val/validate_literals.i" + @echo "... val/validate_literals.s" + @echo "... val/validate_logicals.o" + @echo "... val/validate_logicals.i" + @echo "... val/validate_logicals.s" + @echo "... val/validate_memory.o" + @echo "... val/validate_memory.i" + @echo "... val/validate_memory.s" + @echo "... val/validate_mode_setting.o" + @echo "... val/validate_mode_setting.i" + @echo "... val/validate_mode_setting.s" + @echo "... val/validate_non_uniform.o" + @echo "... val/validate_non_uniform.i" + @echo "... val/validate_non_uniform.s" + @echo "... val/validate_primitives.o" + @echo "... val/validate_primitives.i" + @echo "... val/validate_primitives.s" + @echo "... val/validate_type.o" + @echo "... val/validate_type.i" + @echo "... val/validate_type.s" + @echo "... val/validation_state.o" + @echo "... val/validation_state.i" + @echo "... val/validation_state.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/3rdparty/spirv-tools/build/source/cmake_install.cmake b/3rdparty/spirv-tools/build/source/cmake_install.cmake new file mode 100644 index 000000000..196849dff --- /dev/null +++ b/3rdparty/spirv-tools/build/source/cmake_install.cmake @@ -0,0 +1,62 @@ +# Install script for directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Debug") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "1") +endif() + +if(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" TYPE STATIC_LIBRARY FILES "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/libSPIRV-Tools.a") +endif() + +if(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + if(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/libSPIRV-Tools-shared.so" AND + NOT IS_SYMLINK "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/libSPIRV-Tools-shared.so") + file(RPATH_CHECK + FILE "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/libSPIRV-Tools-shared.so" + RPATH "") + endif() + file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" TYPE SHARED_LIBRARY FILES "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/libSPIRV-Tools-shared.so") + if(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/libSPIRV-Tools-shared.so" AND + NOT IS_SYMLINK "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/libSPIRV-Tools-shared.so") + if(CMAKE_INSTALL_DO_STRIP) + execute_process(COMMAND "/usr/bin/strip" "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/libSPIRV-Tools-shared.so") + endif() + endif() +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + # Include the install script for each subdirectory. + include("/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/comp/cmake_install.cmake") + include("/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/cmake_install.cmake") + include("/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/link/cmake_install.cmake") + +endif() + diff --git a/3rdparty/spirv-tools/build/source/comp/CMakeFiles/CMakeDirectoryInformation.cmake b/3rdparty/spirv-tools/build/source/comp/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 000000000..b636c3f88 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/comp/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/bkaradzic/Private/projects/_github/SPIRV-Tools") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/3rdparty/spirv-tools/build/source/comp/CMakeFiles/progress.marks b/3rdparty/spirv-tools/build/source/comp/CMakeFiles/progress.marks new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/comp/CMakeFiles/progress.marks @@ -0,0 +1 @@ +0 diff --git a/3rdparty/spirv-tools/build/source/comp/CTestTestfile.cmake b/3rdparty/spirv-tools/build/source/comp/CTestTestfile.cmake new file mode 100644 index 000000000..ae8de8d9e --- /dev/null +++ b/3rdparty/spirv-tools/build/source/comp/CTestTestfile.cmake @@ -0,0 +1,6 @@ +# CMake generated Testfile for +# Source directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/comp +# Build directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/comp +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. diff --git a/3rdparty/spirv-tools/build/source/comp/Makefile b/3rdparty/spirv-tools/build/source/comp/Makefile new file mode 100644 index 000000000..b6a3b3ac9 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/comp/Makefile @@ -0,0 +1,194 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Default target executed when no arguments are given to make. +default_target: all + +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..." + /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache + +.PHONY : edit_cache/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: install/strip + +.PHONY : install/strip/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Available install components are: \"Unspecified\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components + +.PHONY : list_install_components/fast + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running tests..." + /usr/bin/ctest --force-new-ctest-process $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test + +.PHONY : test/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: install/local + +.PHONY : install/local/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache + +.PHONY : rebuild_cache/fast + +# The main all target +all: cmake_check_build_system + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/comp/CMakeFiles/progress.marks + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 source/comp/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 source/comp/clean +.PHONY : clean + +# The main clean target +clean/fast: clean + +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 source/comp/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 source/comp/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... install" + @echo "... edit_cache" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... test" + @echo "... install/local" + @echo "... rebuild_cache" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/3rdparty/spirv-tools/build/source/comp/cmake_install.cmake b/3rdparty/spirv-tools/build/source/comp/cmake_install.cmake new file mode 100644 index 000000000..ce5dcb1e1 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/comp/cmake_install.cmake @@ -0,0 +1,34 @@ +# Install script for directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/comp + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Debug") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "1") +endif() + diff --git a/3rdparty/spirv-tools/build/source/link/CMakeFiles/CMakeDirectoryInformation.cmake b/3rdparty/spirv-tools/build/source/link/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 000000000..b636c3f88 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/link/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/bkaradzic/Private/projects/_github/SPIRV-Tools") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/3rdparty/spirv-tools/build/source/link/CMakeFiles/SPIRV-Tools-link.dir/DependInfo.cmake b/3rdparty/spirv-tools/build/source/link/CMakeFiles/SPIRV-Tools-link.dir/DependInfo.cmake new file mode 100644 index 000000000..b891d51ee --- /dev/null +++ b/3rdparty/spirv-tools/build/source/link/CMakeFiles/SPIRV-Tools-link.dir/DependInfo.cmake @@ -0,0 +1,34 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + "CXX" + ) +# The set of files for implicit dependencies of each language: +set(CMAKE_DEPENDS_CHECK_CXX + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/link/linker.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/link/CMakeFiles/SPIRV-Tools-link.dir/linker.cpp.o" + ) +set(CMAKE_CXX_COMPILER_ID "GNU") + +# Preprocessor definitions for this target. +set(CMAKE_TARGET_DEFINITIONS_CXX + "SPIRV_CHECK_CONTEXT" + "SPIRV_COLOR_TERMINAL" + "SPIRV_LINUX" + "SPIRV_TIMER_ENABLED" + ) + +# The include file search paths: +set(CMAKE_CXX_TARGET_INCLUDE_PATH + "../" + "../include" + "../external/SPIRV-Headers/include" + "." + ) + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/DependInfo.cmake" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/DependInfo.cmake" + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/3rdparty/spirv-tools/build/source/link/CMakeFiles/SPIRV-Tools-link.dir/build.make b/3rdparty/spirv-tools/build/source/link/CMakeFiles/SPIRV-Tools-link.dir/build.make new file mode 100644 index 000000000..188ea1174 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/link/CMakeFiles/SPIRV-Tools-link.dir/build.make @@ -0,0 +1,114 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + +# Include any dependencies generated for this target. +include source/link/CMakeFiles/SPIRV-Tools-link.dir/depend.make + +# Include the progress variables for this target. +include source/link/CMakeFiles/SPIRV-Tools-link.dir/progress.make + +# Include the compile flags for this target's objects. +include source/link/CMakeFiles/SPIRV-Tools-link.dir/flags.make + +source/link/CMakeFiles/SPIRV-Tools-link.dir/linker.cpp.o: source/link/CMakeFiles/SPIRV-Tools-link.dir/flags.make +source/link/CMakeFiles/SPIRV-Tools-link.dir/linker.cpp.o: ../source/link/linker.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object source/link/CMakeFiles/SPIRV-Tools-link.dir/linker.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/link && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-link.dir/linker.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/link/linker.cpp + +source/link/CMakeFiles/SPIRV-Tools-link.dir/linker.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-link.dir/linker.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/link && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/link/linker.cpp > CMakeFiles/SPIRV-Tools-link.dir/linker.cpp.i + +source/link/CMakeFiles/SPIRV-Tools-link.dir/linker.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-link.dir/linker.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/link && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/link/linker.cpp -o CMakeFiles/SPIRV-Tools-link.dir/linker.cpp.s + +source/link/CMakeFiles/SPIRV-Tools-link.dir/linker.cpp.o.requires: + +.PHONY : source/link/CMakeFiles/SPIRV-Tools-link.dir/linker.cpp.o.requires + +source/link/CMakeFiles/SPIRV-Tools-link.dir/linker.cpp.o.provides: source/link/CMakeFiles/SPIRV-Tools-link.dir/linker.cpp.o.requires + $(MAKE) -f source/link/CMakeFiles/SPIRV-Tools-link.dir/build.make source/link/CMakeFiles/SPIRV-Tools-link.dir/linker.cpp.o.provides.build +.PHONY : source/link/CMakeFiles/SPIRV-Tools-link.dir/linker.cpp.o.provides + +source/link/CMakeFiles/SPIRV-Tools-link.dir/linker.cpp.o.provides.build: source/link/CMakeFiles/SPIRV-Tools-link.dir/linker.cpp.o + + +# Object files for target SPIRV-Tools-link +SPIRV__Tools__link_OBJECTS = \ +"CMakeFiles/SPIRV-Tools-link.dir/linker.cpp.o" + +# External object files for target SPIRV-Tools-link +SPIRV__Tools__link_EXTERNAL_OBJECTS = + +source/link/libSPIRV-Tools-link.a: source/link/CMakeFiles/SPIRV-Tools-link.dir/linker.cpp.o +source/link/libSPIRV-Tools-link.a: source/link/CMakeFiles/SPIRV-Tools-link.dir/build.make +source/link/libSPIRV-Tools-link.a: source/link/CMakeFiles/SPIRV-Tools-link.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --bold --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Linking CXX static library libSPIRV-Tools-link.a" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/link && $(CMAKE_COMMAND) -P CMakeFiles/SPIRV-Tools-link.dir/cmake_clean_target.cmake + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/link && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/SPIRV-Tools-link.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +source/link/CMakeFiles/SPIRV-Tools-link.dir/build: source/link/libSPIRV-Tools-link.a + +.PHONY : source/link/CMakeFiles/SPIRV-Tools-link.dir/build + +source/link/CMakeFiles/SPIRV-Tools-link.dir/requires: source/link/CMakeFiles/SPIRV-Tools-link.dir/linker.cpp.o.requires + +.PHONY : source/link/CMakeFiles/SPIRV-Tools-link.dir/requires + +source/link/CMakeFiles/SPIRV-Tools-link.dir/clean: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/link && $(CMAKE_COMMAND) -P CMakeFiles/SPIRV-Tools-link.dir/cmake_clean.cmake +.PHONY : source/link/CMakeFiles/SPIRV-Tools-link.dir/clean + +source/link/CMakeFiles/SPIRV-Tools-link.dir/depend: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/bkaradzic/Private/projects/_github/SPIRV-Tools /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/link /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/link /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/link/CMakeFiles/SPIRV-Tools-link.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : source/link/CMakeFiles/SPIRV-Tools-link.dir/depend + diff --git a/3rdparty/spirv-tools/build/source/link/CMakeFiles/SPIRV-Tools-link.dir/cmake_clean.cmake b/3rdparty/spirv-tools/build/source/link/CMakeFiles/SPIRV-Tools-link.dir/cmake_clean.cmake new file mode 100644 index 000000000..53aa18fdc --- /dev/null +++ b/3rdparty/spirv-tools/build/source/link/CMakeFiles/SPIRV-Tools-link.dir/cmake_clean.cmake @@ -0,0 +1,10 @@ +file(REMOVE_RECURSE + "CMakeFiles/SPIRV-Tools-link.dir/linker.cpp.o" + "libSPIRV-Tools-link.pdb" + "libSPIRV-Tools-link.a" +) + +# Per-language clean rules from dependency scanning. +foreach(lang CXX) + include(CMakeFiles/SPIRV-Tools-link.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/3rdparty/spirv-tools/build/source/link/CMakeFiles/SPIRV-Tools-link.dir/cmake_clean_target.cmake b/3rdparty/spirv-tools/build/source/link/CMakeFiles/SPIRV-Tools-link.dir/cmake_clean_target.cmake new file mode 100644 index 000000000..c3d760cd7 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/link/CMakeFiles/SPIRV-Tools-link.dir/cmake_clean_target.cmake @@ -0,0 +1,3 @@ +file(REMOVE_RECURSE + "libSPIRV-Tools-link.a" +) diff --git a/3rdparty/spirv-tools/build/source/link/CMakeFiles/SPIRV-Tools-link.dir/depend.make b/3rdparty/spirv-tools/build/source/link/CMakeFiles/SPIRV-Tools-link.dir/depend.make new file mode 100644 index 000000000..8c19a11ac --- /dev/null +++ b/3rdparty/spirv-tools/build/source/link/CMakeFiles/SPIRV-Tools-link.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for SPIRV-Tools-link. +# This may be replaced when dependencies are built. diff --git a/3rdparty/spirv-tools/build/source/link/CMakeFiles/SPIRV-Tools-link.dir/flags.make b/3rdparty/spirv-tools/build/source/link/CMakeFiles/SPIRV-Tools-link.dir/flags.make new file mode 100644 index 000000000..5e2e32686 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/link/CMakeFiles/SPIRV-Tools-link.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# compile CXX with /usr/bin/c++ +CXX_FLAGS = -g -fPIC -Wall -Wextra -Wnon-virtual-dtor -Wno-missing-field-initializers -Werror -std=c++11 -fno-exceptions -fno-rtti -Wno-long-long -Wshadow -Wundef -Wconversion -Wno-sign-conversion -std=gnu++11 + +CXX_DEFINES = -DSPIRV_CHECK_CONTEXT -DSPIRV_COLOR_TERMINAL -DSPIRV_LINUX -DSPIRV_TIMER_ENABLED + +CXX_INCLUDES = -I/home/bkaradzic/Private/projects/_github/SPIRV-Tools -I/home/bkaradzic/Private/projects/_github/SPIRV-Tools/include -I/home/bkaradzic/Private/projects/_github/SPIRV-Tools/external/SPIRV-Headers/include -I/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + diff --git a/3rdparty/spirv-tools/build/source/link/CMakeFiles/SPIRV-Tools-link.dir/link.txt b/3rdparty/spirv-tools/build/source/link/CMakeFiles/SPIRV-Tools-link.dir/link.txt new file mode 100644 index 000000000..c7f6a620a --- /dev/null +++ b/3rdparty/spirv-tools/build/source/link/CMakeFiles/SPIRV-Tools-link.dir/link.txt @@ -0,0 +1,2 @@ +/usr/bin/ar qc libSPIRV-Tools-link.a CMakeFiles/SPIRV-Tools-link.dir/linker.cpp.o +/usr/bin/ranlib libSPIRV-Tools-link.a diff --git a/3rdparty/spirv-tools/build/source/link/CMakeFiles/SPIRV-Tools-link.dir/progress.make b/3rdparty/spirv-tools/build/source/link/CMakeFiles/SPIRV-Tools-link.dir/progress.make new file mode 100644 index 000000000..b2fb3ce84 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/link/CMakeFiles/SPIRV-Tools-link.dir/progress.make @@ -0,0 +1,3 @@ +CMAKE_PROGRESS_1 = +CMAKE_PROGRESS_2 = 29 + diff --git a/3rdparty/spirv-tools/build/source/link/CMakeFiles/progress.marks b/3rdparty/spirv-tools/build/source/link/CMakeFiles/progress.marks new file mode 100644 index 000000000..abdfb053e --- /dev/null +++ b/3rdparty/spirv-tools/build/source/link/CMakeFiles/progress.marks @@ -0,0 +1 @@ +60 diff --git a/3rdparty/spirv-tools/build/source/link/CTestTestfile.cmake b/3rdparty/spirv-tools/build/source/link/CTestTestfile.cmake new file mode 100644 index 000000000..ecc2334b3 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/link/CTestTestfile.cmake @@ -0,0 +1,7 @@ +# CMake generated Testfile for +# Source directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/link +# Build directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/link +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. +add_test(spirv-tools-symbol-exports-SPIRV-Tools-link "/usr/bin/python" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/utils/check_symbol_exports.py" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/link/libSPIRV-Tools-link.a") diff --git a/3rdparty/spirv-tools/build/source/link/Makefile b/3rdparty/spirv-tools/build/source/link/Makefile new file mode 100644 index 000000000..072a55780 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/link/Makefile @@ -0,0 +1,240 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Default target executed when no arguments are given to make. +default_target: all + +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache + +.PHONY : rebuild_cache/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: install/strip + +.PHONY : install/strip/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..." + /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache + +.PHONY : edit_cache/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Available install components are: \"Unspecified\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components + +.PHONY : list_install_components/fast + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running tests..." + /usr/bin/ctest --force-new-ctest-process $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test + +.PHONY : test/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: install/local + +.PHONY : install/local/fast + +# The main all target +all: cmake_check_build_system + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/link/CMakeFiles/progress.marks + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 source/link/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 source/link/clean +.PHONY : clean + +# The main clean target +clean/fast: clean + +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 source/link/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 source/link/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Convenience name for target. +source/link/CMakeFiles/SPIRV-Tools-link.dir/rule: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 source/link/CMakeFiles/SPIRV-Tools-link.dir/rule +.PHONY : source/link/CMakeFiles/SPIRV-Tools-link.dir/rule + +# Convenience name for target. +SPIRV-Tools-link: source/link/CMakeFiles/SPIRV-Tools-link.dir/rule + +.PHONY : SPIRV-Tools-link + +# fast build rule for target. +SPIRV-Tools-link/fast: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/link/CMakeFiles/SPIRV-Tools-link.dir/build.make source/link/CMakeFiles/SPIRV-Tools-link.dir/build +.PHONY : SPIRV-Tools-link/fast + +linker.o: linker.cpp.o + +.PHONY : linker.o + +# target to build an object file +linker.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/link/CMakeFiles/SPIRV-Tools-link.dir/build.make source/link/CMakeFiles/SPIRV-Tools-link.dir/linker.cpp.o +.PHONY : linker.cpp.o + +linker.i: linker.cpp.i + +.PHONY : linker.i + +# target to preprocess a source file +linker.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/link/CMakeFiles/SPIRV-Tools-link.dir/build.make source/link/CMakeFiles/SPIRV-Tools-link.dir/linker.cpp.i +.PHONY : linker.cpp.i + +linker.s: linker.cpp.s + +.PHONY : linker.s + +# target to generate assembly for a file +linker.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/link/CMakeFiles/SPIRV-Tools-link.dir/build.make source/link/CMakeFiles/SPIRV-Tools-link.dir/linker.cpp.s +.PHONY : linker.cpp.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... install" + @echo "... rebuild_cache" + @echo "... install/strip" + @echo "... SPIRV-Tools-link" + @echo "... edit_cache" + @echo "... list_install_components" + @echo "... test" + @echo "... install/local" + @echo "... linker.o" + @echo "... linker.i" + @echo "... linker.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/3rdparty/spirv-tools/build/source/link/cmake_install.cmake b/3rdparty/spirv-tools/build/source/link/cmake_install.cmake new file mode 100644 index 000000000..c08d62398 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/link/cmake_install.cmake @@ -0,0 +1,38 @@ +# Install script for directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/link + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Debug") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "1") +endif() + +if(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" TYPE STATIC_LIBRARY FILES "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/link/libSPIRV-Tools-link.a") +endif() + diff --git a/3rdparty/spirv-tools/build/source/opt/CMakeFiles/CMakeDirectoryInformation.cmake b/3rdparty/spirv-tools/build/source/opt/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 000000000..b636c3f88 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/opt/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/bkaradzic/Private/projects/_github/SPIRV-Tools") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/3rdparty/spirv-tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/DependInfo.cmake b/3rdparty/spirv-tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/DependInfo.cmake new file mode 100644 index 000000000..6bde6edde --- /dev/null +++ b/3rdparty/spirv-tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/DependInfo.cmake @@ -0,0 +1,115 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + "CXX" + ) +# The set of files for implicit dependencies of each language: +set(CMAKE_DEPENDS_CHECK_CXX + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/aggressive_dead_code_elim_pass.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/aggressive_dead_code_elim_pass.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/basic_block.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/basic_block.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/block_merge_pass.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/block_merge_pass.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/build_module.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build_module.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/ccp_pass.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ccp_pass.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/cfg.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/cfg.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/cfg_cleanup_pass.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/cfg_cleanup_pass.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/combine_access_chains.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/combine_access_chains.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/common_uniform_elim_pass.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/common_uniform_elim_pass.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/compact_ids_pass.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/compact_ids_pass.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/composite.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/composite.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/const_folding_rules.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/const_folding_rules.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/constants.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/constants.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/copy_prop_arrays.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/copy_prop_arrays.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/dead_branch_elim_pass.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_branch_elim_pass.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/dead_insert_elim_pass.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_insert_elim_pass.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/dead_variable_elimination.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_variable_elimination.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/decoration_manager.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/decoration_manager.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/def_use_manager.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/def_use_manager.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/dominator_analysis.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dominator_analysis.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/dominator_tree.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dominator_tree.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/eliminate_dead_constant_pass.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_constant_pass.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/eliminate_dead_functions_pass.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_functions_pass.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/feature_manager.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/feature_manager.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/flatten_decoration_pass.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flatten_decoration_pass.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/fold.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/fold.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/fold_spec_constant_op_and_composite_pass.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/fold_spec_constant_op_and_composite_pass.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/folding_rules.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/folding_rules.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/freeze_spec_constant_value_pass.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/freeze_spec_constant_value_pass.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/function.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/function.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/if_conversion.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/if_conversion.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/inline_exhaustive_pass.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_exhaustive_pass.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/inline_opaque_pass.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_opaque_pass.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/inline_pass.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_pass.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/instruction.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/instruction.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/instruction_list.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/instruction_list.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/ir_context.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ir_context.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/ir_loader.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ir_loader.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/licm_pass.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/licm_pass.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/local_access_chain_convert_pass.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_access_chain_convert_pass.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/local_redundancy_elimination.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_redundancy_elimination.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/local_single_block_elim_pass.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_single_block_elim_pass.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/local_single_store_elim_pass.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_single_store_elim_pass.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/local_ssa_elim_pass.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_ssa_elim_pass.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/loop_dependence.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/loop_dependence_helpers.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence_helpers.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/loop_descriptor.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_descriptor.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/loop_fission.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fission.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/loop_fusion.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/loop_fusion_pass.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion_pass.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/loop_peeling.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_peeling.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/loop_unroller.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_unroller.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/loop_unswitch_pass.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_unswitch_pass.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/loop_utils.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_utils.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/mem_pass.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/mem_pass.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/merge_return_pass.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/merge_return_pass.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/module.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/module.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/optimizer.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/optimizer.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/pass.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/pass.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/pass_manager.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/pass_manager.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/private_to_local_pass.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/private_to_local_pass.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/propagator.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/propagator.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/reduce_load_size.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/reduce_load_size.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/redundancy_elimination.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/redundancy_elimination.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/register_pressure.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/register_pressure.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/remove_duplicates_pass.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/remove_duplicates_pass.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/replace_invalid_opc.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/replace_invalid_opc.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/scalar_analysis.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/scalar_analysis_simplification.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis_simplification.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/scalar_replacement_pass.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_replacement_pass.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/set_spec_constant_default_value_pass.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/set_spec_constant_default_value_pass.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/simplification_pass.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/simplification_pass.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/ssa_rewrite_pass.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ssa_rewrite_pass.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/strength_reduction_pass.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strength_reduction_pass.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/strip_debug_info_pass.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strip_debug_info_pass.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/strip_reflect_info_pass.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strip_reflect_info_pass.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/struct_cfg_analysis.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/struct_cfg_analysis.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/type_manager.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/type_manager.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/types.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/types.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/unify_const_pass.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/unify_const_pass.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/value_number_table.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/value_number_table.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/vector_dce.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/vector_dce.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/workaround1209.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/workaround1209.cpp.o" + ) +set(CMAKE_CXX_COMPILER_ID "GNU") + +# Preprocessor definitions for this target. +set(CMAKE_TARGET_DEFINITIONS_CXX + "SPIRV_CHECK_CONTEXT" + "SPIRV_COLOR_TERMINAL" + "SPIRV_LINUX" + "SPIRV_TIMER_ENABLED" + ) + +# The include file search paths: +set(CMAKE_CXX_TARGET_INCLUDE_PATH + "../" + "../include" + "../external/SPIRV-Headers/include" + "." + ) + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/DependInfo.cmake" + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/3rdparty/spirv-tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make b/3rdparty/spirv-tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make new file mode 100644 index 000000000..c17ac99f6 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make @@ -0,0 +1,2328 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + +# Include any dependencies generated for this target. +include source/opt/CMakeFiles/SPIRV-Tools-opt.dir/depend.make + +# Include the progress variables for this target. +include source/opt/CMakeFiles/SPIRV-Tools-opt.dir/progress.make + +# Include the compile flags for this target's objects. +include source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/aggressive_dead_code_elim_pass.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/aggressive_dead_code_elim_pass.cpp.o: ../source/opt/aggressive_dead_code_elim_pass.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/aggressive_dead_code_elim_pass.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/aggressive_dead_code_elim_pass.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/aggressive_dead_code_elim_pass.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/aggressive_dead_code_elim_pass.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/aggressive_dead_code_elim_pass.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/aggressive_dead_code_elim_pass.cpp > CMakeFiles/SPIRV-Tools-opt.dir/aggressive_dead_code_elim_pass.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/aggressive_dead_code_elim_pass.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/aggressive_dead_code_elim_pass.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/aggressive_dead_code_elim_pass.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/aggressive_dead_code_elim_pass.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/aggressive_dead_code_elim_pass.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/aggressive_dead_code_elim_pass.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/aggressive_dead_code_elim_pass.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/aggressive_dead_code_elim_pass.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/aggressive_dead_code_elim_pass.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/aggressive_dead_code_elim_pass.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/aggressive_dead_code_elim_pass.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/aggressive_dead_code_elim_pass.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/basic_block.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/basic_block.cpp.o: ../source/opt/basic_block.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/basic_block.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/basic_block.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/basic_block.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/basic_block.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/basic_block.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/basic_block.cpp > CMakeFiles/SPIRV-Tools-opt.dir/basic_block.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/basic_block.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/basic_block.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/basic_block.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/basic_block.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/basic_block.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/basic_block.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/basic_block.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/basic_block.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/basic_block.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/basic_block.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/basic_block.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/basic_block.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/block_merge_pass.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/block_merge_pass.cpp.o: ../source/opt/block_merge_pass.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_3) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/block_merge_pass.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/block_merge_pass.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/block_merge_pass.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/block_merge_pass.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/block_merge_pass.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/block_merge_pass.cpp > CMakeFiles/SPIRV-Tools-opt.dir/block_merge_pass.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/block_merge_pass.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/block_merge_pass.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/block_merge_pass.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/block_merge_pass.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/block_merge_pass.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/block_merge_pass.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/block_merge_pass.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/block_merge_pass.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/block_merge_pass.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/block_merge_pass.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/block_merge_pass.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/block_merge_pass.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build_module.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build_module.cpp.o: ../source/opt/build_module.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_4) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build_module.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/build_module.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/build_module.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build_module.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/build_module.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/build_module.cpp > CMakeFiles/SPIRV-Tools-opt.dir/build_module.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build_module.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/build_module.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/build_module.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/build_module.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build_module.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build_module.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build_module.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build_module.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build_module.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build_module.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build_module.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build_module.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ccp_pass.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ccp_pass.cpp.o: ../source/opt/ccp_pass.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_5) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ccp_pass.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/ccp_pass.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/ccp_pass.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ccp_pass.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/ccp_pass.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/ccp_pass.cpp > CMakeFiles/SPIRV-Tools-opt.dir/ccp_pass.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ccp_pass.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/ccp_pass.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/ccp_pass.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/ccp_pass.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ccp_pass.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ccp_pass.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ccp_pass.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ccp_pass.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ccp_pass.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ccp_pass.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ccp_pass.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ccp_pass.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/cfg_cleanup_pass.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/cfg_cleanup_pass.cpp.o: ../source/opt/cfg_cleanup_pass.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_6) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/cfg_cleanup_pass.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/cfg_cleanup_pass.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/cfg_cleanup_pass.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/cfg_cleanup_pass.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/cfg_cleanup_pass.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/cfg_cleanup_pass.cpp > CMakeFiles/SPIRV-Tools-opt.dir/cfg_cleanup_pass.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/cfg_cleanup_pass.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/cfg_cleanup_pass.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/cfg_cleanup_pass.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/cfg_cleanup_pass.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/cfg_cleanup_pass.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/cfg_cleanup_pass.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/cfg_cleanup_pass.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/cfg_cleanup_pass.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/cfg_cleanup_pass.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/cfg_cleanup_pass.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/cfg_cleanup_pass.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/cfg_cleanup_pass.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/cfg.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/cfg.cpp.o: ../source/opt/cfg.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_7) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/cfg.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/cfg.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/cfg.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/cfg.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/cfg.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/cfg.cpp > CMakeFiles/SPIRV-Tools-opt.dir/cfg.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/cfg.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/cfg.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/cfg.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/cfg.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/cfg.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/cfg.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/cfg.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/cfg.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/cfg.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/cfg.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/cfg.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/cfg.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/combine_access_chains.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/combine_access_chains.cpp.o: ../source/opt/combine_access_chains.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_8) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/combine_access_chains.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/combine_access_chains.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/combine_access_chains.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/combine_access_chains.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/combine_access_chains.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/combine_access_chains.cpp > CMakeFiles/SPIRV-Tools-opt.dir/combine_access_chains.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/combine_access_chains.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/combine_access_chains.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/combine_access_chains.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/combine_access_chains.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/combine_access_chains.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/combine_access_chains.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/combine_access_chains.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/combine_access_chains.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/combine_access_chains.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/combine_access_chains.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/combine_access_chains.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/combine_access_chains.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/common_uniform_elim_pass.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/common_uniform_elim_pass.cpp.o: ../source/opt/common_uniform_elim_pass.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_9) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/common_uniform_elim_pass.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/common_uniform_elim_pass.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/common_uniform_elim_pass.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/common_uniform_elim_pass.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/common_uniform_elim_pass.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/common_uniform_elim_pass.cpp > CMakeFiles/SPIRV-Tools-opt.dir/common_uniform_elim_pass.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/common_uniform_elim_pass.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/common_uniform_elim_pass.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/common_uniform_elim_pass.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/common_uniform_elim_pass.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/common_uniform_elim_pass.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/common_uniform_elim_pass.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/common_uniform_elim_pass.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/common_uniform_elim_pass.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/common_uniform_elim_pass.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/common_uniform_elim_pass.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/common_uniform_elim_pass.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/common_uniform_elim_pass.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/compact_ids_pass.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/compact_ids_pass.cpp.o: ../source/opt/compact_ids_pass.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_10) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/compact_ids_pass.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/compact_ids_pass.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/compact_ids_pass.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/compact_ids_pass.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/compact_ids_pass.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/compact_ids_pass.cpp > CMakeFiles/SPIRV-Tools-opt.dir/compact_ids_pass.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/compact_ids_pass.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/compact_ids_pass.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/compact_ids_pass.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/compact_ids_pass.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/compact_ids_pass.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/compact_ids_pass.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/compact_ids_pass.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/compact_ids_pass.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/compact_ids_pass.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/compact_ids_pass.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/compact_ids_pass.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/compact_ids_pass.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/composite.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/composite.cpp.o: ../source/opt/composite.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_11) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/composite.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/composite.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/composite.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/composite.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/composite.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/composite.cpp > CMakeFiles/SPIRV-Tools-opt.dir/composite.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/composite.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/composite.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/composite.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/composite.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/composite.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/composite.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/composite.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/composite.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/composite.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/composite.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/composite.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/composite.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/const_folding_rules.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/const_folding_rules.cpp.o: ../source/opt/const_folding_rules.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_12) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/const_folding_rules.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/const_folding_rules.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/const_folding_rules.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/const_folding_rules.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/const_folding_rules.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/const_folding_rules.cpp > CMakeFiles/SPIRV-Tools-opt.dir/const_folding_rules.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/const_folding_rules.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/const_folding_rules.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/const_folding_rules.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/const_folding_rules.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/const_folding_rules.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/const_folding_rules.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/const_folding_rules.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/const_folding_rules.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/const_folding_rules.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/const_folding_rules.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/const_folding_rules.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/const_folding_rules.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/constants.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/constants.cpp.o: ../source/opt/constants.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_13) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/constants.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/constants.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/constants.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/constants.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/constants.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/constants.cpp > CMakeFiles/SPIRV-Tools-opt.dir/constants.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/constants.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/constants.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/constants.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/constants.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/constants.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/constants.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/constants.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/constants.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/constants.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/constants.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/constants.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/constants.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/copy_prop_arrays.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/copy_prop_arrays.cpp.o: ../source/opt/copy_prop_arrays.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_14) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/copy_prop_arrays.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/copy_prop_arrays.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/copy_prop_arrays.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/copy_prop_arrays.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/copy_prop_arrays.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/copy_prop_arrays.cpp > CMakeFiles/SPIRV-Tools-opt.dir/copy_prop_arrays.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/copy_prop_arrays.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/copy_prop_arrays.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/copy_prop_arrays.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/copy_prop_arrays.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/copy_prop_arrays.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/copy_prop_arrays.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/copy_prop_arrays.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/copy_prop_arrays.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/copy_prop_arrays.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/copy_prop_arrays.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/copy_prop_arrays.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/copy_prop_arrays.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_branch_elim_pass.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_branch_elim_pass.cpp.o: ../source/opt/dead_branch_elim_pass.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_15) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_branch_elim_pass.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/dead_branch_elim_pass.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/dead_branch_elim_pass.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_branch_elim_pass.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/dead_branch_elim_pass.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/dead_branch_elim_pass.cpp > CMakeFiles/SPIRV-Tools-opt.dir/dead_branch_elim_pass.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_branch_elim_pass.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/dead_branch_elim_pass.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/dead_branch_elim_pass.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/dead_branch_elim_pass.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_branch_elim_pass.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_branch_elim_pass.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_branch_elim_pass.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_branch_elim_pass.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_branch_elim_pass.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_branch_elim_pass.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_branch_elim_pass.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_branch_elim_pass.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_insert_elim_pass.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_insert_elim_pass.cpp.o: ../source/opt/dead_insert_elim_pass.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_16) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_insert_elim_pass.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/dead_insert_elim_pass.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/dead_insert_elim_pass.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_insert_elim_pass.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/dead_insert_elim_pass.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/dead_insert_elim_pass.cpp > CMakeFiles/SPIRV-Tools-opt.dir/dead_insert_elim_pass.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_insert_elim_pass.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/dead_insert_elim_pass.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/dead_insert_elim_pass.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/dead_insert_elim_pass.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_insert_elim_pass.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_insert_elim_pass.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_insert_elim_pass.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_insert_elim_pass.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_insert_elim_pass.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_insert_elim_pass.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_insert_elim_pass.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_insert_elim_pass.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_variable_elimination.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_variable_elimination.cpp.o: ../source/opt/dead_variable_elimination.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_17) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_variable_elimination.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/dead_variable_elimination.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/dead_variable_elimination.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_variable_elimination.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/dead_variable_elimination.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/dead_variable_elimination.cpp > CMakeFiles/SPIRV-Tools-opt.dir/dead_variable_elimination.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_variable_elimination.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/dead_variable_elimination.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/dead_variable_elimination.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/dead_variable_elimination.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_variable_elimination.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_variable_elimination.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_variable_elimination.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_variable_elimination.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_variable_elimination.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_variable_elimination.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_variable_elimination.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_variable_elimination.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/decoration_manager.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/decoration_manager.cpp.o: ../source/opt/decoration_manager.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_18) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/decoration_manager.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/decoration_manager.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/decoration_manager.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/decoration_manager.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/decoration_manager.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/decoration_manager.cpp > CMakeFiles/SPIRV-Tools-opt.dir/decoration_manager.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/decoration_manager.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/decoration_manager.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/decoration_manager.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/decoration_manager.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/decoration_manager.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/decoration_manager.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/decoration_manager.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/decoration_manager.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/decoration_manager.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/decoration_manager.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/decoration_manager.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/decoration_manager.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/def_use_manager.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/def_use_manager.cpp.o: ../source/opt/def_use_manager.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_19) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/def_use_manager.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/def_use_manager.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/def_use_manager.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/def_use_manager.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/def_use_manager.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/def_use_manager.cpp > CMakeFiles/SPIRV-Tools-opt.dir/def_use_manager.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/def_use_manager.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/def_use_manager.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/def_use_manager.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/def_use_manager.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/def_use_manager.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/def_use_manager.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/def_use_manager.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/def_use_manager.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/def_use_manager.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/def_use_manager.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/def_use_manager.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/def_use_manager.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dominator_analysis.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dominator_analysis.cpp.o: ../source/opt/dominator_analysis.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_20) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dominator_analysis.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/dominator_analysis.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/dominator_analysis.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dominator_analysis.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/dominator_analysis.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/dominator_analysis.cpp > CMakeFiles/SPIRV-Tools-opt.dir/dominator_analysis.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dominator_analysis.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/dominator_analysis.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/dominator_analysis.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/dominator_analysis.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dominator_analysis.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dominator_analysis.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dominator_analysis.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dominator_analysis.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dominator_analysis.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dominator_analysis.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dominator_analysis.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dominator_analysis.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dominator_tree.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dominator_tree.cpp.o: ../source/opt/dominator_tree.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_21) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dominator_tree.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/dominator_tree.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/dominator_tree.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dominator_tree.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/dominator_tree.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/dominator_tree.cpp > CMakeFiles/SPIRV-Tools-opt.dir/dominator_tree.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dominator_tree.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/dominator_tree.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/dominator_tree.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/dominator_tree.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dominator_tree.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dominator_tree.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dominator_tree.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dominator_tree.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dominator_tree.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dominator_tree.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dominator_tree.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dominator_tree.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_constant_pass.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_constant_pass.cpp.o: ../source/opt/eliminate_dead_constant_pass.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_22) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_constant_pass.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_constant_pass.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/eliminate_dead_constant_pass.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_constant_pass.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_constant_pass.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/eliminate_dead_constant_pass.cpp > CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_constant_pass.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_constant_pass.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_constant_pass.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/eliminate_dead_constant_pass.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_constant_pass.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_constant_pass.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_constant_pass.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_constant_pass.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_constant_pass.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_constant_pass.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_constant_pass.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_constant_pass.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_constant_pass.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_functions_pass.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_functions_pass.cpp.o: ../source/opt/eliminate_dead_functions_pass.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_23) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_functions_pass.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_functions_pass.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/eliminate_dead_functions_pass.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_functions_pass.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_functions_pass.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/eliminate_dead_functions_pass.cpp > CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_functions_pass.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_functions_pass.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_functions_pass.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/eliminate_dead_functions_pass.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_functions_pass.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_functions_pass.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_functions_pass.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_functions_pass.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_functions_pass.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_functions_pass.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_functions_pass.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_functions_pass.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_functions_pass.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/feature_manager.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/feature_manager.cpp.o: ../source/opt/feature_manager.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_24) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/feature_manager.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/feature_manager.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/feature_manager.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/feature_manager.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/feature_manager.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/feature_manager.cpp > CMakeFiles/SPIRV-Tools-opt.dir/feature_manager.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/feature_manager.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/feature_manager.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/feature_manager.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/feature_manager.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/feature_manager.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/feature_manager.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/feature_manager.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/feature_manager.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/feature_manager.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/feature_manager.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/feature_manager.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/feature_manager.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flatten_decoration_pass.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flatten_decoration_pass.cpp.o: ../source/opt/flatten_decoration_pass.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_25) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flatten_decoration_pass.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/flatten_decoration_pass.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/flatten_decoration_pass.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flatten_decoration_pass.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/flatten_decoration_pass.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/flatten_decoration_pass.cpp > CMakeFiles/SPIRV-Tools-opt.dir/flatten_decoration_pass.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flatten_decoration_pass.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/flatten_decoration_pass.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/flatten_decoration_pass.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/flatten_decoration_pass.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flatten_decoration_pass.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flatten_decoration_pass.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flatten_decoration_pass.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flatten_decoration_pass.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flatten_decoration_pass.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flatten_decoration_pass.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flatten_decoration_pass.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flatten_decoration_pass.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/fold.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/fold.cpp.o: ../source/opt/fold.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_26) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/fold.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/fold.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/fold.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/fold.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/fold.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/fold.cpp > CMakeFiles/SPIRV-Tools-opt.dir/fold.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/fold.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/fold.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/fold.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/fold.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/fold.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/fold.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/fold.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/fold.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/fold.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/fold.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/fold.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/fold.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/folding_rules.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/folding_rules.cpp.o: ../source/opt/folding_rules.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_27) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/folding_rules.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/folding_rules.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/folding_rules.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/folding_rules.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/folding_rules.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/folding_rules.cpp > CMakeFiles/SPIRV-Tools-opt.dir/folding_rules.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/folding_rules.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/folding_rules.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/folding_rules.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/folding_rules.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/folding_rules.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/folding_rules.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/folding_rules.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/folding_rules.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/folding_rules.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/folding_rules.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/folding_rules.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/folding_rules.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/fold_spec_constant_op_and_composite_pass.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/fold_spec_constant_op_and_composite_pass.cpp.o: ../source/opt/fold_spec_constant_op_and_composite_pass.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_28) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/fold_spec_constant_op_and_composite_pass.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/fold_spec_constant_op_and_composite_pass.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/fold_spec_constant_op_and_composite_pass.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/fold_spec_constant_op_and_composite_pass.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/fold_spec_constant_op_and_composite_pass.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/fold_spec_constant_op_and_composite_pass.cpp > CMakeFiles/SPIRV-Tools-opt.dir/fold_spec_constant_op_and_composite_pass.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/fold_spec_constant_op_and_composite_pass.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/fold_spec_constant_op_and_composite_pass.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/fold_spec_constant_op_and_composite_pass.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/fold_spec_constant_op_and_composite_pass.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/fold_spec_constant_op_and_composite_pass.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/fold_spec_constant_op_and_composite_pass.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/fold_spec_constant_op_and_composite_pass.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/fold_spec_constant_op_and_composite_pass.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/fold_spec_constant_op_and_composite_pass.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/fold_spec_constant_op_and_composite_pass.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/fold_spec_constant_op_and_composite_pass.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/fold_spec_constant_op_and_composite_pass.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/freeze_spec_constant_value_pass.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/freeze_spec_constant_value_pass.cpp.o: ../source/opt/freeze_spec_constant_value_pass.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_29) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/freeze_spec_constant_value_pass.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/freeze_spec_constant_value_pass.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/freeze_spec_constant_value_pass.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/freeze_spec_constant_value_pass.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/freeze_spec_constant_value_pass.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/freeze_spec_constant_value_pass.cpp > CMakeFiles/SPIRV-Tools-opt.dir/freeze_spec_constant_value_pass.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/freeze_spec_constant_value_pass.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/freeze_spec_constant_value_pass.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/freeze_spec_constant_value_pass.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/freeze_spec_constant_value_pass.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/freeze_spec_constant_value_pass.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/freeze_spec_constant_value_pass.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/freeze_spec_constant_value_pass.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/freeze_spec_constant_value_pass.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/freeze_spec_constant_value_pass.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/freeze_spec_constant_value_pass.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/freeze_spec_constant_value_pass.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/freeze_spec_constant_value_pass.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/function.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/function.cpp.o: ../source/opt/function.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_30) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/function.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/function.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/function.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/function.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/function.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/function.cpp > CMakeFiles/SPIRV-Tools-opt.dir/function.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/function.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/function.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/function.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/function.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/function.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/function.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/function.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/function.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/function.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/function.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/function.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/function.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/if_conversion.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/if_conversion.cpp.o: ../source/opt/if_conversion.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_31) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/if_conversion.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/if_conversion.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/if_conversion.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/if_conversion.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/if_conversion.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/if_conversion.cpp > CMakeFiles/SPIRV-Tools-opt.dir/if_conversion.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/if_conversion.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/if_conversion.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/if_conversion.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/if_conversion.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/if_conversion.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/if_conversion.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/if_conversion.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/if_conversion.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/if_conversion.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/if_conversion.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/if_conversion.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/if_conversion.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_exhaustive_pass.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_exhaustive_pass.cpp.o: ../source/opt/inline_exhaustive_pass.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_32) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_exhaustive_pass.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/inline_exhaustive_pass.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/inline_exhaustive_pass.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_exhaustive_pass.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/inline_exhaustive_pass.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/inline_exhaustive_pass.cpp > CMakeFiles/SPIRV-Tools-opt.dir/inline_exhaustive_pass.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_exhaustive_pass.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/inline_exhaustive_pass.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/inline_exhaustive_pass.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/inline_exhaustive_pass.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_exhaustive_pass.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_exhaustive_pass.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_exhaustive_pass.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_exhaustive_pass.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_exhaustive_pass.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_exhaustive_pass.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_exhaustive_pass.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_exhaustive_pass.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_opaque_pass.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_opaque_pass.cpp.o: ../source/opt/inline_opaque_pass.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_33) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_opaque_pass.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/inline_opaque_pass.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/inline_opaque_pass.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_opaque_pass.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/inline_opaque_pass.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/inline_opaque_pass.cpp > CMakeFiles/SPIRV-Tools-opt.dir/inline_opaque_pass.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_opaque_pass.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/inline_opaque_pass.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/inline_opaque_pass.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/inline_opaque_pass.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_opaque_pass.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_opaque_pass.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_opaque_pass.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_opaque_pass.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_opaque_pass.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_opaque_pass.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_opaque_pass.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_opaque_pass.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_pass.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_pass.cpp.o: ../source/opt/inline_pass.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_34) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_pass.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/inline_pass.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/inline_pass.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_pass.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/inline_pass.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/inline_pass.cpp > CMakeFiles/SPIRV-Tools-opt.dir/inline_pass.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_pass.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/inline_pass.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/inline_pass.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/inline_pass.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_pass.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_pass.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_pass.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_pass.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_pass.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_pass.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_pass.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_pass.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/instruction.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/instruction.cpp.o: ../source/opt/instruction.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_35) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/instruction.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/instruction.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/instruction.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/instruction.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/instruction.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/instruction.cpp > CMakeFiles/SPIRV-Tools-opt.dir/instruction.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/instruction.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/instruction.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/instruction.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/instruction.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/instruction.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/instruction.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/instruction.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/instruction.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/instruction.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/instruction.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/instruction.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/instruction.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/instruction_list.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/instruction_list.cpp.o: ../source/opt/instruction_list.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_36) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/instruction_list.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/instruction_list.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/instruction_list.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/instruction_list.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/instruction_list.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/instruction_list.cpp > CMakeFiles/SPIRV-Tools-opt.dir/instruction_list.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/instruction_list.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/instruction_list.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/instruction_list.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/instruction_list.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/instruction_list.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/instruction_list.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/instruction_list.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/instruction_list.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/instruction_list.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/instruction_list.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/instruction_list.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/instruction_list.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ir_context.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ir_context.cpp.o: ../source/opt/ir_context.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_37) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ir_context.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/ir_context.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/ir_context.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ir_context.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/ir_context.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/ir_context.cpp > CMakeFiles/SPIRV-Tools-opt.dir/ir_context.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ir_context.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/ir_context.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/ir_context.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/ir_context.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ir_context.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ir_context.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ir_context.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ir_context.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ir_context.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ir_context.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ir_context.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ir_context.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ir_loader.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ir_loader.cpp.o: ../source/opt/ir_loader.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_38) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ir_loader.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/ir_loader.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/ir_loader.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ir_loader.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/ir_loader.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/ir_loader.cpp > CMakeFiles/SPIRV-Tools-opt.dir/ir_loader.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ir_loader.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/ir_loader.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/ir_loader.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/ir_loader.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ir_loader.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ir_loader.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ir_loader.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ir_loader.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ir_loader.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ir_loader.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ir_loader.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ir_loader.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/licm_pass.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/licm_pass.cpp.o: ../source/opt/licm_pass.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_39) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/licm_pass.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/licm_pass.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/licm_pass.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/licm_pass.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/licm_pass.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/licm_pass.cpp > CMakeFiles/SPIRV-Tools-opt.dir/licm_pass.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/licm_pass.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/licm_pass.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/licm_pass.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/licm_pass.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/licm_pass.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/licm_pass.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/licm_pass.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/licm_pass.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/licm_pass.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/licm_pass.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/licm_pass.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/licm_pass.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_access_chain_convert_pass.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_access_chain_convert_pass.cpp.o: ../source/opt/local_access_chain_convert_pass.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_40) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_access_chain_convert_pass.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/local_access_chain_convert_pass.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/local_access_chain_convert_pass.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_access_chain_convert_pass.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/local_access_chain_convert_pass.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/local_access_chain_convert_pass.cpp > CMakeFiles/SPIRV-Tools-opt.dir/local_access_chain_convert_pass.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_access_chain_convert_pass.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/local_access_chain_convert_pass.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/local_access_chain_convert_pass.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/local_access_chain_convert_pass.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_access_chain_convert_pass.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_access_chain_convert_pass.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_access_chain_convert_pass.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_access_chain_convert_pass.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_access_chain_convert_pass.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_access_chain_convert_pass.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_access_chain_convert_pass.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_access_chain_convert_pass.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_redundancy_elimination.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_redundancy_elimination.cpp.o: ../source/opt/local_redundancy_elimination.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_41) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_redundancy_elimination.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/local_redundancy_elimination.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/local_redundancy_elimination.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_redundancy_elimination.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/local_redundancy_elimination.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/local_redundancy_elimination.cpp > CMakeFiles/SPIRV-Tools-opt.dir/local_redundancy_elimination.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_redundancy_elimination.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/local_redundancy_elimination.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/local_redundancy_elimination.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/local_redundancy_elimination.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_redundancy_elimination.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_redundancy_elimination.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_redundancy_elimination.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_redundancy_elimination.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_redundancy_elimination.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_redundancy_elimination.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_redundancy_elimination.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_redundancy_elimination.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_single_block_elim_pass.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_single_block_elim_pass.cpp.o: ../source/opt/local_single_block_elim_pass.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_42) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_single_block_elim_pass.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/local_single_block_elim_pass.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/local_single_block_elim_pass.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_single_block_elim_pass.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/local_single_block_elim_pass.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/local_single_block_elim_pass.cpp > CMakeFiles/SPIRV-Tools-opt.dir/local_single_block_elim_pass.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_single_block_elim_pass.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/local_single_block_elim_pass.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/local_single_block_elim_pass.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/local_single_block_elim_pass.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_single_block_elim_pass.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_single_block_elim_pass.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_single_block_elim_pass.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_single_block_elim_pass.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_single_block_elim_pass.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_single_block_elim_pass.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_single_block_elim_pass.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_single_block_elim_pass.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_single_store_elim_pass.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_single_store_elim_pass.cpp.o: ../source/opt/local_single_store_elim_pass.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_43) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_single_store_elim_pass.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/local_single_store_elim_pass.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/local_single_store_elim_pass.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_single_store_elim_pass.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/local_single_store_elim_pass.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/local_single_store_elim_pass.cpp > CMakeFiles/SPIRV-Tools-opt.dir/local_single_store_elim_pass.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_single_store_elim_pass.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/local_single_store_elim_pass.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/local_single_store_elim_pass.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/local_single_store_elim_pass.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_single_store_elim_pass.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_single_store_elim_pass.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_single_store_elim_pass.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_single_store_elim_pass.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_single_store_elim_pass.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_single_store_elim_pass.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_single_store_elim_pass.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_single_store_elim_pass.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_ssa_elim_pass.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_ssa_elim_pass.cpp.o: ../source/opt/local_ssa_elim_pass.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_44) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_ssa_elim_pass.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/local_ssa_elim_pass.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/local_ssa_elim_pass.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_ssa_elim_pass.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/local_ssa_elim_pass.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/local_ssa_elim_pass.cpp > CMakeFiles/SPIRV-Tools-opt.dir/local_ssa_elim_pass.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_ssa_elim_pass.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/local_ssa_elim_pass.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/local_ssa_elim_pass.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/local_ssa_elim_pass.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_ssa_elim_pass.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_ssa_elim_pass.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_ssa_elim_pass.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_ssa_elim_pass.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_ssa_elim_pass.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_ssa_elim_pass.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_ssa_elim_pass.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_ssa_elim_pass.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence.cpp.o: ../source/opt/loop_dependence.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_45) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/loop_dependence.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/loop_dependence.cpp > CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/loop_dependence.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence_helpers.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence_helpers.cpp.o: ../source/opt/loop_dependence_helpers.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_46) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence_helpers.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence_helpers.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/loop_dependence_helpers.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence_helpers.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence_helpers.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/loop_dependence_helpers.cpp > CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence_helpers.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence_helpers.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence_helpers.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/loop_dependence_helpers.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence_helpers.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence_helpers.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence_helpers.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence_helpers.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence_helpers.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence_helpers.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence_helpers.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence_helpers.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence_helpers.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_descriptor.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_descriptor.cpp.o: ../source/opt/loop_descriptor.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_47) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_descriptor.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/loop_descriptor.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/loop_descriptor.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_descriptor.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/loop_descriptor.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/loop_descriptor.cpp > CMakeFiles/SPIRV-Tools-opt.dir/loop_descriptor.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_descriptor.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/loop_descriptor.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/loop_descriptor.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/loop_descriptor.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_descriptor.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_descriptor.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_descriptor.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_descriptor.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_descriptor.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_descriptor.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_descriptor.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_descriptor.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fission.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fission.cpp.o: ../source/opt/loop_fission.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_48) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fission.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/loop_fission.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/loop_fission.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fission.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/loop_fission.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/loop_fission.cpp > CMakeFiles/SPIRV-Tools-opt.dir/loop_fission.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fission.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/loop_fission.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/loop_fission.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/loop_fission.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fission.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fission.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fission.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fission.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fission.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fission.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fission.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fission.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion.cpp.o: ../source/opt/loop_fusion.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_49) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/loop_fusion.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/loop_fusion.cpp > CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/loop_fusion.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion_pass.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion_pass.cpp.o: ../source/opt/loop_fusion_pass.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_50) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion_pass.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion_pass.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/loop_fusion_pass.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion_pass.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion_pass.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/loop_fusion_pass.cpp > CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion_pass.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion_pass.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion_pass.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/loop_fusion_pass.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion_pass.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion_pass.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion_pass.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion_pass.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion_pass.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion_pass.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion_pass.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion_pass.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion_pass.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_peeling.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_peeling.cpp.o: ../source/opt/loop_peeling.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_51) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_peeling.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/loop_peeling.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/loop_peeling.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_peeling.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/loop_peeling.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/loop_peeling.cpp > CMakeFiles/SPIRV-Tools-opt.dir/loop_peeling.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_peeling.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/loop_peeling.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/loop_peeling.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/loop_peeling.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_peeling.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_peeling.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_peeling.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_peeling.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_peeling.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_peeling.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_peeling.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_peeling.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_utils.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_utils.cpp.o: ../source/opt/loop_utils.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_52) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_utils.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/loop_utils.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/loop_utils.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_utils.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/loop_utils.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/loop_utils.cpp > CMakeFiles/SPIRV-Tools-opt.dir/loop_utils.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_utils.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/loop_utils.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/loop_utils.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/loop_utils.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_utils.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_utils.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_utils.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_utils.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_utils.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_utils.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_utils.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_utils.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_unroller.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_unroller.cpp.o: ../source/opt/loop_unroller.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_53) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_unroller.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/loop_unroller.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/loop_unroller.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_unroller.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/loop_unroller.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/loop_unroller.cpp > CMakeFiles/SPIRV-Tools-opt.dir/loop_unroller.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_unroller.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/loop_unroller.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/loop_unroller.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/loop_unroller.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_unroller.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_unroller.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_unroller.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_unroller.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_unroller.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_unroller.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_unroller.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_unroller.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_unswitch_pass.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_unswitch_pass.cpp.o: ../source/opt/loop_unswitch_pass.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_54) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_unswitch_pass.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/loop_unswitch_pass.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/loop_unswitch_pass.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_unswitch_pass.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/loop_unswitch_pass.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/loop_unswitch_pass.cpp > CMakeFiles/SPIRV-Tools-opt.dir/loop_unswitch_pass.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_unswitch_pass.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/loop_unswitch_pass.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/loop_unswitch_pass.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/loop_unswitch_pass.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_unswitch_pass.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_unswitch_pass.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_unswitch_pass.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_unswitch_pass.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_unswitch_pass.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_unswitch_pass.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_unswitch_pass.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_unswitch_pass.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/mem_pass.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/mem_pass.cpp.o: ../source/opt/mem_pass.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_55) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/mem_pass.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/mem_pass.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/mem_pass.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/mem_pass.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/mem_pass.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/mem_pass.cpp > CMakeFiles/SPIRV-Tools-opt.dir/mem_pass.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/mem_pass.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/mem_pass.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/mem_pass.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/mem_pass.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/mem_pass.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/mem_pass.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/mem_pass.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/mem_pass.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/mem_pass.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/mem_pass.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/mem_pass.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/mem_pass.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/merge_return_pass.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/merge_return_pass.cpp.o: ../source/opt/merge_return_pass.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_56) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/merge_return_pass.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/merge_return_pass.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/merge_return_pass.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/merge_return_pass.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/merge_return_pass.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/merge_return_pass.cpp > CMakeFiles/SPIRV-Tools-opt.dir/merge_return_pass.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/merge_return_pass.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/merge_return_pass.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/merge_return_pass.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/merge_return_pass.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/merge_return_pass.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/merge_return_pass.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/merge_return_pass.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/merge_return_pass.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/merge_return_pass.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/merge_return_pass.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/merge_return_pass.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/merge_return_pass.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/module.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/module.cpp.o: ../source/opt/module.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_57) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/module.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/module.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/module.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/module.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/module.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/module.cpp > CMakeFiles/SPIRV-Tools-opt.dir/module.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/module.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/module.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/module.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/module.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/module.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/module.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/module.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/module.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/module.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/module.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/module.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/module.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/optimizer.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/optimizer.cpp.o: ../source/opt/optimizer.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_58) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/optimizer.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/optimizer.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/optimizer.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/optimizer.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/optimizer.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/optimizer.cpp > CMakeFiles/SPIRV-Tools-opt.dir/optimizer.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/optimizer.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/optimizer.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/optimizer.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/optimizer.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/optimizer.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/optimizer.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/optimizer.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/optimizer.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/optimizer.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/optimizer.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/optimizer.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/optimizer.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/pass.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/pass.cpp.o: ../source/opt/pass.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_59) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/pass.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/pass.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/pass.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/pass.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/pass.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/pass.cpp > CMakeFiles/SPIRV-Tools-opt.dir/pass.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/pass.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/pass.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/pass.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/pass.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/pass.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/pass.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/pass.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/pass.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/pass.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/pass.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/pass.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/pass.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/pass_manager.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/pass_manager.cpp.o: ../source/opt/pass_manager.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_60) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/pass_manager.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/pass_manager.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/pass_manager.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/pass_manager.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/pass_manager.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/pass_manager.cpp > CMakeFiles/SPIRV-Tools-opt.dir/pass_manager.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/pass_manager.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/pass_manager.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/pass_manager.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/pass_manager.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/pass_manager.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/pass_manager.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/pass_manager.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/pass_manager.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/pass_manager.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/pass_manager.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/pass_manager.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/pass_manager.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/private_to_local_pass.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/private_to_local_pass.cpp.o: ../source/opt/private_to_local_pass.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_61) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/private_to_local_pass.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/private_to_local_pass.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/private_to_local_pass.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/private_to_local_pass.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/private_to_local_pass.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/private_to_local_pass.cpp > CMakeFiles/SPIRV-Tools-opt.dir/private_to_local_pass.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/private_to_local_pass.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/private_to_local_pass.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/private_to_local_pass.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/private_to_local_pass.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/private_to_local_pass.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/private_to_local_pass.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/private_to_local_pass.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/private_to_local_pass.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/private_to_local_pass.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/private_to_local_pass.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/private_to_local_pass.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/private_to_local_pass.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/propagator.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/propagator.cpp.o: ../source/opt/propagator.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_62) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/propagator.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/propagator.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/propagator.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/propagator.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/propagator.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/propagator.cpp > CMakeFiles/SPIRV-Tools-opt.dir/propagator.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/propagator.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/propagator.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/propagator.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/propagator.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/propagator.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/propagator.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/propagator.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/propagator.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/propagator.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/propagator.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/propagator.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/propagator.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/reduce_load_size.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/reduce_load_size.cpp.o: ../source/opt/reduce_load_size.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_63) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/reduce_load_size.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/reduce_load_size.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/reduce_load_size.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/reduce_load_size.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/reduce_load_size.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/reduce_load_size.cpp > CMakeFiles/SPIRV-Tools-opt.dir/reduce_load_size.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/reduce_load_size.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/reduce_load_size.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/reduce_load_size.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/reduce_load_size.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/reduce_load_size.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/reduce_load_size.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/reduce_load_size.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/reduce_load_size.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/reduce_load_size.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/reduce_load_size.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/reduce_load_size.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/reduce_load_size.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/redundancy_elimination.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/redundancy_elimination.cpp.o: ../source/opt/redundancy_elimination.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_64) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/redundancy_elimination.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/redundancy_elimination.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/redundancy_elimination.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/redundancy_elimination.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/redundancy_elimination.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/redundancy_elimination.cpp > CMakeFiles/SPIRV-Tools-opt.dir/redundancy_elimination.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/redundancy_elimination.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/redundancy_elimination.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/redundancy_elimination.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/redundancy_elimination.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/redundancy_elimination.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/redundancy_elimination.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/redundancy_elimination.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/redundancy_elimination.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/redundancy_elimination.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/redundancy_elimination.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/redundancy_elimination.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/redundancy_elimination.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/register_pressure.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/register_pressure.cpp.o: ../source/opt/register_pressure.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_65) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/register_pressure.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/register_pressure.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/register_pressure.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/register_pressure.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/register_pressure.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/register_pressure.cpp > CMakeFiles/SPIRV-Tools-opt.dir/register_pressure.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/register_pressure.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/register_pressure.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/register_pressure.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/register_pressure.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/register_pressure.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/register_pressure.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/register_pressure.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/register_pressure.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/register_pressure.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/register_pressure.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/register_pressure.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/register_pressure.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/remove_duplicates_pass.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/remove_duplicates_pass.cpp.o: ../source/opt/remove_duplicates_pass.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_66) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/remove_duplicates_pass.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/remove_duplicates_pass.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/remove_duplicates_pass.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/remove_duplicates_pass.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/remove_duplicates_pass.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/remove_duplicates_pass.cpp > CMakeFiles/SPIRV-Tools-opt.dir/remove_duplicates_pass.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/remove_duplicates_pass.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/remove_duplicates_pass.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/remove_duplicates_pass.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/remove_duplicates_pass.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/remove_duplicates_pass.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/remove_duplicates_pass.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/remove_duplicates_pass.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/remove_duplicates_pass.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/remove_duplicates_pass.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/remove_duplicates_pass.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/remove_duplicates_pass.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/remove_duplicates_pass.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/replace_invalid_opc.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/replace_invalid_opc.cpp.o: ../source/opt/replace_invalid_opc.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_67) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/replace_invalid_opc.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/replace_invalid_opc.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/replace_invalid_opc.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/replace_invalid_opc.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/replace_invalid_opc.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/replace_invalid_opc.cpp > CMakeFiles/SPIRV-Tools-opt.dir/replace_invalid_opc.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/replace_invalid_opc.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/replace_invalid_opc.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/replace_invalid_opc.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/replace_invalid_opc.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/replace_invalid_opc.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/replace_invalid_opc.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/replace_invalid_opc.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/replace_invalid_opc.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/replace_invalid_opc.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/replace_invalid_opc.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/replace_invalid_opc.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/replace_invalid_opc.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis.cpp.o: ../source/opt/scalar_analysis.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_68) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/scalar_analysis.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/scalar_analysis.cpp > CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/scalar_analysis.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis_simplification.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis_simplification.cpp.o: ../source/opt/scalar_analysis_simplification.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_69) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis_simplification.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis_simplification.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/scalar_analysis_simplification.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis_simplification.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis_simplification.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/scalar_analysis_simplification.cpp > CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis_simplification.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis_simplification.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis_simplification.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/scalar_analysis_simplification.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis_simplification.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis_simplification.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis_simplification.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis_simplification.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis_simplification.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis_simplification.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis_simplification.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis_simplification.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis_simplification.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_replacement_pass.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_replacement_pass.cpp.o: ../source/opt/scalar_replacement_pass.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_70) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_replacement_pass.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/scalar_replacement_pass.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/scalar_replacement_pass.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_replacement_pass.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/scalar_replacement_pass.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/scalar_replacement_pass.cpp > CMakeFiles/SPIRV-Tools-opt.dir/scalar_replacement_pass.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_replacement_pass.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/scalar_replacement_pass.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/scalar_replacement_pass.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/scalar_replacement_pass.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_replacement_pass.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_replacement_pass.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_replacement_pass.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_replacement_pass.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_replacement_pass.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_replacement_pass.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_replacement_pass.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_replacement_pass.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/set_spec_constant_default_value_pass.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/set_spec_constant_default_value_pass.cpp.o: ../source/opt/set_spec_constant_default_value_pass.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_71) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/set_spec_constant_default_value_pass.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/set_spec_constant_default_value_pass.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/set_spec_constant_default_value_pass.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/set_spec_constant_default_value_pass.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/set_spec_constant_default_value_pass.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/set_spec_constant_default_value_pass.cpp > CMakeFiles/SPIRV-Tools-opt.dir/set_spec_constant_default_value_pass.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/set_spec_constant_default_value_pass.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/set_spec_constant_default_value_pass.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/set_spec_constant_default_value_pass.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/set_spec_constant_default_value_pass.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/set_spec_constant_default_value_pass.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/set_spec_constant_default_value_pass.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/set_spec_constant_default_value_pass.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/set_spec_constant_default_value_pass.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/set_spec_constant_default_value_pass.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/set_spec_constant_default_value_pass.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/set_spec_constant_default_value_pass.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/set_spec_constant_default_value_pass.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/simplification_pass.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/simplification_pass.cpp.o: ../source/opt/simplification_pass.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_72) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/simplification_pass.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/simplification_pass.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/simplification_pass.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/simplification_pass.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/simplification_pass.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/simplification_pass.cpp > CMakeFiles/SPIRV-Tools-opt.dir/simplification_pass.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/simplification_pass.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/simplification_pass.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/simplification_pass.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/simplification_pass.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/simplification_pass.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/simplification_pass.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/simplification_pass.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/simplification_pass.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/simplification_pass.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/simplification_pass.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/simplification_pass.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/simplification_pass.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ssa_rewrite_pass.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ssa_rewrite_pass.cpp.o: ../source/opt/ssa_rewrite_pass.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_73) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ssa_rewrite_pass.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/ssa_rewrite_pass.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/ssa_rewrite_pass.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ssa_rewrite_pass.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/ssa_rewrite_pass.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/ssa_rewrite_pass.cpp > CMakeFiles/SPIRV-Tools-opt.dir/ssa_rewrite_pass.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ssa_rewrite_pass.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/ssa_rewrite_pass.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/ssa_rewrite_pass.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/ssa_rewrite_pass.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ssa_rewrite_pass.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ssa_rewrite_pass.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ssa_rewrite_pass.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ssa_rewrite_pass.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ssa_rewrite_pass.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ssa_rewrite_pass.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ssa_rewrite_pass.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ssa_rewrite_pass.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strength_reduction_pass.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strength_reduction_pass.cpp.o: ../source/opt/strength_reduction_pass.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_74) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strength_reduction_pass.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/strength_reduction_pass.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/strength_reduction_pass.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strength_reduction_pass.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/strength_reduction_pass.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/strength_reduction_pass.cpp > CMakeFiles/SPIRV-Tools-opt.dir/strength_reduction_pass.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strength_reduction_pass.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/strength_reduction_pass.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/strength_reduction_pass.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/strength_reduction_pass.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strength_reduction_pass.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strength_reduction_pass.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strength_reduction_pass.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strength_reduction_pass.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strength_reduction_pass.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strength_reduction_pass.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strength_reduction_pass.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strength_reduction_pass.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strip_debug_info_pass.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strip_debug_info_pass.cpp.o: ../source/opt/strip_debug_info_pass.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_75) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strip_debug_info_pass.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/strip_debug_info_pass.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/strip_debug_info_pass.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strip_debug_info_pass.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/strip_debug_info_pass.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/strip_debug_info_pass.cpp > CMakeFiles/SPIRV-Tools-opt.dir/strip_debug_info_pass.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strip_debug_info_pass.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/strip_debug_info_pass.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/strip_debug_info_pass.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/strip_debug_info_pass.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strip_debug_info_pass.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strip_debug_info_pass.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strip_debug_info_pass.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strip_debug_info_pass.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strip_debug_info_pass.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strip_debug_info_pass.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strip_debug_info_pass.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strip_debug_info_pass.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strip_reflect_info_pass.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strip_reflect_info_pass.cpp.o: ../source/opt/strip_reflect_info_pass.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_76) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strip_reflect_info_pass.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/strip_reflect_info_pass.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/strip_reflect_info_pass.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strip_reflect_info_pass.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/strip_reflect_info_pass.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/strip_reflect_info_pass.cpp > CMakeFiles/SPIRV-Tools-opt.dir/strip_reflect_info_pass.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strip_reflect_info_pass.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/strip_reflect_info_pass.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/strip_reflect_info_pass.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/strip_reflect_info_pass.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strip_reflect_info_pass.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strip_reflect_info_pass.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strip_reflect_info_pass.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strip_reflect_info_pass.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strip_reflect_info_pass.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strip_reflect_info_pass.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strip_reflect_info_pass.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strip_reflect_info_pass.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/struct_cfg_analysis.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/struct_cfg_analysis.cpp.o: ../source/opt/struct_cfg_analysis.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_77) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/struct_cfg_analysis.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/struct_cfg_analysis.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/struct_cfg_analysis.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/struct_cfg_analysis.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/struct_cfg_analysis.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/struct_cfg_analysis.cpp > CMakeFiles/SPIRV-Tools-opt.dir/struct_cfg_analysis.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/struct_cfg_analysis.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/struct_cfg_analysis.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/struct_cfg_analysis.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/struct_cfg_analysis.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/struct_cfg_analysis.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/struct_cfg_analysis.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/struct_cfg_analysis.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/struct_cfg_analysis.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/struct_cfg_analysis.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/struct_cfg_analysis.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/struct_cfg_analysis.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/struct_cfg_analysis.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/type_manager.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/type_manager.cpp.o: ../source/opt/type_manager.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_78) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/type_manager.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/type_manager.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/type_manager.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/type_manager.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/type_manager.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/type_manager.cpp > CMakeFiles/SPIRV-Tools-opt.dir/type_manager.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/type_manager.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/type_manager.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/type_manager.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/type_manager.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/type_manager.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/type_manager.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/type_manager.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/type_manager.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/type_manager.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/type_manager.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/type_manager.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/type_manager.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/types.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/types.cpp.o: ../source/opt/types.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_79) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/types.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/types.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/types.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/types.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/types.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/types.cpp > CMakeFiles/SPIRV-Tools-opt.dir/types.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/types.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/types.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/types.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/types.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/types.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/types.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/types.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/types.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/types.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/types.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/types.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/types.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/unify_const_pass.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/unify_const_pass.cpp.o: ../source/opt/unify_const_pass.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_80) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/unify_const_pass.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/unify_const_pass.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/unify_const_pass.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/unify_const_pass.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/unify_const_pass.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/unify_const_pass.cpp > CMakeFiles/SPIRV-Tools-opt.dir/unify_const_pass.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/unify_const_pass.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/unify_const_pass.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/unify_const_pass.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/unify_const_pass.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/unify_const_pass.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/unify_const_pass.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/unify_const_pass.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/unify_const_pass.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/unify_const_pass.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/unify_const_pass.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/unify_const_pass.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/unify_const_pass.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/value_number_table.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/value_number_table.cpp.o: ../source/opt/value_number_table.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_81) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/value_number_table.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/value_number_table.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/value_number_table.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/value_number_table.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/value_number_table.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/value_number_table.cpp > CMakeFiles/SPIRV-Tools-opt.dir/value_number_table.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/value_number_table.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/value_number_table.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/value_number_table.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/value_number_table.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/value_number_table.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/value_number_table.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/value_number_table.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/value_number_table.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/value_number_table.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/value_number_table.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/value_number_table.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/value_number_table.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/vector_dce.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/vector_dce.cpp.o: ../source/opt/vector_dce.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_82) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/vector_dce.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/vector_dce.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/vector_dce.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/vector_dce.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/vector_dce.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/vector_dce.cpp > CMakeFiles/SPIRV-Tools-opt.dir/vector_dce.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/vector_dce.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/vector_dce.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/vector_dce.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/vector_dce.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/vector_dce.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/vector_dce.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/vector_dce.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/vector_dce.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/vector_dce.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/vector_dce.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/vector_dce.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/vector_dce.cpp.o + + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/workaround1209.cpp.o: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/workaround1209.cpp.o: ../source/opt/workaround1209.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_83) "Building CXX object source/opt/CMakeFiles/SPIRV-Tools-opt.dir/workaround1209.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/SPIRV-Tools-opt.dir/workaround1209.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/workaround1209.cpp + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/workaround1209.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/SPIRV-Tools-opt.dir/workaround1209.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/workaround1209.cpp > CMakeFiles/SPIRV-Tools-opt.dir/workaround1209.cpp.i + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/workaround1209.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/SPIRV-Tools-opt.dir/workaround1209.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt/workaround1209.cpp -o CMakeFiles/SPIRV-Tools-opt.dir/workaround1209.cpp.s + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/workaround1209.cpp.o.requires: + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/workaround1209.cpp.o.requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/workaround1209.cpp.o.provides: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/workaround1209.cpp.o.requires + $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/workaround1209.cpp.o.provides.build +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/workaround1209.cpp.o.provides + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/workaround1209.cpp.o.provides.build: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/workaround1209.cpp.o + + +# Object files for target SPIRV-Tools-opt +SPIRV__Tools__opt_OBJECTS = \ +"CMakeFiles/SPIRV-Tools-opt.dir/aggressive_dead_code_elim_pass.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/basic_block.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/block_merge_pass.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/build_module.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/ccp_pass.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/cfg_cleanup_pass.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/cfg.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/combine_access_chains.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/common_uniform_elim_pass.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/compact_ids_pass.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/composite.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/const_folding_rules.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/constants.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/copy_prop_arrays.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/dead_branch_elim_pass.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/dead_insert_elim_pass.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/dead_variable_elimination.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/decoration_manager.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/def_use_manager.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/dominator_analysis.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/dominator_tree.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_constant_pass.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_functions_pass.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/feature_manager.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/flatten_decoration_pass.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/fold.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/folding_rules.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/fold_spec_constant_op_and_composite_pass.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/freeze_spec_constant_value_pass.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/function.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/if_conversion.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/inline_exhaustive_pass.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/inline_opaque_pass.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/inline_pass.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/instruction.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/instruction_list.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/ir_context.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/ir_loader.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/licm_pass.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/local_access_chain_convert_pass.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/local_redundancy_elimination.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/local_single_block_elim_pass.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/local_single_store_elim_pass.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/local_ssa_elim_pass.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence_helpers.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/loop_descriptor.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/loop_fission.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion_pass.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/loop_peeling.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/loop_utils.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/loop_unroller.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/loop_unswitch_pass.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/mem_pass.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/merge_return_pass.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/module.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/optimizer.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/pass.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/pass_manager.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/private_to_local_pass.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/propagator.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/reduce_load_size.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/redundancy_elimination.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/register_pressure.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/remove_duplicates_pass.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/replace_invalid_opc.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis_simplification.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/scalar_replacement_pass.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/set_spec_constant_default_value_pass.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/simplification_pass.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/ssa_rewrite_pass.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/strength_reduction_pass.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/strip_debug_info_pass.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/strip_reflect_info_pass.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/struct_cfg_analysis.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/type_manager.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/types.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/unify_const_pass.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/value_number_table.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/vector_dce.cpp.o" \ +"CMakeFiles/SPIRV-Tools-opt.dir/workaround1209.cpp.o" + +# External object files for target SPIRV-Tools-opt +SPIRV__Tools__opt_EXTERNAL_OBJECTS = + +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/aggressive_dead_code_elim_pass.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/basic_block.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/block_merge_pass.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build_module.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ccp_pass.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/cfg_cleanup_pass.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/cfg.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/combine_access_chains.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/common_uniform_elim_pass.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/compact_ids_pass.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/composite.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/const_folding_rules.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/constants.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/copy_prop_arrays.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_branch_elim_pass.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_insert_elim_pass.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_variable_elimination.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/decoration_manager.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/def_use_manager.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dominator_analysis.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dominator_tree.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_constant_pass.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_functions_pass.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/feature_manager.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flatten_decoration_pass.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/fold.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/folding_rules.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/fold_spec_constant_op_and_composite_pass.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/freeze_spec_constant_value_pass.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/function.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/if_conversion.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_exhaustive_pass.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_opaque_pass.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_pass.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/instruction.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/instruction_list.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ir_context.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ir_loader.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/licm_pass.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_access_chain_convert_pass.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_redundancy_elimination.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_single_block_elim_pass.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_single_store_elim_pass.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_ssa_elim_pass.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence_helpers.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_descriptor.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fission.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion_pass.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_peeling.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_utils.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_unroller.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_unswitch_pass.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/mem_pass.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/merge_return_pass.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/module.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/optimizer.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/pass.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/pass_manager.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/private_to_local_pass.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/propagator.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/reduce_load_size.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/redundancy_elimination.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/register_pressure.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/remove_duplicates_pass.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/replace_invalid_opc.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis_simplification.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_replacement_pass.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/set_spec_constant_default_value_pass.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/simplification_pass.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ssa_rewrite_pass.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strength_reduction_pass.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strip_debug_info_pass.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strip_reflect_info_pass.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/struct_cfg_analysis.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/type_manager.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/types.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/unify_const_pass.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/value_number_table.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/vector_dce.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/workaround1209.cpp.o +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make +source/opt/libSPIRV-Tools-opt.a: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --bold --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_84) "Linking CXX static library libSPIRV-Tools-opt.a" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && $(CMAKE_COMMAND) -P CMakeFiles/SPIRV-Tools-opt.dir/cmake_clean_target.cmake + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/SPIRV-Tools-opt.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build: source/opt/libSPIRV-Tools-opt.a + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/aggressive_dead_code_elim_pass.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/basic_block.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/block_merge_pass.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build_module.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ccp_pass.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/cfg_cleanup_pass.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/cfg.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/combine_access_chains.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/common_uniform_elim_pass.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/compact_ids_pass.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/composite.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/const_folding_rules.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/constants.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/copy_prop_arrays.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_branch_elim_pass.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_insert_elim_pass.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_variable_elimination.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/decoration_manager.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/def_use_manager.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dominator_analysis.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dominator_tree.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_constant_pass.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_functions_pass.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/feature_manager.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flatten_decoration_pass.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/fold.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/folding_rules.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/fold_spec_constant_op_and_composite_pass.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/freeze_spec_constant_value_pass.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/function.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/if_conversion.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_exhaustive_pass.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_opaque_pass.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_pass.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/instruction.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/instruction_list.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ir_context.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ir_loader.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/licm_pass.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_access_chain_convert_pass.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_redundancy_elimination.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_single_block_elim_pass.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_single_store_elim_pass.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_ssa_elim_pass.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence_helpers.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_descriptor.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fission.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion_pass.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_peeling.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_utils.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_unroller.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_unswitch_pass.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/mem_pass.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/merge_return_pass.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/module.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/optimizer.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/pass.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/pass_manager.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/private_to_local_pass.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/propagator.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/reduce_load_size.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/redundancy_elimination.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/register_pressure.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/remove_duplicates_pass.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/replace_invalid_opc.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis_simplification.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_replacement_pass.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/set_spec_constant_default_value_pass.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/simplification_pass.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ssa_rewrite_pass.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strength_reduction_pass.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strip_debug_info_pass.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strip_reflect_info_pass.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/struct_cfg_analysis.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/type_manager.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/types.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/unify_const_pass.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/value_number_table.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/vector_dce.cpp.o.requires +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/workaround1209.cpp.o.requires + +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/requires + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/clean: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt && $(CMAKE_COMMAND) -P CMakeFiles/SPIRV-Tools-opt.dir/cmake_clean.cmake +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/clean + +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/depend: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/bkaradzic/Private/projects/_github/SPIRV-Tools /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/depend + diff --git a/3rdparty/spirv-tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/cmake_clean.cmake b/3rdparty/spirv-tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/cmake_clean.cmake new file mode 100644 index 000000000..1bfac4180 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/cmake_clean.cmake @@ -0,0 +1,92 @@ +file(REMOVE_RECURSE + "CMakeFiles/SPIRV-Tools-opt.dir/aggressive_dead_code_elim_pass.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/basic_block.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/block_merge_pass.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/build_module.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/ccp_pass.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/cfg_cleanup_pass.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/cfg.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/combine_access_chains.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/common_uniform_elim_pass.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/compact_ids_pass.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/composite.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/const_folding_rules.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/constants.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/copy_prop_arrays.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/dead_branch_elim_pass.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/dead_insert_elim_pass.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/dead_variable_elimination.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/decoration_manager.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/def_use_manager.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/dominator_analysis.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/dominator_tree.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_constant_pass.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_functions_pass.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/feature_manager.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/flatten_decoration_pass.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/fold.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/folding_rules.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/fold_spec_constant_op_and_composite_pass.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/freeze_spec_constant_value_pass.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/function.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/if_conversion.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/inline_exhaustive_pass.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/inline_opaque_pass.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/inline_pass.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/instruction.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/instruction_list.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/ir_context.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/ir_loader.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/licm_pass.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/local_access_chain_convert_pass.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/local_redundancy_elimination.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/local_single_block_elim_pass.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/local_single_store_elim_pass.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/local_ssa_elim_pass.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence_helpers.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/loop_descriptor.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/loop_fission.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion_pass.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/loop_peeling.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/loop_utils.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/loop_unroller.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/loop_unswitch_pass.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/mem_pass.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/merge_return_pass.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/module.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/optimizer.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/pass.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/pass_manager.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/private_to_local_pass.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/propagator.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/reduce_load_size.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/redundancy_elimination.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/register_pressure.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/remove_duplicates_pass.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/replace_invalid_opc.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis_simplification.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/scalar_replacement_pass.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/set_spec_constant_default_value_pass.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/simplification_pass.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/ssa_rewrite_pass.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/strength_reduction_pass.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/strip_debug_info_pass.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/strip_reflect_info_pass.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/struct_cfg_analysis.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/type_manager.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/types.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/unify_const_pass.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/value_number_table.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/vector_dce.cpp.o" + "CMakeFiles/SPIRV-Tools-opt.dir/workaround1209.cpp.o" + "libSPIRV-Tools-opt.pdb" + "libSPIRV-Tools-opt.a" +) + +# Per-language clean rules from dependency scanning. +foreach(lang CXX) + include(CMakeFiles/SPIRV-Tools-opt.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/3rdparty/spirv-tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/cmake_clean_target.cmake b/3rdparty/spirv-tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/cmake_clean_target.cmake new file mode 100644 index 000000000..6ebd3d42c --- /dev/null +++ b/3rdparty/spirv-tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/cmake_clean_target.cmake @@ -0,0 +1,3 @@ +file(REMOVE_RECURSE + "libSPIRV-Tools-opt.a" +) diff --git a/3rdparty/spirv-tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/depend.make b/3rdparty/spirv-tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/depend.make new file mode 100644 index 000000000..53482d50a --- /dev/null +++ b/3rdparty/spirv-tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for SPIRV-Tools-opt. +# This may be replaced when dependencies are built. diff --git a/3rdparty/spirv-tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make b/3rdparty/spirv-tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make new file mode 100644 index 000000000..5e2e32686 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# compile CXX with /usr/bin/c++ +CXX_FLAGS = -g -fPIC -Wall -Wextra -Wnon-virtual-dtor -Wno-missing-field-initializers -Werror -std=c++11 -fno-exceptions -fno-rtti -Wno-long-long -Wshadow -Wundef -Wconversion -Wno-sign-conversion -std=gnu++11 + +CXX_DEFINES = -DSPIRV_CHECK_CONTEXT -DSPIRV_COLOR_TERMINAL -DSPIRV_LINUX -DSPIRV_TIMER_ENABLED + +CXX_INCLUDES = -I/home/bkaradzic/Private/projects/_github/SPIRV-Tools -I/home/bkaradzic/Private/projects/_github/SPIRV-Tools/include -I/home/bkaradzic/Private/projects/_github/SPIRV-Tools/external/SPIRV-Headers/include -I/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + diff --git a/3rdparty/spirv-tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/link.txt b/3rdparty/spirv-tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/link.txt new file mode 100644 index 000000000..b35fa3b08 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/link.txt @@ -0,0 +1,2 @@ +/usr/bin/ar qc libSPIRV-Tools-opt.a CMakeFiles/SPIRV-Tools-opt.dir/aggressive_dead_code_elim_pass.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/basic_block.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/block_merge_pass.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/build_module.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/ccp_pass.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/cfg_cleanup_pass.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/cfg.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/combine_access_chains.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/common_uniform_elim_pass.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/compact_ids_pass.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/composite.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/const_folding_rules.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/constants.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/copy_prop_arrays.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/dead_branch_elim_pass.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/dead_insert_elim_pass.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/dead_variable_elimination.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/decoration_manager.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/def_use_manager.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/dominator_analysis.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/dominator_tree.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_constant_pass.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_functions_pass.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/feature_manager.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/flatten_decoration_pass.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/fold.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/folding_rules.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/fold_spec_constant_op_and_composite_pass.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/freeze_spec_constant_value_pass.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/function.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/if_conversion.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/inline_exhaustive_pass.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/inline_opaque_pass.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/inline_pass.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/instruction.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/instruction_list.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/ir_context.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/ir_loader.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/licm_pass.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/local_access_chain_convert_pass.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/local_redundancy_elimination.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/local_single_block_elim_pass.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/local_single_store_elim_pass.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/local_ssa_elim_pass.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence_helpers.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/loop_descriptor.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/loop_fission.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion_pass.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/loop_peeling.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/loop_utils.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/loop_unroller.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/loop_unswitch_pass.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/mem_pass.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/merge_return_pass.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/module.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/optimizer.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/pass.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/pass_manager.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/private_to_local_pass.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/propagator.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/reduce_load_size.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/redundancy_elimination.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/register_pressure.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/remove_duplicates_pass.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/replace_invalid_opc.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis_simplification.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/scalar_replacement_pass.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/set_spec_constant_default_value_pass.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/simplification_pass.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/ssa_rewrite_pass.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/strength_reduction_pass.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/strip_debug_info_pass.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/strip_reflect_info_pass.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/struct_cfg_analysis.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/type_manager.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/types.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/unify_const_pass.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/value_number_table.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/vector_dce.cpp.o CMakeFiles/SPIRV-Tools-opt.dir/workaround1209.cpp.o +/usr/bin/ranlib libSPIRV-Tools-opt.a diff --git a/3rdparty/spirv-tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/progress.make b/3rdparty/spirv-tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/progress.make new file mode 100644 index 000000000..714f2998c --- /dev/null +++ b/3rdparty/spirv-tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/progress.make @@ -0,0 +1,85 @@ +CMAKE_PROGRESS_1 = +CMAKE_PROGRESS_2 = +CMAKE_PROGRESS_3 = 30 +CMAKE_PROGRESS_4 = +CMAKE_PROGRESS_5 = 31 +CMAKE_PROGRESS_6 = +CMAKE_PROGRESS_7 = +CMAKE_PROGRESS_8 = 32 +CMAKE_PROGRESS_9 = +CMAKE_PROGRESS_10 = +CMAKE_PROGRESS_11 = 33 +CMAKE_PROGRESS_12 = +CMAKE_PROGRESS_13 = 34 +CMAKE_PROGRESS_14 = +CMAKE_PROGRESS_15 = +CMAKE_PROGRESS_16 = 35 +CMAKE_PROGRESS_17 = +CMAKE_PROGRESS_18 = +CMAKE_PROGRESS_19 = 36 +CMAKE_PROGRESS_20 = +CMAKE_PROGRESS_21 = 37 +CMAKE_PROGRESS_22 = +CMAKE_PROGRESS_23 = +CMAKE_PROGRESS_24 = 38 +CMAKE_PROGRESS_25 = +CMAKE_PROGRESS_26 = +CMAKE_PROGRESS_27 = 39 +CMAKE_PROGRESS_28 = +CMAKE_PROGRESS_29 = 40 +CMAKE_PROGRESS_30 = +CMAKE_PROGRESS_31 = +CMAKE_PROGRESS_32 = 41 +CMAKE_PROGRESS_33 = +CMAKE_PROGRESS_34 = +CMAKE_PROGRESS_35 = 42 +CMAKE_PROGRESS_36 = +CMAKE_PROGRESS_37 = 43 +CMAKE_PROGRESS_38 = +CMAKE_PROGRESS_39 = +CMAKE_PROGRESS_40 = 44 +CMAKE_PROGRESS_41 = +CMAKE_PROGRESS_42 = +CMAKE_PROGRESS_43 = 45 +CMAKE_PROGRESS_44 = +CMAKE_PROGRESS_45 = 46 +CMAKE_PROGRESS_46 = +CMAKE_PROGRESS_47 = +CMAKE_PROGRESS_48 = 47 +CMAKE_PROGRESS_49 = +CMAKE_PROGRESS_50 = +CMAKE_PROGRESS_51 = 48 +CMAKE_PROGRESS_52 = +CMAKE_PROGRESS_53 = 49 +CMAKE_PROGRESS_54 = +CMAKE_PROGRESS_55 = +CMAKE_PROGRESS_56 = 50 +CMAKE_PROGRESS_57 = +CMAKE_PROGRESS_58 = +CMAKE_PROGRESS_59 = 51 +CMAKE_PROGRESS_60 = +CMAKE_PROGRESS_61 = 52 +CMAKE_PROGRESS_62 = +CMAKE_PROGRESS_63 = +CMAKE_PROGRESS_64 = 53 +CMAKE_PROGRESS_65 = +CMAKE_PROGRESS_66 = +CMAKE_PROGRESS_67 = 54 +CMAKE_PROGRESS_68 = +CMAKE_PROGRESS_69 = 55 +CMAKE_PROGRESS_70 = +CMAKE_PROGRESS_71 = +CMAKE_PROGRESS_72 = 56 +CMAKE_PROGRESS_73 = +CMAKE_PROGRESS_74 = +CMAKE_PROGRESS_75 = 57 +CMAKE_PROGRESS_76 = +CMAKE_PROGRESS_77 = 58 +CMAKE_PROGRESS_78 = +CMAKE_PROGRESS_79 = +CMAKE_PROGRESS_80 = 59 +CMAKE_PROGRESS_81 = +CMAKE_PROGRESS_82 = +CMAKE_PROGRESS_83 = 60 +CMAKE_PROGRESS_84 = + diff --git a/3rdparty/spirv-tools/build/source/opt/CMakeFiles/progress.marks b/3rdparty/spirv-tools/build/source/opt/CMakeFiles/progress.marks new file mode 100644 index 000000000..04f9fe460 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/opt/CMakeFiles/progress.marks @@ -0,0 +1 @@ +59 diff --git a/3rdparty/spirv-tools/build/source/opt/CTestTestfile.cmake b/3rdparty/spirv-tools/build/source/opt/CTestTestfile.cmake new file mode 100644 index 000000000..5d319e9ae --- /dev/null +++ b/3rdparty/spirv-tools/build/source/opt/CTestTestfile.cmake @@ -0,0 +1,7 @@ +# CMake generated Testfile for +# Source directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt +# Build directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. +add_test(spirv-tools-symbol-exports-SPIRV-Tools-opt "/usr/bin/python" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/utils/check_symbol_exports.py" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/libSPIRV-Tools-opt.a") diff --git a/3rdparty/spirv-tools/build/source/opt/Makefile b/3rdparty/spirv-tools/build/source/opt/Makefile new file mode 100644 index 000000000..55d48bcf1 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/opt/Makefile @@ -0,0 +1,2700 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Default target executed when no arguments are given to make. +default_target: all + +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache + +.PHONY : rebuild_cache/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: install/strip + +.PHONY : install/strip/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Available install components are: \"Unspecified\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components + +.PHONY : list_install_components/fast + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running tests..." + /usr/bin/ctest --force-new-ctest-process $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test + +.PHONY : test/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: install/local + +.PHONY : install/local/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..." + /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache + +.PHONY : edit_cache/fast + +# The main all target +all: cmake_check_build_system + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/progress.marks + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 source/opt/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 source/opt/clean +.PHONY : clean + +# The main clean target +clean/fast: clean + +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 source/opt/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 source/opt/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Convenience name for target. +source/opt/CMakeFiles/SPIRV-Tools-opt.dir/rule: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 source/opt/CMakeFiles/SPIRV-Tools-opt.dir/rule +.PHONY : source/opt/CMakeFiles/SPIRV-Tools-opt.dir/rule + +# Convenience name for target. +SPIRV-Tools-opt: source/opt/CMakeFiles/SPIRV-Tools-opt.dir/rule + +.PHONY : SPIRV-Tools-opt + +# fast build rule for target. +SPIRV-Tools-opt/fast: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build +.PHONY : SPIRV-Tools-opt/fast + +aggressive_dead_code_elim_pass.o: aggressive_dead_code_elim_pass.cpp.o + +.PHONY : aggressive_dead_code_elim_pass.o + +# target to build an object file +aggressive_dead_code_elim_pass.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/aggressive_dead_code_elim_pass.cpp.o +.PHONY : aggressive_dead_code_elim_pass.cpp.o + +aggressive_dead_code_elim_pass.i: aggressive_dead_code_elim_pass.cpp.i + +.PHONY : aggressive_dead_code_elim_pass.i + +# target to preprocess a source file +aggressive_dead_code_elim_pass.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/aggressive_dead_code_elim_pass.cpp.i +.PHONY : aggressive_dead_code_elim_pass.cpp.i + +aggressive_dead_code_elim_pass.s: aggressive_dead_code_elim_pass.cpp.s + +.PHONY : aggressive_dead_code_elim_pass.s + +# target to generate assembly for a file +aggressive_dead_code_elim_pass.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/aggressive_dead_code_elim_pass.cpp.s +.PHONY : aggressive_dead_code_elim_pass.cpp.s + +basic_block.o: basic_block.cpp.o + +.PHONY : basic_block.o + +# target to build an object file +basic_block.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/basic_block.cpp.o +.PHONY : basic_block.cpp.o + +basic_block.i: basic_block.cpp.i + +.PHONY : basic_block.i + +# target to preprocess a source file +basic_block.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/basic_block.cpp.i +.PHONY : basic_block.cpp.i + +basic_block.s: basic_block.cpp.s + +.PHONY : basic_block.s + +# target to generate assembly for a file +basic_block.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/basic_block.cpp.s +.PHONY : basic_block.cpp.s + +block_merge_pass.o: block_merge_pass.cpp.o + +.PHONY : block_merge_pass.o + +# target to build an object file +block_merge_pass.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/block_merge_pass.cpp.o +.PHONY : block_merge_pass.cpp.o + +block_merge_pass.i: block_merge_pass.cpp.i + +.PHONY : block_merge_pass.i + +# target to preprocess a source file +block_merge_pass.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/block_merge_pass.cpp.i +.PHONY : block_merge_pass.cpp.i + +block_merge_pass.s: block_merge_pass.cpp.s + +.PHONY : block_merge_pass.s + +# target to generate assembly for a file +block_merge_pass.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/block_merge_pass.cpp.s +.PHONY : block_merge_pass.cpp.s + +build_module.o: build_module.cpp.o + +.PHONY : build_module.o + +# target to build an object file +build_module.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build_module.cpp.o +.PHONY : build_module.cpp.o + +build_module.i: build_module.cpp.i + +.PHONY : build_module.i + +# target to preprocess a source file +build_module.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build_module.cpp.i +.PHONY : build_module.cpp.i + +build_module.s: build_module.cpp.s + +.PHONY : build_module.s + +# target to generate assembly for a file +build_module.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build_module.cpp.s +.PHONY : build_module.cpp.s + +ccp_pass.o: ccp_pass.cpp.o + +.PHONY : ccp_pass.o + +# target to build an object file +ccp_pass.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ccp_pass.cpp.o +.PHONY : ccp_pass.cpp.o + +ccp_pass.i: ccp_pass.cpp.i + +.PHONY : ccp_pass.i + +# target to preprocess a source file +ccp_pass.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ccp_pass.cpp.i +.PHONY : ccp_pass.cpp.i + +ccp_pass.s: ccp_pass.cpp.s + +.PHONY : ccp_pass.s + +# target to generate assembly for a file +ccp_pass.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ccp_pass.cpp.s +.PHONY : ccp_pass.cpp.s + +cfg.o: cfg.cpp.o + +.PHONY : cfg.o + +# target to build an object file +cfg.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/cfg.cpp.o +.PHONY : cfg.cpp.o + +cfg.i: cfg.cpp.i + +.PHONY : cfg.i + +# target to preprocess a source file +cfg.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/cfg.cpp.i +.PHONY : cfg.cpp.i + +cfg.s: cfg.cpp.s + +.PHONY : cfg.s + +# target to generate assembly for a file +cfg.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/cfg.cpp.s +.PHONY : cfg.cpp.s + +cfg_cleanup_pass.o: cfg_cleanup_pass.cpp.o + +.PHONY : cfg_cleanup_pass.o + +# target to build an object file +cfg_cleanup_pass.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/cfg_cleanup_pass.cpp.o +.PHONY : cfg_cleanup_pass.cpp.o + +cfg_cleanup_pass.i: cfg_cleanup_pass.cpp.i + +.PHONY : cfg_cleanup_pass.i + +# target to preprocess a source file +cfg_cleanup_pass.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/cfg_cleanup_pass.cpp.i +.PHONY : cfg_cleanup_pass.cpp.i + +cfg_cleanup_pass.s: cfg_cleanup_pass.cpp.s + +.PHONY : cfg_cleanup_pass.s + +# target to generate assembly for a file +cfg_cleanup_pass.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/cfg_cleanup_pass.cpp.s +.PHONY : cfg_cleanup_pass.cpp.s + +combine_access_chains.o: combine_access_chains.cpp.o + +.PHONY : combine_access_chains.o + +# target to build an object file +combine_access_chains.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/combine_access_chains.cpp.o +.PHONY : combine_access_chains.cpp.o + +combine_access_chains.i: combine_access_chains.cpp.i + +.PHONY : combine_access_chains.i + +# target to preprocess a source file +combine_access_chains.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/combine_access_chains.cpp.i +.PHONY : combine_access_chains.cpp.i + +combine_access_chains.s: combine_access_chains.cpp.s + +.PHONY : combine_access_chains.s + +# target to generate assembly for a file +combine_access_chains.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/combine_access_chains.cpp.s +.PHONY : combine_access_chains.cpp.s + +common_uniform_elim_pass.o: common_uniform_elim_pass.cpp.o + +.PHONY : common_uniform_elim_pass.o + +# target to build an object file +common_uniform_elim_pass.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/common_uniform_elim_pass.cpp.o +.PHONY : common_uniform_elim_pass.cpp.o + +common_uniform_elim_pass.i: common_uniform_elim_pass.cpp.i + +.PHONY : common_uniform_elim_pass.i + +# target to preprocess a source file +common_uniform_elim_pass.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/common_uniform_elim_pass.cpp.i +.PHONY : common_uniform_elim_pass.cpp.i + +common_uniform_elim_pass.s: common_uniform_elim_pass.cpp.s + +.PHONY : common_uniform_elim_pass.s + +# target to generate assembly for a file +common_uniform_elim_pass.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/common_uniform_elim_pass.cpp.s +.PHONY : common_uniform_elim_pass.cpp.s + +compact_ids_pass.o: compact_ids_pass.cpp.o + +.PHONY : compact_ids_pass.o + +# target to build an object file +compact_ids_pass.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/compact_ids_pass.cpp.o +.PHONY : compact_ids_pass.cpp.o + +compact_ids_pass.i: compact_ids_pass.cpp.i + +.PHONY : compact_ids_pass.i + +# target to preprocess a source file +compact_ids_pass.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/compact_ids_pass.cpp.i +.PHONY : compact_ids_pass.cpp.i + +compact_ids_pass.s: compact_ids_pass.cpp.s + +.PHONY : compact_ids_pass.s + +# target to generate assembly for a file +compact_ids_pass.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/compact_ids_pass.cpp.s +.PHONY : compact_ids_pass.cpp.s + +composite.o: composite.cpp.o + +.PHONY : composite.o + +# target to build an object file +composite.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/composite.cpp.o +.PHONY : composite.cpp.o + +composite.i: composite.cpp.i + +.PHONY : composite.i + +# target to preprocess a source file +composite.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/composite.cpp.i +.PHONY : composite.cpp.i + +composite.s: composite.cpp.s + +.PHONY : composite.s + +# target to generate assembly for a file +composite.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/composite.cpp.s +.PHONY : composite.cpp.s + +const_folding_rules.o: const_folding_rules.cpp.o + +.PHONY : const_folding_rules.o + +# target to build an object file +const_folding_rules.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/const_folding_rules.cpp.o +.PHONY : const_folding_rules.cpp.o + +const_folding_rules.i: const_folding_rules.cpp.i + +.PHONY : const_folding_rules.i + +# target to preprocess a source file +const_folding_rules.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/const_folding_rules.cpp.i +.PHONY : const_folding_rules.cpp.i + +const_folding_rules.s: const_folding_rules.cpp.s + +.PHONY : const_folding_rules.s + +# target to generate assembly for a file +const_folding_rules.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/const_folding_rules.cpp.s +.PHONY : const_folding_rules.cpp.s + +constants.o: constants.cpp.o + +.PHONY : constants.o + +# target to build an object file +constants.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/constants.cpp.o +.PHONY : constants.cpp.o + +constants.i: constants.cpp.i + +.PHONY : constants.i + +# target to preprocess a source file +constants.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/constants.cpp.i +.PHONY : constants.cpp.i + +constants.s: constants.cpp.s + +.PHONY : constants.s + +# target to generate assembly for a file +constants.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/constants.cpp.s +.PHONY : constants.cpp.s + +copy_prop_arrays.o: copy_prop_arrays.cpp.o + +.PHONY : copy_prop_arrays.o + +# target to build an object file +copy_prop_arrays.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/copy_prop_arrays.cpp.o +.PHONY : copy_prop_arrays.cpp.o + +copy_prop_arrays.i: copy_prop_arrays.cpp.i + +.PHONY : copy_prop_arrays.i + +# target to preprocess a source file +copy_prop_arrays.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/copy_prop_arrays.cpp.i +.PHONY : copy_prop_arrays.cpp.i + +copy_prop_arrays.s: copy_prop_arrays.cpp.s + +.PHONY : copy_prop_arrays.s + +# target to generate assembly for a file +copy_prop_arrays.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/copy_prop_arrays.cpp.s +.PHONY : copy_prop_arrays.cpp.s + +dead_branch_elim_pass.o: dead_branch_elim_pass.cpp.o + +.PHONY : dead_branch_elim_pass.o + +# target to build an object file +dead_branch_elim_pass.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_branch_elim_pass.cpp.o +.PHONY : dead_branch_elim_pass.cpp.o + +dead_branch_elim_pass.i: dead_branch_elim_pass.cpp.i + +.PHONY : dead_branch_elim_pass.i + +# target to preprocess a source file +dead_branch_elim_pass.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_branch_elim_pass.cpp.i +.PHONY : dead_branch_elim_pass.cpp.i + +dead_branch_elim_pass.s: dead_branch_elim_pass.cpp.s + +.PHONY : dead_branch_elim_pass.s + +# target to generate assembly for a file +dead_branch_elim_pass.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_branch_elim_pass.cpp.s +.PHONY : dead_branch_elim_pass.cpp.s + +dead_insert_elim_pass.o: dead_insert_elim_pass.cpp.o + +.PHONY : dead_insert_elim_pass.o + +# target to build an object file +dead_insert_elim_pass.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_insert_elim_pass.cpp.o +.PHONY : dead_insert_elim_pass.cpp.o + +dead_insert_elim_pass.i: dead_insert_elim_pass.cpp.i + +.PHONY : dead_insert_elim_pass.i + +# target to preprocess a source file +dead_insert_elim_pass.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_insert_elim_pass.cpp.i +.PHONY : dead_insert_elim_pass.cpp.i + +dead_insert_elim_pass.s: dead_insert_elim_pass.cpp.s + +.PHONY : dead_insert_elim_pass.s + +# target to generate assembly for a file +dead_insert_elim_pass.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_insert_elim_pass.cpp.s +.PHONY : dead_insert_elim_pass.cpp.s + +dead_variable_elimination.o: dead_variable_elimination.cpp.o + +.PHONY : dead_variable_elimination.o + +# target to build an object file +dead_variable_elimination.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_variable_elimination.cpp.o +.PHONY : dead_variable_elimination.cpp.o + +dead_variable_elimination.i: dead_variable_elimination.cpp.i + +.PHONY : dead_variable_elimination.i + +# target to preprocess a source file +dead_variable_elimination.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_variable_elimination.cpp.i +.PHONY : dead_variable_elimination.cpp.i + +dead_variable_elimination.s: dead_variable_elimination.cpp.s + +.PHONY : dead_variable_elimination.s + +# target to generate assembly for a file +dead_variable_elimination.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dead_variable_elimination.cpp.s +.PHONY : dead_variable_elimination.cpp.s + +decoration_manager.o: decoration_manager.cpp.o + +.PHONY : decoration_manager.o + +# target to build an object file +decoration_manager.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/decoration_manager.cpp.o +.PHONY : decoration_manager.cpp.o + +decoration_manager.i: decoration_manager.cpp.i + +.PHONY : decoration_manager.i + +# target to preprocess a source file +decoration_manager.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/decoration_manager.cpp.i +.PHONY : decoration_manager.cpp.i + +decoration_manager.s: decoration_manager.cpp.s + +.PHONY : decoration_manager.s + +# target to generate assembly for a file +decoration_manager.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/decoration_manager.cpp.s +.PHONY : decoration_manager.cpp.s + +def_use_manager.o: def_use_manager.cpp.o + +.PHONY : def_use_manager.o + +# target to build an object file +def_use_manager.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/def_use_manager.cpp.o +.PHONY : def_use_manager.cpp.o + +def_use_manager.i: def_use_manager.cpp.i + +.PHONY : def_use_manager.i + +# target to preprocess a source file +def_use_manager.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/def_use_manager.cpp.i +.PHONY : def_use_manager.cpp.i + +def_use_manager.s: def_use_manager.cpp.s + +.PHONY : def_use_manager.s + +# target to generate assembly for a file +def_use_manager.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/def_use_manager.cpp.s +.PHONY : def_use_manager.cpp.s + +dominator_analysis.o: dominator_analysis.cpp.o + +.PHONY : dominator_analysis.o + +# target to build an object file +dominator_analysis.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dominator_analysis.cpp.o +.PHONY : dominator_analysis.cpp.o + +dominator_analysis.i: dominator_analysis.cpp.i + +.PHONY : dominator_analysis.i + +# target to preprocess a source file +dominator_analysis.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dominator_analysis.cpp.i +.PHONY : dominator_analysis.cpp.i + +dominator_analysis.s: dominator_analysis.cpp.s + +.PHONY : dominator_analysis.s + +# target to generate assembly for a file +dominator_analysis.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dominator_analysis.cpp.s +.PHONY : dominator_analysis.cpp.s + +dominator_tree.o: dominator_tree.cpp.o + +.PHONY : dominator_tree.o + +# target to build an object file +dominator_tree.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dominator_tree.cpp.o +.PHONY : dominator_tree.cpp.o + +dominator_tree.i: dominator_tree.cpp.i + +.PHONY : dominator_tree.i + +# target to preprocess a source file +dominator_tree.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dominator_tree.cpp.i +.PHONY : dominator_tree.cpp.i + +dominator_tree.s: dominator_tree.cpp.s + +.PHONY : dominator_tree.s + +# target to generate assembly for a file +dominator_tree.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/dominator_tree.cpp.s +.PHONY : dominator_tree.cpp.s + +eliminate_dead_constant_pass.o: eliminate_dead_constant_pass.cpp.o + +.PHONY : eliminate_dead_constant_pass.o + +# target to build an object file +eliminate_dead_constant_pass.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_constant_pass.cpp.o +.PHONY : eliminate_dead_constant_pass.cpp.o + +eliminate_dead_constant_pass.i: eliminate_dead_constant_pass.cpp.i + +.PHONY : eliminate_dead_constant_pass.i + +# target to preprocess a source file +eliminate_dead_constant_pass.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_constant_pass.cpp.i +.PHONY : eliminate_dead_constant_pass.cpp.i + +eliminate_dead_constant_pass.s: eliminate_dead_constant_pass.cpp.s + +.PHONY : eliminate_dead_constant_pass.s + +# target to generate assembly for a file +eliminate_dead_constant_pass.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_constant_pass.cpp.s +.PHONY : eliminate_dead_constant_pass.cpp.s + +eliminate_dead_functions_pass.o: eliminate_dead_functions_pass.cpp.o + +.PHONY : eliminate_dead_functions_pass.o + +# target to build an object file +eliminate_dead_functions_pass.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_functions_pass.cpp.o +.PHONY : eliminate_dead_functions_pass.cpp.o + +eliminate_dead_functions_pass.i: eliminate_dead_functions_pass.cpp.i + +.PHONY : eliminate_dead_functions_pass.i + +# target to preprocess a source file +eliminate_dead_functions_pass.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_functions_pass.cpp.i +.PHONY : eliminate_dead_functions_pass.cpp.i + +eliminate_dead_functions_pass.s: eliminate_dead_functions_pass.cpp.s + +.PHONY : eliminate_dead_functions_pass.s + +# target to generate assembly for a file +eliminate_dead_functions_pass.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/eliminate_dead_functions_pass.cpp.s +.PHONY : eliminate_dead_functions_pass.cpp.s + +feature_manager.o: feature_manager.cpp.o + +.PHONY : feature_manager.o + +# target to build an object file +feature_manager.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/feature_manager.cpp.o +.PHONY : feature_manager.cpp.o + +feature_manager.i: feature_manager.cpp.i + +.PHONY : feature_manager.i + +# target to preprocess a source file +feature_manager.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/feature_manager.cpp.i +.PHONY : feature_manager.cpp.i + +feature_manager.s: feature_manager.cpp.s + +.PHONY : feature_manager.s + +# target to generate assembly for a file +feature_manager.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/feature_manager.cpp.s +.PHONY : feature_manager.cpp.s + +flatten_decoration_pass.o: flatten_decoration_pass.cpp.o + +.PHONY : flatten_decoration_pass.o + +# target to build an object file +flatten_decoration_pass.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flatten_decoration_pass.cpp.o +.PHONY : flatten_decoration_pass.cpp.o + +flatten_decoration_pass.i: flatten_decoration_pass.cpp.i + +.PHONY : flatten_decoration_pass.i + +# target to preprocess a source file +flatten_decoration_pass.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flatten_decoration_pass.cpp.i +.PHONY : flatten_decoration_pass.cpp.i + +flatten_decoration_pass.s: flatten_decoration_pass.cpp.s + +.PHONY : flatten_decoration_pass.s + +# target to generate assembly for a file +flatten_decoration_pass.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/flatten_decoration_pass.cpp.s +.PHONY : flatten_decoration_pass.cpp.s + +fold.o: fold.cpp.o + +.PHONY : fold.o + +# target to build an object file +fold.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/fold.cpp.o +.PHONY : fold.cpp.o + +fold.i: fold.cpp.i + +.PHONY : fold.i + +# target to preprocess a source file +fold.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/fold.cpp.i +.PHONY : fold.cpp.i + +fold.s: fold.cpp.s + +.PHONY : fold.s + +# target to generate assembly for a file +fold.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/fold.cpp.s +.PHONY : fold.cpp.s + +fold_spec_constant_op_and_composite_pass.o: fold_spec_constant_op_and_composite_pass.cpp.o + +.PHONY : fold_spec_constant_op_and_composite_pass.o + +# target to build an object file +fold_spec_constant_op_and_composite_pass.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/fold_spec_constant_op_and_composite_pass.cpp.o +.PHONY : fold_spec_constant_op_and_composite_pass.cpp.o + +fold_spec_constant_op_and_composite_pass.i: fold_spec_constant_op_and_composite_pass.cpp.i + +.PHONY : fold_spec_constant_op_and_composite_pass.i + +# target to preprocess a source file +fold_spec_constant_op_and_composite_pass.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/fold_spec_constant_op_and_composite_pass.cpp.i +.PHONY : fold_spec_constant_op_and_composite_pass.cpp.i + +fold_spec_constant_op_and_composite_pass.s: fold_spec_constant_op_and_composite_pass.cpp.s + +.PHONY : fold_spec_constant_op_and_composite_pass.s + +# target to generate assembly for a file +fold_spec_constant_op_and_composite_pass.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/fold_spec_constant_op_and_composite_pass.cpp.s +.PHONY : fold_spec_constant_op_and_composite_pass.cpp.s + +folding_rules.o: folding_rules.cpp.o + +.PHONY : folding_rules.o + +# target to build an object file +folding_rules.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/folding_rules.cpp.o +.PHONY : folding_rules.cpp.o + +folding_rules.i: folding_rules.cpp.i + +.PHONY : folding_rules.i + +# target to preprocess a source file +folding_rules.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/folding_rules.cpp.i +.PHONY : folding_rules.cpp.i + +folding_rules.s: folding_rules.cpp.s + +.PHONY : folding_rules.s + +# target to generate assembly for a file +folding_rules.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/folding_rules.cpp.s +.PHONY : folding_rules.cpp.s + +freeze_spec_constant_value_pass.o: freeze_spec_constant_value_pass.cpp.o + +.PHONY : freeze_spec_constant_value_pass.o + +# target to build an object file +freeze_spec_constant_value_pass.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/freeze_spec_constant_value_pass.cpp.o +.PHONY : freeze_spec_constant_value_pass.cpp.o + +freeze_spec_constant_value_pass.i: freeze_spec_constant_value_pass.cpp.i + +.PHONY : freeze_spec_constant_value_pass.i + +# target to preprocess a source file +freeze_spec_constant_value_pass.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/freeze_spec_constant_value_pass.cpp.i +.PHONY : freeze_spec_constant_value_pass.cpp.i + +freeze_spec_constant_value_pass.s: freeze_spec_constant_value_pass.cpp.s + +.PHONY : freeze_spec_constant_value_pass.s + +# target to generate assembly for a file +freeze_spec_constant_value_pass.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/freeze_spec_constant_value_pass.cpp.s +.PHONY : freeze_spec_constant_value_pass.cpp.s + +function.o: function.cpp.o + +.PHONY : function.o + +# target to build an object file +function.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/function.cpp.o +.PHONY : function.cpp.o + +function.i: function.cpp.i + +.PHONY : function.i + +# target to preprocess a source file +function.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/function.cpp.i +.PHONY : function.cpp.i + +function.s: function.cpp.s + +.PHONY : function.s + +# target to generate assembly for a file +function.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/function.cpp.s +.PHONY : function.cpp.s + +if_conversion.o: if_conversion.cpp.o + +.PHONY : if_conversion.o + +# target to build an object file +if_conversion.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/if_conversion.cpp.o +.PHONY : if_conversion.cpp.o + +if_conversion.i: if_conversion.cpp.i + +.PHONY : if_conversion.i + +# target to preprocess a source file +if_conversion.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/if_conversion.cpp.i +.PHONY : if_conversion.cpp.i + +if_conversion.s: if_conversion.cpp.s + +.PHONY : if_conversion.s + +# target to generate assembly for a file +if_conversion.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/if_conversion.cpp.s +.PHONY : if_conversion.cpp.s + +inline_exhaustive_pass.o: inline_exhaustive_pass.cpp.o + +.PHONY : inline_exhaustive_pass.o + +# target to build an object file +inline_exhaustive_pass.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_exhaustive_pass.cpp.o +.PHONY : inline_exhaustive_pass.cpp.o + +inline_exhaustive_pass.i: inline_exhaustive_pass.cpp.i + +.PHONY : inline_exhaustive_pass.i + +# target to preprocess a source file +inline_exhaustive_pass.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_exhaustive_pass.cpp.i +.PHONY : inline_exhaustive_pass.cpp.i + +inline_exhaustive_pass.s: inline_exhaustive_pass.cpp.s + +.PHONY : inline_exhaustive_pass.s + +# target to generate assembly for a file +inline_exhaustive_pass.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_exhaustive_pass.cpp.s +.PHONY : inline_exhaustive_pass.cpp.s + +inline_opaque_pass.o: inline_opaque_pass.cpp.o + +.PHONY : inline_opaque_pass.o + +# target to build an object file +inline_opaque_pass.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_opaque_pass.cpp.o +.PHONY : inline_opaque_pass.cpp.o + +inline_opaque_pass.i: inline_opaque_pass.cpp.i + +.PHONY : inline_opaque_pass.i + +# target to preprocess a source file +inline_opaque_pass.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_opaque_pass.cpp.i +.PHONY : inline_opaque_pass.cpp.i + +inline_opaque_pass.s: inline_opaque_pass.cpp.s + +.PHONY : inline_opaque_pass.s + +# target to generate assembly for a file +inline_opaque_pass.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_opaque_pass.cpp.s +.PHONY : inline_opaque_pass.cpp.s + +inline_pass.o: inline_pass.cpp.o + +.PHONY : inline_pass.o + +# target to build an object file +inline_pass.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_pass.cpp.o +.PHONY : inline_pass.cpp.o + +inline_pass.i: inline_pass.cpp.i + +.PHONY : inline_pass.i + +# target to preprocess a source file +inline_pass.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_pass.cpp.i +.PHONY : inline_pass.cpp.i + +inline_pass.s: inline_pass.cpp.s + +.PHONY : inline_pass.s + +# target to generate assembly for a file +inline_pass.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/inline_pass.cpp.s +.PHONY : inline_pass.cpp.s + +instruction.o: instruction.cpp.o + +.PHONY : instruction.o + +# target to build an object file +instruction.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/instruction.cpp.o +.PHONY : instruction.cpp.o + +instruction.i: instruction.cpp.i + +.PHONY : instruction.i + +# target to preprocess a source file +instruction.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/instruction.cpp.i +.PHONY : instruction.cpp.i + +instruction.s: instruction.cpp.s + +.PHONY : instruction.s + +# target to generate assembly for a file +instruction.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/instruction.cpp.s +.PHONY : instruction.cpp.s + +instruction_list.o: instruction_list.cpp.o + +.PHONY : instruction_list.o + +# target to build an object file +instruction_list.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/instruction_list.cpp.o +.PHONY : instruction_list.cpp.o + +instruction_list.i: instruction_list.cpp.i + +.PHONY : instruction_list.i + +# target to preprocess a source file +instruction_list.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/instruction_list.cpp.i +.PHONY : instruction_list.cpp.i + +instruction_list.s: instruction_list.cpp.s + +.PHONY : instruction_list.s + +# target to generate assembly for a file +instruction_list.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/instruction_list.cpp.s +.PHONY : instruction_list.cpp.s + +ir_context.o: ir_context.cpp.o + +.PHONY : ir_context.o + +# target to build an object file +ir_context.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ir_context.cpp.o +.PHONY : ir_context.cpp.o + +ir_context.i: ir_context.cpp.i + +.PHONY : ir_context.i + +# target to preprocess a source file +ir_context.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ir_context.cpp.i +.PHONY : ir_context.cpp.i + +ir_context.s: ir_context.cpp.s + +.PHONY : ir_context.s + +# target to generate assembly for a file +ir_context.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ir_context.cpp.s +.PHONY : ir_context.cpp.s + +ir_loader.o: ir_loader.cpp.o + +.PHONY : ir_loader.o + +# target to build an object file +ir_loader.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ir_loader.cpp.o +.PHONY : ir_loader.cpp.o + +ir_loader.i: ir_loader.cpp.i + +.PHONY : ir_loader.i + +# target to preprocess a source file +ir_loader.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ir_loader.cpp.i +.PHONY : ir_loader.cpp.i + +ir_loader.s: ir_loader.cpp.s + +.PHONY : ir_loader.s + +# target to generate assembly for a file +ir_loader.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ir_loader.cpp.s +.PHONY : ir_loader.cpp.s + +licm_pass.o: licm_pass.cpp.o + +.PHONY : licm_pass.o + +# target to build an object file +licm_pass.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/licm_pass.cpp.o +.PHONY : licm_pass.cpp.o + +licm_pass.i: licm_pass.cpp.i + +.PHONY : licm_pass.i + +# target to preprocess a source file +licm_pass.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/licm_pass.cpp.i +.PHONY : licm_pass.cpp.i + +licm_pass.s: licm_pass.cpp.s + +.PHONY : licm_pass.s + +# target to generate assembly for a file +licm_pass.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/licm_pass.cpp.s +.PHONY : licm_pass.cpp.s + +local_access_chain_convert_pass.o: local_access_chain_convert_pass.cpp.o + +.PHONY : local_access_chain_convert_pass.o + +# target to build an object file +local_access_chain_convert_pass.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_access_chain_convert_pass.cpp.o +.PHONY : local_access_chain_convert_pass.cpp.o + +local_access_chain_convert_pass.i: local_access_chain_convert_pass.cpp.i + +.PHONY : local_access_chain_convert_pass.i + +# target to preprocess a source file +local_access_chain_convert_pass.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_access_chain_convert_pass.cpp.i +.PHONY : local_access_chain_convert_pass.cpp.i + +local_access_chain_convert_pass.s: local_access_chain_convert_pass.cpp.s + +.PHONY : local_access_chain_convert_pass.s + +# target to generate assembly for a file +local_access_chain_convert_pass.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_access_chain_convert_pass.cpp.s +.PHONY : local_access_chain_convert_pass.cpp.s + +local_redundancy_elimination.o: local_redundancy_elimination.cpp.o + +.PHONY : local_redundancy_elimination.o + +# target to build an object file +local_redundancy_elimination.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_redundancy_elimination.cpp.o +.PHONY : local_redundancy_elimination.cpp.o + +local_redundancy_elimination.i: local_redundancy_elimination.cpp.i + +.PHONY : local_redundancy_elimination.i + +# target to preprocess a source file +local_redundancy_elimination.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_redundancy_elimination.cpp.i +.PHONY : local_redundancy_elimination.cpp.i + +local_redundancy_elimination.s: local_redundancy_elimination.cpp.s + +.PHONY : local_redundancy_elimination.s + +# target to generate assembly for a file +local_redundancy_elimination.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_redundancy_elimination.cpp.s +.PHONY : local_redundancy_elimination.cpp.s + +local_single_block_elim_pass.o: local_single_block_elim_pass.cpp.o + +.PHONY : local_single_block_elim_pass.o + +# target to build an object file +local_single_block_elim_pass.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_single_block_elim_pass.cpp.o +.PHONY : local_single_block_elim_pass.cpp.o + +local_single_block_elim_pass.i: local_single_block_elim_pass.cpp.i + +.PHONY : local_single_block_elim_pass.i + +# target to preprocess a source file +local_single_block_elim_pass.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_single_block_elim_pass.cpp.i +.PHONY : local_single_block_elim_pass.cpp.i + +local_single_block_elim_pass.s: local_single_block_elim_pass.cpp.s + +.PHONY : local_single_block_elim_pass.s + +# target to generate assembly for a file +local_single_block_elim_pass.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_single_block_elim_pass.cpp.s +.PHONY : local_single_block_elim_pass.cpp.s + +local_single_store_elim_pass.o: local_single_store_elim_pass.cpp.o + +.PHONY : local_single_store_elim_pass.o + +# target to build an object file +local_single_store_elim_pass.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_single_store_elim_pass.cpp.o +.PHONY : local_single_store_elim_pass.cpp.o + +local_single_store_elim_pass.i: local_single_store_elim_pass.cpp.i + +.PHONY : local_single_store_elim_pass.i + +# target to preprocess a source file +local_single_store_elim_pass.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_single_store_elim_pass.cpp.i +.PHONY : local_single_store_elim_pass.cpp.i + +local_single_store_elim_pass.s: local_single_store_elim_pass.cpp.s + +.PHONY : local_single_store_elim_pass.s + +# target to generate assembly for a file +local_single_store_elim_pass.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_single_store_elim_pass.cpp.s +.PHONY : local_single_store_elim_pass.cpp.s + +local_ssa_elim_pass.o: local_ssa_elim_pass.cpp.o + +.PHONY : local_ssa_elim_pass.o + +# target to build an object file +local_ssa_elim_pass.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_ssa_elim_pass.cpp.o +.PHONY : local_ssa_elim_pass.cpp.o + +local_ssa_elim_pass.i: local_ssa_elim_pass.cpp.i + +.PHONY : local_ssa_elim_pass.i + +# target to preprocess a source file +local_ssa_elim_pass.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_ssa_elim_pass.cpp.i +.PHONY : local_ssa_elim_pass.cpp.i + +local_ssa_elim_pass.s: local_ssa_elim_pass.cpp.s + +.PHONY : local_ssa_elim_pass.s + +# target to generate assembly for a file +local_ssa_elim_pass.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/local_ssa_elim_pass.cpp.s +.PHONY : local_ssa_elim_pass.cpp.s + +loop_dependence.o: loop_dependence.cpp.o + +.PHONY : loop_dependence.o + +# target to build an object file +loop_dependence.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence.cpp.o +.PHONY : loop_dependence.cpp.o + +loop_dependence.i: loop_dependence.cpp.i + +.PHONY : loop_dependence.i + +# target to preprocess a source file +loop_dependence.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence.cpp.i +.PHONY : loop_dependence.cpp.i + +loop_dependence.s: loop_dependence.cpp.s + +.PHONY : loop_dependence.s + +# target to generate assembly for a file +loop_dependence.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence.cpp.s +.PHONY : loop_dependence.cpp.s + +loop_dependence_helpers.o: loop_dependence_helpers.cpp.o + +.PHONY : loop_dependence_helpers.o + +# target to build an object file +loop_dependence_helpers.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence_helpers.cpp.o +.PHONY : loop_dependence_helpers.cpp.o + +loop_dependence_helpers.i: loop_dependence_helpers.cpp.i + +.PHONY : loop_dependence_helpers.i + +# target to preprocess a source file +loop_dependence_helpers.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence_helpers.cpp.i +.PHONY : loop_dependence_helpers.cpp.i + +loop_dependence_helpers.s: loop_dependence_helpers.cpp.s + +.PHONY : loop_dependence_helpers.s + +# target to generate assembly for a file +loop_dependence_helpers.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_dependence_helpers.cpp.s +.PHONY : loop_dependence_helpers.cpp.s + +loop_descriptor.o: loop_descriptor.cpp.o + +.PHONY : loop_descriptor.o + +# target to build an object file +loop_descriptor.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_descriptor.cpp.o +.PHONY : loop_descriptor.cpp.o + +loop_descriptor.i: loop_descriptor.cpp.i + +.PHONY : loop_descriptor.i + +# target to preprocess a source file +loop_descriptor.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_descriptor.cpp.i +.PHONY : loop_descriptor.cpp.i + +loop_descriptor.s: loop_descriptor.cpp.s + +.PHONY : loop_descriptor.s + +# target to generate assembly for a file +loop_descriptor.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_descriptor.cpp.s +.PHONY : loop_descriptor.cpp.s + +loop_fission.o: loop_fission.cpp.o + +.PHONY : loop_fission.o + +# target to build an object file +loop_fission.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fission.cpp.o +.PHONY : loop_fission.cpp.o + +loop_fission.i: loop_fission.cpp.i + +.PHONY : loop_fission.i + +# target to preprocess a source file +loop_fission.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fission.cpp.i +.PHONY : loop_fission.cpp.i + +loop_fission.s: loop_fission.cpp.s + +.PHONY : loop_fission.s + +# target to generate assembly for a file +loop_fission.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fission.cpp.s +.PHONY : loop_fission.cpp.s + +loop_fusion.o: loop_fusion.cpp.o + +.PHONY : loop_fusion.o + +# target to build an object file +loop_fusion.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion.cpp.o +.PHONY : loop_fusion.cpp.o + +loop_fusion.i: loop_fusion.cpp.i + +.PHONY : loop_fusion.i + +# target to preprocess a source file +loop_fusion.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion.cpp.i +.PHONY : loop_fusion.cpp.i + +loop_fusion.s: loop_fusion.cpp.s + +.PHONY : loop_fusion.s + +# target to generate assembly for a file +loop_fusion.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion.cpp.s +.PHONY : loop_fusion.cpp.s + +loop_fusion_pass.o: loop_fusion_pass.cpp.o + +.PHONY : loop_fusion_pass.o + +# target to build an object file +loop_fusion_pass.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion_pass.cpp.o +.PHONY : loop_fusion_pass.cpp.o + +loop_fusion_pass.i: loop_fusion_pass.cpp.i + +.PHONY : loop_fusion_pass.i + +# target to preprocess a source file +loop_fusion_pass.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion_pass.cpp.i +.PHONY : loop_fusion_pass.cpp.i + +loop_fusion_pass.s: loop_fusion_pass.cpp.s + +.PHONY : loop_fusion_pass.s + +# target to generate assembly for a file +loop_fusion_pass.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_fusion_pass.cpp.s +.PHONY : loop_fusion_pass.cpp.s + +loop_peeling.o: loop_peeling.cpp.o + +.PHONY : loop_peeling.o + +# target to build an object file +loop_peeling.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_peeling.cpp.o +.PHONY : loop_peeling.cpp.o + +loop_peeling.i: loop_peeling.cpp.i + +.PHONY : loop_peeling.i + +# target to preprocess a source file +loop_peeling.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_peeling.cpp.i +.PHONY : loop_peeling.cpp.i + +loop_peeling.s: loop_peeling.cpp.s + +.PHONY : loop_peeling.s + +# target to generate assembly for a file +loop_peeling.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_peeling.cpp.s +.PHONY : loop_peeling.cpp.s + +loop_unroller.o: loop_unroller.cpp.o + +.PHONY : loop_unroller.o + +# target to build an object file +loop_unroller.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_unroller.cpp.o +.PHONY : loop_unroller.cpp.o + +loop_unroller.i: loop_unroller.cpp.i + +.PHONY : loop_unroller.i + +# target to preprocess a source file +loop_unroller.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_unroller.cpp.i +.PHONY : loop_unroller.cpp.i + +loop_unroller.s: loop_unroller.cpp.s + +.PHONY : loop_unroller.s + +# target to generate assembly for a file +loop_unroller.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_unroller.cpp.s +.PHONY : loop_unroller.cpp.s + +loop_unswitch_pass.o: loop_unswitch_pass.cpp.o + +.PHONY : loop_unswitch_pass.o + +# target to build an object file +loop_unswitch_pass.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_unswitch_pass.cpp.o +.PHONY : loop_unswitch_pass.cpp.o + +loop_unswitch_pass.i: loop_unswitch_pass.cpp.i + +.PHONY : loop_unswitch_pass.i + +# target to preprocess a source file +loop_unswitch_pass.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_unswitch_pass.cpp.i +.PHONY : loop_unswitch_pass.cpp.i + +loop_unswitch_pass.s: loop_unswitch_pass.cpp.s + +.PHONY : loop_unswitch_pass.s + +# target to generate assembly for a file +loop_unswitch_pass.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_unswitch_pass.cpp.s +.PHONY : loop_unswitch_pass.cpp.s + +loop_utils.o: loop_utils.cpp.o + +.PHONY : loop_utils.o + +# target to build an object file +loop_utils.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_utils.cpp.o +.PHONY : loop_utils.cpp.o + +loop_utils.i: loop_utils.cpp.i + +.PHONY : loop_utils.i + +# target to preprocess a source file +loop_utils.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_utils.cpp.i +.PHONY : loop_utils.cpp.i + +loop_utils.s: loop_utils.cpp.s + +.PHONY : loop_utils.s + +# target to generate assembly for a file +loop_utils.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/loop_utils.cpp.s +.PHONY : loop_utils.cpp.s + +mem_pass.o: mem_pass.cpp.o + +.PHONY : mem_pass.o + +# target to build an object file +mem_pass.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/mem_pass.cpp.o +.PHONY : mem_pass.cpp.o + +mem_pass.i: mem_pass.cpp.i + +.PHONY : mem_pass.i + +# target to preprocess a source file +mem_pass.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/mem_pass.cpp.i +.PHONY : mem_pass.cpp.i + +mem_pass.s: mem_pass.cpp.s + +.PHONY : mem_pass.s + +# target to generate assembly for a file +mem_pass.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/mem_pass.cpp.s +.PHONY : mem_pass.cpp.s + +merge_return_pass.o: merge_return_pass.cpp.o + +.PHONY : merge_return_pass.o + +# target to build an object file +merge_return_pass.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/merge_return_pass.cpp.o +.PHONY : merge_return_pass.cpp.o + +merge_return_pass.i: merge_return_pass.cpp.i + +.PHONY : merge_return_pass.i + +# target to preprocess a source file +merge_return_pass.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/merge_return_pass.cpp.i +.PHONY : merge_return_pass.cpp.i + +merge_return_pass.s: merge_return_pass.cpp.s + +.PHONY : merge_return_pass.s + +# target to generate assembly for a file +merge_return_pass.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/merge_return_pass.cpp.s +.PHONY : merge_return_pass.cpp.s + +module.o: module.cpp.o + +.PHONY : module.o + +# target to build an object file +module.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/module.cpp.o +.PHONY : module.cpp.o + +module.i: module.cpp.i + +.PHONY : module.i + +# target to preprocess a source file +module.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/module.cpp.i +.PHONY : module.cpp.i + +module.s: module.cpp.s + +.PHONY : module.s + +# target to generate assembly for a file +module.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/module.cpp.s +.PHONY : module.cpp.s + +optimizer.o: optimizer.cpp.o + +.PHONY : optimizer.o + +# target to build an object file +optimizer.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/optimizer.cpp.o +.PHONY : optimizer.cpp.o + +optimizer.i: optimizer.cpp.i + +.PHONY : optimizer.i + +# target to preprocess a source file +optimizer.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/optimizer.cpp.i +.PHONY : optimizer.cpp.i + +optimizer.s: optimizer.cpp.s + +.PHONY : optimizer.s + +# target to generate assembly for a file +optimizer.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/optimizer.cpp.s +.PHONY : optimizer.cpp.s + +pass.o: pass.cpp.o + +.PHONY : pass.o + +# target to build an object file +pass.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/pass.cpp.o +.PHONY : pass.cpp.o + +pass.i: pass.cpp.i + +.PHONY : pass.i + +# target to preprocess a source file +pass.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/pass.cpp.i +.PHONY : pass.cpp.i + +pass.s: pass.cpp.s + +.PHONY : pass.s + +# target to generate assembly for a file +pass.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/pass.cpp.s +.PHONY : pass.cpp.s + +pass_manager.o: pass_manager.cpp.o + +.PHONY : pass_manager.o + +# target to build an object file +pass_manager.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/pass_manager.cpp.o +.PHONY : pass_manager.cpp.o + +pass_manager.i: pass_manager.cpp.i + +.PHONY : pass_manager.i + +# target to preprocess a source file +pass_manager.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/pass_manager.cpp.i +.PHONY : pass_manager.cpp.i + +pass_manager.s: pass_manager.cpp.s + +.PHONY : pass_manager.s + +# target to generate assembly for a file +pass_manager.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/pass_manager.cpp.s +.PHONY : pass_manager.cpp.s + +private_to_local_pass.o: private_to_local_pass.cpp.o + +.PHONY : private_to_local_pass.o + +# target to build an object file +private_to_local_pass.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/private_to_local_pass.cpp.o +.PHONY : private_to_local_pass.cpp.o + +private_to_local_pass.i: private_to_local_pass.cpp.i + +.PHONY : private_to_local_pass.i + +# target to preprocess a source file +private_to_local_pass.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/private_to_local_pass.cpp.i +.PHONY : private_to_local_pass.cpp.i + +private_to_local_pass.s: private_to_local_pass.cpp.s + +.PHONY : private_to_local_pass.s + +# target to generate assembly for a file +private_to_local_pass.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/private_to_local_pass.cpp.s +.PHONY : private_to_local_pass.cpp.s + +propagator.o: propagator.cpp.o + +.PHONY : propagator.o + +# target to build an object file +propagator.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/propagator.cpp.o +.PHONY : propagator.cpp.o + +propagator.i: propagator.cpp.i + +.PHONY : propagator.i + +# target to preprocess a source file +propagator.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/propagator.cpp.i +.PHONY : propagator.cpp.i + +propagator.s: propagator.cpp.s + +.PHONY : propagator.s + +# target to generate assembly for a file +propagator.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/propagator.cpp.s +.PHONY : propagator.cpp.s + +reduce_load_size.o: reduce_load_size.cpp.o + +.PHONY : reduce_load_size.o + +# target to build an object file +reduce_load_size.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/reduce_load_size.cpp.o +.PHONY : reduce_load_size.cpp.o + +reduce_load_size.i: reduce_load_size.cpp.i + +.PHONY : reduce_load_size.i + +# target to preprocess a source file +reduce_load_size.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/reduce_load_size.cpp.i +.PHONY : reduce_load_size.cpp.i + +reduce_load_size.s: reduce_load_size.cpp.s + +.PHONY : reduce_load_size.s + +# target to generate assembly for a file +reduce_load_size.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/reduce_load_size.cpp.s +.PHONY : reduce_load_size.cpp.s + +redundancy_elimination.o: redundancy_elimination.cpp.o + +.PHONY : redundancy_elimination.o + +# target to build an object file +redundancy_elimination.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/redundancy_elimination.cpp.o +.PHONY : redundancy_elimination.cpp.o + +redundancy_elimination.i: redundancy_elimination.cpp.i + +.PHONY : redundancy_elimination.i + +# target to preprocess a source file +redundancy_elimination.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/redundancy_elimination.cpp.i +.PHONY : redundancy_elimination.cpp.i + +redundancy_elimination.s: redundancy_elimination.cpp.s + +.PHONY : redundancy_elimination.s + +# target to generate assembly for a file +redundancy_elimination.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/redundancy_elimination.cpp.s +.PHONY : redundancy_elimination.cpp.s + +register_pressure.o: register_pressure.cpp.o + +.PHONY : register_pressure.o + +# target to build an object file +register_pressure.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/register_pressure.cpp.o +.PHONY : register_pressure.cpp.o + +register_pressure.i: register_pressure.cpp.i + +.PHONY : register_pressure.i + +# target to preprocess a source file +register_pressure.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/register_pressure.cpp.i +.PHONY : register_pressure.cpp.i + +register_pressure.s: register_pressure.cpp.s + +.PHONY : register_pressure.s + +# target to generate assembly for a file +register_pressure.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/register_pressure.cpp.s +.PHONY : register_pressure.cpp.s + +remove_duplicates_pass.o: remove_duplicates_pass.cpp.o + +.PHONY : remove_duplicates_pass.o + +# target to build an object file +remove_duplicates_pass.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/remove_duplicates_pass.cpp.o +.PHONY : remove_duplicates_pass.cpp.o + +remove_duplicates_pass.i: remove_duplicates_pass.cpp.i + +.PHONY : remove_duplicates_pass.i + +# target to preprocess a source file +remove_duplicates_pass.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/remove_duplicates_pass.cpp.i +.PHONY : remove_duplicates_pass.cpp.i + +remove_duplicates_pass.s: remove_duplicates_pass.cpp.s + +.PHONY : remove_duplicates_pass.s + +# target to generate assembly for a file +remove_duplicates_pass.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/remove_duplicates_pass.cpp.s +.PHONY : remove_duplicates_pass.cpp.s + +replace_invalid_opc.o: replace_invalid_opc.cpp.o + +.PHONY : replace_invalid_opc.o + +# target to build an object file +replace_invalid_opc.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/replace_invalid_opc.cpp.o +.PHONY : replace_invalid_opc.cpp.o + +replace_invalid_opc.i: replace_invalid_opc.cpp.i + +.PHONY : replace_invalid_opc.i + +# target to preprocess a source file +replace_invalid_opc.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/replace_invalid_opc.cpp.i +.PHONY : replace_invalid_opc.cpp.i + +replace_invalid_opc.s: replace_invalid_opc.cpp.s + +.PHONY : replace_invalid_opc.s + +# target to generate assembly for a file +replace_invalid_opc.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/replace_invalid_opc.cpp.s +.PHONY : replace_invalid_opc.cpp.s + +scalar_analysis.o: scalar_analysis.cpp.o + +.PHONY : scalar_analysis.o + +# target to build an object file +scalar_analysis.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis.cpp.o +.PHONY : scalar_analysis.cpp.o + +scalar_analysis.i: scalar_analysis.cpp.i + +.PHONY : scalar_analysis.i + +# target to preprocess a source file +scalar_analysis.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis.cpp.i +.PHONY : scalar_analysis.cpp.i + +scalar_analysis.s: scalar_analysis.cpp.s + +.PHONY : scalar_analysis.s + +# target to generate assembly for a file +scalar_analysis.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis.cpp.s +.PHONY : scalar_analysis.cpp.s + +scalar_analysis_simplification.o: scalar_analysis_simplification.cpp.o + +.PHONY : scalar_analysis_simplification.o + +# target to build an object file +scalar_analysis_simplification.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis_simplification.cpp.o +.PHONY : scalar_analysis_simplification.cpp.o + +scalar_analysis_simplification.i: scalar_analysis_simplification.cpp.i + +.PHONY : scalar_analysis_simplification.i + +# target to preprocess a source file +scalar_analysis_simplification.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis_simplification.cpp.i +.PHONY : scalar_analysis_simplification.cpp.i + +scalar_analysis_simplification.s: scalar_analysis_simplification.cpp.s + +.PHONY : scalar_analysis_simplification.s + +# target to generate assembly for a file +scalar_analysis_simplification.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_analysis_simplification.cpp.s +.PHONY : scalar_analysis_simplification.cpp.s + +scalar_replacement_pass.o: scalar_replacement_pass.cpp.o + +.PHONY : scalar_replacement_pass.o + +# target to build an object file +scalar_replacement_pass.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_replacement_pass.cpp.o +.PHONY : scalar_replacement_pass.cpp.o + +scalar_replacement_pass.i: scalar_replacement_pass.cpp.i + +.PHONY : scalar_replacement_pass.i + +# target to preprocess a source file +scalar_replacement_pass.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_replacement_pass.cpp.i +.PHONY : scalar_replacement_pass.cpp.i + +scalar_replacement_pass.s: scalar_replacement_pass.cpp.s + +.PHONY : scalar_replacement_pass.s + +# target to generate assembly for a file +scalar_replacement_pass.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/scalar_replacement_pass.cpp.s +.PHONY : scalar_replacement_pass.cpp.s + +set_spec_constant_default_value_pass.o: set_spec_constant_default_value_pass.cpp.o + +.PHONY : set_spec_constant_default_value_pass.o + +# target to build an object file +set_spec_constant_default_value_pass.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/set_spec_constant_default_value_pass.cpp.o +.PHONY : set_spec_constant_default_value_pass.cpp.o + +set_spec_constant_default_value_pass.i: set_spec_constant_default_value_pass.cpp.i + +.PHONY : set_spec_constant_default_value_pass.i + +# target to preprocess a source file +set_spec_constant_default_value_pass.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/set_spec_constant_default_value_pass.cpp.i +.PHONY : set_spec_constant_default_value_pass.cpp.i + +set_spec_constant_default_value_pass.s: set_spec_constant_default_value_pass.cpp.s + +.PHONY : set_spec_constant_default_value_pass.s + +# target to generate assembly for a file +set_spec_constant_default_value_pass.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/set_spec_constant_default_value_pass.cpp.s +.PHONY : set_spec_constant_default_value_pass.cpp.s + +simplification_pass.o: simplification_pass.cpp.o + +.PHONY : simplification_pass.o + +# target to build an object file +simplification_pass.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/simplification_pass.cpp.o +.PHONY : simplification_pass.cpp.o + +simplification_pass.i: simplification_pass.cpp.i + +.PHONY : simplification_pass.i + +# target to preprocess a source file +simplification_pass.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/simplification_pass.cpp.i +.PHONY : simplification_pass.cpp.i + +simplification_pass.s: simplification_pass.cpp.s + +.PHONY : simplification_pass.s + +# target to generate assembly for a file +simplification_pass.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/simplification_pass.cpp.s +.PHONY : simplification_pass.cpp.s + +ssa_rewrite_pass.o: ssa_rewrite_pass.cpp.o + +.PHONY : ssa_rewrite_pass.o + +# target to build an object file +ssa_rewrite_pass.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ssa_rewrite_pass.cpp.o +.PHONY : ssa_rewrite_pass.cpp.o + +ssa_rewrite_pass.i: ssa_rewrite_pass.cpp.i + +.PHONY : ssa_rewrite_pass.i + +# target to preprocess a source file +ssa_rewrite_pass.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ssa_rewrite_pass.cpp.i +.PHONY : ssa_rewrite_pass.cpp.i + +ssa_rewrite_pass.s: ssa_rewrite_pass.cpp.s + +.PHONY : ssa_rewrite_pass.s + +# target to generate assembly for a file +ssa_rewrite_pass.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/ssa_rewrite_pass.cpp.s +.PHONY : ssa_rewrite_pass.cpp.s + +strength_reduction_pass.o: strength_reduction_pass.cpp.o + +.PHONY : strength_reduction_pass.o + +# target to build an object file +strength_reduction_pass.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strength_reduction_pass.cpp.o +.PHONY : strength_reduction_pass.cpp.o + +strength_reduction_pass.i: strength_reduction_pass.cpp.i + +.PHONY : strength_reduction_pass.i + +# target to preprocess a source file +strength_reduction_pass.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strength_reduction_pass.cpp.i +.PHONY : strength_reduction_pass.cpp.i + +strength_reduction_pass.s: strength_reduction_pass.cpp.s + +.PHONY : strength_reduction_pass.s + +# target to generate assembly for a file +strength_reduction_pass.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strength_reduction_pass.cpp.s +.PHONY : strength_reduction_pass.cpp.s + +strip_debug_info_pass.o: strip_debug_info_pass.cpp.o + +.PHONY : strip_debug_info_pass.o + +# target to build an object file +strip_debug_info_pass.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strip_debug_info_pass.cpp.o +.PHONY : strip_debug_info_pass.cpp.o + +strip_debug_info_pass.i: strip_debug_info_pass.cpp.i + +.PHONY : strip_debug_info_pass.i + +# target to preprocess a source file +strip_debug_info_pass.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strip_debug_info_pass.cpp.i +.PHONY : strip_debug_info_pass.cpp.i + +strip_debug_info_pass.s: strip_debug_info_pass.cpp.s + +.PHONY : strip_debug_info_pass.s + +# target to generate assembly for a file +strip_debug_info_pass.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strip_debug_info_pass.cpp.s +.PHONY : strip_debug_info_pass.cpp.s + +strip_reflect_info_pass.o: strip_reflect_info_pass.cpp.o + +.PHONY : strip_reflect_info_pass.o + +# target to build an object file +strip_reflect_info_pass.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strip_reflect_info_pass.cpp.o +.PHONY : strip_reflect_info_pass.cpp.o + +strip_reflect_info_pass.i: strip_reflect_info_pass.cpp.i + +.PHONY : strip_reflect_info_pass.i + +# target to preprocess a source file +strip_reflect_info_pass.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strip_reflect_info_pass.cpp.i +.PHONY : strip_reflect_info_pass.cpp.i + +strip_reflect_info_pass.s: strip_reflect_info_pass.cpp.s + +.PHONY : strip_reflect_info_pass.s + +# target to generate assembly for a file +strip_reflect_info_pass.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/strip_reflect_info_pass.cpp.s +.PHONY : strip_reflect_info_pass.cpp.s + +struct_cfg_analysis.o: struct_cfg_analysis.cpp.o + +.PHONY : struct_cfg_analysis.o + +# target to build an object file +struct_cfg_analysis.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/struct_cfg_analysis.cpp.o +.PHONY : struct_cfg_analysis.cpp.o + +struct_cfg_analysis.i: struct_cfg_analysis.cpp.i + +.PHONY : struct_cfg_analysis.i + +# target to preprocess a source file +struct_cfg_analysis.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/struct_cfg_analysis.cpp.i +.PHONY : struct_cfg_analysis.cpp.i + +struct_cfg_analysis.s: struct_cfg_analysis.cpp.s + +.PHONY : struct_cfg_analysis.s + +# target to generate assembly for a file +struct_cfg_analysis.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/struct_cfg_analysis.cpp.s +.PHONY : struct_cfg_analysis.cpp.s + +type_manager.o: type_manager.cpp.o + +.PHONY : type_manager.o + +# target to build an object file +type_manager.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/type_manager.cpp.o +.PHONY : type_manager.cpp.o + +type_manager.i: type_manager.cpp.i + +.PHONY : type_manager.i + +# target to preprocess a source file +type_manager.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/type_manager.cpp.i +.PHONY : type_manager.cpp.i + +type_manager.s: type_manager.cpp.s + +.PHONY : type_manager.s + +# target to generate assembly for a file +type_manager.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/type_manager.cpp.s +.PHONY : type_manager.cpp.s + +types.o: types.cpp.o + +.PHONY : types.o + +# target to build an object file +types.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/types.cpp.o +.PHONY : types.cpp.o + +types.i: types.cpp.i + +.PHONY : types.i + +# target to preprocess a source file +types.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/types.cpp.i +.PHONY : types.cpp.i + +types.s: types.cpp.s + +.PHONY : types.s + +# target to generate assembly for a file +types.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/types.cpp.s +.PHONY : types.cpp.s + +unify_const_pass.o: unify_const_pass.cpp.o + +.PHONY : unify_const_pass.o + +# target to build an object file +unify_const_pass.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/unify_const_pass.cpp.o +.PHONY : unify_const_pass.cpp.o + +unify_const_pass.i: unify_const_pass.cpp.i + +.PHONY : unify_const_pass.i + +# target to preprocess a source file +unify_const_pass.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/unify_const_pass.cpp.i +.PHONY : unify_const_pass.cpp.i + +unify_const_pass.s: unify_const_pass.cpp.s + +.PHONY : unify_const_pass.s + +# target to generate assembly for a file +unify_const_pass.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/unify_const_pass.cpp.s +.PHONY : unify_const_pass.cpp.s + +value_number_table.o: value_number_table.cpp.o + +.PHONY : value_number_table.o + +# target to build an object file +value_number_table.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/value_number_table.cpp.o +.PHONY : value_number_table.cpp.o + +value_number_table.i: value_number_table.cpp.i + +.PHONY : value_number_table.i + +# target to preprocess a source file +value_number_table.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/value_number_table.cpp.i +.PHONY : value_number_table.cpp.i + +value_number_table.s: value_number_table.cpp.s + +.PHONY : value_number_table.s + +# target to generate assembly for a file +value_number_table.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/value_number_table.cpp.s +.PHONY : value_number_table.cpp.s + +vector_dce.o: vector_dce.cpp.o + +.PHONY : vector_dce.o + +# target to build an object file +vector_dce.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/vector_dce.cpp.o +.PHONY : vector_dce.cpp.o + +vector_dce.i: vector_dce.cpp.i + +.PHONY : vector_dce.i + +# target to preprocess a source file +vector_dce.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/vector_dce.cpp.i +.PHONY : vector_dce.cpp.i + +vector_dce.s: vector_dce.cpp.s + +.PHONY : vector_dce.s + +# target to generate assembly for a file +vector_dce.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/vector_dce.cpp.s +.PHONY : vector_dce.cpp.s + +workaround1209.o: workaround1209.cpp.o + +.PHONY : workaround1209.o + +# target to build an object file +workaround1209.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/workaround1209.cpp.o +.PHONY : workaround1209.cpp.o + +workaround1209.i: workaround1209.cpp.i + +.PHONY : workaround1209.i + +# target to preprocess a source file +workaround1209.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/workaround1209.cpp.i +.PHONY : workaround1209.cpp.i + +workaround1209.s: workaround1209.cpp.s + +.PHONY : workaround1209.s + +# target to generate assembly for a file +workaround1209.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f source/opt/CMakeFiles/SPIRV-Tools-opt.dir/build.make source/opt/CMakeFiles/SPIRV-Tools-opt.dir/workaround1209.cpp.s +.PHONY : workaround1209.cpp.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... install" + @echo "... rebuild_cache" + @echo "... install/strip" + @echo "... SPIRV-Tools-opt" + @echo "... list_install_components" + @echo "... test" + @echo "... install/local" + @echo "... edit_cache" + @echo "... aggressive_dead_code_elim_pass.o" + @echo "... aggressive_dead_code_elim_pass.i" + @echo "... aggressive_dead_code_elim_pass.s" + @echo "... basic_block.o" + @echo "... basic_block.i" + @echo "... basic_block.s" + @echo "... block_merge_pass.o" + @echo "... block_merge_pass.i" + @echo "... block_merge_pass.s" + @echo "... build_module.o" + @echo "... build_module.i" + @echo "... build_module.s" + @echo "... ccp_pass.o" + @echo "... ccp_pass.i" + @echo "... ccp_pass.s" + @echo "... cfg.o" + @echo "... cfg.i" + @echo "... cfg.s" + @echo "... cfg_cleanup_pass.o" + @echo "... cfg_cleanup_pass.i" + @echo "... cfg_cleanup_pass.s" + @echo "... combine_access_chains.o" + @echo "... combine_access_chains.i" + @echo "... combine_access_chains.s" + @echo "... common_uniform_elim_pass.o" + @echo "... common_uniform_elim_pass.i" + @echo "... common_uniform_elim_pass.s" + @echo "... compact_ids_pass.o" + @echo "... compact_ids_pass.i" + @echo "... compact_ids_pass.s" + @echo "... composite.o" + @echo "... composite.i" + @echo "... composite.s" + @echo "... const_folding_rules.o" + @echo "... const_folding_rules.i" + @echo "... const_folding_rules.s" + @echo "... constants.o" + @echo "... constants.i" + @echo "... constants.s" + @echo "... copy_prop_arrays.o" + @echo "... copy_prop_arrays.i" + @echo "... copy_prop_arrays.s" + @echo "... dead_branch_elim_pass.o" + @echo "... dead_branch_elim_pass.i" + @echo "... dead_branch_elim_pass.s" + @echo "... dead_insert_elim_pass.o" + @echo "... dead_insert_elim_pass.i" + @echo "... dead_insert_elim_pass.s" + @echo "... dead_variable_elimination.o" + @echo "... dead_variable_elimination.i" + @echo "... dead_variable_elimination.s" + @echo "... decoration_manager.o" + @echo "... decoration_manager.i" + @echo "... decoration_manager.s" + @echo "... def_use_manager.o" + @echo "... def_use_manager.i" + @echo "... def_use_manager.s" + @echo "... dominator_analysis.o" + @echo "... dominator_analysis.i" + @echo "... dominator_analysis.s" + @echo "... dominator_tree.o" + @echo "... dominator_tree.i" + @echo "... dominator_tree.s" + @echo "... eliminate_dead_constant_pass.o" + @echo "... eliminate_dead_constant_pass.i" + @echo "... eliminate_dead_constant_pass.s" + @echo "... eliminate_dead_functions_pass.o" + @echo "... eliminate_dead_functions_pass.i" + @echo "... eliminate_dead_functions_pass.s" + @echo "... feature_manager.o" + @echo "... feature_manager.i" + @echo "... feature_manager.s" + @echo "... flatten_decoration_pass.o" + @echo "... flatten_decoration_pass.i" + @echo "... flatten_decoration_pass.s" + @echo "... fold.o" + @echo "... fold.i" + @echo "... fold.s" + @echo "... fold_spec_constant_op_and_composite_pass.o" + @echo "... fold_spec_constant_op_and_composite_pass.i" + @echo "... fold_spec_constant_op_and_composite_pass.s" + @echo "... folding_rules.o" + @echo "... folding_rules.i" + @echo "... folding_rules.s" + @echo "... freeze_spec_constant_value_pass.o" + @echo "... freeze_spec_constant_value_pass.i" + @echo "... freeze_spec_constant_value_pass.s" + @echo "... function.o" + @echo "... function.i" + @echo "... function.s" + @echo "... if_conversion.o" + @echo "... if_conversion.i" + @echo "... if_conversion.s" + @echo "... inline_exhaustive_pass.o" + @echo "... inline_exhaustive_pass.i" + @echo "... inline_exhaustive_pass.s" + @echo "... inline_opaque_pass.o" + @echo "... inline_opaque_pass.i" + @echo "... inline_opaque_pass.s" + @echo "... inline_pass.o" + @echo "... inline_pass.i" + @echo "... inline_pass.s" + @echo "... instruction.o" + @echo "... instruction.i" + @echo "... instruction.s" + @echo "... instruction_list.o" + @echo "... instruction_list.i" + @echo "... instruction_list.s" + @echo "... ir_context.o" + @echo "... ir_context.i" + @echo "... ir_context.s" + @echo "... ir_loader.o" + @echo "... ir_loader.i" + @echo "... ir_loader.s" + @echo "... licm_pass.o" + @echo "... licm_pass.i" + @echo "... licm_pass.s" + @echo "... local_access_chain_convert_pass.o" + @echo "... local_access_chain_convert_pass.i" + @echo "... local_access_chain_convert_pass.s" + @echo "... local_redundancy_elimination.o" + @echo "... local_redundancy_elimination.i" + @echo "... local_redundancy_elimination.s" + @echo "... local_single_block_elim_pass.o" + @echo "... local_single_block_elim_pass.i" + @echo "... local_single_block_elim_pass.s" + @echo "... local_single_store_elim_pass.o" + @echo "... local_single_store_elim_pass.i" + @echo "... local_single_store_elim_pass.s" + @echo "... local_ssa_elim_pass.o" + @echo "... local_ssa_elim_pass.i" + @echo "... local_ssa_elim_pass.s" + @echo "... loop_dependence.o" + @echo "... loop_dependence.i" + @echo "... loop_dependence.s" + @echo "... loop_dependence_helpers.o" + @echo "... loop_dependence_helpers.i" + @echo "... loop_dependence_helpers.s" + @echo "... loop_descriptor.o" + @echo "... loop_descriptor.i" + @echo "... loop_descriptor.s" + @echo "... loop_fission.o" + @echo "... loop_fission.i" + @echo "... loop_fission.s" + @echo "... loop_fusion.o" + @echo "... loop_fusion.i" + @echo "... loop_fusion.s" + @echo "... loop_fusion_pass.o" + @echo "... loop_fusion_pass.i" + @echo "... loop_fusion_pass.s" + @echo "... loop_peeling.o" + @echo "... loop_peeling.i" + @echo "... loop_peeling.s" + @echo "... loop_unroller.o" + @echo "... loop_unroller.i" + @echo "... loop_unroller.s" + @echo "... loop_unswitch_pass.o" + @echo "... loop_unswitch_pass.i" + @echo "... loop_unswitch_pass.s" + @echo "... loop_utils.o" + @echo "... loop_utils.i" + @echo "... loop_utils.s" + @echo "... mem_pass.o" + @echo "... mem_pass.i" + @echo "... mem_pass.s" + @echo "... merge_return_pass.o" + @echo "... merge_return_pass.i" + @echo "... merge_return_pass.s" + @echo "... module.o" + @echo "... module.i" + @echo "... module.s" + @echo "... optimizer.o" + @echo "... optimizer.i" + @echo "... optimizer.s" + @echo "... pass.o" + @echo "... pass.i" + @echo "... pass.s" + @echo "... pass_manager.o" + @echo "... pass_manager.i" + @echo "... pass_manager.s" + @echo "... private_to_local_pass.o" + @echo "... private_to_local_pass.i" + @echo "... private_to_local_pass.s" + @echo "... propagator.o" + @echo "... propagator.i" + @echo "... propagator.s" + @echo "... reduce_load_size.o" + @echo "... reduce_load_size.i" + @echo "... reduce_load_size.s" + @echo "... redundancy_elimination.o" + @echo "... redundancy_elimination.i" + @echo "... redundancy_elimination.s" + @echo "... register_pressure.o" + @echo "... register_pressure.i" + @echo "... register_pressure.s" + @echo "... remove_duplicates_pass.o" + @echo "... remove_duplicates_pass.i" + @echo "... remove_duplicates_pass.s" + @echo "... replace_invalid_opc.o" + @echo "... replace_invalid_opc.i" + @echo "... replace_invalid_opc.s" + @echo "... scalar_analysis.o" + @echo "... scalar_analysis.i" + @echo "... scalar_analysis.s" + @echo "... scalar_analysis_simplification.o" + @echo "... scalar_analysis_simplification.i" + @echo "... scalar_analysis_simplification.s" + @echo "... scalar_replacement_pass.o" + @echo "... scalar_replacement_pass.i" + @echo "... scalar_replacement_pass.s" + @echo "... set_spec_constant_default_value_pass.o" + @echo "... set_spec_constant_default_value_pass.i" + @echo "... set_spec_constant_default_value_pass.s" + @echo "... simplification_pass.o" + @echo "... simplification_pass.i" + @echo "... simplification_pass.s" + @echo "... ssa_rewrite_pass.o" + @echo "... ssa_rewrite_pass.i" + @echo "... ssa_rewrite_pass.s" + @echo "... strength_reduction_pass.o" + @echo "... strength_reduction_pass.i" + @echo "... strength_reduction_pass.s" + @echo "... strip_debug_info_pass.o" + @echo "... strip_debug_info_pass.i" + @echo "... strip_debug_info_pass.s" + @echo "... strip_reflect_info_pass.o" + @echo "... strip_reflect_info_pass.i" + @echo "... strip_reflect_info_pass.s" + @echo "... struct_cfg_analysis.o" + @echo "... struct_cfg_analysis.i" + @echo "... struct_cfg_analysis.s" + @echo "... type_manager.o" + @echo "... type_manager.i" + @echo "... type_manager.s" + @echo "... types.o" + @echo "... types.i" + @echo "... types.s" + @echo "... unify_const_pass.o" + @echo "... unify_const_pass.i" + @echo "... unify_const_pass.s" + @echo "... value_number_table.o" + @echo "... value_number_table.i" + @echo "... value_number_table.s" + @echo "... vector_dce.o" + @echo "... vector_dce.i" + @echo "... vector_dce.s" + @echo "... workaround1209.o" + @echo "... workaround1209.i" + @echo "... workaround1209.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/3rdparty/spirv-tools/build/source/opt/cmake_install.cmake b/3rdparty/spirv-tools/build/source/opt/cmake_install.cmake new file mode 100644 index 000000000..d087949f8 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/opt/cmake_install.cmake @@ -0,0 +1,38 @@ +# Install script for directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/source/opt + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Debug") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "1") +endif() + +if(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" TYPE STATIC_LIBRARY FILES "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/libSPIRV-Tools-opt.a") +endif() + diff --git a/3rdparty/spirv-tools/build/spv-amd-gcn-shader.insts.inc b/3rdparty/spirv-tools/build/spv-amd-gcn-shader.insts.inc new file mode 100644 index 000000000..48f7f4768 --- /dev/null +++ b/3rdparty/spirv-tools/build/spv-amd-gcn-shader.insts.inc @@ -0,0 +1,7 @@ + + +static const spv_ext_inst_desc_t spv_amd_gcn_shader_entries[] = { + {"CubeFaceIndexAMD", 1, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"CubeFaceCoordAMD", 2, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"TimeAMD", 3, 0, nullptr, {SPV_OPERAND_TYPE_NONE}} +}; diff --git a/3rdparty/spirv-tools/build/spv-amd-shader-ballot.insts.inc b/3rdparty/spirv-tools/build/spv-amd-shader-ballot.insts.inc new file mode 100644 index 000000000..6216051b9 --- /dev/null +++ b/3rdparty/spirv-tools/build/spv-amd-shader-ballot.insts.inc @@ -0,0 +1,8 @@ + + +static const spv_ext_inst_desc_t spv_amd_shader_ballot_entries[] = { + {"SwizzleInvocationsAMD", 1, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"SwizzleInvocationsMaskedAMD", 2, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"WriteInvocationAMD", 3, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"MbcntAMD", 4, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}} +}; diff --git a/3rdparty/spirv-tools/build/spv-amd-shader-explicit-vertex-parameter.insts.inc b/3rdparty/spirv-tools/build/spv-amd-shader-explicit-vertex-parameter.insts.inc new file mode 100644 index 000000000..6b612854f --- /dev/null +++ b/3rdparty/spirv-tools/build/spv-amd-shader-explicit-vertex-parameter.insts.inc @@ -0,0 +1,5 @@ + + +static const spv_ext_inst_desc_t spv_amd_shader_explicit_vertex_parameter_entries[] = { + {"InterpolateAtVertexAMD", 1, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}} +}; diff --git a/3rdparty/spirv-tools/build/spv-amd-shader-trinary-minmax.insts.inc b/3rdparty/spirv-tools/build/spv-amd-shader-trinary-minmax.insts.inc new file mode 100644 index 000000000..061e862a4 --- /dev/null +++ b/3rdparty/spirv-tools/build/spv-amd-shader-trinary-minmax.insts.inc @@ -0,0 +1,13 @@ + + +static const spv_ext_inst_desc_t spv_amd_shader_trinary_minmax_entries[] = { + {"FMin3AMD", 1, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"UMin3AMD", 2, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"SMin3AMD", 3, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"FMax3AMD", 4, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"UMax3AMD", 5, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"SMax3AMD", 6, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"FMid3AMD", 7, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"UMid3AMD", 8, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}}, + {"SMid3AMD", 9, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_NONE}} +}; diff --git a/3rdparty/spirv-tools/build/test/CMakeFiles/CMakeDirectoryInformation.cmake b/3rdparty/spirv-tools/build/test/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 000000000..b636c3f88 --- /dev/null +++ b/3rdparty/spirv-tools/build/test/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/bkaradzic/Private/projects/_github/SPIRV-Tools") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/3rdparty/spirv-tools/build/test/CMakeFiles/progress.marks b/3rdparty/spirv-tools/build/test/CMakeFiles/progress.marks new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/3rdparty/spirv-tools/build/test/CMakeFiles/progress.marks @@ -0,0 +1 @@ +0 diff --git a/3rdparty/spirv-tools/build/test/CTestTestfile.cmake b/3rdparty/spirv-tools/build/test/CTestTestfile.cmake new file mode 100644 index 000000000..e2bfe247d --- /dev/null +++ b/3rdparty/spirv-tools/build/test/CTestTestfile.cmake @@ -0,0 +1,13 @@ +# CMake generated Testfile for +# Source directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/test +# Build directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. +subdirs(comp) +subdirs(link) +subdirs(opt) +subdirs(stats) +subdirs(tools) +subdirs(util) +subdirs(val) diff --git a/3rdparty/spirv-tools/build/test/Makefile b/3rdparty/spirv-tools/build/test/Makefile new file mode 100644 index 000000000..3e96e0e27 --- /dev/null +++ b/3rdparty/spirv-tools/build/test/Makefile @@ -0,0 +1,194 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Default target executed when no arguments are given to make. +default_target: all + +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..." + /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache + +.PHONY : edit_cache/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: install/strip + +.PHONY : install/strip/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Available install components are: \"Unspecified\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components + +.PHONY : list_install_components/fast + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running tests..." + /usr/bin/ctest --force-new-ctest-process $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test + +.PHONY : test/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: install/local + +.PHONY : install/local/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache + +.PHONY : rebuild_cache/fast + +# The main all target +all: cmake_check_build_system + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/CMakeFiles/progress.marks + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 test/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 test/clean +.PHONY : clean + +# The main clean target +clean/fast: clean + +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 test/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 test/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... install" + @echo "... edit_cache" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... test" + @echo "... install/local" + @echo "... rebuild_cache" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/3rdparty/spirv-tools/build/test/cmake_install.cmake b/3rdparty/spirv-tools/build/test/cmake_install.cmake new file mode 100644 index 000000000..248c82ae6 --- /dev/null +++ b/3rdparty/spirv-tools/build/test/cmake_install.cmake @@ -0,0 +1,46 @@ +# Install script for directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/test + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Debug") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "1") +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + # Include the install script for each subdirectory. + include("/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/comp/cmake_install.cmake") + include("/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/link/cmake_install.cmake") + include("/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/opt/cmake_install.cmake") + include("/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/stats/cmake_install.cmake") + include("/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/tools/cmake_install.cmake") + include("/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/util/cmake_install.cmake") + include("/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/val/cmake_install.cmake") + +endif() + diff --git a/3rdparty/spirv-tools/build/test/comp/CMakeFiles/CMakeDirectoryInformation.cmake b/3rdparty/spirv-tools/build/test/comp/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 000000000..b636c3f88 --- /dev/null +++ b/3rdparty/spirv-tools/build/test/comp/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/bkaradzic/Private/projects/_github/SPIRV-Tools") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/3rdparty/spirv-tools/build/test/comp/CMakeFiles/progress.marks b/3rdparty/spirv-tools/build/test/comp/CMakeFiles/progress.marks new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/3rdparty/spirv-tools/build/test/comp/CMakeFiles/progress.marks @@ -0,0 +1 @@ +0 diff --git a/3rdparty/spirv-tools/build/test/comp/CTestTestfile.cmake b/3rdparty/spirv-tools/build/test/comp/CTestTestfile.cmake new file mode 100644 index 000000000..898809b6f --- /dev/null +++ b/3rdparty/spirv-tools/build/test/comp/CTestTestfile.cmake @@ -0,0 +1,6 @@ +# CMake generated Testfile for +# Source directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/test/comp +# Build directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/comp +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. diff --git a/3rdparty/spirv-tools/build/test/comp/Makefile b/3rdparty/spirv-tools/build/test/comp/Makefile new file mode 100644 index 000000000..5dc79343e --- /dev/null +++ b/3rdparty/spirv-tools/build/test/comp/Makefile @@ -0,0 +1,194 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Default target executed when no arguments are given to make. +default_target: all + +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..." + /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache + +.PHONY : edit_cache/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: install/strip + +.PHONY : install/strip/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Available install components are: \"Unspecified\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components + +.PHONY : list_install_components/fast + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running tests..." + /usr/bin/ctest --force-new-ctest-process $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test + +.PHONY : test/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: install/local + +.PHONY : install/local/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache + +.PHONY : rebuild_cache/fast + +# The main all target +all: cmake_check_build_system + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/comp/CMakeFiles/progress.marks + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 test/comp/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 test/comp/clean +.PHONY : clean + +# The main clean target +clean/fast: clean + +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 test/comp/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 test/comp/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... install" + @echo "... edit_cache" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... test" + @echo "... install/local" + @echo "... rebuild_cache" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/3rdparty/spirv-tools/build/test/comp/cmake_install.cmake b/3rdparty/spirv-tools/build/test/comp/cmake_install.cmake new file mode 100644 index 000000000..1ec0190d6 --- /dev/null +++ b/3rdparty/spirv-tools/build/test/comp/cmake_install.cmake @@ -0,0 +1,34 @@ +# Install script for directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/test/comp + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Debug") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "1") +endif() + diff --git a/3rdparty/spirv-tools/build/test/link/CMakeFiles/CMakeDirectoryInformation.cmake b/3rdparty/spirv-tools/build/test/link/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 000000000..b636c3f88 --- /dev/null +++ b/3rdparty/spirv-tools/build/test/link/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/bkaradzic/Private/projects/_github/SPIRV-Tools") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/3rdparty/spirv-tools/build/test/link/CMakeFiles/progress.marks b/3rdparty/spirv-tools/build/test/link/CMakeFiles/progress.marks new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/3rdparty/spirv-tools/build/test/link/CMakeFiles/progress.marks @@ -0,0 +1 @@ +0 diff --git a/3rdparty/spirv-tools/build/test/link/CTestTestfile.cmake b/3rdparty/spirv-tools/build/test/link/CTestTestfile.cmake new file mode 100644 index 000000000..1d0f6524f --- /dev/null +++ b/3rdparty/spirv-tools/build/test/link/CTestTestfile.cmake @@ -0,0 +1,6 @@ +# CMake generated Testfile for +# Source directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/test/link +# Build directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/link +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. diff --git a/3rdparty/spirv-tools/build/test/link/Makefile b/3rdparty/spirv-tools/build/test/link/Makefile new file mode 100644 index 000000000..ee6adc8a5 --- /dev/null +++ b/3rdparty/spirv-tools/build/test/link/Makefile @@ -0,0 +1,194 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Default target executed when no arguments are given to make. +default_target: all + +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..." + /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache + +.PHONY : edit_cache/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: install/strip + +.PHONY : install/strip/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Available install components are: \"Unspecified\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components + +.PHONY : list_install_components/fast + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running tests..." + /usr/bin/ctest --force-new-ctest-process $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test + +.PHONY : test/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: install/local + +.PHONY : install/local/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache + +.PHONY : rebuild_cache/fast + +# The main all target +all: cmake_check_build_system + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/link/CMakeFiles/progress.marks + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 test/link/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 test/link/clean +.PHONY : clean + +# The main clean target +clean/fast: clean + +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 test/link/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 test/link/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... install" + @echo "... edit_cache" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... test" + @echo "... install/local" + @echo "... rebuild_cache" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/3rdparty/spirv-tools/build/test/link/cmake_install.cmake b/3rdparty/spirv-tools/build/test/link/cmake_install.cmake new file mode 100644 index 000000000..06ba83171 --- /dev/null +++ b/3rdparty/spirv-tools/build/test/link/cmake_install.cmake @@ -0,0 +1,34 @@ +# Install script for directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/test/link + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Debug") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "1") +endif() + diff --git a/3rdparty/spirv-tools/build/test/opt/CMakeFiles/CMakeDirectoryInformation.cmake b/3rdparty/spirv-tools/build/test/opt/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 000000000..b636c3f88 --- /dev/null +++ b/3rdparty/spirv-tools/build/test/opt/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/bkaradzic/Private/projects/_github/SPIRV-Tools") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/3rdparty/spirv-tools/build/test/opt/CMakeFiles/progress.marks b/3rdparty/spirv-tools/build/test/opt/CMakeFiles/progress.marks new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/3rdparty/spirv-tools/build/test/opt/CMakeFiles/progress.marks @@ -0,0 +1 @@ +0 diff --git a/3rdparty/spirv-tools/build/test/opt/CTestTestfile.cmake b/3rdparty/spirv-tools/build/test/opt/CTestTestfile.cmake new file mode 100644 index 000000000..40bdaf8a5 --- /dev/null +++ b/3rdparty/spirv-tools/build/test/opt/CTestTestfile.cmake @@ -0,0 +1,8 @@ +# CMake generated Testfile for +# Source directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/test/opt +# Build directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/opt +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. +subdirs(dominator_tree) +subdirs(loop_optimizations) diff --git a/3rdparty/spirv-tools/build/test/opt/Makefile b/3rdparty/spirv-tools/build/test/opt/Makefile new file mode 100644 index 000000000..35f310571 --- /dev/null +++ b/3rdparty/spirv-tools/build/test/opt/Makefile @@ -0,0 +1,194 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Default target executed when no arguments are given to make. +default_target: all + +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..." + /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache + +.PHONY : edit_cache/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: install/strip + +.PHONY : install/strip/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Available install components are: \"Unspecified\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components + +.PHONY : list_install_components/fast + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running tests..." + /usr/bin/ctest --force-new-ctest-process $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test + +.PHONY : test/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: install/local + +.PHONY : install/local/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache + +.PHONY : rebuild_cache/fast + +# The main all target +all: cmake_check_build_system + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/opt/CMakeFiles/progress.marks + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 test/opt/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 test/opt/clean +.PHONY : clean + +# The main clean target +clean/fast: clean + +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 test/opt/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 test/opt/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... install" + @echo "... edit_cache" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... test" + @echo "... install/local" + @echo "... rebuild_cache" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/3rdparty/spirv-tools/build/test/opt/cmake_install.cmake b/3rdparty/spirv-tools/build/test/opt/cmake_install.cmake new file mode 100644 index 000000000..3782e886e --- /dev/null +++ b/3rdparty/spirv-tools/build/test/opt/cmake_install.cmake @@ -0,0 +1,41 @@ +# Install script for directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/test/opt + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Debug") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "1") +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + # Include the install script for each subdirectory. + include("/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/opt/dominator_tree/cmake_install.cmake") + include("/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/opt/loop_optimizations/cmake_install.cmake") + +endif() + diff --git a/3rdparty/spirv-tools/build/test/opt/dominator_tree/CMakeFiles/CMakeDirectoryInformation.cmake b/3rdparty/spirv-tools/build/test/opt/dominator_tree/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 000000000..b636c3f88 --- /dev/null +++ b/3rdparty/spirv-tools/build/test/opt/dominator_tree/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/bkaradzic/Private/projects/_github/SPIRV-Tools") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/3rdparty/spirv-tools/build/test/opt/dominator_tree/CMakeFiles/progress.marks b/3rdparty/spirv-tools/build/test/opt/dominator_tree/CMakeFiles/progress.marks new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/3rdparty/spirv-tools/build/test/opt/dominator_tree/CMakeFiles/progress.marks @@ -0,0 +1 @@ +0 diff --git a/3rdparty/spirv-tools/build/test/opt/dominator_tree/CTestTestfile.cmake b/3rdparty/spirv-tools/build/test/opt/dominator_tree/CTestTestfile.cmake new file mode 100644 index 000000000..2551491a5 --- /dev/null +++ b/3rdparty/spirv-tools/build/test/opt/dominator_tree/CTestTestfile.cmake @@ -0,0 +1,6 @@ +# CMake generated Testfile for +# Source directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/test/opt/dominator_tree +# Build directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/opt/dominator_tree +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. diff --git a/3rdparty/spirv-tools/build/test/opt/dominator_tree/Makefile b/3rdparty/spirv-tools/build/test/opt/dominator_tree/Makefile new file mode 100644 index 000000000..e6612fc2a --- /dev/null +++ b/3rdparty/spirv-tools/build/test/opt/dominator_tree/Makefile @@ -0,0 +1,194 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Default target executed when no arguments are given to make. +default_target: all + +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..." + /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache + +.PHONY : edit_cache/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: install/strip + +.PHONY : install/strip/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Available install components are: \"Unspecified\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components + +.PHONY : list_install_components/fast + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running tests..." + /usr/bin/ctest --force-new-ctest-process $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test + +.PHONY : test/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: install/local + +.PHONY : install/local/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache + +.PHONY : rebuild_cache/fast + +# The main all target +all: cmake_check_build_system + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/opt/dominator_tree/CMakeFiles/progress.marks + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 test/opt/dominator_tree/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 test/opt/dominator_tree/clean +.PHONY : clean + +# The main clean target +clean/fast: clean + +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 test/opt/dominator_tree/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 test/opt/dominator_tree/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... install" + @echo "... edit_cache" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... test" + @echo "... install/local" + @echo "... rebuild_cache" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/3rdparty/spirv-tools/build/test/opt/dominator_tree/cmake_install.cmake b/3rdparty/spirv-tools/build/test/opt/dominator_tree/cmake_install.cmake new file mode 100644 index 000000000..6d6125c23 --- /dev/null +++ b/3rdparty/spirv-tools/build/test/opt/dominator_tree/cmake_install.cmake @@ -0,0 +1,34 @@ +# Install script for directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/test/opt/dominator_tree + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Debug") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "1") +endif() + diff --git a/3rdparty/spirv-tools/build/test/opt/loop_optimizations/CMakeFiles/CMakeDirectoryInformation.cmake b/3rdparty/spirv-tools/build/test/opt/loop_optimizations/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 000000000..b636c3f88 --- /dev/null +++ b/3rdparty/spirv-tools/build/test/opt/loop_optimizations/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/bkaradzic/Private/projects/_github/SPIRV-Tools") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/3rdparty/spirv-tools/build/test/opt/loop_optimizations/CMakeFiles/progress.marks b/3rdparty/spirv-tools/build/test/opt/loop_optimizations/CMakeFiles/progress.marks new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/3rdparty/spirv-tools/build/test/opt/loop_optimizations/CMakeFiles/progress.marks @@ -0,0 +1 @@ +0 diff --git a/3rdparty/spirv-tools/build/test/opt/loop_optimizations/CTestTestfile.cmake b/3rdparty/spirv-tools/build/test/opt/loop_optimizations/CTestTestfile.cmake new file mode 100644 index 000000000..d1cdd2771 --- /dev/null +++ b/3rdparty/spirv-tools/build/test/opt/loop_optimizations/CTestTestfile.cmake @@ -0,0 +1,6 @@ +# CMake generated Testfile for +# Source directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/test/opt/loop_optimizations +# Build directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/opt/loop_optimizations +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. diff --git a/3rdparty/spirv-tools/build/test/opt/loop_optimizations/Makefile b/3rdparty/spirv-tools/build/test/opt/loop_optimizations/Makefile new file mode 100644 index 000000000..fe7c457f0 --- /dev/null +++ b/3rdparty/spirv-tools/build/test/opt/loop_optimizations/Makefile @@ -0,0 +1,194 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Default target executed when no arguments are given to make. +default_target: all + +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..." + /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache + +.PHONY : edit_cache/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: install/strip + +.PHONY : install/strip/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Available install components are: \"Unspecified\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components + +.PHONY : list_install_components/fast + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running tests..." + /usr/bin/ctest --force-new-ctest-process $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test + +.PHONY : test/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: install/local + +.PHONY : install/local/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache + +.PHONY : rebuild_cache/fast + +# The main all target +all: cmake_check_build_system + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/opt/loop_optimizations/CMakeFiles/progress.marks + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 test/opt/loop_optimizations/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 test/opt/loop_optimizations/clean +.PHONY : clean + +# The main clean target +clean/fast: clean + +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 test/opt/loop_optimizations/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 test/opt/loop_optimizations/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... install" + @echo "... edit_cache" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... test" + @echo "... install/local" + @echo "... rebuild_cache" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/3rdparty/spirv-tools/build/test/opt/loop_optimizations/cmake_install.cmake b/3rdparty/spirv-tools/build/test/opt/loop_optimizations/cmake_install.cmake new file mode 100644 index 000000000..efef8eb29 --- /dev/null +++ b/3rdparty/spirv-tools/build/test/opt/loop_optimizations/cmake_install.cmake @@ -0,0 +1,34 @@ +# Install script for directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/test/opt/loop_optimizations + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Debug") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "1") +endif() + diff --git a/3rdparty/spirv-tools/build/test/stats/CMakeFiles/CMakeDirectoryInformation.cmake b/3rdparty/spirv-tools/build/test/stats/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 000000000..b636c3f88 --- /dev/null +++ b/3rdparty/spirv-tools/build/test/stats/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/bkaradzic/Private/projects/_github/SPIRV-Tools") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/3rdparty/spirv-tools/build/test/stats/CMakeFiles/progress.marks b/3rdparty/spirv-tools/build/test/stats/CMakeFiles/progress.marks new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/3rdparty/spirv-tools/build/test/stats/CMakeFiles/progress.marks @@ -0,0 +1 @@ +0 diff --git a/3rdparty/spirv-tools/build/test/stats/CTestTestfile.cmake b/3rdparty/spirv-tools/build/test/stats/CTestTestfile.cmake new file mode 100644 index 000000000..d1cd0b5b3 --- /dev/null +++ b/3rdparty/spirv-tools/build/test/stats/CTestTestfile.cmake @@ -0,0 +1,6 @@ +# CMake generated Testfile for +# Source directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/test/stats +# Build directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/stats +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. diff --git a/3rdparty/spirv-tools/build/test/stats/Makefile b/3rdparty/spirv-tools/build/test/stats/Makefile new file mode 100644 index 000000000..f4ec097ec --- /dev/null +++ b/3rdparty/spirv-tools/build/test/stats/Makefile @@ -0,0 +1,194 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Default target executed when no arguments are given to make. +default_target: all + +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..." + /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache + +.PHONY : edit_cache/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: install/strip + +.PHONY : install/strip/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Available install components are: \"Unspecified\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components + +.PHONY : list_install_components/fast + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running tests..." + /usr/bin/ctest --force-new-ctest-process $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test + +.PHONY : test/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: install/local + +.PHONY : install/local/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache + +.PHONY : rebuild_cache/fast + +# The main all target +all: cmake_check_build_system + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/stats/CMakeFiles/progress.marks + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 test/stats/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 test/stats/clean +.PHONY : clean + +# The main clean target +clean/fast: clean + +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 test/stats/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 test/stats/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... install" + @echo "... edit_cache" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... test" + @echo "... install/local" + @echo "... rebuild_cache" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/3rdparty/spirv-tools/build/test/stats/cmake_install.cmake b/3rdparty/spirv-tools/build/test/stats/cmake_install.cmake new file mode 100644 index 000000000..628487f90 --- /dev/null +++ b/3rdparty/spirv-tools/build/test/stats/cmake_install.cmake @@ -0,0 +1,34 @@ +# Install script for directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/test/stats + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Debug") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "1") +endif() + diff --git a/3rdparty/spirv-tools/build/test/tools/CMakeFiles/CMakeDirectoryInformation.cmake b/3rdparty/spirv-tools/build/test/tools/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 000000000..b636c3f88 --- /dev/null +++ b/3rdparty/spirv-tools/build/test/tools/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/bkaradzic/Private/projects/_github/SPIRV-Tools") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/3rdparty/spirv-tools/build/test/tools/CMakeFiles/progress.marks b/3rdparty/spirv-tools/build/test/tools/CMakeFiles/progress.marks new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/3rdparty/spirv-tools/build/test/tools/CMakeFiles/progress.marks @@ -0,0 +1 @@ +0 diff --git a/3rdparty/spirv-tools/build/test/tools/CTestTestfile.cmake b/3rdparty/spirv-tools/build/test/tools/CTestTestfile.cmake new file mode 100644 index 000000000..03fc8ca3a --- /dev/null +++ b/3rdparty/spirv-tools/build/test/tools/CTestTestfile.cmake @@ -0,0 +1,7 @@ +# CMake generated Testfile for +# Source directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/test/tools +# Build directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/tools +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. +subdirs(opt) diff --git a/3rdparty/spirv-tools/build/test/tools/Makefile b/3rdparty/spirv-tools/build/test/tools/Makefile new file mode 100644 index 000000000..ba73a4ae8 --- /dev/null +++ b/3rdparty/spirv-tools/build/test/tools/Makefile @@ -0,0 +1,194 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Default target executed when no arguments are given to make. +default_target: all + +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..." + /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache + +.PHONY : edit_cache/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: install/strip + +.PHONY : install/strip/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Available install components are: \"Unspecified\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components + +.PHONY : list_install_components/fast + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running tests..." + /usr/bin/ctest --force-new-ctest-process $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test + +.PHONY : test/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: install/local + +.PHONY : install/local/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache + +.PHONY : rebuild_cache/fast + +# The main all target +all: cmake_check_build_system + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/tools/CMakeFiles/progress.marks + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 test/tools/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 test/tools/clean +.PHONY : clean + +# The main clean target +clean/fast: clean + +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 test/tools/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 test/tools/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... install" + @echo "... edit_cache" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... test" + @echo "... install/local" + @echo "... rebuild_cache" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/3rdparty/spirv-tools/build/test/tools/cmake_install.cmake b/3rdparty/spirv-tools/build/test/tools/cmake_install.cmake new file mode 100644 index 000000000..b97956ab1 --- /dev/null +++ b/3rdparty/spirv-tools/build/test/tools/cmake_install.cmake @@ -0,0 +1,40 @@ +# Install script for directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/test/tools + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Debug") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "1") +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + # Include the install script for each subdirectory. + include("/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/tools/opt/cmake_install.cmake") + +endif() + diff --git a/3rdparty/spirv-tools/build/test/tools/opt/CMakeFiles/CMakeDirectoryInformation.cmake b/3rdparty/spirv-tools/build/test/tools/opt/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 000000000..b636c3f88 --- /dev/null +++ b/3rdparty/spirv-tools/build/test/tools/opt/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/bkaradzic/Private/projects/_github/SPIRV-Tools") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/3rdparty/spirv-tools/build/test/tools/opt/CMakeFiles/progress.marks b/3rdparty/spirv-tools/build/test/tools/opt/CMakeFiles/progress.marks new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/3rdparty/spirv-tools/build/test/tools/opt/CMakeFiles/progress.marks @@ -0,0 +1 @@ +0 diff --git a/3rdparty/spirv-tools/build/test/tools/opt/CTestTestfile.cmake b/3rdparty/spirv-tools/build/test/tools/opt/CTestTestfile.cmake new file mode 100644 index 000000000..c8f61a6ef --- /dev/null +++ b/3rdparty/spirv-tools/build/test/tools/opt/CTestTestfile.cmake @@ -0,0 +1,7 @@ +# CMake generated Testfile for +# Source directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/test/tools/opt +# Build directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/tools/opt +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. +add_test(spirv_opt_tests "/usr/bin/python" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/test/tools/opt/../spirv_test_framework.py" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/spirv-opt" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/spirv-as" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/spirv-dis" "--test-dir" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/test/tools/opt") diff --git a/3rdparty/spirv-tools/build/test/tools/opt/Makefile b/3rdparty/spirv-tools/build/test/tools/opt/Makefile new file mode 100644 index 000000000..1c06f5ad6 --- /dev/null +++ b/3rdparty/spirv-tools/build/test/tools/opt/Makefile @@ -0,0 +1,194 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Default target executed when no arguments are given to make. +default_target: all + +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..." + /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache + +.PHONY : edit_cache/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: install/strip + +.PHONY : install/strip/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Available install components are: \"Unspecified\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components + +.PHONY : list_install_components/fast + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running tests..." + /usr/bin/ctest --force-new-ctest-process $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test + +.PHONY : test/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: install/local + +.PHONY : install/local/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache + +.PHONY : rebuild_cache/fast + +# The main all target +all: cmake_check_build_system + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/tools/opt/CMakeFiles/progress.marks + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 test/tools/opt/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 test/tools/opt/clean +.PHONY : clean + +# The main clean target +clean/fast: clean + +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 test/tools/opt/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 test/tools/opt/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... install" + @echo "... edit_cache" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... test" + @echo "... install/local" + @echo "... rebuild_cache" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/3rdparty/spirv-tools/build/test/tools/opt/cmake_install.cmake b/3rdparty/spirv-tools/build/test/tools/opt/cmake_install.cmake new file mode 100644 index 000000000..a55b588ed --- /dev/null +++ b/3rdparty/spirv-tools/build/test/tools/opt/cmake_install.cmake @@ -0,0 +1,34 @@ +# Install script for directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/test/tools/opt + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Debug") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "1") +endif() + diff --git a/3rdparty/spirv-tools/build/test/util/CMakeFiles/CMakeDirectoryInformation.cmake b/3rdparty/spirv-tools/build/test/util/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 000000000..b636c3f88 --- /dev/null +++ b/3rdparty/spirv-tools/build/test/util/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/bkaradzic/Private/projects/_github/SPIRV-Tools") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/3rdparty/spirv-tools/build/test/util/CMakeFiles/progress.marks b/3rdparty/spirv-tools/build/test/util/CMakeFiles/progress.marks new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/3rdparty/spirv-tools/build/test/util/CMakeFiles/progress.marks @@ -0,0 +1 @@ +0 diff --git a/3rdparty/spirv-tools/build/test/util/CTestTestfile.cmake b/3rdparty/spirv-tools/build/test/util/CTestTestfile.cmake new file mode 100644 index 000000000..4a845aef3 --- /dev/null +++ b/3rdparty/spirv-tools/build/test/util/CTestTestfile.cmake @@ -0,0 +1,6 @@ +# CMake generated Testfile for +# Source directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/test/util +# Build directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/util +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. diff --git a/3rdparty/spirv-tools/build/test/util/Makefile b/3rdparty/spirv-tools/build/test/util/Makefile new file mode 100644 index 000000000..9680d6838 --- /dev/null +++ b/3rdparty/spirv-tools/build/test/util/Makefile @@ -0,0 +1,194 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Default target executed when no arguments are given to make. +default_target: all + +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..." + /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache + +.PHONY : edit_cache/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: install/strip + +.PHONY : install/strip/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Available install components are: \"Unspecified\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components + +.PHONY : list_install_components/fast + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running tests..." + /usr/bin/ctest --force-new-ctest-process $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test + +.PHONY : test/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: install/local + +.PHONY : install/local/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache + +.PHONY : rebuild_cache/fast + +# The main all target +all: cmake_check_build_system + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/util/CMakeFiles/progress.marks + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 test/util/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 test/util/clean +.PHONY : clean + +# The main clean target +clean/fast: clean + +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 test/util/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 test/util/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... install" + @echo "... edit_cache" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... test" + @echo "... install/local" + @echo "... rebuild_cache" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/3rdparty/spirv-tools/build/test/util/cmake_install.cmake b/3rdparty/spirv-tools/build/test/util/cmake_install.cmake new file mode 100644 index 000000000..05709a116 --- /dev/null +++ b/3rdparty/spirv-tools/build/test/util/cmake_install.cmake @@ -0,0 +1,34 @@ +# Install script for directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/test/util + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Debug") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "1") +endif() + diff --git a/3rdparty/spirv-tools/build/test/val/CMakeFiles/CMakeDirectoryInformation.cmake b/3rdparty/spirv-tools/build/test/val/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 000000000..b636c3f88 --- /dev/null +++ b/3rdparty/spirv-tools/build/test/val/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/bkaradzic/Private/projects/_github/SPIRV-Tools") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/3rdparty/spirv-tools/build/test/val/CMakeFiles/progress.marks b/3rdparty/spirv-tools/build/test/val/CMakeFiles/progress.marks new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/3rdparty/spirv-tools/build/test/val/CMakeFiles/progress.marks @@ -0,0 +1 @@ +0 diff --git a/3rdparty/spirv-tools/build/test/val/CTestTestfile.cmake b/3rdparty/spirv-tools/build/test/val/CTestTestfile.cmake new file mode 100644 index 000000000..75eb552df --- /dev/null +++ b/3rdparty/spirv-tools/build/test/val/CTestTestfile.cmake @@ -0,0 +1,6 @@ +# CMake generated Testfile for +# Source directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/test/val +# Build directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/val +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. diff --git a/3rdparty/spirv-tools/build/test/val/Makefile b/3rdparty/spirv-tools/build/test/val/Makefile new file mode 100644 index 000000000..d90663cb7 --- /dev/null +++ b/3rdparty/spirv-tools/build/test/val/Makefile @@ -0,0 +1,194 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Default target executed when no arguments are given to make. +default_target: all + +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..." + /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache + +.PHONY : edit_cache/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: install/strip + +.PHONY : install/strip/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Available install components are: \"Unspecified\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components + +.PHONY : list_install_components/fast + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running tests..." + /usr/bin/ctest --force-new-ctest-process $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test + +.PHONY : test/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: install/local + +.PHONY : install/local/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache + +.PHONY : rebuild_cache/fast + +# The main all target +all: cmake_check_build_system + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/test/val/CMakeFiles/progress.marks + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 test/val/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 test/val/clean +.PHONY : clean + +# The main clean target +clean/fast: clean + +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 test/val/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 test/val/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... install" + @echo "... edit_cache" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... test" + @echo "... install/local" + @echo "... rebuild_cache" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/3rdparty/spirv-tools/build/test/val/cmake_install.cmake b/3rdparty/spirv-tools/build/test/val/cmake_install.cmake new file mode 100644 index 000000000..c2306e5be --- /dev/null +++ b/3rdparty/spirv-tools/build/test/val/cmake_install.cmake @@ -0,0 +1,34 @@ +# Install script for directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/test/val + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Debug") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "1") +endif() + diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/CMakeDirectoryInformation.cmake b/3rdparty/spirv-tools/build/tools/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 000000000..b636c3f88 --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/bkaradzic/Private/projects/_github/SPIRV-Tools") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/progress.marks b/3rdparty/spirv-tools/build/tools/CMakeFiles/progress.marks new file mode 100644 index 000000000..38b10c1b2 --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/progress.marks @@ -0,0 +1 @@ +68 diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-as.dir/DependInfo.cmake b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-as.dir/DependInfo.cmake new file mode 100644 index 000000000..00fbefd15 --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-as.dir/DependInfo.cmake @@ -0,0 +1,32 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + "CXX" + ) +# The set of files for implicit dependencies of each language: +set(CMAKE_DEPENDS_CHECK_CXX + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/as/as.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/CMakeFiles/spirv-as.dir/as/as.cpp.o" + ) +set(CMAKE_CXX_COMPILER_ID "GNU") + +# Preprocessor definitions for this target. +set(CMAKE_TARGET_DEFINITIONS_CXX + "SPIRV_CHECK_CONTEXT" + "SPIRV_COLOR_TERMINAL" + "SPIRV_LINUX" + "SPIRV_TIMER_ENABLED" + ) + +# The include file search paths: +set(CMAKE_CXX_TARGET_INCLUDE_PATH + "../" + "." + "../include" + ) + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/DependInfo.cmake" + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-as.dir/build.make b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-as.dir/build.make new file mode 100644 index 000000000..5bed3b9b8 --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-as.dir/build.make @@ -0,0 +1,114 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + +# Include any dependencies generated for this target. +include tools/CMakeFiles/spirv-as.dir/depend.make + +# Include the progress variables for this target. +include tools/CMakeFiles/spirv-as.dir/progress.make + +# Include the compile flags for this target's objects. +include tools/CMakeFiles/spirv-as.dir/flags.make + +tools/CMakeFiles/spirv-as.dir/as/as.cpp.o: tools/CMakeFiles/spirv-as.dir/flags.make +tools/CMakeFiles/spirv-as.dir/as/as.cpp.o: ../tools/as/as.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object tools/CMakeFiles/spirv-as.dir/as/as.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/spirv-as.dir/as/as.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/as/as.cpp + +tools/CMakeFiles/spirv-as.dir/as/as.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/spirv-as.dir/as/as.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/as/as.cpp > CMakeFiles/spirv-as.dir/as/as.cpp.i + +tools/CMakeFiles/spirv-as.dir/as/as.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/spirv-as.dir/as/as.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/as/as.cpp -o CMakeFiles/spirv-as.dir/as/as.cpp.s + +tools/CMakeFiles/spirv-as.dir/as/as.cpp.o.requires: + +.PHONY : tools/CMakeFiles/spirv-as.dir/as/as.cpp.o.requires + +tools/CMakeFiles/spirv-as.dir/as/as.cpp.o.provides: tools/CMakeFiles/spirv-as.dir/as/as.cpp.o.requires + $(MAKE) -f tools/CMakeFiles/spirv-as.dir/build.make tools/CMakeFiles/spirv-as.dir/as/as.cpp.o.provides.build +.PHONY : tools/CMakeFiles/spirv-as.dir/as/as.cpp.o.provides + +tools/CMakeFiles/spirv-as.dir/as/as.cpp.o.provides.build: tools/CMakeFiles/spirv-as.dir/as/as.cpp.o + + +# Object files for target spirv-as +spirv__as_OBJECTS = \ +"CMakeFiles/spirv-as.dir/as/as.cpp.o" + +# External object files for target spirv-as +spirv__as_EXTERNAL_OBJECTS = + +tools/spirv-as: tools/CMakeFiles/spirv-as.dir/as/as.cpp.o +tools/spirv-as: tools/CMakeFiles/spirv-as.dir/build.make +tools/spirv-as: source/libSPIRV-Tools.a +tools/spirv-as: tools/CMakeFiles/spirv-as.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --bold --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Linking CXX executable spirv-as" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/spirv-as.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +tools/CMakeFiles/spirv-as.dir/build: tools/spirv-as + +.PHONY : tools/CMakeFiles/spirv-as.dir/build + +tools/CMakeFiles/spirv-as.dir/requires: tools/CMakeFiles/spirv-as.dir/as/as.cpp.o.requires + +.PHONY : tools/CMakeFiles/spirv-as.dir/requires + +tools/CMakeFiles/spirv-as.dir/clean: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && $(CMAKE_COMMAND) -P CMakeFiles/spirv-as.dir/cmake_clean.cmake +.PHONY : tools/CMakeFiles/spirv-as.dir/clean + +tools/CMakeFiles/spirv-as.dir/depend: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/bkaradzic/Private/projects/_github/SPIRV-Tools /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/CMakeFiles/spirv-as.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : tools/CMakeFiles/spirv-as.dir/depend + diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-as.dir/cmake_clean.cmake b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-as.dir/cmake_clean.cmake new file mode 100644 index 000000000..8b9778f75 --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-as.dir/cmake_clean.cmake @@ -0,0 +1,10 @@ +file(REMOVE_RECURSE + "CMakeFiles/spirv-as.dir/as/as.cpp.o" + "spirv-as.pdb" + "spirv-as" +) + +# Per-language clean rules from dependency scanning. +foreach(lang CXX) + include(CMakeFiles/spirv-as.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-as.dir/depend.make b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-as.dir/depend.make new file mode 100644 index 000000000..5b7660ac7 --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-as.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for spirv-as. +# This may be replaced when dependencies are built. diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-as.dir/flags.make b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-as.dir/flags.make new file mode 100644 index 000000000..345211d87 --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-as.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# compile CXX with /usr/bin/c++ +CXX_FLAGS = -g -fPIE -Wall -Wextra -Wnon-virtual-dtor -Wno-missing-field-initializers -Werror -std=c++11 -fno-exceptions -fno-rtti -Wno-long-long -Wshadow -Wundef -Wconversion -Wno-sign-conversion -std=gnu++11 + +CXX_DEFINES = -DSPIRV_CHECK_CONTEXT -DSPIRV_COLOR_TERMINAL -DSPIRV_LINUX -DSPIRV_TIMER_ENABLED + +CXX_INCLUDES = -I/home/bkaradzic/Private/projects/_github/SPIRV-Tools -I/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build -I/home/bkaradzic/Private/projects/_github/SPIRV-Tools/include + diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-as.dir/link.txt b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-as.dir/link.txt new file mode 100644 index 000000000..f41504091 --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-as.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/c++ -g CMakeFiles/spirv-as.dir/as/as.cpp.o -o spirv-as -rdynamic ../source/libSPIRV-Tools.a diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-as.dir/progress.make b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-as.dir/progress.make new file mode 100644 index 000000000..6c287f17b --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-as.dir/progress.make @@ -0,0 +1,3 @@ +CMAKE_PROGRESS_1 = +CMAKE_PROGRESS_2 = + diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-cfg.dir/DependInfo.cmake b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-cfg.dir/DependInfo.cmake new file mode 100644 index 000000000..899bd8520 --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-cfg.dir/DependInfo.cmake @@ -0,0 +1,34 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + "CXX" + ) +# The set of files for implicit dependencies of each language: +set(CMAKE_DEPENDS_CHECK_CXX + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/cfg/bin_to_dot.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/CMakeFiles/spirv-cfg.dir/cfg/bin_to_dot.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/cfg/cfg.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/CMakeFiles/spirv-cfg.dir/cfg/cfg.cpp.o" + ) +set(CMAKE_CXX_COMPILER_ID "GNU") + +# Preprocessor definitions for this target. +set(CMAKE_TARGET_DEFINITIONS_CXX + "SPIRV_CHECK_CONTEXT" + "SPIRV_COLOR_TERMINAL" + "SPIRV_LINUX" + "SPIRV_TIMER_ENABLED" + ) + +# The include file search paths: +set(CMAKE_CXX_TARGET_INCLUDE_PATH + "../" + "." + "../external/SPIRV-Headers/include" + "../include" + ) + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/DependInfo.cmake" + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-cfg.dir/build.make b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-cfg.dir/build.make new file mode 100644 index 000000000..a4e1a4517 --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-cfg.dir/build.make @@ -0,0 +1,141 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + +# Include any dependencies generated for this target. +include tools/CMakeFiles/spirv-cfg.dir/depend.make + +# Include the progress variables for this target. +include tools/CMakeFiles/spirv-cfg.dir/progress.make + +# Include the compile flags for this target's objects. +include tools/CMakeFiles/spirv-cfg.dir/flags.make + +tools/CMakeFiles/spirv-cfg.dir/cfg/cfg.cpp.o: tools/CMakeFiles/spirv-cfg.dir/flags.make +tools/CMakeFiles/spirv-cfg.dir/cfg/cfg.cpp.o: ../tools/cfg/cfg.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object tools/CMakeFiles/spirv-cfg.dir/cfg/cfg.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/spirv-cfg.dir/cfg/cfg.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/cfg/cfg.cpp + +tools/CMakeFiles/spirv-cfg.dir/cfg/cfg.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/spirv-cfg.dir/cfg/cfg.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/cfg/cfg.cpp > CMakeFiles/spirv-cfg.dir/cfg/cfg.cpp.i + +tools/CMakeFiles/spirv-cfg.dir/cfg/cfg.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/spirv-cfg.dir/cfg/cfg.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/cfg/cfg.cpp -o CMakeFiles/spirv-cfg.dir/cfg/cfg.cpp.s + +tools/CMakeFiles/spirv-cfg.dir/cfg/cfg.cpp.o.requires: + +.PHONY : tools/CMakeFiles/spirv-cfg.dir/cfg/cfg.cpp.o.requires + +tools/CMakeFiles/spirv-cfg.dir/cfg/cfg.cpp.o.provides: tools/CMakeFiles/spirv-cfg.dir/cfg/cfg.cpp.o.requires + $(MAKE) -f tools/CMakeFiles/spirv-cfg.dir/build.make tools/CMakeFiles/spirv-cfg.dir/cfg/cfg.cpp.o.provides.build +.PHONY : tools/CMakeFiles/spirv-cfg.dir/cfg/cfg.cpp.o.provides + +tools/CMakeFiles/spirv-cfg.dir/cfg/cfg.cpp.o.provides.build: tools/CMakeFiles/spirv-cfg.dir/cfg/cfg.cpp.o + + +tools/CMakeFiles/spirv-cfg.dir/cfg/bin_to_dot.cpp.o: tools/CMakeFiles/spirv-cfg.dir/flags.make +tools/CMakeFiles/spirv-cfg.dir/cfg/bin_to_dot.cpp.o: ../tools/cfg/bin_to_dot.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Building CXX object tools/CMakeFiles/spirv-cfg.dir/cfg/bin_to_dot.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/spirv-cfg.dir/cfg/bin_to_dot.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/cfg/bin_to_dot.cpp + +tools/CMakeFiles/spirv-cfg.dir/cfg/bin_to_dot.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/spirv-cfg.dir/cfg/bin_to_dot.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/cfg/bin_to_dot.cpp > CMakeFiles/spirv-cfg.dir/cfg/bin_to_dot.cpp.i + +tools/CMakeFiles/spirv-cfg.dir/cfg/bin_to_dot.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/spirv-cfg.dir/cfg/bin_to_dot.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/cfg/bin_to_dot.cpp -o CMakeFiles/spirv-cfg.dir/cfg/bin_to_dot.cpp.s + +tools/CMakeFiles/spirv-cfg.dir/cfg/bin_to_dot.cpp.o.requires: + +.PHONY : tools/CMakeFiles/spirv-cfg.dir/cfg/bin_to_dot.cpp.o.requires + +tools/CMakeFiles/spirv-cfg.dir/cfg/bin_to_dot.cpp.o.provides: tools/CMakeFiles/spirv-cfg.dir/cfg/bin_to_dot.cpp.o.requires + $(MAKE) -f tools/CMakeFiles/spirv-cfg.dir/build.make tools/CMakeFiles/spirv-cfg.dir/cfg/bin_to_dot.cpp.o.provides.build +.PHONY : tools/CMakeFiles/spirv-cfg.dir/cfg/bin_to_dot.cpp.o.provides + +tools/CMakeFiles/spirv-cfg.dir/cfg/bin_to_dot.cpp.o.provides.build: tools/CMakeFiles/spirv-cfg.dir/cfg/bin_to_dot.cpp.o + + +# Object files for target spirv-cfg +spirv__cfg_OBJECTS = \ +"CMakeFiles/spirv-cfg.dir/cfg/cfg.cpp.o" \ +"CMakeFiles/spirv-cfg.dir/cfg/bin_to_dot.cpp.o" + +# External object files for target spirv-cfg +spirv__cfg_EXTERNAL_OBJECTS = + +tools/spirv-cfg: tools/CMakeFiles/spirv-cfg.dir/cfg/cfg.cpp.o +tools/spirv-cfg: tools/CMakeFiles/spirv-cfg.dir/cfg/bin_to_dot.cpp.o +tools/spirv-cfg: tools/CMakeFiles/spirv-cfg.dir/build.make +tools/spirv-cfg: source/libSPIRV-Tools.a +tools/spirv-cfg: tools/CMakeFiles/spirv-cfg.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --bold --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_3) "Linking CXX executable spirv-cfg" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/spirv-cfg.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +tools/CMakeFiles/spirv-cfg.dir/build: tools/spirv-cfg + +.PHONY : tools/CMakeFiles/spirv-cfg.dir/build + +tools/CMakeFiles/spirv-cfg.dir/requires: tools/CMakeFiles/spirv-cfg.dir/cfg/cfg.cpp.o.requires +tools/CMakeFiles/spirv-cfg.dir/requires: tools/CMakeFiles/spirv-cfg.dir/cfg/bin_to_dot.cpp.o.requires + +.PHONY : tools/CMakeFiles/spirv-cfg.dir/requires + +tools/CMakeFiles/spirv-cfg.dir/clean: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && $(CMAKE_COMMAND) -P CMakeFiles/spirv-cfg.dir/cmake_clean.cmake +.PHONY : tools/CMakeFiles/spirv-cfg.dir/clean + +tools/CMakeFiles/spirv-cfg.dir/depend: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/bkaradzic/Private/projects/_github/SPIRV-Tools /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/CMakeFiles/spirv-cfg.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : tools/CMakeFiles/spirv-cfg.dir/depend + diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-cfg.dir/cmake_clean.cmake b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-cfg.dir/cmake_clean.cmake new file mode 100644 index 000000000..eb374d1cb --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-cfg.dir/cmake_clean.cmake @@ -0,0 +1,11 @@ +file(REMOVE_RECURSE + "CMakeFiles/spirv-cfg.dir/cfg/cfg.cpp.o" + "CMakeFiles/spirv-cfg.dir/cfg/bin_to_dot.cpp.o" + "spirv-cfg.pdb" + "spirv-cfg" +) + +# Per-language clean rules from dependency scanning. +foreach(lang CXX) + include(CMakeFiles/spirv-cfg.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-cfg.dir/depend.make b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-cfg.dir/depend.make new file mode 100644 index 000000000..f8110739a --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-cfg.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for spirv-cfg. +# This may be replaced when dependencies are built. diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-cfg.dir/flags.make b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-cfg.dir/flags.make new file mode 100644 index 000000000..589eae28d --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-cfg.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# compile CXX with /usr/bin/c++ +CXX_FLAGS = -g -fPIE -Wall -Wextra -Wnon-virtual-dtor -Wno-missing-field-initializers -Werror -std=c++11 -fno-exceptions -fno-rtti -Wno-long-long -Wshadow -Wundef -Wconversion -Wno-sign-conversion -std=gnu++11 + +CXX_DEFINES = -DSPIRV_CHECK_CONTEXT -DSPIRV_COLOR_TERMINAL -DSPIRV_LINUX -DSPIRV_TIMER_ENABLED + +CXX_INCLUDES = -I/home/bkaradzic/Private/projects/_github/SPIRV-Tools -I/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build -I/home/bkaradzic/Private/projects/_github/SPIRV-Tools/external/SPIRV-Headers/include -I/home/bkaradzic/Private/projects/_github/SPIRV-Tools/include + diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-cfg.dir/link.txt b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-cfg.dir/link.txt new file mode 100644 index 000000000..087407d64 --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-cfg.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/c++ -g CMakeFiles/spirv-cfg.dir/cfg/cfg.cpp.o CMakeFiles/spirv-cfg.dir/cfg/bin_to_dot.cpp.o -o spirv-cfg -rdynamic ../source/libSPIRV-Tools.a diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-cfg.dir/progress.make b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-cfg.dir/progress.make new file mode 100644 index 000000000..fa35c6a68 --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-cfg.dir/progress.make @@ -0,0 +1,4 @@ +CMAKE_PROGRESS_1 = 90 +CMAKE_PROGRESS_2 = +CMAKE_PROGRESS_3 = 91 + diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-dis.dir/DependInfo.cmake b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-dis.dir/DependInfo.cmake new file mode 100644 index 000000000..ee063aeb3 --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-dis.dir/DependInfo.cmake @@ -0,0 +1,32 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + "CXX" + ) +# The set of files for implicit dependencies of each language: +set(CMAKE_DEPENDS_CHECK_CXX + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/dis/dis.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/CMakeFiles/spirv-dis.dir/dis/dis.cpp.o" + ) +set(CMAKE_CXX_COMPILER_ID "GNU") + +# Preprocessor definitions for this target. +set(CMAKE_TARGET_DEFINITIONS_CXX + "SPIRV_CHECK_CONTEXT" + "SPIRV_COLOR_TERMINAL" + "SPIRV_LINUX" + "SPIRV_TIMER_ENABLED" + ) + +# The include file search paths: +set(CMAKE_CXX_TARGET_INCLUDE_PATH + "../" + "." + "../include" + ) + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/DependInfo.cmake" + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-dis.dir/build.make b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-dis.dir/build.make new file mode 100644 index 000000000..0d0095248 --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-dis.dir/build.make @@ -0,0 +1,114 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + +# Include any dependencies generated for this target. +include tools/CMakeFiles/spirv-dis.dir/depend.make + +# Include the progress variables for this target. +include tools/CMakeFiles/spirv-dis.dir/progress.make + +# Include the compile flags for this target's objects. +include tools/CMakeFiles/spirv-dis.dir/flags.make + +tools/CMakeFiles/spirv-dis.dir/dis/dis.cpp.o: tools/CMakeFiles/spirv-dis.dir/flags.make +tools/CMakeFiles/spirv-dis.dir/dis/dis.cpp.o: ../tools/dis/dis.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object tools/CMakeFiles/spirv-dis.dir/dis/dis.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/spirv-dis.dir/dis/dis.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/dis/dis.cpp + +tools/CMakeFiles/spirv-dis.dir/dis/dis.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/spirv-dis.dir/dis/dis.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/dis/dis.cpp > CMakeFiles/spirv-dis.dir/dis/dis.cpp.i + +tools/CMakeFiles/spirv-dis.dir/dis/dis.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/spirv-dis.dir/dis/dis.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/dis/dis.cpp -o CMakeFiles/spirv-dis.dir/dis/dis.cpp.s + +tools/CMakeFiles/spirv-dis.dir/dis/dis.cpp.o.requires: + +.PHONY : tools/CMakeFiles/spirv-dis.dir/dis/dis.cpp.o.requires + +tools/CMakeFiles/spirv-dis.dir/dis/dis.cpp.o.provides: tools/CMakeFiles/spirv-dis.dir/dis/dis.cpp.o.requires + $(MAKE) -f tools/CMakeFiles/spirv-dis.dir/build.make tools/CMakeFiles/spirv-dis.dir/dis/dis.cpp.o.provides.build +.PHONY : tools/CMakeFiles/spirv-dis.dir/dis/dis.cpp.o.provides + +tools/CMakeFiles/spirv-dis.dir/dis/dis.cpp.o.provides.build: tools/CMakeFiles/spirv-dis.dir/dis/dis.cpp.o + + +# Object files for target spirv-dis +spirv__dis_OBJECTS = \ +"CMakeFiles/spirv-dis.dir/dis/dis.cpp.o" + +# External object files for target spirv-dis +spirv__dis_EXTERNAL_OBJECTS = + +tools/spirv-dis: tools/CMakeFiles/spirv-dis.dir/dis/dis.cpp.o +tools/spirv-dis: tools/CMakeFiles/spirv-dis.dir/build.make +tools/spirv-dis: source/libSPIRV-Tools.a +tools/spirv-dis: tools/CMakeFiles/spirv-dis.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --bold --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Linking CXX executable spirv-dis" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/spirv-dis.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +tools/CMakeFiles/spirv-dis.dir/build: tools/spirv-dis + +.PHONY : tools/CMakeFiles/spirv-dis.dir/build + +tools/CMakeFiles/spirv-dis.dir/requires: tools/CMakeFiles/spirv-dis.dir/dis/dis.cpp.o.requires + +.PHONY : tools/CMakeFiles/spirv-dis.dir/requires + +tools/CMakeFiles/spirv-dis.dir/clean: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && $(CMAKE_COMMAND) -P CMakeFiles/spirv-dis.dir/cmake_clean.cmake +.PHONY : tools/CMakeFiles/spirv-dis.dir/clean + +tools/CMakeFiles/spirv-dis.dir/depend: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/bkaradzic/Private/projects/_github/SPIRV-Tools /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/CMakeFiles/spirv-dis.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : tools/CMakeFiles/spirv-dis.dir/depend + diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-dis.dir/cmake_clean.cmake b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-dis.dir/cmake_clean.cmake new file mode 100644 index 000000000..c72ed8cf6 --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-dis.dir/cmake_clean.cmake @@ -0,0 +1,10 @@ +file(REMOVE_RECURSE + "CMakeFiles/spirv-dis.dir/dis/dis.cpp.o" + "spirv-dis.pdb" + "spirv-dis" +) + +# Per-language clean rules from dependency scanning. +foreach(lang CXX) + include(CMakeFiles/spirv-dis.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-dis.dir/depend.make b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-dis.dir/depend.make new file mode 100644 index 000000000..9b19f218f --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-dis.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for spirv-dis. +# This may be replaced when dependencies are built. diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-dis.dir/flags.make b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-dis.dir/flags.make new file mode 100644 index 000000000..345211d87 --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-dis.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# compile CXX with /usr/bin/c++ +CXX_FLAGS = -g -fPIE -Wall -Wextra -Wnon-virtual-dtor -Wno-missing-field-initializers -Werror -std=c++11 -fno-exceptions -fno-rtti -Wno-long-long -Wshadow -Wundef -Wconversion -Wno-sign-conversion -std=gnu++11 + +CXX_DEFINES = -DSPIRV_CHECK_CONTEXT -DSPIRV_COLOR_TERMINAL -DSPIRV_LINUX -DSPIRV_TIMER_ENABLED + +CXX_INCLUDES = -I/home/bkaradzic/Private/projects/_github/SPIRV-Tools -I/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build -I/home/bkaradzic/Private/projects/_github/SPIRV-Tools/include + diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-dis.dir/link.txt b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-dis.dir/link.txt new file mode 100644 index 000000000..dde414fcb --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-dis.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/c++ -g CMakeFiles/spirv-dis.dir/dis/dis.cpp.o -o spirv-dis -rdynamic ../source/libSPIRV-Tools.a diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-dis.dir/progress.make b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-dis.dir/progress.make new file mode 100644 index 000000000..6c287f17b --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-dis.dir/progress.make @@ -0,0 +1,3 @@ +CMAKE_PROGRESS_1 = +CMAKE_PROGRESS_2 = + diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-link.dir/DependInfo.cmake b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-link.dir/DependInfo.cmake new file mode 100644 index 000000000..882b02210 --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-link.dir/DependInfo.cmake @@ -0,0 +1,35 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + "CXX" + ) +# The set of files for implicit dependencies of each language: +set(CMAKE_DEPENDS_CHECK_CXX + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/link/linker.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/CMakeFiles/spirv-link.dir/link/linker.cpp.o" + ) +set(CMAKE_CXX_COMPILER_ID "GNU") + +# Preprocessor definitions for this target. +set(CMAKE_TARGET_DEFINITIONS_CXX + "SPIRV_CHECK_CONTEXT" + "SPIRV_COLOR_TERMINAL" + "SPIRV_LINUX" + "SPIRV_TIMER_ENABLED" + ) + +# The include file search paths: +set(CMAKE_CXX_TARGET_INCLUDE_PATH + "../" + "." + "../include" + "../external/SPIRV-Headers/include" + ) + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/link/CMakeFiles/SPIRV-Tools-link.dir/DependInfo.cmake" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/DependInfo.cmake" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/DependInfo.cmake" + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-link.dir/build.make b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-link.dir/build.make new file mode 100644 index 000000000..fc50026d4 --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-link.dir/build.make @@ -0,0 +1,117 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + +# Include any dependencies generated for this target. +include tools/CMakeFiles/spirv-link.dir/depend.make + +# Include the progress variables for this target. +include tools/CMakeFiles/spirv-link.dir/progress.make + +# Include the compile flags for this target's objects. +include tools/CMakeFiles/spirv-link.dir/flags.make + +tools/CMakeFiles/spirv-link.dir/link/linker.cpp.o: tools/CMakeFiles/spirv-link.dir/flags.make +tools/CMakeFiles/spirv-link.dir/link/linker.cpp.o: ../tools/link/linker.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object tools/CMakeFiles/spirv-link.dir/link/linker.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/spirv-link.dir/link/linker.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/link/linker.cpp + +tools/CMakeFiles/spirv-link.dir/link/linker.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/spirv-link.dir/link/linker.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/link/linker.cpp > CMakeFiles/spirv-link.dir/link/linker.cpp.i + +tools/CMakeFiles/spirv-link.dir/link/linker.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/spirv-link.dir/link/linker.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/link/linker.cpp -o CMakeFiles/spirv-link.dir/link/linker.cpp.s + +tools/CMakeFiles/spirv-link.dir/link/linker.cpp.o.requires: + +.PHONY : tools/CMakeFiles/spirv-link.dir/link/linker.cpp.o.requires + +tools/CMakeFiles/spirv-link.dir/link/linker.cpp.o.provides: tools/CMakeFiles/spirv-link.dir/link/linker.cpp.o.requires + $(MAKE) -f tools/CMakeFiles/spirv-link.dir/build.make tools/CMakeFiles/spirv-link.dir/link/linker.cpp.o.provides.build +.PHONY : tools/CMakeFiles/spirv-link.dir/link/linker.cpp.o.provides + +tools/CMakeFiles/spirv-link.dir/link/linker.cpp.o.provides.build: tools/CMakeFiles/spirv-link.dir/link/linker.cpp.o + + +# Object files for target spirv-link +spirv__link_OBJECTS = \ +"CMakeFiles/spirv-link.dir/link/linker.cpp.o" + +# External object files for target spirv-link +spirv__link_EXTERNAL_OBJECTS = + +tools/spirv-link: tools/CMakeFiles/spirv-link.dir/link/linker.cpp.o +tools/spirv-link: tools/CMakeFiles/spirv-link.dir/build.make +tools/spirv-link: source/link/libSPIRV-Tools-link.a +tools/spirv-link: source/libSPIRV-Tools.a +tools/spirv-link: source/opt/libSPIRV-Tools-opt.a +tools/spirv-link: source/libSPIRV-Tools.a +tools/spirv-link: tools/CMakeFiles/spirv-link.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --bold --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Linking CXX executable spirv-link" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/spirv-link.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +tools/CMakeFiles/spirv-link.dir/build: tools/spirv-link + +.PHONY : tools/CMakeFiles/spirv-link.dir/build + +tools/CMakeFiles/spirv-link.dir/requires: tools/CMakeFiles/spirv-link.dir/link/linker.cpp.o.requires + +.PHONY : tools/CMakeFiles/spirv-link.dir/requires + +tools/CMakeFiles/spirv-link.dir/clean: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && $(CMAKE_COMMAND) -P CMakeFiles/spirv-link.dir/cmake_clean.cmake +.PHONY : tools/CMakeFiles/spirv-link.dir/clean + +tools/CMakeFiles/spirv-link.dir/depend: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/bkaradzic/Private/projects/_github/SPIRV-Tools /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/CMakeFiles/spirv-link.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : tools/CMakeFiles/spirv-link.dir/depend + diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-link.dir/cmake_clean.cmake b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-link.dir/cmake_clean.cmake new file mode 100644 index 000000000..62e50eea5 --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-link.dir/cmake_clean.cmake @@ -0,0 +1,10 @@ +file(REMOVE_RECURSE + "CMakeFiles/spirv-link.dir/link/linker.cpp.o" + "spirv-link.pdb" + "spirv-link" +) + +# Per-language clean rules from dependency scanning. +foreach(lang CXX) + include(CMakeFiles/spirv-link.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-link.dir/depend.make b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-link.dir/depend.make new file mode 100644 index 000000000..62d564368 --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-link.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for spirv-link. +# This may be replaced when dependencies are built. diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-link.dir/flags.make b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-link.dir/flags.make new file mode 100644 index 000000000..c06dd6241 --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-link.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# compile CXX with /usr/bin/c++ +CXX_FLAGS = -g -fPIE -Wall -Wextra -Wnon-virtual-dtor -Wno-missing-field-initializers -Werror -std=c++11 -fno-exceptions -fno-rtti -Wno-long-long -Wshadow -Wundef -Wconversion -Wno-sign-conversion -std=gnu++11 + +CXX_DEFINES = -DSPIRV_CHECK_CONTEXT -DSPIRV_COLOR_TERMINAL -DSPIRV_LINUX -DSPIRV_TIMER_ENABLED + +CXX_INCLUDES = -I/home/bkaradzic/Private/projects/_github/SPIRV-Tools -I/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build -I/home/bkaradzic/Private/projects/_github/SPIRV-Tools/include -I/home/bkaradzic/Private/projects/_github/SPIRV-Tools/external/SPIRV-Headers/include + diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-link.dir/link.txt b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-link.dir/link.txt new file mode 100644 index 000000000..4c5101ee8 --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-link.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/c++ -g CMakeFiles/spirv-link.dir/link/linker.cpp.o -o spirv-link -rdynamic ../source/link/libSPIRV-Tools-link.a ../source/libSPIRV-Tools.a ../source/opt/libSPIRV-Tools-opt.a ../source/libSPIRV-Tools.a diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-link.dir/progress.make b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-link.dir/progress.make new file mode 100644 index 000000000..c9a8f7fc9 --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-link.dir/progress.make @@ -0,0 +1,3 @@ +CMAKE_PROGRESS_1 = 92 +CMAKE_PROGRESS_2 = + diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-opt.dir/DependInfo.cmake b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-opt.dir/DependInfo.cmake new file mode 100644 index 000000000..df812ca00 --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-opt.dir/DependInfo.cmake @@ -0,0 +1,35 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + "CXX" + ) +# The set of files for implicit dependencies of each language: +set(CMAKE_DEPENDS_CHECK_CXX + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/opt/opt.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/CMakeFiles/spirv-opt.dir/opt/opt.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/util/cli_consumer.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/CMakeFiles/spirv-opt.dir/util/cli_consumer.cpp.o" + ) +set(CMAKE_CXX_COMPILER_ID "GNU") + +# Preprocessor definitions for this target. +set(CMAKE_TARGET_DEFINITIONS_CXX + "SPIRV_CHECK_CONTEXT" + "SPIRV_COLOR_TERMINAL" + "SPIRV_LINUX" + "SPIRV_TIMER_ENABLED" + ) + +# The include file search paths: +set(CMAKE_CXX_TARGET_INCLUDE_PATH + "../" + "." + "../include" + "../external/SPIRV-Headers/include" + ) + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/opt/CMakeFiles/SPIRV-Tools-opt.dir/DependInfo.cmake" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/DependInfo.cmake" + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-opt.dir/build.make b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-opt.dir/build.make new file mode 100644 index 000000000..5bb5c6b45 --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-opt.dir/build.make @@ -0,0 +1,142 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + +# Include any dependencies generated for this target. +include tools/CMakeFiles/spirv-opt.dir/depend.make + +# Include the progress variables for this target. +include tools/CMakeFiles/spirv-opt.dir/progress.make + +# Include the compile flags for this target's objects. +include tools/CMakeFiles/spirv-opt.dir/flags.make + +tools/CMakeFiles/spirv-opt.dir/opt/opt.cpp.o: tools/CMakeFiles/spirv-opt.dir/flags.make +tools/CMakeFiles/spirv-opt.dir/opt/opt.cpp.o: ../tools/opt/opt.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object tools/CMakeFiles/spirv-opt.dir/opt/opt.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/spirv-opt.dir/opt/opt.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/opt/opt.cpp + +tools/CMakeFiles/spirv-opt.dir/opt/opt.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/spirv-opt.dir/opt/opt.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/opt/opt.cpp > CMakeFiles/spirv-opt.dir/opt/opt.cpp.i + +tools/CMakeFiles/spirv-opt.dir/opt/opt.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/spirv-opt.dir/opt/opt.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/opt/opt.cpp -o CMakeFiles/spirv-opt.dir/opt/opt.cpp.s + +tools/CMakeFiles/spirv-opt.dir/opt/opt.cpp.o.requires: + +.PHONY : tools/CMakeFiles/spirv-opt.dir/opt/opt.cpp.o.requires + +tools/CMakeFiles/spirv-opt.dir/opt/opt.cpp.o.provides: tools/CMakeFiles/spirv-opt.dir/opt/opt.cpp.o.requires + $(MAKE) -f tools/CMakeFiles/spirv-opt.dir/build.make tools/CMakeFiles/spirv-opt.dir/opt/opt.cpp.o.provides.build +.PHONY : tools/CMakeFiles/spirv-opt.dir/opt/opt.cpp.o.provides + +tools/CMakeFiles/spirv-opt.dir/opt/opt.cpp.o.provides.build: tools/CMakeFiles/spirv-opt.dir/opt/opt.cpp.o + + +tools/CMakeFiles/spirv-opt.dir/util/cli_consumer.cpp.o: tools/CMakeFiles/spirv-opt.dir/flags.make +tools/CMakeFiles/spirv-opt.dir/util/cli_consumer.cpp.o: ../tools/util/cli_consumer.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Building CXX object tools/CMakeFiles/spirv-opt.dir/util/cli_consumer.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/spirv-opt.dir/util/cli_consumer.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/util/cli_consumer.cpp + +tools/CMakeFiles/spirv-opt.dir/util/cli_consumer.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/spirv-opt.dir/util/cli_consumer.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/util/cli_consumer.cpp > CMakeFiles/spirv-opt.dir/util/cli_consumer.cpp.i + +tools/CMakeFiles/spirv-opt.dir/util/cli_consumer.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/spirv-opt.dir/util/cli_consumer.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/util/cli_consumer.cpp -o CMakeFiles/spirv-opt.dir/util/cli_consumer.cpp.s + +tools/CMakeFiles/spirv-opt.dir/util/cli_consumer.cpp.o.requires: + +.PHONY : tools/CMakeFiles/spirv-opt.dir/util/cli_consumer.cpp.o.requires + +tools/CMakeFiles/spirv-opt.dir/util/cli_consumer.cpp.o.provides: tools/CMakeFiles/spirv-opt.dir/util/cli_consumer.cpp.o.requires + $(MAKE) -f tools/CMakeFiles/spirv-opt.dir/build.make tools/CMakeFiles/spirv-opt.dir/util/cli_consumer.cpp.o.provides.build +.PHONY : tools/CMakeFiles/spirv-opt.dir/util/cli_consumer.cpp.o.provides + +tools/CMakeFiles/spirv-opt.dir/util/cli_consumer.cpp.o.provides.build: tools/CMakeFiles/spirv-opt.dir/util/cli_consumer.cpp.o + + +# Object files for target spirv-opt +spirv__opt_OBJECTS = \ +"CMakeFiles/spirv-opt.dir/opt/opt.cpp.o" \ +"CMakeFiles/spirv-opt.dir/util/cli_consumer.cpp.o" + +# External object files for target spirv-opt +spirv__opt_EXTERNAL_OBJECTS = + +tools/spirv-opt: tools/CMakeFiles/spirv-opt.dir/opt/opt.cpp.o +tools/spirv-opt: tools/CMakeFiles/spirv-opt.dir/util/cli_consumer.cpp.o +tools/spirv-opt: tools/CMakeFiles/spirv-opt.dir/build.make +tools/spirv-opt: source/opt/libSPIRV-Tools-opt.a +tools/spirv-opt: source/libSPIRV-Tools.a +tools/spirv-opt: tools/CMakeFiles/spirv-opt.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --bold --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_3) "Linking CXX executable spirv-opt" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/spirv-opt.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +tools/CMakeFiles/spirv-opt.dir/build: tools/spirv-opt + +.PHONY : tools/CMakeFiles/spirv-opt.dir/build + +tools/CMakeFiles/spirv-opt.dir/requires: tools/CMakeFiles/spirv-opt.dir/opt/opt.cpp.o.requires +tools/CMakeFiles/spirv-opt.dir/requires: tools/CMakeFiles/spirv-opt.dir/util/cli_consumer.cpp.o.requires + +.PHONY : tools/CMakeFiles/spirv-opt.dir/requires + +tools/CMakeFiles/spirv-opt.dir/clean: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && $(CMAKE_COMMAND) -P CMakeFiles/spirv-opt.dir/cmake_clean.cmake +.PHONY : tools/CMakeFiles/spirv-opt.dir/clean + +tools/CMakeFiles/spirv-opt.dir/depend: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/bkaradzic/Private/projects/_github/SPIRV-Tools /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/CMakeFiles/spirv-opt.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : tools/CMakeFiles/spirv-opt.dir/depend + diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-opt.dir/cmake_clean.cmake b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-opt.dir/cmake_clean.cmake new file mode 100644 index 000000000..3fb9bbd8b --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-opt.dir/cmake_clean.cmake @@ -0,0 +1,11 @@ +file(REMOVE_RECURSE + "CMakeFiles/spirv-opt.dir/opt/opt.cpp.o" + "CMakeFiles/spirv-opt.dir/util/cli_consumer.cpp.o" + "spirv-opt.pdb" + "spirv-opt" +) + +# Per-language clean rules from dependency scanning. +foreach(lang CXX) + include(CMakeFiles/spirv-opt.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-opt.dir/depend.make b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-opt.dir/depend.make new file mode 100644 index 000000000..937f386d2 --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-opt.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for spirv-opt. +# This may be replaced when dependencies are built. diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-opt.dir/flags.make b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-opt.dir/flags.make new file mode 100644 index 000000000..c06dd6241 --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-opt.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# compile CXX with /usr/bin/c++ +CXX_FLAGS = -g -fPIE -Wall -Wextra -Wnon-virtual-dtor -Wno-missing-field-initializers -Werror -std=c++11 -fno-exceptions -fno-rtti -Wno-long-long -Wshadow -Wundef -Wconversion -Wno-sign-conversion -std=gnu++11 + +CXX_DEFINES = -DSPIRV_CHECK_CONTEXT -DSPIRV_COLOR_TERMINAL -DSPIRV_LINUX -DSPIRV_TIMER_ENABLED + +CXX_INCLUDES = -I/home/bkaradzic/Private/projects/_github/SPIRV-Tools -I/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build -I/home/bkaradzic/Private/projects/_github/SPIRV-Tools/include -I/home/bkaradzic/Private/projects/_github/SPIRV-Tools/external/SPIRV-Headers/include + diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-opt.dir/link.txt b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-opt.dir/link.txt new file mode 100644 index 000000000..bffd34811 --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-opt.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/c++ -g CMakeFiles/spirv-opt.dir/opt/opt.cpp.o CMakeFiles/spirv-opt.dir/util/cli_consumer.cpp.o -o spirv-opt -rdynamic ../source/opt/libSPIRV-Tools-opt.a ../source/libSPIRV-Tools.a diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-opt.dir/progress.make b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-opt.dir/progress.make new file mode 100644 index 000000000..6b9468eef --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-opt.dir/progress.make @@ -0,0 +1,4 @@ +CMAKE_PROGRESS_1 = +CMAKE_PROGRESS_2 = 93 +CMAKE_PROGRESS_3 = + diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-stats.dir/DependInfo.cmake b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-stats.dir/DependInfo.cmake new file mode 100644 index 000000000..05743be00 --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-stats.dir/DependInfo.cmake @@ -0,0 +1,35 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + "CXX" + ) +# The set of files for implicit dependencies of each language: +set(CMAKE_DEPENDS_CHECK_CXX + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/stats/spirv_stats.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/CMakeFiles/spirv-stats.dir/stats/spirv_stats.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/stats/stats.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/CMakeFiles/spirv-stats.dir/stats/stats.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/stats/stats_analyzer.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/CMakeFiles/spirv-stats.dir/stats/stats_analyzer.cpp.o" + ) +set(CMAKE_CXX_COMPILER_ID "GNU") + +# Preprocessor definitions for this target. +set(CMAKE_TARGET_DEFINITIONS_CXX + "SPIRV_CHECK_CONTEXT" + "SPIRV_COLOR_TERMINAL" + "SPIRV_LINUX" + "SPIRV_TIMER_ENABLED" + ) + +# The include file search paths: +set(CMAKE_CXX_TARGET_INCLUDE_PATH + "../" + "." + "../external/SPIRV-Headers/include" + "../include" + ) + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/DependInfo.cmake" + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-stats.dir/build.make b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-stats.dir/build.make new file mode 100644 index 000000000..a26885adb --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-stats.dir/build.make @@ -0,0 +1,168 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + +# Include any dependencies generated for this target. +include tools/CMakeFiles/spirv-stats.dir/depend.make + +# Include the progress variables for this target. +include tools/CMakeFiles/spirv-stats.dir/progress.make + +# Include the compile flags for this target's objects. +include tools/CMakeFiles/spirv-stats.dir/flags.make + +tools/CMakeFiles/spirv-stats.dir/stats/stats.cpp.o: tools/CMakeFiles/spirv-stats.dir/flags.make +tools/CMakeFiles/spirv-stats.dir/stats/stats.cpp.o: ../tools/stats/stats.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object tools/CMakeFiles/spirv-stats.dir/stats/stats.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/spirv-stats.dir/stats/stats.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/stats/stats.cpp + +tools/CMakeFiles/spirv-stats.dir/stats/stats.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/spirv-stats.dir/stats/stats.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/stats/stats.cpp > CMakeFiles/spirv-stats.dir/stats/stats.cpp.i + +tools/CMakeFiles/spirv-stats.dir/stats/stats.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/spirv-stats.dir/stats/stats.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/stats/stats.cpp -o CMakeFiles/spirv-stats.dir/stats/stats.cpp.s + +tools/CMakeFiles/spirv-stats.dir/stats/stats.cpp.o.requires: + +.PHONY : tools/CMakeFiles/spirv-stats.dir/stats/stats.cpp.o.requires + +tools/CMakeFiles/spirv-stats.dir/stats/stats.cpp.o.provides: tools/CMakeFiles/spirv-stats.dir/stats/stats.cpp.o.requires + $(MAKE) -f tools/CMakeFiles/spirv-stats.dir/build.make tools/CMakeFiles/spirv-stats.dir/stats/stats.cpp.o.provides.build +.PHONY : tools/CMakeFiles/spirv-stats.dir/stats/stats.cpp.o.provides + +tools/CMakeFiles/spirv-stats.dir/stats/stats.cpp.o.provides.build: tools/CMakeFiles/spirv-stats.dir/stats/stats.cpp.o + + +tools/CMakeFiles/spirv-stats.dir/stats/stats_analyzer.cpp.o: tools/CMakeFiles/spirv-stats.dir/flags.make +tools/CMakeFiles/spirv-stats.dir/stats/stats_analyzer.cpp.o: ../tools/stats/stats_analyzer.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Building CXX object tools/CMakeFiles/spirv-stats.dir/stats/stats_analyzer.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/spirv-stats.dir/stats/stats_analyzer.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/stats/stats_analyzer.cpp + +tools/CMakeFiles/spirv-stats.dir/stats/stats_analyzer.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/spirv-stats.dir/stats/stats_analyzer.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/stats/stats_analyzer.cpp > CMakeFiles/spirv-stats.dir/stats/stats_analyzer.cpp.i + +tools/CMakeFiles/spirv-stats.dir/stats/stats_analyzer.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/spirv-stats.dir/stats/stats_analyzer.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/stats/stats_analyzer.cpp -o CMakeFiles/spirv-stats.dir/stats/stats_analyzer.cpp.s + +tools/CMakeFiles/spirv-stats.dir/stats/stats_analyzer.cpp.o.requires: + +.PHONY : tools/CMakeFiles/spirv-stats.dir/stats/stats_analyzer.cpp.o.requires + +tools/CMakeFiles/spirv-stats.dir/stats/stats_analyzer.cpp.o.provides: tools/CMakeFiles/spirv-stats.dir/stats/stats_analyzer.cpp.o.requires + $(MAKE) -f tools/CMakeFiles/spirv-stats.dir/build.make tools/CMakeFiles/spirv-stats.dir/stats/stats_analyzer.cpp.o.provides.build +.PHONY : tools/CMakeFiles/spirv-stats.dir/stats/stats_analyzer.cpp.o.provides + +tools/CMakeFiles/spirv-stats.dir/stats/stats_analyzer.cpp.o.provides.build: tools/CMakeFiles/spirv-stats.dir/stats/stats_analyzer.cpp.o + + +tools/CMakeFiles/spirv-stats.dir/stats/spirv_stats.cpp.o: tools/CMakeFiles/spirv-stats.dir/flags.make +tools/CMakeFiles/spirv-stats.dir/stats/spirv_stats.cpp.o: ../tools/stats/spirv_stats.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_3) "Building CXX object tools/CMakeFiles/spirv-stats.dir/stats/spirv_stats.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/spirv-stats.dir/stats/spirv_stats.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/stats/spirv_stats.cpp + +tools/CMakeFiles/spirv-stats.dir/stats/spirv_stats.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/spirv-stats.dir/stats/spirv_stats.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/stats/spirv_stats.cpp > CMakeFiles/spirv-stats.dir/stats/spirv_stats.cpp.i + +tools/CMakeFiles/spirv-stats.dir/stats/spirv_stats.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/spirv-stats.dir/stats/spirv_stats.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/stats/spirv_stats.cpp -o CMakeFiles/spirv-stats.dir/stats/spirv_stats.cpp.s + +tools/CMakeFiles/spirv-stats.dir/stats/spirv_stats.cpp.o.requires: + +.PHONY : tools/CMakeFiles/spirv-stats.dir/stats/spirv_stats.cpp.o.requires + +tools/CMakeFiles/spirv-stats.dir/stats/spirv_stats.cpp.o.provides: tools/CMakeFiles/spirv-stats.dir/stats/spirv_stats.cpp.o.requires + $(MAKE) -f tools/CMakeFiles/spirv-stats.dir/build.make tools/CMakeFiles/spirv-stats.dir/stats/spirv_stats.cpp.o.provides.build +.PHONY : tools/CMakeFiles/spirv-stats.dir/stats/spirv_stats.cpp.o.provides + +tools/CMakeFiles/spirv-stats.dir/stats/spirv_stats.cpp.o.provides.build: tools/CMakeFiles/spirv-stats.dir/stats/spirv_stats.cpp.o + + +# Object files for target spirv-stats +spirv__stats_OBJECTS = \ +"CMakeFiles/spirv-stats.dir/stats/stats.cpp.o" \ +"CMakeFiles/spirv-stats.dir/stats/stats_analyzer.cpp.o" \ +"CMakeFiles/spirv-stats.dir/stats/spirv_stats.cpp.o" + +# External object files for target spirv-stats +spirv__stats_EXTERNAL_OBJECTS = + +tools/spirv-stats: tools/CMakeFiles/spirv-stats.dir/stats/stats.cpp.o +tools/spirv-stats: tools/CMakeFiles/spirv-stats.dir/stats/stats_analyzer.cpp.o +tools/spirv-stats: tools/CMakeFiles/spirv-stats.dir/stats/spirv_stats.cpp.o +tools/spirv-stats: tools/CMakeFiles/spirv-stats.dir/build.make +tools/spirv-stats: source/libSPIRV-Tools.a +tools/spirv-stats: tools/CMakeFiles/spirv-stats.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --bold --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_4) "Linking CXX executable spirv-stats" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/spirv-stats.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +tools/CMakeFiles/spirv-stats.dir/build: tools/spirv-stats + +.PHONY : tools/CMakeFiles/spirv-stats.dir/build + +tools/CMakeFiles/spirv-stats.dir/requires: tools/CMakeFiles/spirv-stats.dir/stats/stats.cpp.o.requires +tools/CMakeFiles/spirv-stats.dir/requires: tools/CMakeFiles/spirv-stats.dir/stats/stats_analyzer.cpp.o.requires +tools/CMakeFiles/spirv-stats.dir/requires: tools/CMakeFiles/spirv-stats.dir/stats/spirv_stats.cpp.o.requires + +.PHONY : tools/CMakeFiles/spirv-stats.dir/requires + +tools/CMakeFiles/spirv-stats.dir/clean: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && $(CMAKE_COMMAND) -P CMakeFiles/spirv-stats.dir/cmake_clean.cmake +.PHONY : tools/CMakeFiles/spirv-stats.dir/clean + +tools/CMakeFiles/spirv-stats.dir/depend: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/bkaradzic/Private/projects/_github/SPIRV-Tools /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/CMakeFiles/spirv-stats.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : tools/CMakeFiles/spirv-stats.dir/depend + diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-stats.dir/cmake_clean.cmake b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-stats.dir/cmake_clean.cmake new file mode 100644 index 000000000..6f50c2f92 --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-stats.dir/cmake_clean.cmake @@ -0,0 +1,12 @@ +file(REMOVE_RECURSE + "CMakeFiles/spirv-stats.dir/stats/stats.cpp.o" + "CMakeFiles/spirv-stats.dir/stats/stats_analyzer.cpp.o" + "CMakeFiles/spirv-stats.dir/stats/spirv_stats.cpp.o" + "spirv-stats.pdb" + "spirv-stats" +) + +# Per-language clean rules from dependency scanning. +foreach(lang CXX) + include(CMakeFiles/spirv-stats.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-stats.dir/depend.make b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-stats.dir/depend.make new file mode 100644 index 000000000..b87af6a0d --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-stats.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for spirv-stats. +# This may be replaced when dependencies are built. diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-stats.dir/flags.make b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-stats.dir/flags.make new file mode 100644 index 000000000..589eae28d --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-stats.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# compile CXX with /usr/bin/c++ +CXX_FLAGS = -g -fPIE -Wall -Wextra -Wnon-virtual-dtor -Wno-missing-field-initializers -Werror -std=c++11 -fno-exceptions -fno-rtti -Wno-long-long -Wshadow -Wundef -Wconversion -Wno-sign-conversion -std=gnu++11 + +CXX_DEFINES = -DSPIRV_CHECK_CONTEXT -DSPIRV_COLOR_TERMINAL -DSPIRV_LINUX -DSPIRV_TIMER_ENABLED + +CXX_INCLUDES = -I/home/bkaradzic/Private/projects/_github/SPIRV-Tools -I/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build -I/home/bkaradzic/Private/projects/_github/SPIRV-Tools/external/SPIRV-Headers/include -I/home/bkaradzic/Private/projects/_github/SPIRV-Tools/include + diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-stats.dir/link.txt b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-stats.dir/link.txt new file mode 100644 index 000000000..c8e9b15bb --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-stats.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/c++ -g CMakeFiles/spirv-stats.dir/stats/stats.cpp.o CMakeFiles/spirv-stats.dir/stats/stats_analyzer.cpp.o CMakeFiles/spirv-stats.dir/stats/spirv_stats.cpp.o -o spirv-stats -rdynamic ../source/libSPIRV-Tools.a diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-stats.dir/progress.make b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-stats.dir/progress.make new file mode 100644 index 000000000..948758795 --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-stats.dir/progress.make @@ -0,0 +1,5 @@ +CMAKE_PROGRESS_1 = 94 +CMAKE_PROGRESS_2 = +CMAKE_PROGRESS_3 = +CMAKE_PROGRESS_4 = 95 + diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-val.dir/DependInfo.cmake b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-val.dir/DependInfo.cmake new file mode 100644 index 000000000..cc7c799ea --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-val.dir/DependInfo.cmake @@ -0,0 +1,33 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + "CXX" + ) +# The set of files for implicit dependencies of each language: +set(CMAKE_DEPENDS_CHECK_CXX + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/util/cli_consumer.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/CMakeFiles/spirv-val.dir/util/cli_consumer.cpp.o" + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/val/val.cpp" "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/CMakeFiles/spirv-val.dir/val/val.cpp.o" + ) +set(CMAKE_CXX_COMPILER_ID "GNU") + +# Preprocessor definitions for this target. +set(CMAKE_TARGET_DEFINITIONS_CXX + "SPIRV_CHECK_CONTEXT" + "SPIRV_COLOR_TERMINAL" + "SPIRV_LINUX" + "SPIRV_TIMER_ENABLED" + ) + +# The include file search paths: +set(CMAKE_CXX_TARGET_INCLUDE_PATH + "../" + "." + "../include" + ) + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/source/CMakeFiles/SPIRV-Tools.dir/DependInfo.cmake" + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-val.dir/build.make b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-val.dir/build.make new file mode 100644 index 000000000..d1fb5f4d5 --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-val.dir/build.make @@ -0,0 +1,141 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + +# Include any dependencies generated for this target. +include tools/CMakeFiles/spirv-val.dir/depend.make + +# Include the progress variables for this target. +include tools/CMakeFiles/spirv-val.dir/progress.make + +# Include the compile flags for this target's objects. +include tools/CMakeFiles/spirv-val.dir/flags.make + +tools/CMakeFiles/spirv-val.dir/val/val.cpp.o: tools/CMakeFiles/spirv-val.dir/flags.make +tools/CMakeFiles/spirv-val.dir/val/val.cpp.o: ../tools/val/val.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object tools/CMakeFiles/spirv-val.dir/val/val.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/spirv-val.dir/val/val.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/val/val.cpp + +tools/CMakeFiles/spirv-val.dir/val/val.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/spirv-val.dir/val/val.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/val/val.cpp > CMakeFiles/spirv-val.dir/val/val.cpp.i + +tools/CMakeFiles/spirv-val.dir/val/val.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/spirv-val.dir/val/val.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/val/val.cpp -o CMakeFiles/spirv-val.dir/val/val.cpp.s + +tools/CMakeFiles/spirv-val.dir/val/val.cpp.o.requires: + +.PHONY : tools/CMakeFiles/spirv-val.dir/val/val.cpp.o.requires + +tools/CMakeFiles/spirv-val.dir/val/val.cpp.o.provides: tools/CMakeFiles/spirv-val.dir/val/val.cpp.o.requires + $(MAKE) -f tools/CMakeFiles/spirv-val.dir/build.make tools/CMakeFiles/spirv-val.dir/val/val.cpp.o.provides.build +.PHONY : tools/CMakeFiles/spirv-val.dir/val/val.cpp.o.provides + +tools/CMakeFiles/spirv-val.dir/val/val.cpp.o.provides.build: tools/CMakeFiles/spirv-val.dir/val/val.cpp.o + + +tools/CMakeFiles/spirv-val.dir/util/cli_consumer.cpp.o: tools/CMakeFiles/spirv-val.dir/flags.make +tools/CMakeFiles/spirv-val.dir/util/cli_consumer.cpp.o: ../tools/util/cli_consumer.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Building CXX object tools/CMakeFiles/spirv-val.dir/util/cli_consumer.cpp.o" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/spirv-val.dir/util/cli_consumer.cpp.o -c /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/util/cli_consumer.cpp + +tools/CMakeFiles/spirv-val.dir/util/cli_consumer.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/spirv-val.dir/util/cli_consumer.cpp.i" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/util/cli_consumer.cpp > CMakeFiles/spirv-val.dir/util/cli_consumer.cpp.i + +tools/CMakeFiles/spirv-val.dir/util/cli_consumer.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/spirv-val.dir/util/cli_consumer.cpp.s" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/util/cli_consumer.cpp -o CMakeFiles/spirv-val.dir/util/cli_consumer.cpp.s + +tools/CMakeFiles/spirv-val.dir/util/cli_consumer.cpp.o.requires: + +.PHONY : tools/CMakeFiles/spirv-val.dir/util/cli_consumer.cpp.o.requires + +tools/CMakeFiles/spirv-val.dir/util/cli_consumer.cpp.o.provides: tools/CMakeFiles/spirv-val.dir/util/cli_consumer.cpp.o.requires + $(MAKE) -f tools/CMakeFiles/spirv-val.dir/build.make tools/CMakeFiles/spirv-val.dir/util/cli_consumer.cpp.o.provides.build +.PHONY : tools/CMakeFiles/spirv-val.dir/util/cli_consumer.cpp.o.provides + +tools/CMakeFiles/spirv-val.dir/util/cli_consumer.cpp.o.provides.build: tools/CMakeFiles/spirv-val.dir/util/cli_consumer.cpp.o + + +# Object files for target spirv-val +spirv__val_OBJECTS = \ +"CMakeFiles/spirv-val.dir/val/val.cpp.o" \ +"CMakeFiles/spirv-val.dir/util/cli_consumer.cpp.o" + +# External object files for target spirv-val +spirv__val_EXTERNAL_OBJECTS = + +tools/spirv-val: tools/CMakeFiles/spirv-val.dir/val/val.cpp.o +tools/spirv-val: tools/CMakeFiles/spirv-val.dir/util/cli_consumer.cpp.o +tools/spirv-val: tools/CMakeFiles/spirv-val.dir/build.make +tools/spirv-val: source/libSPIRV-Tools.a +tools/spirv-val: tools/CMakeFiles/spirv-val.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --bold --progress-dir=/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_3) "Linking CXX executable spirv-val" + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/spirv-val.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +tools/CMakeFiles/spirv-val.dir/build: tools/spirv-val + +.PHONY : tools/CMakeFiles/spirv-val.dir/build + +tools/CMakeFiles/spirv-val.dir/requires: tools/CMakeFiles/spirv-val.dir/val/val.cpp.o.requires +tools/CMakeFiles/spirv-val.dir/requires: tools/CMakeFiles/spirv-val.dir/util/cli_consumer.cpp.o.requires + +.PHONY : tools/CMakeFiles/spirv-val.dir/requires + +tools/CMakeFiles/spirv-val.dir/clean: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools && $(CMAKE_COMMAND) -P CMakeFiles/spirv-val.dir/cmake_clean.cmake +.PHONY : tools/CMakeFiles/spirv-val.dir/clean + +tools/CMakeFiles/spirv-val.dir/depend: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/bkaradzic/Private/projects/_github/SPIRV-Tools /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/CMakeFiles/spirv-val.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : tools/CMakeFiles/spirv-val.dir/depend + diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-val.dir/cmake_clean.cmake b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-val.dir/cmake_clean.cmake new file mode 100644 index 000000000..2fcc9ead1 --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-val.dir/cmake_clean.cmake @@ -0,0 +1,11 @@ +file(REMOVE_RECURSE + "CMakeFiles/spirv-val.dir/val/val.cpp.o" + "CMakeFiles/spirv-val.dir/util/cli_consumer.cpp.o" + "spirv-val.pdb" + "spirv-val" +) + +# Per-language clean rules from dependency scanning. +foreach(lang CXX) + include(CMakeFiles/spirv-val.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-val.dir/depend.make b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-val.dir/depend.make new file mode 100644 index 000000000..cda017148 --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-val.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for spirv-val. +# This may be replaced when dependencies are built. diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-val.dir/flags.make b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-val.dir/flags.make new file mode 100644 index 000000000..345211d87 --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-val.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# compile CXX with /usr/bin/c++ +CXX_FLAGS = -g -fPIE -Wall -Wextra -Wnon-virtual-dtor -Wno-missing-field-initializers -Werror -std=c++11 -fno-exceptions -fno-rtti -Wno-long-long -Wshadow -Wundef -Wconversion -Wno-sign-conversion -std=gnu++11 + +CXX_DEFINES = -DSPIRV_CHECK_CONTEXT -DSPIRV_COLOR_TERMINAL -DSPIRV_LINUX -DSPIRV_TIMER_ENABLED + +CXX_INCLUDES = -I/home/bkaradzic/Private/projects/_github/SPIRV-Tools -I/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build -I/home/bkaradzic/Private/projects/_github/SPIRV-Tools/include + diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-val.dir/link.txt b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-val.dir/link.txt new file mode 100644 index 000000000..acd8cc0d7 --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-val.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/c++ -g CMakeFiles/spirv-val.dir/val/val.cpp.o CMakeFiles/spirv-val.dir/util/cli_consumer.cpp.o -o spirv-val -rdynamic ../source/libSPIRV-Tools.a diff --git a/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-val.dir/progress.make b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-val.dir/progress.make new file mode 100644 index 000000000..ec90ad949 --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CMakeFiles/spirv-val.dir/progress.make @@ -0,0 +1,4 @@ +CMAKE_PROGRESS_1 = 99 +CMAKE_PROGRESS_2 = +CMAKE_PROGRESS_3 = 100 + diff --git a/3rdparty/spirv-tools/build/tools/CTestTestfile.cmake b/3rdparty/spirv-tools/build/tools/CTestTestfile.cmake new file mode 100644 index 000000000..e76c3f478 --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/CTestTestfile.cmake @@ -0,0 +1,8 @@ +# CMake generated Testfile for +# Source directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools +# Build directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. +subdirs(lesspipe) +subdirs(emacs) diff --git a/3rdparty/spirv-tools/build/tools/Makefile b/3rdparty/spirv-tools/build/tools/Makefile new file mode 100644 index 000000000..9f7ca48ab --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/Makefile @@ -0,0 +1,639 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Default target executed when no arguments are given to make. +default_target: all + +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache + +.PHONY : rebuild_cache/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Available install components are: \"Unspecified\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components + +.PHONY : list_install_components/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..." + /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache + +.PHONY : edit_cache/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: install/strip + +.PHONY : install/strip/fast + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: install/local + +.PHONY : install/local/fast + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running tests..." + /usr/bin/ctest --force-new-ctest-process $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test + +.PHONY : test/fast + +# The main all target +all: cmake_check_build_system + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/CMakeFiles/progress.marks + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 tools/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 tools/clean +.PHONY : clean + +# The main clean target +clean/fast: clean + +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 tools/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 tools/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Convenience name for target. +tools/CMakeFiles/spirv-cfg.dir/rule: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 tools/CMakeFiles/spirv-cfg.dir/rule +.PHONY : tools/CMakeFiles/spirv-cfg.dir/rule + +# Convenience name for target. +spirv-cfg: tools/CMakeFiles/spirv-cfg.dir/rule + +.PHONY : spirv-cfg + +# fast build rule for target. +spirv-cfg/fast: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f tools/CMakeFiles/spirv-cfg.dir/build.make tools/CMakeFiles/spirv-cfg.dir/build +.PHONY : spirv-cfg/fast + +# Convenience name for target. +tools/CMakeFiles/spirv-dis.dir/rule: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 tools/CMakeFiles/spirv-dis.dir/rule +.PHONY : tools/CMakeFiles/spirv-dis.dir/rule + +# Convenience name for target. +spirv-dis: tools/CMakeFiles/spirv-dis.dir/rule + +.PHONY : spirv-dis + +# fast build rule for target. +spirv-dis/fast: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f tools/CMakeFiles/spirv-dis.dir/build.make tools/CMakeFiles/spirv-dis.dir/build +.PHONY : spirv-dis/fast + +# Convenience name for target. +tools/CMakeFiles/spirv-as.dir/rule: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 tools/CMakeFiles/spirv-as.dir/rule +.PHONY : tools/CMakeFiles/spirv-as.dir/rule + +# Convenience name for target. +spirv-as: tools/CMakeFiles/spirv-as.dir/rule + +.PHONY : spirv-as + +# fast build rule for target. +spirv-as/fast: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f tools/CMakeFiles/spirv-as.dir/build.make tools/CMakeFiles/spirv-as.dir/build +.PHONY : spirv-as/fast + +# Convenience name for target. +tools/CMakeFiles/spirv-val.dir/rule: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 tools/CMakeFiles/spirv-val.dir/rule +.PHONY : tools/CMakeFiles/spirv-val.dir/rule + +# Convenience name for target. +spirv-val: tools/CMakeFiles/spirv-val.dir/rule + +.PHONY : spirv-val + +# fast build rule for target. +spirv-val/fast: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f tools/CMakeFiles/spirv-val.dir/build.make tools/CMakeFiles/spirv-val.dir/build +.PHONY : spirv-val/fast + +# Convenience name for target. +tools/CMakeFiles/spirv-link.dir/rule: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 tools/CMakeFiles/spirv-link.dir/rule +.PHONY : tools/CMakeFiles/spirv-link.dir/rule + +# Convenience name for target. +spirv-link: tools/CMakeFiles/spirv-link.dir/rule + +.PHONY : spirv-link + +# fast build rule for target. +spirv-link/fast: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f tools/CMakeFiles/spirv-link.dir/build.make tools/CMakeFiles/spirv-link.dir/build +.PHONY : spirv-link/fast + +# Convenience name for target. +tools/CMakeFiles/spirv-opt.dir/rule: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 tools/CMakeFiles/spirv-opt.dir/rule +.PHONY : tools/CMakeFiles/spirv-opt.dir/rule + +# Convenience name for target. +spirv-opt: tools/CMakeFiles/spirv-opt.dir/rule + +.PHONY : spirv-opt + +# fast build rule for target. +spirv-opt/fast: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f tools/CMakeFiles/spirv-opt.dir/build.make tools/CMakeFiles/spirv-opt.dir/build +.PHONY : spirv-opt/fast + +# Convenience name for target. +tools/CMakeFiles/spirv-stats.dir/rule: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 tools/CMakeFiles/spirv-stats.dir/rule +.PHONY : tools/CMakeFiles/spirv-stats.dir/rule + +# Convenience name for target. +spirv-stats: tools/CMakeFiles/spirv-stats.dir/rule + +.PHONY : spirv-stats + +# fast build rule for target. +spirv-stats/fast: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f tools/CMakeFiles/spirv-stats.dir/build.make tools/CMakeFiles/spirv-stats.dir/build +.PHONY : spirv-stats/fast + +as/as.o: as/as.cpp.o + +.PHONY : as/as.o + +# target to build an object file +as/as.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f tools/CMakeFiles/spirv-as.dir/build.make tools/CMakeFiles/spirv-as.dir/as/as.cpp.o +.PHONY : as/as.cpp.o + +as/as.i: as/as.cpp.i + +.PHONY : as/as.i + +# target to preprocess a source file +as/as.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f tools/CMakeFiles/spirv-as.dir/build.make tools/CMakeFiles/spirv-as.dir/as/as.cpp.i +.PHONY : as/as.cpp.i + +as/as.s: as/as.cpp.s + +.PHONY : as/as.s + +# target to generate assembly for a file +as/as.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f tools/CMakeFiles/spirv-as.dir/build.make tools/CMakeFiles/spirv-as.dir/as/as.cpp.s +.PHONY : as/as.cpp.s + +cfg/bin_to_dot.o: cfg/bin_to_dot.cpp.o + +.PHONY : cfg/bin_to_dot.o + +# target to build an object file +cfg/bin_to_dot.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f tools/CMakeFiles/spirv-cfg.dir/build.make tools/CMakeFiles/spirv-cfg.dir/cfg/bin_to_dot.cpp.o +.PHONY : cfg/bin_to_dot.cpp.o + +cfg/bin_to_dot.i: cfg/bin_to_dot.cpp.i + +.PHONY : cfg/bin_to_dot.i + +# target to preprocess a source file +cfg/bin_to_dot.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f tools/CMakeFiles/spirv-cfg.dir/build.make tools/CMakeFiles/spirv-cfg.dir/cfg/bin_to_dot.cpp.i +.PHONY : cfg/bin_to_dot.cpp.i + +cfg/bin_to_dot.s: cfg/bin_to_dot.cpp.s + +.PHONY : cfg/bin_to_dot.s + +# target to generate assembly for a file +cfg/bin_to_dot.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f tools/CMakeFiles/spirv-cfg.dir/build.make tools/CMakeFiles/spirv-cfg.dir/cfg/bin_to_dot.cpp.s +.PHONY : cfg/bin_to_dot.cpp.s + +cfg/cfg.o: cfg/cfg.cpp.o + +.PHONY : cfg/cfg.o + +# target to build an object file +cfg/cfg.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f tools/CMakeFiles/spirv-cfg.dir/build.make tools/CMakeFiles/spirv-cfg.dir/cfg/cfg.cpp.o +.PHONY : cfg/cfg.cpp.o + +cfg/cfg.i: cfg/cfg.cpp.i + +.PHONY : cfg/cfg.i + +# target to preprocess a source file +cfg/cfg.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f tools/CMakeFiles/spirv-cfg.dir/build.make tools/CMakeFiles/spirv-cfg.dir/cfg/cfg.cpp.i +.PHONY : cfg/cfg.cpp.i + +cfg/cfg.s: cfg/cfg.cpp.s + +.PHONY : cfg/cfg.s + +# target to generate assembly for a file +cfg/cfg.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f tools/CMakeFiles/spirv-cfg.dir/build.make tools/CMakeFiles/spirv-cfg.dir/cfg/cfg.cpp.s +.PHONY : cfg/cfg.cpp.s + +dis/dis.o: dis/dis.cpp.o + +.PHONY : dis/dis.o + +# target to build an object file +dis/dis.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f tools/CMakeFiles/spirv-dis.dir/build.make tools/CMakeFiles/spirv-dis.dir/dis/dis.cpp.o +.PHONY : dis/dis.cpp.o + +dis/dis.i: dis/dis.cpp.i + +.PHONY : dis/dis.i + +# target to preprocess a source file +dis/dis.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f tools/CMakeFiles/spirv-dis.dir/build.make tools/CMakeFiles/spirv-dis.dir/dis/dis.cpp.i +.PHONY : dis/dis.cpp.i + +dis/dis.s: dis/dis.cpp.s + +.PHONY : dis/dis.s + +# target to generate assembly for a file +dis/dis.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f tools/CMakeFiles/spirv-dis.dir/build.make tools/CMakeFiles/spirv-dis.dir/dis/dis.cpp.s +.PHONY : dis/dis.cpp.s + +link/linker.o: link/linker.cpp.o + +.PHONY : link/linker.o + +# target to build an object file +link/linker.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f tools/CMakeFiles/spirv-link.dir/build.make tools/CMakeFiles/spirv-link.dir/link/linker.cpp.o +.PHONY : link/linker.cpp.o + +link/linker.i: link/linker.cpp.i + +.PHONY : link/linker.i + +# target to preprocess a source file +link/linker.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f tools/CMakeFiles/spirv-link.dir/build.make tools/CMakeFiles/spirv-link.dir/link/linker.cpp.i +.PHONY : link/linker.cpp.i + +link/linker.s: link/linker.cpp.s + +.PHONY : link/linker.s + +# target to generate assembly for a file +link/linker.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f tools/CMakeFiles/spirv-link.dir/build.make tools/CMakeFiles/spirv-link.dir/link/linker.cpp.s +.PHONY : link/linker.cpp.s + +opt/opt.o: opt/opt.cpp.o + +.PHONY : opt/opt.o + +# target to build an object file +opt/opt.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f tools/CMakeFiles/spirv-opt.dir/build.make tools/CMakeFiles/spirv-opt.dir/opt/opt.cpp.o +.PHONY : opt/opt.cpp.o + +opt/opt.i: opt/opt.cpp.i + +.PHONY : opt/opt.i + +# target to preprocess a source file +opt/opt.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f tools/CMakeFiles/spirv-opt.dir/build.make tools/CMakeFiles/spirv-opt.dir/opt/opt.cpp.i +.PHONY : opt/opt.cpp.i + +opt/opt.s: opt/opt.cpp.s + +.PHONY : opt/opt.s + +# target to generate assembly for a file +opt/opt.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f tools/CMakeFiles/spirv-opt.dir/build.make tools/CMakeFiles/spirv-opt.dir/opt/opt.cpp.s +.PHONY : opt/opt.cpp.s + +stats/spirv_stats.o: stats/spirv_stats.cpp.o + +.PHONY : stats/spirv_stats.o + +# target to build an object file +stats/spirv_stats.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f tools/CMakeFiles/spirv-stats.dir/build.make tools/CMakeFiles/spirv-stats.dir/stats/spirv_stats.cpp.o +.PHONY : stats/spirv_stats.cpp.o + +stats/spirv_stats.i: stats/spirv_stats.cpp.i + +.PHONY : stats/spirv_stats.i + +# target to preprocess a source file +stats/spirv_stats.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f tools/CMakeFiles/spirv-stats.dir/build.make tools/CMakeFiles/spirv-stats.dir/stats/spirv_stats.cpp.i +.PHONY : stats/spirv_stats.cpp.i + +stats/spirv_stats.s: stats/spirv_stats.cpp.s + +.PHONY : stats/spirv_stats.s + +# target to generate assembly for a file +stats/spirv_stats.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f tools/CMakeFiles/spirv-stats.dir/build.make tools/CMakeFiles/spirv-stats.dir/stats/spirv_stats.cpp.s +.PHONY : stats/spirv_stats.cpp.s + +stats/stats.o: stats/stats.cpp.o + +.PHONY : stats/stats.o + +# target to build an object file +stats/stats.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f tools/CMakeFiles/spirv-stats.dir/build.make tools/CMakeFiles/spirv-stats.dir/stats/stats.cpp.o +.PHONY : stats/stats.cpp.o + +stats/stats.i: stats/stats.cpp.i + +.PHONY : stats/stats.i + +# target to preprocess a source file +stats/stats.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f tools/CMakeFiles/spirv-stats.dir/build.make tools/CMakeFiles/spirv-stats.dir/stats/stats.cpp.i +.PHONY : stats/stats.cpp.i + +stats/stats.s: stats/stats.cpp.s + +.PHONY : stats/stats.s + +# target to generate assembly for a file +stats/stats.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f tools/CMakeFiles/spirv-stats.dir/build.make tools/CMakeFiles/spirv-stats.dir/stats/stats.cpp.s +.PHONY : stats/stats.cpp.s + +stats/stats_analyzer.o: stats/stats_analyzer.cpp.o + +.PHONY : stats/stats_analyzer.o + +# target to build an object file +stats/stats_analyzer.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f tools/CMakeFiles/spirv-stats.dir/build.make tools/CMakeFiles/spirv-stats.dir/stats/stats_analyzer.cpp.o +.PHONY : stats/stats_analyzer.cpp.o + +stats/stats_analyzer.i: stats/stats_analyzer.cpp.i + +.PHONY : stats/stats_analyzer.i + +# target to preprocess a source file +stats/stats_analyzer.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f tools/CMakeFiles/spirv-stats.dir/build.make tools/CMakeFiles/spirv-stats.dir/stats/stats_analyzer.cpp.i +.PHONY : stats/stats_analyzer.cpp.i + +stats/stats_analyzer.s: stats/stats_analyzer.cpp.s + +.PHONY : stats/stats_analyzer.s + +# target to generate assembly for a file +stats/stats_analyzer.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f tools/CMakeFiles/spirv-stats.dir/build.make tools/CMakeFiles/spirv-stats.dir/stats/stats_analyzer.cpp.s +.PHONY : stats/stats_analyzer.cpp.s + +util/cli_consumer.o: util/cli_consumer.cpp.o + +.PHONY : util/cli_consumer.o + +# target to build an object file +util/cli_consumer.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f tools/CMakeFiles/spirv-val.dir/build.make tools/CMakeFiles/spirv-val.dir/util/cli_consumer.cpp.o + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f tools/CMakeFiles/spirv-opt.dir/build.make tools/CMakeFiles/spirv-opt.dir/util/cli_consumer.cpp.o +.PHONY : util/cli_consumer.cpp.o + +util/cli_consumer.i: util/cli_consumer.cpp.i + +.PHONY : util/cli_consumer.i + +# target to preprocess a source file +util/cli_consumer.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f tools/CMakeFiles/spirv-val.dir/build.make tools/CMakeFiles/spirv-val.dir/util/cli_consumer.cpp.i + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f tools/CMakeFiles/spirv-opt.dir/build.make tools/CMakeFiles/spirv-opt.dir/util/cli_consumer.cpp.i +.PHONY : util/cli_consumer.cpp.i + +util/cli_consumer.s: util/cli_consumer.cpp.s + +.PHONY : util/cli_consumer.s + +# target to generate assembly for a file +util/cli_consumer.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f tools/CMakeFiles/spirv-val.dir/build.make tools/CMakeFiles/spirv-val.dir/util/cli_consumer.cpp.s + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f tools/CMakeFiles/spirv-opt.dir/build.make tools/CMakeFiles/spirv-opt.dir/util/cli_consumer.cpp.s +.PHONY : util/cli_consumer.cpp.s + +val/val.o: val/val.cpp.o + +.PHONY : val/val.o + +# target to build an object file +val/val.cpp.o: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f tools/CMakeFiles/spirv-val.dir/build.make tools/CMakeFiles/spirv-val.dir/val/val.cpp.o +.PHONY : val/val.cpp.o + +val/val.i: val/val.cpp.i + +.PHONY : val/val.i + +# target to preprocess a source file +val/val.cpp.i: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f tools/CMakeFiles/spirv-val.dir/build.make tools/CMakeFiles/spirv-val.dir/val/val.cpp.i +.PHONY : val/val.cpp.i + +val/val.s: val/val.cpp.s + +.PHONY : val/val.s + +# target to generate assembly for a file +val/val.cpp.s: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f tools/CMakeFiles/spirv-val.dir/build.make tools/CMakeFiles/spirv-val.dir/val/val.cpp.s +.PHONY : val/val.cpp.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... rebuild_cache" + @echo "... list_install_components" + @echo "... edit_cache" + @echo "... install/strip" + @echo "... install" + @echo "... spirv-cfg" + @echo "... spirv-dis" + @echo "... spirv-as" + @echo "... spirv-val" + @echo "... spirv-link" + @echo "... spirv-opt" + @echo "... install/local" + @echo "... test" + @echo "... spirv-stats" + @echo "... as/as.o" + @echo "... as/as.i" + @echo "... as/as.s" + @echo "... cfg/bin_to_dot.o" + @echo "... cfg/bin_to_dot.i" + @echo "... cfg/bin_to_dot.s" + @echo "... cfg/cfg.o" + @echo "... cfg/cfg.i" + @echo "... cfg/cfg.s" + @echo "... dis/dis.o" + @echo "... dis/dis.i" + @echo "... dis/dis.s" + @echo "... link/linker.o" + @echo "... link/linker.i" + @echo "... link/linker.s" + @echo "... opt/opt.o" + @echo "... opt/opt.i" + @echo "... opt/opt.s" + @echo "... stats/spirv_stats.o" + @echo "... stats/spirv_stats.i" + @echo "... stats/spirv_stats.s" + @echo "... stats/stats.o" + @echo "... stats/stats.i" + @echo "... stats/stats.s" + @echo "... stats/stats_analyzer.o" + @echo "... stats/stats_analyzer.i" + @echo "... stats/stats_analyzer.s" + @echo "... util/cli_consumer.o" + @echo "... util/cli_consumer.i" + @echo "... util/cli_consumer.s" + @echo "... val/val.o" + @echo "... val/val.i" + @echo "... val/val.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/3rdparty/spirv-tools/build/tools/cmake_install.cmake b/3rdparty/spirv-tools/build/tools/cmake_install.cmake new file mode 100644 index 000000000..de142775b --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/cmake_install.cmake @@ -0,0 +1,153 @@ +# Install script for directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Debug") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "1") +endif() + +if(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + if(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/spirv-as" AND + NOT IS_SYMLINK "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/spirv-as") + file(RPATH_CHECK + FILE "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/spirv-as" + RPATH "") + endif() + file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/bin" TYPE EXECUTABLE FILES "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/spirv-as") + if(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/spirv-as" AND + NOT IS_SYMLINK "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/spirv-as") + if(CMAKE_INSTALL_DO_STRIP) + execute_process(COMMAND "/usr/bin/strip" "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/spirv-as") + endif() + endif() +endif() + +if(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + if(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/spirv-dis" AND + NOT IS_SYMLINK "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/spirv-dis") + file(RPATH_CHECK + FILE "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/spirv-dis" + RPATH "") + endif() + file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/bin" TYPE EXECUTABLE FILES "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/spirv-dis") + if(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/spirv-dis" AND + NOT IS_SYMLINK "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/spirv-dis") + if(CMAKE_INSTALL_DO_STRIP) + execute_process(COMMAND "/usr/bin/strip" "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/spirv-dis") + endif() + endif() +endif() + +if(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + if(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/spirv-val" AND + NOT IS_SYMLINK "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/spirv-val") + file(RPATH_CHECK + FILE "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/spirv-val" + RPATH "") + endif() + file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/bin" TYPE EXECUTABLE FILES "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/spirv-val") + if(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/spirv-val" AND + NOT IS_SYMLINK "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/spirv-val") + if(CMAKE_INSTALL_DO_STRIP) + execute_process(COMMAND "/usr/bin/strip" "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/spirv-val") + endif() + endif() +endif() + +if(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + if(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/spirv-opt" AND + NOT IS_SYMLINK "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/spirv-opt") + file(RPATH_CHECK + FILE "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/spirv-opt" + RPATH "") + endif() + file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/bin" TYPE EXECUTABLE FILES "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/spirv-opt") + if(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/spirv-opt" AND + NOT IS_SYMLINK "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/spirv-opt") + if(CMAKE_INSTALL_DO_STRIP) + execute_process(COMMAND "/usr/bin/strip" "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/spirv-opt") + endif() + endif() +endif() + +if(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + if(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/spirv-stats" AND + NOT IS_SYMLINK "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/spirv-stats") + file(RPATH_CHECK + FILE "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/spirv-stats" + RPATH "") + endif() + file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/bin" TYPE EXECUTABLE FILES "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/spirv-stats") + if(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/spirv-stats" AND + NOT IS_SYMLINK "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/spirv-stats") + if(CMAKE_INSTALL_DO_STRIP) + execute_process(COMMAND "/usr/bin/strip" "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/spirv-stats") + endif() + endif() +endif() + +if(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + if(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/spirv-cfg" AND + NOT IS_SYMLINK "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/spirv-cfg") + file(RPATH_CHECK + FILE "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/spirv-cfg" + RPATH "") + endif() + file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/bin" TYPE EXECUTABLE FILES "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/spirv-cfg") + if(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/spirv-cfg" AND + NOT IS_SYMLINK "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/spirv-cfg") + if(CMAKE_INSTALL_DO_STRIP) + execute_process(COMMAND "/usr/bin/strip" "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/spirv-cfg") + endif() + endif() +endif() + +if(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + if(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/spirv-link" AND + NOT IS_SYMLINK "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/spirv-link") + file(RPATH_CHECK + FILE "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/spirv-link" + RPATH "") + endif() + file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/bin" TYPE EXECUTABLE FILES "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/spirv-link") + if(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/spirv-link" AND + NOT IS_SYMLINK "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/spirv-link") + if(CMAKE_INSTALL_DO_STRIP) + execute_process(COMMAND "/usr/bin/strip" "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/spirv-link") + endif() + endif() +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + # Include the install script for each subdirectory. + include("/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/lesspipe/cmake_install.cmake") + include("/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/emacs/cmake_install.cmake") + +endif() + diff --git a/3rdparty/spirv-tools/build/tools/emacs/CMakeFiles/CMakeDirectoryInformation.cmake b/3rdparty/spirv-tools/build/tools/emacs/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 000000000..b636c3f88 --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/emacs/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/bkaradzic/Private/projects/_github/SPIRV-Tools") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/3rdparty/spirv-tools/build/tools/emacs/CMakeFiles/progress.marks b/3rdparty/spirv-tools/build/tools/emacs/CMakeFiles/progress.marks new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/emacs/CMakeFiles/progress.marks @@ -0,0 +1 @@ +0 diff --git a/3rdparty/spirv-tools/build/tools/emacs/CTestTestfile.cmake b/3rdparty/spirv-tools/build/tools/emacs/CTestTestfile.cmake new file mode 100644 index 000000000..e2a7b0f49 --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/emacs/CTestTestfile.cmake @@ -0,0 +1,6 @@ +# CMake generated Testfile for +# Source directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/emacs +# Build directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/emacs +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. diff --git a/3rdparty/spirv-tools/build/tools/emacs/Makefile b/3rdparty/spirv-tools/build/tools/emacs/Makefile new file mode 100644 index 000000000..4b8c2b57a --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/emacs/Makefile @@ -0,0 +1,194 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Default target executed when no arguments are given to make. +default_target: all + +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..." + /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache + +.PHONY : edit_cache/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: install/strip + +.PHONY : install/strip/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Available install components are: \"Unspecified\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components + +.PHONY : list_install_components/fast + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running tests..." + /usr/bin/ctest --force-new-ctest-process $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test + +.PHONY : test/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: install/local + +.PHONY : install/local/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache + +.PHONY : rebuild_cache/fast + +# The main all target +all: cmake_check_build_system + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/emacs/CMakeFiles/progress.marks + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 tools/emacs/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 tools/emacs/clean +.PHONY : clean + +# The main clean target +clean/fast: clean + +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 tools/emacs/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 tools/emacs/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... install" + @echo "... edit_cache" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... test" + @echo "... install/local" + @echo "... rebuild_cache" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/3rdparty/spirv-tools/build/tools/emacs/cmake_install.cmake b/3rdparty/spirv-tools/build/tools/emacs/cmake_install.cmake new file mode 100644 index 000000000..09980b79b --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/emacs/cmake_install.cmake @@ -0,0 +1,34 @@ +# Install script for directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/emacs + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Debug") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "1") +endif() + diff --git a/3rdparty/spirv-tools/build/tools/lesspipe/CMakeFiles/CMakeDirectoryInformation.cmake b/3rdparty/spirv-tools/build/tools/lesspipe/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 000000000..b636c3f88 --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/lesspipe/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/bkaradzic/Private/projects/_github/SPIRV-Tools") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/3rdparty/spirv-tools/build/tools/lesspipe/CMakeFiles/progress.marks b/3rdparty/spirv-tools/build/tools/lesspipe/CMakeFiles/progress.marks new file mode 100644 index 000000000..573541ac9 --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/lesspipe/CMakeFiles/progress.marks @@ -0,0 +1 @@ +0 diff --git a/3rdparty/spirv-tools/build/tools/lesspipe/CTestTestfile.cmake b/3rdparty/spirv-tools/build/tools/lesspipe/CTestTestfile.cmake new file mode 100644 index 000000000..ece23213d --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/lesspipe/CTestTestfile.cmake @@ -0,0 +1,6 @@ +# CMake generated Testfile for +# Source directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/lesspipe +# Build directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/lesspipe +# +# This file includes the relevant testing commands required for +# testing this directory and lists subdirectories to be tested as well. diff --git a/3rdparty/spirv-tools/build/tools/lesspipe/Makefile b/3rdparty/spirv-tools/build/tools/lesspipe/Makefile new file mode 100644 index 000000000..f199ea43b --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/lesspipe/Makefile @@ -0,0 +1,194 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Default target executed when no arguments are given to make. +default_target: all + +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "No interactive CMake dialog available..." + /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache + +.PHONY : edit_cache/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: install/strip + +.PHONY : install/strip/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Available install components are: \"Unspecified\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components + +.PHONY : list_install_components/fast + +# Special rule for the target test +test: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running tests..." + /usr/bin/ctest --force-new-ctest-process $(ARGS) +.PHONY : test + +# Special rule for the target test +test/fast: test + +.PHONY : test/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: install/local + +.PHONY : install/local/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache + +.PHONY : rebuild_cache/fast + +# The main all target +all: cmake_check_build_system + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/tools/lesspipe/CMakeFiles/progress.marks + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 tools/lesspipe/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 tools/lesspipe/clean +.PHONY : clean + +# The main clean target +clean/fast: clean + +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 tools/lesspipe/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(MAKE) -f CMakeFiles/Makefile2 tools/lesspipe/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... install" + @echo "... edit_cache" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... test" + @echo "... install/local" + @echo "... rebuild_cache" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/bkaradzic/Private/projects/_github/SPIRV-Tools/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/3rdparty/spirv-tools/build/tools/lesspipe/cmake_install.cmake b/3rdparty/spirv-tools/build/tools/lesspipe/cmake_install.cmake new file mode 100644 index 000000000..d27e3efa4 --- /dev/null +++ b/3rdparty/spirv-tools/build/tools/lesspipe/cmake_install.cmake @@ -0,0 +1,38 @@ +# Install script for directory: /home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/lesspipe + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Debug") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "1") +endif() + +if(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/bin" TYPE PROGRAM FILES "/home/bkaradzic/Private/projects/_github/SPIRV-Tools/tools/lesspipe/spirv-lesspipe.sh") +endif() + diff --git a/3rdparty/spirv-tools/external/CMakeLists.txt b/3rdparty/spirv-tools/external/CMakeLists.txt index da0b2e649..d1251c248 100644 --- a/3rdparty/spirv-tools/external/CMakeLists.txt +++ b/3rdparty/spirv-tools/external/CMakeLists.txt @@ -66,57 +66,39 @@ if (NOT ${SPIRV_SKIP_TESTS}) endforeach() endif() - set(SPIRV_ENABLE_EFFCEE ON) - if (MSVC) - if (MSVC_VERSION LESS 1900) - message(STATUS "SPIRV-Tools: Need Visual Studio 2015 or later for Effcee and RE2") - set(SPIRV_ENABLE_EFFCEE OFF) - endif() - endif() + # Find Effcee and RE2, for testing. - if (SPIRV_ENABLE_EFFCEE) - # Find Effcee and RE2, for testing. - # Optional for now, but eventually we'll make this required. - - # First find RE2, since Effcee depends on it. - # If already configured, then use that. Otherwise, prefer to find it under 're2' - # in this directory. - if (NOT TARGET re2) - # If we are configuring RE2, then turn off its testing. It takes a long time and - # does not add much value for us. If an enclosing project configured RE2, then it - # has already chosen whether to enable RE2 tesitng. - set(RE2_BUILD_TESTING OFF CACHE STRING "Run RE2 Tests") - if (NOT RE2_SOURCE_DIR) - if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/re2) - set(RE2_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/re2" CACHE STRING "RE2 source dir" ) - endif() + # First find RE2, since Effcee depends on it. + # If already configured, then use that. Otherwise, prefer to find it under 're2' + # in this directory. + if (NOT TARGET re2) + # If we are configuring RE2, then turn off its testing. It takes a long time and + # does not add much value for us. If an enclosing project configured RE2, then it + # has already chosen whether to enable RE2 testing. + set(RE2_BUILD_TESTING OFF CACHE STRING "Run RE2 Tests") + if (NOT RE2_SOURCE_DIR) + if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/re2) + set(RE2_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/re2" CACHE STRING "RE2 source dir" ) endif() endif() + endif() - if (NOT TARGET effcee) - # Expect to find effcee in this directory. - if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/effcee) - # If we're configuring RE2 (via Effcee), then turn off RE2 testing. - if (NOT TARGET re2) - set(RE2_BUILD_TESTING OFF) - endif() - if (MSVC) - # SPIRV-Tools uses the shared CRT with MSVC. Tell Effcee to do the same. - set(EFFCEE_ENABLE_SHARED_CRT ON) - endif() - add_subdirectory(effcee) - set_property(TARGET effcee PROPERTY FOLDER Effcee) - # Turn off warnings for effcee and re2 - set_property(TARGET effcee APPEND PROPERTY COMPILE_OPTIONS -w) - set_property(TARGET re2 APPEND PROPERTY COMPILE_OPTIONS -w) + if (NOT TARGET effcee) + # Expect to find effcee in this directory. + if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/effcee) + # If we're configuring RE2 (via Effcee), then turn off RE2 testing. + if (NOT TARGET re2) + set(RE2_BUILD_TESTING OFF) endif() + if (MSVC) + # SPIRV-Tools uses the shared CRT with MSVC. Tell Effcee to do the same. + set(EFFCEE_ENABLE_SHARED_CRT ON) + endif() + add_subdirectory(effcee) + set_property(TARGET effcee PROPERTY FOLDER Effcee) + # Turn off warnings for effcee and re2 + set_property(TARGET effcee APPEND PROPERTY COMPILE_OPTIONS -w) + set_property(TARGET re2 APPEND PROPERTY COMPILE_OPTIONS -w) endif() - # TODO(dneto): Eventually, require this. endif() - if (TARGET effcee) - message(STATUS "SPIRV-Tools: Effcee is configured") - else() - message(STATUS "SPIRV-Tools: Effcee is not configured. Skipping Effcee-based tests.") - endif() - endif() diff --git a/3rdparty/spirv-tools/external/SPIRV-Headers/CMakeLists.txt b/3rdparty/spirv-tools/external/SPIRV-Headers/CMakeLists.txt index 2488baf0a..167a3e7cb 100644 --- a/3rdparty/spirv-tools/external/SPIRV-Headers/CMakeLists.txt +++ b/3rdparty/spirv-tools/external/SPIRV-Headers/CMakeLists.txt @@ -57,4 +57,12 @@ add_custom_target(install-headers COMMAND cmake -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/include/spirv $ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/include/spirv) -add_subdirectory(example) +option(SPIRV_HEADERS_SKIP_EXAMPLES "Skip building examples" + ${SPIRV_HEADERS_SKIP_EXAMPLES}) +if(NOT ${SPIRV_HEADERS_SKIP_EXAMPLES}) + set(SPIRV_HEADERS_ENABLE_EXAMPLES ON) +endif() +if (SPIRV_HEADERS_ENABLE_EXAMPLES) + message(STATUS "Building SPIRV-Header examples") + add_subdirectory(example) +endif() diff --git a/3rdparty/spirv-tools/external/SPIRV-Headers/CODE_OF_CONDUCT.md b/3rdparty/spirv-tools/external/SPIRV-Headers/CODE_OF_CONDUCT.md new file mode 100644 index 000000000..a11610bd3 --- /dev/null +++ b/3rdparty/spirv-tools/external/SPIRV-Headers/CODE_OF_CONDUCT.md @@ -0,0 +1 @@ +A reminder that this issue tracker is managed by the Khronos Group. Interactions here should follow the Khronos Code of Conduct (https://www.khronos.org/developers/code-of-conduct), which prohibits aggressive or derogatory language. Please keep the discussion friendly and civil. diff --git a/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/1.0/spirv.cs b/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/1.0/spirv.cs new file mode 100644 index 000000000..de325cc4a --- /dev/null +++ b/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/1.0/spirv.cs @@ -0,0 +1,993 @@ +// Copyright (c) 2014-2018 The Khronos Group Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and/or associated documentation files (the "Materials"), +// to deal in the Materials without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Materials, and to permit persons to whom the +// Materials are furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Materials. +// +// MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS +// STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND +// HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/ +// +// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM,OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS +// IN THE MATERIALS. + +// This header is automatically generated by the same tool that creates +// the Binary Section of the SPIR-V specification. + +// Enumeration tokens for SPIR-V, in various styles: +// C, C++, C++11, JSON, Lua, Python, C# +// +// - C will have tokens with a "Spv" prefix, e.g.: SpvSourceLanguageGLSL +// - C++ will have tokens in the "spv" name space, e.g.: spv::SourceLanguageGLSL +// - C++11 will use enum classes in the spv namespace, e.g.: spv::SourceLanguage::GLSL +// - Lua will use tables, e.g.: spv.SourceLanguage.GLSL +// - Python will use dictionaries, e.g.: spv['SourceLanguage']['GLSL'] +// - C# will use enum classes in the Specification class located in the "Spv" namespace, e.g.: Spv.Specification.SourceLanguage.GLSL +// +// Some tokens act like mask values, which can be OR'd together, +// while others are mutually exclusive. The mask-like ones have +// "Mask" in their name, and a parallel enum that has the shift +// amount (1 << x) for each corresponding enumerant. + +namespace Spv +{ + + public static class Specification + { + public const uint MagicNumber = 0x07230203; + public const uint Version = 0x00010000; + public const uint Revision = 12; + public const uint OpCodeMask = 0xffff; + public const uint WordCountShift = 16; + + public enum SourceLanguage + { + Unknown = 0, + ESSL = 1, + GLSL = 2, + OpenCL_C = 3, + OpenCL_CPP = 4, + HLSL = 5, + } + + public enum ExecutionModel + { + Vertex = 0, + TessellationControl = 1, + TessellationEvaluation = 2, + Geometry = 3, + Fragment = 4, + GLCompute = 5, + Kernel = 6, + } + + public enum AddressingModel + { + Logical = 0, + Physical32 = 1, + Physical64 = 2, + } + + public enum MemoryModel + { + Simple = 0, + GLSL450 = 1, + OpenCL = 2, + } + + public enum ExecutionMode + { + Invocations = 0, + SpacingEqual = 1, + SpacingFractionalEven = 2, + SpacingFractionalOdd = 3, + VertexOrderCw = 4, + VertexOrderCcw = 5, + PixelCenterInteger = 6, + OriginUpperLeft = 7, + OriginLowerLeft = 8, + EarlyFragmentTests = 9, + PointMode = 10, + Xfb = 11, + DepthReplacing = 12, + DepthGreater = 14, + DepthLess = 15, + DepthUnchanged = 16, + LocalSize = 17, + LocalSizeHint = 18, + InputPoints = 19, + InputLines = 20, + InputLinesAdjacency = 21, + Triangles = 22, + InputTrianglesAdjacency = 23, + Quads = 24, + Isolines = 25, + OutputVertices = 26, + OutputPoints = 27, + OutputLineStrip = 28, + OutputTriangleStrip = 29, + VecTypeHint = 30, + ContractionOff = 31, + PostDepthCoverage = 4446, + StencilRefReplacingEXT = 5027, + } + + public enum StorageClass + { + UniformConstant = 0, + Input = 1, + Uniform = 2, + Output = 3, + Workgroup = 4, + CrossWorkgroup = 5, + Private = 6, + Function = 7, + Generic = 8, + PushConstant = 9, + AtomicCounter = 10, + Image = 11, + StorageBuffer = 12, + } + + public enum Dim + { + Dim1D = 0, + Dim2D = 1, + Dim3D = 2, + Cube = 3, + Rect = 4, + Buffer = 5, + SubpassData = 6, + } + + public enum SamplerAddressingMode + { + None = 0, + ClampToEdge = 1, + Clamp = 2, + Repeat = 3, + RepeatMirrored = 4, + } + + public enum SamplerFilterMode + { + Nearest = 0, + Linear = 1, + } + + public enum ImageFormat + { + Unknown = 0, + Rgba32f = 1, + Rgba16f = 2, + R32f = 3, + Rgba8 = 4, + Rgba8Snorm = 5, + Rg32f = 6, + Rg16f = 7, + R11fG11fB10f = 8, + R16f = 9, + Rgba16 = 10, + Rgb10A2 = 11, + Rg16 = 12, + Rg8 = 13, + R16 = 14, + R8 = 15, + Rgba16Snorm = 16, + Rg16Snorm = 17, + Rg8Snorm = 18, + R16Snorm = 19, + R8Snorm = 20, + Rgba32i = 21, + Rgba16i = 22, + Rgba8i = 23, + R32i = 24, + Rg32i = 25, + Rg16i = 26, + Rg8i = 27, + R16i = 28, + R8i = 29, + Rgba32ui = 30, + Rgba16ui = 31, + Rgba8ui = 32, + R32ui = 33, + Rgb10a2ui = 34, + Rg32ui = 35, + Rg16ui = 36, + Rg8ui = 37, + R16ui = 38, + R8ui = 39, + } + + public enum ImageChannelOrder + { + R = 0, + A = 1, + RG = 2, + RA = 3, + RGB = 4, + RGBA = 5, + BGRA = 6, + ARGB = 7, + Intensity = 8, + Luminance = 9, + Rx = 10, + RGx = 11, + RGBx = 12, + Depth = 13, + DepthStencil = 14, + sRGB = 15, + sRGBx = 16, + sRGBA = 17, + sBGRA = 18, + ABGR = 19, + } + + public enum ImageChannelDataType + { + SnormInt8 = 0, + SnormInt16 = 1, + UnormInt8 = 2, + UnormInt16 = 3, + UnormShort565 = 4, + UnormShort555 = 5, + UnormInt101010 = 6, + SignedInt8 = 7, + SignedInt16 = 8, + SignedInt32 = 9, + UnsignedInt8 = 10, + UnsignedInt16 = 11, + UnsignedInt32 = 12, + HalfFloat = 13, + Float = 14, + UnormInt24 = 15, + UnormInt101010_2 = 16, + } + + public enum ImageOperandsShift + { + Bias = 0, + Lod = 1, + Grad = 2, + ConstOffset = 3, + Offset = 4, + ConstOffsets = 5, + Sample = 6, + MinLod = 7, + } + + public enum ImageOperandsMask + { + MaskNone = 0, + Bias = 0x00000001, + Lod = 0x00000002, + Grad = 0x00000004, + ConstOffset = 0x00000008, + Offset = 0x00000010, + ConstOffsets = 0x00000020, + Sample = 0x00000040, + MinLod = 0x00000080, + } + + public enum FPFastMathModeShift + { + NotNaN = 0, + NotInf = 1, + NSZ = 2, + AllowRecip = 3, + Fast = 4, + } + + public enum FPFastMathModeMask + { + MaskNone = 0, + NotNaN = 0x00000001, + NotInf = 0x00000002, + NSZ = 0x00000004, + AllowRecip = 0x00000008, + Fast = 0x00000010, + } + + public enum FPRoundingMode + { + RTE = 0, + RTZ = 1, + RTP = 2, + RTN = 3, + } + + public enum LinkageType + { + Export = 0, + Import = 1, + } + + public enum AccessQualifier + { + ReadOnly = 0, + WriteOnly = 1, + ReadWrite = 2, + } + + public enum FunctionParameterAttribute + { + Zext = 0, + Sext = 1, + ByVal = 2, + Sret = 3, + NoAlias = 4, + NoCapture = 5, + NoWrite = 6, + NoReadWrite = 7, + } + + public enum Decoration + { + RelaxedPrecision = 0, + SpecId = 1, + Block = 2, + BufferBlock = 3, + RowMajor = 4, + ColMajor = 5, + ArrayStride = 6, + MatrixStride = 7, + GLSLShared = 8, + GLSLPacked = 9, + CPacked = 10, + BuiltIn = 11, + NoPerspective = 13, + Flat = 14, + Patch = 15, + Centroid = 16, + Sample = 17, + Invariant = 18, + Restrict = 19, + Aliased = 20, + Volatile = 21, + Constant = 22, + Coherent = 23, + NonWritable = 24, + NonReadable = 25, + Uniform = 26, + SaturatedConversion = 28, + Stream = 29, + Location = 30, + Component = 31, + Index = 32, + Binding = 33, + DescriptorSet = 34, + Offset = 35, + XfbBuffer = 36, + XfbStride = 37, + FuncParamAttr = 38, + FPRoundingMode = 39, + FPFastMathMode = 40, + LinkageAttributes = 41, + NoContraction = 42, + InputAttachmentIndex = 43, + Alignment = 44, + ExplicitInterpAMD = 4999, + OverrideCoverageNV = 5248, + PassthroughNV = 5250, + ViewportRelativeNV = 5252, + SecondaryViewportRelativeNV = 5256, + HlslCounterBufferGOOGLE = 5634, + HlslSemanticGOOGLE = 5635, + } + + public enum BuiltIn + { + Position = 0, + PointSize = 1, + ClipDistance = 3, + CullDistance = 4, + VertexId = 5, + InstanceId = 6, + PrimitiveId = 7, + InvocationId = 8, + Layer = 9, + ViewportIndex = 10, + TessLevelOuter = 11, + TessLevelInner = 12, + TessCoord = 13, + PatchVertices = 14, + FragCoord = 15, + PointCoord = 16, + FrontFacing = 17, + SampleId = 18, + SamplePosition = 19, + SampleMask = 20, + FragDepth = 22, + HelperInvocation = 23, + NumWorkgroups = 24, + WorkgroupSize = 25, + WorkgroupId = 26, + LocalInvocationId = 27, + GlobalInvocationId = 28, + LocalInvocationIndex = 29, + WorkDim = 30, + GlobalSize = 31, + EnqueuedWorkgroupSize = 32, + GlobalOffset = 33, + GlobalLinearId = 34, + SubgroupSize = 36, + SubgroupMaxSize = 37, + NumSubgroups = 38, + NumEnqueuedSubgroups = 39, + SubgroupId = 40, + SubgroupLocalInvocationId = 41, + VertexIndex = 42, + InstanceIndex = 43, + SubgroupEqMaskKHR = 4416, + SubgroupGeMaskKHR = 4417, + SubgroupGtMaskKHR = 4418, + SubgroupLeMaskKHR = 4419, + SubgroupLtMaskKHR = 4420, + BaseVertex = 4424, + BaseInstance = 4425, + DrawIndex = 4426, + DeviceIndex = 4438, + ViewIndex = 4440, + BaryCoordNoPerspAMD = 4992, + BaryCoordNoPerspCentroidAMD = 4993, + BaryCoordNoPerspSampleAMD = 4994, + BaryCoordSmoothAMD = 4995, + BaryCoordSmoothCentroidAMD = 4996, + BaryCoordSmoothSampleAMD = 4997, + BaryCoordPullModelAMD = 4998, + FragStencilRefEXT = 5014, + ViewportMaskNV = 5253, + SecondaryPositionNV = 5257, + SecondaryViewportMaskNV = 5258, + PositionPerViewNV = 5261, + ViewportMaskPerViewNV = 5262, + } + + public enum SelectionControlShift + { + Flatten = 0, + DontFlatten = 1, + } + + public enum SelectionControlMask + { + MaskNone = 0, + Flatten = 0x00000001, + DontFlatten = 0x00000002, + } + + public enum LoopControlShift + { + Unroll = 0, + DontUnroll = 1, + } + + public enum LoopControlMask + { + MaskNone = 0, + Unroll = 0x00000001, + DontUnroll = 0x00000002, + } + + public enum FunctionControlShift + { + Inline = 0, + DontInline = 1, + Pure = 2, + Const = 3, + } + + public enum FunctionControlMask + { + MaskNone = 0, + Inline = 0x00000001, + DontInline = 0x00000002, + Pure = 0x00000004, + Const = 0x00000008, + } + + public enum MemorySemanticsShift + { + Acquire = 1, + Release = 2, + AcquireRelease = 3, + SequentiallyConsistent = 4, + UniformMemory = 6, + SubgroupMemory = 7, + WorkgroupMemory = 8, + CrossWorkgroupMemory = 9, + AtomicCounterMemory = 10, + ImageMemory = 11, + } + + public enum MemorySemanticsMask + { + MaskNone = 0, + Acquire = 0x00000002, + Release = 0x00000004, + AcquireRelease = 0x00000008, + SequentiallyConsistent = 0x00000010, + UniformMemory = 0x00000040, + SubgroupMemory = 0x00000080, + WorkgroupMemory = 0x00000100, + CrossWorkgroupMemory = 0x00000200, + AtomicCounterMemory = 0x00000400, + ImageMemory = 0x00000800, + } + + public enum MemoryAccessShift + { + Volatile = 0, + Aligned = 1, + Nontemporal = 2, + } + + public enum MemoryAccessMask + { + MaskNone = 0, + Volatile = 0x00000001, + Aligned = 0x00000002, + Nontemporal = 0x00000004, + } + + public enum Scope + { + CrossDevice = 0, + Device = 1, + Workgroup = 2, + Subgroup = 3, + Invocation = 4, + } + + public enum GroupOperation + { + Reduce = 0, + InclusiveScan = 1, + ExclusiveScan = 2, + } + + public enum KernelEnqueueFlags + { + NoWait = 0, + WaitKernel = 1, + WaitWorkGroup = 2, + } + + public enum KernelProfilingInfoShift + { + CmdExecTime = 0, + } + + public enum KernelProfilingInfoMask + { + MaskNone = 0, + CmdExecTime = 0x00000001, + } + + public enum Capability + { + Matrix = 0, + Shader = 1, + Geometry = 2, + Tessellation = 3, + Addresses = 4, + Linkage = 5, + Kernel = 6, + Vector16 = 7, + Float16Buffer = 8, + Float16 = 9, + Float64 = 10, + Int64 = 11, + Int64Atomics = 12, + ImageBasic = 13, + ImageReadWrite = 14, + ImageMipmap = 15, + Pipes = 17, + Groups = 18, + DeviceEnqueue = 19, + LiteralSampler = 20, + AtomicStorage = 21, + Int16 = 22, + TessellationPointSize = 23, + GeometryPointSize = 24, + ImageGatherExtended = 25, + StorageImageMultisample = 27, + UniformBufferArrayDynamicIndexing = 28, + SampledImageArrayDynamicIndexing = 29, + StorageBufferArrayDynamicIndexing = 30, + StorageImageArrayDynamicIndexing = 31, + ClipDistance = 32, + CullDistance = 33, + ImageCubeArray = 34, + SampleRateShading = 35, + ImageRect = 36, + SampledRect = 37, + GenericPointer = 38, + Int8 = 39, + InputAttachment = 40, + SparseResidency = 41, + MinLod = 42, + Sampled1D = 43, + Image1D = 44, + SampledCubeArray = 45, + SampledBuffer = 46, + ImageBuffer = 47, + ImageMSArray = 48, + StorageImageExtendedFormats = 49, + ImageQuery = 50, + DerivativeControl = 51, + InterpolationFunction = 52, + TransformFeedback = 53, + GeometryStreams = 54, + StorageImageReadWithoutFormat = 55, + StorageImageWriteWithoutFormat = 56, + MultiViewport = 57, + SubgroupBallotKHR = 4423, + DrawParameters = 4427, + SubgroupVoteKHR = 4431, + StorageBuffer16BitAccess = 4433, + StorageUniformBufferBlock16 = 4433, + StorageUniform16 = 4434, + UniformAndStorageBuffer16BitAccess = 4434, + StoragePushConstant16 = 4435, + StorageInputOutput16 = 4436, + DeviceGroup = 4437, + MultiView = 4439, + VariablePointersStorageBuffer = 4441, + VariablePointers = 4442, + AtomicStorageOps = 4445, + SampleMaskPostDepthCoverage = 4447, + ImageGatherBiasLodAMD = 5009, + FragmentMaskAMD = 5010, + StencilExportEXT = 5013, + ImageReadWriteLodAMD = 5015, + SampleMaskOverrideCoverageNV = 5249, + GeometryShaderPassthroughNV = 5251, + ShaderViewportIndexLayerEXT = 5254, + ShaderViewportIndexLayerNV = 5254, + ShaderViewportMaskNV = 5255, + ShaderStereoViewNV = 5259, + PerViewAttributesNV = 5260, + SubgroupShuffleINTEL = 5568, + SubgroupBufferBlockIOINTEL = 5569, + SubgroupImageBlockIOINTEL = 5570, + } + + public enum Op + { + OpNop = 0, + OpUndef = 1, + OpSourceContinued = 2, + OpSource = 3, + OpSourceExtension = 4, + OpName = 5, + OpMemberName = 6, + OpString = 7, + OpLine = 8, + OpExtension = 10, + OpExtInstImport = 11, + OpExtInst = 12, + OpMemoryModel = 14, + OpEntryPoint = 15, + OpExecutionMode = 16, + OpCapability = 17, + OpTypeVoid = 19, + OpTypeBool = 20, + OpTypeInt = 21, + OpTypeFloat = 22, + OpTypeVector = 23, + OpTypeMatrix = 24, + OpTypeImage = 25, + OpTypeSampler = 26, + OpTypeSampledImage = 27, + OpTypeArray = 28, + OpTypeRuntimeArray = 29, + OpTypeStruct = 30, + OpTypeOpaque = 31, + OpTypePointer = 32, + OpTypeFunction = 33, + OpTypeEvent = 34, + OpTypeDeviceEvent = 35, + OpTypeReserveId = 36, + OpTypeQueue = 37, + OpTypePipe = 38, + OpTypeForwardPointer = 39, + OpConstantTrue = 41, + OpConstantFalse = 42, + OpConstant = 43, + OpConstantComposite = 44, + OpConstantSampler = 45, + OpConstantNull = 46, + OpSpecConstantTrue = 48, + OpSpecConstantFalse = 49, + OpSpecConstant = 50, + OpSpecConstantComposite = 51, + OpSpecConstantOp = 52, + OpFunction = 54, + OpFunctionParameter = 55, + OpFunctionEnd = 56, + OpFunctionCall = 57, + OpVariable = 59, + OpImageTexelPointer = 60, + OpLoad = 61, + OpStore = 62, + OpCopyMemory = 63, + OpCopyMemorySized = 64, + OpAccessChain = 65, + OpInBoundsAccessChain = 66, + OpPtrAccessChain = 67, + OpArrayLength = 68, + OpGenericPtrMemSemantics = 69, + OpInBoundsPtrAccessChain = 70, + OpDecorate = 71, + OpMemberDecorate = 72, + OpDecorationGroup = 73, + OpGroupDecorate = 74, + OpGroupMemberDecorate = 75, + OpVectorExtractDynamic = 77, + OpVectorInsertDynamic = 78, + OpVectorShuffle = 79, + OpCompositeConstruct = 80, + OpCompositeExtract = 81, + OpCompositeInsert = 82, + OpCopyObject = 83, + OpTranspose = 84, + OpSampledImage = 86, + OpImageSampleImplicitLod = 87, + OpImageSampleExplicitLod = 88, + OpImageSampleDrefImplicitLod = 89, + OpImageSampleDrefExplicitLod = 90, + OpImageSampleProjImplicitLod = 91, + OpImageSampleProjExplicitLod = 92, + OpImageSampleProjDrefImplicitLod = 93, + OpImageSampleProjDrefExplicitLod = 94, + OpImageFetch = 95, + OpImageGather = 96, + OpImageDrefGather = 97, + OpImageRead = 98, + OpImageWrite = 99, + OpImage = 100, + OpImageQueryFormat = 101, + OpImageQueryOrder = 102, + OpImageQuerySizeLod = 103, + OpImageQuerySize = 104, + OpImageQueryLod = 105, + OpImageQueryLevels = 106, + OpImageQuerySamples = 107, + OpConvertFToU = 109, + OpConvertFToS = 110, + OpConvertSToF = 111, + OpConvertUToF = 112, + OpUConvert = 113, + OpSConvert = 114, + OpFConvert = 115, + OpQuantizeToF16 = 116, + OpConvertPtrToU = 117, + OpSatConvertSToU = 118, + OpSatConvertUToS = 119, + OpConvertUToPtr = 120, + OpPtrCastToGeneric = 121, + OpGenericCastToPtr = 122, + OpGenericCastToPtrExplicit = 123, + OpBitcast = 124, + OpSNegate = 126, + OpFNegate = 127, + OpIAdd = 128, + OpFAdd = 129, + OpISub = 130, + OpFSub = 131, + OpIMul = 132, + OpFMul = 133, + OpUDiv = 134, + OpSDiv = 135, + OpFDiv = 136, + OpUMod = 137, + OpSRem = 138, + OpSMod = 139, + OpFRem = 140, + OpFMod = 141, + OpVectorTimesScalar = 142, + OpMatrixTimesScalar = 143, + OpVectorTimesMatrix = 144, + OpMatrixTimesVector = 145, + OpMatrixTimesMatrix = 146, + OpOuterProduct = 147, + OpDot = 148, + OpIAddCarry = 149, + OpISubBorrow = 150, + OpUMulExtended = 151, + OpSMulExtended = 152, + OpAny = 154, + OpAll = 155, + OpIsNan = 156, + OpIsInf = 157, + OpIsFinite = 158, + OpIsNormal = 159, + OpSignBitSet = 160, + OpLessOrGreater = 161, + OpOrdered = 162, + OpUnordered = 163, + OpLogicalEqual = 164, + OpLogicalNotEqual = 165, + OpLogicalOr = 166, + OpLogicalAnd = 167, + OpLogicalNot = 168, + OpSelect = 169, + OpIEqual = 170, + OpINotEqual = 171, + OpUGreaterThan = 172, + OpSGreaterThan = 173, + OpUGreaterThanEqual = 174, + OpSGreaterThanEqual = 175, + OpULessThan = 176, + OpSLessThan = 177, + OpULessThanEqual = 178, + OpSLessThanEqual = 179, + OpFOrdEqual = 180, + OpFUnordEqual = 181, + OpFOrdNotEqual = 182, + OpFUnordNotEqual = 183, + OpFOrdLessThan = 184, + OpFUnordLessThan = 185, + OpFOrdGreaterThan = 186, + OpFUnordGreaterThan = 187, + OpFOrdLessThanEqual = 188, + OpFUnordLessThanEqual = 189, + OpFOrdGreaterThanEqual = 190, + OpFUnordGreaterThanEqual = 191, + OpShiftRightLogical = 194, + OpShiftRightArithmetic = 195, + OpShiftLeftLogical = 196, + OpBitwiseOr = 197, + OpBitwiseXor = 198, + OpBitwiseAnd = 199, + OpNot = 200, + OpBitFieldInsert = 201, + OpBitFieldSExtract = 202, + OpBitFieldUExtract = 203, + OpBitReverse = 204, + OpBitCount = 205, + OpDPdx = 207, + OpDPdy = 208, + OpFwidth = 209, + OpDPdxFine = 210, + OpDPdyFine = 211, + OpFwidthFine = 212, + OpDPdxCoarse = 213, + OpDPdyCoarse = 214, + OpFwidthCoarse = 215, + OpEmitVertex = 218, + OpEndPrimitive = 219, + OpEmitStreamVertex = 220, + OpEndStreamPrimitive = 221, + OpControlBarrier = 224, + OpMemoryBarrier = 225, + OpAtomicLoad = 227, + OpAtomicStore = 228, + OpAtomicExchange = 229, + OpAtomicCompareExchange = 230, + OpAtomicCompareExchangeWeak = 231, + OpAtomicIIncrement = 232, + OpAtomicIDecrement = 233, + OpAtomicIAdd = 234, + OpAtomicISub = 235, + OpAtomicSMin = 236, + OpAtomicUMin = 237, + OpAtomicSMax = 238, + OpAtomicUMax = 239, + OpAtomicAnd = 240, + OpAtomicOr = 241, + OpAtomicXor = 242, + OpPhi = 245, + OpLoopMerge = 246, + OpSelectionMerge = 247, + OpLabel = 248, + OpBranch = 249, + OpBranchConditional = 250, + OpSwitch = 251, + OpKill = 252, + OpReturn = 253, + OpReturnValue = 254, + OpUnreachable = 255, + OpLifetimeStart = 256, + OpLifetimeStop = 257, + OpGroupAsyncCopy = 259, + OpGroupWaitEvents = 260, + OpGroupAll = 261, + OpGroupAny = 262, + OpGroupBroadcast = 263, + OpGroupIAdd = 264, + OpGroupFAdd = 265, + OpGroupFMin = 266, + OpGroupUMin = 267, + OpGroupSMin = 268, + OpGroupFMax = 269, + OpGroupUMax = 270, + OpGroupSMax = 271, + OpReadPipe = 274, + OpWritePipe = 275, + OpReservedReadPipe = 276, + OpReservedWritePipe = 277, + OpReserveReadPipePackets = 278, + OpReserveWritePipePackets = 279, + OpCommitReadPipe = 280, + OpCommitWritePipe = 281, + OpIsValidReserveId = 282, + OpGetNumPipePackets = 283, + OpGetMaxPipePackets = 284, + OpGroupReserveReadPipePackets = 285, + OpGroupReserveWritePipePackets = 286, + OpGroupCommitReadPipe = 287, + OpGroupCommitWritePipe = 288, + OpEnqueueMarker = 291, + OpEnqueueKernel = 292, + OpGetKernelNDrangeSubGroupCount = 293, + OpGetKernelNDrangeMaxSubGroupSize = 294, + OpGetKernelWorkGroupSize = 295, + OpGetKernelPreferredWorkGroupSizeMultiple = 296, + OpRetainEvent = 297, + OpReleaseEvent = 298, + OpCreateUserEvent = 299, + OpIsValidEvent = 300, + OpSetUserEventStatus = 301, + OpCaptureEventProfilingInfo = 302, + OpGetDefaultQueue = 303, + OpBuildNDRange = 304, + OpImageSparseSampleImplicitLod = 305, + OpImageSparseSampleExplicitLod = 306, + OpImageSparseSampleDrefImplicitLod = 307, + OpImageSparseSampleDrefExplicitLod = 308, + OpImageSparseSampleProjImplicitLod = 309, + OpImageSparseSampleProjExplicitLod = 310, + OpImageSparseSampleProjDrefImplicitLod = 311, + OpImageSparseSampleProjDrefExplicitLod = 312, + OpImageSparseFetch = 313, + OpImageSparseGather = 314, + OpImageSparseDrefGather = 315, + OpImageSparseTexelsResident = 316, + OpNoLine = 317, + OpAtomicFlagTestAndSet = 318, + OpAtomicFlagClear = 319, + OpImageSparseRead = 320, + OpDecorateId = 332, + OpSubgroupBallotKHR = 4421, + OpSubgroupFirstInvocationKHR = 4422, + OpSubgroupAllKHR = 4428, + OpSubgroupAnyKHR = 4429, + OpSubgroupAllEqualKHR = 4430, + OpSubgroupReadInvocationKHR = 4432, + OpGroupIAddNonUniformAMD = 5000, + OpGroupFAddNonUniformAMD = 5001, + OpGroupFMinNonUniformAMD = 5002, + OpGroupUMinNonUniformAMD = 5003, + OpGroupSMinNonUniformAMD = 5004, + OpGroupFMaxNonUniformAMD = 5005, + OpGroupUMaxNonUniformAMD = 5006, + OpGroupSMaxNonUniformAMD = 5007, + OpFragmentMaskFetchAMD = 5011, + OpFragmentFetchAMD = 5012, + OpSubgroupShuffleINTEL = 5571, + OpSubgroupShuffleDownINTEL = 5572, + OpSubgroupShuffleUpINTEL = 5573, + OpSubgroupShuffleXorINTEL = 5574, + OpSubgroupBlockReadINTEL = 5575, + OpSubgroupBlockWriteINTEL = 5576, + OpSubgroupImageBlockReadINTEL = 5577, + OpSubgroupImageBlockWriteINTEL = 5578, + OpDecorateStringGOOGLE = 5632, + OpMemberDecorateStringGOOGLE = 5633, + } + } +} + diff --git a/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/1.1/spirv.cs b/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/1.1/spirv.cs new file mode 100644 index 000000000..99194e514 --- /dev/null +++ b/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/1.1/spirv.cs @@ -0,0 +1,1015 @@ +// Copyright (c) 2014-2018 The Khronos Group Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and/or associated documentation files (the "Materials"), +// to deal in the Materials without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Materials, and to permit persons to whom the +// Materials are furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Materials. +// +// MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS +// STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND +// HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/ +// +// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM,OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS +// IN THE MATERIALS. + +// This header is automatically generated by the same tool that creates +// the Binary Section of the SPIR-V specification. + +// Enumeration tokens for SPIR-V, in various styles: +// C, C++, C++11, JSON, Lua, Python, C# +// +// - C will have tokens with a "Spv" prefix, e.g.: SpvSourceLanguageGLSL +// - C++ will have tokens in the "spv" name space, e.g.: spv::SourceLanguageGLSL +// - C++11 will use enum classes in the spv namespace, e.g.: spv::SourceLanguage::GLSL +// - Lua will use tables, e.g.: spv.SourceLanguage.GLSL +// - Python will use dictionaries, e.g.: spv['SourceLanguage']['GLSL'] +// - C# will use enum classes in the Specification class located in the "Spv" namespace, e.g.: Spv.Specification.SourceLanguage.GLSL +// +// Some tokens act like mask values, which can be OR'd together, +// while others are mutually exclusive. The mask-like ones have +// "Mask" in their name, and a parallel enum that has the shift +// amount (1 << x) for each corresponding enumerant. + +namespace Spv +{ + + public static class Specification + { + public const uint MagicNumber = 0x07230203; + public const uint Version = 0x00010100; + public const uint Revision = 8; + public const uint OpCodeMask = 0xffff; + public const uint WordCountShift = 16; + + public enum SourceLanguage + { + Unknown = 0, + ESSL = 1, + GLSL = 2, + OpenCL_C = 3, + OpenCL_CPP = 4, + HLSL = 5, + } + + public enum ExecutionModel + { + Vertex = 0, + TessellationControl = 1, + TessellationEvaluation = 2, + Geometry = 3, + Fragment = 4, + GLCompute = 5, + Kernel = 6, + } + + public enum AddressingModel + { + Logical = 0, + Physical32 = 1, + Physical64 = 2, + } + + public enum MemoryModel + { + Simple = 0, + GLSL450 = 1, + OpenCL = 2, + } + + public enum ExecutionMode + { + Invocations = 0, + SpacingEqual = 1, + SpacingFractionalEven = 2, + SpacingFractionalOdd = 3, + VertexOrderCw = 4, + VertexOrderCcw = 5, + PixelCenterInteger = 6, + OriginUpperLeft = 7, + OriginLowerLeft = 8, + EarlyFragmentTests = 9, + PointMode = 10, + Xfb = 11, + DepthReplacing = 12, + DepthGreater = 14, + DepthLess = 15, + DepthUnchanged = 16, + LocalSize = 17, + LocalSizeHint = 18, + InputPoints = 19, + InputLines = 20, + InputLinesAdjacency = 21, + Triangles = 22, + InputTrianglesAdjacency = 23, + Quads = 24, + Isolines = 25, + OutputVertices = 26, + OutputPoints = 27, + OutputLineStrip = 28, + OutputTriangleStrip = 29, + VecTypeHint = 30, + ContractionOff = 31, + Initializer = 33, + Finalizer = 34, + SubgroupSize = 35, + SubgroupsPerWorkgroup = 36, + PostDepthCoverage = 4446, + StencilRefReplacingEXT = 5027, + } + + public enum StorageClass + { + UniformConstant = 0, + Input = 1, + Uniform = 2, + Output = 3, + Workgroup = 4, + CrossWorkgroup = 5, + Private = 6, + Function = 7, + Generic = 8, + PushConstant = 9, + AtomicCounter = 10, + Image = 11, + StorageBuffer = 12, + } + + public enum Dim + { + Dim1D = 0, + Dim2D = 1, + Dim3D = 2, + Cube = 3, + Rect = 4, + Buffer = 5, + SubpassData = 6, + } + + public enum SamplerAddressingMode + { + None = 0, + ClampToEdge = 1, + Clamp = 2, + Repeat = 3, + RepeatMirrored = 4, + } + + public enum SamplerFilterMode + { + Nearest = 0, + Linear = 1, + } + + public enum ImageFormat + { + Unknown = 0, + Rgba32f = 1, + Rgba16f = 2, + R32f = 3, + Rgba8 = 4, + Rgba8Snorm = 5, + Rg32f = 6, + Rg16f = 7, + R11fG11fB10f = 8, + R16f = 9, + Rgba16 = 10, + Rgb10A2 = 11, + Rg16 = 12, + Rg8 = 13, + R16 = 14, + R8 = 15, + Rgba16Snorm = 16, + Rg16Snorm = 17, + Rg8Snorm = 18, + R16Snorm = 19, + R8Snorm = 20, + Rgba32i = 21, + Rgba16i = 22, + Rgba8i = 23, + R32i = 24, + Rg32i = 25, + Rg16i = 26, + Rg8i = 27, + R16i = 28, + R8i = 29, + Rgba32ui = 30, + Rgba16ui = 31, + Rgba8ui = 32, + R32ui = 33, + Rgb10a2ui = 34, + Rg32ui = 35, + Rg16ui = 36, + Rg8ui = 37, + R16ui = 38, + R8ui = 39, + } + + public enum ImageChannelOrder + { + R = 0, + A = 1, + RG = 2, + RA = 3, + RGB = 4, + RGBA = 5, + BGRA = 6, + ARGB = 7, + Intensity = 8, + Luminance = 9, + Rx = 10, + RGx = 11, + RGBx = 12, + Depth = 13, + DepthStencil = 14, + sRGB = 15, + sRGBx = 16, + sRGBA = 17, + sBGRA = 18, + ABGR = 19, + } + + public enum ImageChannelDataType + { + SnormInt8 = 0, + SnormInt16 = 1, + UnormInt8 = 2, + UnormInt16 = 3, + UnormShort565 = 4, + UnormShort555 = 5, + UnormInt101010 = 6, + SignedInt8 = 7, + SignedInt16 = 8, + SignedInt32 = 9, + UnsignedInt8 = 10, + UnsignedInt16 = 11, + UnsignedInt32 = 12, + HalfFloat = 13, + Float = 14, + UnormInt24 = 15, + UnormInt101010_2 = 16, + } + + public enum ImageOperandsShift + { + Bias = 0, + Lod = 1, + Grad = 2, + ConstOffset = 3, + Offset = 4, + ConstOffsets = 5, + Sample = 6, + MinLod = 7, + } + + public enum ImageOperandsMask + { + MaskNone = 0, + Bias = 0x00000001, + Lod = 0x00000002, + Grad = 0x00000004, + ConstOffset = 0x00000008, + Offset = 0x00000010, + ConstOffsets = 0x00000020, + Sample = 0x00000040, + MinLod = 0x00000080, + } + + public enum FPFastMathModeShift + { + NotNaN = 0, + NotInf = 1, + NSZ = 2, + AllowRecip = 3, + Fast = 4, + } + + public enum FPFastMathModeMask + { + MaskNone = 0, + NotNaN = 0x00000001, + NotInf = 0x00000002, + NSZ = 0x00000004, + AllowRecip = 0x00000008, + Fast = 0x00000010, + } + + public enum FPRoundingMode + { + RTE = 0, + RTZ = 1, + RTP = 2, + RTN = 3, + } + + public enum LinkageType + { + Export = 0, + Import = 1, + } + + public enum AccessQualifier + { + ReadOnly = 0, + WriteOnly = 1, + ReadWrite = 2, + } + + public enum FunctionParameterAttribute + { + Zext = 0, + Sext = 1, + ByVal = 2, + Sret = 3, + NoAlias = 4, + NoCapture = 5, + NoWrite = 6, + NoReadWrite = 7, + } + + public enum Decoration + { + RelaxedPrecision = 0, + SpecId = 1, + Block = 2, + BufferBlock = 3, + RowMajor = 4, + ColMajor = 5, + ArrayStride = 6, + MatrixStride = 7, + GLSLShared = 8, + GLSLPacked = 9, + CPacked = 10, + BuiltIn = 11, + NoPerspective = 13, + Flat = 14, + Patch = 15, + Centroid = 16, + Sample = 17, + Invariant = 18, + Restrict = 19, + Aliased = 20, + Volatile = 21, + Constant = 22, + Coherent = 23, + NonWritable = 24, + NonReadable = 25, + Uniform = 26, + SaturatedConversion = 28, + Stream = 29, + Location = 30, + Component = 31, + Index = 32, + Binding = 33, + DescriptorSet = 34, + Offset = 35, + XfbBuffer = 36, + XfbStride = 37, + FuncParamAttr = 38, + FPRoundingMode = 39, + FPFastMathMode = 40, + LinkageAttributes = 41, + NoContraction = 42, + InputAttachmentIndex = 43, + Alignment = 44, + MaxByteOffset = 45, + ExplicitInterpAMD = 4999, + OverrideCoverageNV = 5248, + PassthroughNV = 5250, + ViewportRelativeNV = 5252, + SecondaryViewportRelativeNV = 5256, + HlslCounterBufferGOOGLE = 5634, + HlslSemanticGOOGLE = 5635, + } + + public enum BuiltIn + { + Position = 0, + PointSize = 1, + ClipDistance = 3, + CullDistance = 4, + VertexId = 5, + InstanceId = 6, + PrimitiveId = 7, + InvocationId = 8, + Layer = 9, + ViewportIndex = 10, + TessLevelOuter = 11, + TessLevelInner = 12, + TessCoord = 13, + PatchVertices = 14, + FragCoord = 15, + PointCoord = 16, + FrontFacing = 17, + SampleId = 18, + SamplePosition = 19, + SampleMask = 20, + FragDepth = 22, + HelperInvocation = 23, + NumWorkgroups = 24, + WorkgroupSize = 25, + WorkgroupId = 26, + LocalInvocationId = 27, + GlobalInvocationId = 28, + LocalInvocationIndex = 29, + WorkDim = 30, + GlobalSize = 31, + EnqueuedWorkgroupSize = 32, + GlobalOffset = 33, + GlobalLinearId = 34, + SubgroupSize = 36, + SubgroupMaxSize = 37, + NumSubgroups = 38, + NumEnqueuedSubgroups = 39, + SubgroupId = 40, + SubgroupLocalInvocationId = 41, + VertexIndex = 42, + InstanceIndex = 43, + SubgroupEqMaskKHR = 4416, + SubgroupGeMaskKHR = 4417, + SubgroupGtMaskKHR = 4418, + SubgroupLeMaskKHR = 4419, + SubgroupLtMaskKHR = 4420, + BaseVertex = 4424, + BaseInstance = 4425, + DrawIndex = 4426, + DeviceIndex = 4438, + ViewIndex = 4440, + BaryCoordNoPerspAMD = 4992, + BaryCoordNoPerspCentroidAMD = 4993, + BaryCoordNoPerspSampleAMD = 4994, + BaryCoordSmoothAMD = 4995, + BaryCoordSmoothCentroidAMD = 4996, + BaryCoordSmoothSampleAMD = 4997, + BaryCoordPullModelAMD = 4998, + FragStencilRefEXT = 5014, + ViewportMaskNV = 5253, + SecondaryPositionNV = 5257, + SecondaryViewportMaskNV = 5258, + PositionPerViewNV = 5261, + ViewportMaskPerViewNV = 5262, + } + + public enum SelectionControlShift + { + Flatten = 0, + DontFlatten = 1, + } + + public enum SelectionControlMask + { + MaskNone = 0, + Flatten = 0x00000001, + DontFlatten = 0x00000002, + } + + public enum LoopControlShift + { + Unroll = 0, + DontUnroll = 1, + DependencyInfinite = 2, + DependencyLength = 3, + } + + public enum LoopControlMask + { + MaskNone = 0, + Unroll = 0x00000001, + DontUnroll = 0x00000002, + DependencyInfinite = 0x00000004, + DependencyLength = 0x00000008, + } + + public enum FunctionControlShift + { + Inline = 0, + DontInline = 1, + Pure = 2, + Const = 3, + } + + public enum FunctionControlMask + { + MaskNone = 0, + Inline = 0x00000001, + DontInline = 0x00000002, + Pure = 0x00000004, + Const = 0x00000008, + } + + public enum MemorySemanticsShift + { + Acquire = 1, + Release = 2, + AcquireRelease = 3, + SequentiallyConsistent = 4, + UniformMemory = 6, + SubgroupMemory = 7, + WorkgroupMemory = 8, + CrossWorkgroupMemory = 9, + AtomicCounterMemory = 10, + ImageMemory = 11, + } + + public enum MemorySemanticsMask + { + MaskNone = 0, + Acquire = 0x00000002, + Release = 0x00000004, + AcquireRelease = 0x00000008, + SequentiallyConsistent = 0x00000010, + UniformMemory = 0x00000040, + SubgroupMemory = 0x00000080, + WorkgroupMemory = 0x00000100, + CrossWorkgroupMemory = 0x00000200, + AtomicCounterMemory = 0x00000400, + ImageMemory = 0x00000800, + } + + public enum MemoryAccessShift + { + Volatile = 0, + Aligned = 1, + Nontemporal = 2, + } + + public enum MemoryAccessMask + { + MaskNone = 0, + Volatile = 0x00000001, + Aligned = 0x00000002, + Nontemporal = 0x00000004, + } + + public enum Scope + { + CrossDevice = 0, + Device = 1, + Workgroup = 2, + Subgroup = 3, + Invocation = 4, + } + + public enum GroupOperation + { + Reduce = 0, + InclusiveScan = 1, + ExclusiveScan = 2, + } + + public enum KernelEnqueueFlags + { + NoWait = 0, + WaitKernel = 1, + WaitWorkGroup = 2, + } + + public enum KernelProfilingInfoShift + { + CmdExecTime = 0, + } + + public enum KernelProfilingInfoMask + { + MaskNone = 0, + CmdExecTime = 0x00000001, + } + + public enum Capability + { + Matrix = 0, + Shader = 1, + Geometry = 2, + Tessellation = 3, + Addresses = 4, + Linkage = 5, + Kernel = 6, + Vector16 = 7, + Float16Buffer = 8, + Float16 = 9, + Float64 = 10, + Int64 = 11, + Int64Atomics = 12, + ImageBasic = 13, + ImageReadWrite = 14, + ImageMipmap = 15, + Pipes = 17, + Groups = 18, + DeviceEnqueue = 19, + LiteralSampler = 20, + AtomicStorage = 21, + Int16 = 22, + TessellationPointSize = 23, + GeometryPointSize = 24, + ImageGatherExtended = 25, + StorageImageMultisample = 27, + UniformBufferArrayDynamicIndexing = 28, + SampledImageArrayDynamicIndexing = 29, + StorageBufferArrayDynamicIndexing = 30, + StorageImageArrayDynamicIndexing = 31, + ClipDistance = 32, + CullDistance = 33, + ImageCubeArray = 34, + SampleRateShading = 35, + ImageRect = 36, + SampledRect = 37, + GenericPointer = 38, + Int8 = 39, + InputAttachment = 40, + SparseResidency = 41, + MinLod = 42, + Sampled1D = 43, + Image1D = 44, + SampledCubeArray = 45, + SampledBuffer = 46, + ImageBuffer = 47, + ImageMSArray = 48, + StorageImageExtendedFormats = 49, + ImageQuery = 50, + DerivativeControl = 51, + InterpolationFunction = 52, + TransformFeedback = 53, + GeometryStreams = 54, + StorageImageReadWithoutFormat = 55, + StorageImageWriteWithoutFormat = 56, + MultiViewport = 57, + SubgroupDispatch = 58, + NamedBarrier = 59, + PipeStorage = 60, + SubgroupBallotKHR = 4423, + DrawParameters = 4427, + SubgroupVoteKHR = 4431, + StorageBuffer16BitAccess = 4433, + StorageUniformBufferBlock16 = 4433, + StorageUniform16 = 4434, + UniformAndStorageBuffer16BitAccess = 4434, + StoragePushConstant16 = 4435, + StorageInputOutput16 = 4436, + DeviceGroup = 4437, + MultiView = 4439, + VariablePointersStorageBuffer = 4441, + VariablePointers = 4442, + AtomicStorageOps = 4445, + SampleMaskPostDepthCoverage = 4447, + ImageGatherBiasLodAMD = 5009, + FragmentMaskAMD = 5010, + StencilExportEXT = 5013, + ImageReadWriteLodAMD = 5015, + SampleMaskOverrideCoverageNV = 5249, + GeometryShaderPassthroughNV = 5251, + ShaderViewportIndexLayerEXT = 5254, + ShaderViewportIndexLayerNV = 5254, + ShaderViewportMaskNV = 5255, + ShaderStereoViewNV = 5259, + PerViewAttributesNV = 5260, + SubgroupShuffleINTEL = 5568, + SubgroupBufferBlockIOINTEL = 5569, + SubgroupImageBlockIOINTEL = 5570, + } + + public enum Op + { + OpNop = 0, + OpUndef = 1, + OpSourceContinued = 2, + OpSource = 3, + OpSourceExtension = 4, + OpName = 5, + OpMemberName = 6, + OpString = 7, + OpLine = 8, + OpExtension = 10, + OpExtInstImport = 11, + OpExtInst = 12, + OpMemoryModel = 14, + OpEntryPoint = 15, + OpExecutionMode = 16, + OpCapability = 17, + OpTypeVoid = 19, + OpTypeBool = 20, + OpTypeInt = 21, + OpTypeFloat = 22, + OpTypeVector = 23, + OpTypeMatrix = 24, + OpTypeImage = 25, + OpTypeSampler = 26, + OpTypeSampledImage = 27, + OpTypeArray = 28, + OpTypeRuntimeArray = 29, + OpTypeStruct = 30, + OpTypeOpaque = 31, + OpTypePointer = 32, + OpTypeFunction = 33, + OpTypeEvent = 34, + OpTypeDeviceEvent = 35, + OpTypeReserveId = 36, + OpTypeQueue = 37, + OpTypePipe = 38, + OpTypeForwardPointer = 39, + OpConstantTrue = 41, + OpConstantFalse = 42, + OpConstant = 43, + OpConstantComposite = 44, + OpConstantSampler = 45, + OpConstantNull = 46, + OpSpecConstantTrue = 48, + OpSpecConstantFalse = 49, + OpSpecConstant = 50, + OpSpecConstantComposite = 51, + OpSpecConstantOp = 52, + OpFunction = 54, + OpFunctionParameter = 55, + OpFunctionEnd = 56, + OpFunctionCall = 57, + OpVariable = 59, + OpImageTexelPointer = 60, + OpLoad = 61, + OpStore = 62, + OpCopyMemory = 63, + OpCopyMemorySized = 64, + OpAccessChain = 65, + OpInBoundsAccessChain = 66, + OpPtrAccessChain = 67, + OpArrayLength = 68, + OpGenericPtrMemSemantics = 69, + OpInBoundsPtrAccessChain = 70, + OpDecorate = 71, + OpMemberDecorate = 72, + OpDecorationGroup = 73, + OpGroupDecorate = 74, + OpGroupMemberDecorate = 75, + OpVectorExtractDynamic = 77, + OpVectorInsertDynamic = 78, + OpVectorShuffle = 79, + OpCompositeConstruct = 80, + OpCompositeExtract = 81, + OpCompositeInsert = 82, + OpCopyObject = 83, + OpTranspose = 84, + OpSampledImage = 86, + OpImageSampleImplicitLod = 87, + OpImageSampleExplicitLod = 88, + OpImageSampleDrefImplicitLod = 89, + OpImageSampleDrefExplicitLod = 90, + OpImageSampleProjImplicitLod = 91, + OpImageSampleProjExplicitLod = 92, + OpImageSampleProjDrefImplicitLod = 93, + OpImageSampleProjDrefExplicitLod = 94, + OpImageFetch = 95, + OpImageGather = 96, + OpImageDrefGather = 97, + OpImageRead = 98, + OpImageWrite = 99, + OpImage = 100, + OpImageQueryFormat = 101, + OpImageQueryOrder = 102, + OpImageQuerySizeLod = 103, + OpImageQuerySize = 104, + OpImageQueryLod = 105, + OpImageQueryLevels = 106, + OpImageQuerySamples = 107, + OpConvertFToU = 109, + OpConvertFToS = 110, + OpConvertSToF = 111, + OpConvertUToF = 112, + OpUConvert = 113, + OpSConvert = 114, + OpFConvert = 115, + OpQuantizeToF16 = 116, + OpConvertPtrToU = 117, + OpSatConvertSToU = 118, + OpSatConvertUToS = 119, + OpConvertUToPtr = 120, + OpPtrCastToGeneric = 121, + OpGenericCastToPtr = 122, + OpGenericCastToPtrExplicit = 123, + OpBitcast = 124, + OpSNegate = 126, + OpFNegate = 127, + OpIAdd = 128, + OpFAdd = 129, + OpISub = 130, + OpFSub = 131, + OpIMul = 132, + OpFMul = 133, + OpUDiv = 134, + OpSDiv = 135, + OpFDiv = 136, + OpUMod = 137, + OpSRem = 138, + OpSMod = 139, + OpFRem = 140, + OpFMod = 141, + OpVectorTimesScalar = 142, + OpMatrixTimesScalar = 143, + OpVectorTimesMatrix = 144, + OpMatrixTimesVector = 145, + OpMatrixTimesMatrix = 146, + OpOuterProduct = 147, + OpDot = 148, + OpIAddCarry = 149, + OpISubBorrow = 150, + OpUMulExtended = 151, + OpSMulExtended = 152, + OpAny = 154, + OpAll = 155, + OpIsNan = 156, + OpIsInf = 157, + OpIsFinite = 158, + OpIsNormal = 159, + OpSignBitSet = 160, + OpLessOrGreater = 161, + OpOrdered = 162, + OpUnordered = 163, + OpLogicalEqual = 164, + OpLogicalNotEqual = 165, + OpLogicalOr = 166, + OpLogicalAnd = 167, + OpLogicalNot = 168, + OpSelect = 169, + OpIEqual = 170, + OpINotEqual = 171, + OpUGreaterThan = 172, + OpSGreaterThan = 173, + OpUGreaterThanEqual = 174, + OpSGreaterThanEqual = 175, + OpULessThan = 176, + OpSLessThan = 177, + OpULessThanEqual = 178, + OpSLessThanEqual = 179, + OpFOrdEqual = 180, + OpFUnordEqual = 181, + OpFOrdNotEqual = 182, + OpFUnordNotEqual = 183, + OpFOrdLessThan = 184, + OpFUnordLessThan = 185, + OpFOrdGreaterThan = 186, + OpFUnordGreaterThan = 187, + OpFOrdLessThanEqual = 188, + OpFUnordLessThanEqual = 189, + OpFOrdGreaterThanEqual = 190, + OpFUnordGreaterThanEqual = 191, + OpShiftRightLogical = 194, + OpShiftRightArithmetic = 195, + OpShiftLeftLogical = 196, + OpBitwiseOr = 197, + OpBitwiseXor = 198, + OpBitwiseAnd = 199, + OpNot = 200, + OpBitFieldInsert = 201, + OpBitFieldSExtract = 202, + OpBitFieldUExtract = 203, + OpBitReverse = 204, + OpBitCount = 205, + OpDPdx = 207, + OpDPdy = 208, + OpFwidth = 209, + OpDPdxFine = 210, + OpDPdyFine = 211, + OpFwidthFine = 212, + OpDPdxCoarse = 213, + OpDPdyCoarse = 214, + OpFwidthCoarse = 215, + OpEmitVertex = 218, + OpEndPrimitive = 219, + OpEmitStreamVertex = 220, + OpEndStreamPrimitive = 221, + OpControlBarrier = 224, + OpMemoryBarrier = 225, + OpAtomicLoad = 227, + OpAtomicStore = 228, + OpAtomicExchange = 229, + OpAtomicCompareExchange = 230, + OpAtomicCompareExchangeWeak = 231, + OpAtomicIIncrement = 232, + OpAtomicIDecrement = 233, + OpAtomicIAdd = 234, + OpAtomicISub = 235, + OpAtomicSMin = 236, + OpAtomicUMin = 237, + OpAtomicSMax = 238, + OpAtomicUMax = 239, + OpAtomicAnd = 240, + OpAtomicOr = 241, + OpAtomicXor = 242, + OpPhi = 245, + OpLoopMerge = 246, + OpSelectionMerge = 247, + OpLabel = 248, + OpBranch = 249, + OpBranchConditional = 250, + OpSwitch = 251, + OpKill = 252, + OpReturn = 253, + OpReturnValue = 254, + OpUnreachable = 255, + OpLifetimeStart = 256, + OpLifetimeStop = 257, + OpGroupAsyncCopy = 259, + OpGroupWaitEvents = 260, + OpGroupAll = 261, + OpGroupAny = 262, + OpGroupBroadcast = 263, + OpGroupIAdd = 264, + OpGroupFAdd = 265, + OpGroupFMin = 266, + OpGroupUMin = 267, + OpGroupSMin = 268, + OpGroupFMax = 269, + OpGroupUMax = 270, + OpGroupSMax = 271, + OpReadPipe = 274, + OpWritePipe = 275, + OpReservedReadPipe = 276, + OpReservedWritePipe = 277, + OpReserveReadPipePackets = 278, + OpReserveWritePipePackets = 279, + OpCommitReadPipe = 280, + OpCommitWritePipe = 281, + OpIsValidReserveId = 282, + OpGetNumPipePackets = 283, + OpGetMaxPipePackets = 284, + OpGroupReserveReadPipePackets = 285, + OpGroupReserveWritePipePackets = 286, + OpGroupCommitReadPipe = 287, + OpGroupCommitWritePipe = 288, + OpEnqueueMarker = 291, + OpEnqueueKernel = 292, + OpGetKernelNDrangeSubGroupCount = 293, + OpGetKernelNDrangeMaxSubGroupSize = 294, + OpGetKernelWorkGroupSize = 295, + OpGetKernelPreferredWorkGroupSizeMultiple = 296, + OpRetainEvent = 297, + OpReleaseEvent = 298, + OpCreateUserEvent = 299, + OpIsValidEvent = 300, + OpSetUserEventStatus = 301, + OpCaptureEventProfilingInfo = 302, + OpGetDefaultQueue = 303, + OpBuildNDRange = 304, + OpImageSparseSampleImplicitLod = 305, + OpImageSparseSampleExplicitLod = 306, + OpImageSparseSampleDrefImplicitLod = 307, + OpImageSparseSampleDrefExplicitLod = 308, + OpImageSparseSampleProjImplicitLod = 309, + OpImageSparseSampleProjExplicitLod = 310, + OpImageSparseSampleProjDrefImplicitLod = 311, + OpImageSparseSampleProjDrefExplicitLod = 312, + OpImageSparseFetch = 313, + OpImageSparseGather = 314, + OpImageSparseDrefGather = 315, + OpImageSparseTexelsResident = 316, + OpNoLine = 317, + OpAtomicFlagTestAndSet = 318, + OpAtomicFlagClear = 319, + OpImageSparseRead = 320, + OpSizeOf = 321, + OpTypePipeStorage = 322, + OpConstantPipeStorage = 323, + OpCreatePipeFromPipeStorage = 324, + OpGetKernelLocalSizeForSubgroupCount = 325, + OpGetKernelMaxNumSubgroups = 326, + OpTypeNamedBarrier = 327, + OpNamedBarrierInitialize = 328, + OpMemoryNamedBarrier = 329, + OpModuleProcessed = 330, + OpDecorateId = 332, + OpSubgroupBallotKHR = 4421, + OpSubgroupFirstInvocationKHR = 4422, + OpSubgroupAllKHR = 4428, + OpSubgroupAnyKHR = 4429, + OpSubgroupAllEqualKHR = 4430, + OpSubgroupReadInvocationKHR = 4432, + OpGroupIAddNonUniformAMD = 5000, + OpGroupFAddNonUniformAMD = 5001, + OpGroupFMinNonUniformAMD = 5002, + OpGroupUMinNonUniformAMD = 5003, + OpGroupSMinNonUniformAMD = 5004, + OpGroupFMaxNonUniformAMD = 5005, + OpGroupUMaxNonUniformAMD = 5006, + OpGroupSMaxNonUniformAMD = 5007, + OpFragmentMaskFetchAMD = 5011, + OpFragmentFetchAMD = 5012, + OpSubgroupShuffleINTEL = 5571, + OpSubgroupShuffleDownINTEL = 5572, + OpSubgroupShuffleUpINTEL = 5573, + OpSubgroupShuffleXorINTEL = 5574, + OpSubgroupBlockReadINTEL = 5575, + OpSubgroupBlockWriteINTEL = 5576, + OpSubgroupImageBlockReadINTEL = 5577, + OpSubgroupImageBlockWriteINTEL = 5578, + OpDecorateStringGOOGLE = 5632, + OpMemberDecorateStringGOOGLE = 5633, + } + } +} + diff --git a/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/1.2/spirv.cs b/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/1.2/spirv.cs new file mode 100644 index 000000000..493303d6a --- /dev/null +++ b/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/1.2/spirv.cs @@ -0,0 +1,1021 @@ +// Copyright (c) 2014-2018 The Khronos Group Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and/or associated documentation files (the "Materials"), +// to deal in the Materials without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Materials, and to permit persons to whom the +// Materials are furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Materials. +// +// MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS +// STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND +// HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/ +// +// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM,OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS +// IN THE MATERIALS. + +// This header is automatically generated by the same tool that creates +// the Binary Section of the SPIR-V specification. + +// Enumeration tokens for SPIR-V, in various styles: +// C, C++, C++11, JSON, Lua, Python, C# +// +// - C will have tokens with a "Spv" prefix, e.g.: SpvSourceLanguageGLSL +// - C++ will have tokens in the "spv" name space, e.g.: spv::SourceLanguageGLSL +// - C++11 will use enum classes in the spv namespace, e.g.: spv::SourceLanguage::GLSL +// - Lua will use tables, e.g.: spv.SourceLanguage.GLSL +// - Python will use dictionaries, e.g.: spv['SourceLanguage']['GLSL'] +// - C# will use enum classes in the Specification class located in the "Spv" namespace, e.g.: Spv.Specification.SourceLanguage.GLSL +// +// Some tokens act like mask values, which can be OR'd together, +// while others are mutually exclusive. The mask-like ones have +// "Mask" in their name, and a parallel enum that has the shift +// amount (1 << x) for each corresponding enumerant. + +namespace Spv +{ + + public static class Specification + { + public const uint MagicNumber = 0x07230203; + public const uint Version = 0x00010200; + public const uint Revision = 2; + public const uint OpCodeMask = 0xffff; + public const uint WordCountShift = 16; + + public enum SourceLanguage + { + Unknown = 0, + ESSL = 1, + GLSL = 2, + OpenCL_C = 3, + OpenCL_CPP = 4, + HLSL = 5, + } + + public enum ExecutionModel + { + Vertex = 0, + TessellationControl = 1, + TessellationEvaluation = 2, + Geometry = 3, + Fragment = 4, + GLCompute = 5, + Kernel = 6, + } + + public enum AddressingModel + { + Logical = 0, + Physical32 = 1, + Physical64 = 2, + } + + public enum MemoryModel + { + Simple = 0, + GLSL450 = 1, + OpenCL = 2, + } + + public enum ExecutionMode + { + Invocations = 0, + SpacingEqual = 1, + SpacingFractionalEven = 2, + SpacingFractionalOdd = 3, + VertexOrderCw = 4, + VertexOrderCcw = 5, + PixelCenterInteger = 6, + OriginUpperLeft = 7, + OriginLowerLeft = 8, + EarlyFragmentTests = 9, + PointMode = 10, + Xfb = 11, + DepthReplacing = 12, + DepthGreater = 14, + DepthLess = 15, + DepthUnchanged = 16, + LocalSize = 17, + LocalSizeHint = 18, + InputPoints = 19, + InputLines = 20, + InputLinesAdjacency = 21, + Triangles = 22, + InputTrianglesAdjacency = 23, + Quads = 24, + Isolines = 25, + OutputVertices = 26, + OutputPoints = 27, + OutputLineStrip = 28, + OutputTriangleStrip = 29, + VecTypeHint = 30, + ContractionOff = 31, + Initializer = 33, + Finalizer = 34, + SubgroupSize = 35, + SubgroupsPerWorkgroup = 36, + SubgroupsPerWorkgroupId = 37, + LocalSizeId = 38, + LocalSizeHintId = 39, + PostDepthCoverage = 4446, + StencilRefReplacingEXT = 5027, + } + + public enum StorageClass + { + UniformConstant = 0, + Input = 1, + Uniform = 2, + Output = 3, + Workgroup = 4, + CrossWorkgroup = 5, + Private = 6, + Function = 7, + Generic = 8, + PushConstant = 9, + AtomicCounter = 10, + Image = 11, + StorageBuffer = 12, + } + + public enum Dim + { + Dim1D = 0, + Dim2D = 1, + Dim3D = 2, + Cube = 3, + Rect = 4, + Buffer = 5, + SubpassData = 6, + } + + public enum SamplerAddressingMode + { + None = 0, + ClampToEdge = 1, + Clamp = 2, + Repeat = 3, + RepeatMirrored = 4, + } + + public enum SamplerFilterMode + { + Nearest = 0, + Linear = 1, + } + + public enum ImageFormat + { + Unknown = 0, + Rgba32f = 1, + Rgba16f = 2, + R32f = 3, + Rgba8 = 4, + Rgba8Snorm = 5, + Rg32f = 6, + Rg16f = 7, + R11fG11fB10f = 8, + R16f = 9, + Rgba16 = 10, + Rgb10A2 = 11, + Rg16 = 12, + Rg8 = 13, + R16 = 14, + R8 = 15, + Rgba16Snorm = 16, + Rg16Snorm = 17, + Rg8Snorm = 18, + R16Snorm = 19, + R8Snorm = 20, + Rgba32i = 21, + Rgba16i = 22, + Rgba8i = 23, + R32i = 24, + Rg32i = 25, + Rg16i = 26, + Rg8i = 27, + R16i = 28, + R8i = 29, + Rgba32ui = 30, + Rgba16ui = 31, + Rgba8ui = 32, + R32ui = 33, + Rgb10a2ui = 34, + Rg32ui = 35, + Rg16ui = 36, + Rg8ui = 37, + R16ui = 38, + R8ui = 39, + } + + public enum ImageChannelOrder + { + R = 0, + A = 1, + RG = 2, + RA = 3, + RGB = 4, + RGBA = 5, + BGRA = 6, + ARGB = 7, + Intensity = 8, + Luminance = 9, + Rx = 10, + RGx = 11, + RGBx = 12, + Depth = 13, + DepthStencil = 14, + sRGB = 15, + sRGBx = 16, + sRGBA = 17, + sBGRA = 18, + ABGR = 19, + } + + public enum ImageChannelDataType + { + SnormInt8 = 0, + SnormInt16 = 1, + UnormInt8 = 2, + UnormInt16 = 3, + UnormShort565 = 4, + UnormShort555 = 5, + UnormInt101010 = 6, + SignedInt8 = 7, + SignedInt16 = 8, + SignedInt32 = 9, + UnsignedInt8 = 10, + UnsignedInt16 = 11, + UnsignedInt32 = 12, + HalfFloat = 13, + Float = 14, + UnormInt24 = 15, + UnormInt101010_2 = 16, + } + + public enum ImageOperandsShift + { + Bias = 0, + Lod = 1, + Grad = 2, + ConstOffset = 3, + Offset = 4, + ConstOffsets = 5, + Sample = 6, + MinLod = 7, + } + + public enum ImageOperandsMask + { + MaskNone = 0, + Bias = 0x00000001, + Lod = 0x00000002, + Grad = 0x00000004, + ConstOffset = 0x00000008, + Offset = 0x00000010, + ConstOffsets = 0x00000020, + Sample = 0x00000040, + MinLod = 0x00000080, + } + + public enum FPFastMathModeShift + { + NotNaN = 0, + NotInf = 1, + NSZ = 2, + AllowRecip = 3, + Fast = 4, + } + + public enum FPFastMathModeMask + { + MaskNone = 0, + NotNaN = 0x00000001, + NotInf = 0x00000002, + NSZ = 0x00000004, + AllowRecip = 0x00000008, + Fast = 0x00000010, + } + + public enum FPRoundingMode + { + RTE = 0, + RTZ = 1, + RTP = 2, + RTN = 3, + } + + public enum LinkageType + { + Export = 0, + Import = 1, + } + + public enum AccessQualifier + { + ReadOnly = 0, + WriteOnly = 1, + ReadWrite = 2, + } + + public enum FunctionParameterAttribute + { + Zext = 0, + Sext = 1, + ByVal = 2, + Sret = 3, + NoAlias = 4, + NoCapture = 5, + NoWrite = 6, + NoReadWrite = 7, + } + + public enum Decoration + { + RelaxedPrecision = 0, + SpecId = 1, + Block = 2, + BufferBlock = 3, + RowMajor = 4, + ColMajor = 5, + ArrayStride = 6, + MatrixStride = 7, + GLSLShared = 8, + GLSLPacked = 9, + CPacked = 10, + BuiltIn = 11, + NoPerspective = 13, + Flat = 14, + Patch = 15, + Centroid = 16, + Sample = 17, + Invariant = 18, + Restrict = 19, + Aliased = 20, + Volatile = 21, + Constant = 22, + Coherent = 23, + NonWritable = 24, + NonReadable = 25, + Uniform = 26, + SaturatedConversion = 28, + Stream = 29, + Location = 30, + Component = 31, + Index = 32, + Binding = 33, + DescriptorSet = 34, + Offset = 35, + XfbBuffer = 36, + XfbStride = 37, + FuncParamAttr = 38, + FPRoundingMode = 39, + FPFastMathMode = 40, + LinkageAttributes = 41, + NoContraction = 42, + InputAttachmentIndex = 43, + Alignment = 44, + MaxByteOffset = 45, + AlignmentId = 46, + MaxByteOffsetId = 47, + ExplicitInterpAMD = 4999, + OverrideCoverageNV = 5248, + PassthroughNV = 5250, + ViewportRelativeNV = 5252, + SecondaryViewportRelativeNV = 5256, + HlslCounterBufferGOOGLE = 5634, + HlslSemanticGOOGLE = 5635, + } + + public enum BuiltIn + { + Position = 0, + PointSize = 1, + ClipDistance = 3, + CullDistance = 4, + VertexId = 5, + InstanceId = 6, + PrimitiveId = 7, + InvocationId = 8, + Layer = 9, + ViewportIndex = 10, + TessLevelOuter = 11, + TessLevelInner = 12, + TessCoord = 13, + PatchVertices = 14, + FragCoord = 15, + PointCoord = 16, + FrontFacing = 17, + SampleId = 18, + SamplePosition = 19, + SampleMask = 20, + FragDepth = 22, + HelperInvocation = 23, + NumWorkgroups = 24, + WorkgroupSize = 25, + WorkgroupId = 26, + LocalInvocationId = 27, + GlobalInvocationId = 28, + LocalInvocationIndex = 29, + WorkDim = 30, + GlobalSize = 31, + EnqueuedWorkgroupSize = 32, + GlobalOffset = 33, + GlobalLinearId = 34, + SubgroupSize = 36, + SubgroupMaxSize = 37, + NumSubgroups = 38, + NumEnqueuedSubgroups = 39, + SubgroupId = 40, + SubgroupLocalInvocationId = 41, + VertexIndex = 42, + InstanceIndex = 43, + SubgroupEqMaskKHR = 4416, + SubgroupGeMaskKHR = 4417, + SubgroupGtMaskKHR = 4418, + SubgroupLeMaskKHR = 4419, + SubgroupLtMaskKHR = 4420, + BaseVertex = 4424, + BaseInstance = 4425, + DrawIndex = 4426, + DeviceIndex = 4438, + ViewIndex = 4440, + BaryCoordNoPerspAMD = 4992, + BaryCoordNoPerspCentroidAMD = 4993, + BaryCoordNoPerspSampleAMD = 4994, + BaryCoordSmoothAMD = 4995, + BaryCoordSmoothCentroidAMD = 4996, + BaryCoordSmoothSampleAMD = 4997, + BaryCoordPullModelAMD = 4998, + FragStencilRefEXT = 5014, + ViewportMaskNV = 5253, + SecondaryPositionNV = 5257, + SecondaryViewportMaskNV = 5258, + PositionPerViewNV = 5261, + ViewportMaskPerViewNV = 5262, + } + + public enum SelectionControlShift + { + Flatten = 0, + DontFlatten = 1, + } + + public enum SelectionControlMask + { + MaskNone = 0, + Flatten = 0x00000001, + DontFlatten = 0x00000002, + } + + public enum LoopControlShift + { + Unroll = 0, + DontUnroll = 1, + DependencyInfinite = 2, + DependencyLength = 3, + } + + public enum LoopControlMask + { + MaskNone = 0, + Unroll = 0x00000001, + DontUnroll = 0x00000002, + DependencyInfinite = 0x00000004, + DependencyLength = 0x00000008, + } + + public enum FunctionControlShift + { + Inline = 0, + DontInline = 1, + Pure = 2, + Const = 3, + } + + public enum FunctionControlMask + { + MaskNone = 0, + Inline = 0x00000001, + DontInline = 0x00000002, + Pure = 0x00000004, + Const = 0x00000008, + } + + public enum MemorySemanticsShift + { + Acquire = 1, + Release = 2, + AcquireRelease = 3, + SequentiallyConsistent = 4, + UniformMemory = 6, + SubgroupMemory = 7, + WorkgroupMemory = 8, + CrossWorkgroupMemory = 9, + AtomicCounterMemory = 10, + ImageMemory = 11, + } + + public enum MemorySemanticsMask + { + MaskNone = 0, + Acquire = 0x00000002, + Release = 0x00000004, + AcquireRelease = 0x00000008, + SequentiallyConsistent = 0x00000010, + UniformMemory = 0x00000040, + SubgroupMemory = 0x00000080, + WorkgroupMemory = 0x00000100, + CrossWorkgroupMemory = 0x00000200, + AtomicCounterMemory = 0x00000400, + ImageMemory = 0x00000800, + } + + public enum MemoryAccessShift + { + Volatile = 0, + Aligned = 1, + Nontemporal = 2, + } + + public enum MemoryAccessMask + { + MaskNone = 0, + Volatile = 0x00000001, + Aligned = 0x00000002, + Nontemporal = 0x00000004, + } + + public enum Scope + { + CrossDevice = 0, + Device = 1, + Workgroup = 2, + Subgroup = 3, + Invocation = 4, + } + + public enum GroupOperation + { + Reduce = 0, + InclusiveScan = 1, + ExclusiveScan = 2, + } + + public enum KernelEnqueueFlags + { + NoWait = 0, + WaitKernel = 1, + WaitWorkGroup = 2, + } + + public enum KernelProfilingInfoShift + { + CmdExecTime = 0, + } + + public enum KernelProfilingInfoMask + { + MaskNone = 0, + CmdExecTime = 0x00000001, + } + + public enum Capability + { + Matrix = 0, + Shader = 1, + Geometry = 2, + Tessellation = 3, + Addresses = 4, + Linkage = 5, + Kernel = 6, + Vector16 = 7, + Float16Buffer = 8, + Float16 = 9, + Float64 = 10, + Int64 = 11, + Int64Atomics = 12, + ImageBasic = 13, + ImageReadWrite = 14, + ImageMipmap = 15, + Pipes = 17, + Groups = 18, + DeviceEnqueue = 19, + LiteralSampler = 20, + AtomicStorage = 21, + Int16 = 22, + TessellationPointSize = 23, + GeometryPointSize = 24, + ImageGatherExtended = 25, + StorageImageMultisample = 27, + UniformBufferArrayDynamicIndexing = 28, + SampledImageArrayDynamicIndexing = 29, + StorageBufferArrayDynamicIndexing = 30, + StorageImageArrayDynamicIndexing = 31, + ClipDistance = 32, + CullDistance = 33, + ImageCubeArray = 34, + SampleRateShading = 35, + ImageRect = 36, + SampledRect = 37, + GenericPointer = 38, + Int8 = 39, + InputAttachment = 40, + SparseResidency = 41, + MinLod = 42, + Sampled1D = 43, + Image1D = 44, + SampledCubeArray = 45, + SampledBuffer = 46, + ImageBuffer = 47, + ImageMSArray = 48, + StorageImageExtendedFormats = 49, + ImageQuery = 50, + DerivativeControl = 51, + InterpolationFunction = 52, + TransformFeedback = 53, + GeometryStreams = 54, + StorageImageReadWithoutFormat = 55, + StorageImageWriteWithoutFormat = 56, + MultiViewport = 57, + SubgroupDispatch = 58, + NamedBarrier = 59, + PipeStorage = 60, + SubgroupBallotKHR = 4423, + DrawParameters = 4427, + SubgroupVoteKHR = 4431, + StorageBuffer16BitAccess = 4433, + StorageUniformBufferBlock16 = 4433, + StorageUniform16 = 4434, + UniformAndStorageBuffer16BitAccess = 4434, + StoragePushConstant16 = 4435, + StorageInputOutput16 = 4436, + DeviceGroup = 4437, + MultiView = 4439, + VariablePointersStorageBuffer = 4441, + VariablePointers = 4442, + AtomicStorageOps = 4445, + SampleMaskPostDepthCoverage = 4447, + ImageGatherBiasLodAMD = 5009, + FragmentMaskAMD = 5010, + StencilExportEXT = 5013, + ImageReadWriteLodAMD = 5015, + SampleMaskOverrideCoverageNV = 5249, + GeometryShaderPassthroughNV = 5251, + ShaderViewportIndexLayerEXT = 5254, + ShaderViewportIndexLayerNV = 5254, + ShaderViewportMaskNV = 5255, + ShaderStereoViewNV = 5259, + PerViewAttributesNV = 5260, + SubgroupShuffleINTEL = 5568, + SubgroupBufferBlockIOINTEL = 5569, + SubgroupImageBlockIOINTEL = 5570, + } + + public enum Op + { + OpNop = 0, + OpUndef = 1, + OpSourceContinued = 2, + OpSource = 3, + OpSourceExtension = 4, + OpName = 5, + OpMemberName = 6, + OpString = 7, + OpLine = 8, + OpExtension = 10, + OpExtInstImport = 11, + OpExtInst = 12, + OpMemoryModel = 14, + OpEntryPoint = 15, + OpExecutionMode = 16, + OpCapability = 17, + OpTypeVoid = 19, + OpTypeBool = 20, + OpTypeInt = 21, + OpTypeFloat = 22, + OpTypeVector = 23, + OpTypeMatrix = 24, + OpTypeImage = 25, + OpTypeSampler = 26, + OpTypeSampledImage = 27, + OpTypeArray = 28, + OpTypeRuntimeArray = 29, + OpTypeStruct = 30, + OpTypeOpaque = 31, + OpTypePointer = 32, + OpTypeFunction = 33, + OpTypeEvent = 34, + OpTypeDeviceEvent = 35, + OpTypeReserveId = 36, + OpTypeQueue = 37, + OpTypePipe = 38, + OpTypeForwardPointer = 39, + OpConstantTrue = 41, + OpConstantFalse = 42, + OpConstant = 43, + OpConstantComposite = 44, + OpConstantSampler = 45, + OpConstantNull = 46, + OpSpecConstantTrue = 48, + OpSpecConstantFalse = 49, + OpSpecConstant = 50, + OpSpecConstantComposite = 51, + OpSpecConstantOp = 52, + OpFunction = 54, + OpFunctionParameter = 55, + OpFunctionEnd = 56, + OpFunctionCall = 57, + OpVariable = 59, + OpImageTexelPointer = 60, + OpLoad = 61, + OpStore = 62, + OpCopyMemory = 63, + OpCopyMemorySized = 64, + OpAccessChain = 65, + OpInBoundsAccessChain = 66, + OpPtrAccessChain = 67, + OpArrayLength = 68, + OpGenericPtrMemSemantics = 69, + OpInBoundsPtrAccessChain = 70, + OpDecorate = 71, + OpMemberDecorate = 72, + OpDecorationGroup = 73, + OpGroupDecorate = 74, + OpGroupMemberDecorate = 75, + OpVectorExtractDynamic = 77, + OpVectorInsertDynamic = 78, + OpVectorShuffle = 79, + OpCompositeConstruct = 80, + OpCompositeExtract = 81, + OpCompositeInsert = 82, + OpCopyObject = 83, + OpTranspose = 84, + OpSampledImage = 86, + OpImageSampleImplicitLod = 87, + OpImageSampleExplicitLod = 88, + OpImageSampleDrefImplicitLod = 89, + OpImageSampleDrefExplicitLod = 90, + OpImageSampleProjImplicitLod = 91, + OpImageSampleProjExplicitLod = 92, + OpImageSampleProjDrefImplicitLod = 93, + OpImageSampleProjDrefExplicitLod = 94, + OpImageFetch = 95, + OpImageGather = 96, + OpImageDrefGather = 97, + OpImageRead = 98, + OpImageWrite = 99, + OpImage = 100, + OpImageQueryFormat = 101, + OpImageQueryOrder = 102, + OpImageQuerySizeLod = 103, + OpImageQuerySize = 104, + OpImageQueryLod = 105, + OpImageQueryLevels = 106, + OpImageQuerySamples = 107, + OpConvertFToU = 109, + OpConvertFToS = 110, + OpConvertSToF = 111, + OpConvertUToF = 112, + OpUConvert = 113, + OpSConvert = 114, + OpFConvert = 115, + OpQuantizeToF16 = 116, + OpConvertPtrToU = 117, + OpSatConvertSToU = 118, + OpSatConvertUToS = 119, + OpConvertUToPtr = 120, + OpPtrCastToGeneric = 121, + OpGenericCastToPtr = 122, + OpGenericCastToPtrExplicit = 123, + OpBitcast = 124, + OpSNegate = 126, + OpFNegate = 127, + OpIAdd = 128, + OpFAdd = 129, + OpISub = 130, + OpFSub = 131, + OpIMul = 132, + OpFMul = 133, + OpUDiv = 134, + OpSDiv = 135, + OpFDiv = 136, + OpUMod = 137, + OpSRem = 138, + OpSMod = 139, + OpFRem = 140, + OpFMod = 141, + OpVectorTimesScalar = 142, + OpMatrixTimesScalar = 143, + OpVectorTimesMatrix = 144, + OpMatrixTimesVector = 145, + OpMatrixTimesMatrix = 146, + OpOuterProduct = 147, + OpDot = 148, + OpIAddCarry = 149, + OpISubBorrow = 150, + OpUMulExtended = 151, + OpSMulExtended = 152, + OpAny = 154, + OpAll = 155, + OpIsNan = 156, + OpIsInf = 157, + OpIsFinite = 158, + OpIsNormal = 159, + OpSignBitSet = 160, + OpLessOrGreater = 161, + OpOrdered = 162, + OpUnordered = 163, + OpLogicalEqual = 164, + OpLogicalNotEqual = 165, + OpLogicalOr = 166, + OpLogicalAnd = 167, + OpLogicalNot = 168, + OpSelect = 169, + OpIEqual = 170, + OpINotEqual = 171, + OpUGreaterThan = 172, + OpSGreaterThan = 173, + OpUGreaterThanEqual = 174, + OpSGreaterThanEqual = 175, + OpULessThan = 176, + OpSLessThan = 177, + OpULessThanEqual = 178, + OpSLessThanEqual = 179, + OpFOrdEqual = 180, + OpFUnordEqual = 181, + OpFOrdNotEqual = 182, + OpFUnordNotEqual = 183, + OpFOrdLessThan = 184, + OpFUnordLessThan = 185, + OpFOrdGreaterThan = 186, + OpFUnordGreaterThan = 187, + OpFOrdLessThanEqual = 188, + OpFUnordLessThanEqual = 189, + OpFOrdGreaterThanEqual = 190, + OpFUnordGreaterThanEqual = 191, + OpShiftRightLogical = 194, + OpShiftRightArithmetic = 195, + OpShiftLeftLogical = 196, + OpBitwiseOr = 197, + OpBitwiseXor = 198, + OpBitwiseAnd = 199, + OpNot = 200, + OpBitFieldInsert = 201, + OpBitFieldSExtract = 202, + OpBitFieldUExtract = 203, + OpBitReverse = 204, + OpBitCount = 205, + OpDPdx = 207, + OpDPdy = 208, + OpFwidth = 209, + OpDPdxFine = 210, + OpDPdyFine = 211, + OpFwidthFine = 212, + OpDPdxCoarse = 213, + OpDPdyCoarse = 214, + OpFwidthCoarse = 215, + OpEmitVertex = 218, + OpEndPrimitive = 219, + OpEmitStreamVertex = 220, + OpEndStreamPrimitive = 221, + OpControlBarrier = 224, + OpMemoryBarrier = 225, + OpAtomicLoad = 227, + OpAtomicStore = 228, + OpAtomicExchange = 229, + OpAtomicCompareExchange = 230, + OpAtomicCompareExchangeWeak = 231, + OpAtomicIIncrement = 232, + OpAtomicIDecrement = 233, + OpAtomicIAdd = 234, + OpAtomicISub = 235, + OpAtomicSMin = 236, + OpAtomicUMin = 237, + OpAtomicSMax = 238, + OpAtomicUMax = 239, + OpAtomicAnd = 240, + OpAtomicOr = 241, + OpAtomicXor = 242, + OpPhi = 245, + OpLoopMerge = 246, + OpSelectionMerge = 247, + OpLabel = 248, + OpBranch = 249, + OpBranchConditional = 250, + OpSwitch = 251, + OpKill = 252, + OpReturn = 253, + OpReturnValue = 254, + OpUnreachable = 255, + OpLifetimeStart = 256, + OpLifetimeStop = 257, + OpGroupAsyncCopy = 259, + OpGroupWaitEvents = 260, + OpGroupAll = 261, + OpGroupAny = 262, + OpGroupBroadcast = 263, + OpGroupIAdd = 264, + OpGroupFAdd = 265, + OpGroupFMin = 266, + OpGroupUMin = 267, + OpGroupSMin = 268, + OpGroupFMax = 269, + OpGroupUMax = 270, + OpGroupSMax = 271, + OpReadPipe = 274, + OpWritePipe = 275, + OpReservedReadPipe = 276, + OpReservedWritePipe = 277, + OpReserveReadPipePackets = 278, + OpReserveWritePipePackets = 279, + OpCommitReadPipe = 280, + OpCommitWritePipe = 281, + OpIsValidReserveId = 282, + OpGetNumPipePackets = 283, + OpGetMaxPipePackets = 284, + OpGroupReserveReadPipePackets = 285, + OpGroupReserveWritePipePackets = 286, + OpGroupCommitReadPipe = 287, + OpGroupCommitWritePipe = 288, + OpEnqueueMarker = 291, + OpEnqueueKernel = 292, + OpGetKernelNDrangeSubGroupCount = 293, + OpGetKernelNDrangeMaxSubGroupSize = 294, + OpGetKernelWorkGroupSize = 295, + OpGetKernelPreferredWorkGroupSizeMultiple = 296, + OpRetainEvent = 297, + OpReleaseEvent = 298, + OpCreateUserEvent = 299, + OpIsValidEvent = 300, + OpSetUserEventStatus = 301, + OpCaptureEventProfilingInfo = 302, + OpGetDefaultQueue = 303, + OpBuildNDRange = 304, + OpImageSparseSampleImplicitLod = 305, + OpImageSparseSampleExplicitLod = 306, + OpImageSparseSampleDrefImplicitLod = 307, + OpImageSparseSampleDrefExplicitLod = 308, + OpImageSparseSampleProjImplicitLod = 309, + OpImageSparseSampleProjExplicitLod = 310, + OpImageSparseSampleProjDrefImplicitLod = 311, + OpImageSparseSampleProjDrefExplicitLod = 312, + OpImageSparseFetch = 313, + OpImageSparseGather = 314, + OpImageSparseDrefGather = 315, + OpImageSparseTexelsResident = 316, + OpNoLine = 317, + OpAtomicFlagTestAndSet = 318, + OpAtomicFlagClear = 319, + OpImageSparseRead = 320, + OpSizeOf = 321, + OpTypePipeStorage = 322, + OpConstantPipeStorage = 323, + OpCreatePipeFromPipeStorage = 324, + OpGetKernelLocalSizeForSubgroupCount = 325, + OpGetKernelMaxNumSubgroups = 326, + OpTypeNamedBarrier = 327, + OpNamedBarrierInitialize = 328, + OpMemoryNamedBarrier = 329, + OpModuleProcessed = 330, + OpExecutionModeId = 331, + OpDecorateId = 332, + OpSubgroupBallotKHR = 4421, + OpSubgroupFirstInvocationKHR = 4422, + OpSubgroupAllKHR = 4428, + OpSubgroupAnyKHR = 4429, + OpSubgroupAllEqualKHR = 4430, + OpSubgroupReadInvocationKHR = 4432, + OpGroupIAddNonUniformAMD = 5000, + OpGroupFAddNonUniformAMD = 5001, + OpGroupFMinNonUniformAMD = 5002, + OpGroupUMinNonUniformAMD = 5003, + OpGroupSMinNonUniformAMD = 5004, + OpGroupFMaxNonUniformAMD = 5005, + OpGroupUMaxNonUniformAMD = 5006, + OpGroupSMaxNonUniformAMD = 5007, + OpFragmentMaskFetchAMD = 5011, + OpFragmentFetchAMD = 5012, + OpSubgroupShuffleINTEL = 5571, + OpSubgroupShuffleDownINTEL = 5572, + OpSubgroupShuffleUpINTEL = 5573, + OpSubgroupShuffleXorINTEL = 5574, + OpSubgroupBlockReadINTEL = 5575, + OpSubgroupBlockWriteINTEL = 5576, + OpSubgroupImageBlockReadINTEL = 5577, + OpSubgroupImageBlockWriteINTEL = 5578, + OpDecorateStringGOOGLE = 5632, + OpMemberDecorateStringGOOGLE = 5633, + } + } +} + diff --git a/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/1.2/spirv.py b/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/1.2/spirv.py old mode 100755 new mode 100644 diff --git a/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/spir-v.xml b/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/spir-v.xml index b05bfa7c4..d7e6e481a 100644 --- a/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/spir-v.xml +++ b/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/spir-v.xml @@ -69,7 +69,8 @@ - + + diff --git a/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/unified1/OpenCL.std.h b/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/unified1/OpenCL.std.h index fe759e1bc..fa383a37e 100644 --- a/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/unified1/OpenCL.std.h +++ b/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/unified1/OpenCL.std.h @@ -1,5 +1,5 @@ /* -** Copyright (c) 2015-2017 The Khronos Group Inc. +** Copyright (c) 2015-2019 The Khronos Group Inc. ** ** Permission is hereby granted, free of charge, to any person obtaining a copy ** of this software and/or associated documentation files (the "Materials"), diff --git a/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/unified1/spirv.core.grammar.json b/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/unified1/spirv.core.grammar.json old mode 100755 new mode 100644 index cb641420d..cd1785965 --- a/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/unified1/spirv.core.grammar.json +++ b/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/unified1/spirv.core.grammar.json @@ -3813,6 +3813,83 @@ "extensions" : [ "SPV_AMD_shader_fragment_mask" ], "version" : "None" }, + { + "opname" : "OpWritePackedPrimitiveIndices4x8NV", + "opcode" : 5299, + "operands" : [ + { "kind" : "IdRef", "name" : "'Index Offset'" }, + { "kind" : "IdRef", "name" : "'Packed Indices'" } + ], + "capabilities" : [ "MeshShadingNV" ], + "extensions" : [ "SPV_NV_mesh_shader" ], + "version" : "None" + }, + { + "opname" : "OpReportIntersectionNV", + "opcode" : 5334, + "operands" : [ + { "kind" : "IdResultType" }, + { "kind" : "IdResult" }, + { "kind" : "IdRef", "name" : "'Hit'" }, + { "kind" : "IdRef", "name" : "'HitKind'" } + ], + "capabilities" : [ "RayTracingNV" ], + "extensions" : [ "SPV_NV_ray_tracing" ] + }, + { + "opname" : "OpIgnoreIntersectionNV", + "opcode" : 5335, + + "capabilities" : [ "RayTracingNV" ], + "extensions" : [ "SPV_NV_ray_tracing" ] + }, + { + "opname" : "OpTerminateRayNV", + "opcode" : 5336, + + "capabilities" : [ "RayTracingNV" ], + "extensions" : [ "SPV_NV_ray_tracing" ] + }, + { + "opname" : "OpTraceNV", + "opcode" : 5337, + "operands" : [ + + { "kind" : "IdRef", "name" : "'Accel'" }, + { "kind" : "IdRef", "name" : "'Ray Flags'" }, + { "kind" : "IdRef", "name" : "'Cull Mask'" }, + { "kind" : "IdRef", "name" : "'SBT Offset'" }, + { "kind" : "IdRef", "name" : "'SBT Stride'" }, + { "kind" : "IdRef", "name" : "'Miss Index'" }, + { "kind" : "IdRef", "name" : "'Ray Origin'" }, + { "kind" : "IdRef", "name" : "'Ray Tmin'" }, + { "kind" : "IdRef", "name" : "'Ray Direction'" }, + { "kind" : "IdRef", "name" : "'Ray Tmax'" }, + { "kind" : "IdRef", "name" : "'PayloadId'" } + ], + "capabilities" : [ "RayTracingNV" ], + "extensions" : [ "SPV_NV_ray_tracing" ] + }, + { + "opname" : "OpTypeAccelerationStructureNV", + "opcode" : 5341, + "operands" : [ + { "kind" : "IdResult" } + ], + "capabilities" : [ "RayTracingNV" ], + "extensions" : [ "SPV_NV_ray_tracing" ] + }, + { + "opname" : "OpExecuteCallableNV", + "opcode" : 5344, + "operands" : [ + + { "kind" : "IdRef", "name" : "'SBT Index'" }, + { "kind" : "IdRef", "name" : "'Callable DataId'" } + ], + "capabilities" : [ "RayTracingNV" ], + "extensions" : [ "SPV_NV_ray_tracing" ] + }, { "opname" : "OpSubgroupShuffleINTEL", "opcode" : 5571, @@ -3939,6 +4016,22 @@ "capabilities" : [ "GroupNonUniformPartitionedNV" ], "extensions" : [ "SPV_NV_shader_subgroup_partitioned" ], "version" : "None" + }, + { + "opname" : "OpImageSampleFootprintNV", + "opcode" : 5283, + "operands" : [ + { "kind" : "IdResultType" }, + { "kind" : "IdResult" }, + { "kind" : "IdRef", "name" : "'Sampled Image'" }, + { "kind" : "IdRef", "name" : "'Coordinate'" }, + { "kind" : "IdRef", "name" : "'Granularity'" }, + { "kind" : "IdRef", "name" : "'Coarse'" }, + { "kind" : "ImageOperands", "quantifier" : "?" } + ], + "capabilities" : [ "ImageFootprintNV" ], + "extensions" : [ "SPV_NV_shader_image_footprint" ], + "version" : "None" } ], "operand_kinds" : [ @@ -4010,6 +4103,32 @@ "parameters" : [ { "kind" : "IdRef" } ] + }, + { + "enumerant" : "MakeTexelAvailableKHR", + "value" : "0x0100", + "capabilities" : [ "VulkanMemoryModelKHR" ], + "parameters" : [ + { "kind" : "IdScope" } + ] + }, + { + "enumerant" : "MakeTexelVisibleKHR", + "value" : "0x0200", + "capabilities" : [ "VulkanMemoryModelKHR" ], + "parameters" : [ + { "kind" : "IdScope" } + ] + }, + { + "enumerant" : "NonPrivateTexelKHR", + "value" : "0x0400", + "capabilities" : [ "VulkanMemoryModelKHR" ] + }, + { + "enumerant" : "VolatileTexelKHR", + "value" : "0x0800", + "capabilities" : [ "VulkanMemoryModelKHR" ] } ] }, @@ -4176,6 +4295,21 @@ { "enumerant" : "ImageMemory", "value" : "0x0800" + }, + { + "enumerant" : "OutputMemoryKHR", + "value" : "0x1000", + "capabilities" : [ "VulkanMemoryModelKHR" ] + }, + { + "enumerant" : "MakeAvailableKHR", + "value" : "0x2000", + "capabilities" : [ "VulkanMemoryModelKHR" ] + }, + { + "enumerant" : "MakeVisibleKHR", + "value" : "0x4000", + "capabilities" : [ "VulkanMemoryModelKHR" ] } ] }, @@ -4201,6 +4335,27 @@ { "enumerant" : "Nontemporal", "value" : "0x0004" + }, + { + "enumerant" : "MakePointerAvailableKHR", + "value" : "0x0008", + "parameters" : [ + { "kind" : "IdScope" } + ], + "capabilities" : [ "VulkanMemoryModelKHR" ] + }, + { + "enumerant" : "MakePointerVisibleKHR", + "value" : "0x0010", + "parameters" : [ + { "kind" : "IdScope" } + ], + "capabilities" : [ "VulkanMemoryModelKHR" ] + }, + { + "enumerant" : "NonPrivatePointerKHR", + "value" : "0x0020", + "capabilities" : [ "VulkanMemoryModelKHR" ] } ] }, @@ -4287,6 +4442,46 @@ "enumerant" : "Kernel", "value" : 6, "capabilities" : [ "Kernel" ] + }, + { + "enumerant" : "TaskNV", + "value" : 5267, + "capabilities" : [ "MeshShadingNV" ] + }, + { + "enumerant" : "MeshNV", + "value" : 5268, + "capabilities" : [ "MeshShadingNV" ] + }, + { + "enumerant" : "RayGenerationNV", + "value" : 5313, + "capabilities" : [ "RayTracingNV" ] + }, + { + "enumerant" : "IntersectionNV", + "value" : 5314, + "capabilities" : [ "RayTracingNV" ] + }, + { + "enumerant" : "AnyHitNV", + "value" : 5315, + "capabilities" : [ "RayTracingNV" ] + }, + { + "enumerant" : "ClosestHitNV", + "value" : 5316, + "capabilities" : [ "RayTracingNV" ] + }, + { + "enumerant" : "MissNV", + "value" : 5317, + "capabilities" : [ "RayTracingNV" ] + }, + { + "enumerant" : "CallableNV", + "value" : 5318, + "capabilities" : [ "RayTracingNV" ] } ] }, @@ -4328,6 +4523,11 @@ "enumerant" : "OpenCL", "value" : 2, "capabilities" : [ "Kernel" ] + }, + { + "enumerant" : "VulkanKHR", + "value" : 3, + "capabilities" : [ "VulkanMemoryModelKHR" ] } ] }, @@ -4475,7 +4675,7 @@ { "enumerant" : "OutputVertices", "value" : 26, - "capabilities" : [ "Geometry", "Tessellation" ], + "capabilities" : [ "Geometry", "Tessellation", "MeshShadingNV" ], "parameters" : [ { "kind" : "LiteralInteger", "name" : "'Vertex count'" } ] @@ -4483,7 +4683,7 @@ { "enumerant" : "OutputPoints", "value" : 27, - "capabilities" : [ "Geometry" ] + "capabilities" : [ "Geometry", "MeshShadingNV" ] }, { "enumerant" : "OutputLineStrip", @@ -4573,12 +4773,100 @@ "extensions" : [ "SPV_KHR_post_depth_coverage" ], "version" : "None" }, +{ + "enumerant" : "DenormPreserve", + "value" : 4459, + "capabilities" : [ "DenormPreserve"], + "extensions" : [ "SPV_KHR_float_controls" ], + "parameters" : [ + { "kind" : "LiteralInteger", "name" : "'Target Width'" } + ], + "version" : "None" + }, + { + "enumerant" : "DenormFlushToZero", + "value" : 4460, + "capabilities" : [ "DenormFlushToZero"], + "extensions" : [ "SPV_KHR_float_controls" ], + "parameters" : [ + { "kind" : "LiteralInteger", "name" : "'Target Width'" } + ], + "version" : "None" + }, + { + "enumerant" : "SignedZeroInfNanPreserve", + "value" : 4461, + "capabilities" : [ "SignedZeroInfNanPreserve"], + "extensions" : [ "SPV_KHR_float_controls" ], + "parameters" : [ + { "kind" : "LiteralInteger", "name" : "'Target Width'" } + ], + "version" : "None" + }, + { + "enumerant" : "RoundingModeRTE", + "value" : 4462, + "capabilities" : [ "RoundingModeRTE"], + "extensions" : [ "SPV_KHR_float_controls" ], + "parameters" : [ + { "kind" : "LiteralInteger", "name" : "'Target Width'" } + ], + "version" : "None" + }, + { + "enumerant" : "RoundingModeRTZ", + "value" : 4463, + "capabilities" : [ "RoundingModeRTZ"], + "extensions" : [ "SPV_KHR_float_controls" ], + "parameters" : [ + { "kind" : "LiteralInteger", "name" : "'Target Width'" } + ], + "version" : "None" + }, { "enumerant" : "StencilRefReplacingEXT", "value" : 5027, "capabilities" : [ "StencilExportEXT" ], "extensions" : [ "SPV_EXT_shader_stencil_export" ], "version" : "None" + }, + { + "enumerant" : "OutputLinesNV", + "value" : 5269, + "capabilities" : [ "MeshShadingNV" ], + "extensions" : [ "SPV_NV_mesh_shader" ], + "version" : "None" + }, + { + "enumerant" : "OutputPrimitivesNV", + "value" : 5270, + "capabilities" : [ "MeshShadingNV" ], + "parameters" : [ + { "kind" : "LiteralInteger", "name" : "'Primitive count'" } + ], + "extensions" : [ "SPV_NV_mesh_shader" ], + "version" : "None" + }, + { + "enumerant" : "DerivativeGroupQuadsNV", + "value" : 5289, + "capabilities" : [ "ComputeDerivativeGroupQuadsNV" ], + "extensions" : [ "SPV_NV_compute_shader_derivatives" ], + "version" : "None" + }, + { + "enumerant" : "DerivativeGroupLinearNV", + "value" : 5290, + "capabilities" : [ "ComputeDerivativeGroupLinearNV" ], + "extensions" : [ "SPV_NV_compute_shader_derivatives" ], + "version" : "None" + }, + { + "enumerant" : "OutputTrianglesNV", + "value" : 5298, + "capabilities" : [ "MeshShadingNV" ], + "extensions" : [ "SPV_NV_mesh_shader" ], + "version" : "None" } ] }, @@ -4649,6 +4937,42 @@ ], "capabilities" : [ "Shader" ], "version" : "1.3" + }, + { + "enumerant" : "CallableDataNV", + "value" : 5328, + "extensions" : [ "SPV_NV_ray_tracing" ], + "capabilities" : [ "RayTracingNV" ] + }, + { + "enumerant" : "IncomingCallableDataNV", + "value" : 5329, + "extensions" : [ "SPV_NV_ray_tracing" ], + "capabilities" : [ "RayTracingNV" ] + }, + { + "enumerant" : "RayPayloadNV", + "value" : 5338, + "extensions" : [ "SPV_NV_ray_tracing" ], + "capabilities" : [ "RayTracingNV" ] + }, + { + "enumerant" : "HitAttributeNV", + "value" : 5339, + "extensions" : [ "SPV_NV_ray_tracing" ], + "capabilities" : [ "RayTracingNV" ] + }, + { + "enumerant" : "IncomingRayPayloadNV", + "value" : 5342, + "extensions" : [ "SPV_NV_ray_tracing" ], + "capabilities" : [ "RayTracingNV" ] + }, + { + "enumerant" : "ShaderRecordBufferNV", + "value" : 5343, + "extensions" : [ "SPV_NV_ray_tracing" ], + "capabilities" : [ "RayTracingNV" ] } ] }, @@ -4659,11 +4983,12 @@ { "enumerant" : "1D", "value" : 0, - "capabilities" : [ "Sampled1D" ] + "capabilities" : [ "Sampled1D", "Image1D" ] }, { "enumerant" : "2D", - "value" : 1 + "value" : 1, + "capabilities" : [ "Shader", "Kernel", "ImageMSArray" ] }, { "enumerant" : "3D", @@ -4672,17 +4997,17 @@ { "enumerant" : "Cube", "value" : 3, - "capabilities" : [ "Shader" ] + "capabilities" : [ "Shader", "ImageCubeArray" ] }, { "enumerant" : "Rect", "value" : 4, - "capabilities" : [ "SampledRect" ] + "capabilities" : [ "SampledRect", "ImageRect" ] }, { "enumerant" : "Buffer", "value" : 5, - "capabilities" : [ "SampledBuffer" ] + "capabilities" : [ "SampledBuffer", "ImageBuffer" ] }, { "enumerant" : "SubpassData", @@ -5541,6 +5866,18 @@ ], "version" : "1.2" }, + { + "enumerant" : "NoSignedWrap", + "value" : 4469, + "extensions" : [ "SPV_KHR_no_integer_wrap_decoration" ], + "version" : "None" + }, + { + "enumerant" : "NoUnsignedWrap", + "value" : 4470, + "extensions" : [ "SPV_KHR_no_integer_wrap_decoration" ], + "version" : "None" + }, { "enumerant" : "ExplicitInterpAMD", "value" : 4999, @@ -5577,6 +5914,34 @@ { "kind" : "LiteralInteger", "name" : "'Offset'" } ] }, + { + "enumerant" : "PerPrimitiveNV", + "value" : 5271, + "capabilities" : [ "MeshShadingNV" ], + "extensions" : [ "SPV_NV_mesh_shader" ], + "version" : "None" + }, + { + "enumerant" : "PerViewNV", + "value" : 5272, + "capabilities" : [ "MeshShadingNV" ], + "extensions" : [ "SPV_NV_mesh_shader" ], + "version" : "None" + }, + { + "enumerant" : "PerTaskNV", + "value" : 5273, + "capabilities" : [ "MeshShadingNV" ], + "extensions" : [ "SPV_NV_mesh_shader" ], + "version" : "None" + }, + { + "enumerant" : "PerVertexNV", + "value" : 5285, + "capabilities" : [ "FragmentBarycentricNV" ], + "extensions" : [ "SPV_NV_fragment_shader_barycentric" ], + "version" : "None" + }, { "enumerant" : "NonUniformEXT", "value" : 5300, @@ -5639,7 +6004,7 @@ { "enumerant" : "PrimitiveId", "value" : 7, - "capabilities" : [ "Geometry", "Tessellation" ] + "capabilities" : [ "Geometry", "Tessellation", "RayTracingNV" ] }, { "enumerant" : "InvocationId", @@ -5887,8 +6252,8 @@ { "enumerant" : "DrawIndex", "value" : 4426, - "capabilities" : [ "DrawParameters" ], - "extensions" : [ "SPV_KHR_shader_draw_parameters" ], + "capabilities" : [ "DrawParameters", "MeshShadingNV" ], + "extensions" : [ "SPV_KHR_shader_draw_parameters", "SPV_NV_mesh_shader" ], "version" : "1.3" }, { @@ -5957,7 +6322,8 @@ { "enumerant" : "ViewportMaskNV", "value" : 5253, - "capabilities" : [ "ShaderViewportMaskNV" ], + "capabilities" : [ "ShaderViewportMaskNV", "MeshShadingNV" ], + "extensions" : [ "SPV_NV_viewport_array2", "SPV_NV_mesh_shader" ], "version" : "None" }, { @@ -5977,13 +6343,15 @@ { "enumerant" : "PositionPerViewNV", "value" : 5261, - "capabilities" : [ "PerViewAttributesNV" ], + "capabilities" : [ "PerViewAttributesNV", "MeshShadingNV" ], + "extensions" : [ "SPV_NVX_multiview_per_view_attributes", "SPV_NV_mesh_shader" ], "version" : "None" }, { "enumerant" : "ViewportMaskPerViewNV", "value" : 5262, - "capabilities" : [ "PerViewAttributesNV" ], + "capabilities" : [ "PerViewAttributesNV", "MeshShadingNV" ], + "extensions" : [ "SPV_NVX_multiview_per_view_attributes", "SPV_NV_mesh_shader" ], "version" : "None" }, { @@ -5992,6 +6360,188 @@ "capabilities" : [ "FragmentFullyCoveredEXT" ], "extensions" : [ "SPV_EXT_fragment_fully_covered" ], "version" : "None" + }, + { + "enumerant" : "TaskCountNV", + "value" : 5274, + "capabilities" : [ "MeshShadingNV" ], + "extensions" : [ "SPV_NV_mesh_shader" ], + "version" : "None" + }, + { + "enumerant" : "PrimitiveCountNV", + "value" : 5275, + "capabilities" : [ "MeshShadingNV" ], + "extensions" : [ "SPV_NV_mesh_shader" ], + "version" : "None" + }, + { + "enumerant" : "PrimitiveIndicesNV", + "value" : 5276, + "capabilities" : [ "MeshShadingNV" ], + "extensions" : [ "SPV_NV_mesh_shader" ], + "version" : "None" + }, + { + "enumerant" : "ClipDistancePerViewNV", + "value" : 5277, + "capabilities" : [ "MeshShadingNV" ], + "extensions" : [ "SPV_NV_mesh_shader" ], + "version" : "None" + }, + { + "enumerant" : "CullDistancePerViewNV", + "value" : 5278, + "capabilities" : [ "MeshShadingNV" ], + "extensions" : [ "SPV_NV_mesh_shader" ], + "version" : "None" + }, + { + "enumerant" : "LayerPerViewNV", + "value" : 5279, + "capabilities" : [ "MeshShadingNV" ], + "extensions" : [ "SPV_NV_mesh_shader" ], + "version" : "None" + }, + { + "enumerant" : "MeshViewCountNV", + "value" : 5280, + "capabilities" : [ "MeshShadingNV" ], + "extensions" : [ "SPV_NV_mesh_shader" ], + "version" : "None" + }, + { + "enumerant" : "MeshViewIndicesNV", + "value" : 5281, + "capabilities" : [ "MeshShadingNV" ], + "extensions" : [ "SPV_NV_mesh_shader" ], + "version" : "None" + }, + { + "enumerant" : "BaryCoordNV", + "value" : 5286, + "capabilities" : [ "FragmentBarycentricNV" ], + "extensions" : [ "SPV_NV_fragment_shader_barycentric" ], + "version" : "None" + }, + { + "enumerant" : "BaryCoordNoPerspNV", + "value" : 5287, + "capabilities" : [ "FragmentBarycentricNV" ], + "extensions" : [ "SPV_NV_fragment_shader_barycentric" ], + "version" : "None" + }, + { + "enumerant" : "FragSizeEXT", + "value" : 5292 , + "capabilities" : [ "FragmentDensityEXT", "ShadingRateNV" ], + "extensions" : [ "SPV_EXT_fragment_invocation_density", "SPV_NV_shading_rate" ], + "version" : "None" + }, + { + "enumerant" : "FragmentSizeNV", + "value" : 5292 , + "capabilities" : [ "ShadingRateNV", "FragmentDensityEXT" ], + "extensions" : [ "SPV_NV_shading_rate", "SPV_EXT_fragment_invocation_density" ], + "version" : "None" + }, + { + "enumerant" : "FragInvocationCountEXT", + "value" : 5293, + "capabilities" : [ "FragmentDensityEXT", "ShadingRateNV" ], + "extensions" : [ "SPV_EXT_fragment_invocation_density", "SPV_NV_shading_rate" ], + "version" : "None" + }, + { + "enumerant" : "InvocationsPerPixelNV", + "value" : 5293, + "capabilities" : [ "ShadingRateNV", "FragmentDensityEXT" ], + "extensions" : [ "SPV_NV_shading_rate", "SPV_EXT_fragment_invocation_density" ], + "version" : "None" + }, + { + "enumerant" : "LaunchIdNV", + "value" : 5319, + "capabilities" : [ "RayTracingNV" ], + "extensions" : [ "SPV_NV_ray_tracing" ] + }, + { + "enumerant" : "LaunchSizeNV", + "value" : 5320, + "capabilities" : [ "RayTracingNV" ], + "extensions" : [ "SPV_NV_ray_tracing" ] + }, + { + "enumerant" : "WorldRayOriginNV", + "value" : 5321, + "capabilities" : [ "RayTracingNV" ], + "extensions" : [ "SPV_NV_ray_tracing" ] + }, + { + "enumerant" : "WorldRayDirectionNV", + "value" : 5322, + "capabilities" : [ "RayTracingNV" ], + "extensions" : [ "SPV_NV_ray_tracing" ] + }, + { + "enumerant" : "ObjectRayOriginNV", + "value" : 5323, + "capabilities" : [ "RayTracingNV" ], + "extensions" : [ "SPV_NV_ray_tracing" ] + }, + { + "enumerant" : "ObjectRayDirectionNV", + "value" : 5324, + "capabilities" : [ "RayTracingNV" ], + "extensions" : [ "SPV_NV_ray_tracing" ] + }, + { + "enumerant" : "RayTminNV", + "value" : 5325, + "capabilities" : [ "RayTracingNV" ], + "extensions" : [ "SPV_NV_ray_tracing" ] + }, + { + "enumerant" : "RayTmaxNV", + "value" : 5326, + "capabilities" : [ "RayTracingNV" ], + "extensions" : [ "SPV_NV_ray_tracing" ] + }, + { + "enumerant" : "InstanceCustomIndexNV", + "value" : 5327, + "capabilities" : [ "RayTracingNV" ], + "extensions" : [ "SPV_NV_ray_tracing" ] + }, + { + "enumerant" : "ObjectToWorldNV", + "value" : 5330, + "capabilities" : [ "RayTracingNV" ], + "extensions" : [ "SPV_NV_ray_tracing" ] + }, + { + "enumerant" : "WorldToObjectNV", + "value" : 5331, + "capabilities" : [ "RayTracingNV" ], + "extensions" : [ "SPV_NV_ray_tracing" ] + }, + { + "enumerant" : "HitTNV", + "value" : 5332, + "capabilities" : [ "RayTracingNV" ], + "extensions" : [ "SPV_NV_ray_tracing" ] + }, + { + "enumerant" : "HitKindNV", + "value" : 5333, + "capabilities" : [ "RayTracingNV" ], + "extensions" : [ "SPV_NV_ray_tracing" ] + }, + { + "enumerant" : "IncomingRayFlagsNV", + "value" : 5351, + "capabilities" : [ "RayTracingNV" ], + "extensions" : [ "SPV_NV_ray_tracing" ] } ] }, @@ -6018,6 +6568,11 @@ { "enumerant" : "Invocation", "value" : 4 + }, + { + "enumerant" : "QueueFamilyKHR", + "value" : 5, + "capabilities" : [ "VulkanMemoryModelKHR" ] } ] }, @@ -6548,6 +7103,36 @@ "extensions" : [ "SPV_KHR_8bit_storage" ], "version" : "None" }, + { + "enumerant" : "DenormPreserve", + "value" : 4464, + "extensions" : [ "SPV_KHR_float_controls" ], + "version" : "None" + }, + { + "enumerant" : "DenormFlushToZero", + "value" : 4465, + "extensions" : [ "SPV_KHR_float_controls" ], + "version" : "None" + }, + { + "enumerant" : "SignedZeroInfNanPreserve", + "value" : 4466, + "extensions" : [ "SPV_KHR_float_controls" ], + "version" : "None" + }, + { + "enumerant" : "RoundingModeRTE", + "value" : 4467, + "extensions" : [ "SPV_KHR_float_controls" ], + "version" : "None" + }, + { + "enumerant" : "RoundingModeRTZ", + "value" : 4468, + "extensions" : [ "SPV_KHR_float_controls" ], + "version" : "None" + }, { "enumerant" : "Float16ImageAMD", "value" : 5008, @@ -6639,6 +7224,13 @@ "extensions" : [ "SPV_EXT_fragment_fully_covered" ], "version" : "None" }, + { + "enumerant" : "MeshShadingNV", + "value" : 5266, + "capabilities" : [ "Shader" ], + "extensions" : [ "SPV_NV_mesh_shader" ], + "version" : "None" + }, { "enumerant" : "ShaderNonUniformEXT", "value" : 5301, @@ -6723,6 +7315,13 @@ "extensions" : [ "SPV_EXT_descriptor_indexing" ], "version" : "None" }, + { + "enumerant" : "RayTracingNV", + "value" : 5340, + "capabilities" : [ "Shader" ], + "extensions" : [ "SPV_NV_ray_tracing" ], + "version" : "None" + }, { "enumerant" : "SubgroupShuffleINTEL", "value" : 5568, @@ -6746,6 +7345,56 @@ "value" : 5297, "extensions" : [ "SPV_NV_shader_subgroup_partitioned" ], "version" : "None" + }, + { + "enumerant" : "VulkanMemoryModelKHR", + "value" : 5345, + "extensions" : [ "SPV_KHR_vulkan_memory_model" ], + "version" : "None" + }, + { + "enumerant" : "VulkanMemoryModelDeviceScopeKHR", + "value" : 5346, + "extensions" : [ "SPV_KHR_vulkan_memory_model" ], + "version" : "None" + }, + { + "enumerant" : "ImageFootprintNV", + "value" : 5282, + "extensions" : [ "SPV_NV_shader_image_footprint" ], + "version" : "None" + }, + { + "enumerant" : "FragmentBarycentricNV", + "value" : 5284, + "extensions" : [ "SPV_NV_fragment_shader_barycentric" ], + "version" : "None" + }, + { + "enumerant" : "ComputeDerivativeGroupQuadsNV", + "value" : 5288, + "extensions" : [ "SPV_NV_compute_shader_derivatives" ], + "version" : "None" + }, + { + "enumerant" : "ComputeDerivativeGroupLinearNV", + "value" : 5350, + "extensions" : [ "SPV_NV_compute_shader_derivatives" ], + "version" : "None" + }, + { + "enumerant" : "FragmentDensityEXT", + "value" : 5291, + "capabilities" : [ "Shader" ], + "extensions" : [ "SPV_EXT_fragment_invocation_density", "SPV_NV_shading_rate" ], + "version" : "None" + }, + { + "enumerant" : "ShadingRateNV", + "value" : 5291, + "capabilities" : [ "Shader" ], + "extensions" : [ "SPV_NV_shading_rate", "SPV_EXT_fragment_invocation_density" ], + "version" : "None" } ] }, diff --git a/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/unified1/spirv.cs b/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/unified1/spirv.cs new file mode 100644 index 000000000..bde9c1fc5 --- /dev/null +++ b/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/unified1/spirv.cs @@ -0,0 +1,1198 @@ +// Copyright (c) 2014-2019 The Khronos Group Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and/or associated documentation files (the "Materials"), +// to deal in the Materials without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Materials, and to permit persons to whom the +// Materials are furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Materials. +// +// MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS +// STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND +// HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/ +// +// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM,OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS +// IN THE MATERIALS. + +// This header is automatically generated by the same tool that creates +// the Binary Section of the SPIR-V specification. + +// Enumeration tokens for SPIR-V, in various styles: +// C, C++, C++11, JSON, Lua, Python, C#, D +// +// - C will have tokens with a "Spv" prefix, e.g.: SpvSourceLanguageGLSL +// - C++ will have tokens in the "spv" name space, e.g.: spv::SourceLanguageGLSL +// - C++11 will use enum classes in the spv namespace, e.g.: spv::SourceLanguage::GLSL +// - Lua will use tables, e.g.: spv.SourceLanguage.GLSL +// - Python will use dictionaries, e.g.: spv['SourceLanguage']['GLSL'] +// - C# will use enum classes in the Specification class located in the "Spv" namespace, +// e.g.: Spv.Specification.SourceLanguage.GLSL +// - D will have tokens under the "spv" module, e.g: spv.SourceLanguage.GLSL +// +// Some tokens act like mask values, which can be OR'd together, +// while others are mutually exclusive. The mask-like ones have +// "Mask" in their name, and a parallel enum that has the shift +// amount (1 << x) for each corresponding enumerant. + +namespace Spv +{ + + public static class Specification + { + public const uint MagicNumber = 0x07230203; + public const uint Version = 0x00010300; + public const uint Revision = 6; + public const uint OpCodeMask = 0xffff; + public const uint WordCountShift = 16; + + public enum SourceLanguage + { + Unknown = 0, + ESSL = 1, + GLSL = 2, + OpenCL_C = 3, + OpenCL_CPP = 4, + HLSL = 5, + } + + public enum ExecutionModel + { + Vertex = 0, + TessellationControl = 1, + TessellationEvaluation = 2, + Geometry = 3, + Fragment = 4, + GLCompute = 5, + Kernel = 6, + TaskNV = 5267, + MeshNV = 5268, + RayGenerationNV = 5313, + IntersectionNV = 5314, + AnyHitNV = 5315, + ClosestHitNV = 5316, + MissNV = 5317, + CallableNV = 5318, + } + + public enum AddressingModel + { + Logical = 0, + Physical32 = 1, + Physical64 = 2, + } + + public enum MemoryModel + { + Simple = 0, + GLSL450 = 1, + OpenCL = 2, + VulkanKHR = 3, + } + + public enum ExecutionMode + { + Invocations = 0, + SpacingEqual = 1, + SpacingFractionalEven = 2, + SpacingFractionalOdd = 3, + VertexOrderCw = 4, + VertexOrderCcw = 5, + PixelCenterInteger = 6, + OriginUpperLeft = 7, + OriginLowerLeft = 8, + EarlyFragmentTests = 9, + PointMode = 10, + Xfb = 11, + DepthReplacing = 12, + DepthGreater = 14, + DepthLess = 15, + DepthUnchanged = 16, + LocalSize = 17, + LocalSizeHint = 18, + InputPoints = 19, + InputLines = 20, + InputLinesAdjacency = 21, + Triangles = 22, + InputTrianglesAdjacency = 23, + Quads = 24, + Isolines = 25, + OutputVertices = 26, + OutputPoints = 27, + OutputLineStrip = 28, + OutputTriangleStrip = 29, + VecTypeHint = 30, + ContractionOff = 31, + Initializer = 33, + Finalizer = 34, + SubgroupSize = 35, + SubgroupsPerWorkgroup = 36, + SubgroupsPerWorkgroupId = 37, + LocalSizeId = 38, + LocalSizeHintId = 39, + PostDepthCoverage = 4446, + DenormPreserve = 4459, + DenormFlushToZero = 4460, + SignedZeroInfNanPreserve = 4461, + RoundingModeRTE = 4462, + RoundingModeRTZ = 4463, + StencilRefReplacingEXT = 5027, + OutputLinesNV = 5269, + OutputPrimitivesNV = 5270, + DerivativeGroupQuadsNV = 5289, + DerivativeGroupLinearNV = 5290, + OutputTrianglesNV = 5298, + } + + public enum StorageClass + { + UniformConstant = 0, + Input = 1, + Uniform = 2, + Output = 3, + Workgroup = 4, + CrossWorkgroup = 5, + Private = 6, + Function = 7, + Generic = 8, + PushConstant = 9, + AtomicCounter = 10, + Image = 11, + StorageBuffer = 12, + CallableDataNV = 5328, + IncomingCallableDataNV = 5329, + RayPayloadNV = 5338, + HitAttributeNV = 5339, + IncomingRayPayloadNV = 5342, + ShaderRecordBufferNV = 5343, + } + + public enum Dim + { + Dim1D = 0, + Dim2D = 1, + Dim3D = 2, + Cube = 3, + Rect = 4, + Buffer = 5, + SubpassData = 6, + } + + public enum SamplerAddressingMode + { + None = 0, + ClampToEdge = 1, + Clamp = 2, + Repeat = 3, + RepeatMirrored = 4, + } + + public enum SamplerFilterMode + { + Nearest = 0, + Linear = 1, + } + + public enum ImageFormat + { + Unknown = 0, + Rgba32f = 1, + Rgba16f = 2, + R32f = 3, + Rgba8 = 4, + Rgba8Snorm = 5, + Rg32f = 6, + Rg16f = 7, + R11fG11fB10f = 8, + R16f = 9, + Rgba16 = 10, + Rgb10A2 = 11, + Rg16 = 12, + Rg8 = 13, + R16 = 14, + R8 = 15, + Rgba16Snorm = 16, + Rg16Snorm = 17, + Rg8Snorm = 18, + R16Snorm = 19, + R8Snorm = 20, + Rgba32i = 21, + Rgba16i = 22, + Rgba8i = 23, + R32i = 24, + Rg32i = 25, + Rg16i = 26, + Rg8i = 27, + R16i = 28, + R8i = 29, + Rgba32ui = 30, + Rgba16ui = 31, + Rgba8ui = 32, + R32ui = 33, + Rgb10a2ui = 34, + Rg32ui = 35, + Rg16ui = 36, + Rg8ui = 37, + R16ui = 38, + R8ui = 39, + } + + public enum ImageChannelOrder + { + R = 0, + A = 1, + RG = 2, + RA = 3, + RGB = 4, + RGBA = 5, + BGRA = 6, + ARGB = 7, + Intensity = 8, + Luminance = 9, + Rx = 10, + RGx = 11, + RGBx = 12, + Depth = 13, + DepthStencil = 14, + sRGB = 15, + sRGBx = 16, + sRGBA = 17, + sBGRA = 18, + ABGR = 19, + } + + public enum ImageChannelDataType + { + SnormInt8 = 0, + SnormInt16 = 1, + UnormInt8 = 2, + UnormInt16 = 3, + UnormShort565 = 4, + UnormShort555 = 5, + UnormInt101010 = 6, + SignedInt8 = 7, + SignedInt16 = 8, + SignedInt32 = 9, + UnsignedInt8 = 10, + UnsignedInt16 = 11, + UnsignedInt32 = 12, + HalfFloat = 13, + Float = 14, + UnormInt24 = 15, + UnormInt101010_2 = 16, + } + + public enum ImageOperandsShift + { + Bias = 0, + Lod = 1, + Grad = 2, + ConstOffset = 3, + Offset = 4, + ConstOffsets = 5, + Sample = 6, + MinLod = 7, + MakeTexelAvailableKHR = 8, + MakeTexelVisibleKHR = 9, + NonPrivateTexelKHR = 10, + VolatileTexelKHR = 11, + } + + public enum ImageOperandsMask + { + MaskNone = 0, + Bias = 0x00000001, + Lod = 0x00000002, + Grad = 0x00000004, + ConstOffset = 0x00000008, + Offset = 0x00000010, + ConstOffsets = 0x00000020, + Sample = 0x00000040, + MinLod = 0x00000080, + MakeTexelAvailableKHR = 0x00000100, + MakeTexelVisibleKHR = 0x00000200, + NonPrivateTexelKHR = 0x00000400, + VolatileTexelKHR = 0x00000800, + } + + public enum FPFastMathModeShift + { + NotNaN = 0, + NotInf = 1, + NSZ = 2, + AllowRecip = 3, + Fast = 4, + } + + public enum FPFastMathModeMask + { + MaskNone = 0, + NotNaN = 0x00000001, + NotInf = 0x00000002, + NSZ = 0x00000004, + AllowRecip = 0x00000008, + Fast = 0x00000010, + } + + public enum FPRoundingMode + { + RTE = 0, + RTZ = 1, + RTP = 2, + RTN = 3, + } + + public enum LinkageType + { + Export = 0, + Import = 1, + } + + public enum AccessQualifier + { + ReadOnly = 0, + WriteOnly = 1, + ReadWrite = 2, + } + + public enum FunctionParameterAttribute + { + Zext = 0, + Sext = 1, + ByVal = 2, + Sret = 3, + NoAlias = 4, + NoCapture = 5, + NoWrite = 6, + NoReadWrite = 7, + } + + public enum Decoration + { + RelaxedPrecision = 0, + SpecId = 1, + Block = 2, + BufferBlock = 3, + RowMajor = 4, + ColMajor = 5, + ArrayStride = 6, + MatrixStride = 7, + GLSLShared = 8, + GLSLPacked = 9, + CPacked = 10, + BuiltIn = 11, + NoPerspective = 13, + Flat = 14, + Patch = 15, + Centroid = 16, + Sample = 17, + Invariant = 18, + Restrict = 19, + Aliased = 20, + Volatile = 21, + Constant = 22, + Coherent = 23, + NonWritable = 24, + NonReadable = 25, + Uniform = 26, + SaturatedConversion = 28, + Stream = 29, + Location = 30, + Component = 31, + Index = 32, + Binding = 33, + DescriptorSet = 34, + Offset = 35, + XfbBuffer = 36, + XfbStride = 37, + FuncParamAttr = 38, + FPRoundingMode = 39, + FPFastMathMode = 40, + LinkageAttributes = 41, + NoContraction = 42, + InputAttachmentIndex = 43, + Alignment = 44, + MaxByteOffset = 45, + AlignmentId = 46, + MaxByteOffsetId = 47, + NoSignedWrap = 4469, + NoUnsignedWrap = 4470, + ExplicitInterpAMD = 4999, + OverrideCoverageNV = 5248, + PassthroughNV = 5250, + ViewportRelativeNV = 5252, + SecondaryViewportRelativeNV = 5256, + PerPrimitiveNV = 5271, + PerViewNV = 5272, + PerTaskNV = 5273, + PerVertexNV = 5285, + NonUniformEXT = 5300, + HlslCounterBufferGOOGLE = 5634, + HlslSemanticGOOGLE = 5635, + } + + public enum BuiltIn + { + Position = 0, + PointSize = 1, + ClipDistance = 3, + CullDistance = 4, + VertexId = 5, + InstanceId = 6, + PrimitiveId = 7, + InvocationId = 8, + Layer = 9, + ViewportIndex = 10, + TessLevelOuter = 11, + TessLevelInner = 12, + TessCoord = 13, + PatchVertices = 14, + FragCoord = 15, + PointCoord = 16, + FrontFacing = 17, + SampleId = 18, + SamplePosition = 19, + SampleMask = 20, + FragDepth = 22, + HelperInvocation = 23, + NumWorkgroups = 24, + WorkgroupSize = 25, + WorkgroupId = 26, + LocalInvocationId = 27, + GlobalInvocationId = 28, + LocalInvocationIndex = 29, + WorkDim = 30, + GlobalSize = 31, + EnqueuedWorkgroupSize = 32, + GlobalOffset = 33, + GlobalLinearId = 34, + SubgroupSize = 36, + SubgroupMaxSize = 37, + NumSubgroups = 38, + NumEnqueuedSubgroups = 39, + SubgroupId = 40, + SubgroupLocalInvocationId = 41, + VertexIndex = 42, + InstanceIndex = 43, + SubgroupEqMask = 4416, + SubgroupEqMaskKHR = 4416, + SubgroupGeMask = 4417, + SubgroupGeMaskKHR = 4417, + SubgroupGtMask = 4418, + SubgroupGtMaskKHR = 4418, + SubgroupLeMask = 4419, + SubgroupLeMaskKHR = 4419, + SubgroupLtMask = 4420, + SubgroupLtMaskKHR = 4420, + BaseVertex = 4424, + BaseInstance = 4425, + DrawIndex = 4426, + DeviceIndex = 4438, + ViewIndex = 4440, + BaryCoordNoPerspAMD = 4992, + BaryCoordNoPerspCentroidAMD = 4993, + BaryCoordNoPerspSampleAMD = 4994, + BaryCoordSmoothAMD = 4995, + BaryCoordSmoothCentroidAMD = 4996, + BaryCoordSmoothSampleAMD = 4997, + BaryCoordPullModelAMD = 4998, + FragStencilRefEXT = 5014, + ViewportMaskNV = 5253, + SecondaryPositionNV = 5257, + SecondaryViewportMaskNV = 5258, + PositionPerViewNV = 5261, + ViewportMaskPerViewNV = 5262, + FullyCoveredEXT = 5264, + TaskCountNV = 5274, + PrimitiveCountNV = 5275, + PrimitiveIndicesNV = 5276, + ClipDistancePerViewNV = 5277, + CullDistancePerViewNV = 5278, + LayerPerViewNV = 5279, + MeshViewCountNV = 5280, + MeshViewIndicesNV = 5281, + BaryCoordNV = 5286, + BaryCoordNoPerspNV = 5287, + FragSizeEXT = 5292, + FragmentSizeNV = 5292, + FragInvocationCountEXT = 5293, + InvocationsPerPixelNV = 5293, + LaunchIdNV = 5319, + LaunchSizeNV = 5320, + WorldRayOriginNV = 5321, + WorldRayDirectionNV = 5322, + ObjectRayOriginNV = 5323, + ObjectRayDirectionNV = 5324, + RayTminNV = 5325, + RayTmaxNV = 5326, + InstanceCustomIndexNV = 5327, + ObjectToWorldNV = 5330, + WorldToObjectNV = 5331, + HitTNV = 5332, + HitKindNV = 5333, + IncomingRayFlagsNV = 5351, + } + + public enum SelectionControlShift + { + Flatten = 0, + DontFlatten = 1, + } + + public enum SelectionControlMask + { + MaskNone = 0, + Flatten = 0x00000001, + DontFlatten = 0x00000002, + } + + public enum LoopControlShift + { + Unroll = 0, + DontUnroll = 1, + DependencyInfinite = 2, + DependencyLength = 3, + } + + public enum LoopControlMask + { + MaskNone = 0, + Unroll = 0x00000001, + DontUnroll = 0x00000002, + DependencyInfinite = 0x00000004, + DependencyLength = 0x00000008, + } + + public enum FunctionControlShift + { + Inline = 0, + DontInline = 1, + Pure = 2, + Const = 3, + } + + public enum FunctionControlMask + { + MaskNone = 0, + Inline = 0x00000001, + DontInline = 0x00000002, + Pure = 0x00000004, + Const = 0x00000008, + } + + public enum MemorySemanticsShift + { + Acquire = 1, + Release = 2, + AcquireRelease = 3, + SequentiallyConsistent = 4, + UniformMemory = 6, + SubgroupMemory = 7, + WorkgroupMemory = 8, + CrossWorkgroupMemory = 9, + AtomicCounterMemory = 10, + ImageMemory = 11, + OutputMemoryKHR = 12, + MakeAvailableKHR = 13, + MakeVisibleKHR = 14, + } + + public enum MemorySemanticsMask + { + MaskNone = 0, + Acquire = 0x00000002, + Release = 0x00000004, + AcquireRelease = 0x00000008, + SequentiallyConsistent = 0x00000010, + UniformMemory = 0x00000040, + SubgroupMemory = 0x00000080, + WorkgroupMemory = 0x00000100, + CrossWorkgroupMemory = 0x00000200, + AtomicCounterMemory = 0x00000400, + ImageMemory = 0x00000800, + OutputMemoryKHR = 0x00001000, + MakeAvailableKHR = 0x00002000, + MakeVisibleKHR = 0x00004000, + } + + public enum MemoryAccessShift + { + Volatile = 0, + Aligned = 1, + Nontemporal = 2, + MakePointerAvailableKHR = 3, + MakePointerVisibleKHR = 4, + NonPrivatePointerKHR = 5, + } + + public enum MemoryAccessMask + { + MaskNone = 0, + Volatile = 0x00000001, + Aligned = 0x00000002, + Nontemporal = 0x00000004, + MakePointerAvailableKHR = 0x00000008, + MakePointerVisibleKHR = 0x00000010, + NonPrivatePointerKHR = 0x00000020, + } + + public enum Scope + { + CrossDevice = 0, + Device = 1, + Workgroup = 2, + Subgroup = 3, + Invocation = 4, + QueueFamilyKHR = 5, + } + + public enum GroupOperation + { + Reduce = 0, + InclusiveScan = 1, + ExclusiveScan = 2, + ClusteredReduce = 3, + PartitionedReduceNV = 6, + PartitionedInclusiveScanNV = 7, + PartitionedExclusiveScanNV = 8, + } + + public enum KernelEnqueueFlags + { + NoWait = 0, + WaitKernel = 1, + WaitWorkGroup = 2, + } + + public enum KernelProfilingInfoShift + { + CmdExecTime = 0, + } + + public enum KernelProfilingInfoMask + { + MaskNone = 0, + CmdExecTime = 0x00000001, + } + + public enum Capability + { + Matrix = 0, + Shader = 1, + Geometry = 2, + Tessellation = 3, + Addresses = 4, + Linkage = 5, + Kernel = 6, + Vector16 = 7, + Float16Buffer = 8, + Float16 = 9, + Float64 = 10, + Int64 = 11, + Int64Atomics = 12, + ImageBasic = 13, + ImageReadWrite = 14, + ImageMipmap = 15, + Pipes = 17, + Groups = 18, + DeviceEnqueue = 19, + LiteralSampler = 20, + AtomicStorage = 21, + Int16 = 22, + TessellationPointSize = 23, + GeometryPointSize = 24, + ImageGatherExtended = 25, + StorageImageMultisample = 27, + UniformBufferArrayDynamicIndexing = 28, + SampledImageArrayDynamicIndexing = 29, + StorageBufferArrayDynamicIndexing = 30, + StorageImageArrayDynamicIndexing = 31, + ClipDistance = 32, + CullDistance = 33, + ImageCubeArray = 34, + SampleRateShading = 35, + ImageRect = 36, + SampledRect = 37, + GenericPointer = 38, + Int8 = 39, + InputAttachment = 40, + SparseResidency = 41, + MinLod = 42, + Sampled1D = 43, + Image1D = 44, + SampledCubeArray = 45, + SampledBuffer = 46, + ImageBuffer = 47, + ImageMSArray = 48, + StorageImageExtendedFormats = 49, + ImageQuery = 50, + DerivativeControl = 51, + InterpolationFunction = 52, + TransformFeedback = 53, + GeometryStreams = 54, + StorageImageReadWithoutFormat = 55, + StorageImageWriteWithoutFormat = 56, + MultiViewport = 57, + SubgroupDispatch = 58, + NamedBarrier = 59, + PipeStorage = 60, + GroupNonUniform = 61, + GroupNonUniformVote = 62, + GroupNonUniformArithmetic = 63, + GroupNonUniformBallot = 64, + GroupNonUniformShuffle = 65, + GroupNonUniformShuffleRelative = 66, + GroupNonUniformClustered = 67, + GroupNonUniformQuad = 68, + SubgroupBallotKHR = 4423, + DrawParameters = 4427, + SubgroupVoteKHR = 4431, + StorageBuffer16BitAccess = 4433, + StorageUniformBufferBlock16 = 4433, + StorageUniform16 = 4434, + UniformAndStorageBuffer16BitAccess = 4434, + StoragePushConstant16 = 4435, + StorageInputOutput16 = 4436, + DeviceGroup = 4437, + MultiView = 4439, + VariablePointersStorageBuffer = 4441, + VariablePointers = 4442, + AtomicStorageOps = 4445, + SampleMaskPostDepthCoverage = 4447, + StorageBuffer8BitAccess = 4448, + UniformAndStorageBuffer8BitAccess = 4449, + StoragePushConstant8 = 4450, + DenormPreserve = 4464, + DenormFlushToZero = 4465, + SignedZeroInfNanPreserve = 4466, + RoundingModeRTE = 4467, + RoundingModeRTZ = 4468, + Float16ImageAMD = 5008, + ImageGatherBiasLodAMD = 5009, + FragmentMaskAMD = 5010, + StencilExportEXT = 5013, + ImageReadWriteLodAMD = 5015, + SampleMaskOverrideCoverageNV = 5249, + GeometryShaderPassthroughNV = 5251, + ShaderViewportIndexLayerEXT = 5254, + ShaderViewportIndexLayerNV = 5254, + ShaderViewportMaskNV = 5255, + ShaderStereoViewNV = 5259, + PerViewAttributesNV = 5260, + FragmentFullyCoveredEXT = 5265, + MeshShadingNV = 5266, + ImageFootprintNV = 5282, + FragmentBarycentricNV = 5284, + ComputeDerivativeGroupQuadsNV = 5288, + FragmentDensityEXT = 5291, + ShadingRateNV = 5291, + GroupNonUniformPartitionedNV = 5297, + ShaderNonUniformEXT = 5301, + RuntimeDescriptorArrayEXT = 5302, + InputAttachmentArrayDynamicIndexingEXT = 5303, + UniformTexelBufferArrayDynamicIndexingEXT = 5304, + StorageTexelBufferArrayDynamicIndexingEXT = 5305, + UniformBufferArrayNonUniformIndexingEXT = 5306, + SampledImageArrayNonUniformIndexingEXT = 5307, + StorageBufferArrayNonUniformIndexingEXT = 5308, + StorageImageArrayNonUniformIndexingEXT = 5309, + InputAttachmentArrayNonUniformIndexingEXT = 5310, + UniformTexelBufferArrayNonUniformIndexingEXT = 5311, + StorageTexelBufferArrayNonUniformIndexingEXT = 5312, + RayTracingNV = 5340, + VulkanMemoryModelKHR = 5345, + VulkanMemoryModelDeviceScopeKHR = 5346, + ComputeDerivativeGroupLinearNV = 5350, + SubgroupShuffleINTEL = 5568, + SubgroupBufferBlockIOINTEL = 5569, + SubgroupImageBlockIOINTEL = 5570, + } + + public enum Op + { + OpNop = 0, + OpUndef = 1, + OpSourceContinued = 2, + OpSource = 3, + OpSourceExtension = 4, + OpName = 5, + OpMemberName = 6, + OpString = 7, + OpLine = 8, + OpExtension = 10, + OpExtInstImport = 11, + OpExtInst = 12, + OpMemoryModel = 14, + OpEntryPoint = 15, + OpExecutionMode = 16, + OpCapability = 17, + OpTypeVoid = 19, + OpTypeBool = 20, + OpTypeInt = 21, + OpTypeFloat = 22, + OpTypeVector = 23, + OpTypeMatrix = 24, + OpTypeImage = 25, + OpTypeSampler = 26, + OpTypeSampledImage = 27, + OpTypeArray = 28, + OpTypeRuntimeArray = 29, + OpTypeStruct = 30, + OpTypeOpaque = 31, + OpTypePointer = 32, + OpTypeFunction = 33, + OpTypeEvent = 34, + OpTypeDeviceEvent = 35, + OpTypeReserveId = 36, + OpTypeQueue = 37, + OpTypePipe = 38, + OpTypeForwardPointer = 39, + OpConstantTrue = 41, + OpConstantFalse = 42, + OpConstant = 43, + OpConstantComposite = 44, + OpConstantSampler = 45, + OpConstantNull = 46, + OpSpecConstantTrue = 48, + OpSpecConstantFalse = 49, + OpSpecConstant = 50, + OpSpecConstantComposite = 51, + OpSpecConstantOp = 52, + OpFunction = 54, + OpFunctionParameter = 55, + OpFunctionEnd = 56, + OpFunctionCall = 57, + OpVariable = 59, + OpImageTexelPointer = 60, + OpLoad = 61, + OpStore = 62, + OpCopyMemory = 63, + OpCopyMemorySized = 64, + OpAccessChain = 65, + OpInBoundsAccessChain = 66, + OpPtrAccessChain = 67, + OpArrayLength = 68, + OpGenericPtrMemSemantics = 69, + OpInBoundsPtrAccessChain = 70, + OpDecorate = 71, + OpMemberDecorate = 72, + OpDecorationGroup = 73, + OpGroupDecorate = 74, + OpGroupMemberDecorate = 75, + OpVectorExtractDynamic = 77, + OpVectorInsertDynamic = 78, + OpVectorShuffle = 79, + OpCompositeConstruct = 80, + OpCompositeExtract = 81, + OpCompositeInsert = 82, + OpCopyObject = 83, + OpTranspose = 84, + OpSampledImage = 86, + OpImageSampleImplicitLod = 87, + OpImageSampleExplicitLod = 88, + OpImageSampleDrefImplicitLod = 89, + OpImageSampleDrefExplicitLod = 90, + OpImageSampleProjImplicitLod = 91, + OpImageSampleProjExplicitLod = 92, + OpImageSampleProjDrefImplicitLod = 93, + OpImageSampleProjDrefExplicitLod = 94, + OpImageFetch = 95, + OpImageGather = 96, + OpImageDrefGather = 97, + OpImageRead = 98, + OpImageWrite = 99, + OpImage = 100, + OpImageQueryFormat = 101, + OpImageQueryOrder = 102, + OpImageQuerySizeLod = 103, + OpImageQuerySize = 104, + OpImageQueryLod = 105, + OpImageQueryLevels = 106, + OpImageQuerySamples = 107, + OpConvertFToU = 109, + OpConvertFToS = 110, + OpConvertSToF = 111, + OpConvertUToF = 112, + OpUConvert = 113, + OpSConvert = 114, + OpFConvert = 115, + OpQuantizeToF16 = 116, + OpConvertPtrToU = 117, + OpSatConvertSToU = 118, + OpSatConvertUToS = 119, + OpConvertUToPtr = 120, + OpPtrCastToGeneric = 121, + OpGenericCastToPtr = 122, + OpGenericCastToPtrExplicit = 123, + OpBitcast = 124, + OpSNegate = 126, + OpFNegate = 127, + OpIAdd = 128, + OpFAdd = 129, + OpISub = 130, + OpFSub = 131, + OpIMul = 132, + OpFMul = 133, + OpUDiv = 134, + OpSDiv = 135, + OpFDiv = 136, + OpUMod = 137, + OpSRem = 138, + OpSMod = 139, + OpFRem = 140, + OpFMod = 141, + OpVectorTimesScalar = 142, + OpMatrixTimesScalar = 143, + OpVectorTimesMatrix = 144, + OpMatrixTimesVector = 145, + OpMatrixTimesMatrix = 146, + OpOuterProduct = 147, + OpDot = 148, + OpIAddCarry = 149, + OpISubBorrow = 150, + OpUMulExtended = 151, + OpSMulExtended = 152, + OpAny = 154, + OpAll = 155, + OpIsNan = 156, + OpIsInf = 157, + OpIsFinite = 158, + OpIsNormal = 159, + OpSignBitSet = 160, + OpLessOrGreater = 161, + OpOrdered = 162, + OpUnordered = 163, + OpLogicalEqual = 164, + OpLogicalNotEqual = 165, + OpLogicalOr = 166, + OpLogicalAnd = 167, + OpLogicalNot = 168, + OpSelect = 169, + OpIEqual = 170, + OpINotEqual = 171, + OpUGreaterThan = 172, + OpSGreaterThan = 173, + OpUGreaterThanEqual = 174, + OpSGreaterThanEqual = 175, + OpULessThan = 176, + OpSLessThan = 177, + OpULessThanEqual = 178, + OpSLessThanEqual = 179, + OpFOrdEqual = 180, + OpFUnordEqual = 181, + OpFOrdNotEqual = 182, + OpFUnordNotEqual = 183, + OpFOrdLessThan = 184, + OpFUnordLessThan = 185, + OpFOrdGreaterThan = 186, + OpFUnordGreaterThan = 187, + OpFOrdLessThanEqual = 188, + OpFUnordLessThanEqual = 189, + OpFOrdGreaterThanEqual = 190, + OpFUnordGreaterThanEqual = 191, + OpShiftRightLogical = 194, + OpShiftRightArithmetic = 195, + OpShiftLeftLogical = 196, + OpBitwiseOr = 197, + OpBitwiseXor = 198, + OpBitwiseAnd = 199, + OpNot = 200, + OpBitFieldInsert = 201, + OpBitFieldSExtract = 202, + OpBitFieldUExtract = 203, + OpBitReverse = 204, + OpBitCount = 205, + OpDPdx = 207, + OpDPdy = 208, + OpFwidth = 209, + OpDPdxFine = 210, + OpDPdyFine = 211, + OpFwidthFine = 212, + OpDPdxCoarse = 213, + OpDPdyCoarse = 214, + OpFwidthCoarse = 215, + OpEmitVertex = 218, + OpEndPrimitive = 219, + OpEmitStreamVertex = 220, + OpEndStreamPrimitive = 221, + OpControlBarrier = 224, + OpMemoryBarrier = 225, + OpAtomicLoad = 227, + OpAtomicStore = 228, + OpAtomicExchange = 229, + OpAtomicCompareExchange = 230, + OpAtomicCompareExchangeWeak = 231, + OpAtomicIIncrement = 232, + OpAtomicIDecrement = 233, + OpAtomicIAdd = 234, + OpAtomicISub = 235, + OpAtomicSMin = 236, + OpAtomicUMin = 237, + OpAtomicSMax = 238, + OpAtomicUMax = 239, + OpAtomicAnd = 240, + OpAtomicOr = 241, + OpAtomicXor = 242, + OpPhi = 245, + OpLoopMerge = 246, + OpSelectionMerge = 247, + OpLabel = 248, + OpBranch = 249, + OpBranchConditional = 250, + OpSwitch = 251, + OpKill = 252, + OpReturn = 253, + OpReturnValue = 254, + OpUnreachable = 255, + OpLifetimeStart = 256, + OpLifetimeStop = 257, + OpGroupAsyncCopy = 259, + OpGroupWaitEvents = 260, + OpGroupAll = 261, + OpGroupAny = 262, + OpGroupBroadcast = 263, + OpGroupIAdd = 264, + OpGroupFAdd = 265, + OpGroupFMin = 266, + OpGroupUMin = 267, + OpGroupSMin = 268, + OpGroupFMax = 269, + OpGroupUMax = 270, + OpGroupSMax = 271, + OpReadPipe = 274, + OpWritePipe = 275, + OpReservedReadPipe = 276, + OpReservedWritePipe = 277, + OpReserveReadPipePackets = 278, + OpReserveWritePipePackets = 279, + OpCommitReadPipe = 280, + OpCommitWritePipe = 281, + OpIsValidReserveId = 282, + OpGetNumPipePackets = 283, + OpGetMaxPipePackets = 284, + OpGroupReserveReadPipePackets = 285, + OpGroupReserveWritePipePackets = 286, + OpGroupCommitReadPipe = 287, + OpGroupCommitWritePipe = 288, + OpEnqueueMarker = 291, + OpEnqueueKernel = 292, + OpGetKernelNDrangeSubGroupCount = 293, + OpGetKernelNDrangeMaxSubGroupSize = 294, + OpGetKernelWorkGroupSize = 295, + OpGetKernelPreferredWorkGroupSizeMultiple = 296, + OpRetainEvent = 297, + OpReleaseEvent = 298, + OpCreateUserEvent = 299, + OpIsValidEvent = 300, + OpSetUserEventStatus = 301, + OpCaptureEventProfilingInfo = 302, + OpGetDefaultQueue = 303, + OpBuildNDRange = 304, + OpImageSparseSampleImplicitLod = 305, + OpImageSparseSampleExplicitLod = 306, + OpImageSparseSampleDrefImplicitLod = 307, + OpImageSparseSampleDrefExplicitLod = 308, + OpImageSparseSampleProjImplicitLod = 309, + OpImageSparseSampleProjExplicitLod = 310, + OpImageSparseSampleProjDrefImplicitLod = 311, + OpImageSparseSampleProjDrefExplicitLod = 312, + OpImageSparseFetch = 313, + OpImageSparseGather = 314, + OpImageSparseDrefGather = 315, + OpImageSparseTexelsResident = 316, + OpNoLine = 317, + OpAtomicFlagTestAndSet = 318, + OpAtomicFlagClear = 319, + OpImageSparseRead = 320, + OpSizeOf = 321, + OpTypePipeStorage = 322, + OpConstantPipeStorage = 323, + OpCreatePipeFromPipeStorage = 324, + OpGetKernelLocalSizeForSubgroupCount = 325, + OpGetKernelMaxNumSubgroups = 326, + OpTypeNamedBarrier = 327, + OpNamedBarrierInitialize = 328, + OpMemoryNamedBarrier = 329, + OpModuleProcessed = 330, + OpExecutionModeId = 331, + OpDecorateId = 332, + OpGroupNonUniformElect = 333, + OpGroupNonUniformAll = 334, + OpGroupNonUniformAny = 335, + OpGroupNonUniformAllEqual = 336, + OpGroupNonUniformBroadcast = 337, + OpGroupNonUniformBroadcastFirst = 338, + OpGroupNonUniformBallot = 339, + OpGroupNonUniformInverseBallot = 340, + OpGroupNonUniformBallotBitExtract = 341, + OpGroupNonUniformBallotBitCount = 342, + OpGroupNonUniformBallotFindLSB = 343, + OpGroupNonUniformBallotFindMSB = 344, + OpGroupNonUniformShuffle = 345, + OpGroupNonUniformShuffleXor = 346, + OpGroupNonUniformShuffleUp = 347, + OpGroupNonUniformShuffleDown = 348, + OpGroupNonUniformIAdd = 349, + OpGroupNonUniformFAdd = 350, + OpGroupNonUniformIMul = 351, + OpGroupNonUniformFMul = 352, + OpGroupNonUniformSMin = 353, + OpGroupNonUniformUMin = 354, + OpGroupNonUniformFMin = 355, + OpGroupNonUniformSMax = 356, + OpGroupNonUniformUMax = 357, + OpGroupNonUniformFMax = 358, + OpGroupNonUniformBitwiseAnd = 359, + OpGroupNonUniformBitwiseOr = 360, + OpGroupNonUniformBitwiseXor = 361, + OpGroupNonUniformLogicalAnd = 362, + OpGroupNonUniformLogicalOr = 363, + OpGroupNonUniformLogicalXor = 364, + OpGroupNonUniformQuadBroadcast = 365, + OpGroupNonUniformQuadSwap = 366, + OpSubgroupBallotKHR = 4421, + OpSubgroupFirstInvocationKHR = 4422, + OpSubgroupAllKHR = 4428, + OpSubgroupAnyKHR = 4429, + OpSubgroupAllEqualKHR = 4430, + OpSubgroupReadInvocationKHR = 4432, + OpGroupIAddNonUniformAMD = 5000, + OpGroupFAddNonUniformAMD = 5001, + OpGroupFMinNonUniformAMD = 5002, + OpGroupUMinNonUniformAMD = 5003, + OpGroupSMinNonUniformAMD = 5004, + OpGroupFMaxNonUniformAMD = 5005, + OpGroupUMaxNonUniformAMD = 5006, + OpGroupSMaxNonUniformAMD = 5007, + OpFragmentMaskFetchAMD = 5011, + OpFragmentFetchAMD = 5012, + OpImageSampleFootprintNV = 5283, + OpGroupNonUniformPartitionNV = 5296, + OpWritePackedPrimitiveIndices4x8NV = 5299, + OpReportIntersectionNV = 5334, + OpIgnoreIntersectionNV = 5335, + OpTerminateRayNV = 5336, + OpTraceNV = 5337, + OpTypeAccelerationStructureNV = 5341, + OpExecuteCallableNV = 5344, + OpSubgroupShuffleINTEL = 5571, + OpSubgroupShuffleDownINTEL = 5572, + OpSubgroupShuffleUpINTEL = 5573, + OpSubgroupShuffleXorINTEL = 5574, + OpSubgroupBlockReadINTEL = 5575, + OpSubgroupBlockWriteINTEL = 5576, + OpSubgroupImageBlockReadINTEL = 5577, + OpSubgroupImageBlockWriteINTEL = 5578, + OpDecorateStringGOOGLE = 5632, + OpMemberDecorateStringGOOGLE = 5633, + } + } +} + diff --git a/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/unified1/spirv.h b/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/unified1/spirv.h index 4c90c936c..d996f09fc 100644 --- a/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/unified1/spirv.h +++ b/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/unified1/spirv.h @@ -1,5 +1,5 @@ /* -** Copyright (c) 2014-2018 The Khronos Group Inc. +** Copyright (c) 2014-2019 The Khronos Group Inc. ** ** Permission is hereby granted, free of charge, to any person obtaining a copy ** of this software and/or associated documentation files (the "Materials"), @@ -31,13 +31,16 @@ /* ** Enumeration tokens for SPIR-V, in various styles: -** C, C++, C++11, JSON, Lua, Python +** C, C++, C++11, JSON, Lua, Python, C#, D ** ** - C will have tokens with a "Spv" prefix, e.g.: SpvSourceLanguageGLSL ** - C++ will have tokens in the "spv" name space, e.g.: spv::SourceLanguageGLSL ** - C++11 will use enum classes in the spv namespace, e.g.: spv::SourceLanguage::GLSL ** - Lua will use tables, e.g.: spv.SourceLanguage.GLSL ** - Python will use dictionaries, e.g.: spv['SourceLanguage']['GLSL'] +** - C# will use enum classes in the Specification class located in the "Spv" namespace, +** e.g.: Spv.Specification.SourceLanguage.GLSL +** - D will have tokens under the "spv" module, e.g: spv.SourceLanguage.GLSL ** ** Some tokens act like mask values, which can be OR'd together, ** while others are mutually exclusive. The mask-like ones have @@ -51,11 +54,11 @@ typedef unsigned int SpvId; #define SPV_VERSION 0x10300 -#define SPV_REVISION 1 +#define SPV_REVISION 6 static const unsigned int SpvMagicNumber = 0x07230203; static const unsigned int SpvVersion = 0x00010300; -static const unsigned int SpvRevision = 1; +static const unsigned int SpvRevision = 6; static const unsigned int SpvOpCodeMask = 0xffff; static const unsigned int SpvWordCountShift = 16; @@ -77,6 +80,14 @@ typedef enum SpvExecutionModel_ { SpvExecutionModelFragment = 4, SpvExecutionModelGLCompute = 5, SpvExecutionModelKernel = 6, + SpvExecutionModelTaskNV = 5267, + SpvExecutionModelMeshNV = 5268, + SpvExecutionModelRayGenerationNV = 5313, + SpvExecutionModelIntersectionNV = 5314, + SpvExecutionModelAnyHitNV = 5315, + SpvExecutionModelClosestHitNV = 5316, + SpvExecutionModelMissNV = 5317, + SpvExecutionModelCallableNV = 5318, SpvExecutionModelMax = 0x7fffffff, } SpvExecutionModel; @@ -91,6 +102,7 @@ typedef enum SpvMemoryModel_ { SpvMemoryModelSimple = 0, SpvMemoryModelGLSL450 = 1, SpvMemoryModelOpenCL = 2, + SpvMemoryModelVulkanKHR = 3, SpvMemoryModelMax = 0x7fffffff, } SpvMemoryModel; @@ -134,7 +146,17 @@ typedef enum SpvExecutionMode_ { SpvExecutionModeLocalSizeId = 38, SpvExecutionModeLocalSizeHintId = 39, SpvExecutionModePostDepthCoverage = 4446, + SpvExecutionModeDenormPreserve = 4459, + SpvExecutionModeDenormFlushToZero = 4460, + SpvExecutionModeSignedZeroInfNanPreserve = 4461, + SpvExecutionModeRoundingModeRTE = 4462, + SpvExecutionModeRoundingModeRTZ = 4463, SpvExecutionModeStencilRefReplacingEXT = 5027, + SpvExecutionModeOutputLinesNV = 5269, + SpvExecutionModeOutputPrimitivesNV = 5270, + SpvExecutionModeDerivativeGroupQuadsNV = 5289, + SpvExecutionModeDerivativeGroupLinearNV = 5290, + SpvExecutionModeOutputTrianglesNV = 5298, SpvExecutionModeMax = 0x7fffffff, } SpvExecutionMode; @@ -152,6 +174,12 @@ typedef enum SpvStorageClass_ { SpvStorageClassAtomicCounter = 10, SpvStorageClassImage = 11, SpvStorageClassStorageBuffer = 12, + SpvStorageClassCallableDataNV = 5328, + SpvStorageClassIncomingCallableDataNV = 5329, + SpvStorageClassRayPayloadNV = 5338, + SpvStorageClassHitAttributeNV = 5339, + SpvStorageClassIncomingRayPayloadNV = 5342, + SpvStorageClassShaderRecordBufferNV = 5343, SpvStorageClassMax = 0x7fffffff, } SpvStorageClass; @@ -279,6 +307,10 @@ typedef enum SpvImageOperandsShift_ { SpvImageOperandsConstOffsetsShift = 5, SpvImageOperandsSampleShift = 6, SpvImageOperandsMinLodShift = 7, + SpvImageOperandsMakeTexelAvailableKHRShift = 8, + SpvImageOperandsMakeTexelVisibleKHRShift = 9, + SpvImageOperandsNonPrivateTexelKHRShift = 10, + SpvImageOperandsVolatileTexelKHRShift = 11, SpvImageOperandsMax = 0x7fffffff, } SpvImageOperandsShift; @@ -292,6 +324,10 @@ typedef enum SpvImageOperandsMask_ { SpvImageOperandsConstOffsetsMask = 0x00000020, SpvImageOperandsSampleMask = 0x00000040, SpvImageOperandsMinLodMask = 0x00000080, + SpvImageOperandsMakeTexelAvailableKHRMask = 0x00000100, + SpvImageOperandsMakeTexelVisibleKHRMask = 0x00000200, + SpvImageOperandsNonPrivateTexelKHRMask = 0x00000400, + SpvImageOperandsVolatileTexelKHRMask = 0x00000800, } SpvImageOperandsMask; typedef enum SpvFPFastMathModeShift_ { @@ -392,11 +428,17 @@ typedef enum SpvDecoration_ { SpvDecorationMaxByteOffset = 45, SpvDecorationAlignmentId = 46, SpvDecorationMaxByteOffsetId = 47, + SpvDecorationNoSignedWrap = 4469, + SpvDecorationNoUnsignedWrap = 4470, SpvDecorationExplicitInterpAMD = 4999, SpvDecorationOverrideCoverageNV = 5248, SpvDecorationPassthroughNV = 5250, SpvDecorationViewportRelativeNV = 5252, SpvDecorationSecondaryViewportRelativeNV = 5256, + SpvDecorationPerPrimitiveNV = 5271, + SpvDecorationPerViewNV = 5272, + SpvDecorationPerTaskNV = 5273, + SpvDecorationPerVertexNV = 5285, SpvDecorationNonUniformEXT = 5300, SpvDecorationHlslCounterBufferGOOGLE = 5634, SpvDecorationHlslSemanticGOOGLE = 5635, @@ -474,6 +516,34 @@ typedef enum SpvBuiltIn_ { SpvBuiltInPositionPerViewNV = 5261, SpvBuiltInViewportMaskPerViewNV = 5262, SpvBuiltInFullyCoveredEXT = 5264, + SpvBuiltInTaskCountNV = 5274, + SpvBuiltInPrimitiveCountNV = 5275, + SpvBuiltInPrimitiveIndicesNV = 5276, + SpvBuiltInClipDistancePerViewNV = 5277, + SpvBuiltInCullDistancePerViewNV = 5278, + SpvBuiltInLayerPerViewNV = 5279, + SpvBuiltInMeshViewCountNV = 5280, + SpvBuiltInMeshViewIndicesNV = 5281, + SpvBuiltInBaryCoordNV = 5286, + SpvBuiltInBaryCoordNoPerspNV = 5287, + SpvBuiltInFragSizeEXT = 5292, + SpvBuiltInFragmentSizeNV = 5292, + SpvBuiltInFragInvocationCountEXT = 5293, + SpvBuiltInInvocationsPerPixelNV = 5293, + SpvBuiltInLaunchIdNV = 5319, + SpvBuiltInLaunchSizeNV = 5320, + SpvBuiltInWorldRayOriginNV = 5321, + SpvBuiltInWorldRayDirectionNV = 5322, + SpvBuiltInObjectRayOriginNV = 5323, + SpvBuiltInObjectRayDirectionNV = 5324, + SpvBuiltInRayTminNV = 5325, + SpvBuiltInRayTmaxNV = 5326, + SpvBuiltInInstanceCustomIndexNV = 5327, + SpvBuiltInObjectToWorldNV = 5330, + SpvBuiltInWorldToObjectNV = 5331, + SpvBuiltInHitTNV = 5332, + SpvBuiltInHitKindNV = 5333, + SpvBuiltInIncomingRayFlagsNV = 5351, SpvBuiltInMax = 0x7fffffff, } SpvBuiltIn; @@ -532,6 +602,9 @@ typedef enum SpvMemorySemanticsShift_ { SpvMemorySemanticsCrossWorkgroupMemoryShift = 9, SpvMemorySemanticsAtomicCounterMemoryShift = 10, SpvMemorySemanticsImageMemoryShift = 11, + SpvMemorySemanticsOutputMemoryKHRShift = 12, + SpvMemorySemanticsMakeAvailableKHRShift = 13, + SpvMemorySemanticsMakeVisibleKHRShift = 14, SpvMemorySemanticsMax = 0x7fffffff, } SpvMemorySemanticsShift; @@ -547,12 +620,18 @@ typedef enum SpvMemorySemanticsMask_ { SpvMemorySemanticsCrossWorkgroupMemoryMask = 0x00000200, SpvMemorySemanticsAtomicCounterMemoryMask = 0x00000400, SpvMemorySemanticsImageMemoryMask = 0x00000800, + SpvMemorySemanticsOutputMemoryKHRMask = 0x00001000, + SpvMemorySemanticsMakeAvailableKHRMask = 0x00002000, + SpvMemorySemanticsMakeVisibleKHRMask = 0x00004000, } SpvMemorySemanticsMask; typedef enum SpvMemoryAccessShift_ { SpvMemoryAccessVolatileShift = 0, SpvMemoryAccessAlignedShift = 1, SpvMemoryAccessNontemporalShift = 2, + SpvMemoryAccessMakePointerAvailableKHRShift = 3, + SpvMemoryAccessMakePointerVisibleKHRShift = 4, + SpvMemoryAccessNonPrivatePointerKHRShift = 5, SpvMemoryAccessMax = 0x7fffffff, } SpvMemoryAccessShift; @@ -561,6 +640,9 @@ typedef enum SpvMemoryAccessMask_ { SpvMemoryAccessVolatileMask = 0x00000001, SpvMemoryAccessAlignedMask = 0x00000002, SpvMemoryAccessNontemporalMask = 0x00000004, + SpvMemoryAccessMakePointerAvailableKHRMask = 0x00000008, + SpvMemoryAccessMakePointerVisibleKHRMask = 0x00000010, + SpvMemoryAccessNonPrivatePointerKHRMask = 0x00000020, } SpvMemoryAccessMask; typedef enum SpvScope_ { @@ -569,6 +651,7 @@ typedef enum SpvScope_ { SpvScopeWorkgroup = 2, SpvScopeSubgroup = 3, SpvScopeInvocation = 4, + SpvScopeQueueFamilyKHR = 5, SpvScopeMax = 0x7fffffff, } SpvScope; @@ -686,6 +769,11 @@ typedef enum SpvCapability_ { SpvCapabilityStorageBuffer8BitAccess = 4448, SpvCapabilityUniformAndStorageBuffer8BitAccess = 4449, SpvCapabilityStoragePushConstant8 = 4450, + SpvCapabilityDenormPreserve = 4464, + SpvCapabilityDenormFlushToZero = 4465, + SpvCapabilitySignedZeroInfNanPreserve = 4466, + SpvCapabilityRoundingModeRTE = 4467, + SpvCapabilityRoundingModeRTZ = 4468, SpvCapabilityFloat16ImageAMD = 5008, SpvCapabilityImageGatherBiasLodAMD = 5009, SpvCapabilityFragmentMaskAMD = 5010, @@ -699,6 +787,12 @@ typedef enum SpvCapability_ { SpvCapabilityShaderStereoViewNV = 5259, SpvCapabilityPerViewAttributesNV = 5260, SpvCapabilityFragmentFullyCoveredEXT = 5265, + SpvCapabilityMeshShadingNV = 5266, + SpvCapabilityImageFootprintNV = 5282, + SpvCapabilityFragmentBarycentricNV = 5284, + SpvCapabilityComputeDerivativeGroupQuadsNV = 5288, + SpvCapabilityFragmentDensityEXT = 5291, + SpvCapabilityShadingRateNV = 5291, SpvCapabilityGroupNonUniformPartitionedNV = 5297, SpvCapabilityShaderNonUniformEXT = 5301, SpvCapabilityRuntimeDescriptorArrayEXT = 5302, @@ -712,6 +806,10 @@ typedef enum SpvCapability_ { SpvCapabilityInputAttachmentArrayNonUniformIndexingEXT = 5310, SpvCapabilityUniformTexelBufferArrayNonUniformIndexingEXT = 5311, SpvCapabilityStorageTexelBufferArrayNonUniformIndexingEXT = 5312, + SpvCapabilityRayTracingNV = 5340, + SpvCapabilityVulkanMemoryModelKHR = 5345, + SpvCapabilityVulkanMemoryModelDeviceScopeKHR = 5346, + SpvCapabilityComputeDerivativeGroupLinearNV = 5350, SpvCapabilitySubgroupShuffleINTEL = 5568, SpvCapabilitySubgroupBufferBlockIOINTEL = 5569, SpvCapabilitySubgroupImageBlockIOINTEL = 5570, @@ -1075,7 +1173,15 @@ typedef enum SpvOp_ { SpvOpGroupSMaxNonUniformAMD = 5007, SpvOpFragmentMaskFetchAMD = 5011, SpvOpFragmentFetchAMD = 5012, + SpvOpImageSampleFootprintNV = 5283, SpvOpGroupNonUniformPartitionNV = 5296, + SpvOpWritePackedPrimitiveIndices4x8NV = 5299, + SpvOpReportIntersectionNV = 5334, + SpvOpIgnoreIntersectionNV = 5335, + SpvOpTerminateRayNV = 5336, + SpvOpTraceNV = 5337, + SpvOpTypeAccelerationStructureNV = 5341, + SpvOpExecuteCallableNV = 5344, SpvOpSubgroupShuffleINTEL = 5571, SpvOpSubgroupShuffleDownINTEL = 5572, SpvOpSubgroupShuffleUpINTEL = 5573, diff --git a/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/unified1/spirv.hpp b/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/unified1/spirv.hpp index f16c2963e..9100356ab 100644 --- a/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/unified1/spirv.hpp +++ b/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/unified1/spirv.hpp @@ -1,4 +1,4 @@ -// Copyright (c) 2014-2018 The Khronos Group Inc. +// Copyright (c) 2014-2019 The Khronos Group Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and/or associated documentation files (the "Materials"), @@ -26,13 +26,16 @@ // the Binary Section of the SPIR-V specification. // Enumeration tokens for SPIR-V, in various styles: -// C, C++, C++11, JSON, Lua, Python +// C, C++, C++11, JSON, Lua, Python, C#, D // // - C will have tokens with a "Spv" prefix, e.g.: SpvSourceLanguageGLSL // - C++ will have tokens in the "spv" name space, e.g.: spv::SourceLanguageGLSL // - C++11 will use enum classes in the spv namespace, e.g.: spv::SourceLanguage::GLSL // - Lua will use tables, e.g.: spv.SourceLanguage.GLSL // - Python will use dictionaries, e.g.: spv['SourceLanguage']['GLSL'] +// - C# will use enum classes in the Specification class located in the "Spv" namespace, +// e.g.: Spv.Specification.SourceLanguage.GLSL +// - D will have tokens under the "spv" module, e.g: spv.SourceLanguage.GLSL // // Some tokens act like mask values, which can be OR'd together, // while others are mutually exclusive. The mask-like ones have @@ -47,11 +50,11 @@ namespace spv { typedef unsigned int Id; #define SPV_VERSION 0x10300 -#define SPV_REVISION 1 +#define SPV_REVISION 6 static const unsigned int MagicNumber = 0x07230203; static const unsigned int Version = 0x00010300; -static const unsigned int Revision = 1; +static const unsigned int Revision = 6; static const unsigned int OpCodeMask = 0xffff; static const unsigned int WordCountShift = 16; @@ -73,6 +76,14 @@ enum ExecutionModel { ExecutionModelFragment = 4, ExecutionModelGLCompute = 5, ExecutionModelKernel = 6, + ExecutionModelTaskNV = 5267, + ExecutionModelMeshNV = 5268, + ExecutionModelRayGenerationNV = 5313, + ExecutionModelIntersectionNV = 5314, + ExecutionModelAnyHitNV = 5315, + ExecutionModelClosestHitNV = 5316, + ExecutionModelMissNV = 5317, + ExecutionModelCallableNV = 5318, ExecutionModelMax = 0x7fffffff, }; @@ -87,6 +98,7 @@ enum MemoryModel { MemoryModelSimple = 0, MemoryModelGLSL450 = 1, MemoryModelOpenCL = 2, + MemoryModelVulkanKHR = 3, MemoryModelMax = 0x7fffffff, }; @@ -130,7 +142,17 @@ enum ExecutionMode { ExecutionModeLocalSizeId = 38, ExecutionModeLocalSizeHintId = 39, ExecutionModePostDepthCoverage = 4446, + ExecutionModeDenormPreserve = 4459, + ExecutionModeDenormFlushToZero = 4460, + ExecutionModeSignedZeroInfNanPreserve = 4461, + ExecutionModeRoundingModeRTE = 4462, + ExecutionModeRoundingModeRTZ = 4463, ExecutionModeStencilRefReplacingEXT = 5027, + ExecutionModeOutputLinesNV = 5269, + ExecutionModeOutputPrimitivesNV = 5270, + ExecutionModeDerivativeGroupQuadsNV = 5289, + ExecutionModeDerivativeGroupLinearNV = 5290, + ExecutionModeOutputTrianglesNV = 5298, ExecutionModeMax = 0x7fffffff, }; @@ -148,6 +170,12 @@ enum StorageClass { StorageClassAtomicCounter = 10, StorageClassImage = 11, StorageClassStorageBuffer = 12, + StorageClassCallableDataNV = 5328, + StorageClassIncomingCallableDataNV = 5329, + StorageClassRayPayloadNV = 5338, + StorageClassHitAttributeNV = 5339, + StorageClassIncomingRayPayloadNV = 5342, + StorageClassShaderRecordBufferNV = 5343, StorageClassMax = 0x7fffffff, }; @@ -275,6 +303,10 @@ enum ImageOperandsShift { ImageOperandsConstOffsetsShift = 5, ImageOperandsSampleShift = 6, ImageOperandsMinLodShift = 7, + ImageOperandsMakeTexelAvailableKHRShift = 8, + ImageOperandsMakeTexelVisibleKHRShift = 9, + ImageOperandsNonPrivateTexelKHRShift = 10, + ImageOperandsVolatileTexelKHRShift = 11, ImageOperandsMax = 0x7fffffff, }; @@ -288,6 +320,10 @@ enum ImageOperandsMask { ImageOperandsConstOffsetsMask = 0x00000020, ImageOperandsSampleMask = 0x00000040, ImageOperandsMinLodMask = 0x00000080, + ImageOperandsMakeTexelAvailableKHRMask = 0x00000100, + ImageOperandsMakeTexelVisibleKHRMask = 0x00000200, + ImageOperandsNonPrivateTexelKHRMask = 0x00000400, + ImageOperandsVolatileTexelKHRMask = 0x00000800, }; enum FPFastMathModeShift { @@ -388,11 +424,17 @@ enum Decoration { DecorationMaxByteOffset = 45, DecorationAlignmentId = 46, DecorationMaxByteOffsetId = 47, + DecorationNoSignedWrap = 4469, + DecorationNoUnsignedWrap = 4470, DecorationExplicitInterpAMD = 4999, DecorationOverrideCoverageNV = 5248, DecorationPassthroughNV = 5250, DecorationViewportRelativeNV = 5252, DecorationSecondaryViewportRelativeNV = 5256, + DecorationPerPrimitiveNV = 5271, + DecorationPerViewNV = 5272, + DecorationPerTaskNV = 5273, + DecorationPerVertexNV = 5285, DecorationNonUniformEXT = 5300, DecorationHlslCounterBufferGOOGLE = 5634, DecorationHlslSemanticGOOGLE = 5635, @@ -470,6 +512,34 @@ enum BuiltIn { BuiltInPositionPerViewNV = 5261, BuiltInViewportMaskPerViewNV = 5262, BuiltInFullyCoveredEXT = 5264, + BuiltInTaskCountNV = 5274, + BuiltInPrimitiveCountNV = 5275, + BuiltInPrimitiveIndicesNV = 5276, + BuiltInClipDistancePerViewNV = 5277, + BuiltInCullDistancePerViewNV = 5278, + BuiltInLayerPerViewNV = 5279, + BuiltInMeshViewCountNV = 5280, + BuiltInMeshViewIndicesNV = 5281, + BuiltInBaryCoordNV = 5286, + BuiltInBaryCoordNoPerspNV = 5287, + BuiltInFragSizeEXT = 5292, + BuiltInFragmentSizeNV = 5292, + BuiltInFragInvocationCountEXT = 5293, + BuiltInInvocationsPerPixelNV = 5293, + BuiltInLaunchIdNV = 5319, + BuiltInLaunchSizeNV = 5320, + BuiltInWorldRayOriginNV = 5321, + BuiltInWorldRayDirectionNV = 5322, + BuiltInObjectRayOriginNV = 5323, + BuiltInObjectRayDirectionNV = 5324, + BuiltInRayTminNV = 5325, + BuiltInRayTmaxNV = 5326, + BuiltInInstanceCustomIndexNV = 5327, + BuiltInObjectToWorldNV = 5330, + BuiltInWorldToObjectNV = 5331, + BuiltInHitTNV = 5332, + BuiltInHitKindNV = 5333, + BuiltInIncomingRayFlagsNV = 5351, BuiltInMax = 0x7fffffff, }; @@ -528,6 +598,9 @@ enum MemorySemanticsShift { MemorySemanticsCrossWorkgroupMemoryShift = 9, MemorySemanticsAtomicCounterMemoryShift = 10, MemorySemanticsImageMemoryShift = 11, + MemorySemanticsOutputMemoryKHRShift = 12, + MemorySemanticsMakeAvailableKHRShift = 13, + MemorySemanticsMakeVisibleKHRShift = 14, MemorySemanticsMax = 0x7fffffff, }; @@ -543,12 +616,18 @@ enum MemorySemanticsMask { MemorySemanticsCrossWorkgroupMemoryMask = 0x00000200, MemorySemanticsAtomicCounterMemoryMask = 0x00000400, MemorySemanticsImageMemoryMask = 0x00000800, + MemorySemanticsOutputMemoryKHRMask = 0x00001000, + MemorySemanticsMakeAvailableKHRMask = 0x00002000, + MemorySemanticsMakeVisibleKHRMask = 0x00004000, }; enum MemoryAccessShift { MemoryAccessVolatileShift = 0, MemoryAccessAlignedShift = 1, MemoryAccessNontemporalShift = 2, + MemoryAccessMakePointerAvailableKHRShift = 3, + MemoryAccessMakePointerVisibleKHRShift = 4, + MemoryAccessNonPrivatePointerKHRShift = 5, MemoryAccessMax = 0x7fffffff, }; @@ -557,6 +636,9 @@ enum MemoryAccessMask { MemoryAccessVolatileMask = 0x00000001, MemoryAccessAlignedMask = 0x00000002, MemoryAccessNontemporalMask = 0x00000004, + MemoryAccessMakePointerAvailableKHRMask = 0x00000008, + MemoryAccessMakePointerVisibleKHRMask = 0x00000010, + MemoryAccessNonPrivatePointerKHRMask = 0x00000020, }; enum Scope { @@ -565,6 +647,7 @@ enum Scope { ScopeWorkgroup = 2, ScopeSubgroup = 3, ScopeInvocation = 4, + ScopeQueueFamilyKHR = 5, ScopeMax = 0x7fffffff, }; @@ -682,6 +765,11 @@ enum Capability { CapabilityStorageBuffer8BitAccess = 4448, CapabilityUniformAndStorageBuffer8BitAccess = 4449, CapabilityStoragePushConstant8 = 4450, + CapabilityDenormPreserve = 4464, + CapabilityDenormFlushToZero = 4465, + CapabilitySignedZeroInfNanPreserve = 4466, + CapabilityRoundingModeRTE = 4467, + CapabilityRoundingModeRTZ = 4468, CapabilityFloat16ImageAMD = 5008, CapabilityImageGatherBiasLodAMD = 5009, CapabilityFragmentMaskAMD = 5010, @@ -695,6 +783,12 @@ enum Capability { CapabilityShaderStereoViewNV = 5259, CapabilityPerViewAttributesNV = 5260, CapabilityFragmentFullyCoveredEXT = 5265, + CapabilityMeshShadingNV = 5266, + CapabilityImageFootprintNV = 5282, + CapabilityFragmentBarycentricNV = 5284, + CapabilityComputeDerivativeGroupQuadsNV = 5288, + CapabilityFragmentDensityEXT = 5291, + CapabilityShadingRateNV = 5291, CapabilityGroupNonUniformPartitionedNV = 5297, CapabilityShaderNonUniformEXT = 5301, CapabilityRuntimeDescriptorArrayEXT = 5302, @@ -708,6 +802,10 @@ enum Capability { CapabilityInputAttachmentArrayNonUniformIndexingEXT = 5310, CapabilityUniformTexelBufferArrayNonUniformIndexingEXT = 5311, CapabilityStorageTexelBufferArrayNonUniformIndexingEXT = 5312, + CapabilityRayTracingNV = 5340, + CapabilityVulkanMemoryModelKHR = 5345, + CapabilityVulkanMemoryModelDeviceScopeKHR = 5346, + CapabilityComputeDerivativeGroupLinearNV = 5350, CapabilitySubgroupShuffleINTEL = 5568, CapabilitySubgroupBufferBlockIOINTEL = 5569, CapabilitySubgroupImageBlockIOINTEL = 5570, @@ -1071,7 +1169,15 @@ enum Op { OpGroupSMaxNonUniformAMD = 5007, OpFragmentMaskFetchAMD = 5011, OpFragmentFetchAMD = 5012, + OpImageSampleFootprintNV = 5283, OpGroupNonUniformPartitionNV = 5296, + OpWritePackedPrimitiveIndices4x8NV = 5299, + OpReportIntersectionNV = 5334, + OpIgnoreIntersectionNV = 5335, + OpTerminateRayNV = 5336, + OpTraceNV = 5337, + OpTypeAccelerationStructureNV = 5341, + OpExecuteCallableNV = 5344, OpSubgroupShuffleINTEL = 5571, OpSubgroupShuffleDownINTEL = 5572, OpSubgroupShuffleUpINTEL = 5573, diff --git a/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/unified1/spirv.hpp11 b/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/unified1/spirv.hpp11 index 3bd5b8a0d..bc7ecaabf 100644 --- a/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/unified1/spirv.hpp11 +++ b/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/unified1/spirv.hpp11 @@ -1,4 +1,4 @@ -// Copyright (c) 2014-2018 The Khronos Group Inc. +// Copyright (c) 2014-2019 The Khronos Group Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and/or associated documentation files (the "Materials"), @@ -26,13 +26,16 @@ // the Binary Section of the SPIR-V specification. // Enumeration tokens for SPIR-V, in various styles: -// C, C++, C++11, JSON, Lua, Python +// C, C++, C++11, JSON, Lua, Python, C#, D // // - C will have tokens with a "Spv" prefix, e.g.: SpvSourceLanguageGLSL // - C++ will have tokens in the "spv" name space, e.g.: spv::SourceLanguageGLSL // - C++11 will use enum classes in the spv namespace, e.g.: spv::SourceLanguage::GLSL // - Lua will use tables, e.g.: spv.SourceLanguage.GLSL // - Python will use dictionaries, e.g.: spv['SourceLanguage']['GLSL'] +// - C# will use enum classes in the Specification class located in the "Spv" namespace, +// e.g.: Spv.Specification.SourceLanguage.GLSL +// - D will have tokens under the "spv" module, e.g: spv.SourceLanguage.GLSL // // Some tokens act like mask values, which can be OR'd together, // while others are mutually exclusive. The mask-like ones have @@ -47,11 +50,11 @@ namespace spv { typedef unsigned int Id; #define SPV_VERSION 0x10300 -#define SPV_REVISION 1 +#define SPV_REVISION 6 static const unsigned int MagicNumber = 0x07230203; static const unsigned int Version = 0x00010300; -static const unsigned int Revision = 1; +static const unsigned int Revision = 6; static const unsigned int OpCodeMask = 0xffff; static const unsigned int WordCountShift = 16; @@ -73,6 +76,14 @@ enum class ExecutionModel : unsigned { Fragment = 4, GLCompute = 5, Kernel = 6, + TaskNV = 5267, + MeshNV = 5268, + RayGenerationNV = 5313, + IntersectionNV = 5314, + AnyHitNV = 5315, + ClosestHitNV = 5316, + MissNV = 5317, + CallableNV = 5318, Max = 0x7fffffff, }; @@ -87,6 +98,7 @@ enum class MemoryModel : unsigned { Simple = 0, GLSL450 = 1, OpenCL = 2, + VulkanKHR = 3, Max = 0x7fffffff, }; @@ -130,7 +142,17 @@ enum class ExecutionMode : unsigned { LocalSizeId = 38, LocalSizeHintId = 39, PostDepthCoverage = 4446, + DenormPreserve = 4459, + DenormFlushToZero = 4460, + SignedZeroInfNanPreserve = 4461, + RoundingModeRTE = 4462, + RoundingModeRTZ = 4463, StencilRefReplacingEXT = 5027, + OutputLinesNV = 5269, + OutputPrimitivesNV = 5270, + DerivativeGroupQuadsNV = 5289, + DerivativeGroupLinearNV = 5290, + OutputTrianglesNV = 5298, Max = 0x7fffffff, }; @@ -148,6 +170,12 @@ enum class StorageClass : unsigned { AtomicCounter = 10, Image = 11, StorageBuffer = 12, + CallableDataNV = 5328, + IncomingCallableDataNV = 5329, + RayPayloadNV = 5338, + HitAttributeNV = 5339, + IncomingRayPayloadNV = 5342, + ShaderRecordBufferNV = 5343, Max = 0x7fffffff, }; @@ -275,6 +303,10 @@ enum class ImageOperandsShift : unsigned { ConstOffsets = 5, Sample = 6, MinLod = 7, + MakeTexelAvailableKHR = 8, + MakeTexelVisibleKHR = 9, + NonPrivateTexelKHR = 10, + VolatileTexelKHR = 11, Max = 0x7fffffff, }; @@ -288,6 +320,10 @@ enum class ImageOperandsMask : unsigned { ConstOffsets = 0x00000020, Sample = 0x00000040, MinLod = 0x00000080, + MakeTexelAvailableKHR = 0x00000100, + MakeTexelVisibleKHR = 0x00000200, + NonPrivateTexelKHR = 0x00000400, + VolatileTexelKHR = 0x00000800, }; enum class FPFastMathModeShift : unsigned { @@ -388,11 +424,17 @@ enum class Decoration : unsigned { MaxByteOffset = 45, AlignmentId = 46, MaxByteOffsetId = 47, + NoSignedWrap = 4469, + NoUnsignedWrap = 4470, ExplicitInterpAMD = 4999, OverrideCoverageNV = 5248, PassthroughNV = 5250, ViewportRelativeNV = 5252, SecondaryViewportRelativeNV = 5256, + PerPrimitiveNV = 5271, + PerViewNV = 5272, + PerTaskNV = 5273, + PerVertexNV = 5285, NonUniformEXT = 5300, HlslCounterBufferGOOGLE = 5634, HlslSemanticGOOGLE = 5635, @@ -470,6 +512,34 @@ enum class BuiltIn : unsigned { PositionPerViewNV = 5261, ViewportMaskPerViewNV = 5262, FullyCoveredEXT = 5264, + TaskCountNV = 5274, + PrimitiveCountNV = 5275, + PrimitiveIndicesNV = 5276, + ClipDistancePerViewNV = 5277, + CullDistancePerViewNV = 5278, + LayerPerViewNV = 5279, + MeshViewCountNV = 5280, + MeshViewIndicesNV = 5281, + BaryCoordNV = 5286, + BaryCoordNoPerspNV = 5287, + FragSizeEXT = 5292, + FragmentSizeNV = 5292, + FragInvocationCountEXT = 5293, + InvocationsPerPixelNV = 5293, + LaunchIdNV = 5319, + LaunchSizeNV = 5320, + WorldRayOriginNV = 5321, + WorldRayDirectionNV = 5322, + ObjectRayOriginNV = 5323, + ObjectRayDirectionNV = 5324, + RayTminNV = 5325, + RayTmaxNV = 5326, + InstanceCustomIndexNV = 5327, + ObjectToWorldNV = 5330, + WorldToObjectNV = 5331, + HitTNV = 5332, + HitKindNV = 5333, + IncomingRayFlagsNV = 5351, Max = 0x7fffffff, }; @@ -528,6 +598,9 @@ enum class MemorySemanticsShift : unsigned { CrossWorkgroupMemory = 9, AtomicCounterMemory = 10, ImageMemory = 11, + OutputMemoryKHR = 12, + MakeAvailableKHR = 13, + MakeVisibleKHR = 14, Max = 0x7fffffff, }; @@ -543,12 +616,18 @@ enum class MemorySemanticsMask : unsigned { CrossWorkgroupMemory = 0x00000200, AtomicCounterMemory = 0x00000400, ImageMemory = 0x00000800, + OutputMemoryKHR = 0x00001000, + MakeAvailableKHR = 0x00002000, + MakeVisibleKHR = 0x00004000, }; enum class MemoryAccessShift : unsigned { Volatile = 0, Aligned = 1, Nontemporal = 2, + MakePointerAvailableKHR = 3, + MakePointerVisibleKHR = 4, + NonPrivatePointerKHR = 5, Max = 0x7fffffff, }; @@ -557,6 +636,9 @@ enum class MemoryAccessMask : unsigned { Volatile = 0x00000001, Aligned = 0x00000002, Nontemporal = 0x00000004, + MakePointerAvailableKHR = 0x00000008, + MakePointerVisibleKHR = 0x00000010, + NonPrivatePointerKHR = 0x00000020, }; enum class Scope : unsigned { @@ -565,6 +647,7 @@ enum class Scope : unsigned { Workgroup = 2, Subgroup = 3, Invocation = 4, + QueueFamilyKHR = 5, Max = 0x7fffffff, }; @@ -682,6 +765,11 @@ enum class Capability : unsigned { StorageBuffer8BitAccess = 4448, UniformAndStorageBuffer8BitAccess = 4449, StoragePushConstant8 = 4450, + DenormPreserve = 4464, + DenormFlushToZero = 4465, + SignedZeroInfNanPreserve = 4466, + RoundingModeRTE = 4467, + RoundingModeRTZ = 4468, Float16ImageAMD = 5008, ImageGatherBiasLodAMD = 5009, FragmentMaskAMD = 5010, @@ -695,6 +783,12 @@ enum class Capability : unsigned { ShaderStereoViewNV = 5259, PerViewAttributesNV = 5260, FragmentFullyCoveredEXT = 5265, + MeshShadingNV = 5266, + ImageFootprintNV = 5282, + FragmentBarycentricNV = 5284, + ComputeDerivativeGroupQuadsNV = 5288, + FragmentDensityEXT = 5291, + ShadingRateNV = 5291, GroupNonUniformPartitionedNV = 5297, ShaderNonUniformEXT = 5301, RuntimeDescriptorArrayEXT = 5302, @@ -708,6 +802,10 @@ enum class Capability : unsigned { InputAttachmentArrayNonUniformIndexingEXT = 5310, UniformTexelBufferArrayNonUniformIndexingEXT = 5311, StorageTexelBufferArrayNonUniformIndexingEXT = 5312, + RayTracingNV = 5340, + VulkanMemoryModelKHR = 5345, + VulkanMemoryModelDeviceScopeKHR = 5346, + ComputeDerivativeGroupLinearNV = 5350, SubgroupShuffleINTEL = 5568, SubgroupBufferBlockIOINTEL = 5569, SubgroupImageBlockIOINTEL = 5570, @@ -1071,7 +1169,15 @@ enum class Op : unsigned { OpGroupSMaxNonUniformAMD = 5007, OpFragmentMaskFetchAMD = 5011, OpFragmentFetchAMD = 5012, + OpImageSampleFootprintNV = 5283, OpGroupNonUniformPartitionNV = 5296, + OpWritePackedPrimitiveIndices4x8NV = 5299, + OpReportIntersectionNV = 5334, + OpIgnoreIntersectionNV = 5335, + OpTerminateRayNV = 5336, + OpTraceNV = 5337, + OpTypeAccelerationStructureNV = 5341, + OpExecuteCallableNV = 5344, OpSubgroupShuffleINTEL = 5571, OpSubgroupShuffleDownINTEL = 5572, OpSubgroupShuffleUpINTEL = 5573, diff --git a/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/unified1/spirv.json b/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/unified1/spirv.json index a592dfa23..11fd7a4bc 100644 --- a/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/unified1/spirv.json +++ b/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/unified1/spirv.json @@ -6,7 +6,7 @@ "Comment": [ [ - "Copyright (c) 2014-2018 The Khronos Group Inc.", + "Copyright (c) 2014-2019 The Khronos Group Inc.", "", "Permission is hereby granted, free of charge, to any person obtaining a copy", "of this software and/or associated documentation files (the \"Materials\"),", @@ -36,13 +36,16 @@ ], [ "Enumeration tokens for SPIR-V, in various styles:", - " C, C++, C++11, JSON, Lua, Python", + " C, C++, C++11, JSON, Lua, Python, C#, D", "", "- C will have tokens with a \"Spv\" prefix, e.g.: SpvSourceLanguageGLSL", "- C++ will have tokens in the \"spv\" name space, e.g.: spv::SourceLanguageGLSL", "- C++11 will use enum classes in the spv namespace, e.g.: spv::SourceLanguage::GLSL", "- Lua will use tables, e.g.: spv.SourceLanguage.GLSL", "- Python will use dictionaries, e.g.: spv['SourceLanguage']['GLSL']", + "- C# will use enum classes in the Specification class located in the \"Spv\" namespace,", + " e.g.: Spv.Specification.SourceLanguage.GLSL", + "- D will have tokens under the \"spv\" module, e.g: spv.SourceLanguage.GLSL", "", "Some tokens act like mask values, which can be OR'd together,", "while others are mutually exclusive. The mask-like ones have", @@ -52,7 +55,7 @@ ], "MagicNumber": 119734787, "Version": 66304, - "Revision": 1, + "Revision": 6, "OpCodeMask": 65535, "WordCountShift": 16 }, @@ -82,7 +85,15 @@ "Geometry": 3, "Fragment": 4, "GLCompute": 5, - "Kernel": 6 + "Kernel": 6, + "TaskNV": 5267, + "MeshNV": 5268, + "RayGenerationNV": 5313, + "IntersectionNV": 5314, + "AnyHitNV": 5315, + "ClosestHitNV": 5316, + "MissNV": 5317, + "CallableNV": 5318 } }, { @@ -102,7 +113,8 @@ { "Simple": 0, "GLSL450": 1, - "OpenCL": 2 + "OpenCL": 2, + "VulkanKHR": 3 } }, { @@ -149,7 +161,17 @@ "LocalSizeId": 38, "LocalSizeHintId": 39, "PostDepthCoverage": 4446, - "StencilRefReplacingEXT": 5027 + "DenormPreserve": 4459, + "DenormFlushToZero": 4460, + "SignedZeroInfNanPreserve": 4461, + "RoundingModeRTE": 4462, + "RoundingModeRTZ": 4463, + "StencilRefReplacingEXT": 5027, + "OutputLinesNV": 5269, + "OutputPrimitivesNV": 5270, + "DerivativeGroupQuadsNV": 5289, + "DerivativeGroupLinearNV": 5290, + "OutputTrianglesNV": 5298 } }, { @@ -169,7 +191,13 @@ "PushConstant": 9, "AtomicCounter": 10, "Image": 11, - "StorageBuffer": 12 + "StorageBuffer": 12, + "CallableDataNV": 5328, + "IncomingCallableDataNV": 5329, + "RayPayloadNV": 5338, + "HitAttributeNV": 5339, + "IncomingRayPayloadNV": 5342, + "ShaderRecordBufferNV": 5343 } }, { @@ -317,7 +345,11 @@ "Offset": 4, "ConstOffsets": 5, "Sample": 6, - "MinLod": 7 + "MinLod": 7, + "MakeTexelAvailableKHR": 8, + "MakeTexelVisibleKHR": 9, + "NonPrivateTexelKHR": 10, + "VolatileTexelKHR": 11 } }, { @@ -428,11 +460,17 @@ "MaxByteOffset": 45, "AlignmentId": 46, "MaxByteOffsetId": 47, + "NoSignedWrap": 4469, + "NoUnsignedWrap": 4470, "ExplicitInterpAMD": 4999, "OverrideCoverageNV": 5248, "PassthroughNV": 5250, "ViewportRelativeNV": 5252, "SecondaryViewportRelativeNV": 5256, + "PerPrimitiveNV": 5271, + "PerViewNV": 5272, + "PerTaskNV": 5273, + "PerVertexNV": 5285, "NonUniformEXT": 5300, "HlslCounterBufferGOOGLE": 5634, "HlslSemanticGOOGLE": 5635 @@ -512,7 +550,35 @@ "SecondaryViewportMaskNV": 5258, "PositionPerViewNV": 5261, "ViewportMaskPerViewNV": 5262, - "FullyCoveredEXT": 5264 + "FullyCoveredEXT": 5264, + "TaskCountNV": 5274, + "PrimitiveCountNV": 5275, + "PrimitiveIndicesNV": 5276, + "ClipDistancePerViewNV": 5277, + "CullDistancePerViewNV": 5278, + "LayerPerViewNV": 5279, + "MeshViewCountNV": 5280, + "MeshViewIndicesNV": 5281, + "BaryCoordNV": 5286, + "BaryCoordNoPerspNV": 5287, + "FragSizeEXT": 5292, + "FragmentSizeNV": 5292, + "FragInvocationCountEXT": 5293, + "InvocationsPerPixelNV": 5293, + "LaunchIdNV": 5319, + "LaunchSizeNV": 5320, + "WorldRayOriginNV": 5321, + "WorldRayDirectionNV": 5322, + "ObjectRayOriginNV": 5323, + "ObjectRayDirectionNV": 5324, + "RayTminNV": 5325, + "RayTmaxNV": 5326, + "InstanceCustomIndexNV": 5327, + "ObjectToWorldNV": 5330, + "WorldToObjectNV": 5331, + "HitTNV": 5332, + "HitKindNV": 5333, + "IncomingRayFlagsNV": 5351 } }, { @@ -560,7 +626,10 @@ "WorkgroupMemory": 8, "CrossWorkgroupMemory": 9, "AtomicCounterMemory": 10, - "ImageMemory": 11 + "ImageMemory": 11, + "OutputMemoryKHR": 12, + "MakeAvailableKHR": 13, + "MakeVisibleKHR": 14 } }, { @@ -570,7 +639,10 @@ { "Volatile": 0, "Aligned": 1, - "Nontemporal": 2 + "Nontemporal": 2, + "MakePointerAvailableKHR": 3, + "MakePointerVisibleKHR": 4, + "NonPrivatePointerKHR": 5 } }, { @@ -582,7 +654,8 @@ "Device": 1, "Workgroup": 2, "Subgroup": 3, - "Invocation": 4 + "Invocation": 4, + "QueueFamilyKHR": 5 } }, { @@ -707,6 +780,11 @@ "StorageBuffer8BitAccess": 4448, "UniformAndStorageBuffer8BitAccess": 4449, "StoragePushConstant8": 4450, + "DenormPreserve": 4464, + "DenormFlushToZero": 4465, + "SignedZeroInfNanPreserve": 4466, + "RoundingModeRTE": 4467, + "RoundingModeRTZ": 4468, "Float16ImageAMD": 5008, "ImageGatherBiasLodAMD": 5009, "FragmentMaskAMD": 5010, @@ -720,6 +798,12 @@ "ShaderStereoViewNV": 5259, "PerViewAttributesNV": 5260, "FragmentFullyCoveredEXT": 5265, + "MeshShadingNV": 5266, + "ImageFootprintNV": 5282, + "FragmentBarycentricNV": 5284, + "ComputeDerivativeGroupQuadsNV": 5288, + "FragmentDensityEXT": 5291, + "ShadingRateNV": 5291, "GroupNonUniformPartitionedNV": 5297, "ShaderNonUniformEXT": 5301, "RuntimeDescriptorArrayEXT": 5302, @@ -733,6 +817,10 @@ "InputAttachmentArrayNonUniformIndexingEXT": 5310, "UniformTexelBufferArrayNonUniformIndexingEXT": 5311, "StorageTexelBufferArrayNonUniformIndexingEXT": 5312, + "RayTracingNV": 5340, + "VulkanMemoryModelKHR": 5345, + "VulkanMemoryModelDeviceScopeKHR": 5346, + "ComputeDerivativeGroupLinearNV": 5350, "SubgroupShuffleINTEL": 5568, "SubgroupBufferBlockIOINTEL": 5569, "SubgroupImageBlockIOINTEL": 5570 @@ -1099,7 +1187,15 @@ "OpGroupSMaxNonUniformAMD": 5007, "OpFragmentMaskFetchAMD": 5011, "OpFragmentFetchAMD": 5012, + "OpImageSampleFootprintNV": 5283, "OpGroupNonUniformPartitionNV": 5296, + "OpWritePackedPrimitiveIndices4x8NV": 5299, + "OpReportIntersectionNV": 5334, + "OpIgnoreIntersectionNV": 5335, + "OpTerminateRayNV": 5336, + "OpTraceNV": 5337, + "OpTypeAccelerationStructureNV": 5341, + "OpExecuteCallableNV": 5344, "OpSubgroupShuffleINTEL": 5571, "OpSubgroupShuffleDownINTEL": 5572, "OpSubgroupShuffleUpINTEL": 5573, diff --git a/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/unified1/spirv.lua b/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/unified1/spirv.lua index 43e9ba5be..29644450c 100644 --- a/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/unified1/spirv.lua +++ b/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/unified1/spirv.lua @@ -1,4 +1,4 @@ --- Copyright (c) 2014-2018 The Khronos Group Inc. +-- Copyright (c) 2014-2019 The Khronos Group Inc. -- -- Permission is hereby granted, free of charge, to any person obtaining a copy -- of this software and/or associated documentation files (the "Materials"), @@ -26,13 +26,16 @@ -- the Binary Section of the SPIR-V specification. -- Enumeration tokens for SPIR-V, in various styles: --- C, C++, C++11, JSON, Lua, Python +-- C, C++, C++11, JSON, Lua, Python, C#, D -- -- - C will have tokens with a "Spv" prefix, e.g.: SpvSourceLanguageGLSL -- - C++ will have tokens in the "spv" name space, e.g.: spv::SourceLanguageGLSL -- - C++11 will use enum classes in the spv namespace, e.g.: spv::SourceLanguage::GLSL -- - Lua will use tables, e.g.: spv.SourceLanguage.GLSL -- - Python will use dictionaries, e.g.: spv['SourceLanguage']['GLSL'] +-- - C# will use enum classes in the Specification class located in the "Spv" namespace, +-- e.g.: Spv.Specification.SourceLanguage.GLSL +-- - D will have tokens under the "spv" module, e.g: spv.SourceLanguage.GLSL -- -- Some tokens act like mask values, which can be OR'd together, -- while others are mutually exclusive. The mask-like ones have @@ -42,7 +45,7 @@ spv = { MagicNumber = 0x07230203, Version = 0x00010300, - Revision = 1, + Revision = 6, OpCodeMask = 0xffff, WordCountShift = 16, @@ -63,6 +66,14 @@ spv = { Fragment = 4, GLCompute = 5, Kernel = 6, + TaskNV = 5267, + MeshNV = 5268, + RayGenerationNV = 5313, + IntersectionNV = 5314, + AnyHitNV = 5315, + ClosestHitNV = 5316, + MissNV = 5317, + CallableNV = 5318, }, AddressingModel = { @@ -75,6 +86,7 @@ spv = { Simple = 0, GLSL450 = 1, OpenCL = 2, + VulkanKHR = 3, }, ExecutionMode = { @@ -117,7 +129,17 @@ spv = { LocalSizeId = 38, LocalSizeHintId = 39, PostDepthCoverage = 4446, + DenormPreserve = 4459, + DenormFlushToZero = 4460, + SignedZeroInfNanPreserve = 4461, + RoundingModeRTE = 4462, + RoundingModeRTZ = 4463, StencilRefReplacingEXT = 5027, + OutputLinesNV = 5269, + OutputPrimitivesNV = 5270, + DerivativeGroupQuadsNV = 5289, + DerivativeGroupLinearNV = 5290, + OutputTrianglesNV = 5298, }, StorageClass = { @@ -134,6 +156,12 @@ spv = { AtomicCounter = 10, Image = 11, StorageBuffer = 12, + CallableDataNV = 5328, + IncomingCallableDataNV = 5329, + RayPayloadNV = 5338, + HitAttributeNV = 5339, + IncomingRayPayloadNV = 5342, + ShaderRecordBufferNV = 5343, }, Dim = { @@ -254,6 +282,10 @@ spv = { ConstOffsets = 5, Sample = 6, MinLod = 7, + MakeTexelAvailableKHR = 8, + MakeTexelVisibleKHR = 9, + NonPrivateTexelKHR = 10, + VolatileTexelKHR = 11, }, ImageOperandsMask = { @@ -266,6 +298,10 @@ spv = { ConstOffsets = 0x00000020, Sample = 0x00000040, MinLod = 0x00000080, + MakeTexelAvailableKHR = 0x00000100, + MakeTexelVisibleKHR = 0x00000200, + NonPrivateTexelKHR = 0x00000400, + VolatileTexelKHR = 0x00000800, }, FPFastMathModeShift = { @@ -361,11 +397,17 @@ spv = { MaxByteOffset = 45, AlignmentId = 46, MaxByteOffsetId = 47, + NoSignedWrap = 4469, + NoUnsignedWrap = 4470, ExplicitInterpAMD = 4999, OverrideCoverageNV = 5248, PassthroughNV = 5250, ViewportRelativeNV = 5252, SecondaryViewportRelativeNV = 5256, + PerPrimitiveNV = 5271, + PerViewNV = 5272, + PerTaskNV = 5273, + PerVertexNV = 5285, NonUniformEXT = 5300, HlslCounterBufferGOOGLE = 5634, HlslSemanticGOOGLE = 5635, @@ -442,6 +484,34 @@ spv = { PositionPerViewNV = 5261, ViewportMaskPerViewNV = 5262, FullyCoveredEXT = 5264, + TaskCountNV = 5274, + PrimitiveCountNV = 5275, + PrimitiveIndicesNV = 5276, + ClipDistancePerViewNV = 5277, + CullDistancePerViewNV = 5278, + LayerPerViewNV = 5279, + MeshViewCountNV = 5280, + MeshViewIndicesNV = 5281, + BaryCoordNV = 5286, + BaryCoordNoPerspNV = 5287, + FragSizeEXT = 5292, + FragmentSizeNV = 5292, + FragInvocationCountEXT = 5293, + InvocationsPerPixelNV = 5293, + LaunchIdNV = 5319, + LaunchSizeNV = 5320, + WorldRayOriginNV = 5321, + WorldRayDirectionNV = 5322, + ObjectRayOriginNV = 5323, + ObjectRayDirectionNV = 5324, + RayTminNV = 5325, + RayTmaxNV = 5326, + InstanceCustomIndexNV = 5327, + ObjectToWorldNV = 5330, + WorldToObjectNV = 5331, + HitTNV = 5332, + HitKindNV = 5333, + IncomingRayFlagsNV = 5351, }, SelectionControlShift = { @@ -496,6 +566,9 @@ spv = { CrossWorkgroupMemory = 9, AtomicCounterMemory = 10, ImageMemory = 11, + OutputMemoryKHR = 12, + MakeAvailableKHR = 13, + MakeVisibleKHR = 14, }, MemorySemanticsMask = { @@ -510,12 +583,18 @@ spv = { CrossWorkgroupMemory = 0x00000200, AtomicCounterMemory = 0x00000400, ImageMemory = 0x00000800, + OutputMemoryKHR = 0x00001000, + MakeAvailableKHR = 0x00002000, + MakeVisibleKHR = 0x00004000, }, MemoryAccessShift = { Volatile = 0, Aligned = 1, Nontemporal = 2, + MakePointerAvailableKHR = 3, + MakePointerVisibleKHR = 4, + NonPrivatePointerKHR = 5, }, MemoryAccessMask = { @@ -523,6 +602,9 @@ spv = { Volatile = 0x00000001, Aligned = 0x00000002, Nontemporal = 0x00000004, + MakePointerAvailableKHR = 0x00000008, + MakePointerVisibleKHR = 0x00000010, + NonPrivatePointerKHR = 0x00000020, }, Scope = { @@ -531,6 +613,7 @@ spv = { Workgroup = 2, Subgroup = 3, Invocation = 4, + QueueFamilyKHR = 5, }, GroupOperation = { @@ -644,6 +727,11 @@ spv = { StorageBuffer8BitAccess = 4448, UniformAndStorageBuffer8BitAccess = 4449, StoragePushConstant8 = 4450, + DenormPreserve = 4464, + DenormFlushToZero = 4465, + SignedZeroInfNanPreserve = 4466, + RoundingModeRTE = 4467, + RoundingModeRTZ = 4468, Float16ImageAMD = 5008, ImageGatherBiasLodAMD = 5009, FragmentMaskAMD = 5010, @@ -657,6 +745,12 @@ spv = { ShaderStereoViewNV = 5259, PerViewAttributesNV = 5260, FragmentFullyCoveredEXT = 5265, + MeshShadingNV = 5266, + ImageFootprintNV = 5282, + FragmentBarycentricNV = 5284, + ComputeDerivativeGroupQuadsNV = 5288, + FragmentDensityEXT = 5291, + ShadingRateNV = 5291, GroupNonUniformPartitionedNV = 5297, ShaderNonUniformEXT = 5301, RuntimeDescriptorArrayEXT = 5302, @@ -670,6 +764,10 @@ spv = { InputAttachmentArrayNonUniformIndexingEXT = 5310, UniformTexelBufferArrayNonUniformIndexingEXT = 5311, StorageTexelBufferArrayNonUniformIndexingEXT = 5312, + RayTracingNV = 5340, + VulkanMemoryModelKHR = 5345, + VulkanMemoryModelDeviceScopeKHR = 5346, + ComputeDerivativeGroupLinearNV = 5350, SubgroupShuffleINTEL = 5568, SubgroupBufferBlockIOINTEL = 5569, SubgroupImageBlockIOINTEL = 5570, @@ -1032,7 +1130,15 @@ spv = { OpGroupSMaxNonUniformAMD = 5007, OpFragmentMaskFetchAMD = 5011, OpFragmentFetchAMD = 5012, + OpImageSampleFootprintNV = 5283, OpGroupNonUniformPartitionNV = 5296, + OpWritePackedPrimitiveIndices4x8NV = 5299, + OpReportIntersectionNV = 5334, + OpIgnoreIntersectionNV = 5335, + OpTerminateRayNV = 5336, + OpTraceNV = 5337, + OpTypeAccelerationStructureNV = 5341, + OpExecuteCallableNV = 5344, OpSubgroupShuffleINTEL = 5571, OpSubgroupShuffleDownINTEL = 5572, OpSubgroupShuffleUpINTEL = 5573, diff --git a/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/unified1/spirv.py b/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/unified1/spirv.py old mode 100755 new mode 100644 index cb3775ff9..89855e11c --- a/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/unified1/spirv.py +++ b/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/unified1/spirv.py @@ -1,4 +1,4 @@ -# Copyright (c) 2014-2018 The Khronos Group Inc. +# Copyright (c) 2014-2019 The Khronos Group Inc. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and/or associated documentation files (the "Materials"), @@ -26,13 +26,16 @@ # the Binary Section of the SPIR-V specification. # Enumeration tokens for SPIR-V, in various styles: -# C, C++, C++11, JSON, Lua, Python +# C, C++, C++11, JSON, Lua, Python, C#, D # # - C will have tokens with a "Spv" prefix, e.g.: SpvSourceLanguageGLSL # - C++ will have tokens in the "spv" name space, e.g.: spv::SourceLanguageGLSL # - C++11 will use enum classes in the spv namespace, e.g.: spv::SourceLanguage::GLSL # - Lua will use tables, e.g.: spv.SourceLanguage.GLSL # - Python will use dictionaries, e.g.: spv['SourceLanguage']['GLSL'] +# - C# will use enum classes in the Specification class located in the "Spv" namespace, +# e.g.: Spv.Specification.SourceLanguage.GLSL +# - D will have tokens under the "spv" module, e.g: spv.SourceLanguage.GLSL # # Some tokens act like mask values, which can be OR'd together, # while others are mutually exclusive. The mask-like ones have @@ -42,7 +45,7 @@ spv = { 'MagicNumber' : 0x07230203, 'Version' : 0x00010300, - 'Revision' : 1, + 'Revision' : 6, 'OpCodeMask' : 0xffff, 'WordCountShift' : 16, @@ -63,6 +66,14 @@ spv = { 'Fragment' : 4, 'GLCompute' : 5, 'Kernel' : 6, + 'TaskNV' : 5267, + 'MeshNV' : 5268, + 'RayGenerationNV' : 5313, + 'IntersectionNV' : 5314, + 'AnyHitNV' : 5315, + 'ClosestHitNV' : 5316, + 'MissNV' : 5317, + 'CallableNV' : 5318, }, 'AddressingModel' : { @@ -75,6 +86,7 @@ spv = { 'Simple' : 0, 'GLSL450' : 1, 'OpenCL' : 2, + 'VulkanKHR' : 3, }, 'ExecutionMode' : { @@ -117,7 +129,17 @@ spv = { 'LocalSizeId' : 38, 'LocalSizeHintId' : 39, 'PostDepthCoverage' : 4446, + 'DenormPreserve' : 4459, + 'DenormFlushToZero' : 4460, + 'SignedZeroInfNanPreserve' : 4461, + 'RoundingModeRTE' : 4462, + 'RoundingModeRTZ' : 4463, 'StencilRefReplacingEXT' : 5027, + 'OutputLinesNV' : 5269, + 'OutputPrimitivesNV' : 5270, + 'DerivativeGroupQuadsNV' : 5289, + 'DerivativeGroupLinearNV' : 5290, + 'OutputTrianglesNV' : 5298, }, 'StorageClass' : { @@ -134,6 +156,12 @@ spv = { 'AtomicCounter' : 10, 'Image' : 11, 'StorageBuffer' : 12, + 'CallableDataNV' : 5328, + 'IncomingCallableDataNV' : 5329, + 'RayPayloadNV' : 5338, + 'HitAttributeNV' : 5339, + 'IncomingRayPayloadNV' : 5342, + 'ShaderRecordBufferNV' : 5343, }, 'Dim' : { @@ -254,6 +282,10 @@ spv = { 'ConstOffsets' : 5, 'Sample' : 6, 'MinLod' : 7, + 'MakeTexelAvailableKHR' : 8, + 'MakeTexelVisibleKHR' : 9, + 'NonPrivateTexelKHR' : 10, + 'VolatileTexelKHR' : 11, }, 'ImageOperandsMask' : { @@ -266,6 +298,10 @@ spv = { 'ConstOffsets' : 0x00000020, 'Sample' : 0x00000040, 'MinLod' : 0x00000080, + 'MakeTexelAvailableKHR' : 0x00000100, + 'MakeTexelVisibleKHR' : 0x00000200, + 'NonPrivateTexelKHR' : 0x00000400, + 'VolatileTexelKHR' : 0x00000800, }, 'FPFastMathModeShift' : { @@ -361,11 +397,17 @@ spv = { 'MaxByteOffset' : 45, 'AlignmentId' : 46, 'MaxByteOffsetId' : 47, + 'NoSignedWrap' : 4469, + 'NoUnsignedWrap' : 4470, 'ExplicitInterpAMD' : 4999, 'OverrideCoverageNV' : 5248, 'PassthroughNV' : 5250, 'ViewportRelativeNV' : 5252, 'SecondaryViewportRelativeNV' : 5256, + 'PerPrimitiveNV' : 5271, + 'PerViewNV' : 5272, + 'PerTaskNV' : 5273, + 'PerVertexNV' : 5285, 'NonUniformEXT' : 5300, 'HlslCounterBufferGOOGLE' : 5634, 'HlslSemanticGOOGLE' : 5635, @@ -442,6 +484,34 @@ spv = { 'PositionPerViewNV' : 5261, 'ViewportMaskPerViewNV' : 5262, 'FullyCoveredEXT' : 5264, + 'TaskCountNV' : 5274, + 'PrimitiveCountNV' : 5275, + 'PrimitiveIndicesNV' : 5276, + 'ClipDistancePerViewNV' : 5277, + 'CullDistancePerViewNV' : 5278, + 'LayerPerViewNV' : 5279, + 'MeshViewCountNV' : 5280, + 'MeshViewIndicesNV' : 5281, + 'BaryCoordNV' : 5286, + 'BaryCoordNoPerspNV' : 5287, + 'FragSizeEXT' : 5292, + 'FragmentSizeNV' : 5292, + 'FragInvocationCountEXT' : 5293, + 'InvocationsPerPixelNV' : 5293, + 'LaunchIdNV' : 5319, + 'LaunchSizeNV' : 5320, + 'WorldRayOriginNV' : 5321, + 'WorldRayDirectionNV' : 5322, + 'ObjectRayOriginNV' : 5323, + 'ObjectRayDirectionNV' : 5324, + 'RayTminNV' : 5325, + 'RayTmaxNV' : 5326, + 'InstanceCustomIndexNV' : 5327, + 'ObjectToWorldNV' : 5330, + 'WorldToObjectNV' : 5331, + 'HitTNV' : 5332, + 'HitKindNV' : 5333, + 'IncomingRayFlagsNV' : 5351, }, 'SelectionControlShift' : { @@ -496,6 +566,9 @@ spv = { 'CrossWorkgroupMemory' : 9, 'AtomicCounterMemory' : 10, 'ImageMemory' : 11, + 'OutputMemoryKHR' : 12, + 'MakeAvailableKHR' : 13, + 'MakeVisibleKHR' : 14, }, 'MemorySemanticsMask' : { @@ -510,12 +583,18 @@ spv = { 'CrossWorkgroupMemory' : 0x00000200, 'AtomicCounterMemory' : 0x00000400, 'ImageMemory' : 0x00000800, + 'OutputMemoryKHR' : 0x00001000, + 'MakeAvailableKHR' : 0x00002000, + 'MakeVisibleKHR' : 0x00004000, }, 'MemoryAccessShift' : { 'Volatile' : 0, 'Aligned' : 1, 'Nontemporal' : 2, + 'MakePointerAvailableKHR' : 3, + 'MakePointerVisibleKHR' : 4, + 'NonPrivatePointerKHR' : 5, }, 'MemoryAccessMask' : { @@ -523,6 +602,9 @@ spv = { 'Volatile' : 0x00000001, 'Aligned' : 0x00000002, 'Nontemporal' : 0x00000004, + 'MakePointerAvailableKHR' : 0x00000008, + 'MakePointerVisibleKHR' : 0x00000010, + 'NonPrivatePointerKHR' : 0x00000020, }, 'Scope' : { @@ -531,6 +613,7 @@ spv = { 'Workgroup' : 2, 'Subgroup' : 3, 'Invocation' : 4, + 'QueueFamilyKHR' : 5, }, 'GroupOperation' : { @@ -644,6 +727,11 @@ spv = { 'StorageBuffer8BitAccess' : 4448, 'UniformAndStorageBuffer8BitAccess' : 4449, 'StoragePushConstant8' : 4450, + 'DenormPreserve' : 4464, + 'DenormFlushToZero' : 4465, + 'SignedZeroInfNanPreserve' : 4466, + 'RoundingModeRTE' : 4467, + 'RoundingModeRTZ' : 4468, 'Float16ImageAMD' : 5008, 'ImageGatherBiasLodAMD' : 5009, 'FragmentMaskAMD' : 5010, @@ -657,6 +745,12 @@ spv = { 'ShaderStereoViewNV' : 5259, 'PerViewAttributesNV' : 5260, 'FragmentFullyCoveredEXT' : 5265, + 'MeshShadingNV' : 5266, + 'ImageFootprintNV' : 5282, + 'FragmentBarycentricNV' : 5284, + 'ComputeDerivativeGroupQuadsNV' : 5288, + 'FragmentDensityEXT' : 5291, + 'ShadingRateNV' : 5291, 'GroupNonUniformPartitionedNV' : 5297, 'ShaderNonUniformEXT' : 5301, 'RuntimeDescriptorArrayEXT' : 5302, @@ -670,6 +764,10 @@ spv = { 'InputAttachmentArrayNonUniformIndexingEXT' : 5310, 'UniformTexelBufferArrayNonUniformIndexingEXT' : 5311, 'StorageTexelBufferArrayNonUniformIndexingEXT' : 5312, + 'RayTracingNV' : 5340, + 'VulkanMemoryModelKHR' : 5345, + 'VulkanMemoryModelDeviceScopeKHR' : 5346, + 'ComputeDerivativeGroupLinearNV' : 5350, 'SubgroupShuffleINTEL' : 5568, 'SubgroupBufferBlockIOINTEL' : 5569, 'SubgroupImageBlockIOINTEL' : 5570, @@ -1032,7 +1130,15 @@ spv = { 'OpGroupSMaxNonUniformAMD' : 5007, 'OpFragmentMaskFetchAMD' : 5011, 'OpFragmentFetchAMD' : 5012, + 'OpImageSampleFootprintNV' : 5283, 'OpGroupNonUniformPartitionNV' : 5296, + 'OpWritePackedPrimitiveIndices4x8NV' : 5299, + 'OpReportIntersectionNV' : 5334, + 'OpIgnoreIntersectionNV' : 5335, + 'OpTerminateRayNV' : 5336, + 'OpTraceNV' : 5337, + 'OpTypeAccelerationStructureNV' : 5341, + 'OpExecuteCallableNV' : 5344, 'OpSubgroupShuffleINTEL' : 5571, 'OpSubgroupShuffleDownINTEL' : 5572, 'OpSubgroupShuffleUpINTEL' : 5573, diff --git a/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/unified1/spv.d b/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/unified1/spv.d new file mode 100644 index 000000000..4791e7be5 --- /dev/null +++ b/3rdparty/spirv-tools/external/SPIRV-Headers/include/spirv/unified1/spv.d @@ -0,0 +1,1200 @@ +/+ + + Copyright (c) 2014-2019 The Khronos Group Inc. + + + + Permission is hereby granted, free of charge, to any person obtaining a copy + + of this software and/or associated documentation files (the "Materials"), + + to deal in the Materials without restriction, including without limitation + + the rights to use, copy, modify, merge, publish, distribute, sublicense, + + and/or sell copies of the Materials, and to permit persons to whom the + + Materials are furnished to do so, subject to the following conditions: + + + + The above copyright notice and this permission notice shall be included in + + all copies or substantial portions of the Materials. + + + + MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS + + STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND + + HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/ + + + + THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + + FROM,OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS + + IN THE MATERIALS. + +/ + +/+ + + This header is automatically generated by the same tool that creates + + the Binary Section of the SPIR-V specification. + +/ + +/+ + + Enumeration tokens for SPIR-V, in various styles: + + C, C++, C++11, JSON, Lua, Python, C#, D + + + + - C will have tokens with a "Spv" prefix, e.g.: SpvSourceLanguageGLSL + + - C++ will have tokens in the "spv" name space, e.g.: spv::SourceLanguageGLSL + + - C++11 will use enum classes in the spv namespace, e.g.: spv::SourceLanguage::GLSL + + - Lua will use tables, e.g.: spv.SourceLanguage.GLSL + + - Python will use dictionaries, e.g.: spv['SourceLanguage']['GLSL'] + + - C# will use enum classes in the Specification class located in the "Spv" namespace, + + e.g.: Spv.Specification.SourceLanguage.GLSL + + - D will have tokens under the "spv" module, e.g: spv.SourceLanguage.GLSL + + + + Some tokens act like mask values, which can be OR'd together, + + while others are mutually exclusive. The mask-like ones have + + "Mask" in their name, and a parallel enum that has the shift + + amount (1 << x) for each corresponding enumerant. + +/ + +module spv; + +enum uint MagicNumber = 0x07230203; +enum uint Version = 0x00010300; +enum uint Revision = 6; +enum uint OpCodeMask = 0xffff; +enum uint WordCountShift = 16; + +enum SourceLanguage : uint +{ + Unknown = 0, + ESSL = 1, + GLSL = 2, + OpenCL_C = 3, + OpenCL_CPP = 4, + HLSL = 5, +} + +enum ExecutionModel : uint +{ + Vertex = 0, + TessellationControl = 1, + TessellationEvaluation = 2, + Geometry = 3, + Fragment = 4, + GLCompute = 5, + Kernel = 6, + TaskNV = 5267, + MeshNV = 5268, + RayGenerationNV = 5313, + IntersectionNV = 5314, + AnyHitNV = 5315, + ClosestHitNV = 5316, + MissNV = 5317, + CallableNV = 5318, +} + +enum AddressingModel : uint +{ + Logical = 0, + Physical32 = 1, + Physical64 = 2, +} + +enum MemoryModel : uint +{ + Simple = 0, + GLSL450 = 1, + OpenCL = 2, + VulkanKHR = 3, +} + +enum ExecutionMode : uint +{ + Invocations = 0, + SpacingEqual = 1, + SpacingFractionalEven = 2, + SpacingFractionalOdd = 3, + VertexOrderCw = 4, + VertexOrderCcw = 5, + PixelCenterInteger = 6, + OriginUpperLeft = 7, + OriginLowerLeft = 8, + EarlyFragmentTests = 9, + PointMode = 10, + Xfb = 11, + DepthReplacing = 12, + DepthGreater = 14, + DepthLess = 15, + DepthUnchanged = 16, + LocalSize = 17, + LocalSizeHint = 18, + InputPoints = 19, + InputLines = 20, + InputLinesAdjacency = 21, + Triangles = 22, + InputTrianglesAdjacency = 23, + Quads = 24, + Isolines = 25, + OutputVertices = 26, + OutputPoints = 27, + OutputLineStrip = 28, + OutputTriangleStrip = 29, + VecTypeHint = 30, + ContractionOff = 31, + Initializer = 33, + Finalizer = 34, + SubgroupSize = 35, + SubgroupsPerWorkgroup = 36, + SubgroupsPerWorkgroupId = 37, + LocalSizeId = 38, + LocalSizeHintId = 39, + PostDepthCoverage = 4446, + DenormPreserve = 4459, + DenormFlushToZero = 4460, + SignedZeroInfNanPreserve = 4461, + RoundingModeRTE = 4462, + RoundingModeRTZ = 4463, + StencilRefReplacingEXT = 5027, + OutputLinesNV = 5269, + OutputPrimitivesNV = 5270, + DerivativeGroupQuadsNV = 5289, + DerivativeGroupLinearNV = 5290, + OutputTrianglesNV = 5298, +} + +enum StorageClass : uint +{ + UniformConstant = 0, + Input = 1, + Uniform = 2, + Output = 3, + Workgroup = 4, + CrossWorkgroup = 5, + Private = 6, + Function = 7, + Generic = 8, + PushConstant = 9, + AtomicCounter = 10, + Image = 11, + StorageBuffer = 12, + CallableDataNV = 5328, + IncomingCallableDataNV = 5329, + RayPayloadNV = 5338, + HitAttributeNV = 5339, + IncomingRayPayloadNV = 5342, + ShaderRecordBufferNV = 5343, +} + +enum Dim : uint +{ + _1D = 0, + _2D = 1, + _3D = 2, + Cube = 3, + Rect = 4, + Buffer = 5, + SubpassData = 6, +} + +enum SamplerAddressingMode : uint +{ + None = 0, + ClampToEdge = 1, + Clamp = 2, + Repeat = 3, + RepeatMirrored = 4, +} + +enum SamplerFilterMode : uint +{ + Nearest = 0, + Linear = 1, +} + +enum ImageFormat : uint +{ + Unknown = 0, + Rgba32f = 1, + Rgba16f = 2, + R32f = 3, + Rgba8 = 4, + Rgba8Snorm = 5, + Rg32f = 6, + Rg16f = 7, + R11fG11fB10f = 8, + R16f = 9, + Rgba16 = 10, + Rgb10A2 = 11, + Rg16 = 12, + Rg8 = 13, + R16 = 14, + R8 = 15, + Rgba16Snorm = 16, + Rg16Snorm = 17, + Rg8Snorm = 18, + R16Snorm = 19, + R8Snorm = 20, + Rgba32i = 21, + Rgba16i = 22, + Rgba8i = 23, + R32i = 24, + Rg32i = 25, + Rg16i = 26, + Rg8i = 27, + R16i = 28, + R8i = 29, + Rgba32ui = 30, + Rgba16ui = 31, + Rgba8ui = 32, + R32ui = 33, + Rgb10a2ui = 34, + Rg32ui = 35, + Rg16ui = 36, + Rg8ui = 37, + R16ui = 38, + R8ui = 39, +} + +enum ImageChannelOrder : uint +{ + R = 0, + A = 1, + RG = 2, + RA = 3, + RGB = 4, + RGBA = 5, + BGRA = 6, + ARGB = 7, + Intensity = 8, + Luminance = 9, + Rx = 10, + RGx = 11, + RGBx = 12, + Depth = 13, + DepthStencil = 14, + sRGB = 15, + sRGBx = 16, + sRGBA = 17, + sBGRA = 18, + ABGR = 19, +} + +enum ImageChannelDataType : uint +{ + SnormInt8 = 0, + SnormInt16 = 1, + UnormInt8 = 2, + UnormInt16 = 3, + UnormShort565 = 4, + UnormShort555 = 5, + UnormInt101010 = 6, + SignedInt8 = 7, + SignedInt16 = 8, + SignedInt32 = 9, + UnsignedInt8 = 10, + UnsignedInt16 = 11, + UnsignedInt32 = 12, + HalfFloat = 13, + Float = 14, + UnormInt24 = 15, + UnormInt101010_2 = 16, +} + +enum ImageOperandsShift : uint +{ + Bias = 0, + Lod = 1, + Grad = 2, + ConstOffset = 3, + Offset = 4, + ConstOffsets = 5, + Sample = 6, + MinLod = 7, + MakeTexelAvailableKHR = 8, + MakeTexelVisibleKHR = 9, + NonPrivateTexelKHR = 10, + VolatileTexelKHR = 11, +} + +enum ImageOperandsMask : uint +{ + MaskNone = 0, + Bias = 0x00000001, + Lod = 0x00000002, + Grad = 0x00000004, + ConstOffset = 0x00000008, + Offset = 0x00000010, + ConstOffsets = 0x00000020, + Sample = 0x00000040, + MinLod = 0x00000080, + MakeTexelAvailableKHR = 0x00000100, + MakeTexelVisibleKHR = 0x00000200, + NonPrivateTexelKHR = 0x00000400, + VolatileTexelKHR = 0x00000800, +} + +enum FPFastMathModeShift : uint +{ + NotNaN = 0, + NotInf = 1, + NSZ = 2, + AllowRecip = 3, + Fast = 4, +} + +enum FPFastMathModeMask : uint +{ + MaskNone = 0, + NotNaN = 0x00000001, + NotInf = 0x00000002, + NSZ = 0x00000004, + AllowRecip = 0x00000008, + Fast = 0x00000010, +} + +enum FPRoundingMode : uint +{ + RTE = 0, + RTZ = 1, + RTP = 2, + RTN = 3, +} + +enum LinkageType : uint +{ + Export = 0, + Import = 1, +} + +enum AccessQualifier : uint +{ + ReadOnly = 0, + WriteOnly = 1, + ReadWrite = 2, +} + +enum FunctionParameterAttribute : uint +{ + Zext = 0, + Sext = 1, + ByVal = 2, + Sret = 3, + NoAlias = 4, + NoCapture = 5, + NoWrite = 6, + NoReadWrite = 7, +} + +enum Decoration : uint +{ + RelaxedPrecision = 0, + SpecId = 1, + Block = 2, + BufferBlock = 3, + RowMajor = 4, + ColMajor = 5, + ArrayStride = 6, + MatrixStride = 7, + GLSLShared = 8, + GLSLPacked = 9, + CPacked = 10, + BuiltIn = 11, + NoPerspective = 13, + Flat = 14, + Patch = 15, + Centroid = 16, + Sample = 17, + Invariant = 18, + Restrict = 19, + Aliased = 20, + Volatile = 21, + Constant = 22, + Coherent = 23, + NonWritable = 24, + NonReadable = 25, + Uniform = 26, + SaturatedConversion = 28, + Stream = 29, + Location = 30, + Component = 31, + Index = 32, + Binding = 33, + DescriptorSet = 34, + Offset = 35, + XfbBuffer = 36, + XfbStride = 37, + FuncParamAttr = 38, + FPRoundingMode = 39, + FPFastMathMode = 40, + LinkageAttributes = 41, + NoContraction = 42, + InputAttachmentIndex = 43, + Alignment = 44, + MaxByteOffset = 45, + AlignmentId = 46, + MaxByteOffsetId = 47, + NoSignedWrap = 4469, + NoUnsignedWrap = 4470, + ExplicitInterpAMD = 4999, + OverrideCoverageNV = 5248, + PassthroughNV = 5250, + ViewportRelativeNV = 5252, + SecondaryViewportRelativeNV = 5256, + PerPrimitiveNV = 5271, + PerViewNV = 5272, + PerTaskNV = 5273, + PerVertexNV = 5285, + NonUniformEXT = 5300, + HlslCounterBufferGOOGLE = 5634, + HlslSemanticGOOGLE = 5635, +} + +enum BuiltIn : uint +{ + Position = 0, + PointSize = 1, + ClipDistance = 3, + CullDistance = 4, + VertexId = 5, + InstanceId = 6, + PrimitiveId = 7, + InvocationId = 8, + Layer = 9, + ViewportIndex = 10, + TessLevelOuter = 11, + TessLevelInner = 12, + TessCoord = 13, + PatchVertices = 14, + FragCoord = 15, + PointCoord = 16, + FrontFacing = 17, + SampleId = 18, + SamplePosition = 19, + SampleMask = 20, + FragDepth = 22, + HelperInvocation = 23, + NumWorkgroups = 24, + WorkgroupSize = 25, + WorkgroupId = 26, + LocalInvocationId = 27, + GlobalInvocationId = 28, + LocalInvocationIndex = 29, + WorkDim = 30, + GlobalSize = 31, + EnqueuedWorkgroupSize = 32, + GlobalOffset = 33, + GlobalLinearId = 34, + SubgroupSize = 36, + SubgroupMaxSize = 37, + NumSubgroups = 38, + NumEnqueuedSubgroups = 39, + SubgroupId = 40, + SubgroupLocalInvocationId = 41, + VertexIndex = 42, + InstanceIndex = 43, + SubgroupEqMask = 4416, + SubgroupEqMaskKHR = 4416, + SubgroupGeMask = 4417, + SubgroupGeMaskKHR = 4417, + SubgroupGtMask = 4418, + SubgroupGtMaskKHR = 4418, + SubgroupLeMask = 4419, + SubgroupLeMaskKHR = 4419, + SubgroupLtMask = 4420, + SubgroupLtMaskKHR = 4420, + BaseVertex = 4424, + BaseInstance = 4425, + DrawIndex = 4426, + DeviceIndex = 4438, + ViewIndex = 4440, + BaryCoordNoPerspAMD = 4992, + BaryCoordNoPerspCentroidAMD = 4993, + BaryCoordNoPerspSampleAMD = 4994, + BaryCoordSmoothAMD = 4995, + BaryCoordSmoothCentroidAMD = 4996, + BaryCoordSmoothSampleAMD = 4997, + BaryCoordPullModelAMD = 4998, + FragStencilRefEXT = 5014, + ViewportMaskNV = 5253, + SecondaryPositionNV = 5257, + SecondaryViewportMaskNV = 5258, + PositionPerViewNV = 5261, + ViewportMaskPerViewNV = 5262, + FullyCoveredEXT = 5264, + TaskCountNV = 5274, + PrimitiveCountNV = 5275, + PrimitiveIndicesNV = 5276, + ClipDistancePerViewNV = 5277, + CullDistancePerViewNV = 5278, + LayerPerViewNV = 5279, + MeshViewCountNV = 5280, + MeshViewIndicesNV = 5281, + BaryCoordNV = 5286, + BaryCoordNoPerspNV = 5287, + FragSizeEXT = 5292, + FragmentSizeNV = 5292, + FragInvocationCountEXT = 5293, + InvocationsPerPixelNV = 5293, + LaunchIdNV = 5319, + LaunchSizeNV = 5320, + WorldRayOriginNV = 5321, + WorldRayDirectionNV = 5322, + ObjectRayOriginNV = 5323, + ObjectRayDirectionNV = 5324, + RayTminNV = 5325, + RayTmaxNV = 5326, + InstanceCustomIndexNV = 5327, + ObjectToWorldNV = 5330, + WorldToObjectNV = 5331, + HitTNV = 5332, + HitKindNV = 5333, + IncomingRayFlagsNV = 5351, +} + +enum SelectionControlShift : uint +{ + Flatten = 0, + DontFlatten = 1, +} + +enum SelectionControlMask : uint +{ + MaskNone = 0, + Flatten = 0x00000001, + DontFlatten = 0x00000002, +} + +enum LoopControlShift : uint +{ + Unroll = 0, + DontUnroll = 1, + DependencyInfinite = 2, + DependencyLength = 3, +} + +enum LoopControlMask : uint +{ + MaskNone = 0, + Unroll = 0x00000001, + DontUnroll = 0x00000002, + DependencyInfinite = 0x00000004, + DependencyLength = 0x00000008, +} + +enum FunctionControlShift : uint +{ + Inline = 0, + DontInline = 1, + Pure = 2, + Const = 3, +} + +enum FunctionControlMask : uint +{ + MaskNone = 0, + Inline = 0x00000001, + DontInline = 0x00000002, + Pure = 0x00000004, + Const = 0x00000008, +} + +enum MemorySemanticsShift : uint +{ + Acquire = 1, + Release = 2, + AcquireRelease = 3, + SequentiallyConsistent = 4, + UniformMemory = 6, + SubgroupMemory = 7, + WorkgroupMemory = 8, + CrossWorkgroupMemory = 9, + AtomicCounterMemory = 10, + ImageMemory = 11, + OutputMemoryKHR = 12, + MakeAvailableKHR = 13, + MakeVisibleKHR = 14, +} + +enum MemorySemanticsMask : uint +{ + MaskNone = 0, + Acquire = 0x00000002, + Release = 0x00000004, + AcquireRelease = 0x00000008, + SequentiallyConsistent = 0x00000010, + UniformMemory = 0x00000040, + SubgroupMemory = 0x00000080, + WorkgroupMemory = 0x00000100, + CrossWorkgroupMemory = 0x00000200, + AtomicCounterMemory = 0x00000400, + ImageMemory = 0x00000800, + OutputMemoryKHR = 0x00001000, + MakeAvailableKHR = 0x00002000, + MakeVisibleKHR = 0x00004000, +} + +enum MemoryAccessShift : uint +{ + Volatile = 0, + Aligned = 1, + Nontemporal = 2, + MakePointerAvailableKHR = 3, + MakePointerVisibleKHR = 4, + NonPrivatePointerKHR = 5, +} + +enum MemoryAccessMask : uint +{ + MaskNone = 0, + Volatile = 0x00000001, + Aligned = 0x00000002, + Nontemporal = 0x00000004, + MakePointerAvailableKHR = 0x00000008, + MakePointerVisibleKHR = 0x00000010, + NonPrivatePointerKHR = 0x00000020, +} + +enum Scope : uint +{ + CrossDevice = 0, + Device = 1, + Workgroup = 2, + Subgroup = 3, + Invocation = 4, + QueueFamilyKHR = 5, +} + +enum GroupOperation : uint +{ + Reduce = 0, + InclusiveScan = 1, + ExclusiveScan = 2, + ClusteredReduce = 3, + PartitionedReduceNV = 6, + PartitionedInclusiveScanNV = 7, + PartitionedExclusiveScanNV = 8, +} + +enum KernelEnqueueFlags : uint +{ + NoWait = 0, + WaitKernel = 1, + WaitWorkGroup = 2, +} + +enum KernelProfilingInfoShift : uint +{ + CmdExecTime = 0, +} + +enum KernelProfilingInfoMask : uint +{ + MaskNone = 0, + CmdExecTime = 0x00000001, +} + +enum Capability : uint +{ + Matrix = 0, + Shader = 1, + Geometry = 2, + Tessellation = 3, + Addresses = 4, + Linkage = 5, + Kernel = 6, + Vector16 = 7, + Float16Buffer = 8, + Float16 = 9, + Float64 = 10, + Int64 = 11, + Int64Atomics = 12, + ImageBasic = 13, + ImageReadWrite = 14, + ImageMipmap = 15, + Pipes = 17, + Groups = 18, + DeviceEnqueue = 19, + LiteralSampler = 20, + AtomicStorage = 21, + Int16 = 22, + TessellationPointSize = 23, + GeometryPointSize = 24, + ImageGatherExtended = 25, + StorageImageMultisample = 27, + UniformBufferArrayDynamicIndexing = 28, + SampledImageArrayDynamicIndexing = 29, + StorageBufferArrayDynamicIndexing = 30, + StorageImageArrayDynamicIndexing = 31, + ClipDistance = 32, + CullDistance = 33, + ImageCubeArray = 34, + SampleRateShading = 35, + ImageRect = 36, + SampledRect = 37, + GenericPointer = 38, + Int8 = 39, + InputAttachment = 40, + SparseResidency = 41, + MinLod = 42, + Sampled1D = 43, + Image1D = 44, + SampledCubeArray = 45, + SampledBuffer = 46, + ImageBuffer = 47, + ImageMSArray = 48, + StorageImageExtendedFormats = 49, + ImageQuery = 50, + DerivativeControl = 51, + InterpolationFunction = 52, + TransformFeedback = 53, + GeometryStreams = 54, + StorageImageReadWithoutFormat = 55, + StorageImageWriteWithoutFormat = 56, + MultiViewport = 57, + SubgroupDispatch = 58, + NamedBarrier = 59, + PipeStorage = 60, + GroupNonUniform = 61, + GroupNonUniformVote = 62, + GroupNonUniformArithmetic = 63, + GroupNonUniformBallot = 64, + GroupNonUniformShuffle = 65, + GroupNonUniformShuffleRelative = 66, + GroupNonUniformClustered = 67, + GroupNonUniformQuad = 68, + SubgroupBallotKHR = 4423, + DrawParameters = 4427, + SubgroupVoteKHR = 4431, + StorageBuffer16BitAccess = 4433, + StorageUniformBufferBlock16 = 4433, + StorageUniform16 = 4434, + UniformAndStorageBuffer16BitAccess = 4434, + StoragePushConstant16 = 4435, + StorageInputOutput16 = 4436, + DeviceGroup = 4437, + MultiView = 4439, + VariablePointersStorageBuffer = 4441, + VariablePointers = 4442, + AtomicStorageOps = 4445, + SampleMaskPostDepthCoverage = 4447, + StorageBuffer8BitAccess = 4448, + UniformAndStorageBuffer8BitAccess = 4449, + StoragePushConstant8 = 4450, + DenormPreserve = 4464, + DenormFlushToZero = 4465, + SignedZeroInfNanPreserve = 4466, + RoundingModeRTE = 4467, + RoundingModeRTZ = 4468, + Float16ImageAMD = 5008, + ImageGatherBiasLodAMD = 5009, + FragmentMaskAMD = 5010, + StencilExportEXT = 5013, + ImageReadWriteLodAMD = 5015, + SampleMaskOverrideCoverageNV = 5249, + GeometryShaderPassthroughNV = 5251, + ShaderViewportIndexLayerEXT = 5254, + ShaderViewportIndexLayerNV = 5254, + ShaderViewportMaskNV = 5255, + ShaderStereoViewNV = 5259, + PerViewAttributesNV = 5260, + FragmentFullyCoveredEXT = 5265, + MeshShadingNV = 5266, + ImageFootprintNV = 5282, + FragmentBarycentricNV = 5284, + ComputeDerivativeGroupQuadsNV = 5288, + FragmentDensityEXT = 5291, + ShadingRateNV = 5291, + GroupNonUniformPartitionedNV = 5297, + ShaderNonUniformEXT = 5301, + RuntimeDescriptorArrayEXT = 5302, + InputAttachmentArrayDynamicIndexingEXT = 5303, + UniformTexelBufferArrayDynamicIndexingEXT = 5304, + StorageTexelBufferArrayDynamicIndexingEXT = 5305, + UniformBufferArrayNonUniformIndexingEXT = 5306, + SampledImageArrayNonUniformIndexingEXT = 5307, + StorageBufferArrayNonUniformIndexingEXT = 5308, + StorageImageArrayNonUniformIndexingEXT = 5309, + InputAttachmentArrayNonUniformIndexingEXT = 5310, + UniformTexelBufferArrayNonUniformIndexingEXT = 5311, + StorageTexelBufferArrayNonUniformIndexingEXT = 5312, + RayTracingNV = 5340, + VulkanMemoryModelKHR = 5345, + VulkanMemoryModelDeviceScopeKHR = 5346, + ComputeDerivativeGroupLinearNV = 5350, + SubgroupShuffleINTEL = 5568, + SubgroupBufferBlockIOINTEL = 5569, + SubgroupImageBlockIOINTEL = 5570, +} + +enum Op : uint +{ + OpNop = 0, + OpUndef = 1, + OpSourceContinued = 2, + OpSource = 3, + OpSourceExtension = 4, + OpName = 5, + OpMemberName = 6, + OpString = 7, + OpLine = 8, + OpExtension = 10, + OpExtInstImport = 11, + OpExtInst = 12, + OpMemoryModel = 14, + OpEntryPoint = 15, + OpExecutionMode = 16, + OpCapability = 17, + OpTypeVoid = 19, + OpTypeBool = 20, + OpTypeInt = 21, + OpTypeFloat = 22, + OpTypeVector = 23, + OpTypeMatrix = 24, + OpTypeImage = 25, + OpTypeSampler = 26, + OpTypeSampledImage = 27, + OpTypeArray = 28, + OpTypeRuntimeArray = 29, + OpTypeStruct = 30, + OpTypeOpaque = 31, + OpTypePointer = 32, + OpTypeFunction = 33, + OpTypeEvent = 34, + OpTypeDeviceEvent = 35, + OpTypeReserveId = 36, + OpTypeQueue = 37, + OpTypePipe = 38, + OpTypeForwardPointer = 39, + OpConstantTrue = 41, + OpConstantFalse = 42, + OpConstant = 43, + OpConstantComposite = 44, + OpConstantSampler = 45, + OpConstantNull = 46, + OpSpecConstantTrue = 48, + OpSpecConstantFalse = 49, + OpSpecConstant = 50, + OpSpecConstantComposite = 51, + OpSpecConstantOp = 52, + OpFunction = 54, + OpFunctionParameter = 55, + OpFunctionEnd = 56, + OpFunctionCall = 57, + OpVariable = 59, + OpImageTexelPointer = 60, + OpLoad = 61, + OpStore = 62, + OpCopyMemory = 63, + OpCopyMemorySized = 64, + OpAccessChain = 65, + OpInBoundsAccessChain = 66, + OpPtrAccessChain = 67, + OpArrayLength = 68, + OpGenericPtrMemSemantics = 69, + OpInBoundsPtrAccessChain = 70, + OpDecorate = 71, + OpMemberDecorate = 72, + OpDecorationGroup = 73, + OpGroupDecorate = 74, + OpGroupMemberDecorate = 75, + OpVectorExtractDynamic = 77, + OpVectorInsertDynamic = 78, + OpVectorShuffle = 79, + OpCompositeConstruct = 80, + OpCompositeExtract = 81, + OpCompositeInsert = 82, + OpCopyObject = 83, + OpTranspose = 84, + OpSampledImage = 86, + OpImageSampleImplicitLod = 87, + OpImageSampleExplicitLod = 88, + OpImageSampleDrefImplicitLod = 89, + OpImageSampleDrefExplicitLod = 90, + OpImageSampleProjImplicitLod = 91, + OpImageSampleProjExplicitLod = 92, + OpImageSampleProjDrefImplicitLod = 93, + OpImageSampleProjDrefExplicitLod = 94, + OpImageFetch = 95, + OpImageGather = 96, + OpImageDrefGather = 97, + OpImageRead = 98, + OpImageWrite = 99, + OpImage = 100, + OpImageQueryFormat = 101, + OpImageQueryOrder = 102, + OpImageQuerySizeLod = 103, + OpImageQuerySize = 104, + OpImageQueryLod = 105, + OpImageQueryLevels = 106, + OpImageQuerySamples = 107, + OpConvertFToU = 109, + OpConvertFToS = 110, + OpConvertSToF = 111, + OpConvertUToF = 112, + OpUConvert = 113, + OpSConvert = 114, + OpFConvert = 115, + OpQuantizeToF16 = 116, + OpConvertPtrToU = 117, + OpSatConvertSToU = 118, + OpSatConvertUToS = 119, + OpConvertUToPtr = 120, + OpPtrCastToGeneric = 121, + OpGenericCastToPtr = 122, + OpGenericCastToPtrExplicit = 123, + OpBitcast = 124, + OpSNegate = 126, + OpFNegate = 127, + OpIAdd = 128, + OpFAdd = 129, + OpISub = 130, + OpFSub = 131, + OpIMul = 132, + OpFMul = 133, + OpUDiv = 134, + OpSDiv = 135, + OpFDiv = 136, + OpUMod = 137, + OpSRem = 138, + OpSMod = 139, + OpFRem = 140, + OpFMod = 141, + OpVectorTimesScalar = 142, + OpMatrixTimesScalar = 143, + OpVectorTimesMatrix = 144, + OpMatrixTimesVector = 145, + OpMatrixTimesMatrix = 146, + OpOuterProduct = 147, + OpDot = 148, + OpIAddCarry = 149, + OpISubBorrow = 150, + OpUMulExtended = 151, + OpSMulExtended = 152, + OpAny = 154, + OpAll = 155, + OpIsNan = 156, + OpIsInf = 157, + OpIsFinite = 158, + OpIsNormal = 159, + OpSignBitSet = 160, + OpLessOrGreater = 161, + OpOrdered = 162, + OpUnordered = 163, + OpLogicalEqual = 164, + OpLogicalNotEqual = 165, + OpLogicalOr = 166, + OpLogicalAnd = 167, + OpLogicalNot = 168, + OpSelect = 169, + OpIEqual = 170, + OpINotEqual = 171, + OpUGreaterThan = 172, + OpSGreaterThan = 173, + OpUGreaterThanEqual = 174, + OpSGreaterThanEqual = 175, + OpULessThan = 176, + OpSLessThan = 177, + OpULessThanEqual = 178, + OpSLessThanEqual = 179, + OpFOrdEqual = 180, + OpFUnordEqual = 181, + OpFOrdNotEqual = 182, + OpFUnordNotEqual = 183, + OpFOrdLessThan = 184, + OpFUnordLessThan = 185, + OpFOrdGreaterThan = 186, + OpFUnordGreaterThan = 187, + OpFOrdLessThanEqual = 188, + OpFUnordLessThanEqual = 189, + OpFOrdGreaterThanEqual = 190, + OpFUnordGreaterThanEqual = 191, + OpShiftRightLogical = 194, + OpShiftRightArithmetic = 195, + OpShiftLeftLogical = 196, + OpBitwiseOr = 197, + OpBitwiseXor = 198, + OpBitwiseAnd = 199, + OpNot = 200, + OpBitFieldInsert = 201, + OpBitFieldSExtract = 202, + OpBitFieldUExtract = 203, + OpBitReverse = 204, + OpBitCount = 205, + OpDPdx = 207, + OpDPdy = 208, + OpFwidth = 209, + OpDPdxFine = 210, + OpDPdyFine = 211, + OpFwidthFine = 212, + OpDPdxCoarse = 213, + OpDPdyCoarse = 214, + OpFwidthCoarse = 215, + OpEmitVertex = 218, + OpEndPrimitive = 219, + OpEmitStreamVertex = 220, + OpEndStreamPrimitive = 221, + OpControlBarrier = 224, + OpMemoryBarrier = 225, + OpAtomicLoad = 227, + OpAtomicStore = 228, + OpAtomicExchange = 229, + OpAtomicCompareExchange = 230, + OpAtomicCompareExchangeWeak = 231, + OpAtomicIIncrement = 232, + OpAtomicIDecrement = 233, + OpAtomicIAdd = 234, + OpAtomicISub = 235, + OpAtomicSMin = 236, + OpAtomicUMin = 237, + OpAtomicSMax = 238, + OpAtomicUMax = 239, + OpAtomicAnd = 240, + OpAtomicOr = 241, + OpAtomicXor = 242, + OpPhi = 245, + OpLoopMerge = 246, + OpSelectionMerge = 247, + OpLabel = 248, + OpBranch = 249, + OpBranchConditional = 250, + OpSwitch = 251, + OpKill = 252, + OpReturn = 253, + OpReturnValue = 254, + OpUnreachable = 255, + OpLifetimeStart = 256, + OpLifetimeStop = 257, + OpGroupAsyncCopy = 259, + OpGroupWaitEvents = 260, + OpGroupAll = 261, + OpGroupAny = 262, + OpGroupBroadcast = 263, + OpGroupIAdd = 264, + OpGroupFAdd = 265, + OpGroupFMin = 266, + OpGroupUMin = 267, + OpGroupSMin = 268, + OpGroupFMax = 269, + OpGroupUMax = 270, + OpGroupSMax = 271, + OpReadPipe = 274, + OpWritePipe = 275, + OpReservedReadPipe = 276, + OpReservedWritePipe = 277, + OpReserveReadPipePackets = 278, + OpReserveWritePipePackets = 279, + OpCommitReadPipe = 280, + OpCommitWritePipe = 281, + OpIsValidReserveId = 282, + OpGetNumPipePackets = 283, + OpGetMaxPipePackets = 284, + OpGroupReserveReadPipePackets = 285, + OpGroupReserveWritePipePackets = 286, + OpGroupCommitReadPipe = 287, + OpGroupCommitWritePipe = 288, + OpEnqueueMarker = 291, + OpEnqueueKernel = 292, + OpGetKernelNDrangeSubGroupCount = 293, + OpGetKernelNDrangeMaxSubGroupSize = 294, + OpGetKernelWorkGroupSize = 295, + OpGetKernelPreferredWorkGroupSizeMultiple = 296, + OpRetainEvent = 297, + OpReleaseEvent = 298, + OpCreateUserEvent = 299, + OpIsValidEvent = 300, + OpSetUserEventStatus = 301, + OpCaptureEventProfilingInfo = 302, + OpGetDefaultQueue = 303, + OpBuildNDRange = 304, + OpImageSparseSampleImplicitLod = 305, + OpImageSparseSampleExplicitLod = 306, + OpImageSparseSampleDrefImplicitLod = 307, + OpImageSparseSampleDrefExplicitLod = 308, + OpImageSparseSampleProjImplicitLod = 309, + OpImageSparseSampleProjExplicitLod = 310, + OpImageSparseSampleProjDrefImplicitLod = 311, + OpImageSparseSampleProjDrefExplicitLod = 312, + OpImageSparseFetch = 313, + OpImageSparseGather = 314, + OpImageSparseDrefGather = 315, + OpImageSparseTexelsResident = 316, + OpNoLine = 317, + OpAtomicFlagTestAndSet = 318, + OpAtomicFlagClear = 319, + OpImageSparseRead = 320, + OpSizeOf = 321, + OpTypePipeStorage = 322, + OpConstantPipeStorage = 323, + OpCreatePipeFromPipeStorage = 324, + OpGetKernelLocalSizeForSubgroupCount = 325, + OpGetKernelMaxNumSubgroups = 326, + OpTypeNamedBarrier = 327, + OpNamedBarrierInitialize = 328, + OpMemoryNamedBarrier = 329, + OpModuleProcessed = 330, + OpExecutionModeId = 331, + OpDecorateId = 332, + OpGroupNonUniformElect = 333, + OpGroupNonUniformAll = 334, + OpGroupNonUniformAny = 335, + OpGroupNonUniformAllEqual = 336, + OpGroupNonUniformBroadcast = 337, + OpGroupNonUniformBroadcastFirst = 338, + OpGroupNonUniformBallot = 339, + OpGroupNonUniformInverseBallot = 340, + OpGroupNonUniformBallotBitExtract = 341, + OpGroupNonUniformBallotBitCount = 342, + OpGroupNonUniformBallotFindLSB = 343, + OpGroupNonUniformBallotFindMSB = 344, + OpGroupNonUniformShuffle = 345, + OpGroupNonUniformShuffleXor = 346, + OpGroupNonUniformShuffleUp = 347, + OpGroupNonUniformShuffleDown = 348, + OpGroupNonUniformIAdd = 349, + OpGroupNonUniformFAdd = 350, + OpGroupNonUniformIMul = 351, + OpGroupNonUniformFMul = 352, + OpGroupNonUniformSMin = 353, + OpGroupNonUniformUMin = 354, + OpGroupNonUniformFMin = 355, + OpGroupNonUniformSMax = 356, + OpGroupNonUniformUMax = 357, + OpGroupNonUniformFMax = 358, + OpGroupNonUniformBitwiseAnd = 359, + OpGroupNonUniformBitwiseOr = 360, + OpGroupNonUniformBitwiseXor = 361, + OpGroupNonUniformLogicalAnd = 362, + OpGroupNonUniformLogicalOr = 363, + OpGroupNonUniformLogicalXor = 364, + OpGroupNonUniformQuadBroadcast = 365, + OpGroupNonUniformQuadSwap = 366, + OpSubgroupBallotKHR = 4421, + OpSubgroupFirstInvocationKHR = 4422, + OpSubgroupAllKHR = 4428, + OpSubgroupAnyKHR = 4429, + OpSubgroupAllEqualKHR = 4430, + OpSubgroupReadInvocationKHR = 4432, + OpGroupIAddNonUniformAMD = 5000, + OpGroupFAddNonUniformAMD = 5001, + OpGroupFMinNonUniformAMD = 5002, + OpGroupUMinNonUniformAMD = 5003, + OpGroupSMinNonUniformAMD = 5004, + OpGroupFMaxNonUniformAMD = 5005, + OpGroupUMaxNonUniformAMD = 5006, + OpGroupSMaxNonUniformAMD = 5007, + OpFragmentMaskFetchAMD = 5011, + OpFragmentFetchAMD = 5012, + OpImageSampleFootprintNV = 5283, + OpGroupNonUniformPartitionNV = 5296, + OpWritePackedPrimitiveIndices4x8NV = 5299, + OpReportIntersectionNV = 5334, + OpIgnoreIntersectionNV = 5335, + OpTerminateRayNV = 5336, + OpTraceNV = 5337, + OpTypeAccelerationStructureNV = 5341, + OpExecuteCallableNV = 5344, + OpSubgroupShuffleINTEL = 5571, + OpSubgroupShuffleDownINTEL = 5572, + OpSubgroupShuffleUpINTEL = 5573, + OpSubgroupShuffleXorINTEL = 5574, + OpSubgroupBlockReadINTEL = 5575, + OpSubgroupBlockWriteINTEL = 5576, + OpSubgroupImageBlockReadINTEL = 5577, + OpSubgroupImageBlockWriteINTEL = 5578, + OpDecorateStringGOOGLE = 5632, + OpMemberDecorateStringGOOGLE = 5633, +} + + diff --git a/3rdparty/spirv-tools/external/SPIRV-Headers/tools/buildHeaders/CMakeLists.txt b/3rdparty/spirv-tools/external/SPIRV-Headers/tools/buildHeaders/CMakeLists.txt old mode 100755 new mode 100644 diff --git a/3rdparty/spirv-tools/external/SPIRV-Headers/tools/buildHeaders/bin/makeHeaders b/3rdparty/spirv-tools/external/SPIRV-Headers/tools/buildHeaders/bin/makeHeaders index bf2c61515..47d221864 100755 --- a/3rdparty/spirv-tools/external/SPIRV-Headers/tools/buildHeaders/bin/makeHeaders +++ b/3rdparty/spirv-tools/external/SPIRV-Headers/tools/buildHeaders/bin/makeHeaders @@ -2,4 +2,4 @@ cd ../../include/spirv/unified1 ../../../tools/buildHeaders/build/install/bin/buildSpvHeaders -H spirv.core.grammar.json -dos2unix spirv.* +dos2unix spirv.* SpirV.* spv.* diff --git a/3rdparty/spirv-tools/external/SPIRV-Headers/tools/buildHeaders/header.cpp b/3rdparty/spirv-tools/external/SPIRV-Headers/tools/buildHeaders/header.cpp old mode 100755 new mode 100644 index b8b227f3b..7d5cd98c0 --- a/3rdparty/spirv-tools/external/SPIRV-Headers/tools/buildHeaders/header.cpp +++ b/3rdparty/spirv-tools/external/SPIRV-Headers/tools/buildHeaders/header.cpp @@ -1,19 +1,19 @@ -// Copyright (c) 2014-2018 The Khronos Group Inc. -// +// Copyright (c) 2014-2019 The Khronos Group Inc. +// // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and/or associated documentation files (the "Materials"), // to deal in the Materials without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Materials, and to permit persons to whom the // Materials are furnished to do so, subject to the following conditions: -// +// // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Materials. -// +// // MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS // STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND -// HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/ -// +// HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/ +// // THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL @@ -69,8 +69,8 @@ namespace { static const int DocMagicNumber = 0x07230203; static const int DocVersion = 0x00010300; - static const int DocRevision = 1; - #define DocRevisionString "1" + static const int DocRevision = 6; + #define DocRevisionString "6" static const std::string DocCopyright; static const std::string DocComment1; static const std::string DocComment2; @@ -97,7 +97,7 @@ namespace { virtual void printEpilogue(std::ostream&) const { } virtual void printMeta(std::ostream&) const; virtual void printTypes(std::ostream&) const { } - + virtual std::string escapeComment(const std::string& s) const; // Default printComments() uses these comment strings @@ -107,7 +107,7 @@ namespace { virtual std::string commentEOL(bool isLast) const { return ""; } typedef std::pair valpair_t; - + // for printing enum values virtual std::string enumBeg(const std::string&, enumStyle_t) const { return ""; } virtual std::string enumEnd(const std::string&, enumStyle_t, bool isLast = false) const { @@ -126,7 +126,7 @@ namespace { const char* fmt, bool isLast = false) const { return ""; } - + std::vector getSortedVals(const Json::Value&) const; virtual std::string indent(int count = 1) const { @@ -149,7 +149,7 @@ namespace { } void addComment(Json::Value& node, const std::string& str); - + Json::Value spvRoot; // JSON SPIR-V data }; @@ -167,7 +167,7 @@ namespace { } const std::string TPrinter::DocCopyright = - "Copyright (c) 2014-2018 The Khronos Group Inc.\n" + "Copyright (c) 2014-2019 The Khronos Group Inc.\n" "\n" "Permission is hereby granted, free of charge, to any person obtaining a copy\n" "of this software and/or associated documentation files (the \"Materials\"),\n" @@ -197,13 +197,16 @@ namespace { const std::string TPrinter::DocComment2 = "Enumeration tokens for SPIR-V, in various styles:\n" - " C, C++, C++11, JSON, Lua, Python\n" + " C, C++, C++11, JSON, Lua, Python, C#, D\n" "\n" "- C will have tokens with a \"Spv\" prefix, e.g.: SpvSourceLanguageGLSL\n" "- C++ will have tokens in the \"spv\" name space, e.g.: spv::SourceLanguageGLSL\n" "- C++11 will use enum classes in the spv namespace, e.g.: spv::SourceLanguage::GLSL\n" "- Lua will use tables, e.g.: spv.SourceLanguage.GLSL\n" "- Python will use dictionaries, e.g.: spv['SourceLanguage']['GLSL']\n" + "- C# will use enum classes in the Specification class located in the \"Spv\" namespace,\n" + " e.g.: Spv.Specification.SourceLanguage.GLSL\n" + "- D will have tokens under the \"spv\" module, e.g: spv.SourceLanguage.GLSL\n" "\n" "Some tokens act like mask values, which can be OR'd together,\n" "while others are mutually exclusive. The mask-like ones have\n" @@ -290,7 +293,7 @@ namespace { { const int commentCount = spvRoot["spv"]["meta"]["Comment"].size(); int commentNum = 0; - + for (const auto& comment : spvRoot["spv"]["meta"]["Comment"]) { out << commentBeg(); @@ -322,7 +325,7 @@ namespace { void TPrinter::printDefs(std::ostream& out) const { const Json::Value& enums = spvRoot["spv"]["enum"]; - + for (auto opClass = enums.begin(); opClass != enums.end(); ++opClass) { const bool isMask = (*opClass)["Type"].asString() == "Bit"; const auto opName = (*opClass)["Name"].asString(); @@ -337,8 +340,8 @@ namespace { out << enumFmt(opPrefix, valpair_t(0, "MaskNone"), enumNoMask); const auto sorted = getSortedVals((*opClass)["Values"]); - - std::string maxEnum = maxEnumFmt(opName, valpair_t(0x7FFFFFFF, "Max"), enumHex); + + std::string maxEnum = maxEnumFmt(opName, valpair_t(0x7FFFFFFF, "Max"), enumHex); bool printMax = (style != enumMask && maxEnum.size() > 0); @@ -390,7 +393,7 @@ namespace { } return newStr; } - + std::string fmtConstInt(unsigned val, const std::string& name, const char* fmt, bool isLast) const override { return indent(3) + '"' + name + "\": " + fmtNum("%d", val) + (isLast ? "\n" : ",\n"); @@ -488,7 +491,7 @@ namespace { return std::string("static const unsigned int ") + pre() + name + " = " + fmtNum(fmt, val) + (isLast ? ";\n\n" : ";\n"); } - + virtual std::string pre() const { return ""; } // C name prefix virtual std::string headerGuardSuffix() const = 0; }; @@ -542,7 +545,7 @@ namespace { if (isMask) { const auto typeName = opName + styleStr(enumMask); - + out << "inline " + typeName + " operator|(" + typeName + " a, " + typeName + " b) { return " + typeName + "(unsigned(a) | unsigned(b)); }\n"; } @@ -554,7 +557,7 @@ namespace { std::string commentBOL() const override { return "// "; } - + virtual std::string enumBeg(const std::string& s, enumStyle_t style) const override { return std::string("enum ") + s + styleStr(style) + " {\n"; } @@ -658,6 +661,76 @@ namespace { } }; + // C# printer + class TPrinterCSharp final : public TPrinter { + private: + std::string commentBOL() const override { return "// "; } + + void printPrologue(std::ostream& out) const override { + out << "namespace Spv\n{\n\n"; + out << indent() << "public static class Specification\n"; + out << indent() << "{\n"; + } + + void printEpilogue(std::ostream& out) const override { + out << indent() << "}\n"; + out << "}\n"; + } + + std::string enumBeg(const std::string& s, enumStyle_t style) const override { + return indent(2) + "public enum " + s + styleStr(style) + "\n" + indent(2) + "{\n"; + } + + std::string enumEnd(const std::string& s, enumStyle_t style, bool isLast) const override { + return indent(2) + "}" + + (isLast ? "\n" : "\n\n"); + } + + std::string enumFmt(const std::string& s, const valpair_t& v, + enumStyle_t style, bool isLast) const override { + return indent(3) + prependIfDigit(s, v.second) + " = " + fmtStyleVal(v.first, style) + ",\n"; + } + + std::string fmtConstInt(unsigned val, const std::string& name, + const char* fmt, bool isLast) const override { + return indent(2) + std::string("public const uint ") + name + + " = " + fmtNum(fmt, val) + (isLast ? ";\n\n" : ";\n"); + } + }; + + // D printer + class TPrinterD final : public TPrinter { + private: + std::string commentBeg() const override { return "/+\n"; } + std::string commentBOL() const override { return " + "; } + std::string commentEnd(bool isLast) const override { return " +/\n"; } + + void printPrologue(std::ostream& out) const override { + out << "module spv;\n\n"; + } + + void printEpilogue(std::ostream& out) const override { + } + + std::string enumBeg(const std::string& s, enumStyle_t style) const override { + return "enum " + s + styleStr(style) + " : uint\n{\n"; + } + + std::string enumEnd(const std::string& s, enumStyle_t style, bool isLast) const override { + return std::string("}\n\n"); + } + + std::string enumFmt(const std::string& s, const valpair_t& v, + enumStyle_t style, bool isLast) const override { + return indent() + prependIfDigit("_", v.second) + " = " + fmtStyleVal(v.first, style) + ",\n"; + } + + std::string fmtConstInt(unsigned val, const std::string& name, + const char* fmt, bool isLast) const override { + return std::string("enum uint ") + name + + " = " + fmtNum(fmt, val) + (isLast ? ";\n\n" : ";\n"); + } + }; + } // namespace namespace spv { @@ -672,6 +745,8 @@ namespace spv { langInfo.push_back(std::make_pair(ELangJSON, "spirv.json")); langInfo.push_back(std::make_pair(ELangLua, "spirv.lua")); langInfo.push_back(std::make_pair(ELangPython, "spirv.py")); + langInfo.push_back(std::make_pair(ELangCSharp, "spirv.cs")); + langInfo.push_back(std::make_pair(ELangD, "spv.d")); for (const auto& lang : langInfo) { std::ofstream out(lang.second, std::ios::out); @@ -697,6 +772,8 @@ namespace spv { case ELangJSON: p = TPrinterPtr(new TPrinterJSON); break; case ELangLua: p = TPrinterPtr(new TPrinterLua); break; case ELangPython: p = TPrinterPtr(new TPrinterPython); break; + case ELangCSharp: p = TPrinterPtr(new TPrinterCSharp); break; + case ELangD: p = TPrinterPtr(new TPrinterD); break; case ELangAll: PrintAllHeaders(); break; default: std::cerr << "Unknown language." << std::endl; diff --git a/3rdparty/spirv-tools/external/SPIRV-Headers/tools/buildHeaders/header.h b/3rdparty/spirv-tools/external/SPIRV-Headers/tools/buildHeaders/header.h old mode 100755 new mode 100644 index 5a0952db2..9c34b2112 --- a/3rdparty/spirv-tools/external/SPIRV-Headers/tools/buildHeaders/header.h +++ b/3rdparty/spirv-tools/external/SPIRV-Headers/tools/buildHeaders/header.h @@ -1,19 +1,19 @@ -// Copyright (c) 2014-2018 The Khronos Group Inc. -// +// Copyright (c) 2014-2019 The Khronos Group Inc. +// // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and/or associated documentation files (the "Materials"), // to deal in the Materials without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Materials, and to permit persons to whom the // Materials are furnished to do so, subject to the following conditions: -// +// // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Materials. -// +// // MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS // STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND -// HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/ -// +// HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/ +// // THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL @@ -41,6 +41,8 @@ namespace spv { ELangJSON, // JSON ELangLua, // Lua ELangPython, // Python + ELangCSharp, // CSharp + ELangD, // D ELangAll, // print headers in all languages to files }; diff --git a/3rdparty/spirv-tools/external/SPIRV-Headers/tools/buildHeaders/jsonToSpirv.cpp b/3rdparty/spirv-tools/external/SPIRV-Headers/tools/buildHeaders/jsonToSpirv.cpp old mode 100755 new mode 100644 index bb325661e..62b85a8f8 --- a/3rdparty/spirv-tools/external/SPIRV-Headers/tools/buildHeaders/jsonToSpirv.cpp +++ b/3rdparty/spirv-tools/external/SPIRV-Headers/tools/buildHeaders/jsonToSpirv.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2014-2018 The Khronos Group Inc. +// Copyright (c) 2014-2019 The Khronos Group Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and/or associated documentation files (the "Materials"), diff --git a/3rdparty/spirv-tools/external/SPIRV-Headers/tools/buildHeaders/jsonToSpirv.h b/3rdparty/spirv-tools/external/SPIRV-Headers/tools/buildHeaders/jsonToSpirv.h old mode 100755 new mode 100644 index 00a2f70d9..bc63a4dfd --- a/3rdparty/spirv-tools/external/SPIRV-Headers/tools/buildHeaders/jsonToSpirv.h +++ b/3rdparty/spirv-tools/external/SPIRV-Headers/tools/buildHeaders/jsonToSpirv.h @@ -1,4 +1,4 @@ -// Copyright (c) 2014-2018 The Khronos Group Inc. +// Copyright (c) 2014-2019 The Khronos Group Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and/or associated documentation files (the "Materials"), diff --git a/3rdparty/spirv-tools/external/SPIRV-Headers/tools/buildHeaders/main.cpp b/3rdparty/spirv-tools/external/SPIRV-Headers/tools/buildHeaders/main.cpp old mode 100755 new mode 100644 index e146b39b4..67d676c72 --- a/3rdparty/spirv-tools/external/SPIRV-Headers/tools/buildHeaders/main.cpp +++ b/3rdparty/spirv-tools/external/SPIRV-Headers/tools/buildHeaders/main.cpp @@ -1,19 +1,19 @@ -// Copyright (c) 2014-2018 The Khronos Group Inc. -// +// Copyright (c) 2014-2019 The Khronos Group Inc. +// // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and/or associated documentation files (the "Materials"), // to deal in the Materials without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Materials, and to permit persons to whom the // Materials are furnished to do so, subject to the following conditions: -// +// // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Materials. -// +// // MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS // STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND -// HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/ -// +// HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/ +// // THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL @@ -50,6 +50,8 @@ void Usage() " JSON - JSON format data\n" " Lua - Lua module\n" " Python - Python module (also accepts Py)\n" + " C# - C# module (also accepts CSharp)\n" + " D - D module\n" " -H print header in all supported languages to files in current directory\n" ); } @@ -90,6 +92,10 @@ bool ProcessArguments(int argc, char* argv[]) Language = spv::ELangLua; } else if (language == "python" || language == "py") { Language = spv::ELangPython; + } else if (language == "c#" || language == "csharp") { + Language = spv::ELangCSharp; + } else if (language == "d") { + Language = spv::ELangD; } else return false; diff --git a/3rdparty/spirv-tools/include/generated/build-version.inc b/3rdparty/spirv-tools/include/generated/build-version.inc index 311820b73..cd8e96fee 100644 --- a/3rdparty/spirv-tools/include/generated/build-version.inc +++ b/3rdparty/spirv-tools/include/generated/build-version.inc @@ -1 +1 @@ -"v2018.5-dev", "SPIRV-Tools v2018.5-dev v2018.4-149-g58e53ea" +"v2018.7-dev", "SPIRV-Tools v2018.7-dev bc65303576278bfb67295395327dc395a6adbf98" diff --git a/3rdparty/spirv-tools/include/generated/core.insts-unified1.inc b/3rdparty/spirv-tools/include/generated/core.insts-unified1.inc index e7e16db6b..fdb05b10c 100644 --- a/3rdparty/spirv-tools/include/generated/core.insts-unified1.inc +++ b/3rdparty/spirv-tools/include/generated/core.insts-unified1.inc @@ -14,14 +14,17 @@ static const SpvCapability pygen_variable_caps_GroupNonUniformShuffle[] = {SpvCa static const SpvCapability pygen_variable_caps_GroupNonUniformShuffleRelative[] = {SpvCapabilityGroupNonUniformShuffleRelative}; static const SpvCapability pygen_variable_caps_GroupNonUniformVote[] = {SpvCapabilityGroupNonUniformVote}; static const SpvCapability pygen_variable_caps_Groups[] = {SpvCapabilityGroups}; +static const SpvCapability pygen_variable_caps_ImageFootprintNV[] = {SpvCapabilityImageFootprintNV}; static const SpvCapability pygen_variable_caps_ImageQuery[] = {SpvCapabilityImageQuery}; static const SpvCapability pygen_variable_caps_Kernel[] = {SpvCapabilityKernel}; static const SpvCapability pygen_variable_caps_KernelImageQuery[] = {SpvCapabilityKernel, SpvCapabilityImageQuery}; static const SpvCapability pygen_variable_caps_LiteralSampler[] = {SpvCapabilityLiteralSampler}; static const SpvCapability pygen_variable_caps_Matrix[] = {SpvCapabilityMatrix}; +static const SpvCapability pygen_variable_caps_MeshShadingNV[] = {SpvCapabilityMeshShadingNV}; static const SpvCapability pygen_variable_caps_NamedBarrier[] = {SpvCapabilityNamedBarrier}; static const SpvCapability pygen_variable_caps_PipeStorage[] = {SpvCapabilityPipeStorage}; static const SpvCapability pygen_variable_caps_Pipes[] = {SpvCapabilityPipes}; +static const SpvCapability pygen_variable_caps_RayTracingNV[] = {SpvCapabilityRayTracingNV}; static const SpvCapability pygen_variable_caps_Shader[] = {SpvCapabilityShader}; static const SpvCapability pygen_variable_caps_SparseResidency[] = {SpvCapabilitySparseResidency}; static const SpvCapability pygen_variable_caps_SubgroupBallotKHR[] = {SpvCapabilitySubgroupBallotKHR}; @@ -37,6 +40,9 @@ static const spvtools::Extension pygen_variable_exts_SPV_GOOGLE_decorate_stringS static const spvtools::Extension pygen_variable_exts_SPV_GOOGLE_hlsl_functionality1[] = {spvtools::Extension::kSPV_GOOGLE_hlsl_functionality1}; static const spvtools::Extension pygen_variable_exts_SPV_KHR_shader_ballot[] = {spvtools::Extension::kSPV_KHR_shader_ballot}; static const spvtools::Extension pygen_variable_exts_SPV_KHR_subgroup_vote[] = {spvtools::Extension::kSPV_KHR_subgroup_vote}; +static const spvtools::Extension pygen_variable_exts_SPV_NV_mesh_shader[] = {spvtools::Extension::kSPV_NV_mesh_shader}; +static const spvtools::Extension pygen_variable_exts_SPV_NV_ray_tracing[] = {spvtools::Extension::kSPV_NV_ray_tracing}; +static const spvtools::Extension pygen_variable_exts_SPV_NV_shader_image_footprint[] = {spvtools::Extension::kSPV_NV_shader_image_footprint}; static const spvtools::Extension pygen_variable_exts_SPV_NV_shader_subgroup_partitioned[] = {spvtools::Extension::kSPV_NV_shader_subgroup_partitioned}; static const spv_opcode_desc_t kOpcodeTableEntries[] = { @@ -396,7 +402,15 @@ static const spv_opcode_desc_t kOpcodeTableEntries[] = { {"GroupSMaxNonUniformAMD", SpvOpGroupSMaxNonUniformAMD, 1, pygen_variable_caps_Groups, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_SCOPE_ID, SPV_OPERAND_TYPE_GROUP_OPERATION, SPV_OPERAND_TYPE_ID}, 1, 1, 1, pygen_variable_exts_SPV_AMD_shader_ballot, 0xffffffffu}, {"FragmentMaskFetchAMD", SpvOpFragmentMaskFetchAMD, 1, pygen_variable_caps_FragmentMaskAMD, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 1, pygen_variable_exts_SPV_AMD_shader_fragment_mask, 0xffffffffu}, {"FragmentFetchAMD", SpvOpFragmentFetchAMD, 1, pygen_variable_caps_FragmentMaskAMD, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 1, pygen_variable_exts_SPV_AMD_shader_fragment_mask, 0xffffffffu}, + {"ImageSampleFootprintNV", SpvOpImageSampleFootprintNV, 1, pygen_variable_caps_ImageFootprintNV, 7, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_OPTIONAL_IMAGE}, 1, 1, 1, pygen_variable_exts_SPV_NV_shader_image_footprint, 0xffffffffu}, {"GroupNonUniformPartitionNV", SpvOpGroupNonUniformPartitionNV, 1, pygen_variable_caps_GroupNonUniformPartitionedNV, 3, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 1, pygen_variable_exts_SPV_NV_shader_subgroup_partitioned, 0xffffffffu}, + {"WritePackedPrimitiveIndices4x8NV", SpvOpWritePackedPrimitiveIndices4x8NV, 1, pygen_variable_caps_MeshShadingNV, 2, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 0, 0, 1, pygen_variable_exts_SPV_NV_mesh_shader, 0xffffffffu}, + {"ReportIntersectionNV", SpvOpReportIntersectionNV, 1, pygen_variable_caps_RayTracingNV, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 1, pygen_variable_exts_SPV_NV_ray_tracing, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"IgnoreIntersectionNV", SpvOpIgnoreIntersectionNV, 1, pygen_variable_caps_RayTracingNV, 0, {}, 0, 0, 1, pygen_variable_exts_SPV_NV_ray_tracing, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"TerminateRayNV", SpvOpTerminateRayNV, 1, pygen_variable_caps_RayTracingNV, 0, {}, 0, 0, 1, pygen_variable_exts_SPV_NV_ray_tracing, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"TraceNV", SpvOpTraceNV, 1, pygen_variable_caps_RayTracingNV, 11, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 0, 0, 1, pygen_variable_exts_SPV_NV_ray_tracing, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"TypeAccelerationStructureNV", SpvOpTypeAccelerationStructureNV, 1, pygen_variable_caps_RayTracingNV, 1, {SPV_OPERAND_TYPE_RESULT_ID}, 1, 0, 1, pygen_variable_exts_SPV_NV_ray_tracing, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ExecuteCallableNV", SpvOpExecuteCallableNV, 1, pygen_variable_caps_RayTracingNV, 2, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 0, 0, 1, pygen_variable_exts_SPV_NV_ray_tracing, SPV_SPIRV_VERSION_WORD(1, 0)}, {"SubgroupShuffleINTEL", SpvOpSubgroupShuffleINTEL, 1, pygen_variable_caps_SubgroupShuffleINTEL, 4, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, 0xffffffffu}, {"SubgroupShuffleDownINTEL", SpvOpSubgroupShuffleDownINTEL, 1, pygen_variable_caps_SubgroupShuffleINTEL, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, 0xffffffffu}, {"SubgroupShuffleUpINTEL", SpvOpSubgroupShuffleUpINTEL, 1, pygen_variable_caps_SubgroupShuffleINTEL, 5, {SPV_OPERAND_TYPE_TYPE_ID, SPV_OPERAND_TYPE_RESULT_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, 1, 1, 0, nullptr, 0xffffffffu}, diff --git a/3rdparty/spirv-tools/include/generated/enum_string_mapping.inc b/3rdparty/spirv-tools/include/generated/enum_string_mapping.inc index 964b142d9..fce3b6c2c 100644 --- a/3rdparty/spirv-tools/include/generated/enum_string_mapping.inc +++ b/3rdparty/spirv-tools/include/generated/enum_string_mapping.inc @@ -24,6 +24,8 @@ const char* ExtensionToString(Extension extension) { return "SPV_EXT_descriptor_indexing"; case Extension::kSPV_EXT_fragment_fully_covered: return "SPV_EXT_fragment_fully_covered"; + case Extension::kSPV_EXT_fragment_invocation_density: + return "SPV_EXT_fragment_invocation_density"; case Extension::kSPV_EXT_shader_stencil_export: return "SPV_EXT_shader_stencil_export"; case Extension::kSPV_EXT_shader_viewport_index_layer: @@ -40,8 +42,12 @@ const char* ExtensionToString(Extension extension) { return "SPV_KHR_8bit_storage"; case Extension::kSPV_KHR_device_group: return "SPV_KHR_device_group"; + case Extension::kSPV_KHR_float_controls: + return "SPV_KHR_float_controls"; case Extension::kSPV_KHR_multiview: return "SPV_KHR_multiview"; + case Extension::kSPV_KHR_no_integer_wrap_decoration: + return "SPV_KHR_no_integer_wrap_decoration"; case Extension::kSPV_KHR_post_depth_coverage: return "SPV_KHR_post_depth_coverage"; case Extension::kSPV_KHR_shader_atomic_counter_ops: @@ -56,14 +62,28 @@ const char* ExtensionToString(Extension extension) { return "SPV_KHR_subgroup_vote"; case Extension::kSPV_KHR_variable_pointers: return "SPV_KHR_variable_pointers"; + case Extension::kSPV_KHR_vulkan_memory_model: + return "SPV_KHR_vulkan_memory_model"; case Extension::kSPV_NVX_multiview_per_view_attributes: return "SPV_NVX_multiview_per_view_attributes"; + case Extension::kSPV_NV_compute_shader_derivatives: + return "SPV_NV_compute_shader_derivatives"; + case Extension::kSPV_NV_fragment_shader_barycentric: + return "SPV_NV_fragment_shader_barycentric"; case Extension::kSPV_NV_geometry_shader_passthrough: return "SPV_NV_geometry_shader_passthrough"; + case Extension::kSPV_NV_mesh_shader: + return "SPV_NV_mesh_shader"; + case Extension::kSPV_NV_ray_tracing: + return "SPV_NV_ray_tracing"; case Extension::kSPV_NV_sample_mask_override_coverage: return "SPV_NV_sample_mask_override_coverage"; + case Extension::kSPV_NV_shader_image_footprint: + return "SPV_NV_shader_image_footprint"; case Extension::kSPV_NV_shader_subgroup_partitioned: return "SPV_NV_shader_subgroup_partitioned"; + case Extension::kSPV_NV_shading_rate: + return "SPV_NV_shading_rate"; case Extension::kSPV_NV_stereo_view_rendering: return "SPV_NV_stereo_view_rendering"; case Extension::kSPV_NV_viewport_array2: @@ -77,8 +97,8 @@ const char* ExtensionToString(Extension extension) { bool GetExtensionFromString(const char* str, Extension* extension) { - static const char* known_ext_strs[] = { "SPV_AMD_gcn_shader", "SPV_AMD_gpu_shader_half_float", "SPV_AMD_gpu_shader_half_float_fetch", "SPV_AMD_gpu_shader_int16", "SPV_AMD_shader_ballot", "SPV_AMD_shader_explicit_vertex_parameter", "SPV_AMD_shader_fragment_mask", "SPV_AMD_shader_image_load_store_lod", "SPV_AMD_shader_trinary_minmax", "SPV_AMD_texture_gather_bias_lod", "SPV_EXT_descriptor_indexing", "SPV_EXT_fragment_fully_covered", "SPV_EXT_shader_stencil_export", "SPV_EXT_shader_viewport_index_layer", "SPV_GOOGLE_decorate_string", "SPV_GOOGLE_hlsl_functionality1", "SPV_INTEL_subgroups", "SPV_KHR_16bit_storage", "SPV_KHR_8bit_storage", "SPV_KHR_device_group", "SPV_KHR_multiview", "SPV_KHR_post_depth_coverage", "SPV_KHR_shader_atomic_counter_ops", "SPV_KHR_shader_ballot", "SPV_KHR_shader_draw_parameters", "SPV_KHR_storage_buffer_storage_class", "SPV_KHR_subgroup_vote", "SPV_KHR_variable_pointers", "SPV_NVX_multiview_per_view_attributes", "SPV_NV_geometry_shader_passthrough", "SPV_NV_sample_mask_override_coverage", "SPV_NV_shader_subgroup_partitioned", "SPV_NV_stereo_view_rendering", "SPV_NV_viewport_array2", "SPV_VALIDATOR_ignore_type_decl_unique" }; - static const Extension known_ext_ids[] = { Extension::kSPV_AMD_gcn_shader, Extension::kSPV_AMD_gpu_shader_half_float, Extension::kSPV_AMD_gpu_shader_half_float_fetch, Extension::kSPV_AMD_gpu_shader_int16, Extension::kSPV_AMD_shader_ballot, Extension::kSPV_AMD_shader_explicit_vertex_parameter, Extension::kSPV_AMD_shader_fragment_mask, Extension::kSPV_AMD_shader_image_load_store_lod, Extension::kSPV_AMD_shader_trinary_minmax, Extension::kSPV_AMD_texture_gather_bias_lod, Extension::kSPV_EXT_descriptor_indexing, Extension::kSPV_EXT_fragment_fully_covered, Extension::kSPV_EXT_shader_stencil_export, Extension::kSPV_EXT_shader_viewport_index_layer, Extension::kSPV_GOOGLE_decorate_string, Extension::kSPV_GOOGLE_hlsl_functionality1, Extension::kSPV_INTEL_subgroups, Extension::kSPV_KHR_16bit_storage, Extension::kSPV_KHR_8bit_storage, Extension::kSPV_KHR_device_group, Extension::kSPV_KHR_multiview, Extension::kSPV_KHR_post_depth_coverage, Extension::kSPV_KHR_shader_atomic_counter_ops, Extension::kSPV_KHR_shader_ballot, Extension::kSPV_KHR_shader_draw_parameters, Extension::kSPV_KHR_storage_buffer_storage_class, Extension::kSPV_KHR_subgroup_vote, Extension::kSPV_KHR_variable_pointers, Extension::kSPV_NVX_multiview_per_view_attributes, Extension::kSPV_NV_geometry_shader_passthrough, Extension::kSPV_NV_sample_mask_override_coverage, Extension::kSPV_NV_shader_subgroup_partitioned, Extension::kSPV_NV_stereo_view_rendering, Extension::kSPV_NV_viewport_array2, Extension::kSPV_VALIDATOR_ignore_type_decl_unique }; + static const char* known_ext_strs[] = { "SPV_AMD_gcn_shader", "SPV_AMD_gpu_shader_half_float", "SPV_AMD_gpu_shader_half_float_fetch", "SPV_AMD_gpu_shader_int16", "SPV_AMD_shader_ballot", "SPV_AMD_shader_explicit_vertex_parameter", "SPV_AMD_shader_fragment_mask", "SPV_AMD_shader_image_load_store_lod", "SPV_AMD_shader_trinary_minmax", "SPV_AMD_texture_gather_bias_lod", "SPV_EXT_descriptor_indexing", "SPV_EXT_fragment_fully_covered", "SPV_EXT_fragment_invocation_density", "SPV_EXT_shader_stencil_export", "SPV_EXT_shader_viewport_index_layer", "SPV_GOOGLE_decorate_string", "SPV_GOOGLE_hlsl_functionality1", "SPV_INTEL_subgroups", "SPV_KHR_16bit_storage", "SPV_KHR_8bit_storage", "SPV_KHR_device_group", "SPV_KHR_float_controls", "SPV_KHR_multiview", "SPV_KHR_no_integer_wrap_decoration", "SPV_KHR_post_depth_coverage", "SPV_KHR_shader_atomic_counter_ops", "SPV_KHR_shader_ballot", "SPV_KHR_shader_draw_parameters", "SPV_KHR_storage_buffer_storage_class", "SPV_KHR_subgroup_vote", "SPV_KHR_variable_pointers", "SPV_KHR_vulkan_memory_model", "SPV_NVX_multiview_per_view_attributes", "SPV_NV_compute_shader_derivatives", "SPV_NV_fragment_shader_barycentric", "SPV_NV_geometry_shader_passthrough", "SPV_NV_mesh_shader", "SPV_NV_ray_tracing", "SPV_NV_sample_mask_override_coverage", "SPV_NV_shader_image_footprint", "SPV_NV_shader_subgroup_partitioned", "SPV_NV_shading_rate", "SPV_NV_stereo_view_rendering", "SPV_NV_viewport_array2", "SPV_VALIDATOR_ignore_type_decl_unique" }; + static const Extension known_ext_ids[] = { Extension::kSPV_AMD_gcn_shader, Extension::kSPV_AMD_gpu_shader_half_float, Extension::kSPV_AMD_gpu_shader_half_float_fetch, Extension::kSPV_AMD_gpu_shader_int16, Extension::kSPV_AMD_shader_ballot, Extension::kSPV_AMD_shader_explicit_vertex_parameter, Extension::kSPV_AMD_shader_fragment_mask, Extension::kSPV_AMD_shader_image_load_store_lod, Extension::kSPV_AMD_shader_trinary_minmax, Extension::kSPV_AMD_texture_gather_bias_lod, Extension::kSPV_EXT_descriptor_indexing, Extension::kSPV_EXT_fragment_fully_covered, Extension::kSPV_EXT_fragment_invocation_density, Extension::kSPV_EXT_shader_stencil_export, Extension::kSPV_EXT_shader_viewport_index_layer, Extension::kSPV_GOOGLE_decorate_string, Extension::kSPV_GOOGLE_hlsl_functionality1, Extension::kSPV_INTEL_subgroups, Extension::kSPV_KHR_16bit_storage, Extension::kSPV_KHR_8bit_storage, Extension::kSPV_KHR_device_group, Extension::kSPV_KHR_float_controls, Extension::kSPV_KHR_multiview, Extension::kSPV_KHR_no_integer_wrap_decoration, Extension::kSPV_KHR_post_depth_coverage, Extension::kSPV_KHR_shader_atomic_counter_ops, Extension::kSPV_KHR_shader_ballot, Extension::kSPV_KHR_shader_draw_parameters, Extension::kSPV_KHR_storage_buffer_storage_class, Extension::kSPV_KHR_subgroup_vote, Extension::kSPV_KHR_variable_pointers, Extension::kSPV_KHR_vulkan_memory_model, Extension::kSPV_NVX_multiview_per_view_attributes, Extension::kSPV_NV_compute_shader_derivatives, Extension::kSPV_NV_fragment_shader_barycentric, Extension::kSPV_NV_geometry_shader_passthrough, Extension::kSPV_NV_mesh_shader, Extension::kSPV_NV_ray_tracing, Extension::kSPV_NV_sample_mask_override_coverage, Extension::kSPV_NV_shader_image_footprint, Extension::kSPV_NV_shader_subgroup_partitioned, Extension::kSPV_NV_shading_rate, Extension::kSPV_NV_stereo_view_rendering, Extension::kSPV_NV_viewport_array2, Extension::kSPV_VALIDATOR_ignore_type_decl_unique }; const auto b = std::begin(known_ext_strs); const auto e = std::end(known_ext_strs); const auto found = std::equal_range( @@ -260,6 +280,16 @@ const char* CapabilityToString(SpvCapability capability) { return "UniformAndStorageBuffer8BitAccess"; case SpvCapabilityStoragePushConstant8: return "StoragePushConstant8"; + case SpvCapabilityDenormPreserve: + return "DenormPreserve"; + case SpvCapabilityDenormFlushToZero: + return "DenormFlushToZero"; + case SpvCapabilitySignedZeroInfNanPreserve: + return "SignedZeroInfNanPreserve"; + case SpvCapabilityRoundingModeRTE: + return "RoundingModeRTE"; + case SpvCapabilityRoundingModeRTZ: + return "RoundingModeRTZ"; case SpvCapabilityFloat16ImageAMD: return "Float16ImageAMD"; case SpvCapabilityImageGatherBiasLodAMD: @@ -284,6 +314,8 @@ const char* CapabilityToString(SpvCapability capability) { return "PerViewAttributesNV"; case SpvCapabilityFragmentFullyCoveredEXT: return "FragmentFullyCoveredEXT"; + case SpvCapabilityMeshShadingNV: + return "MeshShadingNV"; case SpvCapabilityShaderNonUniformEXT: return "ShaderNonUniformEXT"; case SpvCapabilityRuntimeDescriptorArrayEXT: @@ -308,6 +340,8 @@ const char* CapabilityToString(SpvCapability capability) { return "UniformTexelBufferArrayNonUniformIndexingEXT"; case SpvCapabilityStorageTexelBufferArrayNonUniformIndexingEXT: return "StorageTexelBufferArrayNonUniformIndexingEXT"; + case SpvCapabilityRayTracingNV: + return "RayTracingNV"; case SpvCapabilitySubgroupShuffleINTEL: return "SubgroupShuffleINTEL"; case SpvCapabilitySubgroupBufferBlockIOINTEL: @@ -316,6 +350,20 @@ const char* CapabilityToString(SpvCapability capability) { return "SubgroupImageBlockIOINTEL"; case SpvCapabilityGroupNonUniformPartitionedNV: return "GroupNonUniformPartitionedNV"; + case SpvCapabilityVulkanMemoryModelKHR: + return "VulkanMemoryModelKHR"; + case SpvCapabilityVulkanMemoryModelDeviceScopeKHR: + return "VulkanMemoryModelDeviceScopeKHR"; + case SpvCapabilityImageFootprintNV: + return "ImageFootprintNV"; + case SpvCapabilityFragmentBarycentricNV: + return "FragmentBarycentricNV"; + case SpvCapabilityComputeDerivativeGroupQuadsNV: + return "ComputeDerivativeGroupQuadsNV"; + case SpvCapabilityComputeDerivativeGroupLinearNV: + return "ComputeDerivativeGroupLinearNV"; + case SpvCapabilityFragmentDensityEXT: + return "FragmentDensityEXT"; case SpvCapabilityMax: assert(0 && "Attempting to convert SpvCapabilityMax to string"); return ""; diff --git a/3rdparty/spirv-tools/include/generated/extension_enum.inc b/3rdparty/spirv-tools/include/generated/extension_enum.inc index c1cf94a7b..83a2daa80 100644 --- a/3rdparty/spirv-tools/include/generated/extension_enum.inc +++ b/3rdparty/spirv-tools/include/generated/extension_enum.inc @@ -10,6 +10,7 @@ kSPV_AMD_shader_trinary_minmax, kSPV_AMD_texture_gather_bias_lod, kSPV_EXT_descriptor_indexing, kSPV_EXT_fragment_fully_covered, +kSPV_EXT_fragment_invocation_density, kSPV_EXT_shader_stencil_export, kSPV_EXT_shader_viewport_index_layer, kSPV_GOOGLE_decorate_string, @@ -18,7 +19,9 @@ kSPV_INTEL_subgroups, kSPV_KHR_16bit_storage, kSPV_KHR_8bit_storage, kSPV_KHR_device_group, +kSPV_KHR_float_controls, kSPV_KHR_multiview, +kSPV_KHR_no_integer_wrap_decoration, kSPV_KHR_post_depth_coverage, kSPV_KHR_shader_atomic_counter_ops, kSPV_KHR_shader_ballot, @@ -26,10 +29,17 @@ kSPV_KHR_shader_draw_parameters, kSPV_KHR_storage_buffer_storage_class, kSPV_KHR_subgroup_vote, kSPV_KHR_variable_pointers, +kSPV_KHR_vulkan_memory_model, kSPV_NVX_multiview_per_view_attributes, +kSPV_NV_compute_shader_derivatives, +kSPV_NV_fragment_shader_barycentric, kSPV_NV_geometry_shader_passthrough, +kSPV_NV_mesh_shader, +kSPV_NV_ray_tracing, kSPV_NV_sample_mask_override_coverage, +kSPV_NV_shader_image_footprint, kSPV_NV_shader_subgroup_partitioned, +kSPV_NV_shading_rate, kSPV_NV_stereo_view_rendering, kSPV_NV_viewport_array2, kSPV_VALIDATOR_ignore_type_decl_unique diff --git a/3rdparty/spirv-tools/include/generated/generators.inc b/3rdparty/spirv-tools/include/generated/generators.inc index 39709d3aa..3a1233a17 100644 --- a/3rdparty/spirv-tools/include/generated/generators.inc +++ b/3rdparty/spirv-tools/include/generated/generators.inc @@ -18,3 +18,4 @@ {17, "Khronos", "SPIR-V Tools Linker", "Khronos SPIR-V Tools Linker"}, {18, "Wine", "VKD3D Shader Compiler", "Wine VKD3D Shader Compiler"}, {19, "Clay", "Clay Shader Compiler", "Clay Clay Shader Compiler"}, +{20, "W3C WebGPU Group", "WHLSL Shader Translator", "W3C WebGPU Group WHLSL Shader Translator"}, diff --git a/3rdparty/spirv-tools/include/generated/operand.kinds-unified1.inc b/3rdparty/spirv-tools/include/generated/operand.kinds-unified1.inc index e40c74b21..cc1d26f9a 100644 --- a/3rdparty/spirv-tools/include/generated/operand.kinds-unified1.inc +++ b/3rdparty/spirv-tools/include/generated/operand.kinds-unified1.inc @@ -1,14 +1,24 @@ static const SpvCapability pygen_variable_caps_Addresses[] = {SpvCapabilityAddresses}; static const SpvCapability pygen_variable_caps_AtomicStorage[] = {SpvCapabilityAtomicStorage}; static const SpvCapability pygen_variable_caps_ClipDistance[] = {SpvCapabilityClipDistance}; +static const SpvCapability pygen_variable_caps_ComputeDerivativeGroupLinearNV[] = {SpvCapabilityComputeDerivativeGroupLinearNV}; +static const SpvCapability pygen_variable_caps_ComputeDerivativeGroupQuadsNV[] = {SpvCapabilityComputeDerivativeGroupQuadsNV}; static const SpvCapability pygen_variable_caps_CullDistance[] = {SpvCapabilityCullDistance}; +static const SpvCapability pygen_variable_caps_DenormFlushToZero[] = {SpvCapabilityDenormFlushToZero}; +static const SpvCapability pygen_variable_caps_DenormPreserve[] = {SpvCapabilityDenormPreserve}; static const SpvCapability pygen_variable_caps_DeviceEnqueue[] = {SpvCapabilityDeviceEnqueue}; static const SpvCapability pygen_variable_caps_DeviceGroup[] = {SpvCapabilityDeviceGroup}; static const SpvCapability pygen_variable_caps_DrawParameters[] = {SpvCapabilityDrawParameters}; +static const SpvCapability pygen_variable_caps_DrawParametersMeshShadingNV[] = {SpvCapabilityDrawParameters, SpvCapabilityMeshShadingNV}; +static const SpvCapability pygen_variable_caps_FragmentBarycentricNV[] = {SpvCapabilityFragmentBarycentricNV}; +static const SpvCapability pygen_variable_caps_FragmentDensityEXTShadingRateNV[] = {SpvCapabilityFragmentDensityEXT, SpvCapabilityShadingRateNV}; static const SpvCapability pygen_variable_caps_FragmentFullyCoveredEXT[] = {SpvCapabilityFragmentFullyCoveredEXT}; static const SpvCapability pygen_variable_caps_GenericPointer[] = {SpvCapabilityGenericPointer}; static const SpvCapability pygen_variable_caps_Geometry[] = {SpvCapabilityGeometry}; +static const SpvCapability pygen_variable_caps_GeometryMeshShadingNV[] = {SpvCapabilityGeometry, SpvCapabilityMeshShadingNV}; static const SpvCapability pygen_variable_caps_GeometryTessellation[] = {SpvCapabilityGeometry, SpvCapabilityTessellation}; +static const SpvCapability pygen_variable_caps_GeometryTessellationMeshShadingNV[] = {SpvCapabilityGeometry, SpvCapabilityTessellation, SpvCapabilityMeshShadingNV}; +static const SpvCapability pygen_variable_caps_GeometryTessellationRayTracingNV[] = {SpvCapabilityGeometry, SpvCapabilityTessellation, SpvCapabilityRayTracingNV}; static const SpvCapability pygen_variable_caps_GeometryShaderPassthroughNV[] = {SpvCapabilityGeometryShaderPassthroughNV}; static const SpvCapability pygen_variable_caps_GeometryStreams[] = {SpvCapabilityGeometryStreams}; static const SpvCapability pygen_variable_caps_GroupNonUniform[] = {SpvCapabilityGroupNonUniform}; @@ -27,25 +37,37 @@ static const SpvCapability pygen_variable_caps_KernelGroupNonUniformSubgroupBall static const SpvCapability pygen_variable_caps_KernelGroupNonUniformArithmeticGroupNonUniformBallot[] = {SpvCapabilityKernel, SpvCapabilityGroupNonUniformArithmetic, SpvCapabilityGroupNonUniformBallot}; static const SpvCapability pygen_variable_caps_Linkage[] = {SpvCapabilityLinkage}; static const SpvCapability pygen_variable_caps_Matrix[] = {SpvCapabilityMatrix}; +static const SpvCapability pygen_variable_caps_MeshShadingNV[] = {SpvCapabilityMeshShadingNV}; static const SpvCapability pygen_variable_caps_MinLod[] = {SpvCapabilityMinLod}; static const SpvCapability pygen_variable_caps_MultiView[] = {SpvCapabilityMultiView}; static const SpvCapability pygen_variable_caps_MultiViewport[] = {SpvCapabilityMultiViewport}; -static const SpvCapability pygen_variable_caps_PerViewAttributesNV[] = {SpvCapabilityPerViewAttributesNV}; +static const SpvCapability pygen_variable_caps_PerViewAttributesNVMeshShadingNV[] = {SpvCapabilityPerViewAttributesNV, SpvCapabilityMeshShadingNV}; static const SpvCapability pygen_variable_caps_Pipes[] = {SpvCapabilityPipes}; +static const SpvCapability pygen_variable_caps_RayTracingNV[] = {SpvCapabilityRayTracingNV}; +static const SpvCapability pygen_variable_caps_RoundingModeRTE[] = {SpvCapabilityRoundingModeRTE}; +static const SpvCapability pygen_variable_caps_RoundingModeRTZ[] = {SpvCapabilityRoundingModeRTZ}; static const SpvCapability pygen_variable_caps_SampleMaskOverrideCoverageNV[] = {SpvCapabilitySampleMaskOverrideCoverageNV}; static const SpvCapability pygen_variable_caps_SampleMaskPostDepthCoverage[] = {SpvCapabilitySampleMaskPostDepthCoverage}; static const SpvCapability pygen_variable_caps_SampleRateShading[] = {SpvCapabilitySampleRateShading}; static const SpvCapability pygen_variable_caps_Sampled1D[] = {SpvCapabilitySampled1D}; +static const SpvCapability pygen_variable_caps_Sampled1DImage1D[] = {SpvCapabilitySampled1D, SpvCapabilityImage1D}; static const SpvCapability pygen_variable_caps_SampledBuffer[] = {SpvCapabilitySampledBuffer}; +static const SpvCapability pygen_variable_caps_SampledBufferImageBuffer[] = {SpvCapabilitySampledBuffer, SpvCapabilityImageBuffer}; static const SpvCapability pygen_variable_caps_SampledBufferShaderNonUniformEXT[] = {SpvCapabilitySampledBuffer, SpvCapabilityShaderNonUniformEXT}; static const SpvCapability pygen_variable_caps_SampledCubeArray[] = {SpvCapabilitySampledCubeArray}; static const SpvCapability pygen_variable_caps_SampledRect[] = {SpvCapabilitySampledRect}; +static const SpvCapability pygen_variable_caps_SampledRectImageRect[] = {SpvCapabilitySampledRect, SpvCapabilityImageRect}; static const SpvCapability pygen_variable_caps_Shader[] = {SpvCapabilityShader}; +static const SpvCapability pygen_variable_caps_ShaderImageCubeArray[] = {SpvCapabilityShader, SpvCapabilityImageCubeArray}; static const SpvCapability pygen_variable_caps_ShaderKernel[] = {SpvCapabilityShader, SpvCapabilityKernel}; +static const SpvCapability pygen_variable_caps_ShaderKernelImageMSArray[] = {SpvCapabilityShader, SpvCapabilityKernel, SpvCapabilityImageMSArray}; static const SpvCapability pygen_variable_caps_ShaderNonUniformEXT[] = {SpvCapabilityShaderNonUniformEXT}; static const SpvCapability pygen_variable_caps_ShaderStereoViewNV[] = {SpvCapabilityShaderStereoViewNV}; static const SpvCapability pygen_variable_caps_ShaderViewportIndexLayerNV[] = {SpvCapabilityShaderViewportIndexLayerNV}; static const SpvCapability pygen_variable_caps_ShaderViewportMaskNV[] = {SpvCapabilityShaderViewportMaskNV}; +static const SpvCapability pygen_variable_caps_ShaderViewportMaskNVMeshShadingNV[] = {SpvCapabilityShaderViewportMaskNV, SpvCapabilityMeshShadingNV}; +static const SpvCapability pygen_variable_caps_ShadingRateNVFragmentDensityEXT[] = {SpvCapabilityShadingRateNV, SpvCapabilityFragmentDensityEXT}; +static const SpvCapability pygen_variable_caps_SignedZeroInfNanPreserve[] = {SpvCapabilitySignedZeroInfNanPreserve}; static const SpvCapability pygen_variable_caps_StencilExportEXT[] = {SpvCapabilityStencilExportEXT}; static const SpvCapability pygen_variable_caps_StorageBuffer16BitAccessStorageUniformBufferBlock16[] = {SpvCapabilityStorageBuffer16BitAccess, SpvCapabilityStorageUniformBufferBlock16}; static const SpvCapability pygen_variable_caps_StorageBuffer8BitAccess[] = {SpvCapabilityStorageBuffer8BitAccess}; @@ -55,6 +77,7 @@ static const SpvCapability pygen_variable_caps_SubgroupDispatch[] = {SpvCapabili static const SpvCapability pygen_variable_caps_Tessellation[] = {SpvCapabilityTessellation}; static const SpvCapability pygen_variable_caps_TransformFeedback[] = {SpvCapabilityTransformFeedback}; static const SpvCapability pygen_variable_caps_VariablePointersStorageBuffer[] = {SpvCapabilityVariablePointersStorageBuffer}; +static const SpvCapability pygen_variable_caps_VulkanMemoryModelKHR[] = {SpvCapabilityVulkanMemoryModelKHR}; static const spvtools::Extension pygen_variable_exts_SPV_AMD_gpu_shader_half_float_fetch[] = {spvtools::Extension::kSPV_AMD_gpu_shader_half_float_fetch}; static const spvtools::Extension pygen_variable_exts_SPV_AMD_shader_explicit_vertex_parameter[] = {spvtools::Extension::kSPV_AMD_shader_explicit_vertex_parameter}; @@ -63,6 +86,7 @@ static const spvtools::Extension pygen_variable_exts_SPV_AMD_shader_image_load_s static const spvtools::Extension pygen_variable_exts_SPV_AMD_texture_gather_bias_lod[] = {spvtools::Extension::kSPV_AMD_texture_gather_bias_lod}; static const spvtools::Extension pygen_variable_exts_SPV_EXT_descriptor_indexing[] = {spvtools::Extension::kSPV_EXT_descriptor_indexing}; static const spvtools::Extension pygen_variable_exts_SPV_EXT_fragment_fully_covered[] = {spvtools::Extension::kSPV_EXT_fragment_fully_covered}; +static const spvtools::Extension pygen_variable_exts_SPV_EXT_fragment_invocation_densitySPV_NV_shading_rate[] = {spvtools::Extension::kSPV_EXT_fragment_invocation_density, spvtools::Extension::kSPV_NV_shading_rate}; static const spvtools::Extension pygen_variable_exts_SPV_EXT_shader_stencil_export[] = {spvtools::Extension::kSPV_EXT_shader_stencil_export}; static const spvtools::Extension pygen_variable_exts_SPV_EXT_shader_viewport_index_layer[] = {spvtools::Extension::kSPV_EXT_shader_viewport_index_layer}; static const spvtools::Extension pygen_variable_exts_SPV_GOOGLE_hlsl_functionality1[] = {spvtools::Extension::kSPV_GOOGLE_hlsl_functionality1}; @@ -70,20 +94,32 @@ static const spvtools::Extension pygen_variable_exts_SPV_INTEL_subgroups[] = {sp static const spvtools::Extension pygen_variable_exts_SPV_KHR_16bit_storage[] = {spvtools::Extension::kSPV_KHR_16bit_storage}; static const spvtools::Extension pygen_variable_exts_SPV_KHR_8bit_storage[] = {spvtools::Extension::kSPV_KHR_8bit_storage}; static const spvtools::Extension pygen_variable_exts_SPV_KHR_device_group[] = {spvtools::Extension::kSPV_KHR_device_group}; +static const spvtools::Extension pygen_variable_exts_SPV_KHR_float_controls[] = {spvtools::Extension::kSPV_KHR_float_controls}; static const spvtools::Extension pygen_variable_exts_SPV_KHR_multiview[] = {spvtools::Extension::kSPV_KHR_multiview}; +static const spvtools::Extension pygen_variable_exts_SPV_KHR_no_integer_wrap_decoration[] = {spvtools::Extension::kSPV_KHR_no_integer_wrap_decoration}; static const spvtools::Extension pygen_variable_exts_SPV_KHR_post_depth_coverage[] = {spvtools::Extension::kSPV_KHR_post_depth_coverage}; static const spvtools::Extension pygen_variable_exts_SPV_KHR_shader_atomic_counter_ops[] = {spvtools::Extension::kSPV_KHR_shader_atomic_counter_ops}; static const spvtools::Extension pygen_variable_exts_SPV_KHR_shader_ballot[] = {spvtools::Extension::kSPV_KHR_shader_ballot}; static const spvtools::Extension pygen_variable_exts_SPV_KHR_shader_draw_parameters[] = {spvtools::Extension::kSPV_KHR_shader_draw_parameters}; +static const spvtools::Extension pygen_variable_exts_SPV_KHR_shader_draw_parametersSPV_NV_mesh_shader[] = {spvtools::Extension::kSPV_KHR_shader_draw_parameters, spvtools::Extension::kSPV_NV_mesh_shader}; static const spvtools::Extension pygen_variable_exts_SPV_KHR_storage_buffer_storage_classSPV_KHR_variable_pointers[] = {spvtools::Extension::kSPV_KHR_storage_buffer_storage_class, spvtools::Extension::kSPV_KHR_variable_pointers}; static const spvtools::Extension pygen_variable_exts_SPV_KHR_subgroup_vote[] = {spvtools::Extension::kSPV_KHR_subgroup_vote}; static const spvtools::Extension pygen_variable_exts_SPV_KHR_variable_pointers[] = {spvtools::Extension::kSPV_KHR_variable_pointers}; +static const spvtools::Extension pygen_variable_exts_SPV_KHR_vulkan_memory_model[] = {spvtools::Extension::kSPV_KHR_vulkan_memory_model}; static const spvtools::Extension pygen_variable_exts_SPV_NVX_multiview_per_view_attributes[] = {spvtools::Extension::kSPV_NVX_multiview_per_view_attributes}; +static const spvtools::Extension pygen_variable_exts_SPV_NVX_multiview_per_view_attributesSPV_NV_mesh_shader[] = {spvtools::Extension::kSPV_NVX_multiview_per_view_attributes, spvtools::Extension::kSPV_NV_mesh_shader}; +static const spvtools::Extension pygen_variable_exts_SPV_NV_compute_shader_derivatives[] = {spvtools::Extension::kSPV_NV_compute_shader_derivatives}; +static const spvtools::Extension pygen_variable_exts_SPV_NV_fragment_shader_barycentric[] = {spvtools::Extension::kSPV_NV_fragment_shader_barycentric}; static const spvtools::Extension pygen_variable_exts_SPV_NV_geometry_shader_passthrough[] = {spvtools::Extension::kSPV_NV_geometry_shader_passthrough}; +static const spvtools::Extension pygen_variable_exts_SPV_NV_mesh_shader[] = {spvtools::Extension::kSPV_NV_mesh_shader}; +static const spvtools::Extension pygen_variable_exts_SPV_NV_ray_tracing[] = {spvtools::Extension::kSPV_NV_ray_tracing}; static const spvtools::Extension pygen_variable_exts_SPV_NV_sample_mask_override_coverage[] = {spvtools::Extension::kSPV_NV_sample_mask_override_coverage}; +static const spvtools::Extension pygen_variable_exts_SPV_NV_shader_image_footprint[] = {spvtools::Extension::kSPV_NV_shader_image_footprint}; static const spvtools::Extension pygen_variable_exts_SPV_NV_shader_subgroup_partitioned[] = {spvtools::Extension::kSPV_NV_shader_subgroup_partitioned}; +static const spvtools::Extension pygen_variable_exts_SPV_NV_shading_rateSPV_EXT_fragment_invocation_density[] = {spvtools::Extension::kSPV_NV_shading_rate, spvtools::Extension::kSPV_EXT_fragment_invocation_density}; static const spvtools::Extension pygen_variable_exts_SPV_NV_stereo_view_rendering[] = {spvtools::Extension::kSPV_NV_stereo_view_rendering}; static const spvtools::Extension pygen_variable_exts_SPV_NV_viewport_array2[] = {spvtools::Extension::kSPV_NV_viewport_array2}; +static const spvtools::Extension pygen_variable_exts_SPV_NV_viewport_array2SPV_NV_mesh_shader[] = {spvtools::Extension::kSPV_NV_viewport_array2, spvtools::Extension::kSPV_NV_mesh_shader}; static const spv_operand_desc_t pygen_variable_ImageOperandsEntries[] = { {"None", 0x0000, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, @@ -94,7 +130,11 @@ static const spv_operand_desc_t pygen_variable_ImageOperandsEntries[] = { {"Offset", 0x0010, 1, pygen_variable_caps_ImageGatherExtended, 0, nullptr, {SPV_OPERAND_TYPE_ID}, SPV_SPIRV_VERSION_WORD(1, 0)}, {"ConstOffsets", 0x0020, 1, pygen_variable_caps_ImageGatherExtended, 0, nullptr, {SPV_OPERAND_TYPE_ID}, SPV_SPIRV_VERSION_WORD(1, 0)}, {"Sample", 0x0040, 0, nullptr, 0, nullptr, {SPV_OPERAND_TYPE_ID}, SPV_SPIRV_VERSION_WORD(1, 0)}, - {"MinLod", 0x0080, 1, pygen_variable_caps_MinLod, 0, nullptr, {SPV_OPERAND_TYPE_ID}, SPV_SPIRV_VERSION_WORD(1, 0)} + {"MinLod", 0x0080, 1, pygen_variable_caps_MinLod, 0, nullptr, {SPV_OPERAND_TYPE_ID}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"MakeTexelAvailableKHR", 0x0100, 1, pygen_variable_caps_VulkanMemoryModelKHR, 0, nullptr, {SPV_OPERAND_TYPE_SCOPE_ID}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"MakeTexelVisibleKHR", 0x0200, 1, pygen_variable_caps_VulkanMemoryModelKHR, 0, nullptr, {SPV_OPERAND_TYPE_SCOPE_ID}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"NonPrivateTexelKHR", 0x0400, 1, pygen_variable_caps_VulkanMemoryModelKHR, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"VolatileTexelKHR", 0x0800, 1, pygen_variable_caps_VulkanMemoryModelKHR, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)} }; static const spv_operand_desc_t pygen_variable_FPFastMathModeEntries[] = { @@ -140,14 +180,20 @@ static const spv_operand_desc_t pygen_variable_MemorySemanticsEntries[] = { {"WorkgroupMemory", 0x0100, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, {"CrossWorkgroupMemory", 0x0200, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, {"AtomicCounterMemory", 0x0400, 1, pygen_variable_caps_AtomicStorage, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, - {"ImageMemory", 0x0800, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)} + {"ImageMemory", 0x0800, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"OutputMemoryKHR", 0x1000, 1, pygen_variable_caps_VulkanMemoryModelKHR, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"MakeAvailableKHR", 0x2000, 1, pygen_variable_caps_VulkanMemoryModelKHR, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"MakeVisibleKHR", 0x4000, 1, pygen_variable_caps_VulkanMemoryModelKHR, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)} }; static const spv_operand_desc_t pygen_variable_MemoryAccessEntries[] = { {"None", 0x0000, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, {"Volatile", 0x0001, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, {"Aligned", 0x0002, 0, nullptr, 0, nullptr, {SPV_OPERAND_TYPE_LITERAL_INTEGER}, SPV_SPIRV_VERSION_WORD(1, 0)}, - {"Nontemporal", 0x0004, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)} + {"Nontemporal", 0x0004, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"MakePointerAvailableKHR", 0x0008, 1, pygen_variable_caps_VulkanMemoryModelKHR, 0, nullptr, {SPV_OPERAND_TYPE_SCOPE_ID}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"MakePointerVisibleKHR", 0x0010, 1, pygen_variable_caps_VulkanMemoryModelKHR, 0, nullptr, {SPV_OPERAND_TYPE_SCOPE_ID}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"NonPrivatePointerKHR", 0x0020, 1, pygen_variable_caps_VulkanMemoryModelKHR, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)} }; static const spv_operand_desc_t pygen_variable_KernelProfilingInfoEntries[] = { @@ -171,7 +217,15 @@ static const spv_operand_desc_t pygen_variable_ExecutionModelEntries[] = { {"Geometry", 3, 1, pygen_variable_caps_Geometry, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, {"Fragment", 4, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, {"GLCompute", 5, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, - {"Kernel", 6, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)} + {"Kernel", 6, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"TaskNV", 5267, 1, pygen_variable_caps_MeshShadingNV, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"MeshNV", 5268, 1, pygen_variable_caps_MeshShadingNV, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"RayGenerationNV", 5313, 1, pygen_variable_caps_RayTracingNV, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"IntersectionNV", 5314, 1, pygen_variable_caps_RayTracingNV, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"AnyHitNV", 5315, 1, pygen_variable_caps_RayTracingNV, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ClosestHitNV", 5316, 1, pygen_variable_caps_RayTracingNV, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"MissNV", 5317, 1, pygen_variable_caps_RayTracingNV, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"CallableNV", 5318, 1, pygen_variable_caps_RayTracingNV, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)} }; static const spv_operand_desc_t pygen_variable_AddressingModelEntries[] = { @@ -183,7 +237,8 @@ static const spv_operand_desc_t pygen_variable_AddressingModelEntries[] = { static const spv_operand_desc_t pygen_variable_MemoryModelEntries[] = { {"Simple", 0, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, {"GLSL450", 1, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, - {"OpenCL", 2, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)} + {"OpenCL", 2, 1, pygen_variable_caps_Kernel, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"VulkanKHR", 3, 1, pygen_variable_caps_VulkanMemoryModelKHR, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)} }; static const spv_operand_desc_t pygen_variable_ExecutionModeEntries[] = { @@ -212,8 +267,8 @@ static const spv_operand_desc_t pygen_variable_ExecutionModeEntries[] = { {"InputTrianglesAdjacency", 23, 1, pygen_variable_caps_Geometry, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, {"Quads", 24, 1, pygen_variable_caps_Tessellation, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, {"Isolines", 25, 1, pygen_variable_caps_Tessellation, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, - {"OutputVertices", 26, 2, pygen_variable_caps_GeometryTessellation, 0, nullptr, {SPV_OPERAND_TYPE_LITERAL_INTEGER}, SPV_SPIRV_VERSION_WORD(1, 0)}, - {"OutputPoints", 27, 1, pygen_variable_caps_Geometry, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"OutputVertices", 26, 3, pygen_variable_caps_GeometryTessellationMeshShadingNV, 0, nullptr, {SPV_OPERAND_TYPE_LITERAL_INTEGER}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"OutputPoints", 27, 2, pygen_variable_caps_GeometryMeshShadingNV, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, {"OutputLineStrip", 28, 1, pygen_variable_caps_Geometry, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, {"OutputTriangleStrip", 29, 1, pygen_variable_caps_Geometry, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, {"VecTypeHint", 30, 1, pygen_variable_caps_Kernel, 0, nullptr, {SPV_OPERAND_TYPE_LITERAL_INTEGER}, SPV_SPIRV_VERSION_WORD(1, 0)}, @@ -226,7 +281,17 @@ static const spv_operand_desc_t pygen_variable_ExecutionModeEntries[] = { {"LocalSizeId", 38, 0, nullptr, 0, nullptr, {SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID, SPV_OPERAND_TYPE_ID}, SPV_SPIRV_VERSION_WORD(1,2)}, {"LocalSizeHintId", 39, 1, pygen_variable_caps_Kernel, 0, nullptr, {SPV_OPERAND_TYPE_ID}, SPV_SPIRV_VERSION_WORD(1,2)}, {"PostDepthCoverage", 4446, 1, pygen_variable_caps_SampleMaskPostDepthCoverage, 1, pygen_variable_exts_SPV_KHR_post_depth_coverage, {}, 0xffffffffu}, - {"StencilRefReplacingEXT", 5027, 1, pygen_variable_caps_StencilExportEXT, 1, pygen_variable_exts_SPV_EXT_shader_stencil_export, {}, 0xffffffffu} + {"DenormPreserve", 4459, 1, pygen_variable_caps_DenormPreserve, 1, pygen_variable_exts_SPV_KHR_float_controls, {SPV_OPERAND_TYPE_LITERAL_INTEGER}, 0xffffffffu}, + {"DenormFlushToZero", 4460, 1, pygen_variable_caps_DenormFlushToZero, 1, pygen_variable_exts_SPV_KHR_float_controls, {SPV_OPERAND_TYPE_LITERAL_INTEGER}, 0xffffffffu}, + {"SignedZeroInfNanPreserve", 4461, 1, pygen_variable_caps_SignedZeroInfNanPreserve, 1, pygen_variable_exts_SPV_KHR_float_controls, {SPV_OPERAND_TYPE_LITERAL_INTEGER}, 0xffffffffu}, + {"RoundingModeRTE", 4462, 1, pygen_variable_caps_RoundingModeRTE, 1, pygen_variable_exts_SPV_KHR_float_controls, {SPV_OPERAND_TYPE_LITERAL_INTEGER}, 0xffffffffu}, + {"RoundingModeRTZ", 4463, 1, pygen_variable_caps_RoundingModeRTZ, 1, pygen_variable_exts_SPV_KHR_float_controls, {SPV_OPERAND_TYPE_LITERAL_INTEGER}, 0xffffffffu}, + {"StencilRefReplacingEXT", 5027, 1, pygen_variable_caps_StencilExportEXT, 1, pygen_variable_exts_SPV_EXT_shader_stencil_export, {}, 0xffffffffu}, + {"OutputLinesNV", 5269, 1, pygen_variable_caps_MeshShadingNV, 1, pygen_variable_exts_SPV_NV_mesh_shader, {}, 0xffffffffu}, + {"OutputPrimitivesNV", 5270, 1, pygen_variable_caps_MeshShadingNV, 1, pygen_variable_exts_SPV_NV_mesh_shader, {SPV_OPERAND_TYPE_LITERAL_INTEGER}, 0xffffffffu}, + {"DerivativeGroupQuadsNV", 5289, 1, pygen_variable_caps_ComputeDerivativeGroupQuadsNV, 1, pygen_variable_exts_SPV_NV_compute_shader_derivatives, {}, 0xffffffffu}, + {"DerivativeGroupLinearNV", 5290, 1, pygen_variable_caps_ComputeDerivativeGroupLinearNV, 1, pygen_variable_exts_SPV_NV_compute_shader_derivatives, {}, 0xffffffffu}, + {"OutputTrianglesNV", 5298, 1, pygen_variable_caps_MeshShadingNV, 1, pygen_variable_exts_SPV_NV_mesh_shader, {}, 0xffffffffu} }; static const spv_operand_desc_t pygen_variable_StorageClassEntries[] = { @@ -242,16 +307,22 @@ static const spv_operand_desc_t pygen_variable_StorageClassEntries[] = { {"PushConstant", 9, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, {"AtomicCounter", 10, 1, pygen_variable_caps_AtomicStorage, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, {"Image", 11, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, - {"StorageBuffer", 12, 1, pygen_variable_caps_Shader, 2, pygen_variable_exts_SPV_KHR_storage_buffer_storage_classSPV_KHR_variable_pointers, {}, SPV_SPIRV_VERSION_WORD(1,3)} + {"StorageBuffer", 12, 1, pygen_variable_caps_Shader, 2, pygen_variable_exts_SPV_KHR_storage_buffer_storage_classSPV_KHR_variable_pointers, {}, SPV_SPIRV_VERSION_WORD(1,3)}, + {"CallableDataNV", 5328, 1, pygen_variable_caps_RayTracingNV, 1, pygen_variable_exts_SPV_NV_ray_tracing, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"IncomingCallableDataNV", 5329, 1, pygen_variable_caps_RayTracingNV, 1, pygen_variable_exts_SPV_NV_ray_tracing, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"RayPayloadNV", 5338, 1, pygen_variable_caps_RayTracingNV, 1, pygen_variable_exts_SPV_NV_ray_tracing, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"HitAttributeNV", 5339, 1, pygen_variable_caps_RayTracingNV, 1, pygen_variable_exts_SPV_NV_ray_tracing, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"IncomingRayPayloadNV", 5342, 1, pygen_variable_caps_RayTracingNV, 1, pygen_variable_exts_SPV_NV_ray_tracing, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ShaderRecordBufferNV", 5343, 1, pygen_variable_caps_RayTracingNV, 1, pygen_variable_exts_SPV_NV_ray_tracing, {}, SPV_SPIRV_VERSION_WORD(1, 0)} }; static const spv_operand_desc_t pygen_variable_DimEntries[] = { - {"1D", 0, 1, pygen_variable_caps_Sampled1D, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, - {"2D", 1, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"1D", 0, 2, pygen_variable_caps_Sampled1DImage1D, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"2D", 1, 3, pygen_variable_caps_ShaderKernelImageMSArray, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, {"3D", 2, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, - {"Cube", 3, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, - {"Rect", 4, 1, pygen_variable_caps_SampledRect, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, - {"Buffer", 5, 1, pygen_variable_caps_SampledBuffer, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Cube", 3, 2, pygen_variable_caps_ShaderImageCubeArray, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Rect", 4, 2, pygen_variable_caps_SampledRectImageRect, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"Buffer", 5, 2, pygen_variable_caps_SampledBufferImageBuffer, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, {"SubpassData", 6, 1, pygen_variable_caps_InputAttachment, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)} }; @@ -430,11 +501,17 @@ static const spv_operand_desc_t pygen_variable_DecorationEntries[] = { {"MaxByteOffset", 45, 1, pygen_variable_caps_Addresses, 0, nullptr, {SPV_OPERAND_TYPE_LITERAL_INTEGER}, SPV_SPIRV_VERSION_WORD(1,1)}, {"AlignmentId", 46, 1, pygen_variable_caps_Kernel, 0, nullptr, {SPV_OPERAND_TYPE_ID}, SPV_SPIRV_VERSION_WORD(1,2)}, {"MaxByteOffsetId", 47, 1, pygen_variable_caps_Addresses, 0, nullptr, {SPV_OPERAND_TYPE_ID}, SPV_SPIRV_VERSION_WORD(1,2)}, + {"NoSignedWrap", 4469, 0, nullptr, 1, pygen_variable_exts_SPV_KHR_no_integer_wrap_decoration, {}, 0xffffffffu}, + {"NoUnsignedWrap", 4470, 0, nullptr, 1, pygen_variable_exts_SPV_KHR_no_integer_wrap_decoration, {}, 0xffffffffu}, {"ExplicitInterpAMD", 4999, 0, nullptr, 1, pygen_variable_exts_SPV_AMD_shader_explicit_vertex_parameter, {}, 0xffffffffu}, {"OverrideCoverageNV", 5248, 1, pygen_variable_caps_SampleMaskOverrideCoverageNV, 1, pygen_variable_exts_SPV_NV_sample_mask_override_coverage, {}, 0xffffffffu}, {"PassthroughNV", 5250, 1, pygen_variable_caps_GeometryShaderPassthroughNV, 1, pygen_variable_exts_SPV_NV_geometry_shader_passthrough, {}, 0xffffffffu}, {"ViewportRelativeNV", 5252, 1, pygen_variable_caps_ShaderViewportMaskNV, 0, nullptr, {}, 0xffffffffu}, {"SecondaryViewportRelativeNV", 5256, 1, pygen_variable_caps_ShaderStereoViewNV, 1, pygen_variable_exts_SPV_NV_stereo_view_rendering, {SPV_OPERAND_TYPE_LITERAL_INTEGER}, 0xffffffffu}, + {"PerPrimitiveNV", 5271, 1, pygen_variable_caps_MeshShadingNV, 1, pygen_variable_exts_SPV_NV_mesh_shader, {}, 0xffffffffu}, + {"PerViewNV", 5272, 1, pygen_variable_caps_MeshShadingNV, 1, pygen_variable_exts_SPV_NV_mesh_shader, {}, 0xffffffffu}, + {"PerTaskNV", 5273, 1, pygen_variable_caps_MeshShadingNV, 1, pygen_variable_exts_SPV_NV_mesh_shader, {}, 0xffffffffu}, + {"PerVertexNV", 5285, 1, pygen_variable_caps_FragmentBarycentricNV, 1, pygen_variable_exts_SPV_NV_fragment_shader_barycentric, {}, 0xffffffffu}, {"NonUniformEXT", 5300, 1, pygen_variable_caps_ShaderNonUniformEXT, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, {"HlslCounterBufferGOOGLE", 5634, 0, nullptr, 1, pygen_variable_exts_SPV_GOOGLE_hlsl_functionality1, {SPV_OPERAND_TYPE_ID}, 0xffffffffu}, {"HlslSemanticGOOGLE", 5635, 0, nullptr, 1, pygen_variable_exts_SPV_GOOGLE_hlsl_functionality1, {SPV_OPERAND_TYPE_LITERAL_STRING}, 0xffffffffu} @@ -447,7 +524,7 @@ static const spv_operand_desc_t pygen_variable_BuiltInEntries[] = { {"CullDistance", 4, 1, pygen_variable_caps_CullDistance, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, {"VertexId", 5, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, {"InstanceId", 6, 1, pygen_variable_caps_Shader, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, - {"PrimitiveId", 7, 2, pygen_variable_caps_GeometryTessellation, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"PrimitiveId", 7, 3, pygen_variable_caps_GeometryTessellationRayTracingNV, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, {"InvocationId", 8, 2, pygen_variable_caps_GeometryTessellation, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, {"Layer", 9, 1, pygen_variable_caps_Geometry, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, {"ViewportIndex", 10, 1, pygen_variable_caps_MultiViewport, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, @@ -494,7 +571,7 @@ static const spv_operand_desc_t pygen_variable_BuiltInEntries[] = { {"SubgroupLtMaskKHR", 4420, 2, pygen_variable_caps_SubgroupBallotKHRGroupNonUniformBallot, 1, pygen_variable_exts_SPV_KHR_shader_ballot, {}, SPV_SPIRV_VERSION_WORD(1,3)}, {"BaseVertex", 4424, 1, pygen_variable_caps_DrawParameters, 1, pygen_variable_exts_SPV_KHR_shader_draw_parameters, {}, SPV_SPIRV_VERSION_WORD(1,3)}, {"BaseInstance", 4425, 1, pygen_variable_caps_DrawParameters, 1, pygen_variable_exts_SPV_KHR_shader_draw_parameters, {}, SPV_SPIRV_VERSION_WORD(1,3)}, - {"DrawIndex", 4426, 1, pygen_variable_caps_DrawParameters, 1, pygen_variable_exts_SPV_KHR_shader_draw_parameters, {}, SPV_SPIRV_VERSION_WORD(1,3)}, + {"DrawIndex", 4426, 2, pygen_variable_caps_DrawParametersMeshShadingNV, 2, pygen_variable_exts_SPV_KHR_shader_draw_parametersSPV_NV_mesh_shader, {}, SPV_SPIRV_VERSION_WORD(1,3)}, {"DeviceIndex", 4438, 1, pygen_variable_caps_DeviceGroup, 1, pygen_variable_exts_SPV_KHR_device_group, {}, SPV_SPIRV_VERSION_WORD(1,3)}, {"ViewIndex", 4440, 1, pygen_variable_caps_MultiView, 1, pygen_variable_exts_SPV_KHR_multiview, {}, SPV_SPIRV_VERSION_WORD(1,3)}, {"BaryCoordNoPerspAMD", 4992, 0, nullptr, 1, pygen_variable_exts_SPV_AMD_shader_explicit_vertex_parameter, {}, 0xffffffffu}, @@ -505,12 +582,40 @@ static const spv_operand_desc_t pygen_variable_BuiltInEntries[] = { {"BaryCoordSmoothSampleAMD", 4997, 0, nullptr, 1, pygen_variable_exts_SPV_AMD_shader_explicit_vertex_parameter, {}, 0xffffffffu}, {"BaryCoordPullModelAMD", 4998, 0, nullptr, 1, pygen_variable_exts_SPV_AMD_shader_explicit_vertex_parameter, {}, 0xffffffffu}, {"FragStencilRefEXT", 5014, 1, pygen_variable_caps_StencilExportEXT, 1, pygen_variable_exts_SPV_EXT_shader_stencil_export, {}, 0xffffffffu}, - {"ViewportMaskNV", 5253, 1, pygen_variable_caps_ShaderViewportMaskNV, 0, nullptr, {}, 0xffffffffu}, + {"ViewportMaskNV", 5253, 2, pygen_variable_caps_ShaderViewportMaskNVMeshShadingNV, 2, pygen_variable_exts_SPV_NV_viewport_array2SPV_NV_mesh_shader, {}, 0xffffffffu}, {"SecondaryPositionNV", 5257, 1, pygen_variable_caps_ShaderStereoViewNV, 1, pygen_variable_exts_SPV_NV_stereo_view_rendering, {}, 0xffffffffu}, {"SecondaryViewportMaskNV", 5258, 1, pygen_variable_caps_ShaderStereoViewNV, 1, pygen_variable_exts_SPV_NV_stereo_view_rendering, {}, 0xffffffffu}, - {"PositionPerViewNV", 5261, 1, pygen_variable_caps_PerViewAttributesNV, 0, nullptr, {}, 0xffffffffu}, - {"ViewportMaskPerViewNV", 5262, 1, pygen_variable_caps_PerViewAttributesNV, 0, nullptr, {}, 0xffffffffu}, - {"FullyCoveredEXT", 5264, 1, pygen_variable_caps_FragmentFullyCoveredEXT, 1, pygen_variable_exts_SPV_EXT_fragment_fully_covered, {}, 0xffffffffu} + {"PositionPerViewNV", 5261, 2, pygen_variable_caps_PerViewAttributesNVMeshShadingNV, 2, pygen_variable_exts_SPV_NVX_multiview_per_view_attributesSPV_NV_mesh_shader, {}, 0xffffffffu}, + {"ViewportMaskPerViewNV", 5262, 2, pygen_variable_caps_PerViewAttributesNVMeshShadingNV, 2, pygen_variable_exts_SPV_NVX_multiview_per_view_attributesSPV_NV_mesh_shader, {}, 0xffffffffu}, + {"FullyCoveredEXT", 5264, 1, pygen_variable_caps_FragmentFullyCoveredEXT, 1, pygen_variable_exts_SPV_EXT_fragment_fully_covered, {}, 0xffffffffu}, + {"TaskCountNV", 5274, 1, pygen_variable_caps_MeshShadingNV, 1, pygen_variable_exts_SPV_NV_mesh_shader, {}, 0xffffffffu}, + {"PrimitiveCountNV", 5275, 1, pygen_variable_caps_MeshShadingNV, 1, pygen_variable_exts_SPV_NV_mesh_shader, {}, 0xffffffffu}, + {"PrimitiveIndicesNV", 5276, 1, pygen_variable_caps_MeshShadingNV, 1, pygen_variable_exts_SPV_NV_mesh_shader, {}, 0xffffffffu}, + {"ClipDistancePerViewNV", 5277, 1, pygen_variable_caps_MeshShadingNV, 1, pygen_variable_exts_SPV_NV_mesh_shader, {}, 0xffffffffu}, + {"CullDistancePerViewNV", 5278, 1, pygen_variable_caps_MeshShadingNV, 1, pygen_variable_exts_SPV_NV_mesh_shader, {}, 0xffffffffu}, + {"LayerPerViewNV", 5279, 1, pygen_variable_caps_MeshShadingNV, 1, pygen_variable_exts_SPV_NV_mesh_shader, {}, 0xffffffffu}, + {"MeshViewCountNV", 5280, 1, pygen_variable_caps_MeshShadingNV, 1, pygen_variable_exts_SPV_NV_mesh_shader, {}, 0xffffffffu}, + {"MeshViewIndicesNV", 5281, 1, pygen_variable_caps_MeshShadingNV, 1, pygen_variable_exts_SPV_NV_mesh_shader, {}, 0xffffffffu}, + {"BaryCoordNV", 5286, 1, pygen_variable_caps_FragmentBarycentricNV, 1, pygen_variable_exts_SPV_NV_fragment_shader_barycentric, {}, 0xffffffffu}, + {"BaryCoordNoPerspNV", 5287, 1, pygen_variable_caps_FragmentBarycentricNV, 1, pygen_variable_exts_SPV_NV_fragment_shader_barycentric, {}, 0xffffffffu}, + {"FragSizeEXT", 5292, 2, pygen_variable_caps_FragmentDensityEXTShadingRateNV, 2, pygen_variable_exts_SPV_EXT_fragment_invocation_densitySPV_NV_shading_rate, {}, 0xffffffffu}, + {"FragmentSizeNV", 5292, 2, pygen_variable_caps_ShadingRateNVFragmentDensityEXT, 2, pygen_variable_exts_SPV_NV_shading_rateSPV_EXT_fragment_invocation_density, {}, 0xffffffffu}, + {"FragInvocationCountEXT", 5293, 2, pygen_variable_caps_FragmentDensityEXTShadingRateNV, 2, pygen_variable_exts_SPV_EXT_fragment_invocation_densitySPV_NV_shading_rate, {}, 0xffffffffu}, + {"InvocationsPerPixelNV", 5293, 2, pygen_variable_caps_ShadingRateNVFragmentDensityEXT, 2, pygen_variable_exts_SPV_NV_shading_rateSPV_EXT_fragment_invocation_density, {}, 0xffffffffu}, + {"LaunchIdNV", 5319, 1, pygen_variable_caps_RayTracingNV, 1, pygen_variable_exts_SPV_NV_ray_tracing, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"LaunchSizeNV", 5320, 1, pygen_variable_caps_RayTracingNV, 1, pygen_variable_exts_SPV_NV_ray_tracing, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"WorldRayOriginNV", 5321, 1, pygen_variable_caps_RayTracingNV, 1, pygen_variable_exts_SPV_NV_ray_tracing, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"WorldRayDirectionNV", 5322, 1, pygen_variable_caps_RayTracingNV, 1, pygen_variable_exts_SPV_NV_ray_tracing, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ObjectRayOriginNV", 5323, 1, pygen_variable_caps_RayTracingNV, 1, pygen_variable_exts_SPV_NV_ray_tracing, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ObjectRayDirectionNV", 5324, 1, pygen_variable_caps_RayTracingNV, 1, pygen_variable_exts_SPV_NV_ray_tracing, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"RayTminNV", 5325, 1, pygen_variable_caps_RayTracingNV, 1, pygen_variable_exts_SPV_NV_ray_tracing, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"RayTmaxNV", 5326, 1, pygen_variable_caps_RayTracingNV, 1, pygen_variable_exts_SPV_NV_ray_tracing, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"InstanceCustomIndexNV", 5327, 1, pygen_variable_caps_RayTracingNV, 1, pygen_variable_exts_SPV_NV_ray_tracing, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"ObjectToWorldNV", 5330, 1, pygen_variable_caps_RayTracingNV, 1, pygen_variable_exts_SPV_NV_ray_tracing, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"WorldToObjectNV", 5331, 1, pygen_variable_caps_RayTracingNV, 1, pygen_variable_exts_SPV_NV_ray_tracing, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"HitTNV", 5332, 1, pygen_variable_caps_RayTracingNV, 1, pygen_variable_exts_SPV_NV_ray_tracing, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"HitKindNV", 5333, 1, pygen_variable_caps_RayTracingNV, 1, pygen_variable_exts_SPV_NV_ray_tracing, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"IncomingRayFlagsNV", 5351, 1, pygen_variable_caps_RayTracingNV, 1, pygen_variable_exts_SPV_NV_ray_tracing, {}, SPV_SPIRV_VERSION_WORD(1, 0)} }; static const spv_operand_desc_t pygen_variable_ScopeEntries[] = { @@ -518,7 +623,8 @@ static const spv_operand_desc_t pygen_variable_ScopeEntries[] = { {"Device", 1, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, {"Workgroup", 2, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, {"Subgroup", 3, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, - {"Invocation", 4, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)} + {"Invocation", 4, 0, nullptr, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)}, + {"QueueFamilyKHR", 5, 1, pygen_variable_caps_VulkanMemoryModelKHR, 0, nullptr, {}, SPV_SPIRV_VERSION_WORD(1, 0)} }; static const spv_operand_desc_t pygen_variable_GroupOperationEntries[] = { @@ -623,6 +729,11 @@ static const spv_operand_desc_t pygen_variable_CapabilityEntries[] = { {"StorageBuffer8BitAccess", 4448, 0, nullptr, 1, pygen_variable_exts_SPV_KHR_8bit_storage, {}, 0xffffffffu}, {"UniformAndStorageBuffer8BitAccess", 4449, 1, pygen_variable_caps_StorageBuffer8BitAccess, 1, pygen_variable_exts_SPV_KHR_8bit_storage, {}, 0xffffffffu}, {"StoragePushConstant8", 4450, 0, nullptr, 1, pygen_variable_exts_SPV_KHR_8bit_storage, {}, 0xffffffffu}, + {"DenormPreserve", 4464, 0, nullptr, 1, pygen_variable_exts_SPV_KHR_float_controls, {}, 0xffffffffu}, + {"DenormFlushToZero", 4465, 0, nullptr, 1, pygen_variable_exts_SPV_KHR_float_controls, {}, 0xffffffffu}, + {"SignedZeroInfNanPreserve", 4466, 0, nullptr, 1, pygen_variable_exts_SPV_KHR_float_controls, {}, 0xffffffffu}, + {"RoundingModeRTE", 4467, 0, nullptr, 1, pygen_variable_exts_SPV_KHR_float_controls, {}, 0xffffffffu}, + {"RoundingModeRTZ", 4468, 0, nullptr, 1, pygen_variable_exts_SPV_KHR_float_controls, {}, 0xffffffffu}, {"Float16ImageAMD", 5008, 1, pygen_variable_caps_Shader, 1, pygen_variable_exts_SPV_AMD_gpu_shader_half_float_fetch, {}, 0xffffffffu}, {"ImageGatherBiasLodAMD", 5009, 1, pygen_variable_caps_Shader, 1, pygen_variable_exts_SPV_AMD_texture_gather_bias_lod, {}, 0xffffffffu}, {"FragmentMaskAMD", 5010, 1, pygen_variable_caps_Shader, 1, pygen_variable_exts_SPV_AMD_shader_fragment_mask, {}, 0xffffffffu}, @@ -636,6 +747,12 @@ static const spv_operand_desc_t pygen_variable_CapabilityEntries[] = { {"ShaderStereoViewNV", 5259, 1, pygen_variable_caps_ShaderViewportMaskNV, 1, pygen_variable_exts_SPV_NV_stereo_view_rendering, {}, 0xffffffffu}, {"PerViewAttributesNV", 5260, 1, pygen_variable_caps_MultiView, 1, pygen_variable_exts_SPV_NVX_multiview_per_view_attributes, {}, 0xffffffffu}, {"FragmentFullyCoveredEXT", 5265, 1, pygen_variable_caps_Shader, 1, pygen_variable_exts_SPV_EXT_fragment_fully_covered, {}, 0xffffffffu}, + {"MeshShadingNV", 5266, 1, pygen_variable_caps_Shader, 1, pygen_variable_exts_SPV_NV_mesh_shader, {}, 0xffffffffu}, + {"ImageFootprintNV", 5282, 0, nullptr, 1, pygen_variable_exts_SPV_NV_shader_image_footprint, {}, 0xffffffffu}, + {"FragmentBarycentricNV", 5284, 0, nullptr, 1, pygen_variable_exts_SPV_NV_fragment_shader_barycentric, {}, 0xffffffffu}, + {"ComputeDerivativeGroupQuadsNV", 5288, 0, nullptr, 1, pygen_variable_exts_SPV_NV_compute_shader_derivatives, {}, 0xffffffffu}, + {"FragmentDensityEXT", 5291, 1, pygen_variable_caps_Shader, 2, pygen_variable_exts_SPV_EXT_fragment_invocation_densitySPV_NV_shading_rate, {}, 0xffffffffu}, + {"ShadingRateNV", 5291, 1, pygen_variable_caps_Shader, 2, pygen_variable_exts_SPV_NV_shading_rateSPV_EXT_fragment_invocation_density, {}, 0xffffffffu}, {"GroupNonUniformPartitionedNV", 5297, 0, nullptr, 1, pygen_variable_exts_SPV_NV_shader_subgroup_partitioned, {}, 0xffffffffu}, {"ShaderNonUniformEXT", 5301, 1, pygen_variable_caps_Shader, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, 0xffffffffu}, {"RuntimeDescriptorArrayEXT", 5302, 1, pygen_variable_caps_Shader, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, 0xffffffffu}, @@ -649,6 +766,10 @@ static const spv_operand_desc_t pygen_variable_CapabilityEntries[] = { {"InputAttachmentArrayNonUniformIndexingEXT", 5310, 2, pygen_variable_caps_InputAttachmentShaderNonUniformEXT, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, 0xffffffffu}, {"UniformTexelBufferArrayNonUniformIndexingEXT", 5311, 2, pygen_variable_caps_SampledBufferShaderNonUniformEXT, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, 0xffffffffu}, {"StorageTexelBufferArrayNonUniformIndexingEXT", 5312, 2, pygen_variable_caps_ImageBufferShaderNonUniformEXT, 1, pygen_variable_exts_SPV_EXT_descriptor_indexing, {}, 0xffffffffu}, + {"RayTracingNV", 5340, 1, pygen_variable_caps_Shader, 1, pygen_variable_exts_SPV_NV_ray_tracing, {}, 0xffffffffu}, + {"VulkanMemoryModelKHR", 5345, 0, nullptr, 1, pygen_variable_exts_SPV_KHR_vulkan_memory_model, {}, 0xffffffffu}, + {"VulkanMemoryModelDeviceScopeKHR", 5346, 0, nullptr, 1, pygen_variable_exts_SPV_KHR_vulkan_memory_model, {}, 0xffffffffu}, + {"ComputeDerivativeGroupLinearNV", 5350, 0, nullptr, 1, pygen_variable_exts_SPV_NV_compute_shader_derivatives, {}, 0xffffffffu}, {"SubgroupShuffleINTEL", 5568, 0, nullptr, 1, pygen_variable_exts_SPV_INTEL_subgroups, {}, 0xffffffffu}, {"SubgroupBufferBlockIOINTEL", 5569, 0, nullptr, 1, pygen_variable_exts_SPV_INTEL_subgroups, {}, 0xffffffffu}, {"SubgroupImageBlockIOINTEL", 5570, 0, nullptr, 1, pygen_variable_exts_SPV_INTEL_subgroups, {}, 0xffffffffu} diff --git a/3rdparty/spirv-tools/include/spirv-tools/instrument.hpp b/3rdparty/spirv-tools/include/spirv-tools/instrument.hpp new file mode 100644 index 000000000..69d1ad259 --- /dev/null +++ b/3rdparty/spirv-tools/include/spirv-tools/instrument.hpp @@ -0,0 +1,135 @@ +// Copyright (c) 2018 The Khronos Group Inc. +// Copyright (c) 2018 Valve Corporation +// Copyright (c) 2018 LunarG Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef INCLUDE_SPIRV_TOOLS_INSTRUMENT_HPP_ +#define INCLUDE_SPIRV_TOOLS_INSTRUMENT_HPP_ + +// Shader Instrumentation Interface +// +// This file provides an external interface for applications that wish to +// communicate with shaders instrumented by passes created by: +// +// CreateInstBindlessCheckPass +// +// More detailed documentation of this routine can be found in optimizer.hpp + +namespace spvtools { + +// Stream Output Buffer Offsets +// +// The following values provide 32-bit word offsets into the output buffer +// generated by InstrumentPass::GenDebugStreamWrite. This method is utilized +// by InstBindlessCheckPass. +// +// The first word of the debug output buffer contains the next available word +// in the data stream to be written. Shaders will atomically read and update +// this value so as not to overwrite each others records. This value must be +// initialized to zero +static const int kDebugOutputSizeOffset = 0; + +// The second word of the output buffer is the start of the stream of records +// written by the instrumented shaders. Each record represents a validation +// error. The format of the records is documented below. +static const int kDebugOutputDataOffset = 1; + +// Common Stream Record Offsets +// +// The following are offsets to fields which are common to all records written +// to the output stream. +// +// Each record first contains the size of the record in 32-bit words, including +// the size word. +static const int kInstCommonOutSize = 0; + +// This is the shader id passed by the layer when the instrumentation pass is +// created. +static const int kInstCommonOutShaderId = 1; + +// This is the ordinal position of the instruction within the SPIR-V shader +// which generated the validation error. +static const int kInstCommonOutInstructionIdx = 2; + +// This is the stage which generated the validation error. This word is used +// to determine the contents of the next two words in the record. +// 0:Vert, 1:TessCtrl, 2:TessEval, 3:Geom, 4:Frag, 5:Compute +static const int kInstCommonOutStageIdx = 3; +static const int kInstCommonOutCnt = 4; + +// Stage-specific Stream Record Offsets +// +// Each stage will contain different values in the next two words of the record +// used to identify which instantiation of the shader generated the validation +// error. +// +// Vertex Shader Output Record Offsets +static const int kInstVertOutVertexId = kInstCommonOutCnt; +static const int kInstVertOutInstanceId = kInstCommonOutCnt + 1; + +// Frag Shader Output Record Offsets +static const int kInstFragOutFragCoordX = kInstCommonOutCnt; +static const int kInstFragOutFragCoordY = kInstCommonOutCnt + 1; + +// Compute Shader Output Record Offsets +static const int kInstCompOutGlobalInvocationId = kInstCommonOutCnt; +static const int kInstCompOutUnused = kInstCommonOutCnt + 1; + +// Tessellation Shader Output Record Offsets +static const int kInstTessOutInvocationId = kInstCommonOutCnt; +static const int kInstTessOutUnused = kInstCommonOutCnt + 1; + +// Geometry Shader Output Record Offsets +static const int kInstGeomOutPrimitiveId = kInstCommonOutCnt; +static const int kInstGeomOutInvocationId = kInstCommonOutCnt + 1; + +// Size of Common and Stage-specific Members +static const int kInstStageOutCnt = kInstCommonOutCnt + 2; + +// Validation Error Code +// +// This identifies the validation error. It also helps to identify +// how many words follow in the record and their meaning. +static const int kInstValidationOutError = kInstStageOutCnt; + +// Validation-specific Output Record Offsets +// +// Each different validation will generate a potentially different +// number of words at the end of the record giving more specifics +// about the validation error. +// +// A bindless bounds error will output the index and the bound. +static const int kInstBindlessOutDescIndex = kInstStageOutCnt + 1; +static const int kInstBindlessOutDescBound = kInstStageOutCnt + 2; +static const int kInstBindlessOutCnt = kInstStageOutCnt + 3; + +// Maximum Output Record Member Count +static const int kInstMaxOutCnt = kInstStageOutCnt + 3; + +// Validation Error Codes +// +// These are the possible validation error codes. +static const int kInstErrorBindlessBounds = 0; + +// Debug Buffer Bindings +// +// These are the bindings for the different buffers which are +// read or written by the instrumentation passes. +// +// This is the output buffer written by InstBindlessCheckPass. +static const int kDebugOutputBindingStream = 0; + +} // namespace spvtools + +#endif // INCLUDE_SPIRV_TOOLS_INSTRUMENT_HPP_ diff --git a/3rdparty/spirv-tools/include/spirv-tools/libspirv.h b/3rdparty/spirv-tools/include/spirv-tools/libspirv.h index a7e1b3007..ff7eb6b6c 100644 --- a/3rdparty/spirv-tools/include/spirv-tools/libspirv.h +++ b/3rdparty/spirv-tools/include/spirv-tools/libspirv.h @@ -288,6 +288,12 @@ typedef enum spv_binary_to_text_options_t { SPV_FORCE_32_BIT_ENUM(spv_binary_to_text_options_t) } spv_binary_to_text_options_t; +// Constants + +// The default id bound is to the minimum value for the id limit +// in the spir-v specification under the section "Universal Limits". +const uint32_t kDefaultMaxIdBound = 0x3FFFFF; + // Structures // Information about an operand parsed from a binary SPIR-V module. @@ -360,6 +366,10 @@ typedef struct spv_context_t spv_context_t; typedef struct spv_validator_options_t spv_validator_options_t; +typedef struct spv_optimizer_options_t spv_optimizer_options_t; + +typedef struct spv_reducer_options_t spv_reducer_options_t; + // Type Definitions typedef spv_const_binary_t* spv_const_binary; @@ -371,6 +381,10 @@ typedef const spv_context_t* spv_const_context; typedef spv_context_t* spv_context; typedef spv_validator_options_t* spv_validator_options; typedef const spv_validator_options_t* spv_const_validator_options; +typedef spv_optimizer_options_t* spv_optimizer_options; +typedef const spv_optimizer_options_t* spv_const_optimizer_options; +typedef spv_reducer_options_t* spv_reducer_options; +typedef const spv_reducer_options_t* spv_const_reducer_options; // Platform API @@ -425,6 +439,7 @@ typedef enum { spv_validator_limit_max_function_args, spv_validator_limit_max_control_flow_nesting_depth, spv_validator_limit_max_access_chain_indexes, + spv_validator_limit_max_id_bound, } spv_validator_limit; // Returns a string describing the given SPIR-V target environment. @@ -473,23 +488,85 @@ SPIRV_TOOLS_EXPORT void spvValidatorOptionsSetRelaxStoreStruct( SPIRV_TOOLS_EXPORT void spvValidatorOptionsSetRelaxLogicalPointer( spv_validator_options options, bool val); -// Records whether or not the validator should relax the rules on block layout. +// Records whether the validator should use "relaxed" block layout rules. +// Relaxed layout rules are described by Vulkan extension +// VK_KHR_relaxed_block_layout, and they affect uniform blocks, storage blocks, +// and push constants. // -// When relaxed, it will enable VK_KHR_relaxed_block_layout when validating -// standard uniform/storage block layout. +// This is enabled by default when targeting Vulkan 1.1 or later. +// Relaxed layout is more permissive than the default rules in Vulkan 1.0. SPIRV_TOOLS_EXPORT void spvValidatorOptionsSetRelaxBlockLayout( spv_validator_options options, bool val); +// Records whether the validator should use "scalar" block layout rules. +// Scalar layout rules are more permissive than relaxed block layout. +// +// See Vulkan extnesion VK_EXT_scalar_block_layout. The scalar alignment is +// defined as follows: +// - scalar alignment of a scalar is the scalar size +// - scalar alignment of a vector is the scalar alignment of its component +// - scalar alignment of a matrix is the scalar alignment of its component +// - scalar alignment of an array is the scalar alignment of its element +// - scalar alignment of a struct is the max scalar alignment among its +// members +// +// For a struct in Uniform, StorageClass, or PushConstant: +// - a member Offset must be a multiple of the member's scalar alignment +// - ArrayStride or MatrixStride must be a multiple of the array or matrix +// scalar alignment +SPIRV_TOOLS_EXPORT void spvValidatorOptionsSetScalarBlockLayout( + spv_validator_options options, bool val); + // Records whether or not the validator should skip validating standard // uniform/storage block layout. SPIRV_TOOLS_EXPORT void spvValidatorOptionsSetSkipBlockLayout( spv_validator_options options, bool val); +// Creates an optimizer options object with default options. Returns a valid +// options object. The object remains valid until it is passed into +// |spvOptimizerOptionsDestroy|. +SPIRV_TOOLS_EXPORT spv_optimizer_options spvOptimizerOptionsCreate(void); + +// Destroys the given optimizer options object. +SPIRV_TOOLS_EXPORT void spvOptimizerOptionsDestroy( + spv_optimizer_options options); + +// Records whether or not the optimizer should run the validator before +// optimizing. If |val| is true, the validator will be run. +SPIRV_TOOLS_EXPORT void spvOptimizerOptionsSetRunValidator( + spv_optimizer_options options, bool val); + +// Records the validator options that should be passed to the validator if it is +// run. +SPIRV_TOOLS_EXPORT void spvOptimizerOptionsSetValidatorOptions( + spv_optimizer_options options, spv_validator_options val); + +// Records the maximum possible value for the id bound. +SPIRV_TOOLS_EXPORT void spvOptimizerOptionsSetMaxIdBound( + spv_optimizer_options options, uint32_t val); + +// Creates a reducer options object with default options. Returns a valid +// options object. The object remains valid until it is passed into +// |spvReducerOptionsDestroy|. +SPIRV_TOOLS_EXPORT spv_reducer_options spvReducerOptionsCreate(); + +// Destroys the given reducer options object. +SPIRV_TOOLS_EXPORT void spvReducerOptionsDestroy(spv_reducer_options options); + +// Records the maximum number of reduction steps that should run before the +// reducer gives up. +SPIRV_TOOLS_EXPORT void spvReducerOptionsSetStepLimit( + spv_reducer_options options, uint32_t step_limit); + +// Sets seed for random number generation. +SPIRV_TOOLS_EXPORT void spvReducerOptionsSetSeed(spv_reducer_options options, + uint32_t seed); + // Encodes the given SPIR-V assembly text to its binary representation. The // length parameter specifies the number of bytes for text. Encoded binary will // be stored into *binary. Any error will be written into *diagnostic if -// diagnostic is non-null. The generated binary is independent of the context -// and may outlive it. +// diagnostic is non-null, otherwise the context's message consumer will be +// used. The generated binary is independent of the context and may outlive it. SPIRV_TOOLS_EXPORT spv_result_t spvTextToBinary(const spv_const_context context, const char* text, const size_t length, @@ -511,7 +588,8 @@ SPIRV_TOOLS_EXPORT void spvTextDestroy(spv_text text); // word_count parameter specifies the number of words for binary. The options // parameter is a bit field of spv_binary_to_text_options_t. Decoded text will // be stored into *text. Any error will be written into *diagnostic if -// diagnostic is non-null. +// diagnostic is non-null, otherwise the context's message consumer will be +// used. SPIRV_TOOLS_EXPORT spv_result_t spvBinaryToText(const spv_const_context context, const uint32_t* binary, const size_t word_count, @@ -524,20 +602,22 @@ SPIRV_TOOLS_EXPORT spv_result_t spvBinaryToText(const spv_const_context context, SPIRV_TOOLS_EXPORT void spvBinaryDestroy(spv_binary binary); // Validates a SPIR-V binary for correctness. Any errors will be written into -// *diagnostic if diagnostic is non-null. +// *diagnostic if diagnostic is non-null, otherwise the context's message +// consumer will be used. SPIRV_TOOLS_EXPORT spv_result_t spvValidate(const spv_const_context context, const spv_const_binary binary, spv_diagnostic* diagnostic); // Validates a SPIR-V binary for correctness. Uses the provided Validator // options. Any errors will be written into *diagnostic if diagnostic is -// non-null. +// non-null, otherwise the context's message consumer will be used. SPIRV_TOOLS_EXPORT spv_result_t spvValidateWithOptions( const spv_const_context context, const spv_const_validator_options options, const spv_const_binary binary, spv_diagnostic* diagnostic); // Validates a raw SPIR-V binary for correctness. Any errors will be written -// into *diagnostic if diagnostic is non-null. +// into *diagnostic if diagnostic is non-null, otherwise the context's message +// consumer will be used. SPIRV_TOOLS_EXPORT spv_result_t spvValidateBinary(const spv_const_context context, const uint32_t* words, const size_t num_words, spv_diagnostic* diagnostic); @@ -584,7 +664,8 @@ typedef spv_result_t (*spv_parsed_instruction_fn_t)( // is supplied as context to the callbacks. Returns SPV_SUCCESS on successful // parse where the callbacks always return SPV_SUCCESS. For an invalid parse, // returns a status code other than SPV_SUCCESS, and if diagnostic is non-null -// also emits a diagnostic. If a callback returns anything other than +// also emits a diagnostic. If diagnostic is null the context's message consumer +// will be used to emit any errors. If a callback returns anything other than // SPV_SUCCESS, then that status code is returned, no further callbacks are // issued, and no additional diagnostics are emitted. SPIRV_TOOLS_EXPORT spv_result_t spvBinaryParse( diff --git a/3rdparty/spirv-tools/include/spirv-tools/libspirv.hpp b/3rdparty/spirv-tools/include/spirv-tools/libspirv.hpp index b6ae38c10..9cb5afe3f 100644 --- a/3rdparty/spirv-tools/include/spirv-tools/libspirv.hpp +++ b/3rdparty/spirv-tools/include/spirv-tools/libspirv.hpp @@ -82,12 +82,20 @@ class ValidatorOptions { } // Enables VK_KHR_relaxed_block_layout when validating standard - // uniform/storage buffer layout. + // uniform/storage buffer/push-constant layout. If true, disables + // scalar block layout rules. void SetRelaxBlockLayout(bool val) { spvValidatorOptionsSetRelaxBlockLayout(options_, val); } - // Skips validating standard uniform/storage buffer layout. + // Enables VK_EXT_scalar_block_layout when validating standard + // uniform/storage buffer/push-constant layout. If true, disables + // relaxed block layout rules. + void SetScalarBlockLayout(bool val) { + spvValidatorOptionsSetScalarBlockLayout(options_, val); + } + + // Skips validating standard uniform/storage buffer/push-constant layout. void SetSkipBlockLayout(bool val) { spvValidatorOptionsSetSkipBlockLayout(options_, val); } @@ -106,6 +114,58 @@ class ValidatorOptions { spv_validator_options options_; }; +// A C++ wrapper around an optimization options object. +class OptimizerOptions { + public: + OptimizerOptions() : options_(spvOptimizerOptionsCreate()) {} + ~OptimizerOptions() { spvOptimizerOptionsDestroy(options_); } + + // Allow implicit conversion to the underlying object. + operator spv_optimizer_options() const { return options_; } + + // Records whether or not the optimizer should run the validator before + // optimizing. If |run| is true, the validator will be run. + void set_run_validator(bool run) { + spvOptimizerOptionsSetRunValidator(options_, run); + } + + // Records the validator options that should be passed to the validator if it + // is run. + void set_validator_options(const ValidatorOptions& val_options) { + spvOptimizerOptionsSetValidatorOptions(options_, val_options); + } + + // Records the maximum possible value for the id bound. + void set_max_id_bound(uint32_t new_bound) { + spvOptimizerOptionsSetMaxIdBound(options_, new_bound); + } + + private: + spv_optimizer_options options_; +}; + +// A C++ wrapper around a reducer options object. +class ReducerOptions { + public: + ReducerOptions() : options_(spvReducerOptionsCreate()) {} + ~ReducerOptions() { spvReducerOptionsDestroy(options_); } + + // Allow implicit conversion to the underlying object. + operator spv_reducer_options() const { return options_; } + + // Records the maximum number of reduction steps that should + // run before the reducer gives up. + void set_step_limit(uint32_t step_limit) { + spvReducerOptionsSetStepLimit(options_, step_limit); + } + + // Sets a seed to be used for random number generation. + void set_seed(uint32_t seed) { spvReducerOptionsSetSeed(options_, seed); } + + private: + spv_reducer_options options_; +}; + // C++ interface for SPIRV-Tools functionalities. It wraps the context // (including target environment and the corresponding SPIR-V grammar) and // provides methods for assembling, disassembling, and validating. @@ -173,7 +233,7 @@ class SpirvTools { bool Validate(const uint32_t* binary, size_t binary_size) const; // Like the previous overload, but takes an options object. bool Validate(const uint32_t* binary, size_t binary_size, - const ValidatorOptions& options) const; + spv_validator_options options) const; private: struct Impl; // Opaque struct for holding the data fields used by this class. diff --git a/3rdparty/spirv-tools/include/spirv-tools/optimizer.hpp b/3rdparty/spirv-tools/include/spirv-tools/optimizer.hpp index 4364d9ff5..b2865a80e 100644 --- a/3rdparty/spirv-tools/include/spirv-tools/optimizer.hpp +++ b/3rdparty/spirv-tools/include/spirv-tools/optimizer.hpp @@ -101,6 +101,11 @@ class Optimizer { // from time to time. Optimizer& RegisterSizePasses(); + // Registers passes that have been prescribed for WebGPU environments. + // This sequence of passes is subject to constant review and will change + // from time to time. + Optimizer& RegisterWebGPUPasses(); + // Registers passes that attempt to legalize the generated code. // // Note: this recipe is specially designed for legalizing SPIR-V. It should be @@ -148,6 +153,10 @@ class Optimizer { // returns false. bool FlagHasValidForm(const std::string& flag) const; + // Allows changing, after creation time, the target environment to be + // optimized for. Should be called before calling Run(). + void SetTargetEnv(const spv_target_env env); + // Optimizes the given SPIR-V module |original_binary| and writes the // optimized binary into |optimized_binary|. // Returns true on successful optimization, whether or not the module is @@ -160,13 +169,20 @@ class Optimizer { bool Run(const uint32_t* original_binary, size_t original_binary_size, std::vector* optimized_binary) const; - // Same as above, except passes |options| to the validator when trying to - // validate the binary. If |skip_validation| is true, then the caller is - // guaranteeing that |original_binary| is valid, and the validator will not - // be run. + // DEPRECATED: Same as above, except passes |options| to the validator when + // trying to validate the binary. If |skip_validation| is true, then the + // caller is guaranteeing that |original_binary| is valid, and the validator + // will not be run. The |max_id_bound| is the limit on the max id in the + // module. bool Run(const uint32_t* original_binary, const size_t original_binary_size, std::vector* optimized_binary, - const ValidatorOptions& options, bool skip_validation = false) const; + const ValidatorOptions& options, bool skip_validation) const; + + // Same as above, except it takes an options object. See the documentation + // for |OptimizerOptions| to see which options can be set. + bool Run(const uint32_t* original_binary, const size_t original_binary_size, + std::vector* optimized_binary, + const spv_optimizer_options opt_options) const; // Returns a vector of strings with all the pass names added to this // optimizer's pass manager. These strings are valid until the associated @@ -492,6 +508,30 @@ Optimizer::PassToken CreateCommonUniformElimPass(); // eliminated with standard dead code elimination. Optimizer::PassToken CreateAggressiveDCEPass(); +// Create line propagation pass +// This pass propagates line information based on the rules for OpLine and +// OpNoline and clones an appropriate line instruction into every instruction +// which does not already have debug line instructions. +// +// This pass is intended to maximize preservation of source line information +// through passes which delete, move and clone instructions. Ideally it should +// be run before any such pass. It is a bookend pass with EliminateDeadLines +// which can be used to remove redundant line instructions at the end of a +// run of such passes and reduce final output file size. +Optimizer::PassToken CreatePropagateLineInfoPass(); + +// Create dead line elimination pass +// This pass eliminates redundant line instructions based on the rules for +// OpLine and OpNoline. Its main purpose is to reduce the size of the file +// need to store the SPIR-V without losing line information. +// +// This is a bookend pass with PropagateLines which attaches line instructions +// to every instruction to preserve line information during passes which +// delete, move and clone instructions. DeadLineElim should be run after +// PropagateLines and all such subsequent passes. Normally it would be one +// of the last passes to be run. +Optimizer::PassToken CreateRedundantLineInfoElimPass(); + // Creates a compact ids pass. // The pass remaps result ids to a compact and gapless range starting from %1. Optimizer::PassToken CreateCompactIdsPass(); @@ -650,6 +690,38 @@ Optimizer::PassToken CreateReduceLoadSizePass(); // them into a single instruction where possible. Optimizer::PassToken CreateCombineAccessChainsPass(); +// Create a pass to instrument bindless descriptor checking +// This pass instruments all bindless references to check that descriptor +// array indices are inbounds. If the reference is invalid, a record is +// written to the debug output buffer (if space allows) and a null value is +// returned. This pass is designed to support bindless validation in the Vulkan +// validation layers. +// +// Dead code elimination should be run after this pass as the original, +// potentially invalid code is not removed and could cause undefined behavior, +// including crashes. It may also be beneficial to run Simplification +// (ie Constant Propagation), DeadBranchElim and BlockMerge after this pass to +// optimize instrument code involving the testing of compile-time constants. +// It is also generally recommended that this pass (and all +// instrumentation passes) be run after any legalization and optimization +// passes. This will give better analysis for the instrumentation and avoid +// potentially de-optimizing the instrument code, for example, inlining +// the debug record output function throughout the module. +// +// The instrumentation will read and write buffers in debug +// descriptor set |desc_set|. It will write |shader_id| in each output record +// to identify the shader module which generated the record. +// +// TODO(greg-lunarg): Add support for vk_ext_descriptor_indexing. +Optimizer::PassToken CreateInstBindlessCheckPass(uint32_t desc_set, + uint32_t shader_id); + +// Create a pass to upgrade to the VulkanKHR memory model. +// This pass upgrades the Logical GLSL450 memory model to Logical VulkanKHR. +// Additionally, it modifies memory, image, atomic and barrier operations to +// conform to that model's requirements. +Optimizer::PassToken CreateUpgradeMemoryModelPass(); + } // namespace spvtools #endif // INCLUDE_SPIRV_TOOLS_OPTIMIZER_HPP_ diff --git a/3rdparty/spirv-tools/kokoro/shaderc-smoketest/build.sh b/3rdparty/spirv-tools/kokoro/shaderc-smoketest/build.sh new file mode 100644 index 000000000..638ca8c61 --- /dev/null +++ b/3rdparty/spirv-tools/kokoro/shaderc-smoketest/build.sh @@ -0,0 +1,71 @@ +#!/bin/bash +# Copyright (c) 2018 Google LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Fail on any error. +set -e +# Display commands being run. +set -x + +BUILD_ROOT=$PWD +GITHUB_DIR=$BUILD_ROOT/github + +SKIP_TESTS="False" +BUILD_TYPE="Release" + +# Get NINJA. +wget -q https://github.com/ninja-build/ninja/releases/download/v1.8.2/ninja-linux.zip +unzip -q ninja-linux.zip +export PATH="$PWD:$PATH" + +# Get shaderc. +cd $GITHUB_DIR +git clone https://github.com/google/shaderc.git +SHADERC_DIR=$GITHUB_DIR/shaderc +cd $SHADERC_DIR/third_party + +# Get shaderc dependencies. Link the appropriate SPIRV-Tools. +git clone https://github.com/google/googletest.git +git clone https://github.com/google/glslang.git +ln -s $GITHUB_DIR/SPIRV-Tools spirv-tools +git clone https://github.com/KhronosGroup/SPIRV-Headers.git spirv-headers +git clone https://github.com/google/re2 +git clone https://github.com/google/effcee + +cd $SHADERC_DIR +mkdir build +cd $SHADERC_DIR/build + +# Invoke the build. +BUILD_SHA=${KOKORO_GITHUB_COMMIT:-$KOKORO_GITHUB_PULL_REQUEST_COMMIT} +echo $(date): Starting build... +cmake -GNinja -DRE2_BUILD_TESTING=OFF -DCMAKE_BUILD_TYPE=$BUILD_TYPE .. + +echo $(date): Build glslang... +ninja glslangValidator + +echo $(date): Build everything... +ninja +echo $(date): Build completed. + +echo $(date): Check Shaderc for copyright notices... +ninja check-copyright + +echo $(date): Starting ctest... +if [ $SKIP_TESTS = "False" ] +then + ctest --output-on-failure -j4 +fi +echo $(date): ctest completed. + diff --git a/3rdparty/spirv-tools/kokoro/shaderc-smoketest/continuous.cfg b/3rdparty/spirv-tools/kokoro/shaderc-smoketest/continuous.cfg new file mode 100644 index 000000000..ee151ae1a --- /dev/null +++ b/3rdparty/spirv-tools/kokoro/shaderc-smoketest/continuous.cfg @@ -0,0 +1,17 @@ +# Copyright (c) 2018 Google LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Continuous build configuration. +build_file: "SPIRV-Tools/kokoro/shaderc-smoketest/build.sh" + diff --git a/3rdparty/spirv-tools/kokoro/shaderc-smoketest/presubmit.cfg b/3rdparty/spirv-tools/kokoro/shaderc-smoketest/presubmit.cfg new file mode 100644 index 000000000..4f2ed21b7 --- /dev/null +++ b/3rdparty/spirv-tools/kokoro/shaderc-smoketest/presubmit.cfg @@ -0,0 +1,17 @@ +# Copyright (c) 2018 Google LLC. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Presubmit build configuration. +build_file: "SPIRV-Tools/kokoro/shaderc-smoketest/build.sh" + diff --git a/3rdparty/spirv-tools/source/CMakeLists.txt b/3rdparty/spirv-tools/source/CMakeLists.txt index 4df5de3ad..03efa9196 100644 --- a/3rdparty/spirv-tools/source/CMakeLists.txt +++ b/3rdparty/spirv-tools/source/CMakeLists.txt @@ -25,10 +25,10 @@ set(DEBUGINFO_GRAMMAR_JSON_FILE "${CMAKE_CURRENT_SOURCE_DIR}/extinst.debuginfo.g # file paths into some global lists (*_CPP_DEPENDS). And those global lists are # later used by set_source_files_properties() calls. # function() definitions are not suitable because they create new scopes. -macro(spvtools_core_tables VERSION) - set(GRAMMAR_JSON_FILE "${SPIRV_HEADER_INCLUDE_DIR}/spirv/${VERSION}/spirv.core.grammar.json") - set(GRAMMAR_INSTS_INC_FILE "${spirv-tools_BINARY_DIR}/core.insts-${VERSION}.inc") - set(GRAMMAR_KINDS_INC_FILE "${spirv-tools_BINARY_DIR}/operand.kinds-${VERSION}.inc") +macro(spvtools_core_tables CONFIG_VERSION) + set(GRAMMAR_JSON_FILE "${SPIRV_HEADER_INCLUDE_DIR}/spirv/${CONFIG_VERSION}/spirv.core.grammar.json") + set(GRAMMAR_INSTS_INC_FILE "${spirv-tools_BINARY_DIR}/core.insts-${CONFIG_VERSION}.inc") + set(GRAMMAR_KINDS_INC_FILE "${spirv-tools_BINARY_DIR}/operand.kinds-${CONFIG_VERSION}.inc") add_custom_command(OUTPUT ${GRAMMAR_INSTS_INC_FILE} ${GRAMMAR_KINDS_INC_FILE} COMMAND ${PYTHON_EXECUTABLE} ${GRAMMAR_PROCESSING_SCRIPT} --spirv-core-grammar=${GRAMMAR_JSON_FILE} @@ -36,13 +36,13 @@ macro(spvtools_core_tables VERSION) --core-insts-output=${GRAMMAR_INSTS_INC_FILE} --operand-kinds-output=${GRAMMAR_KINDS_INC_FILE} DEPENDS ${GRAMMAR_PROCESSING_SCRIPT} ${GRAMMAR_JSON_FILE} ${DEBUGINFO_GRAMMAR_JSON_FILE} - COMMENT "Generate info tables for SPIR-V v${VERSION} core instructions and operands.") + COMMENT "Generate info tables for SPIR-V v${CONFIG_VERSION} core instructions and operands.") list(APPEND OPCODE_CPP_DEPENDS ${GRAMMAR_INSTS_INC_FILE}) list(APPEND OPERAND_CPP_DEPENDS ${GRAMMAR_KINDS_INC_FILE}) endmacro(spvtools_core_tables) -macro(spvtools_enum_string_mapping VERSION) - set(GRAMMAR_JSON_FILE "${SPIRV_HEADER_INCLUDE_DIR}/spirv/${VERSION}/spirv.core.grammar.json") +macro(spvtools_enum_string_mapping CONFIG_VERSION) + set(GRAMMAR_JSON_FILE "${SPIRV_HEADER_INCLUDE_DIR}/spirv/${CONFIG_VERSION}/spirv.core.grammar.json") set(GRAMMAR_EXTENSION_ENUM_INC_FILE "${spirv-tools_BINARY_DIR}/extension_enum.inc") set(GRAMMAR_ENUM_STRING_MAPPING_INC_FILE "${spirv-tools_BINARY_DIR}/enum_string_mapping.inc") add_custom_command(OUTPUT ${GRAMMAR_EXTENSION_ENUM_INC_FILE} @@ -53,15 +53,15 @@ macro(spvtools_enum_string_mapping VERSION) --extension-enum-output=${GRAMMAR_EXTENSION_ENUM_INC_FILE} --enum-string-mapping-output=${GRAMMAR_ENUM_STRING_MAPPING_INC_FILE} DEPENDS ${GRAMMAR_PROCESSING_SCRIPT} ${GRAMMAR_JSON_FILE} ${DEBUGINFO_GRAMMAR_JSON_FILE} - COMMENT "Generate enum-string mapping for SPIR-V v${VERSION}.") + COMMENT "Generate enum-string mapping for SPIR-V v${CONFIG_VERSION}.") list(APPEND EXTENSION_H_DEPENDS ${GRAMMAR_EXTENSION_ENUM_INC_FILE}) list(APPEND ENUM_STRING_MAPPING_CPP_DEPENDS ${GRAMMAR_ENUM_STRING_MAPPING_INC_FILE}) endmacro(spvtools_enum_string_mapping) -macro(spvtools_vimsyntax VERSION CLVERSION) - set(GRAMMAR_JSON_FILE "${SPIRV_HEADER_INCLUDE_DIR}/spirv/${VERSION}/spirv.core.grammar.json") - set(GLSL_GRAMMAR_JSON_FILE "${SPIRV_HEADER_INCLUDE_DIR}/spirv/${VERSION}/extinst.glsl.std.450.grammar.json") - set(OPENCL_GRAMMAR_JSON_FILE "${SPIRV_HEADER_INCLUDE_DIR}/spirv/${VERSION}/extinst.opencl.std.100.grammar.json") +macro(spvtools_vimsyntax CONFIG_VERSION CLVERSION) + set(GRAMMAR_JSON_FILE "${SPIRV_HEADER_INCLUDE_DIR}/spirv/${CONFIG_VERSION}/spirv.core.grammar.json") + set(GLSL_GRAMMAR_JSON_FILE "${SPIRV_HEADER_INCLUDE_DIR}/spirv/${CONFIG_VERSION}/extinst.glsl.std.450.grammar.json") + set(OPENCL_GRAMMAR_JSON_FILE "${SPIRV_HEADER_INCLUDE_DIR}/spirv/${CONFIG_VERSION}/extinst.opencl.std.100.grammar.json") set(VIMSYNTAX_FILE "${spirv-tools_BINARY_DIR}/spvasm.vim") add_custom_command(OUTPUT ${VIMSYNTAX_FILE} COMMAND ${PYTHON_EXECUTABLE} ${VIMSYNTAX_PROCESSING_SCRIPT} @@ -75,29 +75,29 @@ macro(spvtools_vimsyntax VERSION CLVERSION) COMMENT "Generate spvasm.vim: Vim syntax file for SPIR-V assembly.") endmacro(spvtools_vimsyntax) -macro(spvtools_glsl_tables VERSION) - set(CORE_GRAMMAR_JSON_FILE "${SPIRV_HEADER_INCLUDE_DIR}/spirv/${VERSION}/spirv.core.grammar.json") - set(GLSL_GRAMMAR_JSON_FILE "${SPIRV_HEADER_INCLUDE_DIR}/spirv/${VERSION}/extinst.glsl.std.450.grammar.json") +macro(spvtools_glsl_tables CONFIG_VERSION) + set(CORE_GRAMMAR_JSON_FILE "${SPIRV_HEADER_INCLUDE_DIR}/spirv/${CONFIG_VERSION}/spirv.core.grammar.json") + set(GLSL_GRAMMAR_JSON_FILE "${SPIRV_HEADER_INCLUDE_DIR}/spirv/${CONFIG_VERSION}/extinst.glsl.std.450.grammar.json") set(GRAMMAR_INC_FILE "${spirv-tools_BINARY_DIR}/glsl.std.450.insts.inc") add_custom_command(OUTPUT ${GRAMMAR_INC_FILE} COMMAND ${PYTHON_EXECUTABLE} ${GRAMMAR_PROCESSING_SCRIPT} --extinst-glsl-grammar=${GLSL_GRAMMAR_JSON_FILE} --glsl-insts-output=${GRAMMAR_INC_FILE} DEPENDS ${GRAMMAR_PROCESSING_SCRIPT} ${CORE_GRAMMAR_JSON_FILE} ${GLSL_GRAMMAR_JSON_FILE} - COMMENT "Generate info tables for GLSL extended instructions and operands v${VERSION}.") + COMMENT "Generate info tables for GLSL extended instructions and operands v${CONFIG_VERSION}.") list(APPEND EXTINST_CPP_DEPENDS ${GRAMMAR_INC_FILE}) endmacro(spvtools_glsl_tables) -macro(spvtools_opencl_tables VERSION) - set(CORE_GRAMMAR_JSON_FILE "${SPIRV_HEADER_INCLUDE_DIR}/spirv/${VERSION}/spirv.core.grammar.json") - set(OPENCL_GRAMMAR_JSON_FILE "${SPIRV_HEADER_INCLUDE_DIR}/spirv/${VERSION}/extinst.opencl.std.100.grammar.json") +macro(spvtools_opencl_tables CONFIG_VERSION) + set(CORE_GRAMMAR_JSON_FILE "${SPIRV_HEADER_INCLUDE_DIR}/spirv/${CONFIG_VERSION}/spirv.core.grammar.json") + set(OPENCL_GRAMMAR_JSON_FILE "${SPIRV_HEADER_INCLUDE_DIR}/spirv/${CONFIG_VERSION}/extinst.opencl.std.100.grammar.json") set(GRAMMAR_INC_FILE "${spirv-tools_BINARY_DIR}/opencl.std.insts.inc") add_custom_command(OUTPUT ${GRAMMAR_INC_FILE} COMMAND ${PYTHON_EXECUTABLE} ${GRAMMAR_PROCESSING_SCRIPT} --extinst-opencl-grammar=${OPENCL_GRAMMAR_JSON_FILE} --opencl-insts-output=${GRAMMAR_INC_FILE} DEPENDS ${GRAMMAR_PROCESSING_SCRIPT} ${CORE_GRAMMAR_JSON_FILE} ${OPENCL_GRAMMAR_JSON_FILE} - COMMENT "Generate info tables for OpenCL extended instructions and operands v${VERSION}.") + COMMENT "Generate info tables for OpenCL extended instructions and operands v${CONFIG_VERSION}.") list(APPEND EXTINST_CPP_DEPENDS ${GRAMMAR_INC_FILE}) endmacro(spvtools_opencl_tables) @@ -110,9 +110,9 @@ macro(spvtools_vendor_tables VENDOR_TABLE) --vendor-insts-output=${INSTS_FILE} DEPENDS ${GRAMMAR_PROCESSING_SCRIPT} ${GRAMMAR_FILE} COMMENT "Generate extended instruction tables for ${VENDOR_TABLE}.") - list(APPEND EXTINST_CPP_DEPENDS ${INSTS_FILE}) add_custom_target(spirv-tools-${VENDOR_TABLE} DEPENDS ${INSTS_FILE}) set_property(TARGET spirv-tools-${VENDOR_TABLE} PROPERTY FOLDER "SPIRV-Tools build") + list(APPEND EXTINST_CPP_DEPENDS spirv-tools-${VENDOR_TABLE}) endmacro(spvtools_vendor_tables) macro(spvtools_extinst_lang_headers NAME GRAMMAR_FILE) @@ -125,9 +125,9 @@ macro(spvtools_extinst_lang_headers NAME GRAMMAR_FILE) --extinst-output-base=${OUTBASE} DEPENDS ${LANG_HEADER_PROCESSING_SCRIPT} ${GRAMMAR_FILE} COMMENT "Generate language specific header for ${NAME}.") - list(APPEND EXTINST_CPP_DEPENDS ${OUT_H}) add_custom_target(spirv-tools-header-${NAME} DEPENDS ${OUT_H}) set_property(TARGET spirv-tools-header-${NAME} PROPERTY FOLDER "SPIRV-Tools build") + list(APPEND EXTINST_CPP_DEPENDS spirv-tools-header-${NAME}) endmacro(spvtools_extinst_lang_headers) spvtools_core_tables("unified1") @@ -159,36 +159,18 @@ list(APPEND OPCODE_CPP_DEPENDS ${GENERATOR_INC_FILE}) # The following .cpp files include the above generated .inc files. # Add those .inc files as their dependencies. # -# Why using such an awkward way? -# * If we use add_custom_target() to define a target to generate all .inc files -# and let ${SPIRV_TOOLS} depend on it, then we need to run ninja twice every -# time the grammar is updated: the first time is for generating those .inc -# files, and the second time is for rebuilding .cpp files, when ninja finds -# out that .inc files are updated. -# * If we use add_custom_command() with PRE_BUILD, then the grammar processing -# script will always run no matter whether the grammar is updated. -# * add_dependencies() is used to add *target* dependencies to a target. -# * The following solution only generates .inc files when the script or the -# grammar files is updated, and in a single ninja run. -set_source_files_properties( - ${CMAKE_CURRENT_SOURCE_DIR}/opcode.cpp - PROPERTIES OBJECT_DEPENDS "${OPCODE_CPP_DEPENDS}") -set_source_files_properties( - ${CMAKE_CURRENT_SOURCE_DIR}/operand.cpp - PROPERTIES OBJECT_DEPENDS "${OPERAND_CPP_DEPENDS}") -set_source_files_properties( - ${CMAKE_CURRENT_SOURCE_DIR}/ext_inst.cpp - PROPERTIES OBJECT_DEPENDS "${EXTINST_CPP_DEPENDS}") -set_source_files_properties( - ${CMAKE_CURRENT_SOURCE_DIR}/enum_string_mapping.cpp - PROPERTIES OBJECT_DEPENDS "${ENUM_STRING_MAPPING_CPP_DEPENDS}") +# We need to wrap the .inc files with a custom target to avoid problems when +# multiple targets depend on the same custom command. +add_custom_target(core_tables + DEPENDS ${OPCODE_CPP_DEPENDS} ${OPERAND_CPP_DEPENDS}) +add_custom_target(enum_string_mapping + DEPENDS ${EXTENSION_H_DEPENDS} ${ENUM_STRING_MAPPING_CPP_DEPENDS}) +add_custom_target(extinst_tables + DEPENDS ${EXTINST_CPP_DEPENDS}) set_source_files_properties( - ${CMAKE_CURRENT_SOURCE_DIR}/extension.h + ${CMAKE_CURRENT_SOURCE_DIR}/extensions.h PROPERTIES HEADER_FILE_ONLY TRUE) -set_source_files_properties( - ${CMAKE_CURRENT_SOURCE_DIR}/extension.h - PROPERTIES OBJECT_DEPENDS "${EXTENSION_H_DEPENDS}") set(SPIRV_TOOLS_BUILD_VERSION_INC ${spirv-tools_BINARY_DIR}/build-version.inc) @@ -209,8 +191,14 @@ add_custom_target(spirv-tools-build-version DEPENDS ${SPIRV_TOOLS_BUILD_VERSION_INC}) set_property(TARGET spirv-tools-build-version PROPERTY FOLDER "SPIRV-Tools build") +list(APPEND PCH_DEPENDS ${ENUM_STRING_MAPPING_CPP_DEPENDS} ${OPCODE_CPP_DEPENDS} ${OPERAND_CPP_DEPENDS} ${EXTENSION_H_DEPENDS} ${EXTINST_CPP_DEPENDS} ${SPIRV_TOOLS_BUILD_VERSION_INC}) +set_source_files_properties( + ${CMAKE_CURRENT_SOURCE_DIR}/pch_source.cpp + PROPERTIES OBJECT_DEPENDS "${PCH_DEPENDS}") + add_subdirectory(comp) add_subdirectory(opt) +add_subdirectory(reduce) add_subdirectory(link) set(SPIRV_SOURCES @@ -247,6 +235,8 @@ set(SPIRV_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/spirv_constant.h ${CMAKE_CURRENT_SOURCE_DIR}/spirv_definition.h ${CMAKE_CURRENT_SOURCE_DIR}/spirv_endian.h + ${CMAKE_CURRENT_SOURCE_DIR}/spirv_optimizer_options.h + ${CMAKE_CURRENT_SOURCE_DIR}/spirv_reducer_options.h ${CMAKE_CURRENT_SOURCE_DIR}/spirv_target_env.h ${CMAKE_CURRENT_SOURCE_DIR}/spirv_validator_options.h ${CMAKE_CURRENT_SOURCE_DIR}/table.h @@ -273,6 +263,8 @@ set(SPIRV_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/print.cpp ${CMAKE_CURRENT_SOURCE_DIR}/software_version.cpp ${CMAKE_CURRENT_SOURCE_DIR}/spirv_endian.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/spirv_optimizer_options.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/spirv_reducer_options.cpp ${CMAKE_CURRENT_SOURCE_DIR}/spirv_target_env.cpp ${CMAKE_CURRENT_SOURCE_DIR}/spirv_validator_options.cpp ${CMAKE_CURRENT_SOURCE_DIR}/table.cpp @@ -295,7 +287,7 @@ set(SPIRV_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/val/validate_debug.cpp ${CMAKE_CURRENT_SOURCE_DIR}/val/validate_decorations.cpp ${CMAKE_CURRENT_SOURCE_DIR}/val/validate_derivatives.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/val/validate_ext_inst.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/val/validate_extensions.cpp ${CMAKE_CURRENT_SOURCE_DIR}/val/validate_execution_limitations.cpp ${CMAKE_CURRENT_SOURCE_DIR}/val/validate_function.cpp ${CMAKE_CURRENT_SOURCE_DIR}/val/validate_id.cpp @@ -306,9 +298,11 @@ set(SPIRV_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/val/validate_literals.cpp ${CMAKE_CURRENT_SOURCE_DIR}/val/validate_logicals.cpp ${CMAKE_CURRENT_SOURCE_DIR}/val/validate_memory.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/val/validate_memory_semantics.cpp ${CMAKE_CURRENT_SOURCE_DIR}/val/validate_mode_setting.cpp ${CMAKE_CURRENT_SOURCE_DIR}/val/validate_non_uniform.cpp ${CMAKE_CURRENT_SOURCE_DIR}/val/validate_primitives.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/val/validate_scopes.cpp ${CMAKE_CURRENT_SOURCE_DIR}/val/validate_type.cpp ${CMAKE_CURRENT_SOURCE_DIR}/val/decoration.h ${CMAKE_CURRENT_SOURCE_DIR}/val/basic_block.cpp @@ -338,6 +332,8 @@ set_source_files_properties( ${CMAKE_CURRENT_SOURCE_DIR}/software_version.cpp PROPERTIES OBJECT_DEPENDS "${SPIRV_TOOLS_BUILD_VERSION_INC}") +spvtools_pch(SPIRV_SOURCES pch_source) + add_library(${SPIRV_TOOLS} ${SPIRV_SOURCES}) spvtools_default_compile_options(${SPIRV_TOOLS}) target_include_directories(${SPIRV_TOOLS} @@ -347,6 +343,7 @@ target_include_directories(${SPIRV_TOOLS} ) set_property(TARGET ${SPIRV_TOOLS} PROPERTY FOLDER "SPIRV-Tools libraries") spvtools_check_symbol_exports(${SPIRV_TOOLS}) +add_dependencies( ${SPIRV_TOOLS} core_tables enum_string_mapping extinst_tables ) add_library(${SPIRV_TOOLS}-shared SHARED ${SPIRV_SOURCES}) spvtools_default_compile_options(${SPIRV_TOOLS}-shared) @@ -362,6 +359,7 @@ target_compile_definitions(${SPIRV_TOOLS}-shared PRIVATE SPIRV_TOOLS_IMPLEMENTATION PUBLIC SPIRV_TOOLS_SHAREDLIB ) +add_dependencies( ${SPIRV_TOOLS}-shared core_tables enum_string_mapping extinst_tables ) if(ENABLE_SPIRV_TOOLS_INSTALL) install(TARGETS ${SPIRV_TOOLS} ${SPIRV_TOOLS}-shared @@ -369,3 +367,8 @@ if(ENABLE_SPIRV_TOOLS_INSTALL) LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) endif(ENABLE_SPIRV_TOOLS_INSTALL) + +if(MSVC) + # Enable parallel builds across four cores for this lib + add_definitions(/MP4) +endif() diff --git a/3rdparty/spirv-tools/source/binary.cpp b/3rdparty/spirv-tools/source/binary.cpp index 6604d8094..636dac8c8 100644 --- a/3rdparty/spirv-tools/source/binary.cpp +++ b/3rdparty/spirv-tools/source/binary.cpp @@ -123,8 +123,8 @@ class Parser { // returned object will be propagated to the current parse's diagnostic // object. spvtools::DiagnosticStream diagnostic(spv_result_t error) { - return spvtools::DiagnosticStream({0, 0, _.word_index}, consumer_, "", - error); + return spvtools::DiagnosticStream({0, 0, _.instruction_count}, consumer_, + "", error); } // Returns a diagnostic stream object with the default parse error code. @@ -179,6 +179,7 @@ class Parser { num_words(num_words_arg), diagnostic(diagnostic_arg), word_index(0), + instruction_count(0), endian(), requires_endian_conversion(false) { // Temporary storage for parser state within a single instruction. @@ -192,6 +193,7 @@ class Parser { size_t num_words; // Number of words in the module. spv_diagnostic* diagnostic; // Where diagnostics go. size_t word_index; // The current position in words. + size_t instruction_count; // The count of processed instructions spv_endianness_t endian; // The endianness of the binary. // Is the SPIR-V binary in a different endiannes from the host native // endianness? @@ -269,6 +271,8 @@ spv_result_t Parser::parseModule() { } spv_result_t Parser::parseInstruction() { + _.instruction_count++; + // The zero values for all members except for opcode are the // correct initial values. spv_parsed_instruction_t inst = {}; diff --git a/3rdparty/spirv-tools/source/ext_inst.cpp b/3rdparty/spirv-tools/source/ext_inst.cpp index a4c00c2ff..08c775eb3 100644 --- a/3rdparty/spirv-tools/source/ext_inst.cpp +++ b/3rdparty/spirv-tools/source/ext_inst.cpp @@ -14,7 +14,6 @@ #include "source/ext_inst.h" -#include #include // DebugInfo extended instruction set. @@ -85,7 +84,6 @@ spv_result_t spvExtInstTableGet(spv_ext_inst_table* pExtInstTable, *pExtInstTable = &kTable_1_0; return SPV_SUCCESS; default: - assert(0 && "Unknown spv_target_env in spvExtInstTableGet()"); return SPV_ERROR_INVALID_TABLE; } } diff --git a/3rdparty/spirv-tools/source/libspirv.cpp b/3rdparty/spirv-tools/source/libspirv.cpp index cbbc4c908..b5fe89766 100644 --- a/3rdparty/spirv-tools/source/libspirv.cpp +++ b/3rdparty/spirv-tools/source/libspirv.cpp @@ -115,7 +115,7 @@ bool SpirvTools::Validate(const uint32_t* binary, } bool SpirvTools::Validate(const uint32_t* binary, const size_t binary_size, - const ValidatorOptions& options) const { + spv_validator_options options) const { spv_const_binary_t the_binary{binary, binary_size}; spv_diagnostic diagnostic = nullptr; bool valid = spvValidateWithOptions(impl_->context, options, &the_binary, diff --git a/3rdparty/spirv-tools/source/opcode.cpp b/3rdparty/spirv-tools/source/opcode.cpp index af34b6460..78c238686 100644 --- a/3rdparty/spirv-tools/source/opcode.cpp +++ b/3rdparty/spirv-tools/source/opcode.cpp @@ -324,6 +324,7 @@ int32_t spvOpcodeGeneratesType(SpvOp op) { case SpvOpTypePipe: case SpvOpTypePipeStorage: case SpvOpTypeNamedBarrier: + case SpvOpTypeAccelerationStructureNV: return true; default: // In particular, OpTypeForwardPointer does not generate a type, @@ -390,10 +391,9 @@ bool spvOpcodeIsBranch(SpvOp opcode) { } } -bool spvOpcodeIsAtomicOp(const SpvOp opcode) { +bool spvOpcodeIsAtomicWithLoad(const SpvOp opcode) { switch (opcode) { case SpvOpAtomicLoad: - case SpvOpAtomicStore: case SpvOpAtomicExchange: case SpvOpAtomicCompareExchange: case SpvOpAtomicCompareExchangeWeak: @@ -409,13 +409,17 @@ bool spvOpcodeIsAtomicOp(const SpvOp opcode) { case SpvOpAtomicOr: case SpvOpAtomicXor: case SpvOpAtomicFlagTestAndSet: - case SpvOpAtomicFlagClear: return true; default: return false; } } +bool spvOpcodeIsAtomicOp(const SpvOp opcode) { + return (spvOpcodeIsAtomicWithLoad(opcode) || opcode == SpvOpAtomicStore || + opcode == SpvOpAtomicFlagClear); +} + bool spvOpcodeIsReturn(SpvOp opcode) { switch (opcode) { case SpvOpReturn: @@ -583,3 +587,19 @@ bool spvOpcodeIsScalarizable(SpvOp opcode) { return false; } } + +bool spvOpcodeIsDebug(SpvOp opcode) { + switch (opcode) { + case SpvOpName: + case SpvOpMemberName: + case SpvOpSource: + case SpvOpSourceContinued: + case SpvOpSourceExtension: + case SpvOpString: + case SpvOpLine: + case SpvOpNoLine: + return true; + default: + return false; + } +} diff --git a/3rdparty/spirv-tools/source/opcode.h b/3rdparty/spirv-tools/source/opcode.h index 5643a64c8..76f9a0e84 100644 --- a/3rdparty/spirv-tools/source/opcode.h +++ b/3rdparty/spirv-tools/source/opcode.h @@ -100,6 +100,10 @@ bool spvOpcodeIsDecoration(const SpvOp opcode); // function only considers core instructions. bool spvOpcodeIsLoad(const SpvOp opcode); +// Returns true if the opcode is an atomic operation that uses the original +// value. +bool spvOpcodeIsAtomicWithLoad(const SpvOp opcode); + // Returns true if the opcode is an atomic operation. bool spvOpcodeIsAtomicOp(const SpvOp opcode); @@ -125,4 +129,8 @@ bool spvOpcodeIsNonUniformGroupOperation(SpvOp opcode); // Returns true if the opcode with vector inputs could be divided into a series // of independent scalar operations that would give the same result. bool spvOpcodeIsScalarizable(SpvOp opcode); + +// Returns true if the given opcode is a debug instruction. +bool spvOpcodeIsDebug(SpvOp opcode); + #endif // SOURCE_OPCODE_H_ diff --git a/3rdparty/spirv-tools/source/operand.cpp b/3rdparty/spirv-tools/source/operand.cpp index c97b13fc6..923074e45 100644 --- a/3rdparty/spirv-tools/source/operand.cpp +++ b/3rdparty/spirv-tools/source/operand.cpp @@ -411,6 +411,21 @@ bool spvIsIdType(spv_operand_type_t type) { } } +bool spvIsInIdType(spv_operand_type_t type) { + if (!spvIsIdType(type)) { + // If it is not an ID it cannot be an input ID. + return false; + } + switch (type) { + // Blacklist non-input IDs. + case SPV_OPERAND_TYPE_TYPE_ID: + case SPV_OPERAND_TYPE_RESULT_ID: + return false; + default: + return true; + } +} + std::function spvOperandCanBeForwardDeclaredFunction( SpvOp opcode) { std::function out; diff --git a/3rdparty/spirv-tools/source/operand.h b/3rdparty/spirv-tools/source/operand.h index 76f16f7ae..15a182583 100644 --- a/3rdparty/spirv-tools/source/operand.h +++ b/3rdparty/spirv-tools/source/operand.h @@ -131,6 +131,9 @@ spv_operand_pattern_t spvAlternatePatternFollowingImmediate( // Is the operand an ID? bool spvIsIdType(spv_operand_type_t type); +// Is the operand an input ID? +bool spvIsInIdType(spv_operand_type_t type); + // Takes the opcode of an instruction and returns // a function object that will return true if the index // of the operand can be forward declared. This function will diff --git a/3rdparty/spirv-tools/source/opt/CMakeLists.txt b/3rdparty/spirv-tools/source/opt/CMakeLists.txt index 83f92fe88..96ee8b319 100644 --- a/3rdparty/spirv-tools/source/opt/CMakeLists.txt +++ b/3rdparty/spirv-tools/source/opt/CMakeLists.txt @@ -11,7 +11,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -add_library(SPIRV-Tools-opt +set(SPIRV_TOOLS_OPT_SOURCES aggressive_dead_code_elim_pass.h basic_block.h block_merge_pass.h @@ -46,8 +46,10 @@ add_library(SPIRV-Tools-opt inline_exhaustive_pass.h inline_opaque_pass.h inline_pass.h + inst_bindless_check_pass.h instruction.h instruction_list.h + instrument_pass.h ir_builder.h ir_context.h ir_loader.h @@ -75,6 +77,7 @@ add_library(SPIRV-Tools-opt pass.h pass_manager.h private_to_local_pass.h + process_lines_pass.h propagator.h reduce_load_size.h redundancy_elimination.h @@ -91,10 +94,12 @@ add_library(SPIRV-Tools-opt strength_reduction_pass.h strip_debug_info_pass.h strip_reflect_info_pass.h + struct_cfg_analysis.h tree_iterator.h type_manager.h types.h unify_const_pass.h + upgrade_memory_model.h value_number_table.h vector_dce.h workaround1209.h @@ -133,8 +138,10 @@ add_library(SPIRV-Tools-opt inline_exhaustive_pass.cpp inline_opaque_pass.cpp inline_pass.cpp + inst_bindless_check_pass.cpp instruction.cpp instruction_list.cpp + instrument_pass.cpp ir_context.cpp ir_loader.cpp licm_pass.cpp @@ -160,6 +167,7 @@ add_library(SPIRV-Tools-opt pass.cpp pass_manager.cpp private_to_local_pass.cpp + process_lines_pass.cpp propagator.cpp reduce_load_size.cpp redundancy_elimination.cpp @@ -175,14 +183,25 @@ add_library(SPIRV-Tools-opt strength_reduction_pass.cpp strip_debug_info_pass.cpp strip_reflect_info_pass.cpp + struct_cfg_analysis.cpp type_manager.cpp types.cpp unify_const_pass.cpp + upgrade_memory_model.cpp value_number_table.cpp vector_dce.cpp workaround1209.cpp ) +if(MSVC) + # Enable parallel builds across four cores for this lib + add_definitions(/MP4) +endif() + +spvtools_pch(SPIRV_TOOLS_OPT_SOURCES pch_source_opt) + +add_library(SPIRV-Tools-opt ${SPIRV_TOOLS_OPT_SOURCES}) + spvtools_default_compile_options(SPIRV-Tools-opt) target_include_directories(SPIRV-Tools-opt PUBLIC ${spirv-tools_SOURCE_DIR}/include @@ -202,4 +221,3 @@ if(ENABLE_SPIRV_TOOLS_INSTALL) LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) endif(ENABLE_SPIRV_TOOLS_INSTALL) - diff --git a/3rdparty/spirv-tools/source/opt/aggressive_dead_code_elim_pass.cpp b/3rdparty/spirv-tools/source/opt/aggressive_dead_code_elim_pass.cpp index faf278aa6..82d749905 100644 --- a/3rdparty/spirv-tools/source/opt/aggressive_dead_code_elim_pass.cpp +++ b/3rdparty/spirv-tools/source/opt/aggressive_dead_code_elim_pass.cpp @@ -142,8 +142,9 @@ bool AggressiveDCEPass::AllExtensionsSupported() const { bool AggressiveDCEPass::IsDead(Instruction* inst) { if (IsLive(inst)) return false; - if (inst->IsBranch() && !IsStructuredHeader(context()->get_instr_block(inst), - nullptr, nullptr, nullptr)) + if ((inst->IsBranch() || inst->opcode() == SpvOpUnreachable) && + !IsStructuredHeader(context()->get_instr_block(inst), nullptr, nullptr, + nullptr)) return false; return true; } @@ -195,6 +196,7 @@ bool AggressiveDCEPass::IsStructuredHeader(BasicBlock* bp, void AggressiveDCEPass::ComputeBlock2HeaderMaps( std::list& structuredOrder) { block2headerBranch_.clear(); + header2nextHeaderBranch_.clear(); branch2merge_.clear(); structured_order_index_.clear(); std::stack currentHeaderBranch; @@ -217,8 +219,10 @@ void AggressiveDCEPass::ComputeBlock2HeaderMaps( uint32_t mergeBlockId; bool is_header = IsStructuredHeader(*bi, &mergeInst, &branchInst, &mergeBlockId); + // Map header block to next enclosing header. + if (is_header) header2nextHeaderBranch_[*bi] = currentHeaderBranch.top(); // If this is a loop header, update state first so the block will map to - // the loop. + // itself. if (is_header && mergeInst->opcode() == SpvOpLoopMerge) { currentHeaderBranch.push(branchInst); branch2merge_[branchInst] = mergeInst; @@ -380,7 +384,8 @@ bool AggressiveDCEPass::AggressiveDCE(Function* func) { } break; case SpvOpSwitch: case SpvOpBranch: - case SpvOpBranchConditional: { + case SpvOpBranchConditional: + case SpvOpUnreachable: { if (assume_branches_live.top()) { AddToWorklist(&*ii); } @@ -427,24 +432,30 @@ bool AggressiveDCEPass::AggressiveDCE(Function* func) { AddToWorklist(get_def_use_mgr()->GetDef(liveInst->type_id())); } // If in a structured if or loop construct, add the controlling - // conditional branch and its merge. Any containing control construct - // is marked live when the merge and branch are processed out of the - // worklist. + // conditional branch and its merge. BasicBlock* blk = context()->get_instr_block(liveInst); Instruction* branchInst = block2headerBranch_[blk]; if (branchInst != nullptr) { AddToWorklist(branchInst); Instruction* mergeInst = branch2merge_[branchInst]; AddToWorklist(mergeInst); - AddBreaksAndContinuesToWorklist(mergeInst); + } + // If the block is a header, add the next outermost controlling + // conditional branch and its merge. + Instruction* nextBranchInst = header2nextHeaderBranch_[blk]; + if (nextBranchInst != nullptr) { + AddToWorklist(nextBranchInst); + Instruction* mergeInst = branch2merge_[nextBranchInst]; + AddToWorklist(mergeInst); } // If local load, add all variable's stores if variable not already live - if (liveInst->opcode() == SpvOpLoad) { + if (liveInst->opcode() == SpvOpLoad || liveInst->IsAtomicWithLoad()) { uint32_t varId; (void)GetPtr(liveInst, &varId); if (varId != 0) { ProcessLoad(varId); } + // Process memory copies like loads } else if (liveInst->opcode() == SpvOpCopyMemory || liveInst->opcode() == SpvOpCopyMemorySized) { uint32_t varId; @@ -453,6 +464,10 @@ bool AggressiveDCEPass::AggressiveDCE(Function* func) { if (varId != 0) { ProcessLoad(varId); } + // If merge, add other branches that are part of its control structure + } else if (liveInst->opcode() == SpvOpLoopMerge || + liveInst->opcode() == SpvOpSelectionMerge) { + AddBreaksAndContinuesToWorklist(liveInst); // If function call, treat as if it loads from all pointer arguments } else if (liveInst->opcode() == SpvOpFunctionCall) { liveInst->ForEachInId([this](const uint32_t* iid) { @@ -540,6 +555,14 @@ Pass::Status AggressiveDCEPass::ProcessImpl() { // return unmodified. if (!AllExtensionsSupported()) return Status::SuccessWithoutChange; + // If the decoration manager is kept live then the context will try to keep it + // up to date. ADCE deals with group decorations by changing the operands in + // |OpGroupDecorate| instruction directly without informing the decoration + // manager. This can put it in an invalid state which will cause an error + // when the context tries to update it. To avoid this problem invalidate + // the decoration manager upfront. + context()->InvalidateAnalyses(IRContext::Analysis::kAnalysisDecorations); + // Eliminate Dead functions. bool modified = EliminateDeadFunctions(); @@ -547,7 +570,7 @@ Pass::Status AggressiveDCEPass::ProcessImpl() { // Process all entry point functions. ProcessFunction pfn = [this](Function* fp) { return AggressiveDCE(fp); }; - modified |= ProcessEntryPointCallTree(pfn, get_module()); + modified |= context()->ProcessEntryPointCallTree(pfn); // Process module-level instructions. Now that all live instructions have // been marked, it is safe to remove dead global values. @@ -560,7 +583,7 @@ Pass::Status AggressiveDCEPass::ProcessImpl() { // Cleanup all CFG including all unreachable blocks. ProcessFunction cleanup = [this](Function* f) { return CFGCleanup(f); }; - modified |= ProcessEntryPointCallTree(cleanup, get_module()); + modified |= context()->ProcessEntryPointCallTree(cleanup); return modified ? Status::SuccessWithChange : Status::SuccessWithoutChange; } @@ -574,7 +597,7 @@ bool AggressiveDCEPass::EliminateDeadFunctions() { live_function_set.insert(fp); return false; }; - ProcessEntryPointCallTree(mark_live, get_module()); + context()->ProcessEntryPointCallTree(mark_live); bool modified = false; for (auto funcIter = get_module()->begin(); @@ -627,17 +650,37 @@ bool AggressiveDCEPass::ProcessGlobalValues() { switch (annotation->opcode()) { case SpvOpDecorate: case SpvOpMemberDecorate: - case SpvOpDecorateId: case SpvOpDecorateStringGOOGLE: + case SpvOpMemberDecorateStringGOOGLE: if (IsTargetDead(annotation)) { context()->KillInst(annotation); modified = true; } break; + case SpvOpDecorateId: + if (IsTargetDead(annotation)) { + context()->KillInst(annotation); + modified = true; + } else { + if (annotation->GetSingleWordInOperand(1) == + SpvDecorationHlslCounterBufferGOOGLE) { + // HlslCounterBuffer will reference an id other than the target. + // If that id is dead, then the decoration can be removed as well. + uint32_t counter_buffer_id = annotation->GetSingleWordInOperand(2); + Instruction* counter_buffer_inst = + get_def_use_mgr()->GetDef(counter_buffer_id); + if (IsDead(counter_buffer_inst)) { + context()->KillInst(annotation); + modified = true; + } + } + } + break; case SpvOpGroupDecorate: { // Go through the targets of this group decorate. Remove each dead // target. If all targets are dead, remove this decoration. bool dead = true; + bool removed_operand = false; for (uint32_t i = 1; i < annotation->NumOperands();) { Instruction* opInst = get_def_use_mgr()->GetDef(annotation->GetSingleWordOperand(i)); @@ -645,6 +688,7 @@ bool AggressiveDCEPass::ProcessGlobalValues() { // Don't increment |i|. annotation->RemoveOperand(i); modified = true; + removed_operand = true; } else { i++; dead = false; @@ -653,6 +697,8 @@ bool AggressiveDCEPass::ProcessGlobalValues() { if (dead) { context()->KillInst(annotation); modified = true; + } else if (removed_operand) { + context()->UpdateDefUse(annotation); } break; } @@ -661,6 +707,7 @@ bool AggressiveDCEPass::ProcessGlobalValues() { // dead target (and member index). If all targets are dead, remove this // decoration. bool dead = true; + bool removed_operand = false; for (uint32_t i = 1; i < annotation->NumOperands();) { Instruction* opInst = get_def_use_mgr()->GetDef(annotation->GetSingleWordOperand(i)); @@ -669,6 +716,7 @@ bool AggressiveDCEPass::ProcessGlobalValues() { annotation->RemoveOperand(i + 1); annotation->RemoveOperand(i); modified = true; + removed_operand = true; } else { i += 2; dead = false; @@ -677,6 +725,8 @@ bool AggressiveDCEPass::ProcessGlobalValues() { if (dead) { context()->KillInst(annotation); modified = true; + } else if (removed_operand) { + context()->UpdateDefUse(annotation); } break; } @@ -749,6 +799,13 @@ void AggressiveDCEPass::InitExtensions() { "SPV_GOOGLE_hlsl_functionality1", "SPV_NV_shader_subgroup_partitioned", "SPV_EXT_descriptor_indexing", + "SPV_NV_fragment_shader_barycentric", + "SPV_NV_compute_shader_derivatives", + "SPV_NV_shader_image_footprint", + "SPV_NV_shading_rate", + "SPV_NV_mesh_shader", + "SPV_NV_ray_tracing", + "SPV_EXT_fragment_invocation_density", }); } diff --git a/3rdparty/spirv-tools/source/opt/aggressive_dead_code_elim_pass.h b/3rdparty/spirv-tools/source/opt/aggressive_dead_code_elim_pass.h index 3c03cc66b..c043a96f4 100644 --- a/3rdparty/spirv-tools/source/opt/aggressive_dead_code_elim_pass.h +++ b/3rdparty/spirv-tools/source/opt/aggressive_dead_code_elim_pass.h @@ -49,7 +49,9 @@ class AggressiveDCEPass : public MemPass { Status Process() override; IRContext::Analysis GetPreservedAnalyses() override { - return IRContext::kAnalysisDefUse | IRContext::kAnalysisInstrToBlockMapping; + return IRContext::kAnalysisDefUse | + IRContext::kAnalysisInstrToBlockMapping | + IRContext::kAnalysisConstants | IRContext::kAnalysisTypes; } private: @@ -107,8 +109,8 @@ class AggressiveDCEPass : public MemPass { bool IsStructuredHeader(BasicBlock* bp, Instruction** mergeInst, Instruction** branchInst, uint32_t* mergeBlockId); - // Initialize block2headerBranch_ and branch2merge_ using |structuredOrder| - // to order blocks. + // Initialize block2headerBranch_, header2nextHeaderBranch_, and + // branch2merge_ using |structuredOrder| to order blocks. void ComputeBlock2HeaderMaps(std::list& structuredOrder); // Add branch to |labelId| to end of block |bp|. @@ -163,6 +165,12 @@ class AggressiveDCEPass : public MemPass { // of an enclosing construct's header, if one exists. std::unordered_map block2headerBranch_; + // Map from header block to the branch instruction in the header of the + // structured construct enclosing it. + // The liveness algorithm is designed to iteratively mark as live all + // structured constructs enclosing a live instruction. + std::unordered_map header2nextHeaderBranch_; + // Maps basic block to their index in the structured order traversal. std::unordered_map structured_order_index_; diff --git a/3rdparty/spirv-tools/source/opt/basic_block.cpp b/3rdparty/spirv-tools/source/opt/basic_block.cpp index b18b114a5..aafee5143 100644 --- a/3rdparty/spirv-tools/source/opt/basic_block.cpp +++ b/3rdparty/spirv-tools/source/opt/basic_block.cpp @@ -35,9 +35,18 @@ const uint32_t kSelectionMergeMergeBlockIdInIdx = 0; BasicBlock* BasicBlock::Clone(IRContext* context) const { BasicBlock* clone = new BasicBlock( std::unique_ptr(GetLabelInst()->Clone(context))); - for (const auto& inst : insts_) + for (const auto& inst : insts_) { // Use the incoming context clone->AddInstruction(std::unique_ptr(inst.Clone(context))); + } + + if (context->AreAnalysesValid( + IRContext::Analysis::kAnalysisInstrToBlockMapping)) { + for (auto& inst : *clone) { + context->set_instr_block(&inst, clone); + } + } + return clone; } @@ -193,6 +202,10 @@ std::ostream& operator<<(std::ostream& str, const BasicBlock& block) { return str; } +void BasicBlock::Dump() const { + std::cerr << "Basic block #" << id() << "\n" << *this << "\n "; +} + std::string BasicBlock::PrettyPrint(uint32_t options) const { std::ostringstream str; ForEachInst([&str, options](const Instruction* inst) { @@ -208,8 +221,11 @@ BasicBlock* BasicBlock::SplitBasicBlock(IRContext* context, uint32_t label_id, iterator iter) { assert(!insts_.empty()); - BasicBlock* new_block = new BasicBlock(MakeUnique( - context, SpvOpLabel, 0, label_id, std::initializer_list{})); + std::unique_ptr new_block_temp = + MakeUnique(MakeUnique( + context, SpvOpLabel, 0, label_id, std::initializer_list{})); + BasicBlock* new_block = new_block_temp.get(); + function_->InsertBasicBlockAfter(std::move(new_block_temp), this); new_block->insts_.Splice(new_block->end(), &insts_, iter, end()); new_block->SetParent(GetParent()); diff --git a/3rdparty/spirv-tools/source/opt/basic_block.h b/3rdparty/spirv-tools/source/opt/basic_block.h index 9e1706e14..ff3a41280 100644 --- a/3rdparty/spirv-tools/source/opt/basic_block.h +++ b/3rdparty/spirv-tools/source/opt/basic_block.h @@ -54,6 +54,9 @@ class BasicBlock { // // The parent function will default to null and needs to be explicitly set by // the user. + // + // If the inst-to-block map in |context| is valid, then the new instructions + // will be inserted into the map. BasicBlock* Clone(IRContext*) const; // Sets the enclosing function for this basic block. @@ -68,6 +71,9 @@ class BasicBlock { // Appends all of block's instructions (except label) to this block inline void AddInstructions(BasicBlock* bp); + // The pointer to the label starting this basic block. + std::unique_ptr& GetLabel() { return label_; } + // The label starting this basic block. Instruction* GetLabelInst() { return label_.get(); } const Instruction* GetLabelInst() const { return label_.get(); } @@ -198,7 +204,8 @@ class BasicBlock { // Splits this basic block into two. Returns a new basic block with label // |labelId| containing the instructions from |iter| onwards. Instructions - // prior to |iter| remain in this basic block. + // prior to |iter| remain in this basic block. The new block will be added + // to the function immediately after the original block. BasicBlock* SplitBasicBlock(IRContext* context, uint32_t label_id, iterator iter); @@ -209,6 +216,10 @@ class BasicBlock { // is always added to |options|. std::string PrettyPrint(uint32_t options = 0u) const; + // Dump this basic block on stderr. Useful when running interactive + // debuggers. + void Dump() const; + private: // The enclosing function. Function* function_; diff --git a/3rdparty/spirv-tools/source/opt/block_merge_pass.cpp b/3rdparty/spirv-tools/source/opt/block_merge_pass.cpp index aa4c1bd92..09deb217a 100644 --- a/3rdparty/spirv-tools/source/opt/block_merge_pass.cpp +++ b/3rdparty/spirv-tools/source/opt/block_merge_pass.cpp @@ -24,19 +24,6 @@ namespace spvtools { namespace opt { -void BlockMergePass::KillInstAndName(Instruction* inst) { - std::vector to_kill; - get_def_use_mgr()->ForEachUser(inst, [&to_kill](Instruction* user) { - if (user->opcode() == SpvOpName) { - to_kill.push_back(user); - } - }); - for (auto i : to_kill) { - context()->KillInst(i); - } - context()->KillInst(inst); -} - bool BlockMergePass::MergeBlocks(Function* func) { bool modified = false; for (auto bi = func->begin(); bi != func->end();) { @@ -55,14 +42,6 @@ bool BlockMergePass::MergeBlocks(Function* func) { continue; } - bool pred_is_header = IsHeader(&*bi); - bool succ_is_header = IsHeader(lab_id); - if (pred_is_header && succ_is_header) { - // Cannot merge two headers together. - ++bi; - continue; - } - bool pred_is_merge = IsMerge(&*bi); bool succ_is_merge = IsMerge(lab_id); if (pred_is_merge && succ_is_merge) { @@ -72,7 +51,16 @@ bool BlockMergePass::MergeBlocks(Function* func) { } Instruction* merge_inst = bi->GetMergeInst(); + bool pred_is_header = IsHeader(&*bi); if (pred_is_header && lab_id != merge_inst->GetSingleWordInOperand(0u)) { + bool succ_is_header = IsHeader(lab_id); + if (pred_is_header && succ_is_header) { + // Cannot merge two headers together when the successor is not the merge + // block of the predecessor. + ++bi; + continue; + } + // If this is a header block and the successor is not its merge, we must // be careful about which blocks we are willing to merge together. // OpLoopMerge must be followed by a conditional or unconditional branch. @@ -116,7 +104,7 @@ bool BlockMergePass::MergeBlocks(Function* func) { } } context()->ReplaceAllUsesWith(lab_id, bi->id()); - KillInstAndName(sbi->GetLabelInst()); + context()->KillInst(sbi->GetLabelInst()); (void)sbi.Erase(); // Reprocess block. modified = true; @@ -148,7 +136,7 @@ bool BlockMergePass::IsMerge(BasicBlock* block) { return IsMerge(block->id()); } Pass::Status BlockMergePass::Process() { // Process all entry point functions. ProcessFunction pfn = [this](Function* fp) { return MergeBlocks(fp); }; - bool modified = ProcessEntryPointCallTree(pfn, get_module()); + bool modified = context()->ProcessEntryPointCallTree(pfn); return modified ? Status::SuccessWithChange : Status::SuccessWithoutChange; } diff --git a/3rdparty/spirv-tools/source/opt/block_merge_pass.h b/3rdparty/spirv-tools/source/opt/block_merge_pass.h index 0ecde4884..3ae7a5c00 100644 --- a/3rdparty/spirv-tools/source/opt/block_merge_pass.h +++ b/3rdparty/spirv-tools/source/opt/block_merge_pass.h @@ -44,12 +44,11 @@ class BlockMergePass : public Pass { return IRContext::kAnalysisDefUse | IRContext::kAnalysisInstrToBlockMapping | IRContext::kAnalysisDecorations | IRContext::kAnalysisCombinators | - IRContext::kAnalysisNameMap; + IRContext::kAnalysisNameMap | IRContext::kAnalysisConstants | + IRContext::kAnalysisTypes; } private: - // Kill any OpName instruction referencing |inst|, then kill |inst|. - void KillInstAndName(Instruction* inst); // Search |func| for blocks which have a single Branch to a block // with no other predecessors. Merge these blocks into a single block. diff --git a/3rdparty/spirv-tools/source/opt/ccp_pass.cpp b/3rdparty/spirv-tools/source/opt/ccp_pass.cpp index a8411d9fe..835619530 100644 --- a/3rdparty/spirv-tools/source/opt/ccp_pass.cpp +++ b/3rdparty/spirv-tools/source/opt/ccp_pass.cpp @@ -319,7 +319,7 @@ Pass::Status CCPPass::Process() { // Process all entry point functions. ProcessFunction pfn = [this](Function* fp) { return PropagateConstants(fp); }; - bool modified = ProcessReachableCallTree(pfn, context()); + bool modified = context()->ProcessReachableCallTree(pfn); return modified ? Pass::Status::SuccessWithChange : Pass::Status::SuccessWithoutChange; } diff --git a/3rdparty/spirv-tools/source/opt/ccp_pass.h b/3rdparty/spirv-tools/source/opt/ccp_pass.h index 178fd1281..527f459c5 100644 --- a/3rdparty/spirv-tools/source/opt/ccp_pass.h +++ b/3rdparty/spirv-tools/source/opt/ccp_pass.h @@ -40,7 +40,8 @@ class CCPPass : public MemPass { IRContext::kAnalysisInstrToBlockMapping | IRContext::kAnalysisDecorations | IRContext::kAnalysisCombinators | IRContext::kAnalysisCFG | IRContext::kAnalysisDominatorAnalysis | - IRContext::kAnalysisNameMap; + IRContext::kAnalysisNameMap | IRContext::kAnalysisConstants | + IRContext::kAnalysisTypes; } private: diff --git a/3rdparty/spirv-tools/source/opt/cfg.cpp b/3rdparty/spirv-tools/source/opt/cfg.cpp index dcf2b573f..7e1097e38 100644 --- a/3rdparty/spirv-tools/source/opt/cfg.cpp +++ b/3rdparty/spirv-tools/source/opt/cfg.cpp @@ -167,6 +167,13 @@ BasicBlock* CFG::SplitLoopHeader(BasicBlock* bb) { Function* fn = bb->GetParent(); IRContext* context = module_->context(); + // Get the new header id up front. If we are out of ids, then we cannot split + // the loop. + uint32_t new_header_id = context->TakeNextId(); + if (new_header_id == 0) { + return nullptr; + } + // Find the insertion point for the new bb. Function::iterator header_it = std::find_if( fn->begin(), fn->end(), @@ -197,15 +204,7 @@ BasicBlock* CFG::SplitLoopHeader(BasicBlock* bb) { ++iter; } - std::unique_ptr newBlock( - bb->SplitBasicBlock(context, context->TakeNextId(), iter)); - - // Insert the new bb in the correct position - auto insert_pos = header_it; - ++insert_pos; - BasicBlock* new_header = &*insert_pos.InsertBefore(std::move(newBlock)); - new_header->SetParent(fn); - uint32_t new_header_id = new_header->id(); + BasicBlock* new_header = bb->SplitBasicBlock(context, new_header_id, iter); context->AnalyzeDefUse(new_header->GetLabelInst()); // Update cfg diff --git a/3rdparty/spirv-tools/source/opt/cfg.h b/3rdparty/spirv-tools/source/opt/cfg.h index 375d09c5c..5ff3aa03e 100644 --- a/3rdparty/spirv-tools/source/opt/cfg.h +++ b/3rdparty/spirv-tools/source/opt/cfg.h @@ -78,8 +78,13 @@ class CFG { BasicBlock* bb, const std::function& f); // Registers |blk| as a basic block in the cfg, this also updates the - // predecessor lists of each successor of |blk|. + // predecessor lists of each successor of |blk|. |blk| must have a terminator + // instruction at the end of the block. void RegisterBlock(BasicBlock* blk) { + assert(blk->begin() != blk->end() && + "Basic blocks must have a terminator before registering."); + assert(blk->tail()->IsBlockTerminator() && + "Basic blocks must have a terminator before registering."); uint32_t blk_id = blk->id(); id2block_[blk_id] = blk; AddEdges(blk); @@ -123,7 +128,8 @@ class CFG { // id as |block| and will become a preheader for the loop. The other block // is a new block that will be the new loop header. // - // Returns a pointer to the new loop header. + // Returns a pointer to the new loop header. Returns |nullptr| if the new + // loop pointer could not be created. BasicBlock* SplitLoopHeader(BasicBlock* bb); private: diff --git a/3rdparty/spirv-tools/source/opt/cfg_cleanup_pass.cpp b/3rdparty/spirv-tools/source/opt/cfg_cleanup_pass.cpp index 2d548462b..6d48637a4 100644 --- a/3rdparty/spirv-tools/source/opt/cfg_cleanup_pass.cpp +++ b/3rdparty/spirv-tools/source/opt/cfg_cleanup_pass.cpp @@ -30,7 +30,7 @@ namespace opt { Pass::Status CFGCleanupPass::Process() { // Process all entry point functions. ProcessFunction pfn = [this](Function* fp) { return CFGCleanup(fp); }; - bool modified = ProcessReachableCallTree(pfn, context()); + bool modified = context()->ProcessReachableCallTree(pfn); return modified ? Pass::Status::SuccessWithChange : Pass::Status::SuccessWithoutChange; } diff --git a/3rdparty/spirv-tools/source/opt/cfg_cleanup_pass.h b/3rdparty/spirv-tools/source/opt/cfg_cleanup_pass.h index afbc67c09..509542890 100644 --- a/3rdparty/spirv-tools/source/opt/cfg_cleanup_pass.h +++ b/3rdparty/spirv-tools/source/opt/cfg_cleanup_pass.h @@ -30,7 +30,8 @@ class CFGCleanupPass : public MemPass { Status Process() override; IRContext::Analysis GetPreservedAnalyses() override { - return IRContext::kAnalysisDefUse; + return IRContext::kAnalysisDefUse | IRContext::kAnalysisConstants | + IRContext::kAnalysisTypes; } }; diff --git a/3rdparty/spirv-tools/source/opt/combine_access_chains.h b/3rdparty/spirv-tools/source/opt/combine_access_chains.h index 75885dada..531209ec1 100644 --- a/3rdparty/spirv-tools/source/opt/combine_access_chains.h +++ b/3rdparty/spirv-tools/source/opt/combine_access_chains.h @@ -33,7 +33,8 @@ class CombineAccessChains : public Pass { IRContext::kAnalysisInstrToBlockMapping | IRContext::kAnalysisDecorations | IRContext::kAnalysisCombinators | IRContext::kAnalysisCFG | IRContext::kAnalysisDominatorAnalysis | - IRContext::kAnalysisNameMap; + IRContext::kAnalysisNameMap | IRContext::kAnalysisConstants | + IRContext::kAnalysisTypes; } private: diff --git a/3rdparty/spirv-tools/source/opt/common_uniform_elim_pass.cpp b/3rdparty/spirv-tools/source/opt/common_uniform_elim_pass.cpp index e6426a555..52d279fdb 100644 --- a/3rdparty/spirv-tools/source/opt/common_uniform_elim_pass.cpp +++ b/3rdparty/spirv-tools/source/opt/common_uniform_elim_pass.cpp @@ -282,6 +282,7 @@ bool CommonUniformElimPass::UniformAccessChainConvert(Function* func) { uint32_t replId; GenACLoadRepl(ptrInst, &newInsts, &replId); inst = ReplaceAndDeleteLoad(inst, replId, ptrInst); + assert(inst->opcode() != SpvOpPhi); inst = inst->InsertBefore(std::move(newInsts)); modified = true; } @@ -355,6 +356,10 @@ bool CommonUniformElimPass::CommonUniformLoadElimination(Function* func) { if (mergeBlockId == bp->id()) { mergeBlockId = 0; insertItr = bp->begin(); + while (insertItr->opcode() == SpvOpPhi) { + ++insertItr; + } + // Update insertItr until it will not be removed. Without this code, // ReplaceAndDeleteLoad() can set |insertItr| as a dangling pointer. while (IsUniformLoadToBeRemoved(&*insertItr)) ++insertItr; @@ -526,7 +531,7 @@ Pass::Status CommonUniformElimPass::ProcessImpl() { ProcessFunction pfn = [this](Function* fp) { return EliminateCommonUniform(fp); }; - bool modified = ProcessEntryPointCallTree(pfn, get_module()); + bool modified = context()->ProcessEntryPointCallTree(pfn); return modified ? Status::SuccessWithChange : Status::SuccessWithoutChange; } @@ -573,6 +578,13 @@ void CommonUniformElimPass::InitExtensions() { "SPV_GOOGLE_hlsl_functionality1", "SPV_NV_shader_subgroup_partitioned", "SPV_EXT_descriptor_indexing", + "SPV_NV_fragment_shader_barycentric", + "SPV_NV_compute_shader_derivatives", + "SPV_NV_shader_image_footprint", + "SPV_NV_shading_rate", + "SPV_NV_mesh_shader", + "SPV_NV_ray_tracing", + "SPV_EXT_fragment_invocation_density", }); } diff --git a/3rdparty/spirv-tools/source/opt/constants.cpp b/3rdparty/spirv-tools/source/opt/constants.cpp index ecb5f97c4..768364be8 100644 --- a/3rdparty/spirv-tools/source/opt/constants.cpp +++ b/3rdparty/spirv-tools/source/opt/constants.cpp @@ -165,6 +165,7 @@ std::vector ConstantManager::GetConstantsFromIds( Instruction* ConstantManager::BuildInstructionAndAddToModule( const Constant* new_const, Module::inst_iterator* pos, uint32_t type_id) { + // TODO(1841): Handle id overflow. uint32_t new_id = context()->TakeNextId(); auto new_inst = CreateInstruction(new_id, new_const, type_id); if (!new_inst) { diff --git a/3rdparty/spirv-tools/source/opt/constants.h b/3rdparty/spirv-tools/source/opt/constants.h index 2415c122e..de2dfc3d0 100644 --- a/3rdparty/spirv-tools/source/opt/constants.h +++ b/3rdparty/spirv-tools/source/opt/constants.h @@ -15,7 +15,7 @@ #ifndef SOURCE_OPT_CONSTANTS_H_ #define SOURCE_OPT_CONSTANTS_H_ -#include +#include #include #include #include diff --git a/3rdparty/spirv-tools/source/opt/copy_prop_arrays.cpp b/3rdparty/spirv-tools/source/opt/copy_prop_arrays.cpp index 028b237d7..e508c05d1 100644 --- a/3rdparty/spirv-tools/source/opt/copy_prop_arrays.cpp +++ b/3rdparty/spirv-tools/source/opt/copy_prop_arrays.cpp @@ -26,6 +26,8 @@ const uint32_t kLoadPointerInOperand = 0; const uint32_t kStorePointerInOperand = 0; const uint32_t kStoreObjectInOperand = 1; const uint32_t kCompositeExtractObjectInOperand = 0; +const uint32_t kTypePointerStorageClassInIdx = 0; +const uint32_t kTypePointerPointeeInIdx = 1; } // namespace @@ -51,7 +53,7 @@ Pass::Status CopyPropagateArrays::Process() { FindSourceObjectIfPossible(&*var_inst, store_inst); if (source_object != nullptr) { - if (CanUpdateUses(&*var_inst, source_object->GetPointerTypeId())) { + if (CanUpdateUses(&*var_inst, source_object->GetPointerTypeId(this))) { modified = true; PropagateObject(&*var_inst, source_object.get(), store_inst); } @@ -139,7 +141,7 @@ Instruction* CopyPropagateArrays::BuildNewAccessChain( return source->GetVariable(); } - return builder.AddAccessChain(source->GetPointerTypeId(), + return builder.AddAccessChain(source->GetPointerTypeId(this), source->GetVariable()->result_id(), source->AccessChain()); } @@ -324,6 +326,10 @@ CopyPropagateArrays::BuildMemoryObjectFromCompositeConstruct( std::unique_ptr member_object = GetSourceObjectIfAny(conststruct_inst->GetSingleWordInOperand(i)); + if (!member_object) { + return nullptr; + } + if (!member_object->IsMember()) { return nullptr; } @@ -484,80 +490,76 @@ bool CopyPropagateArrays::CanUpdateUses(Instruction* original_ptr_inst, return true; } - return def_use_mgr->WhileEachUse( - original_ptr_inst, - [this, type_mgr, const_mgr, type](Instruction* use, uint32_t) { - switch (use->opcode()) { - case SpvOpLoad: { - analysis::Pointer* pointer_type = type->AsPointer(); - uint32_t new_type_id = - type_mgr->GetId(pointer_type->pointee_type()); + return def_use_mgr->WhileEachUse(original_ptr_inst, [this, type_mgr, + const_mgr, + type](Instruction* use, + uint32_t) { + switch (use->opcode()) { + case SpvOpLoad: { + analysis::Pointer* pointer_type = type->AsPointer(); + uint32_t new_type_id = type_mgr->GetId(pointer_type->pointee_type()); - if (new_type_id != use->type_id()) { - return CanUpdateUses(use, new_type_id); - } - return true; - } - case SpvOpAccessChain: { - analysis::Pointer* pointer_type = type->AsPointer(); - const analysis::Type* pointee_type = pointer_type->pointee_type(); - - std::vector access_chain; - for (uint32_t i = 1; i < use->NumInOperands(); ++i) { - const analysis::Constant* index_const = - const_mgr->FindDeclaredConstant( - use->GetSingleWordInOperand(i)); - if (index_const) { - access_chain.push_back(index_const->AsIntConstant()->GetU32()); - } else { - // Variable index means the type is a type where every element - // is the same type. Use element 0 to get the type. - access_chain.push_back(0); - } - } - - const analysis::Type* new_pointee_type = - type_mgr->GetMemberType(pointee_type, access_chain); - analysis::Pointer pointerTy(new_pointee_type, - pointer_type->storage_class()); - uint32_t new_pointer_type_id = - context()->get_type_mgr()->GetTypeInstruction(&pointerTy); - - if (new_pointer_type_id != use->type_id()) { - return CanUpdateUses(use, new_pointer_type_id); - } - return true; - } - case SpvOpCompositeExtract: { - std::vector access_chain; - for (uint32_t i = 1; i < use->NumInOperands(); ++i) { - access_chain.push_back(use->GetSingleWordInOperand(i)); - } - - const analysis::Type* new_type = - type_mgr->GetMemberType(type, access_chain); - uint32_t new_type_id = type_mgr->GetTypeInstruction(new_type); - - if (new_type_id != use->type_id()) { - return CanUpdateUses(use, new_type_id); - } - return true; - } - case SpvOpStore: - // Can't handle changing the type of a store. There are too many - // other things that might need to change as well. Not worth the - // effort. Punting for now. - - // TODO (s-perron): This can be handled by expanding the store into - // a series of extracts, composite constructs, and a store. - return true; - case SpvOpImageTexelPointer: - case SpvOpName: - return true; - default: - return use->IsDecoration(); + if (new_type_id != use->type_id()) { + return CanUpdateUses(use, new_type_id); } - }); + return true; + } + case SpvOpAccessChain: { + analysis::Pointer* pointer_type = type->AsPointer(); + const analysis::Type* pointee_type = pointer_type->pointee_type(); + + std::vector access_chain; + for (uint32_t i = 1; i < use->NumInOperands(); ++i) { + const analysis::Constant* index_const = + const_mgr->FindDeclaredConstant(use->GetSingleWordInOperand(i)); + if (index_const) { + access_chain.push_back(index_const->AsIntConstant()->GetU32()); + } else { + // Variable index means the type is a type where every element + // is the same type. Use element 0 to get the type. + access_chain.push_back(0); + } + } + + const analysis::Type* new_pointee_type = + type_mgr->GetMemberType(pointee_type, access_chain); + analysis::Pointer pointerTy(new_pointee_type, + pointer_type->storage_class()); + uint32_t new_pointer_type_id = + context()->get_type_mgr()->GetTypeInstruction(&pointerTy); + + if (new_pointer_type_id != use->type_id()) { + return CanUpdateUses(use, new_pointer_type_id); + } + return true; + } + case SpvOpCompositeExtract: { + std::vector access_chain; + for (uint32_t i = 1; i < use->NumInOperands(); ++i) { + access_chain.push_back(use->GetSingleWordInOperand(i)); + } + + const analysis::Type* new_type = + type_mgr->GetMemberType(type, access_chain); + uint32_t new_type_id = type_mgr->GetTypeInstruction(new_type); + + if (new_type_id != use->type_id()) { + return CanUpdateUses(use, new_type_id); + } + return true; + } + case SpvOpStore: + // If needed, we can create an element-by-element copy to change the + // type of the value being stored. This way we can always handled + // stores. + return true; + case SpvOpImageTexelPointer: + case SpvOpName: + return true; + default: + return use->IsDecoration(); + } + }); } void CopyPropagateArrays::UpdateUses(Instruction* original_ptr_inst, Instruction* new_ptr_inst) { @@ -579,7 +581,6 @@ void CopyPropagateArrays::UpdateUses(Instruction* original_ptr_inst, for (auto pair : uses) { Instruction* use = pair.first; uint32_t index = pair.second; - analysis::Pointer* pointer_type = nullptr; switch (use->opcode()) { case SpvOpLoad: { // Replace the actual use. @@ -587,8 +588,10 @@ void CopyPropagateArrays::UpdateUses(Instruction* original_ptr_inst, use->SetOperand(index, {new_ptr_inst->result_id()}); // Update the type. - pointer_type = type_mgr->GetType(new_ptr_inst->type_id())->AsPointer(); - uint32_t new_type_id = type_mgr->GetId(pointer_type->pointee_type()); + Instruction* pointer_type_inst = + def_use_mgr->GetDef(new_ptr_inst->type_id()); + uint32_t new_type_id = + pointer_type_inst->GetSingleWordInOperand(kTypePointerPointeeInIdx); if (new_type_id != use->type_id()) { use->SetResultType(new_type_id); context()->AnalyzeUses(use); @@ -602,10 +605,6 @@ void CopyPropagateArrays::UpdateUses(Instruction* original_ptr_inst, context()->ForgetUses(use); use->SetOperand(index, {new_ptr_inst->result_id()}); - // Update the result type. - pointer_type = type_mgr->GetType(new_ptr_inst->type_id())->AsPointer(); - const analysis::Type* pointee_type = pointer_type->pointee_type(); - // Convert the ids on the OpAccessChain to indices that can be used to // get the specific member. std::vector access_chain; @@ -620,14 +619,20 @@ void CopyPropagateArrays::UpdateUses(Instruction* original_ptr_inst, access_chain.push_back(0); } } - const analysis::Type* new_pointee_type = - type_mgr->GetMemberType(pointee_type, access_chain); - // Now build a pointer to the type of the member. - analysis::Pointer new_pointer_type(new_pointee_type, - pointer_type->storage_class()); + Instruction* pointer_type_inst = + get_def_use_mgr()->GetDef(new_ptr_inst->type_id()); + + uint32_t new_pointee_type_id = GetMemberTypeId( + pointer_type_inst->GetSingleWordInOperand(kTypePointerPointeeInIdx), + access_chain); + + SpvStorageClass storage_class = static_cast( + pointer_type_inst->GetSingleWordInOperand( + kTypePointerStorageClassInIdx)); + uint32_t new_pointer_type_id = - context()->get_type_mgr()->GetTypeInstruction(&new_pointer_type); + type_mgr->FindPointerToType(new_pointee_type_id, storage_class); if (new_pointer_type_id != use->type_id()) { use->SetResultType(new_pointer_type_id); @@ -642,15 +647,13 @@ void CopyPropagateArrays::UpdateUses(Instruction* original_ptr_inst, context()->ForgetUses(use); use->SetOperand(index, {new_ptr_inst->result_id()}); + uint32_t new_type_id = new_ptr_inst->type_id(); std::vector access_chain; for (uint32_t i = 1; i < use->NumInOperands(); ++i) { access_chain.push_back(use->GetSingleWordInOperand(i)); } - const analysis::Type* type = type_mgr->GetType(new_ptr_inst->type_id()); - const analysis::Type* new_type = - type_mgr->GetMemberType(type, access_chain); - uint32_t new_type_id = type_mgr->GetTypeInstruction(new_type); + new_type_id = GetMemberTypeId(new_type_id, access_chain); if (new_type_id != use->type_id()) { use->SetResultType(new_type_id); @@ -672,11 +675,11 @@ void CopyPropagateArrays::UpdateUses(Instruction* original_ptr_inst, if (index == 1) { Instruction* target_pointer = def_use_mgr->GetDef( use->GetSingleWordInOperand(kStorePointerInOperand)); - pointer_type = - type_mgr->GetType(target_pointer->type_id())->AsPointer(); - uint32_t copy = - GenerateCopy(original_ptr_inst, - type_mgr->GetId(pointer_type->pointee_type()), use); + Instruction* pointer_type = + def_use_mgr->GetDef(target_pointer->type_id()); + uint32_t pointee_type_id = + pointer_type->GetSingleWordInOperand(kTypePointerPointeeInIdx); + uint32_t copy = GenerateCopy(original_ptr_inst, pointee_type_id, use); context()->ForgetUses(use); use->SetInOperand(index, {copy}); @@ -768,6 +771,29 @@ uint32_t CopyPropagateArrays::GenerateCopy(Instruction* object_inst, return 0; } +uint32_t CopyPropagateArrays::GetMemberTypeId( + uint32_t id, const std::vector& access_chain) const { + for (uint32_t element_index : access_chain) { + Instruction* type_inst = get_def_use_mgr()->GetDef(id); + switch (type_inst->opcode()) { + case SpvOpTypeArray: + case SpvOpTypeRuntimeArray: + case SpvOpTypeMatrix: + case SpvOpTypeVector: + id = type_inst->GetSingleWordInOperand(0); + break; + case SpvOpTypeStruct: + id = type_inst->GetSingleWordInOperand(element_index); + break; + default: + break; + } + assert(id != 0 && + "Tried to extract from an object where it cannot be done."); + } + return id; +} + void CopyPropagateArrays::MemoryObject::GetMember( const std::vector& access_chain) { access_chain_.insert(access_chain_.end(), access_chain.begin(), diff --git a/3rdparty/spirv-tools/source/opt/copy_prop_arrays.h b/3rdparty/spirv-tools/source/opt/copy_prop_arrays.h index abc07165f..eb7cc68b7 100644 --- a/3rdparty/spirv-tools/source/opt/copy_prop_arrays.h +++ b/3rdparty/spirv-tools/source/opt/copy_prop_arrays.h @@ -47,7 +47,8 @@ class CopyPropagateArrays : public MemPass { return IRContext::kAnalysisDefUse | IRContext::kAnalysisCFG | IRContext::kAnalysisInstrToBlockMapping | IRContext::kAnalysisLoopAnalysis | IRContext::kAnalysisDecorations | - IRContext::kAnalysisDominatorAnalysis | IRContext::kAnalysisNameMap; + IRContext::kAnalysisDominatorAnalysis | IRContext::kAnalysisNameMap | + IRContext::kAnalysisConstants | IRContext::kAnalysisTypes; } private: @@ -98,18 +99,21 @@ class CopyPropagateArrays : public MemPass { // Returns the type id of the pointer type that can be used to point to this // memory object. - uint32_t GetPointerTypeId() const { + uint32_t GetPointerTypeId(const CopyPropagateArrays* pass) const { + analysis::DefUseManager* def_use_mgr = + GetVariable()->context()->get_def_use_mgr(); analysis::TypeManager* type_mgr = GetVariable()->context()->get_type_mgr(); - const analysis::Pointer* pointer_type = - type_mgr->GetType(GetVariable()->type_id())->AsPointer(); - const analysis::Type* var_type = pointer_type->pointee_type(); - const analysis::Type* member_type = - type_mgr->GetMemberType(var_type, GetAccessIds()); - uint32_t member_type_id = type_mgr->GetId(member_type); - assert(member_type != 0); + + Instruction* var_pointer_inst = + def_use_mgr->GetDef(GetVariable()->type_id()); + + uint32_t member_type_id = pass->GetMemberTypeId( + var_pointer_inst->GetSingleWordInOperand(1), GetAccessIds()); + uint32_t member_pointer_type_id = type_mgr->FindPointerToType( - member_type_id, pointer_type->storage_class()); + member_type_id, static_cast( + var_pointer_inst->GetSingleWordInOperand(0))); return member_pointer_type_id; } @@ -223,6 +227,12 @@ class CopyPropagateArrays : public MemPass { // the only store that does so. Note it does not look through OpAccessChain // instruction, so partial stores are not considered. Instruction* FindStoreInstruction(const Instruction* var_inst) const; + + // Return the type id of the member of the type |id| access using + // |access_chain|. The elements of |access_chain| are to be interpreted the + // same way the indexes are used in an |OpCompositeExtract| instruction. + uint32_t GetMemberTypeId(uint32_t id, + const std::vector& access_chain) const; }; } // namespace opt diff --git a/3rdparty/spirv-tools/source/opt/dead_branch_elim_pass.cpp b/3rdparty/spirv-tools/source/opt/dead_branch_elim_pass.cpp index b147ef74c..98935361f 100644 --- a/3rdparty/spirv-tools/source/opt/dead_branch_elim_pass.cpp +++ b/3rdparty/spirv-tools/source/opt/dead_branch_elim_pass.cpp @@ -24,6 +24,7 @@ #include "source/cfa.h" #include "source/opt/ir_context.h" #include "source/opt/iterator.h" +#include "source/opt/struct_cfg_analysis.h" #include "source/util/make_unique.h" namespace spvtools { @@ -92,6 +93,8 @@ BasicBlock* DeadBranchElimPass::GetParentBlock(uint32_t id) { bool DeadBranchElimPass::MarkLiveBlocks( Function* func, std::unordered_set* live_blocks) { + StructuredCFGAnalysis* cfgAnalysis = context()->GetStructuredCFGAnalysis(); + std::unordered_set continues; std::vector stack; stack.push_back(&*func->begin()); @@ -160,7 +163,9 @@ bool DeadBranchElimPass::MarkLiveBlocks( Instruction* mergeInst = block->GetMergeInst(); if (mergeInst && mergeInst->opcode() == SpvOpSelectionMerge) { Instruction* first_break = FindFirstExitFromSelectionMerge( - live_lab_id, mergeInst->GetSingleWordInOperand(0)); + live_lab_id, mergeInst->GetSingleWordInOperand(0), + cfgAnalysis->LoopMergeBlock(live_lab_id), + cfgAnalysis->LoopContinueBlock(live_lab_id)); if (first_break == nullptr) { context()->KillInst(mergeInst); } else { @@ -327,7 +332,8 @@ bool DeadBranchElimPass::EraseDeadBlocks( ebi->AddInstruction( MakeUnique(context(), SpvOpUnreachable, 0, 0, std::initializer_list{})); - context()->set_instr_block(&*ebi->tail(), &*ebi); + context()->AnalyzeUses(ebi->terminator()); + context()->set_instr_block(ebi->terminator(), &*ebi); modified = true; } ++ebi; @@ -413,9 +419,9 @@ void DeadBranchElimPass::FixBlockOrder() { // Structured order is more intuitive so use it where possible. if (context()->get_feature_mgr()->HasCapability(SpvCapabilityShader)) { - ProcessReachableCallTree(reorder_structured, context()); + context()->ProcessReachableCallTree(reorder_structured); } else { - ProcessReachableCallTree(reorder_dominators, context()); + context()->ProcessReachableCallTree(reorder_dominators); } } @@ -429,31 +435,100 @@ Pass::Status DeadBranchElimPass::Process() { ProcessFunction pfn = [this](Function* fp) { return EliminateDeadBranches(fp); }; - bool modified = ProcessReachableCallTree(pfn, context()); + bool modified = context()->ProcessReachableCallTree(pfn); if (modified) FixBlockOrder(); return modified ? Status::SuccessWithChange : Status::SuccessWithoutChange; } Instruction* DeadBranchElimPass::FindFirstExitFromSelectionMerge( - uint32_t start_block_id, uint32_t merge_block_id) { + uint32_t start_block_id, uint32_t merge_block_id, uint32_t loop_merge_id, + uint32_t loop_continue_id) { // To find the "first" exit, we follow branches looking for a conditional // branch that is not in a nested construct and is not the header of a new // construct. We follow the control flow from |start_block_id| to find the // first one. - while (start_block_id != merge_block_id) { + while (start_block_id != merge_block_id && start_block_id != loop_merge_id && + start_block_id != loop_continue_id) { BasicBlock* start_block = context()->get_instr_block(start_block_id); Instruction* branch = start_block->terminator(); uint32_t next_block_id = 0; switch (branch->opcode()) { case SpvOpBranchConditional: + next_block_id = start_block->MergeBlockIdIfAny(); + if (next_block_id == 0) { + // If a possible target is the |loop_merge_id| or |loop_continue_id|, + // which are not the current merge node, then we continue the search + // with the other target. + for (uint32_t i = 1; i < 3; i++) { + if (branch->GetSingleWordInOperand(i) == loop_merge_id && + loop_merge_id != merge_block_id) { + next_block_id = branch->GetSingleWordInOperand(3 - i); + break; + } + if (branch->GetSingleWordInOperand(i) == loop_continue_id && + loop_continue_id != merge_block_id) { + next_block_id = branch->GetSingleWordInOperand(3 - i); + break; + } + } + + if (next_block_id == 0) { + return branch; + } + } + break; case SpvOpSwitch: next_block_id = start_block->MergeBlockIdIfAny(); if (next_block_id == 0) { - return branch; + // A switch with no merge instructions can have at most 4 targets: + // a. |merge_block_id| + // b. |loop_merge_id| + // c. |loop_continue_id| + // d. 1 block inside the current region. + // + // This leads to a number of cases of what to do. + // + // 1. Does not jump to a block inside of the current construct. In + // this case, there is not conditional break, so we should return + // |nullptr|. + // + // 2. Jumps to |merge_block_id| and a block inside the current + // construct. In this case, this branch conditionally break to the + // end of the current construct, so return the current branch. + // + // 3. Otherwise, this branch may break, but not to the current merge + // block. So we continue with the block that is inside the loop. + + bool found_break = false; + for (uint32_t i = 1; i < branch->NumInOperands(); i += 2) { + uint32_t target = branch->GetSingleWordInOperand(i); + if (target == merge_block_id) { + found_break = true; + } else if (target != loop_merge_id && target != loop_continue_id) { + next_block_id = branch->GetSingleWordInOperand(i); + } + } + + if (next_block_id == 0) { + // Case 1. + return nullptr; + } + + if (found_break) { + // Case 2. + return branch; + } + + // The fall through is case 3. } break; case SpvOpBranch: - next_block_id = branch->GetSingleWordInOperand(0); + // Need to check if this is the header of a loop nested in the + // selection construct. + next_block_id = start_block->MergeBlockIdIfAny(); + if (next_block_id == 0) { + next_block_id = branch->GetSingleWordInOperand(0); + } break; default: return nullptr; diff --git a/3rdparty/spirv-tools/source/opt/dead_branch_elim_pass.h b/3rdparty/spirv-tools/source/opt/dead_branch_elim_pass.h index f8b441207..4a1b6b49b 100644 --- a/3rdparty/spirv-tools/source/opt/dead_branch_elim_pass.h +++ b/3rdparty/spirv-tools/source/opt/dead_branch_elim_pass.h @@ -44,7 +44,9 @@ class DeadBranchElimPass : public MemPass { Status Process() override; IRContext::Analysis GetPreservedAnalyses() override { - return IRContext::kAnalysisDefUse | IRContext::kAnalysisInstrToBlockMapping; + return IRContext::kAnalysisDefUse | + IRContext::kAnalysisInstrToBlockMapping | + IRContext::kAnalysisConstants | IRContext::kAnalysisTypes; } private: @@ -132,15 +134,20 @@ class DeadBranchElimPass : public MemPass { void FixBlockOrder(); // Return the first branch instruction that is a conditional branch to - // |merge_block_id|. Returns |nullptr| if not such branch exists. If there are + // |merge_block_id|. Returns |nullptr| if no such branch exists. If there are // multiple such branches, the first one is the one that would be executed // first when running the code. That is, the one that dominates all of the // others. // // |start_block_id| must be a block whose innermost containing merge construct // has |merge_block_id| as the merge block. + // + // |loop_merge_id| and |loop_continue_id| are the merge and continue block ids + // of the innermost loop containing |start_block_id|. Instruction* FindFirstExitFromSelectionMerge(uint32_t start_block_id, - uint32_t merge_block_id); + uint32_t merge_block_id, + uint32_t loop_merge_id, + uint32_t loop_continue_id); }; } // namespace opt diff --git a/3rdparty/spirv-tools/source/opt/dead_insert_elim_pass.cpp b/3rdparty/spirv-tools/source/opt/dead_insert_elim_pass.cpp index b42588ff7..7d5634383 100644 --- a/3rdparty/spirv-tools/source/opt/dead_insert_elim_pass.cpp +++ b/3rdparty/spirv-tools/source/opt/dead_insert_elim_pass.cpp @@ -255,7 +255,7 @@ Pass::Status DeadInsertElimPass::Process() { ProcessFunction pfn = [this](Function* fp) { return EliminateDeadInserts(fp); }; - bool modified = ProcessEntryPointCallTree(pfn, get_module()); + bool modified = context()->ProcessEntryPointCallTree(pfn); return modified ? Status::SuccessWithChange : Status::SuccessWithoutChange; } diff --git a/3rdparty/spirv-tools/source/opt/dead_insert_elim_pass.h b/3rdparty/spirv-tools/source/opt/dead_insert_elim_pass.h index 0b111d02c..01f12bb04 100644 --- a/3rdparty/spirv-tools/source/opt/dead_insert_elim_pass.h +++ b/3rdparty/spirv-tools/source/opt/dead_insert_elim_pass.h @@ -45,7 +45,8 @@ class DeadInsertElimPass : public MemPass { IRContext::kAnalysisInstrToBlockMapping | IRContext::kAnalysisDecorations | IRContext::kAnalysisCombinators | IRContext::kAnalysisCFG | IRContext::kAnalysisDominatorAnalysis | - IRContext::kAnalysisNameMap; + IRContext::kAnalysisNameMap | IRContext::kAnalysisConstants | + IRContext::kAnalysisTypes; } private: diff --git a/3rdparty/spirv-tools/source/opt/dead_variable_elimination.h b/3rdparty/spirv-tools/source/opt/dead_variable_elimination.h index 40a7bc025..5dde71ba7 100644 --- a/3rdparty/spirv-tools/source/opt/dead_variable_elimination.h +++ b/3rdparty/spirv-tools/source/opt/dead_variable_elimination.h @@ -30,7 +30,8 @@ class DeadVariableElimination : public MemPass { Status Process() override; IRContext::Analysis GetPreservedAnalyses() override { - return IRContext::kAnalysisDefUse; + return IRContext::kAnalysisDefUse | IRContext::kAnalysisConstants | + IRContext::kAnalysisTypes; } private: diff --git a/3rdparty/spirv-tools/source/opt/decoration_manager.cpp b/3rdparty/spirv-tools/source/opt/decoration_manager.cpp index 82aa495c9..a12326ba5 100644 --- a/3rdparty/spirv-tools/source/opt/decoration_manager.cpp +++ b/3rdparty/spirv-tools/source/opt/decoration_manager.cpp @@ -29,7 +29,9 @@ namespace analysis { void DecorationManager::RemoveDecorationsFrom( uint32_t id, std::function pred) { const auto ids_iter = id_to_decoration_insts_.find(id); - if (ids_iter == id_to_decoration_insts_.end()) return; + if (ids_iter == id_to_decoration_insts_.end()) { + return; + } TargetData& decorations_info = ids_iter->second; auto context = module_->context(); @@ -59,8 +61,14 @@ void DecorationManager::RemoveDecorationsFrom( if (!pred(*decoration)) group_decorations_to_keep.push_back(decoration); } - // If all decorations should be kept, move to the next group - if (group_decorations_to_keep.size() == group_decorations.size()) continue; + // If all decorations should be kept, then we can keep |id| part of the + // group. However, if the group itself has no decorations, we should remove + // the id from the group. This is needed to make |KillNameAndDecorate| work + // correctly when a decoration group has no decorations. + if (group_decorations_to_keep.size() == group_decorations.size() && + group_decorations.size() != 0) { + continue; + } // Otherwise, remove |id| from the targets of |group_id| const uint32_t stride = inst->opcode() == SpvOpGroupDecorate ? 1u : 2u; @@ -136,9 +144,6 @@ void DecorationManager::RemoveDecorationsFrom( decorations_info.indirect_decorations.empty() && decorations_info.decorate_insts.empty()) { id_to_decoration_insts_.erase(ids_iter); - - // Remove the OpDecorationGroup defining this group. - if (is_group) context->KillInst(context->get_def_use_mgr()->GetDef(id)); } } @@ -256,6 +261,7 @@ void DecorationManager::AnalyzeDecorations() { AddDecoration(&inst); } } + void DecorationManager::AddDecoration(Instruction* inst) { switch (inst->opcode()) { case SpvOpDecorate: @@ -284,6 +290,43 @@ void DecorationManager::AddDecoration(Instruction* inst) { } } +void DecorationManager::AddDecoration(SpvOp opcode, + std::vector opnds) { + IRContext* ctx = module_->context(); + std::unique_ptr newDecoOp( + new Instruction(ctx, opcode, 0, 0, opnds)); + ctx->AddAnnotationInst(std::move(newDecoOp)); +} + +void DecorationManager::AddDecoration(uint32_t inst_id, uint32_t decoration) { + AddDecoration( + SpvOpDecorate, + {{spv_operand_type_t::SPV_OPERAND_TYPE_ID, {inst_id}}, + {spv_operand_type_t::SPV_OPERAND_TYPE_LITERAL_INTEGER, {decoration}}}); +} + +void DecorationManager::AddDecorationVal(uint32_t inst_id, uint32_t decoration, + uint32_t decoration_value) { + AddDecoration( + SpvOpDecorate, + {{spv_operand_type_t::SPV_OPERAND_TYPE_ID, {inst_id}}, + {spv_operand_type_t::SPV_OPERAND_TYPE_LITERAL_INTEGER, {decoration}}, + {spv_operand_type_t::SPV_OPERAND_TYPE_LITERAL_INTEGER, + {decoration_value}}}); +} + +void DecorationManager::AddMemberDecoration(uint32_t inst_id, uint32_t member, + uint32_t decoration, + uint32_t decoration_value) { + AddDecoration( + SpvOpMemberDecorate, + {{spv_operand_type_t::SPV_OPERAND_TYPE_ID, {inst_id}}, + {spv_operand_type_t::SPV_OPERAND_TYPE_LITERAL_INTEGER, {member}}, + {spv_operand_type_t::SPV_OPERAND_TYPE_LITERAL_INTEGER, {decoration}}, + {spv_operand_type_t::SPV_OPERAND_TYPE_LITERAL_INTEGER, + {decoration_value}}}); +} + template std::vector DecorationManager::InternalGetDecorationsFor( uint32_t id, bool include_linkage) { @@ -474,6 +517,11 @@ void DecorationManager::RemoveDecoration(Instruction* inst) { break; } } + +bool operator==(const DecorationManager& lhs, const DecorationManager& rhs) { + return lhs.id_to_decoration_insts_ == rhs.id_to_decoration_insts_; +} + } // namespace analysis } // namespace opt } // namespace spvtools diff --git a/3rdparty/spirv-tools/source/opt/decoration_manager.h b/3rdparty/spirv-tools/source/opt/decoration_manager.h index a517ba2d8..a5fb4c861 100644 --- a/3rdparty/spirv-tools/source/opt/decoration_manager.h +++ b/3rdparty/spirv-tools/source/opt/decoration_manager.h @@ -36,11 +36,22 @@ class DecorationManager { } DecorationManager() = delete; - // Removes all decorations from |id| (either directly or indirectly) for - // which |pred| returns true. - // If |id| is a group ID, OpGroupDecorate and OpGroupMemberDecorate will be - // removed if they have no targets left, and OpDecorationGroup will be - // removed if the group is not applied to anyone and contains no decorations. + // Changes all of the decorations (direct and through groups) where |pred| is + // true and that apply to |id| so that they no longer apply to |id|. + // + // If |id| is part of a group, it will be removed from the group if it + // does not use all of the group's decorations, or, if there are no + // decorations that apply to the group. + // + // If decoration groups become empty, the |OpGroupDecorate| and + // |OpGroupMemberDecorate| instructions will be killed. + // + // Decoration instructions that apply directly to |id| will be killed. + // + // If |id| is a decoration group and all of the group's decorations are + // removed, then the |OpGroupDecorate| and + // |OpGroupMemberDecorate| for the group will be killed, but not the defining + // |OpDecorationGroup| instruction. void RemoveDecorationsFrom(uint32_t id, std::function pred = [](const Instruction&) { return true; }); @@ -100,6 +111,26 @@ class DecorationManager { // Informs the decoration manager of a new decoration that it needs to track. void AddDecoration(Instruction* inst); + // Add decoration with |opcode| and operands |opnds|. + void AddDecoration(SpvOp opcode, const std::vector opnds); + + // Add |decoration| of |inst_id| to module. + void AddDecoration(uint32_t inst_id, uint32_t decoration); + + // Add |decoration, decoration_value| of |inst_id| to module. + void AddDecorationVal(uint32_t inst_id, uint32_t decoration, + uint32_t decoration_value); + + // Add |decoration, decoration_value| of |inst_id, member| to module. + void AddMemberDecoration(uint32_t member, uint32_t inst_id, + uint32_t decoration, uint32_t decoration_value); + + friend bool operator==(const DecorationManager&, const DecorationManager&); + friend bool operator!=(const DecorationManager& lhs, + const DecorationManager& rhs) { + return !(lhs == rhs); + } + private: // Analyzes the defs and uses in the given |module| and populates data // structures in this class. Does nothing if |module| is nullptr. @@ -125,6 +156,25 @@ class DecorationManager { // group. }; + friend bool operator==(const TargetData& lhs, const TargetData& rhs) { + if (!std::is_permutation(lhs.direct_decorations.begin(), + lhs.direct_decorations.end(), + rhs.direct_decorations.begin())) { + return false; + } + if (!std::is_permutation(lhs.indirect_decorations.begin(), + lhs.indirect_decorations.end(), + rhs.indirect_decorations.begin())) { + return false; + } + if (!std::is_permutation(lhs.decorate_insts.begin(), + lhs.decorate_insts.end(), + rhs.decorate_insts.begin())) { + return false; + } + return true; + } + // Mapping from ids to the instructions applying a decoration to those ids. // In other words, for each id you get all decoration instructions // referencing that id, be it directly (SpvOpDecorate, SpvOpMemberDecorate diff --git a/3rdparty/spirv-tools/source/opt/def_use_manager.cpp b/3rdparty/spirv-tools/source/opt/def_use_manager.cpp index 4e3649382..0ec98cae1 100644 --- a/3rdparty/spirv-tools/source/opt/def_use_manager.cpp +++ b/3rdparty/spirv-tools/source/opt/def_use_manager.cpp @@ -278,7 +278,17 @@ bool operator==(const DefUseManager& lhs, const DefUseManager& rhs) { return false; } - if (lhs.inst_to_used_ids_ != lhs.inst_to_used_ids_) { + if (lhs.inst_to_used_ids_ != rhs.inst_to_used_ids_) { + for (auto p : lhs.inst_to_used_ids_) { + if (rhs.inst_to_used_ids_.count(p.first) == 0) { + return false; + } + } + for (auto p : rhs.inst_to_used_ids_) { + if (lhs.inst_to_used_ids_.count(p.first) == 0) { + return false; + } + } return false; } return true; diff --git a/3rdparty/spirv-tools/source/opt/eliminate_dead_functions_pass.cpp b/3rdparty/spirv-tools/source/opt/eliminate_dead_functions_pass.cpp index 5be983a58..f067be5f9 100644 --- a/3rdparty/spirv-tools/source/opt/eliminate_dead_functions_pass.cpp +++ b/3rdparty/spirv-tools/source/opt/eliminate_dead_functions_pass.cpp @@ -29,7 +29,7 @@ Pass::Status EliminateDeadFunctionsPass::Process() { live_function_set.insert(fp); return false; }; - ProcessReachableCallTree(mark_live, context()); + context()->ProcessReachableCallTree(mark_live); bool modified = false; for (auto funcIter = get_module()->begin(); diff --git a/3rdparty/spirv-tools/source/opt/eliminate_dead_functions_pass.h b/3rdparty/spirv-tools/source/opt/eliminate_dead_functions_pass.h index 165e9a6b5..6ed5c42b0 100644 --- a/3rdparty/spirv-tools/source/opt/eliminate_dead_functions_pass.h +++ b/3rdparty/spirv-tools/source/opt/eliminate_dead_functions_pass.h @@ -30,7 +30,8 @@ class EliminateDeadFunctionsPass : public MemPass { Status Process() override; IRContext::Analysis GetPreservedAnalyses() override { - return IRContext::kAnalysisDefUse; + return IRContext::kAnalysisDefUse | IRContext::kAnalysisConstants | + IRContext::kAnalysisTypes; } private: diff --git a/3rdparty/spirv-tools/source/opt/fold.cpp b/3rdparty/spirv-tools/source/opt/fold.cpp index 09d7e5122..d6b583f91 100644 --- a/3rdparty/spirv-tools/source/opt/fold.cpp +++ b/3rdparty/spirv-tools/source/opt/fold.cpp @@ -69,37 +69,68 @@ uint32_t InstructionFolder::BinaryOperate(SpvOp opcode, uint32_t a, case SpvOp::SpvOpIMul: return a * b; case SpvOp::SpvOpUDiv: - assert(b != 0); - return a / b; + if (b != 0) { + return a / b; + } else { + // Dividing by 0 is undefined, so we will just pick 0. + return 0; + } case SpvOp::SpvOpSDiv: - assert(b != 0u); - return (static_cast(a)) / (static_cast(b)); + if (b != 0u) { + return (static_cast(a)) / (static_cast(b)); + } else { + // Dividing by 0 is undefined, so we will just pick 0. + return 0; + } case SpvOp::SpvOpSRem: { // The sign of non-zero result comes from the first operand: a. This is // guaranteed by C++11 rules for integer division operator. The division // result is rounded toward zero, so the result of '%' has the sign of // the first operand. - assert(b != 0u); - return static_cast(a) % static_cast(b); + if (b != 0u) { + return static_cast(a) % static_cast(b); + } else { + // Remainder when dividing with 0 is undefined, so we will just pick 0. + return 0; + } } case SpvOp::SpvOpSMod: { // The sign of non-zero result comes from the second operand: b - assert(b != 0u); - int32_t rem = BinaryOperate(SpvOp::SpvOpSRem, a, b); - int32_t b_prim = static_cast(b); - return (rem + b_prim) % b_prim; + if (b != 0u) { + int32_t rem = BinaryOperate(SpvOp::SpvOpSRem, a, b); + int32_t b_prim = static_cast(b); + return (rem + b_prim) % b_prim; + } else { + // Mod with 0 is undefined, so we will just pick 0. + return 0; + } } case SpvOp::SpvOpUMod: - assert(b != 0u); - return (a % b); + if (b != 0u) { + return (a % b); + } else { + // Mod with 0 is undefined, so we will just pick 0. + return 0; + } // Shifting - case SpvOp::SpvOpShiftRightLogical: { + case SpvOp::SpvOpShiftRightLogical: + if (b > 32) { + // This is undefined behaviour. Choose 0 for consistency. + return 0; + } return a >> b; - } case SpvOp::SpvOpShiftRightArithmetic: + if (b > 32) { + // This is undefined behaviour. Choose 0 for consistency. + return 0; + } return (static_cast(a)) >> b; case SpvOp::SpvOpShiftLeftLogical: + if (b > 32) { + // This is undefined behaviour. Choose 0 for consistency. + return 0; + } return a << b; // Bitwise operations diff --git a/3rdparty/spirv-tools/source/opt/folding_rules.cpp b/3rdparty/spirv-tools/source/opt/folding_rules.cpp index c64cedfb1..327431969 100644 --- a/3rdparty/spirv-tools/source/opt/folding_rules.cpp +++ b/3rdparty/spirv-tools/source/opt/folding_rules.cpp @@ -2025,7 +2025,7 @@ FoldingRule StoringUndef() { // If this is a volatile store, the store cannot be removed. if (inst->NumInOperands() == 3) { - if (inst->GetSingleWordInOperand(3) & SpvMemoryAccessVolatileMask) { + if (inst->GetSingleWordInOperand(2) & SpvMemoryAccessVolatileMask) { return false; } } diff --git a/3rdparty/spirv-tools/source/opt/function.cpp b/3rdparty/spirv-tools/source/opt/function.cpp index c6894c681..9bd46e2a0 100644 --- a/3rdparty/spirv-tools/source/opt/function.cpp +++ b/3rdparty/spirv-tools/source/opt/function.cpp @@ -13,7 +13,10 @@ // limitations under the License. #include "source/opt/function.h" +#include "function.h" +#include "ir_context.h" +#include #include #include @@ -43,28 +46,83 @@ Function* Function::Clone(IRContext* ctx) const { void Function::ForEachInst(const std::function& f, bool run_on_debug_line_insts) { - if (def_inst_) def_inst_->ForEachInst(f, run_on_debug_line_insts); - for (auto& param : params_) param->ForEachInst(f, run_on_debug_line_insts); - for (auto& bb : blocks_) bb->ForEachInst(f, run_on_debug_line_insts); - if (end_inst_) end_inst_->ForEachInst(f, run_on_debug_line_insts); + WhileEachInst( + [&f](Instruction* inst) { + f(inst); + return true; + }, + run_on_debug_line_insts); } void Function::ForEachInst(const std::function& f, bool run_on_debug_line_insts) const { - if (def_inst_) - static_cast(def_inst_.get()) - ->ForEachInst(f, run_on_debug_line_insts); + WhileEachInst( + [&f](const Instruction* inst) { + f(inst); + return true; + }, + run_on_debug_line_insts); +} - for (const auto& param : params_) - static_cast(param.get()) - ->ForEachInst(f, run_on_debug_line_insts); +bool Function::WhileEachInst(const std::function& f, + bool run_on_debug_line_insts) { + if (def_inst_) { + if (!def_inst_->WhileEachInst(f, run_on_debug_line_insts)) { + return false; + } + } - for (const auto& bb : blocks_) - static_cast(bb.get())->ForEachInst( - f, run_on_debug_line_insts); + for (auto& param : params_) { + if (!param->WhileEachInst(f, run_on_debug_line_insts)) { + return false; + } + } + + for (auto& bb : blocks_) { + if (!bb->WhileEachInst(f, run_on_debug_line_insts)) { + return false; + } + } + + if (end_inst_) return end_inst_->WhileEachInst(f, run_on_debug_line_insts); + + return true; +} + +bool Function::WhileEachInst(const std::function& f, + bool run_on_debug_line_insts) const { + if (def_inst_) { + if (!static_cast(def_inst_.get()) + ->WhileEachInst(f, run_on_debug_line_insts)) { + return false; + } + } + + for (const auto& param : params_) { + if (!static_cast(param.get()) + ->WhileEachInst(f, run_on_debug_line_insts)) { + return false; + } + } + + for (const auto& bb : blocks_) { + if (!static_cast(bb.get())->WhileEachInst( + f, run_on_debug_line_insts)) { + return false; + } + } if (end_inst_) - static_cast(end_inst_.get()) + return static_cast(end_inst_.get()) + ->WhileEachInst(f, run_on_debug_line_insts); + + return true; +} + +void Function::ForEachParam(const std::function& f, + bool run_on_debug_line_insts) { + for (auto& param : params_) + static_cast(param.get()) ->ForEachInst(f, run_on_debug_line_insts); } @@ -89,11 +147,28 @@ BasicBlock* Function::InsertBasicBlockAfter( return nullptr; } +bool Function::IsRecursive() const { + IRContext* ctx = blocks_.front()->GetLabel()->context(); + IRContext::ProcessFunction mark_visited = [this](Function* fp) { + return fp == this; + }; + + // Process the call tree from all of the function called by |this|. If it get + // back to |this|, then we have a recursive function. + std::queue roots; + ctx->AddCalls(this, &roots); + return ctx->ProcessCallTreeFromRoots(mark_visited, &roots); +} + std::ostream& operator<<(std::ostream& str, const Function& func) { str << func.PrettyPrint(); return str; } +void Function::Dump() const { + std::cerr << "Function #" << result_id() << "\n" << *this << "\n"; +} + std::string Function::PrettyPrint(uint32_t options) const { std::ostringstream str; ForEachInst([&str, options](const Instruction* inst) { @@ -104,6 +179,5 @@ std::string Function::PrettyPrint(uint32_t options) const { }); return str.str(); } - } // namespace opt } // namespace spvtools diff --git a/3rdparty/spirv-tools/source/opt/function.h b/3rdparty/spirv-tools/source/opt/function.h index 4dc5d25a6..c80b078cd 100644 --- a/3rdparty/spirv-tools/source/opt/function.h +++ b/3rdparty/spirv-tools/source/opt/function.h @@ -110,21 +110,34 @@ class Function { bool run_on_debug_line_insts = false); void ForEachInst(const std::function& f, bool run_on_debug_line_insts = false) const; + bool WhileEachInst(const std::function& f, + bool run_on_debug_line_insts = false); + bool WhileEachInst(const std::function& f, + bool run_on_debug_line_insts = false) const; // Runs the given function |f| on each parameter instruction in this function, // and optionally on debug line instructions that might precede them. void ForEachParam(const std::function& f, bool run_on_debug_line_insts = false) const; + void ForEachParam(const std::function& f, + bool run_on_debug_line_insts = false); BasicBlock* InsertBasicBlockAfter(std::unique_ptr&& new_block, BasicBlock* position); + // Return true if the function calls itself either directly or indirectly. + bool IsRecursive() const; + // Pretty-prints all the basic blocks in this function into a std::string. // // |options| are the disassembly options. SPV_BINARY_TO_TEXT_OPTION_NO_HEADER // is always added to |options|. std::string PrettyPrint(uint32_t options = 0u) const; + // Dump this function on stderr. Useful when running interactive + // debuggers. + void Dump() const; + private: // The OpFunction instruction that begins the definition of this function. std::unique_ptr def_inst_; diff --git a/3rdparty/spirv-tools/source/opt/if_conversion.cpp b/3rdparty/spirv-tools/source/opt/if_conversion.cpp index 7a3717f98..104182bc3 100644 --- a/3rdparty/spirv-tools/source/opt/if_conversion.cpp +++ b/3rdparty/spirv-tools/source/opt/if_conversion.cpp @@ -23,6 +23,10 @@ namespace spvtools { namespace opt { Pass::Status IfConversion::Process() { + if (!context()->get_feature_mgr()->HasCapability(SpvCapabilityShader)) { + return Status::SuccessWithoutChange; + } + const ValueNumberTable& vn_table = *context()->GetValueNumberTable(); bool modified = false; std::vector to_kill; @@ -161,6 +165,9 @@ bool IfConversion::CheckBlock(BasicBlock* block, DominatorAnalysis* dominators, if (!*common || cfg()->IsPseudoEntryBlock(*common)) return false; Instruction* branch = (*common)->terminator(); if (branch->opcode() != SpvOpBranchConditional) return false; + auto merge = (*common)->GetMergeInst(); + if (!merge || merge->opcode() != SpvOpSelectionMerge) return false; + if ((*common)->MergeBlockIdIfAny() != block->id()) return false; return true; } diff --git a/3rdparty/spirv-tools/source/opt/if_conversion.h b/3rdparty/spirv-tools/source/opt/if_conversion.h index 609bdf392..db84e703b 100644 --- a/3rdparty/spirv-tools/source/opt/if_conversion.h +++ b/3rdparty/spirv-tools/source/opt/if_conversion.h @@ -32,7 +32,8 @@ class IfConversion : public Pass { IRContext::Analysis GetPreservedAnalyses() override { return IRContext::kAnalysisDefUse | IRContext::kAnalysisDominatorAnalysis | IRContext::kAnalysisInstrToBlockMapping | IRContext::kAnalysisCFG | - IRContext::kAnalysisNameMap; + IRContext::kAnalysisNameMap | IRContext::kAnalysisConstants | + IRContext::kAnalysisTypes; } private: diff --git a/3rdparty/spirv-tools/source/opt/inline_exhaustive_pass.cpp b/3rdparty/spirv-tools/source/opt/inline_exhaustive_pass.cpp index 5714cd867..24f4e7364 100644 --- a/3rdparty/spirv-tools/source/opt/inline_exhaustive_pass.cpp +++ b/3rdparty/spirv-tools/source/opt/inline_exhaustive_pass.cpp @@ -21,7 +21,7 @@ namespace spvtools { namespace opt { -bool InlineExhaustivePass::InlineExhaustive(Function* func) { +Pass::Status InlineExhaustivePass::InlineExhaustive(Function* func) { bool modified = false; // Using block iterators here because of block erasures and insertions. for (auto bi = func->begin(); bi != func->end(); ++bi) { @@ -30,7 +30,9 @@ bool InlineExhaustivePass::InlineExhaustive(Function* func) { // Inline call. std::vector> newBlocks; std::vector> newVars; - GenInlineCode(&newBlocks, &newVars, ii, bi); + if (!GenInlineCode(&newBlocks, &newVars, ii, bi)) { + return Status::Failure; + } // If call block is replaced with more than one block, point // succeeding phis at new last block. if (newBlocks.size() > 1) UpdateSucceedingPhis(newBlocks); @@ -58,14 +60,18 @@ bool InlineExhaustivePass::InlineExhaustive(Function* func) { } } } - return modified; + return (modified ? Status::SuccessWithChange : Status::SuccessWithoutChange); } Pass::Status InlineExhaustivePass::ProcessImpl() { + Status status = Status::SuccessWithoutChange; // Attempt exhaustive inlining on each entry point function in module - ProcessFunction pfn = [this](Function* fp) { return InlineExhaustive(fp); }; - bool modified = ProcessEntryPointCallTree(pfn, get_module()); - return modified ? Status::SuccessWithChange : Status::SuccessWithoutChange; + ProcessFunction pfn = [&status, this](Function* fp) { + status = CombineStatus(status, InlineExhaustive(fp)); + return false; + }; + context()->ProcessEntryPointCallTree(pfn); + return status; } InlineExhaustivePass::InlineExhaustivePass() = default; diff --git a/3rdparty/spirv-tools/source/opt/inline_exhaustive_pass.h b/3rdparty/spirv-tools/source/opt/inline_exhaustive_pass.h index 103e091e0..c2e854731 100644 --- a/3rdparty/spirv-tools/source/opt/inline_exhaustive_pass.h +++ b/3rdparty/spirv-tools/source/opt/inline_exhaustive_pass.h @@ -40,8 +40,8 @@ class InlineExhaustivePass : public InlinePass { private: // Exhaustively inline all function calls in func as well as in - // all code that is inlined into func. Return true if func is modified. - bool InlineExhaustive(Function* func); + // all code that is inlined into func. Returns the status. + Status InlineExhaustive(Function* func); void Initialize(); Pass::Status ProcessImpl(); diff --git a/3rdparty/spirv-tools/source/opt/inline_opaque_pass.cpp b/3rdparty/spirv-tools/source/opt/inline_opaque_pass.cpp index c2c3719fe..6ccaf9087 100644 --- a/3rdparty/spirv-tools/source/opt/inline_opaque_pass.cpp +++ b/3rdparty/spirv-tools/source/opt/inline_opaque_pass.cpp @@ -63,7 +63,7 @@ bool InlineOpaquePass::HasOpaqueArgsOrReturn(const Instruction* callInst) { }); } -bool InlineOpaquePass::InlineOpaque(Function* func) { +Pass::Status InlineOpaquePass::InlineOpaque(Function* func) { bool modified = false; // Using block iterators here because of block erasures and insertions. for (auto bi = func->begin(); bi != func->end(); ++bi) { @@ -72,7 +72,10 @@ bool InlineOpaquePass::InlineOpaque(Function* func) { // Inline call. std::vector> newBlocks; std::vector> newVars; - GenInlineCode(&newBlocks, &newVars, ii, bi); + if (!GenInlineCode(&newBlocks, &newVars, ii, bi)) { + return Status::Failure; + } + // If call block is replaced with more than one block, point // succeeding phis at new last block. if (newBlocks.size() > 1) UpdateSucceedingPhis(newBlocks); @@ -90,16 +93,20 @@ bool InlineOpaquePass::InlineOpaque(Function* func) { } } } - return modified; + return (modified ? Status::SuccessWithChange : Status::SuccessWithoutChange); } void InlineOpaquePass::Initialize() { InitializeInline(); } Pass::Status InlineOpaquePass::ProcessImpl() { + Status status = Status::SuccessWithoutChange; // Do opaque inlining on each function in entry point call tree - ProcessFunction pfn = [this](Function* fp) { return InlineOpaque(fp); }; - bool modified = ProcessEntryPointCallTree(pfn, get_module()); - return modified ? Status::SuccessWithChange : Status::SuccessWithoutChange; + ProcessFunction pfn = [&status, this](Function* fp) { + status = CombineStatus(status, InlineOpaque(fp)); + return false; + }; + context()->ProcessEntryPointCallTree(pfn); + return status; } InlineOpaquePass::InlineOpaquePass() = default; diff --git a/3rdparty/spirv-tools/source/opt/inline_opaque_pass.h b/3rdparty/spirv-tools/source/opt/inline_opaque_pass.h index aad43fd6a..1e3081d22 100644 --- a/3rdparty/spirv-tools/source/opt/inline_opaque_pass.h +++ b/3rdparty/spirv-tools/source/opt/inline_opaque_pass.h @@ -48,7 +48,7 @@ class InlineOpaquePass : public InlinePass { // Inline all function calls in |func| that have opaque params or return // type. Inline similarly all code that is inlined into func. Return true // if func is modified. - bool InlineOpaque(Function* func); + Status InlineOpaque(Function* func); void Initialize(); Pass::Status ProcessImpl(); diff --git a/3rdparty/spirv-tools/source/opt/inline_pass.cpp b/3rdparty/spirv-tools/source/opt/inline_pass.cpp index 5a88ef5d3..f348bbe3e 100644 --- a/3rdparty/spirv-tools/source/opt/inline_pass.cpp +++ b/3rdparty/spirv-tools/source/opt/inline_pass.cpp @@ -27,7 +27,6 @@ static const int kSpvFunctionCallFunctionId = 2; static const int kSpvFunctionCallArgumentId = 3; static const int kSpvReturnValueId = 0; -static const int kSpvLoopMergeMergeBlockId = 0; static const int kSpvLoopMergeContinueTargetIdInIdx = 1; namespace spvtools { @@ -35,7 +34,11 @@ namespace opt { uint32_t InlinePass::AddPointerToType(uint32_t type_id, SpvStorageClass storage_class) { - uint32_t resultId = TakeNextId(); + uint32_t resultId = context()->TakeNextId(); + if (resultId == 0) { + return resultId; + } + std::unique_ptr type_inst( new Instruction(context(), SpvOpTypePointer, 0, resultId, {{spv_operand_type_t::SPV_OPERAND_TYPE_STORAGE_CLASS, @@ -109,10 +112,16 @@ uint32_t InlinePass::GetFalseId() { if (false_id_ != 0) return false_id_; uint32_t boolId = get_module()->GetGlobalValue(SpvOpTypeBool); if (boolId == 0) { - boolId = TakeNextId(); + boolId = context()->TakeNextId(); + if (boolId == 0) { + return 0; + } get_module()->AddGlobalValue(SpvOpTypeBool, boolId, 0); } - false_id_ = TakeNextId(); + false_id_ = context()->TakeNextId(); + if (false_id_ == 0) { + return 0; + } get_module()->AddGlobalValue(SpvOpConstantFalse, false_id_, boolId); return false_id_; } @@ -121,50 +130,64 @@ void InlinePass::MapParams( Function* calleeFn, BasicBlock::iterator call_inst_itr, std::unordered_map* callee2caller) { int param_idx = 0; - calleeFn->ForEachParam([&call_inst_itr, ¶m_idx, - &callee2caller](const Instruction* cpi) { - const uint32_t pid = cpi->result_id(); - (*callee2caller)[pid] = call_inst_itr->GetSingleWordOperand( - kSpvFunctionCallArgumentId + param_idx); - ++param_idx; - }); + calleeFn->ForEachParam( + [&call_inst_itr, ¶m_idx, &callee2caller](const Instruction* cpi) { + const uint32_t pid = cpi->result_id(); + (*callee2caller)[pid] = call_inst_itr->GetSingleWordOperand( + kSpvFunctionCallArgumentId + param_idx); + ++param_idx; + }); } -void InlinePass::CloneAndMapLocals( +bool InlinePass::CloneAndMapLocals( Function* calleeFn, std::vector>* new_vars, std::unordered_map* callee2caller) { auto callee_block_itr = calleeFn->begin(); auto callee_var_itr = callee_block_itr->begin(); while (callee_var_itr->opcode() == SpvOp::SpvOpVariable) { std::unique_ptr var_inst(callee_var_itr->Clone(context())); - uint32_t newId = TakeNextId(); + uint32_t newId = context()->TakeNextId(); + if (newId == 0) { + return false; + } get_decoration_mgr()->CloneDecorations(callee_var_itr->result_id(), newId); var_inst->SetResultId(newId); (*callee2caller)[callee_var_itr->result_id()] = newId; new_vars->push_back(std::move(var_inst)); ++callee_var_itr; } + return true; } uint32_t InlinePass::CreateReturnVar( Function* calleeFn, std::vector>* new_vars) { uint32_t returnVarId = 0; const uint32_t calleeTypeId = calleeFn->type_id(); - analysis::Type* calleeType = context()->get_type_mgr()->GetType(calleeTypeId); - if (calleeType->AsVoid() == nullptr) { - // Find or create ptr to callee return type. - uint32_t returnVarTypeId = context()->get_type_mgr()->FindPointerToType( - calleeTypeId, SpvStorageClassFunction); - if (returnVarTypeId == 0) - returnVarTypeId = AddPointerToType(calleeTypeId, SpvStorageClassFunction); - // Add return var to new function scope variables. - returnVarId = TakeNextId(); - std::unique_ptr var_inst( - new Instruction(context(), SpvOpVariable, returnVarTypeId, returnVarId, - {{spv_operand_type_t::SPV_OPERAND_TYPE_STORAGE_CLASS, - {SpvStorageClassFunction}}})); - new_vars->push_back(std::move(var_inst)); + analysis::TypeManager* type_mgr = context()->get_type_mgr(); + assert(type_mgr->GetType(calleeTypeId)->AsVoid() == nullptr && + "Cannot create a return variable of type void."); + // Find or create ptr to callee return type. + uint32_t returnVarTypeId = + type_mgr->FindPointerToType(calleeTypeId, SpvStorageClassFunction); + + if (returnVarTypeId == 0) { + returnVarTypeId = AddPointerToType(calleeTypeId, SpvStorageClassFunction); + if (returnVarTypeId == 0) { + return 0; + } } + + // Add return var to new function scope variables. + returnVarId = context()->TakeNextId(); + if (returnVarId == 0) { + return 0; + } + + std::unique_ptr var_inst( + new Instruction(context(), SpvOpVariable, returnVarTypeId, returnVarId, + {{spv_operand_type_t::SPV_OPERAND_TYPE_STORAGE_CLASS, + {SpvStorageClassFunction}}})); + new_vars->push_back(std::move(var_inst)); get_decoration_mgr()->CloneDecorations(calleeFn->result_id(), returnVarId); return returnVarId; } @@ -173,37 +196,44 @@ bool InlinePass::IsSameBlockOp(const Instruction* inst) const { return inst->opcode() == SpvOpSampledImage || inst->opcode() == SpvOpImage; } -void InlinePass::CloneSameBlockOps( +bool InlinePass::CloneSameBlockOps( std::unique_ptr* inst, std::unordered_map* postCallSB, std::unordered_map* preCallSB, std::unique_ptr* block_ptr) { - (*inst)->ForEachInId( - [&postCallSB, &preCallSB, &block_ptr, this](uint32_t* iid) { - const auto mapItr = (*postCallSB).find(*iid); - if (mapItr == (*postCallSB).end()) { - const auto mapItr2 = (*preCallSB).find(*iid); - if (mapItr2 != (*preCallSB).end()) { - // Clone pre-call same-block ops, map result id. - const Instruction* inInst = mapItr2->second; - std::unique_ptr sb_inst(inInst->Clone(context())); - CloneSameBlockOps(&sb_inst, postCallSB, preCallSB, block_ptr); - const uint32_t rid = sb_inst->result_id(); - const uint32_t nid = this->TakeNextId(); - get_decoration_mgr()->CloneDecorations(rid, nid); - sb_inst->SetResultId(nid); - (*postCallSB)[rid] = nid; - *iid = nid; - (*block_ptr)->AddInstruction(std::move(sb_inst)); - } - } else { - // Reset same-block op operand. - *iid = mapItr->second; + return (*inst)->WhileEachInId([&postCallSB, &preCallSB, &block_ptr, + this](uint32_t* iid) { + const auto mapItr = (*postCallSB).find(*iid); + if (mapItr == (*postCallSB).end()) { + const auto mapItr2 = (*preCallSB).find(*iid); + if (mapItr2 != (*preCallSB).end()) { + // Clone pre-call same-block ops, map result id. + const Instruction* inInst = mapItr2->second; + std::unique_ptr sb_inst(inInst->Clone(context())); + if (!CloneSameBlockOps(&sb_inst, postCallSB, preCallSB, block_ptr)) { + return false; } - }); + + const uint32_t rid = sb_inst->result_id(); + const uint32_t nid = context()->TakeNextId(); + if (nid == 0) { + return false; + } + get_decoration_mgr()->CloneDecorations(rid, nid); + sb_inst->SetResultId(nid); + (*postCallSB)[rid] = nid; + *iid = nid; + (*block_ptr)->AddInstruction(std::move(sb_inst)); + } + } else { + // Reset same-block op operand. + *iid = mapItr->second; + } + return true; + }); } -void InlinePass::GenInlineCode( +bool InlinePass::GenInlineCode( std::vector>* new_blocks, std::vector>* new_vars, BasicBlock::iterator call_inst_itr, @@ -225,18 +255,28 @@ void InlinePass::GenInlineCode( kSpvFunctionCallFunctionId)]; // Check for multiple returns in the callee. - auto fi = multi_return_funcs_.find(calleeFn->result_id()); - const bool multiReturn = fi != multi_return_funcs_.end(); + auto fi = early_return_funcs_.find(calleeFn->result_id()); + const bool earlyReturn = fi != early_return_funcs_.end(); // Map parameters to actual arguments. MapParams(calleeFn, call_inst_itr, &callee2caller); // Define caller local variables for all callee variables and create map to // them. - CloneAndMapLocals(calleeFn, new_vars, &callee2caller); + if (!CloneAndMapLocals(calleeFn, new_vars, &callee2caller)) { + return false; + } // Create return var if needed. - uint32_t returnVarId = CreateReturnVar(calleeFn, new_vars); + const uint32_t calleeTypeId = calleeFn->type_id(); + uint32_t returnVarId = 0; + analysis::Type* calleeType = context()->get_type_mgr()->GetType(calleeTypeId); + if (calleeType->AsVoid() == nullptr) { + returnVarId = CreateReturnVar(calleeFn, new_vars); + if (returnVarId == 0) { + return false; + } + } // Create set of callee result ids. Used to detect forward references std::unordered_set callee_result_ids; @@ -270,241 +310,294 @@ void InlinePass::GenInlineCode( uint32_t singleTripLoopContinueId = 0; uint32_t returnLabelId = 0; bool multiBlocks = false; - const uint32_t calleeTypeId = calleeFn->type_id(); // new_blk_ptr is a new basic block in the caller. New instructions are // written to it. It is created when we encounter the OpLabel // of the first callee block. It is appended to new_blocks only when // it is complete. std::unique_ptr new_blk_ptr; - calleeFn->ForEachInst([&new_blocks, &callee2caller, &call_block_itr, - &call_inst_itr, &new_blk_ptr, &prevInstWasReturn, - &returnLabelId, &returnVarId, caller_is_loop_header, - callee_begins_with_structured_header, &calleeTypeId, - &multiBlocks, &postCallSB, &preCallSB, multiReturn, - &singleTripLoopHeaderId, &singleTripLoopContinueId, - &callee_result_ids, this](const Instruction* cpi) { - switch (cpi->opcode()) { - case SpvOpFunction: - case SpvOpFunctionParameter: - // Already processed - break; - case SpvOpVariable: - if (cpi->NumInOperands() == 2) { - assert(callee2caller.count(cpi->result_id()) && - "Expected the variable to have already been mapped."); - uint32_t new_var_id = callee2caller.at(cpi->result_id()); + bool successful = calleeFn->WhileEachInst( + [&new_blocks, &callee2caller, &call_block_itr, &call_inst_itr, + &new_blk_ptr, &prevInstWasReturn, &returnLabelId, &returnVarId, + caller_is_loop_header, callee_begins_with_structured_header, + &calleeTypeId, &multiBlocks, &postCallSB, &preCallSB, earlyReturn, + &singleTripLoopHeaderId, &singleTripLoopContinueId, &callee_result_ids, + this](const Instruction* cpi) { + switch (cpi->opcode()) { + case SpvOpFunction: + case SpvOpFunctionParameter: + // Already processed + break; + case SpvOpVariable: + if (cpi->NumInOperands() == 2) { + assert(callee2caller.count(cpi->result_id()) && + "Expected the variable to have already been mapped."); + uint32_t new_var_id = callee2caller.at(cpi->result_id()); - // The initializer must be a constant or global value. No mapped - // should be used. - uint32_t val_id = cpi->GetSingleWordInOperand(1); - AddStore(new_var_id, val_id, &new_blk_ptr); - } - break; - case SpvOpUnreachable: - case SpvOpKill: { - // Generate a return label so that we split the block with the function - // call. Copy the terminator into the new block. - if (returnLabelId == 0) returnLabelId = this->TakeNextId(); - std::unique_ptr terminator( - new Instruction(context(), cpi->opcode(), 0, 0, {})); - new_blk_ptr->AddInstruction(std::move(terminator)); - break; - } - case SpvOpLabel: { - // If previous instruction was early return, insert branch - // instruction to return block. - if (prevInstWasReturn) { - if (returnLabelId == 0) returnLabelId = this->TakeNextId(); - AddBranch(returnLabelId, &new_blk_ptr); - prevInstWasReturn = false; - } - // Finish current block (if it exists) and get label for next block. - uint32_t labelId; - bool firstBlock = false; - if (new_blk_ptr != nullptr) { - new_blocks->push_back(std::move(new_blk_ptr)); - // If result id is already mapped, use it, otherwise get a new - // one. - const uint32_t rid = cpi->result_id(); - const auto mapItr = callee2caller.find(rid); - labelId = (mapItr != callee2caller.end()) ? mapItr->second - : this->TakeNextId(); - } else { - // First block needs to use label of original block - // but map callee label in case of phi reference. - labelId = call_block_itr->id(); - callee2caller[cpi->result_id()] = labelId; - firstBlock = true; - } - // Create first/next block. - new_blk_ptr = MakeUnique(NewLabel(labelId)); - if (firstBlock) { - // Copy contents of original caller block up to call instruction. - for (auto cii = call_block_itr->begin(); cii != call_inst_itr; - cii = call_block_itr->begin()) { - Instruction* inst = &*cii; - inst->RemoveFromList(); - std::unique_ptr cp_inst(inst); - // Remember same-block ops for possible regeneration. - if (IsSameBlockOp(&*cp_inst)) { - auto* sb_inst_ptr = cp_inst.get(); - preCallSB[cp_inst->result_id()] = sb_inst_ptr; + // The initializer must be a constant or global value. No mapped + // should be used. + uint32_t val_id = cpi->GetSingleWordInOperand(1); + AddStore(new_var_id, val_id, &new_blk_ptr); + } + break; + case SpvOpUnreachable: + case SpvOpKill: { + // Generate a return label so that we split the block with the + // function call. Copy the terminator into the new block. + if (returnLabelId == 0) { + returnLabelId = context()->TakeNextId(); + if (returnLabelId == 0) { + return false; + } + } + std::unique_ptr terminator( + new Instruction(context(), cpi->opcode(), 0, 0, {})); + new_blk_ptr->AddInstruction(std::move(terminator)); + break; + } + case SpvOpLabel: { + // If previous instruction was early return, insert branch + // instruction to return block. + if (prevInstWasReturn) { + if (returnLabelId == 0) { + returnLabelId = context()->TakeNextId(); + if (returnLabelId == 0) { + return false; + } + } + AddBranch(returnLabelId, &new_blk_ptr); + prevInstWasReturn = false; + } + // Finish current block (if it exists) and get label for next block. + uint32_t labelId; + bool firstBlock = false; + if (new_blk_ptr != nullptr) { + new_blocks->push_back(std::move(new_blk_ptr)); + // If result id is already mapped, use it, otherwise get a new + // one. + const uint32_t rid = cpi->result_id(); + const auto mapItr = callee2caller.find(rid); + labelId = (mapItr != callee2caller.end()) + ? mapItr->second + : context()->TakeNextId(); + if (labelId == 0) { + return false; + } + } else { + // First block needs to use label of original block + // but map callee label in case of phi reference. + labelId = call_block_itr->id(); + callee2caller[cpi->result_id()] = labelId; + firstBlock = true; + } + // Create first/next block. + new_blk_ptr = MakeUnique(NewLabel(labelId)); + if (firstBlock) { + // Copy contents of original caller block up to call instruction. + for (auto cii = call_block_itr->begin(); cii != call_inst_itr; + cii = call_block_itr->begin()) { + Instruction* inst = &*cii; + inst->RemoveFromList(); + std::unique_ptr cp_inst(inst); + // Remember same-block ops for possible regeneration. + if (IsSameBlockOp(&*cp_inst)) { + auto* sb_inst_ptr = cp_inst.get(); + preCallSB[cp_inst->result_id()] = sb_inst_ptr; + } + new_blk_ptr->AddInstruction(std::move(cp_inst)); + } + if (caller_is_loop_header && + callee_begins_with_structured_header) { + // We can't place both the caller's merge instruction and + // another merge instruction in the same block. So split the + // calling block. Insert an unconditional branch to a new guard + // block. Later, once we know the ID of the last block, we + // will move the caller's OpLoopMerge from the last generated + // block into the first block. We also wait to avoid + // invalidating various iterators. + const auto guard_block_id = context()->TakeNextId(); + if (guard_block_id == 0) { + return false; + } + AddBranch(guard_block_id, &new_blk_ptr); + new_blocks->push_back(std::move(new_blk_ptr)); + // Start the next block. + new_blk_ptr = MakeUnique(NewLabel(guard_block_id)); + // Reset the mapping of the callee's entry block to point to + // the guard block. Do this so we can fix up phis later on to + // satisfy dominance. + callee2caller[cpi->result_id()] = guard_block_id; + } + // If callee has early return, insert a header block for + // single-trip loop that will encompass callee code. Start + // postheader block. + // + // Note: Consider the following combination: + // - the caller is a single block loop + // - the callee does not begin with a structure header + // - the callee has multiple returns. + // We still need to split the caller block and insert a guard + // block. But we only need to do it once. We haven't done it yet, + // but the single-trip loop header will serve the same purpose. + if (earlyReturn) { + singleTripLoopHeaderId = context()->TakeNextId(); + if (singleTripLoopHeaderId == 0) { + return false; + } + AddBranch(singleTripLoopHeaderId, &new_blk_ptr); + new_blocks->push_back(std::move(new_blk_ptr)); + new_blk_ptr = + MakeUnique(NewLabel(singleTripLoopHeaderId)); + returnLabelId = context()->TakeNextId(); + singleTripLoopContinueId = context()->TakeNextId(); + if (returnLabelId == 0 || singleTripLoopContinueId == 0) { + return false; + } + AddLoopMerge(returnLabelId, singleTripLoopContinueId, + &new_blk_ptr); + uint32_t postHeaderId = context()->TakeNextId(); + if (postHeaderId == 0) { + return false; + } + AddBranch(postHeaderId, &new_blk_ptr); + new_blocks->push_back(std::move(new_blk_ptr)); + new_blk_ptr = MakeUnique(NewLabel(postHeaderId)); + multiBlocks = true; + // Reset the mapping of the callee's entry block to point to + // the post-header block. Do this so we can fix up phis later + // on to satisfy dominance. + callee2caller[cpi->result_id()] = postHeaderId; + } + } else { + multiBlocks = true; + } + } break; + case SpvOpReturnValue: { + // Store return value to return variable. + assert(returnVarId != 0); + uint32_t valId = cpi->GetInOperand(kSpvReturnValueId).words[0]; + const auto mapItr = callee2caller.find(valId); + if (mapItr != callee2caller.end()) { + valId = mapItr->second; + } + AddStore(returnVarId, valId, &new_blk_ptr); + + // Remember we saw a return; if followed by a label, will need to + // insert branch. + prevInstWasReturn = true; + } break; + case SpvOpReturn: { + // Remember we saw a return; if followed by a label, will need to + // insert branch. + prevInstWasReturn = true; + } break; + case SpvOpFunctionEnd: { + // If there was an early return, we generated a return label id + // for it. Now we have to generate the return block with that Id. + if (returnLabelId != 0) { + // If previous instruction was return, insert branch instruction + // to return block. + if (prevInstWasReturn) AddBranch(returnLabelId, &new_blk_ptr); + if (earlyReturn) { + // If we generated a loop header for the single-trip loop + // to accommodate early returns, insert the continue + // target block now, with a false branch back to the loop + // header. + new_blocks->push_back(std::move(new_blk_ptr)); + new_blk_ptr = + MakeUnique(NewLabel(singleTripLoopContinueId)); + uint32_t false_id = GetFalseId(); + if (false_id == 0) { + return false; + } + AddBranchCond(false_id, singleTripLoopHeaderId, returnLabelId, + &new_blk_ptr); + } + // Generate the return block. + new_blocks->push_back(std::move(new_blk_ptr)); + new_blk_ptr = MakeUnique(NewLabel(returnLabelId)); + multiBlocks = true; + } + // Load return value into result id of call, if it exists. + if (returnVarId != 0) { + const uint32_t resId = call_inst_itr->result_id(); + assert(resId != 0); + AddLoad(calleeTypeId, resId, returnVarId, &new_blk_ptr); + } + // Copy remaining instructions from caller block. + for (Instruction* inst = call_inst_itr->NextNode(); inst; + inst = call_inst_itr->NextNode()) { + inst->RemoveFromList(); + std::unique_ptr cp_inst(inst); + // If multiple blocks generated, regenerate any same-block + // instruction that has not been seen in this last block. + if (multiBlocks) { + if (!CloneSameBlockOps(&cp_inst, &postCallSB, &preCallSB, + &new_blk_ptr)) { + return false; + } + + // Remember same-block ops in this block. + if (IsSameBlockOp(&*cp_inst)) { + const uint32_t rid = cp_inst->result_id(); + postCallSB[rid] = rid; + } + } + new_blk_ptr->AddInstruction(std::move(cp_inst)); + } + // Finalize inline code. + new_blocks->push_back(std::move(new_blk_ptr)); + } break; + default: { + // Copy callee instruction and remap all input Ids. + std::unique_ptr cp_inst(cpi->Clone(context())); + bool succeeded = cp_inst->WhileEachInId( + [&callee2caller, &callee_result_ids, this](uint32_t* iid) { + const auto mapItr = callee2caller.find(*iid); + if (mapItr != callee2caller.end()) { + *iid = mapItr->second; + } else if (callee_result_ids.find(*iid) != + callee_result_ids.end()) { + // Forward reference. Allocate a new id, map it, + // use it and check for it when remapping result ids + const uint32_t nid = context()->TakeNextId(); + if (nid == 0) { + return false; + } + callee2caller[*iid] = nid; + *iid = nid; + } + return true; + }); + if (!succeeded) { + return false; + } + // If result id is non-zero, remap it. If already mapped, use mapped + // value, else use next id. + const uint32_t rid = cp_inst->result_id(); + if (rid != 0) { + const auto mapItr = callee2caller.find(rid); + uint32_t nid; + if (mapItr != callee2caller.end()) { + nid = mapItr->second; + } else { + nid = context()->TakeNextId(); + if (nid == 0) { + return false; + } + callee2caller[rid] = nid; + } + cp_inst->SetResultId(nid); + get_decoration_mgr()->CloneDecorations(rid, nid); } new_blk_ptr->AddInstruction(std::move(cp_inst)); - } - if (caller_is_loop_header && callee_begins_with_structured_header) { - // We can't place both the caller's merge instruction and another - // merge instruction in the same block. So split the calling block. - // Insert an unconditional branch to a new guard block. Later, - // once we know the ID of the last block, we will move the caller's - // OpLoopMerge from the last generated block into the first block. - // We also wait to avoid invalidating various iterators. - const auto guard_block_id = this->TakeNextId(); - AddBranch(guard_block_id, &new_blk_ptr); - new_blocks->push_back(std::move(new_blk_ptr)); - // Start the next block. - new_blk_ptr = MakeUnique(NewLabel(guard_block_id)); - // Reset the mapping of the callee's entry block to point to - // the guard block. Do this so we can fix up phis later on to - // satisfy dominance. - callee2caller[cpi->result_id()] = guard_block_id; - } - // If callee has multiple returns, insert a header block for - // single-trip loop that will encompass callee code. Start postheader - // block. - // - // Note: Consider the following combination: - // - the caller is a single block loop - // - the callee does not begin with a structure header - // - the callee has multiple returns. - // We still need to split the caller block and insert a guard block. - // But we only need to do it once. We haven't done it yet, but the - // single-trip loop header will serve the same purpose. - if (multiReturn) { - singleTripLoopHeaderId = this->TakeNextId(); - AddBranch(singleTripLoopHeaderId, &new_blk_ptr); - new_blocks->push_back(std::move(new_blk_ptr)); - new_blk_ptr = - MakeUnique(NewLabel(singleTripLoopHeaderId)); - returnLabelId = this->TakeNextId(); - singleTripLoopContinueId = this->TakeNextId(); - AddLoopMerge(returnLabelId, singleTripLoopContinueId, &new_blk_ptr); - uint32_t postHeaderId = this->TakeNextId(); - AddBranch(postHeaderId, &new_blk_ptr); - new_blocks->push_back(std::move(new_blk_ptr)); - new_blk_ptr = MakeUnique(NewLabel(postHeaderId)); - multiBlocks = true; - // Reset the mapping of the callee's entry block to point to - // the post-header block. Do this so we can fix up phis later - // on to satisfy dominance. - callee2caller[cpi->result_id()] = postHeaderId; - } - } else { - multiBlocks = true; + } break; } - } break; - case SpvOpReturnValue: { - // Store return value to return variable. - assert(returnVarId != 0); - uint32_t valId = cpi->GetInOperand(kSpvReturnValueId).words[0]; - const auto mapItr = callee2caller.find(valId); - if (mapItr != callee2caller.end()) { - valId = mapItr->second; - } - AddStore(returnVarId, valId, &new_blk_ptr); + return true; + }); - // Remember we saw a return; if followed by a label, will need to - // insert branch. - prevInstWasReturn = true; - } break; - case SpvOpReturn: { - // Remember we saw a return; if followed by a label, will need to - // insert branch. - prevInstWasReturn = true; - } break; - case SpvOpFunctionEnd: { - // If there was an early return, we generated a return label id - // for it. Now we have to generate the return block with that Id. - if (returnLabelId != 0) { - // If previous instruction was return, insert branch instruction - // to return block. - if (prevInstWasReturn) AddBranch(returnLabelId, &new_blk_ptr); - if (multiReturn) { - // If we generated a loop header to for the single-trip loop - // to accommodate multiple returns, insert the continue - // target block now, with a false branch back to the loop header. - new_blocks->push_back(std::move(new_blk_ptr)); - new_blk_ptr = - MakeUnique(NewLabel(singleTripLoopContinueId)); - AddBranchCond(GetFalseId(), singleTripLoopHeaderId, returnLabelId, - &new_blk_ptr); - } - // Generate the return block. - new_blocks->push_back(std::move(new_blk_ptr)); - new_blk_ptr = MakeUnique(NewLabel(returnLabelId)); - multiBlocks = true; - } - // Load return value into result id of call, if it exists. - if (returnVarId != 0) { - const uint32_t resId = call_inst_itr->result_id(); - assert(resId != 0); - AddLoad(calleeTypeId, resId, returnVarId, &new_blk_ptr); - } - // Copy remaining instructions from caller block. - for (Instruction* inst = call_inst_itr->NextNode(); inst; - inst = call_inst_itr->NextNode()) { - inst->RemoveFromList(); - std::unique_ptr cp_inst(inst); - // If multiple blocks generated, regenerate any same-block - // instruction that has not been seen in this last block. - if (multiBlocks) { - CloneSameBlockOps(&cp_inst, &postCallSB, &preCallSB, &new_blk_ptr); - // Remember same-block ops in this block. - if (IsSameBlockOp(&*cp_inst)) { - const uint32_t rid = cp_inst->result_id(); - postCallSB[rid] = rid; - } - } - new_blk_ptr->AddInstruction(std::move(cp_inst)); - } - // Finalize inline code. - new_blocks->push_back(std::move(new_blk_ptr)); - } break; - default: { - // Copy callee instruction and remap all input Ids. - std::unique_ptr cp_inst(cpi->Clone(context())); - cp_inst->ForEachInId([&callee2caller, &callee_result_ids, - this](uint32_t* iid) { - const auto mapItr = callee2caller.find(*iid); - if (mapItr != callee2caller.end()) { - *iid = mapItr->second; - } else if (callee_result_ids.find(*iid) != callee_result_ids.end()) { - // Forward reference. Allocate a new id, map it, - // use it and check for it when remapping result ids - const uint32_t nid = this->TakeNextId(); - callee2caller[*iid] = nid; - *iid = nid; - } - }); - // If result id is non-zero, remap it. If already mapped, use mapped - // value, else use next id. - const uint32_t rid = cp_inst->result_id(); - if (rid != 0) { - const auto mapItr = callee2caller.find(rid); - uint32_t nid; - if (mapItr != callee2caller.end()) { - nid = mapItr->second; - } else { - nid = this->TakeNextId(); - callee2caller[rid] = nid; - } - cp_inst->SetResultId(nid); - get_decoration_mgr()->CloneDecorations(rid, nid); - } - new_blk_ptr->AddInstruction(std::move(cp_inst)); - } break; - } - }); + if (!successful) { + return false; + } if (caller_is_loop_header && (new_blocks->size() > 1)) { // Move the OpLoopMerge from the last block back to the first, where @@ -533,6 +626,7 @@ void InlinePass::GenInlineCode( for (auto& blk : *new_blocks) { id2block_[blk->id()] = &*blk; } + return true; } bool InlinePass::IsInlinableFunctionCall(const Instruction* inst) { @@ -561,44 +655,24 @@ void InlinePass::UpdateSucceedingPhis( }); } -bool InlinePass::HasMultipleReturns(Function* func) { - bool seenReturn = false; - bool multipleReturns = false; +bool InlinePass::HasNoReturnInStructuredConstruct(Function* func) { + // If control not structured, do not do loop/return analysis + // TODO: Analyze returns in non-structured control flow + if (!context()->get_feature_mgr()->HasCapability(SpvCapabilityShader)) + return false; + const auto structured_analysis = context()->GetStructuredCFGAnalysis(); + // Search for returns in structured construct. + bool return_in_construct = false; for (auto& blk : *func) { auto terminal_ii = blk.cend(); --terminal_ii; - if (terminal_ii->opcode() == SpvOpReturn || - terminal_ii->opcode() == SpvOpReturnValue) { - if (seenReturn) { - multipleReturns = true; - break; - } - seenReturn = true; + if (spvOpcodeIsReturn(terminal_ii->opcode()) && + structured_analysis->ContainingConstruct(blk.id()) != 0) { + return_in_construct = true; + break; } } - return multipleReturns; -} - -void InlinePass::ComputeStructuredSuccessors(Function* func) { - // If header, make merge block first successor. - for (auto& blk : *func) { - uint32_t mbid = blk.MergeBlockIdIfAny(); - if (mbid != 0) { - block2structured_succs_[&blk].push_back(id2block_[mbid]); - } - - // Add true successors. - const auto& const_blk = blk; - const_blk.ForEachSuccessorLabel([&blk, this](const uint32_t sbid) { - block2structured_succs_[&blk].push_back(id2block_[sbid]); - }); - } -} - -InlinePass::GetBlocksFunction InlinePass::StructuredSuccessorsFunction() { - return [this](const BasicBlock* block) { - return &(block2structured_succs_[block]); - }; + return !return_in_construct; } bool InlinePass::HasNoReturnInLoop(Function* func) { @@ -606,52 +680,27 @@ bool InlinePass::HasNoReturnInLoop(Function* func) { // TODO: Analyze returns in non-structured control flow if (!context()->get_feature_mgr()->HasCapability(SpvCapabilityShader)) return false; - // Compute structured block order. This order has the property - // that dominators are before all blocks they dominate and merge blocks - // are after all blocks that are in the control constructs of their header. - ComputeStructuredSuccessors(func); - auto ignore_block = [](cbb_ptr) {}; - auto ignore_edge = [](cbb_ptr, cbb_ptr) {}; - std::list structuredOrder; - CFA::DepthFirstTraversal( - &*func->begin(), StructuredSuccessorsFunction(), ignore_block, - [&](cbb_ptr b) { structuredOrder.push_front(b); }, ignore_edge); - // Search for returns in loops. Only need to track outermost loop + const auto structured_analysis = context()->GetStructuredCFGAnalysis(); + // Search for returns in structured construct. bool return_in_loop = false; - uint32_t outerLoopMergeId = 0; - for (auto& blk : structuredOrder) { - // Exiting current outer loop - if (blk->id() == outerLoopMergeId) outerLoopMergeId = 0; - // Return block - auto terminal_ii = blk->cend(); + for (auto& blk : *func) { + auto terminal_ii = blk.cend(); --terminal_ii; - if (terminal_ii->opcode() == SpvOpReturn || - terminal_ii->opcode() == SpvOpReturnValue) { - if (outerLoopMergeId != 0) { - return_in_loop = true; - break; - } - } else if (terminal_ii != blk->cbegin()) { - auto merge_ii = terminal_ii; - --merge_ii; - // Entering outermost loop - if (merge_ii->opcode() == SpvOpLoopMerge && outerLoopMergeId == 0) - outerLoopMergeId = - merge_ii->GetSingleWordOperand(kSpvLoopMergeMergeBlockId); + if (spvOpcodeIsReturn(terminal_ii->opcode()) && + structured_analysis->ContainingLoop(blk.id()) != 0) { + return_in_loop = true; + break; } } return !return_in_loop; } void InlinePass::AnalyzeReturns(Function* func) { - // Look for multiple returns - if (!HasMultipleReturns(func)) { + if (HasNoReturnInLoop(func)) { no_return_in_loop_.insert(func->result_id()); - return; + if (!HasNoReturnInStructuredConstruct(func)) + early_return_funcs_.insert(func->result_id()); } - multi_return_funcs_.insert(func->result_id()); - // If multiple returns, see if any are in a loop - if (HasNoReturnInLoop(func)) no_return_in_loop_.insert(func->result_id()); } bool InlinePass::IsInlinableFunction(Function* func) { @@ -663,8 +712,15 @@ bool InlinePass::IsInlinableFunction(Function* func) { // done validly if the return was not in a loop in the original function. // Also remember functions with multiple (early) returns. AnalyzeReturns(func); - return no_return_in_loop_.find(func->result_id()) != - no_return_in_loop_.cend(); + if (no_return_in_loop_.find(func->result_id()) == no_return_in_loop_.cend()) { + return false; + } + + if (func->IsRecursive()) { + return false; + } + + return true; } void InlinePass::InitializeInline() { @@ -673,10 +729,9 @@ void InlinePass::InitializeInline() { // clear collections id2function_.clear(); id2block_.clear(); - block2structured_succs_.clear(); inlinable_.clear(); no_return_in_loop_.clear(); - multi_return_funcs_.clear(); + early_return_funcs_.clear(); for (auto& fn : *get_module()) { // Initialize function and block maps. diff --git a/3rdparty/spirv-tools/source/opt/inline_pass.h b/3rdparty/spirv-tools/source/opt/inline_pass.h index 55369c98c..ecfe964f1 100644 --- a/3rdparty/spirv-tools/source/opt/inline_pass.h +++ b/3rdparty/spirv-tools/source/opt/inline_pass.h @@ -36,15 +36,13 @@ class InlinePass : public Pass { using cbb_ptr = const BasicBlock*; public: - using GetBlocksFunction = - std::function*(const BasicBlock*)>; - virtual ~InlinePass() = default; protected: InlinePass(); - // Add pointer to type to module and return resultId. + // Add pointer to type to module and return resultId. Returns 0 if the type + // could not be created. uint32_t AddPointerToType(uint32_t type_id, SpvStorageClass storage_class); // Add unconditional branch to labelId to end of block block_ptr. @@ -70,20 +68,22 @@ class InlinePass : public Pass { std::unique_ptr NewLabel(uint32_t label_id); // Returns the id for the boolean false value. Looks in the module first - // and creates it if not found. Remembers it for future calls. + // and creates it if not found. Remembers it for future calls. Returns 0 if + // the value could not be created. uint32_t GetFalseId(); // Map callee params to caller args void MapParams(Function* calleeFn, BasicBlock::iterator call_inst_itr, std::unordered_map* callee2caller); - // Clone and map callee locals - void CloneAndMapLocals(Function* calleeFn, + // Clone and map callee locals. Return true if successful. + bool CloneAndMapLocals(Function* calleeFn, std::vector>* new_vars, std::unordered_map* callee2caller); - // Create return variable for callee clone code if needed. Return id - // if created, otherwise 0. + // Create return variable for callee clone code. The return type of + // |calleeFn| must not be void. Returns the id of the return variable if + // created. Returns 0 if the return variable could not be created. uint32_t CreateReturnVar(Function* calleeFn, std::vector>* new_vars); @@ -95,7 +95,7 @@ class InlinePass : public Pass { // Look in preCallSB for instructions that need cloning. Look in // postCallSB for instructions already cloned. Add cloned instruction // to postCallSB. - void CloneSameBlockOps(std::unique_ptr* inst, + bool CloneSameBlockOps(std::unique_ptr* inst, std::unordered_map* postCallSB, std::unordered_map* preCallSB, std::unique_ptr* block_ptr); @@ -114,7 +114,9 @@ class InlinePass : public Pass { // Also return in new_vars additional OpVariable instructions required by // and to be inserted into the caller function after the block at // call_block_itr is replaced with new_blocks. - void GenInlineCode(std::vector>* new_blocks, + // + // Returns true if successful. + bool GenInlineCode(std::vector>* new_blocks, std::vector>* new_vars, BasicBlock::iterator call_inst_itr, UptrVectorIterator call_block_itr); @@ -122,21 +124,9 @@ class InlinePass : public Pass { // Return true if |inst| is a function call that can be inlined. bool IsInlinableFunctionCall(const Instruction* inst); - // Compute structured successors for function |func|. - // A block's structured successors are the blocks it branches to - // together with its declared merge block if it has one. - // When order matters, the merge block always appears first. - // This assures correct depth first search in the presence of early - // returns and kills. If the successor vector contain duplicates - // if the merge block, they are safely ignored by DFS. - void ComputeStructuredSuccessors(Function* func); - - // Return function to return ordered structure successors for a given block - // Assumes ComputeStructuredSuccessors() has been called. - GetBlocksFunction StructuredSuccessorsFunction(); - - // Return true if |func| has multiple returns - bool HasMultipleReturns(Function* func); + // Return true if |func| does not have a return that is + // nested in a structured if, switch or loop. + bool HasNoReturnInStructuredConstruct(Function* func); // Return true if |func| has no return in a loop. The current analysis // requires structured control flow, so return false if control flow not @@ -163,8 +153,8 @@ class InlinePass : public Pass { // CFG. It has functionality not present in CFG. Consolidate. std::unordered_map id2block_; - // Set of ids of functions with multiple returns. - std::set multi_return_funcs_; + // Set of ids of functions with early return. + std::set early_return_funcs_; // Set of ids of functions with no returns in loop std::set no_return_in_loop_; @@ -174,13 +164,6 @@ class InlinePass : public Pass { // result id for OpConstantFalse uint32_t false_id_; - - // Map from block to its structured successor blocks. See - // ComputeStructuredSuccessors() for definition. TODO(dnovillo): This is - // superfluous wrt CFG, but it seems to be computed in a slightly - // different way in the inliner. Can these be consolidated? - std::unordered_map> - block2structured_succs_; }; } // namespace opt diff --git a/3rdparty/spirv-tools/source/opt/inst_bindless_check_pass.cpp b/3rdparty/spirv-tools/source/opt/inst_bindless_check_pass.cpp new file mode 100644 index 000000000..1901f763b --- /dev/null +++ b/3rdparty/spirv-tools/source/opt/inst_bindless_check_pass.cpp @@ -0,0 +1,263 @@ +// Copyright (c) 2018 The Khronos Group Inc. +// Copyright (c) 2018 Valve Corporation +// Copyright (c) 2018 LunarG Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "inst_bindless_check_pass.h" + +namespace { + +// Input Operand Indices +static const int kSpvImageSampleImageIdInIdx = 0; +static const int kSpvSampledImageImageIdInIdx = 0; +static const int kSpvSampledImageSamplerIdInIdx = 1; +static const int kSpvImageSampledImageIdInIdx = 0; +static const int kSpvLoadPtrIdInIdx = 0; +static const int kSpvAccessChainBaseIdInIdx = 0; +static const int kSpvAccessChainIndex0IdInIdx = 1; +static const int kSpvTypePointerTypeIdInIdx = 1; +static const int kSpvTypeArrayLengthIdInIdx = 1; +static const int kSpvConstantValueInIdx = 0; + +} // anonymous namespace + +namespace spvtools { +namespace opt { + +void InstBindlessCheckPass::GenBindlessCheckCode( + BasicBlock::iterator ref_inst_itr, + UptrVectorIterator ref_block_itr, uint32_t instruction_idx, + uint32_t stage_idx, std::vector>* new_blocks) { + // Look for reference through bindless descriptor. If not, return. + std::unique_ptr new_blk_ptr; + uint32_t image_id; + switch (ref_inst_itr->opcode()) { + case SpvOp::SpvOpImageSampleImplicitLod: + case SpvOp::SpvOpImageSampleExplicitLod: + case SpvOp::SpvOpImageSampleDrefImplicitLod: + case SpvOp::SpvOpImageSampleDrefExplicitLod: + case SpvOp::SpvOpImageSampleProjImplicitLod: + case SpvOp::SpvOpImageSampleProjExplicitLod: + case SpvOp::SpvOpImageSampleProjDrefImplicitLod: + case SpvOp::SpvOpImageSampleProjDrefExplicitLod: + case SpvOp::SpvOpImageGather: + case SpvOp::SpvOpImageDrefGather: + case SpvOp::SpvOpImageQueryLod: + case SpvOp::SpvOpImageSparseSampleImplicitLod: + case SpvOp::SpvOpImageSparseSampleExplicitLod: + case SpvOp::SpvOpImageSparseSampleDrefImplicitLod: + case SpvOp::SpvOpImageSparseSampleDrefExplicitLod: + case SpvOp::SpvOpImageSparseSampleProjImplicitLod: + case SpvOp::SpvOpImageSparseSampleProjExplicitLod: + case SpvOp::SpvOpImageSparseSampleProjDrefImplicitLod: + case SpvOp::SpvOpImageSparseSampleProjDrefExplicitLod: + case SpvOp::SpvOpImageSparseGather: + case SpvOp::SpvOpImageSparseDrefGather: + case SpvOp::SpvOpImageFetch: + case SpvOp::SpvOpImageRead: + case SpvOp::SpvOpImageQueryFormat: + case SpvOp::SpvOpImageQueryOrder: + case SpvOp::SpvOpImageQuerySizeLod: + case SpvOp::SpvOpImageQuerySize: + case SpvOp::SpvOpImageQueryLevels: + case SpvOp::SpvOpImageQuerySamples: + case SpvOp::SpvOpImageSparseFetch: + case SpvOp::SpvOpImageSparseRead: + case SpvOp::SpvOpImageWrite: + image_id = + ref_inst_itr->GetSingleWordInOperand(kSpvImageSampleImageIdInIdx); + break; + default: + return; + } + Instruction* image_inst = get_def_use_mgr()->GetDef(image_id); + uint32_t load_id; + Instruction* load_inst; + if (image_inst->opcode() == SpvOp::SpvOpSampledImage) { + load_id = image_inst->GetSingleWordInOperand(kSpvSampledImageImageIdInIdx); + load_inst = get_def_use_mgr()->GetDef(load_id); + } else if (image_inst->opcode() == SpvOp::SpvOpImage) { + load_id = image_inst->GetSingleWordInOperand(kSpvImageSampledImageIdInIdx); + load_inst = get_def_use_mgr()->GetDef(load_id); + } else { + load_id = image_id; + load_inst = image_inst; + image_id = 0; + } + if (load_inst->opcode() != SpvOp::SpvOpLoad) { + // TODO(greg-lunarg): Handle additional possibilities + return; + } + uint32_t ptr_id = load_inst->GetSingleWordInOperand(kSpvLoadPtrIdInIdx); + Instruction* ptr_inst = get_def_use_mgr()->GetDef(ptr_id); + if (ptr_inst->opcode() != SpvOp::SpvOpAccessChain) return; + if (ptr_inst->NumInOperands() != 2) { + assert(false && "unexpected bindless index number"); + return; + } + uint32_t index_id = + ptr_inst->GetSingleWordInOperand(kSpvAccessChainIndex0IdInIdx); + ptr_id = ptr_inst->GetSingleWordInOperand(kSpvAccessChainBaseIdInIdx); + ptr_inst = get_def_use_mgr()->GetDef(ptr_id); + if (ptr_inst->opcode() != SpvOpVariable) { + assert(false && "unexpected bindless base"); + return; + } + uint32_t var_type_id = ptr_inst->type_id(); + Instruction* var_type_inst = get_def_use_mgr()->GetDef(var_type_id); + uint32_t ptr_type_id = + var_type_inst->GetSingleWordInOperand(kSpvTypePointerTypeIdInIdx); + Instruction* ptr_type_inst = get_def_use_mgr()->GetDef(ptr_type_id); + // TODO(greg-lunarg): Handle RuntimeArray. Will need to pull length + // out of debug input buffer. + if (ptr_type_inst->opcode() != SpvOpTypeArray) return; + // If index and bound both compile-time constants and index < bound, + // return without changing + uint32_t length_id = + ptr_type_inst->GetSingleWordInOperand(kSpvTypeArrayLengthIdInIdx); + Instruction* index_inst = get_def_use_mgr()->GetDef(index_id); + Instruction* length_inst = get_def_use_mgr()->GetDef(length_id); + if (index_inst->opcode() == SpvOpConstant && + length_inst->opcode() == SpvOpConstant && + index_inst->GetSingleWordInOperand(kSpvConstantValueInIdx) < + length_inst->GetSingleWordInOperand(kSpvConstantValueInIdx)) + return; + // Generate full runtime bounds test code with true branch + // being full reference and false branch being debug output and zero + // for the referenced value. + MovePreludeCode(ref_inst_itr, ref_block_itr, &new_blk_ptr); + InstructionBuilder builder( + context(), &*new_blk_ptr, + IRContext::kAnalysisDefUse | IRContext::kAnalysisInstrToBlockMapping); + uint32_t error_id = builder.GetUintConstantId(kInstErrorBindlessBounds); + Instruction* ult_inst = + builder.AddBinaryOp(GetBoolId(), SpvOpULessThan, index_id, length_id); + uint32_t merge_blk_id = TakeNextId(); + uint32_t valid_blk_id = TakeNextId(); + uint32_t invalid_blk_id = TakeNextId(); + std::unique_ptr merge_label(NewLabel(merge_blk_id)); + std::unique_ptr valid_label(NewLabel(valid_blk_id)); + std::unique_ptr invalid_label(NewLabel(invalid_blk_id)); + (void)builder.AddConditionalBranch(ult_inst->result_id(), valid_blk_id, + invalid_blk_id, merge_blk_id, + SpvSelectionControlMaskNone); + // Close selection block and gen valid reference block + new_blocks->push_back(std::move(new_blk_ptr)); + new_blk_ptr.reset(new BasicBlock(std::move(valid_label))); + builder.SetInsertPoint(&*new_blk_ptr); + // Clone descriptor load + Instruction* new_load_inst = + builder.AddLoad(load_inst->type_id(), + load_inst->GetSingleWordInOperand(kSpvLoadPtrIdInIdx)); + uint32_t new_load_id = new_load_inst->result_id(); + get_decoration_mgr()->CloneDecorations(load_inst->result_id(), new_load_id); + uint32_t new_image_id = new_load_id; + // Clone Image/SampledImage with new load, if needed + if (image_id != 0) { + if (image_inst->opcode() == SpvOp::SpvOpSampledImage) { + Instruction* new_image_inst = builder.AddBinaryOp( + image_inst->type_id(), SpvOpSampledImage, new_load_id, + image_inst->GetSingleWordInOperand(kSpvSampledImageSamplerIdInIdx)); + new_image_id = new_image_inst->result_id(); + } else { + assert(image_inst->opcode() == SpvOp::SpvOpImage && "expecting OpImage"); + Instruction* new_image_inst = + builder.AddUnaryOp(image_inst->type_id(), SpvOpImage, new_load_id); + new_image_id = new_image_inst->result_id(); + } + get_decoration_mgr()->CloneDecorations(image_id, new_image_id); + } + // Clone original reference using new image code + std::unique_ptr new_ref_inst(ref_inst_itr->Clone(context())); + uint32_t ref_result_id = ref_inst_itr->result_id(); + uint32_t new_ref_id = 0; + if (ref_result_id != 0) { + new_ref_id = TakeNextId(); + new_ref_inst->SetResultId(new_ref_id); + } + new_ref_inst->SetInOperand(kSpvImageSampleImageIdInIdx, {new_image_id}); + // Register new reference and add to new block + builder.AddInstruction(std::move(new_ref_inst)); + if (new_ref_id != 0) + get_decoration_mgr()->CloneDecorations(ref_result_id, new_ref_id); + // Close valid block and gen invalid block + (void)builder.AddBranch(merge_blk_id); + new_blocks->push_back(std::move(new_blk_ptr)); + new_blk_ptr.reset(new BasicBlock(std::move(invalid_label))); + builder.SetInsertPoint(&*new_blk_ptr); + uint32_t u_index_id = GenUintCastCode(index_id, &builder); + GenDebugStreamWrite(instruction_idx, stage_idx, + {error_id, u_index_id, length_id}, &builder); + // Remember last invalid block id + uint32_t last_invalid_blk_id = new_blk_ptr->GetLabelInst()->result_id(); + // Gen zero for invalid reference + uint32_t ref_type_id = ref_inst_itr->type_id(); + // Close invalid block and gen merge block + (void)builder.AddBranch(merge_blk_id); + new_blocks->push_back(std::move(new_blk_ptr)); + new_blk_ptr.reset(new BasicBlock(std::move(merge_label))); + builder.SetInsertPoint(&*new_blk_ptr); + // Gen phi of new reference and zero, if necessary, and replace the + // result id of the original reference with that of the Phi. Kill original + // reference and move in remainder of original block. + if (new_ref_id != 0) { + Instruction* phi_inst = builder.AddPhi( + ref_type_id, {new_ref_id, valid_blk_id, builder.GetNullId(ref_type_id), + last_invalid_blk_id}); + context()->ReplaceAllUsesWith(ref_result_id, phi_inst->result_id()); + } + context()->KillInst(&*ref_inst_itr); + MovePostludeCode(ref_block_itr, &new_blk_ptr); + // Add remainder/merge block to new blocks + new_blocks->push_back(std::move(new_blk_ptr)); +} + +void InstBindlessCheckPass::InitializeInstBindlessCheck() { + // Initialize base class + InitializeInstrument(); + // Look for related extensions + ext_descriptor_indexing_defined_ = false; + for (auto& ei : get_module()->extensions()) { + const char* ext_name = + reinterpret_cast(&ei.GetInOperand(0).words[0]); + if (strcmp(ext_name, "SPV_EXT_descriptor_indexing") == 0) { + ext_descriptor_indexing_defined_ = true; + break; + } + } +} + +Pass::Status InstBindlessCheckPass::ProcessImpl() { + // Perform instrumentation on each entry point function in module + InstProcessFunction pfn = + [this](BasicBlock::iterator ref_inst_itr, + UptrVectorIterator ref_block_itr, + uint32_t instruction_idx, uint32_t stage_idx, + std::vector>* new_blocks) { + return GenBindlessCheckCode(ref_inst_itr, ref_block_itr, + instruction_idx, stage_idx, new_blocks); + }; + bool modified = InstProcessEntryPointCallTree(pfn); + // This pass does not update inst->blk info + context()->InvalidateAnalyses(IRContext::kAnalysisInstrToBlockMapping); + return modified ? Status::SuccessWithChange : Status::SuccessWithoutChange; +} + +Pass::Status InstBindlessCheckPass::Process() { + InitializeInstBindlessCheck(); + return ProcessImpl(); +} + +} // namespace opt +} // namespace spvtools diff --git a/3rdparty/spirv-tools/source/opt/inst_bindless_check_pass.h b/3rdparty/spirv-tools/source/opt/inst_bindless_check_pass.h new file mode 100644 index 000000000..3ab5ab7cf --- /dev/null +++ b/3rdparty/spirv-tools/source/opt/inst_bindless_check_pass.h @@ -0,0 +1,93 @@ +// Copyright (c) 2018 The Khronos Group Inc. +// Copyright (c) 2018 Valve Corporation +// Copyright (c) 2018 LunarG Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef LIBSPIRV_OPT_INST_BINDLESS_CHECK_PASS_H_ +#define LIBSPIRV_OPT_INST_BINDLESS_CHECK_PASS_H_ + +#include "instrument_pass.h" + +namespace spvtools { +namespace opt { + +// This class/pass is designed to support the bindless (descriptor indexing) +// GPU-assisted validation layer of +// https://github.com/KhronosGroup/Vulkan-ValidationLayers. Its internal and +// external design may change as the layer evolves. +class InstBindlessCheckPass : public InstrumentPass { + public: + // For test harness only + InstBindlessCheckPass() : InstrumentPass(7, 23, kInstValidationIdBindless) {} + // For all other interfaces + InstBindlessCheckPass(uint32_t desc_set, uint32_t shader_id) + : InstrumentPass(desc_set, shader_id, kInstValidationIdBindless) {} + + ~InstBindlessCheckPass() override = default; + + // See optimizer.hpp for pass user documentation. + Status Process() override; + + const char* name() const override { return "inst-bindless-check-pass"; } + + private: + // Initialize state for instrumenting bindless checking + void InitializeInstBindlessCheck(); + + // This function does bindless checking instrumentation on a single + // instruction. It is designed to be passed to + // InstrumentPass::InstProcessEntryPointCallTree(), which applies the + // function to each instruction in a module and replaces the instruction + // if warranted. + // + // If |ref_inst_itr| is a bindless reference, return in |new_blocks| the + // result of instrumenting it with validation code within its block at + // |ref_block_itr|. Specifically, generate code to check that the index + // into the descriptor array is in-bounds. If the check passes, execute + // the remainder of the reference, otherwise write a record to the debug + // output buffer stream including |function_idx, instruction_idx, stage_idx| + // and replace the reference with the null value of the original type. The + // block at |ref_block_itr| can just be replaced with the blocks in + // |new_blocks|, which will contain at least two blocks. The last block will + // comprise all instructions following |ref_inst_itr|, + // preceded by a phi instruction. + // + // This instrumentation pass utilizes GenDebugStreamWrite() to write its + // error records. The validation-specific part of the error record will + // have the format: + // + // Validation Error Code (=kInstErrorBindlessBounds) + // Descriptor Index + // Descriptor Array Size + // + // The Descriptor Index is the index which has been determined to be + // out-of-bounds. + // + // The Descriptor Array Size is the size of the descriptor array which was + // indexed. + void GenBindlessCheckCode( + BasicBlock::iterator ref_inst_itr, + UptrVectorIterator ref_block_itr, uint32_t instruction_idx, + uint32_t stage_idx, std::vector>* new_blocks); + + Pass::Status ProcessImpl(); + + // True if VK_EXT_descriptor_indexing is defined + bool ext_descriptor_indexing_defined_; +}; + +} // namespace opt +} // namespace spvtools + +#endif // LIBSPIRV_OPT_INST_BINDLESS_CHECK_PASS_H_ diff --git a/3rdparty/spirv-tools/source/opt/instruction.cpp b/3rdparty/spirv-tools/source/opt/instruction.cpp index 4cfa41d8e..5f3c5a889 100644 --- a/3rdparty/spirv-tools/source/opt/instruction.cpp +++ b/3rdparty/spirv-tools/source/opt/instruction.cpp @@ -156,6 +156,7 @@ bool Instruction::IsReadOnlyLoad() const { Instruction* Instruction::GetBaseAddress() const { assert((IsLoad() || opcode() == SpvOpStore || opcode() == SpvOpAccessChain || + opcode() == SpvOpPtrAccessChain || opcode() == SpvOpInBoundsAccessChain || opcode() == SpvOpCopyObject || opcode() == SpvOpImageTexelPointer) && "GetBaseAddress should only be called on instructions that take a " @@ -187,6 +188,8 @@ Instruction* Instruction::GetBaseAddress() const { case SpvOpStore: case SpvOpAccessChain: case SpvOpInBoundsAccessChain: + case SpvOpPtrAccessChain: + case SpvOpImageTexelPointer: case SpvOpCopyObject: // A load or store through a pointer. assert(base_inst->IsValidBasePointer() && @@ -510,7 +513,7 @@ bool Instruction::IsFloatingPointFoldingAllowed() const { bool is_nocontract = false; context_->get_decoration_mgr()->WhileEachDecoration( - opcode_, SpvDecorationNoContraction, + result_id(), SpvDecorationNoContraction, [&is_nocontract](const Instruction&) { is_nocontract = true; return false; @@ -540,6 +543,10 @@ std::ostream& operator<<(std::ostream& str, const Instruction& inst) { return str; } +void Instruction::Dump() const { + std::cerr << "Instruction #" << unique_id() << "\n" << *this << "\n"; +} + bool Instruction::IsOpcodeCodeMotionSafe() const { switch (opcode_) { case SpvOpNop: diff --git a/3rdparty/spirv-tools/source/opt/instruction.h b/3rdparty/spirv-tools/source/opt/instruction.h index 2533ba272..034da76f4 100644 --- a/3rdparty/spirv-tools/source/opt/instruction.h +++ b/3rdparty/spirv-tools/source/opt/instruction.h @@ -349,6 +349,10 @@ class Instruction : public utils::IntrusiveNodeBase { // uniform buffer. bool IsVulkanUniformBuffer() const; + // Returns true if the instruction is an atom operation that uses original + // value. + inline bool IsAtomicWithLoad() const; + // Returns true if the instruction is an atom operation. inline bool IsAtomicOp() const; @@ -427,6 +431,10 @@ class Instruction : public utils::IntrusiveNodeBase { // rules for physical addressing. bool IsValidBasePointer() const; + // Dump this instruction on stderr. Useful when running interactive + // debuggers. + void Dump() const; + private: // Returns the total count of result type id and result id. uint32_t TypeResultIdCount() const { @@ -610,15 +618,8 @@ inline void Instruction::ForEachId( inline bool Instruction::WhileEachInId( const std::function& f) { for (auto& opnd : operands_) { - switch (opnd.type) { - case SPV_OPERAND_TYPE_RESULT_ID: - case SPV_OPERAND_TYPE_TYPE_ID: - break; - default: - if (spvIsIdType(opnd.type)) { - if (!f(&opnd.words[0])) return false; - } - break; + if (spvIsInIdType(opnd.type)) { + if (!f(&opnd.words[0])) return false; } } return true; @@ -627,15 +628,8 @@ inline bool Instruction::WhileEachInId( inline bool Instruction::WhileEachInId( const std::function& f) const { for (const auto& opnd : operands_) { - switch (opnd.type) { - case SPV_OPERAND_TYPE_RESULT_ID: - case SPV_OPERAND_TYPE_TYPE_ID: - break; - default: - if (spvIsIdType(opnd.type)) { - if (!f(&opnd.words[0])) return false; - } - break; + if (spvIsInIdType(opnd.type)) { + if (!f(&opnd.words[0])) return false; } } return true; @@ -724,6 +718,10 @@ bool Instruction::IsDecoration() const { bool Instruction::IsLoad() const { return spvOpcodeIsLoad(opcode()); } +bool Instruction::IsAtomicWithLoad() const { + return spvOpcodeIsAtomicWithLoad(opcode()); +} + bool Instruction::IsAtomicOp() const { return spvOpcodeIsAtomicOp(opcode()); } bool Instruction::IsConstant() const { diff --git a/3rdparty/spirv-tools/source/opt/instrument_pass.cpp b/3rdparty/spirv-tools/source/opt/instrument_pass.cpp new file mode 100644 index 000000000..7f56a1e0d --- /dev/null +++ b/3rdparty/spirv-tools/source/opt/instrument_pass.cpp @@ -0,0 +1,710 @@ +// Copyright (c) 2018 The Khronos Group Inc. +// Copyright (c) 2018 Valve Corporation +// Copyright (c) 2018 LunarG Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "instrument_pass.h" + +#include "source/cfa.h" + +namespace { + +// Common Parameter Positions +static const int kInstCommonParamInstIdx = 0; +static const int kInstCommonParamCnt = 1; + +// Indices of operands in SPIR-V instructions +static const int kEntryPointExecutionModelInIdx = 0; +static const int kEntryPointFunctionIdInIdx = 1; + +} // anonymous namespace + +namespace spvtools { +namespace opt { + +void InstrumentPass::MovePreludeCode( + BasicBlock::iterator ref_inst_itr, + UptrVectorIterator ref_block_itr, + std::unique_ptr* new_blk_ptr) { + same_block_pre_.clear(); + same_block_post_.clear(); + // Initialize new block. Reuse label from original block. + new_blk_ptr->reset(new BasicBlock(std::move(ref_block_itr->GetLabel()))); + // Move contents of original ref block up to ref instruction. + for (auto cii = ref_block_itr->begin(); cii != ref_inst_itr; + cii = ref_block_itr->begin()) { + Instruction* inst = &*cii; + inst->RemoveFromList(); + std::unique_ptr mv_ptr(inst); + // Remember same-block ops for possible regeneration. + if (IsSameBlockOp(&*mv_ptr)) { + auto* sb_inst_ptr = mv_ptr.get(); + same_block_pre_[mv_ptr->result_id()] = sb_inst_ptr; + } + (*new_blk_ptr)->AddInstruction(std::move(mv_ptr)); + } +} + +void InstrumentPass::MovePostludeCode( + UptrVectorIterator ref_block_itr, + std::unique_ptr* new_blk_ptr) { + // new_blk_ptr->reset(new BasicBlock(NewLabel(ref_block_itr->id()))); + // Move contents of original ref block. + for (auto cii = ref_block_itr->begin(); cii != ref_block_itr->end(); + cii = ref_block_itr->begin()) { + Instruction* inst = &*cii; + inst->RemoveFromList(); + std::unique_ptr mv_inst(inst); + // Regenerate any same-block instruction that has not been seen in the + // current block. + if (same_block_pre_.size() > 0) { + CloneSameBlockOps(&mv_inst, &same_block_post_, &same_block_pre_, + new_blk_ptr); + // Remember same-block ops in this block. + if (IsSameBlockOp(&*mv_inst)) { + const uint32_t rid = mv_inst->result_id(); + same_block_post_[rid] = rid; + } + } + (*new_blk_ptr)->AddInstruction(std::move(mv_inst)); + } +} + +std::unique_ptr InstrumentPass::NewLabel(uint32_t label_id) { + std::unique_ptr newLabel( + new Instruction(context(), SpvOpLabel, 0, label_id, {})); + get_def_use_mgr()->AnalyzeInstDefUse(&*newLabel); + return newLabel; +} + +uint32_t InstrumentPass::GenUintCastCode(uint32_t val_id, + InstructionBuilder* builder) { + // Cast value to 32-bit unsigned if necessary + if (get_def_use_mgr()->GetDef(val_id)->type_id() == GetUintId()) + return val_id; + return builder->AddUnaryOp(GetUintId(), SpvOpBitcast, val_id)->result_id(); +} + +void InstrumentPass::GenDebugOutputFieldCode(uint32_t base_offset_id, + uint32_t field_offset, + uint32_t field_value_id, + InstructionBuilder* builder) { + // Cast value to 32-bit unsigned if necessary + uint32_t val_id = GenUintCastCode(field_value_id, builder); + // Store value + Instruction* data_idx_inst = + builder->AddBinaryOp(GetUintId(), SpvOpIAdd, base_offset_id, + builder->GetUintConstantId(field_offset)); + uint32_t buf_id = GetOutputBufferId(); + uint32_t buf_uint_ptr_id = GetOutputBufferUintPtrId(); + Instruction* achain_inst = + builder->AddTernaryOp(buf_uint_ptr_id, SpvOpAccessChain, buf_id, + builder->GetUintConstantId(kDebugOutputDataOffset), + data_idx_inst->result_id()); + (void)builder->AddBinaryOp(0, SpvOpStore, achain_inst->result_id(), val_id); +} + +void InstrumentPass::GenCommonStreamWriteCode(uint32_t record_sz, + uint32_t inst_id, + uint32_t stage_idx, + uint32_t base_offset_id, + InstructionBuilder* builder) { + // Store record size + GenDebugOutputFieldCode(base_offset_id, kInstCommonOutSize, + builder->GetUintConstantId(record_sz), builder); + // Store Shader Id + GenDebugOutputFieldCode(base_offset_id, kInstCommonOutShaderId, + builder->GetUintConstantId(shader_id_), builder); + // Store Instruction Idx + GenDebugOutputFieldCode(base_offset_id, kInstCommonOutInstructionIdx, inst_id, + builder); + // Store Stage Idx + GenDebugOutputFieldCode(base_offset_id, kInstCommonOutStageIdx, + builder->GetUintConstantId(stage_idx), builder); +} + +void InstrumentPass::GenFragCoordEltDebugOutputCode( + uint32_t base_offset_id, uint32_t uint_frag_coord_id, uint32_t element, + InstructionBuilder* builder) { + Instruction* element_val_inst = builder->AddIdLiteralOp( + GetUintId(), SpvOpCompositeExtract, uint_frag_coord_id, element); + GenDebugOutputFieldCode(base_offset_id, kInstFragOutFragCoordX + element, + element_val_inst->result_id(), builder); +} + +void InstrumentPass::GenBuiltinOutputCode(uint32_t builtin_id, + uint32_t builtin_off, + uint32_t base_offset_id, + InstructionBuilder* builder) { + // Load and store builtin + Instruction* load_inst = + builder->AddUnaryOp(GetUintId(), SpvOpLoad, builtin_id); + GenDebugOutputFieldCode(base_offset_id, builtin_off, load_inst->result_id(), + builder); +} + +void InstrumentPass::GenUintNullOutputCode(uint32_t field_off, + uint32_t base_offset_id, + InstructionBuilder* builder) { + GenDebugOutputFieldCode(base_offset_id, field_off, + builder->GetNullId(GetUintId()), builder); +} + +void InstrumentPass::GenStageStreamWriteCode(uint32_t stage_idx, + uint32_t base_offset_id, + InstructionBuilder* builder) { + // TODO(greg-lunarg): Add support for all stages + switch (stage_idx) { + case SpvExecutionModelVertex: { + // Load and store VertexId and InstanceId + GenBuiltinOutputCode(context()->GetBuiltinVarId(SpvBuiltInVertexId), + kInstVertOutVertexId, base_offset_id, builder); + GenBuiltinOutputCode(context()->GetBuiltinVarId(SpvBuiltInInstanceId), + kInstVertOutInstanceId, base_offset_id, builder); + } break; + case SpvExecutionModelGLCompute: { + // Load and store GlobalInvocationId. Second word is unused; store zero. + GenBuiltinOutputCode( + context()->GetBuiltinVarId(SpvBuiltInGlobalInvocationId), + kInstCompOutGlobalInvocationId, base_offset_id, builder); + GenUintNullOutputCode(kInstCompOutUnused, base_offset_id, builder); + } break; + case SpvExecutionModelGeometry: { + // Load and store PrimitiveId and InvocationId. + GenBuiltinOutputCode(context()->GetBuiltinVarId(SpvBuiltInPrimitiveId), + kInstGeomOutPrimitiveId, base_offset_id, builder); + GenBuiltinOutputCode(context()->GetBuiltinVarId(SpvBuiltInInvocationId), + kInstGeomOutInvocationId, base_offset_id, builder); + } break; + case SpvExecutionModelTessellationControl: + case SpvExecutionModelTessellationEvaluation: { + // Load and store InvocationId. Second word is unused; store zero. + GenBuiltinOutputCode(context()->GetBuiltinVarId(SpvBuiltInInvocationId), + kInstTessOutInvocationId, base_offset_id, builder); + GenUintNullOutputCode(kInstTessOutUnused, base_offset_id, builder); + } break; + case SpvExecutionModelFragment: { + // Load FragCoord and convert to Uint + Instruction* frag_coord_inst = + builder->AddUnaryOp(GetVec4FloatId(), SpvOpLoad, + context()->GetBuiltinVarId(SpvBuiltInFragCoord)); + Instruction* uint_frag_coord_inst = builder->AddUnaryOp( + GetVec4UintId(), SpvOpBitcast, frag_coord_inst->result_id()); + for (uint32_t u = 0; u < 2u; ++u) + GenFragCoordEltDebugOutputCode( + base_offset_id, uint_frag_coord_inst->result_id(), u, builder); + } break; + default: { assert(false && "unsupported stage"); } break; + } +} + +void InstrumentPass::GenDebugStreamWrite( + uint32_t instruction_idx, uint32_t stage_idx, + const std::vector& validation_ids, InstructionBuilder* builder) { + // Call debug output function. Pass func_idx, instruction_idx and + // validation ids as args. + uint32_t val_id_cnt = static_cast(validation_ids.size()); + uint32_t output_func_id = GetStreamWriteFunctionId(stage_idx, val_id_cnt); + std::vector args = {output_func_id, + builder->GetUintConstantId(instruction_idx)}; + (void)args.insert(args.end(), validation_ids.begin(), validation_ids.end()); + (void)builder->AddNaryOp(GetVoidId(), SpvOpFunctionCall, args); +} + +bool InstrumentPass::IsSameBlockOp(const Instruction* inst) const { + return inst->opcode() == SpvOpSampledImage || inst->opcode() == SpvOpImage; +} + +void InstrumentPass::CloneSameBlockOps( + std::unique_ptr* inst, + std::unordered_map* same_blk_post, + std::unordered_map* same_blk_pre, + std::unique_ptr* block_ptr) { + (*inst)->ForEachInId( + [&same_blk_post, &same_blk_pre, &block_ptr, this](uint32_t* iid) { + const auto map_itr = (*same_blk_post).find(*iid); + if (map_itr == (*same_blk_post).end()) { + const auto map_itr2 = (*same_blk_pre).find(*iid); + if (map_itr2 != (*same_blk_pre).end()) { + // Clone pre-call same-block ops, map result id. + const Instruction* in_inst = map_itr2->second; + std::unique_ptr sb_inst(in_inst->Clone(context())); + CloneSameBlockOps(&sb_inst, same_blk_post, same_blk_pre, block_ptr); + const uint32_t rid = sb_inst->result_id(); + const uint32_t nid = this->TakeNextId(); + get_decoration_mgr()->CloneDecorations(rid, nid); + sb_inst->SetResultId(nid); + (*same_blk_post)[rid] = nid; + *iid = nid; + (*block_ptr)->AddInstruction(std::move(sb_inst)); + } + } else { + // Reset same-block op operand. + *iid = map_itr->second; + } + }); +} + +void InstrumentPass::UpdateSucceedingPhis( + std::vector>& new_blocks) { + const auto first_blk = new_blocks.begin(); + const auto last_blk = new_blocks.end() - 1; + const uint32_t first_id = (*first_blk)->id(); + const uint32_t last_id = (*last_blk)->id(); + const BasicBlock& const_last_block = *last_blk->get(); + const_last_block.ForEachSuccessorLabel( + [&first_id, &last_id, this](const uint32_t succ) { + BasicBlock* sbp = this->id2block_[succ]; + sbp->ForEachPhiInst([&first_id, &last_id, this](Instruction* phi) { + bool changed = false; + phi->ForEachInId([&first_id, &last_id, &changed](uint32_t* id) { + if (*id == first_id) { + *id = last_id; + changed = true; + } + }); + if (changed) get_def_use_mgr()->AnalyzeInstUse(phi); + }); + }); +} + +// Return id for output buffer uint ptr type +uint32_t InstrumentPass::GetOutputBufferUintPtrId() { + if (output_buffer_uint_ptr_id_ == 0) { + output_buffer_uint_ptr_id_ = context()->get_type_mgr()->FindPointerToType( + GetUintId(), SpvStorageClassStorageBuffer); + } + return output_buffer_uint_ptr_id_; +} + +uint32_t InstrumentPass::GetOutputBufferBinding() { + switch (validation_id_) { + case kInstValidationIdBindless: + return kDebugOutputBindingStream; + default: + assert(false && "unexpected validation id"); + } + return 0; +} + +// Return id for output buffer +uint32_t InstrumentPass::GetOutputBufferId() { + if (output_buffer_id_ == 0) { + // If not created yet, create one + analysis::DecorationManager* deco_mgr = get_decoration_mgr(); + analysis::TypeManager* type_mgr = context()->get_type_mgr(); + analysis::Integer uint_ty(32, false); + analysis::Type* reg_uint_ty = type_mgr->GetRegisteredType(&uint_ty); + analysis::RuntimeArray uint_rarr_ty(reg_uint_ty); + analysis::Type* reg_uint_rarr_ty = + type_mgr->GetRegisteredType(&uint_rarr_ty); + analysis::Struct obuf_ty({reg_uint_ty, reg_uint_rarr_ty}); + analysis::Type* reg_obuf_ty = type_mgr->GetRegisteredType(&obuf_ty); + uint32_t obufTyId = type_mgr->GetTypeInstruction(reg_obuf_ty); + deco_mgr->AddDecoration(obufTyId, SpvDecorationBlock); + deco_mgr->AddMemberDecoration(obufTyId, kDebugOutputSizeOffset, + SpvDecorationOffset, 0); + deco_mgr->AddMemberDecoration(obufTyId, kDebugOutputDataOffset, + SpvDecorationOffset, 4); + uint32_t obufTyPtrId_ = + type_mgr->FindPointerToType(obufTyId, SpvStorageClassStorageBuffer); + output_buffer_id_ = TakeNextId(); + std::unique_ptr newVarOp(new Instruction( + context(), SpvOpVariable, obufTyPtrId_, output_buffer_id_, + {{spv_operand_type_t::SPV_OPERAND_TYPE_LITERAL_INTEGER, + {SpvStorageClassStorageBuffer}}})); + context()->AddGlobalValue(std::move(newVarOp)); + deco_mgr->AddDecorationVal(output_buffer_id_, SpvDecorationDescriptorSet, + desc_set_); + deco_mgr->AddDecorationVal(output_buffer_id_, SpvDecorationBinding, + GetOutputBufferBinding()); + // Look for storage buffer extension. If none, create one. + if (!get_feature_mgr()->HasExtension( + kSPV_KHR_storage_buffer_storage_class)) { + const std::string ext_name("SPV_KHR_storage_buffer_storage_class"); + const auto num_chars = ext_name.size(); + // Compute num words, accommodate the terminating null character. + const auto num_words = (num_chars + 1 + 3) / 4; + std::vector ext_words(num_words, 0u); + std::memcpy(ext_words.data(), ext_name.data(), num_chars); + context()->AddExtension(std::unique_ptr( + new Instruction(context(), SpvOpExtension, 0u, 0u, + {{SPV_OPERAND_TYPE_LITERAL_STRING, ext_words}}))); + } + } + return output_buffer_id_; +} + +uint32_t InstrumentPass::GetVec4FloatId() { + if (v4float_id_ == 0) { + analysis::TypeManager* type_mgr = context()->get_type_mgr(); + analysis::Float float_ty(32); + analysis::Type* reg_float_ty = type_mgr->GetRegisteredType(&float_ty); + analysis::Vector v4float_ty(reg_float_ty, 4); + analysis::Type* reg_v4float_ty = type_mgr->GetRegisteredType(&v4float_ty); + v4float_id_ = type_mgr->GetTypeInstruction(reg_v4float_ty); + } + return v4float_id_; +} + +uint32_t InstrumentPass::GetUintId() { + if (uint_id_ == 0) { + analysis::TypeManager* type_mgr = context()->get_type_mgr(); + analysis::Integer uint_ty(32, false); + analysis::Type* reg_uint_ty = type_mgr->GetRegisteredType(&uint_ty); + uint_id_ = type_mgr->GetTypeInstruction(reg_uint_ty); + } + return uint_id_; +} + +uint32_t InstrumentPass::GetVec4UintId() { + if (v4uint_id_ == 0) { + analysis::TypeManager* type_mgr = context()->get_type_mgr(); + analysis::Integer uint_ty(32, false); + analysis::Type* reg_uint_ty = type_mgr->GetRegisteredType(&uint_ty); + analysis::Vector v4uint_ty(reg_uint_ty, 4); + analysis::Type* reg_v4uint_ty = type_mgr->GetRegisteredType(&v4uint_ty); + v4uint_id_ = type_mgr->GetTypeInstruction(reg_v4uint_ty); + } + return v4uint_id_; +} + +uint32_t InstrumentPass::GetBoolId() { + if (bool_id_ == 0) { + analysis::TypeManager* type_mgr = context()->get_type_mgr(); + analysis::Bool bool_ty; + analysis::Type* reg_bool_ty = type_mgr->GetRegisteredType(&bool_ty); + bool_id_ = type_mgr->GetTypeInstruction(reg_bool_ty); + } + return bool_id_; +} + +uint32_t InstrumentPass::GetVoidId() { + if (void_id_ == 0) { + analysis::TypeManager* type_mgr = context()->get_type_mgr(); + analysis::Void void_ty; + analysis::Type* reg_void_ty = type_mgr->GetRegisteredType(&void_ty); + void_id_ = type_mgr->GetTypeInstruction(reg_void_ty); + } + return void_id_; +} + +uint32_t InstrumentPass::GetStreamWriteFunctionId(uint32_t stage_idx, + uint32_t val_spec_param_cnt) { + // Total param count is common params plus validation-specific + // params + uint32_t param_cnt = kInstCommonParamCnt + val_spec_param_cnt; + if (output_func_id_ == 0) { + // Create function + output_func_id_ = TakeNextId(); + analysis::TypeManager* type_mgr = context()->get_type_mgr(); + std::vector param_types; + for (uint32_t c = 0; c < param_cnt; ++c) + param_types.push_back(type_mgr->GetType(GetUintId())); + analysis::Function func_ty(type_mgr->GetType(GetVoidId()), param_types); + analysis::Type* reg_func_ty = type_mgr->GetRegisteredType(&func_ty); + std::unique_ptr func_inst(new Instruction( + get_module()->context(), SpvOpFunction, GetVoidId(), output_func_id_, + {{spv_operand_type_t::SPV_OPERAND_TYPE_LITERAL_INTEGER, + {SpvFunctionControlMaskNone}}, + {spv_operand_type_t::SPV_OPERAND_TYPE_ID, + {type_mgr->GetTypeInstruction(reg_func_ty)}}})); + get_def_use_mgr()->AnalyzeInstDefUse(&*func_inst); + std::unique_ptr output_func = + MakeUnique(std::move(func_inst)); + // Add parameters + std::vector param_vec; + for (uint32_t c = 0; c < param_cnt; ++c) { + uint32_t pid = TakeNextId(); + param_vec.push_back(pid); + std::unique_ptr param_inst( + new Instruction(get_module()->context(), SpvOpFunctionParameter, + GetUintId(), pid, {})); + get_def_use_mgr()->AnalyzeInstDefUse(&*param_inst); + output_func->AddParameter(std::move(param_inst)); + } + // Create first block + uint32_t test_blk_id = TakeNextId(); + std::unique_ptr test_label(NewLabel(test_blk_id)); + std::unique_ptr new_blk_ptr = + MakeUnique(std::move(test_label)); + InstructionBuilder builder( + context(), &*new_blk_ptr, + IRContext::kAnalysisDefUse | IRContext::kAnalysisInstrToBlockMapping); + // Gen test if debug output buffer size will not be exceeded. + uint32_t obuf_record_sz = kInstStageOutCnt + val_spec_param_cnt; + uint32_t buf_id = GetOutputBufferId(); + uint32_t buf_uint_ptr_id = GetOutputBufferUintPtrId(); + Instruction* obuf_curr_sz_ac_inst = + builder.AddBinaryOp(buf_uint_ptr_id, SpvOpAccessChain, buf_id, + builder.GetUintConstantId(kDebugOutputSizeOffset)); + // Fetch the current debug buffer written size atomically, adding the + // size of the record to be written. + uint32_t obuf_record_sz_id = builder.GetUintConstantId(obuf_record_sz); + uint32_t mask_none_id = builder.GetUintConstantId(SpvMemoryAccessMaskNone); + uint32_t scope_invok_id = builder.GetUintConstantId(SpvScopeInvocation); + Instruction* obuf_curr_sz_inst = builder.AddQuadOp( + GetUintId(), SpvOpAtomicIAdd, obuf_curr_sz_ac_inst->result_id(), + scope_invok_id, mask_none_id, obuf_record_sz_id); + uint32_t obuf_curr_sz_id = obuf_curr_sz_inst->result_id(); + // Compute new written size + Instruction* obuf_new_sz_inst = + builder.AddBinaryOp(GetUintId(), SpvOpIAdd, obuf_curr_sz_id, + builder.GetUintConstantId(obuf_record_sz)); + // Fetch the data bound + Instruction* obuf_bnd_inst = + builder.AddIdLiteralOp(GetUintId(), SpvOpArrayLength, + GetOutputBufferId(), kDebugOutputDataOffset); + // Test that new written size is less than or equal to debug output + // data bound + Instruction* obuf_safe_inst = builder.AddBinaryOp( + GetBoolId(), SpvOpULessThanEqual, obuf_new_sz_inst->result_id(), + obuf_bnd_inst->result_id()); + uint32_t merge_blk_id = TakeNextId(); + uint32_t write_blk_id = TakeNextId(); + std::unique_ptr merge_label(NewLabel(merge_blk_id)); + std::unique_ptr write_label(NewLabel(write_blk_id)); + (void)builder.AddConditionalBranch(obuf_safe_inst->result_id(), + write_blk_id, merge_blk_id, merge_blk_id, + SpvSelectionControlMaskNone); + // Close safety test block and gen write block + new_blk_ptr->SetParent(&*output_func); + output_func->AddBasicBlock(std::move(new_blk_ptr)); + new_blk_ptr = MakeUnique(std::move(write_label)); + builder.SetInsertPoint(&*new_blk_ptr); + // Generate common and stage-specific debug record members + GenCommonStreamWriteCode(obuf_record_sz, param_vec[kInstCommonParamInstIdx], + stage_idx, obuf_curr_sz_id, &builder); + GenStageStreamWriteCode(stage_idx, obuf_curr_sz_id, &builder); + // Gen writes of validation specific data + for (uint32_t i = 0; i < val_spec_param_cnt; ++i) { + GenDebugOutputFieldCode(obuf_curr_sz_id, kInstStageOutCnt + i, + param_vec[kInstCommonParamCnt + i], &builder); + } + // Close write block and gen merge block + (void)builder.AddBranch(merge_blk_id); + new_blk_ptr->SetParent(&*output_func); + output_func->AddBasicBlock(std::move(new_blk_ptr)); + new_blk_ptr = MakeUnique(std::move(merge_label)); + builder.SetInsertPoint(&*new_blk_ptr); + // Close merge block and function and add function to module + (void)builder.AddNullaryOp(0, SpvOpReturn); + new_blk_ptr->SetParent(&*output_func); + output_func->AddBasicBlock(std::move(new_blk_ptr)); + std::unique_ptr func_end_inst( + new Instruction(get_module()->context(), SpvOpFunctionEnd, 0, 0, {})); + get_def_use_mgr()->AnalyzeInstDefUse(&*func_end_inst); + output_func->SetFunctionEnd(std::move(func_end_inst)); + context()->AddFunction(std::move(output_func)); + output_func_param_cnt_ = param_cnt; + } + assert(param_cnt == output_func_param_cnt_ && "bad arg count"); + return output_func_id_; +} + +bool InstrumentPass::InstrumentFunction(Function* func, uint32_t stage_idx, + InstProcessFunction& pfn) { + bool modified = false; + // Compute function index + uint32_t function_idx = 0; + for (auto fii = get_module()->begin(); fii != get_module()->end(); ++fii) { + if (&*fii == func) break; + ++function_idx; + } + std::vector> new_blks; + // Start count after function instruction + uint32_t instruction_idx = funcIdx2offset_[function_idx] + 1; + // Using block iterators here because of block erasures and insertions. + for (auto bi = func->begin(); bi != func->end(); ++bi) { + // Count block's label + ++instruction_idx; + for (auto ii = bi->begin(); ii != bi->end(); ++instruction_idx) { + // Bump instruction count if debug instructions + instruction_idx += static_cast(ii->dbg_line_insts().size()); + // Generate instrumentation if warranted + pfn(ii, bi, instruction_idx, stage_idx, &new_blks); + if (new_blks.size() == 0) { + ++ii; + continue; + } + // If there are new blocks we know there will always be two or + // more, so update succeeding phis with label of new last block. + size_t newBlocksSize = new_blks.size(); + assert(newBlocksSize > 1); + UpdateSucceedingPhis(new_blks); + // Replace original block with new block(s) + bi = bi.Erase(); + for (auto& bb : new_blks) { + bb->SetParent(func); + } + bi = bi.InsertBefore(&new_blks); + // Reset block iterator to last new block + for (size_t i = 0; i < newBlocksSize - 1; i++) ++bi; + modified = true; + // Restart instrumenting at beginning of last new block, + // but skip over any new phi or copy instruction. + ii = bi->begin(); + if (ii->opcode() == SpvOpPhi || ii->opcode() == SpvOpCopyObject) ++ii; + new_blks.clear(); + } + } + return modified; +} + +bool InstrumentPass::InstProcessCallTreeFromRoots(InstProcessFunction& pfn, + std::queue* roots, + uint32_t stage_idx) { + bool modified = false; + std::unordered_set done; + // Process all functions from roots + while (!roots->empty()) { + const uint32_t fi = roots->front(); + roots->pop(); + if (done.insert(fi).second) { + Function* fn = id2function_.at(fi); + // Add calls first so we don't add new output function + context()->AddCalls(fn, roots); + modified = InstrumentFunction(fn, stage_idx, pfn) || modified; + } + } + return modified; +} + +bool InstrumentPass::InstProcessEntryPointCallTree(InstProcessFunction& pfn) { + // Make sure all entry points have the same execution model. Do not + // instrument if they do not. + // TODO(greg-lunarg): Handle mixed stages. Technically, a shader module + // can contain entry points with different execution models, although + // such modules will likely be rare as GLSL and HLSL are geared toward + // one model per module. In such cases we will need + // to clone any functions which are in the call trees of entrypoints + // with differing execution models. + uint32_t ecnt = 0; + uint32_t stage = SpvExecutionModelMax; + for (auto& e : get_module()->entry_points()) { + if (ecnt == 0) + stage = e.GetSingleWordInOperand(kEntryPointExecutionModelInIdx); + else if (e.GetSingleWordInOperand(kEntryPointExecutionModelInIdx) != stage) + return false; + ++ecnt; + } + // Only supporting vertex, fragment and compute shaders at the moment. + // TODO(greg-lunarg): Handle all stages. + if (stage != SpvExecutionModelVertex && stage != SpvExecutionModelFragment && + stage != SpvExecutionModelGeometry && + stage != SpvExecutionModelGLCompute && + stage != SpvExecutionModelTessellationControl && + stage != SpvExecutionModelTessellationEvaluation) + return false; + // Add together the roots of all entry points + std::queue roots; + for (auto& e : get_module()->entry_points()) { + roots.push(e.GetSingleWordInOperand(kEntryPointFunctionIdInIdx)); + } + bool modified = InstProcessCallTreeFromRoots(pfn, &roots, stage); + return modified; +} + +void InstrumentPass::InitializeInstrument() { + output_buffer_id_ = 0; + output_buffer_uint_ptr_id_ = 0; + output_func_id_ = 0; + output_func_param_cnt_ = 0; + v4float_id_ = 0; + uint_id_ = 0; + v4uint_id_ = 0; + bool_id_ = 0; + void_id_ = 0; + + // clear collections + id2function_.clear(); + id2block_.clear(); + + // Initialize function and block maps. + for (auto& fn : *get_module()) { + id2function_[fn.result_id()] = &fn; + for (auto& blk : fn) { + id2block_[blk.id()] = &blk; + } + } + + // Calculate instruction offset of first function + uint32_t pre_func_size = 0; + Module* module = get_module(); + for (auto& i : context()->capabilities()) { + (void)i; + ++pre_func_size; + } + for (auto& i : module->extensions()) { + (void)i; + ++pre_func_size; + } + for (auto& i : module->ext_inst_imports()) { + (void)i; + ++pre_func_size; + } + ++pre_func_size; // memory_model + for (auto& i : module->entry_points()) { + (void)i; + ++pre_func_size; + } + for (auto& i : module->execution_modes()) { + (void)i; + ++pre_func_size; + } + for (auto& i : module->debugs1()) { + (void)i; + ++pre_func_size; + } + for (auto& i : module->debugs2()) { + (void)i; + ++pre_func_size; + } + for (auto& i : module->debugs3()) { + (void)i; + ++pre_func_size; + } + for (auto& i : module->annotations()) { + (void)i; + ++pre_func_size; + } + for (auto& i : module->types_values()) { + pre_func_size += 1; + pre_func_size += static_cast(i.dbg_line_insts().size()); + } + funcIdx2offset_[0] = pre_func_size; + + // Set instruction offsets for all other functions. + uint32_t func_idx = 1; + auto prev_fn = get_module()->begin(); + auto curr_fn = prev_fn; + for (++curr_fn; curr_fn != get_module()->end(); ++curr_fn) { + // Count function and end instructions + uint32_t func_size = 2; + for (auto& blk : *prev_fn) { + // Count label + func_size += 1; + for (auto& inst : blk) { + func_size += 1; + func_size += static_cast(inst.dbg_line_insts().size()); + } + } + funcIdx2offset_[func_idx] = func_size; + ++prev_fn; + ++func_idx; + } +} + +} // namespace opt +} // namespace spvtools diff --git a/3rdparty/spirv-tools/source/opt/instrument_pass.h b/3rdparty/spirv-tools/source/opt/instrument_pass.h new file mode 100644 index 000000000..cfa76b149 --- /dev/null +++ b/3rdparty/spirv-tools/source/opt/instrument_pass.h @@ -0,0 +1,357 @@ +// Copyright (c) 2018 The Khronos Group Inc. +// Copyright (c) 2018 Valve Corporation +// Copyright (c) 2018 LunarG Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef LIBSPIRV_OPT_INSTRUMENT_PASS_H_ +#define LIBSPIRV_OPT_INSTRUMENT_PASS_H_ + +#include +#include +#include + +#include "source/opt/ir_builder.h" +#include "source/opt/pass.h" +#include "spirv-tools/instrument.hpp" + +// This is a base class to assist in the creation of passes which instrument +// shader modules. More specifically, passes which replace instructions with a +// larger and more capable set of instructions. Commonly, these new +// instructions will add testing of operands and execute different +// instructions depending on the outcome, including outputting of debug +// information into a buffer created especially for that purpose. +// +// This class contains helper functions to create an InstProcessFunction, +// which is the heart of any derived class implementing a specific +// instrumentation pass. It takes an instruction as an argument, decides +// if it should be instrumented, and generates code to replace it. This class +// also supplies function InstProcessEntryPointCallTree which applies the +// InstProcessFunction to every reachable instruction in a module and replaces +// the instruction with new instructions if generated. +// +// Chief among the helper functions are output code generation functions, +// used to generate code in the shader which writes data to output buffers +// associated with that validation. Currently one such function, +// GenDebugStreamWrite, exists. Other such functions may be added in the +// future. Each is accompanied by documentation describing the format of +// its output buffer. +// +// A validation pass may read or write multiple buffers. All such buffers +// are located in a single debug descriptor set whose index is passed at the +// creation of the instrumentation pass. The bindings of the buffers used by +// a validation pass are permanantly assigned and fixed and documented by +// the kDebugOutput* static consts. + +namespace spvtools { +namespace opt { + +// Validation Ids +// These are used to identify the general validation being done and map to +// its output buffers. +static const uint32_t kInstValidationIdBindless = 0; + +class InstrumentPass : public Pass { + using cbb_ptr = const BasicBlock*; + + public: + using InstProcessFunction = std::function, uint32_t, uint32_t, + std::vector>*)>; + + ~InstrumentPass() override = default; + + IRContext::Analysis GetPreservedAnalyses() override { + return IRContext::kAnalysisDefUse | + IRContext::kAnalysisInstrToBlockMapping | + IRContext::kAnalysisDecorations | IRContext::kAnalysisCombinators | + IRContext::kAnalysisNameMap | IRContext::kAnalysisBuiltinVarId | + IRContext::kAnalysisConstants | IRContext::kAnalysisTypes; + } + + protected: + // Create instrumentation pass which utilizes descriptor set |desc_set| + // for debug input and output buffers and writes |shader_id| into debug + // output records. + InstrumentPass(uint32_t desc_set, uint32_t shader_id, uint32_t validation_id) + : Pass(), + desc_set_(desc_set), + shader_id_(shader_id), + validation_id_(validation_id) {} + + // Initialize state for instrumentation of module by |validation_id|. + void InitializeInstrument(); + + // Call |pfn| on all instructions in all functions in the call tree of the + // entry points in |module|. If code is generated for an instruction, replace + // the instruction's block with the new blocks that are generated. Continue + // processing at the top of the last new block. + bool InstProcessEntryPointCallTree(InstProcessFunction& pfn); + + // Move all code in |ref_block_itr| preceding the instruction |ref_inst_itr| + // to be instrumented into block |new_blk_ptr|. + void MovePreludeCode(BasicBlock::iterator ref_inst_itr, + UptrVectorIterator ref_block_itr, + std::unique_ptr* new_blk_ptr); + + // Move all code in |ref_block_itr| succeeding the instruction |ref_inst_itr| + // to be instrumented into block |new_blk_ptr|. + void MovePostludeCode(UptrVectorIterator ref_block_itr, + std::unique_ptr* new_blk_ptr); + + // Generate instructions in |builder| which will atomically fetch and + // increment the size of the debug output buffer stream of the current + // validation and write a record to the end of the stream, if enough space + // in the buffer remains. The record will contain the index of the function + // and instruction within that function |func_idx, instruction_idx| which + // generated the record. It will also contain additional information to + // identify the instance of the shader, depending on the stage |stage_idx| + // of the shader. Finally, the record will contain validation-specific + // data contained in |validation_ids| which will identify the validation + // error as well as the values involved in the error. + // + // The output buffer binding written to by the code generated by the function + // is determined by the validation id specified when each specific + // instrumentation pass is created. + // + // The output buffer is a sequence of 32-bit values with the following + // format (where all elements are unsigned 32-bit unless otherwise noted): + // + // Size + // Record0 + // Record1 + // Record2 + // ... + // + // Size is the number of 32-bit values that have been written or + // attempted to be written to the output buffer, excluding the Size. It is + // initialized to 0. If the size of attempts to write the buffer exceeds + // the actual size of the buffer, it is possible that this field can exceed + // the actual size of the buffer. + // + // Each Record* is a variable-length sequence of 32-bit values with the + // following format defined using static const offsets in the .cpp file: + // + // Record Size + // Shader ID + // Instruction Index + // Stage + // Stage-specific Word 0 + // Stage-specific Word 1 + // Validation Error Code + // Validation-specific Word 0 + // Validation-specific Word 1 + // Validation-specific Word 2 + // ... + // + // Each record consists of three subsections: members common across all + // validation, members specific to the stage, and members specific to a + // validation. + // + // The Record Size is the number of 32-bit words in the record, including + // the Record Size word. + // + // Shader ID is a value that identifies which shader has generated the + // validation error. It is passed when the instrumentation pass is created. + // + // The Instruction Index is the position of the instruction within the + // SPIR-V file which is in error. + // + // The Stage is the pipeline stage which has generated the error as defined + // by the SpvExecutionModel_ enumeration. This is used to interpret the + // following Stage-specific words. + // + // The Stage-specific Words identify which invocation of the shader generated + // the error. Every stage will write two words, although in some cases the + // second word is unused and so zero is written. Vertex shaders will write + // the Vertex and Instance ID. Fragment shaders will write FragCoord.xy. + // Compute shaders will write the Global Invocation ID and zero (unused). + // Both tesselation shaders will write the Invocation Id and zero (unused). + // The geometry shader will write the Primitive ID and Invocation ID. + // + // The Validation Error Code specifies the exact error which has occurred. + // These are enumerated with the kInstError* static consts. This allows + // multiple validation layers to use the same, single output buffer. + // + // The Validation-specific Words are a validation-specific number of 32-bit + // words which give further information on the validation error that + // occurred. These are documented further in each file containing the + // validation-specific class which derives from this base class. + // + // Because the code that is generated checks against the size of the buffer + // before writing, the size of the debug out buffer can be used by the + // validation layer to control the number of error records that are written. + void GenDebugStreamWrite(uint32_t instruction_idx, uint32_t stage_idx, + const std::vector& validation_ids, + InstructionBuilder* builder); + + // Generate code to cast |value_id| to unsigned, if needed. Return + // an id to the unsigned equivalent. + uint32_t GenUintCastCode(uint32_t value_id, InstructionBuilder* builder); + + // Return new label. + std::unique_ptr NewLabel(uint32_t label_id); + + // Return id for 32-bit unsigned type + uint32_t GetUintId(); + + // Return id for 32-bit unsigned type + uint32_t GetBoolId(); + + // Return id for void type + uint32_t GetVoidId(); + + // Return id for output buffer uint type + uint32_t GetOutputBufferUintPtrId(); + + // Return binding for output buffer for current validation. + uint32_t GetOutputBufferBinding(); + + // Return id for debug output buffer + uint32_t GetOutputBufferId(); + + // Return id for v4float type + uint32_t GetVec4FloatId(); + + // Return id for v4uint type + uint32_t GetVec4UintId(); + + // Return id for output function. Define if it doesn't exist with + // |val_spec_arg_cnt| validation-specific uint32 arguments. + uint32_t GetStreamWriteFunctionId(uint32_t stage_idx, + uint32_t val_spec_param_cnt); + + // Apply instrumentation function |pfn| to every instruction in |func|. + // If code is generated for an instruction, replace the instruction's + // block with the new blocks that are generated. Continue processing at the + // top of the last new block. + bool InstrumentFunction(Function* func, uint32_t stage_idx, + InstProcessFunction& pfn); + + // Call |pfn| on all functions in the call tree of the function + // ids in |roots|. + bool InstProcessCallTreeFromRoots(InstProcessFunction& pfn, + std::queue* roots, + uint32_t stage_idx); + + // Gen code into |builder| to write |field_value_id| into debug output + // buffer at |base_offset_id| + |field_offset|. + void GenDebugOutputFieldCode(uint32_t base_offset_id, uint32_t field_offset, + uint32_t field_value_id, + InstructionBuilder* builder); + + // Generate instructions into |builder| which will write the members + // of the debug output record common for all stages and validations at + // |base_off|. + void GenCommonStreamWriteCode(uint32_t record_sz, uint32_t instruction_idx, + uint32_t stage_idx, uint32_t base_off, + InstructionBuilder* builder); + + // Generate instructions into |builder| which will write + // |uint_frag_coord_id| at |component| of the record at |base_offset_id| of + // the debug output buffer . + void GenFragCoordEltDebugOutputCode(uint32_t base_offset_id, + uint32_t uint_frag_coord_id, + uint32_t component, + InstructionBuilder* builder); + + // Generate instructions into |builder| which will load the uint |builtin_id| + // and write it into the debug output buffer at |base_off| + |builtin_off|. + void GenBuiltinOutputCode(uint32_t builtin_id, uint32_t builtin_off, + uint32_t base_off, InstructionBuilder* builder); + + // Generate instructions into |builder| which will write a uint null into + // the debug output buffer at |base_off| + |builtin_off|. + void GenUintNullOutputCode(uint32_t field_off, uint32_t base_off, + InstructionBuilder* builder); + + // Generate instructions into |builder| which will write the |stage_idx|- + // specific members of the debug output stream at |base_off|. + void GenStageStreamWriteCode(uint32_t stage_idx, uint32_t base_off, + InstructionBuilder* builder); + + // Return true if instruction must be in the same block that its result + // is used. + bool IsSameBlockOp(const Instruction* inst) const; + + // Clone operands which must be in same block as consumer instructions. + // Look in same_blk_pre for instructions that need cloning. Look in + // same_blk_post for instructions already cloned. Add cloned instruction + // to same_blk_post. + void CloneSameBlockOps( + std::unique_ptr* inst, + std::unordered_map* same_blk_post, + std::unordered_map* same_blk_pre, + std::unique_ptr* block_ptr); + + // Update phis in succeeding blocks to point to new last block + void UpdateSucceedingPhis( + std::vector>& new_blocks); + + // Debug descriptor set index + uint32_t desc_set_; + + // Shader module ID written into output record + uint32_t shader_id_; + + // Map from function id to function pointer. + std::unordered_map id2function_; + + // Map from block's label id to block. TODO(dnovillo): This is superfluous wrt + // CFG. It has functionality not present in CFG. Consolidate. + std::unordered_map id2block_; + + // Map from function's position index to the offset of its first instruction + std::unordered_map funcIdx2offset_; + + // result id for OpConstantFalse + uint32_t validation_id_; + + // id for output buffer variable + uint32_t output_buffer_id_; + + // type id for output buffer element + uint32_t output_buffer_uint_ptr_id_; + + // id for debug output function + uint32_t output_func_id_; + + // param count for output function + uint32_t output_func_param_cnt_; + + // id for v4float type + uint32_t v4float_id_; + + // id for v4float type + uint32_t v4uint_id_; + + // id for 32-bit unsigned type + uint32_t uint_id_; + + // id for bool type + uint32_t bool_id_; + + // id for void type + uint32_t void_id_; + + // Pre-instrumentation same-block insts + std::unordered_map same_block_pre_; + + // Post-instrumentation same-block op ids + std::unordered_map same_block_post_; +}; + +} // namespace opt +} // namespace spvtools + +#endif // LIBSPIRV_OPT_INSTRUMENT_PASS_H_ diff --git a/3rdparty/spirv-tools/source/opt/ir_builder.h b/3rdparty/spirv-tools/source/opt/ir_builder.h index 2dab76e52..2f741d88e 100644 --- a/3rdparty/spirv-tools/source/opt/ir_builder.h +++ b/3rdparty/spirv-tools/source/opt/ir_builder.h @@ -58,6 +58,85 @@ class InstructionBuilder { : InstructionBuilder(context, parent_block, parent_block->end(), preserved_analyses) {} + Instruction* AddNullaryOp(uint32_t type_id, SpvOp opcode) { + // TODO(1841): Handle id overflow. + std::unique_ptr newUnOp(new Instruction( + GetContext(), opcode, type_id, + opcode == SpvOpReturn ? 0 : GetContext()->TakeNextId(), {})); + return AddInstruction(std::move(newUnOp)); + } + + Instruction* AddUnaryOp(uint32_t type_id, SpvOp opcode, uint32_t operand1) { + // TODO(1841): Handle id overflow. + std::unique_ptr newUnOp(new Instruction( + GetContext(), opcode, type_id, GetContext()->TakeNextId(), + {{spv_operand_type_t::SPV_OPERAND_TYPE_ID, {operand1}}})); + return AddInstruction(std::move(newUnOp)); + } + + Instruction* AddBinaryOp(uint32_t type_id, SpvOp opcode, uint32_t operand1, + uint32_t operand2) { + // TODO(1841): Handle id overflow. + std::unique_ptr newBinOp(new Instruction( + GetContext(), opcode, type_id, + opcode == SpvOpStore ? 0 : GetContext()->TakeNextId(), + {{spv_operand_type_t::SPV_OPERAND_TYPE_ID, {operand1}}, + {spv_operand_type_t::SPV_OPERAND_TYPE_ID, {operand2}}})); + return AddInstruction(std::move(newBinOp)); + } + + Instruction* AddTernaryOp(uint32_t type_id, SpvOp opcode, uint32_t operand1, + uint32_t operand2, uint32_t operand3) { + // TODO(1841): Handle id overflow. + std::unique_ptr newTernOp(new Instruction( + GetContext(), opcode, type_id, GetContext()->TakeNextId(), + {{spv_operand_type_t::SPV_OPERAND_TYPE_ID, {operand1}}, + {spv_operand_type_t::SPV_OPERAND_TYPE_ID, {operand2}}, + {spv_operand_type_t::SPV_OPERAND_TYPE_ID, {operand3}}})); + return AddInstruction(std::move(newTernOp)); + } + + Instruction* AddQuadOp(uint32_t type_id, SpvOp opcode, uint32_t operand1, + uint32_t operand2, uint32_t operand3, + uint32_t operand4) { + // TODO(1841): Handle id overflow. + std::unique_ptr newQuadOp(new Instruction( + GetContext(), opcode, type_id, GetContext()->TakeNextId(), + {{spv_operand_type_t::SPV_OPERAND_TYPE_ID, {operand1}}, + {spv_operand_type_t::SPV_OPERAND_TYPE_ID, {operand2}}, + {spv_operand_type_t::SPV_OPERAND_TYPE_ID, {operand3}}, + {spv_operand_type_t::SPV_OPERAND_TYPE_ID, {operand4}}})); + return AddInstruction(std::move(newQuadOp)); + } + + Instruction* AddIdLiteralOp(uint32_t type_id, SpvOp opcode, uint32_t operand1, + uint32_t operand2) { + // TODO(1841): Handle id overflow. + std::unique_ptr newBinOp(new Instruction( + GetContext(), opcode, type_id, GetContext()->TakeNextId(), + {{spv_operand_type_t::SPV_OPERAND_TYPE_ID, {operand1}}, + {spv_operand_type_t::SPV_OPERAND_TYPE_LITERAL_INTEGER, {operand2}}})); + return AddInstruction(std::move(newBinOp)); + } + + // Creates an N-ary instruction of |opcode|. + // |typid| must be the id of the instruction's type. + // |operands| must be a sequence of operand ids. + // Use |result| for the result id if non-zero. + Instruction* AddNaryOp(uint32_t type_id, SpvOp opcode, + const std::vector& operands, + uint32_t result = 0) { + std::vector ops; + for (size_t i = 0; i < operands.size(); i++) { + ops.push_back({SPV_OPERAND_TYPE_ID, {operands[i]}}); + } + // TODO(1841): Handle id overflow. + std::unique_ptr new_inst(new Instruction( + GetContext(), opcode, type_id, + result != 0 ? result : GetContext()->TakeNextId(), ops)); + return AddInstruction(std::move(new_inst)); + } + // Creates a new selection merge instruction. // The id |merge_id| is the merge basic block id. Instruction* AddSelectionMerge( @@ -71,6 +150,20 @@ class InstructionBuilder { return AddInstruction(std::move(new_branch_merge)); } + // Creates a new loop merge instruction. + // The id |merge_id| is the basic block id of the merge block. + // |continue_id| is the id of the continue block. + // |loop_control| are the loop control flags to be added to the instruction. + Instruction* AddLoopMerge(uint32_t merge_id, uint32_t continue_id, + uint32_t loop_control = SpvLoopControlMaskNone) { + std::unique_ptr new_branch_merge(new Instruction( + GetContext(), SpvOpLoopMerge, 0, 0, + {{spv_operand_type_t::SPV_OPERAND_TYPE_ID, {merge_id}}, + {spv_operand_type_t::SPV_OPERAND_TYPE_ID, {continue_id}}, + {spv_operand_type_t::SPV_OPERAND_TYPE_LOOP_CONTROL, {loop_control}}})); + return AddInstruction(std::move(new_branch_merge)); + } + // Creates a new branch instruction to |label_id|. // Note that the user must make sure the final basic block is // well formed. @@ -153,15 +246,10 @@ class InstructionBuilder { // The id |type| must be the id of the phi instruction's type. // The vector |incomings| must be a sequence of pairs of . - Instruction* AddPhi(uint32_t type, const std::vector& incomings) { + Instruction* AddPhi(uint32_t type, const std::vector& incomings, + uint32_t result = 0) { assert(incomings.size() % 2 == 0 && "A sequence of pairs is expected"); - std::vector phi_ops; - for (size_t i = 0; i < incomings.size(); i++) { - phi_ops.push_back({SPV_OPERAND_TYPE_ID, {incomings[i]}}); - } - std::unique_ptr phi_inst(new Instruction( - GetContext(), SpvOpPhi, type, GetContext()->TakeNextId(), phi_ops)); - return AddInstruction(std::move(phi_inst)); + return AddNaryOp(type, SpvOpPhi, incomings, result); } // Creates an addition instruction. @@ -170,6 +258,7 @@ class InstructionBuilder { // The id |op1| is the left hand side of the operation. // The id |op2| is the right hand side of the operation. Instruction* AddIAdd(uint32_t type, uint32_t op1, uint32_t op2) { + // TODO(1841): Handle id overflow. std::unique_ptr inst(new Instruction( GetContext(), SpvOpIAdd, type, GetContext()->TakeNextId(), {{SPV_OPERAND_TYPE_ID, {op1}}, {SPV_OPERAND_TYPE_ID, {op2}}})); @@ -183,6 +272,7 @@ class InstructionBuilder { Instruction* AddULessThan(uint32_t op1, uint32_t op2) { analysis::Bool bool_type; uint32_t type = GetContext()->get_type_mgr()->GetId(&bool_type); + // TODO(1841): Handle id overflow. std::unique_ptr inst(new Instruction( GetContext(), SpvOpULessThan, type, GetContext()->TakeNextId(), {{SPV_OPERAND_TYPE_ID, {op1}}, {SPV_OPERAND_TYPE_ID, {op2}}})); @@ -196,6 +286,7 @@ class InstructionBuilder { Instruction* AddSLessThan(uint32_t op1, uint32_t op2) { analysis::Bool bool_type; uint32_t type = GetContext()->get_type_mgr()->GetId(&bool_type); + // TODO(1841): Handle id overflow. std::unique_ptr inst(new Instruction( GetContext(), SpvOpSLessThan, type, GetContext()->TakeNextId(), {{SPV_OPERAND_TYPE_ID, {op1}}, {SPV_OPERAND_TYPE_ID, {op2}}})); @@ -225,6 +316,7 @@ class InstructionBuilder { // bool) for |type|. Instruction* AddSelect(uint32_t type, uint32_t cond, uint32_t true_value, uint32_t false_value) { + // TODO(1841): Handle id overflow. std::unique_ptr select(new Instruction( GetContext(), SpvOpSelect, type, GetContext()->TakeNextId(), std::initializer_list{{SPV_OPERAND_TYPE_ID, {cond}}, @@ -235,8 +327,8 @@ class InstructionBuilder { // Adds a signed int32 constant to the binary. // The |value| parameter is the constant value to be added. - Instruction* Add32BitSignedIntegerConstant(int32_t value) { - return Add32BitConstantInteger(value, true); + Instruction* GetSintConstant(int32_t value) { + return GetIntConstant(value, true); } // Create a composite construct. @@ -249,6 +341,7 @@ class InstructionBuilder { ops.emplace_back(SPV_OPERAND_TYPE_ID, std::initializer_list{id}); } + // TODO(1841): Handle id overflow. std::unique_ptr construct( new Instruction(GetContext(), SpvOpCompositeConstruct, type, GetContext()->TakeNextId(), ops)); @@ -256,8 +349,23 @@ class InstructionBuilder { } // Adds an unsigned int32 constant to the binary. // The |value| parameter is the constant value to be added. - Instruction* Add32BitUnsignedIntegerConstant(uint32_t value) { - return Add32BitConstantInteger(value, false); + Instruction* GetUintConstant(uint32_t value) { + return GetIntConstant(value, false); + } + + uint32_t GetUintConstantId(uint32_t value) { + Instruction* uint_inst = GetUintConstant(value); + return uint_inst->result_id(); + } + + uint32_t GetNullId(uint32_t type_id) { + analysis::TypeManager* type_mgr = GetContext()->get_type_mgr(); + analysis::ConstantManager* const_mgr = GetContext()->get_constant_mgr(); + const analysis::Type* type = type_mgr->GetType(type_id); + const analysis::Constant* null_const = const_mgr->GetConstant(type, {}); + Instruction* null_inst = + const_mgr->GetDefiningInstruction(null_const, type_id); + return null_inst->result_id(); } // Adds either a signed or unsigned 32 bit integer constant to the binary @@ -265,7 +373,7 @@ class InstructionBuilder { // signed constant otherwise as an unsigned constant. If |sign| is false the // value must not be a negative number. template - Instruction* Add32BitConstantInteger(T value, bool sign) { + Instruction* GetIntConstant(T value, bool sign) { // Assert that we are not trying to store a negative number in an unsigned // type. if (!sign) @@ -305,6 +413,7 @@ class InstructionBuilder { operands.push_back({SPV_OPERAND_TYPE_LITERAL_INTEGER, {index}}); } + // TODO(1841): Handle id overflow. std::unique_ptr new_inst( new Instruction(GetContext(), SpvOpCompositeExtract, type, GetContext()->TakeNextId(), operands)); @@ -328,6 +437,7 @@ class InstructionBuilder { operands.push_back({SPV_OPERAND_TYPE_ID, {index_id}}); } + // TODO(1841): Handle id overflow. std::unique_ptr new_inst( new Instruction(GetContext(), SpvOpAccessChain, type_id, GetContext()->TakeNextId(), operands)); @@ -338,6 +448,7 @@ class InstructionBuilder { std::vector operands; operands.push_back({SPV_OPERAND_TYPE_ID, {base_ptr_id}}); + // TODO(1841): Handle id overflow. std::unique_ptr new_inst( new Instruction(GetContext(), SpvOpLoad, type_id, GetContext()->TakeNextId(), operands)); diff --git a/3rdparty/spirv-tools/source/opt/ir_context.cpp b/3rdparty/spirv-tools/source/opt/ir_context.cpp index 742ac1f62..a2f207c0c 100644 --- a/3rdparty/spirv-tools/source/opt/ir_context.cpp +++ b/3rdparty/spirv-tools/source/opt/ir_context.cpp @@ -21,6 +21,16 @@ #include "source/opt/mem_pass.h" #include "source/opt/reflect.h" +namespace { + +static const int kSpvDecorateTargetIdInIdx = 0; +static const int kSpvDecorateDecorationInIdx = 1; +static const int kSpvDecorateBuiltinInIdx = 2; +static const int kEntryPointInterfaceInIdx = 3; +static const int kEntryPointFunctionIdInIdx = 1; + +} // anonymous namespace + namespace spvtools { namespace opt { @@ -43,6 +53,9 @@ void IRContext::BuildInvalidAnalyses(IRContext::Analysis set) { if (set & kAnalysisLoopAnalysis) { ResetLoopAnalysis(); } + if (set & kAnalysisBuiltinVarId) { + ResetBuiltinAnalysis(); + } if (set & kAnalysisNameMap) { BuildIdToNameMap(); } @@ -55,6 +68,18 @@ void IRContext::BuildInvalidAnalyses(IRContext::Analysis set) { if (set & kAnalysisValueNumberTable) { BuildValueNumberTable(); } + if (set & kAnalysisStructuredCFG) { + BuildStructuredCFGAnalysis(); + } + if (set & kAnalysisIdToFuncMapping) { + BuildIdToFuncMapping(); + } + if (set & kAnalysisConstants) { + BuildConstantManager(); + } + if (set & kAnalysisTypes) { + BuildTypeManager(); + } } void IRContext::InvalidateAnalysesExceptFor( @@ -76,6 +101,9 @@ void IRContext::InvalidateAnalyses(IRContext::Analysis analyses_to_invalidate) { if (analyses_to_invalidate & kAnalysisCombinators) { combinator_ops_.clear(); } + if (analyses_to_invalidate & kAnalysisBuiltinVarId) { + builtin_var_id_map_.clear(); + } if (analyses_to_invalidate & kAnalysisCFG) { cfg_.reset(nullptr); } @@ -89,6 +117,18 @@ void IRContext::InvalidateAnalyses(IRContext::Analysis analyses_to_invalidate) { if (analyses_to_invalidate & kAnalysisValueNumberTable) { vn_table_.reset(nullptr); } + if (analyses_to_invalidate & kAnalysisStructuredCFG) { + struct_cfg_analysis_.reset(nullptr); + } + if (analyses_to_invalidate & kAnalysisIdToFuncMapping) { + id_to_func_.clear(); + } + if (analyses_to_invalidate & kAnalysisConstants) { + constant_mgr_.reset(nullptr); + } + if (analyses_to_invalidate & kAnalysisTypes) { + type_mgr_.reset(nullptr); + } valid_analyses_ = Analysis(valid_analyses_ & ~analyses_to_invalidate); } @@ -107,9 +147,6 @@ Instruction* IRContext::KillInst(Instruction* inst) { instr_to_block_.erase(inst); } if (AreAnalysesValid(kAnalysisDecorations)) { - if (inst->result_id() != 0) { - decoration_mgr_->RemoveDecorationsFrom(inst->result_id()); - } if (inst->IsDecoration()) { decoration_mgr_->RemoveDecoration(inst); } @@ -227,6 +264,14 @@ bool IRContext::IsConsistent() { return false; } + if (AreAnalysesValid(kAnalysisDecorations)) { + analysis::DecorationManager* dec_mgr = get_decoration_mgr(); + analysis::DecorationManager current(module()); + + if (*dec_mgr != current) { + return false; + } + } return true; } @@ -258,12 +303,8 @@ void IRContext::AnalyzeUses(Instruction* inst) { } void IRContext::KillNamesAndDecorates(uint32_t id) { - std::vector decorations = - get_decoration_mgr()->GetDecorationsFor(id, true); - - for (Instruction* inst : decorations) { - KillInst(inst); - } + analysis::DecorationManager* dec_mgr = get_decoration_mgr(); + dec_mgr->RemoveDecorationsFrom(id); std::vector name_to_kill; for (auto name : GetNames(id)) { @@ -299,6 +340,7 @@ void IRContext::AddCombinatorsForCapability(uint32_t capability) { SpvOpTypeImage, SpvOpTypeSampler, SpvOpTypeSampledImage, + SpvOpTypeAccelerationStructureNV, SpvOpTypeArray, SpvOpTypeRuntimeArray, SpvOpTypeStruct, @@ -574,6 +616,156 @@ LoopDescriptor* IRContext::GetLoopDescriptor(const Function* f) { return &it->second; } +uint32_t IRContext::FindBuiltinVar(uint32_t builtin) { + for (auto& a : module_->annotations()) { + if (a.opcode() != SpvOpDecorate) continue; + if (a.GetSingleWordInOperand(kSpvDecorateDecorationInIdx) != + SpvDecorationBuiltIn) + continue; + if (a.GetSingleWordInOperand(kSpvDecorateBuiltinInIdx) != builtin) continue; + uint32_t target_id = a.GetSingleWordInOperand(kSpvDecorateTargetIdInIdx); + Instruction* b_var = get_def_use_mgr()->GetDef(target_id); + if (b_var->opcode() != SpvOpVariable) continue; + return target_id; + } + return 0; +} + +void IRContext::AddVarToEntryPoints(uint32_t var_id) { + uint32_t ocnt = 0; + for (auto& e : module()->entry_points()) { + bool found = false; + e.ForEachInOperand([&ocnt, &found, &var_id](const uint32_t* idp) { + if (ocnt >= kEntryPointInterfaceInIdx) { + if (*idp == var_id) found = true; + } + ++ocnt; + }); + if (!found) { + e.AddOperand({SPV_OPERAND_TYPE_ID, {var_id}}); + get_def_use_mgr()->AnalyzeInstDefUse(&e); + } + } +} + +uint32_t IRContext::GetBuiltinVarId(uint32_t builtin) { + if (!AreAnalysesValid(kAnalysisBuiltinVarId)) ResetBuiltinAnalysis(); + // If cached, return it. + std::unordered_map::iterator it = + builtin_var_id_map_.find(builtin); + if (it != builtin_var_id_map_.end()) return it->second; + // Look for one in shader + uint32_t var_id = FindBuiltinVar(builtin); + if (var_id == 0) { + // If not found, create it + // TODO(greg-lunarg): Add support for all builtins + analysis::TypeManager* type_mgr = get_type_mgr(); + analysis::Type* reg_type; + switch (builtin) { + case SpvBuiltInFragCoord: { + analysis::Float float_ty(32); + analysis::Type* reg_float_ty = type_mgr->GetRegisteredType(&float_ty); + analysis::Vector v4float_ty(reg_float_ty, 4); + reg_type = type_mgr->GetRegisteredType(&v4float_ty); + break; + } + case SpvBuiltInVertexId: + case SpvBuiltInInstanceId: + case SpvBuiltInPrimitiveId: + case SpvBuiltInInvocationId: + case SpvBuiltInGlobalInvocationId: { + analysis::Integer uint_ty(32, false); + reg_type = type_mgr->GetRegisteredType(&uint_ty); + break; + } + default: { + assert(false && "unhandled builtin"); + return 0; + } + } + uint32_t type_id = type_mgr->GetTypeInstruction(reg_type); + uint32_t varTyPtrId = + type_mgr->FindPointerToType(type_id, SpvStorageClassInput); + // TODO(1841): Handle id overflow. + var_id = TakeNextId(); + std::unique_ptr newVarOp( + new Instruction(this, SpvOpVariable, varTyPtrId, var_id, + {{spv_operand_type_t::SPV_OPERAND_TYPE_LITERAL_INTEGER, + {SpvStorageClassInput}}})); + get_def_use_mgr()->AnalyzeInstDefUse(&*newVarOp); + module()->AddGlobalValue(std::move(newVarOp)); + get_decoration_mgr()->AddDecorationVal(var_id, SpvDecorationBuiltIn, + builtin); + AddVarToEntryPoints(var_id); + } + builtin_var_id_map_[builtin] = var_id; + return var_id; +} + +void IRContext::AddCalls(const Function* func, std::queue* todo) { + for (auto bi = func->begin(); bi != func->end(); ++bi) + for (auto ii = bi->begin(); ii != bi->end(); ++ii) + if (ii->opcode() == SpvOpFunctionCall) + todo->push(ii->GetSingleWordInOperand(0)); +} + +bool IRContext::ProcessEntryPointCallTree(ProcessFunction& pfn) { + // Collect all of the entry points as the roots. + std::queue roots; + for (auto& e : module()->entry_points()) { + roots.push(e.GetSingleWordInOperand(kEntryPointFunctionIdInIdx)); + } + return ProcessCallTreeFromRoots(pfn, &roots); +} + +bool IRContext::ProcessReachableCallTree(ProcessFunction& pfn) { + std::queue roots; + + // Add all entry points since they can be reached from outside the module. + for (auto& e : module()->entry_points()) + roots.push(e.GetSingleWordInOperand(kEntryPointFunctionIdInIdx)); + + // Add all exported functions since they can be reached from outside the + // module. + for (auto& a : annotations()) { + // TODO: Handle group decorations as well. Currently not generate by any + // front-end, but could be coming. + if (a.opcode() == SpvOp::SpvOpDecorate) { + if (a.GetSingleWordOperand(1) == + SpvDecoration::SpvDecorationLinkageAttributes) { + uint32_t lastOperand = a.NumOperands() - 1; + if (a.GetSingleWordOperand(lastOperand) == + SpvLinkageType::SpvLinkageTypeExport) { + uint32_t id = a.GetSingleWordOperand(0); + if (GetFunction(id)) { + roots.push(id); + } + } + } + } + } + + return ProcessCallTreeFromRoots(pfn, &roots); +} + +bool IRContext::ProcessCallTreeFromRoots(ProcessFunction& pfn, + std::queue* roots) { + // Process call tree + bool modified = false; + std::unordered_set done; + + while (!roots->empty()) { + const uint32_t fi = roots->front(); + roots->pop(); + if (done.insert(fi).second) { + Function* fn = GetFunction(fi); + modified = pfn(fn) || modified; + AddCalls(fn, roots); + } + } + return modified; +} + // Gets the dominator analysis for function |f|. DominatorAnalysis* IRContext::GetDominatorAnalysis(const Function* f) { if (!AreAnalysesValid(kAnalysisDominatorAnalysis)) { diff --git a/3rdparty/spirv-tools/source/opt/ir_context.h b/3rdparty/spirv-tools/source/opt/ir_context.h index a9d892fa2..185b4944e 100644 --- a/3rdparty/spirv-tools/source/opt/ir_context.h +++ b/3rdparty/spirv-tools/source/opt/ir_context.h @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -37,6 +38,7 @@ #include "source/opt/module.h" #include "source/opt/register_pressure.h" #include "source/opt/scalar_analysis.h" +#include "source/opt/struct_cfg_analysis.h" #include "source/opt/type_manager.h" #include "source/opt/value_number_table.h" #include "source/util/make_unique.h" @@ -71,9 +73,16 @@ class IRContext { kAnalysisScalarEvolution = 1 << 8, kAnalysisRegisterPressure = 1 << 9, kAnalysisValueNumberTable = 1 << 10, - kAnalysisEnd = 1 << 11 + kAnalysisStructuredCFG = 1 << 11, + kAnalysisBuiltinVarId = 1 << 12, + kAnalysisIdToFuncMapping = 1 << 13, + kAnalysisConstants = 1 << 14, + kAnalysisTypes = 1 << 15, + kAnalysisEnd = 1 << 16 }; + using ProcessFunction = std::function; + friend inline Analysis operator|(Analysis lhs, Analysis rhs); friend inline Analysis& operator|=(Analysis& lhs, Analysis rhs); friend inline Analysis operator<<(Analysis a, int shift); @@ -90,7 +99,8 @@ class IRContext { valid_analyses_(kAnalysisNone), constant_mgr_(nullptr), type_mgr_(nullptr), - id_to_name_(nullptr) { + id_to_name_(nullptr), + max_id_bound_(kDefaultMaxIdBound) { SetContextMessageConsumer(syntax_context_, consumer_); module_->SetContext(this); } @@ -104,7 +114,8 @@ class IRContext { def_use_mgr_(nullptr), valid_analyses_(kAnalysisNone), type_mgr_(nullptr), - id_to_name_(nullptr) { + id_to_name_(nullptr), + max_id_bound_(kDefaultMaxIdBound) { SetContextMessageConsumer(syntax_context_, consumer_); module_->SetContext(this); InitializeCombinators(); @@ -225,6 +236,15 @@ class IRContext { return vn_table_.get(); } + // Returns a pointer to a StructuredCFGAnalysis. If the analysis is invalid, + // it is rebuilt first. + StructuredCFGAnalysis* GetStructuredCFGAnalysis() { + if (!AreAnalysesValid(kAnalysisStructuredCFG)) { + BuildStructuredCFGAnalysis(); + } + return struct_cfg_analysis_.get(); + } + // Returns a pointer to a liveness analysis. If the liveness analysis is // invalid, it is rebuilt first. LivenessAnalysis* GetLivenessAnalysis() { @@ -274,8 +294,9 @@ class IRContext { // created yet, it creates one. NOTE: Once created, the constant manager // remains active and it is never re-built. analysis::ConstantManager* get_constant_mgr() { - if (!constant_mgr_) - constant_mgr_ = MakeUnique(this); + if (!AreAnalysesValid(kAnalysisConstants)) { + BuildConstantManager(); + } return constant_mgr_.get(); } @@ -283,8 +304,9 @@ class IRContext { // yet, it creates one. NOTE: Once created, the type manager remains active it // is never re-built. analysis::TypeManager* get_type_mgr() { - if (!type_mgr_) - type_mgr_ = MakeUnique(consumer(), this); + if (!AreAnalysesValid(kAnalysisTypes)) { + BuildTypeManager(); + } return type_mgr_.get(); } @@ -432,7 +454,8 @@ class IRContext { post_dominator_trees_.erase(f); } - // Return the next available SSA id and increment it. + // Return the next available SSA id and increment it. Returns 0 if the + // maximum SSA id has been reached. inline uint32_t TakeNextId() { return module()->TakeNextIdBound(); } FeatureManager* get_feature_mgr() { @@ -456,6 +479,51 @@ class IRContext { return *inst_folder_; } + uint32_t max_id_bound() const { return max_id_bound_; } + void set_max_id_bound(uint32_t new_bound) { max_id_bound_ = new_bound; } + + // Return id of variable only decorated with |builtin|, if in module. + // Create variable and return its id otherwise. If builtin not currently + // supported, return 0. + uint32_t GetBuiltinVarId(uint32_t builtin); + + // Returns the function whose id is |id|, if one exists. Returns |nullptr| + // otherwise. + Function* GetFunction(uint32_t id) { + if (!AreAnalysesValid(kAnalysisIdToFuncMapping)) { + BuildIdToFuncMapping(); + } + auto entry = id_to_func_.find(id); + return (entry != id_to_func_.end()) ? entry->second : nullptr; + } + + Function* GetFunction(Instruction* inst) { + if (inst->opcode() != SpvOpFunction) { + return nullptr; + } + return GetFunction(inst->result_id()); + } + + // Add to |todo| all ids of functions called in |func|. + void AddCalls(const Function* func, std::queue* todo); + + // Applies |pfn| to every function in the call trees that are rooted at the + // entry points. Returns true if any call |pfn| returns true. By convention + // |pfn| should return true if it modified the module. + bool ProcessEntryPointCallTree(ProcessFunction& pfn); + + // Applies |pfn| to every function in the call trees rooted at the entry + // points and exported functions. Returns true if any call |pfn| returns + // true. By convention |pfn| should return true if it modified the module. + bool ProcessReachableCallTree(ProcessFunction& pfn); + + // Applies |pfn| to every function in the call trees rooted at the elements of + // |roots|. Returns true if any call to |pfn| returns true. By convention + // |pfn| should return true if it modified the module. After returning + // |roots| will be empty. + bool ProcessCallTreeFromRoots(ProcessFunction& pfn, + std::queue* roots); + private: // Builds the def-use manager from scratch, even if it was already valid. void BuildDefUseManager() { @@ -476,6 +544,15 @@ class IRContext { valid_analyses_ = valid_analyses_ | kAnalysisInstrToBlockMapping; } + // Builds the instruction-function map for the whole module. + void BuildIdToFuncMapping() { + id_to_func_.clear(); + for (auto& fn : *module_) { + id_to_func_[fn.result_id()] = &fn; + } + valid_analyses_ = valid_analyses_ | kAnalysisIdToFuncMapping; + } + void BuildDecorationManager() { decoration_mgr_ = MakeUnique(module()); valid_analyses_ = valid_analyses_ | kAnalysisDecorations; @@ -504,6 +581,27 @@ class IRContext { valid_analyses_ = valid_analyses_ | kAnalysisValueNumberTable; } + // Builds the structured CFG analysis from scratch, even if it was already + // valid. + void BuildStructuredCFGAnalysis() { + struct_cfg_analysis_ = MakeUnique(this); + valid_analyses_ = valid_analyses_ | kAnalysisStructuredCFG; + } + + // Builds the constant manager from scratch, even if it was already + // valid. + void BuildConstantManager() { + constant_mgr_ = MakeUnique(this); + valid_analyses_ = valid_analyses_ | kAnalysisConstants; + } + + // Builds the type manager from scratch, even if it was already + // valid. + void BuildTypeManager() { + type_mgr_ = MakeUnique(consumer(), this); + valid_analyses_ = valid_analyses_ | kAnalysisTypes; + } + // Removes all computed dominator and post-dominator trees. This will force // the context to rebuild the trees on demand. void ResetDominatorAnalysis() { @@ -520,6 +618,13 @@ class IRContext { valid_analyses_ = valid_analyses_ | kAnalysisLoopAnalysis; } + // Removes all computed loop descriptors. + void ResetBuiltinAnalysis() { + // Clear the cache. + builtin_var_id_map_.clear(); + valid_analyses_ = valid_analyses_ | kAnalysisBuiltinVarId; + } + // Analyzes the features in the owned module. Builds the manager if required. void AnalyzeFeatures() { feature_mgr_ = MakeUnique(grammar_); @@ -543,6 +648,13 @@ class IRContext { // true if the cfg is invalidated. bool CheckCFG(); + // Return id of variable only decorated with |builtin|, if in module. + // Return 0 otherwise. + uint32_t FindBuiltinVar(uint32_t builtin); + + // Add |var_id| to all entry points in module. + void AddVarToEntryPoints(uint32_t var_id); + // The SPIR-V syntax context containing grammar tables for opcodes and // operands. spv_context syntax_context_; @@ -570,13 +682,20 @@ class IRContext { std::unique_ptr decoration_mgr_; std::unique_ptr feature_mgr_; - // A map from instructions the the basic block they belong to. This mapping is + // A map from instructions to the basic block they belong to. This mapping is // built on-demand when get_instr_block() is called. // // NOTE: Do not traverse this map. Ever. Use the function and basic block // iterators to traverse instructions. std::unordered_map instr_to_block_; + // A map from ids to the function they define. This mapping is + // built on-demand when GetFunction() is called. + // + // NOTE: Do not traverse this map. Ever. Use the function and basic block + // iterators to traverse instructions. + std::unordered_map id_to_func_; + // A bitset indicating which analyes are currently valid. Analysis valid_analyses_; @@ -584,6 +703,10 @@ class IRContext { // without side-effect. std::unordered_map> combinator_ops_; + // Opcodes of shader capability core executable instructions + // without side-effect. + std::unordered_map builtin_var_id_map_; + // The CFG for all the functions in |module_|. std::unique_ptr cfg_; @@ -613,6 +736,11 @@ class IRContext { std::unique_ptr vn_table_; std::unique_ptr inst_folder_; + + std::unique_ptr struct_cfg_analysis_; + + // The maximum legal value for the id bound. + uint32_t max_id_bound_; }; inline IRContext::Analysis operator|(IRContext::Analysis lhs, @@ -758,6 +886,9 @@ void IRContext::AddCapability(std::unique_ptr&& c) { } void IRContext::AddExtension(std::unique_ptr&& e) { + if (AreAnalysesValid(kAnalysisDefUse)) { + get_def_use_mgr()->AnalyzeInstDefUse(e.get()); + } module()->AddExtension(std::move(e)); } @@ -799,6 +930,9 @@ void IRContext::AddAnnotationInst(std::unique_ptr&& a) { if (AreAnalysesValid(kAnalysisDecorations)) { get_decoration_mgr()->AddDecoration(a.get()); } + if (AreAnalysesValid(kAnalysisDefUse)) { + get_def_use_mgr()->AnalyzeInstDefUse(a.get()); + } module()->AddAnnotationInst(std::move(a)); } @@ -810,10 +944,10 @@ void IRContext::AddType(std::unique_ptr&& t) { } void IRContext::AddGlobalValue(std::unique_ptr&& v) { - module()->AddGlobalValue(std::move(v)); if (AreAnalysesValid(kAnalysisDefUse)) { - get_def_use_mgr()->AnalyzeInstDef(&*(--types_values_end())); + get_def_use_mgr()->AnalyzeInstDefUse(&*v); } + module()->AddGlobalValue(std::move(v)); } void IRContext::AddFunction(std::unique_ptr&& f) { diff --git a/3rdparty/spirv-tools/source/opt/licm_pass.cpp b/3rdparty/spirv-tools/source/opt/licm_pass.cpp index d8256679e..82851fd27 100644 --- a/3rdparty/spirv-tools/source/opt/licm_pass.cpp +++ b/3rdparty/spirv-tools/source/opt/licm_pass.cpp @@ -23,70 +23,81 @@ namespace spvtools { namespace opt { -Pass::Status LICMPass::Process() { - return ProcessIRContext() ? Status::SuccessWithChange - : Status::SuccessWithoutChange; -} +Pass::Status LICMPass::Process() { return ProcessIRContext(); } -bool LICMPass::ProcessIRContext() { - bool modified = false; +Pass::Status LICMPass::ProcessIRContext() { + Status status = Status::SuccessWithoutChange; Module* module = get_module(); // Process each function in the module - for (Function& f : *module) { - modified |= ProcessFunction(&f); + for (auto func = module->begin(); + func != module->end() && status != Status::Failure; ++func) { + status = CombineStatus(status, ProcessFunction(&*func)); } - return modified; + return status; } -bool LICMPass::ProcessFunction(Function* f) { - bool modified = false; +Pass::Status LICMPass::ProcessFunction(Function* f) { + Status status = Status::SuccessWithoutChange; LoopDescriptor* loop_descriptor = context()->GetLoopDescriptor(f); // Process each loop in the function - for (Loop& loop : *loop_descriptor) { + for (auto it = loop_descriptor->begin(); + it != loop_descriptor->end() && status != Status::Failure; ++it) { + Loop& loop = *it; // Ignore nested loops, as we will process them in order in ProcessLoop if (loop.IsNested()) { continue; } - modified |= ProcessLoop(&loop, f); + status = CombineStatus(status, ProcessLoop(&loop, f)); } - return modified; + return status; } -bool LICMPass::ProcessLoop(Loop* loop, Function* f) { - bool modified = false; +Pass::Status LICMPass::ProcessLoop(Loop* loop, Function* f) { + Status status = Status::SuccessWithoutChange; // Process all nested loops first - for (Loop* nested_loop : *loop) { - modified |= ProcessLoop(nested_loop, f); + for (auto nl = loop->begin(); nl != loop->end() && status != Status::Failure; + ++nl) { + Loop* nested_loop = *nl; + status = CombineStatus(status, ProcessLoop(nested_loop, f)); } std::vector loop_bbs{}; - modified |= AnalyseAndHoistFromBB(loop, f, loop->GetHeaderBlock(), &loop_bbs); + status = CombineStatus( + status, + AnalyseAndHoistFromBB(loop, f, loop->GetHeaderBlock(), &loop_bbs)); - for (size_t i = 0; i < loop_bbs.size(); ++i) { + for (size_t i = 0; i < loop_bbs.size() && status != Status::Failure; ++i) { BasicBlock* bb = loop_bbs[i]; // do not delete the element - modified |= AnalyseAndHoistFromBB(loop, f, bb, &loop_bbs); + status = + CombineStatus(status, AnalyseAndHoistFromBB(loop, f, bb, &loop_bbs)); } - return modified; + return status; } -bool LICMPass::AnalyseAndHoistFromBB(Loop* loop, Function* f, BasicBlock* bb, - std::vector* loop_bbs) { +Pass::Status LICMPass::AnalyseAndHoistFromBB( + Loop* loop, Function* f, BasicBlock* bb, + std::vector* loop_bbs) { bool modified = false; - std::function hoist_inst = + std::function hoist_inst = [this, &loop, &modified](Instruction* inst) { if (loop->ShouldHoistInstruction(this->context(), inst)) { - HoistInstruction(loop, inst); + if (!HoistInstruction(loop, inst)) { + return false; + } modified = true; } + return true; }; if (IsImmediatelyContainedInLoop(loop, f, bb)) { - bb->ForEachInst(hoist_inst, false); + if (!bb->WhileEachInst(hoist_inst, false)) { + return Status::Failure; + } } DominatorAnalysis* dom_analysis = context()->GetDominatorAnalysis(f); @@ -98,7 +109,7 @@ bool LICMPass::AnalyseAndHoistFromBB(Loop* loop, Function* f, BasicBlock* bb, } } - return modified; + return (modified ? Status::SuccessWithChange : Status::SuccessWithoutChange); } bool LICMPass::IsImmediatelyContainedInLoop(Loop* loop, Function* f, @@ -107,10 +118,22 @@ bool LICMPass::IsImmediatelyContainedInLoop(Loop* loop, Function* f, return loop == (*loop_descriptor)[bb->id()]; } -void LICMPass::HoistInstruction(Loop* loop, Instruction* inst) { +bool LICMPass::HoistInstruction(Loop* loop, Instruction* inst) { + // TODO(1841): Handle failure to create pre-header. BasicBlock* pre_header_bb = loop->GetOrCreatePreHeaderBlock(); - inst->InsertBefore(std::move(&(*pre_header_bb->tail()))); + if (!pre_header_bb) { + return false; + } + Instruction* insertion_point = &*pre_header_bb->tail(); + Instruction* previous_node = insertion_point->PreviousNode(); + if (previous_node && (previous_node->opcode() == SpvOpLoopMerge || + previous_node->opcode() == SpvOpSelectionMerge)) { + insertion_point = previous_node; + } + + inst->InsertBefore(insertion_point); context()->set_instr_block(inst, pre_header_bb); + return true; } } // namespace opt diff --git a/3rdparty/spirv-tools/source/opt/licm_pass.h b/3rdparty/spirv-tools/source/opt/licm_pass.h index a17450043..597fe920a 100644 --- a/3rdparty/spirv-tools/source/opt/licm_pass.h +++ b/3rdparty/spirv-tools/source/opt/licm_pass.h @@ -35,30 +35,35 @@ class LICMPass : public Pass { private: // Searches the IRContext for functions and processes each, moving invariants - // outside loops within the function where possible - // Returns true if a change was made to a function within the IRContext - bool ProcessIRContext(); + // outside loops within the function where possible. + // Returns the status depending on whether or not there was a failure or + // change. + Pass::Status ProcessIRContext(); // Checks the function for loops, calling ProcessLoop on each one found. - // Returns true if a change was made to the function, false otherwise. - bool ProcessFunction(Function* f); + // Returns the status depending on whether or not there was a failure or + // change. + Pass::Status ProcessFunction(Function* f); // Checks for invariants in the loop and attempts to move them to the loops // preheader. Works from inner loop to outer when nested loops are found. - // Returns true if a change was made to the loop, false otherwise. - bool ProcessLoop(Loop* loop, Function* f); + // Returns the status depending on whether or not there was a failure or + // change. + Pass::Status ProcessLoop(Loop* loop, Function* f); // Analyses each instruction in |bb|, hoisting invariants to |pre_header_bb|. // Each child of |bb| wrt to |dom_tree| is pushed to |loop_bbs| - bool AnalyseAndHoistFromBB(Loop* loop, Function* f, BasicBlock* bb, - std::vector* loop_bbs); + // Returns the status depending on whether or not there was a failure or + // change. + Pass::Status AnalyseAndHoistFromBB(Loop* loop, Function* f, BasicBlock* bb, + std::vector* loop_bbs); // Returns true if |bb| is immediately contained in |loop| bool IsImmediatelyContainedInLoop(Loop* loop, Function* f, BasicBlock* bb); - // Move the instruction to the given BasicBlock + // Move the instruction to the preheader of |loop|. // This method will update the instruction to block mapping for the context - void HoistInstruction(Loop* loop, Instruction* inst); + bool HoistInstruction(Loop* loop, Instruction* inst); }; } // namespace opt diff --git a/3rdparty/spirv-tools/source/opt/local_access_chain_convert_pass.cpp b/3rdparty/spirv-tools/source/opt/local_access_chain_convert_pass.cpp index 5d00e98f7..5b976a11e 100644 --- a/3rdparty/spirv-tools/source/opt/local_access_chain_convert_pass.cpp +++ b/3rdparty/spirv-tools/source/opt/local_access_chain_convert_pass.cpp @@ -292,7 +292,7 @@ Pass::Status LocalAccessChainConvertPass::ProcessImpl() { ProcessFunction pfn = [this](Function* fp) { return ConvertLocalAccessChains(fp); }; - bool modified = ProcessEntryPointCallTree(pfn, get_module()); + bool modified = context()->ProcessEntryPointCallTree(pfn); return modified ? Status::SuccessWithChange : Status::SuccessWithoutChange; } @@ -339,6 +339,13 @@ void LocalAccessChainConvertPass::InitExtensions() { "SPV_GOOGLE_hlsl_functionality1", "SPV_NV_shader_subgroup_partitioned", "SPV_EXT_descriptor_indexing", + "SPV_NV_fragment_shader_barycentric", + "SPV_NV_compute_shader_derivatives", + "SPV_NV_shader_image_footprint", + "SPV_NV_shading_rate", + "SPV_NV_mesh_shader", + "SPV_NV_ray_tracing", + "SPV_EXT_fragment_invocation_density", }); } diff --git a/3rdparty/spirv-tools/source/opt/local_access_chain_convert_pass.h b/3rdparty/spirv-tools/source/opt/local_access_chain_convert_pass.h index 9d06890bf..1c7e3d53b 100644 --- a/3rdparty/spirv-tools/source/opt/local_access_chain_convert_pass.h +++ b/3rdparty/spirv-tools/source/opt/local_access_chain_convert_pass.h @@ -44,7 +44,8 @@ class LocalAccessChainConvertPass : public MemPass { Status Process() override; IRContext::Analysis GetPreservedAnalyses() override { - return IRContext::kAnalysisDefUse; + return IRContext::kAnalysisDefUse | IRContext::kAnalysisConstants | + IRContext::kAnalysisTypes; } using ProcessFunction = std::function; diff --git a/3rdparty/spirv-tools/source/opt/local_redundancy_elimination.h b/3rdparty/spirv-tools/source/opt/local_redundancy_elimination.h index 9f55c8bfe..770457a32 100644 --- a/3rdparty/spirv-tools/source/opt/local_redundancy_elimination.h +++ b/3rdparty/spirv-tools/source/opt/local_redundancy_elimination.h @@ -41,7 +41,8 @@ class LocalRedundancyEliminationPass : public Pass { IRContext::kAnalysisInstrToBlockMapping | IRContext::kAnalysisDecorations | IRContext::kAnalysisCombinators | IRContext::kAnalysisCFG | IRContext::kAnalysisDominatorAnalysis | - IRContext::kAnalysisNameMap; + IRContext::kAnalysisNameMap | IRContext::kAnalysisConstants | + IRContext::kAnalysisTypes; } protected: diff --git a/3rdparty/spirv-tools/source/opt/local_single_block_elim_pass.cpp b/3rdparty/spirv-tools/source/opt/local_single_block_elim_pass.cpp index bb909f4aa..9330ab7ac 100644 --- a/3rdparty/spirv-tools/source/opt/local_single_block_elim_pass.cpp +++ b/3rdparty/spirv-tools/source/opt/local_single_block_elim_pass.cpp @@ -200,7 +200,7 @@ Pass::Status LocalSingleBlockLoadStoreElimPass::ProcessImpl() { return LocalSingleBlockLoadStoreElim(fp); }; - bool modified = ProcessEntryPointCallTree(pfn, get_module()); + bool modified = context()->ProcessEntryPointCallTree(pfn); return modified ? Status::SuccessWithChange : Status::SuccessWithoutChange; } @@ -248,6 +248,13 @@ void LocalSingleBlockLoadStoreElimPass::InitExtensions() { "SPV_GOOGLE_hlsl_functionality1", "SPV_NV_shader_subgroup_partitioned", "SPV_EXT_descriptor_indexing", + "SPV_NV_fragment_shader_barycentric", + "SPV_NV_compute_shader_derivatives", + "SPV_NV_shader_image_footprint", + "SPV_NV_shading_rate", + "SPV_NV_mesh_shader", + "SPV_NV_ray_tracing", + "SPV_EXT_fragment_invocation_density", }); } diff --git a/3rdparty/spirv-tools/source/opt/local_single_block_elim_pass.h b/3rdparty/spirv-tools/source/opt/local_single_block_elim_pass.h index 3dead9834..0fe7732a8 100644 --- a/3rdparty/spirv-tools/source/opt/local_single_block_elim_pass.h +++ b/3rdparty/spirv-tools/source/opt/local_single_block_elim_pass.h @@ -42,7 +42,9 @@ class LocalSingleBlockLoadStoreElimPass : public MemPass { Status Process() override; IRContext::Analysis GetPreservedAnalyses() override { - return IRContext::kAnalysisDefUse | IRContext::kAnalysisInstrToBlockMapping; + return IRContext::kAnalysisDefUse | + IRContext::kAnalysisInstrToBlockMapping | + IRContext::kAnalysisConstants | IRContext::kAnalysisTypes; } private: diff --git a/3rdparty/spirv-tools/source/opt/local_single_store_elim_pass.cpp b/3rdparty/spirv-tools/source/opt/local_single_store_elim_pass.cpp index 4c837fc73..6c09deced 100644 --- a/3rdparty/spirv-tools/source/opt/local_single_store_elim_pass.cpp +++ b/3rdparty/spirv-tools/source/opt/local_single_store_elim_pass.cpp @@ -67,7 +67,7 @@ Pass::Status LocalSingleStoreElimPass::ProcessImpl() { ProcessFunction pfn = [this](Function* fp) { return LocalSingleStoreElim(fp); }; - bool modified = ProcessEntryPointCallTree(pfn, get_module()); + bool modified = context()->ProcessEntryPointCallTree(pfn); return modified ? Status::SuccessWithChange : Status::SuccessWithoutChange; } @@ -113,6 +113,13 @@ void LocalSingleStoreElimPass::InitExtensionWhiteList() { "SPV_GOOGLE_hlsl_functionality1", "SPV_NV_shader_subgroup_partitioned", "SPV_EXT_descriptor_indexing", + "SPV_NV_fragment_shader_barycentric", + "SPV_NV_compute_shader_derivatives", + "SPV_NV_shader_image_footprint", + "SPV_NV_shading_rate", + "SPV_NV_mesh_shader", + "SPV_NV_ray_tracing", + "SPV_EXT_fragment_invocation_density", }); } bool LocalSingleStoreElimPass::ProcessVariable(Instruction* var_inst) { diff --git a/3rdparty/spirv-tools/source/opt/local_single_store_elim_pass.h b/3rdparty/spirv-tools/source/opt/local_single_store_elim_pass.h index d3d64b829..4cf8bbb86 100644 --- a/3rdparty/spirv-tools/source/opt/local_single_store_elim_pass.h +++ b/3rdparty/spirv-tools/source/opt/local_single_store_elim_pass.h @@ -45,7 +45,9 @@ class LocalSingleStoreElimPass : public Pass { Status Process() override; IRContext::Analysis GetPreservedAnalyses() override { - return IRContext::kAnalysisDefUse | IRContext::kAnalysisInstrToBlockMapping; + return IRContext::kAnalysisDefUse | + IRContext::kAnalysisInstrToBlockMapping | + IRContext::kAnalysisConstants | IRContext::kAnalysisTypes; } private: diff --git a/3rdparty/spirv-tools/source/opt/local_ssa_elim_pass.cpp b/3rdparty/spirv-tools/source/opt/local_ssa_elim_pass.cpp index ec7326ed0..8209aa405 100644 --- a/3rdparty/spirv-tools/source/opt/local_ssa_elim_pass.cpp +++ b/3rdparty/spirv-tools/source/opt/local_ssa_elim_pass.cpp @@ -50,7 +50,7 @@ Pass::Status LocalMultiStoreElimPass::ProcessImpl() { ProcessFunction pfn = [this](Function* fp) { return SSARewriter(this).RewriteFunctionIntoSSA(fp); }; - bool modified = ProcessEntryPointCallTree(pfn, get_module()); + bool modified = context()->ProcessEntryPointCallTree(pfn); return modified ? Status::SuccessWithChange : Status::SuccessWithoutChange; } @@ -98,6 +98,13 @@ void LocalMultiStoreElimPass::InitExtensions() { "SPV_GOOGLE_hlsl_functionality1", "SPV_NV_shader_subgroup_partitioned", "SPV_EXT_descriptor_indexing", + "SPV_NV_fragment_shader_barycentric", + "SPV_NV_compute_shader_derivatives", + "SPV_NV_shader_image_footprint", + "SPV_NV_shading_rate", + "SPV_NV_mesh_shader", + "SPV_NV_ray_tracing", + "SPV_EXT_fragment_invocation_density", }); } diff --git a/3rdparty/spirv-tools/source/opt/local_ssa_elim_pass.h b/3rdparty/spirv-tools/source/opt/local_ssa_elim_pass.h index 63d3c33ba..de80d5a86 100644 --- a/3rdparty/spirv-tools/source/opt/local_ssa_elim_pass.h +++ b/3rdparty/spirv-tools/source/opt/local_ssa_elim_pass.h @@ -48,7 +48,9 @@ class LocalMultiStoreElimPass : public MemPass { Status Process() override; IRContext::Analysis GetPreservedAnalyses() override { - return IRContext::kAnalysisDefUse | IRContext::kAnalysisInstrToBlockMapping; + return IRContext::kAnalysisDefUse | + IRContext::kAnalysisInstrToBlockMapping | + IRContext::kAnalysisConstants | IRContext::kAnalysisTypes; } private: diff --git a/3rdparty/spirv-tools/source/opt/loop_descriptor.cpp b/3rdparty/spirv-tools/source/opt/loop_descriptor.cpp index efc56bdba..5aff34ce7 100644 --- a/3rdparty/spirv-tools/source/opt/loop_descriptor.cpp +++ b/3rdparty/spirv-tools/source/opt/loop_descriptor.cpp @@ -914,6 +914,7 @@ bool LoopDescriptor::CreatePreHeaderBlocksIfMissing() { for (auto& loop : *this) { if (!loop.GetPreHeaderBlock()) { modified = true; + // TODO(1841): Handle failure to create pre-header. loop.GetOrCreatePreHeaderBlock(); } } diff --git a/3rdparty/spirv-tools/source/opt/loop_descriptor.h b/3rdparty/spirv-tools/source/opt/loop_descriptor.h index 45a175a0c..38f017b5f 100644 --- a/3rdparty/spirv-tools/source/opt/loop_descriptor.h +++ b/3rdparty/spirv-tools/source/opt/loop_descriptor.h @@ -132,7 +132,7 @@ class Loop { void SetPreHeaderBlock(BasicBlock* preheader); // Returns the loop pre-header, if there is no suitable preheader it will be - // created. + // created. Returns |nullptr| if it fails to create the preheader. BasicBlock* GetOrCreatePreHeaderBlock(); // Returns true if this loop contains any nested loops. diff --git a/3rdparty/spirv-tools/source/opt/loop_fission.cpp b/3rdparty/spirv-tools/source/opt/loop_fission.cpp index 0052406dd..0678113c4 100644 --- a/3rdparty/spirv-tools/source/opt/loop_fission.cpp +++ b/3rdparty/spirv-tools/source/opt/loop_fission.cpp @@ -367,6 +367,7 @@ Loop* LoopFissionImpl::SplitLoop() { cloned_loop->UpdateLoopMergeInst(); // Add the loop_ to the module. + // TODO(1841): Handle failure to create pre-header. Function::iterator it = util.GetFunction()->FindBlock(loop_->GetOrCreatePreHeaderBlock()->id()); util.GetFunction()->AddBasicBlocks(clone_results.cloned_bb_.begin(), diff --git a/3rdparty/spirv-tools/source/opt/loop_peeling.cpp b/3rdparty/spirv-tools/source/opt/loop_peeling.cpp index 7d27480ae..b640542d3 100644 --- a/3rdparty/spirv-tools/source/opt/loop_peeling.cpp +++ b/3rdparty/spirv-tools/source/opt/loop_peeling.cpp @@ -39,6 +39,7 @@ void LoopPeeling::DuplicateAndConnectLoop( assert(CanPeelLoop() && "Cannot peel loop!"); std::vector ordered_loop_blocks; + // TODO(1841): Handle failure to create pre-header. BasicBlock* pre_header = loop_->GetOrCreatePreHeaderBlock(); loop_->ComputeLoopStructuredOrder(&ordered_loop_blocks); @@ -131,6 +132,7 @@ void LoopPeeling::DuplicateAndConnectLoop( // Force the creation of a new preheader for the original loop and set it as // the merge block for the cloned loop. + // TODO(1841): Handle failure to create pre-header. cloned_loop_->SetMergeBlock(loop_->GetOrCreatePreHeaderBlock()); } @@ -151,7 +153,7 @@ void LoopPeeling::InsertCanonicalInductionVariable( context_, &*insert_point, IRContext::kAnalysisDefUse | IRContext::kAnalysisInstrToBlockMapping); Instruction* uint_1_cst = - builder.Add32BitConstantInteger(1, int_type_->IsSigned()); + builder.GetIntConstant(1, int_type_->IsSigned()); // Create the increment. // Note that we do "1 + 1" here, one of the operand should the phi // value but we don't have it yet. The operand will be set latter. @@ -162,8 +164,7 @@ void LoopPeeling::InsertCanonicalInductionVariable( canonical_induction_variable_ = builder.AddPhi( uint_1_cst->type_id(), - {builder.Add32BitConstantInteger(0, int_type_->IsSigned()) - ->result_id(), + {builder.GetIntConstant(0, int_type_->IsSigned())->result_id(), GetClonedLoop()->GetPreHeaderBlock()->id(), iv_inc->result_id(), GetClonedLoop()->GetLatchBlock()->id()}); // Connect everything. @@ -346,6 +347,7 @@ BasicBlock* LoopPeeling::CreateBlockBefore(BasicBlock* bb) { CFG& cfg = *context_->cfg(); assert(cfg.preds(bb->id()).size() == 1 && "More than one predecessor"); + // TODO(1841): Handle id overflow. std::unique_ptr new_bb = MakeUnique(std::unique_ptr(new Instruction( context_, SpvOpLabel, 0, context_->TakeNextId(), {}))); @@ -392,6 +394,7 @@ BasicBlock* LoopPeeling::CreateBlockBefore(BasicBlock* bb) { BasicBlock* LoopPeeling::ProtectLoop(Loop* loop, Instruction* condition, BasicBlock* if_merge) { + // TODO(1841): Handle failure to create pre-header. BasicBlock* if_block = loop->GetOrCreatePreHeaderBlock(); // Will no longer be a pre-header because of the if. loop->SetPreHeaderBlock(nullptr); @@ -422,7 +425,7 @@ void LoopPeeling::PeelBefore(uint32_t peel_factor) { context_, &*cloned_loop_->GetPreHeaderBlock()->tail(), IRContext::kAnalysisDefUse | IRContext::kAnalysisInstrToBlockMapping); Instruction* factor = - builder.Add32BitConstantInteger(peel_factor, int_type_->IsSigned()); + builder.GetIntConstant(peel_factor, int_type_->IsSigned()); Instruction* has_remaining_iteration = builder.AddLessThan( factor->result_id(), loop_iteration_count_->result_id()); @@ -484,7 +487,7 @@ void LoopPeeling::PeelAfter(uint32_t peel_factor) { context_, &*cloned_loop_->GetPreHeaderBlock()->tail(), IRContext::kAnalysisDefUse | IRContext::kAnalysisInstrToBlockMapping); Instruction* factor = - builder.Add32BitConstantInteger(peel_factor, int_type_->IsSigned()); + builder.GetIntConstant(peel_factor, int_type_->IsSigned()); Instruction* has_remaining_iteration = builder.AddLessThan( factor->result_id(), loop_iteration_count_->result_id()); @@ -677,8 +680,8 @@ std::pair LoopPeelingPass::ProcessLoop(Loop* loop, InstructionBuilder( context(), loop->GetHeaderBlock(), IRContext::kAnalysisDefUse | IRContext::kAnalysisInstrToBlockMapping) - .Add32BitConstantInteger(static_cast(iterations), - is_signed), + .GetIntConstant(static_cast(iterations), + is_signed), canonical_induction_variable); if (!peeler.CanPeelLoop()) { diff --git a/3rdparty/spirv-tools/source/opt/loop_unroller.cpp b/3rdparty/spirv-tools/source/opt/loop_unroller.cpp index 587615edf..0d49d881b 100644 --- a/3rdparty/spirv-tools/source/opt/loop_unroller.cpp +++ b/3rdparty/spirv-tools/source/opt/loop_unroller.cpp @@ -244,6 +244,10 @@ class LoopUnrollerUtilsImpl { // ect). void AssignNewResultIds(BasicBlock* basic_block); + // Using the map built by AssignNewResultIds, replace the uses in |inst| + // by the id that the use maps to. + void RemapOperands(Instruction* inst); + // Using the map built by AssignNewResultIds, for each instruction in // |basic_block| use // that map to substitute the IDs used by instructions (in the operands) with @@ -373,6 +377,7 @@ void LoopUnrollerUtilsImpl::Init(Loop* loop) { // number of bodies. void LoopUnrollerUtilsImpl::PartiallyUnrollResidualFactor(Loop* loop, size_t factor) { + // TODO(1841): Handle id overflow. std::unique_ptr new_label{new Instruction( context_, SpvOp::SpvOpLabel, 0, context_->TakeNextId(), {})}; std::unique_ptr new_exit_bb{new BasicBlock(std::move(new_label))}; @@ -448,11 +453,9 @@ void LoopUnrollerUtilsImpl::PartiallyUnrollResidualFactor(Loop* loop, // If the remainder is negative then we add a signed constant, otherwise just // add an unsigned constant. if (remainder < 0) { - new_constant = - builder.Add32BitSignedIntegerConstant(static_cast(remainder)); + new_constant = builder.GetSintConstant(static_cast(remainder)); } else { - new_constant = builder.Add32BitUnsignedIntegerConstant( - static_cast(remainder)); + new_constant = builder.GetUintConstant(static_cast(remainder)); } uint32_t constant_id = new_constant->result_id(); @@ -547,7 +550,10 @@ void LoopUnrollerUtilsImpl::RemoveDeadInstructions() { void LoopUnrollerUtilsImpl::ReplaceInductionUseWithFinalValue(Loop* loop) { context_->InvalidateAnalysesExceptFor( - IRContext::Analysis::kAnalysisLoopAnalysis); + IRContext::Analysis::kAnalysisLoopAnalysis | + IRContext::Analysis::kAnalysisDefUse | + IRContext::Analysis::kAnalysisInstrToBlockMapping); + std::vector inductions; loop->GetInductionVariables(inductions); @@ -588,7 +594,8 @@ void LoopUnrollerUtilsImpl::FullyUnroll(Loop* loop) { RemoveDeadInstructions(); // Invalidate all analyses. context_->InvalidateAnalysesExceptFor( - IRContext::Analysis::kAnalysisLoopAnalysis); + IRContext::Analysis::kAnalysisLoopAnalysis | + IRContext::Analysis::kAnalysisDefUse); } // Copy a given basic block, give it a new result_id, and store the new block @@ -611,6 +618,7 @@ void LoopUnrollerUtilsImpl::CopyBasicBlock(Loop* loop, const BasicBlock* itr, if (!preserve_instructions) { Instruction* merge_inst = loop->GetHeaderBlock()->GetLoopMergeInst(); merge_inst->SetInOperand(1, {basic_block->id()}); + context_->UpdateDefUse(merge_inst); } state_.new_continue_block = basic_block; @@ -651,15 +659,17 @@ void LoopUnrollerUtilsImpl::CopyBody(Loop* loop, bool eliminate_conditions) { } // Set the previous latch block to point to the new header. - Instruction& latch_branch = *state_.previous_latch_block_->tail(); - latch_branch.SetInOperand(0, {state_.new_header_block->id()}); + Instruction* latch_branch = state_.previous_latch_block_->terminator(); + latch_branch->SetInOperand(0, {state_.new_header_block->id()}); + context_->UpdateDefUse(latch_branch); // As the algorithm copies the original loop blocks exactly, the tail of the // latch block on iterations after the first one will be a branch to the new // header and not the actual loop header. The last continue block in the loop // should always be a backedge to the global header. - Instruction& new_latch_branch = *state_.new_latch_block->tail(); - new_latch_branch.SetInOperand(0, {loop->GetHeaderBlock()->id()}); + Instruction* new_latch_branch = state_.new_latch_block->terminator(); + new_latch_branch->SetInOperand(0, {loop->GetHeaderBlock()->id()}); + context_->AnalyzeUses(new_latch_branch); std::vector inductions; loop->GetInductionVariables(inductions); @@ -721,7 +731,10 @@ void LoopUnrollerUtilsImpl::FoldConditionBlock(BasicBlock* condition_block, context_->KillInst(&old_branch); // Add the new unconditional branch to the merge block. - InstructionBuilder builder{context_, condition_block}; + InstructionBuilder builder( + context_, condition_block, + IRContext::Analysis::kAnalysisDefUse | + IRContext::Analysis::kAnalysisInstrToBlockMapping); builder.AddBranch(new_target); } @@ -732,8 +745,9 @@ void LoopUnrollerUtilsImpl::CloseUnrolledLoop(Loop* loop) { // Remove the final backedge to the header and make it point instead to the // merge block. - state_.previous_latch_block_->tail()->SetInOperand( - 0, {loop->GetMergeBlock()->id()}); + Instruction* latch_instruction = state_.previous_latch_block_->terminator(); + latch_instruction->SetInOperand(0, {loop->GetMergeBlock()->id()}); + context_->UpdateDefUse(latch_instruction); // Remove all induction variables as the phis will now be invalid. Replace all // uses with the constant initializer value (all uses of phis will be in @@ -757,6 +771,11 @@ void LoopUnrollerUtilsImpl::CloseUnrolledLoop(Loop* loop) { for (BasicBlock* block : loop_blocks_inorder_) { RemapOperands(block); } + + // Rewrite the last phis, since they may still reference the original phi. + for (Instruction* last_phi : state_.previous_phis_) { + RemapOperands(last_phi); + } } // Uses the first loop to create a copy of the loop with new IDs. @@ -812,13 +831,17 @@ void LoopUnrollerUtilsImpl::AddBlocksToFunction( // Assign all result_ids in |basic_block| instructions to new IDs and preserve // the mapping of new ids to old ones. void LoopUnrollerUtilsImpl::AssignNewResultIds(BasicBlock* basic_block) { + analysis::DefUseManager* def_use_mgr = context_->get_def_use_mgr(); + // Label instructions aren't covered by normal traversal of the // instructions. + // TODO(1841): Handle id overflow. uint32_t new_label_id = context_->TakeNextId(); // Assign a new id to the label. state_.new_inst[basic_block->GetLabelInst()->result_id()] = new_label_id; basic_block->GetLabelInst()->SetResultId(new_label_id); + def_use_mgr->AnalyzeInstDefUse(basic_block->GetLabelInst()); for (Instruction& inst : *basic_block) { uint32_t old_id = inst.result_id(); @@ -829,7 +852,9 @@ void LoopUnrollerUtilsImpl::AssignNewResultIds(BasicBlock* basic_block) { } // Give the instruction a new id. + // TODO(1841): Handle id overflow. inst.SetResultId(context_->TakeNextId()); + def_use_mgr->AnalyzeInstDef(&inst); // Save the mapping of old_id -> new_id. state_.new_inst[old_id] = inst.result_id(); @@ -842,19 +867,22 @@ void LoopUnrollerUtilsImpl::AssignNewResultIds(BasicBlock* basic_block) { } } -// For all instructions in |basic_block| check if the operands used are from a -// copied instruction and if so swap out the operand for the copy of it. +void LoopUnrollerUtilsImpl::RemapOperands(Instruction* inst) { + auto remap_operands_to_new_ids = [this](uint32_t* id) { + auto itr = state_.new_inst.find(*id); + + if (itr != state_.new_inst.end()) { + *id = itr->second; + } + }; + + inst->ForEachInId(remap_operands_to_new_ids); + context_->AnalyzeUses(inst); +} + void LoopUnrollerUtilsImpl::RemapOperands(BasicBlock* basic_block) { for (Instruction& inst : *basic_block) { - auto remap_operands_to_new_ids = [this](uint32_t* id) { - auto itr = state_.new_inst.find(*id); - - if (itr != state_.new_inst.end()) { - *id = itr->second; - } - }; - - inst.ForEachInId(remap_operands_to_new_ids); + RemapOperands(&inst); } } diff --git a/3rdparty/spirv-tools/source/opt/loop_unroller.h b/3rdparty/spirv-tools/source/opt/loop_unroller.h index eb358ae24..71e7cca31 100644 --- a/3rdparty/spirv-tools/source/opt/loop_unroller.h +++ b/3rdparty/spirv-tools/source/opt/loop_unroller.h @@ -30,6 +30,14 @@ class LoopUnroller : public Pass { Status Process() override; + IRContext::Analysis GetPreservedAnalyses() override { + return IRContext::kAnalysisDefUse | + IRContext::kAnalysisInstrToBlockMapping | + IRContext::kAnalysisDecorations | IRContext::kAnalysisCombinators | + IRContext::kAnalysisNameMap | IRContext::kAnalysisConstants | + IRContext::kAnalysisTypes; + } + private: bool fully_unroll_; int unroll_factor_; diff --git a/3rdparty/spirv-tools/source/opt/loop_unswitch_pass.cpp b/3rdparty/spirv-tools/source/opt/loop_unswitch_pass.cpp index 59a0cbcd3..502fc6b68 100644 --- a/3rdparty/spirv-tools/source/opt/loop_unswitch_pass.cpp +++ b/3rdparty/spirv-tools/source/opt/loop_unswitch_pass.cpp @@ -39,8 +39,6 @@ namespace opt { namespace { static const uint32_t kTypePointerStorageClassInIdx = 0; -static const uint32_t kBranchCondTrueLabIdInIdx = 1; -static const uint32_t kBranchCondFalseLabIdInIdx = 2; } // anonymous namespace @@ -74,9 +72,13 @@ class LoopUnswitch { for (uint32_t bb_id : loop_->GetBlocks()) { BasicBlock* bb = cfg.block(bb_id); + if (loop_->GetLatchBlock() == bb) { + continue; + } + if (bb->terminator()->IsBranch() && bb->terminator()->opcode() != SpvOpBranch) { - if (IsConditionLoopInvariant(bb->terminator())) { + if (IsConditionNonConstantLoopInvariant(bb->terminator())) { switch_block_ = bb; break; } @@ -99,6 +101,7 @@ class LoopUnswitch { BasicBlock* CreateBasicBlock(Function::iterator ip) { analysis::DefUseManager* def_use_mgr = context_->get_def_use_mgr(); + // TODO(1841): Handle id overflow. BasicBlock* bb = &*ip.InsertBefore(std::unique_ptr( new BasicBlock(std::unique_ptr(new Instruction( context_, SpvOpLabel, 0, context_->TakeNextId(), {}))))); @@ -109,6 +112,35 @@ class LoopUnswitch { return bb; } + Instruction* GetValueForDefaultPathForSwitch(Instruction* switch_inst) { + assert(switch_inst->opcode() == SpvOpSwitch && + "The given instructoin must be an OpSwitch."); + + // Find a value that can be used to select the default path. + // If none are possible, then it will just use 0. The value does not matter + // because this path will never be taken becaues the new switch outside of + // the loop cannot select this path either. + std::vector existing_values; + for (uint32_t i = 2; i < switch_inst->NumInOperands(); i += 2) { + existing_values.push_back(switch_inst->GetSingleWordInOperand(i)); + } + std::sort(existing_values.begin(), existing_values.end()); + uint32_t value_for_default_path = 0; + if (existing_values.size() < std::numeric_limits::max()) { + for (value_for_default_path = 0; + value_for_default_path < existing_values.size(); + value_for_default_path++) { + if (existing_values[value_for_default_path] != value_for_default_path) { + break; + } + } + } + InstructionBuilder builder( + context_, static_cast(nullptr), + IRContext::kAnalysisDefUse | IRContext::kAnalysisInstrToBlockMapping); + return builder.GetUintConstant(value_for_default_path); + } + // Unswitches |loop_|. void PerformUnswitch() { assert(CanUnswitchLoop() && @@ -153,6 +185,7 @@ class LoopUnswitch { if_merge_block->ForEachPhiInst( [loop_merge_block, &builder, this](Instruction* phi) { Instruction* cloned = phi->Clone(context_); + cloned->SetResultId(TakeNextId()); builder.AddInstruction(std::unique_ptr(cloned)); phi->SetInOperand(0, {cloned->result_id()}); phi->SetInOperand(1, {loop_merge_block->id()}); @@ -176,7 +209,6 @@ class LoopUnswitch { ploop->AddBasicBlock(loop_merge_block); loop_desc_.SetBasicBlockToLoop(loop_merge_block->id(), ploop); } - // Update the dominator tree. DominatorTreeNode* loop_merge_dtn = dom_tree->GetOrInsertNode(loop_merge_block); @@ -194,7 +226,7 @@ class LoopUnswitch { //////////////////////////////////////////////////////////////////////////// // Step 2: Build a new preheader for |loop_|, use the old one - // for the constant branch. + // for the invariant branch. //////////////////////////////////////////////////////////////////////////// BasicBlock* if_block = loop_->GetPreHeaderBlock(); @@ -272,7 +304,6 @@ class LoopUnswitch { std::vector> constant_branch; // Special case for the original loop Instruction* original_loop_constant_value; - BasicBlock* original_loop_target; if (iv_opcode == SpvOpBranchConditional) { constant_branch.emplace_back( cst_mgr->GetDefiningInstruction(cst_mgr->GetConstant(cond_type, {0})), @@ -282,7 +313,9 @@ class LoopUnswitch { } else { // We are looking to take the default branch, so we can't provide a // specific value. - original_loop_constant_value = nullptr; + original_loop_constant_value = + GetValueForDefaultPathForSwitch(iv_condition); + for (uint32_t i = 2; i < iv_condition->NumInOperands(); i += 2) { constant_branch.emplace_back( cst_mgr->GetDefiningInstruction(cst_mgr->GetConstant( @@ -322,24 +355,7 @@ class LoopUnswitch { //////////////////////////////////// { - std::unordered_set dead_blocks; - std::unordered_set unreachable_merges; - SimplifyLoop( - make_range( - UptrVectorIterator(&clone_result.cloned_bb_, - clone_result.cloned_bb_.begin()), - UptrVectorIterator(&clone_result.cloned_bb_, - clone_result.cloned_bb_.end())), - cloned_loop, condition, specialisation_value, &dead_blocks); - - // We tagged dead blocks, create the loop before we invalidate any basic - // block. - cloned_loop = - CleanLoopNest(cloned_loop, dead_blocks, &unreachable_merges); - CleanUpCFG( - UptrVectorIterator(&clone_result.cloned_bb_, - clone_result.cloned_bb_.begin()), - dead_blocks, unreachable_merges); + SpecializeLoop(cloned_loop, condition, specialisation_value); /////////////////////////////////////////////////////////// // Step 5: Connect convergent edges to the landing pads. // @@ -348,27 +364,25 @@ class LoopUnswitch { for (uint32_t merge_bb_id : if_merging_blocks) { BasicBlock* merge = context_->cfg()->block(merge_bb_id); // We are in LCSSA so we only care about phi instructions. - merge->ForEachPhiInst([is_from_original_loop, &dead_blocks, - &clone_result](Instruction* phi) { - uint32_t num_in_operands = phi->NumInOperands(); - for (uint32_t i = 0; i < num_in_operands; i += 2) { - uint32_t pred = phi->GetSingleWordInOperand(i + 1); - if (is_from_original_loop(pred)) { - pred = clone_result.value_map_.at(pred); - if (!dead_blocks.count(pred)) { - uint32_t incoming_value_id = phi->GetSingleWordInOperand(i); - // Not all the incoming value are coming from the loop. - ValueMapTy::iterator new_value = - clone_result.value_map_.find(incoming_value_id); - if (new_value != clone_result.value_map_.end()) { - incoming_value_id = new_value->second; + merge->ForEachPhiInst( + [is_from_original_loop, &clone_result](Instruction* phi) { + uint32_t num_in_operands = phi->NumInOperands(); + for (uint32_t i = 0; i < num_in_operands; i += 2) { + uint32_t pred = phi->GetSingleWordInOperand(i + 1); + if (is_from_original_loop(pred)) { + pred = clone_result.value_map_.at(pred); + uint32_t incoming_value_id = phi->GetSingleWordInOperand(i); + // Not all the incoming values are coming from the loop. + ValueMapTy::iterator new_value = + clone_result.value_map_.find(incoming_value_id); + if (new_value != clone_result.value_map_.end()) { + incoming_value_id = new_value->second; + } + phi->AddOperand({SPV_OPERAND_TYPE_ID, {incoming_value_id}}); + phi->AddOperand({SPV_OPERAND_TYPE_ID, {pred}}); } - phi->AddOperand({SPV_OPERAND_TYPE_ID, {incoming_value_id}}); - phi->AddOperand({SPV_OPERAND_TYPE_ID, {pred}}); } - } - } - }); + }); } } function_->AddBasicBlocks(clone_result.cloned_bb_.begin(), @@ -376,38 +390,9 @@ class LoopUnswitch { ++FindBasicBlockPosition(if_block)); } - // Same as above but specialize the existing loop - { - std::unordered_set dead_blocks; - std::unordered_set unreachable_merges; - SimplifyLoop(make_range(function_->begin(), function_->end()), loop_, - condition, original_loop_constant_value, &dead_blocks); - - for (uint32_t merge_bb_id : if_merging_blocks) { - BasicBlock* merge = context_->cfg()->block(merge_bb_id); - // LCSSA, so we only care about phi instructions. - // If we the phi is reduced to a single incoming branch, do not - // propagate it to preserve LCSSA. - PatchPhis(merge, dead_blocks, true); - } - if (if_merge_block) { - bool has_live_pred = false; - for (uint32_t pid : cfg.preds(if_merge_block->id())) { - if (!dead_blocks.count(pid)) { - has_live_pred = true; - break; - } - } - if (!has_live_pred) unreachable_merges.insert(if_merge_block->id()); - } - original_loop_target = loop_->GetPreHeaderBlock(); - // We tagged dead blocks, prune the loop descriptor from any dead loops. - // After this call, |loop_| can be nullptr (i.e. the unswitch killed this - // loop). - loop_ = CleanLoopNest(loop_, dead_blocks, &unreachable_merges); - - CleanUpCFG(function_->begin(), dead_blocks, unreachable_merges); - } + // Specialize the existing loop. + SpecializeLoop(loop_, condition, original_loop_constant_value); + BasicBlock* original_loop_target = loop_->GetPreHeaderBlock(); ///////////////////////////////////// // Finally: connect the new loops. // @@ -440,9 +425,6 @@ class LoopUnswitch { IRContext::Analysis::kAnalysisLoopAnalysis); } - // Returns true if the unswitch killed the original |loop_|. - bool WasLoopKilled() const { return loop_ == nullptr; } - private: using ValueMapTy = std::unordered_map; using BlockMapTy = std::unordered_map; @@ -459,96 +441,9 @@ class LoopUnswitch { std::vector ordered_loop_blocks_; // Returns the next usable id for the context. - uint32_t TakeNextId() { return context_->TakeNextId(); } - - // Patches |bb|'s phi instruction by removing incoming value from unexisting - // or tagged as dead branches. - void PatchPhis(BasicBlock* bb, - const std::unordered_set& dead_blocks, - bool preserve_phi) { - CFG& cfg = *context_->cfg(); - - std::vector phi_to_kill; - const std::vector& bb_preds = cfg.preds(bb->id()); - auto is_branch_dead = [&bb_preds, &dead_blocks](uint32_t id) { - return dead_blocks.count(id) || - std::find(bb_preds.begin(), bb_preds.end(), id) == bb_preds.end(); - }; - bb->ForEachPhiInst([&phi_to_kill, &is_branch_dead, preserve_phi, - this](Instruction* insn) { - uint32_t i = 0; - while (i < insn->NumInOperands()) { - uint32_t incoming_id = insn->GetSingleWordInOperand(i + 1); - if (is_branch_dead(incoming_id)) { - // Remove the incoming block id operand. - insn->RemoveInOperand(i + 1); - // Remove the definition id operand. - insn->RemoveInOperand(i); - continue; - } - i += 2; - } - // If there is only 1 remaining edge, propagate the value and - // kill the instruction. - if (insn->NumInOperands() == 2 && !preserve_phi) { - phi_to_kill.push_back(insn); - context_->ReplaceAllUsesWith(insn->result_id(), - insn->GetSingleWordInOperand(0)); - } - }); - for (Instruction* insn : phi_to_kill) { - context_->KillInst(insn); - } - } - - // Removes any block that is tagged as dead, if the block is in - // |unreachable_merges| then all block's instructions are replaced by a - // OpUnreachable. - void CleanUpCFG(UptrVectorIterator bb_it, - const std::unordered_set& dead_blocks, - const std::unordered_set& unreachable_merges) { - CFG& cfg = *context_->cfg(); - - while (bb_it != bb_it.End()) { - BasicBlock& bb = *bb_it; - - if (unreachable_merges.count(bb.id())) { - if (bb.begin() != bb.tail() || - bb.terminator()->opcode() != SpvOpUnreachable) { - // Make unreachable, but leave the label. - bb.KillAllInsts(false); - InstructionBuilder(context_, &bb).AddUnreachable(); - cfg.RemoveNonExistingEdges(bb.id()); - } - ++bb_it; - } else if (dead_blocks.count(bb.id())) { - cfg.ForgetBlock(&bb); - // Kill this block. - bb.KillAllInsts(true); - bb_it = bb_it.Erase(); - } else { - cfg.RemoveNonExistingEdges(bb.id()); - ++bb_it; - } - } - } - - // Return true if |c_inst| is a Boolean constant and set |cond_val| with the - // value that |c_inst| - bool GetConstCondition(const Instruction* c_inst, bool* cond_val) { - bool cond_is_const; - switch (c_inst->opcode()) { - case SpvOpConstantFalse: { - *cond_val = false; - cond_is_const = true; - } break; - case SpvOpConstantTrue: { - *cond_val = true; - cond_is_const = true; - } break; - default: { cond_is_const = false; } break; - } - return cond_is_const; + uint32_t TakeNextId() { + // TODO(1841): Handle id overflow. + return context_->TakeNextId(); } // Simplifies |loop| assuming the instruction |to_version_insn| takes the @@ -560,13 +455,9 @@ class LoopUnswitch { // // Requirements: // - |loop| must be in the LCSSA form; - // - |cst_value| must be constant or null (to represent the default target - // of an OpSwitch). - void SimplifyLoop(IteratorRange> block_range, - Loop* loop, Instruction* to_version_insn, - Instruction* cst_value, - std::unordered_set* dead_blocks) { - CFG& cfg = *context_->cfg(); + // - |cst_value| must be constant. + void SpecializeLoop(Loop* loop, Instruction* to_version_insn, + Instruction* cst_value) { analysis::DefUseManager* def_use_mgr = context_->get_def_use_mgr(); std::function ignore_node; @@ -591,192 +482,15 @@ class LoopUnswitch { for (auto use : use_list) { Instruction* inst = use.first; uint32_t operand_index = use.second; - BasicBlock* bb = context_->get_instr_block(inst); - // If it is not a branch, simply inject the value. - if (!inst->IsBranch()) { - // To also handle switch, cst_value can be nullptr: this case - // means that we are looking to branch to the default target of - // the switch. We don't actually know its value so we don't touch - // it if it not a switch. - if (cst_value) { - inst->SetOperand(operand_index, {cst_value->result_id()}); - def_use_mgr->AnalyzeInstUse(inst); - } - } - - // The user is a branch, kill dead branches. - uint32_t live_target = 0; - std::unordered_set dead_branches; - switch (inst->opcode()) { - case SpvOpBranchConditional: { - assert(cst_value && "No constant value to specialize !"); - bool branch_cond = false; - if (GetConstCondition(cst_value, &branch_cond)) { - uint32_t true_label = - inst->GetSingleWordInOperand(kBranchCondTrueLabIdInIdx); - uint32_t false_label = - inst->GetSingleWordInOperand(kBranchCondFalseLabIdInIdx); - live_target = branch_cond ? true_label : false_label; - uint32_t dead_target = !branch_cond ? true_label : false_label; - cfg.RemoveEdge(bb->id(), dead_target); - } - break; - } - case SpvOpSwitch: { - live_target = inst->GetSingleWordInOperand(1); - if (cst_value) { - if (!cst_value->IsConstant()) break; - const Operand& cst = cst_value->GetInOperand(0); - for (uint32_t i = 2; i < inst->NumInOperands(); i += 2) { - const Operand& literal = inst->GetInOperand(i); - if (literal == cst) { - live_target = inst->GetSingleWordInOperand(i + 1); - break; - } - } - } - for (uint32_t i = 1; i < inst->NumInOperands(); i += 2) { - uint32_t id = inst->GetSingleWordInOperand(i); - if (id != live_target) { - cfg.RemoveEdge(bb->id(), id); - } - } - } - default: - break; - } - if (live_target != 0) { - // Check for the presence of the merge block. - if (Instruction* merge = bb->GetMergeInst()) context_->KillInst(merge); - context_->KillInst(&*bb->tail()); - InstructionBuilder builder(context_, bb, - IRContext::kAnalysisDefUse | - IRContext::kAnalysisInstrToBlockMapping); - builder.AddBranch(live_target); - } + // To also handle switch, cst_value can be nullptr: this case + // means that we are looking to branch to the default target of + // the switch. We don't actually know its value so we don't touch + // it if it not a switch. + assert(cst_value && "We do not have a value to use."); + inst->SetOperand(operand_index, {cst_value->result_id()}); + def_use_mgr->AnalyzeInstUse(inst); } - - // Go through the loop basic block and tag all blocks that are obviously - // dead. - std::unordered_set visited; - for (BasicBlock& bb : block_range) { - if (ignore_node(bb.id())) continue; - visited.insert(bb.id()); - - // Check if this block is dead, if so tag it as dead otherwise patch phi - // instructions. - bool has_live_pred = false; - for (uint32_t pid : cfg.preds(bb.id())) { - if (!dead_blocks->count(pid)) { - has_live_pred = true; - break; - } - } - if (!has_live_pred) { - dead_blocks->insert(bb.id()); - const BasicBlock& cbb = bb; - // Patch the phis for any back-edge. - cbb.ForEachSuccessorLabel( - [dead_blocks, &visited, &cfg, this](uint32_t id) { - if (!visited.count(id) || dead_blocks->count(id)) return; - BasicBlock* succ = cfg.block(id); - PatchPhis(succ, *dead_blocks, false); - }); - continue; - } - // Update the phi instructions, some incoming branch have/will disappear. - PatchPhis(&bb, *dead_blocks, /* preserve_phi = */ false); - } - } - - // Returns true if the header is not reachable or tagged as dead or if we - // never loop back. - bool IsLoopDead(BasicBlock* header, BasicBlock* latch, - const std::unordered_set& dead_blocks) { - if (!header || dead_blocks.count(header->id())) return true; - if (!latch || dead_blocks.count(latch->id())) return true; - for (uint32_t pid : context_->cfg()->preds(header->id())) { - if (!dead_blocks.count(pid)) { - // Seems reachable. - return false; - } - } - return true; - } - - // Cleans the loop nest under |loop| and reflect changes to the loop - // descriptor. This will kill all descriptors that represent dead loops. - // If |loop_| is killed, it will be set to nullptr. - // Any merge blocks that become unreachable will be added to - // |unreachable_merges|. - // The function returns the pointer to |loop| or nullptr if the loop was - // killed. - Loop* CleanLoopNest(Loop* loop, - const std::unordered_set& dead_blocks, - std::unordered_set* unreachable_merges) { - // This represent the pair of dead loop and nearest alive parent (nullptr if - // no parent). - std::unordered_map dead_loops; - auto get_parent = [&dead_loops](Loop* l) -> Loop* { - std::unordered_map::iterator it = dead_loops.find(l); - if (it != dead_loops.end()) return it->second; - return nullptr; - }; - - bool is_main_loop_dead = - IsLoopDead(loop->GetHeaderBlock(), loop->GetLatchBlock(), dead_blocks); - if (is_main_loop_dead) { - if (Instruction* merge = loop->GetHeaderBlock()->GetLoopMergeInst()) { - context_->KillInst(merge); - } - dead_loops[loop] = loop->GetParent(); - } else { - dead_loops[loop] = loop; - } - - // For each loop, check if we killed it. If we did, find a suitable parent - // for its children. - for (Loop& sub_loop : - make_range(++TreeDFIterator(loop), TreeDFIterator())) { - if (IsLoopDead(sub_loop.GetHeaderBlock(), sub_loop.GetLatchBlock(), - dead_blocks)) { - if (Instruction* merge = - sub_loop.GetHeaderBlock()->GetLoopMergeInst()) { - context_->KillInst(merge); - } - dead_loops[&sub_loop] = get_parent(&sub_loop); - } else { - // The loop is alive, check if its merge block is dead, if it is, tag it - // as required. - if (sub_loop.GetMergeBlock()) { - uint32_t merge_id = sub_loop.GetMergeBlock()->id(); - if (dead_blocks.count(merge_id)) { - unreachable_merges->insert(sub_loop.GetMergeBlock()->id()); - } - } - } - } - if (!is_main_loop_dead) dead_loops.erase(loop); - - // Remove dead blocks from live loops. - for (uint32_t bb_id : dead_blocks) { - Loop* l = loop_desc_[bb_id]; - if (l) { - l->RemoveBasicBlock(bb_id); - loop_desc_.ForgetBasicBlock(bb_id); - } - } - - std::for_each( - dead_loops.begin(), dead_loops.end(), - [&loop, - this](std::unordered_map::iterator::reference it) { - if (it.first == loop) loop = nullptr; - loop_desc_.RemoveLoop(it.first); - }); - - return loop; } // Returns true if |var| is dynamically uniform. @@ -835,17 +549,25 @@ class LoopUnswitch { }); } - // Returns true if |insn| is constant and dynamically uniform within the loop. - bool IsConditionLoopInvariant(Instruction* insn) { + // Returns true if |insn| is not a constant, but is loop invariant and + // dynamically uniform. + bool IsConditionNonConstantLoopInvariant(Instruction* insn) { assert(insn->IsBranch()); assert(insn->opcode() != SpvOpBranch); analysis::DefUseManager* def_use_mgr = context_->get_def_use_mgr(); Instruction* condition = def_use_mgr->GetDef(insn->GetOperand(0).words[0]); - return !loop_->IsInsideLoop(condition) && - IsDynamicallyUniform( - condition, function_->entry().get(), - context_->GetPostDominatorAnalysis(function_)->GetDomTree()); + if (condition->IsConstant()) { + return false; + } + + if (loop_->IsInsideLoop(condition)) { + return false; + } + + return IsDynamicallyUniform( + condition, function_->entry().get(), + context_->GetPostDominatorAnalysis(function_)->GetDomTree()); } }; @@ -879,7 +601,7 @@ bool LoopUnswitchPass::ProcessFunction(Function* f) { processed_loop.insert(&loop); LoopUnswitch unswitcher(context(), f, &loop, &loop_descriptor); - while (!unswitcher.WasLoopKilled() && unswitcher.CanUnswitchLoop()) { + while (unswitcher.CanUnswitchLoop()) { if (!loop.IsLCSSA()) { LoopUtils(context(), &loop).MakeLoopClosedSSA(); } diff --git a/3rdparty/spirv-tools/source/opt/loop_utils.cpp b/3rdparty/spirv-tools/source/opt/loop_utils.cpp index 482335f3b..8c6d355d6 100644 --- a/3rdparty/spirv-tools/source/opt/loop_utils.cpp +++ b/3rdparty/spirv-tools/source/opt/loop_utils.cpp @@ -352,6 +352,7 @@ void LoopUtils::CreateLoopDedicatedExits() { assert(insert_pt != function->end() && "Basic Block not found"); // Create the dedicate exit basic block. + // TODO(1841): Handle id overflow. BasicBlock& exit = *insert_pt.InsertBefore(std::unique_ptr( new BasicBlock(std::unique_ptr(new Instruction( context_, SpvOpLabel, 0, context_->TakeNextId(), {}))))); @@ -491,6 +492,7 @@ Loop* LoopUtils::CloneAndAttachLoopToHeader(LoopCloningResult* cloning_result) { Loop* new_loop = CloneLoop(cloning_result); // Create a new exit block/label for the new loop. + // TODO(1841): Handle id overflow. std::unique_ptr new_label{new Instruction( context_, SpvOp::SpvOpLabel, 0, context_->TakeNextId(), {})}; std::unique_ptr new_exit_bb{new BasicBlock(std::move(new_label))}; @@ -528,6 +530,7 @@ Loop* LoopUtils::CloneAndAttachLoopToHeader(LoopCloningResult* cloning_result) { inst->SetOperand(operand, {new_header}); }); + // TODO(1841): Handle failure to create pre-header. def_use->ForEachUse( loop_->GetOrCreatePreHeaderBlock()->id(), [new_merge_block, this](Instruction* inst, uint32_t operand) { @@ -560,6 +563,7 @@ Loop* LoopUtils::CloneLoop( // between old and new ids. BasicBlock* new_bb = old_bb->Clone(context_); new_bb->SetParent(&function_); + // TODO(1841): Handle id overflow. new_bb->GetLabelInst()->SetResultId(context_->TakeNextId()); def_use_mgr->AnalyzeInstDef(new_bb->GetLabelInst()); context_->set_instr_block(new_bb->GetLabelInst(), new_bb); @@ -575,6 +579,7 @@ Loop* LoopUtils::CloneLoop( new_inst != new_bb->end(); ++new_inst, ++old_inst) { cloning_result->ptr_map_[&*new_inst] = &*old_inst; if (new_inst->HasResultId()) { + // TODO(1841): Handle id overflow. new_inst->SetResultId(context_->TakeNextId()); cloning_result->value_map_[old_inst->result_id()] = new_inst->result_id(); diff --git a/3rdparty/spirv-tools/source/opt/mem_pass.cpp b/3rdparty/spirv-tools/source/opt/mem_pass.cpp index c65e04938..cc0976767 100644 --- a/3rdparty/spirv-tools/source/opt/mem_pass.cpp +++ b/3rdparty/spirv-tools/source/opt/mem_pass.cpp @@ -119,7 +119,7 @@ Instruction* MemPass::GetPtr(uint32_t ptrId, uint32_t* varId) { Instruction* MemPass::GetPtr(Instruction* ip, uint32_t* varId) { assert(ip->opcode() == SpvOpStore || ip->opcode() == SpvOpLoad || - ip->opcode() == SpvOpImageTexelPointer); + ip->opcode() == SpvOpImageTexelPointer || ip->IsAtomicWithLoad()); // All of these opcode place the pointer in position 0. const uint32_t ptrId = ip->GetSingleWordInOperand(0); diff --git a/3rdparty/spirv-tools/source/opt/merge_return_pass.cpp b/3rdparty/spirv-tools/source/opt/merge_return_pass.cpp index 4068d4a18..4f49c70f2 100644 --- a/3rdparty/spirv-tools/source/opt/merge_return_pass.cpp +++ b/3rdparty/spirv-tools/source/opt/merge_return_pass.cpp @@ -22,52 +22,69 @@ #include "source/opt/ir_builder.h" #include "source/opt/ir_context.h" #include "source/opt/reflect.h" +#include "source/util/bit_vector.h" #include "source/util/make_unique.h" namespace spvtools { namespace opt { Pass::Status MergeReturnPass::Process() { - bool modified = false; bool is_shader = context()->get_feature_mgr()->HasCapability(SpvCapabilityShader); - for (auto& function : *get_module()) { - std::vector return_blocks = CollectReturnBlocks(&function); - if (return_blocks.size() <= 1) continue; - function_ = &function; + bool failed = false; + ProcessFunction pfn = [&failed, is_shader, this](Function* function) { + std::vector return_blocks = CollectReturnBlocks(function); + if (return_blocks.size() <= 1) { + return false; + } + + function_ = function; return_flag_ = nullptr; return_value_ = nullptr; final_return_block_ = nullptr; - modified = true; if (is_shader) { - ProcessStructured(&function, return_blocks); + if (!ProcessStructured(function, return_blocks)) { + failed = true; + } } else { - MergeReturnBlocks(&function, return_blocks); + MergeReturnBlocks(function, return_blocks); } + return true; + }; + + bool modified = context()->ProcessReachableCallTree(pfn); + + if (failed) { + return Status::Failure; } return modified ? Status::SuccessWithChange : Status::SuccessWithoutChange; } -void MergeReturnPass::ProcessStructured( +bool MergeReturnPass::ProcessStructured( Function* function, const std::vector& return_blocks) { + if (HasNontrivialUnreachableBlocks(function)) { + if (consumer()) { + std::string message = + "Module contains unreachable blocks during merge return. Run dead " + "branch elimination before merge return."; + consumer()(SPV_MSG_ERROR, 0, {0, 0, 0}, message.c_str()); + } + return false; + } + + AddDummyLoopAroundFunction(); + std::list order; cfg()->ComputeStructuredOrder(function, &*function->begin(), &order); - // Create the new return block - CreateReturnBlock(); - - // Create the return - CreateReturn(final_return_block_); - - cfg()->RegisterBlock(final_return_block_); - state_.clear(); state_.emplace_back(nullptr, nullptr); for (auto block : order) { - if (cfg()->IsPseudoEntryBlock(block) || cfg()->IsPseudoExitBlock(block)) { + if (cfg()->IsPseudoEntryBlock(block) || cfg()->IsPseudoExitBlock(block) || + block == final_return_block_) { continue; } @@ -104,7 +121,9 @@ void MergeReturnPass::ProcessStructured( // Predicate successors of the original return blocks as necessary. if (std::find(return_blocks.begin(), return_blocks.end(), block) != return_blocks.end()) { - PredicateBlocks(block, &predicated, &order); + if (!PredicateBlocks(block, &predicated, &order)) { + return false; + } } // Generate state for next block @@ -119,6 +138,7 @@ void MergeReturnPass::ProcessStructured( // Invalidate it at this point to make sure it will be rebuilt. context()->RemoveDominatorAnalysis(function); AddNewPhiNodes(); + return true; } void MergeReturnPass::CreateReturnBlock() { @@ -175,14 +195,8 @@ void MergeReturnPass::ProcessStructuredBlock(BasicBlock* block) { if (tail_opcode == SpvOpReturn || tail_opcode == SpvOpReturnValue || tail_opcode == SpvOpUnreachable) { - if (CurrentState().InLoop()) { - // Can always break out of innermost loop - BranchToBlock(block, CurrentState().LoopMergeId()); - } else if (CurrentState().InStructuredFlow()) { - BranchToBlock(block, CurrentState().CurrentMergeId()); - } else { - BranchToBlock(block, final_return_block_->id()); - } + assert(CurrentState().InLoop() && "Should be in the dummy loop."); + BranchToBlock(block, CurrentState().LoopMergeId()); } } @@ -192,7 +206,11 @@ void MergeReturnPass::BranchToBlock(BasicBlock* block, uint32_t target) { RecordReturned(block); RecordReturnValue(block); } + BasicBlock* target_block = context()->get_instr_block(target); + if (target_block->GetLoopMergeInst()) { + cfg()->SplitLoopHeader(target_block); + } UpdatePhiNodes(block, target_block); Instruction* return_inst = block->terminator(); @@ -227,8 +245,22 @@ void MergeReturnPass::CreatePhiNodesForInst(BasicBlock* merge_block, if (inst.result_id() != 0) { std::vector users_to_update; context()->get_def_use_mgr()->ForEachUser( - &inst, [&users_to_update, &dom_tree, inst_bb, this](Instruction* user) { - BasicBlock* user_bb = context()->get_instr_block(user); + &inst, + [&users_to_update, &dom_tree, &inst, inst_bb, this](Instruction* user) { + BasicBlock* user_bb = nullptr; + if (user->opcode() != SpvOpPhi) { + user_bb = context()->get_instr_block(user); + } else { + // For OpPhi, the use should be considered to be in the predecessor. + for (uint32_t i = 0; i < user->NumInOperands(); i += 2) { + if (user->GetSingleWordInOperand(i) == inst.result_id()) { + uint32_t user_bb_id = user->GetSingleWordInOperand(i + 1); + user_bb = context()->get_instr_block(user_bb_id); + break; + } + } + } + // If |user_bb| is nullptr, then |user| is not in the function. It is // something like an OpName or decoration, which should not be // replaced with the result of the OpPhi. @@ -276,14 +308,14 @@ void MergeReturnPass::CreatePhiNodesForInst(BasicBlock* merge_block, } } -void MergeReturnPass::PredicateBlocks( +bool MergeReturnPass::PredicateBlocks( BasicBlock* return_block, std::unordered_set* predicated, std::list* order) { // The CFG is being modified as the function proceeds so avoid caching // successors. if (predicated->count(return_block)) { - return; + return true; } BasicBlock* block = nullptr; @@ -310,71 +342,28 @@ void MergeReturnPass::PredicateBlocks( while (block != nullptr && block != final_return_block_) { if (!predicated->insert(block).second) break; // Skip structured subgraphs. - BasicBlock* next = nullptr; - if (state->InLoop()) { - next = context()->get_instr_block(state->LoopMergeId()); - while (state->LoopMergeId() == next->id()) { - state++; - } - BreakFromConstruct(block, next, predicated, order); - } else if (false && state->InStructuredFlow()) { - // TODO(#1861): This is disabled until drivers are fixed to accept - // conditional exits from a selection construct. Reenable tests when - // this code is turned back on. - - next = context()->get_instr_block(state->CurrentMergeId()); + assert(state->InLoop() && "Should be in the dummy loop at the very least."); + Instruction* current_loop_merge_inst = state->LoopMergeInst(); + uint32_t merge_block_id = + current_loop_merge_inst->GetSingleWordInOperand(0); + while (state->LoopMergeId() == merge_block_id) { state++; - BreakFromConstruct(block, next, predicated, order); - } else { - BasicBlock* tail = block; - while (tail->GetMergeInst()) { - tail = context()->get_instr_block(tail->MergeBlockIdIfAny()); - } - - // Must find |next| (the successor of |tail|) before predicating the - // block because, if |block| == |tail|, then |tail| will have multiple - // successors. - next = nullptr; - const_cast(tail)->ForEachSuccessorLabel( - [this, &next](const uint32_t idx) { - BasicBlock* succ_block = context()->get_instr_block(idx); - assert(next == nullptr && - "Found block with multiple successors and no merge " - "instruction."); - next = succ_block; - }); - - PredicateBlock(block, tail, predicated, order); } - block = next; + if (!BreakFromConstruct(block, predicated, order, + current_loop_merge_inst)) { + return false; + } + block = context()->get_instr_block(merge_block_id); } + return true; } -bool MergeReturnPass::RequiresPredication(const BasicBlock* block, - const BasicBlock* tail_block) const { - // This is intentionally conservative. - // TODO(alanbaker): re-visit this when more performance data is available. - if (block != tail_block) return true; - - bool requires_predicate = false; - block->ForEachInst([&requires_predicate](const Instruction* inst) { - if (inst->opcode() != SpvOpPhi && inst->opcode() != SpvOpLabel && - !IsTerminatorInst(inst->opcode())) { - requires_predicate = true; - } - }); - return requires_predicate; -} - -void MergeReturnPass::PredicateBlock( - BasicBlock* block, BasicBlock* tail_block, - std::unordered_set* predicated, - std::list* order) { - if (!RequiresPredication(block, tail_block)) { - return; - } - - // Make sure the cfg is build here. If we don't then it becomes very hard +bool MergeReturnPass::BreakFromConstruct( + BasicBlock* block, std::unordered_set* predicated, + std::list* order, Instruction* loop_merge_inst) { + assert(loop_merge_inst->opcode() == SpvOpLoopMerge && + "loop_merge_inst must be a loop merge instruction."); + // Make sure the CFG is build here. If we don't then it becomes very hard // to know which new blocks need to be updated. context()->BuildInvalidAnalyses(IRContext::kAnalysisCFG); @@ -390,7 +379,15 @@ void MergeReturnPass::PredicateBlock( // If |block| is a loop header, then the back edge must jump to the original // code, not the new header. if (block->GetLoopMergeInst()) { - cfg()->SplitLoopHeader(block); + if (cfg()->SplitLoopHeader(block) == nullptr) { + return false; + } + } + + uint32_t merge_block_id = loop_merge_inst->GetSingleWordInOperand(0); + BasicBlock* merge_block = context()->get_instr_block(merge_block_id); + if (merge_block->GetLoopMergeInst()) { + cfg()->SplitLoopHeader(merge_block); } // Leave the phi instructions behind. @@ -402,153 +399,16 @@ void MergeReturnPass::PredicateBlock( // Forget about the edges leaving block. They will be removed. cfg()->RemoveSuccessorEdges(block); - std::unique_ptr new_block( - block->SplitBasicBlock(context(), TakeNextId(), iter)); - BasicBlock* old_body = - function_->InsertBasicBlockAfter(std::move(new_block), block); + BasicBlock* old_body = block->SplitBasicBlock(context(), TakeNextId(), iter); predicated->insert(old_body); - // Update |order| so old_block will be traversed. - InsertAfterElement(block, old_body, order); - - if (tail_block == block) { - tail_block = old_body; + // If |block| was a continue target for a loop |old_body| is now the correct + // continue target. + if (loop_merge_inst->GetSingleWordInOperand(1) == block->id()) { + loop_merge_inst->SetInOperand(1, {old_body->id()}); + context()->UpdateDefUse(loop_merge_inst); } - const BasicBlock* const_old_body = static_cast(old_body); - const_old_body->ForEachSuccessorLabel( - [old_body, block, this](const uint32_t label) { - BasicBlock* target_bb = context()->get_instr_block(label); - if (MarkedSinglePred(target_bb) == block) { - MarkForNewPhiNodes(target_bb, old_body); - } - }); - - std::unique_ptr new_merge_block(new BasicBlock( - MakeUnique(context(), SpvOpLabel, 0, TakeNextId(), - std::initializer_list{}))); - - BasicBlock* new_merge = - function_->InsertBasicBlockAfter(std::move(new_merge_block), tail_block); - predicated->insert(new_merge); - new_merge->SetParent(function_); - - // Update |order| so old_block will be traversed. - InsertAfterElement(tail_block, new_merge, order); - - // Register the new label. - get_def_use_mgr()->AnalyzeInstDef(new_merge->GetLabelInst()); - context()->set_instr_block(new_merge->GetLabelInst(), new_merge); - - // Move the tail branch into the new merge and fix the mapping. If a single - // block is being predicated then its branch was moved to the old body - // previously. - std::unique_ptr inst; - Instruction* i = tail_block->terminator(); - cfg()->RemoveSuccessorEdges(tail_block); - get_def_use_mgr()->ClearInst(i); - inst.reset(std::move(i)); - inst->RemoveFromList(); - new_merge->end().InsertBefore(std::move(inst)); - get_def_use_mgr()->AnalyzeInstUse(new_merge->terminator()); - context()->set_instr_block(new_merge->terminator(), new_merge); - - // Add a branch to the new merge. If we jumped multiple blocks, the branch - // is added to tail_block, otherwise the branch belongs in old_body. - tail_block->AddInstruction( - MakeUnique(context(), SpvOpBranch, 0, 0, - std::initializer_list{ - {SPV_OPERAND_TYPE_ID, {new_merge->id()}}})); - get_def_use_mgr()->AnalyzeInstUse(tail_block->terminator()); - context()->set_instr_block(tail_block->terminator(), tail_block); - - // Within the new header we need the following: - // 1. Load of the return status flag - // 2. Declare the merge block - // 3. Branch to new merge (true) or old body (false) - - // 1. Load of the return status flag - analysis::Bool bool_type; - uint32_t bool_id = context()->get_type_mgr()->GetId(&bool_type); - assert(bool_id != 0); - uint32_t load_id = TakeNextId(); - block->AddInstruction(MakeUnique( - context(), SpvOpLoad, bool_id, load_id, - std::initializer_list{ - {SPV_OPERAND_TYPE_ID, {return_flag_->result_id()}}})); - get_def_use_mgr()->AnalyzeInstDefUse(block->terminator()); - context()->set_instr_block(block->terminator(), block); - - // 2. Declare the merge block - block->AddInstruction(MakeUnique( - context(), SpvOpSelectionMerge, 0, 0, - std::initializer_list{{SPV_OPERAND_TYPE_ID, {new_merge->id()}}, - {SPV_OPERAND_TYPE_SELECTION_CONTROL, - {SpvSelectionControlMaskNone}}})); - get_def_use_mgr()->AnalyzeInstUse(block->terminator()); - context()->set_instr_block(block->terminator(), block); - - // 3. Branch to new merge (true) or old body (false) - block->AddInstruction(MakeUnique( - context(), SpvOpBranchConditional, 0, 0, - std::initializer_list{{SPV_OPERAND_TYPE_ID, {load_id}}, - {SPV_OPERAND_TYPE_ID, {new_merge->id()}}, - {SPV_OPERAND_TYPE_ID, {old_body->id()}}})); - get_def_use_mgr()->AnalyzeInstUse(block->terminator()); - context()->set_instr_block(block->terminator(), block); - - assert(old_body->begin() != old_body->end()); - assert(block->begin() != block->end()); - assert(new_merge->begin() != new_merge->end()); - - // Update the cfg - cfg()->AddEdges(block); - cfg()->RegisterBlock(old_body); - if (old_body != tail_block) { - cfg()->AddEdges(tail_block); - } - cfg()->RegisterBlock(new_merge); - MarkForNewPhiNodes(new_merge, tail_block); -} - -void MergeReturnPass::BreakFromConstruct( - BasicBlock* block, BasicBlock* merge_block, - std::unordered_set* predicated, - std::list* order) { - // Make sure the cfg is build here. If we don't then it becomes very hard - // to know which new blocks need to be updated. - context()->BuildInvalidAnalyses(IRContext::kAnalysisCFG); - - // When predicating, be aware of whether this block is a header block, a - // merge block or both. - // - // If this block is a merge block, ensure the appropriate header stays - // up-to-date with any changes (i.e. points to the pre-header). - // - // If this block is a header block, predicate the entire structured - // subgraph. This can act recursively. - - // If |block| is a loop header, then the back edge must jump to the original - // code, not the new header. - if (block->GetLoopMergeInst()) { - cfg()->SplitLoopHeader(block); - } - - // Leave the phi instructions behind. - auto iter = block->begin(); - while (iter->opcode() == SpvOpPhi) { - ++iter; - } - - // Forget about the edges leaving block. They will be removed. - cfg()->RemoveSuccessorEdges(block); - - std::unique_ptr new_block( - block->SplitBasicBlock(context(), TakeNextId(), iter)); - BasicBlock* old_body = - function_->InsertBasicBlockAfter(std::move(new_block), block); - predicated->insert(old_body); - // Update |order| so old_block will be traversed. InsertAfterElement(block, old_body, order); @@ -556,34 +416,24 @@ void MergeReturnPass::BreakFromConstruct( // 1. Load of the return status flag // 2. Branch to |merge_block| (true) or old body (false) // 3. Update OpPhi instructions in |merge_block|. + // 4. Update the CFG. // // Sine we are branching to the merge block of the current construct, there is // no need for an OpSelectionMerge. + InstructionBuilder builder( + context(), block, + IRContext::kAnalysisDefUse | IRContext::kAnalysisInstrToBlockMapping); // 1. Load of the return status flag analysis::Bool bool_type; uint32_t bool_id = context()->get_type_mgr()->GetId(&bool_type); assert(bool_id != 0); - uint32_t load_id = TakeNextId(); - block->AddInstruction(MakeUnique( - context(), SpvOpLoad, bool_id, load_id, - std::initializer_list{ - {SPV_OPERAND_TYPE_ID, {return_flag_->result_id()}}})); - get_def_use_mgr()->AnalyzeInstDefUse(block->terminator()); - context()->set_instr_block(block->terminator(), block); + uint32_t load_id = + builder.AddLoad(bool_id, return_flag_->result_id())->result_id(); // 2. Branch to |merge_block| (true) or |old_body| (false) - block->AddInstruction(MakeUnique( - context(), SpvOpBranchConditional, 0, 0, - std::initializer_list{{SPV_OPERAND_TYPE_ID, {load_id}}, - {SPV_OPERAND_TYPE_ID, {merge_block->id()}}, - {SPV_OPERAND_TYPE_ID, {old_body->id()}}})); - get_def_use_mgr()->AnalyzeInstUse(block->terminator()); - context()->set_instr_block(block->terminator(), block); - - // Update the cfg - cfg()->AddEdges(block); - cfg()->RegisterBlock(old_body); + builder.AddConditionalBranch(load_id, merge_block->id(), old_body->id(), + old_body->id()); // 3. Update OpPhi instructions in |merge_block|. BasicBlock* merge_original_pred = MarkedSinglePred(merge_block); @@ -593,8 +443,15 @@ void MergeReturnPass::BreakFromConstruct( MarkForNewPhiNodes(merge_block, old_body); } + // 4. Update the CFG. We do this after updating the OpPhi instructions + // because |UpdatePhiNodes| assumes the edge from |block| has not been added + // to the CFG yet. + cfg()->AddEdges(block); + cfg()->RegisterBlock(old_body); + assert(old_body->begin() != old_body->end()); assert(block->begin() != block->end()); + return true; } void MergeReturnPass::RecordReturned(BasicBlock* block) { @@ -786,8 +643,10 @@ void MergeReturnPass::AddNewPhiNodes() { cfg()->ComputeStructuredOrder(function_, &*function_->begin(), &order); for (BasicBlock* bb : order) { - AddNewPhiNodes(bb, new_merge_nodes_[bb], - dom_tree->ImmediateDominator(bb)->id()); + BasicBlock* dominator = dom_tree->ImmediateDominator(bb); + if (dominator) { + AddNewPhiNodes(bb, new_merge_nodes_[bb], dominator->id()); + } } } @@ -820,5 +679,138 @@ void MergeReturnPass::InsertAfterElement(BasicBlock* element, list->insert(pos, new_element); } +void MergeReturnPass::AddDummyLoopAroundFunction() { + CreateReturnBlock(); + CreateReturn(final_return_block_); + + if (context()->AreAnalysesValid(IRContext::kAnalysisCFG)) { + cfg()->RegisterBlock(final_return_block_); + } + + CreateDummyLoop(final_return_block_); +} + +BasicBlock* MergeReturnPass::CreateContinueTarget(uint32_t header_label_id) { + std::unique_ptr label( + new Instruction(context(), SpvOpLabel, 0u, TakeNextId(), {})); + + // Create the new basic block + std::unique_ptr block(new BasicBlock(std::move(label))); + + // Insert the new block just before the return block + auto pos = function_->end(); + assert(pos != function_->begin()); + pos--; + assert(pos != function_->begin()); + assert(&*pos == final_return_block_); + auto new_block = &*pos.InsertBefore(std::move(block)); + new_block->SetParent(function_); + + context()->AnalyzeDefUse(new_block->GetLabelInst()); + context()->set_instr_block(new_block->GetLabelInst(), new_block); + + InstructionBuilder builder( + context(), new_block, + IRContext::kAnalysisDefUse | IRContext::kAnalysisInstrToBlockMapping); + + builder.AddBranch(header_label_id); + + if (context()->AreAnalysesValid(IRContext::kAnalysisCFG)) { + cfg()->RegisterBlock(new_block); + } + + return new_block; +} + +void MergeReturnPass::CreateDummyLoop(BasicBlock* merge_target) { + std::unique_ptr label( + new Instruction(context(), SpvOpLabel, 0u, TakeNextId(), {})); + + // Create the new basic block + std::unique_ptr block(new BasicBlock(std::move(label))); + + // Insert the new block before any code is run. We have to split the entry + // block to make sure the OpVariable instructions remain in the entry block. + BasicBlock* start_block = &*function_->begin(); + auto split_pos = start_block->begin(); + while (split_pos->opcode() == SpvOpVariable) { + ++split_pos; + } + + BasicBlock* old_block = + start_block->SplitBasicBlock(context(), TakeNextId(), split_pos); + + // The new block must be inserted after the entry block. We cannot make the + // entry block the header for the dummy loop because it is not valid to have a + // branch to the entry block, and the continue target must branch back to the + // loop header. + auto pos = function_->begin(); + pos++; + BasicBlock* header_block = &*pos.InsertBefore(std::move(block)); + context()->AnalyzeDefUse(header_block->GetLabelInst()); + header_block->SetParent(function_); + + // We have to create the continue block before OpLoopMerge instruction. + // Otherwise the def-use manager will compalain that there is a use without a + // definition. + uint32_t continue_target = CreateContinueTarget(header_block->id())->id(); + + // Add the code the the header block. + InstructionBuilder builder( + context(), header_block, + IRContext::kAnalysisDefUse | IRContext::kAnalysisInstrToBlockMapping); + + builder.AddLoopMerge(merge_target->id(), continue_target); + builder.AddBranch(old_block->id()); + + // Fix up the entry block by adding a branch to the loop header. + InstructionBuilder builder2( + context(), start_block, + IRContext::kAnalysisDefUse | IRContext::kAnalysisInstrToBlockMapping); + builder2.AddBranch(header_block->id()); + + if (context()->AreAnalysesValid(IRContext::kAnalysisCFG)) { + cfg()->RegisterBlock(old_block); + cfg()->RegisterBlock(header_block); + cfg()->AddEdges(start_block); + } +} + +bool MergeReturnPass::HasNontrivialUnreachableBlocks(Function* function) { + utils::BitVector reachable_blocks; + cfg()->ForEachBlockInPostOrder( + function->entry().get(), + [&reachable_blocks](BasicBlock* bb) { reachable_blocks.Set(bb->id()); }); + + for (auto& bb : *function) { + if (reachable_blocks.Get(bb.id())) { + continue; + } + + StructuredCFGAnalysis* struct_cfg_analysis = + context()->GetStructuredCFGAnalysis(); + if (struct_cfg_analysis->IsMergeBlock(bb.id())) { + // |bb| must be an empty block ending with OpUnreachable. + if (bb.begin()->opcode() != SpvOpUnreachable) { + return true; + } + } else if (struct_cfg_analysis->IsContinueBlock(bb.id())) { + // |bb| must be an empty block ending with a branch to the header. + Instruction* inst = &*bb.begin(); + if (inst->opcode() != SpvOpBranch) { + return true; + } + + if (inst->GetSingleWordInOperand(0) != + struct_cfg_analysis->ContainingLoop(bb.id())) { + return true; + } + } else { + return true; + } + } + return false; +} + } // namespace opt } // namespace spvtools diff --git a/3rdparty/spirv-tools/source/opt/merge_return_pass.h b/3rdparty/spirv-tools/source/opt/merge_return_pass.h index 472d059fe..d7e18f0c5 100644 --- a/3rdparty/spirv-tools/source/opt/merge_return_pass.h +++ b/3rdparty/spirv-tools/source/opt/merge_return_pass.h @@ -30,13 +30,13 @@ namespace opt { * * Handling Structured Control Flow: * - * Structured control flow guarantees that the CFG will reconverge at a given + * Structured control flow guarantees that the CFG will converge at a given * point (the merge block). Within structured control flow, all blocks must be * post-dominated by the merge block, except return blocks and break blocks. * A break block is a block that branches to the innermost loop's merge block. * * Beyond this, we further assume that all unreachable blocks have been - * cleanedup. This means that the only unreachable blocks are those necessary + * cleaned up. This means that the only unreachable blocks are those necessary * for valid structured control flow. * * Algorithm: @@ -46,14 +46,13 @@ namespace opt { * with a branch. If current block is not within structured control flow, this * is the final return. This block should branch to the new return block (its * direct successor). If the current block is within structured control flow, - * the branch destination should be the innermost loop's merge (if it exists) - * or the merge block of the immediate structured control flow. If the merge - * block produces any live values it will need to be predicated. While the merge - * is nested in structured control flow, the predication path should branch to - * the next best merge block available. Once structured control flow has been - * exited, remaining blocks must be predicated with new structured control flow - * (OpSelectionMerge). These should be nested correctly in case of straight line - * branching to reach the final return block. + * the branch destination should be the innermost loop's merge. This loop will + * always exist because a dummy loop is added around the entire function. + * If the merge block produces any live values it will need to be predicated. + * While the merge is nested in structured control flow, the predication path + *should branch to the merge block of the inner-most loop it is contained in. + *Once structured control flow has been exited, it will be at the merge of the + *dummy loop, with will simply return. * * In the final return block, the return value should be loaded and returned. * Memory promotion passes should be able to promote the newly introduced @@ -65,31 +64,29 @@ namespace opt { * that block produces value live beyond it). This needs to be done carefully. * The merge block should be split into multiple blocks. * - * 1 (header) + * 1 (loop header) * / \ * (ret) 2 3 (merge) * * || * \/ * - * 1 (header) - * / \ - * 2 | - * \ / - * 3 (merge for 1, new header) - * / \ - * | 3 (old body) - * \ / - * (ret) 4 (new merge) + * 0 (dummy loop header) + * | + * 1 (loop header) + * / \ + * 2 | (merge) + * \ / + * 3' (merge) + * / \ + * | 3 (original code in 3) + * \ / + * (ret) 4 (dummy loop merge) * * In the above (simple) example, the return originally in |2| is passed through * the merge. That merge is predicated such that the old body of the block is * the else branch. The branch condition is based on the value of the "has - * returned" variable. In more complicated examples (blocks between |1| and - * |3|), the SSA would need to fixed up due the newly reconvergent path at the - * merge for |1|. Assuming |3| originally was also a return block, the old body - * of |3| should also store the return value for that case. The return value in - * |4| just requires loading the return value variable. + * returned" variable. * ******************************************************************************/ @@ -107,8 +104,7 @@ class MergeReturnPass : public MemPass { Status Process() override; IRContext::Analysis GetPreservedAnalyses() override { - // return IRContext::kAnalysisDefUse; - return IRContext::kAnalysisNone; + return IRContext::kAnalysisConstants | IRContext::kAnalysisTypes; } private: @@ -167,7 +163,7 @@ class MergeReturnPass : public MemPass { // statement. It is assumed that |function| has structured control flow, and // that |return_blocks| is a list of all of the basic blocks in |function| // that have a return. - void ProcessStructured(Function* function, + bool ProcessStructured(Function* function, const std::vector& return_blocks); // Changes an OpReturn* or OpUnreachable instruction at the end of |block| @@ -209,12 +205,6 @@ class MergeReturnPass : public MemPass { // |AddReturnFlag| and |AddReturnValue| must have already been called. void BranchToBlock(BasicBlock* block, uint32_t target); - // Returns true if we need to predicate |block| where |tail_block| is the - // merge point. (See |PredicateBlocks|). There is no need to predicate if - // there is no code that could be executed. - bool RequiresPredication(const BasicBlock* block, - const BasicBlock* tail_block) const; - // For every basic block that is reachable from |return_block|, extra code is // added to jump around any code that should not be executed because the // original code would have already returned. This involves adding new @@ -222,29 +212,25 @@ class MergeReturnPass : public MemPass { // // If new blocks that are created will be added to |order|. This way a call // can traverse these new block in structured order. - void PredicateBlocks(BasicBlock* return_block, + // + // Returns true if successful. + bool PredicateBlocks(BasicBlock* return_block, std::unordered_set* pSet, std::list* order); // Add a conditional branch at the start of |block| that either jumps to - // |merge_block| or the original code in |block| depending on the value in - // |return_flag_|. + // the merge block of |loop_merge_inst| or the original code in |block| + // depending on the value in |return_flag_|. The continue target in + // |loop_merge_inst| will be updated if needed. // // If new blocks that are created will be added to |order|. This way a call // can traverse these new block in structured order. - void BreakFromConstruct(BasicBlock* block, BasicBlock* merge_block, + // + // Returns true if successful. + bool BreakFromConstruct(BasicBlock* block, std::unordered_set* predicated, - std::list* order); - - // Add the predication code (see |PredicateBlocks|) to |tail_block| if it - // requires predication. |tail_block| and any new blocks that are known to - // not require predication will be added to |predicated|. - // - // If new blocks that are created will be added to |order|. This way a call - // can traverse these new block in structured order. - void PredicateBlock(BasicBlock* block, BasicBlock* tail_block, - std::unordered_set* predicated, - std::list* order); + std::list* order, + Instruction* loop_merge_inst); // Add an |OpReturn| or |OpReturnValue| to the end of |block|. If an // |OpReturnValue| is needed, the return value is loaded from |return_value_|. @@ -291,6 +277,8 @@ class MergeReturnPass : public MemPass { // new edge from |new_source|. The value for that edge will be an Undef. If // |target| only had a single predecessor, then it is marked as needing new // phi nodes. See |MarkForNewPhiNodes|. + // + // The CFG must not include the edge from |new_source| to |target| yet. void UpdatePhiNodes(BasicBlock* new_source, BasicBlock* target); StructuredControlState& CurrentState() { return state_.back(); } @@ -300,6 +288,20 @@ class MergeReturnPass : public MemPass { void InsertAfterElement(BasicBlock* element, BasicBlock* new_element, std::list* list); + // Creates a single iteration loop around all of the exectuable code of the + // current function and returns after the loop is done. Sets + // |final_return_block_|. + void AddDummyLoopAroundFunction(); + + // Creates a new basic block that branches to |header_label_id|. Returns the + // new basic block. The block will be the second last basic block in the + // function. + BasicBlock* CreateContinueTarget(uint32_t header_label_id); + + // Creates a loop around the executable code of the function with + // |merge_target| as the merge node. + void CreateDummyLoop(BasicBlock* merge_target); + // A stack used to keep track of the innermost contain loop and selection // constructs. std::vector state_; @@ -328,6 +330,7 @@ class MergeReturnPass : public MemPass { // it is mapped to it original single predcessor. It is assumed there are no // values that will need a phi on the new edges. std::unordered_map new_merge_nodes_; + bool HasNontrivialUnreachableBlocks(Function* function); }; } // namespace opt diff --git a/3rdparty/spirv-tools/source/opt/module.cpp b/3rdparty/spirv-tools/source/opt/module.cpp index 6d024b5bc..04e4e9733 100644 --- a/3rdparty/spirv-tools/source/opt/module.cpp +++ b/3rdparty/spirv-tools/source/opt/module.cpp @@ -19,11 +19,24 @@ #include #include "source/operand.h" +#include "source/opt/ir_context.h" #include "source/opt/reflect.h" namespace spvtools { namespace opt { +uint32_t Module::TakeNextIdBound() { + if (context()) { + if (id_bound() >= context()->max_id_bound()) { + return 0; + } + } else if (id_bound() >= kDefaultMaxIdBound) { + return 0; + } + + return header_.bound++; +} + std::vector Module::GetTypes() { std::vector type_insts; for (auto& inst : types_values_) { diff --git a/3rdparty/spirv-tools/source/opt/module.h b/3rdparty/spirv-tools/source/opt/module.h index eca8cc779..ede0bbbf3 100644 --- a/3rdparty/spirv-tools/source/opt/module.h +++ b/3rdparty/spirv-tools/source/opt/module.h @@ -53,14 +53,22 @@ class Module { // Sets the header to the given |header|. void SetHeader(const ModuleHeader& header) { header_ = header; } - // Sets the Id bound. - void SetIdBound(uint32_t bound) { header_.bound = bound; } + // Sets the Id bound. The Id bound cannot be set to 0. + void SetIdBound(uint32_t bound) { + assert(bound != 0); + header_.bound = bound; + } // Returns the Id bound. uint32_t IdBound() { return header_.bound; } // Returns the current Id bound and increases it to the next available value. - uint32_t TakeNextIdBound() { return header_.bound++; } + // If the id bound has already reached its maximum value, then 0 is returned. + // The maximum value for the id bound is obtained from the context. If there + // is none, then the minimum that limit can be according to the spir-v + // specification. + // TODO(1841): Update the uses to check for a 0 return value. + uint32_t TakeNextIdBound(); // Appends a capability instruction to this module. inline void AddCapability(std::unique_ptr c); diff --git a/3rdparty/spirv-tools/source/opt/optimizer.cpp b/3rdparty/spirv-tools/source/opt/optimizer.cpp index 30654869c..fb58eedb2 100644 --- a/3rdparty/spirv-tools/source/opt/optimizer.cpp +++ b/3rdparty/spirv-tools/source/opt/optimizer.cpp @@ -20,13 +20,13 @@ #include #include +#include #include "source/opt/build_module.h" #include "source/opt/log.h" #include "source/opt/pass_manager.h" #include "source/opt/passes.h" -#include "source/opt/reduce_load_size.h" -#include "source/opt/simplification_pass.h" #include "source/util/make_unique.h" +#include "source/util/string_utils.h" namespace spvtools { @@ -56,7 +56,7 @@ Optimizer::PassToken::~PassToken() {} struct Optimizer::Impl { explicit Impl(spv_target_env env) : target_env(env), pass_manager() {} - const spv_target_env target_env; // Target environment. + spv_target_env target_env; // Target environment. opt::PassManager pass_manager; // Internal implementation pass manager. }; @@ -131,6 +131,7 @@ Optimizer& Optimizer::RegisterLegalizationPasses() { // Propagate constants to get as many constant conditions on branches // as possible. .RegisterPass(CreateCCPPass()) + .RegisterPass(CreateLoopUnrollPass(true)) .RegisterPass(CreateDeadBranchElimPass()) // Copy propagate members. Cleans up code sequences generated by // scalar replacement. Also important for removing OpPhi nodes. @@ -148,7 +149,8 @@ Optimizer& Optimizer::RegisterLegalizationPasses() { } Optimizer& Optimizer::RegisterPerformancePasses() { - return RegisterPass(CreateMergeReturnPass()) + return RegisterPass(CreateDeadBranchElimPass()) + .RegisterPass(CreateMergeReturnPass()) .RegisterPass(CreateInlineExhaustivePass()) .RegisterPass(CreateAggressiveDCEPass()) .RegisterPass(CreatePrivateToLocalPass()) @@ -185,7 +187,8 @@ Optimizer& Optimizer::RegisterPerformancePasses() { } Optimizer& Optimizer::RegisterSizePasses() { - return RegisterPass(CreateMergeReturnPass()) + return RegisterPass(CreateDeadBranchElimPass()) + .RegisterPass(CreateMergeReturnPass()) .RegisterPass(CreateInlineExhaustivePass()) .RegisterPass(CreateAggressiveDCEPass()) .RegisterPass(CreatePrivateToLocalPass()) @@ -213,6 +216,11 @@ Optimizer& Optimizer::RegisterSizePasses() { .RegisterPass(CreateAggressiveDCEPass()); } +Optimizer& Optimizer::RegisterWebGPUPasses() { + return RegisterPass(CreateAggressiveDCEPass()) + .RegisterPass(CreateDeadBranchElimPass()); +} + bool Optimizer::RegisterPassesFromFlags(const std::vector& flags) { for (const auto& flag : flags) { if (!RegisterPassFromFlag(flag)) { @@ -223,29 +231,6 @@ bool Optimizer::RegisterPassesFromFlags(const std::vector& flags) { return true; } -namespace { - -// Splits the string |flag|, of the form '--pass_name[=pass_args]' into two -// strings "pass_name" and "pass_args". If |flag| has no arguments, the second -// string will be empty. -std::pair SplitFlagArgs(const std::string& flag) { - if (flag.size() < 2) return make_pair(flag, std::string()); - - // Detect the last dash before the pass name. Since we have to - // handle single dash options (-O and -Os), count up to two dashes. - size_t dash_ix = 0; - if (flag[0] == '-' && flag[1] == '-') - dash_ix = 2; - else if (flag[0] == '-') - dash_ix = 1; - - size_t ix = flag.find('='); - return (ix != std::string::npos) - ? make_pair(flag.substr(dash_ix, ix - 2), flag.substr(ix + 1)) - : make_pair(flag.substr(dash_ix), std::string()); -} -} // namespace - bool Optimizer::FlagHasValidForm(const std::string& flag) const { if (flag == "-O" || flag == "-Os") { return true; @@ -267,7 +252,7 @@ bool Optimizer::RegisterPassFromFlag(const std::string& flag) { } // Split flags of the form --pass_name=pass_args. - auto p = SplitFlagArgs(flag); + auto p = utils::SplitFlagArgs(flag); std::string pass_name = p.first; std::string pass_args = p.second; @@ -316,6 +301,10 @@ bool Optimizer::RegisterPassFromFlag(const std::string& flag) { RegisterPass(CreateLocalAccessChainConvertPass()); } else if (pass_name == "eliminate-dead-code-aggressive") { RegisterPass(CreateAggressiveDCEPass()); + } else if (pass_name == "propagate-line-info") { + RegisterPass(CreatePropagateLineInfoPass()); + } else if (pass_name == "eliminate-redundant-line-info") { + RegisterPass(CreateRedundantLineInfoElimPass()); } else if (pass_name == "eliminate-insert-extract") { RegisterPass(CreateInsertExtractElimPass()); } else if (pass_name == "eliminate-local-single-block") { @@ -348,12 +337,16 @@ bool Optimizer::RegisterPassFromFlag(const std::string& flag) { if (pass_args.size() == 0) { RegisterPass(CreateScalarReplacementPass()); } else { - int limit = atoi(pass_args.c_str()); - if (limit > 0) { + int limit = -1; + if (pass_args.find_first_not_of("0123456789") == std::string::npos) { + limit = atoi(pass_args.c_str()); + } + + if (limit >= 0) { RegisterPass(CreateScalarReplacementPass(limit)); } else { Error(consumer(), nullptr, {}, - "--scalar-replacement must have no arguments or a positive " + "--scalar-replacement must have no arguments or a non-negative " "integer argument"); return false; } @@ -384,6 +377,12 @@ bool Optimizer::RegisterPassFromFlag(const std::string& flag) { RegisterPass(CreateWorkaround1209Pass()); } else if (pass_name == "replace-invalid-opcode") { RegisterPass(CreateReplaceInvalidOpcodePass()); + } else if (pass_name == "inst-bindless-check") { + RegisterPass(CreateInstBindlessCheckPass(7, 23)); + RegisterPass(CreateSimplificationPass()); + RegisterPass(CreateDeadBranchElimPass()); + RegisterPass(CreateBlockMergePass()); + RegisterPass(CreateAggressiveDCEPass()); } else if (pass_name == "simplify-instructions") { RegisterPass(CreateSimplificationPass()); } else if (pass_name == "ssa-rewrite") { @@ -414,6 +413,8 @@ bool Optimizer::RegisterPassFromFlag(const std::string& flag) { } } else if (pass_name == "loop-unroll") { RegisterPass(CreateLoopUnrollPass(true)); + } else if (pass_name == "upgrade-memory-model") { + RegisterPass(CreateUpgradeMemoryModelPass()); } else if (pass_name == "vector-dce") { RegisterPass(CreateVectorDCEPass()); } else if (pass_name == "loop-unroll-partial") { @@ -454,22 +455,38 @@ bool Optimizer::RegisterPassFromFlag(const std::string& flag) { return true; } +void Optimizer::SetTargetEnv(const spv_target_env env) { + impl_->target_env = env; +} + bool Optimizer::Run(const uint32_t* original_binary, const size_t original_binary_size, std::vector* optimized_binary) const { return Run(original_binary, original_binary_size, optimized_binary, - ValidatorOptions()); + OptimizerOptions()); } bool Optimizer::Run(const uint32_t* original_binary, const size_t original_binary_size, std::vector* optimized_binary, - const ValidatorOptions& options, + const ValidatorOptions& validator_options, bool skip_validation) const { + OptimizerOptions opt_options; + opt_options.set_run_validator(!skip_validation); + opt_options.set_validator_options(validator_options); + return Run(original_binary, original_binary_size, optimized_binary, + opt_options); +} + +bool Optimizer::Run(const uint32_t* original_binary, + const size_t original_binary_size, + std::vector* optimized_binary, + const spv_optimizer_options opt_options) const { spvtools::SpirvTools tools(impl_->target_env); tools.SetMessageConsumer(impl_->pass_manager.consumer()); - if (!skip_validation && - !tools.Validate(original_binary, original_binary_size, options)) { + if (opt_options->run_validator_ && + !tools.Validate(original_binary, original_binary_size, + &opt_options->val_options_)) { return false; } @@ -477,6 +494,8 @@ bool Optimizer::Run(const uint32_t* original_binary, impl_->target_env, consumer(), original_binary, original_binary_size); if (context == nullptr) return false; + context->set_max_id_bound(opt_options->max_id_bound_); + auto status = impl_->pass_manager.Run(context.get()); if (status == opt::Pass::Status::SuccessWithChange || (status == opt::Pass::Status::SuccessWithoutChange && @@ -620,6 +639,16 @@ Optimizer::PassToken CreateAggressiveDCEPass() { MakeUnique()); } +Optimizer::PassToken CreatePropagateLineInfoPass() { + return MakeUnique( + MakeUnique(opt::kLinesPropagateLines)); +} + +Optimizer::PassToken CreateRedundantLineInfoElimPass() { + return MakeUnique( + MakeUnique(opt::kLinesEliminateDeadLines)); +} + Optimizer::PassToken CreateCommonUniformElimPass() { return MakeUnique( MakeUnique()); @@ -749,4 +778,16 @@ Optimizer::PassToken CreateCombineAccessChainsPass() { return MakeUnique( MakeUnique()); } + +Optimizer::PassToken CreateUpgradeMemoryModelPass() { + return MakeUnique( + MakeUnique()); +} + +Optimizer::PassToken CreateInstBindlessCheckPass(uint32_t desc_set, + uint32_t shader_id) { + return MakeUnique( + MakeUnique(desc_set, shader_id)); +} + } // namespace spvtools diff --git a/3rdparty/spirv-tools/source/opt/pass.cpp b/3rdparty/spirv-tools/source/opt/pass.cpp index 4c4a232c6..edcd24516 100644 --- a/3rdparty/spirv-tools/source/opt/pass.cpp +++ b/3rdparty/spirv-tools/source/opt/pass.cpp @@ -23,85 +23,12 @@ namespace opt { namespace { -const uint32_t kEntryPointFunctionIdInIdx = 1; const uint32_t kTypePointerTypeIdInIdx = 1; } // namespace Pass::Pass() : consumer_(nullptr), context_(nullptr), already_run_(false) {} -void Pass::AddCalls(Function* func, std::queue* todo) { - for (auto bi = func->begin(); bi != func->end(); ++bi) - for (auto ii = bi->begin(); ii != bi->end(); ++ii) - if (ii->opcode() == SpvOpFunctionCall) - todo->push(ii->GetSingleWordInOperand(0)); -} - -bool Pass::ProcessEntryPointCallTree(ProcessFunction& pfn, Module* module) { - // Map from function's result id to function - std::unordered_map id2function; - for (auto& fn : *module) id2function[fn.result_id()] = &fn; - - // Collect all of the entry points as the roots. - std::queue roots; - for (auto& e : module->entry_points()) - roots.push(e.GetSingleWordInOperand(kEntryPointFunctionIdInIdx)); - return ProcessCallTreeFromRoots(pfn, id2function, &roots); -} - -bool Pass::ProcessReachableCallTree(ProcessFunction& pfn, - IRContext* irContext) { - // Map from function's result id to function - std::unordered_map id2function; - for (auto& fn : *irContext->module()) id2function[fn.result_id()] = &fn; - - std::queue roots; - - // Add all entry points since they can be reached from outside the module. - for (auto& e : irContext->module()->entry_points()) - roots.push(e.GetSingleWordInOperand(kEntryPointFunctionIdInIdx)); - - // Add all exported functions since they can be reached from outside the - // module. - for (auto& a : irContext->annotations()) { - // TODO: Handle group decorations as well. Currently not generate by any - // front-end, but could be coming. - if (a.opcode() == SpvOp::SpvOpDecorate) { - if (a.GetSingleWordOperand(1) == - SpvDecoration::SpvDecorationLinkageAttributes) { - uint32_t lastOperand = a.NumOperands() - 1; - if (a.GetSingleWordOperand(lastOperand) == - SpvLinkageType::SpvLinkageTypeExport) { - uint32_t id = a.GetSingleWordOperand(0); - if (id2function.count(id) != 0) roots.push(id); - } - } - } - } - - return ProcessCallTreeFromRoots(pfn, id2function, &roots); -} - -bool Pass::ProcessCallTreeFromRoots( - ProcessFunction& pfn, - const std::unordered_map& id2function, - std::queue* roots) { - // Process call tree - bool modified = false; - std::unordered_set done; - - while (!roots->empty()) { - const uint32_t fi = roots->front(); - roots->pop(); - if (done.insert(fi).second) { - Function* fn = id2function.at(fi); - modified = pfn(fn) || modified; - AddCalls(fn, roots); - } - } - return modified; -} - Pass::Status Pass::Run(IRContext* ctx) { if (already_run_) { return Status::Failure; diff --git a/3rdparty/spirv-tools/source/opt/pass.h b/3rdparty/spirv-tools/source/opt/pass.h index df1745099..c95f5022b 100644 --- a/3rdparty/spirv-tools/source/opt/pass.h +++ b/3rdparty/spirv-tools/source/opt/pass.h @@ -17,7 +17,6 @@ #include #include -#include #include #include #include @@ -91,28 +90,6 @@ class Pass { // Returns a pointer to the CFG for current module. CFG* cfg() const { return context()->cfg(); } - // Add to |todo| all ids of functions called in |func|. - void AddCalls(Function* func, std::queue* todo); - - // Applies |pfn| to every function in the call trees that are rooted at the - // entry points. Returns true if any call |pfn| returns true. By convention - // |pfn| should return true if it modified the module. - bool ProcessEntryPointCallTree(ProcessFunction& pfn, Module* module); - - // Applies |pfn| to every function in the call trees rooted at the entry - // points and exported functions. Returns true if any call |pfn| returns - // true. By convention |pfn| should return true if it modified the module. - bool ProcessReachableCallTree(ProcessFunction& pfn, IRContext* irContext); - - // Applies |pfn| to every function in the call trees rooted at the elements of - // |roots|. Returns true if any call to |pfn| returns true. By convention - // |pfn| should return true if it modified the module. After returning - // |roots| will be empty. - bool ProcessCallTreeFromRoots( - ProcessFunction& pfn, - const std::unordered_map& id2function, - std::queue* roots); - // Run the pass on the given |module|. Returns Status::Failure if errors occur // when processing. Returns the corresponding Status::Success if processing is // successful to indicate whether changes are made to the module. If there @@ -145,6 +122,7 @@ class Pass { virtual Status Process() = 0; // Return the next available SSA id and increment it. + // TODO(1841): Handle id overflow. uint32_t TakeNextId() { return context_->TakeNextId(); } private: @@ -159,6 +137,10 @@ class Pass { bool already_run_; }; +inline Pass::Status CombineStatus(Pass::Status a, Pass::Status b) { + return std::min(a, b); +} + } // namespace opt } // namespace spvtools diff --git a/3rdparty/spirv-tools/source/opt/passes.h b/3rdparty/spirv-tools/source/opt/passes.h index 42106c8f7..b9f30ae57 100644 --- a/3rdparty/spirv-tools/source/opt/passes.h +++ b/3rdparty/spirv-tools/source/opt/passes.h @@ -36,6 +36,7 @@ #include "source/opt/if_conversion.h" #include "source/opt/inline_exhaustive_pass.h" #include "source/opt/inline_opaque_pass.h" +#include "source/opt/inst_bindless_check_pass.h" #include "source/opt/licm_pass.h" #include "source/opt/local_access_chain_convert_pass.h" #include "source/opt/local_redundancy_elimination.h" @@ -50,17 +51,20 @@ #include "source/opt/merge_return_pass.h" #include "source/opt/null_pass.h" #include "source/opt/private_to_local_pass.h" +#include "source/opt/process_lines_pass.h" #include "source/opt/reduce_load_size.h" #include "source/opt/redundancy_elimination.h" #include "source/opt/remove_duplicates_pass.h" #include "source/opt/replace_invalid_opc.h" #include "source/opt/scalar_replacement_pass.h" #include "source/opt/set_spec_constant_default_value_pass.h" +#include "source/opt/simplification_pass.h" #include "source/opt/ssa_rewrite_pass.h" #include "source/opt/strength_reduction_pass.h" #include "source/opt/strip_debug_info_pass.h" #include "source/opt/strip_reflect_info_pass.h" #include "source/opt/unify_const_pass.h" +#include "source/opt/upgrade_memory_model.h" #include "source/opt/vector_dce.h" #include "source/opt/workaround1209.h" diff --git a/3rdparty/spirv-tools/source/opt/pch_source_opt.cpp b/3rdparty/spirv-tools/source/opt/pch_source_opt.cpp new file mode 100644 index 000000000..f45448dc5 --- /dev/null +++ b/3rdparty/spirv-tools/source/opt/pch_source_opt.cpp @@ -0,0 +1,15 @@ +// Copyright (c) 2018 The Khronos Group Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "pch_source_opt.h" diff --git a/3rdparty/spirv-tools/source/opt/pch_source_opt.h b/3rdparty/spirv-tools/source/opt/pch_source_opt.h new file mode 100644 index 000000000..73566510e --- /dev/null +++ b/3rdparty/spirv-tools/source/opt/pch_source_opt.h @@ -0,0 +1,32 @@ +// Copyright (c) 2018 The Khronos Group Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "source/opt/basic_block.h" +#include "source/opt/decoration_manager.h" +#include "source/opt/def_use_manager.h" +#include "source/opt/ir_context.h" +#include "source/opt/mem_pass.h" +#include "source/opt/module.h" +#include "source/opt/pass.h" +#include "source/util/hex_float.h" +#include "source/util/make_unique.h" diff --git a/3rdparty/spirv-tools/source/opt/private_to_local_pass.h b/3rdparty/spirv-tools/source/opt/private_to_local_pass.h index f706e6e91..467853030 100644 --- a/3rdparty/spirv-tools/source/opt/private_to_local_pass.h +++ b/3rdparty/spirv-tools/source/opt/private_to_local_pass.h @@ -35,7 +35,8 @@ class PrivateToLocalPass : public Pass { IRContext::kAnalysisInstrToBlockMapping | IRContext::kAnalysisDecorations | IRContext::kAnalysisCombinators | IRContext::kAnalysisCFG | IRContext::kAnalysisDominatorAnalysis | - IRContext::kAnalysisNameMap; + IRContext::kAnalysisNameMap | IRContext::kAnalysisConstants | + IRContext::kAnalysisTypes; } private: diff --git a/3rdparty/spirv-tools/source/opt/process_lines_pass.cpp b/3rdparty/spirv-tools/source/opt/process_lines_pass.cpp new file mode 100644 index 000000000..0ae2f7583 --- /dev/null +++ b/3rdparty/spirv-tools/source/opt/process_lines_pass.cpp @@ -0,0 +1,157 @@ +// Copyright (c) 2018 The Khronos Group Inc. +// Copyright (c) 2018 Valve Corporation +// Copyright (c) 2018 LunarG Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "source/opt/process_lines_pass.h" + +#include +#include +#include + +namespace { + +// Input Operand Indices +static const int kSpvLineFileInIdx = 0; +static const int kSpvLineLineInIdx = 1; +static const int kSpvLineColInIdx = 2; + +} // anonymous namespace + +namespace spvtools { +namespace opt { + +Pass::Status ProcessLinesPass::Process() { + bool modified = ProcessLines(); + return (modified ? Status::SuccessWithChange : Status::SuccessWithoutChange); +} + +bool ProcessLinesPass::ProcessLines() { + bool modified = false; + uint32_t file_id = 0; + uint32_t line = 0; + uint32_t col = 0; + // Process types, globals, constants + for (Instruction& inst : get_module()->types_values()) + modified |= line_process_func_(&inst, &file_id, &line, &col); + // Process functions + for (Function& function : *get_module()) { + modified |= line_process_func_(&function.DefInst(), &file_id, &line, &col); + function.ForEachParam( + [this, &modified, &file_id, &line, &col](Instruction* param) { + modified |= line_process_func_(param, &file_id, &line, &col); + }); + for (BasicBlock& block : function) { + modified |= + line_process_func_(block.GetLabelInst(), &file_id, &line, &col); + for (Instruction& inst : block) { + modified |= line_process_func_(&inst, &file_id, &line, &col); + // Don't process terminal instruction if preceeded by merge + if (inst.opcode() == SpvOpSelectionMerge || + inst.opcode() == SpvOpLoopMerge) + break; + } + // Nullify line info after each block. + file_id = 0; + } + modified |= line_process_func_(function.EndInst(), &file_id, &line, &col); + } + return modified; +} + +bool ProcessLinesPass::PropagateLine(Instruction* inst, uint32_t* file_id, + uint32_t* line, uint32_t* col) { + bool modified = false; + // only the last debug instruction needs to be considered + auto line_itr = inst->dbg_line_insts().rbegin(); + // if no line instructions, propagate previous info + if (line_itr == inst->dbg_line_insts().rend()) { + // if no current line info, add OpNoLine, else OpLine + if (*file_id == 0) + inst->dbg_line_insts().push_back(Instruction(context(), SpvOpNoLine)); + else + inst->dbg_line_insts().push_back(Instruction( + context(), SpvOpLine, 0, 0, + {{spv_operand_type_t::SPV_OPERAND_TYPE_ID, {*file_id}}, + {spv_operand_type_t::SPV_OPERAND_TYPE_LITERAL_INTEGER, {*line}}, + {spv_operand_type_t::SPV_OPERAND_TYPE_LITERAL_INTEGER, {*col}}})); + modified = true; + } else { + // else pre-existing line instruction, so update source line info + if (line_itr->opcode() == SpvOpNoLine) { + *file_id = 0; + } else { + assert(line_itr->opcode() == SpvOpLine && "unexpected debug inst"); + *file_id = line_itr->GetSingleWordInOperand(kSpvLineFileInIdx); + *line = line_itr->GetSingleWordInOperand(kSpvLineLineInIdx); + *col = line_itr->GetSingleWordInOperand(kSpvLineColInIdx); + } + } + return modified; +} + +bool ProcessLinesPass::EliminateDeadLines(Instruction* inst, uint32_t* file_id, + uint32_t* line, uint32_t* col) { + // If no debug line instructions, return without modifying lines + if (inst->dbg_line_insts().empty()) return false; + // Only the last debug instruction needs to be considered; delete all others + bool modified = inst->dbg_line_insts().size() > 1; + Instruction last_inst = inst->dbg_line_insts().back(); + inst->dbg_line_insts().clear(); + // If last line is OpNoLine + if (last_inst.opcode() == SpvOpNoLine) { + // If no propagated line info, throw away redundant OpNoLine + if (*file_id == 0) { + modified = true; + // Else replace OpNoLine and propagate no line info + } else { + inst->dbg_line_insts().push_back(last_inst); + *file_id = 0; + } + } else { + // Else last line is OpLine + assert(last_inst.opcode() == SpvOpLine && "unexpected debug inst"); + // If propagated info matches last line, throw away last line + if (*file_id == last_inst.GetSingleWordInOperand(kSpvLineFileInIdx) && + *line == last_inst.GetSingleWordInOperand(kSpvLineLineInIdx) && + *col == last_inst.GetSingleWordInOperand(kSpvLineColInIdx)) { + modified = true; + } else { + // Else replace last line and propagate line info + *file_id = last_inst.GetSingleWordInOperand(kSpvLineFileInIdx); + *line = last_inst.GetSingleWordInOperand(kSpvLineLineInIdx); + *col = last_inst.GetSingleWordInOperand(kSpvLineColInIdx); + inst->dbg_line_insts().push_back(last_inst); + } + } + return modified; +} + +ProcessLinesPass::ProcessLinesPass(uint32_t func_id) { + if (func_id == kLinesPropagateLines) { + line_process_func_ = [this](Instruction* inst, uint32_t* file_id, + uint32_t* line, uint32_t* col) { + return PropagateLine(inst, file_id, line, col); + }; + } else { + assert(func_id == kLinesEliminateDeadLines && "unknown Lines param"); + line_process_func_ = [this](Instruction* inst, uint32_t* file_id, + uint32_t* line, uint32_t* col) { + return EliminateDeadLines(inst, file_id, line, col); + }; + } +} + +} // namespace opt +} // namespace spvtools diff --git a/3rdparty/spirv-tools/source/opt/process_lines_pass.h b/3rdparty/spirv-tools/source/opt/process_lines_pass.h new file mode 100644 index 000000000..c988bfd0d --- /dev/null +++ b/3rdparty/spirv-tools/source/opt/process_lines_pass.h @@ -0,0 +1,87 @@ +// Copyright (c) 2018 The Khronos Group Inc. +// Copyright (c) 2018 Valve Corporation +// Copyright (c) 2018 LunarG Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef SOURCE_OPT_PROPAGATE_LINES_PASS_H_ +#define SOURCE_OPT_PROPAGATE_LINES_PASS_H_ + +#include "source/opt/function.h" +#include "source/opt/ir_context.h" +#include "source/opt/pass.h" + +namespace spvtools { +namespace opt { + +namespace { + +// Constructor Parameters +static const int kLinesPropagateLines = 0; +static const int kLinesEliminateDeadLines = 1; + +} // anonymous namespace + +// See optimizer.hpp for documentation. +class ProcessLinesPass : public Pass { + using LineProcessFunction = + std::function; + + public: + ProcessLinesPass(uint32_t func_id); + ~ProcessLinesPass() override = default; + + const char* name() const override { return "propagate-lines"; } + + // See optimizer.hpp for this pass' user documentation. + Status Process() override; + + IRContext::Analysis GetPreservedAnalyses() override { + return IRContext::kAnalysisDefUse | + IRContext::kAnalysisInstrToBlockMapping | + IRContext::kAnalysisDecorations | IRContext::kAnalysisCombinators | + IRContext::kAnalysisCFG | IRContext::kAnalysisDominatorAnalysis | + IRContext::kAnalysisNameMap | IRContext::kAnalysisConstants | + IRContext::kAnalysisTypes; + } + + private: + // If |inst| has no debug line instruction, create one with + // |file_id, line, col|. If |inst| has debug line instructions, set + // |file_id, line, col| from the last. |file_id| equals 0 indicates no line + // info is available. Return true if |inst| modified. + bool PropagateLine(Instruction* inst, uint32_t* file_id, uint32_t* line, + uint32_t* col); + + // If last debug line instruction of |inst| matches |file_id, line, col|, + // delete all debug line instructions of |inst|. If they do not match, + // replace all debug line instructions of |inst| with new line instruction + // set from |file_id, line, col|. If |inst| has no debug line instructions, + // do not modify |inst|. |file_id| equals 0 indicates no line info is + // available. Return true if |inst| modified. + bool EliminateDeadLines(Instruction* inst, uint32_t* file_id, uint32_t* line, + uint32_t* col); + + // Apply lpfn() to all type, constant, global variable and function + // instructions in their physical order. + bool ProcessLines(); + + // A function that calls either PropagateLine or EliminateDeadLines. + // Initialized by the class constructor. + LineProcessFunction line_process_func_; +}; + +} // namespace opt +} // namespace spvtools + +#endif // SOURCE_OPT_PROPAGATE_LINES_PASS_H_ diff --git a/3rdparty/spirv-tools/source/opt/reduce_load_size.cpp b/3rdparty/spirv-tools/source/opt/reduce_load_size.cpp index b692c6b54..7b5a015c4 100644 --- a/3rdparty/spirv-tools/source/opt/reduce_load_size.cpp +++ b/3rdparty/spirv-tools/source/opt/reduce_load_size.cpp @@ -139,7 +139,8 @@ bool ReduceLoadSize::ShouldReplaceExtract(Instruction* inst) { all_elements_used = !def_use_mgr->WhileEachUser(op_inst, [&elements_used](Instruction* use) { - if (use->opcode() != SpvOpCompositeExtract) { + if (use->opcode() != SpvOpCompositeExtract || + use->NumInOperands() == 1) { return false; } elements_used.insert(use->GetSingleWordInOperand(1)); diff --git a/3rdparty/spirv-tools/source/opt/reduce_load_size.h b/3rdparty/spirv-tools/source/opt/reduce_load_size.h index 724a430bb..ccac49be6 100644 --- a/3rdparty/spirv-tools/source/opt/reduce_load_size.h +++ b/3rdparty/spirv-tools/source/opt/reduce_load_size.h @@ -36,7 +36,8 @@ class ReduceLoadSize : public Pass { IRContext::kAnalysisInstrToBlockMapping | IRContext::kAnalysisCombinators | IRContext::kAnalysisCFG | IRContext::kAnalysisDominatorAnalysis | - IRContext::kAnalysisLoopAnalysis | IRContext::kAnalysisNameMap; + IRContext::kAnalysisLoopAnalysis | IRContext::kAnalysisNameMap | + IRContext::kAnalysisConstants | IRContext::kAnalysisTypes; } private: diff --git a/3rdparty/spirv-tools/source/opt/reflect.h b/3rdparty/spirv-tools/source/opt/reflect.h index fb2de7b15..79d90bda4 100644 --- a/3rdparty/spirv-tools/source/opt/reflect.h +++ b/3rdparty/spirv-tools/source/opt/reflect.h @@ -44,7 +44,8 @@ inline bool IsAnnotationInst(SpvOp opcode) { } inline bool IsTypeInst(SpvOp opcode) { return (opcode >= SpvOpTypeVoid && opcode <= SpvOpTypeForwardPointer) || - opcode == SpvOpTypePipeStorage || opcode == SpvOpTypeNamedBarrier; + opcode == SpvOpTypePipeStorage || opcode == SpvOpTypeNamedBarrier || + opcode == SpvOpTypeAccelerationStructureNV; } inline bool IsConstantInst(SpvOp opcode) { return opcode >= SpvOpConstantTrue && opcode <= SpvOpSpecConstantOp; diff --git a/3rdparty/spirv-tools/source/opt/scalar_replacement_pass.cpp b/3rdparty/spirv-tools/source/opt/scalar_replacement_pass.cpp index d51dd8ef2..80ff68a66 100644 --- a/3rdparty/spirv-tools/source/opt/scalar_replacement_pass.cpp +++ b/3rdparty/spirv-tools/source/opt/scalar_replacement_pass.cpp @@ -363,7 +363,7 @@ uint32_t ScalarReplacementPass::GetOrCreatePointerType(uint32_t id) { context()->get_type_mgr()->GetTypeAndPointerType(id, SpvStorageClassFunction); uint32_t ptrId = 0; - if (id == context()->get_type_mgr()->GetId(pointeeTy)) { + if (pointeeTy->IsUniqueType()) { // Non-ambiguous type, just ask the type manager for an id. ptrId = context()->get_type_mgr()->GetTypeInstruction(pointerTy.get()); pointee_to_pointer_[id] = ptrId; @@ -500,6 +500,12 @@ size_t ScalarReplacementPass::GetNumElements(const Instruction* type) const { return len; } +bool ScalarReplacementPass::IsSpecConstant(uint32_t id) const { + const Instruction* inst = get_def_use_mgr()->GetDef(id); + assert(inst); + return spvOpcodeIsSpecConstant(inst->opcode()); +} + Instruction* ScalarReplacementPass::GetStorageType( const Instruction* inst) const { assert(inst->opcode() == SpvOpVariable); @@ -536,7 +542,12 @@ bool ScalarReplacementPass::CheckType(const Instruction* typeInst) const { return false; return true; case SpvOpTypeArray: - if (IsLargerThanSizeLimit(GetArrayLength(typeInst))) return false; + if (IsSpecConstant(typeInst->GetSingleWordInOperand(1u))) { + return false; + } + if (IsLargerThanSizeLimit(GetArrayLength(typeInst))) { + return false; + } return true; // TODO(alanbaker): Develop some heuristics for when this should be // re-enabled. @@ -740,8 +751,10 @@ ScalarReplacementPass::GetUsedComponents(Instruction* inst) { return false; } } + case SpvOpName: + case SpvOpMemberName: case SpvOpStore: - // No components are used. Things are just stored to. + // No components are used. return true; case SpvOpAccessChain: case SpvOpInBoundsAccessChain: { diff --git a/3rdparty/spirv-tools/source/opt/scalar_replacement_pass.h b/3rdparty/spirv-tools/source/opt/scalar_replacement_pass.h index c89bbc401..f5d761278 100644 --- a/3rdparty/spirv-tools/source/opt/scalar_replacement_pass.h +++ b/3rdparty/spirv-tools/source/opt/scalar_replacement_pass.h @@ -52,7 +52,8 @@ class ScalarReplacementPass : public Pass { return IRContext::kAnalysisDefUse | IRContext::kAnalysisInstrToBlockMapping | IRContext::kAnalysisDecorations | IRContext::kAnalysisCombinators | - IRContext::kAnalysisCFG | IRContext::kAnalysisNameMap; + IRContext::kAnalysisCFG | IRContext::kAnalysisNameMap | + IRContext::kAnalysisConstants | IRContext::kAnalysisTypes; } private: @@ -169,6 +170,11 @@ class ScalarReplacementPass : public Pass { // |type| must be a vector or matrix type. size_t GetNumElements(const Instruction* type) const; + // Returns true if |id| is a specialization constant. + // + // |id| must be registered definition. + bool IsSpecConstant(uint32_t id) const; + // Returns an id for a pointer to |id|. uint32_t GetOrCreatePointerType(uint32_t id); diff --git a/3rdparty/spirv-tools/source/opt/simplification_pass.h b/3rdparty/spirv-tools/source/opt/simplification_pass.h index 348c96a03..bcb88bfcd 100644 --- a/3rdparty/spirv-tools/source/opt/simplification_pass.h +++ b/3rdparty/spirv-tools/source/opt/simplification_pass.h @@ -33,7 +33,8 @@ class SimplificationPass : public Pass { IRContext::kAnalysisInstrToBlockMapping | IRContext::kAnalysisDecorations | IRContext::kAnalysisCombinators | IRContext::kAnalysisCFG | IRContext::kAnalysisDominatorAnalysis | - IRContext::kAnalysisNameMap; + IRContext::kAnalysisNameMap | IRContext::kAnalysisConstants | + IRContext::kAnalysisTypes; } private: diff --git a/3rdparty/spirv-tools/source/opt/ssa_rewrite_pass.cpp b/3rdparty/spirv-tools/source/opt/ssa_rewrite_pass.cpp index 83d243311..f2cb2da28 100644 --- a/3rdparty/spirv-tools/source/opt/ssa_rewrite_pass.cpp +++ b/3rdparty/spirv-tools/source/opt/ssa_rewrite_pass.cpp @@ -90,6 +90,7 @@ std::string SSARewriter::PhiCandidate::PrettyPrint(const CFG* cfg) const { SSARewriter::PhiCandidate& SSARewriter::CreatePhiCandidate(uint32_t var_id, BasicBlock* bb) { + // TODO(1841): Handle id overflow. uint32_t phi_result_id = pass_->context()->TakeNextId(); auto result = phi_candidates_.emplace( phi_result_id, PhiCandidate(var_id, phi_result_id, bb)); @@ -434,12 +435,22 @@ bool SSARewriter::ApplyReplacements() { pass_->get_def_use_mgr()->GetDef(phi_candidate->var_id())); std::vector phi_operands; uint32_t arg_ix = 0; + std::unordered_map already_seen; for (uint32_t pred_label : pass_->cfg()->preds(phi_candidate->bb()->id())) { uint32_t op_val_id = GetPhiArgument(phi_candidate, arg_ix++); - phi_operands.push_back( - {spv_operand_type_t::SPV_OPERAND_TYPE_ID, {op_val_id}}); - phi_operands.push_back( - {spv_operand_type_t::SPV_OPERAND_TYPE_ID, {pred_label}}); + if (already_seen.count(pred_label) == 0) { + phi_operands.push_back( + {spv_operand_type_t::SPV_OPERAND_TYPE_ID, {op_val_id}}); + phi_operands.push_back( + {spv_operand_type_t::SPV_OPERAND_TYPE_ID, {pred_label}}); + already_seen[pred_label] = op_val_id; + } else { + // It is possible that there are two edges from the same parent block. + // Since the OpPhi can have only one entry for each parent, we have to + // make sure the two edges are consistent with each other. + assert(already_seen[pred_label] == op_val_id && + "Inconsistent value for duplicate edges."); + } } // Generate a new OpPhi instruction and insert it in its basic @@ -452,7 +463,6 @@ bool SSARewriter::ApplyReplacements() { pass_->context()->set_instr_block(&*phi_inst, phi_candidate->bb()); auto insert_it = phi_candidate->bb()->begin(); insert_it.InsertBefore(std::move(phi_inst)); - pass_->context()->get_decoration_mgr()->CloneDecorations( phi_candidate->var_id(), phi_candidate->result_id(), {SpvDecorationRelaxedPrecision}); diff --git a/3rdparty/spirv-tools/source/opt/strip_reflect_info_pass.cpp b/3rdparty/spirv-tools/source/opt/strip_reflect_info_pass.cpp index 14ce31ff3..984073f9d 100644 --- a/3rdparty/spirv-tools/source/opt/strip_reflect_info_pass.cpp +++ b/3rdparty/spirv-tools/source/opt/strip_reflect_info_pass.cpp @@ -39,6 +39,14 @@ Pass::Status StripReflectInfoPass::Process() { } break; + case SpvOpMemberDecorateStringGOOGLE: + if (inst.GetSingleWordInOperand(2) == SpvDecorationHlslSemanticGOOGLE) { + to_remove.push_back(&inst); + } else { + other_uses_for_decorate_string = true; + } + break; + case SpvOpDecorateId: if (inst.GetSingleWordInOperand(1) == SpvDecorationHlslCounterBufferGOOGLE) { diff --git a/3rdparty/spirv-tools/source/opt/strip_reflect_info_pass.h b/3rdparty/spirv-tools/source/opt/strip_reflect_info_pass.h index 935a605e3..4e1999ed3 100644 --- a/3rdparty/spirv-tools/source/opt/strip_reflect_info_pass.h +++ b/3rdparty/spirv-tools/source/opt/strip_reflect_info_pass.h @@ -33,7 +33,8 @@ class StripReflectInfoPass : public Pass { return IRContext::kAnalysisInstrToBlockMapping | IRContext::kAnalysisCombinators | IRContext::kAnalysisCFG | IRContext::kAnalysisDominatorAnalysis | - IRContext::kAnalysisLoopAnalysis | IRContext::kAnalysisNameMap; + IRContext::kAnalysisLoopAnalysis | IRContext::kAnalysisNameMap | + IRContext::kAnalysisConstants | IRContext::kAnalysisTypes; } }; diff --git a/3rdparty/spirv-tools/source/opt/struct_cfg_analysis.cpp b/3rdparty/spirv-tools/source/opt/struct_cfg_analysis.cpp new file mode 100644 index 000000000..d78ec560e --- /dev/null +++ b/3rdparty/spirv-tools/source/opt/struct_cfg_analysis.cpp @@ -0,0 +1,128 @@ +// Copyright (c) 2018 Google LLC. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "source/opt/struct_cfg_analysis.h" + +#include "source/opt/ir_context.h" + +namespace { +const uint32_t kMergeNodeIndex = 0; +const uint32_t kContinueNodeIndex = 1; +} + +namespace spvtools { +namespace opt { + +StructuredCFGAnalysis::StructuredCFGAnalysis(IRContext* ctx) : context_(ctx) { + // If this is not a shader, there are no merge instructions, and not + // structured CFG to analyze. + if (!context_->get_feature_mgr()->HasCapability(SpvCapabilityShader)) { + return; + } + + for (auto& func : *context_->module()) { + AddBlocksInFunction(&func); + } +} + +void StructuredCFGAnalysis::AddBlocksInFunction(Function* func) { + std::list order; + context_->cfg()->ComputeStructuredOrder(func, &*func->begin(), &order); + + struct TraversalInfo { + ConstructInfo cinfo; + uint32_t merge_node; + }; + + // Set up a stack to keep track of currently active constructs. + std::vector state; + state.emplace_back(); + state[0].cinfo.containing_construct = 0; + state[0].cinfo.containing_loop = 0; + state[0].merge_node = 0; + + for (BasicBlock* block : order) { + if (context_->cfg()->IsPseudoEntryBlock(block) || + context_->cfg()->IsPseudoExitBlock(block)) { + continue; + } + + if (block->id() == state.back().merge_node) { + state.pop_back(); + } + + bb_to_construct_.emplace(std::make_pair(block->id(), state.back().cinfo)); + + if (Instruction* merge_inst = block->GetMergeInst()) { + TraversalInfo new_state; + new_state.merge_node = + merge_inst->GetSingleWordInOperand(kMergeNodeIndex); + new_state.cinfo.containing_construct = block->id(); + + if (merge_inst->opcode() == SpvOpLoopMerge) { + new_state.cinfo.containing_loop = block->id(); + } else { + new_state.cinfo.containing_loop = state.back().cinfo.containing_loop; + } + + state.emplace_back(new_state); + merge_blocks_.Set(new_state.merge_node); + } + } +} + +uint32_t StructuredCFGAnalysis::MergeBlock(uint32_t bb_id) { + uint32_t header_id = ContainingConstruct(bb_id); + if (header_id == 0) { + return 0; + } + + BasicBlock* header = context_->cfg()->block(header_id); + Instruction* merge_inst = header->GetMergeInst(); + return merge_inst->GetSingleWordInOperand(kMergeNodeIndex); +} + +uint32_t StructuredCFGAnalysis::LoopMergeBlock(uint32_t bb_id) { + uint32_t header_id = ContainingLoop(bb_id); + if (header_id == 0) { + return 0; + } + + BasicBlock* header = context_->cfg()->block(header_id); + Instruction* merge_inst = header->GetMergeInst(); + return merge_inst->GetSingleWordInOperand(kMergeNodeIndex); +} + +uint32_t StructuredCFGAnalysis::LoopContinueBlock(uint32_t bb_id) { + uint32_t header_id = ContainingLoop(bb_id); + if (header_id == 0) { + return 0; + } + + BasicBlock* header = context_->cfg()->block(header_id); + Instruction* merge_inst = header->GetMergeInst(); + return merge_inst->GetSingleWordInOperand(kContinueNodeIndex); +} + +bool StructuredCFGAnalysis::IsContinueBlock(uint32_t bb_id) { + assert(bb_id != 0); + return LoopContinueBlock(bb_id) == bb_id; +} + +bool StructuredCFGAnalysis::IsMergeBlock(uint32_t bb_id) { + return merge_blocks_.Get(bb_id); +} + +} // namespace opt +} // namespace spvtools diff --git a/3rdparty/spirv-tools/source/opt/struct_cfg_analysis.h b/3rdparty/spirv-tools/source/opt/struct_cfg_analysis.h new file mode 100644 index 000000000..ef0229d05 --- /dev/null +++ b/3rdparty/spirv-tools/source/opt/struct_cfg_analysis.h @@ -0,0 +1,101 @@ +// Copyright (c) 2018 Google LLC. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef SOURCE_OPT_STRUCT_CFG_ANALYSIS_H_ +#define SOURCE_OPT_STRUCT_CFG_ANALYSIS_H_ + +#include + +#include "source/opt/function.h" +#include "source/util/bit_vector.h" + +namespace spvtools { +namespace opt { + +class IRContext; + +// An analysis that, for each basic block, finds the constructs in which it is +// contained, so we can easily get headers and merge nodes. +class StructuredCFGAnalysis { + public: + explicit StructuredCFGAnalysis(IRContext* ctx); + + // Returns the id of the header of the innermost merge construct + // that contains |bb_id|. Returns |0| if |bb_id| is not contained in any + // merge construct. + uint32_t ContainingConstruct(uint32_t bb_id) { + auto it = bb_to_construct_.find(bb_id); + if (it == bb_to_construct_.end()) { + return 0; + } + return it->second.containing_construct; + } + + // Returns the id of the merge block of the innermost merge construct + // that contains |bb_id|. Returns |0| if |bb_id| is not contained in any + // merge construct. + uint32_t MergeBlock(uint32_t bb_id); + + // Returns the id of the header of the innermost loop construct + // that contains |bb_id|. Return |0| if |bb_id| is not contained in any loop + // construct. + uint32_t ContainingLoop(uint32_t bb_id) { + auto it = bb_to_construct_.find(bb_id); + if (it == bb_to_construct_.end()) { + return 0; + } + return it->second.containing_loop; + } + + // Returns the id of the merge block of the innermost loop construct + // that contains |bb_id|. Return |0| if |bb_id| is not contained in any loop + // construct. + uint32_t LoopMergeBlock(uint32_t bb_id); + + // Returns the id of the continue block of the innermost loop construct + // that contains |bb_id|. Return |0| if |bb_id| is not contained in any loop + // construct. + uint32_t LoopContinueBlock(uint32_t bb_id); + + bool IsContinueBlock(uint32_t bb_id); + bool IsMergeBlock(uint32_t bb_id); + + private: + // Struct used to hold the information for a basic block. + // |containing_construct| is the header for the innermost containing + // construct, or 0 if no such construct exists. It could be a selection + // construct or a loop construct. |containing_loop| is the innermost + // containing loop construct, or 0 if the basic bloc is not in a loop. If the + // basic block is in a selection construct that is contained in a loop + // construct, then these two values will not be the same. + struct ConstructInfo { + uint32_t containing_construct; + uint32_t containing_loop; + }; + + // Populates |bb_to_construct_| with the innermost containing merge and loop + // constructs for each basic block in |func|. + void AddBlocksInFunction(Function* func); + + IRContext* context_; + + // A map from a basic block to the headers of its inner most containing + // constructs. + std::unordered_map bb_to_construct_; + utils::BitVector merge_blocks_; +}; + +} // namespace opt +} // namespace spvtools +#endif // SOURCE_OPT_STRUCT_CFG_ANALYSIS_H_ diff --git a/3rdparty/spirv-tools/source/opt/type_manager.cpp b/3rdparty/spirv-tools/source/opt/type_manager.cpp index bd5221b04..001883cad 100644 --- a/3rdparty/spirv-tools/source/opt/type_manager.cpp +++ b/3rdparty/spirv-tools/source/opt/type_manager.cpp @@ -59,7 +59,9 @@ std::pair> TypeManager::GetTypeAndPointerType( uint32_t TypeManager::GetId(const Type* type) const { auto iter = type_to_id_.find(type); - if (iter != type_to_id_.end()) return (*iter).second; + if (iter != type_to_id_.end()) { + return (*iter).second; + } return 0; } @@ -203,6 +205,7 @@ uint32_t TypeManager::GetTypeInstruction(const Type* type) { if (id != 0) return id; std::unique_ptr typeInst; + // TODO(1841): Handle id overflow. id = context()->TakeNextId(); RegisterType(id, *type); switch (type->kind()) { @@ -220,6 +223,7 @@ uint32_t TypeManager::GetTypeInstruction(const Type* type) { DefineParameterlessCase(Queue); DefineParameterlessCase(PipeStorage); DefineParameterlessCase(NamedBarrier); + DefineParameterlessCase(AccelerationStructureNV); #undef DefineParameterlessCase case Type::kInteger: typeInst = MakeUnique( @@ -395,6 +399,7 @@ uint32_t TypeManager::FindPointerToType(uint32_t type_id, } // Must create the pointer type. + // TODO(1841): Handle id overflow. uint32_t resultId = context()->TakeNextId(); std::unique_ptr type_inst( new Instruction(context(), SpvOpTypePointer, 0, resultId, @@ -465,6 +470,7 @@ Type* TypeManager::RebuildType(const Type& type) { DefineNoSubtypeCase(Pipe); DefineNoSubtypeCase(PipeStorage); DefineNoSubtypeCase(NamedBarrier); + DefineNoSubtypeCase(AccelerationStructureNV); #undef DefineNoSubtypeCase case Type::kVector: { const Vector* vec_ty = type.AsVector(); @@ -738,6 +744,9 @@ Type* TypeManager::RecordIfTypeDefinition(const Instruction& inst) { case SpvOpTypeNamedBarrier: type = new NamedBarrier(); break; + case SpvOpTypeAccelerationStructureNV: + type = new AccelerationStructureNV(); + break; default: SPIRV_UNIMPLEMENTED(consumer_, "unhandled type"); break; diff --git a/3rdparty/spirv-tools/source/opt/types.cpp b/3rdparty/spirv-tools/source/opt/types.cpp index 15cff5486..cfafc7dce 100644 --- a/3rdparty/spirv-tools/source/opt/types.cpp +++ b/3rdparty/spirv-tools/source/opt/types.cpp @@ -123,6 +123,7 @@ std::unique_ptr Type::Clone() const { DeclareKindCase(ForwardPointer); DeclareKindCase(PipeStorage); DeclareKindCase(NamedBarrier); + DeclareKindCase(AccelerationStructureNV); #undef DeclareKindCase default: assert(false && "Unhandled type"); @@ -166,6 +167,7 @@ bool Type::operator==(const Type& other) const { DeclareKindCase(ForwardPointer); DeclareKindCase(PipeStorage); DeclareKindCase(NamedBarrier); + DeclareKindCase(AccelerationStructureNV); #undef DeclareKindCase default: assert(false && "Unhandled type"); @@ -214,6 +216,7 @@ void Type::GetHashWords(std::vector* words, DeclareKindCase(ForwardPointer); DeclareKindCase(PipeStorage); DeclareKindCase(NamedBarrier); + DeclareKindCase(AccelerationStructureNV); #undef DeclareKindCase default: assert(false && "Unhandled type"); @@ -548,12 +551,10 @@ void Pointer::GetExtraHashWords(std::vector* words, void Pointer::SetPointeeType(const Type* type) { pointee_type_ = type; } Function::Function(Type* ret_type, const std::vector& params) - : Type(kFunction), return_type_(ret_type), param_types_(params) { - for (auto* t : params) { - (void)t; - assert(!t->AsVoid()); - } -} + : Type(kFunction), return_type_(ret_type), param_types_(params) {} + +Function::Function(Type* ret_type, std::vector& params) + : Type(kFunction), return_type_(ret_type), param_types_(params) {} bool Function::IsSameImpl(const Type* that, IsSameCache* seen) const { const Function* ft = that->AsFunction(); diff --git a/3rdparty/spirv-tools/source/opt/types.h b/3rdparty/spirv-tools/source/opt/types.h index 625f342a6..fe0f39af3 100644 --- a/3rdparty/spirv-tools/source/opt/types.h +++ b/3rdparty/spirv-tools/source/opt/types.h @@ -56,6 +56,7 @@ class Pipe; class ForwardPointer; class PipeStorage; class NamedBarrier; +class AccelerationStructureNV; // Abstract class for a SPIR-V type. It has a bunch of As() methods, // which is used as a way to probe the actual . @@ -90,6 +91,7 @@ class Type { kForwardPointer, kPipeStorage, kNamedBarrier, + kAccelerationStructureNV, }; Type(Kind k) : kind_(k) {} @@ -170,6 +172,7 @@ class Type { DeclareCastMethod(ForwardPointer); DeclareCastMethod(PipeStorage); DeclareCastMethod(NamedBarrier); + DeclareCastMethod(AccelerationStructureNV); #undef DeclareCastMethod bool operator==(const Type& other) const; @@ -491,6 +494,7 @@ class Pointer : public Type { class Function : public Type { public: Function(Type* ret_type, const std::vector& params); + Function(Type* ret_type, std::vector& params); Function(const Function&) = default; std::string str() const override; @@ -594,6 +598,7 @@ DefineParameterlessType(ReserveId, reserve_id); DefineParameterlessType(Queue, queue); DefineParameterlessType(PipeStorage, pipe_storage); DefineParameterlessType(NamedBarrier, named_barrier); +DefineParameterlessType(AccelerationStructureNV, accelerationStructureNV); #undef DefineParameterlessType } // namespace analysis diff --git a/3rdparty/spirv-tools/source/opt/upgrade_memory_model.cpp b/3rdparty/spirv-tools/source/opt/upgrade_memory_model.cpp new file mode 100644 index 000000000..8def55f5a --- /dev/null +++ b/3rdparty/spirv-tools/source/opt/upgrade_memory_model.cpp @@ -0,0 +1,585 @@ +// Copyright (c) 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "upgrade_memory_model.h" + +#include + +#include "source/opt/ir_context.h" +#include "source/util/make_unique.h" + +namespace spvtools { +namespace opt { + +Pass::Status UpgradeMemoryModel::Process() { + // Only update Logical GLSL450 to Logical VulkanKHR. + Instruction* memory_model = get_module()->GetMemoryModel(); + if (memory_model->GetSingleWordInOperand(0u) != SpvAddressingModelLogical || + memory_model->GetSingleWordInOperand(1u) != SpvMemoryModelGLSL450) { + return Pass::Status::SuccessWithoutChange; + } + + UpgradeMemoryModelInstruction(); + UpgradeInstructions(); + CleanupDecorations(); + UpgradeBarriers(); + UpgradeMemoryScope(); + + return Pass::Status::SuccessWithChange; +} + +void UpgradeMemoryModel::UpgradeMemoryModelInstruction() { + // Overall changes necessary: + // 1. Add the OpExtension. + // 2. Add the OpCapability. + // 3. Modify the memory model. + Instruction* memory_model = get_module()->GetMemoryModel(); + get_module()->AddCapability(MakeUnique( + context(), SpvOpCapability, 0, 0, + std::initializer_list{ + {SPV_OPERAND_TYPE_CAPABILITY, {SpvCapabilityVulkanMemoryModelKHR}}})); + const std::string extension = "SPV_KHR_vulkan_memory_model"; + std::vector words(extension.size() / 4 + 1, 0); + char* dst = reinterpret_cast(words.data()); + strncpy(dst, extension.c_str(), extension.size()); + get_module()->AddExtension( + MakeUnique(context(), SpvOpExtension, 0, 0, + std::initializer_list{ + {SPV_OPERAND_TYPE_LITERAL_STRING, words}})); + memory_model->SetInOperand(1u, {SpvMemoryModelVulkanKHR}); +} + +void UpgradeMemoryModel::UpgradeInstructions() { + // Coherent and Volatile decorations are deprecated. Remove them and replace + // with flags on the memory/image operations. The decorations can occur on + // OpVariable, OpFunctionParameter (of pointer type) and OpStructType (member + // decoration). Trace from the decoration target(s) to the final memory/image + // instructions. Additionally, Workgroup storage class variables and function + // parameters are implicitly coherent in GLSL450. + + for (auto& func : *get_module()) { + func.ForEachInst([this](Instruction* inst) { + bool is_coherent = false; + bool is_volatile = false; + bool src_coherent = false; + bool src_volatile = false; + bool dst_coherent = false; + bool dst_volatile = false; + SpvScope scope = SpvScopeQueueFamilyKHR; + SpvScope src_scope = SpvScopeQueueFamilyKHR; + SpvScope dst_scope = SpvScopeQueueFamilyKHR; + switch (inst->opcode()) { + case SpvOpLoad: + case SpvOpStore: + std::tie(is_coherent, is_volatile, scope) = + GetInstructionAttributes(inst->GetSingleWordInOperand(0u)); + break; + case SpvOpImageRead: + case SpvOpImageSparseRead: + case SpvOpImageWrite: + std::tie(is_coherent, is_volatile, scope) = + GetInstructionAttributes(inst->GetSingleWordInOperand(0u)); + break; + case SpvOpCopyMemory: + case SpvOpCopyMemorySized: + std::tie(dst_coherent, dst_volatile, dst_scope) = + GetInstructionAttributes(inst->GetSingleWordInOperand(0u)); + std::tie(src_coherent, src_volatile, src_scope) = + GetInstructionAttributes(inst->GetSingleWordInOperand(1u)); + break; + default: + break; + } + + switch (inst->opcode()) { + case SpvOpLoad: + UpgradeFlags(inst, 1u, is_coherent, is_volatile, kAvailability, + kMemory); + break; + case SpvOpStore: + UpgradeFlags(inst, 2u, is_coherent, is_volatile, kVisibility, + kMemory); + break; + case SpvOpCopyMemory: + UpgradeFlags(inst, 2u, dst_coherent, dst_volatile, kAvailability, + kMemory); + UpgradeFlags(inst, 2u, src_coherent, src_volatile, kVisibility, + kMemory); + break; + case SpvOpCopyMemorySized: + UpgradeFlags(inst, 3u, dst_coherent, dst_volatile, kAvailability, + kMemory); + UpgradeFlags(inst, 3u, src_coherent, src_volatile, kVisibility, + kMemory); + break; + case SpvOpImageRead: + case SpvOpImageSparseRead: + UpgradeFlags(inst, 2u, is_coherent, is_volatile, kAvailability, + kImage); + break; + case SpvOpImageWrite: + UpgradeFlags(inst, 3u, is_coherent, is_volatile, kVisibility, kImage); + break; + default: + break; + } + + // |is_coherent| is never used for the same instructions as + // |src_coherent| and |dst_coherent|. + if (is_coherent) { + inst->AddOperand( + {SPV_OPERAND_TYPE_SCOPE_ID, {GetScopeConstant(scope)}}); + } + // According to SPV_KHR_vulkan_memory_model, if both available and + // visible flags are used the first scope operand is for availability + // (reads) and the second is for visibiity (writes). + if (src_coherent) { + inst->AddOperand( + {SPV_OPERAND_TYPE_SCOPE_ID, {GetScopeConstant(src_scope)}}); + } + if (dst_coherent) { + inst->AddOperand( + {SPV_OPERAND_TYPE_SCOPE_ID, {GetScopeConstant(dst_scope)}}); + } + }); + } +} + +std::tuple UpgradeMemoryModel::GetInstructionAttributes( + uint32_t id) { + // |id| is a pointer used in a memory/image instruction. Need to determine if + // that pointer points to volatile or coherent memory. Workgroup storage + // class is implicitly coherent and cannot be decorated with volatile, so + // short circuit that case. + Instruction* inst = context()->get_def_use_mgr()->GetDef(id); + analysis::Type* type = context()->get_type_mgr()->GetType(inst->type_id()); + if (type->AsPointer() && + type->AsPointer()->storage_class() == SpvStorageClassWorkgroup) { + return std::make_tuple(true, false, SpvScopeWorkgroup); + } + + bool is_coherent = false; + bool is_volatile = false; + std::unordered_set visited; + std::tie(is_coherent, is_volatile) = + TraceInstruction(context()->get_def_use_mgr()->GetDef(id), + std::vector(), &visited); + + return std::make_tuple(is_coherent, is_volatile, SpvScopeQueueFamilyKHR); +} + +std::pair UpgradeMemoryModel::TraceInstruction( + Instruction* inst, std::vector indices, + std::unordered_set* visited) { + auto iter = cache_.find(std::make_pair(inst->result_id(), indices)); + if (iter != cache_.end()) { + return iter->second; + } + + if (!visited->insert(inst->result_id()).second) { + return std::make_pair(false, false); + } + + // Initialize the cache before |indices| is (potentially) modified. + auto& cached_result = cache_[std::make_pair(inst->result_id(), indices)]; + cached_result.first = false; + cached_result.second = false; + + bool is_coherent = false; + bool is_volatile = false; + switch (inst->opcode()) { + case SpvOpVariable: + case SpvOpFunctionParameter: + is_coherent |= HasDecoration(inst, 0, SpvDecorationCoherent); + is_volatile |= HasDecoration(inst, 0, SpvDecorationVolatile); + if (!is_coherent || !is_volatile) { + bool type_coherent = false; + bool type_volatile = false; + std::tie(type_coherent, type_volatile) = + CheckType(inst->type_id(), indices); + is_coherent |= type_coherent; + is_volatile |= type_volatile; + } + break; + case SpvOpAccessChain: + case SpvOpInBoundsAccessChain: + // Store indices in reverse order. + for (uint32_t i = inst->NumInOperands() - 1; i > 0; --i) { + indices.push_back(inst->GetSingleWordInOperand(i)); + } + break; + case SpvOpPtrAccessChain: + // Store indices in reverse order. Skip the |Element| operand. + for (uint32_t i = inst->NumInOperands() - 1; i > 1; --i) { + indices.push_back(inst->GetSingleWordInOperand(i)); + } + break; + default: + break; + } + + // No point searching further. + if (is_coherent && is_volatile) { + cached_result.first = true; + cached_result.second = true; + return std::make_pair(true, true); + } + + // Variables and function parameters are sources. Continue searching until we + // reach them. + if (inst->opcode() != SpvOpVariable && + inst->opcode() != SpvOpFunctionParameter) { + inst->ForEachInId([this, &is_coherent, &is_volatile, &indices, + &visited](const uint32_t* id_ptr) { + Instruction* op_inst = context()->get_def_use_mgr()->GetDef(*id_ptr); + const analysis::Type* type = + context()->get_type_mgr()->GetType(op_inst->type_id()); + if (type && + (type->AsPointer() || type->AsImage() || type->AsSampledImage())) { + bool operand_coherent = false; + bool operand_volatile = false; + std::tie(operand_coherent, operand_volatile) = + TraceInstruction(op_inst, indices, visited); + is_coherent |= operand_coherent; + is_volatile |= operand_volatile; + } + }); + } + + cached_result.first = is_coherent; + cached_result.second = is_volatile; + return std::make_pair(is_coherent, is_volatile); +} + +std::pair UpgradeMemoryModel::CheckType( + uint32_t type_id, const std::vector& indices) { + bool is_coherent = false; + bool is_volatile = false; + Instruction* type_inst = context()->get_def_use_mgr()->GetDef(type_id); + assert(type_inst->opcode() == SpvOpTypePointer); + Instruction* element_inst = context()->get_def_use_mgr()->GetDef( + type_inst->GetSingleWordInOperand(1u)); + for (int i = (int)indices.size() - 1; i >= 0; --i) { + if (is_coherent && is_volatile) break; + + if (element_inst->opcode() == SpvOpTypePointer) { + element_inst = context()->get_def_use_mgr()->GetDef( + element_inst->GetSingleWordInOperand(1u)); + } else if (element_inst->opcode() == SpvOpTypeStruct) { + uint32_t index = indices.at(i); + Instruction* index_inst = context()->get_def_use_mgr()->GetDef(index); + assert(index_inst->opcode() == SpvOpConstant); + uint64_t value = GetIndexValue(index_inst); + is_coherent |= HasDecoration(element_inst, static_cast(value), + SpvDecorationCoherent); + is_volatile |= HasDecoration(element_inst, static_cast(value), + SpvDecorationVolatile); + element_inst = context()->get_def_use_mgr()->GetDef( + element_inst->GetSingleWordInOperand(static_cast(value))); + } else { + assert(spvOpcodeIsComposite(element_inst->opcode())); + element_inst = context()->get_def_use_mgr()->GetDef( + element_inst->GetSingleWordInOperand(1u)); + } + } + + if (!is_coherent || !is_volatile) { + bool remaining_coherent = false; + bool remaining_volatile = false; + std::tie(remaining_coherent, remaining_volatile) = + CheckAllTypes(element_inst); + is_coherent |= remaining_coherent; + is_volatile |= remaining_volatile; + } + + return std::make_pair(is_coherent, is_volatile); +} + +std::pair UpgradeMemoryModel::CheckAllTypes( + const Instruction* inst) { + std::unordered_set visited; + std::vector stack; + stack.push_back(inst); + + bool is_coherent = false; + bool is_volatile = false; + while (!stack.empty()) { + const Instruction* def = stack.back(); + stack.pop_back(); + + if (!visited.insert(def).second) continue; + + if (def->opcode() == SpvOpTypeStruct) { + // Any member decorated with coherent and/or volatile is enough to have + // the related operation be flagged as coherent and/or volatile. + is_coherent |= HasDecoration(def, std::numeric_limits::max(), + SpvDecorationCoherent); + is_volatile |= HasDecoration(def, std::numeric_limits::max(), + SpvDecorationVolatile); + if (is_coherent && is_volatile) + return std::make_pair(is_coherent, is_volatile); + + // Check the subtypes. + for (uint32_t i = 0; i < def->NumInOperands(); ++i) { + stack.push_back(context()->get_def_use_mgr()->GetDef( + def->GetSingleWordInOperand(i))); + } + } else if (spvOpcodeIsComposite(def->opcode())) { + stack.push_back(context()->get_def_use_mgr()->GetDef( + def->GetSingleWordInOperand(0u))); + } else if (def->opcode() == SpvOpTypePointer) { + stack.push_back(context()->get_def_use_mgr()->GetDef( + def->GetSingleWordInOperand(1u))); + } + } + + return std::make_pair(is_coherent, is_volatile); +} + +uint64_t UpgradeMemoryModel::GetIndexValue(Instruction* index_inst) { + const analysis::Constant* index_constant = + context()->get_constant_mgr()->GetConstantFromInst(index_inst); + assert(index_constant->AsIntConstant()); + if (index_constant->type()->AsInteger()->IsSigned()) { + if (index_constant->type()->AsInteger()->width() == 32) { + return index_constant->GetS32(); + } else { + return index_constant->GetS64(); + } + } else { + if (index_constant->type()->AsInteger()->width() == 32) { + return index_constant->GetU32(); + } else { + return index_constant->GetU64(); + } + } +} + +bool UpgradeMemoryModel::HasDecoration(const Instruction* inst, uint32_t value, + SpvDecoration decoration) { + // If the iteration was terminated early then an appropriate decoration was + // found. + return !context()->get_decoration_mgr()->WhileEachDecoration( + inst->result_id(), decoration, [value](const Instruction& i) { + if (i.opcode() == SpvOpDecorate || i.opcode() == SpvOpDecorateId) { + return false; + } else if (i.opcode() == SpvOpMemberDecorate) { + if (value == i.GetSingleWordInOperand(1u) || + value == std::numeric_limits::max()) + return false; + } + + return true; + }); +} + +void UpgradeMemoryModel::UpgradeFlags(Instruction* inst, uint32_t in_operand, + bool is_coherent, bool is_volatile, + OperationType operation_type, + InstructionType inst_type) { + if (!is_coherent && !is_volatile) return; + + uint32_t flags = 0; + if (inst->NumInOperands() > in_operand) { + flags |= inst->GetSingleWordInOperand(in_operand); + } + if (is_coherent) { + if (inst_type == kMemory) { + flags |= SpvMemoryAccessNonPrivatePointerKHRMask; + if (operation_type == kVisibility) { + flags |= SpvMemoryAccessMakePointerVisibleKHRMask; + } else { + flags |= SpvMemoryAccessMakePointerAvailableKHRMask; + } + } else { + flags |= SpvImageOperandsNonPrivateTexelKHRMask; + if (operation_type == kVisibility) { + flags |= SpvImageOperandsMakeTexelVisibleKHRMask; + } else { + flags |= SpvImageOperandsMakeTexelAvailableKHRMask; + } + } + } + + if (is_volatile) { + if (inst_type == kMemory) { + flags |= SpvMemoryAccessVolatileMask; + } else { + flags |= SpvImageOperandsVolatileTexelKHRMask; + } + } + + if (inst->NumInOperands() > in_operand) { + inst->SetInOperand(in_operand, {flags}); + } else if (inst_type == kMemory) { + inst->AddOperand({SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS, {flags}}); + } else { + inst->AddOperand({SPV_OPERAND_TYPE_OPTIONAL_IMAGE, {flags}}); + } +} + +uint32_t UpgradeMemoryModel::GetScopeConstant(SpvScope scope) { + analysis::Integer int_ty(32, false); + uint32_t int_id = context()->get_type_mgr()->GetTypeInstruction(&int_ty); + const analysis::Constant* constant = + context()->get_constant_mgr()->GetConstant( + context()->get_type_mgr()->GetType(int_id), + {static_cast(scope)}); + return context() + ->get_constant_mgr() + ->GetDefiningInstruction(constant) + ->result_id(); +} + +void UpgradeMemoryModel::CleanupDecorations() { + // All of the volatile and coherent decorations have been dealt with, so now + // we can just remove them. + get_module()->ForEachInst([this](Instruction* inst) { + if (inst->result_id() != 0) { + context()->get_decoration_mgr()->RemoveDecorationsFrom( + inst->result_id(), [](const Instruction& dec) { + switch (dec.opcode()) { + case SpvOpDecorate: + case SpvOpDecorateId: + if (dec.GetSingleWordInOperand(1u) == SpvDecorationCoherent || + dec.GetSingleWordInOperand(1u) == SpvDecorationVolatile) + return true; + break; + case SpvOpMemberDecorate: + if (dec.GetSingleWordInOperand(2u) == SpvDecorationCoherent || + dec.GetSingleWordInOperand(2u) == SpvDecorationVolatile) + return true; + break; + default: + break; + } + return false; + }); + } + }); +} + +void UpgradeMemoryModel::UpgradeBarriers() { + std::vector barriers; + // Collects all the control barriers in |function|. Returns true if the + // function operates on the Output storage class. + ProcessFunction CollectBarriers = [this, &barriers](Function* function) { + bool operates_on_output = false; + for (auto& block : *function) { + block.ForEachInst([this, &barriers, + &operates_on_output](Instruction* inst) { + if (inst->opcode() == SpvOpControlBarrier) { + barriers.push_back(inst); + } else if (!operates_on_output) { + // This instruction operates on output storage class if it is a + // pointer to output type or any input operand is a pointer to output + // type. + analysis::Type* type = + context()->get_type_mgr()->GetType(inst->type_id()); + if (type && type->AsPointer() && + type->AsPointer()->storage_class() == SpvStorageClassOutput) { + operates_on_output = true; + return; + } + inst->ForEachInId([this, &operates_on_output](uint32_t* id_ptr) { + Instruction* op_inst = + context()->get_def_use_mgr()->GetDef(*id_ptr); + analysis::Type* op_type = + context()->get_type_mgr()->GetType(op_inst->type_id()); + if (op_type && op_type->AsPointer() && + op_type->AsPointer()->storage_class() == SpvStorageClassOutput) + operates_on_output = true; + }); + } + }); + } + return operates_on_output; + }; + + std::queue roots; + for (auto& e : get_module()->entry_points()) + if (e.GetSingleWordInOperand(0u) == SpvExecutionModelTessellationControl) { + roots.push(e.GetSingleWordInOperand(1u)); + if (context()->ProcessCallTreeFromRoots(CollectBarriers, &roots)) { + for (auto barrier : barriers) { + // Add OutputMemoryKHR to the semantics of the barriers. + uint32_t semantics_id = barrier->GetSingleWordInOperand(2u); + Instruction* semantics_inst = + context()->get_def_use_mgr()->GetDef(semantics_id); + analysis::Type* semantics_type = + context()->get_type_mgr()->GetType(semantics_inst->type_id()); + uint64_t semantics_value = GetIndexValue(semantics_inst); + const analysis::Constant* constant = + context()->get_constant_mgr()->GetConstant( + semantics_type, {static_cast(semantics_value) | + SpvMemorySemanticsOutputMemoryKHRMask}); + barrier->SetInOperand(2u, {context() + ->get_constant_mgr() + ->GetDefiningInstruction(constant) + ->result_id()}); + } + } + barriers.clear(); + } +} + +void UpgradeMemoryModel::UpgradeMemoryScope() { + get_module()->ForEachInst([this](Instruction* inst) { + // Don't need to handle all the operations that take a scope. + // * Group operations can only be subgroup + // * Non-uniform can only be workgroup or subgroup + // * Named barriers are not supported by Vulkan + // * Workgroup ops (e.g. async_copy) have at most workgroup scope. + if (spvOpcodeIsAtomicOp(inst->opcode())) { + if (IsDeviceScope(inst->GetSingleWordInOperand(1))) { + inst->SetInOperand(1, {GetScopeConstant(SpvScopeQueueFamilyKHR)}); + } + } else if (inst->opcode() == SpvOpControlBarrier) { + if (IsDeviceScope(inst->GetSingleWordInOperand(1))) { + inst->SetInOperand(1, {GetScopeConstant(SpvScopeQueueFamilyKHR)}); + } + } else if (inst->opcode() == SpvOpMemoryBarrier) { + if (IsDeviceScope(inst->GetSingleWordInOperand(0))) { + inst->SetInOperand(0, {GetScopeConstant(SpvScopeQueueFamilyKHR)}); + } + } + }); +} + +bool UpgradeMemoryModel::IsDeviceScope(uint32_t scope_id) { + const analysis::Constant* constant = + context()->get_constant_mgr()->FindDeclaredConstant(scope_id); + assert(constant && "Memory scope must be a constant"); + + const analysis::Integer* type = constant->type()->AsInteger(); + assert(type); + assert(type->width() == 32 || type->width() == 64); + if (type->width() == 32) { + if (type->IsSigned()) + return static_cast(constant->GetS32()) == SpvScopeDevice; + else + return static_cast(constant->GetU32()) == SpvScopeDevice; + } else { + if (type->IsSigned()) + return static_cast(constant->GetS64()) == SpvScopeDevice; + else + return static_cast(constant->GetU64()) == SpvScopeDevice; + } + + assert(false); + return false; +} + +} // namespace opt +} // namespace spvtools diff --git a/3rdparty/spirv-tools/source/opt/upgrade_memory_model.h b/3rdparty/spirv-tools/source/opt/upgrade_memory_model.h new file mode 100644 index 000000000..29c801c4f --- /dev/null +++ b/3rdparty/spirv-tools/source/opt/upgrade_memory_model.h @@ -0,0 +1,129 @@ +// Copyright (c) 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef LIBSPIRV_OPT_UPGRADE_MEMORY_MODEL_H_ +#define LIBSPIRV_OPT_UPGRADE_MEMORY_MODEL_H_ + +#include "pass.h" + +#include +#include + +namespace spvtools { +namespace opt { + +// Hashing functor for the memoized result store. +struct CacheHash { + size_t operator()( + const std::pair>& item) const { + std::u32string to_hash; + to_hash.push_back(item.first); + for (auto i : item.second) to_hash.push_back(i); + return std::hash()(to_hash); + } +}; + +// Upgrades the memory model from Logical GLSL450 to Logical VulkanKHR. +// +// This pass remove deprecated decorations (Volatile and Coherent) and replaces +// them with new flags on individual instructions. It adds the Output storage +// class semantic to control barriers in tessellation control shaders that have +// an access to Output memory. +class UpgradeMemoryModel : public Pass { + public: + const char* name() const override { return "upgrade-memory-model"; } + Status Process() override; + + private: + // Used to indicate whether the operation performs an availability or + // visibility operation. + enum OperationType { kVisibility, kAvailability }; + + // Used to indicate whether the instruction is a memory or image instruction. + enum InstructionType { kMemory, kImage }; + + // Modifies the OpMemoryModel to use VulkanKHR. Adds the Vulkan memory model + // capability and extension. + void UpgradeMemoryModelInstruction(); + + // Upgrades memory, image and barrier instructions. + // Memory and image instructions convert coherent and volatile decorations + // into flags on the instruction. Barriers in tessellation shaders get the + // output storage semantic if appropriate. + void UpgradeInstructions(); + + // Returns whether |id| is coherent and/or volatile. + std::tuple GetInstructionAttributes(uint32_t id); + + // Traces |inst| to determine if it is coherent and/or volatile. + // |indices| tracks the access chain indices seen so far. + std::pair TraceInstruction(Instruction* inst, + std::vector indices, + std::unordered_set* visited); + + // Return true if |inst| is decorated with |decoration|. + // If |inst| is decorated by member decorations then either |value| must + // match the index or |value| must be a maximum allowable value. The max + // value allows any element to match. + bool HasDecoration(const Instruction* inst, uint32_t value, + SpvDecoration decoration); + + // Returns whether |type_id| indexed via |indices| is coherent and/or + // volatile. + std::pair CheckType(uint32_t type_id, + const std::vector& indices); + + // Returns whether any type/element under |inst| is coherent and/or volatile. + std::pair CheckAllTypes(const Instruction* inst); + + // Modifies the flags of |inst| to include the new flags for the Vulkan + // memory model. |operation_type| indicates whether flags should use + // MakeVisible or MakeAvailable variants. |inst_type| indicates whether the + // Pointer or Texel variants of flags should be used. + void UpgradeFlags(Instruction* inst, uint32_t in_operand, bool is_coherent, + bool is_volatile, OperationType operation_type, + InstructionType inst_type); + + // Returns the result id for a constant for |scope|. + uint32_t GetScopeConstant(SpvScope scope); + + // Returns the value of |index_inst|. |index_inst| must be an OpConstant of + // integer type.g + uint64_t GetIndexValue(Instruction* index_inst); + + // Removes coherent and volatile decorations. + void CleanupDecorations(); + + // For all tessellation control entry points, if there is an operation on + // Output storage class, then all barriers are modified to include the + // OutputMemoryKHR semantic. + void UpgradeBarriers(); + + // If the Vulkan memory model is specified, device scope actually means + // device scope. The memory scope must be modified to be QueueFamilyKHR + // scope. + void UpgradeMemoryScope(); + + // Returns true if |scope_id| is SpvScopeDevice. + bool IsDeviceScope(uint32_t scope_id); + + // Caches the result of TraceInstruction. For a given result id and set of + // indices, stores whether that combination is coherent and/or volatile. + std::unordered_map>, + std::pair, CacheHash> + cache_; +}; +} // namespace opt +} // namespace spvtools +#endif // LIBSPIRV_OPT_UPGRADE_MEMORY_MODEL_H_ diff --git a/3rdparty/spirv-tools/source/opt/vector_dce.cpp b/3rdparty/spirv-tools/source/opt/vector_dce.cpp index 911242e05..314d6513f 100644 --- a/3rdparty/spirv-tools/source/opt/vector_dce.cpp +++ b/3rdparty/spirv-tools/source/opt/vector_dce.cpp @@ -113,30 +113,44 @@ void VectorDCE::MarkInsertUsesAsLive( std::vector* work_list) { analysis::DefUseManager* def_use_mgr = context()->get_def_use_mgr(); - uint32_t insert_position = - current_item.instruction->GetSingleWordInOperand(2); + if (current_item.instruction->NumInOperands() > 2) { + uint32_t insert_position = + current_item.instruction->GetSingleWordInOperand(2); - // Add the elements of the composite object that are used. - uint32_t operand_id = - current_item.instruction->GetSingleWordInOperand(kInsertCompositeIdInIdx); - Instruction* operand_inst = def_use_mgr->GetDef(operand_id); + // Add the elements of the composite object that are used. + uint32_t operand_id = current_item.instruction->GetSingleWordInOperand( + kInsertCompositeIdInIdx); + Instruction* operand_inst = def_use_mgr->GetDef(operand_id); - WorkListItem new_item; - new_item.instruction = operand_inst; - new_item.components = current_item.components; - new_item.components.Clear(insert_position); + WorkListItem new_item; + new_item.instruction = operand_inst; + new_item.components = current_item.components; + new_item.components.Clear(insert_position); - AddItemToWorkListIfNeeded(new_item, live_components, work_list); + AddItemToWorkListIfNeeded(new_item, live_components, work_list); - // Add the element being inserted if it is used. - if (current_item.components.Get(insert_position)) { - uint32_t obj_operand_id = + // Add the element being inserted if it is used. + if (current_item.components.Get(insert_position)) { + uint32_t obj_operand_id = + current_item.instruction->GetSingleWordInOperand( + kInsertObjectIdInIdx); + Instruction* obj_operand_inst = def_use_mgr->GetDef(obj_operand_id); + WorkListItem new_item_for_obj; + new_item_for_obj.instruction = obj_operand_inst; + new_item_for_obj.components.Set(0); + AddItemToWorkListIfNeeded(new_item_for_obj, live_components, work_list); + } + } else { + // If there are no indices, then this is a copy of the object being + // inserted. + uint32_t object_id = current_item.instruction->GetSingleWordInOperand(kInsertObjectIdInIdx); - Instruction* obj_operand_inst = def_use_mgr->GetDef(obj_operand_id); - WorkListItem new_item_for_obj; - new_item_for_obj.instruction = obj_operand_inst; - new_item_for_obj.components.Set(0); - AddItemToWorkListIfNeeded(new_item_for_obj, live_components, work_list); + Instruction* object_inst = def_use_mgr->GetDef(object_id); + + WorkListItem new_item; + new_item.instruction = object_inst; + new_item.components = current_item.components; + AddItemToWorkListIfNeeded(new_item, live_components, work_list); } } @@ -323,14 +337,23 @@ bool VectorDCE::RewriteInstructions( bool VectorDCE::RewriteInsertInstruction( Instruction* current_inst, const utils::BitVector& live_components) { // If the value being inserted is not live, then we can skip the insert. - bool modified = false; + + if (current_inst->NumInOperands() == 2) { + // If there are no indices, then this is the same as a copy. + context()->KillNamesAndDecorates(current_inst->result_id()); + uint32_t object_id = + current_inst->GetSingleWordInOperand(kInsertObjectIdInIdx); + context()->ReplaceAllUsesWith(current_inst->result_id(), object_id); + return true; + } + uint32_t insert_index = current_inst->GetSingleWordInOperand(2); if (!live_components.Get(insert_index)) { - modified = true; context()->KillNamesAndDecorates(current_inst->result_id()); uint32_t composite_id = current_inst->GetSingleWordInOperand(kInsertCompositeIdInIdx); context()->ReplaceAllUsesWith(current_inst->result_id(), composite_id); + return true; } // If the values already in the composite are not used, then replace it with @@ -342,9 +365,10 @@ bool VectorDCE::RewriteInsertInstruction( uint32_t undef_id = Type2Undef(current_inst->type_id()); current_inst->SetInOperand(kInsertCompositeIdInIdx, {undef_id}); context()->AnalyzeUses(current_inst); + return true; } - return modified; + return false; } void VectorDCE::AddItemToWorkListIfNeeded( diff --git a/3rdparty/spirv-tools/source/opt/vector_dce.h b/3rdparty/spirv-tools/source/opt/vector_dce.h index 48886998d..638b34b6a 100644 --- a/3rdparty/spirv-tools/source/opt/vector_dce.h +++ b/3rdparty/spirv-tools/source/opt/vector_dce.h @@ -53,7 +53,8 @@ class VectorDCE : public MemPass { return IRContext::kAnalysisDefUse | IRContext::kAnalysisCFG | IRContext::kAnalysisInstrToBlockMapping | IRContext::kAnalysisLoopAnalysis | IRContext::kAnalysisDecorations | - IRContext::kAnalysisDominatorAnalysis | IRContext::kAnalysisNameMap; + IRContext::kAnalysisDominatorAnalysis | IRContext::kAnalysisNameMap | + IRContext::kAnalysisConstants | IRContext::kAnalysisTypes; } private: diff --git a/3rdparty/spirv-tools/source/pch_source.cpp b/3rdparty/spirv-tools/source/pch_source.cpp new file mode 100644 index 000000000..032e29ec4 --- /dev/null +++ b/3rdparty/spirv-tools/source/pch_source.cpp @@ -0,0 +1,15 @@ +// Copyright (c) 2018 The Khronos Group Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "pch_source.h" diff --git a/3rdparty/spirv-tools/source/pch_source.h b/3rdparty/spirv-tools/source/pch_source.h new file mode 100644 index 000000000..6695ba268 --- /dev/null +++ b/3rdparty/spirv-tools/source/pch_source.h @@ -0,0 +1,15 @@ +// Copyright (c) 2018 The Khronos Group Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "source/val/validation_state.h" diff --git a/3rdparty/spirv-tools/source/reduce/CMakeLists.txt b/3rdparty/spirv-tools/source/reduce/CMakeLists.txt new file mode 100644 index 000000000..0a6bce99c --- /dev/null +++ b/3rdparty/spirv-tools/source/reduce/CMakeLists.txt @@ -0,0 +1,74 @@ +# Copyright (c) 2018 Google LLC + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +set(SPIRV_TOOLS_REDUCE_SOURCES + change_operand_reduction_opportunity.h + change_operand_to_undef_reduction_opportunity.h + operand_to_const_reduction_pass.h + operand_to_undef_reduction_pass.h + operand_to_dominating_id_reduction_pass.h + reducer.h + reduction_opportunity.h + reduction_pass.h + reduction_util.h + remove_instruction_reduction_opportunity.h + remove_opname_instruction_reduction_pass.h + remove_unreferenced_instruction_reduction_pass.h + structured_loop_to_selection_reduction_opportunity.h + structured_loop_to_selection_reduction_pass.h + + change_operand_reduction_opportunity.cpp + change_operand_to_undef_reduction_opportunity.cpp + operand_to_const_reduction_pass.cpp + operand_to_undef_reduction_pass.cpp + operand_to_dominating_id_reduction_pass.cpp + reducer.cpp + reduction_opportunity.cpp + reduction_pass.cpp + reduction_util.cpp + remove_instruction_reduction_opportunity.cpp + remove_unreferenced_instruction_reduction_pass.cpp + remove_opname_instruction_reduction_pass.cpp + structured_loop_to_selection_reduction_opportunity.cpp + structured_loop_to_selection_reduction_pass.cpp + ) + +if(MSVC) + # Enable parallel builds across four cores for this lib + add_definitions(/MP4) +endif() + +spvtools_pch(SPIRV_TOOLS_REDUCE_SOURCES pch_source_reduce) + +add_library(SPIRV-Tools-reduce ${SPIRV_TOOLS_REDUCE_SOURCES}) + +spvtools_default_compile_options(SPIRV-Tools-reduce) +target_include_directories(SPIRV-Tools-reduce + PUBLIC ${spirv-tools_SOURCE_DIR}/include + PUBLIC ${SPIRV_HEADER_INCLUDE_DIR} + PRIVATE ${spirv-tools_BINARY_DIR} +) +# The reducer reuses a lot of functionality from the SPIRV-Tools library. +target_link_libraries(SPIRV-Tools-reduce + PUBLIC ${SPIRV_TOOLS} + PUBLIC SPIRV-Tools-opt) + +set_property(TARGET SPIRV-Tools-reduce PROPERTY FOLDER "SPIRV-Tools libraries") +spvtools_check_symbol_exports(SPIRV-Tools-reduce) + +if(ENABLE_SPIRV_TOOLS_INSTALL) + install(TARGETS SPIRV-Tools-reduce + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) +endif(ENABLE_SPIRV_TOOLS_INSTALL) diff --git a/3rdparty/spirv-tools/source/reduce/change_operand_reduction_opportunity.cpp b/3rdparty/spirv-tools/source/reduce/change_operand_reduction_opportunity.cpp new file mode 100644 index 000000000..5430d3e86 --- /dev/null +++ b/3rdparty/spirv-tools/source/reduce/change_operand_reduction_opportunity.cpp @@ -0,0 +1,32 @@ +// Copyright (c) 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "change_operand_reduction_opportunity.h" + +namespace spvtools { +namespace reduce { + +bool ChangeOperandReductionOpportunity::PreconditionHolds() { + // Check that the instruction still has the original operand. + return inst_->NumOperands() > operand_index_ && + inst_->GetOperand(operand_index_).words[0] == original_id_ && + inst_->GetOperand(operand_index_).type == original_type_; +} + +void ChangeOperandReductionOpportunity::Apply() { + inst_->SetOperand(operand_index_, {new_id_}); +} + +} // namespace reduce +} // namespace spvtools diff --git a/3rdparty/spirv-tools/source/reduce/change_operand_reduction_opportunity.h b/3rdparty/spirv-tools/source/reduce/change_operand_reduction_opportunity.h new file mode 100644 index 000000000..7e1fc8e3b --- /dev/null +++ b/3rdparty/spirv-tools/source/reduce/change_operand_reduction_opportunity.h @@ -0,0 +1,56 @@ +// Copyright (c) 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef SOURCE_REDUCE_CHANGE_OPERAND_REDUCTION_OPPORTUNITY_H_ +#define SOURCE_REDUCE_CHANGE_OPERAND_REDUCTION_OPPORTUNITY_H_ + +#include "reduction_opportunity.h" +#include "source/opt/instruction.h" +#include "spirv-tools/libspirv.h" + +namespace spvtools { +namespace reduce { + +using namespace opt; + +// An opportunity to replace an id operand of an instruction with some other id. +class ChangeOperandReductionOpportunity : public ReductionOpportunity { + public: + // Constructs the opportunity to replace operand |operand_index| of |inst| + // with |new_id|. + ChangeOperandReductionOpportunity(Instruction* inst, uint32_t operand_index, + uint32_t new_id) + : inst_(inst), + operand_index_(operand_index), + original_id_(inst->GetOperand(operand_index).words[0]), + original_type_(inst->GetOperand(operand_index).type), + new_id_(new_id) {} + + bool PreconditionHolds() override; + + protected: + void Apply() override; + + private: + Instruction* const inst_; + const uint32_t operand_index_; + const uint32_t original_id_; + const spv_operand_type_t original_type_; + const uint32_t new_id_; +}; + +} // namespace reduce +} // namespace spvtools + +#endif // SOURCE_REDUCE_CHANGE_OPERAND_REDUCTION_OPPORTUNITY_H_ diff --git a/3rdparty/spirv-tools/source/reduce/change_operand_to_undef_reduction_opportunity.cpp b/3rdparty/spirv-tools/source/reduce/change_operand_to_undef_reduction_opportunity.cpp new file mode 100644 index 000000000..8e33da661 --- /dev/null +++ b/3rdparty/spirv-tools/source/reduce/change_operand_to_undef_reduction_opportunity.cpp @@ -0,0 +1,41 @@ +// Copyright (c) 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "source/reduce/change_operand_to_undef_reduction_opportunity.h" + +#include "source/opt/ir_context.h" +#include "source/reduce/reduction_util.h" + +namespace spvtools { +namespace reduce { + +bool ChangeOperandToUndefReductionOpportunity::PreconditionHolds() { + // Check that the instruction still has the original operand. + return inst_->NumOperands() > operand_index_ && + inst_->GetOperand(operand_index_).words[0] == original_id_; +} + +void ChangeOperandToUndefReductionOpportunity::Apply() { + auto operand = inst_->GetOperand(operand_index_); + auto operand_id = operand.words[0]; + auto operand_id_def = context_->get_def_use_mgr()->GetDef(operand_id); + auto operand_type_id = operand_id_def->type_id(); + // The opportunity should not exist unless this holds. + assert(operand_type_id); + auto undef_id = FindOrCreateGlobalUndef(context_, operand_type_id); + inst_->SetOperand(operand_index_, {undef_id}); +} + +} // namespace reduce +} // namespace spvtools diff --git a/3rdparty/spirv-tools/source/reduce/change_operand_to_undef_reduction_opportunity.h b/3rdparty/spirv-tools/source/reduce/change_operand_to_undef_reduction_opportunity.h new file mode 100644 index 000000000..ffd3155b0 --- /dev/null +++ b/3rdparty/spirv-tools/source/reduce/change_operand_to_undef_reduction_opportunity.h @@ -0,0 +1,53 @@ +// Copyright (c) 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef SOURCE_REDUCE_CHANGE_OPERAND_TO_UNDEF_REDUCTION_OPPORTUNITY_H_ +#define SOURCE_REDUCE_CHANGE_OPERAND_TO_UNDEF_REDUCTION_OPPORTUNITY_H_ + +#include "source/opt/instruction.h" +#include "source/reduce/reduction_opportunity.h" +#include "spirv-tools/libspirv.h" + +namespace spvtools { +namespace reduce { + +// An opportunity to replace an id operand of an instruction with undef. +class ChangeOperandToUndefReductionOpportunity : public ReductionOpportunity { + public: + // Constructs the opportunity to replace operand |operand_index| of |inst| + // with undef. + ChangeOperandToUndefReductionOpportunity(opt::IRContext* context, + opt::Instruction* inst, + uint32_t operand_index) + : context_(context), + inst_(inst), + operand_index_(operand_index), + original_id_(inst->GetOperand(operand_index).words[0]) {} + + bool PreconditionHolds() override; + + protected: + void Apply() override; + + private: + opt::IRContext* context_; + opt::Instruction* const inst_; + const uint32_t operand_index_; + const uint32_t original_id_; +}; + +} // namespace reduce +} // namespace spvtools + +#endif // SOURCE_REDUCE_CHANGE_OPERAND_TO_UNDEF_REDUCTION_OPPORTUNITY_H_ diff --git a/3rdparty/spirv-tools/source/reduce/operand_to_const_reduction_pass.cpp b/3rdparty/spirv-tools/source/reduce/operand_to_const_reduction_pass.cpp new file mode 100644 index 000000000..4d04506e1 --- /dev/null +++ b/3rdparty/spirv-tools/source/reduce/operand_to_const_reduction_pass.cpp @@ -0,0 +1,83 @@ +// Copyright (c) 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "source/reduce/operand_to_const_reduction_pass.h" + +#include "source/opt/instruction.h" +#include "source/reduce/change_operand_reduction_opportunity.h" + +namespace spvtools { +namespace reduce { + +using namespace opt; + +std::vector> +OperandToConstReductionPass::GetAvailableOpportunities( + opt::IRContext* context) const { + std::vector> result; + assert(result.empty()); + + // We first loop over all constants. This means that all the reduction + // opportunities to replace an operand with a particular constant will be + // contiguous, and in particular it means that multiple, incompatible + // reduction opportunities that try to replace the same operand with distinct + // constants are likely to be discontiguous. This is good because the + // reducer works in the spirit of delta debugging and tries applying large + // contiguous blocks of opportunities early on, and we want to avoid having a + // large block of incompatible opportunities if possible. + for (const auto& constant : context->GetConstants()) { + for (auto& function : *context->module()) { + for (auto& block : function) { + for (auto& inst : block) { + // We iterate through the operands using an explicit index (rather + // than using a lambda) so that we use said index in the construction + // of a ChangeOperandReductionOpportunity + for (uint32_t index = 0; index < inst.NumOperands(); index++) { + const auto& operand = inst.GetOperand(index); + if (spvIsInIdType(operand.type)) { + const auto id = operand.words[0]; + auto def = context->get_def_use_mgr()->GetDef(id); + if (spvOpcodeIsConstant(def->opcode())) { + // The argument is already a constant. + continue; + } + if (def->opcode() == SpvOpFunction) { + // The argument refers to a function, e.g. the function called + // by OpFunctionCall; avoid replacing this with a constant of + // the function's return type. + continue; + } + auto type_id = def->type_id(); + if (type_id) { + if (constant->type_id() == type_id) { + result.push_back( + MakeUnique( + &inst, index, constant->result_id())); + } + } + } + } + } + } + } + } + return result; +} + +std::string OperandToConstReductionPass::GetName() const { + return "OperandToConstReductionPass"; +} + +} // namespace reduce +} // namespace spvtools diff --git a/3rdparty/spirv-tools/source/reduce/operand_to_const_reduction_pass.h b/3rdparty/spirv-tools/source/reduce/operand_to_const_reduction_pass.h new file mode 100644 index 000000000..4e7381e93 --- /dev/null +++ b/3rdparty/spirv-tools/source/reduce/operand_to_const_reduction_pass.h @@ -0,0 +1,48 @@ +// Copyright (c) 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef SOURCE_REDUCE_OPERAND_TO_CONST_REDUCTION_PASS_H_ +#define SOURCE_REDUCE_OPERAND_TO_CONST_REDUCTION_PASS_H_ + +#include "source/reduce/reduction_pass.h" + +namespace spvtools { +namespace reduce { + +// A reduction pass for replacing id operands of instructions with ids of +// constants. This reduces the extent to which ids of non-constants are used, +// paving the way for instructions that generate them to be eliminated by other +// passes. +class OperandToConstReductionPass : public ReductionPass { + public: + // Creates the reduction pass in the context of the given target environment + // |target_env| + explicit OperandToConstReductionPass(const spv_target_env target_env) + : ReductionPass(target_env) {} + + ~OperandToConstReductionPass() override = default; + + std::string GetName() const final; + + protected: + std::vector> GetAvailableOpportunities( + opt::IRContext* context) const final; + + private: +}; + +} // namespace reduce +} // namespace spvtools + +#endif // SOURCE_REDUCE_OPERAND_TO_CONST_REDUCTION_PASS_H_ diff --git a/3rdparty/spirv-tools/source/reduce/operand_to_dominating_id_reduction_pass.cpp b/3rdparty/spirv-tools/source/reduce/operand_to_dominating_id_reduction_pass.cpp new file mode 100644 index 000000000..9280a41dd --- /dev/null +++ b/3rdparty/spirv-tools/source/reduce/operand_to_dominating_id_reduction_pass.cpp @@ -0,0 +1,114 @@ +// Copyright (c) 2018 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "operand_to_dominating_id_reduction_pass.h" +#include "change_operand_reduction_opportunity.h" +#include "source/opt/instruction.h" + +namespace spvtools { +namespace reduce { + +using namespace opt; + +std::vector> +OperandToDominatingIdReductionPass::GetAvailableOpportunities( + opt::IRContext* context) const { + std::vector> result; + + // Go through every instruction in every block, considering it as a potential + // dominator of other instructions. We choose this order for two reasons: + // + // (1) it is profitable for multiple opportunities to replace the same id x by + // different dominating ids y and z to be discontiguous, as they are + // incompatible. + // + // (2) We want to prioritise opportunities to replace an id with a more + // distant dominator. Intuitively, in a human-readable programming language + // if we have a complex expression e with many sub-expressions, we would like + // to prioritise replacing e with its smallest sub-expressions; generalising + // this idea to dominating ids this roughly corresponds to more distant + // dominators. + for (auto& function : *context->module()) { + for (auto dominating_block = function.begin(); + dominating_block != function.end(); ++dominating_block) { + for (auto& dominating_inst : *dominating_block) { + if (dominating_inst.HasResultId() && dominating_inst.type_id()) { + // Consider replacing any operand with matching type in a dominated + // instruction with the id generated by this instruction. + GetOpportunitiesForDominatingInst( + &result, &dominating_inst, dominating_block, &function, context); + } + } + } + } + return result; +} + +void OperandToDominatingIdReductionPass::GetOpportunitiesForDominatingInst( + std::vector>* opportunities, + opt::Instruction* candidate_dominator, + opt::Function::iterator candidate_dominator_block, opt::Function* function, + opt::IRContext* context) const { + assert(candidate_dominator->HasResultId()); + assert(candidate_dominator->type_id()); + auto dominator_analysis = context->GetDominatorAnalysis(function); + // SPIR-V requires a block to precede all blocks it dominates, so it suffices + // to search from the candidate dominator block onwards. + for (auto block = candidate_dominator_block; block != function->end(); + ++block) { + if (!dominator_analysis->Dominates(&*candidate_dominator_block, &*block)) { + // If the candidate dominator block doesn't dominate this block then there + // cannot be any of the desired reduction opportunities in this block. + continue; + } + for (auto& inst : *block) { + // We iterate through the operands using an explicit index (rather + // than using a lambda) so that we use said index in the construction + // of a ChangeOperandReductionOpportunity + for (uint32_t index = 0; index < inst.NumOperands(); index++) { + const auto& operand = inst.GetOperand(index); + if (spvIsInIdType(operand.type)) { + const auto id = operand.words[0]; + auto def = context->get_def_use_mgr()->GetDef(id); + assert(def); + if (!context->get_instr_block(def)) { + // The definition does not come from a block; e.g. it might be a + // constant. It is thus not relevant to this pass. + continue; + } + // Sanity check that we don't get here if the argument is a constant. + assert(!context->get_constant_mgr()->GetConstantFromInst(def)); + if (def->type_id() != candidate_dominator->type_id()) { + // The types need to match. + continue; + } + if (candidate_dominator != def && + dominator_analysis->Dominates(candidate_dominator, def)) { + // A hit: the candidate dominator strictly dominates the definition. + opportunities->push_back( + MakeUnique( + &inst, index, candidate_dominator->result_id())); + } + } + } + } + } +} + +std::string OperandToDominatingIdReductionPass::GetName() const { + return "OperandToDominatingIdReductionPass"; +} + +} // namespace reduce +} // namespace spvtools diff --git a/3rdparty/spirv-tools/source/reduce/operand_to_dominating_id_reduction_pass.h b/3rdparty/spirv-tools/source/reduce/operand_to_dominating_id_reduction_pass.h new file mode 100644 index 000000000..36bb20112 --- /dev/null +++ b/3rdparty/spirv-tools/source/reduce/operand_to_dominating_id_reduction_pass.h @@ -0,0 +1,59 @@ +// Copyright (c) 2018 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef SOURCE_REDUCE_OPERAND_TO_DOMINATING_ID_REDUCTION_PASS_H_ +#define SOURCE_REDUCE_OPERAND_TO_DOMINATING_ID_REDUCTION_PASS_H_ + +#include "reduction_pass.h" + +namespace spvtools { +namespace reduce { + +// A reduction pass that aims to bring to SPIR-V (and generalize) the idea from +// human-readable languages of e.g. replacing an expression with one of its +// arguments, (x + y) -> x, or with a reference to an identifier that was +// assigned to higher up in the program. The generalization of this is to +// replace an id with a different id of the same type defined in some +// dominating instruction. +// +// If id x is defined and then used several times, changing each use of x to +// some dominating definition may eventually allow the statement defining x +// to be eliminated by another pass. +class OperandToDominatingIdReductionPass : public ReductionPass { + public: + // Creates the reduction pass in the context of the given target environment + // |target_env| + explicit OperandToDominatingIdReductionPass(const spv_target_env target_env) + : ReductionPass(target_env) {} + + ~OperandToDominatingIdReductionPass() override = default; + + std::string GetName() const final; + + protected: + std::vector> GetAvailableOpportunities( + opt::IRContext* context) const final; + + private: + void GetOpportunitiesForDominatingInst( + std::vector>* opportunities, + opt::Instruction* dominating_instruction, + opt::Function::iterator candidate_dominator_block, + opt::Function* function, opt::IRContext* context) const; +}; + +} // namespace reduce +} // namespace spvtools + +#endif // SOURCE_REDUCE_OPERAND_TO_DOMINATING_ID_REDUCTION_PASS_H_ diff --git a/3rdparty/spirv-tools/source/reduce/operand_to_undef_reduction_pass.cpp b/3rdparty/spirv-tools/source/reduce/operand_to_undef_reduction_pass.cpp new file mode 100644 index 000000000..e3d8a8ea3 --- /dev/null +++ b/3rdparty/spirv-tools/source/reduce/operand_to_undef_reduction_pass.cpp @@ -0,0 +1,94 @@ +// Copyright (c) 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "source/reduce/operand_to_undef_reduction_pass.h" + +#include "source/opt/instruction.h" +#include "source/reduce/change_operand_to_undef_reduction_opportunity.h" + +namespace spvtools { +namespace reduce { + +using namespace opt; + +std::vector> +OperandToUndefReductionPass::GetAvailableOpportunities( + IRContext* context) const { + std::vector> result; + + for (auto& function : *context->module()) { + for (auto& block : function) { + for (auto& inst : block) { + // Skip instructions that result in a pointer type. + auto type_id = inst.type_id(); + if (type_id) { + auto type_id_def = context->get_def_use_mgr()->GetDef(type_id); + if (type_id_def->opcode() == SpvOpTypePointer) { + continue; + } + } + + // We iterate through the operands using an explicit index (rather + // than using a lambda) so that we use said index in the construction + // of a ChangeOperandToUndefReductionOpportunity + for (uint32_t index = 0; index < inst.NumOperands(); index++) { + const auto& operand = inst.GetOperand(index); + + if (spvIsInIdType(operand.type)) { + const auto operand_id = operand.words[0]; + auto operand_id_def = + context->get_def_use_mgr()->GetDef(operand_id); + + // Skip constant and undef operands. + // We always want the reducer to make the module "smaller", which + // ensures termination. + // Therefore, we assume: id > undef id > constant id. + if (spvOpcodeIsConstantOrUndef(operand_id_def->opcode())) { + continue; + } + + // Don't replace function operands with undef. + if (operand_id_def->opcode() == SpvOpFunction) { + continue; + } + + // Only consider operands that have a type. + auto operand_type_id = operand_id_def->type_id(); + if (operand_type_id) { + auto operand_type_id_def = + context->get_def_use_mgr()->GetDef(operand_type_id); + + // Skip pointer operands. + if (operand_type_id_def->opcode() == SpvOpTypePointer) { + continue; + } + + result.push_back( + MakeUnique( + context, &inst, index)); + } + } + } + } + } + } + return result; +} + +std::string OperandToUndefReductionPass::GetName() const { + return "OperandToUndefReductionPass"; +} + +} // namespace reduce +} // namespace spvtools diff --git a/3rdparty/spirv-tools/source/reduce/operand_to_undef_reduction_pass.h b/3rdparty/spirv-tools/source/reduce/operand_to_undef_reduction_pass.h new file mode 100644 index 000000000..e4ec603fb --- /dev/null +++ b/3rdparty/spirv-tools/source/reduce/operand_to_undef_reduction_pass.h @@ -0,0 +1,45 @@ +// Copyright (c) 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef SOURCE_REDUCE_OPERAND_TO_UNDEF_REDUCTION_PASS_H_ +#define SOURCE_REDUCE_OPERAND_TO_UNDEF_REDUCTION_PASS_H_ + +#include "source/reduce/reduction_pass.h" + +namespace spvtools { +namespace reduce { + +// A reduction pass for replacing id operands of instructions with ids of undef. +class OperandToUndefReductionPass : public ReductionPass { + public: + // Creates the reduction pass in the context of the given target environment + // |target_env| + explicit OperandToUndefReductionPass(const spv_target_env target_env) + : ReductionPass(target_env) {} + + ~OperandToUndefReductionPass() override = default; + + std::string GetName() const final; + + protected: + std::vector> GetAvailableOpportunities( + opt::IRContext* context) const final; + + private: +}; + +} // namespace reduce +} // namespace spvtools + +#endif // SOURCE_REDUCE_OPERAND_TO_UNDEF_REDUCTION_PASS_H_ diff --git a/3rdparty/spirv-tools/source/reduce/pch_source_reduce.cpp b/3rdparty/spirv-tools/source/reduce/pch_source_reduce.cpp new file mode 100644 index 000000000..61e743645 --- /dev/null +++ b/3rdparty/spirv-tools/source/reduce/pch_source_reduce.cpp @@ -0,0 +1,15 @@ +// Copyright (c) 2018 The Khronos Group Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "pch_source_reduce.h" diff --git a/3rdparty/spirv-tools/source/reduce/pch_source_reduce.h b/3rdparty/spirv-tools/source/reduce/pch_source_reduce.h new file mode 100644 index 000000000..823b55a8a --- /dev/null +++ b/3rdparty/spirv-tools/source/reduce/pch_source_reduce.h @@ -0,0 +1,23 @@ +// Copyright (c) 2018 The Khronos Group Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#include +#include +#include "source/reduce/change_operand_reduction_opportunity.h" +#include "source/reduce/operand_to_const_reduction_pass.h" +#include "source/reduce/reduction_opportunity.h" +#include "source/reduce/reduction_pass.h" +#include "source/reduce/remove_instruction_reduction_opportunity.h" +#include "source/reduce/remove_unreferenced_instruction_reduction_pass.h" diff --git a/3rdparty/spirv-tools/source/reduce/reducer.cpp b/3rdparty/spirv-tools/source/reduce/reducer.cpp new file mode 100644 index 000000000..4f4429aab --- /dev/null +++ b/3rdparty/spirv-tools/source/reduce/reducer.cpp @@ -0,0 +1,154 @@ +// Copyright (c) 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#include + +#include "source/spirv_reducer_options.h" + +#include "reducer.h" +#include "reduction_pass.h" + +namespace spvtools { +namespace reduce { + +struct Reducer::Impl { + explicit Impl(spv_target_env env) : target_env(env) {} + + bool ReachedStepLimit(uint32_t current_step, + spv_const_reducer_options options); + + const spv_target_env target_env; // Target environment. + MessageConsumer consumer; // Message consumer. + InterestingnessFunction interestingness_function; + std::vector> passes; +}; + +Reducer::Reducer(spv_target_env env) : impl_(MakeUnique(env)) {} + +Reducer::~Reducer() = default; + +void Reducer::SetMessageConsumer(MessageConsumer c) { + for (auto& pass : impl_->passes) { + pass->SetMessageConsumer(c); + } + impl_->consumer = std::move(c); +} + +void Reducer::SetInterestingnessFunction( + Reducer::InterestingnessFunction interestingness_function) { + impl_->interestingness_function = std::move(interestingness_function); +} + +Reducer::ReductionResultStatus Reducer::Run( + std::vector&& binary_in, std::vector* binary_out, + spv_const_reducer_options options) const { + std::vector current_binary = binary_in; + + // Keeps track of how many reduction attempts have been tried. Reduction + // bails out if this reaches a given limit. + uint32_t reductions_applied = 0; + + // Initial state should be interesting. + if (!impl_->interestingness_function(current_binary, reductions_applied)) { + impl_->consumer(SPV_MSG_INFO, nullptr, {}, + "Initial state was not interesting; stopping."); + return Reducer::ReductionResultStatus::kInitialStateNotInteresting; + } + + // Determines whether, on completing one round of reduction passes, it is + // worthwhile trying a further round. + bool another_round_worthwhile = true; + + // Apply round after round of reduction passes until we hit the reduction + // step limit, or deem that another round is not going to be worthwhile. + while (!impl_->ReachedStepLimit(reductions_applied, options) && + another_round_worthwhile) { + // At the start of a round of reduction passes, assume another round will + // not be worthwhile unless we find evidence to the contrary. + another_round_worthwhile = false; + + // Iterate through the available passes + for (auto& pass : impl_->passes) { + // If this pass hasn't reached its minimum granularity then it's + // worth eventually doing another round of reductions, in order to + // try this pass at a finer granularity. + another_round_worthwhile |= !pass->ReachedMinimumGranularity(); + + // Keep applying this pass at its current granularity until it stops + // working or we hit the reduction step limit. + impl_->consumer(SPV_MSG_INFO, nullptr, {}, + ("Trying pass " + pass->GetName() + ".").c_str()); + do { + auto maybe_result = pass->TryApplyReduction(current_binary); + if (maybe_result.empty()) { + // This pass did not have any impact, so move on to the next pass. + impl_->consumer( + SPV_MSG_INFO, nullptr, {}, + ("Pass " + pass->GetName() + " did not make a reduction step.") + .c_str()); + break; + } + std::stringstream stringstream; + reductions_applied++; + stringstream << "Pass " << pass->GetName() << " made reduction step " + << reductions_applied << "."; + impl_->consumer(SPV_MSG_INFO, nullptr, {}, + (stringstream.str().c_str())); + if (!spvtools::SpirvTools(impl_->target_env).Validate(maybe_result)) { + // The reduction step went wrong and an invalid binary was produced. + // By design, this shouldn't happen; this is a safeguard to stop an + // invalid binary from being regarded as interesting. + impl_->consumer(SPV_MSG_INFO, nullptr, {}, + "Reduction step produced an invalid binary."); + } else if (impl_->interestingness_function(maybe_result, + reductions_applied)) { + // Success! The binary produced by this reduction step is + // interesting, so make it the binary of interest henceforth, and + // note that it's worth doing another round of reduction passes. + impl_->consumer(SPV_MSG_INFO, nullptr, {}, + "Reduction step succeeded."); + current_binary = std::move(maybe_result); + another_round_worthwhile = true; + } + // Bail out if the reduction step limit has been reached. + } while (!impl_->ReachedStepLimit(reductions_applied, options)); + } + } + + *binary_out = std::move(current_binary); + + // Report whether reduction completed, or bailed out early due to reaching + // the step limit. + if (impl_->ReachedStepLimit(reductions_applied, options)) { + impl_->consumer(SPV_MSG_INFO, nullptr, {}, + "Reached reduction step limit; stopping."); + return Reducer::ReductionResultStatus::kReachedStepLimit; + } + impl_->consumer(SPV_MSG_INFO, nullptr, {}, "No more to reduce; stopping."); + return Reducer::ReductionResultStatus::kComplete; +} + +void Reducer::AddReductionPass( + std::unique_ptr&& reduction_pass) { + impl_->passes.push_back(std::move(reduction_pass)); +} + +bool Reducer::Impl::ReachedStepLimit(uint32_t current_step, + spv_const_reducer_options options) { + return current_step >= options->step_limit; +} + +} // namespace reduce +} // namespace spvtools diff --git a/3rdparty/spirv-tools/source/reduce/reducer.h b/3rdparty/spirv-tools/source/reduce/reducer.h new file mode 100644 index 000000000..3a4c26c97 --- /dev/null +++ b/3rdparty/spirv-tools/source/reduce/reducer.h @@ -0,0 +1,97 @@ +// Copyright (c) 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef SOURCE_REDUCE_REDUCER_H_ +#define SOURCE_REDUCE_REDUCER_H_ + +#include +#include + +#include "spirv-tools/libspirv.hpp" + +#include "reduction_pass.h" + +namespace spvtools { +namespace reduce { + +// This class manages the process of applying a reduction -- parameterized by a +// number of reduction passes and an interestingness test, to a SPIR-V binary. +class Reducer { + public: + // Possible statuses that can result from running a reduction. + enum ReductionResultStatus { + kInitialStateNotInteresting, + kReachedStepLimit, + kComplete + }; + + // The type for a function that will take a binary and return true if and + // only if the binary is deemed interesting. (The function also takes an + // integer argument that will be incremented each time the function is + // called; this is for debugging purposes). + // + // The notion of "interesting" depends on what properties of the binary or + // tools that process the binary we are trying to maintain during reduction. + using InterestingnessFunction = + std::function&, uint32_t)>; + + // Constructs an instance with the given target |env|, which is used to + // decode the binary to be reduced later. + // + // The constructed instance will have an empty message consumer, which just + // ignores all messages from the library. Use SetMessageConsumer() to supply + // one if messages are of concern. + // + // The constructed instance also needs to have an interestingness function + // set and some reduction passes added to it in order to be useful. + explicit Reducer(spv_target_env env); + + // Disables copy/move constructor/assignment operations. + Reducer(const Reducer&) = delete; + Reducer(Reducer&&) = delete; + Reducer& operator=(const Reducer&) = delete; + Reducer& operator=(Reducer&&) = delete; + + // Destructs this instance. + ~Reducer(); + + // Sets the message consumer to the given |consumer|. The |consumer| will be + // invoked once for each message communicated from the library. + void SetMessageConsumer(MessageConsumer consumer); + + // Sets the function that will be used to decide whether a reduced binary + // turned out to be interesting. + void SetInterestingnessFunction( + InterestingnessFunction interestingness_function); + + // Adds a reduction pass to the sequence of passes that will be iterated + // over. + void AddReductionPass(std::unique_ptr&& reduction_pass); + + // Reduces the given SPIR-V module |binary_out|. + // The reduced binary ends up in |binary_out|. + // A status is returned. + ReductionResultStatus Run(std::vector&& binary_in, + std::vector* binary_out, + spv_const_reducer_options options) const; + + private: + struct Impl; // Opaque struct for holding internal data. + std::unique_ptr impl_; // Unique pointer to internal data. +}; + +} // namespace reduce +} // namespace spvtools + +#endif // SOURCE_REDUCE_REDUCER_H_ diff --git a/3rdparty/spirv-tools/source/reduce/reduction_opportunity.cpp b/3rdparty/spirv-tools/source/reduce/reduction_opportunity.cpp new file mode 100644 index 000000000..f562678dc --- /dev/null +++ b/3rdparty/spirv-tools/source/reduce/reduction_opportunity.cpp @@ -0,0 +1,27 @@ +// Copyright (c) 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "reduction_opportunity.h" + +namespace spvtools { +namespace reduce { + +void ReductionOpportunity::TryToApply() { + if (PreconditionHolds()) { + Apply(); + } +} + +} // namespace reduce +} // namespace spvtools diff --git a/3rdparty/spirv-tools/source/reduce/reduction_opportunity.h b/3rdparty/spirv-tools/source/reduce/reduction_opportunity.h new file mode 100644 index 000000000..703a50a46 --- /dev/null +++ b/3rdparty/spirv-tools/source/reduce/reduction_opportunity.h @@ -0,0 +1,47 @@ +// Copyright (c) 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef SOURCE_REDUCE_REDUCTION_OPPORTUNITY_H_ +#define SOURCE_REDUCE_REDUCTION_OPPORTUNITY_H_ + +#include "spirv-tools/libspirv.hpp" + +namespace spvtools { +namespace reduce { + +// Abstract class: an opportunity to apply a reducing transformation. +class ReductionOpportunity { + public: + ReductionOpportunity() = default; + virtual ~ReductionOpportunity() = default; + + // Returns true if this opportunity has not been disabled by the application + // of another conflicting opportunity. + virtual bool PreconditionHolds() = 0; + + // Applies the opportunity, mutating the module from which the opportunity was + // created. It is a no-op if PreconditionHolds() returns false. + void TryToApply(); + + protected: + // Applies the opportunity, mutating the module from which the opportunity was + // created. + // Precondition: PreconditionHolds() must return true. + virtual void Apply() = 0; +}; + +} // namespace reduce +} // namespace spvtools + +#endif // SOURCE_REDUCE_REDUCTION_OPPORTUNITY_H_ diff --git a/3rdparty/spirv-tools/source/reduce/reduction_pass.cpp b/3rdparty/spirv-tools/source/reduce/reduction_pass.cpp new file mode 100644 index 000000000..befba8bc6 --- /dev/null +++ b/3rdparty/spirv-tools/source/reduce/reduction_pass.cpp @@ -0,0 +1,86 @@ +// Copyright (c) 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include + +#include "reduction_pass.h" + +#include "source/opt/build_module.h" + +namespace spvtools { +namespace reduce { + +std::vector ReductionPass::TryApplyReduction( + const std::vector& binary) { + // We represent modules as binaries because (a) attempts at reduction need to + // end up in binary form to be passed on to SPIR-V-consuming tools, and (b) + // when we apply a reduction step we need to do it on a fresh version of the + // module as if the reduction step proves to be uninteresting we need to + // backtrack; re-parsing from binary provides a very clean way of cloning the + // module. + std::unique_ptr context = + BuildModule(target_env_, consumer_, binary.data(), binary.size()); + assert(context); + + std::vector> opportunities = + GetAvailableOpportunities(context.get()); + + if (!is_initialized_) { + is_initialized_ = true; + index_ = 0; + granularity_ = (uint32_t)opportunities.size(); + } + + if (opportunities.empty()) { + granularity_ = 1; + return std::vector(); + } + + assert(granularity_ > 0); + + if (index_ >= opportunities.size()) { + index_ = 0; + granularity_ = std::max((uint32_t)1, granularity_ / 2); + return std::vector(); + } + + for (uint32_t i = index_; + i < std::min(index_ + granularity_, (uint32_t)opportunities.size()); + ++i) { + opportunities[i]->TryToApply(); + } + + index_ += granularity_; + + std::vector result; + context->module()->ToBinary(&result, false); + return result; +} + +void ReductionPass::SetMessageConsumer(MessageConsumer consumer) { + consumer_ = std::move(consumer); +} + +bool ReductionPass::ReachedMinimumGranularity() const { + if (!is_initialized_) { + // Conceptually we can think that if the pass has not yet been initialized, + // it is operating at unbounded granularity. + return false; + } + assert(granularity_ != 0); + return granularity_ == 1; +} + +} // namespace reduce +} // namespace spvtools diff --git a/3rdparty/spirv-tools/source/reduce/reduction_pass.h b/3rdparty/spirv-tools/source/reduce/reduction_pass.h new file mode 100644 index 000000000..57e1c5f66 --- /dev/null +++ b/3rdparty/spirv-tools/source/reduce/reduction_pass.h @@ -0,0 +1,73 @@ +// Copyright (c) 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef SOURCE_REDUCE_REDUCTION_PASS_H_ +#define SOURCE_REDUCE_REDUCTION_PASS_H_ + +#include "spirv-tools/libspirv.hpp" + +#include "reduction_opportunity.h" +#include "source/opt/ir_context.h" + +namespace spvtools { +namespace reduce { + +// Abstract class representing a reduction pass, which can be repeatedly +// invoked to find and apply particular reduction opportunities to a SPIR-V +// binary. In the spirit of delta debugging, a pass initially tries to apply +// large chunks of reduction opportunities, iterating through available +// opportunities at a given granularity. When an iteration over available +// opportunities completes, the granularity is reduced and iteration starts +// again, until the minimum granularity is reached. +class ReductionPass { + public: + // Constructs a reduction pass with a given target environment, |target_env|. + // Initially the pass is uninitialized. + explicit ReductionPass(const spv_target_env target_env) + : target_env_(target_env), is_initialized_(false) {} + + virtual ~ReductionPass() = default; + + // Applies the reduction pass to the given binary. + std::vector TryApplyReduction(const std::vector& binary); + + // Sets a consumer to which relevant messages will be directed. + void SetMessageConsumer(MessageConsumer consumer); + + // Returns true if the granularity with which reduction opportunities are + // applied has reached a minimum. + bool ReachedMinimumGranularity() const; + + // Returns the name of the reduction pass (useful for monitoring reduction + // progress). + virtual std::string GetName() const = 0; + + protected: + // Finds and returns the reduction opportunities relevant to this pass that + // could be applied to the given SPIR-V module. + virtual std::vector> + GetAvailableOpportunities(opt::IRContext* context) const = 0; + + private: + const spv_target_env target_env_; + MessageConsumer consumer_; + bool is_initialized_; + uint32_t index_; + uint32_t granularity_; +}; + +} // namespace reduce +} // namespace spvtools + +#endif // SOURCE_REDUCE_REDUCTION_PASS_H_ diff --git a/3rdparty/spirv-tools/source/reduce/reduction_util.cpp b/3rdparty/spirv-tools/source/reduce/reduction_util.cpp new file mode 100644 index 000000000..103d63f19 --- /dev/null +++ b/3rdparty/spirv-tools/source/reduce/reduction_util.cpp @@ -0,0 +1,44 @@ +// Copyright (c) 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "source/reduce/reduction_util.h" + +#include "source/opt/ir_context.h" + +namespace spvtools { +namespace reduce { + +using namespace opt; + +uint32_t FindOrCreateGlobalUndef(IRContext* context, uint32_t type_id) { + for (auto& inst : context->module()->types_values()) { + if (inst.opcode() != SpvOpUndef) { + continue; + } + if (inst.type_id() == type_id) { + return inst.result_id(); + } + } + // TODO(2182): this is adapted from MemPass::Type2Undef. In due course it + // would be good to factor out this duplication. + const uint32_t undef_id = context->TakeNextId(); + std::unique_ptr undef_inst( + new Instruction(context, SpvOpUndef, type_id, undef_id, {})); + assert(undef_id == undef_inst->result_id()); + context->module()->AddGlobalValue(std::move(undef_inst)); + return undef_id; +} + +} // namespace reduce +} // namespace spvtools diff --git a/3rdparty/spirv-tools/source/reduce/reduction_util.h b/3rdparty/spirv-tools/source/reduce/reduction_util.h new file mode 100644 index 000000000..d8efc9705 --- /dev/null +++ b/3rdparty/spirv-tools/source/reduce/reduction_util.h @@ -0,0 +1,33 @@ +// Copyright (c) 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef SOURCE_REDUCE_REDUCTION_UTIL_H_ +#define SOURCE_REDUCE_REDUCTION_UTIL_H_ + +#include "spirv-tools/libspirv.hpp" + +#include "source/opt/ir_context.h" +#include "source/reduce/reduction_opportunity.h" + +namespace spvtools { +namespace reduce { + +// Returns an OpUndef id from the global value list that is of the given type, +// adding one if it does not exist. +uint32_t FindOrCreateGlobalUndef(opt::IRContext* context, uint32_t type_id); + +} // namespace reduce +} // namespace spvtools + +#endif // SOURCE_REDUCE_REDUCTION_UTIL_H_ diff --git a/3rdparty/spirv-tools/source/reduce/remove_instruction_reduction_opportunity.cpp b/3rdparty/spirv-tools/source/reduce/remove_instruction_reduction_opportunity.cpp new file mode 100644 index 000000000..7b7a74e48 --- /dev/null +++ b/3rdparty/spirv-tools/source/reduce/remove_instruction_reduction_opportunity.cpp @@ -0,0 +1,29 @@ +// Copyright (c) 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "source/opt/ir_context.h" + +#include "remove_instruction_reduction_opportunity.h" + +namespace spvtools { +namespace reduce { + +bool RemoveInstructionReductionOpportunity::PreconditionHolds() { return true; } + +void RemoveInstructionReductionOpportunity::Apply() { + inst_->context()->KillInst(inst_); +} + +} // namespace reduce +} // namespace spvtools diff --git a/3rdparty/spirv-tools/source/reduce/remove_instruction_reduction_opportunity.h b/3rdparty/spirv-tools/source/reduce/remove_instruction_reduction_opportunity.h new file mode 100644 index 000000000..e9f442e3f --- /dev/null +++ b/3rdparty/spirv-tools/source/reduce/remove_instruction_reduction_opportunity.h @@ -0,0 +1,46 @@ +// Copyright (c) 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef SOURCE_REDUCE_REMOVE_INSTRUCTION_REDUCTION_OPPORTUNITY_H_ +#define SOURCE_REDUCE_REMOVE_INSTRUCTION_REDUCTION_OPPORTUNITY_H_ + +#include "reduction_opportunity.h" +#include "source/opt/instruction.h" + +namespace spvtools { +namespace reduce { + +using namespace opt; + +// An opportunity to remove an instruction from the SPIR-V module. +class RemoveInstructionReductionOpportunity : public ReductionOpportunity { + public: + // Constructs the opportunity to remove |inst|. + explicit RemoveInstructionReductionOpportunity(Instruction* inst) + : inst_(inst) {} + + // Always returns true, as this opportunity can always be applied. + bool PreconditionHolds() override; + + protected: + void Apply() override; + + private: + Instruction* inst_; +}; + +} // namespace reduce +} // namespace spvtools + +#endif // SOURCE_REDUCE_REMOVE_INSTRUCTION_REDUCTION_OPPORTUNITY_H_ diff --git a/3rdparty/spirv-tools/source/reduce/remove_opname_instruction_reduction_pass.cpp b/3rdparty/spirv-tools/source/reduce/remove_opname_instruction_reduction_pass.cpp new file mode 100644 index 000000000..bf99bc57f --- /dev/null +++ b/3rdparty/spirv-tools/source/reduce/remove_opname_instruction_reduction_pass.cpp @@ -0,0 +1,44 @@ +// Copyright (c) 2018 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "remove_opname_instruction_reduction_pass.h" +#include "remove_instruction_reduction_opportunity.h" +#include "source/opcode.h" +#include "source/opt/instruction.h" + +namespace spvtools { +namespace reduce { + +using namespace opt; + +std::vector> +RemoveOpNameInstructionReductionPass::GetAvailableOpportunities( + opt::IRContext* context) const { + std::vector> result; + + for (auto& inst : context->module()->debugs2()) { + if (inst.opcode() == SpvOpName || inst.opcode() == SpvOpMemberName) { + result.push_back( + MakeUnique(&inst)); + } + } + return result; +} + +std::string RemoveOpNameInstructionReductionPass::GetName() const { + return "RemoveOpNameInstructionReductionPass"; +} + +} // namespace reduce +} // namespace spvtools diff --git a/3rdparty/spirv-tools/source/reduce/remove_opname_instruction_reduction_pass.h b/3rdparty/spirv-tools/source/reduce/remove_opname_instruction_reduction_pass.h new file mode 100644 index 000000000..2990a49cc --- /dev/null +++ b/3rdparty/spirv-tools/source/reduce/remove_opname_instruction_reduction_pass.h @@ -0,0 +1,48 @@ +// Copyright (c) 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef SOURCE_REDUCE_REMOVE_OPNAME_INSTRUCTION_REDUCTION_PASS_H_ +#define SOURCE_REDUCE_REMOVE_OPNAME_INSTRUCTION_REDUCTION_PASS_H_ + +#include "reduction_pass.h" + +namespace spvtools { +namespace reduce { + +// A reduction pass for removing OpName instructions. As well as making the +// module smaller, removing an OpName instruction may create opportunities +// for subsequently removing the instructions that create the ids to which the +// OpName applies. +class RemoveOpNameInstructionReductionPass : public ReductionPass { + public: + // Creates the reduction pass in the context of the given target environment + // |target_env| + explicit RemoveOpNameInstructionReductionPass(const spv_target_env target_env) + : ReductionPass(target_env) {} + + ~RemoveOpNameInstructionReductionPass() override = default; + + std::string GetName() const final; + + protected: + std::vector> GetAvailableOpportunities( + opt::IRContext* context) const final; + + private: +}; + +} // namespace reduce +} // namespace spvtools + +#endif // SOURCE_REDUCE_REMOVE_OpName_INSTRUCTION_REDUCTION_PASS_H_ diff --git a/3rdparty/spirv-tools/source/reduce/remove_unreferenced_instruction_reduction_pass.cpp b/3rdparty/spirv-tools/source/reduce/remove_unreferenced_instruction_reduction_pass.cpp new file mode 100644 index 000000000..bc4998d6a --- /dev/null +++ b/3rdparty/spirv-tools/source/reduce/remove_unreferenced_instruction_reduction_pass.cpp @@ -0,0 +1,60 @@ +// Copyright (c) 2018 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "remove_unreferenced_instruction_reduction_pass.h" +#include "remove_instruction_reduction_opportunity.h" +#include "source/opcode.h" +#include "source/opt/instruction.h" + +namespace spvtools { +namespace reduce { + +using namespace opt; + +std::vector> +RemoveUnreferencedInstructionReductionPass::GetAvailableOpportunities( + opt::IRContext* context) const { + std::vector> result; + + for (auto& function : *context->module()) { + for (auto& block : function) { + for (auto& inst : block) { + if (context->get_def_use_mgr()->NumUses(&inst) > 0) { + continue; + } + if (spvOpcodeIsBlockTerminator(inst.opcode()) || + inst.opcode() == SpvOpSelectionMerge || + inst.opcode() == SpvOpLoopMerge) { + // In this reduction pass we do not want to affect static control + // flow. + continue; + } + // Given that we're in a block, we should only get here if the + // instruction is not directly related to control flow; i.e., it's + // some straightforward instruction with an unused result, like an + // arithmetic operation or function call. + result.push_back( + MakeUnique(&inst)); + } + } + } + return result; +} + +std::string RemoveUnreferencedInstructionReductionPass::GetName() const { + return "RemoveUnreferencedInstructionReductionPass"; +} + +} // namespace reduce +} // namespace spvtools diff --git a/3rdparty/spirv-tools/source/reduce/remove_unreferenced_instruction_reduction_pass.h b/3rdparty/spirv-tools/source/reduce/remove_unreferenced_instruction_reduction_pass.h new file mode 100644 index 000000000..44a0d55e9 --- /dev/null +++ b/3rdparty/spirv-tools/source/reduce/remove_unreferenced_instruction_reduction_pass.h @@ -0,0 +1,50 @@ +// Copyright (c) 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef SOURCE_REDUCE_REMOVE_UNREFERENCED_INSTRUCTION_REDUCTION_PASS_H_ +#define SOURCE_REDUCE_REMOVE_UNREFERENCED_INSTRUCTION_REDUCTION_PASS_H_ + +#include "reduction_pass.h" + +namespace spvtools { +namespace reduce { + +// A reduction pass for removing non-control-flow instructions in blocks in +// cases where the instruction's id is not referenced. As well as making the +// module smaller, removing an instruction that references particular ids may +// create opportunities for subsequently removing the instructions that +// generated those ids. +class RemoveUnreferencedInstructionReductionPass : public ReductionPass { + public: + // Creates the reduction pass in the context of the given target environment + // |target_env| + explicit RemoveUnreferencedInstructionReductionPass( + const spv_target_env target_env) + : ReductionPass(target_env) {} + + ~RemoveUnreferencedInstructionReductionPass() override = default; + + std::string GetName() const final; + + protected: + std::vector> GetAvailableOpportunities( + opt::IRContext* context) const final; + + private: +}; + +} // namespace reduce +} // namespace spvtools + +#endif // SOURCE_REDUCE_REMOVE_UNREFERENCED_INSTRUCTION_REDUCTION_PASS_H_ diff --git a/3rdparty/spirv-tools/source/reduce/structured_loop_to_selection_reduction_opportunity.cpp b/3rdparty/spirv-tools/source/reduce/structured_loop_to_selection_reduction_opportunity.cpp new file mode 100644 index 000000000..bf0e085ad --- /dev/null +++ b/3rdparty/spirv-tools/source/reduce/structured_loop_to_selection_reduction_opportunity.cpp @@ -0,0 +1,360 @@ +// Copyright (c) 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "source/reduce/structured_loop_to_selection_reduction_opportunity.h" + +#include "source/opt/aggressive_dead_code_elim_pass.h" +#include "source/opt/ir_context.h" +#include "source/reduce/reduction_util.h" + +namespace spvtools { +namespace reduce { + +namespace { +const uint32_t kMergeNodeIndex = 0; +const uint32_t kContinueNodeIndex = 1; +} // namespace + +bool StructuredLoopToSelectionReductionOpportunity::PreconditionHolds() { + // Is the loop header reachable? + return loop_construct_header_->GetLabel() + ->context() + ->GetDominatorAnalysis(enclosing_function_) + ->IsReachable(loop_construct_header_); +} + +void StructuredLoopToSelectionReductionOpportunity::Apply() { + // Force computation of dominator analysis, CFG and structured CFG analysis + // before we start to mess with edges in the function. + context_->GetDominatorAnalysis(enclosing_function_); + context_->cfg(); + context_->GetStructuredCFGAnalysis(); + + // (1) Redirect edges that point to the loop's continue target to their + // closest merge block. + RedirectToClosestMergeBlock( + loop_construct_header_->GetLoopMergeInst()->GetSingleWordOperand( + kContinueNodeIndex)); + + // (2) Redirect edges that point to the loop's merge block to their closest + // merge block (which might be that of an enclosing selection, for instance). + RedirectToClosestMergeBlock( + loop_construct_header_->GetLoopMergeInst()->GetSingleWordOperand( + kMergeNodeIndex)); + + // (3) Turn the loop construct header into a selection. + ChangeLoopToSelection(); + + // We have made control flow changes that do not preserve the analyses that + // were performed. + context_->InvalidateAnalysesExceptFor(IRContext::Analysis::kAnalysisNone); + + // (4) By changing CFG edges we may have created scenarios where ids are used + // without being dominated; we fix instances of this. + FixNonDominatedIdUses(); + + // Invalidate the analyses we just used. + context_->InvalidateAnalysesExceptFor(IRContext::Analysis::kAnalysisNone); +} + +void StructuredLoopToSelectionReductionOpportunity::RedirectToClosestMergeBlock( + uint32_t original_target_id) { + // Consider every predecessor of the node with respect to which edges should + // be redirected. + std::set already_seen; + for (auto pred : context_->cfg()->preds(original_target_id)) { + if (already_seen.find(pred) != already_seen.end()) { + // We have already handled this predecessor (this scenario can arise if + // there are multiple edges from a block b to original_target_id). + continue; + } + already_seen.insert(pred); + + if (!context_->GetDominatorAnalysis(enclosing_function_) + ->IsReachable(pred)) { + // We do not care about unreachable predecessors (and dominance + // information, and thus the notion of structured control flow, makes + // little sense for unreachable blocks). + continue; + } + // Find the merge block of the structured control construct that most + // tightly encloses the predecessor. + uint32_t new_merge_target; + // The structured CFG analysis deliberately does not regard a header as + // belonging to the structure that it heads. We want it to, so handle this + // case specially. + if (context_->cfg()->block(pred)->MergeBlockIdIfAny()) { + new_merge_target = context_->cfg()->block(pred)->MergeBlockIdIfAny(); + } else { + new_merge_target = context_->GetStructuredCFGAnalysis()->MergeBlock(pred); + } + assert(new_merge_target != pred); + + if (!new_merge_target) { + // If the loop being transformed is outermost, and the predecessor is + // part of that loop's continue construct, there will be no such + // enclosing control construct. In this case, the continue construct + // will become unreachable anyway, so it is fine not to redirect the + // edge. + continue; + } + + if (new_merge_target != original_target_id) { + // Redirect the edge if it doesn't already point to the desired block. + RedirectEdge(pred, original_target_id, new_merge_target); + } + } +} + +void StructuredLoopToSelectionReductionOpportunity::RedirectEdge( + uint32_t source_id, uint32_t original_target_id, uint32_t new_target_id) { + // Redirect edge source_id->original_target_id to edge + // source_id->new_target_id, where the blocks involved are all different. + assert(source_id != original_target_id); + assert(source_id != new_target_id); + assert(original_target_id != new_target_id); + + // original_target_id must either be the merge target or continue construct + // for the loop being operated on. + assert(original_target_id == + loop_construct_header_->GetMergeInst()->GetSingleWordOperand( + kMergeNodeIndex) || + original_target_id == + loop_construct_header_->GetMergeInst()->GetSingleWordOperand( + kContinueNodeIndex)); + + auto terminator = context_->cfg()->block(source_id)->terminator(); + + // Figure out which operands of the terminator need to be considered for + // redirection. + std::vector operand_indices; + if (terminator->opcode() == SpvOpBranch) { + operand_indices = {0}; + } else if (terminator->opcode() == SpvOpBranchConditional) { + operand_indices = {1, 2}; + } else { + assert(terminator->opcode() == SpvOpSwitch); + for (uint32_t label_index = 1; label_index < terminator->NumOperands(); + label_index += 2) { + operand_indices.push_back(label_index); + } + } + + // Redirect the relevant operands, asserting that at least one redirection is + // made. + bool redirected = false; + for (auto operand_index : operand_indices) { + if (terminator->GetSingleWordOperand(operand_index) == original_target_id) { + terminator->SetOperand(operand_index, {new_target_id}); + redirected = true; + } + } + (void)(redirected); + assert(redirected); + + // The old and new targets may have phi instructions; these will need to + // respect the change in edges. + AdaptPhiInstructionsForRemovedEdge( + source_id, context_->cfg()->block(original_target_id)); + AdaptPhiInstructionsForAddedEdge(source_id, + context_->cfg()->block(new_target_id)); +} + +void StructuredLoopToSelectionReductionOpportunity:: + AdaptPhiInstructionsForRemovedEdge(uint32_t from_id, BasicBlock* to_block) { + to_block->ForEachPhiInst([&from_id](Instruction* phi_inst) { + Instruction::OperandList new_in_operands; + // Go through the OpPhi's input operands in (variable, parent) pairs. + for (uint32_t index = 0; index < phi_inst->NumInOperands(); index += 2) { + // Keep all pairs where the parent is not the block from which the edge + // is being removed. + if (phi_inst->GetInOperand(index + 1).words[0] != from_id) { + new_in_operands.push_back(phi_inst->GetInOperand(index)); + new_in_operands.push_back(phi_inst->GetInOperand(index + 1)); + } + } + phi_inst->SetInOperands(std::move(new_in_operands)); + }); +} + +void StructuredLoopToSelectionReductionOpportunity:: + AdaptPhiInstructionsForAddedEdge(uint32_t from_id, BasicBlock* to_block) { + to_block->ForEachPhiInst([this, &from_id](Instruction* phi_inst) { + // Add to the phi operand an (undef, from_id) pair to reflect the added + // edge. + auto undef_id = FindOrCreateGlobalUndef(context_, phi_inst->type_id()); + phi_inst->AddOperand(Operand(SPV_OPERAND_TYPE_ID, {undef_id})); + phi_inst->AddOperand(Operand(SPV_OPERAND_TYPE_ID, {from_id})); + }); +} + +void StructuredLoopToSelectionReductionOpportunity::ChangeLoopToSelection() { + // Change the merge instruction from OpLoopMerge to OpSelectionMerge, with + // the same merge block. + auto loop_merge_inst = loop_construct_header_->GetLoopMergeInst(); + auto const loop_merge_block_id = + loop_merge_inst->GetSingleWordOperand(kMergeNodeIndex); + loop_merge_inst->SetOpcode(SpvOpSelectionMerge); + loop_merge_inst->ReplaceOperands( + {{loop_merge_inst->GetOperand(kMergeNodeIndex).type, + {loop_merge_block_id}}, + {SPV_OPERAND_TYPE_SELECTION_CONTROL, {SpvSelectionControlMaskNone}}}); + + // The loop header either finishes with OpBranch or OpBranchConditional. + // The latter is fine for a selection. In the former case we need to turn + // it into OpBranchConditional. We use "true" as the condition, and make + // the "else" branch be the merge block. + auto terminator = loop_construct_header_->terminator(); + if (terminator->opcode() == SpvOpBranch) { + analysis::Bool temp; + const analysis::Bool* bool_type = + context_->get_type_mgr()->GetRegisteredType(&temp)->AsBool(); + auto const_mgr = context_->get_constant_mgr(); + auto true_const = const_mgr->GetConstant(bool_type, {true}); + auto true_const_result_id = + const_mgr->GetDefiningInstruction(true_const)->result_id(); + auto original_branch_id = terminator->GetSingleWordOperand(0); + terminator->SetOpcode(SpvOpBranchConditional); + terminator->ReplaceOperands({{SPV_OPERAND_TYPE_ID, {true_const_result_id}}, + {SPV_OPERAND_TYPE_ID, {original_branch_id}}, + {SPV_OPERAND_TYPE_ID, {loop_merge_block_id}}}); + if (original_branch_id != loop_merge_block_id) { + AdaptPhiInstructionsForAddedEdge( + loop_construct_header_->id(), + context_->cfg()->block(loop_merge_block_id)); + } + } +} + +void StructuredLoopToSelectionReductionOpportunity::FixNonDominatedIdUses() { + // Consider each instruction in the function. + for (auto& block : *enclosing_function_) { + for (auto& def : block) { + if (def.opcode() == SpvOpVariable) { + // Variables are defined at the start of the function, and can be + // accessed by all blocks, even by unreachable blocks that have no + // dominators, so we do not need to worry about them. + continue; + } + context_->get_def_use_mgr()->ForEachUse(&def, [this, &block, &def]( + Instruction* use, + uint32_t index) { + // If a use is not appropriately dominated by its definition, + // replace the use with an OpUndef, unless the definition is an + // access chain, in which case replace it with some (possibly fresh) + // variable (as we cannot load from / store to OpUndef). + if (!DefinitionSufficientlyDominatesUse(&def, use, index, block)) { + if (def.opcode() == SpvOpAccessChain) { + auto pointer_type = + context_->get_type_mgr()->GetType(def.type_id())->AsPointer(); + switch (pointer_type->storage_class()) { + case SpvStorageClassFunction: + use->SetOperand( + index, {FindOrCreateFunctionVariable( + context_->get_type_mgr()->GetId(pointer_type))}); + break; + default: + // TODO(2183) Need to think carefully about whether it makes + // sense to add new variables for all storage classes; it's fine + // for Private but might not be OK for input/output storage + // classes for example. + use->SetOperand( + index, {FindOrCreateGlobalVariable( + context_->get_type_mgr()->GetId(pointer_type))}); + break; + } + } else { + use->SetOperand(index, + {FindOrCreateGlobalUndef(context_, def.type_id())}); + } + } + }); + } + } +} + +bool StructuredLoopToSelectionReductionOpportunity:: + DefinitionSufficientlyDominatesUse(Instruction* def, Instruction* use, + uint32_t use_index, + BasicBlock& def_block) { + if (use->opcode() == SpvOpPhi) { + // A use in a phi doesn't need to be dominated by its definition, but the + // associated parent block does need to be dominated by the definition. + return context_->GetDominatorAnalysis(enclosing_function_) + ->Dominates(def_block.id(), use->GetSingleWordOperand(use_index + 1)); + } + // In non-phi cases, a use needs to be dominated by its definition. + return context_->GetDominatorAnalysis(enclosing_function_) + ->Dominates(def, use); +} + +uint32_t +StructuredLoopToSelectionReductionOpportunity::FindOrCreateGlobalVariable( + uint32_t pointer_type_id) { + for (auto& inst : context_->module()->types_values()) { + if (inst.opcode() != SpvOpVariable) { + continue; + } + if (inst.type_id() == pointer_type_id) { + return inst.result_id(); + } + } + const uint32_t variable_id = context_->TakeNextId(); + std::unique_ptr variable_inst( + new Instruction(context_, SpvOpVariable, pointer_type_id, variable_id, + {{SPV_OPERAND_TYPE_STORAGE_CLASS, + {(uint32_t)context_->get_type_mgr() + ->GetType(pointer_type_id) + ->AsPointer() + ->storage_class()}}})); + context_->module()->AddGlobalValue(std::move(variable_inst)); + return variable_id; +} + +uint32_t +StructuredLoopToSelectionReductionOpportunity::FindOrCreateFunctionVariable( + uint32_t pointer_type_id) { + // The pointer type of a function variable must have Function storage class. + assert(context_->get_type_mgr() + ->GetType(pointer_type_id) + ->AsPointer() + ->storage_class() == SpvStorageClassFunction); + + // Go through the instructions in the function's first block until we find a + // suitable variable, or go past all the variables. + BasicBlock::iterator iter = enclosing_function_->begin()->begin(); + for (;; ++iter) { + // We will either find a suitable variable, or find a non-variable + // instruction; we won't exhaust all instructions. + assert(iter != enclosing_function_->begin()->end()); + if (iter->opcode() != SpvOpVariable) { + // If we see a non-variable, we have gone through all the variables. + break; + } + if (iter->type_id() == pointer_type_id) { + return iter->result_id(); + } + } + // At this point, iter refers to the first non-function instruction of the + // function's entry block. + const uint32_t variable_id = context_->TakeNextId(); + std::unique_ptr variable_inst(new Instruction( + context_, SpvOpVariable, pointer_type_id, variable_id, + {{SPV_OPERAND_TYPE_STORAGE_CLASS, {SpvStorageClassFunction}}})); + iter->InsertBefore(std::move(variable_inst)); + return variable_id; +} + +} // namespace reduce +} // namespace spvtools diff --git a/3rdparty/spirv-tools/source/reduce/structured_loop_to_selection_reduction_opportunity.h b/3rdparty/spirv-tools/source/reduce/structured_loop_to_selection_reduction_opportunity.h new file mode 100644 index 000000000..71b0f0eb4 --- /dev/null +++ b/3rdparty/spirv-tools/source/reduce/structured_loop_to_selection_reduction_opportunity.h @@ -0,0 +1,116 @@ +// Copyright (c) 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef SOURCE_REDUCE_CUT_LOOP_REDUCTION_OPPORTUNITY_H_ +#define SOURCE_REDUCE_CUT_LOOP_REDUCTION_OPPORTUNITY_H_ + +#include "source/opt/def_use_manager.h" +#include "source/opt/dominator_analysis.h" +#include "source/opt/function.h" +#include "source/reduce/reduction_opportunity.h" + +namespace spvtools { +namespace reduce { + +using namespace opt; + +// An opportunity to replace a structured loop with a selection. +class StructuredLoopToSelectionReductionOpportunity + : public ReductionOpportunity { + public: + // Constructs an opportunity from a loop header block and the function that + // encloses it. + explicit StructuredLoopToSelectionReductionOpportunity( + IRContext* context, BasicBlock* loop_construct_header, + Function* enclosing_function) + : context_(context), + loop_construct_header_(loop_construct_header), + enclosing_function_(enclosing_function) {} + + // Returns true if the loop header is reachable. A structured loop might + // become unreachable as a result of turning another structured loop into + // a selection. + bool PreconditionHolds() override; + + protected: + void Apply() override; + + private: + // Parameter |original_target_id| is the id of the loop's merge block or + // continue target. This method considers each edge of the form + // b->original_target_id and transforms it into an edge of the form b->c, + // where c is the merge block of the structured control flow construct that + // most tightly contains b. + void RedirectToClosestMergeBlock(uint32_t original_target_id); + + // |source_id|, |original_target_id| and |new_target_id| are required to all + // be distinct, with a CFG edge existing from |source_id| to + // |original_target_id|, and |original_target_id| being either the merge block + // or continue target for the loop being operated on. + // The method removes this edge and adds an edge from + // |source_id| to |new_target_id|. It takes care of fixing up any OpPhi + // instructions associated with |original_target_id| and |new_target_id|. + void RedirectEdge(uint32_t source_id, uint32_t original_target_id, + uint32_t new_target_id); + + // Removes any components of |to_block|'s phi instructions relating to + // |from_id|. + void AdaptPhiInstructionsForRemovedEdge(uint32_t from_id, + BasicBlock* to_block); + + // Adds components to |to_block|'s phi instructions to account for a new + // incoming edge from |from_id|. + void AdaptPhiInstructionsForAddedEdge(uint32_t from_id, BasicBlock* to_block); + + // Turns the OpLoopMerge for the loop into OpSelectionMerge, and adapts the + // following branch instruction accordingly. + void ChangeLoopToSelection(); + + // Fixes any scenarios where, due to CFG changes, ids have uses not dominated + // by their definitions, by changing such uses to uses of OpUndef or of dummy + // variables. + void FixNonDominatedIdUses(); + + // Returns true if and only if at least one of the following holds: + // 1) |def| dominates |use| + // 2) |def| is an OpVariable + // 3) |use| is part of an OpPhi, with associated incoming block b, and |def| + // dominates b. + bool DefinitionSufficientlyDominatesUse(Instruction* def, Instruction* use, + uint32_t use_index, + BasicBlock& def_block); + + // Checks whether the global value list has an OpVariable of the given pointer + // type, adding one if not, and returns the id of such an OpVariable. + // + // TODO(2184): This will likely be used by other reduction passes, so should + // be factored out in due course. + uint32_t FindOrCreateGlobalVariable(uint32_t pointer_type_id); + + // Checks whether the enclosing function has an OpVariable of the given + // pointer type, adding one if not, and returns the id of such an OpVariable. + // + // TODO(2184): This will likely be used by other reduction passes, so should + // be factored out in due course. + uint32_t FindOrCreateFunctionVariable(uint32_t pointer_type_id); + + IRContext* context_; + BasicBlock* loop_construct_header_; + Function* enclosing_function_; +}; + +} // namespace reduce +} // namespace spvtools + +#endif // SOURCE_REDUCE_CUT_LOOP_REDUCTION_OPPORTUNITY_H_ diff --git a/3rdparty/spirv-tools/source/reduce/structured_loop_to_selection_reduction_pass.cpp b/3rdparty/spirv-tools/source/reduce/structured_loop_to_selection_reduction_pass.cpp new file mode 100644 index 000000000..768a2e8e1 --- /dev/null +++ b/3rdparty/spirv-tools/source/reduce/structured_loop_to_selection_reduction_pass.cpp @@ -0,0 +1,95 @@ +// Copyright (c) 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "structured_loop_to_selection_reduction_pass.h" +#include "structured_loop_to_selection_reduction_opportunity.h" + +namespace spvtools { +namespace reduce { + +using namespace opt; + +namespace { +const uint32_t kMergeNodeIndex = 0; +const uint32_t kContinueNodeIndex = 1; +} // namespace + +std::vector> +StructuredLoopToSelectionReductionPass::GetAvailableOpportunities( + opt::IRContext* context) const { + std::vector> result; + + std::set merge_block_ids; + for (auto& function : *context->module()) { + for (auto& block : function) { + auto merge_inst = block.GetMergeInst(); + if (merge_inst) { + merge_block_ids.insert( + merge_inst->GetSingleWordOperand(kMergeNodeIndex)); + } + } + } + + // Consider each loop construct header in the module. + for (auto& function : *context->module()) { + for (auto& block : function) { + auto loop_merge_inst = block.GetLoopMergeInst(); + if (!loop_merge_inst) { + // This is not a loop construct header. + continue; + } + + // Check whether the loop construct's continue target is the merge block + // of some structured control flow construct. If it is, we cautiously do + // not consider applying a transformation. + if (merge_block_ids.find(loop_merge_inst->GetSingleWordOperand( + kContinueNodeIndex)) != merge_block_ids.end()) { + continue; + } + + // Check whether the loop construct header dominates its merge block. + // If not, the merge block must be unreachable in the control flow graph + // so we cautiously do not consider applying a transformation. + auto merge_block_id = + loop_merge_inst->GetSingleWordInOperand(kMergeNodeIndex); + if (!context->GetDominatorAnalysis(&function)->Dominates( + block.id(), merge_block_id)) { + continue; + } + + // Check whether the loop construct merge block postdominates the loop + // construct header. If not (e.g. because the loop contains OpReturn, + // OpKill or OpUnreachable), we cautiously do not consider applying + // a transformation. + if (!context->GetPostDominatorAnalysis(&function)->Dominates( + merge_block_id, block.id())) { + continue; + } + + // We can turn this structured loop into a selection, so add the + // opportunity to do so. + result.push_back( + MakeUnique( + context, &block, &function)); + } + } + return result; +} + +std::string StructuredLoopToSelectionReductionPass::GetName() const { + return "StructuredLoopToSelectionReductionPass"; +} + +} // namespace reduce +} // namespace spvtools diff --git a/3rdparty/spirv-tools/source/reduce/structured_loop_to_selection_reduction_pass.h b/3rdparty/spirv-tools/source/reduce/structured_loop_to_selection_reduction_pass.h new file mode 100644 index 000000000..a1f88bc54 --- /dev/null +++ b/3rdparty/spirv-tools/source/reduce/structured_loop_to_selection_reduction_pass.h @@ -0,0 +1,61 @@ +// Copyright (c) 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef SOURCE_REDUCE_CUT_LOOP_REDUCTION_PASS_H_ +#define SOURCE_REDUCE_CUT_LOOP_REDUCTION_PASS_H_ + +#include "reduction_pass.h" + +namespace spvtools { +namespace reduce { + +// Turns structured loops into selections, generalizing from a human-writable +// language the idea of turning a loop: +// +// while (c) { +// body; +// } +// +// into: +// +// if (c) { +// body; +// } +// +// The pass results in continue constructs of transformed loops becoming +// unreachable; another pass for eliminating blocks may end up being able to +// remove them. +class StructuredLoopToSelectionReductionPass : public ReductionPass { + public: + // Creates the reduction pass in the context of the given target environment + // |target_env| + explicit StructuredLoopToSelectionReductionPass( + const spv_target_env target_env) + : ReductionPass(target_env) {} + + ~StructuredLoopToSelectionReductionPass() override = default; + + std::string GetName() const final; + + protected: + std::vector> GetAvailableOpportunities( + opt::IRContext* context) const final; + + private: +}; + +} // namespace reduce +} // namespace spvtools + +#endif // SOURCE_REDUCE_CUT_LOOP_REDUCTION_PASS_H_ diff --git a/3rdparty/spirv-tools/source/spirv_optimizer_options.cpp b/3rdparty/spirv-tools/source/spirv_optimizer_options.cpp new file mode 100644 index 000000000..30db4e2de --- /dev/null +++ b/3rdparty/spirv-tools/source/spirv_optimizer_options.cpp @@ -0,0 +1,41 @@ +// Copyright (c) 2017 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#include + +#include "source/spirv_optimizer_options.h" + +SPIRV_TOOLS_EXPORT spv_optimizer_options spvOptimizerOptionsCreate(void) { + return new spv_optimizer_options_t(); +} + +SPIRV_TOOLS_EXPORT void spvOptimizerOptionsDestroy( + spv_optimizer_options options) { + delete options; +} + +SPIRV_TOOLS_EXPORT void spvOptimizerOptionsSetRunValidator( + spv_optimizer_options options, bool val) { + options->run_validator_ = val; +} + +SPIRV_TOOLS_EXPORT void spvOptimizerOptionsSetValidatorOptions( + spv_optimizer_options options, spv_validator_options val) { + options->val_options_ = *val; +} +SPIRV_TOOLS_EXPORT void spvOptimizerOptionsSetMaxIdBound( + spv_optimizer_options options, uint32_t val) { + options->max_id_bound_ = val; +} diff --git a/3rdparty/spirv-tools/source/spirv_optimizer_options.h b/3rdparty/spirv-tools/source/spirv_optimizer_options.h new file mode 100644 index 000000000..1eb4d3f1b --- /dev/null +++ b/3rdparty/spirv-tools/source/spirv_optimizer_options.h @@ -0,0 +1,40 @@ +// Copyright (c) 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef SOURCE_SPIRV_OPTIMIZER_OPTIONS_H_ +#define SOURCE_SPIRV_OPTIMIZER_OPTIONS_H_ + +#include "source/spirv_validator_options.h" +#include "spirv-tools/libspirv.h" + +// Manages command line options passed to the SPIR-V Validator. New struct +// members may be added for any new option. +struct spv_optimizer_options_t { + spv_optimizer_options_t() + : run_validator_(true), + val_options_(), + max_id_bound_(kDefaultMaxIdBound) {} + + // When true the validator will be run before optimizations are run. + bool run_validator_; + + // Options to pass to the validator if it is run. + spv_validator_options_t val_options_; + + // The maximum value the id bound for a module can have. The Spir-V spec says + // this value must be at least 0x3FFFFF, but implementations can allow for a + // higher value. + uint32_t max_id_bound_; +}; +#endif // SOURCE_SPIRV_OPTIMIZER_OPTIONS_H_ diff --git a/3rdparty/spirv-tools/source/spirv_reducer_options.cpp b/3rdparty/spirv-tools/source/spirv_reducer_options.cpp new file mode 100644 index 000000000..110ea3e09 --- /dev/null +++ b/3rdparty/spirv-tools/source/spirv_reducer_options.cpp @@ -0,0 +1,31 @@ +// Copyright (c) 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#include + +#include "source/spirv_reducer_options.h" + +SPIRV_TOOLS_EXPORT spv_reducer_options spvReducerOptionsCreate() { + return new spv_reducer_options_t(); +} + +SPIRV_TOOLS_EXPORT void spvReducerOptionsDestroy(spv_reducer_options options) { + delete options; +} + +SPIRV_TOOLS_EXPORT void spvReducerOptionsSetStepLimit( + spv_reducer_options options, uint32_t step_limit) { + options->step_limit = step_limit; +} diff --git a/3rdparty/spirv-tools/source/spirv_reducer_options.h b/3rdparty/spirv-tools/source/spirv_reducer_options.h new file mode 100644 index 000000000..d48303ca6 --- /dev/null +++ b/3rdparty/spirv-tools/source/spirv_reducer_options.h @@ -0,0 +1,35 @@ +// Copyright (c) 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef SOURCE_SPIRV_REDUCER_OPTIONS_H_ +#define SOURCE_SPIRV_REDUCER_OPTIONS_H_ + +#include "spirv-tools/libspirv.h" + +#include +#include + +// The default maximum number of steps for the reducer to run before giving up. +const uint32_t kDefaultStepLimit = 250; + +// Manages command line options passed to the SPIR-V Reducer. New struct +// members may be added for any new option. +struct spv_reducer_options_t { + spv_reducer_options_t() : step_limit(kDefaultStepLimit) {} + + // The number of steps the reducer will run for before giving up. + uint32_t step_limit; +}; + +#endif // SOURCE_SPIRV_REDUCER_OPTIONS_H_ diff --git a/3rdparty/spirv-tools/source/spirv_target_env.cpp b/3rdparty/spirv-tools/source/spirv_target_env.cpp index 7a11630c7..a3aa0af03 100644 --- a/3rdparty/spirv-tools/source/spirv_target_env.cpp +++ b/3rdparty/spirv-tools/source/spirv_target_env.cpp @@ -14,7 +14,6 @@ #include "source/spirv_target_env.h" -#include #include #include "source/spirv_constant.h" @@ -63,7 +62,6 @@ const char* spvTargetEnvDescription(spv_target_env env) { case SPV_ENV_WEBGPU_0: return "SPIR-V 1.3 (under WIP WebGPU semantics)"; } - assert(0 && "Unhandled SPIR-V target environment"); return ""; } @@ -94,7 +92,6 @@ uint32_t spvVersionForTargetEnv(spv_target_env env) { case SPV_ENV_WEBGPU_0: return SPV_SPIRV_VERSION_WORD(1, 3); } - assert(0 && "Unhandled SPIR-V target environment"); return SPV_SPIRV_VERSION_WORD(0, 0); } @@ -195,3 +192,59 @@ bool spvIsVulkanEnv(spv_target_env env) { } return false; } + +bool spvIsOpenCLEnv(spv_target_env env) { + switch (env) { + case SPV_ENV_UNIVERSAL_1_0: + case SPV_ENV_VULKAN_1_0: + case SPV_ENV_UNIVERSAL_1_1: + case SPV_ENV_OPENGL_4_0: + case SPV_ENV_OPENGL_4_1: + case SPV_ENV_OPENGL_4_2: + case SPV_ENV_OPENGL_4_3: + case SPV_ENV_OPENGL_4_5: + case SPV_ENV_UNIVERSAL_1_2: + case SPV_ENV_UNIVERSAL_1_3: + case SPV_ENV_VULKAN_1_1: + case SPV_ENV_WEBGPU_0: + return false; + case SPV_ENV_OPENCL_1_2: + case SPV_ENV_OPENCL_EMBEDDED_1_2: + case SPV_ENV_OPENCL_2_0: + case SPV_ENV_OPENCL_EMBEDDED_2_0: + case SPV_ENV_OPENCL_EMBEDDED_2_1: + case SPV_ENV_OPENCL_EMBEDDED_2_2: + case SPV_ENV_OPENCL_2_1: + case SPV_ENV_OPENCL_2_2: + return true; + } + return false; +} + +bool spvIsWebGPUEnv(spv_target_env env) { + switch (env) { + case SPV_ENV_UNIVERSAL_1_0: + case SPV_ENV_VULKAN_1_0: + case SPV_ENV_UNIVERSAL_1_1: + case SPV_ENV_OPENGL_4_0: + case SPV_ENV_OPENGL_4_1: + case SPV_ENV_OPENGL_4_2: + case SPV_ENV_OPENGL_4_3: + case SPV_ENV_OPENGL_4_5: + case SPV_ENV_UNIVERSAL_1_2: + case SPV_ENV_UNIVERSAL_1_3: + case SPV_ENV_VULKAN_1_1: + case SPV_ENV_OPENCL_1_2: + case SPV_ENV_OPENCL_EMBEDDED_1_2: + case SPV_ENV_OPENCL_2_0: + case SPV_ENV_OPENCL_EMBEDDED_2_0: + case SPV_ENV_OPENCL_EMBEDDED_2_1: + case SPV_ENV_OPENCL_EMBEDDED_2_2: + case SPV_ENV_OPENCL_2_1: + case SPV_ENV_OPENCL_2_2: + return false; + case SPV_ENV_WEBGPU_0: + return true; + } + return false; +} diff --git a/3rdparty/spirv-tools/source/spirv_target_env.h b/3rdparty/spirv-tools/source/spirv_target_env.h index 7dc7be1d8..d1bd83512 100644 --- a/3rdparty/spirv-tools/source/spirv_target_env.h +++ b/3rdparty/spirv-tools/source/spirv_target_env.h @@ -24,6 +24,12 @@ bool spvParseTargetEnv(const char* s, spv_target_env* env); // Returns true if |env| is a VULKAN environment, false otherwise. bool spvIsVulkanEnv(spv_target_env env); +// Returns true if |env| is an OPENCL environment, false otherwise. +bool spvIsOpenCLEnv(spv_target_env env); + +// Returns true if |env| is an WEBGPU environment, false otherwise. +bool spvIsWebGPUEnv(spv_target_env env); + // Returns the version number for the given SPIR-V target environment. uint32_t spvVersionForTargetEnv(spv_target_env env); diff --git a/3rdparty/spirv-tools/source/spirv_validator_options.cpp b/3rdparty/spirv-tools/source/spirv_validator_options.cpp index 0c0625364..2e9cf2638 100644 --- a/3rdparty/spirv-tools/source/spirv_validator_options.cpp +++ b/3rdparty/spirv-tools/source/spirv_validator_options.cpp @@ -37,6 +37,8 @@ bool spvParseUniversalLimitsOptions(const char* s, spv_validator_limit* type) { *type = spv_validator_limit_max_control_flow_nesting_depth; } else if (match("--max-access-chain-indexes")) { *type = spv_validator_limit_max_access_chain_indexes; + } else if (match("--max-id-bound")) { + *type = spv_validator_limit_max_id_bound; } else { // The command line option for this validator limit has not been added. // Therefore we return false. @@ -73,6 +75,7 @@ void spvValidatorOptionsSetUniversalLimit(spv_validator_options options, max_control_flow_nesting_depth) LIMIT(spv_validator_limit_max_access_chain_indexes, max_access_chain_indexes) + LIMIT(spv_validator_limit_max_id_bound, max_id_bound) #undef LIMIT } } @@ -92,6 +95,11 @@ void spvValidatorOptionsSetRelaxBlockLayout(spv_validator_options options, options->relax_block_layout = val; } +void spvValidatorOptionsSetScalarBlockLayout(spv_validator_options options, + bool val) { + options->scalar_block_layout = val; +} + void spvValidatorOptionsSetSkipBlockLayout(spv_validator_options options, bool val) { options->skip_block_layout = val; diff --git a/3rdparty/spirv-tools/source/spirv_validator_options.h b/3rdparty/spirv-tools/source/spirv_validator_options.h index d264a7e0b..f426ebfef 100644 --- a/3rdparty/spirv-tools/source/spirv_validator_options.h +++ b/3rdparty/spirv-tools/source/spirv_validator_options.h @@ -32,6 +32,7 @@ struct validator_universal_limits_t { uint32_t max_function_args{255}; uint32_t max_control_flow_nesting_depth{1023}; uint32_t max_access_chain_indexes{255}; + uint32_t max_id_bound{0x3FFFFF}; }; // Manages command line options passed to the SPIR-V Validator. New struct @@ -42,12 +43,14 @@ struct spv_validator_options_t { relax_struct_store(false), relax_logical_pointer(false), relax_block_layout(false), + scalar_block_layout(false), skip_block_layout(false) {} validator_universal_limits_t universal_limits_; bool relax_struct_store; bool relax_logical_pointer; bool relax_block_layout; + bool scalar_block_layout; bool skip_block_layout; }; diff --git a/3rdparty/spirv-tools/source/text_handler.cpp b/3rdparty/spirv-tools/source/text_handler.cpp index 5f6e8c41f..c31f34a6b 100644 --- a/3rdparty/spirv-tools/source/text_handler.cpp +++ b/3rdparty/spirv-tools/source/text_handler.cpp @@ -313,7 +313,7 @@ spv_result_t AssemblyContext::binaryEncodeString(const char* value, pInst->words.back() = 0; char* dest = (char*)&pInst->words[oldWordCount]; - strncpy(dest, value, length); + strncpy(dest, value, length + 1); return SPV_SUCCESS; } diff --git a/3rdparty/spirv-tools/source/util/hex_float.h b/3rdparty/spirv-tools/source/util/hex_float.h index b7baf093b..cfc40fa68 100644 --- a/3rdparty/spirv-tools/source/util/hex_float.h +++ b/3rdparty/spirv-tools/source/util/hex_float.h @@ -672,7 +672,7 @@ class HexFloat { // If we are Nan or Inf we should pass that through. if (is_inf) { - other.set_value(BitwiseCast( + other.set_value(typename other_T::underlying_type( static_cast( (negate ? other_T::sign_mask : 0) | other_T::exponent_mask))); return; @@ -687,7 +687,7 @@ class HexFloat { // We are some sort of Nan. We try to keep the bit-pattern of the Nan // as close as possible. If we had to shift off bits so we are 0, then we // just set the last bit. - other.set_value(BitwiseCast( + other.set_value(typename other_T::underlying_type( static_cast( (negate ? other_T::sign_mask : 0) | other_T::exponent_mask | (shifted_significand == 0 ? 0x1 : shifted_significand)))); diff --git a/3rdparty/spirv-tools/source/util/string_utils.cpp b/3rdparty/spirv-tools/source/util/string_utils.cpp index 29ce2aa4a..b56c353af 100644 --- a/3rdparty/spirv-tools/source/util/string_utils.cpp +++ b/3rdparty/spirv-tools/source/util/string_utils.cpp @@ -37,5 +37,22 @@ std::string CardinalToOrdinal(size_t cardinal) { return ToString(cardinal) + suffix; } +std::pair SplitFlagArgs(const std::string& flag) { + if (flag.size() < 2) return make_pair(flag, std::string()); + + // Detect the last dash before the pass name. Since we have to + // handle single dash options (-O and -Os), count up to two dashes. + size_t dash_ix = 0; + if (flag[0] == '-' && flag[1] == '-') + dash_ix = 2; + else if (flag[0] == '-') + dash_ix = 1; + + size_t ix = flag.find('='); + return (ix != std::string::npos) + ? make_pair(flag.substr(dash_ix, ix - 2), flag.substr(ix + 1)) + : make_pair(flag.substr(dash_ix), std::string()); +} + } // namespace utils } // namespace spvtools diff --git a/3rdparty/spirv-tools/source/util/string_utils.h b/3rdparty/spirv-tools/source/util/string_utils.h index 322c574fb..f1cd179c9 100644 --- a/3rdparty/spirv-tools/source/util/string_utils.h +++ b/3rdparty/spirv-tools/source/util/string_utils.h @@ -37,6 +37,11 @@ std::string ToString(T val) { // Converts cardinal number to ordinal number string. std::string CardinalToOrdinal(size_t cardinal); +// Splits the string |flag|, of the form '--pass_name[=pass_args]' into two +// strings "pass_name" and "pass_args". If |flag| has no arguments, the second +// string will be empty. +std::pair SplitFlagArgs(const std::string& flag); + } // namespace utils } // namespace spvtools diff --git a/3rdparty/spirv-tools/source/val/construct.cpp b/3rdparty/spirv-tools/source/val/construct.cpp index c11a065b7..7b0cb2dcc 100644 --- a/3rdparty/spirv-tools/source/val/construct.cpp +++ b/3rdparty/spirv-tools/source/val/construct.cpp @@ -116,7 +116,10 @@ Construct::ConstructBlockSet Construct::blocks(Function* function) const { if (merge != block) { for (auto succ : *block->successors()) { - stack.push_back(succ); + // All blocks in the construct must be dominated by the header. + if (header->dominates(*succ)) { + stack.push_back(succ); + } } } } diff --git a/3rdparty/spirv-tools/source/val/validate.cpp b/3rdparty/spirv-tools/source/val/validate.cpp index 84ec193a1..5d0c6243f 100644 --- a/3rdparty/spirv-tools/source/val/validate.cpp +++ b/3rdparty/spirv-tools/source/val/validate.cpp @@ -42,6 +42,12 @@ #include "source/val/validation_state.h" #include "spirv-tools/libspirv.h" +namespace { +// TODO(issue 1950): The validator only returns a single message anyway, so no +// point in generating more than 1 warning. +static uint32_t kDefaultMaxNumOfWarnings = 1; +} // namespace + namespace spvtools { namespace val { namespace { @@ -110,18 +116,18 @@ void printDot(const ValidationState_t& _, const BasicBlock& other) { block_string += "end "; } else { for (auto block : *other.successors()) { - block_string += _.getIdOrName(block->id()) + " "; + block_string += _.getIdName(block->id()) + " "; } } - printf("%10s -> {%s\b}\n", _.getIdOrName(other.id()).c_str(), + printf("%10s -> {%s\b}\n", _.getIdName(other.id()).c_str(), block_string.c_str()); } void PrintBlocks(ValidationState_t& _, Function func) { assert(func.first_block()); - printf("%10s -> %s\n", _.getIdOrName(func.id()).c_str(), - _.getIdOrName(func.first_block()->id()).c_str()); + printf("%10s -> %s\n", _.getIdName(func.id()).c_str(), + _.getIdName(func.first_block()->id()).c_str()); for (const auto& block : func.ordered_blocks()) { printDot(_, *block); } @@ -139,7 +145,7 @@ void PrintBlocks(ValidationState_t& _, Function func) { UNUSED(void PrintDotGraph(ValidationState_t& _, Function func)) { if (func.first_block()) { - std::string func_name(_.getIdOrName(func.id())); + std::string func_name(_.getIdName(func.id())); printf("digraph %s {\n", func_name.c_str()); PrintBlocks(_, func); printf("}\n"); @@ -169,14 +175,19 @@ spv_result_t ValidateForwardDecls(ValidationState_t& _) { // capability is being used. // * No function can be targeted by both an OpEntryPoint instruction and an // OpFunctionCall instruction. +// +// Additionally enforces that entry points for Vulkan and WebGPU should not have +// recursion. spv_result_t ValidateEntryPoints(ValidationState_t& _) { _.ComputeFunctionToEntryPointMapping(); + _.ComputeRecursiveEntryPoints(); if (_.entry_points().empty() && !_.HasCapability(SpvCapabilityLinkage)) { return _.diag(SPV_ERROR_INVALID_BINARY, nullptr) << "No OpEntryPoint instruction was found. This is only allowed if " "the Linkage capability is being used."; } + for (const auto& entry_point : _.entry_points()) { if (_.IsFunctionCallTarget(entry_point)) { return _.diag(SPV_ERROR_INVALID_BINARY, _.FindDef(entry_point)) @@ -184,6 +195,17 @@ spv_result_t ValidateEntryPoints(ValidationState_t& _) { << ") may not be targeted by both an OpEntryPoint instruction and " "an OpFunctionCall instruction."; } + + // For Vulkan and WebGPU, the static function-call graph for an entry point + // must not contain cycles. + if (spvIsWebGPUEnv(_.context()->target_env) || + spvIsVulkanEnv(_.context()->target_env)) { + if (_.recursive_entry_points().find(entry_point) != + _.recursive_entry_points().end()) { + return _.diag(SPV_ERROR_INVALID_BINARY, _.FindDef(entry_point)) + << "Entry points may not have a call graph with cycles."; + } + } } return SPV_SUCCESS; @@ -220,8 +242,21 @@ spv_result_t ValidateBinaryUsingContextAndValidationState( << spvTargetEnvDescription(context.target_env) << "."; } + if (header.bound > vstate->options()->universal_limits_.max_id_bound) { + return DiagnosticStream(position, context.consumer, "", + SPV_ERROR_INVALID_BINARY) + << "Invalid SPIR-V. The id bound is larger than the max id bound " + << vstate->options()->universal_limits_.max_id_bound << "."; + } + // Look for OpExtension instructions and register extensions. - spvBinaryParse(&context, vstate, words, num_words, + // This parse should not produce any error messages. Hijack the context and + // replace the message consumer so that we do not pollute any state in input + // consumer. + spv_context_t hijacked_context = context; + hijacked_context.consumer = [](spv_message_level_t, const char*, + const spv_position_t&, const char*) {}; + spvBinaryParse(&hijacked_context, vstate, words, num_words, /* parsed_header = */ nullptr, ProcessExtensions, /* diagnostic = */ nullptr); @@ -260,7 +295,15 @@ spv_result_t ValidateBinaryUsingContextAndValidationState( << "A FunctionCall must happen within a function body."; } - vstate->AddFunctionCallTarget(inst->GetOperandAs(2)); + const auto called_id = inst->GetOperandAs(2); + if (spvIsWebGPUEnv(context.target_env) && + !vstate->IsFunctionCallDefined(called_id)) { + return vstate->diag(SPV_ERROR_INVALID_LAYOUT, &instruction) + << "For WebGPU, functions need to be defined before being " + "called."; + } + + vstate->AddFunctionCallTarget(called_id); } if (vstate->in_function_body()) { @@ -309,12 +352,11 @@ spv_result_t ValidateBinaryUsingContextAndValidationState( // Miscellaneous if (auto error = DebugPass(*vstate, &instruction)) return error; if (auto error = AnnotationPass(*vstate, &instruction)) return error; - if (auto error = ExtInstPass(*vstate, &instruction)) return error; + if (auto error = ExtensionPass(*vstate, &instruction)) return error; if (auto error = ModeSettingPass(*vstate, &instruction)) return error; if (auto error = TypePass(*vstate, &instruction)) return error; if (auto error = ConstantPass(*vstate, &instruction)) return error; - if (auto error = ValidateMemoryInstructions(*vstate, &instruction)) - return error; + if (auto error = MemoryPass(*vstate, &instruction)) return error; if (auto error = FunctionPass(*vstate, &instruction)) return error; if (auto error = ImagePass(*vstate, &instruction)) return error; if (auto error = ConversionPass(*vstate, &instruction)) return error; @@ -333,11 +375,12 @@ spv_result_t ValidateBinaryUsingContextAndValidationState( if (auto error = NonUniformPass(*vstate, &instruction)) return error; if (auto error = LiteralsPass(*vstate, &instruction)) return error; - // Validate the preconditions involving adjacent instructions. e.g. SpvOpPhi - // must only be preceeded by SpvOpLabel, SpvOpPhi, or SpvOpLine. - if (auto error = ValidateAdjacency(*vstate, i)) return error; } + // Validate the preconditions involving adjacent instructions. e.g. SpvOpPhi + // must only be preceeded by SpvOpLabel, SpvOpPhi, or SpvOpLine. + if (auto error = ValidateAdjacency(*vstate)) return error; + if (auto error = ValidateEntryPoints(*vstate)) return error; // CFG checks are performed after the binary has been parsed // and the CFGPass has collected information about the control flow @@ -369,8 +412,8 @@ spv_result_t ValidateBinaryAndKeepValidationState( UseDiagnosticAsMessageConsumer(&hijack_context, pDiagnostic); } - vstate->reset( - new ValidationState_t(&hijack_context, options, words, num_words)); + vstate->reset(new ValidationState_t(&hijack_context, options, words, + num_words, kDefaultMaxNumOfWarnings)); return ValidateBinaryUsingContextAndValidationState( hijack_context, words, num_words, pDiagnostic, vstate->get()); @@ -400,7 +443,8 @@ spv_result_t spvValidateBinary(const spv_const_context context, // Create the ValidationState using the context and default options. spvtools::val::ValidationState_t vstate(&hijack_context, default_options, - words, num_words); + words, num_words, + kDefaultMaxNumOfWarnings); spv_result_t result = spvtools::val::ValidateBinaryUsingContextAndValidationState( @@ -422,7 +466,8 @@ spv_result_t spvValidateWithOptions(const spv_const_context context, // Create the ValidationState using the context. spvtools::val::ValidationState_t vstate(&hijack_context, options, - binary->code, binary->wordCount); + binary->code, binary->wordCount, + kDefaultMaxNumOfWarnings); return spvtools::val::ValidateBinaryUsingContextAndValidationState( hijack_context, binary->code, binary->wordCount, pDiagnostic, &vstate); diff --git a/3rdparty/spirv-tools/source/val/validate.h b/3rdparty/spirv-tools/source/val/validate.h index 4599c4a86..fe357a2f8 100644 --- a/3rdparty/spirv-tools/source/val/validate.h +++ b/3rdparty/spirv-tools/source/val/validate.h @@ -63,7 +63,7 @@ spv_result_t UpdateIdUse(ValidationState_t& _, const Instruction* inst); /// @param[in] _ the validation state of the module /// /// @return SPV_SUCCESS if no errors are found. SPV_ERROR_INVALID_ID otherwise -spv_result_t CheckIdDefinitionDominateUse(const ValidationState_t& _); +spv_result_t CheckIdDefinitionDominateUse(ValidationState_t& _); /// @brief This function checks for preconditions involving the adjacent /// instructions. @@ -75,7 +75,7 @@ spv_result_t CheckIdDefinitionDominateUse(const ValidationState_t& _); /// @param[in] _ the validation state of the module /// /// @return SPV_SUCCESS if no errors are found. SPV_ERROR_INVALID_DATA otherwise -spv_result_t ValidateAdjacency(ValidationState_t& _, size_t idx); +spv_result_t ValidateAdjacency(ValidationState_t& _); /// @brief Validates static uses of input and output variables /// @@ -91,8 +91,7 @@ spv_result_t ValidateInterfaces(ValidationState_t& _); /// /// @param[in] _ the validation state of the module /// @return SPV_SUCCESS if no errors are found. -spv_result_t ValidateMemoryInstructions(ValidationState_t& _, - const Instruction* inst); +spv_result_t MemoryPass(ValidationState_t& _, const Instruction* inst); /// @brief Updates the immediate dominator for each of the block edges /// @@ -132,11 +131,12 @@ spv_result_t DataRulesPass(ValidationState_t& _, const Instruction* inst); /// Performs instruction validation. spv_result_t InstructionPass(ValidationState_t& _, const Instruction* inst); -/// Performs decoration validation. +/// Performs decoration validation. Assumes each decoration on a group +/// has been propagated down to the group members. spv_result_t ValidateDecorations(ValidationState_t& _); /// Performs validation of built-in variables. -spv_result_t ValidateBuiltIns(const ValidationState_t& _); +spv_result_t ValidateBuiltIns(ValidationState_t& _); /// Validates type instructions. spv_result_t TypePass(ValidationState_t& _, const Instruction* inst); @@ -174,8 +174,8 @@ spv_result_t BarriersPass(ValidationState_t& _, const Instruction* inst); /// Validates correctness of literal numbers. spv_result_t LiteralsPass(ValidationState_t& _, const Instruction* inst); -/// Validates correctness of ExtInst instructions. -spv_result_t ExtInstPass(ValidationState_t& _, const Instruction* inst); +/// Validates correctness of extension instructions. +spv_result_t ExtensionPass(ValidationState_t& _, const Instruction* inst); /// Validates correctness of annotation instructions. spv_result_t AnnotationPass(ValidationState_t& _, const Instruction* inst); diff --git a/3rdparty/spirv-tools/source/val/validate_adjacency.cpp b/3rdparty/spirv-tools/source/val/validate_adjacency.cpp index 5ef56be99..108e36106 100644 --- a/3rdparty/spirv-tools/source/val/validate_adjacency.cpp +++ b/3rdparty/spirv-tools/source/val/validate_adjacency.cpp @@ -27,56 +27,88 @@ namespace spvtools { namespace val { -spv_result_t ValidateAdjacency(ValidationState_t& _, size_t idx) { - const auto& instructions = _.ordered_instructions(); - const auto& inst = instructions[idx]; +enum { + // Status right after meeting OpFunction. + IN_NEW_FUNCTION, + // Status right after meeting the entry block. + IN_ENTRY_BLOCK, + // Status right after meeting non-entry blocks. + PHI_VALID, + // Status right after meeting non-OpVariable instructions in the entry block + // or non-OpPhi instructions in non-entry blocks, except OpLine. + PHI_AND_VAR_INVALID, +}; - switch (inst.opcode()) { - case SpvOpPhi: - if (idx > 0) { - switch (instructions[idx - 1].opcode()) { - case SpvOpLabel: - case SpvOpPhi: - case SpvOpLine: - break; - default: - return _.diag(SPV_ERROR_INVALID_DATA, &inst) - << "OpPhi must appear before all non-OpPhi instructions " - << "(except for OpLine, which can be mixed with OpPhi)."; +spv_result_t ValidateAdjacency(ValidationState_t& _) { + const auto& instructions = _.ordered_instructions(); + int adjacency_status = PHI_AND_VAR_INVALID; + + for (size_t i = 0; i < instructions.size(); ++i) { + const auto& inst = instructions[i]; + switch (inst.opcode()) { + case SpvOpFunction: + case SpvOpFunctionParameter: + adjacency_status = IN_NEW_FUNCTION; + break; + case SpvOpLabel: + adjacency_status = + adjacency_status == IN_NEW_FUNCTION ? IN_ENTRY_BLOCK : PHI_VALID; + break; + case SpvOpPhi: + if (adjacency_status != PHI_VALID) { + return _.diag(SPV_ERROR_INVALID_DATA, &inst) + << "OpPhi must appear within a non-entry block before all " + << "non-OpPhi instructions " + << "(except for OpLine, which can be mixed with OpPhi)."; } - } - break; - case SpvOpLoopMerge: - if (idx != (instructions.size() - 1)) { - switch (instructions[idx + 1].opcode()) { - case SpvOpBranch: - case SpvOpBranchConditional: - break; - default: - return _.diag(SPV_ERROR_INVALID_DATA, &inst) - << "OpLoopMerge must immediately precede either an " - << "OpBranch or OpBranchConditional instruction. " - << "OpLoopMerge must be the second-to-last instruction in " - << "its block."; + break; + case SpvOpLine: + case SpvOpNoLine: + break; + case SpvOpLoopMerge: + adjacency_status = PHI_AND_VAR_INVALID; + if (i != (instructions.size() - 1)) { + switch (instructions[i + 1].opcode()) { + case SpvOpBranch: + case SpvOpBranchConditional: + break; + default: + return _.diag(SPV_ERROR_INVALID_DATA, &inst) + << "OpLoopMerge must immediately precede either an " + << "OpBranch or OpBranchConditional instruction. " + << "OpLoopMerge must be the second-to-last instruction in " + << "its block."; + } } - } - break; - case SpvOpSelectionMerge: - if (idx != (instructions.size() - 1)) { - switch (instructions[idx + 1].opcode()) { - case SpvOpBranchConditional: - case SpvOpSwitch: - break; - default: - return _.diag(SPV_ERROR_INVALID_DATA, &inst) - << "OpSelectionMerge must immediately precede either an " - << "OpBranchConditional or OpSwitch instruction. " - << "OpSelectionMerge must be the second-to-last " - << "instruction in its block."; + break; + case SpvOpSelectionMerge: + adjacency_status = PHI_AND_VAR_INVALID; + if (i != (instructions.size() - 1)) { + switch (instructions[i + 1].opcode()) { + case SpvOpBranchConditional: + case SpvOpSwitch: + break; + default: + return _.diag(SPV_ERROR_INVALID_DATA, &inst) + << "OpSelectionMerge must immediately precede either an " + << "OpBranchConditional or OpSwitch instruction. " + << "OpSelectionMerge must be the second-to-last " + << "instruction in its block."; + } } - } - default: - break; + break; + case SpvOpVariable: + if (inst.GetOperandAs(2) == SpvStorageClassFunction && + adjacency_status != IN_ENTRY_BLOCK) { + return _.diag(SPV_ERROR_INVALID_DATA, &inst) + << "All OpVariable instructions in a function must be the " + "first instructions in the first block."; + } + break; + default: + adjacency_status = PHI_AND_VAR_INVALID; + break; + } } return SPV_SUCCESS; diff --git a/3rdparty/spirv-tools/source/val/validate_annotation.cpp b/3rdparty/spirv-tools/source/val/validate_annotation.cpp index f1758391d..621ace2a6 100644 --- a/3rdparty/spirv-tools/source/val/validate_annotation.cpp +++ b/3rdparty/spirv-tools/source/val/validate_annotation.cpp @@ -15,6 +15,7 @@ #include "source/val/validate.h" #include "source/opcode.h" +#include "source/spirv_target_env.h" #include "source/val/instruction.h" #include "source/val/validation_state.h" @@ -50,7 +51,7 @@ spv_result_t ValidateMemberDecorate(ValidationState_t& _, const auto member = inst->GetOperandAs(1); const auto member_count = static_cast(struct_type->words().size() - 2); - if (member_count < member) { + if (member_count <= member) { return _.diag(SPV_ERROR_INVALID_ID, inst) << "Index " << member << " provided in OpMemberDecorate for struct " @@ -63,6 +64,12 @@ spv_result_t ValidateMemberDecorate(ValidationState_t& _, spv_result_t ValidateDecorationGroup(ValidationState_t& _, const Instruction* inst) { + if (spvIsWebGPUEnv(_.context()->target_env)) { + return _.diag(SPV_ERROR_INVALID_BINARY, inst) + << "OpDecorationGroup is not allowed in the WebGPU execution " + << "environment."; + } + const auto decoration_group_id = inst->GetOperandAs(0); const auto decoration_group = _.FindDef(decoration_group_id); for (auto pair : decoration_group->uses()) { @@ -81,6 +88,12 @@ spv_result_t ValidateDecorationGroup(ValidationState_t& _, spv_result_t ValidateGroupDecorate(ValidationState_t& _, const Instruction* inst) { + if (spvIsWebGPUEnv(_.context()->target_env)) { + return _.diag(SPV_ERROR_INVALID_BINARY, inst) + << "OpGroupDecorate is not allowed in the WebGPU execution " + << "environment."; + } + const auto decoration_group_id = inst->GetOperandAs(0); auto decoration_group = _.FindDef(decoration_group_id); if (!decoration_group || SpvOpDecorationGroup != decoration_group->opcode()) { @@ -89,11 +102,26 @@ spv_result_t ValidateGroupDecorate(ValidationState_t& _, << _.getIdName(decoration_group_id) << "' is not a decoration group."; } + for (unsigned i = 1; i < inst->operands().size(); ++i) { + auto target_id = inst->GetOperandAs(i); + auto target = _.FindDef(target_id); + if (!target || target->opcode() == SpvOpDecorationGroup) { + return _.diag(SPV_ERROR_INVALID_ID, inst) + << "OpGroupDecorate may not target OpDecorationGroup '" + << _.getIdName(target_id) << "'"; + } + } return SPV_SUCCESS; } spv_result_t ValidateGroupMemberDecorate(ValidationState_t& _, const Instruction* inst) { + if (spvIsWebGPUEnv(_.context()->target_env)) { + return _.diag(SPV_ERROR_INVALID_BINARY, inst) + << "OpGroupMemberDecorate is not allowed in the WebGPU execution " + << "environment."; + } + const auto decoration_group_id = inst->GetOperandAs(0); const auto decoration_group = _.FindDef(decoration_group_id); if (!decoration_group || SpvOpDecorationGroup != decoration_group->opcode()) { @@ -128,6 +156,79 @@ spv_result_t ValidateGroupMemberDecorate(ValidationState_t& _, return SPV_SUCCESS; } +// Registers necessary decoration(s) for the appropriate IDs based on the +// instruction. +spv_result_t RegisterDecorations(ValidationState_t& _, + const Instruction* inst) { + switch (inst->opcode()) { + case SpvOpDecorate: { + const uint32_t target_id = inst->word(1); + const SpvDecoration dec_type = static_cast(inst->word(2)); + std::vector dec_params; + if (inst->words().size() > 3) { + dec_params.insert(dec_params.end(), inst->words().begin() + 3, + inst->words().end()); + } + _.RegisterDecorationForId(target_id, Decoration(dec_type, dec_params)); + break; + } + case SpvOpMemberDecorate: { + const uint32_t struct_id = inst->word(1); + const uint32_t index = inst->word(2); + const SpvDecoration dec_type = static_cast(inst->word(3)); + std::vector dec_params; + if (inst->words().size() > 4) { + dec_params.insert(dec_params.end(), inst->words().begin() + 4, + inst->words().end()); + } + _.RegisterDecorationForId(struct_id, + Decoration(dec_type, dec_params, index)); + break; + } + case SpvOpDecorationGroup: { + // We don't need to do anything right now. Assigning decorations to groups + // will be taken care of via OpGroupDecorate. + break; + } + case SpvOpGroupDecorate: { + // Word 1 is the group . All subsequent words are target s that + // are going to be decorated with the decorations. + const uint32_t decoration_group_id = inst->word(1); + std::vector& group_decorations = + _.id_decorations(decoration_group_id); + for (size_t i = 2; i < inst->words().size(); ++i) { + const uint32_t target_id = inst->word(i); + _.RegisterDecorationsForId(target_id, group_decorations.begin(), + group_decorations.end()); + } + break; + } + case SpvOpGroupMemberDecorate: { + // Word 1 is the Decoration Group followed by (struct,literal) + // pairs. All decorations of the group should be applied to all the struct + // members that are specified in the instructions. + const uint32_t decoration_group_id = inst->word(1); + std::vector& group_decorations = + _.id_decorations(decoration_group_id); + // Grammar checks ensures that the number of arguments to this instruction + // is an odd number: 1 decoration group + (id,literal) pairs. + for (size_t i = 2; i + 1 < inst->words().size(); i = i + 2) { + const uint32_t struct_id = inst->word(i); + const uint32_t index = inst->word(i + 1); + // ID validation phase ensures this is in fact a struct instruction and + // that the index is not out of bound. + _.RegisterDecorationsForStructMember(struct_id, index, + group_decorations.begin(), + group_decorations.end()); + } + break; + } + default: + break; + } + return SPV_SUCCESS; +} + } // namespace spv_result_t AnnotationPass(ValidationState_t& _, const Instruction* inst) { @@ -151,6 +252,10 @@ spv_result_t AnnotationPass(ValidationState_t& _, const Instruction* inst) { break; } + // In order to validate decoration rules, we need to know all the decorations + // that are applied to any given . + RegisterDecorations(_, inst); + return SPV_SUCCESS; } diff --git a/3rdparty/spirv-tools/source/val/validate_atomics.cpp b/3rdparty/spirv-tools/source/val/validate_atomics.cpp index becb87200..6bfd06d4e 100644 --- a/3rdparty/spirv-tools/source/val/validate_atomics.cpp +++ b/3rdparty/spirv-tools/source/val/validate_atomics.cpp @@ -21,136 +21,13 @@ #include "source/spirv_target_env.h" #include "source/util/bitutils.h" #include "source/val/instruction.h" +#include "source/val/validate_memory_semantics.h" +#include "source/val/validate_scopes.h" #include "source/val/validation_state.h" namespace spvtools { namespace val { -// Validates Memory Scope operand. -spv_result_t ValidateMemoryScope(ValidationState_t& _, const Instruction* inst, - uint32_t id) { - const SpvOp opcode = inst->opcode(); - bool is_int32 = false, is_const_int32 = false; - uint32_t value = 0; - std::tie(is_int32, is_const_int32, value) = _.EvalInt32IfConst(id); - - if (!is_int32) { - return _.diag(SPV_ERROR_INVALID_DATA, inst) - << spvOpcodeString(opcode) << ": expected Scope to be 32-bit int"; - } - - if (!is_const_int32) { - return SPV_SUCCESS; - } - -#if 0 - // TODO(atgoo@github.com): this check fails Vulkan CTS, reenable once fixed. - if (spvIsVulkanEnv(_.context()->target_env)) { - if (value != SpvScopeDevice && value != SpvScopeWorkgroup && - value != SpvScopeInvocation) { - return _.diag(SPV_ERROR_INVALID_DATA, inst) - << spvOpcodeString(opcode) - << ": in Vulkan environment memory scope is limited to Device, " - "Workgroup and Invocation"; - } - } -#endif - - // TODO(atgoo@github.com) Add checks for OpenCL and OpenGL environments. - - return SPV_SUCCESS; -} - -// Validates a Memory Semantics operand. -spv_result_t ValidateMemorySemantics(ValidationState_t& _, - const Instruction* inst, - uint32_t operand_index) { - const SpvOp opcode = inst->opcode(); - bool is_int32 = false, is_const_int32 = false; - uint32_t flags = 0; - auto memory_semantics_id = inst->GetOperandAs(operand_index); - std::tie(is_int32, is_const_int32, flags) = - _.EvalInt32IfConst(memory_semantics_id); - - if (!is_int32) { - return _.diag(SPV_ERROR_INVALID_DATA, inst) - << spvOpcodeString(opcode) - << ": expected Memory Semantics to be 32-bit int"; - } - - if (!is_const_int32) { - return SPV_SUCCESS; - } - - if (spvtools::utils::CountSetBits( - flags & - (SpvMemorySemanticsAcquireMask | SpvMemorySemanticsReleaseMask | - SpvMemorySemanticsAcquireReleaseMask | - SpvMemorySemanticsSequentiallyConsistentMask)) > 1) { - return _.diag(SPV_ERROR_INVALID_DATA, inst) - << spvOpcodeString(opcode) - << ": no more than one of the following Memory Semantics bits can " - "be set at the same time: Acquire, Release, AcquireRelease or " - "SequentiallyConsistent"; - } - - if (flags & SpvMemorySemanticsUniformMemoryMask && - !_.HasCapability(SpvCapabilityShader)) { - return _.diag(SPV_ERROR_INVALID_DATA, inst) - << spvOpcodeString(opcode) - << ": Memory Semantics UniformMemory requires capability Shader"; - } - - if (flags & SpvMemorySemanticsAtomicCounterMemoryMask && - !_.HasCapability(SpvCapabilityAtomicStorage)) { - return _.diag(SPV_ERROR_INVALID_DATA, inst) - << spvOpcodeString(opcode) - << ": Memory Semantics UniformMemory requires capability " - "AtomicStorage"; - } - - if (opcode == SpvOpAtomicFlagClear && - (flags & SpvMemorySemanticsAcquireMask || - flags & SpvMemorySemanticsAcquireReleaseMask)) { - return _.diag(SPV_ERROR_INVALID_DATA, inst) - << "Memory Semantics Acquire and AcquireRelease cannot be used with " - << spvOpcodeString(opcode); - } - - if (opcode == SpvOpAtomicCompareExchange && operand_index == 5 && - (flags & SpvMemorySemanticsReleaseMask || - flags & SpvMemorySemanticsAcquireReleaseMask)) { - return _.diag(SPV_ERROR_INVALID_DATA, inst) - << spvOpcodeString(opcode) - << ": Memory Semantics Release and AcquireRelease cannot be used " - "for operand Unequal"; - } - - if (spvIsVulkanEnv(_.context()->target_env)) { - if (opcode == SpvOpAtomicLoad && - (flags & SpvMemorySemanticsReleaseMask || - flags & SpvMemorySemanticsAcquireReleaseMask || - flags & SpvMemorySemanticsSequentiallyConsistentMask)) { - return _.diag(SPV_ERROR_INVALID_DATA, inst) - << "Vulkan spec disallows OpAtomicLoad with Memory Semantics " - "Release, AcquireRelease and SequentiallyConsistent"; - } - - if (opcode == SpvOpAtomicStore && - (flags & SpvMemorySemanticsAcquireMask || - flags & SpvMemorySemanticsAcquireReleaseMask || - flags & SpvMemorySemanticsSequentiallyConsistentMask)) { - return _.diag(SPV_ERROR_INVALID_DATA, inst) - << "Vulkan spec disallows OpAtomicStore with Memory Semantics " - "Acquire, AcquireRelease and SequentiallyConsistent"; - } - } - - // TODO(atgoo@github.com) Add checks for OpenCL and OpenGL environments. - - return SPV_SUCCESS; -} - // Validates correctness of atomic instructions. spv_result_t AtomicsPass(ValidationState_t& _, const Instruction* inst) { const SpvOp opcode = inst->opcode(); @@ -200,10 +77,33 @@ spv_result_t AtomicsPass(ValidationState_t& _, const Instruction* inst) { } if (spvIsVulkanEnv(_.context()->target_env) && _.GetBitWidth(result_type) != 32) { - return _.diag(SPV_ERROR_INVALID_DATA, inst) - << spvOpcodeString(opcode) - << ": according to the Vulkan spec atomic Result Type needs " - "to be a 32-bit int scalar type"; + switch (opcode) { + case SpvOpAtomicSMin: + case SpvOpAtomicUMin: + case SpvOpAtomicSMax: + case SpvOpAtomicUMax: + case SpvOpAtomicAnd: + case SpvOpAtomicOr: + case SpvOpAtomicXor: + case SpvOpAtomicIAdd: + case SpvOpAtomicLoad: + case SpvOpAtomicStore: + case SpvOpAtomicExchange: + case SpvOpAtomicCompareExchange: { + if (_.GetBitWidth(result_type) == 64 && + !_.HasCapability(SpvCapabilityInt64Atomics)) + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << spvOpcodeString(opcode) + << ": 64-bit atomics require the Int64Atomics " + "capability"; + } break; + default: + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << spvOpcodeString(opcode) + << ": according to the Vulkan spec atomic Result Type " + "needs " + "to be a 32-bit int scalar type"; + } } } @@ -229,11 +129,21 @@ spv_result_t AtomicsPass(ValidationState_t& _, const Instruction* inst) { case SpvStorageClassStorageBuffer: break; default: - return _.diag(SPV_ERROR_INVALID_DATA, inst) - << spvOpcodeString(opcode) - << ": expected Pointer Storage Class to be Uniform, " - "Workgroup, CrossWorkgroup, Generic, AtomicCounter, Image " - "or StorageBuffer"; + if (spvIsOpenCLEnv(_.context()->target_env)) { + if (storage_class != SpvStorageClassFunction) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << spvOpcodeString(opcode) + << ": expected Pointer Storage Class to be Uniform, " + "Workgroup, CrossWorkgroup, Generic, AtomicCounter, " + "Image, StorageBuffer or Function"; + } + } else { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << spvOpcodeString(opcode) + << ": expected Pointer Storage Class to be Uniform, " + "Workgroup, CrossWorkgroup, Generic, AtomicCounter, " + "Image or StorageBuffer"; + } } if (opcode == SpvOpAtomicFlagTestAndSet || @@ -278,9 +188,8 @@ spv_result_t AtomicsPass(ValidationState_t& _, const Instruction* inst) { if (value_type != data_type) { return _.diag(SPV_ERROR_INVALID_DATA, inst) << spvOpcodeString(opcode) - << ": expected Value type and the type pointed to by Pointer " - "to" - << " be the same"; + << ": expected Value type and the type pointed to by " + "Pointer to be the same"; } } else if (opcode != SpvOpAtomicLoad && opcode != SpvOpAtomicIIncrement && opcode != SpvOpAtomicIDecrement && diff --git a/3rdparty/spirv-tools/source/val/validate_barriers.cpp b/3rdparty/spirv-tools/source/val/validate_barriers.cpp index 0771f2d28..4fbe9c90a 100644 --- a/3rdparty/spirv-tools/source/val/validate_barriers.cpp +++ b/3rdparty/spirv-tools/source/val/validate_barriers.cpp @@ -24,173 +24,12 @@ #include "source/spirv_target_env.h" #include "source/util/bitutils.h" #include "source/val/instruction.h" +#include "source/val/validate_memory_semantics.h" +#include "source/val/validate_scopes.h" #include "source/val/validation_state.h" namespace spvtools { namespace val { -namespace { - -// Validates Execution Scope operand. -spv_result_t ValidateExecutionScope(ValidationState_t& _, - const Instruction* inst, uint32_t id) { - const SpvOp opcode = inst->opcode(); - bool is_int32 = false, is_const_int32 = false; - uint32_t value = 0; - std::tie(is_int32, is_const_int32, value) = _.EvalInt32IfConst(id); - - if (!is_int32) { - return _.diag(SPV_ERROR_INVALID_DATA, inst) - << spvOpcodeString(opcode) - << ": expected Execution Scope to be a 32-bit int"; - } - - if (!is_const_int32) { - return SPV_SUCCESS; - } - - if (spvIsVulkanEnv(_.context()->target_env)) { - if (value != SpvScopeWorkgroup && value != SpvScopeSubgroup) { - return _.diag(SPV_ERROR_INVALID_DATA, inst) - << spvOpcodeString(opcode) - << ": in Vulkan environment Execution Scope is limited to " - "Workgroup and Subgroup"; - } - - if (_.context()->target_env != SPV_ENV_VULKAN_1_0 && - value != SpvScopeSubgroup) { - _.function(inst->function()->id()) - ->RegisterExecutionModelLimitation([](SpvExecutionModel model, - std::string* message) { - if (model == SpvExecutionModelFragment || - model == SpvExecutionModelVertex || - model == SpvExecutionModelGeometry || - model == SpvExecutionModelTessellationEvaluation) { - if (message) { - *message = - "in Vulkan evironment, OpControlBarrier execution scope " - "must be Subgroup for Fragment, Vertex, Geometry and " - "TessellationEvaluation execution models"; - } - return false; - } - return true; - }); - } - } - - // TODO(atgoo@github.com) Add checks for OpenCL and OpenGL environments. - - return SPV_SUCCESS; -} - -// Validates Memory Scope operand. -spv_result_t ValidateMemoryScope(ValidationState_t& _, const Instruction* inst, - uint32_t id) { - const SpvOp opcode = inst->opcode(); - bool is_int32 = false, is_const_int32 = false; - uint32_t value = 0; - std::tie(is_int32, is_const_int32, value) = _.EvalInt32IfConst(id); - - if (!is_int32) { - return _.diag(SPV_ERROR_INVALID_DATA, inst) - << spvOpcodeString(opcode) - << ": expected Memory Scope to be a 32-bit int"; - } - - if (!is_const_int32) { - return SPV_SUCCESS; - } - - if (spvIsVulkanEnv(_.context()->target_env)) { - if (value == SpvScopeCrossDevice) { - return _.diag(SPV_ERROR_INVALID_DATA, inst) - << spvOpcodeString(opcode) - << ": in Vulkan environment, Memory Scope cannot be CrossDevice"; - } - if (_.context()->target_env == SPV_ENV_VULKAN_1_0 && - value != SpvScopeDevice && value != SpvScopeWorkgroup && - value != SpvScopeInvocation) { - return _.diag(SPV_ERROR_INVALID_DATA, inst) - << spvOpcodeString(opcode) - << ": in Vulkan 1.0 environment Memory Scope is limited to " - "Device, " - "Workgroup and Invocation"; - } - } - - // TODO(atgoo@github.com) Add checks for OpenCL and OpenGL environments. - - return SPV_SUCCESS; -} - -// Validates Memory Semantics operand. -spv_result_t ValidateMemorySemantics(ValidationState_t& _, - const Instruction* inst, uint32_t id) { - const SpvOp opcode = inst->opcode(); - bool is_int32 = false, is_const_int32 = false; - uint32_t value = 0; - std::tie(is_int32, is_const_int32, value) = _.EvalInt32IfConst(id); - - if (!is_int32) { - return _.diag(SPV_ERROR_INVALID_DATA, inst) - << spvOpcodeString(opcode) - << ": expected Memory Semantics to be a 32-bit int"; - } - - if (!is_const_int32) { - return SPV_SUCCESS; - } - - const size_t num_memory_order_set_bits = spvtools::utils::CountSetBits( - value & (SpvMemorySemanticsAcquireMask | SpvMemorySemanticsReleaseMask | - SpvMemorySemanticsAcquireReleaseMask | - SpvMemorySemanticsSequentiallyConsistentMask)); - - if (num_memory_order_set_bits > 1) { - return _.diag(SPV_ERROR_INVALID_DATA, inst) - << spvOpcodeString(opcode) - << ": Memory Semantics can have at most one of the following bits " - "set: Acquire, Release, AcquireRelease or SequentiallyConsistent"; - } - - if (spvIsVulkanEnv(_.context()->target_env)) { - const bool includes_storage_class = - value & (SpvMemorySemanticsUniformMemoryMask | - SpvMemorySemanticsWorkgroupMemoryMask | - SpvMemorySemanticsImageMemoryMask); - - if (opcode == SpvOpMemoryBarrier && !num_memory_order_set_bits) { - return _.diag(SPV_ERROR_INVALID_DATA, inst) - << spvOpcodeString(opcode) - << ": Vulkan specification requires Memory Semantics to have one " - "of the following bits set: Acquire, Release, AcquireRelease " - "or SequentiallyConsistent"; - } - - if (opcode == SpvOpMemoryBarrier && !includes_storage_class) { - return _.diag(SPV_ERROR_INVALID_DATA, inst) - << spvOpcodeString(opcode) - << ": expected Memory Semantics to include a Vulkan-supported " - "storage class"; - } - -#if 0 - // TODO(atgoo@github.com): this check fails Vulkan CTS, reenable once fixed. - if (opcode == SpvOpControlBarrier && value && !includes_storage_class) { - return _.diag(SPV_ERROR_INVALID_DATA, inst) - << spvOpcodeString(opcode) - << ": expected Memory Semantics to include a Vulkan-supported " - "storage class if Memory Semantics is not None"; - } -#endif - } - - // TODO(atgoo@github.com) Add checks for OpenCL and OpenGL environments. - - return SPV_SUCCESS; -} - -} // namespace // Validates correctness of barrier instructions. spv_result_t BarriersPass(ValidationState_t& _, const Instruction* inst) { @@ -206,7 +45,9 @@ spv_result_t BarriersPass(ValidationState_t& _, const Instruction* inst) { [](SpvExecutionModel model, std::string* message) { if (model != SpvExecutionModelTessellationControl && model != SpvExecutionModelGLCompute && - model != SpvExecutionModelKernel) { + model != SpvExecutionModelKernel && + model != SpvExecutionModelTaskNV && + model != SpvExecutionModelMeshNV) { if (message) { *message = "OpControlBarrier requires one of the following " @@ -221,7 +62,6 @@ spv_result_t BarriersPass(ValidationState_t& _, const Instruction* inst) { const uint32_t execution_scope = inst->word(1); const uint32_t memory_scope = inst->word(2); - const uint32_t memory_semantics = inst->word(3); if (auto error = ValidateExecutionScope(_, inst, execution_scope)) { return error; @@ -231,7 +71,7 @@ spv_result_t BarriersPass(ValidationState_t& _, const Instruction* inst) { return error; } - if (auto error = ValidateMemorySemantics(_, inst, memory_semantics)) { + if (auto error = ValidateMemorySemantics(_, inst, 2)) { return error; } break; @@ -239,13 +79,12 @@ spv_result_t BarriersPass(ValidationState_t& _, const Instruction* inst) { case SpvOpMemoryBarrier: { const uint32_t memory_scope = inst->word(1); - const uint32_t memory_semantics = inst->word(2); if (auto error = ValidateMemoryScope(_, inst, memory_scope)) { return error; } - if (auto error = ValidateMemorySemantics(_, inst, memory_semantics)) { + if (auto error = ValidateMemorySemantics(_, inst, 1)) { return error; } break; @@ -277,13 +116,12 @@ spv_result_t BarriersPass(ValidationState_t& _, const Instruction* inst) { } const uint32_t memory_scope = inst->word(2); - const uint32_t memory_semantics = inst->word(3); if (auto error = ValidateMemoryScope(_, inst, memory_scope)) { return error; } - if (auto error = ValidateMemorySemantics(_, inst, memory_semantics)) { + if (auto error = ValidateMemorySemantics(_, inst, 2)) { return error; } break; diff --git a/3rdparty/spirv-tools/source/val/validate_builtins.cpp b/3rdparty/spirv-tools/source/val/validate_builtins.cpp index c791e428f..aaba32490 100644 --- a/3rdparty/spirv-tools/source/val/validate_builtins.cpp +++ b/3rdparty/spirv-tools/source/val/validate_builtins.cpp @@ -55,7 +55,7 @@ std::string GetIdDesc(const Instruction& inst) { // the Vulkan spec. // TODO: If non-Vulkan validation rules are added then it might need // to be refactored. -spv_result_t GetUnderlyingType(const ValidationState_t& _, +spv_result_t GetUnderlyingType(ValidationState_t& _, const Decoration& decoration, const Instruction& inst, uint32_t* underlying_type) { @@ -106,7 +106,7 @@ SpvStorageClass GetStorageClass(const Instruction& inst) { // ValidationState_t to be made available to other users. class BuiltInsValidator { public: - BuiltInsValidator(const ValidationState_t& vstate) : _(vstate) {} + BuiltInsValidator(ValidationState_t& vstate) : _(vstate) {} // Run validation. spv_result_t Run(); @@ -167,6 +167,8 @@ class BuiltInsValidator { const Instruction& inst); spv_result_t ValidateVertexIndexAtDefinition(const Decoration& decoration, const Instruction& inst); + spv_result_t ValidateVertexIdOrInstanceIdAtDefinition( + const Decoration& decoration, const Instruction& inst); spv_result_t ValidateWorkgroupSizeAtDefinition(const Decoration& decoration, const Instruction& inst); // Used for GlobalInvocationId, LocalInvocationId, NumWorkgroups, WorkgroupId. @@ -205,6 +207,11 @@ class BuiltInsValidator { const Instruction& referenced_inst, const Instruction& referenced_from_inst); + spv_result_t ValidateInstanceIdAtReference( + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, + const Instruction& referenced_from_inst); + spv_result_t ValidateInstanceIndexAtReference( const Decoration& decoration, const Instruction& built_in_inst, const Instruction& referenced_inst, @@ -375,7 +382,7 @@ class BuiltInsValidator { // instruction. void Update(const Instruction& inst); - const ValidationState_t& _; + ValidationState_t& _; // Mapping id -> list of rules which validate instruction referencing the // id. Rules can create new rules and add them to this container. @@ -863,7 +870,8 @@ spv_result_t BuiltInsValidator::ValidateClipOrCullDistanceAtReference( } case SpvExecutionModelTessellationControl: case SpvExecutionModelTessellationEvaluation: - case SpvExecutionModelGeometry: { + case SpvExecutionModelGeometry: + case SpvExecutionModelMeshNV: { if (decoration.struct_member_index() != Decoration::kInvalidMember) { // The outer level of array is applied on the variable. if (spv_result_t error = ValidateF32Arr( @@ -1445,7 +1453,8 @@ spv_result_t BuiltInsValidator::ValidatePointSizeAtReference( } case SpvExecutionModelTessellationControl: case SpvExecutionModelTessellationEvaluation: - case SpvExecutionModelGeometry: { + case SpvExecutionModelGeometry: + case SpvExecutionModelMeshNV: { // PointSize can be a per-vertex variable for tessellation control, // tessellation evaluation and geometry shader stages. In such cases // variables will have an array of 32-bit floats. @@ -1556,10 +1565,12 @@ spv_result_t BuiltInsValidator::ValidatePositionAtReference( } case SpvExecutionModelGeometry: case SpvExecutionModelTessellationControl: - case SpvExecutionModelTessellationEvaluation: { + case SpvExecutionModelTessellationEvaluation: + case SpvExecutionModelMeshNV: { // Position can be a per-vertex variable for tessellation control, - // tessellation evaluation and geometry shader stages. In such cases - // variables will have an array of 4-component 32-bit float vectors. + // tessellation evaluation, geometry and mesh shader stages. In such + // cases variables will have an array of 4-component 32-bit float + // vectors. if (decoration.struct_member_index() != Decoration::kInvalidMember) { // The array is on the variable, so this must be a 4-component // 32-bit float vector. @@ -1682,7 +1693,14 @@ spv_result_t BuiltInsValidator::ValidatePrimitiveIdAtReference( case SpvExecutionModelFragment: case SpvExecutionModelTessellationControl: case SpvExecutionModelTessellationEvaluation: - case SpvExecutionModelGeometry: { + case SpvExecutionModelGeometry: + case SpvExecutionModelMeshNV: + case SpvExecutionModelRayGenerationNV: + case SpvExecutionModelIntersectionNV: + case SpvExecutionModelAnyHitNV: + case SpvExecutionModelClosestHitNV: + case SpvExecutionModelMissNV: + case SpvExecutionModelCallableNV: { // Ok. break; } @@ -2074,6 +2092,57 @@ spv_result_t BuiltInsValidator::ValidateVertexIndexAtDefinition( return ValidateVertexIndexAtReference(decoration, inst, inst, inst); } +spv_result_t BuiltInsValidator::ValidateVertexIdOrInstanceIdAtDefinition( + const Decoration& decoration, const Instruction& inst) { + const SpvBuiltIn label = SpvBuiltIn(decoration.params()[0]); + bool allow_instance_id = _.HasCapability(SpvCapabilityRayTracingNV) && + label == SpvBuiltInInstanceId; + if (spvIsVulkanEnv(_.context()->target_env) && !allow_instance_id) { + return _.diag(SPV_ERROR_INVALID_DATA, &inst) + << "Vulkan spec doesn't allow BuiltIn VertexId/InstanceId " + "to be used."; + } + + if (label == SpvBuiltInInstanceId) { + return ValidateInstanceIdAtReference(decoration, inst, inst, inst); + } + return SPV_SUCCESS; +} + +spv_result_t BuiltInsValidator::ValidateInstanceIdAtReference( + const Decoration& decoration, const Instruction& built_in_inst, + const Instruction& referenced_inst, + const Instruction& referenced_from_inst) { + if (spvIsVulkanEnv(_.context()->target_env)) { + for (const SpvExecutionModel execution_model : execution_models_) { + switch (execution_model) { + case SpvExecutionModelIntersectionNV: + case SpvExecutionModelClosestHitNV: + case SpvExecutionModelAnyHitNV: + // Do nothing, valid stages + break; + default: + return _.diag(SPV_ERROR_INVALID_DATA, &referenced_from_inst) + << "Vulkan spec allows BuiltIn InstanceId to be used " + "only with IntersectionNV, ClosestHitNV and AnyHitNV " + "execution models. " + << GetReferenceDesc(decoration, built_in_inst, referenced_inst, + referenced_from_inst); + break; + } + } + } + + if (function_id_ == 0) { + // Propagate this rule to all dependant ids in the global scope. + id_to_at_reference_checks_[referenced_from_inst.id()].push_back(std::bind( + &BuiltInsValidator::ValidateInstanceIdAtReference, this, decoration, + built_in_inst, referenced_from_inst, std::placeholders::_1)); + } + + return SPV_SUCCESS; +} + spv_result_t BuiltInsValidator::ValidateVertexIndexAtReference( const Decoration& decoration, const Instruction& built_in_inst, const Instruction& referenced_inst, @@ -2187,7 +2256,8 @@ spv_result_t BuiltInsValidator::ValidateLayerOrViewportIndexAtReference( for (const SpvExecutionModel execution_model : execution_models_) { switch (execution_model) { case SpvExecutionModelGeometry: - case SpvExecutionModelFragment: { + case SpvExecutionModelFragment: + case SpvExecutionModelMeshNV: { // Ok. break; case SpvExecutionModelVertex: @@ -2270,7 +2340,9 @@ spv_result_t BuiltInsValidator::ValidateComputeShaderI32Vec3InputAtReference( } for (const SpvExecutionModel execution_model : execution_models_) { - if (execution_model != SpvExecutionModelGLCompute) { + if (execution_model != SpvExecutionModelGLCompute && + execution_model != SpvExecutionModelTaskNV && + execution_model != SpvExecutionModelMeshNV) { return _.diag(SPV_ERROR_INVALID_DATA, &referenced_from_inst) << "Vulkan spec allows BuiltIn " << _.grammar().lookupOperandName(SPV_OPERAND_TYPE_BUILT_IN, @@ -2427,7 +2499,9 @@ spv_result_t BuiltInsValidator::ValidateSingleBuiltInAtDefinition( return ValidateWorkgroupSizeAtDefinition(decoration, inst); } case SpvBuiltInVertexId: - case SpvBuiltInInstanceId: + case SpvBuiltInInstanceId: { + return ValidateVertexIdOrInstanceIdAtDefinition(decoration, inst); + } case SpvBuiltInLocalInvocationIndex: case SpvBuiltInWorkDim: case SpvBuiltInGlobalSize: @@ -2464,7 +2538,34 @@ spv_result_t BuiltInsValidator::ValidateSingleBuiltInAtDefinition( case SpvBuiltInPositionPerViewNV: case SpvBuiltInViewportMaskPerViewNV: case SpvBuiltInFullyCoveredEXT: - case SpvBuiltInMax: { + case SpvBuiltInMax: + case SpvBuiltInTaskCountNV: + case SpvBuiltInPrimitiveCountNV: + case SpvBuiltInPrimitiveIndicesNV: + case SpvBuiltInClipDistancePerViewNV: + case SpvBuiltInCullDistancePerViewNV: + case SpvBuiltInLayerPerViewNV: + case SpvBuiltInMeshViewCountNV: + case SpvBuiltInMeshViewIndicesNV: + case SpvBuiltInBaryCoordNV: + case SpvBuiltInBaryCoordNoPerspNV: + case SpvBuiltInFragmentSizeNV: // alias SpvBuiltInFragSizeEXT + case SpvBuiltInInvocationsPerPixelNV: // alias + // SpvBuiltInFragInvocationCountEXT + case SpvBuiltInLaunchIdNV: + case SpvBuiltInLaunchSizeNV: + case SpvBuiltInWorldRayOriginNV: + case SpvBuiltInWorldRayDirectionNV: + case SpvBuiltInObjectRayOriginNV: + case SpvBuiltInObjectRayDirectionNV: + case SpvBuiltInRayTminNV: + case SpvBuiltInRayTmaxNV: + case SpvBuiltInInstanceCustomIndexNV: + case SpvBuiltInObjectToWorldNV: + case SpvBuiltInWorldToObjectNV: + case SpvBuiltInHitTNV: + case SpvBuiltInHitKindNV: + case SpvBuiltInIncomingRayFlagsNV: { // No validation rules (for the moment). break; } @@ -2554,7 +2655,7 @@ spv_result_t BuiltInsValidator::Run() { } // namespace // Validates correctness of built-in variables. -spv_result_t ValidateBuiltIns(const ValidationState_t& _) { +spv_result_t ValidateBuiltIns(ValidationState_t& _) { if (!spvIsVulkanEnv(_.context()->target_env)) { // Early return. All currently implemented rules are based on Vulkan spec. // diff --git a/3rdparty/spirv-tools/source/val/validate_capability.cpp b/3rdparty/spirv-tools/source/val/validate_capability.cpp index 4724b9f79..ad6cb2654 100644 --- a/3rdparty/spirv-tools/source/val/validate_capability.cpp +++ b/3rdparty/spirv-tools/source/val/validate_capability.cpp @@ -83,6 +83,11 @@ bool IsSupportOptionalVulkan_1_0(uint32_t capability) { case SpvCapabilityStorageImageReadWithoutFormat: case SpvCapabilityStorageImageWriteWithoutFormat: case SpvCapabilityMultiViewport: + case SpvCapabilityInt64Atomics: + case SpvCapabilityTransformFeedback: + case SpvCapabilityGeometryStreams: + case SpvCapabilityFloat16: + case SpvCapabilityInt8: return true; } return false; @@ -217,6 +222,19 @@ bool IsEnabledByCapabilityOpenCL_2_0(ValidationState_t& _, return false; } +bool IsSupportGuaranteedWebGPU(uint32_t capability) { + switch (capability) { + case SpvCapabilityMatrix: + case SpvCapabilityShader: + case SpvCapabilitySampled1D: + case SpvCapabilityImage1D: + case SpvCapabilityDerivativeControl: + case SpvCapabilityImageQuery: + return true; + } + return false; +} + } // namespace // Validates that capability declarations use operands allowed in the current @@ -300,6 +318,14 @@ spv_result_t CapabilityPass(ValidationState_t& _, const Instruction* inst) { << " Profile specification" << " (or requires extension or capability)"; } + } else if (env == SPV_ENV_WEBGPU_0) { + if (!IsSupportGuaranteedWebGPU(capability) && + !IsEnabledByExtension(_, capability)) { + return _.diag(SPV_ERROR_INVALID_CAPABILITY, inst) + << "Capability " << capability_str() + << " is not allowed by WebGPU specification" + << " (or requires extension)"; + } } return SPV_SUCCESS; diff --git a/3rdparty/spirv-tools/source/val/validate_cfg.cpp b/3rdparty/spirv-tools/source/val/validate_cfg.cpp index 744641e97..8fe30a881 100644 --- a/3rdparty/spirv-tools/source/val/validate_cfg.cpp +++ b/3rdparty/spirv-tools/source/val/validate_cfg.cpp @@ -48,6 +48,20 @@ spv_result_t ValidatePhi(ValidationState_t& _, const Instruction* inst) { "basic blocks."; } + const Instruction* type_inst = _.FindDef(inst->type_id()); + assert(type_inst); + + const SpvOp type_opcode = type_inst->opcode(); + if (type_opcode == SpvOpTypePointer && + _.addressing_model() == SpvAddressingModelLogical) { + if (!_.features().variable_pointers && + !_.features().variable_pointers_storage_buffer) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Using pointers with OpPhi requires capability " + << "VariablePointers or VariablePointersStorageBuffer"; + } + } + // Create a uniqued vector of predecessor ids for comparison against // incoming values. OpBranchConditional %cond %label %label produces two // predecessors in the CFG. @@ -111,7 +125,8 @@ spv_result_t ValidateBranchConditional(ValidationState_t& _, // grab the condition operand and check that it is a bool const auto cond_id = inst->GetOperandAs(0); const auto cond_op = _.FindDef(cond_id); - if (!cond_op || !_.IsBoolScalarType(cond_op->type_id())) { + if (!cond_op || !cond_op->type_id() || + !_.IsBoolScalarType(cond_op->type_id())) { return _.diag(SPV_ERROR_INVALID_ID, inst) << "Condition operand for " "OpBranchConditional must be " "of boolean type"; @@ -296,9 +311,9 @@ std::string ConstructErrorString(const Construct& construct, // |case_fall_through|. Returns SPV_ERROR_INVALID_CFG if the case construct // headed by |target_block| branches to multiple case constructs. spv_result_t FindCaseFallThrough( - const ValidationState_t& _, BasicBlock* target_block, - uint32_t* case_fall_through, const BasicBlock* merge, - const std::unordered_set& case_targets, Function* function) { + ValidationState_t& _, BasicBlock* target_block, uint32_t* case_fall_through, + const BasicBlock* merge, const std::unordered_set& case_targets, + Function* function) { std::vector stack; stack.push_back(target_block); std::unordered_set visited; @@ -336,7 +351,9 @@ spv_result_t FindCaseFallThrough( } if (*case_fall_through == 0u) { - *case_fall_through = block->id(); + if (target_block != block) { + *case_fall_through = block->id(); + } } else if (*case_fall_through != block->id()) { // Case construct has at most one branch to another case construct. return _.diag(SPV_ERROR_INVALID_CFG, target_block->label()) @@ -352,8 +369,7 @@ spv_result_t FindCaseFallThrough( return SPV_SUCCESS; } -spv_result_t StructuredSwitchChecks(const ValidationState_t& _, - Function* function, +spv_result_t StructuredSwitchChecks(ValidationState_t& _, Function* function, const Instruction* switch_inst, const BasicBlock* header, const BasicBlock* merge) { @@ -452,7 +468,7 @@ spv_result_t StructuredSwitchChecks(const ValidationState_t& _, } spv_result_t StructuredControlFlowChecks( - const ValidationState_t& _, Function* function, + ValidationState_t& _, Function* function, const std::vector>& back_edges) { /// Check all backedges target only loop headers and have exactly one /// back-edge branching to it diff --git a/3rdparty/spirv-tools/source/val/validate_composites.cpp b/3rdparty/spirv-tools/source/val/validate_composites.cpp index 6be60261e..ccc558773 100644 --- a/3rdparty/spirv-tools/source/val/validate_composites.cpp +++ b/3rdparty/spirv-tools/source/val/validate_composites.cpp @@ -18,6 +18,7 @@ #include "source/diagnostic.h" #include "source/opcode.h" +#include "source/spirv_target_env.h" #include "source/val/instruction.h" #include "source/val/validation_state.h" @@ -148,8 +149,8 @@ spv_result_t ValidateVectorExtractDynamic(ValidationState_t& _, << "Expected Vector component type to be equal to Result Type"; } - const uint32_t index_type = _.GetOperandTypeId(inst, 3); - if (!_.IsIntScalarType(index_type)) { + const auto index = _.FindDef(inst->GetOperandAs(3)); + if (!index || index->type_id() == 0 || !_.IsIntScalarType(index->type_id())) { return _.diag(SPV_ERROR_INVALID_DATA, inst) << "Expected Index to be int scalar"; } @@ -464,10 +465,12 @@ spv_result_t ValidateVectorShuffle(ValidationState_t& _, } // All Component literals must either be FFFFFFFF or in [0, N - 1]. + // For WebGPU specifically, Component literals cannot be FFFFFFFF. auto vector1ComponentCount = vector1Type->GetOperandAs(2); auto vector2ComponentCount = vector2Type->GetOperandAs(2); auto N = vector1ComponentCount + vector2ComponentCount; auto firstLiteralIndex = 4; + const auto is_webgpu_env = spvIsWebGPUEnv(_.context()->target_env); for (size_t i = firstLiteralIndex; i < inst->operands().size(); ++i) { auto literal = inst->GetOperandAs(i); if (literal != 0xFFFFFFFF && literal >= N) { @@ -475,6 +478,12 @@ spv_result_t ValidateVectorShuffle(ValidationState_t& _, << "Component index " << literal << " is out of bounds for " << "combined (Vector1 + Vector2) size of " << N << "."; } + + if (is_webgpu_env && literal == 0xFFFFFFFF) { + return _.diag(SPV_ERROR_INVALID_ID, inst) + << "Component literal at operand " << i - firstLiteralIndex + << " cannot be 0xFFFFFFFF in WebGPU execution environment."; + } } return SPV_SUCCESS; diff --git a/3rdparty/spirv-tools/source/val/validate_constants.cpp b/3rdparty/spirv-tools/source/val/validate_constants.cpp index 5dbe6c6df..eab25ec1c 100644 --- a/3rdparty/spirv-tools/source/val/validate_constants.cpp +++ b/3rdparty/spirv-tools/source/val/validate_constants.cpp @@ -174,8 +174,7 @@ spv_result_t ValidateConstantComposite(ValidationState_t& _, bool is_const; uint32_t value; std::tie(is_int32, is_const, value) = _.EvalInt32IfConst(length->id()); - if (is_int32 && is_const && !spvOpcodeIsSpecConstant(length->opcode()) && - value != constituent_count) { + if (is_int32 && is_const && value != constituent_count) { return _.diag(SPV_ERROR_INVALID_ID, inst) << opcode_name << " Constituent count does not match " @@ -315,6 +314,57 @@ spv_result_t ValidateConstantNull(ValidationState_t& _, return SPV_SUCCESS; } +spv_result_t ValidateSpecConstantOp(ValidationState_t& _, + const Instruction* inst) { + const auto op = inst->GetOperandAs(2); + + // The binary parser already ensures that the op is valid for *some* + // environment. Here we check restrictions. + switch(op) { + case SpvOpQuantizeToF16: + if (!_.HasCapability(SpvCapabilityShader)) { + return _.diag(SPV_ERROR_INVALID_ID, inst) + << "Specialization constant operation " << spvOpcodeString(op) + << " requires Shader capability"; + } + break; + + case SpvOpConvertFToS: + case SpvOpConvertSToF: + case SpvOpConvertFToU: + case SpvOpConvertUToF: + case SpvOpUConvert: + case SpvOpConvertPtrToU: + case SpvOpConvertUToPtr: + case SpvOpGenericCastToPtr: + case SpvOpPtrCastToGeneric: + case SpvOpBitcast: + case SpvOpFNegate: + case SpvOpFAdd: + case SpvOpFSub: + case SpvOpFMul: + case SpvOpFDiv: + case SpvOpFRem: + case SpvOpFMod: + case SpvOpAccessChain: + case SpvOpInBoundsAccessChain: + case SpvOpPtrAccessChain: + case SpvOpInBoundsPtrAccessChain: + if (!_.HasCapability(SpvCapabilityKernel)) { + return _.diag(SPV_ERROR_INVALID_ID, inst) + << "Specialization constant operation " << spvOpcodeString(op) + << " requires Kernel capability"; + } + break; + + default: + break; + } + + // TODO(dneto): Validate result type and arguments to the various operations. + return SPV_SUCCESS; +} + } // namespace spv_result_t ConstantPass(ValidationState_t& _, const Instruction* inst) { @@ -335,6 +385,9 @@ spv_result_t ConstantPass(ValidationState_t& _, const Instruction* inst) { case SpvOpConstantNull: if (auto error = ValidateConstantNull(_, inst)) return error; break; + case SpvOpSpecConstantOp: + if (auto error = ValidateSpecConstantOp(_, inst)) return error; + break; default: break; } diff --git a/3rdparty/spirv-tools/source/val/validate_conversion.cpp b/3rdparty/spirv-tools/source/val/validate_conversion.cpp index 9c6f68c6f..b51eec9a4 100644 --- a/3rdparty/spirv-tools/source/val/validate_conversion.cpp +++ b/3rdparty/spirv-tools/source/val/validate_conversion.cpp @@ -49,6 +49,11 @@ spv_result_t ConversionPass(ValidationState_t& _, const Instruction* inst) { << "Expected input to have the same dimension as Result Type: " << spvOpcodeString(opcode); + if (!_.features().use_int8_type && (8 == _.GetBitWidth(result_type))) + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Invalid cast to 8-bit integer from a floating-point: " + << spvOpcodeString(opcode); + break; } @@ -70,6 +75,11 @@ spv_result_t ConversionPass(ValidationState_t& _, const Instruction* inst) { << "Expected input to have the same dimension as Result Type: " << spvOpcodeString(opcode); + if (!_.features().use_int8_type && (8 == _.GetBitWidth(result_type))) + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Invalid cast to 8-bit integer from a floating-point: " + << spvOpcodeString(opcode); + break; } @@ -93,6 +103,11 @@ spv_result_t ConversionPass(ValidationState_t& _, const Instruction* inst) { << "Expected input to have the same dimension as Result Type: " << spvOpcodeString(opcode); + if (!_.features().use_int8_type && (8 == _.GetBitWidth(input_type))) + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Invalid cast to floating-point from an 8-bit integer: " + << spvOpcodeString(opcode); + break; } @@ -233,7 +248,7 @@ spv_result_t ConversionPass(ValidationState_t& _, const Instruction* inst) { << spvOpcodeString(opcode); const uint32_t input_type = _.GetOperandTypeId(inst, 2); - if (!_.IsIntScalarType(input_type)) + if (!input_type || !_.IsIntScalarType(input_type)) return _.diag(SPV_ERROR_INVALID_DATA, inst) << "Expected int scalar as input: " << spvOpcodeString(opcode); break; diff --git a/3rdparty/spirv-tools/source/val/validate_debug.cpp b/3rdparty/spirv-tools/source/val/validate_debug.cpp index d84ed3801..b49890f26 100644 --- a/3rdparty/spirv-tools/source/val/validate_debug.cpp +++ b/3rdparty/spirv-tools/source/val/validate_debug.cpp @@ -14,6 +14,8 @@ #include "source/val/validate.h" +#include "source/opcode.h" +#include "source/spirv_target_env.h" #include "source/val/instruction.h" #include "source/val/validation_state.h" @@ -54,6 +56,13 @@ spv_result_t ValidateLine(ValidationState_t& _, const Instruction* inst) { } // namespace spv_result_t DebugPass(ValidationState_t& _, const Instruction* inst) { + if (spvIsWebGPUEnv(_.context()->target_env) && + spvOpcodeIsDebug(inst->opcode())) { + return _.diag(SPV_ERROR_INVALID_BINARY, inst) + << "Debugging instructions are not allowed in the WebGPU execution " + << "environment."; + } + switch (inst->opcode()) { case SpvOpMemberName: if (auto error = ValidateMemberName(_, inst)) return error; diff --git a/3rdparty/spirv-tools/source/val/validate_decorations.cpp b/3rdparty/spirv-tools/source/val/validate_decorations.cpp index ed312f73f..582d11cc7 100644 --- a/3rdparty/spirv-tools/source/val/validate_decorations.cpp +++ b/3rdparty/spirv-tools/source/val/validate_decorations.cpp @@ -17,7 +17,9 @@ #include #include #include +#include #include +#include #include #include @@ -44,6 +46,13 @@ struct PairHash { } }; +// A functor for hashing decoration types. +struct SpvDecorationHash { + std::size_t operator()(SpvDecoration dec) const { + return static_cast(dec); + } +}; + // Struct member layout attributes that are inherited through arrays. struct LayoutConstraints { explicit LayoutConstraints( @@ -156,7 +165,8 @@ uint32_t getBaseAlignment(uint32_t member_id, bool roundUp, ValidationState_t& vstate) { const auto inst = vstate.FindDef(member_id); const auto& words = inst->words(); - uint32_t baseAlignment = 0; + // Minimal alignment is byte-aligned. + uint32_t baseAlignment = 1; switch (inst->opcode()) { case SpvOpTypeInt: case SpvOpTypeFloat: @@ -216,23 +226,57 @@ uint32_t getBaseAlignment(uint32_t member_id, bool roundUp, return baseAlignment; } +// Returns scalar alignment of a type. +uint32_t getScalarAlignment(uint32_t type_id, ValidationState_t& vstate) { + const auto inst = vstate.FindDef(type_id); + const auto& words = inst->words(); + switch (inst->opcode()) { + case SpvOpTypeInt: + case SpvOpTypeFloat: + return words[2] / 8; + case SpvOpTypeVector: + case SpvOpTypeMatrix: + case SpvOpTypeArray: + case SpvOpTypeRuntimeArray: { + const auto compositeMemberTypeId = words[2]; + return getScalarAlignment(compositeMemberTypeId, vstate); + } + case SpvOpTypeStruct: { + const auto members = getStructMembers(type_id, vstate); + uint32_t max_member_alignment = 1; + for (uint32_t memberIdx = 0, numMembers = uint32_t(members.size()); + memberIdx < numMembers; ++memberIdx) { + const auto id = members[memberIdx]; + uint32_t member_alignment = getScalarAlignment(id, vstate); + if (member_alignment > max_member_alignment) { + max_member_alignment = member_alignment; + } + } + return max_member_alignment; + } break; + default: + assert(0); + break; + } + + return 1; +} + // Returns size of a struct member. Doesn't include padding at the end of struct // or array. Assumes that in the struct case, all members have offsets. -uint32_t getSize(uint32_t member_id, bool roundUp, - const LayoutConstraints& inherited, +uint32_t getSize(uint32_t member_id, const LayoutConstraints& inherited, MemberConstraints& constraints, ValidationState_t& vstate) { const auto inst = vstate.FindDef(member_id); const auto& words = inst->words(); switch (inst->opcode()) { case SpvOpTypeInt: case SpvOpTypeFloat: - return getBaseAlignment(member_id, roundUp, inherited, constraints, - vstate); + return words[2] / 8; case SpvOpTypeVector: { const auto componentId = words[2]; const auto numComponents = words[3]; const auto componentSize = - getSize(componentId, roundUp, inherited, constraints, vstate); + getSize(componentId, inherited, constraints, vstate); const auto size = componentSize * numComponents; return size; } @@ -243,7 +287,7 @@ uint32_t getSize(uint32_t member_id, bool roundUp, const uint32_t num_elem = sizeInst->words()[3]; const uint32_t elem_type = words[2]; const uint32_t elem_size = - getSize(elem_type, roundUp, inherited, constraints, vstate); + getSize(elem_type, inherited, constraints, vstate); // Account for gaps due to alignments in the first N-1 elements, // then add the size of the last element. const auto size = @@ -263,7 +307,7 @@ uint32_t getSize(uint32_t member_id, bool roundUp, const auto num_rows = component_inst->words()[3]; const auto scalar_elem_type = component_inst->words()[2]; const uint32_t scalar_elem_size = - getSize(scalar_elem_type, roundUp, inherited, constraints, vstate); + getSize(scalar_elem_type, inherited, constraints, vstate); return (num_rows - 1) * inherited.matrix_stride + num_columns * scalar_elem_size; } @@ -285,8 +329,7 @@ uint32_t getSize(uint32_t member_id, bool roundUp, // has been checked earlier in the flow. assert(offset != 0xffffffff); const auto& constraint = constraints[std::make_pair(lastMember, lastIdx)]; - return offset + - getSize(lastMember, roundUp, constraint, constraints, vstate); + return offset + getSize(lastMember, constraint, constraints, vstate); } default: assert(0); @@ -305,7 +348,7 @@ bool hasImproperStraddle(uint32_t id, uint32_t offset, const LayoutConstraints& inherited, MemberConstraints& constraints, ValidationState_t& vstate) { - const auto size = getSize(id, false, inherited, constraints, vstate); + const auto size = getSize(id, inherited, constraints, vstate); const auto F = offset; const auto L = offset + size - 1; if (size <= 16) { @@ -333,19 +376,28 @@ spv_result_t checkLayout(uint32_t struct_id, const char* storage_class_str, ValidationState_t& vstate) { if (vstate.options()->skip_block_layout) return SPV_SUCCESS; + // Relaxed layout and scalar layout can both be in effect at the same time. + // For example, relaxed layout is implied by Vulkan 1.1. But scalar layout + // is more permissive than relaxed layout. + const bool relaxed_block_layout = vstate.IsRelaxedBlockLayout(); + const bool scalar_block_layout = vstate.options()->scalar_block_layout; + auto fail = [&vstate, struct_id, storage_class_str, decoration_str, - blockRules](uint32_t member_idx) -> DiagnosticStream { + blockRules, relaxed_block_layout, + scalar_block_layout](uint32_t member_idx) -> DiagnosticStream { DiagnosticStream ds = std::move(vstate.diag(SPV_ERROR_INVALID_ID, vstate.FindDef(struct_id)) << "Structure id " << struct_id << " decorated as " << decoration_str << " for variable in " << storage_class_str - << " storage class must follow standard " + << " storage class must follow " + << (scalar_block_layout + ? "scalar " + : (relaxed_block_layout ? "relaxed " : "standard ")) << (blockRules ? "uniform buffer" : "storage buffer") << " layout rules: member " << member_idx << " "); return ds; }; - const bool relaxed_block_layout = vstate.IsRelaxedBlockLayout(); const auto& members = getStructMembers(struct_id, vstate); // To check for member overlaps, we want to traverse the members in @@ -388,20 +440,25 @@ spv_result_t checkLayout(uint32_t struct_id, const char* storage_class_str, auto id = members[member_offset.member]; const LayoutConstraints& constraint = constraints[std::make_pair(struct_id, uint32_t(memberIdx))]; + // Scalar layout takes precedence because it's more permissive, and implying + // an alignment that divides evenly into the alignment that would otherwise + // be used. const auto alignment = - getBaseAlignment(id, blockRules, constraint, constraints, vstate); + scalar_block_layout + ? getScalarAlignment(id, vstate) + : getBaseAlignment(id, blockRules, constraint, constraints, vstate); const auto inst = vstate.FindDef(id); const auto opcode = inst->opcode(); - const auto size = getSize(id, blockRules, constraint, constraints, vstate); + const auto size = getSize(id, constraint, constraints, vstate); // Check offset. if (offset == 0xffffffff) return fail(memberIdx) << "is missing an Offset decoration"; - if (relaxed_block_layout && opcode == SpvOpTypeVector) { + if (!scalar_block_layout && relaxed_block_layout && + opcode == SpvOpTypeVector) { // In relaxed block layout, the vector offset must be aligned to the // vector's scalar element type. const auto componentId = inst->words()[2]; - const auto scalar_alignment = getBaseAlignment( - componentId, blockRules, constraint, constraints, vstate); + const auto scalar_alignment = getScalarAlignment(componentId, vstate); if (!IsAlignedTo(offset, scalar_alignment)) { return fail(memberIdx) << "at offset " << offset @@ -409,7 +466,7 @@ spv_result_t checkLayout(uint32_t struct_id, const char* storage_class_str, } } else { // Without relaxed block layout, the offset must be divisible by the - // base alignment. + // alignment requirement. if (!IsAlignedTo(offset, alignment)) { return fail(memberIdx) << "at offset " << offset << " is not aligned to " << alignment; @@ -419,7 +476,7 @@ spv_result_t checkLayout(uint32_t struct_id, const char* storage_class_str, return fail(memberIdx) << "at offset " << offset << " overlaps previous member ending at offset " << nextValidOffset - 1; - if (relaxed_block_layout) { + if (!scalar_block_layout && relaxed_block_layout) { // Check improper straddle of vectors. if (SpvOpTypeVector == opcode && hasImproperStraddle(id, offset, constraint, constraints, vstate)) @@ -443,8 +500,8 @@ spv_result_t checkLayout(uint32_t struct_id, const char* storage_class_str, << " not satisfying alignment to " << alignment; } } - // Check arrays. - if (SpvOpTypeArray == opcode) { + // Check arrays and runtime arrays. + if (SpvOpTypeArray == opcode || SpvOpTypeRuntimeArray == opcode) { const auto typeId = inst->word(2); const auto arrayInst = vstate.FindDef(typeId); if (SpvOpTypeStruct == arrayInst->opcode() && @@ -462,7 +519,8 @@ spv_result_t checkLayout(uint32_t struct_id, const char* storage_class_str, } } nextValidOffset = offset + size; - if (blockRules && (SpvOpTypeArray == opcode || SpvOpTypeStruct == opcode)) { + if (!scalar_block_layout && blockRules && + (SpvOpTypeArray == opcode || SpvOpTypeStruct == opcode)) { // Uniform block rules don't permit anything in the padding of a struct // or array. nextValidOffset = align(nextValidOffset, alignment); @@ -471,15 +529,18 @@ spv_result_t checkLayout(uint32_t struct_id, const char* storage_class_str, return SPV_SUCCESS; } -// Returns true if structure id has given decoration. Handles also nested -// structures. -bool hasDecoration(uint32_t struct_id, SpvDecoration decoration, +// Returns true if variable or structure id has given decoration. Handles also +// nested structures. +bool hasDecoration(uint32_t id, SpvDecoration decoration, ValidationState_t& vstate) { - for (auto& dec : vstate.id_decorations(struct_id)) { + for (auto& dec : vstate.id_decorations(id)) { if (decoration == dec.dec_type()) return true; } - for (auto id : getStructMembers(struct_id, SpvOpTypeStruct, vstate)) { - if (hasDecoration(id, decoration, vstate)) { + if (SpvOpTypeStruct != vstate.FindDef(id)->opcode()) { + return false; + } + for (auto member_id : getStructMembers(id, SpvOpTypeStruct, vstate)) { + if (hasDecoration(member_id, decoration, vstate)) { return true; } } @@ -647,42 +708,6 @@ spv_result_t CheckDecorationsOfEntryPoints(ValidationState_t& vstate) { return SPV_SUCCESS; } -spv_result_t CheckDescriptorSetArrayOfArrays(ValidationState_t& vstate) { - for (const auto& inst : vstate.ordered_instructions()) { - if (SpvOpVariable != inst.opcode()) continue; - - // Verify this variable is a DescriptorSet - bool has_descriptor_set = false; - for (const auto& decoration : vstate.id_decorations(inst.id())) { - if (SpvDecorationDescriptorSet == decoration.dec_type()) { - has_descriptor_set = true; - break; - } - } - if (!has_descriptor_set) continue; - - const auto* ptrInst = vstate.FindDef(inst.word(1)); - assert(SpvOpTypePointer == ptrInst->opcode()); - - // Check for a first level array - const auto typePtr = vstate.FindDef(ptrInst->word(3)); - if (SpvOpTypeRuntimeArray != typePtr->opcode() && - SpvOpTypeArray != typePtr->opcode()) { - continue; - } - - // Check for a second level array - const auto secondaryTypePtr = vstate.FindDef(typePtr->word(2)); - if (SpvOpTypeRuntimeArray == secondaryTypePtr->opcode() || - SpvOpTypeArray == secondaryTypePtr->opcode()) { - return vstate.diag(SPV_ERROR_INVALID_ID, &inst) - << "Only a single level of array is allowed for descriptor " - "set variables"; - } - } - return SPV_SUCCESS; -} - // Load |constraints| with all the member constraints for structs contained // within the given array type. void ComputeMemberConstraintsForArray(MemberConstraints* constraints, @@ -765,15 +790,63 @@ void ComputeMemberConstraintsForArray(MemberConstraints* constraints, } spv_result_t CheckDecorationsOfBuffers(ValidationState_t& vstate) { + // Set of entry points that are known to use a push constant. + std::unordered_set uses_push_constant; for (const auto& inst : vstate.ordered_instructions()) { const auto& words = inst.words(); if (SpvOpVariable == inst.opcode()) { + const auto var_id = inst.id(); // For storage class / decoration combinations, see Vulkan 14.5.4 "Offset // and Stride Assignment". const auto storageClass = words[3]; const bool uniform = storageClass == SpvStorageClassUniform; + const bool uniform_constant = + storageClass == SpvStorageClassUniformConstant; const bool push_constant = storageClass == SpvStorageClassPushConstant; const bool storage_buffer = storageClass == SpvStorageClassStorageBuffer; + + if (spvIsVulkanEnv(vstate.context()->target_env)) { + // Vulkan 14.5.1: There must be no more than one PushConstant block + // per entry point. + if (push_constant) { + auto entry_points = vstate.EntryPointReferences(var_id); + for (auto ep_id : entry_points) { + const bool already_used = !uses_push_constant.insert(ep_id).second; + if (already_used) { + return vstate.diag(SPV_ERROR_INVALID_ID, vstate.FindDef(var_id)) + << "Entry point id '" << ep_id + << "' uses more than one PushConstant interface.\n" + << "From Vulkan spec, section 14.5.1:\n" + << "There must be no more than one push constant block " + << "statically used per shader entry point."; + } + } + } + // Vulkan 14.5.2: Check DescriptorSet and Binding decoration for + // UniformConstant which cannot be a struct. + if (uniform_constant) { + auto entry_points = vstate.EntryPointReferences(var_id); + if (!entry_points.empty() && + !hasDecoration(var_id, SpvDecorationDescriptorSet, vstate)) { + return vstate.diag(SPV_ERROR_INVALID_ID, vstate.FindDef(var_id)) + << "UniformConstant id '" << var_id + << "' is missing DescriptorSet decoration.\n" + << "From Vulkan spec, section 14.5.2:\n" + << "These variables must have DescriptorSet and Binding " + "decorations specified"; + } + if (!entry_points.empty() && + !hasDecoration(var_id, SpvDecorationBinding, vstate)) { + return vstate.diag(SPV_ERROR_INVALID_ID, vstate.FindDef(var_id)) + << "UniformConstant id '" << var_id + << "' is missing Binding decoration.\n" + << "From Vulkan spec, section 14.5.2:\n" + << "These variables must have DescriptorSet and Binding " + "decorations specified"; + } + } + } + if (uniform || push_constant || storage_buffer) { const auto ptrInst = vstate.FindDef(words[1]); assert(SpvOpTypePointer == ptrInst->opcode()); @@ -786,6 +859,42 @@ spv_result_t CheckDecorationsOfBuffers(ValidationState_t& vstate) { const char* sc_str = uniform ? "Uniform" : (push_constant ? "PushConstant" : "StorageBuffer"); + + if (spvIsVulkanEnv(vstate.context()->target_env)) { + // Vulkan 14.5.1: Check Block decoration for PushConstant variables. + if (push_constant && !hasDecoration(id, SpvDecorationBlock, vstate)) { + return vstate.diag(SPV_ERROR_INVALID_ID, vstate.FindDef(id)) + << "PushConstant id '" << id + << "' is missing Block decoration.\n" + << "From Vulkan spec, section 14.5.1:\n" + << "Such variables must be identified with a Block " + "decoration"; + } + // Vulkan 14.5.2: Check DescriptorSet and Binding decoration for + // Uniform and StorageBuffer variables. + if (uniform || storage_buffer) { + auto entry_points = vstate.EntryPointReferences(var_id); + if (!entry_points.empty() && + !hasDecoration(var_id, SpvDecorationDescriptorSet, vstate)) { + return vstate.diag(SPV_ERROR_INVALID_ID, vstate.FindDef(var_id)) + << sc_str << " id '" << var_id + << "' is missing DescriptorSet decoration.\n" + << "From Vulkan spec, section 14.5.2:\n" + << "These variables must have DescriptorSet and Binding " + "decorations specified"; + } + if (!entry_points.empty() && + !hasDecoration(var_id, SpvDecorationBinding, vstate)) { + return vstate.diag(SPV_ERROR_INVALID_ID, vstate.FindDef(var_id)) + << sc_str << " id '" << var_id + << "' is missing Binding decoration.\n" + << "From Vulkan spec, section 14.5.2:\n" + << "These variables must have DescriptorSet and Binding " + "decorations specified"; + } + } + } + for (const auto& dec : vstate.id_decorations(id)) { const bool blockDeco = SpvDecorationBlock == dec.dec_type(); const bool bufferDeco = SpvDecorationBufferBlock == dec.dec_type(); @@ -799,7 +908,8 @@ spv_result_t CheckDecorationsOfBuffers(ValidationState_t& vstate) { if (isMissingOffsetInStruct(id, vstate)) { return vstate.diag(SPV_ERROR_INVALID_ID, vstate.FindDef(id)) << "Structure id " << id << " decorated as " << deco_str - << " must be explicitly laid out with Offset decorations."; + << " must be explicitly laid out with Offset " + "decorations."; } else if (hasDecoration(id, SpvDecorationGLSLShared, vstate)) { return vstate.diag(SPV_ERROR_INVALID_ID, vstate.FindDef(id)) << "Structure id " << id << " decorated as " << deco_str @@ -840,15 +950,281 @@ spv_result_t CheckDecorationsOfBuffers(ValidationState_t& vstate) { return SPV_SUCCESS; } +spv_result_t CheckDecorationsCompatibility(ValidationState_t& vstate) { + using AtMostOnceSet = std::unordered_set; + using MutuallyExclusiveSets = + std::vector>; + using PerIDKey = std::tuple; + using PerMemberKey = std::tuple; + using DecorationNameTable = + std::unordered_map; + + static const auto* const at_most_once_per_id = new AtMostOnceSet{ + SpvDecorationArrayStride, + }; + static const auto* const at_most_once_per_member = new AtMostOnceSet{ + SpvDecorationOffset, + SpvDecorationMatrixStride, + SpvDecorationRowMajor, + SpvDecorationColMajor, + }; + static const auto* const mutually_exclusive_per_id = + new MutuallyExclusiveSets{ + {SpvDecorationBlock, SpvDecorationBufferBlock}, + }; + static const auto* const mutually_exclusive_per_member = + new MutuallyExclusiveSets{ + {SpvDecorationRowMajor, SpvDecorationColMajor}, + }; + // For printing the decoration name. + static const auto* const decoration_name = new DecorationNameTable{ + {SpvDecorationArrayStride, "ArrayStride"}, + {SpvDecorationOffset, "Offset"}, + {SpvDecorationMatrixStride, "MatrixStride"}, + {SpvDecorationRowMajor, "RowMajor"}, + {SpvDecorationColMajor, "ColMajor"}, + {SpvDecorationBlock, "Block"}, + {SpvDecorationBufferBlock, "BufferBlock"}, + }; + + std::set seen_per_id; + std::set seen_per_member; + + for (const auto& inst : vstate.ordered_instructions()) { + const auto& words = inst.words(); + if (SpvOpDecorate == inst.opcode()) { + const auto id = words[1]; + const auto dec_type = static_cast(words[2]); + const auto k = PerIDKey(dec_type, id); + const auto already_used = !seen_per_id.insert(k).second; + if (already_used && + at_most_once_per_id->find(dec_type) != at_most_once_per_id->end()) { + return vstate.diag(SPV_ERROR_INVALID_ID, vstate.FindDef(id)) + << "ID '" << id << "' decorated with " + << decoration_name->at(dec_type) + << " multiple times is not allowed."; + } + // Verify certain mutually exclusive decorations are not both applied on + // an ID. + for (const auto& s : *mutually_exclusive_per_id) { + if (s.find(dec_type) == s.end()) continue; + for (auto excl_dec_type : s) { + if (excl_dec_type == dec_type) continue; + const auto excl_k = PerIDKey(excl_dec_type, id); + if (seen_per_id.find(excl_k) != seen_per_id.end()) { + return vstate.diag(SPV_ERROR_INVALID_ID, vstate.FindDef(id)) + << "ID '" << id << "' decorated with both " + << decoration_name->at(dec_type) << " and " + << decoration_name->at(excl_dec_type) << " is not allowed."; + } + } + } + } else if (SpvOpMemberDecorate == inst.opcode()) { + const auto id = words[1]; + const auto member_id = words[2]; + const auto dec_type = static_cast(words[3]); + const auto k = PerMemberKey(dec_type, id, member_id); + const auto already_used = !seen_per_member.insert(k).second; + if (already_used && at_most_once_per_member->find(dec_type) != + at_most_once_per_member->end()) { + return vstate.diag(SPV_ERROR_INVALID_ID, vstate.FindDef(id)) + << "ID '" << id << "', member '" << member_id + << "' decorated with " << decoration_name->at(dec_type) + << " multiple times is not allowed."; + } + // Verify certain mutually exclusive decorations are not both applied on + // a (ID, member) tuple. + for (const auto& s : *mutually_exclusive_per_member) { + if (s.find(dec_type) == s.end()) continue; + for (auto excl_dec_type : s) { + if (excl_dec_type == dec_type) continue; + const auto excl_k = PerMemberKey(excl_dec_type, id, member_id); + if (seen_per_member.find(excl_k) != seen_per_member.end()) { + return vstate.diag(SPV_ERROR_INVALID_ID, vstate.FindDef(id)) + << "ID '" << id << "', member '" << member_id + << "' decorated with both " << decoration_name->at(dec_type) + << " and " << decoration_name->at(excl_dec_type) + << " is not allowed."; + } + } + } + } + } + return SPV_SUCCESS; +} + +spv_result_t CheckVulkanMemoryModelDeprecatedDecorations( + ValidationState_t& vstate) { + if (vstate.memory_model() != SpvMemoryModelVulkanKHR) return SPV_SUCCESS; + + std::string msg; + std::ostringstream str(msg); + for (const auto& def : vstate.all_definitions()) { + const auto inst = def.second; + const auto id = inst->id(); + for (const auto& dec : vstate.id_decorations(id)) { + const auto member = dec.struct_member_index(); + if (dec.dec_type() == SpvDecorationCoherent || + dec.dec_type() == SpvDecorationVolatile) { + str << (dec.dec_type() == SpvDecorationCoherent ? "Coherent" + : "Volatile"); + str << " decoration targeting " << vstate.getIdName(id); + if (member != Decoration::kInvalidMember) { + str << " (member index " << member << ")"; + } + str << " is banned when using the Vulkan memory model."; + return vstate.diag(SPV_ERROR_INVALID_ID, inst) << str.str(); + } + } + } + return SPV_SUCCESS; +} + +// Returns SPV_SUCCESS if validation rules are satisfied for FPRoundingMode +// decorations. Otherwise emits a diagnostic and returns something other than +// SPV_SUCCESS. +spv_result_t CheckFPRoundingModeForShaders(ValidationState_t& vstate, + const Instruction& inst) { + // Validates width-only conversion instruction for floating-point object + // i.e., OpFConvert + if (inst.opcode() != SpvOpFConvert) { + return vstate.diag(SPV_ERROR_INVALID_ID, &inst) + << "FPRoundingMode decoration can be applied only to a " + "width-only conversion instruction for floating-point " + "object."; + } + + // Validates Object operand of an OpStore + for (const auto& use : inst.uses()) { + const auto store = use.first; + if (store->opcode() != SpvOpStore) { + return vstate.diag(SPV_ERROR_INVALID_ID, &inst) + << "FPRoundingMode decoration can be applied only to the " + "Object operand of an OpStore."; + } + + if (use.second != 2) { + return vstate.diag(SPV_ERROR_INVALID_ID, &inst) + << "FPRoundingMode decoration can be applied only to the " + "Object operand of an OpStore."; + } + + const auto ptr_inst = vstate.FindDef(store->GetOperandAs(0)); + const auto ptr_type = vstate.FindDef(ptr_inst->GetOperandAs(0)); + + const auto half_float_id = ptr_type->GetOperandAs(2); + if (!vstate.IsFloatScalarOrVectorType(half_float_id) || + vstate.GetBitWidth(half_float_id) != 16) { + return vstate.diag(SPV_ERROR_INVALID_ID, &inst) + << "FPRoundingMode decoration can be applied only to the " + "Object operand of an OpStore storing through a pointer " + "to " + "a 16-bit floating-point scalar or vector object."; + } + + // Validates storage class of the pointer to the OpStore + const auto storage = ptr_type->GetOperandAs(1); + if (storage != SpvStorageClassStorageBuffer && + storage != SpvStorageClassUniform && + storage != SpvStorageClassPushConstant && + storage != SpvStorageClassInput && storage != SpvStorageClassOutput) { + return vstate.diag(SPV_ERROR_INVALID_ID, &inst) + << "FPRoundingMode decoration can be applied only to the " + "Object operand of an OpStore in the StorageBuffer, " + "Uniform, PushConstant, Input, or Output Storage " + "Classes."; + } + } + return SPV_SUCCESS; +} + +// Returns SPV_SUCCESS if validation rules are satisfied for Uniform +// decorations. Otherwise emits a diagnostic and returns something other than +// SPV_SUCCESS. Assumes each decoration on a group has been propagated down to +// the group members. +spv_result_t CheckUniformDecoration(ValidationState_t& vstate, + const Instruction& inst, + const Decoration&) { + // Uniform must decorate an "object" + // - has a result ID + // - is an instantiation of a non-void type. So it has a type ID, and that + // type is not void. + + // We already know the result ID is non-zero. + + if (inst.type_id() == 0) { + return vstate.diag(SPV_ERROR_INVALID_ID, &inst) + << "Uniform decoration applied to a non-object"; + } + if (Instruction* type_inst = vstate.FindDef(inst.type_id())) { + if (type_inst->opcode() == SpvOpTypeVoid) { + return vstate.diag(SPV_ERROR_INVALID_ID, &inst) + << "Uniform decoration applied to a value with void type"; + } + } else { + // We might never get here because this would have been rejected earlier in + // the flow. + return vstate.diag(SPV_ERROR_INVALID_ID, &inst) + << "Uniform decoration applied to an object with invalid type"; + } + return SPV_SUCCESS; +} + +#define PASS_OR_BAIL_AT_LINE(X, LINE) \ + { \ + spv_result_t e##LINE = (X); \ + if (e##LINE != SPV_SUCCESS) return e##LINE; \ + } +#define PASS_OR_BAIL(X) PASS_OR_BAIL_AT_LINE(X, __LINE__) + +// Check rules for decorations where we start from the decoration rather +// than the decorated object. Assumes each decoration on a group have been +// propagated down to the group members. +spv_result_t CheckDecorationsFromDecoration(ValidationState_t& vstate) { + // Some rules are only checked for shaders. + const bool is_shader = vstate.HasCapability(SpvCapabilityShader); + + for (const auto& kv : vstate.id_decorations()) { + const uint32_t id = kv.first; + const auto& decorations = kv.second; + if (decorations.empty()) continue; + + const Instruction* inst = vstate.FindDef(id); + assert(inst); + + // We assume the decorations applied to a decoration group have already + // been propagated down to the group members. + if (inst->opcode() == SpvOpDecorationGroup) continue; + + // Validates FPRoundingMode decoration + for (const auto& decoration : decorations) { + switch (decoration.dec_type()) { + case SpvDecorationFPRoundingMode: + if (is_shader) + PASS_OR_BAIL(CheckFPRoundingModeForShaders(vstate, *inst)); + break; + case SpvDecorationUniform: + PASS_OR_BAIL(CheckUniformDecoration(vstate, *inst, decoration)); + break; + default: + break; + } + } + } + return SPV_SUCCESS; +} + } // namespace -// Validates that decorations have been applied properly. spv_result_t ValidateDecorations(ValidationState_t& vstate) { if (auto error = CheckImportedVariableInitialization(vstate)) return error; if (auto error = CheckDecorationsOfEntryPoints(vstate)) return error; if (auto error = CheckDecorationsOfBuffers(vstate)) return error; + if (auto error = CheckDecorationsCompatibility(vstate)) return error; if (auto error = CheckLinkageAttrOfFunctions(vstate)) return error; - if (auto error = CheckDescriptorSetArrayOfArrays(vstate)) return error; + if (auto error = CheckVulkanMemoryModelDeprecatedDecorations(vstate)) + return error; + if (auto error = CheckDecorationsFromDecoration(vstate)) return error; return SPV_SUCCESS; } diff --git a/3rdparty/spirv-tools/source/val/validate_derivatives.cpp b/3rdparty/spirv-tools/source/val/validate_derivatives.cpp index 0e0dbbe3d..718970769 100644 --- a/3rdparty/spirv-tools/source/val/validate_derivatives.cpp +++ b/3rdparty/spirv-tools/source/val/validate_derivatives.cpp @@ -54,12 +54,36 @@ spv_result_t DerivativesPass(ValidationState_t& _, const Instruction* inst) { << spvOpcodeString(opcode); } - _.function(inst->function()->id()) - ->RegisterExecutionModelLimitation( - SpvExecutionModelFragment, - std::string("Derivative instructions require Fragment execution " + const spvtools::Extension compute_shader_derivatives_extension = + kSPV_NV_compute_shader_derivatives; + ExtensionSet exts(1, &compute_shader_derivatives_extension); + + if (_.HasAnyOfExtensions(exts)) { + _.function(inst->function()->id()) + ->RegisterExecutionModelLimitation([opcode](SpvExecutionModel model, + std::string* message) { + if (model != SpvExecutionModelFragment && + model != SpvExecutionModelGLCompute) { + if (message) { + *message = + std::string( + "Derivative instructions require Fragment execution " "model: ") + - spvOpcodeString(opcode)); + spvOpcodeString(opcode); + } + return false; + } + return true; + }); + } else { + _.function(inst->function()->id()) + ->RegisterExecutionModelLimitation( + SpvExecutionModelFragment, + std::string( + "Derivative instructions require Fragment execution " + "model: ") + + spvOpcodeString(opcode)); + } break; } diff --git a/3rdparty/spirv-tools/source/val/validate_ext_inst.cpp b/3rdparty/spirv-tools/source/val/validate_extensions.cpp similarity index 97% rename from 3rdparty/spirv-tools/source/val/validate_ext_inst.cpp rename to 3rdparty/spirv-tools/source/val/validate_extensions.cpp index eb3427090..f264c8e76 100644 --- a/3rdparty/spirv-tools/source/val/validate_ext_inst.cpp +++ b/3rdparty/spirv-tools/source/val/validate_extensions.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Google Inc. +// Copyright (c) 2018 Google Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -// Validates correctness of ExtInst SPIR-V instructions. +// Validates correctness of extension SPIR-V instructions. #include "source/val/validate.h" @@ -21,9 +21,12 @@ #include #include "source/diagnostic.h" +#include "source/enum_string_mapping.h" +#include "source/extensions.h" #include "source/latest_version_glsl_std_450_header.h" #include "source/latest_version_opencl_std_header.h" #include "source/opcode.h" +#include "source/spirv_target_env.h" #include "source/val/instruction.h" #include "source/val/validation_state.h" @@ -41,14 +44,41 @@ uint32_t GetSizeTBitWidth(const ValidationState_t& _) { } // anonymous namespace -// Validates correctness of ExtInst instructions. -spv_result_t ExtInstPass(ValidationState_t& _, const Instruction* inst) { - const SpvOp opcode = inst->opcode(); +spv_result_t ValidateExtension(ValidationState_t& _, const Instruction* inst) { + if (spvIsWebGPUEnv(_.context()->target_env)) { + std::string extension = GetExtensionString(&(inst->c_inst())); + + if (extension != ExtensionToString(kSPV_KHR_vulkan_memory_model)) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "For WebGPU, the only valid parameter to OpExtension is " + << "\"" << ExtensionToString(kSPV_KHR_vulkan_memory_model) + << "\"."; + } + } + + return SPV_SUCCESS; +} + +spv_result_t ValidateExtInstImport(ValidationState_t& _, + const Instruction* inst) { + if (spvIsWebGPUEnv(_.context()->target_env)) { + const auto name_id = 1; + const std::string name(reinterpret_cast( + inst->words().data() + inst->operands()[name_id].offset)); + if (name != "GLSL.std.450") { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "For WebGPU, the only valid parameter to OpExtInstImport is " + "\"GLSL.std.450\"."; + } + } + + return SPV_SUCCESS; +} + +spv_result_t ValidateExtInst(ValidationState_t& _, const Instruction* inst) { const uint32_t result_type = inst->type_id(); const uint32_t num_operands = static_cast(inst->operands().size()); - if (opcode != SpvOpExtInst) return SPV_SUCCESS; - const uint32_t ext_inst_set = inst->word(3); const uint32_t ext_inst_index = inst->word(4); const spv_ext_inst_type_t ext_inst_type = @@ -1986,5 +2016,14 @@ spv_result_t ExtInstPass(ValidationState_t& _, const Instruction* inst) { return SPV_SUCCESS; } +spv_result_t ExtensionPass(ValidationState_t& _, const Instruction* inst) { + const SpvOp opcode = inst->opcode(); + if (opcode == SpvOpExtension) return ValidateExtension(_, inst); + if (opcode == SpvOpExtInstImport) return ValidateExtInstImport(_, inst); + if (opcode == SpvOpExtInst) return ValidateExtInst(_, inst); + + return SPV_SUCCESS; +} + } // namespace val } // namespace spvtools diff --git a/3rdparty/spirv-tools/source/val/validate_id.cpp b/3rdparty/spirv-tools/source/val/validate_id.cpp index 6359ab600..21a04113d 100644 --- a/3rdparty/spirv-tools/source/val/validate_id.cpp +++ b/3rdparty/spirv-tools/source/val/validate_id.cpp @@ -58,14 +58,13 @@ spv_result_t UpdateIdUse(ValidationState_t& _, const Instruction* inst) { /// /// NOTE: This function does NOT check module scoped functions which are /// checked during the initial binary parse in the IdPass below -spv_result_t CheckIdDefinitionDominateUse(const ValidationState_t& _) { +spv_result_t CheckIdDefinitionDominateUse(ValidationState_t& _) { std::vector phi_instructions; std::unordered_set phi_ids; for (const auto& inst : _.ordered_instructions()) { if (inst.id() == 0) continue; if (const Function* func = inst.function()) { if (const BasicBlock* block = inst.block()) { - if (!block->reachable()) continue; // If the Id is defined within a block then make sure all references to // that Id appear in a blocks that are dominated by the defining block for (auto& use_index_pair : inst.uses()) { @@ -164,8 +163,27 @@ spv_result_t IdPass(ValidationState_t& _, Instruction* inst) { case SPV_OPERAND_TYPE_ID: case SPV_OPERAND_TYPE_MEMORY_SEMANTICS_ID: case SPV_OPERAND_TYPE_SCOPE_ID: - if (_.IsDefinedId(operand_word)) { - ret = SPV_SUCCESS; + if (const auto def = _.FindDef(operand_word)) { + const auto opcode = inst->opcode(); + if (spvOpcodeGeneratesType(def->opcode()) && + !spvOpcodeGeneratesType(opcode) && !spvOpcodeIsDebug(opcode) && + !spvOpcodeIsDecoration(opcode) && opcode != SpvOpFunction) { + return _.diag(SPV_ERROR_INVALID_ID, inst) + << "Operand " << _.getIdName(operand_word) + << " cannot be a type"; + } else if (def->type_id() == 0 && !spvOpcodeGeneratesType(opcode) && + !spvOpcodeIsDebug(opcode) && + !spvOpcodeIsDecoration(opcode) && + !spvOpcodeIsBranch(opcode) && opcode != SpvOpPhi && + opcode != SpvOpExtInst && opcode != SpvOpExtInstImport && + opcode != SpvOpSelectionMerge && + opcode != SpvOpLoopMerge && opcode != SpvOpFunction) { + return _.diag(SPV_ERROR_INVALID_ID, inst) + << "Operand " << _.getIdName(operand_word) + << " requires a type"; + } else { + ret = SPV_SUCCESS; + } } else if (can_have_forward_declared_ids(i)) { ret = _.ForwardDeclareId(operand_word); } else { diff --git a/3rdparty/spirv-tools/source/val/validate_image.cpp b/3rdparty/spirv-tools/source/val/validate_image.cpp index 2c020ed1b..8a357ff34 100644 --- a/3rdparty/spirv-tools/source/val/validate_image.cpp +++ b/3rdparty/spirv-tools/source/val/validate_image.cpp @@ -23,6 +23,7 @@ #include "source/spirv_target_env.h" #include "source/util/bitutils.h" #include "source/val/instruction.h" +#include "source/val/validate_scopes.h" #include "source/val/validation_state.h" namespace spvtools { @@ -55,6 +56,13 @@ bool CheckAllImageOperandsHandled() { case SpvImageOperandsConstOffsetsMask: case SpvImageOperandsSampleMask: case SpvImageOperandsMinLodMask: + + // TODO(dneto): Support image operands related to the Vulkan memory model. + // https://gitlab.khronos.org/spirv/spirv-tools/issues/32 + case SpvImageOperandsMakeTexelAvailableKHRMask: + case SpvImageOperandsMakeTexelVisibleKHRMask: + case SpvImageOperandsNonPrivateTexelKHRMask: + case SpvImageOperandsVolatileTexelKHRMask: return true; } return false; @@ -210,7 +218,12 @@ spv_result_t ValidateImageOperands(ValidationState_t& _, const SpvOp opcode = inst->opcode(); const size_t num_words = inst->words().size(); - size_t expected_num_image_operand_words = spvtools::utils::CountSetBits(mask); + // NonPrivate and Volatile take no operand words. + const uint32_t mask_bits_having_operands = + mask & ~uint32_t(SpvImageOperandsNonPrivateTexelKHRMask | + SpvImageOperandsVolatileTexelKHRMask); + size_t expected_num_image_operand_words = + spvtools::utils::CountSetBits(mask_bits_having_operands); if (mask & SpvImageOperandsGradMask) { // Grad uses two words. ++expected_num_image_operand_words; @@ -486,6 +499,48 @@ spv_result_t ValidateImageOperands(ValidationState_t& _, } } + if (mask & SpvImageOperandsMakeTexelAvailableKHRMask) { + // Checked elsewhere: capability and memory model are correct. + if (opcode != SpvOpImageWrite) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Image Operand MakeTexelAvailableKHR can only be used with Op" + << spvOpcodeString(SpvOpImageWrite) << ": Op" + << spvOpcodeString(opcode); + } + + if (!(mask & SpvImageOperandsNonPrivateTexelKHRMask)) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Image Operand MakeTexelAvailableKHR requires " + "NonPrivateTexelKHR is also specified: Op" + << spvOpcodeString(opcode); + } + + const auto available_scope = inst->word(word_index++); + if (auto error = ValidateMemoryScope(_, inst, available_scope)) + return error; + } + + if (mask & SpvImageOperandsMakeTexelVisibleKHRMask) { + // Checked elsewhere: capability and memory model are correct. + if (opcode != SpvOpImageRead && opcode != SpvOpImageSparseRead) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Image Operand MakeTexelVisibleKHR can only be used with Op" + << spvOpcodeString(SpvOpImageRead) << " or Op" + << spvOpcodeString(SpvOpImageSparseRead) << ": Op" + << spvOpcodeString(opcode); + } + + if (!(mask & SpvImageOperandsNonPrivateTexelKHRMask)) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Image Operand MakeTexelVisibleKHR requires NonPrivateTexelKHR " + "is also specified: Op" + << spvOpcodeString(opcode); + } + + const auto visible_scope = inst->word(word_index++); + if (auto error = ValidateMemoryScope(_, inst, visible_scope)) return error; + } + return SPV_SUCCESS; } @@ -781,6 +836,110 @@ spv_result_t ValidateSampledImage(ValidationState_t& _, return SPV_SUCCESS; } +spv_result_t ValidateImageTexelPointer(ValidationState_t& _, + const Instruction* inst) { + const auto result_type = _.FindDef(inst->type_id()); + if (result_type->opcode() != SpvOpTypePointer) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Expected Result Type to be OpTypePointer"; + } + + const auto storage_class = result_type->GetOperandAs(1); + if (storage_class != SpvStorageClassImage) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Expected Result Type to be OpTypePointer whose Storage Class " + "operand is Image"; + } + + const auto ptr_type = result_type->GetOperandAs(2); + const auto ptr_opcode = _.GetIdOpcode(ptr_type); + if (ptr_opcode != SpvOpTypeInt && ptr_opcode != SpvOpTypeFloat && + ptr_opcode != SpvOpTypeVoid) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Expected Result Type to be OpTypePointer whose Type operand " + "must be a scalar numerical type or OpTypeVoid"; + } + + const auto image_ptr = _.FindDef(_.GetOperandTypeId(inst, 2)); + if (!image_ptr || image_ptr->opcode() != SpvOpTypePointer) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Expected Image to be OpTypePointer"; + } + + const auto image_type = image_ptr->GetOperandAs(2); + if (_.GetIdOpcode(image_type) != SpvOpTypeImage) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Expected Image to be OpTypePointer with Type OpTypeImage"; + } + + ImageTypeInfo info; + if (!GetImageTypeInfo(_, image_type, &info)) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Corrupt image type definition"; + } + + if (info.sampled_type != ptr_type) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Expected Image 'Sampled Type' to be the same as the Type " + "pointed to by Result Type"; + } + + if (info.dim == SpvDimSubpassData) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Image Dim SubpassData cannot be used with OpImageTexelPointer"; + } + + const uint32_t coord_type = _.GetOperandTypeId(inst, 3); + if (!coord_type || !_.IsIntScalarOrVectorType(coord_type)) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Expected Coordinate to be integer scalar or vector"; + } + + uint32_t expected_coord_size = 0; + if (info.arrayed == 0) { + expected_coord_size = GetPlaneCoordSize(info); + } else if (info.arrayed == 1) { + switch (info.dim) { + case SpvDim1D: + expected_coord_size = 2; + break; + case SpvDimCube: + case SpvDim2D: + expected_coord_size = 3; + break; + default: + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Expected Image 'Dim' must be one of 1D, 2D, or Cube when " + "Arrayed is 1"; + break; + } + } + + const uint32_t actual_coord_size = _.GetDimension(coord_type); + if (expected_coord_size != actual_coord_size) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Expected Coordinate to have " << expected_coord_size + << " components, but given " << actual_coord_size; + } + + const uint32_t sample_type = _.GetOperandTypeId(inst, 4); + if (!sample_type || !_.IsIntScalarType(sample_type)) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Expected Sample to be integer scalar"; + } + + if (info.multisampled == 0) { + uint64_t ms = 0; + if (!_.GetConstantValUint64(inst->GetOperandAs(4), &ms) || + ms != 0) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Expected Sample for Image with MS 0 to be a valid for " + "the value 0"; + } + } + return SPV_SUCCESS; +} + spv_result_t ValidateImageLod(ValidationState_t& _, const Instruction* inst) { const SpvOp opcode = inst->opcode(); uint32_t actual_result_type = 0; @@ -1358,57 +1517,45 @@ spv_result_t ValidateImageQuerySize(ValidationState_t& _, << "Expected Image to be of type OpTypeImage"; } -#if 0 - // TODO(atgoo@github.com) The spec doesn't whitelist all Dims supported by - // GLSL. Need to verify if there is an error and reenable. ImageTypeInfo info; if (!GetImageTypeInfo(_, image_type, &info)) { return _.diag(SPV_ERROR_INVALID_DATA, inst) - << "Corrupt image type definition"; + << "Corrupt image type definition"; } uint32_t expected_num_components = info.arrayed; switch (info.dim) { + case SpvDim1D: case SpvDimBuffer: expected_num_components += 1; break; case SpvDim2D: - if (info.multisampled != 1 && info.sampled != 0 && - info.sampled != 2) { - return _.diag(SPV_ERROR_INVALID_DATA, inst) - << "Expected either 'MS'=1 or 'Sampled'=0 or 'Sampled'=2 " - << "for 2D dim"; - } + case SpvDimCube: case SpvDimRect: expected_num_components += 2; break; case SpvDim3D: expected_num_components += 3; - if (info.sampled != 0 && - info.sampled != 2) { - return _.diag(SPV_ERROR_INVALID_DATA, inst) - << "Expected either 'Sampled'=0 or 'Sampled'=2 " - << "for 3D dim"; - } break; default: return _.diag(SPV_ERROR_INVALID_DATA, inst) - << "Image 'Dim' must be Buffer, 2D, 3D or Rect"; + << "Image 'Dim' must be 1D, Buffer, 2D, Cube, 3D or Rect"; } - - if (info.multisampled != 0) { - return _.diag(SPV_ERROR_INVALID_DATA, inst) - << "Image 'MS' must be 0"; + if (info.dim == SpvDim1D || info.dim == SpvDim2D || info.dim == SpvDim3D || + info.dim == SpvDimCube) { + if (info.multisampled != 1 && info.sampled != 0 && info.sampled != 2) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Image must have either 'MS'=1 or 'Sampled'=0 or 'Sampled'=2"; + } } uint32_t result_num_components = _.GetDimension(result_type); if (result_num_components != expected_num_components) { return _.diag(SPV_ERROR_INVALID_DATA, inst) - << "Result Type has " << result_num_components << " components, " - << "but " << expected_num_components << " expected"; + << "Result Type has " << result_num_components << " components, " + << "but " << expected_num_components << " expected"; } -#endif return SPV_SUCCESS; } @@ -1568,6 +1715,8 @@ spv_result_t ImagePass(ValidationState_t& _, const Instruction* inst) { return ValidateTypeSampledImage(_, inst); case SpvOpSampledImage: return ValidateSampledImage(_, inst); + case SpvOpImageTexelPointer: + return ValidateImageTexelPointer(_, inst); case SpvOpImageSampleImplicitLod: case SpvOpImageSampleExplicitLod: diff --git a/3rdparty/spirv-tools/source/val/validate_instruction.cpp b/3rdparty/spirv-tools/source/val/validate_instruction.cpp index 85995caa3..17949d22a 100644 --- a/3rdparty/spirv-tools/source/val/validate_instruction.cpp +++ b/3rdparty/spirv-tools/source/val/validate_instruction.cpp @@ -89,7 +89,7 @@ CapabilitySet EnablingCapabilitiesForOp(const ValidationState_t& state, // Returns SPV_SUCCESS if the given operand is enabled by capabilities declared // in the module. Otherwise issues an error message and returns // SPV_ERROR_INVALID_CAPABILITY. -spv_result_t CheckRequiredCapabilities(const ValidationState_t& state, +spv_result_t CheckRequiredCapabilities(ValidationState_t& state, const Instruction* inst, size_t which_operand, spv_operand_type_t type, @@ -429,88 +429,16 @@ spv_result_t LimitCheckNumVars(ValidationState_t& _, const uint32_t var_id, return SPV_SUCCESS; } -// Registers necessary decoration(s) for the appropriate IDs based on the -// instruction. -spv_result_t RegisterDecorations(ValidationState_t& _, - const Instruction* inst) { - switch (inst->opcode()) { - case SpvOpDecorate: { - const uint32_t target_id = inst->word(1); - const SpvDecoration dec_type = static_cast(inst->word(2)); - std::vector dec_params; - if (inst->words().size() > 3) { - dec_params.insert(dec_params.end(), inst->words().begin() + 3, - inst->words().end()); - } - _.RegisterDecorationForId(target_id, Decoration(dec_type, dec_params)); - break; - } - case SpvOpMemberDecorate: { - const uint32_t struct_id = inst->word(1); - const uint32_t index = inst->word(2); - const SpvDecoration dec_type = static_cast(inst->word(3)); - std::vector dec_params; - if (inst->words().size() > 4) { - dec_params.insert(dec_params.end(), inst->words().begin() + 4, - inst->words().end()); - } - _.RegisterDecorationForId(struct_id, - Decoration(dec_type, dec_params, index)); - break; - } - case SpvOpDecorationGroup: { - // We don't need to do anything right now. Assigning decorations to groups - // will be taken care of via OpGroupDecorate. - break; - } - case SpvOpGroupDecorate: { - // Word 1 is the group . All subsequent words are target s that - // are going to be decorated with the decorations. - const uint32_t decoration_group_id = inst->word(1); - std::vector& group_decorations = - _.id_decorations(decoration_group_id); - for (size_t i = 2; i < inst->words().size(); ++i) { - const uint32_t target_id = inst->word(i); - _.RegisterDecorationsForId(target_id, group_decorations.begin(), - group_decorations.end()); - } - break; - } - case SpvOpGroupMemberDecorate: { - // Word 1 is the Decoration Group followed by (struct,literal) - // pairs. All decorations of the group should be applied to all the struct - // members that are specified in the instructions. - const uint32_t decoration_group_id = inst->word(1); - std::vector& group_decorations = - _.id_decorations(decoration_group_id); - // Grammar checks ensures that the number of arguments to this instruction - // is an odd number: 1 decoration group + (id,literal) pairs. - for (size_t i = 2; i + 1 < inst->words().size(); i = i + 2) { - const uint32_t struct_id = inst->word(i); - const uint32_t index = inst->word(i + 1); - // ID validation phase ensures this is in fact a struct instruction and - // that the index is not out of bound. - _.RegisterDecorationsForStructMember(struct_id, index, - group_decorations.begin(), - group_decorations.end()); - } - break; - } - default: - break; - } - return SPV_SUCCESS; -} - // Parses OpExtension instruction and logs warnings if unsuccessful. -void CheckIfKnownExtension(ValidationState_t& _, const Instruction* inst) { +spv_result_t CheckIfKnownExtension(ValidationState_t& _, + const Instruction* inst) { const std::string extension_str = GetExtensionString(&(inst->c_inst())); Extension extension; if (!GetExtensionFromString(extension_str.c_str(), &extension)) { - _.diag(SPV_ERROR_INVALID_BINARY, inst) - << "Found unrecognized extension " << extension_str; - return; + return _.diag(SPV_WARNING, inst) + << "Found unrecognized extension " << extension_str; } + return SPV_SUCCESS; } } // namespace @@ -528,6 +456,24 @@ spv_result_t InstructionPass(ValidationState_t& _, const Instruction* inst) { } _.set_addressing_model(inst->GetOperandAs(0)); _.set_memory_model(inst->GetOperandAs(1)); + + if (_.memory_model() != SpvMemoryModelVulkanKHR && + _.HasCapability(SpvCapabilityVulkanMemoryModelKHR)) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "VulkanMemoryModelKHR capability must only be specified if the " + "VulkanKHR memory model is used."; + } + + if (spvIsWebGPUEnv(_.context()->target_env)) { + if (_.addressing_model() != SpvAddressingModelLogical) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Addressing model must be Logical for WebGPU environment."; + } + if (_.memory_model() != SpvMemoryModelVulkanKHR) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Memory model must be VulkanKHR for WebGPU environment."; + } + } } else if (opcode == SpvOpExecutionMode) { const uint32_t entry_point = inst->word(1); _.RegisterExecutionModeForEntryPoint(entry_point, @@ -572,10 +518,6 @@ spv_result_t InstructionPass(ValidationState_t& _, const Instruction* inst) { "capability is used."; } - // In order to validate decoration rules, we need to know all the decorations - // that are applied to any given . - RegisterDecorations(_, inst); - if (auto error = ExtensionCheck(_, inst)) return error; if (auto error = ReservedCheck(_, inst)) return error; if (auto error = EnvironmentCheck(_, inst)) return error; diff --git a/3rdparty/spirv-tools/source/val/validate_memory.cpp b/3rdparty/spirv-tools/source/val/validate_memory.cpp index 18c3cca0f..d1a64428c 100644 --- a/3rdparty/spirv-tools/source/val/validate_memory.cpp +++ b/3rdparty/spirv-tools/source/val/validate_memory.cpp @@ -19,7 +19,9 @@ #include #include "source/opcode.h" +#include "source/spirv_target_env.h" #include "source/val/instruction.h" +#include "source/val/validate_scopes.h" #include "source/val/validation_state.h" namespace spvtools { @@ -35,6 +37,21 @@ bool HaveSameLayoutDecorations(ValidationState_t&, const Instruction*, bool HasConflictingMemberOffsets(const std::vector&, const std::vector&); +bool IsAllowedTypeOrArrayOfSame(ValidationState_t& _, const Instruction* type, + std::initializer_list allowed) { + if (std::find(allowed.begin(), allowed.end(), type->opcode()) != + allowed.end()) { + return true; + } + if (type->opcode() == SpvOpTypeArray || + type->opcode() == SpvOpTypeRuntimeArray) { + auto elem_type = _.FindDef(type->word(2)); + return std::find(allowed.begin(), allowed.end(), elem_type->opcode()) != + allowed.end(); + } + return false; +} + // Returns true if the two instructions represent structs that, as far as the // validator can tell, have the exact same data layout. bool AreLayoutCompatibleStructs(ValidationState_t& _, const Instruction* type1, @@ -57,9 +74,9 @@ bool AreLayoutCompatibleStructs(ValidationState_t& _, const Instruction* type1, bool HaveLayoutCompatibleMembers(ValidationState_t& _, const Instruction* type1, const Instruction* type2) { assert(type1->opcode() == SpvOpTypeStruct && - "type1 must be and OpTypeStruct instruction."); + "type1 must be an OpTypeStruct instruction."); assert(type2->opcode() == SpvOpTypeStruct && - "type2 must be and OpTypeStruct instruction."); + "type2 must be an OpTypeStruct instruction."); const auto& type1_operands = type1->operands(); const auto& type2_operands = type2->operands(); if (type1_operands.size() != type2_operands.size()) { @@ -84,9 +101,9 @@ bool HaveLayoutCompatibleMembers(ValidationState_t& _, const Instruction* type1, bool HaveSameLayoutDecorations(ValidationState_t& _, const Instruction* type1, const Instruction* type2) { assert(type1->opcode() == SpvOpTypeStruct && - "type1 must be and OpTypeStruct instruction."); + "type1 must be an OpTypeStruct instruction."); assert(type2->opcode() == SpvOpTypeStruct && - "type2 must be and OpTypeStruct instruction."); + "type2 must be an OpTypeStruct instruction."); const std::vector& type1_decorations = _.id_decorations(type1->id()); const std::vector& type2_decorations = @@ -139,40 +156,365 @@ bool HasConflictingMemberOffsets( return false; } -spv_result_t ValidateVariable(ValidationState_t& _, const Instruction& inst) { - auto result_type = _.FindDef(inst.type_id()); - if (!result_type || result_type->opcode() != SpvOpTypePointer) { - return _.diag(SPV_ERROR_INVALID_ID, &inst) - << "OpVariable Result Type '" << _.getIdName(inst.type_id()) - << "' is not a pointer type."; +// If |skip_builtin| is true, returns true if |storage| contains bool within +// it and no storage that contains the bool is builtin. +// If |skip_builtin| is false, returns true if |storage| contains bool within +// it. +bool ContainsInvalidBool(ValidationState_t& _, const Instruction* storage, + bool skip_builtin) { + if (skip_builtin) { + for (const Decoration& decoration : _.id_decorations(storage->id())) { + if (decoration.dec_type() == SpvDecorationBuiltIn) return false; + } } - const auto initializer_index = 3; - if (initializer_index < inst.operands().size()) { - const auto initializer_id = inst.GetOperandAs(initializer_index); - const auto initializer = _.FindDef(initializer_id); - const auto storage_class_index = 2; - const auto is_module_scope_var = - initializer && (initializer->opcode() == SpvOpVariable) && - (initializer->GetOperandAs(storage_class_index) != - SpvStorageClassFunction); - const auto is_constant = - initializer && spvOpcodeIsConstant(initializer->opcode()); - if (!initializer || !(is_constant || is_module_scope_var)) { - return _.diag(SPV_ERROR_INVALID_ID, &inst) - << "OpVariable Initializer '" << _.getIdName(initializer_id) - << "' is not a constant or module-scope variable."; + const size_t elem_type_index = 1; + uint32_t elem_type_id; + Instruction* elem_type; + + switch (storage->opcode()) { + case SpvOpTypeBool: + return true; + case SpvOpTypeVector: + case SpvOpTypeMatrix: + case SpvOpTypeArray: + case SpvOpTypeRuntimeArray: + elem_type_id = storage->GetOperandAs(elem_type_index); + elem_type = _.FindDef(elem_type_id); + return ContainsInvalidBool(_, elem_type, skip_builtin); + case SpvOpTypeStruct: + for (size_t member_type_index = 1; + member_type_index < storage->operands().size(); + ++member_type_index) { + auto member_type_id = + storage->GetOperandAs(member_type_index); + auto member_type = _.FindDef(member_type_id); + if (ContainsInvalidBool(_, member_type, skip_builtin)) return true; + } + default: + break; + } + return false; +} + +std::pair GetStorageClass( + ValidationState_t& _, const Instruction* inst) { + SpvStorageClass dst_sc = SpvStorageClassMax; + SpvStorageClass src_sc = SpvStorageClassMax; + switch (inst->opcode()) { + case SpvOpLoad: { + auto load_pointer = _.FindDef(inst->GetOperandAs(2)); + auto load_pointer_type = _.FindDef(load_pointer->type_id()); + dst_sc = load_pointer_type->GetOperandAs(1); + break; + } + case SpvOpStore: { + auto store_pointer = _.FindDef(inst->GetOperandAs(0)); + auto store_pointer_type = _.FindDef(store_pointer->type_id()); + dst_sc = store_pointer_type->GetOperandAs(1); + break; + } + case SpvOpCopyMemory: + case SpvOpCopyMemorySized: { + auto dst = _.FindDef(inst->GetOperandAs(0)); + auto dst_type = _.FindDef(dst->type_id()); + dst_sc = dst_type->GetOperandAs(1); + auto src = _.FindDef(inst->GetOperandAs(1)); + auto src_type = _.FindDef(src->type_id()); + src_sc = src_type->GetOperandAs(1); + break; + } + default: + break; + } + + return std::make_pair(dst_sc, src_sc); +} + +// This function is only called for OpLoad, OpStore, OpCopyMemory and +// OpCopyMemorySized. +uint32_t GetMakeAvailableScope(const Instruction* inst, uint32_t mask) { + uint32_t offset = 1; + if (mask & SpvMemoryAccessAlignedMask) ++offset; + + uint32_t scope_id = 0; + switch (inst->opcode()) { + case SpvOpLoad: + case SpvOpCopyMemorySized: + return inst->GetOperandAs(3 + offset); + case SpvOpStore: + case SpvOpCopyMemory: + return inst->GetOperandAs(2 + offset); + default: + assert(false && "unexpected opcode"); + break; + } + + return scope_id; +} + +// This function is only called for OpLoad, OpStore, OpCopyMemory and +// OpCopyMemorySized. +uint32_t GetMakeVisibleScope(const Instruction* inst, uint32_t mask) { + uint32_t offset = 1; + if (mask & SpvMemoryAccessAlignedMask) ++offset; + if (mask & SpvMemoryAccessMakePointerAvailableKHRMask) ++offset; + + uint32_t scope_id = 0; + switch (inst->opcode()) { + case SpvOpLoad: + case SpvOpCopyMemorySized: + return inst->GetOperandAs(3 + offset); + case SpvOpStore: + case SpvOpCopyMemory: + return inst->GetOperandAs(2 + offset); + default: + assert(false && "unexpected opcode"); + break; + } + + return scope_id; +} + +spv_result_t CheckMemoryAccess(ValidationState_t& _, const Instruction* inst, + uint32_t mask) { + if (mask & SpvMemoryAccessMakePointerAvailableKHRMask) { + if (inst->opcode() == SpvOpLoad) { + return _.diag(SPV_ERROR_INVALID_ID, inst) + << "MakePointerAvailableKHR cannot be used with OpLoad."; + } + + if (!(mask & SpvMemoryAccessNonPrivatePointerKHRMask)) { + return _.diag(SPV_ERROR_INVALID_ID, inst) + << "NonPrivatePointerKHR must be specified if " + "MakePointerAvailableKHR is specified."; + } + + // Check the associated scope for MakeAvailableKHR. + const auto available_scope = GetMakeAvailableScope(inst, mask); + if (auto error = ValidateMemoryScope(_, inst, available_scope)) + return error; + } + + if (mask & SpvMemoryAccessMakePointerVisibleKHRMask) { + if (inst->opcode() == SpvOpStore) { + return _.diag(SPV_ERROR_INVALID_ID, inst) + << "MakePointerVisibleKHR cannot be used with OpStore."; + } + + if (!(mask & SpvMemoryAccessNonPrivatePointerKHRMask)) { + return _.diag(SPV_ERROR_INVALID_ID, inst) + << "NonPrivatePointerKHR must be specified if " + "MakePointerVisibleKHR is specified."; + } + + // Check the associated scope for MakeVisibleKHR. + const auto visible_scope = GetMakeVisibleScope(inst, mask); + if (auto error = ValidateMemoryScope(_, inst, visible_scope)) return error; + } + + if (mask & SpvMemoryAccessNonPrivatePointerKHRMask) { + SpvStorageClass dst_sc, src_sc; + std::tie(dst_sc, src_sc) = GetStorageClass(_, inst); + if (dst_sc != SpvStorageClassUniform && + dst_sc != SpvStorageClassWorkgroup && + dst_sc != SpvStorageClassCrossWorkgroup && + dst_sc != SpvStorageClassGeneric && dst_sc != SpvStorageClassImage && + dst_sc != SpvStorageClassStorageBuffer) { + return _.diag(SPV_ERROR_INVALID_ID, inst) + << "NonPrivatePointerKHR requires a pointer in Uniform, " + "Workgroup, CrossWorkgroup, Generic, Image or StorageBuffer " + "storage classes."; + } + if (src_sc != SpvStorageClassMax && src_sc != SpvStorageClassUniform && + src_sc != SpvStorageClassWorkgroup && + src_sc != SpvStorageClassCrossWorkgroup && + src_sc != SpvStorageClassGeneric && src_sc != SpvStorageClassImage && + src_sc != SpvStorageClassStorageBuffer) { + return _.diag(SPV_ERROR_INVALID_ID, inst) + << "NonPrivatePointerKHR requires a pointer in Uniform, " + "Workgroup, CrossWorkgroup, Generic, Image or StorageBuffer " + "storage classes."; } } return SPV_SUCCESS; } -spv_result_t ValidateLoad(ValidationState_t& _, const Instruction& inst) { - const auto result_type = _.FindDef(inst.type_id()); +spv_result_t ValidateVariable(ValidationState_t& _, const Instruction* inst) { + auto result_type = _.FindDef(inst->type_id()); + if (!result_type || result_type->opcode() != SpvOpTypePointer) { + return _.diag(SPV_ERROR_INVALID_ID, inst) + << "OpVariable Result Type '" << _.getIdName(inst->type_id()) + << "' is not a pointer type."; + } + + const auto initializer_index = 3; + const auto storage_class_index = 2; + if (initializer_index < inst->operands().size()) { + const auto initializer_id = inst->GetOperandAs(initializer_index); + const auto initializer = _.FindDef(initializer_id); + const auto is_module_scope_var = + initializer && (initializer->opcode() == SpvOpVariable) && + (initializer->GetOperandAs(storage_class_index) != + SpvStorageClassFunction); + const auto is_constant = + initializer && spvOpcodeIsConstant(initializer->opcode()); + if (!initializer || !(is_constant || is_module_scope_var)) { + return _.diag(SPV_ERROR_INVALID_ID, inst) + << "OpVariable Initializer '" << _.getIdName(initializer_id) + << "' is not a constant or module-scope variable."; + } + } + + const auto storage_class = + inst->GetOperandAs(storage_class_index); + if (storage_class != SpvStorageClassWorkgroup && + storage_class != SpvStorageClassCrossWorkgroup && + storage_class != SpvStorageClassPrivate && + storage_class != SpvStorageClassFunction && + storage_class != SpvStorageClassRayPayloadNV && + storage_class != SpvStorageClassIncomingRayPayloadNV && + storage_class != SpvStorageClassHitAttributeNV && + storage_class != SpvStorageClassCallableDataNV && + storage_class != SpvStorageClassIncomingCallableDataNV) { + const auto storage_index = 2; + const auto storage_id = result_type->GetOperandAs(storage_index); + const auto storage = _.FindDef(storage_id); + bool storage_input_or_output = storage_class == SpvStorageClassInput || + storage_class == SpvStorageClassOutput; + bool builtin = false; + if (storage_input_or_output) { + for (const Decoration& decoration : _.id_decorations(inst->id())) { + if (decoration.dec_type() == SpvDecorationBuiltIn) { + builtin = true; + break; + } + } + } + if (!(storage_input_or_output && builtin) && + ContainsInvalidBool(_, storage, storage_input_or_output)) { + return _.diag(SPV_ERROR_INVALID_ID, inst) + << "If OpTypeBool is stored in conjunction with OpVariable, it " + << "can only be used with non-externally visible shader Storage " + << "Classes: Workgroup, CrossWorkgroup, Private, and Function"; + } + } + + // SPIR-V 3.32.8: Check that pointer type and variable type have the same + // storage class. + const auto result_storage_class_index = 1; + const auto result_storage_class = + result_type->GetOperandAs(result_storage_class_index); + if (storage_class != result_storage_class) { + return _.diag(SPV_ERROR_INVALID_ID, inst) + << "From SPIR-V spec, section 3.32.8 on OpVariable:\n" + << "Its Storage Class operand must be the same as the Storage Class " + << "operand of the result type."; + } + + // Variable pointer related restrictions. + auto pointee = _.FindDef(result_type->word(3)); + if (_.addressing_model() == SpvAddressingModelLogical && + !_.options()->relax_logical_pointer) { + // VariablePointersStorageBuffer is implied by VariablePointers. + if (pointee->opcode() == SpvOpTypePointer) { + if (!_.HasCapability(SpvCapabilityVariablePointersStorageBuffer)) { + return _.diag(SPV_ERROR_INVALID_ID, inst) << "In Logical addressing, " + "variables may not " + "allocate a pointer type"; + } else if (storage_class != SpvStorageClassFunction && + storage_class != SpvStorageClassPrivate) { + return _.diag(SPV_ERROR_INVALID_ID, inst) + << "In Logical addressing with variable pointers, variables " + "that allocate pointers must be in Function or Private " + "storage classes"; + } + } + } + + // Vulkan 14.5.1: Check type of PushConstant variables. + // Vulkan 14.5.2: Check type of UniformConstant and Uniform variables. + if (spvIsVulkanEnv(_.context()->target_env)) { + if (storage_class == SpvStorageClassPushConstant) { + if (!IsAllowedTypeOrArrayOfSame(_, pointee, {SpvOpTypeStruct})) { + return _.diag(SPV_ERROR_INVALID_ID, inst) + << "PushConstant OpVariable '" << _.getIdName(inst->id()) + << "' has illegal type.\n" + << "From Vulkan spec, section 14.5.1:\n" + << "Such variables must be typed as OpTypeStruct, " + << "or an array of this type"; + } + } + + if (storage_class == SpvStorageClassUniformConstant) { + if (!IsAllowedTypeOrArrayOfSame( + _, pointee, + {SpvOpTypeImage, SpvOpTypeSampler, SpvOpTypeSampledImage, + SpvOpTypeAccelerationStructureNV})) { + return _.diag(SPV_ERROR_INVALID_ID, inst) + << "UniformConstant OpVariable '" << _.getIdName(inst->id()) + << "' has illegal type.\n" + << "From Vulkan spec, section 14.5.2:\n" + << "Variables identified with the UniformConstant storage class " + << "are used only as handles to refer to opaque resources. Such " + << "variables must be typed as OpTypeImage, OpTypeSampler, " + << "OpTypeSampledImage, OpTypeAccelerationStructureNV, " + << "or an array of one of these types."; + } + } + + if (storage_class == SpvStorageClassUniform) { + if (!IsAllowedTypeOrArrayOfSame(_, pointee, {SpvOpTypeStruct})) { + return _.diag(SPV_ERROR_INVALID_ID, inst) + << "Uniform OpVariable '" << _.getIdName(inst->id()) + << "' has illegal type.\n" + << "From Vulkan spec, section 14.5.2:\n" + << "Variables identified with the Uniform storage class are " + "used " + << "to access transparent buffer backed resources. Such " + "variables " + << "must be typed as OpTypeStruct, or an array of this type"; + } + } + } + + // WebGPU & Vulkan Appendix A: Check that if contains initializer, then + // storage class is Output, Private, or Function. + if (inst->operands().size() > 3 && storage_class != SpvStorageClassOutput && + storage_class != SpvStorageClassPrivate && + storage_class != SpvStorageClassFunction) { + if (spvIsVulkanEnv(_.context()->target_env)) { + return _.diag(SPV_ERROR_INVALID_ID, inst) + << "OpVariable, '" << _.getIdName(inst->id()) + << "', has a disallowed initializer & storage class " + << "combination.\n" + << "From Vulkan spec, Appendix A:\n" + << "Variable declarations that include initializers must have " + << "one of the following storage classes: Output, Private, or " + << "Function"; + } + + if (spvIsWebGPUEnv(_.context()->target_env)) { + return _.diag(SPV_ERROR_INVALID_ID, inst) + << "OpVariable, '" << _.getIdName(inst->id()) + << "', has a disallowed initializer & storage class " + << "combination.\n" + << "From WebGPU execution environment spec:\n" + << "Variable declarations that include initializers must have " + << "one of the following storage classes: Output, Private, or " + << "Function"; + } + } + + return SPV_SUCCESS; +} + +spv_result_t ValidateLoad(ValidationState_t& _, const Instruction* inst) { + const auto result_type = _.FindDef(inst->type_id()); if (!result_type) { - return _.diag(SPV_ERROR_INVALID_ID, &inst) - << "OpLoad Result Type '" << _.getIdName(inst.type_id()) + return _.diag(SPV_ERROR_INVALID_ID, inst) + << "OpLoad Result Type '" << _.getIdName(inst->type_id()) << "' is not defined."; } @@ -180,7 +522,7 @@ spv_result_t ValidateLoad(ValidationState_t& _, const Instruction& inst) { _.features().variable_pointers || _.features().variable_pointers_storage_buffer; const auto pointer_index = 2; - const auto pointer_id = inst.GetOperandAs(pointer_index); + const auto pointer_id = inst->GetOperandAs(pointer_index); const auto pointer = _.FindDef(pointer_id); if (!pointer || ((_.addressing_model() == SpvAddressingModelLogical) && @@ -188,35 +530,41 @@ spv_result_t ValidateLoad(ValidationState_t& _, const Instruction& inst) { !spvOpcodeReturnsLogicalPointer(pointer->opcode())) || (uses_variable_pointers && !spvOpcodeReturnsLogicalVariablePointer(pointer->opcode()))))) { - return _.diag(SPV_ERROR_INVALID_ID, &inst) + return _.diag(SPV_ERROR_INVALID_ID, inst) << "OpLoad Pointer '" << _.getIdName(pointer_id) << "' is not a logical pointer."; } const auto pointer_type = _.FindDef(pointer->type_id()); if (!pointer_type || pointer_type->opcode() != SpvOpTypePointer) { - return _.diag(SPV_ERROR_INVALID_ID, &inst) + return _.diag(SPV_ERROR_INVALID_ID, inst) << "OpLoad type for pointer '" << _.getIdName(pointer_id) << "' is not a pointer type."; } const auto pointee_type = _.FindDef(pointer_type->GetOperandAs(2)); if (!pointee_type || result_type->id() != pointee_type->id()) { - return _.diag(SPV_ERROR_INVALID_ID, &inst) - << "OpLoad Result Type '" << _.getIdName(inst.type_id()) + return _.diag(SPV_ERROR_INVALID_ID, inst) + << "OpLoad Result Type '" << _.getIdName(inst->type_id()) << "' does not match Pointer '" << _.getIdName(pointer->id()) << "'s type."; } + if (inst->operands().size() > 3) { + if (auto error = + CheckMemoryAccess(_, inst, inst->GetOperandAs(3))) + return error; + } + return SPV_SUCCESS; } -spv_result_t ValidateStore(ValidationState_t& _, const Instruction& inst) { +spv_result_t ValidateStore(ValidationState_t& _, const Instruction* inst) { const bool uses_variable_pointer = _.features().variable_pointers || _.features().variable_pointers_storage_buffer; const auto pointer_index = 0; - const auto pointer_id = inst.GetOperandAs(pointer_index); + const auto pointer_id = inst->GetOperandAs(pointer_index); const auto pointer = _.FindDef(pointer_id); if (!pointer || (_.addressing_model() == SpvAddressingModelLogical && @@ -224,20 +572,20 @@ spv_result_t ValidateStore(ValidationState_t& _, const Instruction& inst) { !spvOpcodeReturnsLogicalPointer(pointer->opcode())) || (uses_variable_pointer && !spvOpcodeReturnsLogicalVariablePointer(pointer->opcode()))))) { - return _.diag(SPV_ERROR_INVALID_ID, &inst) + return _.diag(SPV_ERROR_INVALID_ID, inst) << "OpStore Pointer '" << _.getIdName(pointer_id) << "' is not a logical pointer."; } const auto pointer_type = _.FindDef(pointer->type_id()); if (!pointer_type || pointer_type->opcode() != SpvOpTypePointer) { - return _.diag(SPV_ERROR_INVALID_ID, &inst) + return _.diag(SPV_ERROR_INVALID_ID, inst) << "OpStore type for pointer '" << _.getIdName(pointer_id) << "' is not a pointer type."; } const auto type_id = pointer_type->GetOperandAs(2); const auto type = _.FindDef(type_id); if (!type || SpvOpTypeVoid == type->opcode()) { - return _.diag(SPV_ERROR_INVALID_ID, &inst) + return _.diag(SPV_ERROR_INVALID_ID, inst) << "OpStore Pointer '" << _.getIdName(pointer_id) << "'s type is void."; } @@ -247,7 +595,7 @@ spv_result_t ValidateStore(ValidationState_t& _, const Instruction& inst) { uint32_t data_type; uint32_t storage_class; if (!_.GetPointerTypeInfo(pointer_type->id(), &data_type, &storage_class)) { - return _.diag(SPV_ERROR_INVALID_ID, &inst) + return _.diag(SPV_ERROR_INVALID_ID, inst) << "OpStore Pointer '" << _.getIdName(pointer_id) << "' is not pointer type"; } @@ -255,23 +603,23 @@ spv_result_t ValidateStore(ValidationState_t& _, const Instruction& inst) { if (storage_class == SpvStorageClassUniformConstant || storage_class == SpvStorageClassInput || storage_class == SpvStorageClassPushConstant) { - return _.diag(SPV_ERROR_INVALID_ID, &inst) + return _.diag(SPV_ERROR_INVALID_ID, inst) << "OpStore Pointer '" << _.getIdName(pointer_id) << "' storage class is read-only"; } } const auto object_index = 1; - const auto object_id = inst.GetOperandAs(object_index); + const auto object_id = inst->GetOperandAs(object_index); const auto object = _.FindDef(object_id); if (!object || !object->type_id()) { - return _.diag(SPV_ERROR_INVALID_ID, &inst) + return _.diag(SPV_ERROR_INVALID_ID, inst) << "OpStore Object '" << _.getIdName(object_id) << "' is not an object."; } const auto object_type = _.FindDef(object->type_id()); if (!object_type || SpvOpTypeVoid == object_type->opcode()) { - return _.diag(SPV_ERROR_INVALID_ID, &inst) + return _.diag(SPV_ERROR_INVALID_ID, inst) << "OpStore Object '" << _.getIdName(object_id) << "'s type is void."; } @@ -279,7 +627,7 @@ spv_result_t ValidateStore(ValidationState_t& _, const Instruction& inst) { if (type->id() != object_type->id()) { if (!_.options()->relax_struct_store || type->opcode() != SpvOpTypeStruct || object_type->opcode() != SpvOpTypeStruct) { - return _.diag(SPV_ERROR_INVALID_ID, &inst) + return _.diag(SPV_ERROR_INVALID_ID, inst) << "OpStore Pointer '" << _.getIdName(pointer_id) << "'s type does not match Object '" << _.getIdName(object->id()) << "'s type."; @@ -287,30 +635,37 @@ spv_result_t ValidateStore(ValidationState_t& _, const Instruction& inst) { // TODO: Check for layout compatible matricies and arrays as well. if (!AreLayoutCompatibleStructs(_, type, object_type)) { - return _.diag(SPV_ERROR_INVALID_ID, &inst) + return _.diag(SPV_ERROR_INVALID_ID, inst) << "OpStore Pointer '" << _.getIdName(pointer_id) << "'s layout does not match Object '" << _.getIdName(object->id()) << "'s layout."; } } + + if (inst->operands().size() > 2) { + if (auto error = + CheckMemoryAccess(_, inst, inst->GetOperandAs(2))) + return error; + } + return SPV_SUCCESS; } -spv_result_t ValidateCopyMemory(ValidationState_t& _, const Instruction& inst) { +spv_result_t ValidateCopyMemory(ValidationState_t& _, const Instruction* inst) { const auto target_index = 0; - const auto target_id = inst.GetOperandAs(target_index); + const auto target_id = inst->GetOperandAs(target_index); const auto target = _.FindDef(target_id); if (!target) { - return _.diag(SPV_ERROR_INVALID_ID, &inst) + return _.diag(SPV_ERROR_INVALID_ID, inst) << "Target operand '" << _.getIdName(target_id) << "' is not defined."; } const auto source_index = 1; - const auto source_id = inst.GetOperandAs(source_index); + const auto source_id = inst->GetOperandAs(source_index); const auto source = _.FindDef(source_id); if (!source) { - return _.diag(SPV_ERROR_INVALID_ID, &inst) + return _.diag(SPV_ERROR_INVALID_ID, inst) << "Source operand '" << _.getIdName(source_id) << "' is not defined."; } @@ -318,7 +673,7 @@ spv_result_t ValidateCopyMemory(ValidationState_t& _, const Instruction& inst) { const auto target_pointer_type = _.FindDef(target->type_id()); if (!target_pointer_type || target_pointer_type->opcode() != SpvOpTypePointer) { - return _.diag(SPV_ERROR_INVALID_ID, &inst) + return _.diag(SPV_ERROR_INVALID_ID, inst) << "Target operand '" << _.getIdName(target_id) << "' is not a pointer."; } @@ -326,16 +681,16 @@ spv_result_t ValidateCopyMemory(ValidationState_t& _, const Instruction& inst) { const auto source_pointer_type = _.FindDef(source->type_id()); if (!source_pointer_type || source_pointer_type->opcode() != SpvOpTypePointer) { - return _.diag(SPV_ERROR_INVALID_ID, &inst) + return _.diag(SPV_ERROR_INVALID_ID, inst) << "Source operand '" << _.getIdName(source_id) << "' is not a pointer."; } - if (inst.opcode() == SpvOpCopyMemory) { + if (inst->opcode() == SpvOpCopyMemory) { const auto target_type = _.FindDef(target_pointer_type->GetOperandAs(2)); if (!target_type || target_type->opcode() == SpvOpTypeVoid) { - return _.diag(SPV_ERROR_INVALID_ID, &inst) + return _.diag(SPV_ERROR_INVALID_ID, inst) << "Target operand '" << _.getIdName(target_id) << "' cannot be a void pointer."; } @@ -343,29 +698,35 @@ spv_result_t ValidateCopyMemory(ValidationState_t& _, const Instruction& inst) { const auto source_type = _.FindDef(source_pointer_type->GetOperandAs(2)); if (!source_type || source_type->opcode() == SpvOpTypeVoid) { - return _.diag(SPV_ERROR_INVALID_ID, &inst) + return _.diag(SPV_ERROR_INVALID_ID, inst) << "Source operand '" << _.getIdName(source_id) << "' cannot be a void pointer."; } if (target_type->id() != source_type->id()) { - return _.diag(SPV_ERROR_INVALID_ID, &inst) + return _.diag(SPV_ERROR_INVALID_ID, inst) << "Target '" << _.getIdName(source_id) << "'s type does not match Source '" << _.getIdName(source_type->id()) << "'s type."; } + + if (inst->operands().size() > 2) { + if (auto error = + CheckMemoryAccess(_, inst, inst->GetOperandAs(2))) + return error; + } } else { - const auto size_id = inst.GetOperandAs(2); + const auto size_id = inst->GetOperandAs(2); const auto size = _.FindDef(size_id); if (!size) { - return _.diag(SPV_ERROR_INVALID_ID, &inst) + return _.diag(SPV_ERROR_INVALID_ID, inst) << "Size operand '" << _.getIdName(size_id) << "' is not defined."; } const auto size_type = _.FindDef(size->type_id()); if (!_.IsIntScalarType(size_type->id())) { - return _.diag(SPV_ERROR_INVALID_ID, &inst) + return _.diag(SPV_ERROR_INVALID_ID, inst) << "Size operand '" << _.getIdName(size_id) << "' must be a scalar integer type."; } @@ -373,13 +734,13 @@ spv_result_t ValidateCopyMemory(ValidationState_t& _, const Instruction& inst) { bool is_zero = true; switch (size->opcode()) { case SpvOpConstantNull: - return _.diag(SPV_ERROR_INVALID_ID, &inst) + return _.diag(SPV_ERROR_INVALID_ID, inst) << "Size operand '" << _.getIdName(size_id) << "' cannot be a constant zero."; case SpvOpConstant: if (size_type->word(3) == 1 && size->word(size->words().size() - 1) & 0x80000000) { - return _.diag(SPV_ERROR_INVALID_ID, &inst) + return _.diag(SPV_ERROR_INVALID_ID, inst) << "Size operand '" << _.getIdName(size_id) << "' cannot have the sign bit set to 1."; } @@ -387,7 +748,7 @@ spv_result_t ValidateCopyMemory(ValidationState_t& _, const Instruction& inst) { is_zero &= (size->word(i) == 0); } if (is_zero) { - return _.diag(SPV_ERROR_INVALID_ID, &inst) + return _.diag(SPV_ERROR_INVALID_ID, inst) << "Size operand '" << _.getIdName(size_id) << "' cannot be a constant zero."; } @@ -396,21 +757,27 @@ spv_result_t ValidateCopyMemory(ValidationState_t& _, const Instruction& inst) { // Cannot infer any other opcodes. break; } + + if (inst->operands().size() > 3) { + if (auto error = + CheckMemoryAccess(_, inst, inst->GetOperandAs(3))) + return error; + } } return SPV_SUCCESS; } spv_result_t ValidateAccessChain(ValidationState_t& _, - const Instruction& inst) { + const Instruction* inst) { std::string instr_name = - "Op" + std::string(spvOpcodeString(static_cast(inst.opcode()))); + "Op" + std::string(spvOpcodeString(static_cast(inst->opcode()))); // The result type must be OpTypePointer. - auto result_type = _.FindDef(inst.type_id()); + auto result_type = _.FindDef(inst->type_id()); if (SpvOpTypePointer != result_type->opcode()) { - return _.diag(SPV_ERROR_INVALID_ID, &inst) + return _.diag(SPV_ERROR_INVALID_ID, inst) << "The Result Type of " << instr_name << " '" - << _.getIdName(inst.id()) << "' must be OpTypePointer. Found Op" + << _.getIdName(inst->id()) << "' must be OpTypePointer. Found Op" << spvOpcodeString(static_cast(result_type->opcode())) << "."; } @@ -421,11 +788,11 @@ spv_result_t ValidateAccessChain(ValidationState_t& _, // Base must be a pointer, pointing to the base of a composite object. const auto base_index = 2; - const auto base_id = inst.GetOperandAs(base_index); + const auto base_id = inst->GetOperandAs(base_index); const auto base = _.FindDef(base_id); const auto base_type = _.FindDef(base->type_id()); if (!base_type || SpvOpTypePointer != base_type->opcode()) { - return _.diag(SPV_ERROR_INVALID_ID, &inst) + return _.diag(SPV_ERROR_INVALID_ID, inst) << "The Base '" << _.getIdName(base_id) << "' in " << instr_name << " instruction must be a pointer."; } @@ -435,7 +802,7 @@ spv_result_t ValidateAccessChain(ValidationState_t& _, auto result_type_storage_class = result_type->word(2); auto base_type_storage_class = base_type->word(2); if (result_type_storage_class != base_type_storage_class) { - return _.diag(SPV_ERROR_INVALID_ID, &inst) + return _.diag(SPV_ERROR_INVALID_ID, inst) << "The result pointer storage class and base " "pointer storage class in " << instr_name << " do not match."; @@ -447,9 +814,9 @@ spv_result_t ValidateAccessChain(ValidationState_t& _, // Check Universal Limit (SPIR-V Spec. Section 2.17). // The number of indexes passed to OpAccessChain may not exceed 255 // The instruction includes 4 words + N words (for N indexes) - size_t num_indexes = inst.words().size() - 4; - if (inst.opcode() == SpvOpPtrAccessChain || - inst.opcode() == SpvOpInBoundsPtrAccessChain) { + size_t num_indexes = inst->words().size() - 4; + if (inst->opcode() == SpvOpPtrAccessChain || + inst->opcode() == SpvOpInBoundsPtrAccessChain) { // In pointer access chains, the element operand is required, but not // counted as an index. --num_indexes; @@ -457,7 +824,7 @@ spv_result_t ValidateAccessChain(ValidationState_t& _, const size_t num_indexes_limit = _.options()->universal_limits_.max_access_chain_indexes; if (num_indexes > num_indexes_limit) { - return _.diag(SPV_ERROR_INVALID_ID, &inst) + return _.diag(SPV_ERROR_INVALID_ID, inst) << "The number of indexes in " << instr_name << " may not exceed " << num_indexes_limit << ". Found " << num_indexes << " indexes."; } @@ -469,18 +836,18 @@ spv_result_t ValidateAccessChain(ValidationState_t& _, // on. Once any non-composite type is reached, there must be no remaining // (unused) indexes. auto starting_index = 4; - if (inst.opcode() == SpvOpPtrAccessChain || - inst.opcode() == SpvOpInBoundsPtrAccessChain) { + if (inst->opcode() == SpvOpPtrAccessChain || + inst->opcode() == SpvOpInBoundsPtrAccessChain) { ++starting_index; } - for (size_t i = starting_index; i < inst.words().size(); ++i) { - const uint32_t cur_word = inst.words()[i]; + for (size_t i = starting_index; i < inst->words().size(); ++i) { + const uint32_t cur_word = inst->words()[i]; // Earlier ID checks ensure that cur_word definition exists. auto cur_word_instr = _.FindDef(cur_word); // The index must be a scalar integer type (See OpAccessChain in the Spec.) auto index_type = _.FindDef(cur_word_instr->type_id()); if (!index_type || SpvOpTypeInt != index_type->opcode()) { - return _.diag(SPV_ERROR_INVALID_ID, &inst) + return _.diag(SPV_ERROR_INVALID_ID, inst) << "Indexes passed to " << instr_name << " must be of type integer."; } @@ -539,7 +906,7 @@ spv_result_t ValidateAccessChain(ValidationState_t& _, // At this point, we have fully walked down from the base using the indeces. // The type being pointed to should be the same as the result type. if (type_pointee->id() != result_type_pointee->id()) { - return _.diag(SPV_ERROR_INVALID_ID, &inst) + return _.diag(SPV_ERROR_INVALID_ID, inst) << instr_name << " result type (Op" << spvOpcodeString(static_cast(result_type_pointee->opcode())) << ") does not match the type that results from indexing into the " @@ -552,32 +919,103 @@ spv_result_t ValidateAccessChain(ValidationState_t& _, return SPV_SUCCESS; } +spv_result_t ValidatePtrAccessChain(ValidationState_t& _, + const Instruction* inst) { + if (_.addressing_model() == SpvAddressingModelLogical) { + if (!_.features().variable_pointers && + !_.features().variable_pointers_storage_buffer) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Generating variable pointers requires capability " + << "VariablePointers or VariablePointersStorageBuffer"; + } + } + return ValidateAccessChain(_, inst); +} + +spv_result_t ValidateArrayLength(ValidationState_t& state, + const Instruction* inst) { + std::string instr_name = + "Op" + std::string(spvOpcodeString(static_cast(inst->opcode()))); + + // Result type must be a 32-bit unsigned int. + auto result_type = state.FindDef(inst->type_id()); + if (result_type->opcode() != SpvOpTypeInt || + result_type->GetOperandAs(1) != 32 || + result_type->GetOperandAs(2) != 0) { + return state.diag(SPV_ERROR_INVALID_ID, inst) + << "The Result Type of " << instr_name << " '" + << state.getIdName(inst->id()) + << "' must be OpTypeInt with width 32 and signedness 0."; + } + + // The structure that is passed in must be an pointer to a structure, whose + // last element is a runtime array. + auto pointer = state.FindDef(inst->GetOperandAs(2)); + auto pointer_type = state.FindDef(pointer->type_id()); + if (pointer_type->opcode() != SpvOpTypePointer) { + return state.diag(SPV_ERROR_INVALID_ID, inst) + << "The Struture's type in " << instr_name << " '" + << state.getIdName(inst->id()) + << "' must be a pointer to an OpTypeStruct."; + } + + auto structure_type = state.FindDef(pointer_type->GetOperandAs(2)); + if (structure_type->opcode() != SpvOpTypeStruct) { + return state.diag(SPV_ERROR_INVALID_ID, inst) + << "The Struture's type in " << instr_name << " '" + << state.getIdName(inst->id()) + << "' must be a pointer to an OpTypeStruct."; + } + + auto num_of_members = structure_type->operands().size() - 1; + auto last_member = + state.FindDef(structure_type->GetOperandAs(num_of_members)); + if (last_member->opcode() != SpvOpTypeRuntimeArray) { + return state.diag(SPV_ERROR_INVALID_ID, inst) + << "The Struture's last member in " << instr_name << " '" + << state.getIdName(inst->id()) << "' must be an OpTypeRuntimeArray."; + } + + // The array member must the the index of the last element (the run time + // array). + if (inst->GetOperandAs(3) != num_of_members - 1) { + return state.diag(SPV_ERROR_INVALID_ID, inst) + << "The array member in " << instr_name << " '" + << state.getIdName(inst->id()) + << "' must be an the last member of the struct."; + } + return SPV_SUCCESS; +} + } // namespace -spv_result_t ValidateMemoryInstructions(ValidationState_t& _, - const Instruction* inst) { +spv_result_t MemoryPass(ValidationState_t& _, const Instruction* inst) { switch (inst->opcode()) { case SpvOpVariable: - if (auto error = ValidateVariable(_, *inst)) return error; + if (auto error = ValidateVariable(_, inst)) return error; break; case SpvOpLoad: - if (auto error = ValidateLoad(_, *inst)) return error; + if (auto error = ValidateLoad(_, inst)) return error; break; case SpvOpStore: - if (auto error = ValidateStore(_, *inst)) return error; + if (auto error = ValidateStore(_, inst)) return error; break; case SpvOpCopyMemory: case SpvOpCopyMemorySized: - if (auto error = ValidateCopyMemory(_, *inst)) return error; + if (auto error = ValidateCopyMemory(_, inst)) return error; + break; + case SpvOpPtrAccessChain: + if (auto error = ValidatePtrAccessChain(_, inst)) return error; break; case SpvOpAccessChain: case SpvOpInBoundsAccessChain: - case SpvOpPtrAccessChain: case SpvOpInBoundsPtrAccessChain: - if (auto error = ValidateAccessChain(_, *inst)) return error; + if (auto error = ValidateAccessChain(_, inst)) return error; + break; + case SpvOpArrayLength: + if (auto error = ValidateArrayLength(_, inst)) return error; break; case SpvOpImageTexelPointer: - case SpvOpArrayLength: case SpvOpGenericPtrMemSemantics: default: break; @@ -585,6 +1023,5 @@ spv_result_t ValidateMemoryInstructions(ValidationState_t& _, return SPV_SUCCESS; } - } // namespace val } // namespace spvtools diff --git a/3rdparty/spirv-tools/source/val/validate_memory_semantics.cpp b/3rdparty/spirv-tools/source/val/validate_memory_semantics.cpp new file mode 100644 index 000000000..f90b5e4cd --- /dev/null +++ b/3rdparty/spirv-tools/source/val/validate_memory_semantics.cpp @@ -0,0 +1,241 @@ +// Copyright (c) 2018 Google LLC. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "source/val/validate_memory_semantics.h" + +#include "source/diagnostic.h" +#include "source/spirv_target_env.h" +#include "source/util/bitutils.h" +#include "source/val/instruction.h" +#include "source/val/validation_state.h" + +namespace spvtools { +namespace val { + +spv_result_t ValidateMemorySemantics(ValidationState_t& _, + const Instruction* inst, + uint32_t operand_index) { + const SpvOp opcode = inst->opcode(); + const auto id = inst->GetOperandAs(operand_index); + bool is_int32 = false, is_const_int32 = false; + uint32_t value = 0; + std::tie(is_int32, is_const_int32, value) = _.EvalInt32IfConst(id); + + if (!is_int32) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << spvOpcodeString(opcode) + << ": expected Memory Semantics to be a 32-bit int"; + } + + if (!is_const_int32) { + if (_.HasCapability(SpvCapabilityShader)) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Memory Semantics ids must be OpConstant when Shader " + "capability is present"; + } + return SPV_SUCCESS; + } + + if (spvIsWebGPUEnv(_.context()->target_env)) { + uint32_t valid_bits = SpvMemorySemanticsAcquireMask | + SpvMemorySemanticsReleaseMask | + SpvMemorySemanticsAcquireReleaseMask | + SpvMemorySemanticsUniformMemoryMask | + SpvMemorySemanticsWorkgroupMemoryMask | + SpvMemorySemanticsImageMemoryMask | + SpvMemorySemanticsOutputMemoryKHRMask | + SpvMemorySemanticsMakeAvailableKHRMask | + SpvMemorySemanticsMakeVisibleKHRMask; + if (value & ~valid_bits) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "WebGPU spec disallows any bit masks in Memory Semantics that " + "are not Acquire, Release, AcquireRelease, UniformMemory, " + "WorkgroupMemory, ImageMemory, OutputMemoryKHR, " + "MakeAvailableKHR, or MakeVisibleKHR"; + } + } + + const size_t num_memory_order_set_bits = spvtools::utils::CountSetBits( + value & (SpvMemorySemanticsAcquireMask | SpvMemorySemanticsReleaseMask | + SpvMemorySemanticsAcquireReleaseMask | + SpvMemorySemanticsSequentiallyConsistentMask)); + + if (num_memory_order_set_bits > 1) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << spvOpcodeString(opcode) + << ": Memory Semantics can have at most one of the following " + "bits " + "set: Acquire, Release, AcquireRelease or " + "SequentiallyConsistent"; + } + + if (_.memory_model() == SpvMemoryModelVulkanKHR && + value & SpvMemorySemanticsSequentiallyConsistentMask) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "SequentiallyConsistent memory " + "semantics cannot be used with " + "the VulkanKHR memory model."; + } + + if (value & SpvMemorySemanticsMakeAvailableKHRMask && + !_.HasCapability(SpvCapabilityVulkanMemoryModelKHR)) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << spvOpcodeString(opcode) + << ": Memory Semantics MakeAvailableKHR requires capability " + << "VulkanMemoryModelKHR"; + } + + if (value & SpvMemorySemanticsMakeVisibleKHRMask && + !_.HasCapability(SpvCapabilityVulkanMemoryModelKHR)) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << spvOpcodeString(opcode) + << ": Memory Semantics MakeVisibleKHR requires capability " + << "VulkanMemoryModelKHR"; + } + + if (value & SpvMemorySemanticsOutputMemoryKHRMask && + !_.HasCapability(SpvCapabilityVulkanMemoryModelKHR)) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << spvOpcodeString(opcode) + << ": Memory Semantics OutputMemoryKHR requires capability " + << "VulkanMemoryModelKHR"; + } + + if (value & SpvMemorySemanticsUniformMemoryMask && + !_.HasCapability(SpvCapabilityShader)) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << spvOpcodeString(opcode) + << ": Memory Semantics UniformMemory requires capability Shader"; + } + + // Checking for SpvCapabilityAtomicStorage is intentionally not done here. See + // https://github.com/KhronosGroup/glslang/issues/1618 for the reasoning why. + + if (value & (SpvMemorySemanticsMakeAvailableKHRMask | + SpvMemorySemanticsMakeVisibleKHRMask)) { + const bool includes_storage_class = + value & (SpvMemorySemanticsUniformMemoryMask | + SpvMemorySemanticsSubgroupMemoryMask | + SpvMemorySemanticsWorkgroupMemoryMask | + SpvMemorySemanticsCrossWorkgroupMemoryMask | + SpvMemorySemanticsAtomicCounterMemoryMask | + SpvMemorySemanticsImageMemoryMask | + SpvMemorySemanticsOutputMemoryKHRMask); + + if (!includes_storage_class) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << spvOpcodeString(opcode) + << ": expected Memory Semantics to include a storage class"; + } + } + + if (value & SpvMemorySemanticsMakeVisibleKHRMask && + !(value & (SpvMemorySemanticsAcquireMask | + SpvMemorySemanticsAcquireReleaseMask))) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << spvOpcodeString(opcode) + << ": MakeVisibleKHR Memory Semantics also requires either Acquire " + "or AcquireRelease Memory Semantics"; + } + + if (value & SpvMemorySemanticsMakeAvailableKHRMask && + !(value & (SpvMemorySemanticsReleaseMask | + SpvMemorySemanticsAcquireReleaseMask))) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << spvOpcodeString(opcode) + << ": MakeAvailableKHR Memory Semantics also requires either " + "Release or AcquireRelease Memory Semantics"; + } + + if (spvIsVulkanEnv(_.context()->target_env)) { + const bool includes_storage_class = + value & (SpvMemorySemanticsUniformMemoryMask | + SpvMemorySemanticsWorkgroupMemoryMask | + SpvMemorySemanticsImageMemoryMask | + SpvMemorySemanticsOutputMemoryKHRMask); + + if (opcode == SpvOpMemoryBarrier && !num_memory_order_set_bits) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << spvOpcodeString(opcode) + << ": Vulkan specification requires Memory Semantics to have " + "one " + "of the following bits set: Acquire, Release, " + "AcquireRelease " + "or SequentiallyConsistent"; + } + + if (opcode == SpvOpMemoryBarrier && !includes_storage_class) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << spvOpcodeString(opcode) + << ": expected Memory Semantics to include a Vulkan-supported " + "storage class"; + } + +#if 0 + // TODO(atgoo@github.com): this check fails Vulkan CTS, reenable once fixed. + if (opcode == SpvOpControlBarrier && value && !includes_storage_class) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << spvOpcodeString(opcode) + << ": expected Memory Semantics to include a Vulkan-supported " + "storage class if Memory Semantics is not None"; + } +#endif + } + + if (opcode == SpvOpAtomicFlagClear && + (value & SpvMemorySemanticsAcquireMask || + value & SpvMemorySemanticsAcquireReleaseMask)) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Memory Semantics Acquire and AcquireRelease cannot be used " + "with " + << spvOpcodeString(opcode); + } + + if (opcode == SpvOpAtomicCompareExchange && operand_index == 5 && + (value & SpvMemorySemanticsReleaseMask || + value & SpvMemorySemanticsAcquireReleaseMask)) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << spvOpcodeString(opcode) + << ": Memory Semantics Release and AcquireRelease cannot be " + "used " + "for operand Unequal"; + } + + if (spvIsVulkanEnv(_.context()->target_env)) { + if (opcode == SpvOpAtomicLoad && + (value & SpvMemorySemanticsReleaseMask || + value & SpvMemorySemanticsAcquireReleaseMask || + value & SpvMemorySemanticsSequentiallyConsistentMask)) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Vulkan spec disallows OpAtomicLoad with Memory Semantics " + "Release, AcquireRelease and SequentiallyConsistent"; + } + + if (opcode == SpvOpAtomicStore && + (value & SpvMemorySemanticsAcquireMask || + value & SpvMemorySemanticsAcquireReleaseMask || + value & SpvMemorySemanticsSequentiallyConsistentMask)) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Vulkan spec disallows OpAtomicStore with Memory Semantics " + "Acquire, AcquireRelease and SequentiallyConsistent"; + } + } + + // TODO(atgoo@github.com) Add checks for OpenCL and OpenGL environments. + + return SPV_SUCCESS; +} + +} // namespace val +} // namespace spvtools diff --git a/3rdparty/spirv-tools/source/val/validate_memory_semantics.h b/3rdparty/spirv-tools/source/val/validate_memory_semantics.h new file mode 100644 index 000000000..72a3e1004 --- /dev/null +++ b/3rdparty/spirv-tools/source/val/validate_memory_semantics.h @@ -0,0 +1,28 @@ +// Copyright (c) 2018 Google LLC. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Validates correctness of memory semantics for SPIR-V instructions. + +#include "source/opcode.h" +#include "source/val/validate.h" + +namespace spvtools { +namespace val { + +spv_result_t ValidateMemorySemantics(ValidationState_t& _, + const Instruction* inst, + uint32_t operand_index); + +} // namespace val +} // namespace spvtools diff --git a/3rdparty/spirv-tools/source/val/validate_mode_setting.cpp b/3rdparty/spirv-tools/source/val/validate_mode_setting.cpp index 60e7c0a1d..c1bfc2740 100644 --- a/3rdparty/spirv-tools/source/val/validate_mode_setting.cpp +++ b/3rdparty/spirv-tools/source/val/validate_mode_setting.cpp @@ -17,6 +17,7 @@ #include #include "source/opcode.h" +#include "source/spirv_target_env.h" #include "source/val/instruction.h" #include "source/val/validation_state.h" @@ -53,6 +54,171 @@ spv_result_t ValidateEntryPoint(ValidationState_t& _, const Instruction* inst) { << "OpEntryPoint Entry Point '" << _.getIdName(entry_point_id) << "'s function return type is not void."; } + + const auto* execution_modes = _.GetExecutionModes(entry_point_id); + if (_.HasCapability(SpvCapabilityShader)) { + switch (execution_model) { + case SpvExecutionModelFragment: + if (execution_modes && + execution_modes->count(SpvExecutionModeOriginUpperLeft) && + execution_modes->count(SpvExecutionModeOriginLowerLeft)) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Fragment execution model entry points can only specify " + "one of OriginUpperLeft or OriginLowerLeft execution " + "modes."; + } + if (!execution_modes || + (!execution_modes->count(SpvExecutionModeOriginUpperLeft) && + !execution_modes->count(SpvExecutionModeOriginLowerLeft))) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Fragment execution model entry points require either an " + "OriginUpperLeft or OriginLowerLeft execution mode."; + } + if (execution_modes && + 1 < std::count_if(execution_modes->begin(), execution_modes->end(), + [](const SpvExecutionMode& mode) { + switch (mode) { + case SpvExecutionModeDepthGreater: + case SpvExecutionModeDepthLess: + case SpvExecutionModeDepthUnchanged: + return true; + default: + return false; + } + })) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Fragment execution model entry points can specify at most " + "one of DepthGreater, DepthLess or DepthUnchanged " + "execution modes."; + } + break; + case SpvExecutionModelTessellationControl: + case SpvExecutionModelTessellationEvaluation: + if (execution_modes && + 1 < std::count_if(execution_modes->begin(), execution_modes->end(), + [](const SpvExecutionMode& mode) { + switch (mode) { + case SpvExecutionModeSpacingEqual: + case SpvExecutionModeSpacingFractionalEven: + case SpvExecutionModeSpacingFractionalOdd: + return true; + default: + return false; + } + })) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Tessellation execution model entry points can specify at " + "most one of SpacingEqual, SpacingFractionalOdd or " + "SpacingFractionalEven execution modes."; + } + if (execution_modes && + 1 < std::count_if(execution_modes->begin(), execution_modes->end(), + [](const SpvExecutionMode& mode) { + switch (mode) { + case SpvExecutionModeTriangles: + case SpvExecutionModeQuads: + case SpvExecutionModeIsolines: + return true; + default: + return false; + } + })) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Tessellation execution model entry points can specify at " + "most one of Triangles, Quads or Isolines execution modes."; + } + if (execution_modes && + 1 < std::count_if(execution_modes->begin(), execution_modes->end(), + [](const SpvExecutionMode& mode) { + switch (mode) { + case SpvExecutionModeVertexOrderCw: + case SpvExecutionModeVertexOrderCcw: + return true; + default: + return false; + } + })) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Tessellation execution model entry points can specify at " + "most one of VertexOrderCw or VertexOrderCcw execution " + "modes."; + } + break; + case SpvExecutionModelGeometry: + if (!execution_modes || + 1 != std::count_if(execution_modes->begin(), execution_modes->end(), + [](const SpvExecutionMode& mode) { + switch (mode) { + case SpvExecutionModeInputPoints: + case SpvExecutionModeInputLines: + case SpvExecutionModeInputLinesAdjacency: + case SpvExecutionModeTriangles: + case SpvExecutionModeInputTrianglesAdjacency: + return true; + default: + return false; + } + })) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Geometry execution model entry points must specify " + "exactly one of InputPoints, InputLines, " + "InputLinesAdjacency, Triangles or InputTrianglesAdjacency " + "execution modes."; + } + if (!execution_modes || + 1 != std::count_if(execution_modes->begin(), execution_modes->end(), + [](const SpvExecutionMode& mode) { + switch (mode) { + case SpvExecutionModeOutputPoints: + case SpvExecutionModeOutputLineStrip: + case SpvExecutionModeOutputTriangleStrip: + return true; + default: + return false; + } + })) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Geometry execution model entry points must specify " + "exactly one of OutputPoints, OutputLineStrip or " + "OutputTriangleStrip execution modes."; + } + break; + default: + break; + } + } + + if (spvIsVulkanEnv(_.context()->target_env)) { + switch (execution_model) { + case SpvExecutionModelGLCompute: + if (!execution_modes || + !execution_modes->count(SpvExecutionModeLocalSize)) { + bool ok = false; + for (auto& i : _.ordered_instructions()) { + if (i.opcode() == SpvOpDecorate) { + if (i.operands().size() > 2) { + if (i.GetOperandAs(1) == SpvDecorationBuiltIn && + i.GetOperandAs(2) == SpvBuiltInWorkgroupSize) { + ok = true; + break; + } + } + } + } + if (!ok) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "In the Vulkan environment, GLCompute execution model " + "entry points require either the LocalSize execution " + "mode or an object decorated with WorkgroupSize must be " + "specified."; + } + } + break; + default: + break; + } + } + return SPV_SUCCESS; } @@ -68,6 +234,183 @@ spv_result_t ValidateExecutionMode(ValidationState_t& _, << "' is not the Entry Point " "operand of an OpEntryPoint."; } + + const auto mode = inst->GetOperandAs(1); + const auto* models = _.GetExecutionModels(entry_point_id); + switch (mode) { + case SpvExecutionModeInvocations: + case SpvExecutionModeInputPoints: + case SpvExecutionModeInputLines: + case SpvExecutionModeInputLinesAdjacency: + case SpvExecutionModeInputTrianglesAdjacency: + case SpvExecutionModeOutputLineStrip: + case SpvExecutionModeOutputTriangleStrip: + if (!std::all_of(models->begin(), models->end(), + [](const SpvExecutionModel& model) { + return model == SpvExecutionModelGeometry; + })) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Execution mode can only be used with the Geometry execution " + "model."; + } + break; + case SpvExecutionModeOutputPoints: + if (!std::all_of(models->begin(), models->end(), + [&_](const SpvExecutionModel& model) { + switch (model) { + case SpvExecutionModelGeometry: + return true; + case SpvExecutionModelMeshNV: + return _.HasCapability(SpvCapabilityMeshShadingNV); + default: + return false; + } + })) { + if (_.HasCapability(SpvCapabilityMeshShadingNV)) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Execution mode can only be used with the Geometry or " + "MeshNV execution model."; + } else { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Execution mode can only be used with the Geometry " + "execution " + "model."; + } + } + break; + case SpvExecutionModeSpacingEqual: + case SpvExecutionModeSpacingFractionalEven: + case SpvExecutionModeSpacingFractionalOdd: + case SpvExecutionModeVertexOrderCw: + case SpvExecutionModeVertexOrderCcw: + case SpvExecutionModePointMode: + case SpvExecutionModeQuads: + case SpvExecutionModeIsolines: + if (!std::all_of( + models->begin(), models->end(), + [](const SpvExecutionModel& model) { + return (model == SpvExecutionModelTessellationControl) || + (model == SpvExecutionModelTessellationEvaluation); + })) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Execution mode can only be used with a tessellation " + "execution model."; + } + break; + case SpvExecutionModeTriangles: + if (!std::all_of(models->begin(), models->end(), + [](const SpvExecutionModel& model) { + switch (model) { + case SpvExecutionModelGeometry: + case SpvExecutionModelTessellationControl: + case SpvExecutionModelTessellationEvaluation: + return true; + default: + return false; + } + })) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Execution mode can only be used with a Geometry or " + "tessellation execution model."; + } + break; + case SpvExecutionModeOutputVertices: + if (!std::all_of(models->begin(), models->end(), + [&_](const SpvExecutionModel& model) { + switch (model) { + case SpvExecutionModelGeometry: + case SpvExecutionModelTessellationControl: + case SpvExecutionModelTessellationEvaluation: + return true; + case SpvExecutionModelMeshNV: + return _.HasCapability(SpvCapabilityMeshShadingNV); + default: + return false; + } + })) { + if (_.HasCapability(SpvCapabilityMeshShadingNV)) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Execution mode can only be used with a Geometry, " + "tessellation or MeshNV execution model."; + } else { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Execution mode can only be used with a Geometry or " + "tessellation execution model."; + } + } + break; + case SpvExecutionModePixelCenterInteger: + case SpvExecutionModeOriginUpperLeft: + case SpvExecutionModeOriginLowerLeft: + case SpvExecutionModeEarlyFragmentTests: + case SpvExecutionModeDepthReplacing: + case SpvExecutionModeDepthLess: + case SpvExecutionModeDepthUnchanged: + if (!std::all_of(models->begin(), models->end(), + [](const SpvExecutionModel& model) { + return model == SpvExecutionModelFragment; + })) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Execution mode can only be used with the Fragment execution " + "model."; + } + break; + case SpvExecutionModeLocalSizeHint: + case SpvExecutionModeVecTypeHint: + case SpvExecutionModeContractionOff: + case SpvExecutionModeLocalSizeHintId: + if (!std::all_of(models->begin(), models->end(), + [](const SpvExecutionModel& model) { + return model == SpvExecutionModelKernel; + })) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Execution mode can only be used with the Kernel execution " + "model."; + } + break; + case SpvExecutionModeLocalSize: + case SpvExecutionModeLocalSizeId: + if (!std::all_of(models->begin(), models->end(), + [&_](const SpvExecutionModel& model) { + switch (model) { + case SpvExecutionModelKernel: + case SpvExecutionModelGLCompute: + return true; + case SpvExecutionModelTaskNV: + case SpvExecutionModelMeshNV: + return _.HasCapability(SpvCapabilityMeshShadingNV); + default: + return false; + } + })) { + if (_.HasCapability(SpvCapabilityMeshShadingNV)) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Execution mode can only be used with a Kernel, GLCompute, " + "MeshNV, or TaskNV execution model."; + } else { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Execution mode can only be used with a Kernel or " + "GLCompute " + "execution model."; + } + } + default: + break; + } + + if (spvIsVulkanEnv(_.context()->target_env)) { + if (mode == SpvExecutionModeOriginLowerLeft) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "In the Vulkan environment, the OriginLowerLeft execution mode " + "must not be used."; + } + if (mode == SpvExecutionModePixelCenterInteger) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "In the Vulkan environment, the PixelCenterInteger execution " + "mode must not be used."; + } + } + return SPV_SUCCESS; } @@ -79,6 +422,7 @@ spv_result_t ModeSettingPass(ValidationState_t& _, const Instruction* inst) { if (auto error = ValidateEntryPoint(_, inst)) return error; break; case SpvOpExecutionMode: + case SpvOpExecutionModeId: if (auto error = ValidateExecutionMode(_, inst)) return error; break; default: diff --git a/3rdparty/spirv-tools/source/val/validate_non_uniform.cpp b/3rdparty/spirv-tools/source/val/validate_non_uniform.cpp index 89e82c616..8dcf9743f 100644 --- a/3rdparty/spirv-tools/source/val/validate_non_uniform.cpp +++ b/3rdparty/spirv-tools/source/val/validate_non_uniform.cpp @@ -22,44 +22,31 @@ #include "source/spirv_target_env.h" #include "source/util/bitutils.h" #include "source/val/instruction.h" +#include "source/val/validate_scopes.h" #include "source/val/validation_state.h" namespace spvtools { namespace val { namespace { -spv_result_t ValidateExecutionScope(ValidationState_t& _, - const Instruction* inst, uint32_t scope) { - SpvOp opcode = inst->opcode(); - bool is_int32 = false, is_const_int32 = false; - uint32_t value = 0; - std::tie(is_int32, is_const_int32, value) = _.EvalInt32IfConst(scope); +spv_result_t ValidateGroupNonUniformBallotBitCount(ValidationState_t& _, + const Instruction* inst) { + // Scope is already checked by ValidateExecutionScope() above. - if (!is_int32) { + const uint32_t result_type = inst->type_id(); + if (!_.IsUnsignedIntScalarType(result_type)) { return _.diag(SPV_ERROR_INVALID_DATA, inst) - << spvOpcodeString(opcode) - << ": expected Execution Scope to be a 32-bit int"; + << "Expected Result Type to be an unsigned integer type scalar."; } - if (!is_const_int32) { - return SPV_SUCCESS; + const auto value = inst->GetOperandAs(4); + const auto value_type = _.FindDef(value)->type_id(); + if (!_.IsUnsignedIntVectorType(value_type) || + _.GetDimension(value_type) != 4) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) << "Expected Value to be a " + "vector of four components " + "of integer type scalar"; } - - if (spvIsVulkanEnv(_.context()->target_env) && - _.context()->target_env != SPV_ENV_VULKAN_1_0 && - value != SpvScopeSubgroup) { - return _.diag(SPV_ERROR_INVALID_DATA, inst) - << spvOpcodeString(opcode) - << ": in Vulkan environment Execution scope is limited to " - "Subgroup"; - } - - if (value != SpvScopeSubgroup && value != SpvScopeWorkgroup) { - return _.diag(SPV_ERROR_INVALID_DATA, inst) - << spvOpcodeString(opcode) - << ": Execution scope is limited to Subgroup or Workgroup"; - } - return SPV_SUCCESS; } @@ -76,6 +63,13 @@ spv_result_t NonUniformPass(ValidationState_t& _, const Instruction* inst) { } } + switch (opcode) { + case SpvOpGroupNonUniformBallotBitCount: + return ValidateGroupNonUniformBallotBitCount(_, inst); + default: + break; + } + return SPV_SUCCESS; } diff --git a/3rdparty/spirv-tools/source/val/validate_scopes.cpp b/3rdparty/spirv-tools/source/val/validate_scopes.cpp new file mode 100644 index 000000000..3ba8f3bf9 --- /dev/null +++ b/3rdparty/spirv-tools/source/val/validate_scopes.cpp @@ -0,0 +1,195 @@ +// Copyright (c) 2018 Google LLC. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "source/val/validate_scopes.h" + +#include "source/diagnostic.h" +#include "source/spirv_target_env.h" +#include "source/val/instruction.h" +#include "source/val/validation_state.h" + +namespace spvtools { +namespace val { + +spv_result_t ValidateExecutionScope(ValidationState_t& _, + const Instruction* inst, uint32_t scope) { + SpvOp opcode = inst->opcode(); + bool is_int32 = false, is_const_int32 = false; + uint32_t value = 0; + std::tie(is_int32, is_const_int32, value) = _.EvalInt32IfConst(scope); + + if (!is_int32) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << spvOpcodeString(opcode) + << ": expected Execution Scope to be a 32-bit int"; + } + + if (!is_const_int32) { + if (_.HasCapability(SpvCapabilityShader)) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) << "Scope ids must be " + "OpConstant when Shader " + "capability is present"; + } + return SPV_SUCCESS; + } + + // Vulkan specific rules + if (spvIsVulkanEnv(_.context()->target_env)) { + // Vulkan 1.1 specific rules + if (_.context()->target_env != SPV_ENV_VULKAN_1_0) { + // Scope for Non Uniform Group Operations must be limited to Subgroup + if (spvOpcodeIsNonUniformGroupOperation(opcode) && + value != SpvScopeSubgroup) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << spvOpcodeString(opcode) + << ": in Vulkan environment Execution scope is limited to " + "Subgroup"; + } + } + + // If OpControlBarrier is used in fragment, vertex, tessellation evaluation, + // or geometry stages, the execution Scope must be Subgroup. + if (opcode == SpvOpControlBarrier && value != SpvScopeSubgroup) { + _.function(inst->function()->id()) + ->RegisterExecutionModelLimitation([](SpvExecutionModel model, + std::string* message) { + if (model == SpvExecutionModelFragment || + model == SpvExecutionModelVertex || + model == SpvExecutionModelGeometry || + model == SpvExecutionModelTessellationEvaluation) { + if (message) { + *message = + "in Vulkan evironment, OpControlBarrier execution scope " + "must be Subgroup for Fragment, Vertex, Geometry and " + "TessellationEvaluation execution models"; + } + return false; + } + return true; + }); + } + + // Vulkan generic rules + // Scope for execution must be limited to Workgroup or Subgroup + if (value != SpvScopeWorkgroup && value != SpvScopeSubgroup) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << spvOpcodeString(opcode) + << ": in Vulkan environment Execution Scope is limited to " + "Workgroup and Subgroup"; + } + } + + // WebGPU Specific rules + if (spvIsWebGPUEnv(_.context()->target_env)) { + // Scope for execution must be limited to Workgroup or Subgroup + if (value != SpvScopeWorkgroup && value != SpvScopeSubgroup) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << spvOpcodeString(opcode) + << ": in WebGPU environment Execution Scope is limited to " + "Workgroup and Subgroup"; + } + } + + // TODO(atgoo@github.com) Add checks for OpenCL and OpenGL environments. + + // General SPIRV rules + // Scope for execution must be limited to Workgroup or Subgroup for + // non-uniform operations + if (spvOpcodeIsNonUniformGroupOperation(opcode) && + value != SpvScopeSubgroup && value != SpvScopeWorkgroup) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << spvOpcodeString(opcode) + << ": Execution scope is limited to Subgroup or Workgroup"; + } + + return SPV_SUCCESS; +} + +spv_result_t ValidateMemoryScope(ValidationState_t& _, const Instruction* inst, + uint32_t scope) { + const SpvOp opcode = inst->opcode(); + bool is_int32 = false, is_const_int32 = false; + uint32_t value = 0; + std::tie(is_int32, is_const_int32, value) = _.EvalInt32IfConst(scope); + + if (!is_int32) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << spvOpcodeString(opcode) + << ": expected Memory Scope to be a 32-bit int"; + } + + if (!is_const_int32) { + if (_.HasCapability(SpvCapabilityShader)) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) << "Scope ids must be " + "OpConstant when Shader " + "capability is present"; + } + return SPV_SUCCESS; + } + + if (value == SpvScopeQueueFamilyKHR) { + if (_.HasCapability(SpvCapabilityVulkanMemoryModelKHR)) { + return SPV_SUCCESS; + } else { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << spvOpcodeString(opcode) + << ": Memory Scope QueueFamilyKHR requires capability " + "VulkanMemoryModelKHR"; + } + } + + if (value == SpvScopeDevice && + _.HasCapability(SpvCapabilityVulkanMemoryModelKHR) && + !_.HasCapability(SpvCapabilityVulkanMemoryModelDeviceScopeKHR)) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << "Use of device scope with VulkanKHR memory model requires the " + "VulkanMemoryModelDeviceScopeKHR capability"; + } + + // Vulkan Specific rules + if (spvIsVulkanEnv(_.context()->target_env)) { + if (value == SpvScopeCrossDevice) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << spvOpcodeString(opcode) + << ": in Vulkan environment, Memory Scope cannot be CrossDevice"; + } + // Vulkan 1.0 specifc rules + if (_.context()->target_env == SPV_ENV_VULKAN_1_0 && + value != SpvScopeDevice && value != SpvScopeWorkgroup && + value != SpvScopeInvocation) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << spvOpcodeString(opcode) + << ": in Vulkan 1.0 environment Memory Scope is limited to " + "Device, " + "Workgroup and Invocation"; + } + // Vulkan 1.1 specifc rules + if (_.context()->target_env == SPV_ENV_VULKAN_1_1 && + value != SpvScopeDevice && value != SpvScopeWorkgroup && + value != SpvScopeSubgroup && value != SpvScopeInvocation) { + return _.diag(SPV_ERROR_INVALID_DATA, inst) + << spvOpcodeString(opcode) + << ": in Vulkan 1.1 environment Memory Scope is limited to " + "Device, " + "Workgroup and Invocation"; + } + } + + // TODO(atgoo@github.com) Add checks for OpenCL and OpenGL environments. + + return SPV_SUCCESS; +} + +} // namespace val +} // namespace spvtools diff --git a/3rdparty/spirv-tools/source/val/validate_scopes.h b/3rdparty/spirv-tools/source/val/validate_scopes.h new file mode 100644 index 000000000..311ca7ff2 --- /dev/null +++ b/3rdparty/spirv-tools/source/val/validate_scopes.h @@ -0,0 +1,30 @@ +// Copyright (c) 2018 Google LLC. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Validates correctness of scopes for SPIR-V instructions. + +#include "source/opcode.h" +#include "source/val/validate.h" + +namespace spvtools { +namespace val { + +spv_result_t ValidateExecutionScope(ValidationState_t& _, + const Instruction* inst, uint32_t scope); + +spv_result_t ValidateMemoryScope(ValidationState_t& _, const Instruction* inst, + uint32_t scope); + +} // namespace val +} // namespace spvtools diff --git a/3rdparty/spirv-tools/source/val/validate_type.cpp b/3rdparty/spirv-tools/source/val/validate_type.cpp index b6942272e..e0f278636 100644 --- a/3rdparty/spirv-tools/source/val/validate_type.cpp +++ b/3rdparty/spirv-tools/source/val/validate_type.cpp @@ -99,6 +99,13 @@ spv_result_t ValidateTypeArray(ValidationState_t& _, const Instruction* inst) { << "OpTypeArray Element Type '" << _.getIdName(element_type_id) << "' is not a type."; } + + if (element_type->opcode() == SpvOpTypeVoid) { + return _.diag(SPV_ERROR_INVALID_ID, inst) + << "OpTypeArray Element Type '" << _.getIdName(element_type_id) + << "' is a void type."; + } + const auto length_index = 2; const auto length_id = inst->GetOperandAs(length_index); const auto length = _.FindDef(length_id); @@ -147,6 +154,13 @@ spv_result_t ValidateTypeRuntimeArray(ValidationState_t& _, << "OpTypeRuntimeArray Element Type '" << _.getIdName(element_id) << "' is not a type."; } + + if (element_type->opcode() == SpvOpTypeVoid) { + return _.diag(SPV_ERROR_INVALID_ID, inst) + << "OpTypeRuntimeArray Element Type '" + << _.getIdName(element_id) << "' is a void type."; + } + return SPV_SUCCESS; } @@ -177,11 +191,6 @@ spv_result_t ValidateTypeStruct(ValidationState_t& _, const Instruction* inst) { << _.getIdName(member_type_id) << "."; } if (_.IsForwardPointer(member_type_id)) { - if (member_type->opcode() != SpvOpTypePointer) { - return _.diag(SPV_ERROR_INVALID_ID, inst) - << "Found a forward reference to a non-pointer " - "type in OpTypeStruct instruction."; - } // If we're dealing with a forward pointer: // Find out the type that the pointer is pointing to (must be struct) // word 3 is the of the type being pointed to. @@ -252,6 +261,12 @@ spv_result_t ValidateTypeFunction(ValidationState_t& _, << "OpTypeFunction Parameter Type '" << _.getIdName(param_id) << "' is not a type."; } + + if (param_type->opcode() == SpvOpTypeVoid) { + return _.diag(SPV_ERROR_INVALID_ID, inst) + << "OpTypeFunction Parameter Type '" << _.getIdName(param_id) + << "' cannot be OpTypeVoid."; + } } const uint32_t num_function_args_limit = _.options()->universal_limits_.max_function_args; @@ -276,10 +291,32 @@ spv_result_t ValidateTypeFunction(ValidationState_t& _, return SPV_SUCCESS; } +spv_result_t ValidateTypeForwardPointer(ValidationState_t& _, + const Instruction* inst) { + const auto pointer_type_id = inst->GetOperandAs(0); + const auto pointer_type_inst = _.FindDef(pointer_type_id); + if (pointer_type_inst->opcode() != SpvOpTypePointer) { + return _.diag(SPV_ERROR_INVALID_ID, inst) + << "Pointer type in OpTypeForwardPointer is not a pointer type."; + } + + if (inst->GetOperandAs(1) != + pointer_type_inst->GetOperandAs(1)) { + return _.diag(SPV_ERROR_INVALID_ID, inst) + << "Storage class in OpTypeForwardPointer does not match the " + "pointer definition."; + } + + return SPV_SUCCESS; +} + } // namespace spv_result_t TypePass(ValidationState_t& _, const Instruction* inst) { - if (!spvOpcodeGeneratesType(inst->opcode())) return SPV_SUCCESS; + if (!spvOpcodeGeneratesType(inst->opcode()) && + inst->opcode() != SpvOpTypeForwardPointer) { + return SPV_SUCCESS; + } if (auto error = ValidateUniqueness(_, inst)) return error; @@ -305,6 +342,9 @@ spv_result_t TypePass(ValidationState_t& _, const Instruction* inst) { case SpvOpTypeFunction: if (auto error = ValidateTypeFunction(_, inst)) return error; break; + case SpvOpTypeForwardPointer: + if (auto error = ValidateTypeForwardPointer(_, inst)) return error; + break; default: break; } diff --git a/3rdparty/spirv-tools/source/val/validation_state.cpp b/3rdparty/spirv-tools/source/val/validation_state.cpp index dec25b1c3..a10186fb5 100644 --- a/3rdparty/spirv-tools/source/val/validation_state.cpp +++ b/3rdparty/spirv-tools/source/val/validation_state.cpp @@ -151,7 +151,8 @@ spv_result_t CountInstructions(void* user_data, ValidationState_t::ValidationState_t(const spv_const_context ctx, const spv_const_validator_options opt, const uint32_t* words, - const size_t num_words) + const size_t num_words, + const uint32_t max_warnings) : context_(ctx), options_(opt), words_(words), @@ -170,7 +171,9 @@ ValidationState_t::ValidationState_t(const spv_const_context ctx, grammar_(ctx), addressing_model_(SpvAddressingModelMax), memory_model_(SpvMemoryModelMax), - in_function_(false) { + in_function_(false), + num_of_warnings_(0), + max_num_of_warnings_(max_warnings) { assert(opt && "Validator options may not be Null."); const auto env = context_->target_env; @@ -194,11 +197,21 @@ ValidationState_t::ValidationState_t(const spv_const_context ctx, // fail and generate an error. if (num_words > 0) { // Count the number of instructions in the binary. - spvBinaryParse(ctx, this, words, num_words, + // This parse should not produce any error messages. Hijack the context and + // replace the message consumer so that we do not pollute any state in input + // consumer. + spv_context_t hijacked_context = *ctx; + hijacked_context.consumer = [](spv_message_level_t, const char*, + const spv_position_t&, const char*) {}; + spvBinaryParse(&hijacked_context, this, words, num_words, /* parsed_header = */ nullptr, CountInstructions, /* diagnostic = */ nullptr); preallocateStorage(); } + + friendly_mapper_ = spvtools::MakeUnique( + context_, words_, num_words_); + name_mapper_ = friendly_mapper_->GetNameMapper(); } void ValidationState_t::preallocateStorage() { @@ -230,21 +243,10 @@ void ValidationState_t::AssignNameToId(uint32_t id, std::string name) { } std::string ValidationState_t::getIdName(uint32_t id) const { - std::stringstream out; - out << id; - if (operand_names_.find(id) != end(operand_names_)) { - out << "[" << operand_names_.at(id) << "]"; - } - return out.str(); -} + const std::string id_name = name_mapper_(id); -std::string ValidationState_t::getIdOrName(uint32_t id) const { std::stringstream out; - if (operand_names_.find(id) != std::end(operand_names_)) { - out << operand_names_.at(id); - } else { - out << id; - } + out << id << "[%" << id_name << "]"; return out.str(); } @@ -291,7 +293,18 @@ bool ValidationState_t::IsOpcodeInCurrentLayoutSection(SpvOp op) { } DiagnosticStream ValidationState_t::diag(spv_result_t error_code, - const Instruction* inst) const { + const Instruction* inst) { + if (error_code == SPV_WARNING) { + if (num_of_warnings_ == max_num_of_warnings_) { + DiagnosticStream({0, 0, 0}, context_->consumer, "", error_code) + << "Other warnings have been suppressed.\n"; + } + if (num_of_warnings_ >= max_num_of_warnings_) { + return DiagnosticStream({0, 0, 0}, nullptr, "", error_code); + } + ++num_of_warnings_; + } + std::string disassembly; if (inst) disassembly = Disassemble(*inst); @@ -351,6 +364,9 @@ void ValidationState_t::RegisterCapability(SpvCapability cap) { features_.group_ops_reduce_and_scans = true; break; case SpvCapabilityInt8: + features_.use_int8_type = true; + features_.declare_int8_type = true; + break; case SpvCapabilityStorageBuffer8BitAccess: case SpvCapabilityUniformAndStorageBuffer8BitAccess: case SpvCapabilityStoragePushConstant8: @@ -390,6 +406,7 @@ void ValidationState_t::RegisterExtension(Extension ext) { switch (ext) { case kSPV_AMD_gpu_shader_half_float: + case kSPV_AMD_gpu_shader_half_float_fetch: // SPV_AMD_gpu_shader_half_float enables float16 type. // https://github.com/KhronosGroup/SPIRV-Tools/issues/1375 features_.declare_float16_type = true; @@ -864,10 +881,17 @@ std::tuple ValidationState_t::EvalInt32IfConst( return std::make_tuple(false, false, 0); } - if (inst->opcode() != SpvOpConstant && inst->opcode() != SpvOpSpecConstant) { + // Spec constant values cannot be evaluated so don't consider constant for + // the purpose of this method. + if (!spvOpcodeIsConstant(inst->opcode()) || + spvOpcodeIsSpecConstant(inst->opcode())) { return std::make_tuple(true, false, 0); } + if (inst->opcode() == SpvOpConstantNull) { + return std::make_tuple(true, true, 0); + } + assert(inst->words().size() == 4); return std::make_tuple(true, true, inst->word(3)); } @@ -895,6 +919,39 @@ void ValidationState_t::ComputeFunctionToEntryPointMapping() { } } +void ValidationState_t::ComputeRecursiveEntryPoints() { + for (const Function func : functions()) { + std::stack call_stack; + std::set visited; + + for (const uint32_t new_call : func.function_call_targets()) { + call_stack.push(new_call); + } + + while (!call_stack.empty()) { + const uint32_t called_func_id = call_stack.top(); + call_stack.pop(); + + if (!visited.insert(called_func_id).second) continue; + + if (called_func_id == func.id()) { + for (const uint32_t entry_point : + function_to_entry_points_[called_func_id]) + recursive_entry_points_.insert(entry_point); + break; + } + + const Function* called_func = function(called_func_id); + if (called_func) { + // Other checks should error out on this invalid SPIR-V. + for (const uint32_t new_call : called_func->function_call_targets()) { + call_stack.push(new_call); + } + } + } + } +} + const std::vector& ValidationState_t::FunctionEntryPoints( uint32_t func) const { auto iter = function_to_entry_points_.find(func); @@ -905,6 +962,34 @@ const std::vector& ValidationState_t::FunctionEntryPoints( } } +std::set ValidationState_t::EntryPointReferences(uint32_t id) const { + std::set referenced_entry_points; + const auto inst = FindDef(id); + if (!inst) return referenced_entry_points; + + std::vector stack; + stack.push_back(inst); + while (!stack.empty()) { + const auto current_inst = stack.back(); + stack.pop_back(); + + if (const auto func = current_inst->function()) { + // Instruction lives in a function, we can stop searching. + const auto function_entry_points = FunctionEntryPoints(func->id()); + referenced_entry_points.insert(function_entry_points.begin(), + function_entry_points.end()); + } else { + // Instruction is in the global scope, keep searching its uses. + for (auto pair : current_inst->uses()) { + const auto next_inst = pair.first; + stack.push_back(next_inst); + } + } + } + + return referenced_entry_points; +} + std::string ValidationState_t::Disassemble(const Instruction& inst) const { const spv_parsed_instruction_t& c_inst(inst.c_inst()); return Disassemble(c_inst.words, c_inst.num_words); diff --git a/3rdparty/spirv-tools/source/val/validation_state.h b/3rdparty/spirv-tools/source/val/validation_state.h index 8c8b53196..85229f2da 100644 --- a/3rdparty/spirv-tools/source/val/validation_state.h +++ b/3rdparty/spirv-tools/source/val/validation_state.h @@ -28,6 +28,7 @@ #include "source/disassemble.h" #include "source/enum_set.h" #include "source/latest_version_spirv_header.h" +#include "source/name_mapper.h" #include "source/spirv_definition.h" #include "source/spirv_validator_options.h" #include "source/val/decoration.h" @@ -86,11 +87,29 @@ class ValidationState_t { // Target environment uses relaxed block layout. // This is true for Vulkan 1.1 or later. bool env_relaxed_block_layout = false; + + // Allow an OpTypeInt with 8 bit width to be used in more than just int + // conversion opcodes + bool use_int8_type = false; + + // Use scalar block layout. See VK_EXT_scalar_block_layout: + // Defines scalar alignment: + // - scalar alignment equals the scalar size in bytes + // - array alignment is same as its element alignment + // - array alignment is max alignment of any of its members + // - vector alignment is same as component alignment + // - matrix alignment is same as component alignment + // For struct in Uniform, StorageBuffer, PushConstant: + // - Offset of a member is multiple of scalar alignment of that member + // - ArrayStride and MatrixStride are multiples of scalar alignment + // Members need not be listed in offset order + bool scalar_block_layout = false; }; ValidationState_t(const spv_const_context context, const spv_const_validator_options opt, - const uint32_t* words, const size_t num_words); + const uint32_t* words, const size_t num_words, + const uint32_t max_warnings); /// Returns the context spv_const_context context() const { return context_; } @@ -136,9 +155,6 @@ class ValidationState_t { /// Mutator function for ID bound. void setIdBound(uint32_t bound); - /// Like getIdName but does not display the id if the \p id has a name - std::string getIdOrName(uint32_t id) const; - /// Returns the number of ID which have been forward referenced but not /// defined size_t unresolved_forward_id_count() const; @@ -169,7 +185,7 @@ class ValidationState_t { /// Determines if the op instruction is part of the current section bool IsOpcodeInCurrentLayoutSection(SpvOp op); - DiagnosticStream diag(spv_result_t error_code, const Instruction* inst) const; + DiagnosticStream diag(spv_result_t error_code, const Instruction* inst); /// Returns the function states std::vector& functions(); @@ -206,6 +222,12 @@ class ValidationState_t { /// Returns a list of entry point function ids const std::vector& entry_points() const { return entry_points_; } + /// Returns the set of entry points that root call graphs that contain + /// recursion. + const std::set& recursive_entry_points() const { + return recursive_entry_points_; + } + /// Registers execution mode for the given entry point. void RegisterExecutionModeForEntryPoint(uint32_t entry_point, SpvExecutionMode execution_mode) { @@ -245,9 +267,19 @@ class ValidationState_t { /// Note: called after fully parsing the binary. void ComputeFunctionToEntryPointMapping(); + /// Traverse call tree and computes recursive_entry_points_. + /// Note: called after fully parsing the binary and calling + /// ComputeFunctionToEntryPointMapping. + void ComputeRecursiveEntryPoints(); + /// Returns all the entry points that can call |func|. const std::vector& FunctionEntryPoints(uint32_t func) const; + /// Returns all the entry points that statically use |id|. + /// + /// Note: requires ComputeFunctionToEntryPointMapping to have been called. + std::set EntryPointReferences(uint32_t id) const; + /// Inserts an to the set of functions that are target of OpFunctionCall. void AddFunctionCallTarget(const uint32_t id) { function_call_targets_.insert(id); @@ -259,6 +291,9 @@ class ValidationState_t { return (function_call_targets_.find(id) != function_call_targets_.end()); } + bool IsFunctionCallDefined(const uint32_t id) { + return (id_to_function_.find(id) != id_to_function_.end()); + } /// Registers the capability and its dependent capabilities void RegisterCapability(SpvCapability cap); @@ -513,6 +548,8 @@ class ValidationState_t { // Tries to evaluate a 32-bit signed or unsigned scalar integer constant. // Returns tuple . + // OpSpecConstant* return |is_const_int32| as false since their values cannot + // be relied upon during validation. std::tuple EvalInt32IfConst(uint32_t id); // Returns the disassembly string for the given instruction. @@ -584,6 +621,10 @@ class ValidationState_t { std::unordered_map> entry_point_descriptions_; + /// IDs that are entry points, ie, arguments to OpEntryPoint, and root a call + /// graph that recurses. + std::set recursive_entry_points_; + /// Functions IDs that are target of OpFunctionCall. std::unordered_set function_call_targets_; @@ -640,6 +681,14 @@ class ValidationState_t { /// module which can (indirectly) call the function. std::unordered_map> function_to_entry_points_; const std::vector empty_ids_; + + /// Maps ids to friendly names. + std::unique_ptr friendly_mapper_; + spvtools::NameMapper name_mapper_; + + /// Variables used to reduce the number of diagnostic messages. + uint32_t num_of_warnings_; + uint32_t max_num_of_warnings_; }; } // namespace val diff --git a/3rdparty/spirv-tools/test/CMakeLists.txt b/3rdparty/spirv-tools/test/CMakeLists.txt index 1fdf5a212..9226ea7f7 100644 --- a/3rdparty/spirv-tools/test/CMakeLists.txt +++ b/3rdparty/spirv-tools/test/CMakeLists.txt @@ -30,12 +30,16 @@ endif() function(add_spvtools_unittest) if (NOT "${SPIRV_SKIP_TESTS}" AND TARGET gmock_main) - set(one_value_args TARGET) + set(one_value_args TARGET PCH_FILE) set(multi_value_args SRCS LIBS ENVIRONMENT) cmake_parse_arguments( ARG "" "${one_value_args}" "${multi_value_args}" ${ARGN}) set(target test_${ARG_TARGET}) - add_executable(${target} ${ARG_SRCS}) + set(SRC_COPY ${ARG_SRCS}) + if (DEFINED ARG_PCH_FILE) + spvtools_pch(SRC_COPY ${ARG_PCH_FILE}) + endif() + add_executable(${target} ${SRC_COPY}) spvtools_default_compile_options(${target}) if(${COMPILER_IS_LIKE_GNU}) target_compile_options(${target} PRIVATE -Wno-undef) @@ -93,6 +97,7 @@ set(TEST_SOURCES binary_to_text_test.cpp binary_to_text.literal_test.cpp comment_test.cpp + diagnostic_test.cpp enum_string_mapping_test.cpp enum_set_test.cpp ext_inst.debuginfo_test.cpp @@ -103,6 +108,7 @@ set(TEST_SOURCES hex_float_test.cpp immediate_int_test.cpp libspirv_macros_test.cpp + log_test.cpp named_id_test.cpp name_mapper_test.cpp opcode_make_test.cpp @@ -112,7 +118,10 @@ set(TEST_SOURCES operand_capabilities_test.cpp operand_test.cpp operand_pattern_test.cpp + parse_number_test.cpp + preserve_numeric_ids_test.cpp software_version_test.cpp + string_utils_test.cpp target_env_test.cpp text_advance_test.cpp text_destroy_test.cpp @@ -142,16 +151,13 @@ set(TEST_SOURCES unit_spirv.cpp ) +spvtools_pch(TEST_SOURCES pch_test) + add_spvtools_unittest( TARGET spirv_unit_tests SRCS ${TEST_SOURCES} LIBS ${SPIRV_TOOLS}) -add_spvtools_unittest( - TARGET diagnostic - SRCS diagnostic_test.cpp - LIBS ${SPIRV_TOOLS}) - add_spvtools_unittest( TARGET c_interface SRCS c_interface_test.cpp @@ -168,16 +174,6 @@ add_spvtools_unittest( SRCS cpp_interface_test.cpp LIBS SPIRV-Tools-opt) -add_spvtools_unittest( - TARGET parse_number - SRCS parse_number_test.cpp - LIBS ${SPIRV_TOOLS}) - -add_spvtools_unittest( - TARGET string_utils - SRCS string_utils_test.cpp - LIBS ${SPIRV_TOOLS}) - if (${SPIRV_TIMER_ENABLED}) add_spvtools_unittest( TARGET timer @@ -185,15 +181,6 @@ add_spvtools_unittest( LIBS ${SPIRV_TOOLS}) endif() -add_spvtools_unittest( - TARGET log - SRCS log_test.cpp - LIBS ${SPIRV_TOOLS}) - -add_spvtools_unittest( - TARGET preserve_numeric_ids - SRCS preserve_numeric_ids_test.cpp - LIBS ${SPIRV_TOOLS}) add_spvtools_unittest( TARGET bit_stream @@ -220,6 +207,7 @@ add_spvtools_unittest( add_subdirectory(comp) add_subdirectory(link) add_subdirectory(opt) +add_subdirectory(reduce) add_subdirectory(stats) add_subdirectory(tools) add_subdirectory(util) diff --git a/3rdparty/spirv-tools/test/binary_parse_test.cpp b/3rdparty/spirv-tools/test/binary_parse_test.cpp index 7d9700158..dfff79df4 100644 --- a/3rdparty/spirv-tools/test/binary_parse_test.cpp +++ b/3rdparty/spirv-tools/test/binary_parse_test.cpp @@ -267,52 +267,48 @@ TEST_F(BinaryParseTest, NullDiagnosticsIsOkForBadParse) { TEST_F(BinaryParseTest, NullConsumerNullDiagnosticsForBadParse) { auto words = CompileSuccessfully(""); - auto ctx = spvContextCreate(SPV_ENV_UNIVERSAL_1_1); - SetContextMessageConsumer(ctx, nullptr); + auto ctx = spvtools::Context(SPV_ENV_UNIVERSAL_1_1); + ctx.SetMessageConsumer(nullptr); words.push_back(0xffffffff); // Certainly invalid instruction header. EXPECT_HEADER(1).WillOnce(Return(SPV_SUCCESS)); EXPECT_CALL(client_, Instruction(_)).Times(0); // No instruction callback. EXPECT_EQ(SPV_ERROR_INVALID_BINARY, - spvBinaryParse(ctx, &client_, words.data(), words.size(), + spvBinaryParse(ctx.CContext(), &client_, words.data(), words.size(), invoke_header, invoke_instruction, nullptr)); - - spvContextDestroy(ctx); } TEST_F(BinaryParseTest, SpecifyConsumerNullDiagnosticsForGoodParse) { const auto words = CompileSuccessfully(""); - auto ctx = spvContextCreate(SPV_ENV_UNIVERSAL_1_1); + auto ctx = spvtools::Context(SPV_ENV_UNIVERSAL_1_1); int invocation = 0; - SetContextMessageConsumer( - ctx, [&invocation](spv_message_level_t, const char*, - const spv_position_t&, const char*) { ++invocation; }); + ctx.SetMessageConsumer([&invocation](spv_message_level_t, const char*, + const spv_position_t&, + const char*) { ++invocation; }); EXPECT_HEADER(1).WillOnce(Return(SPV_SUCCESS)); EXPECT_CALL(client_, Instruction(_)).Times(0); // No instruction callback. EXPECT_EQ(SPV_SUCCESS, - spvBinaryParse(ctx, &client_, words.data(), words.size(), + spvBinaryParse(ctx.CContext(), &client_, words.data(), words.size(), invoke_header, invoke_instruction, nullptr)); EXPECT_EQ(0, invocation); - - spvContextDestroy(ctx); } TEST_F(BinaryParseTest, SpecifyConsumerNullDiagnosticsForBadParse) { auto words = CompileSuccessfully(""); - auto ctx = spvContextCreate(SPV_ENV_UNIVERSAL_1_1); + auto ctx = spvtools::Context(SPV_ENV_UNIVERSAL_1_1); int invocation = 0; - SetContextMessageConsumer( - ctx, [&invocation](spv_message_level_t level, const char* source, - const spv_position_t& position, const char* message) { + ctx.SetMessageConsumer( + [&invocation](spv_message_level_t level, const char* source, + const spv_position_t& position, const char* message) { ++invocation; EXPECT_EQ(SPV_MSG_ERROR, level); EXPECT_STREQ("input", source); EXPECT_EQ(0u, position.line); EXPECT_EQ(0u, position.column); - EXPECT_EQ(5u, position.index); + EXPECT_EQ(1u, position.index); EXPECT_STREQ("Invalid opcode: 65535", message); }); @@ -320,52 +316,46 @@ TEST_F(BinaryParseTest, SpecifyConsumerNullDiagnosticsForBadParse) { EXPECT_HEADER(1).WillOnce(Return(SPV_SUCCESS)); EXPECT_CALL(client_, Instruction(_)).Times(0); // No instruction callback. EXPECT_EQ(SPV_ERROR_INVALID_BINARY, - spvBinaryParse(ctx, &client_, words.data(), words.size(), + spvBinaryParse(ctx.CContext(), &client_, words.data(), words.size(), invoke_header, invoke_instruction, nullptr)); EXPECT_EQ(1, invocation); - - spvContextDestroy(ctx); } TEST_F(BinaryParseTest, SpecifyConsumerSpecifyDiagnosticsForGoodParse) { const auto words = CompileSuccessfully(""); - auto ctx = spvContextCreate(SPV_ENV_UNIVERSAL_1_1); + auto ctx = spvtools::Context(SPV_ENV_UNIVERSAL_1_1); int invocation = 0; - SetContextMessageConsumer( - ctx, [&invocation](spv_message_level_t, const char*, - const spv_position_t&, const char*) { ++invocation; }); + ctx.SetMessageConsumer([&invocation](spv_message_level_t, const char*, + const spv_position_t&, + const char*) { ++invocation; }); EXPECT_HEADER(1).WillOnce(Return(SPV_SUCCESS)); EXPECT_CALL(client_, Instruction(_)).Times(0); // No instruction callback. EXPECT_EQ(SPV_SUCCESS, - spvBinaryParse(ctx, &client_, words.data(), words.size(), + spvBinaryParse(ctx.CContext(), &client_, words.data(), words.size(), invoke_header, invoke_instruction, &diagnostic_)); EXPECT_EQ(0, invocation); EXPECT_EQ(nullptr, diagnostic_); - - spvContextDestroy(ctx); } TEST_F(BinaryParseTest, SpecifyConsumerSpecifyDiagnosticsForBadParse) { auto words = CompileSuccessfully(""); - auto ctx = spvContextCreate(SPV_ENV_UNIVERSAL_1_1); + auto ctx = spvtools::Context(SPV_ENV_UNIVERSAL_1_1); int invocation = 0; - SetContextMessageConsumer( - ctx, [&invocation](spv_message_level_t, const char*, - const spv_position_t&, const char*) { ++invocation; }); + ctx.SetMessageConsumer([&invocation](spv_message_level_t, const char*, + const spv_position_t&, + const char*) { ++invocation; }); words.push_back(0xffffffff); // Certainly invalid instruction header. EXPECT_HEADER(1).WillOnce(Return(SPV_SUCCESS)); EXPECT_CALL(client_, Instruction(_)).Times(0); // No instruction callback. EXPECT_EQ(SPV_ERROR_INVALID_BINARY, - spvBinaryParse(ctx, &client_, words.data(), words.size(), + spvBinaryParse(ctx.CContext(), &client_, words.data(), words.size(), invoke_header, invoke_instruction, &diagnostic_)); EXPECT_EQ(0, invocation); EXPECT_STREQ("Invalid opcode: 65535", diagnostic_->error); - - spvContextDestroy(ctx); } TEST_F(BinaryParseTest, @@ -890,8 +880,8 @@ INSTANTIATE_TEST_CASE_P( "Invalid function control operand: 31 has invalid mask component 16"}, {"OpLoopMerge %1 %2 !1027", "Invalid loop control operand: 1027 has invalid mask component 1024"}, - {"%2 = OpImageFetch %1 %image %coord !511", - "Invalid image operand: 511 has invalid mask component 256"}, + {"%2 = OpImageFetch %1 %image %coord !32770", + "Invalid image operand: 32770 has invalid mask component 32768"}, {"OpSelectionMerge %1 !7", "Invalid selection control operand: 7 has invalid mask component 4"}, }), ); diff --git a/3rdparty/spirv-tools/test/c_interface_test.cpp b/3rdparty/spirv-tools/test/c_interface_test.cpp index 1b735be5d..c644fb9ba 100644 --- a/3rdparty/spirv-tools/test/c_interface_test.cpp +++ b/3rdparty/spirv-tools/test/c_interface_test.cpp @@ -150,7 +150,7 @@ TEST(CInterface, SpecifyConsumerNullDiagnosticForDisassembling) { EXPECT_STREQ("input", source); EXPECT_EQ(0u, position.line); EXPECT_EQ(0u, position.column); - EXPECT_EQ(5u, position.index); + EXPECT_EQ(1u, position.index); EXPECT_STREQ("Invalid opcode: 65535", message); }); diff --git a/3rdparty/spirv-tools/test/comp/markv_codec_test.cpp b/3rdparty/spirv-tools/test/comp/markv_codec_test.cpp index 76918f747..283fcd3ca 100644 --- a/3rdparty/spirv-tools/test/comp/markv_codec_test.cpp +++ b/3rdparty/spirv-tools/test/comp/markv_codec_test.cpp @@ -57,13 +57,13 @@ void DiagnosticsMessageHandler(spv_message_level_t level, const char*, void Compile(const std::string& code, std::vector* words, uint32_t options = SPV_TEXT_TO_BINARY_OPTION_NONE, spv_target_env env = SPV_ENV_UNIVERSAL_1_2) { - ScopedContext ctx(env); - SetContextMessageConsumer(ctx.context, DiagnosticsMessageHandler); + spvtools::Context ctx(env); + ctx.SetMessageConsumer(DiagnosticsMessageHandler); spv_binary spirv_binary; - ASSERT_EQ(SPV_SUCCESS, - spvTextToBinaryWithOptions(ctx.context, code.c_str(), code.size(), - options, &spirv_binary, nullptr)); + ASSERT_EQ(SPV_SUCCESS, spvTextToBinaryWithOptions( + ctx.CContext(), code.c_str(), code.size(), options, + &spirv_binary, nullptr)); *words = std::vector(spirv_binary->code, spirv_binary->code + spirv_binary->wordCount); @@ -74,11 +74,11 @@ void Compile(const std::string& code, std::vector* words, // Disassembles SPIR-V |words| to |out_text|. void Disassemble(const std::vector& words, std::string* out_text, spv_target_env env = SPV_ENV_UNIVERSAL_1_2) { - ScopedContext ctx(env); - SetContextMessageConsumer(ctx.context, DiagnosticsMessageHandler); + spvtools::Context ctx(env); + ctx.SetMessageConsumer(DiagnosticsMessageHandler); spv_text text = nullptr; - ASSERT_EQ(SPV_SUCCESS, spvBinaryToText(ctx.context, words.data(), + ASSERT_EQ(SPV_SUCCESS, spvBinaryToText(ctx.CContext(), words.data(), words.size(), 0, &text, nullptr)); assert(text); @@ -90,7 +90,7 @@ void Disassemble(const std::vector& words, std::string* out_text, // the results of the two operations. void TestEncodeDecode(MarkvModelType model_type, const std::string& original_text) { - ScopedContext ctx(SPV_ENV_UNIVERSAL_1_2); + spvtools::Context ctx(SPV_ENV_UNIVERSAL_1_2); std::unique_ptr model = CreateMarkvModel(model_type); MarkvCodecOptions options; @@ -113,14 +113,14 @@ void TestEncodeDecode(MarkvModelType model_type, std::vector markv; ASSERT_EQ(SPV_SUCCESS, - SpirvToMarkv(ctx.context, binary_to_encode, options, *model, + SpirvToMarkv(ctx.CContext(), binary_to_encode, options, *model, DiagnosticsMessageHandler, output_to_string_stream, MarkvDebugConsumer(), &markv)); ASSERT_FALSE(markv.empty()); std::vector decoded_binary; ASSERT_EQ(SPV_SUCCESS, - MarkvToSpirv(ctx.context, markv, options, *model, + MarkvToSpirv(ctx.CContext(), markv, options, *model, DiagnosticsMessageHandler, MarkvLogConsumer(), MarkvDebugConsumer(), &decoded_binary)); ASSERT_FALSE(decoded_binary.empty()); diff --git a/3rdparty/spirv-tools/test/cpp_interface_test.cpp b/3rdparty/spirv-tools/test/cpp_interface_test.cpp index bcc2cd6c7..538d40fd4 100644 --- a/3rdparty/spirv-tools/test/cpp_interface_test.cpp +++ b/3rdparty/spirv-tools/test/cpp_interface_test.cpp @@ -36,6 +36,10 @@ OpMemoryModel Logical GLSL450 )"; } +// When we assemble with a target environment of SPIR-V 1.1, we expect +// the following in the module header version word. +const uint32_t kExpectedSpvVersion = 0x10100; + TEST(CppInterface, SuccessfulRoundTrip) { const std::string input_text = "%2 = OpSizeOf %1 %3\n"; SpirvTools t(SPV_ENV_UNIVERSAL_1_1); @@ -44,7 +48,7 @@ TEST(CppInterface, SuccessfulRoundTrip) { EXPECT_TRUE(t.Assemble(input_text, &binary)); EXPECT_TRUE(binary.size() > 5u); EXPECT_EQ(SpvMagicNumber, binary[0]); - EXPECT_EQ(SpvVersion, binary[1]); + EXPECT_EQ(kExpectedSpvVersion, binary[1]); // This cannot pass validation since %1 is not defined. t.SetMessageConsumer([](spv_message_level_t level, const char* source, @@ -54,7 +58,8 @@ TEST(CppInterface, SuccessfulRoundTrip) { EXPECT_EQ(0u, position.line); EXPECT_EQ(0u, position.column); EXPECT_EQ(1u, position.index); - EXPECT_STREQ("ID 1 has not been defined\n %2 = OpSizeOf %1 %3\n", message); + EXPECT_STREQ("ID 1[%1] has not been defined\n %2 = OpSizeOf %1 %3\n", + message); }); EXPECT_FALSE(t.Validate(binary)); @@ -70,7 +75,7 @@ TEST(CppInterface, AssembleEmptyModule) { // We only have the header. EXPECT_EQ(5u, binary.size()); EXPECT_EQ(SpvMagicNumber, binary[0]); - EXPECT_EQ(SpvVersion, binary[1]); + EXPECT_EQ(kExpectedSpvVersion, binary[1]); } TEST(CppInterface, AssembleOverloads) { @@ -81,21 +86,21 @@ TEST(CppInterface, AssembleOverloads) { EXPECT_TRUE(t.Assemble(input_text, &binary)); EXPECT_TRUE(binary.size() > 5u); EXPECT_EQ(SpvMagicNumber, binary[0]); - EXPECT_EQ(SpvVersion, binary[1]); + EXPECT_EQ(kExpectedSpvVersion, binary[1]); } { std::vector binary; EXPECT_TRUE(t.Assemble(input_text.data(), input_text.size(), &binary)); EXPECT_TRUE(binary.size() > 5u); EXPECT_EQ(SpvMagicNumber, binary[0]); - EXPECT_EQ(SpvVersion, binary[1]); + EXPECT_EQ(kExpectedSpvVersion, binary[1]); } { // Ignore the last newline. std::vector binary; EXPECT_TRUE(t.Assemble(input_text.data(), input_text.size() - 1, &binary)); EXPECT_TRUE(binary.size() > 5u); EXPECT_EQ(SpvMagicNumber, binary[0]); - EXPECT_EQ(SpvVersion, binary[1]); + EXPECT_EQ(kExpectedSpvVersion, binary[1]); } } diff --git a/3rdparty/spirv-tools/test/fuzzers/BUILD.gn b/3rdparty/spirv-tools/test/fuzzers/BUILD.gn index df8291a56..69659c661 100644 --- a/3rdparty/spirv-tools/test/fuzzers/BUILD.gn +++ b/3rdparty/spirv-tools/test/fuzzers/BUILD.gn @@ -16,7 +16,7 @@ import("//testing/libfuzzer/fuzzer_test.gni") import("//testing/test.gni") config("fuzzer_config") { - configs = [ "../..:spvtools_config" ] + configs = [ "../..:spvtools_internal_config" ] } group("fuzzers") { @@ -33,10 +33,11 @@ if (!build_with_chromium || use_fuzzing_engine) { testonly = true deps = [ - ":spvtools_val_fuzzer", + ":spvtools_binary_parser_fuzzer", ":spvtools_opt_legalization_fuzzer", ":spvtools_opt_performance_fuzzer", ":spvtools_opt_size_fuzzer", + ":spvtools_val_fuzzer", ] } } @@ -62,6 +63,12 @@ template("spvtools_fuzzer") { } } +spvtools_fuzzer("spvtools_binary_parser_fuzzer_src") { + sources = [ + "spvtools_binary_parser_fuzzer.cpp", + ] +} + spvtools_fuzzer("spvtools_opt_performance_fuzzer_src") { sources = [ "spvtools_opt_performance_fuzzer.cpp", @@ -87,6 +94,15 @@ spvtools_fuzzer("spvtools_val_fuzzer_src") { } if (!build_with_chromium || use_fuzzing_engine) { + fuzzer_test("spvtools_binary_parser_fuzzer") { + sources = [] + deps = [ + ":spvtools_binary_parser_fuzzer_src", + ] + # Intentionally doesn't use the seed corpus, because it consumes + # part of the input as not part of the file. + } + fuzzer_test("spvtools_opt_performance_fuzzer") { sources = [] deps = [ diff --git a/3rdparty/spirv-tools/test/fuzzers/spvtools_binary_parser_fuzzer.cpp b/3rdparty/spirv-tools/test/fuzzers/spvtools_binary_parser_fuzzer.cpp new file mode 100644 index 000000000..76ba4d9e9 --- /dev/null +++ b/3rdparty/spirv-tools/test/fuzzers/spvtools_binary_parser_fuzzer.cpp @@ -0,0 +1,44 @@ +// Copyright (c) 2018 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#include + +#include "spirv-tools/libspirv.hpp" + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { + if (size < sizeof(spv_target_env) + 1) return 0; + + const spv_context context = + spvContextCreate(*reinterpret_cast(data)); + if (context == nullptr) return 0; + + data += sizeof(spv_target_env); + size -= sizeof(spv_target_env); + + std::vector input; + input.resize(size >> 2); + + size_t count = 0; + for (size_t i = 0; (i + 3) < size; i += 4) { + input[count++] = data[i] | (data[i + 1] << 8) | (data[i + 2] << 16) | + (data[i + 3]) << 24; + } + + spvBinaryParse(context, nullptr, input.data(), input.size(), nullptr, nullptr, + nullptr); + + spvContextDestroy(context); + return 0; +} diff --git a/3rdparty/spirv-tools/test/operand_capabilities_test.cpp b/3rdparty/spirv-tools/test/operand_capabilities_test.cpp index 0aeb505f0..e58bc9d2b 100644 --- a/3rdparty/spirv-tools/test/operand_capabilities_test.cpp +++ b/3rdparty/spirv-tools/test/operand_capabilities_test.cpp @@ -161,9 +161,10 @@ INSTANTIATE_TEST_CASE_P( Geometry), CASE1(EXECUTION_MODE, ExecutionModeQuads, Tessellation), CASE1(EXECUTION_MODE, ExecutionModeIsolines, Tessellation), - CASE2(EXECUTION_MODE, ExecutionModeOutputVertices, Geometry, - Tessellation), - CASE1(EXECUTION_MODE, ExecutionModeOutputPoints, Geometry), + CASE3(EXECUTION_MODE, ExecutionModeOutputVertices, Geometry, + Tessellation, MeshShadingNV), + CASE2(EXECUTION_MODE, ExecutionModeOutputPoints, Geometry, + MeshShadingNV), CASE1(EXECUTION_MODE, ExecutionModeOutputLineStrip, Geometry), CASE1(EXECUTION_MODE, ExecutionModeOutputTriangleStrip, Geometry), CASE1(EXECUTION_MODE, ExecutionModeVecTypeHint, Kernel), @@ -205,12 +206,12 @@ INSTANTIATE_TEST_CASE_P( Dim, EnumCapabilityTest, Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1), ValuesIn(std::vector{ - CASE1(DIMENSIONALITY, Dim1D, Sampled1D), - CASE0(DIMENSIONALITY, Dim2D), + CASE2(DIMENSIONALITY, Dim1D, Sampled1D, Image1D), + CASE3(DIMENSIONALITY, Dim2D, Kernel, Shader, ImageMSArray), CASE0(DIMENSIONALITY, Dim3D), - CASE1(DIMENSIONALITY, DimCube, Shader), - CASE1(DIMENSIONALITY, DimRect, SampledRect), - CASE1(DIMENSIONALITY, DimBuffer, SampledBuffer), + CASE2(DIMENSIONALITY, DimCube, Shader, ImageCubeArray), + CASE2(DIMENSIONALITY, DimRect, SampledRect, ImageRect), + CASE2(DIMENSIONALITY, DimBuffer, SampledBuffer, ImageBuffer), CASE1(DIMENSIONALITY, DimSubpassData, InputAttachment), })), ); @@ -490,7 +491,8 @@ INSTANTIATE_TEST_CASE_P( CASE1(BUILT_IN, BuiltInCullDistance, CullDistance), // Bug 1407, 15234 CASE1(BUILT_IN, BuiltInVertexId, Shader), CASE1(BUILT_IN, BuiltInInstanceId, Shader), - CASE2(BUILT_IN, BuiltInPrimitiveId, Geometry, Tessellation), + CASE3(BUILT_IN, BuiltInPrimitiveId, Geometry, Tessellation, + RayTracingNV), CASE2(BUILT_IN, BuiltInInvocationId, Geometry, Tessellation), CASE1(BUILT_IN, BuiltInLayer, Geometry), CASE1(BUILT_IN, BuiltInViewportIndex, MultiViewport), // Bug 15234 @@ -604,16 +606,18 @@ INSTANTIATE_TEST_CASE_P( })), ); // See SPIR-V Section 3.27 Scope -INSTANTIATE_TEST_CASE_P(Scope, EnumCapabilityTest, - Combine(Values(SPV_ENV_UNIVERSAL_1_0, - SPV_ENV_UNIVERSAL_1_1), - ValuesIn(std::vector{ - CASE0(SCOPE_ID, ScopeCrossDevice), - CASE0(SCOPE_ID, ScopeDevice), - CASE0(SCOPE_ID, ScopeWorkgroup), - CASE0(SCOPE_ID, ScopeSubgroup), - CASE0(SCOPE_ID, ScopeInvocation), - })), ); +INSTANTIATE_TEST_CASE_P( + Scope, EnumCapabilityTest, + Combine(Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1, + SPV_ENV_UNIVERSAL_1_2, SPV_ENV_UNIVERSAL_1_3), + ValuesIn(std::vector{ + CASE0(SCOPE_ID, ScopeCrossDevice), + CASE0(SCOPE_ID, ScopeDevice), + CASE0(SCOPE_ID, ScopeWorkgroup), + CASE0(SCOPE_ID, ScopeSubgroup), + CASE0(SCOPE_ID, ScopeInvocation), + CASE1(SCOPE_ID, ScopeQueueFamilyKHR, VulkanMemoryModelKHR), + })), ); // See SPIR-V Section 3.28 Group Operation INSTANTIATE_TEST_CASE_P( diff --git a/3rdparty/spirv-tools/test/operand_pattern_test.cpp b/3rdparty/spirv-tools/test/operand_pattern_test.cpp index b3e302490..d2d92a01d 100644 --- a/3rdparty/spirv-tools/test/operand_pattern_test.cpp +++ b/3rdparty/spirv-tools/test/operand_pattern_test.cpp @@ -89,9 +89,11 @@ INSTANTIATE_TEST_CASE_P( ::testing::ValuesIn(std::vector{ // No bits means no change. {SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS, 0, {PREFIX0}, {PREFIX0}}, - // Unknown bits means no change. + // Unknown bits means no change. Use all bits that aren't in the + // grammar. + // The last mask enum is 0x20 {SPV_OPERAND_TYPE_OPTIONAL_MEMORY_ACCESS, - 0xfffffffc, + 0xffffffc0, {PREFIX1}, {PREFIX1}}, // Volatile has no operands. diff --git a/3rdparty/spirv-tools/test/opt/CMakeLists.txt b/3rdparty/spirv-tools/test/opt/CMakeLists.txt index f2741f673..1e32df38c 100644 --- a/3rdparty/spirv-tools/test/opt/CMakeLists.txt +++ b/3rdparty/spirv-tools/test/opt/CMakeLists.txt @@ -15,325 +15,82 @@ add_subdirectory(dominator_tree) add_subdirectory(loop_optimizations) -add_spvtools_unittest(TARGET instruction - SRCS instruction_test.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET instruction_list - SRCS instruction_list_test.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET ir_loader - SRCS ir_loader_test.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET pass_manager - SRCS module_utils.h - pass_manager_test.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET optimizer - SRCS optimizer_test.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET pass_strip_debug_info - SRCS strip_debug_info_test.cpp pass_utils.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET pass_strip_reflect_info - SRCS strip_reflect_info_test.cpp pass_utils.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET pass_compact_ids - SRCS compact_ids_test.cpp pass_utils.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET pass_flatten_decoration - SRCS flatten_decoration_test.cpp pass_utils.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET pass_freeze_spec_const - SRCS freeze_spec_const_test.cpp pass_utils.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET pass_block_merge - SRCS block_merge_test.cpp pass_utils.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET pass_inline - SRCS inline_test.cpp pass_utils.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET pass_inline_opaque - SRCS inline_opaque_test.cpp pass_utils.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET pass_insert_extract_elim - SRCS insert_extract_elim_test.cpp pass_utils.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET pass_dead_insert_elim - SRCS dead_insert_elim_test.cpp pass_utils.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET pass_local_ssa_elim - SRCS local_ssa_elim_test.cpp pass_utils.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET pass_local_single_block_elim - SRCS local_single_block_elim.cpp pass_utils.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET pass_local_access_chain_convert - SRCS local_access_chain_convert_test.cpp pass_utils.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET pass_local_single_store_elim - SRCS local_single_store_elim_test.cpp pass_utils.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET pass_dead_branch_elim - SRCS dead_branch_elim_test.cpp pass_utils.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET pass_dead_variable_elim - SRCS dead_variable_elim_test.cpp pass_utils.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET pass_aggressive_dce - SRCS aggressive_dead_code_elim_test.cpp pass_utils.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET pass_common_uniform_elim - SRCS common_uniform_elim_test.cpp pass_utils.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET pass_eliminate_dead_const - SRCS eliminate_dead_const_test.cpp pass_utils.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET pass_eliminate_dead_functions - SRCS eliminate_dead_functions_test.cpp pass_utils.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET pass_pass - SRCS pass_test.cpp pass_utils.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET pass_utils - SRCS utils_test.cpp pass_utils.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET def_use - SRCS def_use_test.cpp pass_utils.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET assembly_builder - SRCS assembly_builder_test.cpp pass_utils.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET types - SRCS types_test.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET type_manager - SRCS type_manager_test.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET iterator - SRCS iterator_test.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET module - SRCS module_utils.h +add_spvtools_unittest(TARGET opt + SRCS aggressive_dead_code_elim_test.cpp + assembly_builder_test.cpp + block_merge_test.cpp + ccp_test.cpp + cfg_cleanup_test.cpp + combine_access_chains_test.cpp + common_uniform_elim_test.cpp + compact_ids_test.cpp + constant_manager_test.cpp + copy_prop_array_test.cpp + dead_branch_elim_test.cpp + dead_insert_elim_test.cpp + dead_variable_elim_test.cpp + decoration_manager_test.cpp + def_use_test.cpp + eliminate_dead_const_test.cpp + eliminate_dead_functions_test.cpp + feature_manager_test.cpp + flatten_decoration_test.cpp + fold_spec_const_op_composite_test.cpp + fold_test.cpp + freeze_spec_const_test.cpp + function_test.cpp + if_conversion_test.cpp + inline_opaque_test.cpp + inline_test.cpp + insert_extract_elim_test.cpp + inst_bindless_check_test.cpp + instruction_list_test.cpp + instruction_test.cpp + ir_builder.cpp + ir_context_test.cpp + ir_loader_test.cpp + iterator_test.cpp + line_debug_info_test.cpp + local_access_chain_convert_test.cpp + local_redundancy_elimination_test.cpp + local_single_block_elim.cpp + local_single_store_elim_test.cpp + local_ssa_elim_test.cpp module_test.cpp + module_utils.h + optimizer_test.cpp + pass_manager_test.cpp + pass_merge_return_test.cpp + pass_remove_duplicates_test.cpp + pass_utils.cpp + private_to_local_test.cpp + process_lines_test.cpp + propagator_test.cpp + reduce_load_size_test.cpp + redundancy_elimination_test.cpp + register_liveness.cpp + replace_invalid_opc_test.cpp + scalar_analysis.cpp + scalar_replacement_test.cpp + set_spec_const_default_value_test.cpp + simplification_test.cpp + strength_reduction_test.cpp + strip_debug_info_test.cpp + strip_reflect_info_test.cpp + struct_cfg_analysis_test.cpp + type_manager_test.cpp + types_test.cpp + unify_const_test.cpp + utils_test.cpp pass_utils.cpp + value_table_test.cpp + vector_dce_test.cpp + workaround1209_test.cpp LIBS SPIRV-Tools-opt + PCH_FILE pch_test_opt ) -add_spvtools_unittest(TARGET pass_fold_spec_const_op_composite - SRCS fold_spec_const_op_composite_test.cpp pass_utils.cpp +add_spvtools_unittest(TARGET upgrade_memory_model + SRCS upgrade_memory_model_test.cpp pass_utils.cpp LIBS SPIRV-Tools-opt + PCH_FILE pch_test_opt ) - -add_spvtools_unittest(TARGET pass_unify_const - SRCS unify_const_test.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET pass_set_spec_const_default_value - SRCS set_spec_const_default_value_test.cpp pass_utils.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET line_debug_info - SRCS line_debug_info_test.cpp pass_utils.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET pass_strength_reduction - SRCS strength_reduction_test.cpp pass_utils.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET pass_scalar_replacement - SRCS scalar_replacement_test.cpp pass_utils.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET cfg_cleanup - SRCS cfg_cleanup_test.cpp pass_utils.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET ir_context - SRCS ir_context_test.cpp pass_utils.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET feature_manager - SRCS feature_manager_test.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET pass_merge_return - SRCS pass_merge_return_test.cpp pass_utils.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET value_table - SRCS value_table_test.cpp pass_utils.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET local_redundancy_elimination - SRCS local_redundancy_elimination_test.cpp pass_utils.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET propagator - SRCS propagator_test.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET redundancy_elimination - SRCS redundancy_elimination_test.cpp pass_utils.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET private_to_local - SRCS private_to_local_test.cpp pass_utils.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET decoration_manager - SRCS decoration_manager_test.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET pass_remove_duplicates - SRCS pass_remove_duplicates_test.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET ccp - SRCS ccp_test.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET pass_workaround1209 - SRCS workaround1209_test.cpp pass_utils.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET pass_if_conversion - SRCS if_conversion_test.cpp pass_utils.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET ir_builder - SRCS ir_builder.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET instruction_folding - SRCS fold_test.cpp pass_utils.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET replace_invalid_opc - SRCS replace_invalid_opc_test.cpp pass_utils.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET register_liveness - SRCS register_liveness.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET simplification - SRCS simplification_test.cpp pass_utils.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET copy_prop_array - SRCS copy_prop_array_test.cpp pass_utils.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET scalar_analysis - SRCS scalar_analysis.cpp pass_utils.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET vector_dce - SRCS vector_dce_test.cpp pass_utils.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET reduce_load_size - SRCS reduce_load_size_test.cpp pass_utils.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET constant_manager - SRCS constant_manager_test.cpp - LIBS SPIRV-Tools-opt -) - -add_spvtools_unittest(TARGET combine_access_chains - SRCS combine_access_chains_test.cpp - LIBS SPIRV-Tools-opt -) - diff --git a/3rdparty/spirv-tools/test/opt/aggressive_dead_code_elim_test.cpp b/3rdparty/spirv-tools/test/opt/aggressive_dead_code_elim_test.cpp index 287fcef0f..e58a76f71 100644 --- a/3rdparty/spirv-tools/test/opt/aggressive_dead_code_elim_test.cpp +++ b/3rdparty/spirv-tools/test/opt/aggressive_dead_code_elim_test.cpp @@ -3597,6 +3597,8 @@ OpFunctionEnd SinglePassRunAndCheck(assembly, assembly, true, true); } +// This is not valid input and ADCE does not support variable pointers and only +// supports shaders. TEST_F(AggressiveDCETest, PointerVariable) { // ADCE is able to handle code that contains a load whose base address // comes from a load and not an OpVariable. I want to see an instruction @@ -3693,6 +3695,10 @@ OpReturn OpFunctionEnd )"; + // The input is not valid and ADCE only supports shaders, but not variable + // pointers. Workaround this by enabling relaxed logical pointers in the + // validator. + ValidatorOptions()->relax_logical_pointer = true; SinglePassRunAndCheck(before, after, true, true); } @@ -3873,7 +3879,6 @@ OpFunctionEnd SinglePassRunAndCheck(before, after, true, true); } -#ifdef SPIRV_EFFCEE TEST_F(AggressiveDCETest, DeadNestedSwitch) { const std::string text = R"( ; CHECK: OpLabel @@ -3919,7 +3924,6 @@ OpFunctionEnd SinglePassRunAndMatch(text, true); } -#endif // SPIRV_EFFCEE TEST_F(AggressiveDCETest, LiveNestedSwitch) { const std::string text = R"(OpCapability Shader @@ -4095,7 +4099,6 @@ OpFunctionEnd /* skip_nop = */ true); } -#ifdef SPIRV_EFFCEE TEST_F(AggressiveDCETest, BasicAllDeadConstants) { const std::string text = R"( ; CHECK-NOT: OpConstant @@ -4126,7 +4129,6 @@ TEST_F(AggressiveDCETest, BasicAllDeadConstants) { SinglePassRunAndMatch(text, true); } -#endif // SPIRV_EFFCEE TEST_F(AggressiveDCETest, BasicNoneDeadConstants) { const std::vector text = { @@ -4184,7 +4186,7 @@ TEST_F(AggressiveDCETest, BasicNoneDeadConstants) { JoinAllInsts(text), JoinAllInsts(text), /* skip_nop = */ true); } -struct EliminateDeadConstantTestCase { +struct AggressiveEliminateDeadConstantTestCase { // Type declarations and constants that should be kept. std::vector used_consts; // Instructions that refer to constants, this is added to create uses for @@ -4196,7 +4198,8 @@ struct EliminateDeadConstantTestCase { std::vector checks; }; -// All types that are potentially required in EliminateDeadConstantTest. +// All types that are potentially required in +// AggressiveEliminateDeadConstantTest. const std::vector CommonTypes = { // clang-format off // scalar types @@ -4232,11 +4235,10 @@ const std::vector CommonTypes = { // clang-format on }; -using EliminateDeadConstantTest = - PassTest<::testing::TestWithParam>; +using AggressiveEliminateDeadConstantTest = + PassTest<::testing::TestWithParam>; -#ifdef SPIRV_EFFCEE -TEST_P(EliminateDeadConstantTest, Custom) { +TEST_P(AggressiveEliminateDeadConstantTest, Custom) { auto& tc = GetParam(); AssemblyBuilder builder; builder.AppendTypesConstantsGlobals(CommonTypes) @@ -4253,8 +4255,8 @@ TEST_P(EliminateDeadConstantTest, Custom) { } INSTANTIATE_TEST_CASE_P( - ScalarTypeConstants, EliminateDeadConstantTest, - ::testing::ValuesIn(std::vector({ + ScalarTypeConstants, AggressiveEliminateDeadConstantTest, + ::testing::ValuesIn(std::vector({ // clang-format off // Scalar type constants, one dead constant and one used constant. { @@ -4345,8 +4347,8 @@ INSTANTIATE_TEST_CASE_P( }))); INSTANTIATE_TEST_CASE_P( - VectorTypeConstants, EliminateDeadConstantTest, - ::testing::ValuesIn(std::vector({ + VectorTypeConstants, AggressiveEliminateDeadConstantTest, + ::testing::ValuesIn(std::vector({ // clang-format off // Tests eliminating dead constant type ivec2. One dead constant vector // and one used constant vector, each built from its own group of @@ -4472,8 +4474,8 @@ INSTANTIATE_TEST_CASE_P( }))); INSTANTIATE_TEST_CASE_P( - StructTypeConstants, EliminateDeadConstantTest, - ::testing::ValuesIn(std::vector({ + StructTypeConstants, AggressiveEliminateDeadConstantTest, + ::testing::ValuesIn(std::vector({ // clang-format off // A plain struct type dead constants. All of its components are dead // constants too. @@ -4643,8 +4645,8 @@ INSTANTIATE_TEST_CASE_P( }))); INSTANTIATE_TEST_CASE_P( - ScalarTypeSpecConstants, EliminateDeadConstantTest, - ::testing::ValuesIn(std::vector({ + ScalarTypeSpecConstants, AggressiveEliminateDeadConstantTest, + ::testing::ValuesIn(std::vector({ // clang-format off // All scalar type spec constants. { @@ -4696,8 +4698,8 @@ INSTANTIATE_TEST_CASE_P( }))); INSTANTIATE_TEST_CASE_P( - VectorTypeSpecConstants, EliminateDeadConstantTest, - ::testing::ValuesIn(std::vector({ + VectorTypeSpecConstants, AggressiveEliminateDeadConstantTest, + ::testing::ValuesIn(std::vector({ // clang-format off // Bool vector type spec constants. One vector has all component dead, // another vector has one dead boolean and one used boolean. @@ -4818,8 +4820,8 @@ INSTANTIATE_TEST_CASE_P( }))); INSTANTIATE_TEST_CASE_P( - SpecConstantOp, EliminateDeadConstantTest, - ::testing::ValuesIn(std::vector({ + SpecConstantOp, AggressiveEliminateDeadConstantTest, + ::testing::ValuesIn(std::vector({ // clang-format off // Cast operations: uint <-> int <-> bool { @@ -5000,8 +5002,8 @@ INSTANTIATE_TEST_CASE_P( }))); INSTANTIATE_TEST_CASE_P( - LongDefUseChain, EliminateDeadConstantTest, - ::testing::ValuesIn(std::vector({ + LongDefUseChain, AggressiveEliminateDeadConstantTest, + ::testing::ValuesIn(std::vector({ // clang-format off // Long Def-Use chain with binary operations. { @@ -5109,6 +5111,43 @@ OpFunctionEnd SinglePassRunAndMatch(text, true); } +TEST_F(AggressiveDCETest, DeadDecorationGroupAndValidDecorationMgr) { + // The decoration group should be eliminated because the target of group + // decorate is dead. + const std::string text = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft +OpDecorate %1 Restrict +OpDecorate %1 Aliased +%1 = OpDecorationGroup +OpGroupDecorate %1 %var +%void = OpTypeVoid +%func = OpTypeFunction %void +%uint = OpTypeInt 32 0 +%uint_ptr = OpTypePointer Function %uint +%main = OpFunction %void None %func +%2 = OpLabel +%var = OpVariable %uint_ptr Function +OpReturn +OpFunctionEnd + )"; + + auto pass = MakeUnique(); + auto consumer = [](spv_message_level_t, const char*, const spv_position_t&, + const char* message) { + std::cerr << message << std::endl; + }; + auto context = BuildModule(SPV_ENV_UNIVERSAL_1_1, consumer, text); + + // Build the decoration manager before the pass. + context->get_decoration_mgr(); + + const auto status = pass->Run(context.get()); + EXPECT_EQ(status, Pass::Status::SuccessWithChange); +} + TEST_F(AggressiveDCETest, ParitallyDeadDecorationGroup) { const std::string text = R"( ; CHECK: OpDecorate [[grp:%\w+]] Restrict @@ -5209,7 +5248,7 @@ OpFunctionEnd TEST_F(AggressiveDCETest, PartiallyDeadGroupMemberDecorate) { const std::string text = R"( ; CHECK: OpDecorate [[grp:%\w+]] Offset 0 -; CHECK: OpDecorate [[grp]] Uniform +; CHECK: OpDecorate [[grp]] RelaxedPrecision ; CHECK: [[grp]] = OpDecorationGroup ; CHECK: OpGroupMemberDecorate [[grp]] [[output:%\w+]] 1 ; CHECK: [[output]] = OpTypeStruct @@ -5219,7 +5258,7 @@ OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %main "main" %output OpExecutionMode %main OriginUpperLeft OpDecorate %1 Offset 0 -OpDecorate %1 Uniform +OpDecorate %1 RelaxedPrecision %1 = OpDecorationGroup OpGroupMemberDecorate %1 %var_struct 0 %output_struct 1 %void = OpTypeVoid @@ -5248,7 +5287,7 @@ TEST_F(AggressiveDCETest, PartiallyDeadGroupMemberDecorateDifferentGroupDecorate) { const std::string text = R"( ; CHECK: OpDecorate [[grp:%\w+]] Offset 0 -; CHECK: OpDecorate [[grp]] Uniform +; CHECK: OpDecorate [[grp]] RelaxedPrecision ; CHECK: [[grp]] = OpDecorationGroup ; CHECK: OpGroupMemberDecorate [[grp]] [[output:%\w+]] 1 ; CHECK-NOT: OpGroupMemberDecorate @@ -5259,7 +5298,7 @@ OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %main "main" %output OpExecutionMode %main OriginUpperLeft OpDecorate %1 Offset 0 -OpDecorate %1 Uniform +OpDecorate %1 RelaxedPrecision %1 = OpDecorationGroup OpGroupMemberDecorate %1 %var_struct 0 OpGroupMemberDecorate %1 %output_struct 1 @@ -5309,7 +5348,6 @@ OpFunctionEnd SinglePassRunAndMatch(text, true); } -#endif // SPIRV_EFFCEE // Test for #1214 TEST_F(AggressiveDCETest, LoopHeaderIsAlsoAnotherLoopMerge) { @@ -5523,6 +5561,7 @@ TEST_F(AggressiveDCETest, SafelyRemoveDecorateString) { OpExtension "SPV_GOOGLE_hlsl_functionality1" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %1 "main" +OpExecutionMode %1 OriginUpperLeft )"; const std::string body_before = @@ -5812,6 +5851,369 @@ OpFunctionEnd SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); SinglePassRunAndCheck(test, test, true, true); } + +TEST_F(AggressiveDCETest, CountingLoopNotEliminated) { + // #version 310 es + // + // precision highp float; + // precision highp int; + // + // layout(location = 0) out vec4 _GLF_color; + // + // void main() + // { + // float data[1]; + // for (int c = 0; c < 1; c++) { + // if (true) { + // do { + // for (int i = 0; i < 1; i++) { + // data[i] = 1.0; + // } + // } while (false); + // } + // } + // _GLF_color = vec4(data[0], 0.0, 0.0, 1.0); + // } + const std::string test = + R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" %_GLF_color +OpExecutionMode %main OriginUpperLeft +OpSource ESSL 310 +OpName %main "main" +OpName %c "c" +OpName %i "i" +OpName %data "data" +OpName %_GLF_color "_GLF_color" +OpDecorate %_GLF_color Location 0 +%void = OpTypeVoid +%8 = OpTypeFunction %void +%int = OpTypeInt 32 1 +%_ptr_Function_int = OpTypePointer Function %int +%int_0 = OpConstant %int 0 +%int_1 = OpConstant %int 1 +%bool = OpTypeBool +%float = OpTypeFloat 32 +%uint = OpTypeInt 32 0 +%uint_1 = OpConstant %uint 1 +%_arr_float_uint_1 = OpTypeArray %float %uint_1 +%_ptr_Function__arr_float_uint_1 = OpTypePointer Function %_arr_float_uint_1 +%float_1 = OpConstant %float 1 +%_ptr_Function_float = OpTypePointer Function %float +%false = OpConstantFalse %bool +%v4float = OpTypeVector %float 4 +%_ptr_Output_v4float = OpTypePointer Output %v4float +%_GLF_color = OpVariable %_ptr_Output_v4float Output +%float_0 = OpConstant %float 0 +%main = OpFunction %void None %8 +%26 = OpLabel +%c = OpVariable %_ptr_Function_int Function +%i = OpVariable %_ptr_Function_int Function +%data = OpVariable %_ptr_Function__arr_float_uint_1 Function +OpStore %c %int_0 +OpBranch %27 +%27 = OpLabel +OpLoopMerge %28 %29 None +OpBranch %30 +%30 = OpLabel +%31 = OpLoad %int %c +%32 = OpSLessThan %bool %31 %int_1 +OpBranchConditional %32 %33 %28 +%33 = OpLabel +OpBranch %34 +%34 = OpLabel +OpBranch %35 +%35 = OpLabel +OpLoopMerge %36 %37 None +OpBranch %38 +%38 = OpLabel +OpStore %i %int_0 +OpBranch %39 +%39 = OpLabel +OpLoopMerge %40 %41 None +OpBranch %42 +%42 = OpLabel +%43 = OpLoad %int %i +%44 = OpSLessThan %bool %43 %int_1 +OpSelectionMerge %45 None +OpBranchConditional %44 %46 %40 +%46 = OpLabel +%47 = OpLoad %int %i +%48 = OpAccessChain %_ptr_Function_float %data %47 +OpStore %48 %float_1 +OpBranch %41 +%41 = OpLabel +%49 = OpLoad %int %i +%50 = OpIAdd %int %49 %int_1 +OpStore %i %50 +OpBranch %39 +%40 = OpLabel +OpBranch %37 +%37 = OpLabel +OpBranchConditional %false %35 %36 +%36 = OpLabel +OpBranch %45 +%45 = OpLabel +OpBranch %29 +%29 = OpLabel +%51 = OpLoad %int %c +%52 = OpIAdd %int %51 %int_1 +OpStore %c %52 +OpBranch %27 +%28 = OpLabel +%53 = OpAccessChain %_ptr_Function_float %data %int_0 +%54 = OpLoad %float %53 +%55 = OpCompositeConstruct %v4float %54 %float_0 %float_0 %float_1 +OpStore %_GLF_color %55 +OpReturn +OpFunctionEnd +)"; + + SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + SinglePassRunAndCheck(test, test, true, true); +} + +TEST_F(AggressiveDCETest, EliminateLoopWithUnreachable) { + // #version 430 + // + // layout(std430) buffer U_t + // { + // float g_F[10]; + // float g_S; + // }; + // + // layout(location = 0)out float o; + // + // void main(void) + // { + // // Useless loop + // for (int i = 0; i<10; i++) { + // if (g_F[i] == 0.0) + // break; + // else + // break; + // // Unreachable merge block created here. + // // Need to edit SPIR-V to change to OpUnreachable + // } + // o = g_S; + // } + + const std::string before = + R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" %o +OpExecutionMode %main OriginUpperLeft +OpSource GLSL 430 +OpName %main "main" +OpName %i "i" +OpName %U_t "U_t" +OpMemberName %U_t 0 "g_F" +OpMemberName %U_t 1 "g_S" +OpName %_ "" +OpName %o "o" +OpDecorate %_arr_float_uint_10 ArrayStride 4 +OpMemberDecorate %U_t 0 Offset 0 +OpMemberDecorate %U_t 1 Offset 40 +OpDecorate %U_t BufferBlock +OpDecorate %_ DescriptorSet 0 +OpDecorate %o Location 0 +%void = OpTypeVoid +%9 = OpTypeFunction %void +%int = OpTypeInt 32 1 +%_ptr_Function_int = OpTypePointer Function %int +%int_0 = OpConstant %int 0 +%int_10 = OpConstant %int 10 +%bool = OpTypeBool +%float = OpTypeFloat 32 +%uint = OpTypeInt 32 0 +%uint_10 = OpConstant %uint 10 +%_arr_float_uint_10 = OpTypeArray %float %uint_10 +%U_t = OpTypeStruct %_arr_float_uint_10 %float +%_ptr_Uniform_U_t = OpTypePointer Uniform %U_t +%_ = OpVariable %_ptr_Uniform_U_t Uniform +%_ptr_Uniform_float = OpTypePointer Uniform %float +%float_0 = OpConstant %float 0 +%int_1 = OpConstant %int 1 +%_ptr_Output_float = OpTypePointer Output %float +%o = OpVariable %_ptr_Output_float Output +%main = OpFunction %void None %9 +%23 = OpLabel +%i = OpVariable %_ptr_Function_int Function +OpStore %i %int_0 +OpBranch %24 +%24 = OpLabel +OpLoopMerge %25 %26 None +OpBranch %27 +%27 = OpLabel +%28 = OpLoad %int %i +%29 = OpSLessThan %bool %28 %int_10 +OpBranchConditional %29 %30 %25 +%30 = OpLabel +%31 = OpLoad %int %i +%32 = OpAccessChain %_ptr_Uniform_float %_ %int_0 %31 +%33 = OpLoad %float %32 +%34 = OpFOrdEqual %bool %33 %float_0 +OpSelectionMerge %35 None +OpBranchConditional %34 %36 %37 +%36 = OpLabel +OpBranch %25 +%37 = OpLabel +OpBranch %25 +%35 = OpLabel +OpUnreachable +%26 = OpLabel +%38 = OpLoad %int %i +%39 = OpIAdd %int %38 %int_1 +OpStore %i %39 +OpBranch %24 +%25 = OpLabel +%40 = OpAccessChain %_ptr_Uniform_float %_ %int_1 +%41 = OpLoad %float %40 +OpStore %o %41 +OpReturn +OpFunctionEnd +)"; + + const std::string after = + R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" %o +OpExecutionMode %main OriginUpperLeft +OpSource GLSL 430 +OpName %main "main" +OpName %U_t "U_t" +OpMemberName %U_t 0 "g_F" +OpMemberName %U_t 1 "g_S" +OpName %_ "" +OpName %o "o" +OpDecorate %_arr_float_uint_10 ArrayStride 4 +OpMemberDecorate %U_t 0 Offset 0 +OpMemberDecorate %U_t 1 Offset 40 +OpDecorate %U_t BufferBlock +OpDecorate %_ DescriptorSet 0 +OpDecorate %o Location 0 +%void = OpTypeVoid +%9 = OpTypeFunction %void +%int = OpTypeInt 32 1 +%float = OpTypeFloat 32 +%uint = OpTypeInt 32 0 +%uint_10 = OpConstant %uint 10 +%_arr_float_uint_10 = OpTypeArray %float %uint_10 +%U_t = OpTypeStruct %_arr_float_uint_10 %float +%_ptr_Uniform_U_t = OpTypePointer Uniform %U_t +%_ = OpVariable %_ptr_Uniform_U_t Uniform +%_ptr_Uniform_float = OpTypePointer Uniform %float +%int_1 = OpConstant %int 1 +%_ptr_Output_float = OpTypePointer Output %float +%o = OpVariable %_ptr_Output_float Output +%main = OpFunction %void None %9 +%23 = OpLabel +OpBranch %24 +%24 = OpLabel +OpBranch %25 +%25 = OpLabel +%40 = OpAccessChain %_ptr_Uniform_float %_ %int_1 +%41 = OpLoad %float %40 +OpStore %o %41 +OpReturn +OpFunctionEnd +)"; + + SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + SinglePassRunAndCheck(before, after, true, true); +} + +TEST_F(AggressiveDCETest, DeadHlslCounterBufferGOOGLE) { + // We are able to remove "local2" because it is not loaded, but have to keep + // the stores to "local1". + const std::string test = + R"( +; CHECK-NOT: OpDecorateId +; CHECK: [[var:%\w+]] = OpVariable +; CHECK-NOT: OpVariable +; CHECK: [[ac:%\w+]] = OpAccessChain {{%\w+}} [[var]] +; CHECK: OpStore [[ac]] + OpCapability Shader + OpExtension "SPV_GOOGLE_hlsl_functionality1" + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %1 "main" + OpExecutionMode %1 LocalSize 32 1 1 + OpSource HLSL 600 + OpDecorate %_runtimearr_v2float ArrayStride 8 + OpMemberDecorate %_struct_3 0 Offset 0 + OpDecorate %_struct_3 BufferBlock + OpMemberDecorate %_struct_4 0 Offset 0 + OpDecorate %_struct_4 BufferBlock + OpDecorateId %5 HlslCounterBufferGOOGLE %6 + OpDecorate %5 DescriptorSet 0 + OpDecorate %5 Binding 0 + OpDecorate %6 DescriptorSet 0 + OpDecorate %6 Binding 1 + %float = OpTypeFloat 32 + %v2float = OpTypeVector %float 2 +%_runtimearr_v2float = OpTypeRuntimeArray %v2float + %_struct_3 = OpTypeStruct %_runtimearr_v2float +%_ptr_Uniform__struct_3 = OpTypePointer Uniform %_struct_3 + %int = OpTypeInt 32 1 + %_struct_4 = OpTypeStruct %int +%_ptr_Uniform__struct_4 = OpTypePointer Uniform %_struct_4 + %void = OpTypeVoid + %13 = OpTypeFunction %void + %19 = OpConstantNull %v2float + %int_0 = OpConstant %int 0 +%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float + %5 = OpVariable %_ptr_Uniform__struct_3 Uniform + %6 = OpVariable %_ptr_Uniform__struct_4 Uniform + %1 = OpFunction %void None %13 + %22 = OpLabel + %23 = OpAccessChain %_ptr_Uniform_v2float %5 %int_0 %int_0 + OpStore %23 %19 + OpReturn + OpFunctionEnd +)"; + + SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + SinglePassRunAndMatch(test, true); +} + +TEST_F(AggressiveDCETest, Dead) { + // We are able to remove "local2" because it is not loaded, but have to keep + // the stores to "local1". + const std::string test = + R"( +; CHECK: OpCapability +; CHECK-NOT: OpMemberDecorateStringGOOGLE +; CHECK: OpFunctionEnd + OpCapability Shader + OpExtension "SPV_GOOGLE_hlsl_functionality1" + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Vertex %VSMain "VSMain" + OpSource HLSL 500 + OpName %VSMain "VSMain" + OpName %PSInput "PSInput" + OpMemberName %PSInput 0 "Pos" + OpMemberName %PSInput 1 "uv" + OpMemberDecorateStringGOOGLE %PSInput 0 HlslSemanticGOOGLE "SV_POSITION" + OpMemberDecorateStringGOOGLE %PSInput 1 HlslSemanticGOOGLE "TEX_COORD" + %void = OpTypeVoid + %5 = OpTypeFunction %void + %float = OpTypeFloat 32 +%v2float = OpTypeVector %float 2 +%v4float = OpTypeVector %float 4 +%PSInput = OpTypeStruct %v4float %v2float + %VSMain = OpFunction %void None %5 + %9 = OpLabel + OpReturn + OpFunctionEnd +)"; + + SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + SinglePassRunAndMatch(test, true); +} // TODO(greg-lunarg): Add tests to verify handling of these cases: // // Check that logical addressing required diff --git a/3rdparty/spirv-tools/test/opt/block_merge_test.cpp b/3rdparty/spirv-tools/test/opt/block_merge_test.cpp index aaa70cd4a..654e88019 100644 --- a/3rdparty/spirv-tools/test/opt/block_merge_test.cpp +++ b/3rdparty/spirv-tools/test/opt/block_merge_test.cpp @@ -273,7 +273,6 @@ OpFunctionEnd true); } -#ifdef SPIRV_EFFCEE TEST_F(BlockMergeTest, PhiInSuccessorOfMergedBlock) { const std::string text = R"( ; CHECK: OpSelectionMerge [[merge:%\w+]] None @@ -287,6 +286,7 @@ TEST_F(BlockMergeTest, PhiInSuccessorOfMergedBlock) { OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft %void = OpTypeVoid %bool = OpTypeBool %true = OpConstantTrue %bool @@ -324,6 +324,7 @@ TEST_F(BlockMergeTest, UpdateMergeInstruction) { OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft %void = OpTypeVoid %bool = OpTypeBool %true = OpConstantTrue %bool @@ -358,6 +359,7 @@ TEST_F(BlockMergeTest, TwoMergeBlocksCannotBeMerged) { OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft %void = OpTypeVoid %bool = OpTypeBool %true = OpConstantTrue %bool @@ -398,6 +400,7 @@ TEST_F(BlockMergeTest, MergeContinue) { OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft %void = OpTypeVoid %bool = OpTypeBool %true = OpConstantTrue %bool @@ -431,6 +434,7 @@ TEST_F(BlockMergeTest, TwoHeadersCannotBeMerged) { OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft %void = OpTypeVoid %bool = OpTypeBool %true = OpConstantTrue %bool @@ -532,6 +536,7 @@ TEST_F(BlockMergeTest, DontMergeKill) { OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft %void = OpTypeVoid %bool = OpTypeBool %functy = OpTypeFunction %void @@ -564,6 +569,7 @@ TEST_F(BlockMergeTest, DontMergeUnreachable) { OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft %void = OpTypeVoid %bool = OpTypeBool %functy = OpTypeFunction %void @@ -596,6 +602,7 @@ TEST_F(BlockMergeTest, DontMergeReturn) { OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft %void = OpTypeVoid %bool = OpTypeBool %functy = OpTypeFunction %void @@ -628,6 +635,7 @@ TEST_F(BlockMergeTest, DontMergeSwitch) { OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft %void = OpTypeVoid %bool = OpTypeBool %int = OpTypeInt 32 1 @@ -664,6 +672,7 @@ TEST_F(BlockMergeTest, DontMergeReturnValue) { OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft %void = OpTypeVoid %bool = OpTypeBool %functy = OpTypeFunction %void @@ -691,7 +700,46 @@ OpFunctionEnd SinglePassRunAndMatch(text, true); } -#endif // SPIRV_EFFCEE + +TEST_F(BlockMergeTest, MergeHeaders) { + // Merge two headers when the second is the merge block of the first. + const std::string text = R"( +; CHECK: OpFunction +; CHECK-NEXT: OpLabel +; CHECK-NEXT: OpBranch [[header:%\w+]] +; CHECK-NEXT: [[header]] = OpLabel +; CHECK-NEXT: OpSelectionMerge [[merge:%\w+]] +; CHECK: [[merge]] = OpLabel +; CHEKC: OpReturn +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft +%void = OpTypeVoid +%bool = OpTypeBool +%functy = OpTypeFunction %void +%otherfuncty = OpTypeFunction %bool +%true = OpConstantTrue %bool +%func = OpFunction %void None %functy +%1 = OpLabel +OpBranch %5 +%5 = OpLabel +OpLoopMerge %8 %7 None +OpBranch %8 +%7 = OpLabel +OpBranch %5 +%8 = OpLabel +OpSelectionMerge %m None +OpBranchConditional %true %a %m +%a = OpLabel +OpBranch %m +%m = OpLabel +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} // TODO(greg-lunarg): Add tests to verify handling of these cases: // diff --git a/3rdparty/spirv-tools/test/opt/ccp_test.cpp b/3rdparty/spirv-tools/test/opt/ccp_test.cpp index 5ccea71fb..20d883b0a 100644 --- a/3rdparty/spirv-tools/test/opt/ccp_test.cpp +++ b/3rdparty/spirv-tools/test/opt/ccp_test.cpp @@ -26,8 +26,6 @@ namespace { using CCPTest = PassTest<::testing::Test>; -// TODO(dneto): Add Effcee as required dependency, and make this unconditional. -#ifdef SPIRV_EFFCEE TEST_F(CCPTest, PropagateThroughPhis) { const std::string spv_asm = R"( OpCapability Shader @@ -589,6 +587,7 @@ TEST_F(CCPTest, UpdateSubsequentPhisToVarying) { OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %func "func" %in +OpExecutionMode %func OriginUpperLeft %void = OpTypeVoid %bool = OpTypeBool %int = OpTypeInt 32 1 @@ -743,6 +742,7 @@ TEST_F(CCPTest, NullBranchCondition) { OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft %void = OpTypeVoid %bool = OpTypeBool %int = OpTypeInt 32 1 @@ -774,6 +774,7 @@ TEST_F(CCPTest, UndefBranchCondition) { OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft %void = OpTypeVoid %bool = OpTypeBool %int = OpTypeInt 32 1 @@ -805,6 +806,7 @@ TEST_F(CCPTest, NullSwitchCondition) { OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft %void = OpTypeVoid %int = OpTypeInt 32 1 %null = OpConstantNull %int @@ -835,6 +837,7 @@ TEST_F(CCPTest, UndefSwitchCondition) { OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft %void = OpTypeVoid %int = OpTypeInt 32 1 %undef = OpUndef %int @@ -865,6 +868,7 @@ TEST_F(CCPTest, CompositeConstructOfGlobalValue) { OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %func "func" %in +OpExecutionMode %func OriginUpperLeft %void = OpTypeVoid %int = OpTypeInt 32 1 %bool = OpTypeBool @@ -891,7 +895,6 @@ OpFunctionEnd SinglePassRunAndMatch(text, true); } -#endif } // namespace } // namespace opt diff --git a/3rdparty/spirv-tools/test/opt/cfg_cleanup_test.cpp b/3rdparty/spirv-tools/test/opt/cfg_cleanup_test.cpp index 369c76670..3498f00bb 100644 --- a/3rdparty/spirv-tools/test/opt/cfg_cleanup_test.cpp +++ b/3rdparty/spirv-tools/test/opt/cfg_cleanup_test.cpp @@ -91,6 +91,7 @@ TEST_F(CFGCleanupTest, RemoveDecorations) { %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %main "main" + OpExecutionMode %main OriginUpperLeft OpName %main "main" OpName %x "x" OpName %dead "dead" @@ -123,6 +124,7 @@ TEST_F(CFGCleanupTest, RemoveDecorations) { %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft OpName %main "main" OpName %x "x" OpDecorate %x RelaxedPrecision @@ -153,6 +155,7 @@ TEST_F(CFGCleanupTest, UpdatePhis) { %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %main "main" %y %outparm + OpExecutionMode %main OriginUpperLeft OpName %main "main" OpName %y "y" OpName %outparm "outparm" @@ -194,6 +197,7 @@ TEST_F(CFGCleanupTest, UpdatePhis) { %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %main "main" %y %outparm +OpExecutionMode %main OriginUpperLeft OpName %main "main" OpName %y "y" OpName %outparm "outparm" @@ -272,6 +276,7 @@ TEST_F(CFGCleanupTest, RemovePhiArgsFromFarBlocks) { %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %main "main" %y %outparm + OpExecutionMode %main OriginUpperLeft OpName %main "main" OpName %y "y" OpName %outparm "outparm" @@ -319,6 +324,7 @@ TEST_F(CFGCleanupTest, RemovePhiArgsFromFarBlocks) { %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %main "main" %y %outparm +OpExecutionMode %main OriginUpperLeft OpName %main "main" OpName %y "y" OpName %outparm "outparm" @@ -370,6 +376,7 @@ TEST_F(CFGCleanupTest, RemovePhiConstantArgs) { %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %main "main" %y %outparm + OpExecutionMode %main OriginUpperLeft OpName %main "main" OpName %y "y" OpName %outparm "outparm" @@ -410,6 +417,7 @@ TEST_F(CFGCleanupTest, RemovePhiConstantArgs) { %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %main "main" %y %outparm +OpExecutionMode %main OriginUpperLeft OpName %main "main" OpName %y "y" OpName %outparm "outparm" diff --git a/3rdparty/spirv-tools/test/opt/combine_access_chains_test.cpp b/3rdparty/spirv-tools/test/opt/combine_access_chains_test.cpp index ab9e185b6..aed14c9de 100644 --- a/3rdparty/spirv-tools/test/opt/combine_access_chains_test.cpp +++ b/3rdparty/spirv-tools/test/opt/combine_access_chains_test.cpp @@ -25,7 +25,6 @@ namespace { using CombineAccessChainsTest = PassTest<::testing::Test>; -#ifdef SPIRV_EFFCEE TEST_F(CombineAccessChainsTest, PtrAccessChainFromAccessChainConstant) { const std::string text = R"( ; CHECK: [[int:%\w+]] = OpTypeInt 32 0 @@ -38,6 +37,7 @@ OpCapability VariablePointers OpExtension "SPV_KHR_variable_pointers" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft %void = OpTypeVoid %uint = OpTypeInt 32 0 %uint_0 = OpConstant %uint 0 @@ -71,6 +71,7 @@ OpCapability VariablePointers OpExtension "SPV_KHR_variable_pointers" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft %void = OpTypeVoid %uint = OpTypeInt 32 0 %uint_0 = OpConstant %uint 0 @@ -104,6 +105,7 @@ OpCapability VariablePointers OpExtension "SPV_KHR_variable_pointers" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft %void = OpTypeVoid %uint = OpTypeInt 32 0 %uint_0 = OpConstant %uint 0 @@ -139,6 +141,7 @@ OpCapability VariablePointers OpExtension "SPV_KHR_variable_pointers" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft %void = OpTypeVoid %uint = OpTypeInt 32 0 %uint_0 = OpConstant %uint 0 @@ -177,6 +180,7 @@ OpCapability VariablePointers OpExtension "SPV_KHR_variable_pointers" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft %void = OpTypeVoid %uint = OpTypeInt 32 0 %uint_0 = OpConstant %uint 0 @@ -219,6 +223,7 @@ OpCapability VariablePointers OpExtension "SPV_KHR_variable_pointers" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft %void = OpTypeVoid %uint = OpTypeInt 32 0 %uint_0 = OpConstant %uint 0 @@ -255,6 +260,7 @@ OpCapability VariablePointers OpExtension "SPV_KHR_variable_pointers" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft %void = OpTypeVoid %uint = OpTypeInt 32 0 %uint_0 = OpConstant %uint 0 @@ -289,6 +295,7 @@ OpCapability VariablePointers OpExtension "SPV_KHR_variable_pointers" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft %void = OpTypeVoid %uint = OpTypeInt 32 0 %uint_0 = OpConstant %uint 0 @@ -326,6 +333,7 @@ OpCapability VariablePointers OpExtension "SPV_KHR_variable_pointers" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft %void = OpTypeVoid %uint = OpTypeInt 32 0 %uint_0 = OpConstant %uint 0 @@ -361,6 +369,7 @@ OpCapability VariablePointers OpExtension "SPV_KHR_variable_pointers" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft %void = OpTypeVoid %uint = OpTypeInt 32 0 %uint_0 = OpConstant %uint 0 @@ -399,6 +408,7 @@ OpCapability VariablePointers OpExtension "SPV_KHR_variable_pointers" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft %void = OpTypeVoid %uint = OpTypeInt 32 0 %uint_0 = OpConstant %uint 0 @@ -435,6 +445,7 @@ OpCapability VariablePointers OpExtension "SPV_KHR_variable_pointers" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft %void = OpTypeVoid %uint = OpTypeInt 32 0 %uint_0 = OpConstant %uint 0 @@ -468,6 +479,7 @@ OpCapability VariablePointers OpExtension "SPV_KHR_variable_pointers" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft %void = OpTypeVoid %uint = OpTypeInt 32 0 %uint_0 = OpConstant %uint 0 @@ -505,6 +517,7 @@ OpCapability VariablePointers OpExtension "SPV_KHR_variable_pointers" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft %void = OpTypeVoid %uint = OpTypeInt 32 0 %uint_0 = OpConstant %uint 0 @@ -543,6 +556,7 @@ OpCapability Addresses OpExtension "SPV_KHR_variable_pointers" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft %void = OpTypeVoid %uint = OpTypeInt 32 0 %uint_0 = OpConstant %uint 0 @@ -579,6 +593,7 @@ OpCapability Addresses OpExtension "SPV_KHR_variable_pointers" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft %void = OpTypeVoid %uint = OpTypeInt 32 0 %uint_0 = OpConstant %uint 0 @@ -616,6 +631,7 @@ OpCapability Addresses OpExtension "SPV_KHR_variable_pointers" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft %void = OpTypeVoid %uint = OpTypeInt 32 0 %uint_0 = OpConstant %uint 0 @@ -646,6 +662,7 @@ TEST_F(CombineAccessChainsTest, NoIndexAccessChains) { OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft %void = OpTypeVoid %uint = OpTypeInt 32 0 %ptr_Workgroup_uint = OpTypePointer Workgroup %uint @@ -673,6 +690,7 @@ OpCapability VariablePointers OpExtension "SPV_KHR_variable_pointers" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft %void = OpTypeVoid %uint = OpTypeInt 32 0 %uint_0 = OpConstant %uint 0 @@ -700,6 +718,7 @@ OpCapability VariablePointers OpExtension "SPV_KHR_variable_pointers" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft %void = OpTypeVoid %uint = OpTypeInt 32 0 %uint_0 = OpConstant %uint 0 @@ -729,6 +748,7 @@ OpCapability Addresses OpExtension "SPV_KHR_variable_pointers" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft %void = OpTypeVoid %uint = OpTypeInt 32 0 %int = OpTypeInt 32 1 @@ -747,7 +767,6 @@ OpFunctionEnd SinglePassRunAndMatch(text, true); } -#endif // SPIRV_EFFCEE } // namespace } // namespace opt diff --git a/3rdparty/spirv-tools/test/opt/common_uniform_elim_test.cpp b/3rdparty/spirv-tools/test/opt/common_uniform_elim_test.cpp index f5199ed87..9e3943961 100644 --- a/3rdparty/spirv-tools/test/opt/common_uniform_elim_test.cpp +++ b/3rdparty/spirv-tools/test/opt/common_uniform_elim_test.cpp @@ -1219,7 +1219,6 @@ OpFunctionEnd predefs + after, true, true); } -#ifdef SPIRV_EFFCEE TEST_F(CommonUniformElimTest, MixedConstantAndNonConstantIndexes) { const std::string text = R"( ; CHECK: [[var:%\w+]] = OpVariable {{%\w+}} Uniform @@ -1329,7 +1328,61 @@ TEST_F(CommonUniformElimTest, MixedConstantAndNonConstantIndexes) { SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); SinglePassRunAndMatch(text, true); } -#endif // SPIRV_EFFCEE + +TEST_F(CommonUniformElimTest, LoadPlacedAfterPhi) { + const std::string text = R"( +; CHECK: [[var:%\w+]] = OpVariable {{%\w+}} Uniform +; CHECK: OpSelectionMerge [[merge:%\w+]] +; CHECK: [[merge]] = OpLabel +; CHECK-NEXT: OpPhi +; CHECK-NEXT: OpLoad {{%\w+}} [[var]] + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %2 "main" + OpExecutionMode %2 OriginUpperLeft + OpSource ESSL 310 + OpMemberDecorate %_struct_3 0 Offset 0 + OpDecorate %_struct_3 Block + OpDecorate %4 DescriptorSet 0 + OpDecorate %4 Binding 0 + %void = OpTypeVoid + %6 = OpTypeFunction %void + %bool = OpTypeBool + %false = OpConstantFalse %bool + %uint = OpTypeInt 32 0 + %v2uint = OpTypeVector %uint 2 + %_struct_3 = OpTypeStruct %v2uint +%_ptr_Uniform__struct_3 = OpTypePointer Uniform %_struct_3 + %4 = OpVariable %_ptr_Uniform__struct_3 Uniform + %uint_0 = OpConstant %uint 0 +%_ptr_Uniform_uint = OpTypePointer Uniform %uint + %uint_2 = OpConstant %uint 2 + %2 = OpFunction %void None %6 + %15 = OpLabel + OpSelectionMerge %16 None + OpBranchConditional %false %17 %16 + %17 = OpLabel + OpBranch %16 + %16 = OpLabel + %18 = OpPhi %bool %false %15 %false %17 + OpSelectionMerge %19 None + OpBranchConditional %false %20 %21 + %20 = OpLabel + %22 = OpAccessChain %_ptr_Uniform_uint %4 %uint_0 %uint_0 + %23 = OpLoad %uint %22 + OpBranch %19 + %21 = OpLabel + OpBranch %19 + %19 = OpLabel + OpReturn + OpFunctionEnd +)"; + + SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + SinglePassRunAndMatch(text, true); +} + // TODO(greg-lunarg): Add tests to verify handling of these cases: // // Disqualifying cases: extensions, decorations, non-logical addressing, diff --git a/3rdparty/spirv-tools/test/opt/copy_prop_array_test.cpp b/3rdparty/spirv-tools/test/opt/copy_prop_array_test.cpp index dcce77d22..504ae67e1 100644 --- a/3rdparty/spirv-tools/test/opt/copy_prop_array_test.cpp +++ b/3rdparty/spirv-tools/test/opt/copy_prop_array_test.cpp @@ -25,7 +25,6 @@ namespace { using CopyPropArrayPassTest = PassTest<::testing::Test>; -#ifdef SPIRV_EFFCEE TEST_F(CopyPropArrayPassTest, BasicPropagateArray) { const std::string before = R"( @@ -431,7 +430,7 @@ TEST_F(CopyPropArrayPassTest, DecomposeObjectForArrayStore) { ; CHECK: [[extract1:%\w+]] = OpCompositeExtract %v4float [[load]] 0 ; CHECK: [[extract2:%\w+]] = OpCompositeExtract %v4float [[load]] 1 ; CHECK: [[construct:%\w+]] = OpCompositeConstruct %_arr_v4float_uint_2_0 [[extract1]] [[extract2]] -; CHEKC: OpStore %26 [[construct]] +; CHECK: OpStore %26 [[construct]] OpStore %26 %41 %42 = OpAccessChain %_ptr_Function_v4float %26 %28 %43 = OpLoad %v4float %42 @@ -519,7 +518,7 @@ TEST_F(CopyPropArrayPassTest, DecomposeObjectForStructStore) { ; CHECK: [[extract1:%\w+]] = OpCompositeExtract %float [[load]] 0 ; CHECK: [[extract2:%\w+]] = OpCompositeExtract %uint [[load]] 1 ; CHECK: [[construct:%\w+]] = OpCompositeConstruct [[struct]] [[extract1]] [[extract2]] -; CHEKC: OpStore %26 [[construct]] +; CHECK: OpStore %26 [[construct]] OpStore %26 %41 %42 = OpAccessChain %_ptr_Function_v4float %26 %28 %43 = OpLoad %v4float %42 @@ -620,8 +619,314 @@ OpFunctionEnd SPV_BINARY_TO_TEXT_OPTION_FRIENDLY_NAMES); SinglePassRunAndMatch(before, false); } -#endif // SPIRV_EFFCEE +TEST_F(CopyPropArrayPassTest, IsomorphicTypes1) { + const std::string before = + R"( +; CHECK: [[int:%\w+]] = OpTypeInt 32 0 +; CHECK: [[s1:%\w+]] = OpTypeStruct [[int]] +; CHECK: [[s2:%\w+]] = OpTypeStruct [[s1]] +; CHECK: [[a1:%\w+]] = OpTypeArray [[s2]] +; CHECK: [[s3:%\w+]] = OpTypeStruct [[a1]] +; CHECK: [[p_s3:%\w+]] = OpTypePointer Uniform [[s3]] +; CHECK: [[global_var:%\w+]] = OpVariable [[p_s3]] Uniform +; CHECK: [[p_a1:%\w+]] = OpTypePointer Uniform [[a1]] +; CHECK: [[p_s2:%\w+]] = OpTypePointer Uniform [[s2]] +; CHECK: [[ac1:%\w+]] = OpAccessChain [[p_a1]] [[global_var]] %uint_0 +; CHECK: [[ac2:%\w+]] = OpAccessChain [[p_s2]] [[ac1]] %uint_0 +; CHECK: [[ld:%\w+]] = OpLoad [[s2]] [[ac2]] +; CHECK: [[ex:%\w+]] = OpCompositeExtract [[s1]] [[ld]] + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %2 "PS_main" + OpExecutionMode %2 OriginUpperLeft + OpSource HLSL 600 + OpDecorate %3 DescriptorSet 0 + OpDecorate %3 Binding 101 + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %s1 = OpTypeStruct %uint + %s2 = OpTypeStruct %s1 +%a1 = OpTypeArray %s2 %uint_1 + %s3 = OpTypeStruct %a1 + %s1_1 = OpTypeStruct %uint +%_ptr_Uniform_uint = OpTypePointer Uniform %uint + %void = OpTypeVoid + %13 = OpTypeFunction %void + %uint_0 = OpConstant %uint 0 + %s1_0 = OpTypeStruct %uint + %s2_0 = OpTypeStruct %s1_0 +%a1_0 = OpTypeArray %s2_0 %uint_1 + %s3_0 = OpTypeStruct %a1_0 +%p_s3 = OpTypePointer Uniform %s3 +%p_s3_0 = OpTypePointer Function %s3_0 + %3 = OpVariable %p_s3 Uniform +%p_a1_0 = OpTypePointer Function %a1_0 +%p_s2_0 = OpTypePointer Function %s2_0 + %2 = OpFunction %void None %13 + %20 = OpLabel + %21 = OpVariable %p_a1_0 Function + %22 = OpLoad %s3 %3 + %23 = OpCompositeExtract %a1 %22 0 + %24 = OpCompositeExtract %s2 %23 0 + %25 = OpCompositeExtract %s1 %24 0 + %26 = OpCompositeExtract %uint %25 0 + %27 = OpCompositeConstruct %s1_0 %26 + %32 = OpCompositeConstruct %s2_0 %27 + %28 = OpCompositeConstruct %a1_0 %32 + OpStore %21 %28 + %29 = OpAccessChain %p_s2_0 %21 %uint_0 + %30 = OpLoad %s2 %29 + %31 = OpCompositeExtract %s1 %30 0 + OpReturn + OpFunctionEnd +)"; + + SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER | + SPV_BINARY_TO_TEXT_OPTION_FRIENDLY_NAMES); + SinglePassRunAndMatch(before, false); +} + +TEST_F(CopyPropArrayPassTest, IsomorphicTypes2) { + const std::string before = + R"( +; CHECK: [[int:%\w+]] = OpTypeInt 32 0 +; CHECK: [[s1:%\w+]] = OpTypeStruct [[int]] +; CHECK: [[s2:%\w+]] = OpTypeStruct [[s1]] +; CHECK: [[a1:%\w+]] = OpTypeArray [[s2]] +; CHECK: [[s3:%\w+]] = OpTypeStruct [[a1]] +; CHECK: [[p_s3:%\w+]] = OpTypePointer Uniform [[s3]] +; CHECK: [[global_var:%\w+]] = OpVariable [[p_s3]] Uniform +; CHECK: [[p_s2:%\w+]] = OpTypePointer Uniform [[s2]] +; CHECK: [[p_s1:%\w+]] = OpTypePointer Uniform [[s1]] +; CHECK: [[ac1:%\w+]] = OpAccessChain [[p_s2]] [[global_var]] %uint_0 %uint_0 +; CHECK: [[ac2:%\w+]] = OpAccessChain [[p_s1]] [[ac1]] %uint_0 +; CHECK: [[ld:%\w+]] = OpLoad [[s1]] [[ac2]] +; CHECK: [[ex:%\w+]] = OpCompositeExtract [[int]] [[ld]] + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %2 "PS_main" + OpExecutionMode %2 OriginUpperLeft + OpSource HLSL 600 + OpDecorate %3 DescriptorSet 0 + OpDecorate %3 Binding 101 + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %_struct_6 = OpTypeStruct %uint + %_struct_7 = OpTypeStruct %_struct_6 +%_arr__struct_7_uint_1 = OpTypeArray %_struct_7 %uint_1 + %_struct_9 = OpTypeStruct %_arr__struct_7_uint_1 + %_struct_10 = OpTypeStruct %uint +%_ptr_Uniform_uint = OpTypePointer Uniform %uint + %void = OpTypeVoid + %13 = OpTypeFunction %void + %uint_0 = OpConstant %uint 0 + %_struct_15 = OpTypeStruct %uint +%_arr__struct_15_uint_1 = OpTypeArray %_struct_15 %uint_1 +%_ptr_Uniform__struct_9 = OpTypePointer Uniform %_struct_9 +%_ptr_Function__struct_15 = OpTypePointer Function %_struct_15 + %3 = OpVariable %_ptr_Uniform__struct_9 Uniform +%_ptr_Function__arr__struct_15_uint_1 = OpTypePointer Function %_arr__struct_15_uint_1 + %2 = OpFunction %void None %13 + %20 = OpLabel + %21 = OpVariable %_ptr_Function__arr__struct_15_uint_1 Function + %22 = OpLoad %_struct_9 %3 + %23 = OpCompositeExtract %_arr__struct_7_uint_1 %22 0 + %24 = OpCompositeExtract %_struct_7 %23 0 + %25 = OpCompositeExtract %_struct_6 %24 0 + %26 = OpCompositeExtract %uint %25 0 + %27 = OpCompositeConstruct %_struct_15 %26 + %28 = OpCompositeConstruct %_arr__struct_15_uint_1 %27 + OpStore %21 %28 + %29 = OpAccessChain %_ptr_Function__struct_15 %21 %uint_0 + %30 = OpLoad %_struct_15 %29 + %31 = OpCompositeExtract %uint %30 0 + OpReturn + OpFunctionEnd +)"; + + SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER | + SPV_BINARY_TO_TEXT_OPTION_FRIENDLY_NAMES); + SinglePassRunAndMatch(before, false); +} + +TEST_F(CopyPropArrayPassTest, IsomorphicTypes3) { + const std::string before = + R"( +; CHECK: [[int:%\w+]] = OpTypeInt 32 0 +; CHECK: [[s1:%\w+]] = OpTypeStruct [[int]] +; CHECK: [[s2:%\w+]] = OpTypeStruct [[s1]] +; CHECK: [[a1:%\w+]] = OpTypeArray [[s2]] +; CHECK: [[s3:%\w+]] = OpTypeStruct [[a1]] +; CHECK: [[s1_1:%\w+]] = OpTypeStruct [[int]] +; CHECK: [[p_s3:%\w+]] = OpTypePointer Uniform [[s3]] +; CHECK: [[p_s1_1:%\w+]] = OpTypePointer Function [[s1_1]] +; CHECK: [[global_var:%\w+]] = OpVariable [[p_s3]] Uniform +; CHECK: [[p_s2:%\w+]] = OpTypePointer Uniform [[s2]] +; CHECK: [[p_s1:%\w+]] = OpTypePointer Uniform [[s1]] +; CHECK: [[var:%\w+]] = OpVariable [[p_s1_1]] Function +; CHECK: [[ac1:%\w+]] = OpAccessChain [[p_s2]] [[global_var]] %uint_0 %uint_0 +; CHECK: [[ac2:%\w+]] = OpAccessChain [[p_s1]] [[ac1]] %uint_0 +; CHECK: [[ld:%\w+]] = OpLoad [[s1]] [[ac2]] +; CHECK: [[ex:%\w+]] = OpCompositeExtract [[int]] [[ld]] +; CHECK: [[copy:%\w+]] = OpCompositeConstruct [[s1_1]] [[ex]] +; CHECK: OpStore [[var]] [[copy]] + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %2 "PS_main" + OpExecutionMode %2 OriginUpperLeft + OpSource HLSL 600 + OpDecorate %3 DescriptorSet 0 + OpDecorate %3 Binding 101 + %uint = OpTypeInt 32 0 + %uint_1 = OpConstant %uint 1 + %_struct_6 = OpTypeStruct %uint + %_struct_7 = OpTypeStruct %_struct_6 +%_arr__struct_7_uint_1 = OpTypeArray %_struct_7 %uint_1 + %_struct_9 = OpTypeStruct %_arr__struct_7_uint_1 +%_ptr_Uniform_uint = OpTypePointer Uniform %uint + %void = OpTypeVoid + %13 = OpTypeFunction %void + %uint_0 = OpConstant %uint 0 + %_struct_15 = OpTypeStruct %uint + %_struct_10 = OpTypeStruct %uint +%_arr__struct_15_uint_1 = OpTypeArray %_struct_15 %uint_1 +%_ptr_Uniform__struct_9 = OpTypePointer Uniform %_struct_9 +%_ptr_Function__struct_15 = OpTypePointer Function %_struct_15 + %3 = OpVariable %_ptr_Uniform__struct_9 Uniform +%_ptr_Function__arr__struct_15_uint_1 = OpTypePointer Function %_arr__struct_15_uint_1 + %2 = OpFunction %void None %13 + %20 = OpLabel + %21 = OpVariable %_ptr_Function__arr__struct_15_uint_1 Function + %var = OpVariable %_ptr_Function__struct_15 Function + %22 = OpLoad %_struct_9 %3 + %23 = OpCompositeExtract %_arr__struct_7_uint_1 %22 0 + %24 = OpCompositeExtract %_struct_7 %23 0 + %25 = OpCompositeExtract %_struct_6 %24 0 + %26 = OpCompositeExtract %uint %25 0 + %27 = OpCompositeConstruct %_struct_15 %26 + %28 = OpCompositeConstruct %_arr__struct_15_uint_1 %27 + OpStore %21 %28 + %29 = OpAccessChain %_ptr_Function__struct_15 %21 %uint_0 + %30 = OpLoad %_struct_15 %29 + OpStore %var %30 + OpReturn + OpFunctionEnd +)"; + + SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER | + SPV_BINARY_TO_TEXT_OPTION_FRIENDLY_NAMES); + SinglePassRunAndMatch(before, false); +} + +TEST_F(CopyPropArrayPassTest, BadMergingTwoObjects) { + // The second element in the |OpCompositeConstruct| is from a different + // object. + const std::string text = + R"(OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft +OpName %type_ConstBuf "type.ConstBuf" +OpMemberName %type_ConstBuf 0 "TexSizeU" +OpMemberName %type_ConstBuf 1 "TexSizeV" +OpName %ConstBuf "ConstBuf" +OpName %main "main" +OpMemberDecorate %type_ConstBuf 0 Offset 0 +OpMemberDecorate %type_ConstBuf 1 Offset 8 +OpDecorate %type_ConstBuf Block +OpDecorate %ConstBuf DescriptorSet 0 +OpDecorate %ConstBuf Binding 2 +%float = OpTypeFloat 32 +%v2float = OpTypeVector %float 2 +%type_ConstBuf = OpTypeStruct %v2float %v2float +%_ptr_Uniform_type_ConstBuf = OpTypePointer Uniform %type_ConstBuf +%void = OpTypeVoid +%9 = OpTypeFunction %void +%uint = OpTypeInt 32 0 +%int_0 = OpConstant %uint 0 +%uint_2 = OpConstant %uint 2 +%_arr_v2float_uint_2 = OpTypeArray %v2float %uint_2 +%_ptr_Function__arr_v2float_uint_2 = OpTypePointer Function %_arr_v2float_uint_2 +%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float +%ConstBuf = OpVariable %_ptr_Uniform_type_ConstBuf Uniform +%main = OpFunction %void None %9 +%24 = OpLabel +%25 = OpVariable %_ptr_Function__arr_v2float_uint_2 Function +%27 = OpAccessChain %_ptr_Uniform_v2float %ConstBuf %int_0 +%28 = OpLoad %v2float %27 +%29 = OpAccessChain %_ptr_Uniform_v2float %ConstBuf %int_0 +%30 = OpLoad %v2float %29 +%31 = OpFNegate %v2float %30 +%37 = OpCompositeConstruct %_arr_v2float_uint_2 %28 %31 +OpStore %25 %37 +OpReturn +OpFunctionEnd +)"; + + auto result = SinglePassRunAndDisassemble( + text, /* skip_nop = */ true, /* do_validation = */ false); + EXPECT_EQ(Pass::Status::SuccessWithoutChange, std::get<1>(result)); +} + +TEST_F(CopyPropArrayPassTest, SecondElementNotContained) { + // The second element in the |OpCompositeConstruct| is not a memory object. + // Make sure no change happends. + const std::string text = + R"(OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft +OpName %type_ConstBuf "type.ConstBuf" +OpMemberName %type_ConstBuf 0 "TexSizeU" +OpMemberName %type_ConstBuf 1 "TexSizeV" +OpName %ConstBuf "ConstBuf" +OpName %main "main" +OpMemberDecorate %type_ConstBuf 0 Offset 0 +OpMemberDecorate %type_ConstBuf 1 Offset 8 +OpDecorate %type_ConstBuf Block +OpDecorate %ConstBuf DescriptorSet 0 +OpDecorate %ConstBuf Binding 2 +OpDecorate %ConstBuf2 DescriptorSet 1 +OpDecorate %ConstBuf2 Binding 2 +%float = OpTypeFloat 32 +%v2float = OpTypeVector %float 2 +%type_ConstBuf = OpTypeStruct %v2float %v2float +%_ptr_Uniform_type_ConstBuf = OpTypePointer Uniform %type_ConstBuf +%void = OpTypeVoid +%9 = OpTypeFunction %void +%uint = OpTypeInt 32 0 +%int_0 = OpConstant %uint 0 +%int_1 = OpConstant %uint 1 +%uint_2 = OpConstant %uint 2 +%_arr_v2float_uint_2 = OpTypeArray %v2float %uint_2 +%_ptr_Function__arr_v2float_uint_2 = OpTypePointer Function %_arr_v2float_uint_2 +%_ptr_Uniform_v2float = OpTypePointer Uniform %v2float +%ConstBuf = OpVariable %_ptr_Uniform_type_ConstBuf Uniform +%ConstBuf2 = OpVariable %_ptr_Uniform_type_ConstBuf Uniform +%main = OpFunction %void None %9 +%24 = OpLabel +%25 = OpVariable %_ptr_Function__arr_v2float_uint_2 Function +%27 = OpAccessChain %_ptr_Uniform_v2float %ConstBuf %int_0 +%28 = OpLoad %v2float %27 +%29 = OpAccessChain %_ptr_Uniform_v2float %ConstBuf2 %int_1 +%30 = OpLoad %v2float %29 +%37 = OpCompositeConstruct %_arr_v2float_uint_2 %28 %30 +OpStore %25 %37 +OpReturn +OpFunctionEnd +)"; + + auto result = SinglePassRunAndDisassemble( + text, /* skip_nop = */ true, /* do_validation = */ false); + EXPECT_EQ(Pass::Status::SuccessWithoutChange, std::get<1>(result)); +} // This test will place a load before the store. We cannot propagate in this // case. TEST_F(CopyPropArrayPassTest, LoadBeforeStore) { diff --git a/3rdparty/spirv-tools/test/opt/dead_branch_elim_test.cpp b/3rdparty/spirv-tools/test/opt/dead_branch_elim_test.cpp index 29084e3bb..66e3bddf7 100644 --- a/3rdparty/spirv-tools/test/opt/dead_branch_elim_test.cpp +++ b/3rdparty/spirv-tools/test/opt/dead_branch_elim_test.cpp @@ -1348,7 +1348,6 @@ OpFunctionEnd true, true); } -#ifdef SPIRV_EFFCEE TEST_F(DeadBranchElimTest, LeaveContinueBackedge) { const std::string text = R"( ; CHECK: OpLoopMerge [[merge:%\w+]] [[continue:%\w+]] None @@ -2018,6 +2017,7 @@ TEST_F(DeadBranchElimTest, ReorderBlocks) { OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft %void = OpTypeVoid %bool = OpTypeBool %true = OpConstantTrue %bool @@ -2045,6 +2045,7 @@ TEST_F(DeadBranchElimTest, ReorderBlocksMultiple) { OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft %void = OpTypeVoid %bool = OpTypeBool %true = OpConstantTrue %bool @@ -2073,6 +2074,7 @@ TEST_F(DeadBranchElimTest, ReorderBlocksMultiple2) { OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft %void = OpTypeVoid %bool = OpTypeBool %true = OpConstantTrue %bool @@ -2193,7 +2195,678 @@ OpFunctionEnd SinglePassRunAndMatch(predefs + body, true); } -#endif + +TEST_F(DeadBranchElimTest, SelectionMergeWithConditionalExit) { + // Checks that if a selection merge construct contains a conditional branch + // to the merge node, then we keep the OpSelectionMerge on that branch. + const std::string predefs = R"( +OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft +OpSource GLSL 140 +%void = OpTypeVoid +%func_type = OpTypeFunction %void +%bool = OpTypeBool +%true = OpConstantTrue %bool +%uint = OpTypeInt 32 0 +%undef_int = OpUndef %uint +)"; + + const std::string body = + R"( +; CHECK: OpLoopMerge [[loop_merge:%\w+]] +; CHECK-NEXT: OpBranch [[bb1:%\w+]] +; CHECK: [[bb1]] = OpLabel +; CHECK-NEXT: OpBranch [[bb2:%\w+]] +; CHECK: [[bb2]] = OpLabel +; CHECK-NEXT: OpSelectionMerge [[sel_merge:%\w+]] None +; CHECK-NEXT: OpSwitch {{%\w+}} [[sel_merge]] 1 [[bb3:%\w+]] +; CHECK: [[bb3]] = OpLabel +; CHECK-NEXT: OpBranch [[sel_merge]] +; CHECK: [[sel_merge]] = OpLabel +; CHECK-NEXT: OpBranch [[loop_merge]] +; CHECK: [[loop_merge]] = OpLabel +; CHECK-NEXT: OpReturn +%main = OpFunction %void None %func_type +%entry_bb = OpLabel +OpBranch %loop_header +%loop_header = OpLabel +OpLoopMerge %loop_merge %cont None +OpBranch %bb1 +%bb1 = OpLabel +OpSelectionMerge %sel_merge None +OpBranchConditional %true %bb2 %bb4 +%bb2 = OpLabel +OpSwitch %undef_int %sel_merge 1 %bb3 +%bb3 = OpLabel +OpBranch %sel_merge +%bb4 = OpLabel +OpBranch %sel_merge +%sel_merge = OpLabel +OpBranch %loop_merge +%cont = OpLabel +OpBranch %loop_header +%loop_merge = OpLabel +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(predefs + body, true); +} + +TEST_F(DeadBranchElimTest, SelectionMergeWithExitToLoop) { + // Checks that if a selection merge construct contains a conditional branch + // to a loop surrounding the selection merge, then we do not keep the + // OpSelectionMerge instruction. + const std::string predefs = R"( +OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft +OpSource GLSL 140 +%void = OpTypeVoid +%func_type = OpTypeFunction %void +%bool = OpTypeBool +%true = OpConstantTrue %bool +%undef_bool = OpUndef %bool +)"; + + const std::string body = + R"( +; CHECK: OpLoopMerge [[loop_merge:%\w+]] +; CHECK-NEXT: OpBranch [[bb1:%\w+]] +; CHECK: [[bb1]] = OpLabel +; CHECK-NEXT: OpBranch [[bb2:%\w+]] +; CHECK: [[bb2]] = OpLabel +; CHECK-NEXT: OpBranchConditional {{%\w+}} [[bb3:%\w+]] [[loop_merge]] +; CHECK: [[bb3]] = OpLabel +; CHECK-NEXT: OpBranch [[sel_merge:%\w+]] +; CHECK: [[sel_merge]] = OpLabel +; CHECK-NEXT: OpBranch [[loop_merge]] +; CHECK: [[loop_merge]] = OpLabel +; CHECK-NEXT: OpReturn +%main = OpFunction %void None %func_type +%entry_bb = OpLabel +OpBranch %loop_header +%loop_header = OpLabel +OpLoopMerge %loop_merge %cont None +OpBranch %bb1 +%bb1 = OpLabel +OpSelectionMerge %sel_merge None +OpBranchConditional %true %bb2 %bb4 +%bb2 = OpLabel +OpBranchConditional %undef_bool %bb3 %loop_merge +%bb3 = OpLabel +OpBranch %sel_merge +%bb4 = OpLabel +OpBranch %sel_merge +%sel_merge = OpLabel +OpBranch %loop_merge +%cont = OpLabel +OpBranch %loop_header +%loop_merge = OpLabel +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(predefs + body, true); +} + +TEST_F(DeadBranchElimTest, SelectionMergeWithExitToLoopContinue) { + // Checks that if a selection merge construct contains a conditional branch + // to continue of a loop surrounding the selection merge, then we do not keep + // the OpSelectionMerge instruction. + const std::string predefs = R"( +OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft +OpSource GLSL 140 +%void = OpTypeVoid +%func_type = OpTypeFunction %void +%bool = OpTypeBool +%true = OpConstantTrue %bool +%undef_bool = OpUndef %bool +)"; + + const std::string body = + R"(; +; CHECK: OpLabel +; CHECK: [[loop_header:%\w+]] = OpLabel +; CHECK: OpLoopMerge [[loop_merge:%\w+]] [[loop_cont:%\w+]] +; CHECK-NEXT: OpBranch [[bb1:%\w+]] +; CHECK: [[bb1]] = OpLabel +; CHECK-NEXT: OpBranch [[bb2:%\w+]] +; CHECK: [[bb2]] = OpLabel +; CHECK-NEXT: OpBranchConditional {{%\w+}} [[bb3:%\w+]] [[loop_cont]] +; CHECK: [[bb3]] = OpLabel +; CHECK-NEXT: OpBranch [[sel_merge:%\w+]] +; CHECK: [[sel_merge]] = OpLabel +; CHECK-NEXT: OpBranch [[loop_merge]] +; CHECK: [[loop_cont]] = OpLabel +; CHECK-NEXT: OpBranch [[loop_header]] +; CHECK: [[loop_merge]] = OpLabel +; CHECK-NEXT: OpReturn +%main = OpFunction %void None %func_type +%entry_bb = OpLabel +OpBranch %loop_header +%loop_header = OpLabel +OpLoopMerge %loop_merge %cont None +OpBranch %bb1 +%bb1 = OpLabel +OpSelectionMerge %sel_merge None +OpBranchConditional %true %bb2 %bb4 +%bb2 = OpLabel +OpBranchConditional %undef_bool %bb3 %cont +%bb3 = OpLabel +OpBranch %sel_merge +%bb4 = OpLabel +OpBranch %sel_merge +%sel_merge = OpLabel +OpBranch %loop_merge +%cont = OpLabel +OpBranch %loop_header +%loop_merge = OpLabel +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(predefs + body, true); +} + +TEST_F(DeadBranchElimTest, SelectionMergeWithExitToLoop2) { + // Same as |SelectionMergeWithExitToLoop|, except the switch goes to the loop + // merge or the selection merge. In this case, we do not need an + // OpSelectionMerge either. + const std::string predefs = R"( +OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft +OpSource GLSL 140 +%void = OpTypeVoid +%func_type = OpTypeFunction %void +%bool = OpTypeBool +%true = OpConstantTrue %bool +%undef_bool = OpUndef %bool +)"; + + const std::string body = + R"( +; CHECK: OpLoopMerge [[loop_merge:%\w+]] +; CHECK-NEXT: OpBranch [[bb1:%\w+]] +; CHECK: [[bb1]] = OpLabel +; CHECK-NEXT: OpBranch [[bb2:%\w+]] +; CHECK: [[bb2]] = OpLabel +; CHECK-NEXT: OpBranchConditional {{%\w+}} [[sel_merge:%\w+]] [[loop_merge]] +; CHECK: [[sel_merge]] = OpLabel +; CHECK-NEXT: OpBranch [[loop_merge]] +; CHECK: [[loop_merge]] = OpLabel +; CHECK-NEXT: OpReturn +%main = OpFunction %void None %func_type +%entry_bb = OpLabel +OpBranch %loop_header +%loop_header = OpLabel +OpLoopMerge %loop_merge %cont None +OpBranch %bb1 +%bb1 = OpLabel +OpSelectionMerge %sel_merge None +OpBranchConditional %true %bb2 %bb4 +%bb2 = OpLabel +OpBranchConditional %undef_bool %sel_merge %loop_merge +%bb4 = OpLabel +OpBranch %sel_merge +%sel_merge = OpLabel +OpBranch %loop_merge +%cont = OpLabel +OpBranch %loop_header +%loop_merge = OpLabel +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(predefs + body, true); +} + +TEST_F(DeadBranchElimTest, SelectionMergeWithExitToLoopContinue2) { + // Same as |SelectionMergeWithExitToLoopContinue|, except the branch goes to + // the loop continue or the selection merge. In this case, we do not need an + // OpSelectionMerge either. + const std::string predefs = R"( +OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft +OpSource GLSL 140 +%void = OpTypeVoid +%func_type = OpTypeFunction %void +%bool = OpTypeBool +%true = OpConstantTrue %bool +%undef_bool = OpUndef %bool +)"; + + const std::string body = + R"( +; CHECK: OpLabel +; CHECK: [[loop_header:%\w+]] = OpLabel +; CHECK: OpLoopMerge [[loop_merge:%\w+]] [[loop_cont:%\w+]] +; CHECK-NEXT: OpBranch [[bb1:%\w+]] +; CHECK: [[bb1]] = OpLabel +; CHECK-NEXT: OpBranch [[bb2:%\w+]] +; CHECK: [[bb2]] = OpLabel +; CHECK-NEXT: OpBranchConditional {{%\w+}} [[sel_merge:%\w+]] [[loop_cont]] +; CHECK: [[sel_merge]] = OpLabel +; CHECK-NEXT: OpBranch [[loop_merge]] +; CHECK: [[loop_cont]] = OpLabel +; CHECK: OpBranch [[loop_header]] +; CHECK: [[loop_merge]] = OpLabel +; CHECK-NEXT: OpReturn +%main = OpFunction %void None %func_type +%entry_bb = OpLabel +OpBranch %loop_header +%loop_header = OpLabel +OpLoopMerge %loop_merge %cont None +OpBranch %bb1 +%bb1 = OpLabel +OpSelectionMerge %sel_merge None +OpBranchConditional %true %bb2 %bb4 +%bb2 = OpLabel +OpBranchConditional %undef_bool %sel_merge %cont +%bb4 = OpLabel +OpBranch %sel_merge +%sel_merge = OpLabel +OpBranch %loop_merge +%cont = OpLabel +OpBranch %loop_header +%loop_merge = OpLabel +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(predefs + body, true); +} + +TEST_F(DeadBranchElimTest, SelectionMergeWithExitToLoop3) { + // Checks that if a selection merge construct contains a conditional branch + // to the merge of a surrounding loop, the selection merge, and another block + // inside the selection merge, then we must keep the OpSelectionMerge + // instruction on that branch. + const std::string predefs = R"( +OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft +OpSource GLSL 140 +%void = OpTypeVoid +%func_type = OpTypeFunction %void +%bool = OpTypeBool +%true = OpConstantTrue %bool +%uint = OpTypeInt 32 0 +%undef_int = OpUndef %uint +)"; + + const std::string body = + R"( +; CHECK: OpLoopMerge [[loop_merge:%\w+]] +; CHECK-NEXT: OpBranch [[bb1:%\w+]] +; CHECK: [[bb1]] = OpLabel +; CHECK-NEXT: OpBranch [[bb2:%\w+]] +; CHECK: [[bb2]] = OpLabel +; CHECK-NEXT: OpSelectionMerge [[sel_merge:%\w+]] None +; CHECK-NEXT: OpSwitch {{%\w+}} [[sel_merge]] 0 [[loop_merge]] 1 [[bb3:%\w+]] +; CHECK: [[bb3]] = OpLabel +; CHECK-NEXT: OpBranch [[sel_merge]] +; CHECK: [[sel_merge]] = OpLabel +; CHECK-NEXT: OpBranch [[loop_merge]] +; CHECK: [[loop_merge]] = OpLabel +; CHECK-NEXT: OpReturn +%main = OpFunction %void None %func_type +%entry_bb = OpLabel +OpBranch %loop_header +%loop_header = OpLabel +OpLoopMerge %loop_merge %cont None +OpBranch %bb1 +%bb1 = OpLabel +OpSelectionMerge %sel_merge None +OpBranchConditional %true %bb2 %bb4 +%bb2 = OpLabel +OpSwitch %undef_int %sel_merge 0 %loop_merge 1 %bb3 +%bb3 = OpLabel +OpBranch %sel_merge +%bb4 = OpLabel +OpBranch %sel_merge +%sel_merge = OpLabel +OpBranch %loop_merge +%cont = OpLabel +OpBranch %loop_header +%loop_merge = OpLabel +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(predefs + body, true); +} + +TEST_F(DeadBranchElimTest, SelectionMergeWithExitToLoopContinue3) { + // Checks that if a selection merge construct contains a conditional branch + // to the merge of a surrounding loop, the selection merge, and another block + // inside the selection merge, then we must keep the OpSelectionMerge + // instruction on that branch. + const std::string predefs = R"( +OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft +OpSource GLSL 140 +%void = OpTypeVoid +%func_type = OpTypeFunction %void +%bool = OpTypeBool +%true = OpConstantTrue %bool +%uint = OpTypeInt 32 0 +%undef_int = OpUndef %uint +)"; + + const std::string body = + R"( +; CHECK: OpLabel +; CHECK: [[loop_header:%\w+]] = OpLabel +; CHECK: OpLoopMerge [[loop_merge:%\w+]] [[loop_continue:%\w+]] +; CHECK-NEXT: OpBranch [[bb1:%\w+]] +; CHECK: [[bb1]] = OpLabel +; CHECK-NEXT: OpBranch [[bb2:%\w+]] +; CHECK: [[bb2]] = OpLabel +; CHECK-NEXT: OpSelectionMerge [[sel_merge:%\w+]] None +; CHECK-NEXT: OpSwitch {{%\w+}} [[sel_merge]] 0 [[loop_continue]] 1 [[bb3:%\w+]] +; CHECK: [[bb3]] = OpLabel +; CHECK-NEXT: OpBranch [[sel_merge]] +; CHECK: [[sel_merge]] = OpLabel +; CHECK-NEXT: OpBranch [[loop_merge]] +; CHECK: [[loop_continue]] = OpLabel +; CHECK-NEXT: OpBranch [[loop_header]] +; CHECK: [[loop_merge]] = OpLabel +; CHECK-NEXT: OpReturn +%main = OpFunction %void None %func_type +%entry_bb = OpLabel +OpBranch %loop_header +%loop_header = OpLabel +OpLoopMerge %loop_merge %cont None +OpBranch %bb1 +%bb1 = OpLabel +OpSelectionMerge %sel_merge None +OpBranchConditional %true %bb2 %bb4 +%bb2 = OpLabel +OpSwitch %undef_int %sel_merge 0 %cont 1 %bb3 +%bb3 = OpLabel +OpBranch %sel_merge +%bb4 = OpLabel +OpBranch %sel_merge +%sel_merge = OpLabel +OpBranch %loop_merge +%cont = OpLabel +OpBranch %loop_header +%loop_merge = OpLabel +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(predefs + body, true); +} + +TEST_F(DeadBranchElimTest, SelectionMergeWithExitToLoop4) { + // Same as |SelectionMergeWithExitToLoop|, except the branch in the selection + // construct is an |OpSwitch| instead of an |OpConditionalBranch|. The + // OpSelectionMerge instruction is not needed in this case either. + const std::string predefs = R"( +OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft +OpSource GLSL 140 +%void = OpTypeVoid +%func_type = OpTypeFunction %void +%bool = OpTypeBool +%true = OpConstantTrue %bool +%uint = OpTypeInt 32 0 +%undef_int = OpUndef %uint +)"; + + const std::string body = + R"( +; CHECK: OpLoopMerge [[loop_merge:%\w+]] +; CHECK-NEXT: OpBranch [[bb1:%\w+]] +; CHECK: [[bb1]] = OpLabel +; CHECK-NEXT: OpBranch [[bb2:%\w+]] +; CHECK: [[bb2]] = OpLabel +; CHECK-NEXT: OpSwitch {{%\w+}} [[bb3:%\w+]] 0 [[loop_merge]] 1 [[bb3:%\w+]] +; CHECK: [[bb3]] = OpLabel +; CHECK-NEXT: OpBranch [[sel_merge:%\w+]] +; CHECK: [[sel_merge]] = OpLabel +; CHECK-NEXT: OpBranch [[loop_merge]] +; CHECK: [[loop_merge]] = OpLabel +; CHECK-NEXT: OpReturn +%main = OpFunction %void None %func_type +%entry_bb = OpLabel +OpBranch %loop_header +%loop_header = OpLabel +OpLoopMerge %loop_merge %cont None +OpBranch %bb1 +%bb1 = OpLabel +OpSelectionMerge %sel_merge None +OpBranchConditional %true %bb2 %bb4 +%bb2 = OpLabel +OpSwitch %undef_int %bb3 0 %loop_merge 1 %bb3 +%bb3 = OpLabel +OpBranch %sel_merge +%bb4 = OpLabel +OpBranch %sel_merge +%sel_merge = OpLabel +OpBranch %loop_merge +%cont = OpLabel +OpBranch %loop_header +%loop_merge = OpLabel +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(predefs + body, true); +} + +TEST_F(DeadBranchElimTest, SelectionMergeWithExitToLoopContinue4) { + // Same as |SelectionMergeWithExitToLoopContinue|, except the branch in the + // selection construct is an |OpSwitch| instead of an |OpConditionalBranch|. + // The OpSelectionMerge instruction is not needed in this case either. + const std::string predefs = R"( +OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft +OpSource GLSL 140 +%void = OpTypeVoid +%func_type = OpTypeFunction %void +%bool = OpTypeBool +%true = OpConstantTrue %bool +%uint = OpTypeInt 32 0 +%undef_int = OpUndef %uint +)"; + + const std::string body = + R"( +; CHECK: OpLoopMerge [[loop_merge:%\w+]] [[loop_cont:%\w+]] +; CHECK-NEXT: OpBranch [[bb1:%\w+]] +; CHECK: [[bb1]] = OpLabel +; CHECK-NEXT: OpBranch [[bb2:%\w+]] +; CHECK: [[bb2]] = OpLabel +; CHECK-NEXT: OpSwitch {{%\w+}} [[bb3:%\w+]] 0 [[loop_cont]] 1 [[bb3:%\w+]] +; CHECK: [[bb3]] = OpLabel +; CHECK-NEXT: OpBranch [[sel_merge:%\w+]] +; CHECK: [[sel_merge]] = OpLabel +; CHECK-NEXT: OpBranch [[loop_merge]] +; CHECK: [[loop_merge]] = OpLabel +; CHECK-NEXT: OpReturn +%main = OpFunction %void None %func_type +%entry_bb = OpLabel +OpBranch %loop_header +%loop_header = OpLabel +OpLoopMerge %loop_merge %cont None +OpBranch %bb1 +%bb1 = OpLabel +OpSelectionMerge %sel_merge None +OpBranchConditional %true %bb2 %bb4 +%bb2 = OpLabel +OpSwitch %undef_int %bb3 0 %cont 1 %bb3 +%bb3 = OpLabel +OpBranch %sel_merge +%bb4 = OpLabel +OpBranch %sel_merge +%sel_merge = OpLabel +OpBranch %loop_merge +%cont = OpLabel +OpBranch %loop_header +%loop_merge = OpLabel +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(predefs + body, true); +} + +TEST_F(DeadBranchElimTest, SelectionMergeSameAsLoopContinue) { + // Same as |SelectionMergeWithExitToLoopContinue|, except the branch in the + // selection construct is an |OpSwitch| instead of an |OpConditionalBranch|. + // The OpSelectionMerge instruction is not needed in this case either. + const std::string predefs = R"( +OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft +OpSource GLSL 140 +%void = OpTypeVoid +%func_type = OpTypeFunction %void +%bool = OpTypeBool +%true = OpConstantTrue %bool +%uint = OpTypeInt 32 0 +%undef_bool = OpUndef %bool +)"; + + const std::string body = + R"( +; CHECK: OpLabel +; CHECK: [[loop_header:%\w+]] = OpLabel +; CHECK: OpLoopMerge [[loop_merge:%\w+]] [[loop_cont:%\w+]] +; CHECK-NEXT: OpBranch [[bb1:%\w+]] +; CHECK: [[bb1]] = OpLabel +; CHECK-NEXT: OpBranch [[bb2:%\w+]] +; CHECK: [[bb2]] = OpLabel +; CHECK-NEXT: OpSelectionMerge [[loop_cont]] +; CHECK-NEXT: OpBranchConditional {{%\w+}} [[bb3:%\w+]] [[loop_cont]] +; CHECK: [[bb3]] = OpLabel +; CHECK-NEXT: OpBranch [[loop_cont]] +; CHECK: [[loop_cont]] = OpLabel +; CHECK-NEXT: OpBranchConditional {{%\w+}} [[loop_header]] [[loop_merge]] +; CHECK: [[loop_merge]] = OpLabel +; CHECK-NEXT: OpReturn +%main = OpFunction %void None %func_type +%entry_bb = OpLabel +OpBranch %loop_header +%loop_header = OpLabel +OpLoopMerge %loop_merge %cont None +OpBranch %bb1 +%bb1 = OpLabel +OpSelectionMerge %cont None +OpBranchConditional %true %bb2 %bb4 +%bb2 = OpLabel +OpBranchConditional %undef_bool %bb3 %cont +%bb3 = OpLabel +OpBranch %cont +%bb4 = OpLabel +OpBranch %cont +%cont = OpLabel +OpBranchConditional %undef_bool %loop_header %loop_merge +%loop_merge = OpLabel +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(predefs + body, true); +} + +TEST_F(DeadBranchElimTest, SelectionMergeWithNestedLoop) { + const std::string body = + R"( +; CHECK: OpSelectionMerge [[merge1:%\w+]] +; CHECK: [[merge1]] = OpLabel +; CHECK-NEXT: OpBranch [[preheader:%\w+]] +; CHECK: [[preheader]] = OpLabel +; CHECK-NOT: OpLabel +; CHECK: OpBranch [[header:%\w+]] +; CHECK: [[header]] = OpLabel +; CHECK-NOT: OpLabel +; CHECK: OpLoopMerge [[merge2:%\w+]] +; CHECK: [[merge2]] = OpLabel +; CHECK-NEXT: OpUnreachable + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %main "main" + OpExecutionMode %main OriginUpperLeft + OpSource ESSL 310 + OpName %main "main" + OpName %h "h" + OpName %i "i" + %void = OpTypeVoid + %3 = OpTypeFunction %void + %bool = OpTypeBool + %_ptr_Function_bool = OpTypePointer Function %bool + %true = OpConstantTrue %bool + %int = OpTypeInt 32 1 + %_ptr_Function_int = OpTypePointer Function %int + %int_1 = OpConstant %int 1 + %int_0 = OpConstant %int 0 + %27 = OpUndef %bool + %main = OpFunction %void None %3 + %5 = OpLabel + %h = OpVariable %_ptr_Function_bool Function + %i = OpVariable %_ptr_Function_int Function + OpSelectionMerge %11 None + OpBranchConditional %27 %10 %11 + %10 = OpLabel + OpBranch %11 + %11 = OpLabel + OpSelectionMerge %14 None + OpBranchConditional %true %13 %14 + %13 = OpLabel + OpStore %i %int_1 + OpBranch %19 + %19 = OpLabel + OpLoopMerge %21 %22 None + OpBranch %23 + %23 = OpLabel + %26 = OpSGreaterThan %bool %int_1 %int_0 + OpBranchConditional %true %20 %21 + %20 = OpLabel + OpBranch %22 + %22 = OpLabel + OpBranch %19 + %21 = OpLabel + OpBranch %14 + %14 = OpLabel + OpReturn + OpFunctionEnd +)"; + + SinglePassRunAndMatch(body, true); +} // TODO(greg-lunarg): Add tests to verify handling of these cases: // diff --git a/3rdparty/spirv-tools/test/opt/decoration_manager_test.cpp b/3rdparty/spirv-tools/test/opt/decoration_manager_test.cpp index cf82e8e66..f85ff6aa6 100644 --- a/3rdparty/spirv-tools/test/opt/decoration_manager_test.cpp +++ b/3rdparty/spirv-tools/test/opt/decoration_manager_test.cpp @@ -422,6 +422,7 @@ OpGroupDecorate %2 %1 %3 OpCapability Linkage OpMemoryModel Logical GLSL450 OpDecorate %1 Constant +%2 = OpDecorationGroup %4 = OpTypeInt 32 0 %1 = OpVariable %4 Uniform %3 = OpVariable %4 Uniform diff --git a/3rdparty/spirv-tools/test/opt/dominator_tree/CMakeLists.txt b/3rdparty/spirv-tools/test/opt/dominator_tree/CMakeLists.txt index f95a56da8..813d628a0 100644 --- a/3rdparty/spirv-tools/test/opt/dominator_tree/CMakeLists.txt +++ b/3rdparty/spirv-tools/test/opt/dominator_tree/CMakeLists.txt @@ -27,4 +27,5 @@ add_spvtools_unittest(TARGET dominator_analysis unreachable_for.cpp unreachable_for_post.cpp LIBS SPIRV-Tools-opt + PCH_FILE pch_test_opt_dom ) diff --git a/3rdparty/spirv-tools/test/opt/dominator_tree/pch_test_opt_dom.cpp b/3rdparty/spirv-tools/test/opt/dominator_tree/pch_test_opt_dom.cpp new file mode 100644 index 000000000..a28310e57 --- /dev/null +++ b/3rdparty/spirv-tools/test/opt/dominator_tree/pch_test_opt_dom.cpp @@ -0,0 +1,15 @@ +// Copyright (c) 2018 The Khronos Group Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "pch_test_opt_dom.h" diff --git a/3rdparty/spirv-tools/test/opt/dominator_tree/pch_test_opt_dom.h b/3rdparty/spirv-tools/test/opt/dominator_tree/pch_test_opt_dom.h new file mode 100644 index 000000000..4e8106fbf --- /dev/null +++ b/3rdparty/spirv-tools/test/opt/dominator_tree/pch_test_opt_dom.h @@ -0,0 +1,25 @@ +// Copyright (c) 2018 The Khronos Group Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "gmock/gmock.h" +#include "source/opt/iterator.h" +#include "source/opt/loop_dependence.h" +#include "source/opt/loop_descriptor.h" +#include "source/opt/pass.h" +#include "source/opt/scalar_analysis.h" +#include "source/opt/tree_iterator.h" +#include "test/opt/assembly_builder.h" +#include "test/opt/function_utils.h" +#include "test/opt/pass_fixture.h" +#include "test/opt/pass_utils.h" diff --git a/3rdparty/spirv-tools/test/opt/flatten_decoration_test.cpp b/3rdparty/spirv-tools/test/opt/flatten_decoration_test.cpp index 483ee6e53..fcf2341e7 100644 --- a/3rdparty/spirv-tools/test/opt/flatten_decoration_test.cpp +++ b/3rdparty/spirv-tools/test/opt/flatten_decoration_test.cpp @@ -31,6 +31,7 @@ std::string PreambleAssembly() { R"(OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %main "main" %hue %saturation %value +OpExecutionMode %main OriginUpperLeft OpName %main "main" OpName %void_fn "void_fn" OpName %hue "hue" diff --git a/3rdparty/spirv-tools/test/opt/fold_test.cpp b/3rdparty/spirv-tools/test/opt/fold_test.cpp index b1e575886..1a5442181 100644 --- a/3rdparty/spirv-tools/test/opt/fold_test.cpp +++ b/3rdparty/spirv-tools/test/opt/fold_test.cpp @@ -17,6 +17,7 @@ #include #include +#include "effcee/effcee.h" #include "gmock/gmock.h" #include "gtest/gtest.h" #include "source/opt/build_module.h" @@ -27,17 +28,12 @@ #include "spirv-tools/libspirv.hpp" #include "test/opt/pass_utils.h" -#ifdef SPIRV_EFFCEE -#include "effcee/effcee.h" -#endif - namespace spvtools { namespace opt { namespace { using ::testing::Contains; -#ifdef SPIRV_EFFCEE std::string Disassemble(const std::string& original, IRContext* context, uint32_t disassemble_options = 0) { std::vector optimized_bin; @@ -60,7 +56,6 @@ void Match(const std::string& original, IRContext* context, << match_result.message() << "\nChecking result:\n" << disassembly; } -#endif template struct InstructionFoldingCase { @@ -184,6 +179,7 @@ OpName %main "main" %uint_3 = OpConstant %uint 3 %uint_4 = OpConstant %uint 4 %uint_32 = OpConstant %uint 32 +%uint_42 = OpConstant %uint 42 %uint_max = OpConstant %uint 4294967295 %v2int_undef = OpUndef %v2int %v2int_0_0 = OpConstantComposite %v2int %int_0 %int_0 @@ -439,6 +435,76 @@ INSTANTIATE_TEST_CASE_P(TestCase, IntegerInstructionFoldingTest, "%2 = OpBitwiseAnd %uint %load %uint_0\n" + "OpReturn\n" + "OpFunctionEnd", + 2, 0), + // Test case 17: fold 1/0 (signed) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpSDiv %int %int_1 %int_0\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 18: fold 1/0 (unsigned) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpUDiv %uint %uint_1 %uint_0\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 19: fold OpSRem 1 0 (signed) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpSRem %int %int_1 %int_0\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 20: fold 1%0 (signed) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpSMod %int %int_1 %int_0\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 21: fold 1%0 (unsigned) + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%2 = OpUMod %uint %uint_1 %uint_0\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 22: fold unsigned n >> 42 (undefined, so set to zero). + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_uint Function\n" + + "%load = OpLoad %uint %n\n" + + "%2 = OpShiftRightLogical %uint %load %uint_42\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 21: fold signed n >> 42 (undefined, so set to zero). + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_int Function\n" + + "%load = OpLoad %int %n\n" + + "%2 = OpShiftRightLogical %int %load %uint_42\n" + + "OpReturn\n" + + "OpFunctionEnd", + 2, 0), + // Test case 22: fold n << 42 (undefined, so set to zero). + InstructionFoldingCase( + Header() + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_int Function\n" + + "%load = OpLoad %int %n\n" + + "%2 = OpShiftLeftLogical %int %load %uint_42\n" + + "OpReturn\n" + + "OpFunctionEnd", 2, 0) )); // clang-format on @@ -3851,7 +3917,6 @@ INSTANTIATE_TEST_CASE_P(DoubleRedundantSubFoldingTest, ToNegateFoldingTest, 2, 3) )); -#ifdef SPIRV_EFFCEE using MatchingInstructionFoldingTest = ::testing::TestWithParam>; @@ -5787,7 +5852,7 @@ TEST_P(MatchingInstructionWithNoResultFoldingTest, Case) { INSTANTIATE_TEST_CASE_P(StoreMatchingTest, MatchingInstructionWithNoResultFoldingTest, ::testing::Values( - // Test case 0: Using OpDot to extract last element. + // Test case 0: Remove store of undef. InstructionFoldingCase( Header() + "; CHECK: OpLabel\n" + @@ -5800,7 +5865,18 @@ INSTANTIATE_TEST_CASE_P(StoreMatchingTest, MatchingInstructionWithNoResultFoldin "OpStore %n %undef\n" + "OpReturn\n" + "OpFunctionEnd", - 0 /* OpStore */, true) + 0 /* OpStore */, true), + // Test case 1: Keep volatile store. + InstructionFoldingCase( + Header() + + "%main = OpFunction %void None %void_func\n" + + "%main_lab = OpLabel\n" + + "%n = OpVariable %_ptr_v4double Function\n" + + "%undef = OpUndef %v4double\n" + + "OpStore %n %undef Volatile\n" + + "OpReturn\n" + + "OpFunctionEnd", + 0 /* OpStore */, false) )); INSTANTIATE_TEST_CASE_P(VectorShuffleMatchingTest, MatchingInstructionWithNoResultFoldingTest, @@ -6075,7 +6151,6 @@ INSTANTIATE_TEST_CASE_P(VectorShuffleMatchingTest, MatchingInstructionWithNoResu "OpFunctionEnd", 9, true) )); -#endif } // namespace } // namespace opt diff --git a/3rdparty/spirv-tools/test/opt/function_test.cpp b/3rdparty/spirv-tools/test/opt/function_test.cpp new file mode 100644 index 000000000..38ab29876 --- /dev/null +++ b/3rdparty/spirv-tools/test/opt/function_test.cpp @@ -0,0 +1,173 @@ +// Copyright (c) 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#include +#include +#include + +#include "function_utils.h" +#include "gmock/gmock.h" +#include "gtest/gtest.h" +#include "source/opt/build_module.h" +#include "source/opt/ir_context.h" + +namespace spvtools { +namespace opt { +namespace { + +using ::testing::Eq; + +TEST(FunctionTest, IsNotRecursive) { + const std::string text = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %1 "main" +OpExecutionMode %1 OriginUpperLeft +OpDecorate %2 DescriptorSet 439418829 +%void = OpTypeVoid +%4 = OpTypeFunction %void +%float = OpTypeFloat 32 +%_struct_6 = OpTypeStruct %float %float +%7 = OpTypeFunction %_struct_6 +%1 = OpFunction %void Pure|Const %4 +%8 = OpLabel +%2 = OpFunctionCall %_struct_6 %9 +OpKill +OpFunctionEnd +%9 = OpFunction %_struct_6 None %7 +%10 = OpLabel +%11 = OpFunctionCall %_struct_6 %12 +OpUnreachable +OpFunctionEnd +%12 = OpFunction %_struct_6 None %7 +%13 = OpLabel +OpUnreachable +OpFunctionEnd +)"; + + std::unique_ptr ctx = + spvtools::BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + auto* func = spvtest::GetFunction(ctx->module(), 9); + EXPECT_FALSE(func->IsRecursive()); + + func = spvtest::GetFunction(ctx->module(), 12); + EXPECT_FALSE(func->IsRecursive()); +} + +TEST(FunctionTest, IsDirectlyRecursive) { + const std::string text = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %1 "main" +OpExecutionMode %1 OriginUpperLeft +OpDecorate %2 DescriptorSet 439418829 +%void = OpTypeVoid +%4 = OpTypeFunction %void +%float = OpTypeFloat 32 +%_struct_6 = OpTypeStruct %float %float +%7 = OpTypeFunction %_struct_6 +%1 = OpFunction %void Pure|Const %4 +%8 = OpLabel +%2 = OpFunctionCall %_struct_6 %9 +OpKill +OpFunctionEnd +%9 = OpFunction %_struct_6 None %7 +%10 = OpLabel +%11 = OpFunctionCall %_struct_6 %9 +OpUnreachable +OpFunctionEnd +)"; + + std::unique_ptr ctx = + spvtools::BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + auto* func = spvtest::GetFunction(ctx->module(), 9); + EXPECT_TRUE(func->IsRecursive()); +} + +TEST(FunctionTest, IsIndirectlyRecursive) { + const std::string text = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %1 "main" +OpExecutionMode %1 OriginUpperLeft +OpDecorate %2 DescriptorSet 439418829 +%void = OpTypeVoid +%4 = OpTypeFunction %void +%float = OpTypeFloat 32 +%_struct_6 = OpTypeStruct %float %float +%7 = OpTypeFunction %_struct_6 +%1 = OpFunction %void Pure|Const %4 +%8 = OpLabel +%2 = OpFunctionCall %_struct_6 %9 +OpKill +OpFunctionEnd +%9 = OpFunction %_struct_6 None %7 +%10 = OpLabel +%11 = OpFunctionCall %_struct_6 %12 +OpUnreachable +OpFunctionEnd +%12 = OpFunction %_struct_6 None %7 +%13 = OpLabel +%14 = OpFunctionCall %_struct_6 %9 +OpUnreachable +OpFunctionEnd +)"; + + std::unique_ptr ctx = + spvtools::BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + auto* func = spvtest::GetFunction(ctx->module(), 9); + EXPECT_TRUE(func->IsRecursive()); + + func = spvtest::GetFunction(ctx->module(), 12); + EXPECT_TRUE(func->IsRecursive()); +} + +TEST(FunctionTest, IsNotRecuriseCallingRecursive) { + const std::string text = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %1 "main" +OpExecutionMode %1 OriginUpperLeft +OpDecorate %2 DescriptorSet 439418829 +%void = OpTypeVoid +%4 = OpTypeFunction %void +%float = OpTypeFloat 32 +%_struct_6 = OpTypeStruct %float %float +%7 = OpTypeFunction %_struct_6 +%1 = OpFunction %void Pure|Const %4 +%8 = OpLabel +%2 = OpFunctionCall %_struct_6 %9 +OpKill +OpFunctionEnd +%9 = OpFunction %_struct_6 None %7 +%10 = OpLabel +%11 = OpFunctionCall %_struct_6 %9 +OpUnreachable +OpFunctionEnd +)"; + + std::unique_ptr ctx = + spvtools::BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + auto* func = spvtest::GetFunction(ctx->module(), 1); + EXPECT_FALSE(func->IsRecursive()); +} + +} // namespace +} // namespace opt +} // namespace spvtools diff --git a/3rdparty/spirv-tools/test/opt/if_conversion_test.cpp b/3rdparty/spirv-tools/test/opt/if_conversion_test.cpp index a62a15e88..03932a95a 100644 --- a/3rdparty/spirv-tools/test/opt/if_conversion_test.cpp +++ b/3rdparty/spirv-tools/test/opt/if_conversion_test.cpp @@ -25,7 +25,6 @@ namespace { using IfConversionTest = PassTest<::testing::Test>; -#ifdef SPIRV_EFFCEE TEST_F(IfConversionTest, TestSimpleIfThenElse) { const std::string text = R"( ; CHECK: OpSelectionMerge [[merge:%\w+]] @@ -302,7 +301,6 @@ TEST_F(IfConversionTest, CodeMotionMultipleInstructions) { SinglePassRunAndMatch(text, true); } -#endif // SPIRV_EFFCEE TEST_F(IfConversionTest, NoCommonDominator) { const std::string text = R"(OpCapability Shader @@ -469,6 +467,45 @@ OpFunctionEnd SinglePassRunAndCheck(text, text, true, true); } +TEST_F(IfConversionTest, InvalidCommonDominator) { + const std::string text = R"(OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +%void = OpTypeVoid +%float = OpTypeFloat 32 +%float_0 = OpConstant %float 0 +%float_1 = OpConstant %float 1 +%bool = OpTypeBool +%true = OpConstantTrue %bool +%1 = OpTypeFunction %void +%2 = OpFunction %void None %1 +%3 = OpLabel +OpBranch %4 +%4 = OpLabel +OpLoopMerge %5 %6 None +OpBranch %7 +%7 = OpLabel +OpSelectionMerge %8 None +OpBranchConditional %true %8 %9 +%9 = OpLabel +OpSelectionMerge %10 None +OpBranchConditional %true %10 %5 +%10 = OpLabel +OpBranch %8 +%8 = OpLabel +OpBranch %6 +%6 = OpLabel +OpBranchConditional %true %4 %5 +%5 = OpLabel +%11 = OpPhi %float %float_0 %6 %float_1 %9 +OpReturn +OpFunctionEnd +)"; + + SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + SinglePassRunAndCheck(text, text, true, true); +} + } // namespace } // namespace opt } // namespace spvtools diff --git a/3rdparty/spirv-tools/test/opt/inline_test.cpp b/3rdparty/spirv-tools/test/opt/inline_test.cpp index 4eab77da4..44a969858 100644 --- a/3rdparty/spirv-tools/test/opt/inline_test.cpp +++ b/3rdparty/spirv-tools/test/opt/inline_test.cpp @@ -2144,19 +2144,12 @@ OpFunctionEnd OpBranch %19 %19 = OpLabel %20 = OpCopyObject %int %int_2 +%25 = OpCopyObject %int %int_0 OpLoopMerge %23 %26 None -OpBranch %25 -%25 = OpLabel -OpLoopMerge %26 %27 None -OpBranch %28 -%28 = OpLabel -%29 = OpCopyObject %int %int_0 -OpBranch %26 -%30 = OpLabel -%31 = OpCopyObject %int %int_1 OpBranch %26 %27 = OpLabel -OpBranchConditional %false %25 %26 +%28 = OpCopyObject %int %int_1 +OpBranch %26 %26 = OpLabel %22 = OpCopyObject %int %int_3 OpBranchConditional %true %19 %23 @@ -2226,23 +2219,16 @@ OpFunctionEnd R"(%1 = OpFunction %void None %9 %20 = OpLabel %21 = OpCopyObject %int %int_3 -OpBranch %24 -%24 = OpLabel -OpLoopMerge %25 %26 None -OpBranch %27 -%27 = OpLabel -%28 = OpCopyObject %int %int_0 -OpBranch %29 -%29 = OpLabel -%30 = OpPhi %int %28 %27 -%31 = OpCopyObject %int %int_1 +%24 = OpCopyObject %int %int_0 OpBranch %25 -%32 = OpLabel -%33 = OpCopyObject %int %int_2 -OpBranch %25 -%26 = OpLabel -OpBranchConditional %false %24 %25 %25 = OpLabel +%26 = OpPhi %int %24 %20 +%27 = OpCopyObject %int %int_1 +OpBranch %28 +%29 = OpLabel +%30 = OpCopyObject %int %int_2 +OpBranch %28 +%28 = OpLabel %23 = OpCopyObject %int %int_4 OpReturn OpFunctionEnd @@ -2253,6 +2239,222 @@ OpFunctionEnd false, true); } +TEST_F(InlineTest, NonInlinableCalleeWithSingleReturn) { + // The case from https://github.com/KhronosGroup/SPIRV-Tools/issues/2018 + // + // The callee has a single return, but cannot be inlined because the + // return is inside a loop. + + const std::string predefs = + R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" %_GLF_color +OpExecutionMode %main OriginUpperLeft +OpSource ESSL 310 +OpName %main "main" +OpName %f_ "f(" +OpName %i "i" +OpName %_GLF_color "_GLF_color" +OpDecorate %_GLF_color Location 0 +%void = OpTypeVoid +%7 = OpTypeFunction %void +%float = OpTypeFloat 32 +%9 = OpTypeFunction %float +%float_1 = OpConstant %float 1 +%bool = OpTypeBool +%false = OpConstantFalse %bool +%int = OpTypeInt 32 1 +%_ptr_Function_int = OpTypePointer Function %int +%int_0 = OpConstant %int 0 +%int_1 = OpConstant %int 1 +%v4float = OpTypeVector %float 4 +%_ptr_Output_v4float = OpTypePointer Output %v4float +%_GLF_color = OpVariable %_ptr_Output_v4float Output +%float_0 = OpConstant %float 0 +%20 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0 +%21 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1 +)"; + + const std::string caller = + R"(%main = OpFunction %void None %7 +%22 = OpLabel +%i = OpVariable %_ptr_Function_int Function +OpStore %i %int_0 +OpBranch %23 +%23 = OpLabel +OpLoopMerge %24 %25 None +OpBranch %26 +%26 = OpLabel +%27 = OpLoad %int %i +%28 = OpSLessThan %bool %27 %int_1 +OpBranchConditional %28 %29 %24 +%29 = OpLabel +OpStore %_GLF_color %20 +%30 = OpFunctionCall %float %f_ +OpBranch %25 +%25 = OpLabel +%31 = OpLoad %int %i +%32 = OpIAdd %int %31 %int_1 +OpStore %i %32 +OpBranch %23 +%24 = OpLabel +OpStore %_GLF_color %21 +OpReturn +OpFunctionEnd +)"; + + const std::string callee = + R"(%f_ = OpFunction %float None %9 +%33 = OpLabel +OpBranch %34 +%34 = OpLabel +OpLoopMerge %35 %36 None +OpBranch %37 +%37 = OpLabel +OpReturnValue %float_1 +%36 = OpLabel +OpBranch %34 +%35 = OpLabel +OpUnreachable +OpFunctionEnd +)"; + + SinglePassRunAndCheck( + predefs + caller + callee, predefs + caller + callee, false, true); +} + +TEST_F(InlineTest, CalleeWithSingleReturnNeedsSingleTripLoopWrapper) { + // The case from https://github.com/KhronosGroup/SPIRV-Tools/issues/2018 + // + // The callee has a single return, but needs single-trip loop wrapper + // to be inlined because the return is in a selection structure. + + const std::string predefs = + R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" %_GLF_color +OpExecutionMode %main OriginUpperLeft +OpSource ESSL 310 +OpName %main "main" +OpName %f_ "f(" +OpName %i "i" +OpName %_GLF_color "_GLF_color" +OpDecorate %_GLF_color Location 0 +%void = OpTypeVoid +%7 = OpTypeFunction %void +%float = OpTypeFloat 32 +%9 = OpTypeFunction %float +%float_1 = OpConstant %float 1 +%bool = OpTypeBool +%false = OpConstantFalse %bool +%true = OpConstantTrue %bool +%int = OpTypeInt 32 1 +%_ptr_Function_int = OpTypePointer Function %int +%int_0 = OpConstant %int 0 +%int_1 = OpConstant %int 1 +%v4float = OpTypeVector %float 4 +%_ptr_Output_v4float = OpTypePointer Output %v4float +%_GLF_color = OpVariable %_ptr_Output_v4float Output +%float_0 = OpConstant %float 0 +%21 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0 +%22 = OpConstantComposite %v4float %float_0 %float_1 %float_0 %float_1 +)"; + + const std::string new_predefs = + R"(%_ptr_Function_float = OpTypePointer Function %float +)"; + + const std::string main_before = + R"(%main = OpFunction %void None %7 +%23 = OpLabel +%i = OpVariable %_ptr_Function_int Function +OpStore %i %int_0 +OpBranch %24 +%24 = OpLabel +OpLoopMerge %25 %26 None +OpBranch %27 +%27 = OpLabel +%28 = OpLoad %int %i +%29 = OpSLessThan %bool %28 %int_1 +OpBranchConditional %29 %30 %25 +%30 = OpLabel +OpStore %_GLF_color %21 +%31 = OpFunctionCall %float %f_ +OpBranch %26 +%26 = OpLabel +%32 = OpLoad %int %i +%33 = OpIAdd %int %32 %int_1 +OpStore %i %33 +OpBranch %24 +%25 = OpLabel +OpStore %_GLF_color %22 +OpReturn +OpFunctionEnd +)"; + + const std::string main_after = + R"(%main = OpFunction %void None %7 +%23 = OpLabel +%38 = OpVariable %_ptr_Function_float Function +%i = OpVariable %_ptr_Function_int Function +OpStore %i %int_0 +OpBranch %24 +%24 = OpLabel +OpLoopMerge %25 %26 None +OpBranch %27 +%27 = OpLabel +%28 = OpLoad %int %i +%29 = OpSLessThan %bool %28 %int_1 +OpBranchConditional %29 %30 %25 +%30 = OpLabel +OpStore %_GLF_color %21 +OpBranch %39 +%39 = OpLabel +OpLoopMerge %40 %41 None +OpBranch %42 +%42 = OpLabel +OpSelectionMerge %43 None +OpBranchConditional %true %44 %43 +%44 = OpLabel +OpStore %38 %float_1 +OpBranch %40 +%43 = OpLabel +OpUnreachable +%41 = OpLabel +OpBranchConditional %false %39 %40 +%40 = OpLabel +%31 = OpLoad %float %38 +OpBranch %26 +%26 = OpLabel +%32 = OpLoad %int %i +%33 = OpIAdd %int %32 %int_1 +OpStore %i %33 +OpBranch %24 +%25 = OpLabel +OpStore %_GLF_color %22 +OpReturn +OpFunctionEnd +)"; + + const std::string callee = + R"(%f_ = OpFunction %float None %9 +%34 = OpLabel +OpSelectionMerge %35 None +OpBranchConditional %true %36 %35 +%36 = OpLabel +OpReturnValue %float_1 +%35 = OpLabel +OpUnreachable +OpFunctionEnd +)"; + + SinglePassRunAndCheck( + predefs + main_before + callee, + predefs + new_predefs + main_after + callee, false, true); +} + TEST_F(InlineTest, Decorated1) { // Same test as Simple with the difference // that OpFAdd in the outlined function is @@ -2589,7 +2791,6 @@ TEST_F(InlineTest, SetParent) { } } -#ifdef SPIRV_EFFCEE TEST_F(InlineTest, OpKill) { const std::string text = R"( ; CHECK: OpFunction @@ -2601,6 +2802,7 @@ TEST_F(InlineTest, OpKill) { OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft %void = OpTypeVoid %voidfuncty = OpTypeFunction %void %main = OpFunction %void None %voidfuncty @@ -2630,6 +2832,7 @@ TEST_F(InlineTest, OpKillWithTrailingInstructions) { OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft %void = OpTypeVoid %bool = OpTypeBool %true = OpConstantTrue %bool @@ -2679,6 +2882,7 @@ TEST_F(InlineTest, OpKillInIf) { OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft %void = OpTypeVoid %bool = OpTypeBool %true = OpConstantTrue %bool @@ -2731,6 +2935,7 @@ TEST_F(InlineTest, OpKillInLoop) { OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft %void = OpTypeVoid %bool = OpTypeBool %true = OpConstantTrue %bool @@ -2840,14 +3045,73 @@ TEST_F(InlineTest, OpVariableWithInit) { SinglePassRunAndMatch(text, true); } -#endif + +TEST_F(InlineTest, DontInlineDirectlyRecursiveFunc) { + // Test that the name of the result id of the call is deleted. + const std::string test = + R"(OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %1 "main" +OpExecutionMode %1 OriginUpperLeft +OpDecorate %2 DescriptorSet 439418829 +%void = OpTypeVoid +%4 = OpTypeFunction %void +%float = OpTypeFloat 32 +%_struct_6 = OpTypeStruct %float %float +%7 = OpTypeFunction %_struct_6 +%1 = OpFunction %void Pure|Const %4 +%8 = OpLabel +%2 = OpFunctionCall %_struct_6 %9 +OpKill +OpFunctionEnd +%9 = OpFunction %_struct_6 None %7 +%10 = OpLabel +%11 = OpFunctionCall %_struct_6 %9 +OpUnreachable +OpFunctionEnd +)"; + + SinglePassRunAndCheck(test, test, false, true); +} + +TEST_F(InlineTest, DontInlineInDirectlyRecursiveFunc) { + // Test that the name of the result id of the call is deleted. + const std::string test = + R"(OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %1 "main" +OpExecutionMode %1 OriginUpperLeft +OpDecorate %2 DescriptorSet 439418829 +%void = OpTypeVoid +%4 = OpTypeFunction %void +%float = OpTypeFloat 32 +%_struct_6 = OpTypeStruct %float %float +%7 = OpTypeFunction %_struct_6 +%1 = OpFunction %void Pure|Const %4 +%8 = OpLabel +%2 = OpFunctionCall %_struct_6 %9 +OpKill +OpFunctionEnd +%9 = OpFunction %_struct_6 None %7 +%10 = OpLabel +%11 = OpFunctionCall %_struct_6 %12 +OpUnreachable +OpFunctionEnd +%12 = OpFunction %_struct_6 None %7 +%13 = OpLabel +%14 = OpFunctionCall %_struct_6 %9 +OpUnreachable +OpFunctionEnd +)"; + + SinglePassRunAndCheck(test, test, false, true); +} // TODO(greg-lunarg): Add tests to verify handling of these cases: // // Empty modules // Modules without function definitions // Modules in which all functions do not call other functions -// Recursive functions (calling self & calling each other) // Caller and callee both accessing the same global variable // Functions with OpLine & OpNoLine // Others? diff --git a/3rdparty/spirv-tools/test/opt/inst_bindless_check_test.cpp b/3rdparty/spirv-tools/test/opt/inst_bindless_check_test.cpp new file mode 100644 index 000000000..1a1a19478 --- /dev/null +++ b/3rdparty/spirv-tools/test/opt/inst_bindless_check_test.cpp @@ -0,0 +1,1850 @@ +// Copyright (c) 2017 Valve Corporation +// Copyright (c) 2017 LunarG Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#include + +#include "test/opt/assembly_builder.h" +#include "test/opt/pass_fixture.h" +#include "test/opt/pass_utils.h" + +namespace spvtools { +namespace opt { +namespace { + +using InstBindlessTest = PassTest<::testing::Test>; + +TEST_F(InstBindlessTest, Simple) { + // Texture2D g_tColor[128]; + // + // layout(push_constant) cbuffer PerViewConstantBuffer_t + // { + // uint g_nDataIdx; + // }; + // + // SamplerState g_sAniso; + // + // struct PS_INPUT + // { + // float2 vTextureCoords : TEXCOORD2; + // }; + // + // struct PS_OUTPUT + // { + // float4 vColor : SV_Target0; + // }; + // + // PS_OUTPUT MainPs(PS_INPUT i) + // { + // PS_OUTPUT ps_output; + // ps_output.vColor = + // g_tColor[ g_nDataIdx ].Sample(g_sAniso, i.vTextureCoords.xy); + // return ps_output; + // } + + const std::string entry_before = + R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %MainPs "MainPs" %i_vTextureCoords %_entryPointOutput_vColor +OpExecutionMode %MainPs OriginUpperLeft +OpSource HLSL 500 +)"; + + const std::string entry_after = + R"(OpCapability Shader +OpExtension "SPV_KHR_storage_buffer_storage_class" +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %MainPs "MainPs" %i_vTextureCoords %_entryPointOutput_vColor %gl_FragCoord +OpExecutionMode %MainPs OriginUpperLeft +OpSource HLSL 500 +)"; + + const std::string names_annots = + R"(OpName %MainPs "MainPs" +OpName %g_tColor "g_tColor" +OpName %PerViewConstantBuffer_t "PerViewConstantBuffer_t" +OpMemberName %PerViewConstantBuffer_t 0 "g_nDataIdx" +OpName %_ "" +OpName %g_sAniso "g_sAniso" +OpName %i_vTextureCoords "i.vTextureCoords" +OpName %_entryPointOutput_vColor "@entryPointOutput.vColor" +OpDecorate %g_tColor DescriptorSet 3 +OpDecorate %g_tColor Binding 0 +OpMemberDecorate %PerViewConstantBuffer_t 0 Offset 0 +OpDecorate %PerViewConstantBuffer_t Block +OpDecorate %g_sAniso DescriptorSet 0 +OpDecorate %i_vTextureCoords Location 0 +OpDecorate %_entryPointOutput_vColor Location 0 +)"; + + const std::string new_annots = + R"(OpDecorate %_struct_55 Block +OpMemberDecorate %_struct_55 0 Offset 0 +OpMemberDecorate %_struct_55 1 Offset 4 +OpDecorate %57 DescriptorSet 7 +OpDecorate %57 Binding 0 +OpDecorate %gl_FragCoord BuiltIn FragCoord +)"; + + const std::string consts_types_vars = + R"(%void = OpTypeVoid +%10 = OpTypeFunction %void +%float = OpTypeFloat 32 +%v2float = OpTypeVector %float 2 +%v4float = OpTypeVector %float 4 +%int = OpTypeInt 32 1 +%int_0 = OpConstant %int 0 +%16 = OpTypeImage %float 2D 0 0 0 1 Unknown +%uint = OpTypeInt 32 0 +%uint_128 = OpConstant %uint 128 +%_arr_16_uint_128 = OpTypeArray %16 %uint_128 +%_ptr_UniformConstant__arr_16_uint_128 = OpTypePointer UniformConstant %_arr_16_uint_128 +%g_tColor = OpVariable %_ptr_UniformConstant__arr_16_uint_128 UniformConstant +%PerViewConstantBuffer_t = OpTypeStruct %uint +%_ptr_PushConstant_PerViewConstantBuffer_t = OpTypePointer PushConstant %PerViewConstantBuffer_t +%_ = OpVariable %_ptr_PushConstant_PerViewConstantBuffer_t PushConstant +%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint +%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16 +%24 = OpTypeSampler +%_ptr_UniformConstant_24 = OpTypePointer UniformConstant %24 +%g_sAniso = OpVariable %_ptr_UniformConstant_24 UniformConstant +%26 = OpTypeSampledImage %16 +%_ptr_Input_v2float = OpTypePointer Input %v2float +%i_vTextureCoords = OpVariable %_ptr_Input_v2float Input +%_ptr_Output_v4float = OpTypePointer Output %v4float +%_entryPointOutput_vColor = OpVariable %_ptr_Output_v4float Output +)"; + + const std::string new_consts_types_vars = + R"(%uint_0 = OpConstant %uint 0 +%bool = OpTypeBool +%48 = OpTypeFunction %void %uint %uint %uint %uint +%_runtimearr_uint = OpTypeRuntimeArray %uint +%_struct_55 = OpTypeStruct %uint %_runtimearr_uint +%_ptr_StorageBuffer__struct_55 = OpTypePointer StorageBuffer %_struct_55 +%57 = OpVariable %_ptr_StorageBuffer__struct_55 StorageBuffer +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%uint_9 = OpConstant %uint 9 +%uint_4 = OpConstant %uint 4 +%uint_1 = OpConstant %uint 1 +%uint_23 = OpConstant %uint 23 +%uint_2 = OpConstant %uint 2 +%uint_3 = OpConstant %uint 3 +%_ptr_Input_v4float = OpTypePointer Input %v4float +%gl_FragCoord = OpVariable %_ptr_Input_v4float Input +%v4uint = OpTypeVector %uint 4 +%uint_5 = OpConstant %uint 5 +%uint_6 = OpConstant %uint 6 +%uint_7 = OpConstant %uint 7 +%uint_8 = OpConstant %uint 8 +%uint_56 = OpConstant %uint 56 +%103 = OpConstantNull %v4float +)"; + + const std::string func_pt1 = + R"(%MainPs = OpFunction %void None %10 +%29 = OpLabel +%30 = OpLoad %v2float %i_vTextureCoords +%31 = OpAccessChain %_ptr_PushConstant_uint %_ %int_0 +%32 = OpLoad %uint %31 +%33 = OpAccessChain %_ptr_UniformConstant_16 %g_tColor %32 +%34 = OpLoad %16 %33 +%35 = OpLoad %24 %g_sAniso +%36 = OpSampledImage %26 %34 %35 +)"; + + const std::string func_pt2_before = + R"(%37 = OpImageSampleImplicitLod %v4float %36 %30 +OpStore %_entryPointOutput_vColor %37 +OpReturn +OpFunctionEnd +)"; + + const std::string func_pt2_after = + R"(%40 = OpULessThan %bool %32 %uint_128 +OpSelectionMerge %41 None +OpBranchConditional %40 %42 %43 +%42 = OpLabel +%44 = OpLoad %16 %33 +%45 = OpSampledImage %26 %44 %35 +%46 = OpImageSampleImplicitLod %v4float %45 %30 +OpBranch %41 +%43 = OpLabel +%102 = OpFunctionCall %void %47 %uint_56 %uint_0 %32 %uint_128 +OpBranch %41 +%41 = OpLabel +%104 = OpPhi %v4float %46 %42 %103 %43 +OpStore %_entryPointOutput_vColor %104 +OpReturn +OpFunctionEnd +)"; + + const std::string output_func = + R"(%47 = OpFunction %void None %48 +%49 = OpFunctionParameter %uint +%50 = OpFunctionParameter %uint +%51 = OpFunctionParameter %uint +%52 = OpFunctionParameter %uint +%53 = OpLabel +%59 = OpAccessChain %_ptr_StorageBuffer_uint %57 %uint_0 +%62 = OpAtomicIAdd %uint %59 %uint_4 %uint_0 %uint_9 +%63 = OpIAdd %uint %62 %uint_9 +%64 = OpArrayLength %uint %57 1 +%65 = OpULessThanEqual %bool %63 %64 +OpSelectionMerge %66 None +OpBranchConditional %65 %67 %66 +%67 = OpLabel +%68 = OpIAdd %uint %62 %uint_0 +%70 = OpAccessChain %_ptr_StorageBuffer_uint %57 %uint_1 %68 +OpStore %70 %uint_9 +%72 = OpIAdd %uint %62 %uint_1 +%73 = OpAccessChain %_ptr_StorageBuffer_uint %57 %uint_1 %72 +OpStore %73 %uint_23 +%75 = OpIAdd %uint %62 %uint_2 +%76 = OpAccessChain %_ptr_StorageBuffer_uint %57 %uint_1 %75 +OpStore %76 %49 +%78 = OpIAdd %uint %62 %uint_3 +%79 = OpAccessChain %_ptr_StorageBuffer_uint %57 %uint_1 %78 +OpStore %79 %uint_4 +%82 = OpLoad %v4float %gl_FragCoord +%84 = OpBitcast %v4uint %82 +%85 = OpCompositeExtract %uint %84 0 +%86 = OpIAdd %uint %62 %uint_4 +%87 = OpAccessChain %_ptr_StorageBuffer_uint %57 %uint_1 %86 +OpStore %87 %85 +%88 = OpCompositeExtract %uint %84 1 +%90 = OpIAdd %uint %62 %uint_5 +%91 = OpAccessChain %_ptr_StorageBuffer_uint %57 %uint_1 %90 +OpStore %91 %88 +%93 = OpIAdd %uint %62 %uint_6 +%94 = OpAccessChain %_ptr_StorageBuffer_uint %57 %uint_1 %93 +OpStore %94 %50 +%96 = OpIAdd %uint %62 %uint_7 +%97 = OpAccessChain %_ptr_StorageBuffer_uint %57 %uint_1 %96 +OpStore %97 %51 +%99 = OpIAdd %uint %62 %uint_8 +%100 = OpAccessChain %_ptr_StorageBuffer_uint %57 %uint_1 %99 +OpStore %100 %52 +OpBranch %66 +%66 = OpLabel +OpReturn +OpFunctionEnd +)"; + + SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + SinglePassRunAndCheck( + entry_before + names_annots + consts_types_vars + func_pt1 + + func_pt2_before, + entry_after + names_annots + new_annots + consts_types_vars + + new_consts_types_vars + func_pt1 + func_pt2_after + output_func, + true, true); +} + +TEST_F(InstBindlessTest, NoInstrumentConstIndexInbounds) { + // Texture2D g_tColor[128]; + // + // SamplerState g_sAniso; + // + // struct PS_INPUT + // { + // float2 vTextureCoords : TEXCOORD2; + // }; + // + // struct PS_OUTPUT + // { + // float4 vColor : SV_Target0; + // }; + // + // PS_OUTPUT MainPs(PS_INPUT i) + // { + // PS_OUTPUT ps_output; + // + // ps_output.vColor = g_tColor[ 37 ].Sample(g_sAniso, i.vTextureCoords.xy); + // return ps_output; + // } + + const std::string before = + R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %MainPs "MainPs" %i_vTextureCoords %_entryPointOutput_vColor +OpExecutionMode %MainPs OriginUpperLeft +OpSource HLSL 500 +OpName %MainPs "MainPs" +OpName %g_tColor "g_tColor" +OpName %g_sAniso "g_sAniso" +OpName %i_vTextureCoords "i.vTextureCoords" +OpName %_entryPointOutput_vColor "@entryPointOutput.vColor" +OpDecorate %g_tColor DescriptorSet 3 +OpDecorate %g_tColor Binding 0 +OpDecorate %g_sAniso DescriptorSet 0 +OpDecorate %i_vTextureCoords Location 0 +OpDecorate %_entryPointOutput_vColor Location 0 +%void = OpTypeVoid +%8 = OpTypeFunction %void +%float = OpTypeFloat 32 +%v2float = OpTypeVector %float 2 +%v4float = OpTypeVector %float 4 +%int = OpTypeInt 32 1 +%int_0 = OpConstant %int 0 +%int_37 = OpConstant %int 37 +%15 = OpTypeImage %float 2D 0 0 0 1 Unknown +%uint = OpTypeInt 32 0 +%uint_128 = OpConstant %uint 128 +%_arr_15_uint_128 = OpTypeArray %15 %uint_128 +%_ptr_UniformConstant__arr_15_uint_128 = OpTypePointer UniformConstant %_arr_15_uint_128 +%g_tColor = OpVariable %_ptr_UniformConstant__arr_15_uint_128 UniformConstant +%_ptr_UniformConstant_15 = OpTypePointer UniformConstant %15 +%21 = OpTypeSampler +%_ptr_UniformConstant_21 = OpTypePointer UniformConstant %21 +%g_sAniso = OpVariable %_ptr_UniformConstant_21 UniformConstant +%23 = OpTypeSampledImage %15 +%_ptr_Input_v2float = OpTypePointer Input %v2float +%i_vTextureCoords = OpVariable %_ptr_Input_v2float Input +%_ptr_Output_v4float = OpTypePointer Output %v4float +%_entryPointOutput_vColor = OpVariable %_ptr_Output_v4float Output +%MainPs = OpFunction %void None %8 +%26 = OpLabel +%27 = OpLoad %v2float %i_vTextureCoords +%28 = OpAccessChain %_ptr_UniformConstant_15 %g_tColor %int_37 +%29 = OpLoad %15 %28 +%30 = OpLoad %21 %g_sAniso +%31 = OpSampledImage %23 %29 %30 +%32 = OpImageSampleImplicitLod %v4float %31 %27 +OpStore %_entryPointOutput_vColor %32 +OpReturn +OpFunctionEnd +)"; + + SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + SinglePassRunAndCheck(before, before, true, true); +} + +TEST_F(InstBindlessTest, InstrumentMultipleInstructions) { + // Texture2D g_tColor[128]; + // + // layout(push_constant) cbuffer PerViewConstantBuffer_t + // { + // uint g_nDataIdx; + // uint g_nDataIdx2; + // }; + // + // SamplerState g_sAniso; + // + // struct PS_INPUT + // { + // float2 vTextureCoords : TEXCOORD2; + // }; + // + // struct PS_OUTPUT + // { + // float4 vColor : SV_Target0; + // }; + // + // PS_OUTPUT MainPs(PS_INPUT i) + // { + // PS_OUTPUT ps_output; + // + // float t = g_tColor[g_nDataIdx ].Sample(g_sAniso, i.vTextureCoords.xy); + // float t2 = g_tColor[g_nDataIdx2].Sample(g_sAniso, i.vTextureCoords.xy); + // ps_output.vColor = t + t2; + // return ps_output; + // } + + const std::string defs_before = + R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %MainPs "MainPs" %i_vTextureCoords %_entryPointOutput_vColor +OpExecutionMode %MainPs OriginUpperLeft +OpSource HLSL 500 +OpName %MainPs "MainPs" +OpName %g_tColor "g_tColor" +OpName %PerViewConstantBuffer_t "PerViewConstantBuffer_t" +OpMemberName %PerViewConstantBuffer_t 0 "g_nDataIdx" +OpName %_ "" +OpName %g_sAniso "g_sAniso" +OpName %i_vTextureCoords "i.vTextureCoords" +OpName %_entryPointOutput_vColor "@entryPointOutput.vColor" +OpDecorate %g_tColor DescriptorSet 3 +OpDecorate %g_tColor Binding 0 +OpMemberDecorate %PerViewConstantBuffer_t 0 Offset 0 +OpMemberDecorate %PerViewConstantBuffer_t 1 Offset 4 +OpDecorate %PerViewConstantBuffer_t Block +OpDecorate %g_sAniso DescriptorSet 0 +OpDecorate %i_vTextureCoords Location 0 +OpDecorate %_entryPointOutput_vColor Location 0 +%void = OpTypeVoid +%10 = OpTypeFunction %void +%float = OpTypeFloat 32 +%v2float = OpTypeVector %float 2 +%v4float = OpTypeVector %float 4 +%int = OpTypeInt 32 1 +%int_0 = OpConstant %int 0 +%int_1 = OpConstant %int 1 +%17 = OpTypeImage %float 2D 0 0 0 1 Unknown +%uint = OpTypeInt 32 0 +%uint_128 = OpConstant %uint 128 +%_arr_17_uint_128 = OpTypeArray %17 %uint_128 +%_ptr_UniformConstant__arr_17_uint_128 = OpTypePointer UniformConstant %_arr_17_uint_128 +%g_tColor = OpVariable %_ptr_UniformConstant__arr_17_uint_128 UniformConstant +%PerViewConstantBuffer_t = OpTypeStruct %uint %uint +%_ptr_PushConstant_PerViewConstantBuffer_t = OpTypePointer PushConstant %PerViewConstantBuffer_t +%_ = OpVariable %_ptr_PushConstant_PerViewConstantBuffer_t PushConstant +%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint +%_ptr_UniformConstant_17 = OpTypePointer UniformConstant %17 +%25 = OpTypeSampler +%_ptr_UniformConstant_25 = OpTypePointer UniformConstant %25 +%g_sAniso = OpVariable %_ptr_UniformConstant_25 UniformConstant +%27 = OpTypeSampledImage %17 +%_ptr_Input_v2float = OpTypePointer Input %v2float +%i_vTextureCoords = OpVariable %_ptr_Input_v2float Input +%_ptr_Output_v4float = OpTypePointer Output %v4float +%_entryPointOutput_vColor = OpVariable %_ptr_Output_v4float Output +)"; + + const std::string defs_after = + R"(OpCapability Shader +OpExtension "SPV_KHR_storage_buffer_storage_class" +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %MainPs "MainPs" %i_vTextureCoords %_entryPointOutput_vColor %gl_FragCoord +OpExecutionMode %MainPs OriginUpperLeft +OpSource HLSL 500 +OpName %MainPs "MainPs" +OpName %g_tColor "g_tColor" +OpName %PerViewConstantBuffer_t "PerViewConstantBuffer_t" +OpMemberName %PerViewConstantBuffer_t 0 "g_nDataIdx" +OpName %_ "" +OpName %g_sAniso "g_sAniso" +OpName %i_vTextureCoords "i.vTextureCoords" +OpName %_entryPointOutput_vColor "@entryPointOutput.vColor" +OpDecorate %g_tColor DescriptorSet 3 +OpDecorate %g_tColor Binding 0 +OpMemberDecorate %PerViewConstantBuffer_t 0 Offset 0 +OpMemberDecorate %PerViewConstantBuffer_t 1 Offset 4 +OpDecorate %PerViewConstantBuffer_t Block +OpDecorate %g_sAniso DescriptorSet 0 +OpDecorate %i_vTextureCoords Location 0 +OpDecorate %_entryPointOutput_vColor Location 0 +OpDecorate %_struct_63 Block +OpMemberDecorate %_struct_63 0 Offset 0 +OpMemberDecorate %_struct_63 1 Offset 4 +OpDecorate %65 DescriptorSet 7 +OpDecorate %65 Binding 0 +OpDecorate %gl_FragCoord BuiltIn FragCoord +%void = OpTypeVoid +%10 = OpTypeFunction %void +%float = OpTypeFloat 32 +%v2float = OpTypeVector %float 2 +%v4float = OpTypeVector %float 4 +%int = OpTypeInt 32 1 +%int_0 = OpConstant %int 0 +%int_1 = OpConstant %int 1 +%17 = OpTypeImage %float 2D 0 0 0 1 Unknown +%uint = OpTypeInt 32 0 +%uint_128 = OpConstant %uint 128 +%_arr_17_uint_128 = OpTypeArray %17 %uint_128 +%_ptr_UniformConstant__arr_17_uint_128 = OpTypePointer UniformConstant %_arr_17_uint_128 +%g_tColor = OpVariable %_ptr_UniformConstant__arr_17_uint_128 UniformConstant +%PerViewConstantBuffer_t = OpTypeStruct %uint %uint +%_ptr_PushConstant_PerViewConstantBuffer_t = OpTypePointer PushConstant %PerViewConstantBuffer_t +%_ = OpVariable %_ptr_PushConstant_PerViewConstantBuffer_t PushConstant +%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint +%_ptr_UniformConstant_17 = OpTypePointer UniformConstant %17 +%25 = OpTypeSampler +%_ptr_UniformConstant_25 = OpTypePointer UniformConstant %25 +%g_sAniso = OpVariable %_ptr_UniformConstant_25 UniformConstant +%27 = OpTypeSampledImage %17 +%_ptr_Input_v2float = OpTypePointer Input %v2float +%i_vTextureCoords = OpVariable %_ptr_Input_v2float Input +%_ptr_Output_v4float = OpTypePointer Output %v4float +%_entryPointOutput_vColor = OpVariable %_ptr_Output_v4float Output +%uint_0 = OpConstant %uint 0 +%bool = OpTypeBool +%56 = OpTypeFunction %void %uint %uint %uint %uint +%_runtimearr_uint = OpTypeRuntimeArray %uint +%_struct_63 = OpTypeStruct %uint %_runtimearr_uint +%_ptr_StorageBuffer__struct_63 = OpTypePointer StorageBuffer %_struct_63 +%65 = OpVariable %_ptr_StorageBuffer__struct_63 StorageBuffer +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%uint_9 = OpConstant %uint 9 +%uint_4 = OpConstant %uint 4 +%uint_1 = OpConstant %uint 1 +%uint_23 = OpConstant %uint 23 +%uint_2 = OpConstant %uint 2 +%uint_3 = OpConstant %uint 3 +%_ptr_Input_v4float = OpTypePointer Input %v4float +%gl_FragCoord = OpVariable %_ptr_Input_v4float Input +%v4uint = OpTypeVector %uint 4 +%uint_5 = OpConstant %uint 5 +%uint_6 = OpConstant %uint 6 +%uint_7 = OpConstant %uint 7 +%uint_8 = OpConstant %uint 8 +%uint_58 = OpConstant %uint 58 +%111 = OpConstantNull %v4float +%uint_64 = OpConstant %uint 64 +)"; + + const std::string func_before = + R"(%MainPs = OpFunction %void None %10 +%30 = OpLabel +%31 = OpLoad %v2float %i_vTextureCoords +%32 = OpAccessChain %_ptr_PushConstant_uint %_ %int_0 +%33 = OpLoad %uint %32 +%34 = OpAccessChain %_ptr_UniformConstant_17 %g_tColor %33 +%35 = OpLoad %17 %34 +%36 = OpLoad %25 %g_sAniso +%37 = OpSampledImage %27 %35 %36 +%38 = OpImageSampleImplicitLod %v4float %37 %31 +%39 = OpAccessChain %_ptr_PushConstant_uint %_ %int_1 +%40 = OpLoad %uint %39 +%41 = OpAccessChain %_ptr_UniformConstant_17 %g_tColor %40 +%42 = OpLoad %17 %41 +%43 = OpSampledImage %27 %42 %36 +%44 = OpImageSampleImplicitLod %v4float %43 %31 +%45 = OpFAdd %v4float %38 %44 +OpStore %_entryPointOutput_vColor %45 +OpReturn +OpFunctionEnd +)"; + + const std::string func_after = + R"(%MainPs = OpFunction %void None %10 +%30 = OpLabel +%31 = OpLoad %v2float %i_vTextureCoords +%32 = OpAccessChain %_ptr_PushConstant_uint %_ %int_0 +%33 = OpLoad %uint %32 +%34 = OpAccessChain %_ptr_UniformConstant_17 %g_tColor %33 +%35 = OpLoad %17 %34 +%36 = OpLoad %25 %g_sAniso +%37 = OpSampledImage %27 %35 %36 +%48 = OpULessThan %bool %33 %uint_128 +OpSelectionMerge %49 None +OpBranchConditional %48 %50 %51 +%50 = OpLabel +%52 = OpLoad %17 %34 +%53 = OpSampledImage %27 %52 %36 +%54 = OpImageSampleImplicitLod %v4float %53 %31 +OpBranch %49 +%51 = OpLabel +%110 = OpFunctionCall %void %55 %uint_58 %uint_0 %33 %uint_128 +OpBranch %49 +%49 = OpLabel +%112 = OpPhi %v4float %54 %50 %111 %51 +%39 = OpAccessChain %_ptr_PushConstant_uint %_ %int_1 +%40 = OpLoad %uint %39 +%41 = OpAccessChain %_ptr_UniformConstant_17 %g_tColor %40 +%42 = OpLoad %17 %41 +%43 = OpSampledImage %27 %42 %36 +%113 = OpULessThan %bool %40 %uint_128 +OpSelectionMerge %114 None +OpBranchConditional %113 %115 %116 +%115 = OpLabel +%117 = OpLoad %17 %41 +%118 = OpSampledImage %27 %117 %36 +%119 = OpImageSampleImplicitLod %v4float %118 %31 +OpBranch %114 +%116 = OpLabel +%121 = OpFunctionCall %void %55 %uint_64 %uint_0 %40 %uint_128 +OpBranch %114 +%114 = OpLabel +%122 = OpPhi %v4float %119 %115 %111 %116 +%45 = OpFAdd %v4float %112 %122 +OpStore %_entryPointOutput_vColor %45 +OpReturn +OpFunctionEnd +)"; + + const std::string output_func = + R"(%55 = OpFunction %void None %56 +%57 = OpFunctionParameter %uint +%58 = OpFunctionParameter %uint +%59 = OpFunctionParameter %uint +%60 = OpFunctionParameter %uint +%61 = OpLabel +%67 = OpAccessChain %_ptr_StorageBuffer_uint %65 %uint_0 +%70 = OpAtomicIAdd %uint %67 %uint_4 %uint_0 %uint_9 +%71 = OpIAdd %uint %70 %uint_9 +%72 = OpArrayLength %uint %65 1 +%73 = OpULessThanEqual %bool %71 %72 +OpSelectionMerge %74 None +OpBranchConditional %73 %75 %74 +%75 = OpLabel +%76 = OpIAdd %uint %70 %uint_0 +%78 = OpAccessChain %_ptr_StorageBuffer_uint %65 %uint_1 %76 +OpStore %78 %uint_9 +%80 = OpIAdd %uint %70 %uint_1 +%81 = OpAccessChain %_ptr_StorageBuffer_uint %65 %uint_1 %80 +OpStore %81 %uint_23 +%83 = OpIAdd %uint %70 %uint_2 +%84 = OpAccessChain %_ptr_StorageBuffer_uint %65 %uint_1 %83 +OpStore %84 %57 +%86 = OpIAdd %uint %70 %uint_3 +%87 = OpAccessChain %_ptr_StorageBuffer_uint %65 %uint_1 %86 +OpStore %87 %uint_4 +%90 = OpLoad %v4float %gl_FragCoord +%92 = OpBitcast %v4uint %90 +%93 = OpCompositeExtract %uint %92 0 +%94 = OpIAdd %uint %70 %uint_4 +%95 = OpAccessChain %_ptr_StorageBuffer_uint %65 %uint_1 %94 +OpStore %95 %93 +%96 = OpCompositeExtract %uint %92 1 +%98 = OpIAdd %uint %70 %uint_5 +%99 = OpAccessChain %_ptr_StorageBuffer_uint %65 %uint_1 %98 +OpStore %99 %96 +%101 = OpIAdd %uint %70 %uint_6 +%102 = OpAccessChain %_ptr_StorageBuffer_uint %65 %uint_1 %101 +OpStore %102 %58 +%104 = OpIAdd %uint %70 %uint_7 +%105 = OpAccessChain %_ptr_StorageBuffer_uint %65 %uint_1 %104 +OpStore %105 %59 +%107 = OpIAdd %uint %70 %uint_8 +%108 = OpAccessChain %_ptr_StorageBuffer_uint %65 %uint_1 %107 +OpStore %108 %60 +OpBranch %74 +%74 = OpLabel +OpReturn +OpFunctionEnd +)"; + + SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + SinglePassRunAndCheck( + defs_before + func_before, defs_after + func_after + output_func, true, + true); +} + +TEST_F(InstBindlessTest, ReuseConstsTypesBuiltins) { + // This test verifies that the pass resuses existing constants, types + // and builtin variables. This test was created by editing the SPIR-V + // from the Simple test. + + const std::string defs_before = + R"(OpCapability Shader +OpExtension "SPV_KHR_storage_buffer_storage_class" +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %MainPs "MainPs" %i_vTextureCoords %_entryPointOutput_vColor %gl_FragCoord +OpExecutionMode %MainPs OriginUpperLeft +OpSource HLSL 500 +OpName %MainPs "MainPs" +OpName %g_tColor "g_tColor" +OpName %PerViewConstantBuffer_t "PerViewConstantBuffer_t" +OpMemberName %PerViewConstantBuffer_t 0 "g_nDataIdx" +OpName %_ "" +OpName %g_sAniso "g_sAniso" +OpName %i_vTextureCoords "i.vTextureCoords" +OpName %_entryPointOutput_vColor "@entryPointOutput.vColor" +OpDecorate %g_tColor DescriptorSet 3 +OpDecorate %g_tColor Binding 0 +OpMemberDecorate %PerViewConstantBuffer_t 0 Offset 0 +OpDecorate %PerViewConstantBuffer_t Block +OpDecorate %g_sAniso DescriptorSet 0 +OpDecorate %i_vTextureCoords Location 0 +OpDecorate %_entryPointOutput_vColor Location 0 +OpDecorate %85 DescriptorSet 7 +OpDecorate %85 Binding 0 +OpDecorate %gl_FragCoord BuiltIn FragCoord +%void = OpTypeVoid +%3 = OpTypeFunction %void +%float = OpTypeFloat 32 +%v2float = OpTypeVector %float 2 +%v4float = OpTypeVector %float 4 +%int = OpTypeInt 32 1 +%int_0 = OpConstant %int 0 +%20 = OpTypeImage %float 2D 0 0 0 1 Unknown +%uint = OpTypeInt 32 0 +%uint_128 = OpConstant %uint 128 +%_arr_20_uint_128 = OpTypeArray %20 %uint_128 +%_ptr_UniformConstant__arr_20_uint_128 = OpTypePointer UniformConstant %_arr_20_uint_128 +%g_tColor = OpVariable %_ptr_UniformConstant__arr_20_uint_128 UniformConstant +%PerViewConstantBuffer_t = OpTypeStruct %uint +%_ptr_PushConstant_PerViewConstantBuffer_t = OpTypePointer PushConstant %PerViewConstantBuffer_t +%_ = OpVariable %_ptr_PushConstant_PerViewConstantBuffer_t PushConstant +%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint +%_ptr_UniformConstant_20 = OpTypePointer UniformConstant %20 +%35 = OpTypeSampler +%_ptr_UniformConstant_35 = OpTypePointer UniformConstant %35 +%g_sAniso = OpVariable %_ptr_UniformConstant_35 UniformConstant +%39 = OpTypeSampledImage %20 +%_ptr_Input_v2float = OpTypePointer Input %v2float +%i_vTextureCoords = OpVariable %_ptr_Input_v2float Input +%_ptr_Output_v4float = OpTypePointer Output %v4float +%_entryPointOutput_vColor = OpVariable %_ptr_Output_v4float Output +%uint_0 = OpConstant %uint 0 +%bool = OpTypeBool +%_runtimearr_uint = OpTypeRuntimeArray %uint +%_struct_83 = OpTypeStruct %uint %_runtimearr_uint +%_ptr_StorageBuffer__struct_83 = OpTypePointer StorageBuffer %_struct_83 +%85 = OpVariable %_ptr_StorageBuffer__struct_83 StorageBuffer +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%uint_10 = OpConstant %uint 10 +%uint_4 = OpConstant %uint 4 +%uint_1 = OpConstant %uint 1 +%uint_23 = OpConstant %uint 23 +%uint_2 = OpConstant %uint 2 +%uint_9 = OpConstant %uint 9 +%uint_3 = OpConstant %uint 3 +%_ptr_Input_v4float = OpTypePointer Input %v4float +%gl_FragCoord = OpVariable %_ptr_Input_v4float Input +%v4uint = OpTypeVector %uint 4 +%uint_5 = OpConstant %uint 5 +%uint_6 = OpConstant %uint 6 +%uint_7 = OpConstant %uint 7 +%uint_8 = OpConstant %uint 8 +%131 = OpConstantNull %v4float +)"; + + const std::string defs_after = + R"(OpCapability Shader +OpExtension "SPV_KHR_storage_buffer_storage_class" +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %MainPs "MainPs" %i_vTextureCoords %_entryPointOutput_vColor %gl_FragCoord +OpExecutionMode %MainPs OriginUpperLeft +OpSource HLSL 500 +OpName %MainPs "MainPs" +OpName %g_tColor "g_tColor" +OpName %PerViewConstantBuffer_t "PerViewConstantBuffer_t" +OpMemberName %PerViewConstantBuffer_t 0 "g_nDataIdx" +OpName %_ "" +OpName %g_sAniso "g_sAniso" +OpName %i_vTextureCoords "i.vTextureCoords" +OpName %_entryPointOutput_vColor "@entryPointOutput.vColor" +OpDecorate %g_tColor DescriptorSet 3 +OpDecorate %g_tColor Binding 0 +OpMemberDecorate %PerViewConstantBuffer_t 0 Offset 0 +OpDecorate %PerViewConstantBuffer_t Block +OpDecorate %g_sAniso DescriptorSet 0 +OpDecorate %i_vTextureCoords Location 0 +OpDecorate %_entryPointOutput_vColor Location 0 +OpDecorate %10 DescriptorSet 7 +OpDecorate %10 Binding 0 +OpDecorate %gl_FragCoord BuiltIn FragCoord +OpDecorate %_struct_34 Block +OpMemberDecorate %_struct_34 0 Offset 0 +OpMemberDecorate %_struct_34 1 Offset 4 +OpDecorate %74 DescriptorSet 7 +OpDecorate %74 Binding 0 +%void = OpTypeVoid +%12 = OpTypeFunction %void +%float = OpTypeFloat 32 +%v2float = OpTypeVector %float 2 +%v4float = OpTypeVector %float 4 +%int = OpTypeInt 32 1 +%int_0 = OpConstant %int 0 +%18 = OpTypeImage %float 2D 0 0 0 1 Unknown +%uint = OpTypeInt 32 0 +%uint_128 = OpConstant %uint 128 +%_arr_18_uint_128 = OpTypeArray %18 %uint_128 +%_ptr_UniformConstant__arr_18_uint_128 = OpTypePointer UniformConstant %_arr_18_uint_128 +%g_tColor = OpVariable %_ptr_UniformConstant__arr_18_uint_128 UniformConstant +%PerViewConstantBuffer_t = OpTypeStruct %uint +%_ptr_PushConstant_PerViewConstantBuffer_t = OpTypePointer PushConstant %PerViewConstantBuffer_t +%_ = OpVariable %_ptr_PushConstant_PerViewConstantBuffer_t PushConstant +%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint +%_ptr_UniformConstant_18 = OpTypePointer UniformConstant %18 +%26 = OpTypeSampler +%_ptr_UniformConstant_26 = OpTypePointer UniformConstant %26 +%g_sAniso = OpVariable %_ptr_UniformConstant_26 UniformConstant +%28 = OpTypeSampledImage %18 +%_ptr_Input_v2float = OpTypePointer Input %v2float +%i_vTextureCoords = OpVariable %_ptr_Input_v2float Input +%_ptr_Output_v4float = OpTypePointer Output %v4float +%_entryPointOutput_vColor = OpVariable %_ptr_Output_v4float Output +%uint_0 = OpConstant %uint 0 +%bool = OpTypeBool +%_runtimearr_uint = OpTypeRuntimeArray %uint +%_struct_34 = OpTypeStruct %uint %_runtimearr_uint +%_ptr_StorageBuffer__struct_34 = OpTypePointer StorageBuffer %_struct_34 +%10 = OpVariable %_ptr_StorageBuffer__struct_34 StorageBuffer +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%uint_10 = OpConstant %uint 10 +%uint_4 = OpConstant %uint 4 +%uint_1 = OpConstant %uint 1 +%uint_23 = OpConstant %uint 23 +%uint_2 = OpConstant %uint 2 +%uint_9 = OpConstant %uint 9 +%uint_3 = OpConstant %uint 3 +%_ptr_Input_v4float = OpTypePointer Input %v4float +%gl_FragCoord = OpVariable %_ptr_Input_v4float Input +%v4uint = OpTypeVector %uint 4 +%uint_5 = OpConstant %uint 5 +%uint_6 = OpConstant %uint 6 +%uint_7 = OpConstant %uint 7 +%uint_8 = OpConstant %uint 8 +%50 = OpConstantNull %v4float +%68 = OpTypeFunction %void %uint %uint %uint %uint +%74 = OpVariable %_ptr_StorageBuffer__struct_34 StorageBuffer +%uint_82 = OpConstant %uint 82 +)"; + + const std::string func_before = + R"(%MainPs = OpFunction %void None %3 +%5 = OpLabel +%53 = OpLoad %v2float %i_vTextureCoords +%63 = OpAccessChain %_ptr_PushConstant_uint %_ %int_0 +%64 = OpLoad %uint %63 +%65 = OpAccessChain %_ptr_UniformConstant_20 %g_tColor %64 +%67 = OpLoad %35 %g_sAniso +%78 = OpLoad %20 %65 +%79 = OpSampledImage %39 %78 %67 +%71 = OpImageSampleImplicitLod %v4float %79 %53 +OpStore %_entryPointOutput_vColor %71 +OpReturn +OpFunctionEnd +)"; + + const std::string func_after = + R"(%MainPs = OpFunction %void None %12 +%51 = OpLabel +%52 = OpLoad %v2float %i_vTextureCoords +%53 = OpAccessChain %_ptr_PushConstant_uint %_ %int_0 +%54 = OpLoad %uint %53 +%55 = OpAccessChain %_ptr_UniformConstant_18 %g_tColor %54 +%56 = OpLoad %26 %g_sAniso +%57 = OpLoad %18 %55 +%58 = OpSampledImage %28 %57 %56 +%60 = OpULessThan %bool %54 %uint_128 +OpSelectionMerge %61 None +OpBranchConditional %60 %62 %63 +%62 = OpLabel +%64 = OpLoad %18 %55 +%65 = OpSampledImage %28 %64 %56 +%66 = OpImageSampleImplicitLod %v4float %65 %52 +OpBranch %61 +%63 = OpLabel +%105 = OpFunctionCall %void %67 %uint_82 %uint_0 %54 %uint_128 +OpBranch %61 +%61 = OpLabel +%106 = OpPhi %v4float %66 %62 %50 %63 +OpStore %_entryPointOutput_vColor %106 +OpReturn +OpFunctionEnd +)"; + + const std::string output_func = + R"(%67 = OpFunction %void None %68 +%69 = OpFunctionParameter %uint +%70 = OpFunctionParameter %uint +%71 = OpFunctionParameter %uint +%72 = OpFunctionParameter %uint +%73 = OpLabel +%75 = OpAccessChain %_ptr_StorageBuffer_uint %74 %uint_0 +%76 = OpAtomicIAdd %uint %75 %uint_4 %uint_0 %uint_9 +%77 = OpIAdd %uint %76 %uint_9 +%78 = OpArrayLength %uint %74 1 +%79 = OpULessThanEqual %bool %77 %78 +OpSelectionMerge %80 None +OpBranchConditional %79 %81 %80 +%81 = OpLabel +%82 = OpIAdd %uint %76 %uint_0 +%83 = OpAccessChain %_ptr_StorageBuffer_uint %74 %uint_1 %82 +OpStore %83 %uint_9 +%84 = OpIAdd %uint %76 %uint_1 +%85 = OpAccessChain %_ptr_StorageBuffer_uint %74 %uint_1 %84 +OpStore %85 %uint_23 +%86 = OpIAdd %uint %76 %uint_2 +%87 = OpAccessChain %_ptr_StorageBuffer_uint %74 %uint_1 %86 +OpStore %87 %69 +%88 = OpIAdd %uint %76 %uint_3 +%89 = OpAccessChain %_ptr_StorageBuffer_uint %74 %uint_1 %88 +OpStore %89 %uint_4 +%90 = OpLoad %v4float %gl_FragCoord +%91 = OpBitcast %v4uint %90 +%92 = OpCompositeExtract %uint %91 0 +%93 = OpIAdd %uint %76 %uint_4 +%94 = OpAccessChain %_ptr_StorageBuffer_uint %74 %uint_1 %93 +OpStore %94 %92 +%95 = OpCompositeExtract %uint %91 1 +%96 = OpIAdd %uint %76 %uint_5 +%97 = OpAccessChain %_ptr_StorageBuffer_uint %74 %uint_1 %96 +OpStore %97 %95 +%98 = OpIAdd %uint %76 %uint_6 +%99 = OpAccessChain %_ptr_StorageBuffer_uint %74 %uint_1 %98 +OpStore %99 %70 +%100 = OpIAdd %uint %76 %uint_7 +%101 = OpAccessChain %_ptr_StorageBuffer_uint %74 %uint_1 %100 +OpStore %101 %71 +%102 = OpIAdd %uint %76 %uint_8 +%103 = OpAccessChain %_ptr_StorageBuffer_uint %74 %uint_1 %102 +OpStore %103 %72 +OpBranch %80 +%80 = OpLabel +OpReturn +OpFunctionEnd +)"; + + // SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + SinglePassRunAndCheck( + defs_before + func_before, defs_after + func_after + output_func, true, + true); +} + +TEST_F(InstBindlessTest, InstrumentOpImage) { + // This test verifies that the pass will correctly instrument shader + // using OpImage. This test was created by editing the SPIR-V + // from the Simple test. + + const std::string defs_before = + R"(OpCapability Shader +OpCapability StorageImageReadWithoutFormat +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %MainPs "MainPs" %i_vTextureCoords %_entryPointOutput_vColor +OpExecutionMode %MainPs OriginUpperLeft +OpSource HLSL 500 +OpName %MainPs "MainPs" +OpName %g_tColor "g_tColor" +OpName %PerViewConstantBuffer_t "PerViewConstantBuffer_t" +OpMemberName %PerViewConstantBuffer_t 0 "g_nDataIdx" +OpName %_ "" +OpName %i_vTextureCoords "i.vTextureCoords" +OpName %_entryPointOutput_vColor "@entryPointOutput.vColor" +OpDecorate %g_tColor DescriptorSet 3 +OpDecorate %g_tColor Binding 0 +OpMemberDecorate %PerViewConstantBuffer_t 0 Offset 0 +OpDecorate %PerViewConstantBuffer_t Block +OpDecorate %i_vTextureCoords Location 0 +OpDecorate %_entryPointOutput_vColor Location 0 +%void = OpTypeVoid +%3 = OpTypeFunction %void +%float = OpTypeFloat 32 +%v4float = OpTypeVector %float 4 +%int = OpTypeInt 32 1 +%v2int = OpTypeVector %int 2 +%int_0 = OpConstant %int 0 +%20 = OpTypeImage %float 2D 0 0 0 0 Unknown +%uint = OpTypeInt 32 0 +%uint_128 = OpConstant %uint 128 +%39 = OpTypeSampledImage %20 +%_arr_39_uint_128 = OpTypeArray %39 %uint_128 +%_ptr_UniformConstant__arr_39_uint_128 = OpTypePointer UniformConstant %_arr_39_uint_128 +%g_tColor = OpVariable %_ptr_UniformConstant__arr_39_uint_128 UniformConstant +%PerViewConstantBuffer_t = OpTypeStruct %uint +%_ptr_PushConstant_PerViewConstantBuffer_t = OpTypePointer PushConstant %PerViewConstantBuffer_t +%_ = OpVariable %_ptr_PushConstant_PerViewConstantBuffer_t PushConstant +%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint +%_ptr_UniformConstant_39 = OpTypePointer UniformConstant %39 +%_ptr_Input_v2int = OpTypePointer Input %v2int +%i_vTextureCoords = OpVariable %_ptr_Input_v2int Input +%_ptr_Output_v4float = OpTypePointer Output %v4float +%_entryPointOutput_vColor = OpVariable %_ptr_Output_v4float Output +)"; + + const std::string defs_after = + R"(OpCapability Shader +OpCapability StorageImageReadWithoutFormat +OpExtension "SPV_KHR_storage_buffer_storage_class" +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %MainPs "MainPs" %i_vTextureCoords %_entryPointOutput_vColor %gl_FragCoord +OpExecutionMode %MainPs OriginUpperLeft +OpSource HLSL 500 +OpName %MainPs "MainPs" +OpName %g_tColor "g_tColor" +OpName %PerViewConstantBuffer_t "PerViewConstantBuffer_t" +OpMemberName %PerViewConstantBuffer_t 0 "g_nDataIdx" +OpName %_ "" +OpName %i_vTextureCoords "i.vTextureCoords" +OpName %_entryPointOutput_vColor "@entryPointOutput.vColor" +OpDecorate %g_tColor DescriptorSet 3 +OpDecorate %g_tColor Binding 0 +OpMemberDecorate %PerViewConstantBuffer_t 0 Offset 0 +OpDecorate %PerViewConstantBuffer_t Block +OpDecorate %i_vTextureCoords Location 0 +OpDecorate %_entryPointOutput_vColor Location 0 +OpDecorate %_struct_51 Block +OpMemberDecorate %_struct_51 0 Offset 0 +OpMemberDecorate %_struct_51 1 Offset 4 +OpDecorate %53 DescriptorSet 7 +OpDecorate %53 Binding 0 +OpDecorate %gl_FragCoord BuiltIn FragCoord +%void = OpTypeVoid +%9 = OpTypeFunction %void +%float = OpTypeFloat 32 +%v4float = OpTypeVector %float 4 +%int = OpTypeInt 32 1 +%v2int = OpTypeVector %int 2 +%int_0 = OpConstant %int 0 +%15 = OpTypeImage %float 2D 0 0 0 0 Unknown +%uint = OpTypeInt 32 0 +%uint_128 = OpConstant %uint 128 +%18 = OpTypeSampledImage %15 +%_arr_18_uint_128 = OpTypeArray %18 %uint_128 +%_ptr_UniformConstant__arr_18_uint_128 = OpTypePointer UniformConstant %_arr_18_uint_128 +%g_tColor = OpVariable %_ptr_UniformConstant__arr_18_uint_128 UniformConstant +%PerViewConstantBuffer_t = OpTypeStruct %uint +%_ptr_PushConstant_PerViewConstantBuffer_t = OpTypePointer PushConstant %PerViewConstantBuffer_t +%_ = OpVariable %_ptr_PushConstant_PerViewConstantBuffer_t PushConstant +%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint +%_ptr_UniformConstant_18 = OpTypePointer UniformConstant %18 +%_ptr_Input_v2int = OpTypePointer Input %v2int +%i_vTextureCoords = OpVariable %_ptr_Input_v2int Input +%_ptr_Output_v4float = OpTypePointer Output %v4float +%_entryPointOutput_vColor = OpVariable %_ptr_Output_v4float Output +%uint_0 = OpConstant %uint 0 +%bool = OpTypeBool +%44 = OpTypeFunction %void %uint %uint %uint %uint +%_runtimearr_uint = OpTypeRuntimeArray %uint +%_struct_51 = OpTypeStruct %uint %_runtimearr_uint +%_ptr_StorageBuffer__struct_51 = OpTypePointer StorageBuffer %_struct_51 +%53 = OpVariable %_ptr_StorageBuffer__struct_51 StorageBuffer +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%uint_9 = OpConstant %uint 9 +%uint_4 = OpConstant %uint 4 +%uint_1 = OpConstant %uint 1 +%uint_23 = OpConstant %uint 23 +%uint_2 = OpConstant %uint 2 +%uint_3 = OpConstant %uint 3 +%_ptr_Input_v4float = OpTypePointer Input %v4float +%gl_FragCoord = OpVariable %_ptr_Input_v4float Input +%v4uint = OpTypeVector %uint 4 +%uint_5 = OpConstant %uint 5 +%uint_6 = OpConstant %uint 6 +%uint_7 = OpConstant %uint 7 +%uint_8 = OpConstant %uint 8 +%uint_51 = OpConstant %uint 51 +%99 = OpConstantNull %v4float +)"; + + const std::string func_before = + R"(%MainPs = OpFunction %void None %3 +%5 = OpLabel +%53 = OpLoad %v2int %i_vTextureCoords +%63 = OpAccessChain %_ptr_PushConstant_uint %_ %int_0 +%64 = OpLoad %uint %63 +%65 = OpAccessChain %_ptr_UniformConstant_39 %g_tColor %64 +%66 = OpLoad %39 %65 +%75 = OpImage %20 %66 +%71 = OpImageRead %v4float %75 %53 +OpStore %_entryPointOutput_vColor %71 +OpReturn +OpFunctionEnd +)"; + + const std::string func_after = + R"(%MainPs = OpFunction %void None %9 +%26 = OpLabel +%27 = OpLoad %v2int %i_vTextureCoords +%28 = OpAccessChain %_ptr_PushConstant_uint %_ %int_0 +%29 = OpLoad %uint %28 +%30 = OpAccessChain %_ptr_UniformConstant_18 %g_tColor %29 +%31 = OpLoad %18 %30 +%32 = OpImage %15 %31 +%36 = OpULessThan %bool %29 %uint_128 +OpSelectionMerge %37 None +OpBranchConditional %36 %38 %39 +%38 = OpLabel +%40 = OpLoad %18 %30 +%41 = OpImage %15 %40 +%42 = OpImageRead %v4float %41 %27 +OpBranch %37 +%39 = OpLabel +%98 = OpFunctionCall %void %43 %uint_51 %uint_0 %29 %uint_128 +OpBranch %37 +%37 = OpLabel +%100 = OpPhi %v4float %42 %38 %99 %39 +OpStore %_entryPointOutput_vColor %100 +OpReturn +OpFunctionEnd +)"; + + const std::string output_func = + R"(%43 = OpFunction %void None %44 +%45 = OpFunctionParameter %uint +%46 = OpFunctionParameter %uint +%47 = OpFunctionParameter %uint +%48 = OpFunctionParameter %uint +%49 = OpLabel +%55 = OpAccessChain %_ptr_StorageBuffer_uint %53 %uint_0 +%58 = OpAtomicIAdd %uint %55 %uint_4 %uint_0 %uint_9 +%59 = OpIAdd %uint %58 %uint_9 +%60 = OpArrayLength %uint %53 1 +%61 = OpULessThanEqual %bool %59 %60 +OpSelectionMerge %62 None +OpBranchConditional %61 %63 %62 +%63 = OpLabel +%64 = OpIAdd %uint %58 %uint_0 +%66 = OpAccessChain %_ptr_StorageBuffer_uint %53 %uint_1 %64 +OpStore %66 %uint_9 +%68 = OpIAdd %uint %58 %uint_1 +%69 = OpAccessChain %_ptr_StorageBuffer_uint %53 %uint_1 %68 +OpStore %69 %uint_23 +%71 = OpIAdd %uint %58 %uint_2 +%72 = OpAccessChain %_ptr_StorageBuffer_uint %53 %uint_1 %71 +OpStore %72 %45 +%74 = OpIAdd %uint %58 %uint_3 +%75 = OpAccessChain %_ptr_StorageBuffer_uint %53 %uint_1 %74 +OpStore %75 %uint_4 +%78 = OpLoad %v4float %gl_FragCoord +%80 = OpBitcast %v4uint %78 +%81 = OpCompositeExtract %uint %80 0 +%82 = OpIAdd %uint %58 %uint_4 +%83 = OpAccessChain %_ptr_StorageBuffer_uint %53 %uint_1 %82 +OpStore %83 %81 +%84 = OpCompositeExtract %uint %80 1 +%86 = OpIAdd %uint %58 %uint_5 +%87 = OpAccessChain %_ptr_StorageBuffer_uint %53 %uint_1 %86 +OpStore %87 %84 +%89 = OpIAdd %uint %58 %uint_6 +%90 = OpAccessChain %_ptr_StorageBuffer_uint %53 %uint_1 %89 +OpStore %90 %46 +%92 = OpIAdd %uint %58 %uint_7 +%93 = OpAccessChain %_ptr_StorageBuffer_uint %53 %uint_1 %92 +OpStore %93 %47 +%95 = OpIAdd %uint %58 %uint_8 +%96 = OpAccessChain %_ptr_StorageBuffer_uint %53 %uint_1 %95 +OpStore %96 %48 +OpBranch %62 +%62 = OpLabel +OpReturn +OpFunctionEnd +)"; + + // SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + SinglePassRunAndCheck( + defs_before + func_before, defs_after + func_after + output_func, true, + true); +} + +TEST_F(InstBindlessTest, InstrumentSampledImage) { + // This test verifies that the pass will correctly instrument shader + // using sampled image. This test was created by editing the SPIR-V + // from the Simple test. + + const std::string defs_before = + R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %MainPs "MainPs" %i_vTextureCoords %_entryPointOutput_vColor +OpExecutionMode %MainPs OriginUpperLeft +OpSource HLSL 500 +OpName %MainPs "MainPs" +OpName %g_tColor "g_tColor" +OpName %PerViewConstantBuffer_t "PerViewConstantBuffer_t" +OpMemberName %PerViewConstantBuffer_t 0 "g_nDataIdx" +OpName %_ "" +OpName %i_vTextureCoords "i.vTextureCoords" +OpName %_entryPointOutput_vColor "@entryPointOutput.vColor" +OpDecorate %g_tColor DescriptorSet 3 +OpDecorate %g_tColor Binding 0 +OpMemberDecorate %PerViewConstantBuffer_t 0 Offset 0 +OpDecorate %PerViewConstantBuffer_t Block +OpDecorate %i_vTextureCoords Location 0 +OpDecorate %_entryPointOutput_vColor Location 0 +%void = OpTypeVoid +%3 = OpTypeFunction %void +%float = OpTypeFloat 32 +%v2float = OpTypeVector %float 2 +%v4float = OpTypeVector %float 4 +%int = OpTypeInt 32 1 +%int_0 = OpConstant %int 0 +%20 = OpTypeImage %float 2D 0 0 0 1 Unknown +%uint = OpTypeInt 32 0 +%uint_128 = OpConstant %uint 128 +%39 = OpTypeSampledImage %20 +%_arr_39_uint_128 = OpTypeArray %39 %uint_128 +%_ptr_UniformConstant__arr_39_uint_128 = OpTypePointer UniformConstant %_arr_39_uint_128 +%g_tColor = OpVariable %_ptr_UniformConstant__arr_39_uint_128 UniformConstant +%PerViewConstantBuffer_t = OpTypeStruct %uint +%_ptr_PushConstant_PerViewConstantBuffer_t = OpTypePointer PushConstant %PerViewConstantBuffer_t +%_ = OpVariable %_ptr_PushConstant_PerViewConstantBuffer_t PushConstant +%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint +%_ptr_UniformConstant_39 = OpTypePointer UniformConstant %39 +%_ptr_Input_v2float = OpTypePointer Input %v2float +%i_vTextureCoords = OpVariable %_ptr_Input_v2float Input +%_ptr_Output_v4float = OpTypePointer Output %v4float +%_entryPointOutput_vColor = OpVariable %_ptr_Output_v4float Output +)"; + + const std::string defs_after = + R"(OpCapability Shader +OpExtension "SPV_KHR_storage_buffer_storage_class" +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %MainPs "MainPs" %i_vTextureCoords %_entryPointOutput_vColor %gl_FragCoord +OpExecutionMode %MainPs OriginUpperLeft +OpSource HLSL 500 +OpName %MainPs "MainPs" +OpName %g_tColor "g_tColor" +OpName %PerViewConstantBuffer_t "PerViewConstantBuffer_t" +OpMemberName %PerViewConstantBuffer_t 0 "g_nDataIdx" +OpName %_ "" +OpName %i_vTextureCoords "i.vTextureCoords" +OpName %_entryPointOutput_vColor "@entryPointOutput.vColor" +OpDecorate %g_tColor DescriptorSet 3 +OpDecorate %g_tColor Binding 0 +OpMemberDecorate %PerViewConstantBuffer_t 0 Offset 0 +OpDecorate %PerViewConstantBuffer_t Block +OpDecorate %i_vTextureCoords Location 0 +OpDecorate %_entryPointOutput_vColor Location 0 +OpDecorate %_struct_49 Block +OpMemberDecorate %_struct_49 0 Offset 0 +OpMemberDecorate %_struct_49 1 Offset 4 +OpDecorate %51 DescriptorSet 7 +OpDecorate %51 Binding 0 +OpDecorate %gl_FragCoord BuiltIn FragCoord +%void = OpTypeVoid +%9 = OpTypeFunction %void +%float = OpTypeFloat 32 +%v2float = OpTypeVector %float 2 +%v4float = OpTypeVector %float 4 +%int = OpTypeInt 32 1 +%int_0 = OpConstant %int 0 +%15 = OpTypeImage %float 2D 0 0 0 1 Unknown +%uint = OpTypeInt 32 0 +%uint_128 = OpConstant %uint 128 +%18 = OpTypeSampledImage %15 +%_arr_18_uint_128 = OpTypeArray %18 %uint_128 +%_ptr_UniformConstant__arr_18_uint_128 = OpTypePointer UniformConstant %_arr_18_uint_128 +%g_tColor = OpVariable %_ptr_UniformConstant__arr_18_uint_128 UniformConstant +%PerViewConstantBuffer_t = OpTypeStruct %uint +%_ptr_PushConstant_PerViewConstantBuffer_t = OpTypePointer PushConstant %PerViewConstantBuffer_t +%_ = OpVariable %_ptr_PushConstant_PerViewConstantBuffer_t PushConstant +%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint +%_ptr_UniformConstant_18 = OpTypePointer UniformConstant %18 +%_ptr_Input_v2float = OpTypePointer Input %v2float +%i_vTextureCoords = OpVariable %_ptr_Input_v2float Input +%_ptr_Output_v4float = OpTypePointer Output %v4float +%_entryPointOutput_vColor = OpVariable %_ptr_Output_v4float Output +%uint_0 = OpConstant %uint 0 +%bool = OpTypeBool +%42 = OpTypeFunction %void %uint %uint %uint %uint +%_runtimearr_uint = OpTypeRuntimeArray %uint +%_struct_49 = OpTypeStruct %uint %_runtimearr_uint +%_ptr_StorageBuffer__struct_49 = OpTypePointer StorageBuffer %_struct_49 +%51 = OpVariable %_ptr_StorageBuffer__struct_49 StorageBuffer +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%uint_9 = OpConstant %uint 9 +%uint_4 = OpConstant %uint 4 +%uint_1 = OpConstant %uint 1 +%uint_23 = OpConstant %uint 23 +%uint_2 = OpConstant %uint 2 +%uint_3 = OpConstant %uint 3 +%_ptr_Input_v4float = OpTypePointer Input %v4float +%gl_FragCoord = OpVariable %_ptr_Input_v4float Input +%v4uint = OpTypeVector %uint 4 +%uint_5 = OpConstant %uint 5 +%uint_6 = OpConstant %uint 6 +%uint_7 = OpConstant %uint 7 +%uint_8 = OpConstant %uint 8 +%uint_49 = OpConstant %uint 49 +%97 = OpConstantNull %v4float +)"; + + const std::string func_before = + R"(%MainPs = OpFunction %void None %3 +%5 = OpLabel +%53 = OpLoad %v2float %i_vTextureCoords +%63 = OpAccessChain %_ptr_PushConstant_uint %_ %int_0 +%64 = OpLoad %uint %63 +%65 = OpAccessChain %_ptr_UniformConstant_39 %g_tColor %64 +%66 = OpLoad %39 %65 +%71 = OpImageSampleImplicitLod %v4float %66 %53 +OpStore %_entryPointOutput_vColor %71 +OpReturn +OpFunctionEnd +)"; + + const std::string func_after = + R"(%MainPs = OpFunction %void None %9 +%26 = OpLabel +%27 = OpLoad %v2float %i_vTextureCoords +%28 = OpAccessChain %_ptr_PushConstant_uint %_ %int_0 +%29 = OpLoad %uint %28 +%30 = OpAccessChain %_ptr_UniformConstant_18 %g_tColor %29 +%31 = OpLoad %18 %30 +%35 = OpULessThan %bool %29 %uint_128 +OpSelectionMerge %36 None +OpBranchConditional %35 %37 %38 +%37 = OpLabel +%39 = OpLoad %18 %30 +%40 = OpImageSampleImplicitLod %v4float %39 %27 +OpBranch %36 +%38 = OpLabel +%96 = OpFunctionCall %void %41 %uint_49 %uint_0 %29 %uint_128 +OpBranch %36 +%36 = OpLabel +%98 = OpPhi %v4float %40 %37 %97 %38 +OpStore %_entryPointOutput_vColor %98 +OpReturn +OpFunctionEnd +)"; + + const std::string output_func = + R"(%41 = OpFunction %void None %42 +%43 = OpFunctionParameter %uint +%44 = OpFunctionParameter %uint +%45 = OpFunctionParameter %uint +%46 = OpFunctionParameter %uint +%47 = OpLabel +%53 = OpAccessChain %_ptr_StorageBuffer_uint %51 %uint_0 +%56 = OpAtomicIAdd %uint %53 %uint_4 %uint_0 %uint_9 +%57 = OpIAdd %uint %56 %uint_9 +%58 = OpArrayLength %uint %51 1 +%59 = OpULessThanEqual %bool %57 %58 +OpSelectionMerge %60 None +OpBranchConditional %59 %61 %60 +%61 = OpLabel +%62 = OpIAdd %uint %56 %uint_0 +%64 = OpAccessChain %_ptr_StorageBuffer_uint %51 %uint_1 %62 +OpStore %64 %uint_9 +%66 = OpIAdd %uint %56 %uint_1 +%67 = OpAccessChain %_ptr_StorageBuffer_uint %51 %uint_1 %66 +OpStore %67 %uint_23 +%69 = OpIAdd %uint %56 %uint_2 +%70 = OpAccessChain %_ptr_StorageBuffer_uint %51 %uint_1 %69 +OpStore %70 %43 +%72 = OpIAdd %uint %56 %uint_3 +%73 = OpAccessChain %_ptr_StorageBuffer_uint %51 %uint_1 %72 +OpStore %73 %uint_4 +%76 = OpLoad %v4float %gl_FragCoord +%78 = OpBitcast %v4uint %76 +%79 = OpCompositeExtract %uint %78 0 +%80 = OpIAdd %uint %56 %uint_4 +%81 = OpAccessChain %_ptr_StorageBuffer_uint %51 %uint_1 %80 +OpStore %81 %79 +%82 = OpCompositeExtract %uint %78 1 +%84 = OpIAdd %uint %56 %uint_5 +%85 = OpAccessChain %_ptr_StorageBuffer_uint %51 %uint_1 %84 +OpStore %85 %82 +%87 = OpIAdd %uint %56 %uint_6 +%88 = OpAccessChain %_ptr_StorageBuffer_uint %51 %uint_1 %87 +OpStore %88 %44 +%90 = OpIAdd %uint %56 %uint_7 +%91 = OpAccessChain %_ptr_StorageBuffer_uint %51 %uint_1 %90 +OpStore %91 %45 +%93 = OpIAdd %uint %56 %uint_8 +%94 = OpAccessChain %_ptr_StorageBuffer_uint %51 %uint_1 %93 +OpStore %94 %46 +OpBranch %60 +%60 = OpLabel +OpReturn +OpFunctionEnd +)"; + + // SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + SinglePassRunAndCheck( + defs_before + func_before, defs_after + func_after + output_func, true, + true); +} + +TEST_F(InstBindlessTest, InstrumentImageWrite) { + // This test verifies that the pass will correctly instrument shader + // doing bindless image write. This test was created by editing the SPIR-V + // from the Simple test. + + const std::string defs_before = + R"(OpCapability Shader +OpCapability StorageImageWriteWithoutFormat +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %MainPs "MainPs" %i_vTextureCoords %_entryPointOutput_vColor +OpExecutionMode %MainPs OriginUpperLeft +OpSource HLSL 500 +OpName %MainPs "MainPs" +OpName %g_tColor "g_tColor" +OpName %PerViewConstantBuffer_t "PerViewConstantBuffer_t" +OpMemberName %PerViewConstantBuffer_t 0 "g_nDataIdx" +OpName %_ "" +OpName %i_vTextureCoords "i.vTextureCoords" +OpName %_entryPointOutput_vColor "@entryPointOutput.vColor" +OpDecorate %g_tColor DescriptorSet 3 +OpDecorate %g_tColor Binding 0 +OpMemberDecorate %PerViewConstantBuffer_t 0 Offset 0 +OpDecorate %PerViewConstantBuffer_t Block +OpDecorate %i_vTextureCoords Location 0 +OpDecorate %_entryPointOutput_vColor Location 0 +%void = OpTypeVoid +%3 = OpTypeFunction %void +%float = OpTypeFloat 32 +%v2float = OpTypeVector %float 2 +%v4float = OpTypeVector %float 4 +%int = OpTypeInt 32 1 +%v2int = OpTypeVector %int 2 +%int_0 = OpConstant %int 0 +%20 = OpTypeImage %float 2D 0 0 0 0 Unknown +%uint = OpTypeInt 32 0 +%uint_128 = OpConstant %uint 128 +%80 = OpConstantNull %v4float +%_arr_20_uint_128 = OpTypeArray %20 %uint_128 +%_ptr_UniformConstant__arr_20_uint_128 = OpTypePointer UniformConstant %_arr_20_uint_128 +%g_tColor = OpVariable %_ptr_UniformConstant__arr_20_uint_128 UniformConstant +%PerViewConstantBuffer_t = OpTypeStruct %uint +%_ptr_PushConstant_PerViewConstantBuffer_t = OpTypePointer PushConstant %PerViewConstantBuffer_t +%_ = OpVariable %_ptr_PushConstant_PerViewConstantBuffer_t PushConstant +%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint +%_ptr_UniformConstant_20 = OpTypePointer UniformConstant %20 +%_ptr_Input_v2int = OpTypePointer Input %v2int +%i_vTextureCoords = OpVariable %_ptr_Input_v2int Input +%_ptr_Output_v4float = OpTypePointer Output %v4float +%_entryPointOutput_vColor = OpVariable %_ptr_Output_v4float Output +)"; + + const std::string defs_after = + R"(OpCapability Shader +OpCapability StorageImageWriteWithoutFormat +OpExtension "SPV_KHR_storage_buffer_storage_class" +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %MainPs "MainPs" %i_vTextureCoords %_entryPointOutput_vColor %gl_FragCoord +OpExecutionMode %MainPs OriginUpperLeft +OpSource HLSL 500 +OpName %MainPs "MainPs" +OpName %g_tColor "g_tColor" +OpName %PerViewConstantBuffer_t "PerViewConstantBuffer_t" +OpMemberName %PerViewConstantBuffer_t 0 "g_nDataIdx" +OpName %_ "" +OpName %i_vTextureCoords "i.vTextureCoords" +OpName %_entryPointOutput_vColor "@entryPointOutput.vColor" +OpDecorate %g_tColor DescriptorSet 3 +OpDecorate %g_tColor Binding 0 +OpMemberDecorate %PerViewConstantBuffer_t 0 Offset 0 +OpDecorate %PerViewConstantBuffer_t Block +OpDecorate %i_vTextureCoords Location 0 +OpDecorate %_entryPointOutput_vColor Location 0 +OpDecorate %_struct_48 Block +OpMemberDecorate %_struct_48 0 Offset 0 +OpMemberDecorate %_struct_48 1 Offset 4 +OpDecorate %50 DescriptorSet 7 +OpDecorate %50 Binding 0 +OpDecorate %gl_FragCoord BuiltIn FragCoord +%void = OpTypeVoid +%9 = OpTypeFunction %void +%float = OpTypeFloat 32 +%v2float = OpTypeVector %float 2 +%v4float = OpTypeVector %float 4 +%int = OpTypeInt 32 1 +%v2int = OpTypeVector %int 2 +%int_0 = OpConstant %int 0 +%16 = OpTypeImage %float 2D 0 0 0 0 Unknown +%uint = OpTypeInt 32 0 +%uint_128 = OpConstant %uint 128 +%19 = OpConstantNull %v4float +%_arr_16_uint_128 = OpTypeArray %16 %uint_128 +%_ptr_UniformConstant__arr_16_uint_128 = OpTypePointer UniformConstant %_arr_16_uint_128 +%g_tColor = OpVariable %_ptr_UniformConstant__arr_16_uint_128 UniformConstant +%PerViewConstantBuffer_t = OpTypeStruct %uint +%_ptr_PushConstant_PerViewConstantBuffer_t = OpTypePointer PushConstant %PerViewConstantBuffer_t +%_ = OpVariable %_ptr_PushConstant_PerViewConstantBuffer_t PushConstant +%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint +%_ptr_UniformConstant_16 = OpTypePointer UniformConstant %16 +%_ptr_Input_v2int = OpTypePointer Input %v2int +%i_vTextureCoords = OpVariable %_ptr_Input_v2int Input +%_ptr_Output_v4float = OpTypePointer Output %v4float +%_entryPointOutput_vColor = OpVariable %_ptr_Output_v4float Output +%uint_0 = OpConstant %uint 0 +%bool = OpTypeBool +%41 = OpTypeFunction %void %uint %uint %uint %uint +%_runtimearr_uint = OpTypeRuntimeArray %uint +%_struct_48 = OpTypeStruct %uint %_runtimearr_uint +%_ptr_StorageBuffer__struct_48 = OpTypePointer StorageBuffer %_struct_48 +%50 = OpVariable %_ptr_StorageBuffer__struct_48 StorageBuffer +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%uint_9 = OpConstant %uint 9 +%uint_4 = OpConstant %uint 4 +%uint_1 = OpConstant %uint 1 +%uint_23 = OpConstant %uint 23 +%uint_2 = OpConstant %uint 2 +%uint_3 = OpConstant %uint 3 +%_ptr_Input_v4float = OpTypePointer Input %v4float +%gl_FragCoord = OpVariable %_ptr_Input_v4float Input +%v4uint = OpTypeVector %uint 4 +%uint_5 = OpConstant %uint 5 +%uint_6 = OpConstant %uint 6 +%uint_7 = OpConstant %uint 7 +%uint_8 = OpConstant %uint 8 +%uint_51 = OpConstant %uint 51 +)"; + + const std::string func_before = + R"(%MainPs = OpFunction %void None %3 +%5 = OpLabel +%53 = OpLoad %v2int %i_vTextureCoords +%63 = OpAccessChain %_ptr_PushConstant_uint %_ %int_0 +%64 = OpLoad %uint %63 +%65 = OpAccessChain %_ptr_UniformConstant_20 %g_tColor %64 +%66 = OpLoad %20 %65 +OpImageWrite %66 %53 %80 +OpStore %_entryPointOutput_vColor %80 +OpReturn +OpFunctionEnd +)"; + + const std::string func_after = + R"(%MainPs = OpFunction %void None %9 +%27 = OpLabel +%28 = OpLoad %v2int %i_vTextureCoords +%29 = OpAccessChain %_ptr_PushConstant_uint %_ %int_0 +%30 = OpLoad %uint %29 +%31 = OpAccessChain %_ptr_UniformConstant_16 %g_tColor %30 +%32 = OpLoad %16 %31 +%35 = OpULessThan %bool %30 %uint_128 +OpSelectionMerge %36 None +OpBranchConditional %35 %37 %38 +%37 = OpLabel +%39 = OpLoad %16 %31 +OpImageWrite %39 %28 %19 +OpBranch %36 +%38 = OpLabel +%95 = OpFunctionCall %void %40 %uint_51 %uint_0 %30 %uint_128 +OpBranch %36 +%36 = OpLabel +OpStore %_entryPointOutput_vColor %19 +OpReturn +OpFunctionEnd +)"; + + const std::string output_func = + R"(%40 = OpFunction %void None %41 +%42 = OpFunctionParameter %uint +%43 = OpFunctionParameter %uint +%44 = OpFunctionParameter %uint +%45 = OpFunctionParameter %uint +%46 = OpLabel +%52 = OpAccessChain %_ptr_StorageBuffer_uint %50 %uint_0 +%55 = OpAtomicIAdd %uint %52 %uint_4 %uint_0 %uint_9 +%56 = OpIAdd %uint %55 %uint_9 +%57 = OpArrayLength %uint %50 1 +%58 = OpULessThanEqual %bool %56 %57 +OpSelectionMerge %59 None +OpBranchConditional %58 %60 %59 +%60 = OpLabel +%61 = OpIAdd %uint %55 %uint_0 +%63 = OpAccessChain %_ptr_StorageBuffer_uint %50 %uint_1 %61 +OpStore %63 %uint_9 +%65 = OpIAdd %uint %55 %uint_1 +%66 = OpAccessChain %_ptr_StorageBuffer_uint %50 %uint_1 %65 +OpStore %66 %uint_23 +%68 = OpIAdd %uint %55 %uint_2 +%69 = OpAccessChain %_ptr_StorageBuffer_uint %50 %uint_1 %68 +OpStore %69 %42 +%71 = OpIAdd %uint %55 %uint_3 +%72 = OpAccessChain %_ptr_StorageBuffer_uint %50 %uint_1 %71 +OpStore %72 %uint_4 +%75 = OpLoad %v4float %gl_FragCoord +%77 = OpBitcast %v4uint %75 +%78 = OpCompositeExtract %uint %77 0 +%79 = OpIAdd %uint %55 %uint_4 +%80 = OpAccessChain %_ptr_StorageBuffer_uint %50 %uint_1 %79 +OpStore %80 %78 +%81 = OpCompositeExtract %uint %77 1 +%83 = OpIAdd %uint %55 %uint_5 +%84 = OpAccessChain %_ptr_StorageBuffer_uint %50 %uint_1 %83 +OpStore %84 %81 +%86 = OpIAdd %uint %55 %uint_6 +%87 = OpAccessChain %_ptr_StorageBuffer_uint %50 %uint_1 %86 +OpStore %87 %43 +%89 = OpIAdd %uint %55 %uint_7 +%90 = OpAccessChain %_ptr_StorageBuffer_uint %50 %uint_1 %89 +OpStore %90 %44 +%92 = OpIAdd %uint %55 %uint_8 +%93 = OpAccessChain %_ptr_StorageBuffer_uint %50 %uint_1 %92 +OpStore %93 %45 +OpBranch %59 +%59 = OpLabel +OpReturn +OpFunctionEnd +)"; + + // SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + SinglePassRunAndCheck( + defs_before + func_before, defs_after + func_after + output_func, true, + true); +} + +TEST_F(InstBindlessTest, InstrumentVertexSimple) { + // This test verifies that the pass will correctly instrument shader + // doing bindless image write. This test was created by editing the SPIR-V + // from the Simple test. + + const std::string defs_before = + R"(OpCapability Shader +OpCapability Sampled1D +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Vertex %main "main" %_ %coords2D +OpSource GLSL 450 +OpName %main "main" +OpName %lod "lod" +OpName %coords1D "coords1D" +OpName %gl_PerVertex "gl_PerVertex" +OpMemberName %gl_PerVertex 0 "gl_Position" +OpMemberName %gl_PerVertex 1 "gl_PointSize" +OpMemberName %gl_PerVertex 2 "gl_ClipDistance" +OpMemberName %gl_PerVertex 3 "gl_CullDistance" +OpName %_ "" +OpName %texSampler1D "texSampler1D" +OpName %foo "foo" +OpMemberName %foo 0 "g_idx" +OpName %__0 "" +OpName %coords2D "coords2D" +OpMemberDecorate %gl_PerVertex 0 BuiltIn Position +OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize +OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance +OpMemberDecorate %gl_PerVertex 3 BuiltIn CullDistance +OpDecorate %gl_PerVertex Block +OpDecorate %texSampler1D DescriptorSet 0 +OpDecorate %texSampler1D Binding 3 +OpMemberDecorate %foo 0 Offset 0 +OpDecorate %foo Block +OpDecorate %__0 DescriptorSet 0 +OpDecorate %__0 Binding 5 +OpDecorate %coords2D Location 0 +%void = OpTypeVoid +%3 = OpTypeFunction %void +%float = OpTypeFloat 32 +%_ptr_Function_float = OpTypePointer Function %float +%float_3 = OpConstant %float 3 +%float_1_78900003 = OpConstant %float 1.78900003 +%v4float = OpTypeVector %float 4 +%uint = OpTypeInt 32 0 +%uint_1 = OpConstant %uint 1 +%_arr_float_uint_1 = OpTypeArray %float %uint_1 +%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1 %_arr_float_uint_1 +%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex +%_ = OpVariable %_ptr_Output_gl_PerVertex Output +%int = OpTypeInt 32 1 +%int_0 = OpConstant %int 0 +%21 = OpTypeImage %float 1D 0 0 0 1 Unknown +%22 = OpTypeSampledImage %21 +%uint_128 = OpConstant %uint 128 +%_arr_22_uint_128 = OpTypeArray %22 %uint_128 +%_ptr_UniformConstant__arr_22_uint_128 = OpTypePointer UniformConstant %_arr_22_uint_128 +%texSampler1D = OpVariable %_ptr_UniformConstant__arr_22_uint_128 UniformConstant +%foo = OpTypeStruct %int +%_ptr_Uniform_foo = OpTypePointer Uniform %foo +%__0 = OpVariable %_ptr_Uniform_foo Uniform +%_ptr_Uniform_int = OpTypePointer Uniform %int +%_ptr_UniformConstant_22 = OpTypePointer UniformConstant %22 +%_ptr_Output_v4float = OpTypePointer Output %v4float +%v2float = OpTypeVector %float 2 +%_ptr_Input_v2float = OpTypePointer Input %v2float +%coords2D = OpVariable %_ptr_Input_v2float Input +)"; + + const std::string defs_after = + R"(OpCapability Shader +OpCapability Sampled1D +OpExtension "SPV_KHR_storage_buffer_storage_class" +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Vertex %main "main" %_ %coords2D %gl_VertexID %gl_InstanceID +OpSource GLSL 450 +OpName %main "main" +OpName %lod "lod" +OpName %coords1D "coords1D" +OpName %gl_PerVertex "gl_PerVertex" +OpMemberName %gl_PerVertex 0 "gl_Position" +OpMemberName %gl_PerVertex 1 "gl_PointSize" +OpMemberName %gl_PerVertex 2 "gl_ClipDistance" +OpMemberName %gl_PerVertex 3 "gl_CullDistance" +OpName %_ "" +OpName %texSampler1D "texSampler1D" +OpName %foo "foo" +OpMemberName %foo 0 "g_idx" +OpName %__0 "" +OpName %coords2D "coords2D" +OpMemberDecorate %gl_PerVertex 0 BuiltIn Position +OpMemberDecorate %gl_PerVertex 1 BuiltIn PointSize +OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance +OpMemberDecorate %gl_PerVertex 3 BuiltIn CullDistance +OpDecorate %gl_PerVertex Block +OpDecorate %texSampler1D DescriptorSet 0 +OpDecorate %texSampler1D Binding 3 +OpMemberDecorate %foo 0 Offset 0 +OpDecorate %foo Block +OpDecorate %__0 DescriptorSet 0 +OpDecorate %__0 Binding 5 +OpDecorate %coords2D Location 0 +OpDecorate %_struct_61 Block +OpMemberDecorate %_struct_61 0 Offset 0 +OpMemberDecorate %_struct_61 1 Offset 4 +OpDecorate %63 DescriptorSet 7 +OpDecorate %63 Binding 0 +OpDecorate %gl_VertexID BuiltIn VertexId +OpDecorate %gl_InstanceID BuiltIn InstanceId +%void = OpTypeVoid +%12 = OpTypeFunction %void +%float = OpTypeFloat 32 +%_ptr_Function_float = OpTypePointer Function %float +%float_3 = OpConstant %float 3 +%float_1_78900003 = OpConstant %float 1.78900003 +%v4float = OpTypeVector %float 4 +%uint = OpTypeInt 32 0 +%uint_1 = OpConstant %uint 1 +%_arr_float_uint_1 = OpTypeArray %float %uint_1 +%gl_PerVertex = OpTypeStruct %v4float %float %_arr_float_uint_1 %_arr_float_uint_1 +%_ptr_Output_gl_PerVertex = OpTypePointer Output %gl_PerVertex +%_ = OpVariable %_ptr_Output_gl_PerVertex Output +%int = OpTypeInt 32 1 +%int_0 = OpConstant %int 0 +%24 = OpTypeImage %float 1D 0 0 0 1 Unknown +%25 = OpTypeSampledImage %24 +%uint_128 = OpConstant %uint 128 +%_arr_25_uint_128 = OpTypeArray %25 %uint_128 +%_ptr_UniformConstant__arr_25_uint_128 = OpTypePointer UniformConstant %_arr_25_uint_128 +%texSampler1D = OpVariable %_ptr_UniformConstant__arr_25_uint_128 UniformConstant +%foo = OpTypeStruct %int +%_ptr_Uniform_foo = OpTypePointer Uniform %foo +%__0 = OpVariable %_ptr_Uniform_foo Uniform +%_ptr_Uniform_int = OpTypePointer Uniform %int +%_ptr_UniformConstant_25 = OpTypePointer UniformConstant %25 +%_ptr_Output_v4float = OpTypePointer Output %v4float +%v2float = OpTypeVector %float 2 +%_ptr_Input_v2float = OpTypePointer Input %v2float +%coords2D = OpVariable %_ptr_Input_v2float Input +%uint_0 = OpConstant %uint 0 +%bool = OpTypeBool +%54 = OpTypeFunction %void %uint %uint %uint %uint +%_runtimearr_uint = OpTypeRuntimeArray %uint +%_struct_61 = OpTypeStruct %uint %_runtimearr_uint +%_ptr_StorageBuffer__struct_61 = OpTypePointer StorageBuffer %_struct_61 +%63 = OpVariable %_ptr_StorageBuffer__struct_61 StorageBuffer +%_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint +%uint_9 = OpConstant %uint 9 +%uint_4 = OpConstant %uint 4 +%uint_23 = OpConstant %uint 23 +%uint_2 = OpConstant %uint 2 +%uint_3 = OpConstant %uint 3 +%_ptr_Input_uint = OpTypePointer Input %uint +%gl_VertexID = OpVariable %_ptr_Input_uint Input +%gl_InstanceID = OpVariable %_ptr_Input_uint Input +%uint_5 = OpConstant %uint 5 +%uint_6 = OpConstant %uint 6 +%uint_7 = OpConstant %uint 7 +%uint_8 = OpConstant %uint 8 +%uint_74 = OpConstant %uint 74 +%106 = OpConstantNull %v4float +)"; + + const std::string func_before = + R"(%main = OpFunction %void None %3 +%5 = OpLabel +%lod = OpVariable %_ptr_Function_float Function +%coords1D = OpVariable %_ptr_Function_float Function +OpStore %lod %float_3 +OpStore %coords1D %float_1_78900003 +%31 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 +%32 = OpLoad %int %31 +%34 = OpAccessChain %_ptr_UniformConstant_22 %texSampler1D %32 +%35 = OpLoad %22 %34 +%36 = OpLoad %float %coords1D +%37 = OpLoad %float %lod +%38 = OpImageSampleExplicitLod %v4float %35 %36 Lod %37 +%40 = OpAccessChain %_ptr_Output_v4float %_ %int_0 +OpStore %40 %38 +OpReturn +OpFunctionEnd +)"; + + const std::string func_after = + R"(%main = OpFunction %void None %12 +%35 = OpLabel +%lod = OpVariable %_ptr_Function_float Function +%coords1D = OpVariable %_ptr_Function_float Function +OpStore %lod %float_3 +OpStore %coords1D %float_1_78900003 +%36 = OpAccessChain %_ptr_Uniform_int %__0 %int_0 +%37 = OpLoad %int %36 +%38 = OpAccessChain %_ptr_UniformConstant_25 %texSampler1D %37 +%39 = OpLoad %25 %38 +%40 = OpLoad %float %coords1D +%41 = OpLoad %float %lod +%46 = OpULessThan %bool %37 %uint_128 +OpSelectionMerge %47 None +OpBranchConditional %46 %48 %49 +%48 = OpLabel +%50 = OpLoad %25 %38 +%51 = OpImageSampleExplicitLod %v4float %50 %40 Lod %41 +OpBranch %47 +%49 = OpLabel +%52 = OpBitcast %uint %37 +%105 = OpFunctionCall %void %53 %uint_74 %uint_0 %52 %uint_128 +OpBranch %47 +%47 = OpLabel +%107 = OpPhi %v4float %51 %48 %106 %49 +%43 = OpAccessChain %_ptr_Output_v4float %_ %int_0 +OpStore %43 %107 +OpReturn +OpFunctionEnd +)"; + + const std::string output_func = + R"(%53 = OpFunction %void None %54 +%55 = OpFunctionParameter %uint +%56 = OpFunctionParameter %uint +%57 = OpFunctionParameter %uint +%58 = OpFunctionParameter %uint +%59 = OpLabel +%65 = OpAccessChain %_ptr_StorageBuffer_uint %63 %uint_0 +%68 = OpAtomicIAdd %uint %65 %uint_4 %uint_0 %uint_9 +%69 = OpIAdd %uint %68 %uint_9 +%70 = OpArrayLength %uint %63 1 +%71 = OpULessThanEqual %bool %69 %70 +OpSelectionMerge %72 None +OpBranchConditional %71 %73 %72 +%73 = OpLabel +%74 = OpIAdd %uint %68 %uint_0 +%75 = OpAccessChain %_ptr_StorageBuffer_uint %63 %uint_1 %74 +OpStore %75 %uint_9 +%77 = OpIAdd %uint %68 %uint_1 +%78 = OpAccessChain %_ptr_StorageBuffer_uint %63 %uint_1 %77 +OpStore %78 %uint_23 +%80 = OpIAdd %uint %68 %uint_2 +%81 = OpAccessChain %_ptr_StorageBuffer_uint %63 %uint_1 %80 +OpStore %81 %55 +%83 = OpIAdd %uint %68 %uint_3 +%84 = OpAccessChain %_ptr_StorageBuffer_uint %63 %uint_1 %83 +OpStore %84 %uint_0 +%87 = OpLoad %uint %gl_VertexID +%88 = OpIAdd %uint %68 %uint_4 +%89 = OpAccessChain %_ptr_StorageBuffer_uint %63 %uint_1 %88 +OpStore %89 %87 +%91 = OpLoad %uint %gl_InstanceID +%93 = OpIAdd %uint %68 %uint_5 +%94 = OpAccessChain %_ptr_StorageBuffer_uint %63 %uint_1 %93 +OpStore %94 %91 +%96 = OpIAdd %uint %68 %uint_6 +%97 = OpAccessChain %_ptr_StorageBuffer_uint %63 %uint_1 %96 +OpStore %97 %56 +%99 = OpIAdd %uint %68 %uint_7 +%100 = OpAccessChain %_ptr_StorageBuffer_uint %63 %uint_1 %99 +OpStore %100 %57 +%102 = OpIAdd %uint %68 %uint_8 +%103 = OpAccessChain %_ptr_StorageBuffer_uint %63 %uint_1 %102 +OpStore %103 %58 +OpBranch %72 +%72 = OpLabel +OpReturn +OpFunctionEnd +)"; + + // SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + SinglePassRunAndCheck( + defs_before + func_before, defs_after + func_after + output_func, true, + true); +} + +// TODO(greg-lunarg): Add tests to verify handling of these cases: +// +// TODO(greg-lunarg): Come up with cases to put here :) + +} // namespace +} // namespace opt +} // namespace spvtools diff --git a/3rdparty/spirv-tools/test/opt/instruction_test.cpp b/3rdparty/spirv-tools/test/opt/instruction_test.cpp index 2ace6b8ac..a6972011f 100644 --- a/3rdparty/spirv-tools/test/opt/instruction_test.cpp +++ b/3rdparty/spirv-tools/test/opt/instruction_test.cpp @@ -622,6 +622,35 @@ TEST_F(GetBaseTest, SampleImage) { EXPECT_TRUE(load->GetBaseAddress() == base); } +TEST_F(GetBaseTest, PtrAccessChain) { + const std::string text = R"( + OpCapability VariablePointers + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %1 "PSMain" %2 + OpExecutionMode %1 OriginUpperLeft + %void = OpTypeVoid + %4 = OpTypeFunction %void + %float = OpTypeFloat 32 + %v4float = OpTypeVector %float 4 + %int = OpTypeInt 32 8388353 + %int_0 = OpConstant %int 0 +%_ptr_Function_v4float = OpTypePointer Function %v4float + %2 = OpVariable %_ptr_Function_v4float Input + %1 = OpFunction %void None %4 + %10 = OpLabel + %11 = OpPtrAccessChain %_ptr_Function_v4float %2 %int_0 + %12 = OpLoad %v4float %11 + OpReturn + OpFunctionEnd +)"; + + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_2, nullptr, text); + Instruction* load = context->get_def_use_mgr()->GetDef(12); + Instruction* base = context->get_def_use_mgr()->GetDef(2); + EXPECT_TRUE(load->GetBaseAddress() == base); +} + TEST_F(GetBaseTest, ImageRead) { const std::string text = R"( OpCapability Shader diff --git a/3rdparty/spirv-tools/test/opt/ir_builder.cpp b/3rdparty/spirv-tools/test/opt/ir_builder.cpp index 7eeb86dd3..f800ca437 100644 --- a/3rdparty/spirv-tools/test/opt/ir_builder.cpp +++ b/3rdparty/spirv-tools/test/opt/ir_builder.cpp @@ -17,6 +17,7 @@ #include #include +#include "effcee/effcee.h" #include "gmock/gmock.h" #include "gtest/gtest.h" #include "source/opt/basic_block.h" @@ -26,16 +27,10 @@ #include "source/opt/type_manager.h" #include "spirv-tools/libspirv.hpp" -#ifdef SPIRV_EFFCEE -#include "effcee/effcee.h" -#endif - namespace spvtools { namespace opt { namespace { -#ifdef SPIRV_EFFCEE - using Analysis = IRContext::Analysis; using IRBuilderTest = ::testing::Test; @@ -182,7 +177,7 @@ TEST_F(IRBuilderTest, TestCondBranchAddition) { %5 = OpTypeVoid %6 = OpTypeFunction %5 %7 = OpTypeBool - %8 = OpTypePointer Function %7 + %8 = OpTypePointer Private %7 %9 = OpConstantTrue %7 %10 = OpTypeFloat 32 %11 = OpTypeVector %10 4 @@ -203,6 +198,7 @@ TEST_F(IRBuilderTest, TestCondBranchAddition) { BasicBlock& bb_merge = *fn.begin(); + // TODO(1841): Handle id overflow. fn.begin().InsertBefore(std::unique_ptr( new BasicBlock(std::unique_ptr(new Instruction( context.get(), SpvOpLabel, 0, context->TakeNextId(), {}))))); @@ -212,6 +208,7 @@ TEST_F(IRBuilderTest, TestCondBranchAddition) { builder.AddBranch(bb_merge.id()); } + // TODO(1841): Handle id overflow. fn.begin().InsertBefore(std::unique_ptr( new BasicBlock(std::unique_ptr(new Instruction( context.get(), SpvOpLabel, 0, context->TakeNextId(), {}))))); @@ -322,20 +319,20 @@ OpFunctionEnd InstructionBuilder builder(context.get(), &*context->module()->begin()->begin()->begin()); - EXPECT_NE(nullptr, builder.Add32BitUnsignedIntegerConstant(13)); - EXPECT_NE(nullptr, builder.Add32BitSignedIntegerConstant(-1)); + EXPECT_NE(nullptr, builder.GetUintConstant(13)); + EXPECT_NE(nullptr, builder.GetSintConstant(-1)); // Try adding the same constants again to make sure they aren't added. - EXPECT_NE(nullptr, builder.Add32BitUnsignedIntegerConstant(13)); - EXPECT_NE(nullptr, builder.Add32BitSignedIntegerConstant(-1)); + EXPECT_NE(nullptr, builder.GetUintConstant(13)); + EXPECT_NE(nullptr, builder.GetSintConstant(-1)); // Try adding different constants to make sure the type is reused. - EXPECT_NE(nullptr, builder.Add32BitUnsignedIntegerConstant(1)); - EXPECT_NE(nullptr, builder.Add32BitSignedIntegerConstant(34)); + EXPECT_NE(nullptr, builder.GetUintConstant(1)); + EXPECT_NE(nullptr, builder.GetSintConstant(34)); // Try adding 0 as both signed and unsigned. - EXPECT_NE(nullptr, builder.Add32BitUnsignedIntegerConstant(0)); - EXPECT_NE(nullptr, builder.Add32BitSignedIntegerConstant(0)); + EXPECT_NE(nullptr, builder.GetUintConstant(0)); + EXPECT_NE(nullptr, builder.GetSintConstant(0)); Match(text, context.get()); } @@ -367,25 +364,25 @@ OpFunctionEnd InstructionBuilder builder(context.get(), &*context->module()->begin()->begin()->begin()); - Instruction* const_1 = builder.Add32BitUnsignedIntegerConstant(13); - Instruction* const_2 = builder.Add32BitSignedIntegerConstant(-1); + Instruction* const_1 = builder.GetUintConstant(13); + Instruction* const_2 = builder.GetSintConstant(-1); EXPECT_NE(nullptr, const_1); EXPECT_NE(nullptr, const_2); // Try adding the same constants again to make sure they aren't added. - EXPECT_EQ(const_1, builder.Add32BitUnsignedIntegerConstant(13)); - EXPECT_EQ(const_2, builder.Add32BitSignedIntegerConstant(-1)); + EXPECT_EQ(const_1, builder.GetUintConstant(13)); + EXPECT_EQ(const_2, builder.GetSintConstant(-1)); - Instruction* const_3 = builder.Add32BitUnsignedIntegerConstant(1); - Instruction* const_4 = builder.Add32BitSignedIntegerConstant(34); + Instruction* const_3 = builder.GetUintConstant(1); + Instruction* const_4 = builder.GetSintConstant(34); // Try adding different constants to make sure the type is reused. EXPECT_NE(nullptr, const_3); EXPECT_NE(nullptr, const_4); - Instruction* const_5 = builder.Add32BitUnsignedIntegerConstant(0); - Instruction* const_6 = builder.Add32BitSignedIntegerConstant(0); + Instruction* const_5 = builder.GetUintConstant(0); + Instruction* const_6 = builder.GetSintConstant(0); // Try adding 0 as both signed and unsigned. EXPECT_NE(nullptr, const_5); @@ -409,7 +406,33 @@ OpFunctionEnd Match(text, context.get()); } -#endif // SPIRV_EFFCEE +TEST_F(IRBuilderTest, AccelerationStructureNV) { + const std::string text = R"( +; CHECK: OpTypeAccelerationStructureNV +OpCapability Shader +OpCapability RayTracingNV +OpExtension "SPV_NV_ray_tracing" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %8 "main" +OpExecutionMode %8 OriginUpperLeft +%1 = OpTypeVoid +%2 = OpTypeBool +%3 = OpTypeAccelerationStructureNV +%7 = OpTypeFunction %1 +%8 = OpFunction %1 None %7 +%9 = OpLabel +OpReturn +OpFunctionEnd +)"; + + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_2, nullptr, text); + EXPECT_NE(nullptr, context); + + InstructionBuilder builder(context.get(), + &*context->module()->begin()->begin()->begin()); + Match(text, context.get()); +} } // namespace } // namespace opt diff --git a/3rdparty/spirv-tools/test/opt/ir_context_test.cpp b/3rdparty/spirv-tools/test/opt/ir_context_test.cpp index c64e5b04f..4e2f5b2c4 100644 --- a/3rdparty/spirv-tools/test/opt/ir_context_test.cpp +++ b/3rdparty/spirv-tools/test/opt/ir_context_test.cpp @@ -30,6 +30,7 @@ namespace { using Analysis = IRContext::Analysis; using ::testing::Each; +using ::testing::UnorderedElementsAre; class DummyPassPreservesNothing : public Pass { public: @@ -217,6 +218,64 @@ TEST_F(IRContextTest, KillMemberName) { } } +TEST_F(IRContextTest, KillGroupDecoration) { + const std::string text = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %2 "main" + OpExecutionMode %2 OriginUpperLeft + OpSource GLSL 430 + OpDecorate %3 Restrict + %3 = OpDecorationGroup + OpGroupDecorate %3 %4 %5 + %6 = OpTypeFloat 32 + %7 = OpTypePointer Function %6 + %8 = OpTypeStruct %6 + %9 = OpTypeVoid + %10 = OpTypeFunction %9 + %2 = OpFunction %9 None %10 + %11 = OpLabel + %4 = OpVariable %7 Function + %5 = OpVariable %7 Function + OpReturn + OpFunctionEnd +)"; + + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_2, nullptr, text); + + // Build the decoration manager. + context->get_decoration_mgr(); + + // Delete the second variable. + context->KillDef(5); + + // The three decorations instructions should still be there. The first two + // should be the same, but the third should have %5 removed. + + // Check the OpDecorate instruction + auto inst = context->annotation_begin(); + EXPECT_EQ(inst->opcode(), SpvOpDecorate); + EXPECT_EQ(inst->GetSingleWordInOperand(0), 3); + + // Check the OpDecorationGroup Instruction + ++inst; + EXPECT_EQ(inst->opcode(), SpvOpDecorationGroup); + EXPECT_EQ(inst->result_id(), 3); + + // Check that %5 is no longer part of the group. + ++inst; + EXPECT_EQ(inst->opcode(), SpvOpGroupDecorate); + EXPECT_EQ(inst->NumInOperands(), 2); + EXPECT_EQ(inst->GetSingleWordInOperand(0), 3); + EXPECT_EQ(inst->GetSingleWordInOperand(1), 4); + + // Check that we are at the end. + ++inst; + EXPECT_EQ(inst, context->annotation_end()); +} + TEST_F(IRContextTest, TakeNextUniqueIdIncrementing) { const uint32_t NUM_TESTS = 1000; IRContext localContext(SPV_ENV_UNIVERSAL_1_2, nullptr); @@ -224,6 +283,387 @@ TEST_F(IRContextTest, TakeNextUniqueIdIncrementing) { EXPECT_EQ(i, localContext.TakeNextUniqueId()); } +TEST_F(IRContextTest, KillGroupDecorationWitNoDecorations) { + const std::string text = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %2 "main" + OpExecutionMode %2 OriginUpperLeft + OpSource GLSL 430 + %3 = OpDecorationGroup + OpGroupDecorate %3 %4 %5 + %6 = OpTypeFloat 32 + %7 = OpTypePointer Function %6 + %8 = OpTypeStruct %6 + %9 = OpTypeVoid + %10 = OpTypeFunction %9 + %2 = OpFunction %9 None %10 + %11 = OpLabel + %4 = OpVariable %7 Function + %5 = OpVariable %7 Function + OpReturn + OpFunctionEnd +)"; + + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_2, nullptr, text); + + // Build the decoration manager. + context->get_decoration_mgr(); + + // Delete the second variable. + context->KillDef(5); + + // The two decoration instructions should still be there. The first one + // should be the same, but the second should have %5 removed. + + // Check the OpDecorationGroup Instruction + auto inst = context->annotation_begin(); + EXPECT_EQ(inst->opcode(), SpvOpDecorationGroup); + EXPECT_EQ(inst->result_id(), 3); + + // Check that %5 is no longer part of the group. + ++inst; + EXPECT_EQ(inst->opcode(), SpvOpGroupDecorate); + EXPECT_EQ(inst->NumInOperands(), 2); + EXPECT_EQ(inst->GetSingleWordInOperand(0), 3); + EXPECT_EQ(inst->GetSingleWordInOperand(1), 4); + + // Check that we are at the end. + ++inst; + EXPECT_EQ(inst, context->annotation_end()); +} + +TEST_F(IRContextTest, KillDecorationGroup) { + const std::string text = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %2 "main" + OpExecutionMode %2 OriginUpperLeft + OpSource GLSL 430 + %3 = OpDecorationGroup + OpGroupDecorate %3 %4 %5 + %6 = OpTypeFloat 32 + %7 = OpTypePointer Function %6 + %8 = OpTypeStruct %6 + %9 = OpTypeVoid + %10 = OpTypeFunction %9 + %2 = OpFunction %9 None %10 + %11 = OpLabel + %4 = OpVariable %7 Function + %5 = OpVariable %7 Function + OpReturn + OpFunctionEnd +)"; + + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_2, nullptr, text); + + // Build the decoration manager. + context->get_decoration_mgr(); + + // Delete the second variable. + context->KillDef(3); + + // Check the OpDecorationGroup Instruction is still there. + EXPECT_TRUE(context->annotations().empty()); +} + +TEST_F(IRContextTest, BasicVisitFromEntryPoint) { + // Make sure we visit the entry point, and the function it calls. + // Do not visit Dead or Exported. + const std::string text = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %10 "main" + OpName %10 "main" + OpName %Dead "Dead" + OpName %11 "Constant" + OpName %ExportedFunc "ExportedFunc" + OpDecorate %ExportedFunc LinkageAttributes "ExportedFunc" Export + %void = OpTypeVoid + %6 = OpTypeFunction %void + %10 = OpFunction %void None %6 + %14 = OpLabel + %15 = OpFunctionCall %void %11 + %16 = OpFunctionCall %void %11 + OpReturn + OpFunctionEnd + %11 = OpFunction %void None %6 + %18 = OpLabel + OpReturn + OpFunctionEnd + %Dead = OpFunction %void None %6 + %19 = OpLabel + OpReturn + OpFunctionEnd +%ExportedFunc = OpFunction %void None %7 + %20 = OpLabel + %21 = OpFunctionCall %void %11 + OpReturn + OpFunctionEnd +)"; + // clang-format on + + std::unique_ptr localContext = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + EXPECT_NE(nullptr, localContext) << "Assembling failed for shader:\n" + << text << std::endl; + std::vector processed; + Pass::ProcessFunction mark_visited = [&processed](Function* fp) { + processed.push_back(fp->result_id()); + return false; + }; + localContext->ProcessEntryPointCallTree(mark_visited); + EXPECT_THAT(processed, UnorderedElementsAre(10, 11)); +} + +TEST_F(IRContextTest, BasicVisitReachable) { + // Make sure we visit the entry point, exported function, and the function + // they call. Do not visit Dead. + const std::string text = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %10 "main" + OpName %10 "main" + OpName %Dead "Dead" + OpName %11 "Constant" + OpName %12 "ExportedFunc" + OpName %13 "Constant2" + OpDecorate %12 LinkageAttributes "ExportedFunc" Export + %void = OpTypeVoid + %6 = OpTypeFunction %void + %10 = OpFunction %void None %6 + %14 = OpLabel + %15 = OpFunctionCall %void %11 + %16 = OpFunctionCall %void %11 + OpReturn + OpFunctionEnd + %11 = OpFunction %void None %6 + %18 = OpLabel + OpReturn + OpFunctionEnd + %Dead = OpFunction %void None %6 + %19 = OpLabel + OpReturn + OpFunctionEnd + %12 = OpFunction %void None %6 + %20 = OpLabel + %21 = OpFunctionCall %void %13 + OpReturn + OpFunctionEnd + %13 = OpFunction %void None %6 + %22 = OpLabel + OpReturn + OpFunctionEnd +)"; + // clang-format on + + std::unique_ptr localContext = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + EXPECT_NE(nullptr, localContext) << "Assembling failed for shader:\n" + << text << std::endl; + + std::vector processed; + Pass::ProcessFunction mark_visited = [&processed](Function* fp) { + processed.push_back(fp->result_id()); + return false; + }; + localContext->ProcessReachableCallTree(mark_visited); + EXPECT_THAT(processed, UnorderedElementsAre(10, 11, 12, 13)); +} + +TEST_F(IRContextTest, BasicVisitOnlyOnce) { + // Make sure we visit %12 only once, even if it is called from two different + // functions. + const std::string text = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %10 "main" + OpName %10 "main" + OpName %Dead "Dead" + OpName %11 "Constant" + OpName %12 "ExportedFunc" + OpDecorate %12 LinkageAttributes "ExportedFunc" Export + %void = OpTypeVoid + %6 = OpTypeFunction %void + %10 = OpFunction %void None %6 + %14 = OpLabel + %15 = OpFunctionCall %void %11 + %16 = OpFunctionCall %void %12 + OpReturn + OpFunctionEnd + %11 = OpFunction %void None %6 + %18 = OpLabel + %19 = OpFunctionCall %void %12 + OpReturn + OpFunctionEnd + %Dead = OpFunction %void None %6 + %20 = OpLabel + OpReturn + OpFunctionEnd + %12 = OpFunction %void None %6 + %21 = OpLabel + OpReturn + OpFunctionEnd +)"; + // clang-format on + + std::unique_ptr localContext = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + EXPECT_NE(nullptr, localContext) << "Assembling failed for shader:\n" + << text << std::endl; + + std::vector processed; + Pass::ProcessFunction mark_visited = [&processed](Function* fp) { + processed.push_back(fp->result_id()); + return false; + }; + localContext->ProcessReachableCallTree(mark_visited); + EXPECT_THAT(processed, UnorderedElementsAre(10, 11, 12)); +} + +TEST_F(IRContextTest, BasicDontVisitExportedVariable) { + // Make sure we only visit functions and not exported variables. + const std::string text = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %10 "main" + OpExecutionMode %10 OriginUpperLeft + OpSource GLSL 150 + OpName %10 "main" + OpName %12 "export_var" + OpDecorate %12 LinkageAttributes "export_var" Export + %void = OpTypeVoid + %6 = OpTypeFunction %void + %float = OpTypeFloat 32 + %float_1 = OpConstant %float 1 + %12 = OpVariable %float Output + %10 = OpFunction %void None %6 + %14 = OpLabel + OpStore %12 %float_1 + OpReturn + OpFunctionEnd +)"; + // clang-format on + + std::unique_ptr localContext = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + EXPECT_NE(nullptr, localContext) << "Assembling failed for shader:\n" + << text << std::endl; + + std::vector processed; + Pass::ProcessFunction mark_visited = [&processed](Function* fp) { + processed.push_back(fp->result_id()); + return false; + }; + localContext->ProcessReachableCallTree(mark_visited); + EXPECT_THAT(processed, UnorderedElementsAre(10)); +} + +TEST_F(IRContextTest, IdBoundTestAtLimit) { + const std::string text = R"( +OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +%1 = OpTypeVoid +%2 = OpTypeFunction %1 +%3 = OpFunction %1 None %2 +%4 = OpLabel +OpReturn +OpFunctionEnd)"; + + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + uint32_t current_bound = context->module()->id_bound(); + context->set_max_id_bound(current_bound); + uint32_t next_id_bound = context->TakeNextId(); + EXPECT_EQ(next_id_bound, 0); + EXPECT_EQ(current_bound, context->module()->id_bound()); + next_id_bound = context->TakeNextId(); + EXPECT_EQ(next_id_bound, 0); +} + +TEST_F(IRContextTest, IdBoundTestBelowLimit) { + const std::string text = R"( +OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +%1 = OpTypeVoid +%2 = OpTypeFunction %1 +%3 = OpFunction %1 None %2 +%4 = OpLabel +OpReturn +OpFunctionEnd)"; + + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + uint32_t current_bound = context->module()->id_bound(); + context->set_max_id_bound(current_bound + 100); + uint32_t next_id_bound = context->TakeNextId(); + EXPECT_EQ(next_id_bound, current_bound); + EXPECT_EQ(current_bound + 1, context->module()->id_bound()); + next_id_bound = context->TakeNextId(); + EXPECT_EQ(next_id_bound, current_bound + 1); +} + +TEST_F(IRContextTest, IdBoundTestNearLimit) { + const std::string text = R"( +OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +%1 = OpTypeVoid +%2 = OpTypeFunction %1 +%3 = OpFunction %1 None %2 +%4 = OpLabel +OpReturn +OpFunctionEnd)"; + + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + uint32_t current_bound = context->module()->id_bound(); + context->set_max_id_bound(current_bound + 1); + uint32_t next_id_bound = context->TakeNextId(); + EXPECT_EQ(next_id_bound, current_bound); + EXPECT_EQ(current_bound + 1, context->module()->id_bound()); + next_id_bound = context->TakeNextId(); + EXPECT_EQ(next_id_bound, 0); +} + +TEST_F(IRContextTest, IdBoundTestUIntMax) { + const std::string text = R"( +OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +%1 = OpTypeVoid +%2 = OpTypeFunction %1 +%3 = OpFunction %1 None %2 +%4294967294 = OpLabel ; ID is UINT_MAX-1 +OpReturn +OpFunctionEnd)"; + + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + uint32_t current_bound = context->module()->id_bound(); + + // Expecting |BuildModule| to preserve the numeric ids. + EXPECT_EQ(current_bound, std::numeric_limits::max()); + + context->set_max_id_bound(current_bound); + uint32_t next_id_bound = context->TakeNextId(); + EXPECT_EQ(next_id_bound, 0); + EXPECT_EQ(current_bound, context->module()->id_bound()); +} } // namespace } // namespace opt } // namespace spvtools diff --git a/3rdparty/spirv-tools/test/opt/local_access_chain_convert_test.cpp b/3rdparty/spirv-tools/test/opt/local_access_chain_convert_test.cpp index cb3572161..154824b1e 100644 --- a/3rdparty/spirv-tools/test/opt/local_access_chain_convert_test.cpp +++ b/3rdparty/spirv-tools/test/opt/local_access_chain_convert_test.cpp @@ -24,8 +24,6 @@ namespace { using LocalAccessChainConvertTest = PassTest<::testing::Test>; -#ifdef SPIRV_EFFCEE - TEST_F(LocalAccessChainConvertTest, StructOfVecsOfFloatConverted) { // #version 140 // @@ -625,7 +623,6 @@ OpFunctionEnd SinglePassRunAndMatch(predefs_before + before, true); } -#endif // SPIRV_EFFCEE TEST_F(LocalAccessChainConvertTest, DynamicallyIndexedVarNotConverted) { // #version 140 diff --git a/3rdparty/spirv-tools/test/opt/local_redundancy_elimination_test.cpp b/3rdparty/spirv-tools/test/opt/local_redundancy_elimination_test.cpp index bdaafb85f..bc4635e29 100644 --- a/3rdparty/spirv-tools/test/opt/local_redundancy_elimination_test.cpp +++ b/3rdparty/spirv-tools/test/opt/local_redundancy_elimination_test.cpp @@ -29,7 +29,6 @@ using ::testing::HasSubstr; using ::testing::MatchesRegex; using LocalRedundancyEliminationTest = PassTest<::testing::Test>; -#ifdef SPIRV_EFFCEE // Remove an instruction when it was already computed. TEST_F(LocalRedundancyEliminationTest, RemoveRedundantAdd) { const std::string text = R"( @@ -154,7 +153,6 @@ TEST_F(LocalRedundancyEliminationTest, KeepInstructionsInDifferentBlocks) { )"; SinglePassRunAndMatch(text, false); } -#endif } // namespace } // namespace opt diff --git a/3rdparty/spirv-tools/test/opt/local_single_block_elim.cpp b/3rdparty/spirv-tools/test/opt/local_single_block_elim.cpp index da7540e6b..e2efc5e3c 100644 --- a/3rdparty/spirv-tools/test/opt/local_single_block_elim.cpp +++ b/3rdparty/spirv-tools/test/opt/local_single_block_elim.cpp @@ -865,7 +865,9 @@ OpReturn OpFunctionEnd )"; + // Relax logical pointers to allow pointer allocations. SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ValidatorOptions()->relax_logical_pointer = true; SinglePassRunAndCheck(before, after, true, true); } diff --git a/3rdparty/spirv-tools/test/opt/local_single_store_elim_test.cpp b/3rdparty/spirv-tools/test/opt/local_single_store_elim_test.cpp index 23e82ba86..5fd0217e3 100644 --- a/3rdparty/spirv-tools/test/opt/local_single_store_elim_test.cpp +++ b/3rdparty/spirv-tools/test/opt/local_single_store_elim_test.cpp @@ -767,7 +767,9 @@ OpReturn OpFunctionEnd )"; + // Relax logical pointers to allow pointer allocations. SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ValidatorOptions()->relax_logical_pointer = true; SinglePassRunAndCheck(before, after, true, true); } diff --git a/3rdparty/spirv-tools/test/opt/local_ssa_elim_test.cpp b/3rdparty/spirv-tools/test/opt/local_ssa_elim_test.cpp index 33419395b..b2961a23c 100644 --- a/3rdparty/spirv-tools/test/opt/local_ssa_elim_test.cpp +++ b/3rdparty/spirv-tools/test/opt/local_ssa_elim_test.cpp @@ -1528,7 +1528,9 @@ OpReturn OpFunctionEnd )"; + // Relax logical pointers to allow pointer allocations. SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + ValidatorOptions()->relax_logical_pointer = true; SinglePassRunAndCheck(before, after, true, true); } @@ -1624,8 +1626,6 @@ OpFunctionEnd EXPECT_TRUE(status == Pass::Status::SuccessWithChange); } -// TODO(dneto): Add Effcee as required dependency, and make this unconditional. -#ifdef SPIRV_EFFCEE TEST_F(LocalSSAElimTest, CompositeExtractProblem) { const std::string spv_asm = R"( OpCapability Tessellation @@ -1664,6 +1664,7 @@ TEST_F(LocalSSAElimTest, CompositeExtractProblem) { %_ptr_Function__struct_11 = OpTypePointer Function %_struct_11 %2 = OpFunction %void None %4 %33 = OpLabel + %66 = OpVariable %_ptr_Function__arr__struct_11_uint_3 Function %34 = OpLoad %_arr_v4float_uint_3 %16 %35 = OpLoad %_arr_v4float_uint_3 %17 %36 = OpLoad %_arr_v4float_uint_3 %18 @@ -1696,7 +1697,6 @@ TEST_F(LocalSSAElimTest, CompositeExtractProblem) { %63 = OpCompositeExtract %v2float %40 2 %64 = OpCompositeConstruct %_struct_11 %57 %58 %59 %60 %61 %62 %63 %65 = OpCompositeConstruct %_arr__struct_11_uint_3 %48 %56 %64 - %66 = OpVariable %_ptr_Function__arr__struct_11_uint_3 Function %67 = OpLoad %uint %20 ; CHECK OpStore {{%\d+}} [[store_source:%\d+]] @@ -1758,7 +1758,67 @@ TEST_F(LocalSSAElimTest, DecoratedVariable) { SinglePassRunAndMatch(spv_asm, true); } -#endif + +// Test that the RelaxedPrecision decoration on the variable to added to the +// result of the OpPhi instruction. +TEST_F(LocalSSAElimTest, MultipleEdges) { + const std::string spv_asm = R"( + ; CHECK: OpSelectionMerge + ; CHECK: [[header_bb:%\w+]] = OpLabel + ; CHECK-NOT: OpLabel + ; CHECK: OpSwitch {{%\w+}} {{%\w+}} 76 [[bb1:%\w+]] 17 [[bb2:%\w+]] + ; CHECK-SAME: 4 [[bb2]] + ; CHECK: [[bb2]] = OpLabel + ; CHECK-NEXT: OpPhi [[type:%\w+]] [[val:%\w+]] [[header_bb]] %int_0 [[bb1]] + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + %void = OpTypeVoid + %3 = OpTypeFunction %void + %int = OpTypeInt 32 1 + %_ptr_Function_int = OpTypePointer Function %int + %int_0 = OpConstant %int 0 + %bool = OpTypeBool + %true = OpConstantTrue %bool + %false = OpConstantFalse %bool + %int_1 = OpConstant %int 1 + %4 = OpFunction %void None %3 + %5 = OpLabel + %8 = OpVariable %_ptr_Function_int Function + OpBranch %10 + %10 = OpLabel + OpLoopMerge %12 %13 None + OpBranch %14 + %14 = OpLabel + OpBranchConditional %true %11 %12 + %11 = OpLabel + OpSelectionMerge %19 None + OpBranchConditional %false %18 %19 + %18 = OpLabel + OpSelectionMerge %22 None + OpSwitch %int_0 %22 76 %20 17 %21 4 %21 + %20 = OpLabel + %23 = OpLoad %int %8 + OpStore %8 %int_0 + OpBranch %21 + %21 = OpLabel + OpBranch %22 + %22 = OpLabel + OpBranch %19 + %19 = OpLabel + OpBranch %13 + %13 = OpLabel + OpBranch %10 + %12 = OpLabel + OpReturn + OpFunctionEnd + )"; + + SinglePassRunAndMatch(spv_asm, true); +} // TODO(greg-lunarg): Add tests to verify handling of these cases: // diff --git a/3rdparty/spirv-tools/test/opt/loop_optimizations/CMakeLists.txt b/3rdparty/spirv-tools/test/opt/loop_optimizations/CMakeLists.txt index 8c7971b7f..e3620787d 100644 --- a/3rdparty/spirv-tools/test/opt/loop_optimizations/CMakeLists.txt +++ b/3rdparty/spirv-tools/test/opt/loop_optimizations/CMakeLists.txt @@ -37,4 +37,5 @@ add_spvtools_unittest(TARGET opt_loops unroll_simple.cpp unswitch.cpp LIBS SPIRV-Tools-opt + PCH_FILE pch_test_opt_loop ) diff --git a/3rdparty/spirv-tools/test/opt/loop_optimizations/fusion_legal.cpp b/3rdparty/spirv-tools/test/opt/loop_optimizations/fusion_legal.cpp index 509516f80..41d796fd9 100644 --- a/3rdparty/spirv-tools/test/opt/loop_optimizations/fusion_legal.cpp +++ b/3rdparty/spirv-tools/test/opt/loop_optimizations/fusion_legal.cpp @@ -18,15 +18,12 @@ #include #include +#include "effcee/effcee.h" #include "gmock/gmock.h" #include "source/opt/loop_descriptor.h" #include "source/opt/loop_fusion.h" #include "test/opt/pass_fixture.h" -#ifdef SPIRV_EFFCEE -#include "effcee/effcee.h" -#endif - namespace spvtools { namespace opt { namespace { @@ -52,7 +49,6 @@ void Match(const std::string& checks, IRContext* context) { std::vector bin; context->module()->ToBinary(&bin, true); EXPECT_TRUE(Validate(bin)); -#ifdef SPIRV_EFFCEE std::string assembly; SpirvTools tools(SPV_ENV_UNIVERSAL_1_2); EXPECT_TRUE( @@ -63,9 +59,6 @@ void Match(const std::string& checks, IRContext* context) { EXPECT_EQ(effcee::Result::Status::Ok, match_result.status()) << match_result.message() << "\nChecking result:\n" << assembly; -#else // ! SPIRV_EFFCEE - (void)checks; -#endif } /* @@ -3184,7 +3177,7 @@ TEST_F(FusionLegalTest, OuterloopWithBreakContinueInInner) { %21 = OpLabel %29 = OpSMod %6 %96 %28 %30 = OpIEqual %17 %29 %9 - OpSelectionMerge %32 None + OpSelectionMerge %23 None OpBranchConditional %30 %31 %48 %31 = OpLabel %44 = OpAccessChain %7 %41 %91 %96 @@ -3231,7 +3224,7 @@ TEST_F(FusionLegalTest, OuterloopWithBreakContinueInInner) { %72 = OpSMod %6 %93 %28 %73 = OpIEqual %17 %72 %9 OpSelectionMerge %75 None - OpBranchConditional %73 %74 %85 + OpBranchConditional %73 %74 %66 %74 = OpLabel %81 = OpAccessChain %7 %38 %92 %93 %82 = OpLoad %6 %81 @@ -3239,8 +3232,6 @@ TEST_F(FusionLegalTest, OuterloopWithBreakContinueInInner) { %84 = OpAccessChain %7 %76 %92 %93 OpStore %84 %83 OpBranch %75 - %85 = OpLabel - OpBranch %66 %75 = OpLabel OpBranch %67 %67 = OpLabel diff --git a/3rdparty/spirv-tools/test/opt/loop_optimizations/fusion_pass.cpp b/3rdparty/spirv-tools/test/opt/loop_optimizations/fusion_pass.cpp index 857ada939..949392375 100644 --- a/3rdparty/spirv-tools/test/opt/loop_optimizations/fusion_pass.cpp +++ b/3rdparty/spirv-tools/test/opt/loop_optimizations/fusion_pass.cpp @@ -14,21 +14,16 @@ #include +#include "effcee/effcee.h" #include "gmock/gmock.h" #include "test/opt/pass_fixture.h" -#ifdef SPIRV_EFFCEE -#include "effcee/effcee.h" -#endif - namespace spvtools { namespace opt { namespace { using FusionPassTest = PassTest<::testing::Test>; -#ifdef SPIRV_EFFCEE - /* Generated from the following GLSL + --eliminate-local-multi-store @@ -717,8 +712,6 @@ TEST_F(FusionPassTest, TooManyRegisters) { SinglePassRunAndMatch(text, true, 5); } -#endif - } // namespace } // namespace opt } // namespace spvtools diff --git a/3rdparty/spirv-tools/test/opt/loop_optimizations/hoist_single_nested_loops.cpp b/3rdparty/spirv-tools/test/opt/loop_optimizations/hoist_single_nested_loops.cpp index 7fa1fb0a0..056f3f025 100644 --- a/3rdparty/spirv-tools/test/opt/loop_optimizations/hoist_single_nested_loops.cpp +++ b/3rdparty/spirv-tools/test/opt/loop_optimizations/hoist_single_nested_loops.cpp @@ -158,6 +158,52 @@ OpFunctionEnd SinglePassRunAndCheck(before_hoist, after_hoist, true); } +TEST_F(PassClassTest, PreHeaderIsAlsoHeader) { + // Move OpSLessThan out of the inner loop. The preheader for the inner loop + // is the header of the outer loop. The loop merge should not be separated + // from the branch in that block. + const std::string text = R"( + ; CHECK: OpFunction + ; CHECK-NEXT: OpLabel + ; CHECK-NEXT: OpBranch [[header:%\w+]] + ; CHECK: [[header]] = OpLabel + ; CHECK-NEXT: OpSLessThan %bool %int_1 %int_1 + ; CHECK-NEXT: OpLoopMerge + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %2 "main" + OpExecutionMode %2 OriginUpperLeft + OpSource ESSL 310 + %void = OpTypeVoid + %4 = OpTypeFunction %void + %int = OpTypeInt 32 1 + %int_1 = OpConstant %int 1 + %bool = OpTypeBool + %2 = OpFunction %void None %4 + %18 = OpLabel + OpBranch %21 + %21 = OpLabel + OpLoopMerge %22 %23 None + OpBranch %24 + %24 = OpLabel + %25 = OpSLessThan %bool %int_1 %int_1 + OpLoopMerge %26 %27 None + OpBranchConditional %25 %27 %26 + %27 = OpLabel + OpBranch %24 + %26 = OpLabel + OpBranch %22 + %23 = OpLabel + OpBranch %21 + %22 = OpLabel + OpReturn + OpFunctionEnd + )"; + + SinglePassRunAndMatch(text, true); +} + } // namespace } // namespace opt } // namespace spvtools diff --git a/3rdparty/spirv-tools/test/opt/loop_optimizations/hoist_without_preheader.cpp b/3rdparty/spirv-tools/test/opt/loop_optimizations/hoist_without_preheader.cpp index 9e8d02fac..2e34b0142 100644 --- a/3rdparty/spirv-tools/test/opt/loop_optimizations/hoist_without_preheader.cpp +++ b/3rdparty/spirv-tools/test/opt/loop_optimizations/hoist_without_preheader.cpp @@ -45,7 +45,6 @@ void main(){ } } */ -#ifdef SPIRV_EFFCEE TEST_F(PassClassTest, HoistWithoutPreheader) { const std::string text = R"(OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" @@ -117,8 +116,82 @@ OpFunctionEnd SinglePassRunAndMatch(text, false); } -#endif +TEST_F(PassClassTest, HoistWithoutPreheaderAtIdBound) { + const std::string text = R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft +OpSource GLSL 440 +OpName %main "main" +%void = OpTypeVoid +%4 = OpTypeFunction %void +%int = OpTypeInt 32 1 +%_ptr_Function_int = OpTypePointer Function %int +%int_1 = OpConstant %int 1 +%int_2 = OpConstant %int 2 +%int_0 = OpConstant %int 0 +%int_10 = OpConstant %int 10 +%bool = OpTypeBool +%int_5 = OpConstant %int 5 +%main = OpFunction %void None %4 +%13 = OpLabel +OpBranch %14 +%14 = OpLabel +%15 = OpPhi %int %int_0 %13 %16 %17 +OpLoopMerge %25 %17 None +OpBranch %19 +%19 = OpLabel +%20 = OpSLessThan %bool %15 %int_10 +OpBranchConditional %20 %21 %25 +%21 = OpLabel +%22 = OpIEqual %bool %15 %int_5 +OpSelectionMerge %23 None +OpBranchConditional %22 %24 %23 +%24 = OpLabel +OpBranch %25 +%23 = OpLabel +OpBranch %17 +%17 = OpLabel +%16 = OpIAdd %int %15 %int_1 +OpBranch %14 +%25 = OpLabel +%26 = OpPhi %int %int_0 %24 %int_0 %19 %27 %28 +%29 = OpPhi %int %int_0 %24 %int_0 %19 %30 %28 +OpLoopMerge %31 %28 None +OpBranch %32 +%32 = OpLabel +%33 = OpSLessThan %bool %29 %int_10 +OpBranchConditional %33 %34 %31 +%34 = OpLabel +%27 = OpIAdd %int %int_1 %int_2 +OpBranch %28 +%28 = OpLabel +%30 = OpIAdd %int %29 %int_1 +OpBranch %25 +%31 = OpLabel +OpReturn +OpFunctionEnd +)"; + + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + uint32_t current_bound = context->module()->id_bound(); + context->set_max_id_bound(current_bound); + + auto pass = MakeUnique(); + auto result = pass->Run(context.get()); + EXPECT_EQ(result, Pass::Status::Failure); + + std::vector binary; + context->module()->ToBinary(&binary, false); + std::string optimized_asm; + SpirvTools tools_(SPV_ENV_UNIVERSAL_1_1); + tools_.Disassemble(binary, &optimized_asm); + std::cout << optimized_asm << std::endl; +} } // namespace } // namespace opt } // namespace spvtools diff --git a/3rdparty/spirv-tools/test/opt/loop_optimizations/lcssa.cpp b/3rdparty/spirv-tools/test/opt/loop_optimizations/lcssa.cpp index 220772652..ace6ce196 100644 --- a/3rdparty/spirv-tools/test/opt/loop_optimizations/lcssa.cpp +++ b/3rdparty/spirv-tools/test/opt/loop_optimizations/lcssa.cpp @@ -16,6 +16,7 @@ #include #include +#include "effcee/effcee.h" #include "gmock/gmock.h" #include "source/opt/build_module.h" #include "source/opt/loop_descriptor.h" @@ -24,16 +25,10 @@ #include "test/opt//assembly_builder.h" #include "test/opt/function_utils.h" -#ifdef SPIRV_EFFCEE -#include "effcee/effcee.h" -#endif - namespace spvtools { namespace opt { namespace { -#ifdef SPIRV_EFFCEE - bool Validate(const std::vector& bin) { spv_target_env target_env = SPV_ENV_UNIVERSAL_1_2; spv_context spvContext = spvContextCreate(target_env); @@ -607,8 +602,6 @@ TEST_F(LCSSATest, LCSSAUseInNonEligiblePhi) { Match(text, context.get()); } -#endif // SPIRV_EFFCEE - } // namespace } // namespace opt } // namespace spvtools diff --git a/3rdparty/spirv-tools/test/opt/loop_optimizations/pch_test_opt_loop.cpp b/3rdparty/spirv-tools/test/opt/loop_optimizations/pch_test_opt_loop.cpp new file mode 100644 index 000000000..f4ac7b298 --- /dev/null +++ b/3rdparty/spirv-tools/test/opt/loop_optimizations/pch_test_opt_loop.cpp @@ -0,0 +1,15 @@ +// Copyright (c) 2018 The Khronos Group Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "pch_test_opt_loop.h" diff --git a/3rdparty/spirv-tools/test/opt/loop_optimizations/pch_test_opt_loop.h b/3rdparty/spirv-tools/test/opt/loop_optimizations/pch_test_opt_loop.h new file mode 100644 index 000000000..4e8106fbf --- /dev/null +++ b/3rdparty/spirv-tools/test/opt/loop_optimizations/pch_test_opt_loop.h @@ -0,0 +1,25 @@ +// Copyright (c) 2018 The Khronos Group Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "gmock/gmock.h" +#include "source/opt/iterator.h" +#include "source/opt/loop_dependence.h" +#include "source/opt/loop_descriptor.h" +#include "source/opt/pass.h" +#include "source/opt/scalar_analysis.h" +#include "source/opt/tree_iterator.h" +#include "test/opt/assembly_builder.h" +#include "test/opt/function_utils.h" +#include "test/opt/pass_fixture.h" +#include "test/opt/pass_utils.h" diff --git a/3rdparty/spirv-tools/test/opt/loop_optimizations/peeling.cpp b/3rdparty/spirv-tools/test/opt/loop_optimizations/peeling.cpp index e5db20b40..10d8add38 100644 --- a/3rdparty/spirv-tools/test/opt/loop_optimizations/peeling.cpp +++ b/3rdparty/spirv-tools/test/opt/loop_optimizations/peeling.cpp @@ -16,16 +16,13 @@ #include #include +#include "effcee/effcee.h" #include "gmock/gmock.h" #include "source/opt/ir_builder.h" #include "source/opt/loop_descriptor.h" #include "source/opt/loop_peeling.h" #include "test/opt/pass_fixture.h" -#ifdef SPIRV_EFFCEE -#include "effcee/effcee.h" -#endif - namespace spvtools { namespace opt { namespace { @@ -51,7 +48,6 @@ void Match(const std::string& checks, IRContext* context) { std::vector bin; context->module()->ToBinary(&bin, true); EXPECT_TRUE(Validate(bin)); -#ifdef SPIRV_EFFCEE std::string assembly; SpirvTools tools(SPV_ENV_UNIVERSAL_1_2); EXPECT_TRUE( @@ -62,9 +58,6 @@ void Match(const std::string& checks, IRContext* context) { EXPECT_EQ(effcee::Result::Status::Ok, match_result.status()) << match_result.message() << "\nChecking result:\n" << assembly; -#else // ! SPIRV_EFFCEE - (void)checks; -#endif } /* @@ -139,7 +132,7 @@ TEST_F(PeelingTest, CannotPeel) { } else { InstructionBuilder builder(context.get(), &*f.begin()); // Exit condition. - loop_count = builder.Add32BitSignedIntegerConstant(10); + loop_count = builder.GetSintConstant(10); } LoopPeeling peel(&*ld.begin(), loop_count); @@ -501,7 +494,7 @@ TEST_F(PeelingTest, SimplePeeling) { InstructionBuilder builder(context.get(), &*f.begin()); // Exit condition. - Instruction* ten_cst = builder.Add32BitSignedIntegerConstant(10); + Instruction* ten_cst = builder.GetSintConstant(10); LoopPeeling peel(&*ld.begin(), ten_cst); EXPECT_TRUE(peel.CanPeelLoop()); @@ -555,7 +548,7 @@ CHECK-NEXT: OpLoopMerge InstructionBuilder builder(context.get(), &*f.begin()); // Exit condition. - Instruction* ten_cst = builder.Add32BitSignedIntegerConstant(10); + Instruction* ten_cst = builder.GetSintConstant(10); LoopPeeling peel(&*ld.begin(), ten_cst); EXPECT_TRUE(peel.CanPeelLoop()); @@ -611,7 +604,7 @@ CHECK-NEXT: OpLoopMerge InstructionBuilder builder(context.get(), &*f.begin()); // Exit condition. - Instruction* ten_cst = builder.Add32BitSignedIntegerConstant(10); + Instruction* ten_cst = builder.GetSintConstant(10); LoopPeeling peel(&*ld.begin(), ten_cst, context->get_def_use_mgr()->GetDef(22)); @@ -664,7 +657,7 @@ CHECK-NEXT: OpLoopMerge InstructionBuilder builder(context.get(), &*f.begin()); // Exit condition. - Instruction* ten_cst = builder.Add32BitSignedIntegerConstant(10); + Instruction* ten_cst = builder.GetSintConstant(10); LoopPeeling peel(&*ld.begin(), ten_cst, context->get_def_use_mgr()->GetDef(22)); @@ -925,7 +918,7 @@ TEST_F(PeelingTest, DoWhilePeeling) { EXPECT_EQ(ld.NumLoops(), 1u); InstructionBuilder builder(context.get(), &*f.begin()); // Exit condition. - Instruction* ten_cst = builder.Add32BitUnsignedIntegerConstant(10); + Instruction* ten_cst = builder.GetUintConstant(10); LoopPeeling peel(&*ld.begin(), ten_cst); EXPECT_TRUE(peel.CanPeelLoop()); @@ -975,7 +968,7 @@ CHECK-NEXT: OpLoopMerge InstructionBuilder builder(context.get(), &*f.begin()); // Exit condition. - Instruction* ten_cst = builder.Add32BitUnsignedIntegerConstant(10); + Instruction* ten_cst = builder.GetUintConstant(10); LoopPeeling peel(&*ld.begin(), ten_cst); EXPECT_TRUE(peel.CanPeelLoop()); diff --git a/3rdparty/spirv-tools/test/opt/loop_optimizations/unroll_simple.cpp b/3rdparty/spirv-tools/test/opt/loop_optimizations/unroll_simple.cpp index 3b01fdc31..f551e7ca9 100644 --- a/3rdparty/spirv-tools/test/opt/loop_optimizations/unroll_simple.cpp +++ b/3rdparty/spirv-tools/test/opt/loop_optimizations/unroll_simple.cpp @@ -2952,6 +2952,52 @@ OpFunctionEnd EXPECT_NE(loop_2.GetLatchBlock(), loop_2.GetContinueBlock()); } +// Test that a loop with a self-referencing OpPhi instruction is handled +// correctly. +TEST_F(PassClassTest, OpPhiSelfReference) { + const std::string text = R"( + ; Find the two adds from the unrolled loop + ; CHECK: OpIAdd + ; CHECK: OpIAdd + ; CHECK: OpIAdd %uint %uint_0 %uint_1 + ; CHECK-NEXT: OpReturn + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %2 "main" + OpExecutionMode %2 LocalSize 8 8 1 + OpSource HLSL 600 + %uint = OpTypeInt 32 0 + %void = OpTypeVoid + %5 = OpTypeFunction %void +%uint_0 = OpConstant %uint 0 +%uint_1 = OpConstant %uint 1 + %bool = OpTypeBool + %true = OpConstantTrue %bool + %2 = OpFunction %void None %5 + %10 = OpLabel + OpBranch %19 + %19 = OpLabel + %20 = OpPhi %uint %uint_0 %10 %20 %21 + %22 = OpPhi %uint %uint_0 %10 %23 %21 + %24 = OpULessThanEqual %bool %22 %uint_1 + OpLoopMerge %25 %21 Unroll + OpBranchConditional %24 %21 %25 + %21 = OpLabel + %23 = OpIAdd %uint %22 %uint_1 + OpBranch %19 + %25 = OpLabel + %14 = OpIAdd %uint %20 %uint_1 + OpReturn + OpFunctionEnd + )"; + + const bool kFullyUnroll = true; + const uint32_t kUnrollFactor = 0; + SinglePassRunAndMatch(text, true, kFullyUnroll, + kUnrollFactor); +} + } // namespace } // namespace opt } // namespace spvtools diff --git a/3rdparty/spirv-tools/test/opt/loop_optimizations/unswitch.cpp b/3rdparty/spirv-tools/test/opt/loop_optimizations/unswitch.cpp index 96a7fc010..dc7073fd5 100644 --- a/3rdparty/spirv-tools/test/opt/loop_optimizations/unswitch.cpp +++ b/3rdparty/spirv-tools/test/opt/loop_optimizations/unswitch.cpp @@ -14,21 +14,16 @@ #include +#include "effcee/effcee.h" #include "gmock/gmock.h" #include "test/opt/pass_fixture.h" -#ifdef SPIRV_EFFCEE -#include "effcee/effcee.h" -#endif - namespace spvtools { namespace opt { namespace { using UnswitchTest = PassTest<::testing::Test>; -#ifdef SPIRV_EFFCEE - /* Generated from the following GLSL + --eliminate-local-multi-store @@ -62,13 +57,18 @@ TEST_F(UnswitchTest, SimpleUnswitch) { ; CHECK-NEXT: [[phi_j:%\w+]] = OpPhi %int %int_0 [[loop_f]] [[iv_j:%\w+]] [[continue]] ; CHECK-NEXT: OpLoopMerge [[merge:%\w+]] [[continue]] None ; CHECK: [[loop_exit:%\w+]] = OpSLessThan {{%\w+}} [[phi_i]] {{%\w+}} -; CHECK-NEXT: OpBranchConditional [[loop_exit]] {{%\w+}} [[merge]] -; Check that we have i+=1 and j+=2. -; CHECK: [[phi_j:%\w+]] = OpIAdd %int [[phi_j]] %int_1 -; CHECK: [[iv_i]] = OpIAdd %int [[phi_i]] %int_1 -; CHECK: [[iv_j]] = OpIAdd %int [[phi_j]] %int_1 -; CHECK: [[merge]] = OpLabel -; CHECK-NEXT: OpBranch [[if_merge]] +; CHECK-NEXT: OpBranchConditional [[loop_exit]] [[loop_body:%\w+]] [[merge]] +; [[loop_body]] = OpLabel +; CHECK: OpSelectionMerge [[sel_merge:%\w+]] None +; CHECK: OpBranchConditional %false [[bb1:%\w+]] [[bb2:%\w+]] +; CHECK: [[bb2]] = OpLabel +; CHECK-NEXT: [[inc_j:%\w+]] = OpIAdd %int [[phi_j]] %int_1 +; CHECK-NEXT: OpBranch [[sel_merge]] +; CHECK: [[bb1]] = OpLabel +; CHECK-NEXT: [[inc_i:%\w+]] = OpIAdd %int [[phi_i]] %int_1 +; CHECK-NEXT: OpBranch [[sel_merge]] +; CHECK: [[sel_merge]] = OpLabel +; CHECK: OpBranch [[if_merge]] ; Loop specialized for true. ; CHECK: [[loop_t]] = OpLabel @@ -78,13 +78,18 @@ TEST_F(UnswitchTest, SimpleUnswitch) { ; CHECK-NEXT: [[phi_j:%\w+]] = OpPhi %int %int_0 [[loop_t]] [[iv_j:%\w+]] [[continue]] ; CHECK-NEXT: OpLoopMerge [[merge:%\w+]] [[continue]] None ; CHECK: [[loop_exit:%\w+]] = OpSLessThan {{%\w+}} [[phi_i]] {{%\w+}} -; CHECK-NEXT: OpBranchConditional [[loop_exit]] {{%\w+}} [[merge]] -; Check that we have i+=2 and j+=1. -; CHECK: [[phi_i:%\w+]] = OpIAdd %int [[phi_i]] %int_1 -; CHECK: [[iv_i]] = OpIAdd %int [[phi_i]] %int_1 -; CHECK: [[iv_j]] = OpIAdd %int [[phi_j]] %int_1 -; CHECK: [[merge]] = OpLabel -; CHECK-NEXT: OpBranch [[if_merge]] +; CHECK-NEXT: OpBranchConditional [[loop_exit]] [[loop_body:%\w+]] [[merge]] +; [[loop_body]] = OpLabel +; CHECK: OpSelectionMerge [[sel_merge:%\w+]] None +; CHECK: OpBranchConditional %true [[bb1:%\w+]] [[bb2:%\w+]] +; CHECK: [[bb1]] = OpLabel +; CHECK-NEXT: [[inc_i:%\w+]] = OpIAdd %int [[phi_i]] %int_1 +; CHECK-NEXT: OpBranch [[sel_merge]] +; CHECK: [[bb2]] = OpLabel +; CHECK-NEXT: [[inc_j:%\w+]] = OpIAdd %int [[phi_j]] %int_1 +; CHECK-NEXT: OpBranch [[sel_merge]] +; CHECK: [[sel_merge]] = OpLabel +; CHECK: OpBranch [[if_merge]] ; CHECK: [[if_merge]] = OpLabel ; CHECK-NEXT: OpReturn @@ -292,10 +297,10 @@ TEST_F(UnswitchTest, UnswitchContinue) { ; CHECK-NEXT: [[phi_i:%\w+]] = OpPhi %int %int_0 [[loop_f]] [[iv_i:%\w+]] [[continue:%\w+]] ; CHECK-NEXT: OpLoopMerge [[merge:%\w+]] [[continue]] None ; CHECK: [[loop_exit:%\w+]] = OpSLessThan {{%\w+}} [[phi_i]] {{%\w+}} -; CHECK-NEXT: OpBranchConditional [[loop_exit]] {{%\w+}} [[merge]] -; Check that we have i+=2. -; CHECK: [[phi_i:%\w+]] = OpIAdd %int [[phi_i]] %int_1 -; CHECK: [[iv_i]] = OpIAdd %int [[phi_i]] %int_1 +; CHECK-NEXT: OpBranchConditional [[loop_exit]] [[loop_body:%\w+]] [[merge]] +; CHECK: [[loop_body:%\w+]] = OpLabel +; CHECK-NEXT: OpSelectionMerge +; CHECK-NEXT: OpBranchConditional %false ; CHECK: [[merge]] = OpLabel ; CHECK-NEXT: OpBranch [[if_merge]] @@ -306,9 +311,10 @@ TEST_F(UnswitchTest, UnswitchContinue) { ; CHECK-NEXT: [[phi_i:%\w+]] = OpPhi %int %int_0 [[loop_t]] [[iv_i:%\w+]] [[continue:%\w+]] ; CHECK-NEXT: OpLoopMerge [[merge:%\w+]] [[continue]] None ; CHECK: [[loop_exit:%\w+]] = OpSLessThan {{%\w+}} [[phi_i]] {{%\w+}} -; CHECK-NEXT: OpBranchConditional [[loop_exit]] {{%\w+}} [[merge]] -; Check that we have i+=1. -; CHECK: [[iv_i]] = OpIAdd %int [[phi_i]] %int_1 +; CHECK-NEXT: OpBranchConditional [[loop_exit]] [[loop_body:%\w+]] [[merge]] +; CHECK: [[loop_body:%\w+]] = OpLabel +; CHECK-NEXT: OpSelectionMerge +; CHECK-NEXT: OpBranchConditional %true ; CHECK: [[merge]] = OpLabel ; CHECK-NEXT: OpBranch [[if_merge]] @@ -519,18 +525,40 @@ TEST_F(UnswitchTest, UnswitchSwitch) { ; CHECK-NEXT: [[phi_i:%\w+]] = OpPhi %int %int_0 [[loop_2]] [[iv_i:%\w+]] [[continue:%\w+]] ; CHECK-NEXT: OpLoopMerge [[merge:%\w+]] [[continue]] None ; CHECK: [[loop_exit:%\w+]] = OpSLessThan {{%\w+}} [[phi_i]] {{%\w+}} -; CHECK-NEXT: OpBranchConditional [[loop_exit]] {{%\w+}} [[merge]] -; Check that we have i+=1. -; CHECK: [[iv_i]] = OpIAdd %int [[phi_i]] %int_1 -; CHECK: OpBranch [[loop]] +; CHECK-NEXT: OpBranchConditional [[loop_exit]] [[loop_body:%\w+]] [[merge]] +; CHECK: [[loop_body]] = OpLabel +; CHECK-NEXT: OpSelectionMerge +; CHECK-NEXT: OpSwitch %int_2 +; CHECK: [[merge]] = OpLabel +; CHECK-NEXT: OpBranch [[if_merge]] ; Loop specialized for 1. ; CHECK: [[loop_1]] = OpLabel -; CHECK: OpKill +; CHECK-NEXT: OpBranch [[loop:%\w+]] +; CHECK: [[loop]] = OpLabel +; CHECK-NEXT: [[phi_i:%\w+]] = OpPhi %int %int_0 [[loop_1]] [[iv_i:%\w+]] [[continue:%\w+]] +; CHECK-NEXT: OpLoopMerge [[merge:%\w+]] [[continue]] None +; CHECK: [[loop_exit:%\w+]] = OpSLessThan {{%\w+}} [[phi_i]] {{%\w+}} +; CHECK-NEXT: OpBranchConditional [[loop_exit]] [[loop_body:%\w+]] [[merge]] +; CHECK: [[loop_body]] = OpLabel +; CHECK-NEXT: OpSelectionMerge +; CHECK-NEXT: OpSwitch %int_1 +; CHECK: [[merge]] = OpLabel +; CHECK-NEXT: OpBranch [[if_merge]] ; Loop specialized for 0. ; CHECK: [[loop_0]] = OpLabel -; CHECK: OpReturn +; CHECK-NEXT: OpBranch [[loop:%\w+]] +; CHECK: [[loop]] = OpLabel +; CHECK-NEXT: [[phi_i:%\w+]] = OpPhi %int %int_0 [[loop_0]] [[iv_i:%\w+]] [[continue:%\w+]] +; CHECK-NEXT: OpLoopMerge [[merge:%\w+]] [[continue]] None +; CHECK: [[loop_exit:%\w+]] = OpSLessThan {{%\w+}} [[phi_i]] {{%\w+}} +; CHECK-NEXT: OpBranchConditional [[loop_exit]] [[loop_body:%\w+]] [[merge]] +; CHECK: [[loop_body]] = OpLabel +; CHECK-NEXT: OpSelectionMerge +; CHECK-NEXT: OpSwitch %int_0 +; CHECK: [[merge]] = OpLabel +; CHECK-NEXT: OpBranch [[if_merge]] ; Loop specialized for the default case. ; CHECK: [[default]] = OpLabel @@ -539,10 +567,12 @@ TEST_F(UnswitchTest, UnswitchSwitch) { ; CHECK-NEXT: [[phi_i:%\w+]] = OpPhi %int %int_0 [[default]] [[iv_i:%\w+]] [[continue:%\w+]] ; CHECK-NEXT: OpLoopMerge [[merge:%\w+]] [[continue]] None ; CHECK: [[loop_exit:%\w+]] = OpSLessThan {{%\w+}} [[phi_i]] {{%\w+}} -; CHECK-NEXT: OpBranchConditional [[loop_exit]] {{%\w+}} [[merge]] -; Check that we have i+=1. -; CHECK: [[phi_i:%\w+]] = OpIAdd %int [[phi_i]] %int_1 -; CHECK: OpBranch [[loop]] +; CHECK-NEXT: OpBranchConditional [[loop_exit]] [[loop_body:%\w+]] [[merge]] +; CHECK: [[loop_body]] = OpLabel +; CHECK-NEXT: OpSelectionMerge +; CHECK-NEXT: OpSwitch %uint_3 +; CHECK: [[merge]] = OpLabel +; CHECK-NEXT: OpBranch [[if_merge]] ; CHECK: [[if_merge]] = OpLabel ; CHECK-NEXT: OpReturn @@ -628,90 +658,51 @@ void main() { } } } - for (; k < 10; k++) { - if (cond) { - k++; - } - } } */ TEST_F(UnswitchTest, UnSwitchNested) { + // Test that an branch can be unswitched out of two nested loops. const std::string text = R"( ; CHECK: [[cst_cond:%\w+]] = OpFOrdEqual ; CHECK-NEXT: OpSelectionMerge [[if_merge:%\w+]] None ; CHECK-NEXT: OpBranchConditional [[cst_cond]] [[loop_t:%\w+]] [[loop_f:%\w+]] -; Loop specialized for false, one loop is killed, j won't change anymore. +; Loop specialized for false ; CHECK: [[loop_f]] = OpLabel ; CHECK-NEXT: OpBranch [[loop:%\w+]] ; CHECK: [[loop]] = OpLabel -; CHECK-NEXT: [[phi_i:%\w+]] = OpPhi %int %int_0 [[loop_f]] [[iv_i:%\w+]] [[continue:%\w+]] -; CHECK-NEXT: [[phi_j:%\w+]] = OpPhi %int %int_0 [[loop_f]] [[iv_j:%\w+]] [[continue]] +; CHECK-NEXT: {{%\w+}} = OpPhi %int %int_0 [[loop_f]] {{%\w+}} [[continue:%\w+]] +; CHECK-NEXT: {{%\w+}} = OpPhi %int %int_0 [[loop_f]] {{%\w+}} [[continue]] ; CHECK-NEXT: OpLoopMerge [[merge:%\w+]] [[continue]] None -; CHECK: [[iv_i]] = OpIAdd %int [[phi_i]] %int_1 -; CHECK-NEXT: OpBranch [[loop]] -; CHECK: OpReturn +; CHECK-NOT: [[merge]] = OpLabel +; CHECK: OpLoopMerge +; CHECK-NEXT: OpBranch [[bb1:%\w+]] +; CHECK: [[bb1]] = OpLabel +; CHECK-NEXT: OpSLessThan +; CHECK-NEXT: OpBranchConditional {{%\w+}} [[bb2:%\w+]] +; CHECK: [[bb2]] = OpLabel +; CHECK-NEXT: OpSelectionMerge +; CHECK-NEXT: OpBranchConditional %false +; CHECK: [[merge]] = OpLabel -; Loop specialized for true. +; Loop specialized for true. Same as first loop except the branch condition is true. ; CHECK: [[loop_t]] = OpLabel ; CHECK-NEXT: OpBranch [[loop:%\w+]] ; CHECK: [[loop]] = OpLabel -; CHECK-NEXT: [[phi_i:%\w+]] = OpPhi %int %int_0 [[loop_t]] [[iv_i:%\w+]] [[continue:%\w+]] -; CHECK-NEXT: [[phi_j:%\w+]] = OpPhi %int %int_0 [[loop_t]] [[iv_j:%\w+]] [[continue]] +; CHECK-NEXT: {{%\w+}} = OpPhi %int %int_0 [[loop_t]] {{%\w+}} [[continue:%\w+]] +; CHECK-NEXT: {{%\w+}} = OpPhi %int %int_0 [[loop_t]] {{%\w+}} [[continue]] ; CHECK-NEXT: OpLoopMerge [[merge:%\w+]] [[continue]] None -; CHECK: [[loop_exit:%\w+]] = OpSLessThan {{%\w+}} [[phi_i]] {{%\w+}} -; CHECK-NEXT: OpBranchConditional [[loop_exit]] [[pre_loop_inner:%\w+]] [[merge]] - -; CHECK: [[pre_loop_inner]] = OpLabel -; CHECK-NEXT: OpBranch [[loop_inner:%\w+]] -; CHECK-NEXT: [[loop_inner]] = OpLabel -; CHECK-NEXT: [[phi2_i:%\w+]] = OpPhi %int [[phi_i]] [[pre_loop_inner]] [[iv2_i:%\w+]] [[continue2:%\w+]] -; CHECK-NEXT: [[phi2_j:%\w+]] = OpPhi %int [[phi_j]] [[pre_loop_inner]] [[iv2_j:%\w+]] [[continue2]] -; CHECK-NEXT: OpLoopMerge [[merge2:%\w+]] [[continue2]] None - -; CHECK: OpBranch [[continue2]] -; CHECK: [[merge2]] = OpLabel -; CHECK: OpBranch [[continue]] +; CHECK-NOT: [[merge]] = OpLabel +; CHECK: OpLoopMerge +; CHECK-NEXT: OpBranch [[bb1:%\w+]] +; CHECK: [[bb1]] = OpLabel +; CHECK-NEXT: OpSLessThan +; CHECK-NEXT: OpBranchConditional {{%\w+}} [[bb2:%\w+]] +; CHECK: [[bb2]] = OpLabel +; CHECK-NEXT: OpSelectionMerge +; CHECK-NEXT: OpBranchConditional %true ; CHECK: [[merge]] = OpLabel -; Unswitched double nested loop is done. Test the single remaining one. - -; CHECK: [[if_merge]] = OpLabel -; CHECK-NEXT: OpSelectionMerge [[if_merge:%\w+]] None -; CHECK-NEXT: OpBranchConditional [[cst_cond]] [[loop_t:%\w+]] [[loop_f:%\w+]] - -; Loop specialized for false. -; CHECK: [[loop_f]] = OpLabel -; CHECK-NEXT: OpBranch [[loop:%\w+]] -; CHECK: [[loop]] = OpLabel -; CHECK-NEXT: [[phi_k:%\w+]] = OpPhi %int %int_0 [[loop_f]] [[iv_k:%\w+]] [[continue:%\w+]] -; CHECK-NEXT: OpLoopMerge [[merge:%\w+]] [[continue]] None -; CHECK: [[loop_exit:%\w+]] = OpSLessThan {{%\w+}} [[phi_k]] {{%\w+}} -; CHECK-NEXT: OpBranchConditional [[loop_exit]] {{%\w+}} [[merge]] -; Check that we have k+=1 -; CHECK: [[iv_k]] = OpIAdd %int [[phi_k]] %int_1 -; CHECK: OpBranch [[loop]] -; CHECK: [[merge]] = OpLabel -; CHECK-NEXT: OpBranch [[if_merge]] - -; Loop specialized for true. -; CHECK: [[loop_t]] = OpLabel -; CHECK-NEXT: OpBranch [[loop:%\w+]] -; CHECK: [[loop]] = OpLabel -; CHECK-NEXT: [[phi_k:%\w+]] = OpPhi %int %int_0 [[loop_t]] [[iv_k:%\w+]] [[continue:%\w+]] -; CHECK-NEXT: OpLoopMerge [[merge:%\w+]] [[continue]] None -; CHECK: [[loop_exit:%\w+]] = OpSLessThan {{%\w+}} [[phi_k]] {{%\w+}} -; CHECK-NEXT: OpBranchConditional [[loop_exit]] {{%\w+}} [[merge]] -; Check that we have k+=2. -; CHECK: [[tmp_k:%\w+]] = OpIAdd %int [[phi_k]] %int_1 -; CHECK: [[iv_k]] = OpIAdd %int [[tmp_k]] %int_1 -; CHECK: OpBranch [[loop]] -; CHECK: [[merge]] = OpLabel -; CHECK-NEXT: OpBranch [[if_merge]] - -; CHECK: [[if_merge]] = OpLabel -; CHECK-NEXT: OpReturn - OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 @@ -782,34 +773,12 @@ TEST_F(UnswitchTest, UnSwitchNested) { %52 = OpIAdd %int %69 %int_1 OpBranch %26 %28 = OpLabel - OpBranch %53 - %53 = OpLabel - %71 = OpPhi %int %int_0 %28 %66 %56 - OpLoopMerge %55 %56 None - OpBranch %57 - %57 = OpLabel - %59 = OpSLessThan %bool %71 %int_10 - OpBranchConditional %59 %54 %55 - %54 = OpLabel - OpSelectionMerge %62 None - OpBranchConditional %25 %61 %62 - %61 = OpLabel - %64 = OpIAdd %int %71 %int_1 - OpBranch %62 - %62 = OpLabel - %72 = OpPhi %int %71 %54 %64 %61 - OpBranch %56 - %56 = OpLabel - %66 = OpIAdd %int %72 %int_1 - OpBranch %53 - %55 = OpLabel OpReturn OpFunctionEnd )"; SinglePassRunAndMatch(text, true); } -#endif // SPIRV_EFFCEE /* Generated from the following GLSL + --eliminate-local-multi-store @@ -912,6 +881,87 @@ TEST_F(UnswitchTest, UnswitchNotUniform) { EXPECT_EQ(Pass::Status::SuccessWithoutChange, std::get<1>(result)); } +TEST_F(UnswitchTest, DontUnswitchLatch) { + // Check that the unswitch is not triggered for the latch branch. + const std::string text = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + %void = OpTypeVoid + %3 = OpTypeFunction %void + %bool = OpTypeBool +%false = OpConstantFalse %bool + %4 = OpFunction %void None %3 + %5 = OpLabel + OpBranch %6 + %6 = OpLabel + OpLoopMerge %8 %9 None + OpBranch %7 + %7 = OpLabel + OpBranch %9 + %9 = OpLabel + OpBranchConditional %false %6 %8 + %8 = OpLabel + OpReturn + OpFunctionEnd + )"; + + auto result = + SinglePassRunAndDisassemble(text, true, false); + EXPECT_EQ(Pass::Status::SuccessWithoutChange, std::get<1>(result)); +} + +TEST_F(UnswitchTest, DontUnswitchConstantCondition) { + const std::string text = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %main "main" + OpExecutionMode %main OriginLowerLeft + OpSource GLSL 450 + OpName %main "main" + %void = OpTypeVoid + %4 = OpTypeFunction %void + %int = OpTypeInt 32 1 + %int_0 = OpConstant %int 0 + %bool = OpTypeBool + %true = OpConstantTrue %bool + %int_1 = OpConstant %int 1 + %main = OpFunction %void None %4 + %10 = OpLabel + OpBranch %11 + %11 = OpLabel + %12 = OpPhi %int %int_0 %10 %13 %14 + OpLoopMerge %15 %14 None + OpBranch %16 + %16 = OpLabel + %17 = OpSLessThan %bool %12 %int_1 + OpBranchConditional %17 %18 %15 + %18 = OpLabel + OpSelectionMerge %19 None + OpBranchConditional %true %20 %19 + %20 = OpLabel + %21 = OpIAdd %int %12 %int_1 + OpBranch %19 + %19 = OpLabel + %22 = OpPhi %int %21 %20 %12 %18 + OpBranch %14 + %14 = OpLabel + %13 = OpIAdd %int %22 %int_1 + OpBranch %11 + %15 = OpLabel + OpReturn + OpFunctionEnd + )"; + + auto result = + SinglePassRunAndDisassemble(text, true, false); + EXPECT_EQ(Pass::Status::SuccessWithoutChange, std::get<1>(result)); +} + } // namespace } // namespace opt } // namespace spvtools diff --git a/3rdparty/spirv-tools/test/opt/module_test.cpp b/3rdparty/spirv-tools/test/opt/module_test.cpp index c4f450ea9..569cf9bcd 100644 --- a/3rdparty/spirv-tools/test/opt/module_test.cpp +++ b/3rdparty/spirv-tools/test/opt/module_test.cpp @@ -139,6 +139,95 @@ OpFunctionEnd)"; EXPECT_EQ(text, str.str()); } +TEST(ModuleTest, IdBoundTestAtLimit) { + const std::string text = R"( +OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +%1 = OpTypeVoid +%2 = OpTypeFunction %1 +%3 = OpFunction %1 None %2 +%4 = OpLabel +OpReturn +OpFunctionEnd)"; + + std::unique_ptr context = BuildModule(text); + uint32_t current_bound = context->module()->id_bound(); + context->set_max_id_bound(current_bound); + uint32_t next_id_bound = context->module()->TakeNextIdBound(); + EXPECT_EQ(next_id_bound, 0); + EXPECT_EQ(current_bound, context->module()->id_bound()); + next_id_bound = context->module()->TakeNextIdBound(); + EXPECT_EQ(next_id_bound, 0); +} + +TEST(ModuleTest, IdBoundTestBelowLimit) { + const std::string text = R"( +OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +%1 = OpTypeVoid +%2 = OpTypeFunction %1 +%3 = OpFunction %1 None %2 +%4 = OpLabel +OpReturn +OpFunctionEnd)"; + + std::unique_ptr context = BuildModule(text); + uint32_t current_bound = context->module()->id_bound(); + context->set_max_id_bound(current_bound + 100); + uint32_t next_id_bound = context->module()->TakeNextIdBound(); + EXPECT_EQ(next_id_bound, current_bound); + EXPECT_EQ(current_bound + 1, context->module()->id_bound()); + next_id_bound = context->module()->TakeNextIdBound(); + EXPECT_EQ(next_id_bound, current_bound + 1); +} + +TEST(ModuleTest, IdBoundTestNearLimit) { + const std::string text = R"( +OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +%1 = OpTypeVoid +%2 = OpTypeFunction %1 +%3 = OpFunction %1 None %2 +%4 = OpLabel +OpReturn +OpFunctionEnd)"; + + std::unique_ptr context = BuildModule(text); + uint32_t current_bound = context->module()->id_bound(); + context->set_max_id_bound(current_bound + 1); + uint32_t next_id_bound = context->module()->TakeNextIdBound(); + EXPECT_EQ(next_id_bound, current_bound); + EXPECT_EQ(current_bound + 1, context->module()->id_bound()); + next_id_bound = context->module()->TakeNextIdBound(); + EXPECT_EQ(next_id_bound, 0); +} + +TEST(ModuleTest, IdBoundTestUIntMax) { + const std::string text = R"( +OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +%1 = OpTypeVoid +%2 = OpTypeFunction %1 +%3 = OpFunction %1 None %2 +%4294967294 = OpLabel ; ID is UINT_MAX-1 +OpReturn +OpFunctionEnd)"; + + std::unique_ptr context = BuildModule(text); + uint32_t current_bound = context->module()->id_bound(); + + // Expecting |BuildModule| to preserve the numeric ids. + EXPECT_EQ(current_bound, std::numeric_limits::max()); + + context->set_max_id_bound(current_bound); + uint32_t next_id_bound = context->module()->TakeNextIdBound(); + EXPECT_EQ(next_id_bound, 0); + EXPECT_EQ(current_bound, context->module()->id_bound()); +} } // namespace } // namespace opt } // namespace spvtools diff --git a/3rdparty/spirv-tools/test/opt/pass_fixture.h b/3rdparty/spirv-tools/test/opt/pass_fixture.h index 9d9eb3661..da2e00ee8 100644 --- a/3rdparty/spirv-tools/test/opt/pass_fixture.h +++ b/3rdparty/spirv-tools/test/opt/pass_fixture.h @@ -22,17 +22,15 @@ #include #include +#include "effcee/effcee.h" #include "gtest/gtest.h" #include "source/opt/build_module.h" #include "source/opt/pass_manager.h" #include "source/opt/passes.h" +#include "source/spirv_validator_options.h" #include "source/util/make_unique.h" #include "spirv-tools/libspirv.hpp" -#ifdef SPIRV_EFFCEE -#include "effcee/effcee.h" -#endif - namespace spvtools { namespace opt { @@ -47,7 +45,9 @@ template class PassTest : public TestT { public: PassTest() - : consumer_(nullptr), + : consumer_( + [](spv_message_level_t, const char*, const spv_position_t&, + const char* message) { std::cerr << message << std::endl; }), context_(nullptr), tools_(SPV_ENV_UNIVERSAL_1_1), manager_(new PassManager()), @@ -101,7 +101,8 @@ class PassTest : public TestT { spv_context spvContext = spvContextCreate(target_env); spv_diagnostic diagnostic = nullptr; spv_const_binary_t binary = {optimized_bin.data(), optimized_bin.size()}; - spv_result_t error = spvValidate(spvContext, &binary, &diagnostic); + spv_result_t error = spvValidateWithOptions( + spvContext, ValidatorOptions(), &binary, &diagnostic); EXPECT_EQ(error, 0); if (error != 0) spvDiagnosticPrint(diagnostic); spvDiagnosticDestroy(diagnostic); @@ -137,7 +138,8 @@ class PassTest : public TestT { spv_context spvContext = spvContextCreate(target_env); spv_diagnostic diagnostic = nullptr; spv_const_binary_t binary = {optimized_bin.data(), optimized_bin.size()}; - spv_result_t error = spvValidate(spvContext, &binary, &diagnostic); + spv_result_t error = spvValidateWithOptions( + spvContext, ValidatorOptions(), &binary, &diagnostic); EXPECT_EQ(error, 0); if (error != 0) spvDiagnosticPrint(diagnostic); spvDiagnosticDestroy(diagnostic); @@ -163,7 +165,6 @@ class PassTest : public TestT { std::forward(args)...); } -#ifdef SPIRV_EFFCEE // Runs a single pass of class |PassT| on the binary assembled from the // |original| assembly, then runs an Effcee matcher over the disassembled // result, using checks parsed from |original|. Always skips OpNop. @@ -181,7 +182,6 @@ class PassTest : public TestT { << match_result.message() << "\nChecking result:\n" << disassembly; } -#endif // Adds a pass to be run. template @@ -231,13 +231,16 @@ class PassTest : public TestT { consumer_ = msg_consumer; } + spv_validator_options ValidatorOptions() { return &validator_options_; } + private: - MessageConsumer consumer_; // Message consumer. - std::unique_ptr context_; // IR context + MessageConsumer consumer_; // Message consumer. + std::unique_ptr context_; // IR context SpirvTools tools_; // An instance for calling SPIRV-Tools functionalities. std::unique_ptr manager_; // The pass manager. uint32_t assemble_options_; uint32_t disassemble_options_; + spv_validator_options_t validator_options_; }; } // namespace opt diff --git a/3rdparty/spirv-tools/test/opt/pass_merge_return_test.cpp b/3rdparty/spirv-tools/test/opt/pass_merge_return_test.cpp index 4dd4b6b28..9c8d80d5c 100644 --- a/3rdparty/spirv-tools/test/opt/pass_merge_return_test.cpp +++ b/3rdparty/spirv-tools/test/opt/pass_merge_return_test.cpp @@ -104,6 +104,7 @@ TEST_F(MergeReturnPassTest, TwoReturnsWithValues) { R"(OpCapability Linkage OpCapability Kernel OpMemoryModel Logical OpenCL +OpDecorate %7 LinkageAttributes "simple_kernel" Export %1 = OpTypeInt 32 0 %2 = OpTypeBool %3 = OpConstantFalse %2 @@ -124,6 +125,7 @@ OpFunctionEnd R"(OpCapability Linkage OpCapability Kernel OpMemoryModel Logical OpenCL +OpDecorate %7 LinkageAttributes "simple_kernel" Export %1 = OpTypeInt 32 0 %2 = OpTypeBool %3 = OpConstantFalse %2 @@ -207,6 +209,7 @@ TEST_F(MergeReturnPassTest, UnreachableReturnsWithValues) { R"(OpCapability Linkage OpCapability Kernel OpMemoryModel Logical OpenCL +OpDecorate %7 LinkageAttributes "simple_kernel" Export %1 = OpTypeInt 32 0 %2 = OpTypeBool %3 = OpConstantFalse %2 @@ -230,6 +233,7 @@ OpFunctionEnd R"(OpCapability Linkage OpCapability Kernel OpMemoryModel Logical OpenCL +OpDecorate %7 LinkageAttributes "simple_kernel" Export %1 = OpTypeInt 32 0 %2 = OpTypeBool %3 = OpConstantFalse %2 @@ -257,7 +261,6 @@ OpFunctionEnd SinglePassRunAndCheck(before, after, false, true); } -#ifdef SPIRV_EFFCEE TEST_F(MergeReturnPassTest, StructuredControlFlowWithUnreachableMerge) { const std::string before = R"( @@ -265,15 +268,19 @@ TEST_F(MergeReturnPassTest, StructuredControlFlowWithUnreachableMerge) { ; CHECK: [[true:%\w+]] = OpConstantTrue ; CHECK: OpFunction ; CHECK: [[var:%\w+]] = OpVariable [[:%\w+]] Function [[false]] +; CHECK: OpLoopMerge [[return_block:%\w+]] ; CHECK: OpSelectionMerge [[merge_lab:%\w+]] ; CHECK: OpBranchConditional [[cond:%\w+]] [[if_lab:%\w+]] [[then_lab:%\w+]] ; CHECK: [[if_lab]] = OpLabel ; CHECK-NEXT: OpStore [[var]] [[true]] -; CHECK-NEXT: OpBranch +; CHECK-NEXT: OpBranch [[return_block]] ; CHECK: [[then_lab]] = OpLabel ; CHECK-NEXT: OpStore [[var]] [[true]] -; CHECK-NEXT: OpBranch [[merge_lab]] -; CHECK: OpReturn +; CHECK-NEXT: OpBranch [[return_block]] +; CHECK: [[merge_lab]] = OpLabel +; CHECK-NEXT: OpBranch [[return_block]] +; CHECK: [[return_block]] = OpLabel +; CHECK-NEXT: OpReturn OpCapability Addresses OpCapability Shader OpCapability Linkage @@ -307,6 +314,7 @@ TEST_F(MergeReturnPassTest, StructuredControlFlowAddPhi) { ; CHECK: [[true:%\w+]] = OpConstantTrue ; CHECK: OpFunction ; CHECK: [[var:%\w+]] = OpVariable [[:%\w+]] Function [[false]] +; CHECK: OpLoopMerge [[dummy_loop_merge:%\w+]] ; CHECK: OpSelectionMerge [[merge_lab:%\w+]] ; CHECK: OpBranchConditional [[cond:%\w+]] [[if_lab:%\w+]] [[then_lab:%\w+]] ; CHECK: [[if_lab]] = OpLabel @@ -314,11 +322,10 @@ TEST_F(MergeReturnPassTest, StructuredControlFlowAddPhi) { ; CHECK-NEXT: OpBranch ; CHECK: [[then_lab]] = OpLabel ; CHECK-NEXT: OpStore [[var]] [[true]] -; CHECK-NEXT: OpBranch [[merge_lab]] +; CHECK-NEXT: OpBranch [[dummy_loop_merge]] ; CHECK: [[merge_lab]] = OpLabel -; CHECK-NEXT: [[phi:%\w+]] = OpPhi [[type]] [[add]] [[if_lab]] [[undef:%\w+]] [[then_lab]] -; CHECK: OpIAdd [[type]] [[phi]] [[phi]] -; CHECK: OpReturn +; CHECK: [[dummy_loop_merge]] = OpLabel +; CHECK-NEXT: OpReturn OpCapability Addresses OpCapability Shader OpCapability Linkage @@ -357,6 +364,7 @@ TEST_F(MergeReturnPassTest, StructuredControlDecoration) { ; CHECK: [[true:%\w+]] = OpConstantTrue ; CHECK: OpFunction ; CHECK: [[var:%\w+]] = OpVariable [[:%\w+]] Function [[false]] +; CHECK: OpLoopMerge [[return_block:%\w+]] ; CHECK: OpSelectionMerge [[merge_lab:%\w+]] ; CHECK: OpBranchConditional [[cond:%\w+]] [[if_lab:%\w+]] [[then_lab:%\w+]] ; CHECK: [[if_lab]] = OpLabel @@ -364,9 +372,12 @@ TEST_F(MergeReturnPassTest, StructuredControlDecoration) { ; CHECK-NEXT: OpBranch ; CHECK: [[then_lab]] = OpLabel ; CHECK-NEXT: OpStore [[var]] [[true]] -; CHECK-NEXT: OpBranch [[merge_lab]] +; CHECK-NEXT: OpBranch [[return_block]] ; CHECK: [[merge_lab]] = OpLabel -; CHECK: OpReturn +; CHECK-NEXT: OpStore [[var]] [[true]] +; CHECK-NEXT: OpBranch [[return_block]] +; CHECK: [[return_block]] = OpLabel +; CHECK-NEXT: OpReturn OpCapability Addresses OpCapability Shader OpCapability Linkage @@ -396,69 +407,18 @@ OpFunctionEnd SinglePassRunAndMatch(before, false); } -TEST_F(MergeReturnPassTest, StructuredControlDecoration2) { - const std::string before = - R"( -; CHECK: OpDecorate [[dec_id:%\w+]] RelaxedPrecision -; CHECK: [[false:%\w+]] = OpConstantFalse -; CHECK: [[true:%\w+]] = OpConstantTrue -; CHECK: OpFunction -; CHECK: [[var:%\w+]] = OpVariable [[:%\w+]] Function [[false]] -; CHECK: OpSelectionMerge [[merge_lab:%\w+]] -; CHECK: OpBranchConditional [[cond:%\w+]] [[if_lab:%\w+]] [[then_lab:%\w+]] -; CHECK: [[if_lab]] = OpLabel -; CHECK-NEXT: [[dec_id]] = OpIAdd [[type:%\w+]] -; CHECK-NEXT: OpBranch -; CHECK: [[then_lab]] = OpLabel -; CHECK-NEXT: OpStore [[var]] [[true]] -; CHECK-NEXT: OpBranch [[merge_lab]] -; CHECK: [[merge_lab]] = OpLabel -; CHECK-NEXT: [[phi:%\w+]] = OpPhi [[type]] [[dec_id]] [[if_lab]] [[undef:%\w+]] [[then_lab]] -; CHECK: OpIAdd [[type]] [[phi]] [[phi]] -; CHECK: OpReturn -OpCapability Addresses -OpCapability Shader -OpCapability Linkage -OpMemoryModel Logical GLSL450 -OpEntryPoint GLCompute %6 "simple_shader" -OpDecorate %11 RelaxedPrecision -%2 = OpTypeVoid -%3 = OpTypeBool -%int = OpTypeInt 32 0 -%int_0 = OpConstant %int 0 -%4 = OpConstantFalse %3 -%1 = OpTypeFunction %2 -%6 = OpFunction %2 None %1 -%7 = OpLabel -OpSelectionMerge %10 None -OpBranchConditional %4 %8 %9 -%8 = OpLabel -%11 = OpIAdd %int %int_0 %int_0 -OpBranch %10 -%9 = OpLabel -OpReturn -%10 = OpLabel -%12 = OpIAdd %int %11 %11 -OpReturn -OpFunctionEnd -)"; - - SinglePassRunAndMatch(before, false); -} - TEST_F(MergeReturnPassTest, SplitBlockUsedInPhi) { const std::string before = R"( ; CHECK: OpFunction -; CHECK-NEXT: OpLabel -; CHECK: OpSelectionMerge [[merge1:%\w+]] None -; CHECK: [[merge1]] = OpLabel -; CHECK: OpBranchConditional %{{\w+}} %{{\w+}} [[old_merge:%\w+]] -; CHECK: [[old_merge]] = OpLabel -; CHECK-NEXT: OpSelectionMerge [[merge2:%\w+]] -; CHECK-NEXT: OpBranchConditional %false [[side_node:%\w+]] [[merge2]] -; CHECK: [[merge2]] = OpLabel -; CHECK-NEXT: OpPhi %bool %false [[old_merge]] %true [[side_node]] +; CHECK: OpLoopMerge [[dummy_loop_merge:%\w+]] +; CHECK: OpLoopMerge [[loop_merge:%\w+]] +; CHECK: [[loop_merge]] = OpLabel +; CHECK: OpBranchConditional {{%\w+}} [[dummy_loop_merge]] [[old_code_path:%\w+]] +; CHECK: [[old_code_path:%\w+]] = OpLabel +; CHECK: OpBranchConditional {{%\w+}} [[side_node:%\w+]] [[phi_block:%\w+]] +; CHECK: [[phi_block]] = OpLabel +; CHECK-NEXT: OpPhi %bool %false [[side_node]] %true [[old_code_path]] OpCapability Addresses OpCapability Shader OpCapability Linkage @@ -471,17 +431,19 @@ TEST_F(MergeReturnPassTest, SplitBlockUsedInPhi) { %6 = OpTypeFunction %void %1 = OpFunction %void None %6 %7 = OpLabel - OpSelectionMerge %8 None - OpBranchConditional %false %9 %8 + OpLoopMerge %merge %cont None + OpBranchConditional %false %9 %merge %9 = OpLabel OpReturn - %8 = OpLabel - OpSelectionMerge %10 None - OpBranchConditional %false %11 %10 - %11 = OpLabel - OpBranch %10 - %10 = OpLabel - %12 = OpPhi %bool %false %8 %true %11 + %cont = OpLabel + OpBranch %7 + %merge = OpLabel + OpSelectionMerge %merge2 None + OpBranchConditional %false %if %merge2 + %if = OpLabel + OpBranch %merge2 + %merge2 = OpLabel + %12 = OpPhi %bool %false %if %true %merge OpReturn OpFunctionEnd )"; @@ -557,39 +519,61 @@ TEST_F(MergeReturnPassTest, UpdateOrderWhenPredicating) { SinglePassRunAndMatch(before, false); } */ -#endif TEST_F(MergeReturnPassTest, StructuredControlFlowBothMergeAndHeader) { - const std::string before = - R"(OpCapability Addresses + const std::string test = + R"( +; CHECK: OpFunction +; CHECK: [[ret_flag:%\w+]] = OpVariable %_ptr_Function_bool Function %false +; CHECK: OpLoopMerge [[dummy_loop_merge:%\w+]] +; CHECK: OpLoopMerge [[loop1_merge:%\w+]] {{%\w+}} +; CHECK-NEXT: OpBranchConditional {{%\w+}} [[if_lab:%\w+]] {{%\w+}} +; CHECK: [[if_lab]] = OpLabel +; CHECK: OpStore [[ret_flag]] %true +; CHECK-NEXT: OpBranch [[loop1_merge]] +; CHECK: [[loop1_merge]] = OpLabel +; CHECK-NEXT: [[ld:%\w+]] = OpLoad %bool [[ret_flag]] +; CHECK-NOT: OpLabel +; CHECK: OpBranchConditional [[ld]] [[dummy_loop_merge]] [[empty_block:%\w+]] +; CHECK: [[empty_block]] = OpLabel +; CHECK-NEXT: OpBranch [[loop2:%\w+]] +; CHECK: [[loop2]] = OpLabel +; CHECK-NOT: OpLabel +; CHECK: OpLoopMerge + OpCapability Addresses OpCapability Shader OpCapability Linkage OpMemoryModel Logical GLSL450 OpEntryPoint GLCompute %1 "simple_shader" - %2 = OpTypeVoid - %3 = OpTypeBool - %4 = OpTypeInt 32 0 - %5 = OpConstant %4 0 - %6 = OpConstantFalse %3 - %7 = OpTypeFunction %2 - %1 = OpFunction %2 None %7 + %void = OpTypeVoid + %bool = OpTypeBool + %uint = OpTypeInt 32 0 + %uint_0 = OpConstant %uint 0 + %false = OpConstantFalse %bool + %7 = OpTypeFunction %void + %1 = OpFunction %void None %7 %8 = OpLabel - OpSelectionMerge %9 None - OpBranchConditional %6 %10 %11 - %10 = OpLabel - OpReturn - %11 = OpLabel OpBranch %9 %9 = OpLabel - OpLoopMerge %12 %13 None - OpBranch %13 - %13 = OpLabel - %14 = OpIAdd %4 %5 %5 - OpBranchConditional %6 %9 %12 + OpLoopMerge %10 %11 None + OpBranchConditional %false %12 %13 %12 = OpLabel - %15 = OpIAdd %4 %14 %14 + OpReturn + %13 = OpLabel + OpBranch %10 + %11 = OpLabel + OpBranch %9 + %10 = OpLabel + OpLoopMerge %14 %15 None + OpBranch %15 + %15 = OpLabel + %16 = OpIAdd %uint %uint_0 %uint_0 + OpBranchConditional %false %10 %14 + %14 = OpLabel + %17 = OpIAdd %uint %16 %16 OpReturn OpFunctionEnd + )"; const std::string after = @@ -639,7 +623,7 @@ OpReturn OpFunctionEnd )"; - SinglePassRunAndCheck(before, after, false, true); + SinglePassRunAndMatch(test, false); } // TODO(#1861): Reenable these test when the breaks from selection constructs @@ -927,8 +911,27 @@ OpFunctionEnd */ TEST_F(MergeReturnPassTest, NestedLoopMerge) { - const std::string before = - R"( OpCapability SampledBuffer + const std::string test = + R"( +; CHECK: OpFunction +; CHECK: OpLoopMerge [[dummy_loop_merge:%\w+]] +; CHECK: OpLoopMerge [[outer_loop_merge:%\w+]] +; CHECK: OpLoopMerge [[inner_loop_merge:%\w+]] +; CHECK: OpSelectionMerge +; CHECK-NEXT: OpBranchConditional %true [[early_exit_block:%\w+]] +; CHECK: [[early_exit_block]] = OpLabel +; CHECK-NOT: OpLabel +; CHECK: OpBranch [[inner_loop_merge]] +; CHECK: [[inner_loop_merge]] = OpLabel +; CHECK-NOT: OpLabel +; CHECK: OpBranchConditional {{%\w+}} [[outer_loop_merge]] +; CHECK: [[outer_loop_merge]] = OpLabel +; CHECK-NOT: OpLabel +; CHECK: OpBranchConditional {{%\w+}} [[dummy_loop_merge]] +; CHECK: [[dummy_loop_merge]] = OpLabel +; CHECK-NOT: OpLabel +; CHECK: OpReturn + OpCapability SampledBuffer OpCapability StorageImageExtendedFormats OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" @@ -936,7 +939,6 @@ TEST_F(MergeReturnPassTest, NestedLoopMerge) { OpEntryPoint GLCompute %2 "CS" OpExecutionMode %2 LocalSize 8 8 1 OpSource HLSL 600 - OpName %function "function" %uint = OpTypeInt 32 0 %void = OpTypeVoid %6 = OpTypeFunction %void @@ -946,29 +948,18 @@ TEST_F(MergeReturnPassTest, NestedLoopMerge) { %bool = OpTypeBool %true = OpConstantTrue %bool %_ptr_Function_uint = OpTypePointer Function %uint - %_struct_13 = OpTypeStruct %v3uint %v3uint %v3uint %uint %uint %uint %uint %uint %uint %2 = OpFunction %void None %6 %14 = OpLabel - %15 = OpFunctionCall %void %function - OpReturn - OpFunctionEnd - %function = OpFunction %void None %6 - %16 = OpLabel - %17 = OpVariable %_ptr_Function_uint Function - %18 = OpVariable %_ptr_Function_uint Function - OpStore %17 %uint_0 OpBranch %19 %19 = OpLabel - %20 = OpLoad %uint %17 + %20 = OpPhi %uint %uint_0 %2 %34 %23 %21 = OpULessThan %bool %20 %uint_1 OpLoopMerge %22 %23 DontUnroll OpBranchConditional %21 %24 %22 %24 = OpLabel - OpStore %18 %uint_1 OpBranch %25 %25 = OpLabel - %26 = OpLoad %uint %18 - %27 = OpINotEqual %bool %26 %uint_0 + %27 = OpINotEqual %bool %uint_1 %uint_0 OpLoopMerge %28 %29 DontUnroll OpBranchConditional %27 %30 %28 %30 = OpLabel @@ -977,110 +968,32 @@ TEST_F(MergeReturnPassTest, NestedLoopMerge) { %32 = OpLabel OpReturn %31 = OpLabel - OpStore %18 %uint_1 OpBranch %29 %29 = OpLabel OpBranch %25 %28 = OpLabel OpBranch %23 %23 = OpLabel - %33 = OpLoad %uint %17 - %34 = OpIAdd %uint %33 %uint_1 - OpStore %17 %34 + %34 = OpIAdd %uint %20 %uint_1 OpBranch %19 %22 = OpLabel OpReturn OpFunctionEnd )"; - const std::string after = - R"(OpCapability SampledBuffer -OpCapability StorageImageExtendedFormats -OpCapability Shader -%1 = OpExtInstImport "GLSL.std.450" -OpMemoryModel Logical GLSL450 -OpEntryPoint GLCompute %2 "CS" -OpExecutionMode %2 LocalSize 8 8 1 -OpSource HLSL 600 -OpName %function "function" -%uint = OpTypeInt 32 0 -%void = OpTypeVoid -%6 = OpTypeFunction %void -%uint_0 = OpConstant %uint 0 -%uint_1 = OpConstant %uint 1 -%v3uint = OpTypeVector %uint 3 -%bool = OpTypeBool -%true = OpConstantTrue %bool -%_ptr_Function_uint = OpTypePointer Function %uint -%_struct_13 = OpTypeStruct %v3uint %v3uint %v3uint %uint %uint %uint %uint %uint %uint -%false = OpConstantFalse %bool -%_ptr_Function_bool = OpTypePointer Function %bool -%2 = OpFunction %void None %6 -%14 = OpLabel -%15 = OpFunctionCall %void %function -OpReturn -OpFunctionEnd -%function = OpFunction %void None %6 -%16 = OpLabel -%38 = OpVariable %_ptr_Function_bool Function %false -%17 = OpVariable %_ptr_Function_uint Function -%18 = OpVariable %_ptr_Function_uint Function -OpStore %17 %uint_0 -OpBranch %19 -%19 = OpLabel -%20 = OpLoad %uint %17 -%21 = OpULessThan %bool %20 %uint_1 -OpLoopMerge %22 %23 DontUnroll -OpBranchConditional %21 %24 %22 -%24 = OpLabel -OpStore %18 %uint_1 -OpBranch %25 -%25 = OpLabel -%26 = OpLoad %uint %18 -%27 = OpINotEqual %bool %26 %uint_0 -OpLoopMerge %28 %29 DontUnroll -OpBranchConditional %27 %30 %28 -%30 = OpLabel -OpSelectionMerge %31 None -OpBranchConditional %true %32 %31 -%32 = OpLabel -OpStore %38 %true -OpBranch %28 -%31 = OpLabel -OpStore %18 %uint_1 -OpBranch %29 -%29 = OpLabel -OpBranch %25 -%28 = OpLabel -%40 = OpLoad %bool %38 -OpBranchConditional %40 %22 %39 -%39 = OpLabel -OpBranch %23 -%23 = OpLabel -%33 = OpLoad %uint %17 -%34 = OpIAdd %uint %33 %uint_1 -OpStore %17 %34 -OpBranch %19 -%22 = OpLabel -%43 = OpLoad %bool %38 -OpSelectionMerge %42 None -OpBranchConditional %43 %42 %41 -%41 = OpLabel -OpStore %38 %true -OpBranch %42 -%42 = OpLabel -OpBranch %35 -%35 = OpLabel -OpReturn -OpFunctionEnd -)"; - - SinglePassRunAndCheck(before, after, false, true); + SinglePassRunAndMatch(test, false); } TEST_F(MergeReturnPassTest, ReturnValueDecoration) { - const std::string before = - R"(OpCapability Linkage + const std::string test = + R"( +; CHECK: OpDecorate [[func:%\w+]] RelaxedPrecision +; CHECK: OpDecorate [[ret_val:%\w+]] RelaxedPrecision +; CHECK: [[func]] = OpFunction +; CHECK-NEXT: OpLabel +; CHECK-NOT: OpLabel +; CHECK: [[ret_val]] = OpVariable +OpCapability Linkage OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint GLCompute %11 "simple_shader" @@ -1095,6 +1008,7 @@ OpDecorate %7 RelaxedPrecision %13 = OpTypeFunction %12 %11 = OpFunction %12 None %13 %l1 = OpLabel +%fc = OpFunctionCall %1 %7 OpReturn OpFunctionEnd %7 = OpFunction %1 None %6 @@ -1107,53 +1021,353 @@ OpReturnValue %5 OpFunctionEnd )"; - const std::string after = - R"(OpCapability Linkage + SinglePassRunAndMatch(test, false); +} + +TEST_F(MergeReturnPassTest, + StructuredControlFlowWithNonTrivialUnreachableMerge) { + const std::string before = + R"( +OpCapability Addresses OpCapability Shader +OpCapability Linkage OpMemoryModel Logical GLSL450 -OpEntryPoint GLCompute %11 "simple_shader" -OpDecorate %7 RelaxedPrecision -OpDecorate %17 RelaxedPrecision -OpDecorate %18 RelaxedPrecision -%12 = OpTypeVoid -%1 = OpTypeInt 32 0 -%2 = OpTypeBool -%3 = OpConstantFalse %2 -%4 = OpConstant %1 0 -%5 = OpConstant %1 1 -%6 = OpTypeFunction %1 -%13 = OpTypeFunction %12 -%16 = OpTypePointer Function %1 -%19 = OpTypePointer Function %2 -%21 = OpConstantTrue %2 -%11 = OpFunction %12 None %13 -%14 = OpLabel -OpReturn -OpFunctionEnd -%7 = OpFunction %1 None %6 +OpEntryPoint GLCompute %6 "simple_shader" +%2 = OpTypeVoid +%3 = OpTypeBool +%4 = OpConstantFalse %3 +%1 = OpTypeFunction %2 +%6 = OpFunction %2 None %1 +%7 = OpLabel +OpSelectionMerge %10 None +OpBranchConditional %4 %8 %9 %8 = OpLabel -%20 = OpVariable %19 Function %3 -%17 = OpVariable %16 Function -OpBranchConditional %3 %9 %10 +OpReturn %9 = OpLabel -OpStore %20 %21 -OpStore %17 %4 -OpBranch %15 +OpReturn %10 = OpLabel -OpStore %20 %21 -OpStore %17 %5 -OpBranch %15 -%15 = OpLabel -%18 = OpLoad %1 %17 -OpReturnValue %18 +%11 = OpUndef %3 +OpUnreachable OpFunctionEnd )"; + std::vector messages = { + {SPV_MSG_ERROR, nullptr, 0, 0, + "Module contains unreachable blocks during merge return. Run dead " + "branch elimination before merge return."}}; + SetMessageConsumer(GetTestMessageConsumer(messages)); + SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); - SetDisassembleOptions(SPV_BINARY_TO_TEXT_OPTION_NO_HEADER); - SinglePassRunAndCheck(before, after, false, true); + auto result = SinglePassRunToBinary(before, false); + EXPECT_EQ(Pass::Status::Failure, std::get<1>(result)); + EXPECT_TRUE(messages.empty()); } +TEST_F(MergeReturnPassTest, + StructuredControlFlowWithNonTrivialUnreachableContinue) { + const std::string before = + R"( +OpCapability Addresses +OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +OpEntryPoint GLCompute %6 "simple_shader" +%2 = OpTypeVoid +%3 = OpTypeBool +%4 = OpConstantFalse %3 +%1 = OpTypeFunction %2 +%6 = OpFunction %2 None %1 +%7 = OpLabel +OpBranch %header +%header = OpLabel +OpLoopMerge %merge %continue None +OpBranchConditional %4 %8 %merge +%8 = OpLabel +OpReturn +%continue = OpLabel +%11 = OpUndef %3 +OpBranch %header +%merge = OpLabel +OpReturn +OpFunctionEnd +)"; + + std::vector messages = { + {SPV_MSG_ERROR, nullptr, 0, 0, + "Module contains unreachable blocks during merge return. Run dead " + "branch elimination before merge return."}}; + SetMessageConsumer(GetTestMessageConsumer(messages)); + + SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + auto result = SinglePassRunToBinary(before, false); + EXPECT_EQ(Pass::Status::Failure, std::get<1>(result)); + EXPECT_TRUE(messages.empty()); +} + +TEST_F(MergeReturnPassTest, StructuredControlFlowWithUnreachableBlock) { + const std::string before = + R"( +OpCapability Addresses +OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +OpEntryPoint GLCompute %6 "simple_shader" +%2 = OpTypeVoid +%3 = OpTypeBool +%4 = OpConstantFalse %3 +%1 = OpTypeFunction %2 +%6 = OpFunction %2 None %1 +%7 = OpLabel +OpBranch %header +%header = OpLabel +OpLoopMerge %merge %continue None +OpBranchConditional %4 %8 %merge +%8 = OpLabel +OpReturn +%continue = OpLabel +OpBranch %header +%merge = OpLabel +OpReturn +%unreachable = OpLabel +OpUnreachable +OpFunctionEnd +)"; + + std::vector messages = { + {SPV_MSG_ERROR, nullptr, 0, 0, + "Module contains unreachable blocks during merge return. Run dead " + "branch elimination before merge return."}}; + SetMessageConsumer(GetTestMessageConsumer(messages)); + + SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + auto result = SinglePassRunToBinary(before, false); + EXPECT_EQ(Pass::Status::Failure, std::get<1>(result)); + EXPECT_TRUE(messages.empty()); +} + +TEST_F(MergeReturnPassTest, StructuredControlFlowDontChangeEntryPhi) { + const std::string before = + R"( +; CHECK: OpFunction %void +; CHECK: OpLabel +; CHECK: OpLabel +; CHECK: [[pre_header:%\w+]] = OpLabel +; CHECK: [[header:%\w+]] = OpLabel +; CHECK-NEXT: OpPhi %bool {{%\w+}} [[pre_header]] [[iv:%\w+]] [[continue:%\w+]] +; CHECK-NEXT: OpLoopMerge [[merge:%\w+]] [[continue]] +; CHECK: [[continue]] = OpLabel +; CHECK-NEXT: [[iv]] = Op +; CHECK: [[merge]] = OpLabel + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Vertex %1 "main" + %void = OpTypeVoid + %bool = OpTypeBool + %4 = OpTypeFunction %void + %1 = OpFunction %void None %4 + %5 = OpLabel + %6 = OpUndef %bool + OpBranch %7 + %7 = OpLabel + %8 = OpPhi %bool %6 %5 %9 %10 + OpLoopMerge %11 %10 None + OpBranch %12 + %12 = OpLabel + %13 = OpUndef %bool + OpSelectionMerge %10 DontFlatten + OpBranchConditional %13 %10 %14 + %14 = OpLabel + OpReturn + %10 = OpLabel + %9 = OpUndef %bool + OpBranchConditional %13 %7 %11 + %11 = OpLabel + OpReturn + OpFunctionEnd + +)"; + + SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + SinglePassRunAndMatch(before, false); +} + +TEST_F(MergeReturnPassTest, StructuredControlFlowPartialReplacePhi) { + const std::string before = + R"( +; CHECK: OpFunction %void +; CHECK: OpLabel +; CHECK: OpLabel +; CHECK: [[pre_header:%\w+]] = OpLabel +; CHECK: [[header:%\w+]] = OpLabel +; CHECK-NEXT: OpPhi +; CHECK-NEXT: OpLoopMerge [[merge:%\w+]] +; CHECK: OpLabel +; CHECK: [[old_ret_block:%\w+]] = OpLabel +; CHECK: [[bb:%\w+]] = OpLabel +; CHECK-NEXT: [[val:%\w+]] = OpUndef %bool +; CHECK: [[merge]] = OpLabel +; CHECK-NEXT: [[phi1:%\w+]] = OpPhi %bool [[val]] [[bb]] {{%\w+}} [[old_ret_block]] +; CHECK: OpBranchConditional {{%\w+}} {{%\w+}} [[bb2:%\w+]] +; CHECK: [[bb2]] = OpLabel +; CHECK: OpBranch [[header2:%\w+]] +; CHECK: [[header2]] = OpLabel +; CHECK-NEXT: [[phi2:%\w+]] = OpPhi %bool [[phi1]] [[continue2:%\w+]] [[phi1]] [[bb2]] +; CHECK-NEXT: OpLoopMerge {{%\w+}} [[continue2]] +; CHECK: [[continue2]] = OpLabel +; CHECK-NEXT: OpBranch [[header2]] + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Vertex %1 "main" + %void = OpTypeVoid + %bool = OpTypeBool + %4 = OpTypeFunction %void + %1 = OpFunction %void None %4 + %5 = OpLabel + %6 = OpUndef %bool + OpBranch %7 + %7 = OpLabel + %8 = OpPhi %bool %6 %5 %9 %10 + OpLoopMerge %11 %10 None + OpBranch %12 + %12 = OpLabel + %13 = OpUndef %bool + OpSelectionMerge %10 DontFlatten + OpBranchConditional %13 %10 %14 + %14 = OpLabel + OpReturn + %10 = OpLabel + %9 = OpUndef %bool + OpBranchConditional %13 %7 %11 + %11 = OpLabel + %phi = OpPhi %bool %9 %10 %9 %cont + OpLoopMerge %ret %cont None + OpBranch %bb + %bb = OpLabel + OpBranchConditional %13 %ret %cont + %cont = OpLabel + OpBranch %11 + %ret = OpLabel + OpReturn + OpFunctionEnd +)"; + + SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + SinglePassRunAndMatch(before, false); +} + +TEST_F(MergeReturnPassTest, GeneratePhiInOuterLoop) { + const std::string before = + R"( + ; CHECK: OpLoopMerge + ; CHECK: OpLoopMerge [[merge:%\w+]] [[continue:%\w+]] + ; CHECK: [[continue]] = OpLabel + ; CHECK-NEXT: [[undef:%\w+]] = OpUndef + ; CHECK: [[merge]] = OpLabel + ; CHECK-NEXT: [[phi:%\w+]] = OpPhi %bool [[undef]] [[continue]] {{%\w+}} {{%\w+}} + ; CHECK: OpCopyObject %bool [[phi]] + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + %void = OpTypeVoid + %3 = OpTypeFunction %void + %bool = OpTypeBool + %8 = OpTypeFunction %bool + %false = OpConstantFalse %bool + %4 = OpFunction %void None %3 + %5 = OpLabel + %63 = OpFunctionCall %bool %9 + OpReturn + OpFunctionEnd + %9 = OpFunction %bool None %8 + %10 = OpLabel + OpBranch %31 + %31 = OpLabel + OpLoopMerge %33 %34 None + OpBranch %32 + %32 = OpLabel + OpSelectionMerge %34 None + OpBranchConditional %false %46 %34 + %46 = OpLabel + OpLoopMerge %51 %52 None + OpBranch %53 + %53 = OpLabel + OpBranchConditional %false %50 %51 + %50 = OpLabel + OpReturnValue %false + %52 = OpLabel + OpBranch %46 + %51 = OpLabel + OpBranch %34 + %34 = OpLabel + %64 = OpUndef %bool + OpBranchConditional %false %31 %33 + %33 = OpLabel + OpBranch %28 + %28 = OpLabel + %60 = OpCopyObject %bool %64 + OpBranch %17 + %17 = OpLabel + OpReturnValue %false + OpFunctionEnd +)"; + + SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + SinglePassRunAndMatch(before, false); +} + +TEST_F(MergeReturnPassTest, InnerLoopMergeIsOuterLoopContinue) { + const std::string before = + R"( + ; CHECK: OpLoopMerge + ; CHECK-NEXT: OpBranch [[bb1:%\w+]] + ; CHECK: [[bb1]] = OpLabel + ; CHECK-NEXT: OpBranch [[outer_loop_header:%\w+]] + ; CHECK: [[outer_loop_header]] = OpLabel + ; CHECK-NEXT: OpLoopMerge [[outer_loop_merge:%\w+]] [[outer_loop_continue:%\w+]] None + ; CHECK: [[outer_loop_continue]] = OpLabel + ; CHECK-NEXT: OpBranch [[outer_loop_header]] + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %2 "main" + OpExecutionMode %2 OriginUpperLeft + OpSource ESSL 310 + %void = OpTypeVoid + %4 = OpTypeFunction %void + %bool = OpTypeBool + %6 = OpTypeFunction %bool + %true = OpConstantTrue %bool + %2 = OpFunction %void None %4 + %8 = OpLabel + %9 = OpFunctionCall %bool %10 + OpReturn + OpFunctionEnd + %10 = OpFunction %bool None %6 + %11 = OpLabel + OpBranch %12 + %12 = OpLabel + OpLoopMerge %13 %14 None + OpBranchConditional %true %15 %13 + %15 = OpLabel + OpLoopMerge %14 %16 None + OpBranchConditional %true %17 %14 + %17 = OpLabel + OpReturnValue %true + %16 = OpLabel + OpBranch %15 + %14 = OpLabel + OpBranch %12 + %13 = OpLabel + OpReturnValue %true + OpFunctionEnd +)"; + + SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + SinglePassRunAndMatch(before, false); +} } // namespace } // namespace opt } // namespace spvtools diff --git a/3rdparty/spirv-tools/test/opt/pass_test.cpp b/3rdparty/spirv-tools/test/opt/pass_test.cpp deleted file mode 100644 index bce05b679..000000000 --- a/3rdparty/spirv-tools/test/opt/pass_test.cpp +++ /dev/null @@ -1,242 +0,0 @@ -// Copyright (c) 2017 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#include -#include -#include - -#include "gmock/gmock.h" -#include "source/opt/pass.h" -#include "test/opt/assembly_builder.h" -#include "test/opt/pass_fixture.h" -#include "test/opt/pass_utils.h" - -namespace spvtools { -namespace opt { -namespace { - -class DummyPass : public Pass { - public: - const char* name() const override { return "dummy-pass"; } - Status Process() override { return Status::SuccessWithoutChange; } -}; - -using ::testing::UnorderedElementsAre; -using PassClassTest = PassTest<::testing::Test>; - -TEST_F(PassClassTest, BasicVisitFromEntryPoint) { - // Make sure we visit the entry point, and the function it calls. - // Do not visit Dead or Exported. - const std::string text = R"( - OpCapability Shader - OpMemoryModel Logical GLSL450 - OpEntryPoint Fragment %10 "main" - OpName %10 "main" - OpName %Dead "Dead" - OpName %11 "Constant" - OpName %ExportedFunc "ExportedFunc" - OpDecorate %ExportedFunc LinkageAttributes "ExportedFunc" Export - %void = OpTypeVoid - %6 = OpTypeFunction %void - %10 = OpFunction %void None %6 - %14 = OpLabel - %15 = OpFunctionCall %void %11 - %16 = OpFunctionCall %void %11 - OpReturn - OpFunctionEnd - %11 = OpFunction %void None %6 - %18 = OpLabel - OpReturn - OpFunctionEnd - %Dead = OpFunction %void None %6 - %19 = OpLabel - OpReturn - OpFunctionEnd -%ExportedFunc = OpFunction %void None %7 - %20 = OpLabel - %21 = OpFunctionCall %void %11 - OpReturn - OpFunctionEnd -)"; - // clang-format on - - std::unique_ptr localContext = - BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, - SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); - EXPECT_NE(nullptr, localContext) << "Assembling failed for shader:\n" - << text << std::endl; - DummyPass testPass; - std::vector processed; - Pass::ProcessFunction mark_visited = [&processed](Function* fp) { - processed.push_back(fp->result_id()); - return false; - }; - testPass.ProcessEntryPointCallTree(mark_visited, localContext->module()); - EXPECT_THAT(processed, UnorderedElementsAre(10, 11)); -} - -TEST_F(PassClassTest, BasicVisitReachable) { - // Make sure we visit the entry point, exported function, and the function - // they call. Do not visit Dead. - const std::string text = R"( - OpCapability Shader - OpMemoryModel Logical GLSL450 - OpEntryPoint Fragment %10 "main" - OpName %10 "main" - OpName %Dead "Dead" - OpName %11 "Constant" - OpName %12 "ExportedFunc" - OpName %13 "Constant2" - OpDecorate %12 LinkageAttributes "ExportedFunc" Export - %void = OpTypeVoid - %6 = OpTypeFunction %void - %10 = OpFunction %void None %6 - %14 = OpLabel - %15 = OpFunctionCall %void %11 - %16 = OpFunctionCall %void %11 - OpReturn - OpFunctionEnd - %11 = OpFunction %void None %6 - %18 = OpLabel - OpReturn - OpFunctionEnd - %Dead = OpFunction %void None %6 - %19 = OpLabel - OpReturn - OpFunctionEnd - %12 = OpFunction %void None %9 - %20 = OpLabel - %21 = OpFunctionCall %void %13 - OpReturn - OpFunctionEnd - %13 = OpFunction %void None %6 - %22 = OpLabel - OpReturn - OpFunctionEnd -)"; - // clang-format on - - std::unique_ptr localContext = - BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, - SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); - EXPECT_NE(nullptr, localContext) << "Assembling failed for shader:\n" - << text << std::endl; - - DummyPass testPass; - std::vector processed; - Pass::ProcessFunction mark_visited = [&processed](Function* fp) { - processed.push_back(fp->result_id()); - return false; - }; - testPass.ProcessReachableCallTree(mark_visited, localContext.get()); - EXPECT_THAT(processed, UnorderedElementsAre(10, 11, 12, 13)); -} - -TEST_F(PassClassTest, BasicVisitOnlyOnce) { - // Make sure we visit %11 only once, even if it is called from two different - // functions. - const std::string text = R"( - OpCapability Shader - OpMemoryModel Logical GLSL450 - OpEntryPoint Fragment %10 "main" %gl_FragColor - OpName %10 "main" - OpName %Dead "Dead" - OpName %11 "Constant" - OpName %12 "ExportedFunc" - OpDecorate %12 LinkageAttributes "ExportedFunc" Export - %void = OpTypeVoid - %6 = OpTypeFunction %void - %10 = OpFunction %void None %6 - %14 = OpLabel - %15 = OpFunctionCall %void %11 - %16 = OpFunctionCall %void %12 - OpReturn - OpFunctionEnd - %11 = OpFunction %void None %6 - %18 = OpLabel - %19 = OpFunctionCall %void %12 - OpReturn - OpFunctionEnd - %Dead = OpFunction %void None %6 - %20 = OpLabel - OpReturn - OpFunctionEnd - %12 = OpFunction %void None %9 - %21 = OpLabel - OpReturn - OpFunctionEnd -)"; - // clang-format on - - std::unique_ptr localContext = - BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, - SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); - EXPECT_NE(nullptr, localContext) << "Assembling failed for shader:\n" - << text << std::endl; - - DummyPass testPass; - std::vector processed; - Pass::ProcessFunction mark_visited = [&processed](Function* fp) { - processed.push_back(fp->result_id()); - return false; - }; - testPass.ProcessReachableCallTree(mark_visited, localContext.get()); - EXPECT_THAT(processed, UnorderedElementsAre(10, 11, 12)); -} - -TEST_F(PassClassTest, BasicDontVisitExportedVariable) { - // Make sure we only visit functions and not exported variables. - const std::string text = R"( - OpCapability Shader - OpMemoryModel Logical GLSL450 - OpEntryPoint Fragment %10 "main" %gl_FragColor - OpExecutionMode %10 OriginUpperLeft - OpSource GLSL 150 - OpName %10 "main" - OpName %Dead "Dead" - OpName %11 "Constant" - OpName %12 "export_var" - OpDecorate %12 LinkageAttributes "export_var" Export - %void = OpTypeVoid - %6 = OpTypeFunction %void - %float = OpTypeFloat 32 - %float_1 = OpConstant %float 1 - %12 = OpVariable %float Output - %10 = OpFunction %void None %6 - %14 = OpLabel - OpStore %12 %float_1 - OpReturn - OpFunctionEnd -)"; - // clang-format on - - std::unique_ptr localContext = - BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, - SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); - EXPECT_NE(nullptr, localContext) << "Assembling failed for shader:\n" - << text << std::endl; - - DummyPass testPass; - std::vector processed; - Pass::ProcessFunction mark_visited = [&processed](Function* fp) { - processed.push_back(fp->result_id()); - return false; - }; - testPass.ProcessReachableCallTree(mark_visited, localContext.get()); - EXPECT_THAT(processed, UnorderedElementsAre(10)); -} - -} // namespace -} // namespace opt -} // namespace spvtools diff --git a/3rdparty/spirv-tools/test/opt/pass_utils.cpp b/3rdparty/spirv-tools/test/opt/pass_utils.cpp index ceb999610..4709d0fd1 100644 --- a/3rdparty/spirv-tools/test/opt/pass_utils.cpp +++ b/3rdparty/spirv-tools/test/opt/pass_utils.cpp @@ -35,6 +35,26 @@ const char* kDebugOpcodes[] = { } // anonymous namespace +MessageConsumer GetTestMessageConsumer( + std::vector& expected_messages) { + return [&expected_messages](spv_message_level_t level, const char* source, + const spv_position_t& position, + const char* message) { + EXPECT_TRUE(!expected_messages.empty()); + if (expected_messages.empty()) { + return; + } + + EXPECT_EQ(expected_messages[0].level, level); + EXPECT_EQ(expected_messages[0].line_number, position.line); + EXPECT_EQ(expected_messages[0].column_number, position.column); + EXPECT_STREQ(expected_messages[0].source_file, source); + EXPECT_STREQ(expected_messages[0].message, message); + + expected_messages.erase(expected_messages.begin()); + }; +} + bool FindAndReplace(std::string* process_str, const std::string find_str, const std::string replace_str) { if (process_str->empty() || find_str.empty()) { diff --git a/3rdparty/spirv-tools/test/opt/pass_utils.h b/3rdparty/spirv-tools/test/opt/pass_utils.h index 37406842a..8968f8a64 100644 --- a/3rdparty/spirv-tools/test/opt/pass_utils.h +++ b/3rdparty/spirv-tools/test/opt/pass_utils.h @@ -21,9 +21,25 @@ #include #include +#include "gtest/gtest.h" +#include "include/spirv-tools/libspirv.h" +#include "include/spirv-tools/libspirv.hpp" + namespace spvtools { namespace opt { +struct Message { + spv_message_level_t level; + const char* source_file; + uint32_t line_number; + uint32_t column_number; + const char* message; +}; + +// Return a message consumer that can be used to check that the message produced +// are the messages in |expexted_messages|, and in the same order. +MessageConsumer GetTestMessageConsumer(std::vector& expected_messages); + // In-place substring replacement. Finds the |find_str| in the |process_str| // and replaces the found substring with |replace_str|. Returns true if at // least one replacement is done successfully, returns false otherwise. The diff --git a/3rdparty/spirv-tools/test/opt/pch_test_opt.cpp b/3rdparty/spirv-tools/test/opt/pch_test_opt.cpp new file mode 100644 index 000000000..f15812913 --- /dev/null +++ b/3rdparty/spirv-tools/test/opt/pch_test_opt.cpp @@ -0,0 +1,15 @@ +// Copyright (c) 2018 The Khronos Group Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "pch_test_opt.h" diff --git a/3rdparty/spirv-tools/test/opt/pch_test_opt.h b/3rdparty/spirv-tools/test/opt/pch_test_opt.h new file mode 100644 index 000000000..4e8106fbf --- /dev/null +++ b/3rdparty/spirv-tools/test/opt/pch_test_opt.h @@ -0,0 +1,25 @@ +// Copyright (c) 2018 The Khronos Group Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "gmock/gmock.h" +#include "source/opt/iterator.h" +#include "source/opt/loop_dependence.h" +#include "source/opt/loop_descriptor.h" +#include "source/opt/pass.h" +#include "source/opt/scalar_analysis.h" +#include "source/opt/tree_iterator.h" +#include "test/opt/assembly_builder.h" +#include "test/opt/function_utils.h" +#include "test/opt/pass_fixture.h" +#include "test/opt/pass_utils.h" diff --git a/3rdparty/spirv-tools/test/opt/private_to_local_test.cpp b/3rdparty/spirv-tools/test/opt/private_to_local_test.cpp index d7eb37e51..3ec74fae6 100644 --- a/3rdparty/spirv-tools/test/opt/private_to_local_test.cpp +++ b/3rdparty/spirv-tools/test/opt/private_to_local_test.cpp @@ -29,7 +29,6 @@ using ::testing::HasSubstr; using ::testing::MatchesRegex; using PrivateToLocalTest = PassTest<::testing::Test>; -#ifdef SPIRV_EFFCEE TEST_F(PrivateToLocalTest, ChangeToLocal) { // Change the private variable to a local, and change the types accordingly. const std::string text = R"( @@ -309,8 +308,6 @@ TEST_F(PrivateToLocalTest, CreatePointerToAmbiguousStruct2) { SinglePassRunAndMatch(text, false); } -#endif - } // namespace } // namespace opt } // namespace spvtools diff --git a/3rdparty/spirv-tools/test/opt/process_lines_test.cpp b/3rdparty/spirv-tools/test/opt/process_lines_test.cpp new file mode 100644 index 000000000..33ad4be89 --- /dev/null +++ b/3rdparty/spirv-tools/test/opt/process_lines_test.cpp @@ -0,0 +1,695 @@ +// Copyright (c) 2017 Valve Corporation +// Copyright (c) 2017 LunarG Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#include +#include + +#include "test/opt/pass_fixture.h" +#include "test/opt/pass_utils.h" + +namespace spvtools { +namespace opt { +namespace { + +using ProcessLinesTest = PassTest<::testing::Test>; + +TEST_F(ProcessLinesTest, SimplePropagation) { + // Texture2D g_tColor[128]; + // + // layout(push_constant) cbuffer PerViewConstantBuffer_t + // { + // uint g_nDataIdx; + // uint g_nDataIdx2; + // bool g_B; + // }; + // + // SamplerState g_sAniso; + // + // struct PS_INPUT + // { + // float2 vTextureCoords : TEXCOORD2; + // }; + // + // struct PS_OUTPUT + // { + // float4 vColor : SV_Target0; + // }; + // + // PS_OUTPUT MainPs(PS_INPUT i) + // { + // PS_OUTPUT ps_output; + // + // uint u; + // if (g_B) + // u = g_nDataIdx; + // else + // u = g_nDataIdx2; + // ps_output.vColor = g_tColor[u].Sample(g_sAniso, i.vTextureCoords.xy); + // return ps_output; + // } + + const std::string predefs = + R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %MainPs "MainPs" %i_vTextureCoords %_entryPointOutput_vColor +OpExecutionMode %MainPs OriginUpperLeft +%5 = OpString "foo.frag" +OpSource HLSL 500 +OpName %MainPs "MainPs" +OpName %PS_INPUT "PS_INPUT" +OpMemberName %PS_INPUT 0 "vTextureCoords" +OpName %PS_OUTPUT "PS_OUTPUT" +OpMemberName %PS_OUTPUT 0 "vColor" +OpName %_MainPs_struct_PS_INPUT_vf21_ "@MainPs(struct-PS_INPUT-vf21;" +OpName %i "i" +OpName %PerViewConstantBuffer_t "PerViewConstantBuffer_t" +OpMemberName %PerViewConstantBuffer_t 0 "g_nDataIdx" +OpMemberName %PerViewConstantBuffer_t 1 "g_nDataIdx2" +OpMemberName %PerViewConstantBuffer_t 2 "g_B" +OpName %_ "" +OpName %u "u" +OpName %ps_output "ps_output" +OpName %g_tColor "g_tColor" +OpName %g_sAniso "g_sAniso" +OpName %i_0 "i" +OpName %i_vTextureCoords "i.vTextureCoords" +OpName %_entryPointOutput_vColor "@entryPointOutput.vColor" +OpName %param "param" +OpMemberDecorate %PerViewConstantBuffer_t 0 Offset 0 +OpMemberDecorate %PerViewConstantBuffer_t 1 Offset 4 +OpMemberDecorate %PerViewConstantBuffer_t 2 Offset 8 +OpDecorate %PerViewConstantBuffer_t Block +OpDecorate %g_tColor DescriptorSet 0 +OpDecorate %g_sAniso DescriptorSet 0 +OpDecorate %i_vTextureCoords Location 0 +OpDecorate %_entryPointOutput_vColor Location 0 +)"; + + const std::string before = + R"(%void = OpTypeVoid +%19 = OpTypeFunction %void +%float = OpTypeFloat 32 +%v2float = OpTypeVector %float 2 +%PS_INPUT = OpTypeStruct %v2float +%_ptr_Function_PS_INPUT = OpTypePointer Function %PS_INPUT +%v4float = OpTypeVector %float 4 +%PS_OUTPUT = OpTypeStruct %v4float +%24 = OpTypeFunction %PS_OUTPUT %_ptr_Function_PS_INPUT +%uint = OpTypeInt 32 0 +%PerViewConstantBuffer_t = OpTypeStruct %uint %uint %uint +%_ptr_PushConstant_PerViewConstantBuffer_t = OpTypePointer PushConstant %PerViewConstantBuffer_t +%_ = OpVariable %_ptr_PushConstant_PerViewConstantBuffer_t PushConstant +%int = OpTypeInt 32 1 +%int_2 = OpConstant %int 2 +%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint +%bool = OpTypeBool +%uint_0 = OpConstant %uint 0 +%_ptr_Function_uint = OpTypePointer Function %uint +%int_0 = OpConstant %int 0 +%int_1 = OpConstant %int 1 +%_ptr_Function_PS_OUTPUT = OpTypePointer Function %PS_OUTPUT +%36 = OpTypeImage %float 2D 0 0 0 1 Unknown +%uint_128 = OpConstant %uint 128 +%_arr_36_uint_128 = OpTypeArray %36 %uint_128 +%_ptr_UniformConstant__arr_36_uint_128 = OpTypePointer UniformConstant %_arr_36_uint_128 +%g_tColor = OpVariable %_ptr_UniformConstant__arr_36_uint_128 UniformConstant +%_ptr_UniformConstant_36 = OpTypePointer UniformConstant %36 +%41 = OpTypeSampler +%_ptr_UniformConstant_41 = OpTypePointer UniformConstant %41 +%g_sAniso = OpVariable %_ptr_UniformConstant_41 UniformConstant +%43 = OpTypeSampledImage %36 +%_ptr_Function_v2float = OpTypePointer Function %v2float +%_ptr_Function_v4float = OpTypePointer Function %v4float +%_ptr_Input_v2float = OpTypePointer Input %v2float +%i_vTextureCoords = OpVariable %_ptr_Input_v2float Input +%_ptr_Output_v4float = OpTypePointer Output %v4float +%_entryPointOutput_vColor = OpVariable %_ptr_Output_v4float Output +%MainPs = OpFunction %void None %19 +%48 = OpLabel +%i_0 = OpVariable %_ptr_Function_PS_INPUT Function +%param = OpVariable %_ptr_Function_PS_INPUT Function +OpLine %5 23 0 +%49 = OpLoad %v2float %i_vTextureCoords +%50 = OpAccessChain %_ptr_Function_v2float %i_0 %int_0 +OpStore %50 %49 +%51 = OpLoad %PS_INPUT %i_0 +OpStore %param %51 +%52 = OpFunctionCall %PS_OUTPUT %_MainPs_struct_PS_INPUT_vf21_ %param +%53 = OpCompositeExtract %v4float %52 0 +OpStore %_entryPointOutput_vColor %53 +OpReturn +OpFunctionEnd +%_MainPs_struct_PS_INPUT_vf21_ = OpFunction %PS_OUTPUT None %24 +%i = OpFunctionParameter %_ptr_Function_PS_INPUT +%54 = OpLabel +%u = OpVariable %_ptr_Function_uint Function +%ps_output = OpVariable %_ptr_Function_PS_OUTPUT Function +OpLine %5 27 0 +%55 = OpAccessChain %_ptr_PushConstant_uint %_ %int_2 +%56 = OpLoad %uint %55 +%57 = OpINotEqual %bool %56 %uint_0 +OpSelectionMerge %58 None +OpBranchConditional %57 %59 %60 +%59 = OpLabel +OpLine %5 28 0 +%61 = OpAccessChain %_ptr_PushConstant_uint %_ %int_0 +%62 = OpLoad %uint %61 +OpStore %u %62 +OpBranch %58 +%60 = OpLabel +OpLine %5 30 0 +%63 = OpAccessChain %_ptr_PushConstant_uint %_ %int_1 +%64 = OpLoad %uint %63 +OpStore %u %64 +OpBranch %58 +%58 = OpLabel +OpLine %5 31 0 +%65 = OpLoad %uint %u +%66 = OpAccessChain %_ptr_UniformConstant_36 %g_tColor %65 +%67 = OpLoad %36 %66 +%68 = OpLoad %41 %g_sAniso +%69 = OpSampledImage %43 %67 %68 +%70 = OpAccessChain %_ptr_Function_v2float %i %int_0 +%71 = OpLoad %v2float %70 +%72 = OpImageSampleImplicitLod %v4float %69 %71 +%73 = OpAccessChain %_ptr_Function_v4float %ps_output %int_0 +OpStore %73 %72 +OpLine %5 32 0 +%74 = OpLoad %PS_OUTPUT %ps_output +OpReturnValue %74 +OpFunctionEnd +)"; + + const std::string after = + R"(OpNoLine +%void = OpTypeVoid +OpNoLine +%19 = OpTypeFunction %void +OpNoLine +%float = OpTypeFloat 32 +OpNoLine +%v2float = OpTypeVector %float 2 +OpNoLine +%PS_INPUT = OpTypeStruct %v2float +OpNoLine +%_ptr_Function_PS_INPUT = OpTypePointer Function %PS_INPUT +OpNoLine +%v4float = OpTypeVector %float 4 +OpNoLine +%PS_OUTPUT = OpTypeStruct %v4float +OpNoLine +%24 = OpTypeFunction %PS_OUTPUT %_ptr_Function_PS_INPUT +OpNoLine +%uint = OpTypeInt 32 0 +OpNoLine +%PerViewConstantBuffer_t = OpTypeStruct %uint %uint %uint +OpNoLine +%_ptr_PushConstant_PerViewConstantBuffer_t = OpTypePointer PushConstant %PerViewConstantBuffer_t +OpNoLine +%_ = OpVariable %_ptr_PushConstant_PerViewConstantBuffer_t PushConstant +OpNoLine +%int = OpTypeInt 32 1 +OpNoLine +%int_2 = OpConstant %int 2 +OpNoLine +%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint +OpNoLine +%bool = OpTypeBool +OpNoLine +%uint_0 = OpConstant %uint 0 +OpNoLine +%_ptr_Function_uint = OpTypePointer Function %uint +OpNoLine +%int_0 = OpConstant %int 0 +OpNoLine +%int_1 = OpConstant %int 1 +OpNoLine +%_ptr_Function_PS_OUTPUT = OpTypePointer Function %PS_OUTPUT +OpNoLine +%36 = OpTypeImage %float 2D 0 0 0 1 Unknown +OpNoLine +%uint_128 = OpConstant %uint 128 +OpNoLine +%_arr_36_uint_128 = OpTypeArray %36 %uint_128 +OpNoLine +%_ptr_UniformConstant__arr_36_uint_128 = OpTypePointer UniformConstant %_arr_36_uint_128 +OpNoLine +%g_tColor = OpVariable %_ptr_UniformConstant__arr_36_uint_128 UniformConstant +OpNoLine +%_ptr_UniformConstant_36 = OpTypePointer UniformConstant %36 +OpNoLine +%41 = OpTypeSampler +OpNoLine +%_ptr_UniformConstant_41 = OpTypePointer UniformConstant %41 +OpNoLine +%g_sAniso = OpVariable %_ptr_UniformConstant_41 UniformConstant +OpNoLine +%43 = OpTypeSampledImage %36 +OpNoLine +%_ptr_Function_v2float = OpTypePointer Function %v2float +OpNoLine +%_ptr_Function_v4float = OpTypePointer Function %v4float +OpNoLine +%_ptr_Input_v2float = OpTypePointer Input %v2float +OpNoLine +%i_vTextureCoords = OpVariable %_ptr_Input_v2float Input +OpNoLine +%_ptr_Output_v4float = OpTypePointer Output %v4float +OpNoLine +%_entryPointOutput_vColor = OpVariable %_ptr_Output_v4float Output +OpNoLine +%MainPs = OpFunction %void None %19 +OpNoLine +%48 = OpLabel +OpNoLine +%i_0 = OpVariable %_ptr_Function_PS_INPUT Function +OpNoLine +%param = OpVariable %_ptr_Function_PS_INPUT Function +OpLine %5 23 0 +%49 = OpLoad %v2float %i_vTextureCoords +OpLine %5 23 0 +%50 = OpAccessChain %_ptr_Function_v2float %i_0 %int_0 +OpLine %5 23 0 +OpStore %50 %49 +OpLine %5 23 0 +%51 = OpLoad %PS_INPUT %i_0 +OpLine %5 23 0 +OpStore %param %51 +OpLine %5 23 0 +%52 = OpFunctionCall %PS_OUTPUT %_MainPs_struct_PS_INPUT_vf21_ %param +OpLine %5 23 0 +%53 = OpCompositeExtract %v4float %52 0 +OpLine %5 23 0 +OpStore %_entryPointOutput_vColor %53 +OpLine %5 23 0 +OpReturn +OpNoLine +OpFunctionEnd +OpNoLine +%_MainPs_struct_PS_INPUT_vf21_ = OpFunction %PS_OUTPUT None %24 +OpNoLine +%i = OpFunctionParameter %_ptr_Function_PS_INPUT +OpNoLine +%54 = OpLabel +OpNoLine +%u = OpVariable %_ptr_Function_uint Function +OpNoLine +%ps_output = OpVariable %_ptr_Function_PS_OUTPUT Function +OpLine %5 27 0 +%55 = OpAccessChain %_ptr_PushConstant_uint %_ %int_2 +OpLine %5 27 0 +%56 = OpLoad %uint %55 +OpLine %5 27 0 +%57 = OpINotEqual %bool %56 %uint_0 +OpLine %5 27 0 +OpSelectionMerge %58 None +OpBranchConditional %57 %59 %60 +OpNoLine +%59 = OpLabel +OpLine %5 28 0 +%61 = OpAccessChain %_ptr_PushConstant_uint %_ %int_0 +OpLine %5 28 0 +%62 = OpLoad %uint %61 +OpLine %5 28 0 +OpStore %u %62 +OpLine %5 28 0 +OpBranch %58 +OpNoLine +%60 = OpLabel +OpLine %5 30 0 +%63 = OpAccessChain %_ptr_PushConstant_uint %_ %int_1 +OpLine %5 30 0 +%64 = OpLoad %uint %63 +OpLine %5 30 0 +OpStore %u %64 +OpLine %5 30 0 +OpBranch %58 +OpNoLine +%58 = OpLabel +OpLine %5 31 0 +%65 = OpLoad %uint %u +OpLine %5 31 0 +%66 = OpAccessChain %_ptr_UniformConstant_36 %g_tColor %65 +OpLine %5 31 0 +%67 = OpLoad %36 %66 +OpLine %5 31 0 +%68 = OpLoad %41 %g_sAniso +OpLine %5 31 0 +%69 = OpSampledImage %43 %67 %68 +OpLine %5 31 0 +%70 = OpAccessChain %_ptr_Function_v2float %i %int_0 +OpLine %5 31 0 +%71 = OpLoad %v2float %70 +OpLine %5 31 0 +%72 = OpImageSampleImplicitLod %v4float %69 %71 +OpLine %5 31 0 +%73 = OpAccessChain %_ptr_Function_v4float %ps_output %int_0 +OpLine %5 31 0 +OpStore %73 %72 +OpLine %5 32 0 +%74 = OpLoad %PS_OUTPUT %ps_output +OpLine %5 32 0 +OpReturnValue %74 +OpNoLine +OpFunctionEnd +)"; + + SinglePassRunAndCheck(predefs + before, predefs + after, + false, true, kLinesPropagateLines); +} + +TEST_F(ProcessLinesTest, SimpleElimination) { + // Previous test with before and after reversed + + const std::string predefs = + R"(OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %MainPs "MainPs" %i_vTextureCoords %_entryPointOutput_vColor +OpExecutionMode %MainPs OriginUpperLeft +%5 = OpString "foo.frag" +OpSource HLSL 500 +OpName %MainPs "MainPs" +OpName %PS_INPUT "PS_INPUT" +OpMemberName %PS_INPUT 0 "vTextureCoords" +OpName %PS_OUTPUT "PS_OUTPUT" +OpMemberName %PS_OUTPUT 0 "vColor" +OpName %_MainPs_struct_PS_INPUT_vf21_ "@MainPs(struct-PS_INPUT-vf21;" +OpName %i "i" +OpName %PerViewConstantBuffer_t "PerViewConstantBuffer_t" +OpMemberName %PerViewConstantBuffer_t 0 "g_nDataIdx" +OpMemberName %PerViewConstantBuffer_t 1 "g_nDataIdx2" +OpMemberName %PerViewConstantBuffer_t 2 "g_B" +OpName %_ "" +OpName %u "u" +OpName %ps_output "ps_output" +OpName %g_tColor "g_tColor" +OpName %g_sAniso "g_sAniso" +OpName %i_0 "i" +OpName %i_vTextureCoords "i.vTextureCoords" +OpName %_entryPointOutput_vColor "@entryPointOutput.vColor" +OpName %param "param" +OpMemberDecorate %PerViewConstantBuffer_t 0 Offset 0 +OpMemberDecorate %PerViewConstantBuffer_t 1 Offset 4 +OpMemberDecorate %PerViewConstantBuffer_t 2 Offset 8 +OpDecorate %PerViewConstantBuffer_t Block +OpDecorate %g_tColor DescriptorSet 0 +OpDecorate %g_sAniso DescriptorSet 0 +OpDecorate %i_vTextureCoords Location 0 +OpDecorate %_entryPointOutput_vColor Location 0 +)"; + + const std::string before = + R"(OpNoLine +%void = OpTypeVoid +OpNoLine +%19 = OpTypeFunction %void +OpNoLine +%float = OpTypeFloat 32 +OpNoLine +%v2float = OpTypeVector %float 2 +OpNoLine +%PS_INPUT = OpTypeStruct %v2float +OpNoLine +%_ptr_Function_PS_INPUT = OpTypePointer Function %PS_INPUT +OpNoLine +%v4float = OpTypeVector %float 4 +OpNoLine +%PS_OUTPUT = OpTypeStruct %v4float +OpNoLine +%24 = OpTypeFunction %PS_OUTPUT %_ptr_Function_PS_INPUT +OpNoLine +%uint = OpTypeInt 32 0 +OpNoLine +%PerViewConstantBuffer_t = OpTypeStruct %uint %uint %uint +OpNoLine +%_ptr_PushConstant_PerViewConstantBuffer_t = OpTypePointer PushConstant %PerViewConstantBuffer_t +OpNoLine +%_ = OpVariable %_ptr_PushConstant_PerViewConstantBuffer_t PushConstant +OpNoLine +%int = OpTypeInt 32 1 +OpNoLine +%int_2 = OpConstant %int 2 +OpNoLine +%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint +OpNoLine +%bool = OpTypeBool +OpNoLine +%uint_0 = OpConstant %uint 0 +OpNoLine +%_ptr_Function_uint = OpTypePointer Function %uint +OpNoLine +%int_0 = OpConstant %int 0 +OpNoLine +%int_1 = OpConstant %int 1 +OpNoLine +%_ptr_Function_PS_OUTPUT = OpTypePointer Function %PS_OUTPUT +OpNoLine +%36 = OpTypeImage %float 2D 0 0 0 1 Unknown +OpNoLine +%uint_128 = OpConstant %uint 128 +OpNoLine +%_arr_36_uint_128 = OpTypeArray %36 %uint_128 +OpNoLine +%_ptr_UniformConstant__arr_36_uint_128 = OpTypePointer UniformConstant %_arr_36_uint_128 +OpNoLine +%g_tColor = OpVariable %_ptr_UniformConstant__arr_36_uint_128 UniformConstant +OpNoLine +%_ptr_UniformConstant_36 = OpTypePointer UniformConstant %36 +OpNoLine +%41 = OpTypeSampler +OpNoLine +%_ptr_UniformConstant_41 = OpTypePointer UniformConstant %41 +OpNoLine +%g_sAniso = OpVariable %_ptr_UniformConstant_41 UniformConstant +OpNoLine +%43 = OpTypeSampledImage %36 +OpNoLine +%_ptr_Function_v2float = OpTypePointer Function %v2float +OpNoLine +%_ptr_Function_v4float = OpTypePointer Function %v4float +OpNoLine +%_ptr_Input_v2float = OpTypePointer Input %v2float +OpNoLine +%i_vTextureCoords = OpVariable %_ptr_Input_v2float Input +OpNoLine +%_ptr_Output_v4float = OpTypePointer Output %v4float +OpNoLine +%_entryPointOutput_vColor = OpVariable %_ptr_Output_v4float Output +OpNoLine +%MainPs = OpFunction %void None %19 +OpNoLine +%48 = OpLabel +OpNoLine +%i_0 = OpVariable %_ptr_Function_PS_INPUT Function +OpNoLine +%param = OpVariable %_ptr_Function_PS_INPUT Function +OpLine %5 23 0 +%49 = OpLoad %v2float %i_vTextureCoords +OpLine %5 23 0 +%50 = OpAccessChain %_ptr_Function_v2float %i_0 %int_0 +OpLine %5 23 0 +OpStore %50 %49 +OpLine %5 23 0 +%51 = OpLoad %PS_INPUT %i_0 +OpLine %5 23 0 +OpStore %param %51 +OpLine %5 23 0 +%52 = OpFunctionCall %PS_OUTPUT %_MainPs_struct_PS_INPUT_vf21_ %param +OpLine %5 23 0 +%53 = OpCompositeExtract %v4float %52 0 +OpLine %5 23 0 +OpStore %_entryPointOutput_vColor %53 +OpLine %5 23 0 +OpReturn +OpNoLine +OpFunctionEnd +OpNoLine +%_MainPs_struct_PS_INPUT_vf21_ = OpFunction %PS_OUTPUT None %24 +OpNoLine +%i = OpFunctionParameter %_ptr_Function_PS_INPUT +OpNoLine +%54 = OpLabel +OpNoLine +%u = OpVariable %_ptr_Function_uint Function +OpNoLine +%ps_output = OpVariable %_ptr_Function_PS_OUTPUT Function +OpLine %5 27 0 +%55 = OpAccessChain %_ptr_PushConstant_uint %_ %int_2 +OpLine %5 27 0 +%56 = OpLoad %uint %55 +OpLine %5 27 0 +%57 = OpINotEqual %bool %56 %uint_0 +OpLine %5 27 0 +OpSelectionMerge %58 None +OpBranchConditional %57 %59 %60 +OpNoLine +%59 = OpLabel +OpLine %5 28 0 +%61 = OpAccessChain %_ptr_PushConstant_uint %_ %int_0 +OpLine %5 28 0 +%62 = OpLoad %uint %61 +OpLine %5 28 0 +OpStore %u %62 +OpLine %5 28 0 +OpBranch %58 +OpNoLine +%60 = OpLabel +OpLine %5 30 0 +%63 = OpAccessChain %_ptr_PushConstant_uint %_ %int_1 +OpLine %5 30 0 +%64 = OpLoad %uint %63 +OpLine %5 30 0 +OpStore %u %64 +OpLine %5 30 0 +OpBranch %58 +OpNoLine +%58 = OpLabel +OpLine %5 31 0 +%65 = OpLoad %uint %u +OpLine %5 31 0 +%66 = OpAccessChain %_ptr_UniformConstant_36 %g_tColor %65 +OpLine %5 31 0 +%67 = OpLoad %36 %66 +OpLine %5 31 0 +%68 = OpLoad %41 %g_sAniso +OpLine %5 31 0 +%69 = OpSampledImage %43 %67 %68 +OpLine %5 31 0 +%70 = OpAccessChain %_ptr_Function_v2float %i %int_0 +OpLine %5 31 0 +%71 = OpLoad %v2float %70 +OpLine %5 31 0 +%72 = OpImageSampleImplicitLod %v4float %69 %71 +OpLine %5 31 0 +%73 = OpAccessChain %_ptr_Function_v4float %ps_output %int_0 +OpLine %5 31 0 +OpStore %73 %72 +OpLine %5 32 0 +%74 = OpLoad %PS_OUTPUT %ps_output +OpLine %5 32 0 +OpReturnValue %74 +OpNoLine +OpFunctionEnd +)"; + + const std::string after = + R"(%void = OpTypeVoid +%19 = OpTypeFunction %void +%float = OpTypeFloat 32 +%v2float = OpTypeVector %float 2 +%PS_INPUT = OpTypeStruct %v2float +%_ptr_Function_PS_INPUT = OpTypePointer Function %PS_INPUT +%v4float = OpTypeVector %float 4 +%PS_OUTPUT = OpTypeStruct %v4float +%24 = OpTypeFunction %PS_OUTPUT %_ptr_Function_PS_INPUT +%uint = OpTypeInt 32 0 +%PerViewConstantBuffer_t = OpTypeStruct %uint %uint %uint +%_ptr_PushConstant_PerViewConstantBuffer_t = OpTypePointer PushConstant %PerViewConstantBuffer_t +%_ = OpVariable %_ptr_PushConstant_PerViewConstantBuffer_t PushConstant +%int = OpTypeInt 32 1 +%int_2 = OpConstant %int 2 +%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint +%bool = OpTypeBool +%uint_0 = OpConstant %uint 0 +%_ptr_Function_uint = OpTypePointer Function %uint +%int_0 = OpConstant %int 0 +%int_1 = OpConstant %int 1 +%_ptr_Function_PS_OUTPUT = OpTypePointer Function %PS_OUTPUT +%36 = OpTypeImage %float 2D 0 0 0 1 Unknown +%uint_128 = OpConstant %uint 128 +%_arr_36_uint_128 = OpTypeArray %36 %uint_128 +%_ptr_UniformConstant__arr_36_uint_128 = OpTypePointer UniformConstant %_arr_36_uint_128 +%g_tColor = OpVariable %_ptr_UniformConstant__arr_36_uint_128 UniformConstant +%_ptr_UniformConstant_36 = OpTypePointer UniformConstant %36 +%41 = OpTypeSampler +%_ptr_UniformConstant_41 = OpTypePointer UniformConstant %41 +%g_sAniso = OpVariable %_ptr_UniformConstant_41 UniformConstant +%43 = OpTypeSampledImage %36 +%_ptr_Function_v2float = OpTypePointer Function %v2float +%_ptr_Function_v4float = OpTypePointer Function %v4float +%_ptr_Input_v2float = OpTypePointer Input %v2float +%i_vTextureCoords = OpVariable %_ptr_Input_v2float Input +%_ptr_Output_v4float = OpTypePointer Output %v4float +%_entryPointOutput_vColor = OpVariable %_ptr_Output_v4float Output +%MainPs = OpFunction %void None %19 +%48 = OpLabel +%i_0 = OpVariable %_ptr_Function_PS_INPUT Function +%param = OpVariable %_ptr_Function_PS_INPUT Function +OpLine %5 23 0 +%49 = OpLoad %v2float %i_vTextureCoords +%50 = OpAccessChain %_ptr_Function_v2float %i_0 %int_0 +OpStore %50 %49 +%51 = OpLoad %PS_INPUT %i_0 +OpStore %param %51 +%52 = OpFunctionCall %PS_OUTPUT %_MainPs_struct_PS_INPUT_vf21_ %param +%53 = OpCompositeExtract %v4float %52 0 +OpStore %_entryPointOutput_vColor %53 +OpReturn +OpFunctionEnd +%_MainPs_struct_PS_INPUT_vf21_ = OpFunction %PS_OUTPUT None %24 +%i = OpFunctionParameter %_ptr_Function_PS_INPUT +%54 = OpLabel +%u = OpVariable %_ptr_Function_uint Function +%ps_output = OpVariable %_ptr_Function_PS_OUTPUT Function +OpLine %5 27 0 +%55 = OpAccessChain %_ptr_PushConstant_uint %_ %int_2 +%56 = OpLoad %uint %55 +%57 = OpINotEqual %bool %56 %uint_0 +OpSelectionMerge %58 None +OpBranchConditional %57 %59 %60 +%59 = OpLabel +OpLine %5 28 0 +%61 = OpAccessChain %_ptr_PushConstant_uint %_ %int_0 +%62 = OpLoad %uint %61 +OpStore %u %62 +OpBranch %58 +%60 = OpLabel +OpLine %5 30 0 +%63 = OpAccessChain %_ptr_PushConstant_uint %_ %int_1 +%64 = OpLoad %uint %63 +OpStore %u %64 +OpBranch %58 +%58 = OpLabel +OpLine %5 31 0 +%65 = OpLoad %uint %u +%66 = OpAccessChain %_ptr_UniformConstant_36 %g_tColor %65 +%67 = OpLoad %36 %66 +%68 = OpLoad %41 %g_sAniso +%69 = OpSampledImage %43 %67 %68 +%70 = OpAccessChain %_ptr_Function_v2float %i %int_0 +%71 = OpLoad %v2float %70 +%72 = OpImageSampleImplicitLod %v4float %69 %71 +%73 = OpAccessChain %_ptr_Function_v4float %ps_output %int_0 +OpStore %73 %72 +OpLine %5 32 0 +%74 = OpLoad %PS_OUTPUT %ps_output +OpReturnValue %74 +OpFunctionEnd +)"; + + SinglePassRunAndCheck( + predefs + before, predefs + after, false, true, kLinesEliminateDeadLines); +} + +// TODO(greg-lunarg): Add tests to verify handling of these cases: +// +// TODO(greg-lunarg): Think about other tests :) + +} // namespace +} // namespace opt +} // namespace spvtools diff --git a/3rdparty/spirv-tools/test/opt/reduce_load_size_test.cpp b/3rdparty/spirv-tools/test/opt/reduce_load_size_test.cpp index 1d367e101..7b850e317 100644 --- a/3rdparty/spirv-tools/test/opt/reduce_load_size_test.cpp +++ b/3rdparty/spirv-tools/test/opt/reduce_load_size_test.cpp @@ -23,7 +23,6 @@ namespace { using ReduceLoadSizeTest = PassTest<::testing::Test>; -#ifdef SPIRV_EFFCEE TEST_F(ReduceLoadSizeTest, cbuffer_load_extract) { // Originally from the following HLSL: // struct S { @@ -107,7 +106,6 @@ TEST_F(ReduceLoadSizeTest, cbuffer_load_extract) { SPV_BINARY_TO_TEXT_OPTION_FRIENDLY_NAMES); SinglePassRunAndMatch(test, false); } -#endif TEST_F(ReduceLoadSizeTest, cbuffer_load_extract_vector) { // Originally from the following HLSL: @@ -323,6 +321,34 @@ OpFunctionEnd SinglePassRunAndCheck(test, test, true, false); } +TEST_F(ReduceLoadSizeTest, extract_with_no_index) { + const std::string test = + R"( + OpCapability ImageGatherExtended + OpExtension "" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "P�Ma'" %12 %17 + OpExecutionMode %4 OriginUpperLeft + %void = OpTypeVoid + %3 = OpTypeFunction %void + %float = OpTypeFloat 32 + %_struct_7 = OpTypeStruct %float %float +%_ptr_Input__struct_7 = OpTypePointer Input %_struct_7 +%_ptr_Output__struct_7 = OpTypePointer Output %_struct_7 + %12 = OpVariable %_ptr_Input__struct_7 Input + %17 = OpVariable %_ptr_Output__struct_7 Output + %4 = OpFunction %void DontInline|Pure|Const %3 + %245 = OpLabel + %13 = OpLoad %_struct_7 %12 + %33 = OpCompositeExtract %_struct_7 %13 + OpReturn + OpFunctionEnd + )"; + + auto result = SinglePassRunAndDisassemble(test, true, true); + EXPECT_EQ(Pass::Status::SuccessWithoutChange, std::get<1>(result)); +} + } // namespace } // namespace opt } // namespace spvtools diff --git a/3rdparty/spirv-tools/test/opt/redundancy_elimination_test.cpp b/3rdparty/spirv-tools/test/opt/redundancy_elimination_test.cpp index a6e8c4f28..7d2abe846 100644 --- a/3rdparty/spirv-tools/test/opt/redundancy_elimination_test.cpp +++ b/3rdparty/spirv-tools/test/opt/redundancy_elimination_test.cpp @@ -29,7 +29,6 @@ using ::testing::HasSubstr; using ::testing::MatchesRegex; using RedundancyEliminationTest = PassTest<::testing::Test>; -#ifdef SPIRV_EFFCEE // Test that it can get a simple case of local redundancy elimination. // The rest of the test check for extra functionality. TEST_F(RedundancyEliminationTest, RemoveRedundantLocalAdd) { @@ -273,8 +272,6 @@ TEST_F(RedundancyEliminationTest, KeepRedundantAddWithoutPhi) { EXPECT_EQ(Pass::Status::SuccessWithoutChange, std::get<1>(result)); } -#endif - } // namespace } // namespace opt } // namespace spvtools diff --git a/3rdparty/spirv-tools/test/opt/replace_invalid_opc_test.cpp b/3rdparty/spirv-tools/test/opt/replace_invalid_opc_test.cpp index adfe2ee1e..1be904b4e 100644 --- a/3rdparty/spirv-tools/test/opt/replace_invalid_opc_test.cpp +++ b/3rdparty/spirv-tools/test/opt/replace_invalid_opc_test.cpp @@ -17,6 +17,7 @@ #include #include "gmock/gmock.h" +#include "pass_utils.h" #include "test/opt/assembly_builder.h" #include "test/opt/pass_fixture.h" @@ -26,7 +27,6 @@ namespace { using ReplaceInvalidOpcodeTest = PassTest<::testing::Test>; -#ifdef SPIRV_EFFCEE TEST_F(ReplaceInvalidOpcodeTest, ReplaceInstruction) { const std::string text = R"( ; CHECK: [[special_const:%\w+]] = OpConstant %float -6.2598534e+18 @@ -435,34 +435,6 @@ TEST_F(ReplaceInvalidOpcodeTest, BarrierReplace) { SinglePassRunAndMatch(text, false); } -struct Message { - spv_message_level_t level; - const char* source_file; - uint32_t line_number; - uint32_t column_number; - const char* message; -}; - -MessageConsumer GetTestMessageConsumer( - std::vector& expected_messages) { - return [&expected_messages](spv_message_level_t level, const char* source, - const spv_position_t& position, - const char* message) { - EXPECT_TRUE(!expected_messages.empty()); - if (expected_messages.empty()) { - return; - } - - EXPECT_EQ(expected_messages[0].level, level); - EXPECT_EQ(expected_messages[0].line_number, position.line); - EXPECT_EQ(expected_messages[0].column_number, position.column); - EXPECT_STREQ(expected_messages[0].source_file, source); - EXPECT_STREQ(expected_messages[0].message, message); - - expected_messages.erase(expected_messages.begin()); - }; -} - TEST_F(ReplaceInvalidOpcodeTest, MessageTest) { const std::string text = R"( OpCapability Shader @@ -589,8 +561,6 @@ TEST_F(ReplaceInvalidOpcodeTest, MultipleMessageTest) { EXPECT_EQ(Pass::Status::SuccessWithChange, std::get<1>(result)); } -#endif - } // namespace } // namespace opt } // namespace spvtools diff --git a/3rdparty/spirv-tools/test/opt/scalar_replacement_test.cpp b/3rdparty/spirv-tools/test/opt/scalar_replacement_test.cpp index 652978bb0..67c97a595 100644 --- a/3rdparty/spirv-tools/test/opt/scalar_replacement_test.cpp +++ b/3rdparty/spirv-tools/test/opt/scalar_replacement_test.cpp @@ -25,8 +25,6 @@ namespace { using ScalarReplacementTest = PassTest<::testing::Test>; -// TODO(dneto): Add Effcee as required dependency, and make this unconditional. -#ifdef SPIRV_EFFCEE TEST_F(ScalarReplacementTest, SimpleStruct) { const std::string text = R"( ; @@ -1151,7 +1149,6 @@ TEST_F(ScalarReplacementTest, NoPartialAccesses2) { ; CHECK: OpVariable [[float_ptr]] Function ; CHECK: OpVariable [[float_ptr]] Function ; CHECK: OpVariable [[float_ptr]] Function -; CHECK: OpVariable [[float_ptr]] Function ; CHECK-NOT: OpVariable ; OpCapability Shader @@ -1404,6 +1401,42 @@ OpFunctionEnd SinglePassRunAndMatch(text, true); } +TEST_F(ScalarReplacementTest, SpecConstantArray) { + const std::string text = R"( +; CHECK: [[int:%\w+]] = OpTypeInt +; CHECK: [[spec_const:%\w+]] = OpSpecConstant [[int]] 4 +; CHECK: [[spec_op:%\w+]] = OpSpecConstantOp [[int]] IAdd [[spec_const]] [[spec_const]] +; CHECK: [[array1:%\w+]] = OpTypeArray [[int]] [[spec_const]] +; CHECK: [[array2:%\w+]] = OpTypeArray [[int]] [[spec_op]] +; CHECK: [[ptr_array1:%\w+]] = OpTypePointer Function [[array1]] +; CHECK: [[ptr_array2:%\w+]] = OpTypePointer Function [[array2]] +; CHECK: OpLabel +; CHECK-NEXT: OpVariable [[ptr_array1]] Function +; CHECK-NEXT: OpVariable [[ptr_array2]] Function +; CHECK-NOT: OpVariable +OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +%void = OpTypeVoid +%void_fn = OpTypeFunction %void +%int = OpTypeInt 32 0 +%spec_const = OpSpecConstant %int 4 +%spec_op = OpSpecConstantOp %int IAdd %spec_const %spec_const +%array_1 = OpTypeArray %int %spec_const +%array_2 = OpTypeArray %int %spec_op +%ptr_array_1_Function = OpTypePointer Function %array_1 +%ptr_array_2_Function = OpTypePointer Function %array_2 +%func = OpFunction %void None %void_fn +%1 = OpLabel +%var_1 = OpVariable %ptr_array_1_Function Function +%var_2 = OpVariable %ptr_array_2_Function Function +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + TEST_F(ScalarReplacementTest, CreateAmbiguousNullConstant2) { const std::string text = R"( ; @@ -1448,7 +1481,6 @@ OpFunctionEnd SinglePassRunAndMatch(text, true); } -#endif // SPIRV_EFFCEE // Test that a struct of size 4 is not replaced when there is a limit of 2. TEST_F(ScalarReplacementTest, TestLimit) { @@ -1522,6 +1554,45 @@ OpFunctionEnd EXPECT_EQ(Pass::Status::SuccessWithChange, std::get<1>(result)); } +TEST_F(ScalarReplacementTest, AmbigousPointer) { + const std::string text = R"( +; CHECK: [[s1:%\w+]] = OpTypeStruct %uint +; CHECK: [[s2:%\w+]] = OpTypeStruct %uint +; CHECK: [[s3:%\w+]] = OpTypeStruct [[s2]] +; CHECK: [[s3_const:%\w+]] = OpConstantComposite [[s3]] +; CHECK: [[s2_ptr:%\w+]] = OpTypePointer Function [[s2]] +; CHECK: OpCompositeExtract [[s2]] [[s3_const]] + + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %2 "main" + OpExecutionMode %2 OriginUpperLeft + OpSource ESSL 310 + %void = OpTypeVoid + %5 = OpTypeFunction %void + %uint = OpTypeInt 32 0 + %_struct_7 = OpTypeStruct %uint + %_struct_8 = OpTypeStruct %uint + %_struct_9 = OpTypeStruct %_struct_8 + %uint_1 = OpConstant %uint 1 + %11 = OpConstantComposite %_struct_8 %uint_1 + %12 = OpConstantComposite %_struct_9 %11 +%_ptr_Function__struct_9 = OpTypePointer Function %_struct_9 +%_ptr_Function__struct_7 = OpTypePointer Function %_struct_7 + %2 = OpFunction %void None %5 + %15 = OpLabel + %var = OpVariable %_ptr_Function__struct_9 Function + OpStore %var %12 + %ld = OpLoad %_struct_9 %var + %ex = OpCompositeExtract %_struct_8 %ld 0 + OpReturn + OpFunctionEnd + )"; + + SinglePassRunAndMatch(text, true); +} + } // namespace } // namespace opt } // namespace spvtools diff --git a/3rdparty/spirv-tools/test/opt/simplification_test.cpp b/3rdparty/spirv-tools/test/opt/simplification_test.cpp index b5ad26790..b7d6f18c6 100644 --- a/3rdparty/spirv-tools/test/opt/simplification_test.cpp +++ b/3rdparty/spirv-tools/test/opt/simplification_test.cpp @@ -25,7 +25,6 @@ namespace { using SimplificationTest = PassTest<::testing::Test>; -#ifdef SPIRV_EFFCEE TEST_F(SimplificationTest, StraightLineTest) { // Testing that folding rules are combined in simple straight line code. const std::string text = R"(OpCapability Shader @@ -203,8 +202,6 @@ TEST_F(SimplificationTest, ThroughLoops) { SinglePassRunAndMatch(text, false); } -#endif - } // namespace } // namespace opt } // namespace spvtools diff --git a/3rdparty/spirv-tools/test/opt/strength_reduction_test.cpp b/3rdparty/spirv-tools/test/opt/strength_reduction_test.cpp index 654c90df9..31d050360 100644 --- a/3rdparty/spirv-tools/test/opt/strength_reduction_test.cpp +++ b/3rdparty/spirv-tools/test/opt/strength_reduction_test.cpp @@ -65,7 +65,6 @@ TEST_F(StrengthReductionBasicTest, BasicReplaceMulBy8) { } // TODO(dneto): Add Effcee as required dependency, and make this unconditional. -#ifdef SPIRV_EFFCEE // Test to make sure we replace 16*5 // Also demonstrate use of Effcee matching. TEST_F(StrengthReductionBasicTest, BasicReplaceMulBy16) { @@ -102,7 +101,6 @@ TEST_F(StrengthReductionBasicTest, BasicReplaceMulBy16) { SinglePassRunAndMatch(text, false); } -#endif // Test to make sure we replace a multiple of 32 and 4. TEST_F(StrengthReductionBasicTest, BasicTwoPowersOf2) { diff --git a/3rdparty/spirv-tools/test/opt/strip_reflect_info_test.cpp b/3rdparty/spirv-tools/test/opt/strip_reflect_info_test.cpp index 088cac7aa..a9cfd4763 100644 --- a/3rdparty/spirv-tools/test/opt/strip_reflect_info_test.cpp +++ b/3rdparty/spirv-tools/test/opt/strip_reflect_info_test.cpp @@ -64,6 +64,27 @@ OpMemoryModel Logical Simple SinglePassRunAndCheck(before, after, false); } +TEST_F(StripLineReflectInfoTest, StripHlslSemanticOnMember) { + // This is a non-sensical example, but exercises the instructions. + std::string before = R"(OpCapability Shader +OpCapability Linkage +OpExtension "SPV_GOOGLE_decorate_string" +OpExtension "SPV_GOOGLE_hlsl_functionality1" +OpMemoryModel Logical Simple +OpMemberDecorateStringGOOGLE %struct 0 HlslSemanticGOOGLE "foobar" +%float = OpTypeFloat 32 +%_struct_3 = OpTypeStruct %float +)"; + std::string after = R"(OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical Simple +%float = OpTypeFloat 32 +%_struct_3 = OpTypeStruct %float +)"; + + SinglePassRunAndCheck(before, after, false); +} + } // namespace } // namespace opt } // namespace spvtools diff --git a/3rdparty/spirv-tools/test/opt/struct_cfg_analysis_test.cpp b/3rdparty/spirv-tools/test/opt/struct_cfg_analysis_test.cpp new file mode 100644 index 000000000..13f9022d0 --- /dev/null +++ b/3rdparty/spirv-tools/test/opt/struct_cfg_analysis_test.cpp @@ -0,0 +1,466 @@ +// Copyright (c) 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include + +#include "gmock/gmock.h" +#include "source/opt/struct_cfg_analysis.h" +#include "test/opt/assembly_builder.h" +#include "test/opt/pass_fixture.h" +#include "test/opt/pass_utils.h" + +namespace spvtools { +namespace opt { +namespace { + +using StructCFGAnalysisTest = PassTest<::testing::Test>; + +TEST_F(StructCFGAnalysisTest, BBInSelection) { + const std::string text = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" +%void = OpTypeVoid +%bool = OpTypeBool +%bool_undef = OpUndef %bool +%uint = OpTypeInt 32 0 +%uint_undef = OpUndef %uint +%void_func = OpTypeFunction %void +%main = OpFunction %void None %void_func +%1 = OpLabel +OpSelectionMerge %3 None +OpBranchConditional %undef_bool %2 %3 +%2 = OpLabel +OpBranch %3 +%3 = OpLabel +OpReturn +OpFunctionEnd +)"; + + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + + StructuredCFGAnalysis analysis(context.get()); + + // The header is not in the construct. + EXPECT_EQ(analysis.ContainingConstruct(1), 0); + EXPECT_EQ(analysis.ContainingLoop(1), 0); + EXPECT_EQ(analysis.MergeBlock(1), 0); + EXPECT_EQ(analysis.LoopMergeBlock(1), 0); + + // BB2 is in the construct. + EXPECT_EQ(analysis.ContainingConstruct(2), 1); + EXPECT_EQ(analysis.ContainingLoop(2), 0); + EXPECT_EQ(analysis.MergeBlock(2), 3); + EXPECT_EQ(analysis.LoopMergeBlock(2), 0); + + // The merge node is not in the construct. + EXPECT_EQ(analysis.ContainingConstruct(3), 0); + EXPECT_EQ(analysis.ContainingLoop(3), 0); + EXPECT_EQ(analysis.MergeBlock(3), 0); + EXPECT_EQ(analysis.LoopMergeBlock(3), 0); +} + +TEST_F(StructCFGAnalysisTest, BBInLoop) { + const std::string text = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" +%void = OpTypeVoid +%bool = OpTypeBool +%bool_undef = OpUndef %bool +%uint = OpTypeInt 32 0 +%uint_undef = OpUndef %uint +%void_func = OpTypeFunction %void +%main = OpFunction %void None %void_func +%entry_lab = OpLabel +OpBranch %1 +%1 = OpLabel +OpLoopMerge %3 %4 None +OpBranchConditional %undef_bool %2 %3 +%2 = OpLabel +OpBranch %3 +%4 = OpLabel +OpBranch %1 +%3 = OpLabel +OpReturn +OpFunctionEnd +)"; + + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + + StructuredCFGAnalysis analysis(context.get()); + + // The header is not in the construct. + EXPECT_EQ(analysis.ContainingConstruct(1), 0); + EXPECT_EQ(analysis.ContainingLoop(1), 0); + EXPECT_EQ(analysis.MergeBlock(1), 0); + EXPECT_EQ(analysis.LoopMergeBlock(1), 0); + + // BB2 is in the construct. + EXPECT_EQ(analysis.ContainingConstruct(2), 1); + EXPECT_EQ(analysis.ContainingLoop(2), 1); + EXPECT_EQ(analysis.MergeBlock(2), 3); + EXPECT_EQ(analysis.LoopMergeBlock(2), 3); + + // The merge node is not in the construct. + EXPECT_EQ(analysis.ContainingConstruct(3), 0); + EXPECT_EQ(analysis.ContainingLoop(3), 0); + EXPECT_EQ(analysis.MergeBlock(3), 0); + EXPECT_EQ(analysis.LoopMergeBlock(3), 0); + + // The continue block is in the construct. + EXPECT_EQ(analysis.ContainingConstruct(4), 1); + EXPECT_EQ(analysis.ContainingLoop(4), 1); + EXPECT_EQ(analysis.MergeBlock(4), 3); + EXPECT_EQ(analysis.LoopMergeBlock(4), 3); +} + +TEST_F(StructCFGAnalysisTest, SelectionInLoop) { + const std::string text = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" +%void = OpTypeVoid +%bool = OpTypeBool +%bool_undef = OpUndef %bool +%uint = OpTypeInt 32 0 +%uint_undef = OpUndef %uint +%void_func = OpTypeFunction %void +%main = OpFunction %void None %void_func +%entry_lab = OpLabel +OpBranch %1 +%1 = OpLabel +OpLoopMerge %3 %4 None +OpBranchConditional %undef_bool %2 %3 +%2 = OpLabel +OpSelectionMerge %6 None +OpBranchConditional %undef_bool %5 %6 +%5 = OpLabel +OpBranch %6 +%6 = OpLabel +OpBranch %3 +%4 = OpLabel +OpBranch %1 +%3 = OpLabel +OpReturn +OpFunctionEnd +)"; + + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + + StructuredCFGAnalysis analysis(context.get()); + + // The loop header is not in either construct. + EXPECT_EQ(analysis.ContainingConstruct(1), 0); + EXPECT_EQ(analysis.ContainingLoop(1), 0); + EXPECT_EQ(analysis.MergeBlock(1), 0); + EXPECT_EQ(analysis.LoopMergeBlock(1), 0); + + // Selection header is in the loop only. + EXPECT_EQ(analysis.ContainingConstruct(2), 1); + EXPECT_EQ(analysis.ContainingLoop(2), 1); + EXPECT_EQ(analysis.MergeBlock(2), 3); + EXPECT_EQ(analysis.LoopMergeBlock(2), 3); + + // The loop merge node is not in either construct. + EXPECT_EQ(analysis.ContainingConstruct(3), 0); + EXPECT_EQ(analysis.ContainingLoop(3), 0); + EXPECT_EQ(analysis.MergeBlock(3), 0); + EXPECT_EQ(analysis.LoopMergeBlock(3), 0); + + // The continue block is in the loop only. + EXPECT_EQ(analysis.ContainingConstruct(4), 1); + EXPECT_EQ(analysis.ContainingLoop(4), 1); + EXPECT_EQ(analysis.MergeBlock(4), 3); + EXPECT_EQ(analysis.LoopMergeBlock(4), 3); + + // BB5 is in the selection fist and the loop. + EXPECT_EQ(analysis.ContainingConstruct(5), 2); + EXPECT_EQ(analysis.ContainingLoop(5), 1); + EXPECT_EQ(analysis.MergeBlock(5), 6); + EXPECT_EQ(analysis.LoopMergeBlock(5), 3); + + // The selection merge is in the loop only. + EXPECT_EQ(analysis.ContainingConstruct(6), 1); + EXPECT_EQ(analysis.ContainingLoop(6), 1); + EXPECT_EQ(analysis.MergeBlock(6), 3); + EXPECT_EQ(analysis.LoopMergeBlock(6), 3); +} + +TEST_F(StructCFGAnalysisTest, LoopInSelection) { + const std::string text = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" +%void = OpTypeVoid +%bool = OpTypeBool +%bool_undef = OpUndef %bool +%uint = OpTypeInt 32 0 +%uint_undef = OpUndef %uint +%void_func = OpTypeFunction %void +%main = OpFunction %void None %void_func +%entry_lab = OpLabel +OpBranch %1 +%1 = OpLabel +OpSelectionMerge %3 None +OpBranchConditional %undef_bool %2 %3 +%2 = OpLabel +OpLoopMerge %4 %5 None +OpBranchConditional %undef_bool %4 %6 +%5 = OpLabel +OpBranch %2 +%6 = OpLabel +OpBranch %4 +%4 = OpLabel +OpBranch %3 +%3 = OpLabel +OpReturn +OpFunctionEnd +)"; + + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + + StructuredCFGAnalysis analysis(context.get()); + + // The selection header is not in either construct. + EXPECT_EQ(analysis.ContainingConstruct(1), 0); + EXPECT_EQ(analysis.ContainingLoop(1), 0); + EXPECT_EQ(analysis.MergeBlock(1), 0); + EXPECT_EQ(analysis.LoopMergeBlock(1), 0); + + // Loop header is in the selection only. + EXPECT_EQ(analysis.ContainingConstruct(2), 1); + EXPECT_EQ(analysis.ContainingLoop(2), 0); + EXPECT_EQ(analysis.MergeBlock(2), 3); + EXPECT_EQ(analysis.LoopMergeBlock(2), 0); + + // The selection merge node is not in either construct. + EXPECT_EQ(analysis.ContainingConstruct(3), 0); + EXPECT_EQ(analysis.ContainingLoop(3), 0); + EXPECT_EQ(analysis.MergeBlock(3), 0); + EXPECT_EQ(analysis.LoopMergeBlock(3), 0); + + // The loop merge is in the selection only. + EXPECT_EQ(analysis.ContainingConstruct(4), 1); + EXPECT_EQ(analysis.ContainingLoop(4), 0); + EXPECT_EQ(analysis.MergeBlock(4), 3); + EXPECT_EQ(analysis.LoopMergeBlock(4), 0); + + // The loop continue target is in the loop. + EXPECT_EQ(analysis.ContainingConstruct(5), 2); + EXPECT_EQ(analysis.ContainingLoop(5), 2); + EXPECT_EQ(analysis.MergeBlock(5), 4); + EXPECT_EQ(analysis.LoopMergeBlock(5), 4); + + // BB6 is in the loop. + EXPECT_EQ(analysis.ContainingConstruct(6), 2); + EXPECT_EQ(analysis.ContainingLoop(6), 2); + EXPECT_EQ(analysis.MergeBlock(6), 4); + EXPECT_EQ(analysis.LoopMergeBlock(6), 4); +} + +TEST_F(StructCFGAnalysisTest, SelectionInSelection) { + const std::string text = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" +%void = OpTypeVoid +%bool = OpTypeBool +%bool_undef = OpUndef %bool +%uint = OpTypeInt 32 0 +%uint_undef = OpUndef %uint +%void_func = OpTypeFunction %void +%main = OpFunction %void None %void_func +%entry_lab = OpLabel +OpBranch %1 +%1 = OpLabel +OpSelectionMerge %3 None +OpBranchConditional %undef_bool %2 %3 +%2 = OpLabel +OpSelectionMerge %4 None +OpBranchConditional %undef_bool %4 %5 +%5 = OpLabel +OpBranch %4 +%4 = OpLabel +OpBranch %3 +%3 = OpLabel +OpReturn +OpFunctionEnd +)"; + + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + + StructuredCFGAnalysis analysis(context.get()); + + // The outer selection header is not in either construct. + EXPECT_EQ(analysis.ContainingConstruct(1), 0); + EXPECT_EQ(analysis.ContainingLoop(1), 0); + EXPECT_EQ(analysis.MergeBlock(1), 0); + EXPECT_EQ(analysis.LoopMergeBlock(1), 0); + + // The inner header is in the outer selection. + EXPECT_EQ(analysis.ContainingConstruct(2), 1); + EXPECT_EQ(analysis.ContainingLoop(2), 0); + EXPECT_EQ(analysis.MergeBlock(2), 3); + EXPECT_EQ(analysis.LoopMergeBlock(2), 0); + + // The outer merge node is not in either construct. + EXPECT_EQ(analysis.ContainingConstruct(3), 0); + EXPECT_EQ(analysis.ContainingLoop(3), 0); + EXPECT_EQ(analysis.MergeBlock(3), 0); + EXPECT_EQ(analysis.LoopMergeBlock(3), 0); + + // The inner merge is in the outer selection. + EXPECT_EQ(analysis.ContainingConstruct(4), 1); + EXPECT_EQ(analysis.ContainingLoop(4), 0); + EXPECT_EQ(analysis.MergeBlock(4), 3); + EXPECT_EQ(analysis.LoopMergeBlock(4), 0); + + // BB5 is in the inner selection. + EXPECT_EQ(analysis.ContainingConstruct(5), 2); + EXPECT_EQ(analysis.ContainingLoop(5), 0); + EXPECT_EQ(analysis.MergeBlock(5), 4); + EXPECT_EQ(analysis.LoopMergeBlock(5), 0); +} + +TEST_F(StructCFGAnalysisTest, LoopInLoop) { + const std::string text = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" +%void = OpTypeVoid +%bool = OpTypeBool +%bool_undef = OpUndef %bool +%uint = OpTypeInt 32 0 +%uint_undef = OpUndef %uint +%void_func = OpTypeFunction %void +%main = OpFunction %void None %void_func +%entry_lab = OpLabel +OpBranch %1 +%1 = OpLabel +OpLoopMerge %3 %7 None +OpBranchConditional %undef_bool %2 %3 +%2 = OpLabel +OpLoopMerge %4 %5 None +OpBranchConditional %undef_bool %4 %6 +%5 = OpLabel +OpBranch %2 +%6 = OpLabel +OpBranch %4 +%4 = OpLabel +OpBranch %3 +%7 = OpLabel +OpBranch %1 +%3 = OpLabel +OpReturn +OpFunctionEnd +)"; + + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + + StructuredCFGAnalysis analysis(context.get()); + + // The outer loop header is not in either construct. + EXPECT_EQ(analysis.ContainingConstruct(1), 0); + EXPECT_EQ(analysis.ContainingLoop(1), 0); + EXPECT_EQ(analysis.MergeBlock(1), 0); + EXPECT_EQ(analysis.LoopMergeBlock(1), 0); + + // The inner loop header is in the outer loop. + EXPECT_EQ(analysis.ContainingConstruct(2), 1); + EXPECT_EQ(analysis.ContainingLoop(2), 1); + EXPECT_EQ(analysis.MergeBlock(2), 3); + EXPECT_EQ(analysis.LoopMergeBlock(2), 3); + + // The outer merge node is not in either construct. + EXPECT_EQ(analysis.ContainingConstruct(3), 0); + EXPECT_EQ(analysis.ContainingLoop(3), 0); + EXPECT_EQ(analysis.MergeBlock(3), 0); + EXPECT_EQ(analysis.LoopMergeBlock(3), 0); + + // The inner merge is in the outer loop. + EXPECT_EQ(analysis.ContainingConstruct(4), 1); + EXPECT_EQ(analysis.ContainingLoop(4), 1); + EXPECT_EQ(analysis.MergeBlock(4), 3); + EXPECT_EQ(analysis.LoopMergeBlock(4), 3); + + // The inner continue target is in the inner loop. + EXPECT_EQ(analysis.ContainingConstruct(5), 2); + EXPECT_EQ(analysis.ContainingLoop(5), 2); + EXPECT_EQ(analysis.MergeBlock(5), 4); + EXPECT_EQ(analysis.LoopMergeBlock(5), 4); + + // BB6 is in the loop. + EXPECT_EQ(analysis.ContainingConstruct(6), 2); + EXPECT_EQ(analysis.ContainingLoop(6), 2); + EXPECT_EQ(analysis.MergeBlock(6), 4); + EXPECT_EQ(analysis.LoopMergeBlock(6), 4); + + // The outer continue target is in the outer loop. + EXPECT_EQ(analysis.ContainingConstruct(7), 1); + EXPECT_EQ(analysis.ContainingLoop(7), 1); + EXPECT_EQ(analysis.MergeBlock(7), 3); + EXPECT_EQ(analysis.LoopMergeBlock(7), 3); +} + +TEST_F(StructCFGAnalysisTest, KernelTest) { + const std::string text = R"( +OpCapability Kernel +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" +%void = OpTypeVoid +%bool = OpTypeBool +%bool_undef = OpUndef %bool +%void_func = OpTypeFunction %void +%main = OpFunction %void None %void_func +%1 = OpLabel +OpBranchConditional %undef_bool %2 %3 +%2 = OpLabel +OpBranch %3 +%3 = OpLabel +OpReturn +OpFunctionEnd +)"; + + std::unique_ptr context = + BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text, + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); + + StructuredCFGAnalysis analysis(context.get()); + + // No structured control flow, so none of the basic block are in any + // construct. + for (uint32_t i = 1; i <= 3; i++) { + EXPECT_EQ(analysis.ContainingConstruct(i), 0); + EXPECT_EQ(analysis.ContainingLoop(i), 0); + EXPECT_EQ(analysis.MergeBlock(i), 0); + EXPECT_EQ(analysis.LoopMergeBlock(i), 0); + } +} + +} // namespace +} // namespace opt +} // namespace spvtools diff --git a/3rdparty/spirv-tools/test/opt/type_manager_test.cpp b/3rdparty/spirv-tools/test/opt/type_manager_test.cpp index cf1fcb583..1072c365c 100644 --- a/3rdparty/spirv-tools/test/opt/type_manager_test.cpp +++ b/3rdparty/spirv-tools/test/opt/type_manager_test.cpp @@ -17,6 +17,7 @@ #include #include +#include "effcee/effcee.h" #include "gmock/gmock.h" #include "gtest/gtest.h" #include "source/opt/build_module.h" @@ -24,17 +25,11 @@ #include "source/opt/type_manager.h" #include "spirv-tools/libspirv.hpp" -#ifdef SPIRV_EFFCEE -#include "effcee/effcee.h" -#endif - namespace spvtools { namespace opt { namespace analysis { namespace { -#ifdef SPIRV_EFFCEE - bool Validate(const std::vector& bin) { spv_target_env target_env = SPV_ENV_UNIVERSAL_1_2; spv_context spvContext = spvContextCreate(target_env); @@ -66,8 +61,6 @@ void Match(const std::string& original, IRContext* context, << assembly; } -#endif - std::vector> GenerateAllTypes() { // Types in this test case are only equal to themselves, nothing else. std::vector> types; @@ -163,7 +156,7 @@ std::vector> GenerateAllTypes() { types.emplace_back(new ReserveId()); types.emplace_back(new Queue()); - // Pipe, Forward Pointer, PipeStorage, NamedBarrier + // Pipe, Forward Pointer, PipeStorage, NamedBarrier, AccelerationStructureNV types.emplace_back(new Pipe(SpvAccessQualifierReadWrite)); types.emplace_back(new Pipe(SpvAccessQualifierReadOnly)); types.emplace_back(new ForwardPointer(1, SpvStorageClassInput)); @@ -171,6 +164,7 @@ std::vector> GenerateAllTypes() { types.emplace_back(new ForwardPointer(2, SpvStorageClassUniform)); types.emplace_back(new PipeStorage()); types.emplace_back(new NamedBarrier()); + types.emplace_back(new AccelerationStructureNV()); return types; } @@ -206,6 +200,7 @@ TEST(TypeManager, TypeStrings) { %pipe = OpTypePipe ReadOnly %ps = OpTypePipeStorage %nb = OpTypeNamedBarrier + %rtacc = OpTypeAccelerationStructureNV )"; std::vector> type_id_strs = { @@ -237,6 +232,7 @@ TEST(TypeManager, TypeStrings) { {26, "pipe(0)"}, {27, "pipe_storage"}, {28, "named_barrier"}, + {29, "accelerationStructureNV"}, }; std::unique_ptr context = @@ -939,7 +935,6 @@ OpMemoryModel Logical GLSL450 EXPECT_EQ(nullptr, context->get_type_mgr()->GetType(id)); } -#ifdef SPIRV_EFFCEE TEST(TypeManager, GetTypeInstructionInt) { const std::string text = R"( ; CHECK: OpTypeInt 32 0 @@ -1043,6 +1038,7 @@ TEST(TypeManager, GetTypeInstructionAllTypes) { ; CHECK: OpTypeForwardPointer [[uniform_ptr]] Uniform ; CHECK: OpTypePipeStorage ; CHECK: OpTypeNamedBarrier +; CHECK: OpTypeAccelerationStructureNV OpCapability Shader OpCapability Int64 OpCapability Linkage @@ -1145,7 +1141,6 @@ OpMemoryModel Logical GLSL450 context->get_type_mgr()->FindPointerToType(2, SpvStorageClassFunction); Match(text, context.get()); } -#endif // SPIRV_EFFCEE } // namespace } // namespace analysis diff --git a/3rdparty/spirv-tools/test/opt/types_test.cpp b/3rdparty/spirv-tools/test/opt/types_test.cpp index c11187e83..7426ed799 100644 --- a/3rdparty/spirv-tools/test/opt/types_test.cpp +++ b/3rdparty/spirv-tools/test/opt/types_test.cpp @@ -88,6 +88,7 @@ TestMultipleInstancesOfTheSameType(Pipe, SpvAccessQualifierReadWrite); TestMultipleInstancesOfTheSameType(ForwardPointer, 10, SpvStorageClassUniform); TestMultipleInstancesOfTheSameType(PipeStorage); TestMultipleInstancesOfTheSameType(NamedBarrier); +TestMultipleInstancesOfTheSameType(AccelerationStructureNV); #undef TestMultipleInstanceOfTheSameType std::vector> GenerateAllTypes() { diff --git a/3rdparty/spirv-tools/test/opt/upgrade_memory_model_test.cpp b/3rdparty/spirv-tools/test/opt/upgrade_memory_model_test.cpp new file mode 100644 index 000000000..90ad601d7 --- /dev/null +++ b/3rdparty/spirv-tools/test/opt/upgrade_memory_model_test.cpp @@ -0,0 +1,1435 @@ +// Copyright (c) 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "assembly_builder.h" +#include "gmock/gmock.h" +#include "pass_fixture.h" +#include "pass_utils.h" + +namespace { + +using namespace spvtools; + +using UpgradeMemoryModelTest = opt::PassTest<::testing::Test>; + +#ifdef SPIRV_EFFCEE +TEST_F(UpgradeMemoryModelTest, InvalidMemoryModelOpenCL) { + const std::string text = R"( +; CHECK: OpMemoryModel Logical OpenCL +OpCapability Kernel +OpCapability Linkage +OpMemoryModel Logical OpenCL +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(UpgradeMemoryModelTest, InvalidMemoryModelVulkanKHR) { + const std::string text = R"( +; CHECK: OpMemoryModel Logical VulkanKHR +OpCapability Shader +OpCapability Linkage +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(UpgradeMemoryModelTest, JustMemoryModel) { + const std::string text = R"( +; CHECK: OpCapability VulkanMemoryModelKHR +; CHECK: OpExtension "SPV_KHR_vulkan_memory_model" +; CHECK: OpMemoryModel Logical VulkanKHR +OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(UpgradeMemoryModelTest, RemoveDecorations) { + const std::string text = R"( +; CHECK-NOT: OpDecorate +OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +OpDecorate %var Volatile +OpDecorate %var Coherent +%int = OpTypeInt 32 0 +%ptr_int_Uniform = OpTypePointer Uniform %int +%var = OpVariable %ptr_int_Uniform Uniform +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(UpgradeMemoryModelTest, WorkgroupVariable) { + const std::string text = R"( +; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 2 +; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerAvailableKHR|NonPrivatePointerKHR [[scope]] +; CHECK: OpStore {{%\w+}} {{%\w+}} MakePointerVisibleKHR|NonPrivatePointerKHR [[scope]] +OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%ptr_int_Workgroup = OpTypePointer Workgroup %int +%var = OpVariable %ptr_int_Workgroup Workgroup +%func_ty = OpTypeFunction %void +%func = OpFunction %void None %func_ty +%1 = OpLabel +%ld = OpLoad %int %var +%st = OpStore %var %ld +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(UpgradeMemoryModelTest, WorkgroupFunctionParameter) { + const std::string text = R"( +; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 2 +; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerAvailableKHR|NonPrivatePointerKHR [[scope]] +; CHECK: OpStore {{%\w+}} {{%\w+}} MakePointerVisibleKHR|NonPrivatePointerKHR [[scope]] +OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%ptr_int_Workgroup = OpTypePointer Workgroup %int +%func_ty = OpTypeFunction %void %ptr_int_Workgroup +%func = OpFunction %void None %func_ty +%param = OpFunctionParameter %ptr_int_Workgroup +%1 = OpLabel +%ld = OpLoad %int %param +%st = OpStore %param %ld +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(UpgradeMemoryModelTest, SimpleUniformVariable) { + const std::string text = R"( +; CHECK-NOT: OpDecorate +; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5 +; CHECK: OpLoad {{%\w+}} {{%\w+}} Volatile|MakePointerAvailableKHR|NonPrivatePointerKHR [[scope]] +; CHECK: OpStore {{%\w+}} {{%\w+}} Volatile|MakePointerVisibleKHR|NonPrivatePointerKHR [[scope]] +OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +OpDecorate %var Coherent +OpDecorate %var Volatile +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%ptr_int_Uniform = OpTypePointer Uniform %int +%var = OpVariable %ptr_int_Uniform Uniform +%func_ty = OpTypeFunction %void +%func = OpFunction %void None %func_ty +%1 = OpLabel +%ld = OpLoad %int %var +OpStore %var %ld +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(UpgradeMemoryModelTest, SimpleUniformFunctionParameter) { + const std::string text = R"( +; CHECK-NOT: OpDecorate +; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5 +; CHECK: OpLoad {{%\w+}} {{%\w+}} Volatile|MakePointerAvailableKHR|NonPrivatePointerKHR [[scope]] +; CHECK: OpStore {{%\w+}} {{%\w+}} Volatile|MakePointerVisibleKHR|NonPrivatePointerKHR [[scope]] +OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +OpDecorate %param Coherent +OpDecorate %param Volatile +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%ptr_int_Uniform = OpTypePointer Uniform %int +%func_ty = OpTypeFunction %void %ptr_int_Uniform +%func = OpFunction %void None %func_ty +%param = OpFunctionParameter %ptr_int_Uniform +%1 = OpLabel +%ld = OpLoad %int %param +OpStore %param %ld +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(UpgradeMemoryModelTest, SimpleUniformVariableOnlyVolatile) { + const std::string text = R"( +; CHECK-NOT: OpDecorate +; CHECK-NOT: OpConstant +; CHECK: OpLoad {{%\w+}} {{%\w+}} Volatile +; CHECK: OpStore {{%\w+}} {{%\w+}} Volatile +OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +OpDecorate %var Volatile +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%ptr_int_Uniform = OpTypePointer Uniform %int +%var = OpVariable %ptr_int_Uniform Uniform +%func_ty = OpTypeFunction %void +%func = OpFunction %void None %func_ty +%1 = OpLabel +%ld = OpLoad %int %var +OpStore %var %ld +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(UpgradeMemoryModelTest, SimpleUniformVariableCopied) { + const std::string text = R"( +; CHECK-NOT: OpDecorate +; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5 +; CHECK: OpLoad {{%\w+}} {{%\w+}} Volatile|MakePointerAvailableKHR|NonPrivatePointerKHR [[scope]] +; CHECK: OpStore {{%\w+}} {{%\w+}} Volatile|MakePointerVisibleKHR|NonPrivatePointerKHR [[scope]] +OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +OpDecorate %var Coherent +OpDecorate %var Volatile +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%ptr_int_Uniform = OpTypePointer Uniform %int +%var = OpVariable %ptr_int_Uniform Uniform +%func_ty = OpTypeFunction %void +%func = OpFunction %void None %func_ty +%1 = OpLabel +%copy = OpCopyObject %ptr_int_Uniform %var +%ld = OpLoad %int %copy +OpStore %copy %ld +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(UpgradeMemoryModelTest, SimpleUniformFunctionParameterCopied) { + const std::string text = R"( +; CHECK-NOT: OpDecorate +; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5 +; CHECK: OpLoad {{%\w+}} {{%\w+}} Volatile|MakePointerAvailableKHR|NonPrivatePointerKHR [[scope]] +; CHECK: OpStore {{%\w+}} {{%\w+}} Volatile|MakePointerVisibleKHR|NonPrivatePointerKHR [[scope]] +OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +OpDecorate %param Coherent +OpDecorate %param Volatile +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%ptr_int_Uniform = OpTypePointer Uniform %int +%func_ty = OpTypeFunction %void %ptr_int_Uniform +%func = OpFunction %void None %func_ty +%param = OpFunctionParameter %ptr_int_Uniform +%1 = OpLabel +%copy = OpCopyObject %ptr_int_Uniform %param +%ld = OpLoad %int %copy +%copy2 = OpCopyObject %ptr_int_Uniform %param +OpStore %copy2 %ld +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(UpgradeMemoryModelTest, SimpleUniformVariableAccessChain) { + const std::string text = R"( +; CHECK-NOT: OpDecorate +; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5 +; CHECK: OpLoad {{%\w+}} {{%\w+}} Volatile|MakePointerAvailableKHR|NonPrivatePointerKHR [[scope]] +; CHECK: OpStore {{%\w+}} {{%\w+}} Volatile|MakePointerVisibleKHR|NonPrivatePointerKHR [[scope]] +OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +OpDecorate %var Coherent +OpDecorate %var Volatile +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%int0 = OpConstant %int 0 +%int3 = OpConstant %int 3 +%int_array_3 = OpTypeArray %int %int3 +%ptr_intarray_Uniform = OpTypePointer Uniform %int_array_3 +%ptr_int_Uniform = OpTypePointer Uniform %int +%var = OpVariable %ptr_intarray_Uniform Uniform +%func_ty = OpTypeFunction %void +%func = OpFunction %void None %func_ty +%1 = OpLabel +%gep = OpAccessChain %ptr_int_Uniform %var %int0 +%ld = OpLoad %int %gep +OpStore %gep %ld +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(UpgradeMemoryModelTest, SimpleUniformFunctionParameterAccessChain) { + const std::string text = R"( +; CHECK-NOT: OpDecorate +; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5 +; CHECK: OpLoad {{%\w+}} {{%\w+}} Volatile|MakePointerAvailableKHR|NonPrivatePointerKHR [[scope]] +; CHECK: OpStore {{%\w+}} {{%\w+}} Volatile|MakePointerVisibleKHR|NonPrivatePointerKHR [[scope]] +OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +OpDecorate %param Coherent +OpDecorate %param Volatile +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%int0 = OpConstant %int 0 +%int3 = OpConstant %int 3 +%int_array_3 = OpTypeArray %int %int3 +%ptr_intarray_Uniform = OpTypePointer Uniform %int_array_3 +%ptr_int_Uniform = OpTypePointer Uniform %int +%func_ty = OpTypeFunction %void %ptr_intarray_Uniform +%func = OpFunction %void None %func_ty +%param = OpFunctionParameter %ptr_intarray_Uniform +%1 = OpLabel +%ld_gep = OpAccessChain %ptr_int_Uniform %param %int0 +%ld = OpLoad %int %ld_gep +%st_gep = OpAccessChain %ptr_int_Uniform %param %int0 +OpStore %st_gep %ld +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(UpgradeMemoryModelTest, VariablePointerSelect) { + const std::string text = R"( +; CHECK-NOT: OpDecorate +; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5 +; CHECK: OpLoad {{%\w+}} {{%\w+}} Volatile|MakePointerAvailableKHR|NonPrivatePointerKHR [[scope]] +; CHECK: OpStore {{%\w+}} {{%\w+}} Volatile|MakePointerVisibleKHR|NonPrivatePointerKHR [[scope]] +OpCapability Shader +OpCapability Linkage +OpCapability VariablePointers +OpExtension "SPV_KHR_variable_pointers" +OpMemoryModel Logical GLSL450 +OpDecorate %var Coherent +OpDecorate %var Volatile +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%bool = OpTypeBool +%true = OpConstantTrue %bool +%ptr_int_StorageBuffer = OpTypePointer StorageBuffer %int +%null = OpConstantNull %ptr_int_StorageBuffer +%var = OpVariable %ptr_int_StorageBuffer StorageBuffer +%func_ty = OpTypeFunction %void +%func = OpFunction %void None %func_ty +%1 = OpLabel +%select = OpSelect %ptr_int_StorageBuffer %true %var %null +%ld = OpLoad %int %select +OpStore %var %ld +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(UpgradeMemoryModelTest, VariablePointerSelectConservative) { + const std::string text = R"( +; CHECK-NOT: OpDecorate +; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5 +; CHECK: OpLoad {{%\w+}} {{%\w+}} Volatile|MakePointerAvailableKHR|NonPrivatePointerKHR [[scope]] +; CHECK: OpStore {{%\w+}} {{%\w+}} Volatile|MakePointerVisibleKHR|NonPrivatePointerKHR [[scope]] +OpCapability Shader +OpCapability Linkage +OpCapability VariablePointers +OpExtension "SPV_KHR_variable_pointers" +OpMemoryModel Logical GLSL450 +OpDecorate %var1 Coherent +OpDecorate %var2 Volatile +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%bool = OpTypeBool +%true = OpConstantTrue %bool +%ptr_int_StorageBuffer = OpTypePointer StorageBuffer %int +%var1 = OpVariable %ptr_int_StorageBuffer StorageBuffer +%var2 = OpVariable %ptr_int_StorageBuffer StorageBuffer +%func_ty = OpTypeFunction %void +%func = OpFunction %void None %func_ty +%1 = OpLabel +%select = OpSelect %ptr_int_StorageBuffer %true %var1 %var2 +%ld = OpLoad %int %select +OpStore %select %ld +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(UpgradeMemoryModelTest, VariablePointerIncrement) { + const std::string text = R"( +; CHECK-NOT: OpDecorate {{%\w+}} Coherent +; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5 +; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerAvailableKHR|NonPrivatePointerKHR [[scope]] +; CHECK: OpStore {{%\w+}} {{%\w+}} MakePointerVisibleKHR|NonPrivatePointerKHR [[scope]] +OpCapability Shader +OpCapability Linkage +OpCapability VariablePointers +OpExtension "SPV_KHR_variable_pointers" +OpMemoryModel Logical GLSL450 +OpDecorate %param Coherent +OpDecorate %param ArrayStride 4 +%void = OpTypeVoid +%bool = OpTypeBool +%int = OpTypeInt 32 0 +%int0 = OpConstant %int 0 +%int1 = OpConstant %int 1 +%int10 = OpConstant %int 10 +%ptr_int_StorageBuffer = OpTypePointer StorageBuffer %int +%func_ty = OpTypeFunction %void %ptr_int_StorageBuffer +%func = OpFunction %void None %func_ty +%param = OpFunctionParameter %ptr_int_StorageBuffer +%1 = OpLabel +OpBranch %2 +%2 = OpLabel +%phi = OpPhi %ptr_int_StorageBuffer %param %1 %ptr_next %2 +%iv = OpPhi %int %int0 %1 %inc %2 +%inc = OpIAdd %int %iv %int1 +%ptr_next = OpPtrAccessChain %ptr_int_StorageBuffer %phi %int1 +%cmp = OpIEqual %bool %iv %int10 +OpLoopMerge %3 %2 None +OpBranchConditional %cmp %3 %2 +%3 = OpLabel +%ld = OpLoad %int %phi +OpStore %phi %ld +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(UpgradeMemoryModelTest, CoherentStructElement) { + const std::string text = R"( +; CHECK-NOT: OpMemberDecorate +; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5 +; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerAvailableKHR|NonPrivatePointerKHR [[scope]] +; CHECK: OpStore {{%\w+}} {{%\w+}} MakePointerVisibleKHR|NonPrivatePointerKHR [[scope]] +OpCapability Shader +OpCapability Linkage +OpExtension "SPV_KHR_storage_buffer_storage_class" +OpMemoryModel Logical GLSL450 +OpMemberDecorate %struct 0 Coherent +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%int0 = OpConstant %int 0 +%struct = OpTypeStruct %int +%ptr_struct_StorageBuffer = OpTypePointer StorageBuffer %struct +%ptr_int_StorageBuffer = OpTypePointer StorageBuffer %int +%func_ty = OpTypeFunction %void %ptr_struct_StorageBuffer +%func = OpFunction %void None %func_ty +%param = OpFunctionParameter %ptr_struct_StorageBuffer +%1 = OpLabel +%gep = OpAccessChain %ptr_int_StorageBuffer %param %int0 +%ld = OpLoad %int %gep +OpStore %gep %ld +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(UpgradeMemoryModelTest, CoherentElementFullStructAccess) { + const std::string text = R"( +; CHECK-NOT: OpMemberDecorate +; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5 +; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerAvailableKHR|NonPrivatePointerKHR [[scope]] +; CHECK: OpStore {{%\w+}} {{%\w+}} MakePointerVisibleKHR|NonPrivatePointerKHR [[scope]] +OpCapability Shader +OpCapability Linkage +OpExtension "SPV_KHR_storage_buffer_storage_class" +OpMemoryModel Logical GLSL450 +OpMemberDecorate %struct 0 Coherent +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%struct = OpTypeStruct %int +%ptr_struct_StorageBuffer = OpTypePointer StorageBuffer %struct +%func_ty = OpTypeFunction %void %ptr_struct_StorageBuffer +%func = OpFunction %void None %func_ty +%param = OpFunctionParameter %ptr_struct_StorageBuffer +%1 = OpLabel +%ld = OpLoad %struct %param +OpStore %param %ld +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(UpgradeMemoryModelTest, CoherentElementNotAccessed) { + const std::string text = R"( +; CHECK-NOT: OpMemberDecorate +; CHECK-NOT: MakePointerAvailableKHR +; CHECK-NOT: NonPrivatePointerKHR +; CHECK-NOT: MakePointerVisibleKHR +OpCapability Shader +OpCapability Linkage +OpExtension "SPV_KHR_storage_buffer_storage_class" +OpMemoryModel Logical GLSL450 +OpMemberDecorate %struct 1 Coherent +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%int0 = OpConstant %int 0 +%struct = OpTypeStruct %int %int +%ptr_struct_StorageBuffer = OpTypePointer StorageBuffer %struct +%ptr_int_StorageBuffer = OpTypePointer StorageBuffer %int +%func_ty = OpTypeFunction %void %ptr_struct_StorageBuffer +%func = OpFunction %void None %func_ty +%param = OpFunctionParameter %ptr_struct_StorageBuffer +%1 = OpLabel +%gep = OpAccessChain %ptr_int_StorageBuffer %param %int0 +%ld = OpLoad %int %gep +OpStore %gep %ld +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(UpgradeMemoryModelTest, MultiIndexAccessCoherent) { + const std::string text = R"( +; CHECK-NOT: OpMemberDecorate +; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5 +; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerAvailableKHR|NonPrivatePointerKHR [[scope]] +; CHECK: OpStore {{%\w+}} {{%\w+}} MakePointerVisibleKHR|NonPrivatePointerKHR [[scope]] +OpCapability Shader +OpCapability Linkage +OpExtension "SPV_KHR_storage_buffer_storage_class" +OpMemoryModel Logical GLSL450 +OpMemberDecorate %inner 1 Coherent +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%int0 = OpConstant %int 0 +%int1 = OpConstant %int 1 +%inner = OpTypeStruct %int %int +%middle = OpTypeStruct %inner +%outer = OpTypeStruct %middle %middle +%ptr_outer_StorageBuffer = OpTypePointer StorageBuffer %outer +%ptr_int_StorageBuffer = OpTypePointer StorageBuffer %int +%func_ty = OpTypeFunction %void %ptr_outer_StorageBuffer +%func = OpFunction %void None %func_ty +%param = OpFunctionParameter %ptr_outer_StorageBuffer +%1 = OpLabel +%ld_gep = OpInBoundsAccessChain %ptr_int_StorageBuffer %param %int0 %int0 %int1 +%ld = OpLoad %int %ld_gep +%st_gep = OpInBoundsAccessChain %ptr_int_StorageBuffer %param %int1 %int0 %int1 +OpStore %st_gep %ld +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(UpgradeMemoryModelTest, MultiIndexAccessNonCoherent) { + const std::string text = R"( +; CHECK-NOT: OpMemberDecorate +; CHECK-NOT: MakePointerAvailableKHR +; CHECK-NOT: NonPrivatePointerKHR +; CHECK-NOT: MakePointerVisibleKHR +OpCapability Shader +OpCapability Linkage +OpExtension "SPV_KHR_storage_buffer_storage_class" +OpMemoryModel Logical GLSL450 +OpMemberDecorate %inner 1 Coherent +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%int0 = OpConstant %int 0 +%int1 = OpConstant %int 1 +%inner = OpTypeStruct %int %int +%middle = OpTypeStruct %inner +%outer = OpTypeStruct %middle %middle +%ptr_outer_StorageBuffer = OpTypePointer StorageBuffer %outer +%ptr_int_StorageBuffer = OpTypePointer StorageBuffer %int +%func_ty = OpTypeFunction %void %ptr_outer_StorageBuffer +%func = OpFunction %void None %func_ty +%param = OpFunctionParameter %ptr_outer_StorageBuffer +%1 = OpLabel +%ld_gep = OpInBoundsAccessChain %ptr_int_StorageBuffer %param %int0 %int0 %int0 +%ld = OpLoad %int %ld_gep +%st_gep = OpInBoundsAccessChain %ptr_int_StorageBuffer %param %int1 %int0 %int0 +OpStore %st_gep %ld +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(UpgradeMemoryModelTest, ConsecutiveAccessChainCoherent) { + const std::string text = R"( +; CHECK-NOT: OpMemberDecorate +; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5 +; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerAvailableKHR|NonPrivatePointerKHR [[scope]] +; CHECK: OpStore {{%\w+}} {{%\w+}} MakePointerVisibleKHR|NonPrivatePointerKHR [[scope]] +OpCapability Shader +OpCapability Linkage +OpExtension "SPV_KHR_storage_buffer_storage_class" +OpMemoryModel Logical GLSL450 +OpMemberDecorate %inner 1 Coherent +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%int0 = OpConstant %int 0 +%int1 = OpConstant %int 1 +%inner = OpTypeStruct %int %int +%middle = OpTypeStruct %inner +%outer = OpTypeStruct %middle %middle +%ptr_outer_StorageBuffer = OpTypePointer StorageBuffer %outer +%ptr_middle_StorageBuffer = OpTypePointer StorageBuffer %middle +%ptr_inner_StorageBuffer = OpTypePointer StorageBuffer %inner +%ptr_int_StorageBuffer = OpTypePointer StorageBuffer %int +%func_ty = OpTypeFunction %void %ptr_outer_StorageBuffer +%func = OpFunction %void None %func_ty +%param = OpFunctionParameter %ptr_outer_StorageBuffer +%1 = OpLabel +%ld_gep1 = OpInBoundsAccessChain %ptr_middle_StorageBuffer %param %int0 +%ld_gep2 = OpInBoundsAccessChain %ptr_inner_StorageBuffer %ld_gep1 %int0 +%ld_gep3 = OpInBoundsAccessChain %ptr_int_StorageBuffer %ld_gep2 %int1 +%ld = OpLoad %int %ld_gep3 +%st_gep1 = OpInBoundsAccessChain %ptr_middle_StorageBuffer %param %int1 +%st_gep2 = OpInBoundsAccessChain %ptr_inner_StorageBuffer %st_gep1 %int0 +%st_gep3 = OpInBoundsAccessChain %ptr_int_StorageBuffer %st_gep2 %int1 +OpStore %st_gep3 %ld +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(UpgradeMemoryModelTest, ConsecutiveAccessChainNonCoherent) { + const std::string text = R"( +; CHECK-NOT: OpMemberDecorate +; CHECK-NOT: MakePointerAvailableKHR +; CHECK-NOT: NonPrivatePointerKHR +; CHECK-NOT: MakePointerVisibleKHR +OpCapability Shader +OpCapability Linkage +OpExtension "SPV_KHR_storage_buffer_storage_class" +OpMemoryModel Logical GLSL450 +OpMemberDecorate %inner 1 Coherent +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%int0 = OpConstant %int 0 +%int1 = OpConstant %int 1 +%inner = OpTypeStruct %int %int +%middle = OpTypeStruct %inner +%outer = OpTypeStruct %middle %middle +%ptr_outer_StorageBuffer = OpTypePointer StorageBuffer %outer +%ptr_middle_StorageBuffer = OpTypePointer StorageBuffer %middle +%ptr_inner_StorageBuffer = OpTypePointer StorageBuffer %inner +%ptr_int_StorageBuffer = OpTypePointer StorageBuffer %int +%func_ty = OpTypeFunction %void %ptr_outer_StorageBuffer +%func = OpFunction %void None %func_ty +%param = OpFunctionParameter %ptr_outer_StorageBuffer +%1 = OpLabel +%ld_gep1 = OpInBoundsAccessChain %ptr_middle_StorageBuffer %param %int0 +%ld_gep2 = OpInBoundsAccessChain %ptr_inner_StorageBuffer %ld_gep1 %int0 +%ld_gep3 = OpInBoundsAccessChain %ptr_int_StorageBuffer %ld_gep2 %int0 +%ld = OpLoad %int %ld_gep3 +%st_gep1 = OpInBoundsAccessChain %ptr_middle_StorageBuffer %param %int1 +%st_gep2 = OpInBoundsAccessChain %ptr_inner_StorageBuffer %st_gep1 %int0 +%st_gep3 = OpInBoundsAccessChain %ptr_int_StorageBuffer %st_gep2 %int0 +OpStore %st_gep3 %ld +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(UpgradeMemoryModelTest, CoherentStructElementAccess) { + const std::string text = R"( +; CHECK-NOT: OpMemberDecorate +; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5 +; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerAvailableKHR|NonPrivatePointerKHR [[scope]] +; CHECK: OpStore {{%\w+}} {{%\w+}} MakePointerVisibleKHR|NonPrivatePointerKHR [[scope]] +OpCapability Shader +OpCapability Linkage +OpExtension "SPV_KHR_storage_buffer_storage_class" +OpMemoryModel Logical GLSL450 +OpMemberDecorate %middle 0 Coherent +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%int0 = OpConstant %int 0 +%int1 = OpConstant %int 1 +%inner = OpTypeStruct %int %int +%middle = OpTypeStruct %inner +%outer = OpTypeStruct %middle %middle +%ptr_outer_StorageBuffer = OpTypePointer StorageBuffer %outer +%ptr_middle_StorageBuffer = OpTypePointer StorageBuffer %middle +%ptr_inner_StorageBuffer = OpTypePointer StorageBuffer %inner +%ptr_int_StorageBuffer = OpTypePointer StorageBuffer %int +%func_ty = OpTypeFunction %void %ptr_outer_StorageBuffer +%func = OpFunction %void None %func_ty +%param = OpFunctionParameter %ptr_outer_StorageBuffer +%1 = OpLabel +%ld_gep1 = OpInBoundsAccessChain %ptr_middle_StorageBuffer %param %int0 +%ld_gep2 = OpInBoundsAccessChain %ptr_inner_StorageBuffer %ld_gep1 %int0 +%ld_gep3 = OpInBoundsAccessChain %ptr_int_StorageBuffer %ld_gep2 %int1 +%ld = OpLoad %int %ld_gep3 +%st_gep1 = OpInBoundsAccessChain %ptr_middle_StorageBuffer %param %int1 +%st_gep2 = OpInBoundsAccessChain %ptr_inner_StorageBuffer %st_gep1 %int0 +%st_gep3 = OpInBoundsAccessChain %ptr_int_StorageBuffer %st_gep2 %int1 +OpStore %st_gep3 %ld +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(UpgradeMemoryModelTest, NonCoherentLoadCoherentStore) { + const std::string text = R"( +; CHECK-NOT: OpMemberDecorate +; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5 +; CHECK-NOT: MakePointerAvailableKHR +; CHECK: OpStore {{%\w+}} {{%\w+}} MakePointerVisibleKHR|NonPrivatePointerKHR [[scope]] +OpCapability Shader +OpCapability Linkage +OpExtension "SPV_KHR_storage_buffer_storage_class" +OpMemoryModel Logical GLSL450 +OpMemberDecorate %outer 1 Coherent +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%int0 = OpConstant %int 0 +%int1 = OpConstant %int 1 +%inner = OpTypeStruct %int %int +%middle = OpTypeStruct %inner +%outer = OpTypeStruct %middle %middle +%ptr_outer_StorageBuffer = OpTypePointer StorageBuffer %outer +%ptr_middle_StorageBuffer = OpTypePointer StorageBuffer %middle +%ptr_inner_StorageBuffer = OpTypePointer StorageBuffer %inner +%ptr_int_StorageBuffer = OpTypePointer StorageBuffer %int +%func_ty = OpTypeFunction %void %ptr_outer_StorageBuffer +%func = OpFunction %void None %func_ty +%param = OpFunctionParameter %ptr_outer_StorageBuffer +%1 = OpLabel +%ld_gep1 = OpInBoundsAccessChain %ptr_middle_StorageBuffer %param %int0 +%ld_gep2 = OpInBoundsAccessChain %ptr_inner_StorageBuffer %ld_gep1 %int0 +%ld_gep3 = OpInBoundsAccessChain %ptr_int_StorageBuffer %ld_gep2 %int1 +%ld = OpLoad %int %ld_gep3 +%st_gep1 = OpInBoundsAccessChain %ptr_middle_StorageBuffer %param %int1 +%st_gep2 = OpInBoundsAccessChain %ptr_inner_StorageBuffer %st_gep1 %int0 +%st_gep3 = OpInBoundsAccessChain %ptr_int_StorageBuffer %st_gep2 %int1 +OpStore %st_gep3 %ld +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(UpgradeMemoryModelTest, CopyMemory) { + const std::string text = R"( +; CHECK-NOT: OpDecorate +; CHECK: [[queuefamily:%\w+]] = OpConstant {{%\w+}} 5 +; CHECK: OpCopyMemory {{%\w+}} {{%\w+}} Volatile|MakePointerVisibleKHR|NonPrivatePointerKHR [[queuefamily]] +; CHECK-NOT: [[queuefamily]] +OpCapability Shader +OpCapability Linkage +OpExtension "SPV_KHR_storage_buffer_storage_class" +OpMemoryModel Logical GLSL450 +OpDecorate %in_var Coherent +OpDecorate %out_var Volatile +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%ptr_int_StorageBuffer = OpTypePointer StorageBuffer %int +%in_var = OpVariable %ptr_int_StorageBuffer StorageBuffer +%out_var = OpVariable %ptr_int_StorageBuffer StorageBuffer +%func_ty = OpTypeFunction %void +%func = OpFunction %void None %func_ty +%1 = OpLabel +OpCopyMemory %out_var %in_var +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(UpgradeMemoryModelTest, CopyMemorySized) { + const std::string text = R"( +; CHECK-NOT: OpDecorate +; CHECK: [[queuefamily:%\w+]] = OpConstant {{%\w+}} 5 +; CHECK: OpCopyMemorySized {{%\w+}} {{%\w+}} {{%\w+}} Volatile|MakePointerAvailableKHR|NonPrivatePointerKHR [[queuefamily]] +; CHECK-NOT: [[queuefamily]] +OpCapability Shader +OpCapability Linkage +OpCapability Addresses +OpExtension "SPV_KHR_storage_buffer_storage_class" +OpMemoryModel Logical GLSL450 +OpDecorate %out_param Coherent +OpDecorate %in_param Volatile +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%int4 = OpConstant %int 4 +%ptr_int_StorageBuffer = OpTypePointer StorageBuffer %int +%func_ty = OpTypeFunction %void %ptr_int_StorageBuffer %ptr_int_StorageBuffer +%func = OpFunction %void None %func_ty +%in_param = OpFunctionParameter %ptr_int_StorageBuffer +%out_param = OpFunctionParameter %ptr_int_StorageBuffer +%1 = OpLabel +OpCopyMemorySized %out_param %in_param %int4 +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(UpgradeMemoryModelTest, CopyMemoryTwoScopes) { + const std::string text = R"( +; CHECK-NOT: OpDecorate +; CHECK-DAG: [[queuefamily:%\w+]] = OpConstant {{%\w+}} 5 +; CHECK-DAG: [[workgroup:%\w+]] = OpConstant {{%\w+}} 2 +; CHECK: OpCopyMemory {{%\w+}} {{%\w+}} MakePointerAvailableKHR|MakePointerVisibleKHR|NonPrivatePointerKHR [[queuefamily]] [[workgroup]] +OpCapability Shader +OpCapability Linkage +OpExtension "SPV_KHR_storage_buffer_storage_class" +OpMemoryModel Logical GLSL450 +OpDecorate %in_var Coherent +OpDecorate %out_var Coherent +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%ptr_int_Workgroup = OpTypePointer Workgroup %int +%ptr_int_StorageBuffer = OpTypePointer StorageBuffer %int +%in_var = OpVariable %ptr_int_StorageBuffer StorageBuffer +%out_var = OpVariable %ptr_int_Workgroup Workgroup +%func_ty = OpTypeFunction %void +%func = OpFunction %void None %func_ty +%1 = OpLabel +OpCopyMemory %out_var %in_var +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(UpgradeMemoryModelTest, VolatileImageRead) { + const std::string text = R"( +; CHECK-NOT: OpDecorate +; CHECK: OpLoad {{%\w+}} {{%\w+}} Volatile +; CHECK: OpImageRead {{%\w+}} {{%\w+}} {{%\w+}} VolatileTexelKHR +OpCapability Shader +OpCapability Linkage +OpCapability StorageImageReadWithoutFormat +OpExtension "SPV_KHR_storage_buffer_storage_class" +OpMemoryModel Logical GLSL450 +OpDecorate %var Volatile +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%v2int = OpTypeVector %int 2 +%float = OpTypeFloat 32 +%int0 = OpConstant %int 0 +%v2int_0 = OpConstantComposite %v2int %int0 %int0 +%image = OpTypeImage %float 2D 0 0 0 2 Unknown +%ptr_image_StorageBuffer = OpTypePointer StorageBuffer %image +%var = OpVariable %ptr_image_StorageBuffer StorageBuffer +%func_ty = OpTypeFunction %void +%func = OpFunction %void None %func_ty +%1 = OpLabel +%ld = OpLoad %image %var +%rd = OpImageRead %float %ld %v2int_0 +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(UpgradeMemoryModelTest, CoherentImageRead) { + const std::string text = R"( +; CHECK-NOT: OpDecorate +; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5 +; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerAvailableKHR|NonPrivatePointerKHR [[scope]] +; CHECK: OpImageRead {{%\w+}} {{%\w+}} {{%\w+}} MakeTexelAvailableKHR|NonPrivateTexelKHR [[scope]] +OpCapability Shader +OpCapability Linkage +OpCapability StorageImageReadWithoutFormat +OpExtension "SPV_KHR_storage_buffer_storage_class" +OpMemoryModel Logical GLSL450 +OpDecorate %var Coherent +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%v2int = OpTypeVector %int 2 +%float = OpTypeFloat 32 +%int0 = OpConstant %int 0 +%v2int_0 = OpConstantComposite %v2int %int0 %int0 +%image = OpTypeImage %float 2D 0 0 0 2 Unknown +%ptr_image_StorageBuffer = OpTypePointer StorageBuffer %image +%var = OpVariable %ptr_image_StorageBuffer StorageBuffer +%func_ty = OpTypeFunction %void +%func = OpFunction %void None %func_ty +%1 = OpLabel +%ld = OpLoad %image %var +%rd = OpImageRead %float %ld %v2int_0 +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(UpgradeMemoryModelTest, CoherentImageReadExtractedFromSampledImage) { + const std::string text = R"( +; CHECK-NOT: OpDecorate +; CHECK: [[image:%\w+]] = OpTypeImage +; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5 +; CHECK: OpLoad [[image]] {{%\w+}} MakePointerAvailableKHR|NonPrivatePointerKHR [[scope]] +; CHECK-NOT: NonPrivatePointerKHR +; CHECK: OpImageRead {{%\w+}} {{%\w+}} {{%\w+}} MakeTexelAvailableKHR|NonPrivateTexelKHR [[scope]] +OpCapability Shader +OpCapability Linkage +OpCapability StorageImageReadWithoutFormat +OpExtension "SPV_KHR_storage_buffer_storage_class" +OpMemoryModel Logical GLSL450 +OpDecorate %var Coherent +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%v2int = OpTypeVector %int 2 +%float = OpTypeFloat 32 +%int0 = OpConstant %int 0 +%v2int_0 = OpConstantComposite %v2int %int0 %int0 +%image = OpTypeImage %float 2D 0 0 0 0 Unknown +%sampled_image = OpTypeSampledImage %image +%sampler = OpTypeSampler +%ptr_image_StorageBuffer = OpTypePointer StorageBuffer %image +%ptr_sampler_StorageBuffer = OpTypePointer StorageBuffer %sampler +%var = OpVariable %ptr_image_StorageBuffer StorageBuffer +%sampler_var = OpVariable %ptr_sampler_StorageBuffer StorageBuffer +%func_ty = OpTypeFunction %void +%func = OpFunction %void None %func_ty +%1 = OpLabel +%ld = OpLoad %image %var +%ld_sampler = OpLoad %sampler %sampler_var +%sample = OpSampledImage %sampled_image %ld %ld_sampler +%extract = OpImage %image %sample +%rd = OpImageRead %float %extract %v2int_0 +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(UpgradeMemoryModelTest, VolatileImageWrite) { + const std::string text = R"( +; CHECK-NOT: OpDecorate +; CHECK: OpLoad {{%\w+}} {{%\w+}} Volatile +; CHECK: OpImageWrite {{%\w+}} {{%\w+}} {{%\w+}} VolatileTexelKHR +OpCapability Shader +OpCapability Linkage +OpCapability StorageImageWriteWithoutFormat +OpExtension "SPV_KHR_storage_buffer_storage_class" +OpMemoryModel Logical GLSL450 +OpDecorate %param Volatile +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%v2int = OpTypeVector %int 2 +%float = OpTypeFloat 32 +%float0 = OpConstant %float 0 +%v2int_null = OpConstantNull %v2int +%image = OpTypeImage %float 2D 0 0 0 0 Unknown +%ptr_image_StorageBuffer = OpTypePointer StorageBuffer %image +%func_ty = OpTypeFunction %void %ptr_image_StorageBuffer +%func = OpFunction %void None %func_ty +%param = OpFunctionParameter %ptr_image_StorageBuffer +%1 = OpLabel +%ld = OpLoad %image %param +OpImageWrite %ld %v2int_null %float0 +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(UpgradeMemoryModelTest, CoherentImageWrite) { + const std::string text = R"( +; CHECK-NOT: OpDecorate +; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5 +; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerAvailableKHR|NonPrivatePointerKHR +; CHECK: OpImageWrite {{%\w+}} {{%\w+}} {{%\w+}} MakeTexelVisibleKHR|NonPrivateTexelKHR [[scope]] +OpCapability Shader +OpCapability Linkage +OpCapability StorageImageWriteWithoutFormat +OpExtension "SPV_KHR_storage_buffer_storage_class" +OpMemoryModel Logical GLSL450 +OpDecorate %param Coherent +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%v2int = OpTypeVector %int 2 +%float = OpTypeFloat 32 +%float0 = OpConstant %float 0 +%v2int_null = OpConstantNull %v2int +%image = OpTypeImage %float 2D 0 0 0 0 Unknown +%ptr_image_StorageBuffer = OpTypePointer StorageBuffer %image +%func_ty = OpTypeFunction %void %ptr_image_StorageBuffer +%func = OpFunction %void None %func_ty +%param = OpFunctionParameter %ptr_image_StorageBuffer +%1 = OpLabel +%ld = OpLoad %image %param +OpImageWrite %ld %v2int_null %float0 +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(UpgradeMemoryModelTest, CoherentImageWriteExtractFromSampledImage) { + const std::string text = R"( +; CHECK-NOT: OpDecorate +; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5 +; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerAvailableKHR|NonPrivatePointerKHR +; CHECK-NOT: NonPrivatePointerKHR +; CHECK: OpImageWrite {{%\w+}} {{%\w+}} {{%\w+}} MakeTexelVisibleKHR|NonPrivateTexelKHR [[scope]] +OpCapability Shader +OpCapability Linkage +OpCapability StorageImageWriteWithoutFormat +OpExtension "SPV_KHR_storage_buffer_storage_class" +OpMemoryModel Logical GLSL450 +OpDecorate %param Coherent +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%v2int = OpTypeVector %int 2 +%float = OpTypeFloat 32 +%float0 = OpConstant %float 0 +%v2int_null = OpConstantNull %v2int +%image = OpTypeImage %float 2D 0 0 0 0 Unknown +%sampled_image = OpTypeSampledImage %image +%sampler = OpTypeSampler +%ptr_image_StorageBuffer = OpTypePointer StorageBuffer %image +%ptr_sampler_StorageBuffer = OpTypePointer StorageBuffer %sampler +%func_ty = OpTypeFunction %void %ptr_image_StorageBuffer %ptr_sampler_StorageBuffer +%func = OpFunction %void None %func_ty +%param = OpFunctionParameter %ptr_image_StorageBuffer +%sampler_param = OpFunctionParameter %ptr_sampler_StorageBuffer +%1 = OpLabel +%ld = OpLoad %image %param +%ld_sampler = OpLoad %sampler %sampler_param +%sample = OpSampledImage %sampled_image %ld %ld_sampler +%extract = OpImage %image %sample +OpImageWrite %extract %v2int_null %float0 +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(UpgradeMemoryModelTest, VolatileImageSparseRead) { + const std::string text = R"( +; CHECK-NOT: OpDecorate +; CHECK: OpLoad {{%\w+}} {{%\w+}} Volatile +; CHECK: OpImageSparseRead {{%\w+}} {{%\w+}} {{%\w+}} VolatileTexelKHR +OpCapability Shader +OpCapability Linkage +OpCapability StorageImageReadWithoutFormat +OpCapability SparseResidency +OpExtension "SPV_KHR_storage_buffer_storage_class" +OpMemoryModel Logical GLSL450 +OpDecorate %var Volatile +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%v2int = OpTypeVector %int 2 +%float = OpTypeFloat 32 +%int0 = OpConstant %int 0 +%v2int_0 = OpConstantComposite %v2int %int0 %int0 +%image = OpTypeImage %float 2D 0 0 0 2 Unknown +%struct = OpTypeStruct %int %float +%ptr_image_StorageBuffer = OpTypePointer StorageBuffer %image +%var = OpVariable %ptr_image_StorageBuffer StorageBuffer +%func_ty = OpTypeFunction %void +%func = OpFunction %void None %func_ty +%1 = OpLabel +%ld = OpLoad %image %var +%rd = OpImageSparseRead %struct %ld %v2int_0 +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(UpgradeMemoryModelTest, CoherentImageSparseRead) { + const std::string text = R"( +; CHECK-NOT: OpDecorate +; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5 +; CHECK: OpLoad {{%\w+}} {{%\w+}} MakePointerAvailableKHR|NonPrivatePointerKHR [[scope]] +; CHECK: OpImageSparseRead {{%\w+}} {{%\w+}} {{%\w+}} MakeTexelAvailableKHR|NonPrivateTexelKHR [[scope]] +OpCapability Shader +OpCapability Linkage +OpCapability StorageImageReadWithoutFormat +OpCapability SparseResidency +OpExtension "SPV_KHR_storage_buffer_storage_class" +OpMemoryModel Logical GLSL450 +OpDecorate %var Coherent +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%v2int = OpTypeVector %int 2 +%float = OpTypeFloat 32 +%int0 = OpConstant %int 0 +%v2int_0 = OpConstantComposite %v2int %int0 %int0 +%image = OpTypeImage %float 2D 0 0 0 2 Unknown +%struct = OpTypeStruct %int %float +%ptr_image_StorageBuffer = OpTypePointer StorageBuffer %image +%var = OpVariable %ptr_image_StorageBuffer StorageBuffer +%func_ty = OpTypeFunction %void +%func = OpFunction %void None %func_ty +%1 = OpLabel +%ld = OpLoad %image %var +%rd = OpImageSparseRead %struct %ld %v2int_0 +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(UpgradeMemoryModelTest, + CoherentImageSparseReadExtractedFromSampledImage) { + const std::string text = R"( +; CHECK-NOT: OpDecorate +; CHECK: [[image:%\w+]] = OpTypeImage +; CHECK: [[scope:%\w+]] = OpConstant {{%\w+}} 5 +; CHECK: OpLoad [[image]] {{%\w+}} MakePointerAvailableKHR|NonPrivatePointerKHR [[scope]] +; CHECK-NOT: NonPrivatePointerKHR +; CHECK: OpImageSparseRead {{%\w+}} {{%\w+}} {{%\w+}} MakeTexelAvailableKHR|NonPrivateTexelKHR [[scope]] +OpCapability Shader +OpCapability Linkage +OpCapability StorageImageReadWithoutFormat +OpCapability SparseResidency +OpExtension "SPV_KHR_storage_buffer_storage_class" +OpMemoryModel Logical GLSL450 +OpDecorate %var Coherent +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%v2int = OpTypeVector %int 2 +%float = OpTypeFloat 32 +%int0 = OpConstant %int 0 +%v2int_0 = OpConstantComposite %v2int %int0 %int0 +%image = OpTypeImage %float 2D 0 0 0 0 Unknown +%struct = OpTypeStruct %int %float +%sampled_image = OpTypeSampledImage %image +%sampler = OpTypeSampler +%ptr_image_StorageBuffer = OpTypePointer StorageBuffer %image +%ptr_sampler_StorageBuffer = OpTypePointer StorageBuffer %sampler +%var = OpVariable %ptr_image_StorageBuffer StorageBuffer +%sampler_var = OpVariable %ptr_sampler_StorageBuffer StorageBuffer +%func_ty = OpTypeFunction %void +%func = OpFunction %void None %func_ty +%1 = OpLabel +%ld = OpLoad %image %var +%ld_sampler = OpLoad %sampler %sampler_var +%sample = OpSampledImage %sampled_image %ld %ld_sampler +%extract = OpImage %image %sample +%rd = OpImageSparseRead %struct %extract %v2int_0 +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(UpgradeMemoryModelTest, TessellationControlBarrierNoChange) { + const std::string text = R"( +; CHECK: [[none:%\w+]] = OpConstant {{%\w+}} 0 +; CHECK: [[workgroup:%\w+]] = OpConstant {{%\w+}} 2 +; CHECK: OpControlBarrier [[workgroup]] [[workgroup]] [[none]] +OpCapability Tessellation +OpMemoryModel Logical GLSL450 +OpEntryPoint TessellationControl %func "func" +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%none = OpConstant %int 0 +%workgroup = OpConstant %int 2 +%func_ty = OpTypeFunction %void +%func = OpFunction %void None %func_ty +%1 = OpLabel +OpControlBarrier %workgroup %workgroup %none +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(UpgradeMemoryModelTest, TessellationControlBarrierAddOutput) { + const std::string text = R"( +; CHECK: [[workgroup:%\w+]] = OpConstant {{%\w+}} 2 +; CHECK: [[output:%\w+]] = OpConstant {{%\w+}} 4096 +; CHECK: OpControlBarrier [[workgroup]] [[workgroup]] [[output]] +OpCapability Tessellation +OpMemoryModel Logical GLSL450 +OpEntryPoint TessellationControl %func "func" %var +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%none = OpConstant %int 0 +%workgroup = OpConstant %int 2 +%ptr_int_Output = OpTypePointer Output %int +%var = OpVariable %ptr_int_Output Output +%func_ty = OpTypeFunction %void +%func = OpFunction %void None %func_ty +%1 = OpLabel +%ld = OpLoad %int %var +OpControlBarrier %workgroup %workgroup %none +OpStore %var %ld +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(UpgradeMemoryModelTest, TessellationMemoryBarrierNoChange) { + const std::string text = R"( +; CHECK: [[none:%\w+]] = OpConstant {{%\w+}} 0 +; CHECK: [[workgroup:%\w+]] = OpConstant {{%\w+}} 2 +; CHECK: OpMemoryBarrier [[workgroup]] [[none]] +OpCapability Tessellation +OpMemoryModel Logical GLSL450 +OpEntryPoint TessellationControl %func "func" %var +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%none = OpConstant %int 0 +%workgroup = OpConstant %int 2 +%ptr_int_Output = OpTypePointer Output %int +%var = OpVariable %ptr_int_Output Output +%func_ty = OpTypeFunction %void +%func = OpFunction %void None %func_ty +%1 = OpLabel +%ld = OpLoad %int %var +OpMemoryBarrier %workgroup %none +OpStore %var %ld +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(UpgradeMemoryModelTest, TessellationControlBarrierAddOutputSubFunction) { + const std::string text = R"( +; CHECK: [[workgroup:%\w+]] = OpConstant {{%\w+}} 2 +; CHECK: [[output:%\w+]] = OpConstant {{%\w+}} 4096 +; CHECK: OpControlBarrier [[workgroup]] [[workgroup]] [[output]] +OpCapability Tessellation +OpMemoryModel Logical GLSL450 +OpEntryPoint TessellationControl %func "func" %var +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%none = OpConstant %int 0 +%workgroup = OpConstant %int 2 +%ptr_int_Output = OpTypePointer Output %int +%var = OpVariable %ptr_int_Output Output +%func_ty = OpTypeFunction %void +%func = OpFunction %void None %func_ty +%1 = OpLabel +%call = OpFunctionCall %void %sub_func +OpReturn +OpFunctionEnd +%sub_func = OpFunction %void None %func_ty +%2 = OpLabel +%ld = OpLoad %int %var +OpControlBarrier %workgroup %workgroup %none +OpStore %var %ld +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(UpgradeMemoryModelTest, + TessellationControlBarrierAddOutputDifferentFunctions) { + const std::string text = R"( +; CHECK: [[workgroup:%\w+]] = OpConstant {{%\w+}} 2 +; CHECK: [[output:%\w+]] = OpConstant {{%\w+}} 4096 +; CHECK: OpControlBarrier [[workgroup]] [[workgroup]] [[output]] +OpCapability Tessellation +OpMemoryModel Logical GLSL450 +OpEntryPoint TessellationControl %func "func" %var +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%none = OpConstant %int 0 +%workgroup = OpConstant %int 2 +%ptr_int_Output = OpTypePointer Output %int +%var = OpVariable %ptr_int_Output Output +%func_ty = OpTypeFunction %void +%ld_func_ty = OpTypeFunction %int +%st_func_ty = OpTypeFunction %void %int +%func = OpFunction %void None %func_ty +%1 = OpLabel +%call_ld = OpFunctionCall %int %ld_func +%call_barrier = OpFunctionCall %void %barrier_func +%call_st = OpFunctionCall %void %st_func %call_ld +OpReturn +OpFunctionEnd +%ld_func = OpFunction %int None %ld_func_ty +%2 = OpLabel +%ld = OpLoad %int %var +OpReturnValue %ld +OpFunctionEnd +%barrier_func = OpFunction %void None %func_ty +%3 = OpLabel +OpControlBarrier %workgroup %workgroup %none +OpReturn +OpFunctionEnd +%st_func = OpFunction %void None %st_func_ty +%param = OpFunctionParameter %int +%4 = OpLabel +OpStore %var %param +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(UpgradeMemoryModelTest, ChangeControlBarrierMemoryScope) { + std::string text = R"( +; CHECK: [[workgroup:%\w+]] = OpConstant {{%\w+}} 2 +; CHECK: [[queuefamily:%\w+]] = OpConstant {{%\w+}} 5 +; CHECK: OpControlBarrier [[workgroup]] [[queuefamily]] +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint GLCompute %func "func" +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%none = OpConstant %int 0 +%device = OpConstant %int 1 +%workgroup = OpConstant %int 2 +%func_ty = OpTypeFunction %void +%func = OpFunction %void None %func_ty +%1 = OpLabel +OpControlBarrier %workgroup %device %none +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(UpgradeMemoryModelTest, ChangeMemoryBarrierMemoryScope) { + std::string text = R"( +; CHECK: [[queuefamily:%\w+]] = OpConstant {{%\w+}} 5 +; CHECK: OpMemoryBarrier [[queuefamily]] +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint GLCompute %func "func" +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%none = OpConstant %int 0 +%device = OpConstant %int 1 +%func_ty = OpTypeFunction %void +%func = OpFunction %void None %func_ty +%1 = OpLabel +OpMemoryBarrier %device %none +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +TEST_F(UpgradeMemoryModelTest, ChangeAtomicMemoryScope) { + std::string text = R"( +; CHECK: [[int:%\w+]] = OpTypeInt +; CHECK: [[var:%\w+]] = OpVariable +; CHECK: [[qf:%\w+]] = OpConstant [[int]] 5 +; CHECK: OpAtomicLoad [[int]] [[var]] [[qf]] +; CHECK: OpAtomicStore [[var]] [[qf]] +; CHECK: OpAtomicExchange [[int]] [[var]] [[qf]] +; CHECK: OpAtomicCompareExchange [[int]] [[var]] [[qf]] +; CHECK: OpAtomicIIncrement [[int]] [[var]] [[qf]] +; CHECK: OpAtomicIDecrement [[int]] [[var]] [[qf]] +; CHECK: OpAtomicIAdd [[int]] [[var]] [[qf]] +; CHECK: OpAtomicISub [[int]] [[var]] [[qf]] +; CHECK: OpAtomicSMin [[int]] [[var]] [[qf]] +; CHECK: OpAtomicSMax [[int]] [[var]] [[qf]] +; CHECK: OpAtomicUMin [[int]] [[var]] [[qf]] +; CHECK: OpAtomicUMax [[int]] [[var]] [[qf]] +; CHECK: OpAtomicAnd [[int]] [[var]] [[qf]] +; CHECK: OpAtomicOr [[int]] [[var]] [[qf]] +; CHECK: OpAtomicXor [[int]] [[var]] [[qf]] +OpCapability Shader +OpExtension "SPV_KHR_storage_buffer_storage_class" +OpMemoryModel Logical GLSL450 +OpEntryPoint GLCompute %func "func" +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%none = OpConstant %int 0 +%device = OpConstant %int 1 +%func_ty = OpTypeFunction %void +%ptr_int_StorageBuffer = OpTypePointer StorageBuffer %int +%var = OpVariable %ptr_int_StorageBuffer StorageBuffer +%func = OpFunction %void None %func_ty +%1 = OpLabel +%ld = OpAtomicLoad %int %var %device %none +OpAtomicStore %var %device %none %ld +%ex = OpAtomicExchange %int %var %device %none %ld +%cmp_ex = OpAtomicCompareExchange %int %var %device %none %none %ld %ld +%inc = OpAtomicIIncrement %int %var %device %none +%dec = OpAtomicIDecrement %int %var %device %none +%add = OpAtomicIAdd %int %var %device %none %ld +%sub = OpAtomicISub %int %var %device %none %ld +%smin = OpAtomicSMin %int %var %device %none %ld +%smax = OpAtomicSMax %int %var %device %none %ld +%umin = OpAtomicUMin %int %var %device %none %ld +%umax = OpAtomicUMax %int %var %device %none %ld +%and = OpAtomicAnd %int %var %device %none %ld +%or = OpAtomicOr %int %var %device %none %ld +%xor = OpAtomicXor %int %var %device %none %ld +OpReturn +OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); +} + +#endif + +} // namespace diff --git a/3rdparty/spirv-tools/test/opt/vector_dce_test.cpp b/3rdparty/spirv-tools/test/opt/vector_dce_test.cpp index d1af0de19..40f115c34 100644 --- a/3rdparty/spirv-tools/test/opt/vector_dce_test.cpp +++ b/3rdparty/spirv-tools/test/opt/vector_dce_test.cpp @@ -490,6 +490,7 @@ OpDecorate %OutColor Location 0 %_ptr_Output_v4float = OpTypePointer Output %v4float %OutColor = OpVariable %_ptr_Output_v4float Output %27 = OpUndef %v4float +%55 = OpUndef %v4float )"; const std::string before = @@ -536,25 +537,31 @@ OpFunctionEnd R"(%main = OpFunction %void None %10 %28 = OpLabel %29 = OpLoad %v4float %In0 +%30 = OpLoad %float %In1 +%31 = OpLoad %float %In2 +%32 = OpFAdd %float %30 %31 +%33 = OpCompositeInsert %v4float %32 %29 1 %34 = OpAccessChain %_ptr_Uniform_uint %_ %int_0 %35 = OpLoad %uint %34 %36 = OpINotEqual %bool %35 %uint_0 OpSelectionMerge %37 None OpBranchConditional %36 %38 %37 %38 = OpLabel -%39 = OpCompositeInsert %v4float %float_1 %29 0 +%39 = OpCompositeInsert %v4float %float_1 %55 0 OpBranch %37 %37 = OpLabel %40 = OpPhi %v4float %29 %28 %39 %38 %41 = OpCompositeExtract %float %40 0 -%42 = OpCompositeInsert %v4float %41 %27 0 +%42 = OpCompositeInsert %v4float %41 %55 0 +%43 = OpCompositeExtract %float %40 1 +%44 = OpCompositeInsert %v4float %43 %42 1 %45 = OpAccessChain %_ptr_Uniform_uint %_ %int_1 %46 = OpLoad %uint %45 %47 = OpINotEqual %bool %46 %uint_0 OpSelectionMerge %48 None OpBranchConditional %47 %49 %48 %49 = OpLabel -%50 = OpCompositeInsert %v4float %float_0 %42 0 +%50 = OpCompositeInsert %v4float %float_0 %55 0 OpBranch %48 %48 = OpLabel %51 = OpPhi %v4float %42 %37 %50 %49 @@ -566,8 +573,8 @@ OpReturn OpFunctionEnd )"; - SinglePassRunAndCheck(before_predefs + before, - after_predefs + after, true, true); + SinglePassRunAndCheck(before_predefs + before, + after_predefs + after, true, true); } TEST_F(VectorDCETest, InsertObjectLive) { @@ -608,10 +615,9 @@ OpFunctionEnd )"; SetAssembleOptions(SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS); - SinglePassRunAndCheck(before, before, true, true); + SinglePassRunAndCheck(before, before, true, true); } -#ifdef SPIRV_EFFCEE TEST_F(VectorDCETest, DeadInsertInCycle) { // Dead insert in chain with cycle. Demonstrates analysis can handle // cycles in chains going through scalars intermediate values. @@ -1078,13 +1084,12 @@ TEST_F(VectorDCETest, DeadInsertThroughOtherInst) { SinglePassRunAndMatch(assembly, true); } -#endif TEST_F(VectorDCETest, VectorIntoCompositeConstruct) { const std::string text = R"(OpCapability Linkage OpCapability Shader OpMemoryModel Logical GLSL450 -OpEntryPoint Vertex %1 "EntryPoint_Main" %2 %3 +OpEntryPoint Fragment %1 "EntryPoint_Main" %2 %3 OpExecutionMode %1 OriginUpperLeft OpDecorate %2 Location 0 OpDecorate %_struct_4 Block @@ -1150,7 +1155,39 @@ OpReturn OpFunctionEnd )"; - SinglePassRunAndCheck(text, text, true, true); + SinglePassRunAndCheck(text, text, true, true); +} + +TEST_F(VectorDCETest, InsertWithNoIndices) { + const std::string text = R"( +; CHECK: OpEntryPoint Fragment {{%\w+}} "PSMain" [[in1:%\w+]] [[in2:%\w+]] [[out:%\w+]] +; CHECK: OpFunction +; CHECK: [[ld:%\w+]] = OpLoad %v4float [[in2]] +; CHECK: OpStore [[out]] [[ld]] + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %1 "PSMain" %2 %14 %3 + OpExecutionMode %1 OriginUpperLeft + %void = OpTypeVoid + %5 = OpTypeFunction %void + %float = OpTypeFloat 32 + %v4float = OpTypeVector %float 4 +%_ptr_Input_v4float = OpTypePointer Input %v4float +%_ptr_Output_v4float = OpTypePointer Output %v4float + %2 = OpVariable %_ptr_Input_v4float Input + %14 = OpVariable %_ptr_Input_v4float Input + %3 = OpVariable %_ptr_Output_v4float Output + %1 = OpFunction %void None %5 + %10 = OpLabel + %13 = OpLoad %v4float %14 + %11 = OpLoad %v4float %2 + %12 = OpCompositeInsert %v4float %13 %11 + OpStore %3 %12 + OpReturn + OpFunctionEnd +)"; + + SinglePassRunAndMatch(text, true); } } // namespace diff --git a/3rdparty/spirv-tools/test/opt/workaround1209_test.cpp b/3rdparty/spirv-tools/test/opt/workaround1209_test.cpp index 853a01cb2..50d3c0915 100644 --- a/3rdparty/spirv-tools/test/opt/workaround1209_test.cpp +++ b/3rdparty/spirv-tools/test/opt/workaround1209_test.cpp @@ -30,7 +30,6 @@ namespace { using Workaround1209Test = PassTest<::testing::Test>; -#ifdef SPIRV_EFFCEE TEST_F(Workaround1209Test, RemoveOpUnreachableInLoop) { const std::string text = R"( OpCapability Shader @@ -418,7 +417,6 @@ TEST_F(Workaround1209Test, LeaveUnreachableNotInLoop) { SinglePassRunAndMatch(text, false); } -#endif } // namespace } // namespace opt diff --git a/3rdparty/spirv-tools/test/pch_test.cpp b/3rdparty/spirv-tools/test/pch_test.cpp new file mode 100644 index 000000000..3b06a0aa2 --- /dev/null +++ b/3rdparty/spirv-tools/test/pch_test.cpp @@ -0,0 +1,15 @@ +// Copyright (c) 2018 The Khronos Group Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "pch_test.h" diff --git a/3rdparty/spirv-tools/test/pch_test.h b/3rdparty/spirv-tools/test/pch_test.h new file mode 100644 index 000000000..7dac06acf --- /dev/null +++ b/3rdparty/spirv-tools/test/pch_test.h @@ -0,0 +1,18 @@ +// Copyright (c) 2018 The Khronos Group Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "gmock/gmock.h" +#include "source/spirv_constant.h" +#include "test/test_fixture.h" +#include "test/unit_spirv.h" diff --git a/3rdparty/spirv-tools/test/reduce/CMakeLists.txt b/3rdparty/spirv-tools/test/reduce/CMakeLists.txt new file mode 100644 index 000000000..b35cdb260 --- /dev/null +++ b/3rdparty/spirv-tools/test/reduce/CMakeLists.txt @@ -0,0 +1,28 @@ +# Copyright (c) 2018 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +add_spvtools_unittest(TARGET reduce + SRCS operand_to_constant_reduction_pass_test.cpp + operand_to_undef_reduction_pass_test.cpp + operand_to_dominating_id_reduction_pass_test.cpp + reduce_test_util.cpp + reduce_test_util.h + reducer_test.cpp + remove_opname_instruction_reduction_pass_test.cpp + remove_unreferenced_instruction_reduction_pass_test.cpp + structured_loop_to_selection_reduction_pass_test.cpp + validation_during_reduction_test.cpp + LIBS SPIRV-Tools-reduce + ) + diff --git a/3rdparty/spirv-tools/test/reduce/operand_to_constant_reduction_pass_test.cpp b/3rdparty/spirv-tools/test/reduce/operand_to_constant_reduction_pass_test.cpp new file mode 100644 index 000000000..34cc4a117 --- /dev/null +++ b/3rdparty/spirv-tools/test/reduce/operand_to_constant_reduction_pass_test.cpp @@ -0,0 +1,156 @@ +// Copyright (c) 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "reduce_test_util.h" +#include "source/opt/build_module.h" +#include "source/reduce/operand_to_const_reduction_pass.h" + +namespace spvtools { +namespace reduce { +namespace { + +TEST(OperandToConstantReductionPassTest, BasicCheck) { + std::string prologue = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" %37 + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + OpName %4 "main" + OpName %9 "buf1" + OpMemberName %9 0 "f" + OpName %11 "" + OpName %24 "buf2" + OpMemberName %24 0 "i" + OpName %26 "" + OpName %37 "_GLF_color" + OpMemberDecorate %9 0 Offset 0 + OpDecorate %9 Block + OpDecorate %11 DescriptorSet 0 + OpDecorate %11 Binding 1 + OpMemberDecorate %24 0 Offset 0 + OpDecorate %24 Block + OpDecorate %26 DescriptorSet 0 + OpDecorate %26 Binding 2 + OpDecorate %37 Location 0 + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeFloat 32 + %9 = OpTypeStruct %6 + %10 = OpTypePointer Uniform %9 + %11 = OpVariable %10 Uniform + %12 = OpTypeInt 32 1 + %13 = OpConstant %12 0 + %14 = OpTypePointer Uniform %6 + %20 = OpConstant %6 2 + %24 = OpTypeStruct %12 + %25 = OpTypePointer Uniform %24 + %26 = OpVariable %25 Uniform + %27 = OpTypePointer Uniform %12 + %33 = OpConstant %12 3 + %35 = OpTypeVector %6 4 + %36 = OpTypePointer Output %35 + %37 = OpVariable %36 Output + %4 = OpFunction %2 None %3 + %5 = OpLabel + %15 = OpAccessChain %14 %11 %13 + %16 = OpLoad %6 %15 + %19 = OpFAdd %6 %16 %16 + %21 = OpFAdd %6 %19 %20 + %28 = OpAccessChain %27 %26 %13 + %29 = OpLoad %12 %28 + )"; + + std::string epilogue = R"( + %45 = OpConvertSToF %6 %34 + %46 = OpCompositeConstruct %35 %16 %21 %43 %45 + OpStore %37 %46 + OpReturn + OpFunctionEnd + )"; + + std::string original = prologue + R"( + %32 = OpIAdd %12 %29 %29 + %34 = OpIAdd %12 %32 %33 + %43 = OpConvertSToF %6 %29 + )" + epilogue; + + std::string expected = prologue + R"( + %32 = OpIAdd %12 %13 %13 ; %29 -> %13 x 2 + %34 = OpIAdd %12 %13 %33 ; %32 -> %13 + %43 = OpConvertSToF %6 %13 ; %29 -> %13 + )" + epilogue; + + const auto env = SPV_ENV_UNIVERSAL_1_3; + const auto consumer = nullptr; + const auto context = + BuildModule(env, consumer, original, kReduceAssembleOption); + const auto pass = TestSubclass(env); + const auto ops = pass.WrapGetAvailableOpportunities(context.get()); + ASSERT_EQ(17, ops.size()); + ASSERT_TRUE(ops[0]->PreconditionHolds()); + ops[0]->TryToApply(); + ASSERT_TRUE(ops[1]->PreconditionHolds()); + ops[1]->TryToApply(); + ASSERT_TRUE(ops[2]->PreconditionHolds()); + ops[2]->TryToApply(); + ASSERT_TRUE(ops[3]->PreconditionHolds()); + ops[3]->TryToApply(); + + CheckEqual(env, expected, context.get()); +} + +TEST(OperandToConstantReductionPassTest, WithCalledFunction) { + std::string shader = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" %10 %12 + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeFloat 32 + %7 = OpTypeVector %6 4 + %8 = OpTypeFunction %7 + %9 = OpTypePointer Output %7 + %10 = OpVariable %9 Output + %11 = OpTypePointer Input %7 + %12 = OpVariable %11 Input + %13 = OpConstant %6 0 + %14 = OpConstantComposite %7 %13 %13 %13 %13 + %4 = OpFunction %2 None %3 + %5 = OpLabel + %15 = OpFunctionCall %7 %16 + OpReturn + OpFunctionEnd + %16 = OpFunction %7 None %8 + %17 = OpLabel + OpReturnValue %14 + OpFunctionEnd + )"; + + const auto env = SPV_ENV_UNIVERSAL_1_3; + const auto consumer = nullptr; + const auto context = + BuildModule(env, consumer, shader, kReduceAssembleOption); + const auto pass = TestSubclass(env); + const auto ops = pass.WrapGetAvailableOpportunities(context.get()); + ASSERT_EQ(0, ops.size()); +} + +} // namespace +} // namespace reduce +} // namespace spvtools diff --git a/3rdparty/spirv-tools/test/reduce/operand_to_dominating_id_reduction_pass_test.cpp b/3rdparty/spirv-tools/test/reduce/operand_to_dominating_id_reduction_pass_test.cpp new file mode 100644 index 000000000..cc0de65cd --- /dev/null +++ b/3rdparty/spirv-tools/test/reduce/operand_to_dominating_id_reduction_pass_test.cpp @@ -0,0 +1,196 @@ +// Copyright (c) 2018 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "source/reduce/operand_to_dominating_id_reduction_pass.h" +#include "reduce_test_util.h" +#include "source/opt/build_module.h" + +namespace spvtools { +namespace reduce { +namespace { + +TEST(OperandToDominatingIdReductionPassTest, BasicCheck) { + std::string original = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeInt 32 1 + %7 = OpTypePointer Function %6 + %9 = OpConstant %6 2 + %4 = OpFunction %2 None %3 + %5 = OpLabel + %8 = OpVariable %7 Function + %10 = OpVariable %7 Function + %14 = OpVariable %7 Function + OpStore %8 %9 + %11 = OpLoad %6 %8 + %12 = OpLoad %6 %8 + %13 = OpIAdd %6 %11 %12 + OpStore %10 %13 + %15 = OpLoad %6 %10 + OpStore %14 %15 + OpReturn + OpFunctionEnd + )"; + + const auto env = SPV_ENV_UNIVERSAL_1_3; + const auto consumer = nullptr; + const auto context = + BuildModule(env, consumer, original, kReduceAssembleOption); + const auto pass = TestSubclass(env); + const auto ops = pass.WrapGetAvailableOpportunities(context.get()); + ASSERT_EQ(10, ops.size()); + ASSERT_TRUE(ops[0]->PreconditionHolds()); + ops[0]->TryToApply(); + + std::string after_op_0 = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeInt 32 1 + %7 = OpTypePointer Function %6 + %9 = OpConstant %6 2 + %4 = OpFunction %2 None %3 + %5 = OpLabel + %8 = OpVariable %7 Function + %10 = OpVariable %7 Function + %14 = OpVariable %7 Function + OpStore %8 %9 + %11 = OpLoad %6 %8 + %12 = OpLoad %6 %8 + %13 = OpIAdd %6 %11 %12 + OpStore %8 %13 ; %10 -> %8 + %15 = OpLoad %6 %10 + OpStore %14 %15 + OpReturn + OpFunctionEnd + )"; + + CheckEqual(env, after_op_0, context.get()); + + ASSERT_TRUE(ops[1]->PreconditionHolds()); + ops[1]->TryToApply(); + + std::string after_op_1 = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeInt 32 1 + %7 = OpTypePointer Function %6 + %9 = OpConstant %6 2 + %4 = OpFunction %2 None %3 + %5 = OpLabel + %8 = OpVariable %7 Function + %10 = OpVariable %7 Function + %14 = OpVariable %7 Function + OpStore %8 %9 + %11 = OpLoad %6 %8 + %12 = OpLoad %6 %8 + %13 = OpIAdd %6 %11 %12 + OpStore %8 %13 ; %10 -> %8 + %15 = OpLoad %6 %8 ; %10 -> %8 + OpStore %14 %15 + OpReturn + OpFunctionEnd + )"; + + CheckEqual(env, after_op_1, context.get()); + + ASSERT_TRUE(ops[2]->PreconditionHolds()); + ops[2]->TryToApply(); + + std::string after_op_2 = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeInt 32 1 + %7 = OpTypePointer Function %6 + %9 = OpConstant %6 2 + %4 = OpFunction %2 None %3 + %5 = OpLabel + %8 = OpVariable %7 Function + %10 = OpVariable %7 Function + %14 = OpVariable %7 Function + OpStore %8 %9 + %11 = OpLoad %6 %8 + %12 = OpLoad %6 %8 + %13 = OpIAdd %6 %11 %12 + OpStore %8 %13 ; %10 -> %8 + %15 = OpLoad %6 %8 ; %10 -> %8 + OpStore %8 %15 ; %14 -> %8 + OpReturn + OpFunctionEnd + )"; + + CheckEqual(env, after_op_2, context.get()); + + // The precondition has been disabled by an earlier opportunity's application. + ASSERT_FALSE(ops[3]->PreconditionHolds()); + + ASSERT_TRUE(ops[4]->PreconditionHolds()); + ops[4]->TryToApply(); + + std::string after_op_4 = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeInt 32 1 + %7 = OpTypePointer Function %6 + %9 = OpConstant %6 2 + %4 = OpFunction %2 None %3 + %5 = OpLabel + %8 = OpVariable %7 Function + %10 = OpVariable %7 Function + %14 = OpVariable %7 Function + OpStore %8 %9 + %11 = OpLoad %6 %8 + %12 = OpLoad %6 %8 + %13 = OpIAdd %6 %11 %11 ; %12 -> %11 + OpStore %8 %13 ; %10 -> %8 + %15 = OpLoad %6 %8 ; %10 -> %8 + OpStore %8 %15 ; %14 -> %8 + OpReturn + OpFunctionEnd + )"; + CheckEqual(env, after_op_4, context.get()); +} + +} // namespace +} // namespace reduce +} // namespace spvtools diff --git a/3rdparty/spirv-tools/test/reduce/operand_to_undef_reduction_pass_test.cpp b/3rdparty/spirv-tools/test/reduce/operand_to_undef_reduction_pass_test.cpp new file mode 100644 index 000000000..71bf96cf4 --- /dev/null +++ b/3rdparty/spirv-tools/test/reduce/operand_to_undef_reduction_pass_test.cpp @@ -0,0 +1,226 @@ +// Copyright (c) 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "source/reduce/operand_to_undef_reduction_pass.h" +#include "source/opt/build_module.h" +#include "test/reduce/reduce_test_util.h" + +namespace spvtools { +namespace reduce { +namespace { + +TEST(OperandToUndefReductionPassTest, BasicCheck) { + // The following shader has 10 opportunities for replacing with undef. + + // #version 310 es + // + // precision highp float; + // + // layout(location=0) out vec4 _GLF_color; + // + // layout(set = 0, binding = 0) uniform buf0 { + // vec2 uniform1; + // }; + // + // void main() + // { + // _GLF_color = + // vec4( // opportunity + // uniform1.x / 2.0, // opportunity x2 (2.0 is const) + // uniform1.y / uniform1.x, // opportunity x3 + // uniform1.x + uniform1.x, // opportunity x3 + // uniform1.y); // opportunity + // } + + std::string original = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" %9 + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + OpName %4 "main" + OpName %9 "_GLF_color" + OpName %11 "buf0" + OpMemberName %11 0 "uniform1" + OpName %13 "" + OpDecorate %9 Location 0 + OpMemberDecorate %11 0 Offset 0 + OpDecorate %11 Block + OpDecorate %13 DescriptorSet 0 + OpDecorate %13 Binding 0 + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeFloat 32 + %7 = OpTypeVector %6 4 + %8 = OpTypePointer Output %7 + %9 = OpVariable %8 Output + %10 = OpTypeVector %6 2 + %11 = OpTypeStruct %10 + %12 = OpTypePointer Uniform %11 + %13 = OpVariable %12 Uniform + %14 = OpTypeInt 32 1 + %15 = OpConstant %14 0 + %16 = OpTypeInt 32 0 + %17 = OpConstant %16 0 + %18 = OpTypePointer Uniform %6 + %21 = OpConstant %6 2 + %23 = OpConstant %16 1 + %4 = OpFunction %2 None %3 + %5 = OpLabel + %19 = OpAccessChain %18 %13 %15 %17 + %20 = OpLoad %6 %19 + %22 = OpFDiv %6 %20 %21 ; opportunity %20 (%21 is const) + %24 = OpAccessChain %18 %13 %15 %23 + %25 = OpLoad %6 %24 + %26 = OpAccessChain %18 %13 %15 %17 + %27 = OpLoad %6 %26 + %28 = OpFDiv %6 %25 %27 ; opportunity %25 %27 + %29 = OpAccessChain %18 %13 %15 %17 + %30 = OpLoad %6 %29 + %31 = OpAccessChain %18 %13 %15 %17 + %32 = OpLoad %6 %31 + %33 = OpFAdd %6 %30 %32 ; opportunity %30 %32 + %34 = OpAccessChain %18 %13 %15 %23 + %35 = OpLoad %6 %34 + %36 = OpCompositeConstruct %7 %22 %28 %33 %35 ; opportunity %22 %28 %33 %35 + OpStore %9 %36 ; opportunity %36 + OpReturn + OpFunctionEnd + )"; + + // This is the same as original, except where noted. + std::string expected = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" %9 + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + OpName %4 "main" + OpName %9 "_GLF_color" + OpName %11 "buf0" + OpMemberName %11 0 "uniform1" + OpName %13 "" + OpDecorate %9 Location 0 + OpMemberDecorate %11 0 Offset 0 + OpDecorate %11 Block + OpDecorate %13 DescriptorSet 0 + OpDecorate %13 Binding 0 + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeFloat 32 + %7 = OpTypeVector %6 4 + %8 = OpTypePointer Output %7 + %9 = OpVariable %8 Output + %10 = OpTypeVector %6 2 + %11 = OpTypeStruct %10 + %12 = OpTypePointer Uniform %11 + %13 = OpVariable %12 Uniform + %14 = OpTypeInt 32 1 + %15 = OpConstant %14 0 + %16 = OpTypeInt 32 0 + %17 = OpConstant %16 0 + %18 = OpTypePointer Uniform %6 + %21 = OpConstant %6 2 + %23 = OpConstant %16 1 + %37 = OpUndef %6 ; Added undef float as %37 + %4 = OpFunction %2 None %3 + %5 = OpLabel + %19 = OpAccessChain %18 %13 %15 %17 + %20 = OpLoad %6 %19 + %22 = OpFDiv %6 %37 %21 ; Replaced with %37 + %24 = OpAccessChain %18 %13 %15 %23 + %25 = OpLoad %6 %24 + %26 = OpAccessChain %18 %13 %15 %17 + %27 = OpLoad %6 %26 + %28 = OpFDiv %6 %37 %37 ; Replaced with %37 twice + %29 = OpAccessChain %18 %13 %15 %17 + %30 = OpLoad %6 %29 + %31 = OpAccessChain %18 %13 %15 %17 + %32 = OpLoad %6 %31 + %33 = OpFAdd %6 %30 %32 + %34 = OpAccessChain %18 %13 %15 %23 + %35 = OpLoad %6 %34 + %36 = OpCompositeConstruct %7 %22 %28 %33 %35 + OpStore %9 %36 + OpReturn + OpFunctionEnd + )"; + + const auto env = SPV_ENV_UNIVERSAL_1_3; + const auto consumer = nullptr; + const auto context = + BuildModule(env, consumer, original, kReduceAssembleOption); + const auto pass = TestSubclass(env); + const auto ops = pass.WrapGetAvailableOpportunities(context.get()); + + ASSERT_EQ(10, ops.size()); + + // Apply first three opportunities. + ASSERT_TRUE(ops[0]->PreconditionHolds()); + ops[0]->TryToApply(); + ASSERT_TRUE(ops[1]->PreconditionHolds()); + ops[1]->TryToApply(); + ASSERT_TRUE(ops[2]->PreconditionHolds()); + ops[2]->TryToApply(); + + CheckEqual(env, expected, context.get()); +} + +TEST(OperandToUndefReductionPassTest, WithCalledFunction) { + // The following shader has no opportunities. + // Most importantly, the noted function operand is not changed. + + std::string shader = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" %10 %12 + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeFloat 32 + %7 = OpTypeVector %6 4 + %8 = OpTypeFunction %7 + %9 = OpTypePointer Output %7 + %10 = OpVariable %9 Output + %11 = OpTypePointer Input %7 + %12 = OpVariable %11 Input + %13 = OpConstant %6 0 + %14 = OpConstantComposite %7 %13 %13 %13 %13 + %4 = OpFunction %2 None %3 + %5 = OpLabel + %15 = OpFunctionCall %7 %16 ; do not replace %16 with undef + OpReturn + OpFunctionEnd + %16 = OpFunction %7 None %8 + %17 = OpLabel + OpReturnValue %14 + OpFunctionEnd + )"; + + const auto env = SPV_ENV_UNIVERSAL_1_3; + const auto consumer = nullptr; + const auto context = + BuildModule(env, consumer, shader, kReduceAssembleOption); + const auto pass = TestSubclass(env); + const auto ops = pass.WrapGetAvailableOpportunities(context.get()); + ASSERT_EQ(0, ops.size()); +} + +} // namespace +} // namespace reduce +} // namespace spvtools diff --git a/3rdparty/spirv-tools/test/reduce/reduce_test_util.cpp b/3rdparty/spirv-tools/test/reduce/reduce_test_util.cpp new file mode 100644 index 000000000..19ef74989 --- /dev/null +++ b/3rdparty/spirv-tools/test/reduce/reduce_test_util.cpp @@ -0,0 +1,72 @@ +// Copyright (c) 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "reduce_test_util.h" + +namespace spvtools { +namespace reduce { + +void CheckEqual(const spv_target_env env, + const std::vector& expected_binary, + const std::vector& actual_binary) { + if (expected_binary != actual_binary) { + SpirvTools t(env); + std::string expected_disassembled; + std::string actual_disassembled; + ASSERT_TRUE(t.Disassemble(expected_binary, &expected_disassembled, + kReduceDisassembleOption)); + ASSERT_TRUE(t.Disassemble(actual_binary, &actual_disassembled, + kReduceDisassembleOption)); + ASSERT_EQ(expected_disassembled, actual_disassembled); + } +} + +void CheckEqual(const spv_target_env env, const std::string& expected_text, + const std::vector& actual_binary) { + std::vector expected_binary; + SpirvTools t(env); + ASSERT_TRUE( + t.Assemble(expected_text, &expected_binary, kReduceAssembleOption)); + CheckEqual(env, expected_binary, actual_binary); +} + +void CheckEqual(const spv_target_env env, const std::string& expected_text, + const opt::IRContext* actual_ir) { + std::vector actual_binary; + actual_ir->module()->ToBinary(&actual_binary, false); + CheckEqual(env, expected_text, actual_binary); +} + +void CheckValid(spv_target_env env, const opt::IRContext* ir) { + std::vector binary; + ir->module()->ToBinary(&binary, false); + SpirvTools t(env); + ASSERT_TRUE(t.Validate(binary)); +} + +std::string ToString(spv_target_env env, const opt::IRContext* ir) { + std::vector binary; + ir->module()->ToBinary(&binary, false); + SpirvTools t(env); + std::string result; + t.Disassemble(binary, &result, kReduceDisassembleOption); + return result; +} + +void NopDiagnostic(spv_message_level_t /*level*/, const char* /*source*/, + const spv_position_t& /*position*/, + const char* /*message*/) {} + +} // namespace reduce +} // namespace spvtools diff --git a/3rdparty/spirv-tools/test/reduce/reduce_test_util.h b/3rdparty/spirv-tools/test/reduce/reduce_test_util.h new file mode 100644 index 000000000..499c77475 --- /dev/null +++ b/3rdparty/spirv-tools/test/reduce/reduce_test_util.h @@ -0,0 +1,82 @@ +// Copyright (c) 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef TEST_REDUCE_REDUCE_TEST_UTIL_H_ +#define TEST_REDUCE_REDUCE_TEST_UTIL_H_ + +#include "gtest/gtest.h" + +#include "source/opt/ir_context.h" +#include "source/reduce/reduction_opportunity.h" +#include "spirv-tools/libspirv.h" + +namespace spvtools { +namespace reduce { + +// A helper class that subclasses a given reduction pass class in order to +// provide a wrapper for its protected methods. +template +class TestSubclass : public ReductionPassT { + public: + // Creates an instance of the reduction pass subclass with respect to target + // environment |env|. + explicit TestSubclass(const spv_target_env env) : ReductionPassT(env) {} + ~TestSubclass() = default; + + // A wrapper for GetAvailableOpportunities(...) + std::vector> + WrapGetAvailableOpportunities(opt::IRContext* context) const { + return ReductionPassT::GetAvailableOpportunities(context); + } +}; + +// Checks whether the given binaries are bit-wise equal. +void CheckEqual(spv_target_env env, + const std::vector& expected_binary, + const std::vector& actual_binary); + +// Assembles the given text and check whether the resulting binary is bit-wise +// equal to the given binary. +void CheckEqual(spv_target_env env, const std::string& expected_text, + const std::vector& actual_binary); + +// Assembles the given text and turns the given IR into binary, then checks +// whether the resulting binaries are bit-wise equal. +void CheckEqual(spv_target_env env, const std::string& expected_text, + const opt::IRContext* actual_ir); + +// Assembles the given IR context and checks whether the resulting binary is +// valid. +void CheckValid(spv_target_env env, const opt::IRContext* ir); + +// Assembles the given IR context, then returns its disassembly as a string. +// Useful for debugging. +std::string ToString(spv_target_env env, const opt::IRContext* ir); + +// Assembly options for writing reduction tests. It simplifies matters if +// numeric ids do not change. +const uint32_t kReduceAssembleOption = + SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS; +// Disassembly options for writing reduction tests. +const uint32_t kReduceDisassembleOption = + SPV_BINARY_TO_TEXT_OPTION_NO_HEADER | SPV_BINARY_TO_TEXT_OPTION_INDENT; + +// Don't print reducer info during testing. +void NopDiagnostic(spv_message_level_t /*level*/, const char* /*source*/, + const spv_position_t& /*position*/, const char* /*message*/); + +} // namespace reduce +} // namespace spvtools + +#endif // TEST_REDUCE_REDUCE_TEST_UTIL_H_ diff --git a/3rdparty/spirv-tools/test/reduce/reducer_test.cpp b/3rdparty/spirv-tools/test/reduce/reducer_test.cpp new file mode 100644 index 000000000..88fc5e44e --- /dev/null +++ b/3rdparty/spirv-tools/test/reduce/reducer_test.cpp @@ -0,0 +1,310 @@ +// Copyright (c) 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "reduce_test_util.h" + +#include "source/reduce/operand_to_const_reduction_pass.h" +#include "source/reduce/reducer.h" +#include "source/reduce/remove_opname_instruction_reduction_pass.h" +#include "source/reduce/remove_unreferenced_instruction_reduction_pass.h" + +namespace spvtools { +namespace reduce { +namespace { + +// This changes its mind each time IsInteresting is invoked as to whether the +// binary is interesting, until some limit is reached after which the binary is +// always deemed interesting. This is useful to test that reduction passes +// interleave in interesting ways for a while, and then always succeed after +// some point; the latter is important to end up with a predictable final +// reduced binary for tests. +class PingPongInteresting { + public: + explicit PingPongInteresting(uint32_t always_interesting_after) + : is_interesting_(true), + always_interesting_after_(always_interesting_after), + count_(0) {} + + bool IsInteresting(const std::vector&) { + bool result; + if (count_ > always_interesting_after_) { + result = true; + } else { + result = is_interesting_; + is_interesting_ = !is_interesting_; + } + count_++; + return result; + } + + private: + bool is_interesting_; + const uint32_t always_interesting_after_; + uint32_t count_; +}; + +TEST(ReducerTest, ExprToConstantAndRemoveUnreferenced) { + std::string original = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" %60 + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + OpName %4 "main" + OpName %16 "buf2" + OpMemberName %16 0 "i" + OpName %18 "" + OpName %25 "buf1" + OpMemberName %25 0 "f" + OpName %27 "" + OpName %60 "_GLF_color" + OpMemberDecorate %16 0 Offset 0 + OpDecorate %16 Block + OpDecorate %18 DescriptorSet 0 + OpDecorate %18 Binding 2 + OpMemberDecorate %25 0 Offset 0 + OpDecorate %25 Block + OpDecorate %27 DescriptorSet 0 + OpDecorate %27 Binding 1 + OpDecorate %60 Location 0 + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeInt 32 1 + %9 = OpConstant %6 0 + %16 = OpTypeStruct %6 + %17 = OpTypePointer Uniform %16 + %18 = OpVariable %17 Uniform + %19 = OpTypePointer Uniform %6 + %22 = OpTypeBool + %100 = OpConstantTrue %22 + %24 = OpTypeFloat 32 + %25 = OpTypeStruct %24 + %26 = OpTypePointer Uniform %25 + %27 = OpVariable %26 Uniform + %28 = OpTypePointer Uniform %24 + %31 = OpConstant %24 2 + %56 = OpConstant %6 1 + %58 = OpTypeVector %24 4 + %59 = OpTypePointer Output %58 + %60 = OpVariable %59 Output + %72 = OpUndef %24 + %74 = OpUndef %6 + %4 = OpFunction %2 None %3 + %5 = OpLabel + OpBranch %10 + %10 = OpLabel + %73 = OpPhi %6 %74 %5 %77 %34 + %71 = OpPhi %24 %72 %5 %76 %34 + %70 = OpPhi %6 %9 %5 %57 %34 + %20 = OpAccessChain %19 %18 %9 + %21 = OpLoad %6 %20 + %23 = OpSLessThan %22 %70 %21 + OpLoopMerge %12 %34 None + OpBranchConditional %23 %11 %12 + %11 = OpLabel + %29 = OpAccessChain %28 %27 %9 + %30 = OpLoad %24 %29 + %32 = OpFOrdGreaterThan %22 %30 %31 + OpSelectionMerge %34 None + OpBranchConditional %32 %33 %46 + %33 = OpLabel + %40 = OpFAdd %24 %71 %30 + %45 = OpISub %6 %73 %21 + OpBranch %34 + %46 = OpLabel + %50 = OpFMul %24 %71 %30 + %54 = OpSDiv %6 %73 %21 + OpBranch %34 + %34 = OpLabel + %77 = OpPhi %6 %45 %33 %54 %46 + %76 = OpPhi %24 %40 %33 %50 %46 + %57 = OpIAdd %6 %70 %56 + OpBranch %10 + %12 = OpLabel + %61 = OpAccessChain %28 %27 %9 + %62 = OpLoad %24 %61 + %66 = OpConvertSToF %24 %21 + %68 = OpConvertSToF %24 %73 + %69 = OpCompositeConstruct %58 %62 %71 %66 %68 + OpStore %60 %69 + OpReturn + OpFunctionEnd + )"; + + std::string expected = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" %60 + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + OpName %4 "main" + OpName %16 "buf2" + OpMemberName %16 0 "i" + OpName %18 "" + OpName %25 "buf1" + OpMemberName %25 0 "f" + OpName %27 "" + OpName %60 "_GLF_color" + OpMemberDecorate %16 0 Offset 0 + OpDecorate %16 Block + OpDecorate %18 DescriptorSet 0 + OpDecorate %18 Binding 2 + OpMemberDecorate %25 0 Offset 0 + OpDecorate %25 Block + OpDecorate %27 DescriptorSet 0 + OpDecorate %27 Binding 1 + OpDecorate %60 Location 0 + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeInt 32 1 + %9 = OpConstant %6 0 + %16 = OpTypeStruct %6 + %17 = OpTypePointer Uniform %16 + %18 = OpVariable %17 Uniform + %19 = OpTypePointer Uniform %6 + %22 = OpTypeBool + %100 = OpConstantTrue %22 + %24 = OpTypeFloat 32 + %25 = OpTypeStruct %24 + %26 = OpTypePointer Uniform %25 + %27 = OpVariable %26 Uniform + %28 = OpTypePointer Uniform %24 + %31 = OpConstant %24 2 + %56 = OpConstant %6 1 + %58 = OpTypeVector %24 4 + %59 = OpTypePointer Output %58 + %60 = OpVariable %59 Output + %72 = OpUndef %24 + %74 = OpUndef %6 + %4 = OpFunction %2 None %3 + %5 = OpLabel + OpBranch %10 + %10 = OpLabel + OpLoopMerge %12 %34 None + OpBranchConditional %100 %11 %12 + %11 = OpLabel + OpSelectionMerge %34 None + OpBranchConditional %100 %33 %46 + %33 = OpLabel + OpBranch %34 + %46 = OpLabel + OpBranch %34 + %34 = OpLabel + OpBranch %10 + %12 = OpLabel + OpReturn + OpFunctionEnd + )"; + + spv_target_env env = SPV_ENV_UNIVERSAL_1_3; + Reducer reducer(env); + PingPongInteresting ping_pong_interesting(10); + reducer.SetMessageConsumer(NopDiagnostic); + reducer.SetInterestingnessFunction( + [&](const std::vector& binary, uint32_t) -> bool { + return ping_pong_interesting.IsInteresting(binary); + }); + reducer.AddReductionPass(MakeUnique(env)); + reducer.AddReductionPass( + MakeUnique(env)); + + std::vector binary_in; + SpirvTools t(env); + + ASSERT_TRUE(t.Assemble(original, &binary_in, kReduceAssembleOption)); + std::vector binary_out; + spvtools::ReducerOptions reducer_options; + reducer_options.set_step_limit(500); + + reducer.Run(std::move(binary_in), &binary_out, reducer_options); + + CheckEqual(env, expected, binary_out); +} + +TEST(ReducerTest, RemoveOpnameAndRemoveUnreferenced) { + const std::string original = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %2 "main" + OpExecutionMode %2 OriginUpperLeft + OpSource ESSL 310 + OpName %2 "main" + OpName %3 "a" + OpName %4 "this-name-counts-as-usage-for-load-instruction" + %5 = OpTypeVoid + %6 = OpTypeFunction %5 + %7 = OpTypeFloat 32 + %8 = OpTypePointer Function %7 + %9 = OpConstant %7 1 + %2 = OpFunction %5 None %6 + %10 = OpLabel + %3 = OpVariable %8 Function + %4 = OpLoad %7 %3 + OpStore %3 %7 + OpReturn + OpFunctionEnd + )"; + + const std::string expected = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %2 "main" + OpExecutionMode %2 OriginUpperLeft + OpSource ESSL 310 + %5 = OpTypeVoid + %6 = OpTypeFunction %5 + %7 = OpTypeFloat 32 + %8 = OpTypePointer Function %7 + %9 = OpConstant %7 1 + %2 = OpFunction %5 None %6 + %10 = OpLabel + OpReturn + OpFunctionEnd + )"; + + spv_target_env env = SPV_ENV_UNIVERSAL_1_3; + Reducer reducer(env); + // Make ping-pong interesting very quickly, as there are not much + // opportunities. + PingPongInteresting ping_pong_interesting(1); + reducer.SetMessageConsumer(NopDiagnostic); + reducer.SetInterestingnessFunction( + [&](const std::vector& binary, uint32_t) -> bool { + return ping_pong_interesting.IsInteresting(binary); + }); + reducer.AddReductionPass( + MakeUnique(env)); + reducer.AddReductionPass( + MakeUnique(env)); + + std::vector binary_in; + SpirvTools t(env); + + ASSERT_TRUE(t.Assemble(original, &binary_in, kReduceAssembleOption)); + std::vector binary_out; + spvtools::ReducerOptions reducer_options; + reducer_options.set_step_limit(500); + + reducer.Run(std::move(binary_in), &binary_out, reducer_options); + + CheckEqual(env, expected, binary_out); +} + +} // namespace +} // namespace reduce +} // namespace spvtools \ No newline at end of file diff --git a/3rdparty/spirv-tools/test/reduce/remove_opname_instruction_reduction_pass_test.cpp b/3rdparty/spirv-tools/test/reduce/remove_opname_instruction_reduction_pass_test.cpp new file mode 100644 index 000000000..38a2d7f77 --- /dev/null +++ b/3rdparty/spirv-tools/test/reduce/remove_opname_instruction_reduction_pass_test.cpp @@ -0,0 +1,216 @@ +// Copyright (c) 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "reduce_test_util.h" + +#include "source/opt/build_module.h" +#include "source/reduce/reduction_opportunity.h" +#include "source/reduce/remove_opname_instruction_reduction_pass.h" + +namespace spvtools { +namespace reduce { +namespace { + +TEST(RemoveOpnameInstructionReductionPassTest, NothingToRemove) { + const std::string source = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %4 = OpFunction %2 None %3 + %5 = OpLabel + OpReturn + OpFunctionEnd + )"; + + const auto env = SPV_ENV_UNIVERSAL_1_3; + const auto consumer = nullptr; + const auto context = + BuildModule(env, consumer, source, kReduceAssembleOption); + const auto pass = TestSubclass(env); + const auto ops = pass.WrapGetAvailableOpportunities(context.get()); + ASSERT_EQ(0, ops.size()); +} + +TEST(RemoveOpnameInstructionReductionPassTest, RemoveSingleOpName) { + const std::string prologue = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + )"; + + const std::string epilogue = R"( + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %4 = OpFunction %2 None %3 + %5 = OpLabel + OpReturn + OpFunctionEnd + )"; + + const std::string original = prologue + R"( + OpName %4 "main" + )" + epilogue; + + const std::string expected = prologue + epilogue; + + const auto env = SPV_ENV_UNIVERSAL_1_3; + const auto consumer = nullptr; + const auto context = + BuildModule(env, consumer, original, kReduceAssembleOption); + const auto pass = TestSubclass(env); + const auto ops = pass.WrapGetAvailableOpportunities(context.get()); + ASSERT_EQ(1, ops.size()); + ASSERT_TRUE(ops[0]->PreconditionHolds()); + ops[0]->TryToApply(); + + CheckEqual(env, expected, context.get()); +} + +TEST(RemoveOpnameInstructionReductionPassTest, TryApplyRemovesAllOpName) { + const std::string prologue = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + )"; + + const std::string epilogue = R"( + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeFloat 32 + %7 = OpTypePointer Function %6 + %9 = OpConstant %6 1 + %4 = OpFunction %2 None %3 + %5 = OpLabel + %8 = OpVariable %7 Function + %10 = OpVariable %7 Function + %11 = OpVariable %7 Function + %12 = OpVariable %7 Function + OpStore %8 %9 + OpStore %10 %9 + OpStore %11 %9 + OpStore %12 %9 + OpReturn + OpFunctionEnd + )"; + + const std::string original = prologue + R"( + OpName %4 "main" + OpName %8 "a" + OpName %10 "b" + OpName %11 "c" + OpName %12 "d" + )" + epilogue; + + const std::string expected = prologue + epilogue; + + const auto env = SPV_ENV_UNIVERSAL_1_3; + auto pass = TestSubclass(env); + + { + // Check the right number of opportunities is detected + const auto consumer = nullptr; + const auto context = + BuildModule(env, consumer, original, kReduceAssembleOption); + const auto ops = pass.WrapGetAvailableOpportunities(context.get()); + ASSERT_EQ(5, ops.size()); + } + + { + // The reduction should remove all OpName + std::vector binary; + SpirvTools t(env); + ASSERT_TRUE(t.Assemble(original, &binary, kReduceAssembleOption)); + auto reduced_binary = pass.TryApplyReduction(binary); + CheckEqual(env, expected, reduced_binary); + } +} + +TEST(RemoveOpnameInstructionReductionPassTest, + TryApplyRemovesAllOpNameAndOpMemberName) { + const std::string prologue = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + )"; + + const std::string epilogue = R"( + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeFloat 32 + %7 = OpTypeInt 32 1 + %8 = OpTypeVector %6 3 + %9 = OpTypeStruct %6 %7 %8 + %10 = OpTypePointer Function %9 + %12 = OpConstant %7 0 + %13 = OpConstant %6 1 + %14 = OpTypePointer Function %6 + %4 = OpFunction %2 None %3 + %5 = OpLabel + %11 = OpVariable %10 Function + %15 = OpAccessChain %14 %11 %12 + OpStore %15 %13 + OpReturn + OpFunctionEnd + )"; + + const std::string original = prologue + R"( + OpName %4 "main" + OpName %9 "S" + OpMemberName %9 0 "f" + OpMemberName %9 1 "i" + OpMemberName %9 2 "v" + OpName %11 "s" + )" + epilogue; + + const std::string expected = prologue + epilogue; + + const auto env = SPV_ENV_UNIVERSAL_1_3; + auto pass = TestSubclass(env); + + { + // Check the right number of opportunities is detected + const auto consumer = nullptr; + const auto context = + BuildModule(env, consumer, original, kReduceAssembleOption); + const auto ops = pass.WrapGetAvailableOpportunities(context.get()); + ASSERT_EQ(6, ops.size()); + } + + { + // The reduction should remove all OpName + std::vector binary; + SpirvTools t(env); + ASSERT_TRUE(t.Assemble(original, &binary, kReduceAssembleOption)); + auto reduced_binary = pass.TryApplyReduction(binary); + CheckEqual(env, expected, reduced_binary); + } +} + +} // namespace +} // namespace reduce +} // namespace spvtools diff --git a/3rdparty/spirv-tools/test/reduce/remove_unreferenced_instruction_reduction_pass_test.cpp b/3rdparty/spirv-tools/test/reduce/remove_unreferenced_instruction_reduction_pass_test.cpp new file mode 100644 index 000000000..a002fa36a --- /dev/null +++ b/3rdparty/spirv-tools/test/reduce/remove_unreferenced_instruction_reduction_pass_test.cpp @@ -0,0 +1,230 @@ +// Copyright (c) 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "reduce_test_util.h" + +#include "source/opt/build_module.h" +#include "source/reduce/reduction_opportunity.h" +#include "source/reduce/remove_unreferenced_instruction_reduction_pass.h" + +namespace spvtools { +namespace reduce { +namespace { + +TEST(RemoveUnreferencedInstructionReductionPassTest, RemoveStores) { + const std::string prologue = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + OpName %4 "main" + OpName %8 "a" + OpName %10 "b" + OpName %12 "c" + OpName %14 "d" + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeInt 32 1 + %7 = OpTypePointer Function %6 + %9 = OpConstant %6 10 + %11 = OpConstant %6 20 + %13 = OpConstant %6 30 + %4 = OpFunction %2 None %3 + %5 = OpLabel + %8 = OpVariable %7 Function + %10 = OpVariable %7 Function + %12 = OpVariable %7 Function + %14 = OpVariable %7 Function + )"; + + const std::string epilogue = R"( + OpReturn + OpFunctionEnd + )"; + + const std::string original = prologue + R"( + OpStore %8 %9 + OpStore %10 %11 + OpStore %12 %13 + %15 = OpLoad %6 %8 + OpStore %14 %15 + )" + epilogue; + + const std::string expected = prologue + R"( + OpStore %12 %13 + %15 = OpLoad %6 %8 + OpStore %14 %15 + )" + epilogue; + + const auto env = SPV_ENV_UNIVERSAL_1_3; + const auto consumer = nullptr; + const auto context = + BuildModule(env, consumer, original, kReduceAssembleOption); + const auto pass = + TestSubclass(env); + const auto ops = pass.WrapGetAvailableOpportunities(context.get()); + ASSERT_EQ(4, ops.size()); + ASSERT_TRUE(ops[0]->PreconditionHolds()); + ops[0]->TryToApply(); + ASSERT_TRUE(ops[1]->PreconditionHolds()); + ops[1]->TryToApply(); + + CheckEqual(env, expected, context.get()); +} + +TEST(RemoveUnreferencedInstructionReductionPassTest, ApplyReduction) { + const std::string prologue = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + OpName %4 "main" + OpName %8 "a" + OpName %10 "b" + OpName %12 "c" + OpName %14 "d" + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeInt 32 1 + %7 = OpTypePointer Function %6 + %9 = OpConstant %6 10 + %11 = OpConstant %6 20 + %13 = OpConstant %6 30 + %4 = OpFunction %2 None %3 + %5 = OpLabel + %8 = OpVariable %7 Function + %10 = OpVariable %7 Function + %12 = OpVariable %7 Function + %14 = OpVariable %7 Function + )"; + + const std::string epilogue = R"( + OpReturn + OpFunctionEnd + )"; + + const std::string original = prologue + R"( + OpStore %8 %9 + OpStore %10 %11 + OpStore %12 %13 + %15 = OpLoad %6 %8 + OpStore %14 %15 + )" + epilogue; + + const auto env = SPV_ENV_UNIVERSAL_1_3; + + std::vector binary; + SpirvTools t(env); + ASSERT_TRUE(t.Assemble(original, &binary, kReduceAssembleOption)); + + auto pass = TestSubclass(env); + + { + // Attempt 1 should remove everything removable. + const std::string expected_reduced = prologue + R"( + %15 = OpLoad %6 %8 + )" + epilogue; + auto reduced_binary = pass.TryApplyReduction(binary); + CheckEqual(env, expected_reduced, reduced_binary); + } + + // Attempt 2 should fail as pass with granularity 4 got to end. + ASSERT_EQ(0, pass.TryApplyReduction(binary).size()); + + { + // Attempt 3 should remove first two removable statements. + const std::string expected_reduced = prologue + R"( + OpStore %12 %13 + %15 = OpLoad %6 %8 + OpStore %14 %15 + )" + epilogue; + auto reduced_binary = pass.TryApplyReduction(binary); + CheckEqual(env, expected_reduced, reduced_binary); + } + + { + // Attempt 4 should remove last two removable statements. + const std::string expected_reduced = prologue + R"( + OpStore %8 %9 + OpStore %10 %11 + %15 = OpLoad %6 %8 + )" + epilogue; + auto reduced_binary = pass.TryApplyReduction(binary); + CheckEqual(env, expected_reduced, reduced_binary); + } + + // Attempt 5 should fail as pass with granularity 2 got to end. + ASSERT_EQ(0, pass.TryApplyReduction(binary).size()); + + { + // Attempt 6 should remove first removable statement. + const std::string expected_reduced = prologue + R"( + OpStore %10 %11 + OpStore %12 %13 + %15 = OpLoad %6 %8 + OpStore %14 %15 + )" + epilogue; + auto reduced_binary = pass.TryApplyReduction(binary); + CheckEqual(env, expected_reduced, reduced_binary); + } + + { + // Attempt 7 should remove second removable statement. + const std::string expected_reduced = prologue + R"( + OpStore %8 %9 + OpStore %12 %13 + %15 = OpLoad %6 %8 + OpStore %14 %15 + )" + epilogue; + auto reduced_binary = pass.TryApplyReduction(binary); + CheckEqual(env, expected_reduced, reduced_binary); + } + + { + // Attempt 8 should remove third removable statement. + const std::string expected_reduced = prologue + R"( + OpStore %8 %9 + OpStore %10 %11 + %15 = OpLoad %6 %8 + OpStore %14 %15 + )" + epilogue; + auto reduced_binary = pass.TryApplyReduction(binary); + CheckEqual(env, expected_reduced, reduced_binary); + } + + { + // Attempt 9 should remove fourth removable statement. + const std::string expected_reduced = prologue + R"( + OpStore %8 %9 + OpStore %10 %11 + OpStore %12 %13 + %15 = OpLoad %6 %8 + )" + epilogue; + auto reduced_binary = pass.TryApplyReduction(binary); + CheckEqual(env, expected_reduced, reduced_binary); + } + + // Attempt 10 should fail as pass with granularity 1 got to end. + ASSERT_EQ(0, pass.TryApplyReduction(binary).size()); + + ASSERT_TRUE(pass.ReachedMinimumGranularity()); +} + +} // namespace +} // namespace reduce +} // namespace spvtools diff --git a/3rdparty/spirv-tools/test/reduce/structured_loop_to_selection_reduction_pass_test.cpp b/3rdparty/spirv-tools/test/reduce/structured_loop_to_selection_reduction_pass_test.cpp new file mode 100644 index 000000000..8388cb2e2 --- /dev/null +++ b/3rdparty/spirv-tools/test/reduce/structured_loop_to_selection_reduction_pass_test.cpp @@ -0,0 +1,3440 @@ +// Copyright (c) 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "source/reduce/structured_loop_to_selection_reduction_pass.h" +#include "reduce_test_util.h" +#include "source/opt/build_module.h" + +namespace spvtools { +namespace reduce { +namespace { + +TEST(StructuredLoopToSelectionReductionPassTest, LoopyShader1) { + std::string shader = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeInt 32 1 + %7 = OpTypePointer Function %6 + %9 = OpConstant %6 0 + %16 = OpConstant %6 100 + %17 = OpTypeBool + %20 = OpConstant %6 1 + %4 = OpFunction %2 None %3 + %5 = OpLabel + %8 = OpVariable %7 Function + OpStore %8 %9 + OpBranch %10 + %10 = OpLabel + OpLoopMerge %12 %13 None + OpBranch %14 + %14 = OpLabel + %15 = OpLoad %6 %8 + %18 = OpSLessThan %17 %15 %16 + OpBranchConditional %18 %11 %12 + %11 = OpLabel + OpBranch %13 + %13 = OpLabel + %19 = OpLoad %6 %8 + %21 = OpIAdd %6 %19 %20 + OpStore %8 %21 + OpBranch %10 + %12 = OpLabel + OpReturn + OpFunctionEnd + )"; + + const auto env = SPV_ENV_UNIVERSAL_1_3; + const auto context = BuildModule(env, nullptr, shader, kReduceAssembleOption); + const auto pass = TestSubclass(env); + const auto ops = pass.WrapGetAvailableOpportunities(context.get()); + ASSERT_EQ(1, ops.size()); + + ASSERT_TRUE(ops[0]->PreconditionHolds()); + ops[0]->TryToApply(); + CheckValid(env, context.get()); + + std::string after_op_0 = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeInt 32 1 + %7 = OpTypePointer Function %6 + %9 = OpConstant %6 0 + %16 = OpConstant %6 100 + %17 = OpTypeBool + %20 = OpConstant %6 1 + %22 = OpConstantTrue %17 + %4 = OpFunction %2 None %3 + %5 = OpLabel + %8 = OpVariable %7 Function + OpStore %8 %9 + OpBranch %10 + %10 = OpLabel + OpSelectionMerge %12 None + OpBranchConditional %22 %14 %12 + %14 = OpLabel + %15 = OpLoad %6 %8 + %18 = OpSLessThan %17 %15 %16 + OpBranchConditional %18 %11 %12 + %11 = OpLabel + OpBranch %12 + %13 = OpLabel + %19 = OpLoad %6 %8 + %21 = OpIAdd %6 %19 %20 + OpStore %8 %21 + OpBranch %10 + %12 = OpLabel + OpReturn + OpFunctionEnd + )"; + CheckEqual(env, after_op_0, context.get()); +} + +TEST(StructuredLoopToSelectionReductionPassTest, LoopyShader2) { + std::string shader = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeInt 32 1 + %7 = OpTypePointer Function %6 + %9 = OpConstant %6 0 + %16 = OpConstant %6 100 + %17 = OpTypeBool + %28 = OpConstant %6 1 + %4 = OpFunction %2 None %3 + %5 = OpLabel + %8 = OpVariable %7 Function + %19 = OpVariable %7 Function + %32 = OpVariable %7 Function + %40 = OpVariable %7 Function + OpStore %8 %9 + OpBranch %10 + %10 = OpLabel + OpLoopMerge %12 %13 None + OpBranch %14 + %14 = OpLabel + %15 = OpLoad %6 %8 + %18 = OpSLessThan %17 %15 %16 + OpBranchConditional %18 %11 %12 + %11 = OpLabel + OpStore %19 %9 + OpBranch %20 + %20 = OpLabel + OpLoopMerge %22 %23 None + OpBranch %24 + %24 = OpLabel + %25 = OpLoad %6 %19 + %26 = OpSLessThan %17 %25 %16 + OpBranchConditional %26 %21 %22 + %21 = OpLabel + OpBranch %23 + %23 = OpLabel + %27 = OpLoad %6 %19 + %29 = OpIAdd %6 %27 %28 + OpStore %19 %29 + OpBranch %20 + %22 = OpLabel + OpBranch %13 + %13 = OpLabel + %30 = OpLoad %6 %8 + %31 = OpIAdd %6 %30 %28 + OpStore %8 %31 + OpBranch %10 + %12 = OpLabel + OpStore %32 %9 + OpBranch %33 + %33 = OpLabel + OpLoopMerge %35 %36 None + OpBranch %37 + %37 = OpLabel + %38 = OpLoad %6 %32 + %39 = OpSLessThan %17 %38 %16 + OpBranchConditional %39 %34 %35 + %34 = OpLabel + OpStore %40 %9 + OpBranch %41 + %41 = OpLabel + OpLoopMerge %43 %44 None + OpBranch %45 + %45 = OpLabel + %46 = OpLoad %6 %40 + %47 = OpSLessThan %17 %46 %16 + OpBranchConditional %47 %42 %43 + %42 = OpLabel + OpBranch %44 + %44 = OpLabel + %48 = OpLoad %6 %40 + %49 = OpIAdd %6 %48 %28 + OpStore %40 %49 + OpBranch %41 + %43 = OpLabel + OpBranch %36 + %36 = OpLabel + %50 = OpLoad %6 %32 + %51 = OpIAdd %6 %50 %28 + OpStore %32 %51 + OpBranch %33 + %35 = OpLabel + OpReturn + OpFunctionEnd + )"; + + const auto env = SPV_ENV_UNIVERSAL_1_3; + const auto context = BuildModule(env, nullptr, shader, kReduceAssembleOption); + const auto pass = TestSubclass(env); + const auto ops = pass.WrapGetAvailableOpportunities(context.get()); + ASSERT_EQ(4, ops.size()); + + ASSERT_TRUE(ops[0]->PreconditionHolds()); + ops[0]->TryToApply(); + CheckValid(env, context.get()); + std::string after_op_0 = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeInt 32 1 + %7 = OpTypePointer Function %6 + %9 = OpConstant %6 0 + %16 = OpConstant %6 100 + %17 = OpTypeBool + %28 = OpConstant %6 1 + %52 = OpConstantTrue %17 + %4 = OpFunction %2 None %3 + %5 = OpLabel + %8 = OpVariable %7 Function + %19 = OpVariable %7 Function + %32 = OpVariable %7 Function + %40 = OpVariable %7 Function + OpStore %8 %9 + OpBranch %10 + %10 = OpLabel + OpSelectionMerge %12 None + OpBranchConditional %52 %14 %12 + %14 = OpLabel + %15 = OpLoad %6 %8 + %18 = OpSLessThan %17 %15 %16 + OpBranchConditional %18 %11 %12 + %11 = OpLabel + OpStore %19 %9 + OpBranch %20 + %20 = OpLabel + OpLoopMerge %22 %23 None + OpBranch %24 + %24 = OpLabel + %25 = OpLoad %6 %19 + %26 = OpSLessThan %17 %25 %16 + OpBranchConditional %26 %21 %22 + %21 = OpLabel + OpBranch %23 + %23 = OpLabel + %27 = OpLoad %6 %19 + %29 = OpIAdd %6 %27 %28 + OpStore %19 %29 + OpBranch %20 + %22 = OpLabel + OpBranch %12 + %13 = OpLabel + %30 = OpLoad %6 %8 + %31 = OpIAdd %6 %30 %28 + OpStore %8 %31 + OpBranch %10 + %12 = OpLabel + OpStore %32 %9 + OpBranch %33 + %33 = OpLabel + OpLoopMerge %35 %36 None + OpBranch %37 + %37 = OpLabel + %38 = OpLoad %6 %32 + %39 = OpSLessThan %17 %38 %16 + OpBranchConditional %39 %34 %35 + %34 = OpLabel + OpStore %40 %9 + OpBranch %41 + %41 = OpLabel + OpLoopMerge %43 %44 None + OpBranch %45 + %45 = OpLabel + %46 = OpLoad %6 %40 + %47 = OpSLessThan %17 %46 %16 + OpBranchConditional %47 %42 %43 + %42 = OpLabel + OpBranch %44 + %44 = OpLabel + %48 = OpLoad %6 %40 + %49 = OpIAdd %6 %48 %28 + OpStore %40 %49 + OpBranch %41 + %43 = OpLabel + OpBranch %36 + %36 = OpLabel + %50 = OpLoad %6 %32 + %51 = OpIAdd %6 %50 %28 + OpStore %32 %51 + OpBranch %33 + %35 = OpLabel + OpReturn + OpFunctionEnd + )"; + CheckEqual(env, after_op_0, context.get()); + + ASSERT_TRUE(ops[1]->PreconditionHolds()); + ops[1]->TryToApply(); + CheckValid(env, context.get()); + std::string after_op_1 = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeInt 32 1 + %7 = OpTypePointer Function %6 + %9 = OpConstant %6 0 + %16 = OpConstant %6 100 + %17 = OpTypeBool + %28 = OpConstant %6 1 + %52 = OpConstantTrue %17 + %4 = OpFunction %2 None %3 + %5 = OpLabel + %8 = OpVariable %7 Function + %19 = OpVariable %7 Function + %32 = OpVariable %7 Function + %40 = OpVariable %7 Function + OpStore %8 %9 + OpBranch %10 + %10 = OpLabel + OpSelectionMerge %12 None + OpBranchConditional %52 %14 %12 + %14 = OpLabel + %15 = OpLoad %6 %8 + %18 = OpSLessThan %17 %15 %16 + OpBranchConditional %18 %11 %12 + %11 = OpLabel + OpStore %19 %9 + OpBranch %20 + %20 = OpLabel + OpSelectionMerge %22 None + OpBranchConditional %52 %24 %22 + %24 = OpLabel + %25 = OpLoad %6 %19 + %26 = OpSLessThan %17 %25 %16 + OpBranchConditional %26 %21 %22 + %21 = OpLabel + OpBranch %22 + %23 = OpLabel + %27 = OpLoad %6 %19 + %29 = OpIAdd %6 %27 %28 + OpStore %19 %29 + OpBranch %20 + %22 = OpLabel + OpBranch %12 + %13 = OpLabel + %30 = OpLoad %6 %8 + %31 = OpIAdd %6 %30 %28 + OpStore %8 %31 + OpBranch %10 + %12 = OpLabel + OpStore %32 %9 + OpBranch %33 + %33 = OpLabel + OpLoopMerge %35 %36 None + OpBranch %37 + %37 = OpLabel + %38 = OpLoad %6 %32 + %39 = OpSLessThan %17 %38 %16 + OpBranchConditional %39 %34 %35 + %34 = OpLabel + OpStore %40 %9 + OpBranch %41 + %41 = OpLabel + OpLoopMerge %43 %44 None + OpBranch %45 + %45 = OpLabel + %46 = OpLoad %6 %40 + %47 = OpSLessThan %17 %46 %16 + OpBranchConditional %47 %42 %43 + %42 = OpLabel + OpBranch %44 + %44 = OpLabel + %48 = OpLoad %6 %40 + %49 = OpIAdd %6 %48 %28 + OpStore %40 %49 + OpBranch %41 + %43 = OpLabel + OpBranch %36 + %36 = OpLabel + %50 = OpLoad %6 %32 + %51 = OpIAdd %6 %50 %28 + OpStore %32 %51 + OpBranch %33 + %35 = OpLabel + OpReturn + OpFunctionEnd + )"; + CheckEqual(env, after_op_1, context.get()); + + ASSERT_TRUE(ops[2]->PreconditionHolds()); + ops[2]->TryToApply(); + CheckValid(env, context.get()); + std::string after_op_2 = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeInt 32 1 + %7 = OpTypePointer Function %6 + %9 = OpConstant %6 0 + %16 = OpConstant %6 100 + %17 = OpTypeBool + %28 = OpConstant %6 1 + %52 = OpConstantTrue %17 + %4 = OpFunction %2 None %3 + %5 = OpLabel + %8 = OpVariable %7 Function + %19 = OpVariable %7 Function + %32 = OpVariable %7 Function + %40 = OpVariable %7 Function + OpStore %8 %9 + OpBranch %10 + %10 = OpLabel + OpSelectionMerge %12 None + OpBranchConditional %52 %14 %12 + %14 = OpLabel + %15 = OpLoad %6 %8 + %18 = OpSLessThan %17 %15 %16 + OpBranchConditional %18 %11 %12 + %11 = OpLabel + OpStore %19 %9 + OpBranch %20 + %20 = OpLabel + OpSelectionMerge %22 None + OpBranchConditional %52 %24 %22 + %24 = OpLabel + %25 = OpLoad %6 %19 + %26 = OpSLessThan %17 %25 %16 + OpBranchConditional %26 %21 %22 + %21 = OpLabel + OpBranch %22 + %23 = OpLabel + %27 = OpLoad %6 %19 + %29 = OpIAdd %6 %27 %28 + OpStore %19 %29 + OpBranch %20 + %22 = OpLabel + OpBranch %12 + %13 = OpLabel + %30 = OpLoad %6 %8 + %31 = OpIAdd %6 %30 %28 + OpStore %8 %31 + OpBranch %10 + %12 = OpLabel + OpStore %32 %9 + OpBranch %33 + %33 = OpLabel + OpSelectionMerge %35 None + OpBranchConditional %52 %37 %35 + %37 = OpLabel + %38 = OpLoad %6 %32 + %39 = OpSLessThan %17 %38 %16 + OpBranchConditional %39 %34 %35 + %34 = OpLabel + OpStore %40 %9 + OpBranch %41 + %41 = OpLabel + OpLoopMerge %43 %44 None + OpBranch %45 + %45 = OpLabel + %46 = OpLoad %6 %40 + %47 = OpSLessThan %17 %46 %16 + OpBranchConditional %47 %42 %43 + %42 = OpLabel + OpBranch %44 + %44 = OpLabel + %48 = OpLoad %6 %40 + %49 = OpIAdd %6 %48 %28 + OpStore %40 %49 + OpBranch %41 + %43 = OpLabel + OpBranch %35 + %36 = OpLabel + %50 = OpLoad %6 %32 + %51 = OpIAdd %6 %50 %28 + OpStore %32 %51 + OpBranch %33 + %35 = OpLabel + OpReturn + OpFunctionEnd + )"; + CheckEqual(env, after_op_2, context.get()); + + ASSERT_TRUE(ops[3]->PreconditionHolds()); + ops[3]->TryToApply(); + CheckValid(env, context.get()); + std::string after_op_3 = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeInt 32 1 + %7 = OpTypePointer Function %6 + %9 = OpConstant %6 0 + %16 = OpConstant %6 100 + %17 = OpTypeBool + %28 = OpConstant %6 1 + %52 = OpConstantTrue %17 + %4 = OpFunction %2 None %3 + %5 = OpLabel + %8 = OpVariable %7 Function + %19 = OpVariable %7 Function + %32 = OpVariable %7 Function + %40 = OpVariable %7 Function + OpStore %8 %9 + OpBranch %10 + %10 = OpLabel + OpSelectionMerge %12 None + OpBranchConditional %52 %14 %12 + %14 = OpLabel + %15 = OpLoad %6 %8 + %18 = OpSLessThan %17 %15 %16 + OpBranchConditional %18 %11 %12 + %11 = OpLabel + OpStore %19 %9 + OpBranch %20 + %20 = OpLabel + OpSelectionMerge %22 None + OpBranchConditional %52 %24 %22 + %24 = OpLabel + %25 = OpLoad %6 %19 + %26 = OpSLessThan %17 %25 %16 + OpBranchConditional %26 %21 %22 + %21 = OpLabel + OpBranch %22 + %23 = OpLabel + %27 = OpLoad %6 %19 + %29 = OpIAdd %6 %27 %28 + OpStore %19 %29 + OpBranch %20 + %22 = OpLabel + OpBranch %12 + %13 = OpLabel + %30 = OpLoad %6 %8 + %31 = OpIAdd %6 %30 %28 + OpStore %8 %31 + OpBranch %10 + %12 = OpLabel + OpStore %32 %9 + OpBranch %33 + %33 = OpLabel + OpSelectionMerge %35 None + OpBranchConditional %52 %37 %35 + %37 = OpLabel + %38 = OpLoad %6 %32 + %39 = OpSLessThan %17 %38 %16 + OpBranchConditional %39 %34 %35 + %34 = OpLabel + OpStore %40 %9 + OpBranch %41 + %41 = OpLabel + OpSelectionMerge %43 None + OpBranchConditional %52 %45 %43 + %45 = OpLabel + %46 = OpLoad %6 %40 + %47 = OpSLessThan %17 %46 %16 + OpBranchConditional %47 %42 %43 + %42 = OpLabel + OpBranch %43 + %44 = OpLabel + %48 = OpLoad %6 %40 + %49 = OpIAdd %6 %48 %28 + OpStore %40 %49 + OpBranch %41 + %43 = OpLabel + OpBranch %35 + %36 = OpLabel + %50 = OpLoad %6 %32 + %51 = OpIAdd %6 %50 %28 + OpStore %32 %51 + OpBranch %33 + %35 = OpLabel + OpReturn + OpFunctionEnd + )"; + CheckEqual(env, after_op_3, context.get()); +} + +TEST(StructuredLoopToSelectionReductionPassTest, LoopyShader3) { + std::string shader = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeInt 32 1 + %7 = OpTypePointer Function %6 + %9 = OpConstant %6 10 + %16 = OpConstant %6 0 + %17 = OpTypeBool + %20 = OpConstant %6 1 + %23 = OpConstant %6 3 + %40 = OpConstant %6 5 + %4 = OpFunction %2 None %3 + %5 = OpLabel + %8 = OpVariable %7 Function + OpStore %8 %9 + OpBranch %10 + %10 = OpLabel + OpLoopMerge %12 %13 None + OpBranch %14 + %14 = OpLabel + %15 = OpLoad %6 %8 + %18 = OpSGreaterThan %17 %15 %16 + OpBranchConditional %18 %11 %12 + %11 = OpLabel + %19 = OpLoad %6 %8 + %21 = OpISub %6 %19 %20 + OpStore %8 %21 + %22 = OpLoad %6 %8 + %24 = OpSLessThan %17 %22 %23 + OpSelectionMerge %26 None + OpBranchConditional %24 %25 %26 + %25 = OpLabel + OpBranch %13 + %26 = OpLabel + OpBranch %28 + %28 = OpLabel + OpLoopMerge %30 %31 None + OpBranch %29 + %29 = OpLabel + %32 = OpLoad %6 %8 + %33 = OpISub %6 %32 %20 + OpStore %8 %33 + %34 = OpLoad %6 %8 + %35 = OpIEqual %17 %34 %20 + OpSelectionMerge %37 None + OpBranchConditional %35 %36 %37 + %36 = OpLabel + OpReturn ; This return spoils everything: it means the merge does not post-dominate the header. + %37 = OpLabel + OpBranch %31 + %31 = OpLabel + %39 = OpLoad %6 %8 + %41 = OpSGreaterThan %17 %39 %40 + OpBranchConditional %41 %28 %30 + %30 = OpLabel + OpBranch %13 + %13 = OpLabel + OpBranch %10 + %12 = OpLabel + OpReturn + OpFunctionEnd + )"; + + const auto env = SPV_ENV_UNIVERSAL_1_3; + const auto context = BuildModule(env, nullptr, shader, kReduceAssembleOption); + const auto pass = TestSubclass(env); + const auto ops = pass.WrapGetAvailableOpportunities(context.get()); + ASSERT_EQ(0, ops.size()); +} + +TEST(StructuredLoopToSelectionReductionPassTest, LoopyShader4) { + std::string shader = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeInt 32 1 + %7 = OpTypePointer Function %6 + %8 = OpTypeFunction %6 %7 + %13 = OpConstant %6 0 + %22 = OpTypeBool + %25 = OpConstant %6 1 + %39 = OpConstant %6 100 + %4 = OpFunction %2 None %3 + %5 = OpLabel + %45 = OpVariable %7 Function + %46 = OpVariable %7 Function + %47 = OpVariable %7 Function + %32 = OpVariable %7 Function + %42 = OpVariable %7 Function + OpStore %32 %13 + OpBranch %33 + %33 = OpLabel + OpLoopMerge %35 %36 None + OpBranch %37 + %37 = OpLabel + %38 = OpLoad %6 %32 + %40 = OpSLessThan %22 %38 %39 + OpBranchConditional %40 %34 %35 + %34 = OpLabel + OpBranch %36 + %36 = OpLabel + %41 = OpLoad %6 %32 + OpStore %42 %25 + OpStore %45 %13 + OpStore %46 %13 + OpBranch %48 + %48 = OpLabel + OpLoopMerge %49 %50 None + OpBranch %51 + %51 = OpLabel + %52 = OpLoad %6 %46 + %53 = OpLoad %6 %42 + %54 = OpSLessThan %22 %52 %53 + OpBranchConditional %54 %55 %49 + %55 = OpLabel + %56 = OpLoad %6 %45 + %57 = OpIAdd %6 %56 %25 + OpStore %45 %57 + OpBranch %50 + %50 = OpLabel + %58 = OpLoad %6 %46 + %59 = OpIAdd %6 %58 %25 + OpStore %46 %59 + OpBranch %48 + %49 = OpLabel + %60 = OpLoad %6 %45 + OpStore %47 %60 + %43 = OpLoad %6 %47 + %44 = OpIAdd %6 %41 %43 + OpStore %32 %44 + OpBranch %33 + %35 = OpLabel + OpReturn + OpFunctionEnd + )"; + + const auto env = SPV_ENV_UNIVERSAL_1_3; + const auto context = BuildModule(env, nullptr, shader, kReduceAssembleOption); + const auto pass = TestSubclass(env); + const auto ops = pass.WrapGetAvailableOpportunities(context.get()); + + // Initially there are two opportunities. + ASSERT_EQ(2, ops.size()); + + ASSERT_TRUE(ops[0]->PreconditionHolds()); + ops[0]->TryToApply(); + CheckValid(env, context.get()); + std::string after_op_0 = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeInt 32 1 + %7 = OpTypePointer Function %6 + %8 = OpTypeFunction %6 %7 + %13 = OpConstant %6 0 + %22 = OpTypeBool + %25 = OpConstant %6 1 + %39 = OpConstant %6 100 + %61 = OpConstantTrue %22 + %62 = OpUndef %6 + %4 = OpFunction %2 None %3 + %5 = OpLabel + %45 = OpVariable %7 Function + %46 = OpVariable %7 Function + %47 = OpVariable %7 Function + %32 = OpVariable %7 Function + %42 = OpVariable %7 Function + OpStore %32 %13 + OpBranch %33 + %33 = OpLabel + OpSelectionMerge %35 None + OpBranchConditional %61 %37 %35 + %37 = OpLabel + %38 = OpLoad %6 %32 + %40 = OpSLessThan %22 %38 %39 + OpBranchConditional %40 %34 %35 + %34 = OpLabel + OpBranch %35 + %36 = OpLabel + %41 = OpLoad %6 %32 + OpStore %42 %25 + OpStore %45 %13 + OpStore %46 %13 + OpBranch %48 + %48 = OpLabel + OpLoopMerge %49 %50 None + OpBranch %51 + %51 = OpLabel + %52 = OpLoad %6 %46 + %53 = OpLoad %6 %42 + %54 = OpSLessThan %22 %52 %53 + OpBranchConditional %54 %55 %49 + %55 = OpLabel + %56 = OpLoad %6 %45 + %57 = OpIAdd %6 %56 %25 + OpStore %45 %57 + OpBranch %50 + %50 = OpLabel + %58 = OpLoad %6 %46 + %59 = OpIAdd %6 %58 %25 + OpStore %46 %59 + OpBranch %48 + %49 = OpLabel + %60 = OpLoad %6 %45 + OpStore %47 %60 + %43 = OpLoad %6 %47 + %44 = OpIAdd %6 %62 %43 + OpStore %32 %44 + OpBranch %33 + %35 = OpLabel + OpReturn + OpFunctionEnd + )"; + CheckEqual(env, after_op_0, context.get()); + + // Applying the first opportunity has killed the second opportunity, because + // there was a loop embedded in the continue target of the loop we have just + // eliminated; the continue-embedded loop is now unreachable. + ASSERT_FALSE(ops[1]->PreconditionHolds()); +} + +TEST(StructuredLoopToSelectionReductionPassTest, ConditionalBreak1) { + std::string shader = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + OpName %4 "main" + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %10 = OpTypeBool + %11 = OpConstantFalse %10 + %4 = OpFunction %2 None %3 + %5 = OpLabel + OpBranch %6 + %6 = OpLabel + OpLoopMerge %8 %9 None + OpBranch %7 + %7 = OpLabel + OpSelectionMerge %13 None + OpBranchConditional %11 %12 %13 + %12 = OpLabel + OpBranch %8 + %13 = OpLabel + OpBranch %9 + %9 = OpLabel + OpBranchConditional %11 %6 %8 + %8 = OpLabel + OpReturn + OpFunctionEnd + )"; + + const auto env = SPV_ENV_UNIVERSAL_1_3; + const auto context = BuildModule(env, nullptr, shader, kReduceAssembleOption); + const auto pass = TestSubclass(env); + const auto ops = pass.WrapGetAvailableOpportunities(context.get()); + ASSERT_EQ(1, ops.size()); + + ASSERT_TRUE(ops[0]->PreconditionHolds()); + ops[0]->TryToApply(); + CheckValid(env, context.get()); + std::string after_op_0 = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + OpName %4 "main" + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %10 = OpTypeBool + %11 = OpConstantFalse %10 + %14 = OpConstantTrue %10 + %4 = OpFunction %2 None %3 + %5 = OpLabel + OpBranch %6 + %6 = OpLabel + OpSelectionMerge %8 None + OpBranchConditional %14 %7 %8 + %7 = OpLabel + OpSelectionMerge %13 None + OpBranchConditional %11 %12 %13 + %12 = OpLabel + OpBranch %13 + %13 = OpLabel + OpBranch %8 + %9 = OpLabel + OpBranchConditional %11 %6 %8 + %8 = OpLabel + OpReturn + OpFunctionEnd + )"; + CheckEqual(env, after_op_0, context.get()); +} + +TEST(StructuredLoopToSelectionReductionPassTest, ConditionalBreak2) { + std::string shader = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + OpName %4 "main" + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %10 = OpTypeBool + %11 = OpConstantFalse %10 + %4 = OpFunction %2 None %3 + %5 = OpLabel + OpBranch %6 + %6 = OpLabel + OpLoopMerge %8 %9 None + OpBranch %7 + %7 = OpLabel + OpSelectionMerge %13 None + OpBranchConditional %11 %8 %13 + %13 = OpLabel + OpBranch %9 + %9 = OpLabel + OpBranchConditional %11 %6 %8 + %8 = OpLabel + OpReturn + OpFunctionEnd + )"; + + const auto env = SPV_ENV_UNIVERSAL_1_3; + const auto context = BuildModule(env, nullptr, shader, kReduceAssembleOption); + const auto pass = TestSubclass(env); + const auto ops = pass.WrapGetAvailableOpportunities(context.get()); + ASSERT_EQ(1, ops.size()); + + ASSERT_TRUE(ops[0]->PreconditionHolds()); + ops[0]->TryToApply(); + CheckValid(env, context.get()); + std::string after_op_0 = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + OpName %4 "main" + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %10 = OpTypeBool + %11 = OpConstantFalse %10 + %14 = OpConstantTrue %10 + %4 = OpFunction %2 None %3 + %5 = OpLabel + OpBranch %6 + %6 = OpLabel + OpSelectionMerge %8 None + OpBranchConditional %14 %7 %8 + %7 = OpLabel + OpSelectionMerge %13 None + OpBranchConditional %11 %13 %13 + %13 = OpLabel + OpBranch %8 + %9 = OpLabel + OpBranchConditional %11 %6 %8 + %8 = OpLabel + OpReturn + OpFunctionEnd + )"; + CheckEqual(env, after_op_0, context.get()); +} + +TEST(StructuredLoopToSelectionReductionPassTest, UnconditionalBreak) { + std::string shader = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + OpName %4 "main" + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %4 = OpFunction %2 None %3 + %5 = OpLabel + OpBranch %6 + %6 = OpLabel + OpLoopMerge %8 %9 None + OpBranch %7 + %7 = OpLabel + OpBranch %8 + %9 = OpLabel + OpBranch %6 + %8 = OpLabel + OpReturn + OpFunctionEnd + )"; + + const auto env = SPV_ENV_UNIVERSAL_1_3; + const auto context = BuildModule(env, nullptr, shader, kReduceAssembleOption); + const auto pass = TestSubclass(env); + const auto ops = pass.WrapGetAvailableOpportunities(context.get()); + ASSERT_EQ(1, ops.size()); + + ASSERT_TRUE(ops[0]->PreconditionHolds()); + ops[0]->TryToApply(); + CheckValid(env, context.get()); + std::string after_op_0 = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + OpName %4 "main" + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %10 = OpTypeBool + %11 = OpConstantTrue %10 + %4 = OpFunction %2 None %3 + %5 = OpLabel + OpBranch %6 + %6 = OpLabel + OpSelectionMerge %8 None + OpBranchConditional %11 %7 %8 + %7 = OpLabel + OpBranch %8 + %9 = OpLabel + OpBranch %6 + %8 = OpLabel + OpReturn + OpFunctionEnd + )"; + CheckEqual(env, after_op_0, context.get()); +} + +TEST(StructuredLoopToSelectionReductionPassTest, Complex) { + std::string shader = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %2 "main" %3 + OpExecutionMode %2 OriginUpperLeft + OpSource ESSL 310 + OpMemberDecorate %4 0 Offset 0 + OpMemberDecorate %4 1 Offset 4 + OpMemberDecorate %4 2 Offset 8 + OpMemberDecorate %4 3 Offset 12 + OpDecorate %4 Block + OpDecorate %5 DescriptorSet 0 + OpDecorate %5 Binding 0 + OpDecorate %3 Location 0 + %6 = OpTypeVoid + %7 = OpTypeFunction %6 + %8 = OpTypeBool + %9 = OpTypePointer Function %8 + %10 = OpTypeInt 32 1 + %4 = OpTypeStruct %10 %10 %10 %10 + %11 = OpTypePointer Uniform %4 + %5 = OpVariable %11 Uniform + %12 = OpConstant %10 0 + %13 = OpTypePointer Uniform %10 + %14 = OpTypeInt 32 0 + %15 = OpConstant %14 0 + %16 = OpConstant %10 1 + %17 = OpConstant %10 2 + %18 = OpConstant %10 3 + %19 = OpTypePointer Function %10 + %20 = OpConstantFalse %8 + %21 = OpTypeFloat 32 + %22 = OpTypeVector %21 4 + %23 = OpTypePointer Output %22 + %3 = OpVariable %23 Output + %2 = OpFunction %6 None %7 + %24 = OpLabel + %25 = OpVariable %9 Function + %26 = OpVariable %9 Function + %27 = OpVariable %9 Function + %28 = OpVariable %9 Function + %29 = OpVariable %9 Function + %30 = OpVariable %19 Function + %31 = OpAccessChain %13 %5 %12 + %32 = OpLoad %10 %31 + %33 = OpINotEqual %8 %32 %15 + OpStore %25 %33 + %34 = OpAccessChain %13 %5 %16 + %35 = OpLoad %10 %34 + %36 = OpINotEqual %8 %35 %15 + OpStore %26 %36 + %37 = OpAccessChain %13 %5 %17 + %38 = OpLoad %10 %37 + %39 = OpINotEqual %8 %38 %15 + OpStore %27 %39 + %40 = OpAccessChain %13 %5 %18 + %41 = OpLoad %10 %40 + %42 = OpINotEqual %8 %41 %15 + OpStore %28 %42 + %43 = OpLoad %8 %25 + OpStore %29 %43 + OpStore %30 %12 + OpBranch %44 + %44 = OpLabel + OpLoopMerge %45 %46 None + OpBranch %47 + %47 = OpLabel + %48 = OpLoad %8 %29 + OpBranchConditional %48 %49 %45 + %49 = OpLabel + %50 = OpLoad %8 %25 + OpSelectionMerge %51 None + OpBranchConditional %50 %52 %51 + %52 = OpLabel + %53 = OpLoad %8 %26 + OpStore %29 %53 + %54 = OpLoad %10 %30 + %55 = OpIAdd %10 %54 %16 + OpStore %30 %55 + OpBranch %51 + %51 = OpLabel + %56 = OpLoad %8 %26 + OpSelectionMerge %57 None + OpBranchConditional %56 %58 %57 + %58 = OpLabel + %59 = OpLoad %10 %30 + %60 = OpIAdd %10 %59 %16 + OpStore %30 %60 + %61 = OpLoad %8 %29 + %62 = OpLoad %8 %25 + %63 = OpLogicalOr %8 %61 %62 + OpStore %29 %63 + %64 = OpLoad %8 %27 + OpSelectionMerge %65 None + OpBranchConditional %64 %66 %65 + %66 = OpLabel + %67 = OpLoad %10 %30 + %68 = OpIAdd %10 %67 %17 + OpStore %30 %68 + %69 = OpLoad %8 %29 + %70 = OpLogicalNot %8 %69 + OpStore %29 %70 + OpBranch %46 + %65 = OpLabel + %71 = OpLoad %8 %29 + %72 = OpLogicalOr %8 %71 %20 + OpStore %29 %72 + OpBranch %46 + %57 = OpLabel + OpBranch %73 + %73 = OpLabel + OpLoopMerge %74 %75 None + OpBranch %76 + %76 = OpLabel + %77 = OpLoad %8 %28 + OpSelectionMerge %78 None + OpBranchConditional %77 %79 %80 + %79 = OpLabel + %81 = OpLoad %10 %30 + OpSelectionMerge %82 None + OpSwitch %81 %83 1 %84 2 %85 + %83 = OpLabel + OpBranch %82 + %84 = OpLabel + %86 = OpLoad %8 %29 + %87 = OpSelect %10 %86 %16 %17 + %88 = OpLoad %10 %30 + %89 = OpIAdd %10 %88 %87 + OpStore %30 %89 + OpBranch %82 + %85 = OpLabel + OpBranch %75 + %82 = OpLabel + %90 = OpLoad %8 %27 + OpSelectionMerge %91 None + OpBranchConditional %90 %92 %91 + %92 = OpLabel + OpBranch %75 + %91 = OpLabel + OpBranch %78 + %80 = OpLabel + OpBranch %74 + %78 = OpLabel + OpBranch %75 + %75 = OpLabel + %93 = OpLoad %8 %29 + OpBranchConditional %93 %73 %74 + %74 = OpLabel + OpBranch %46 + %46 = OpLabel + OpBranch %44 + %45 = OpLabel + %94 = OpLoad %10 %30 + %95 = OpConvertSToF %21 %94 + %96 = OpCompositeConstruct %22 %95 %95 %95 %95 + OpStore %3 %96 + OpReturn + OpFunctionEnd + )"; + + const auto env = SPV_ENV_UNIVERSAL_1_3; + const auto context = BuildModule(env, nullptr, shader, kReduceAssembleOption); + const auto pass = TestSubclass(env); + const auto ops = pass.WrapGetAvailableOpportunities(context.get()); + + ASSERT_EQ(2, ops.size()); + ASSERT_TRUE(ops[0]->PreconditionHolds()); + ops[0]->TryToApply(); + CheckValid(env, context.get()); + std::string after_op_0 = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %2 "main" %3 + OpExecutionMode %2 OriginUpperLeft + OpSource ESSL 310 + OpMemberDecorate %4 0 Offset 0 + OpMemberDecorate %4 1 Offset 4 + OpMemberDecorate %4 2 Offset 8 + OpMemberDecorate %4 3 Offset 12 + OpDecorate %4 Block + OpDecorate %5 DescriptorSet 0 + OpDecorate %5 Binding 0 + OpDecorate %3 Location 0 + %6 = OpTypeVoid + %7 = OpTypeFunction %6 + %8 = OpTypeBool + %9 = OpTypePointer Function %8 + %10 = OpTypeInt 32 1 + %4 = OpTypeStruct %10 %10 %10 %10 + %11 = OpTypePointer Uniform %4 + %5 = OpVariable %11 Uniform + %12 = OpConstant %10 0 + %13 = OpTypePointer Uniform %10 + %14 = OpTypeInt 32 0 + %15 = OpConstant %14 0 + %16 = OpConstant %10 1 + %17 = OpConstant %10 2 + %18 = OpConstant %10 3 + %19 = OpTypePointer Function %10 + %20 = OpConstantFalse %8 + %21 = OpTypeFloat 32 + %22 = OpTypeVector %21 4 + %23 = OpTypePointer Output %22 + %3 = OpVariable %23 Output + %97 = OpConstantTrue %8 + %2 = OpFunction %6 None %7 + %24 = OpLabel + %25 = OpVariable %9 Function + %26 = OpVariable %9 Function + %27 = OpVariable %9 Function + %28 = OpVariable %9 Function + %29 = OpVariable %9 Function + %30 = OpVariable %19 Function + %31 = OpAccessChain %13 %5 %12 + %32 = OpLoad %10 %31 + %33 = OpINotEqual %8 %32 %15 + OpStore %25 %33 + %34 = OpAccessChain %13 %5 %16 + %35 = OpLoad %10 %34 + %36 = OpINotEqual %8 %35 %15 + OpStore %26 %36 + %37 = OpAccessChain %13 %5 %17 + %38 = OpLoad %10 %37 + %39 = OpINotEqual %8 %38 %15 + OpStore %27 %39 + %40 = OpAccessChain %13 %5 %18 + %41 = OpLoad %10 %40 + %42 = OpINotEqual %8 %41 %15 + OpStore %28 %42 + %43 = OpLoad %8 %25 + OpStore %29 %43 + OpStore %30 %12 + OpBranch %44 + %44 = OpLabel + OpSelectionMerge %45 None ; Was OpLoopMerge %45 %46 None + OpBranchConditional %97 %47 %45 ; Was OpBranch %47 + %47 = OpLabel + %48 = OpLoad %8 %29 + OpBranchConditional %48 %49 %45 + %49 = OpLabel + %50 = OpLoad %8 %25 + OpSelectionMerge %51 None + OpBranchConditional %50 %52 %51 + %52 = OpLabel + %53 = OpLoad %8 %26 + OpStore %29 %53 + %54 = OpLoad %10 %30 + %55 = OpIAdd %10 %54 %16 + OpStore %30 %55 + OpBranch %51 + %51 = OpLabel + %56 = OpLoad %8 %26 + OpSelectionMerge %57 None + OpBranchConditional %56 %58 %57 + %58 = OpLabel + %59 = OpLoad %10 %30 + %60 = OpIAdd %10 %59 %16 + OpStore %30 %60 + %61 = OpLoad %8 %29 + %62 = OpLoad %8 %25 + %63 = OpLogicalOr %8 %61 %62 + OpStore %29 %63 + %64 = OpLoad %8 %27 + OpSelectionMerge %65 None + OpBranchConditional %64 %66 %65 + %66 = OpLabel + %67 = OpLoad %10 %30 + %68 = OpIAdd %10 %67 %17 + OpStore %30 %68 + %69 = OpLoad %8 %29 + %70 = OpLogicalNot %8 %69 + OpStore %29 %70 + OpBranch %65 ; Was OpBranch %46 + %65 = OpLabel + %71 = OpLoad %8 %29 + %72 = OpLogicalOr %8 %71 %20 + OpStore %29 %72 + OpBranch %57 ; Was OpBranch %46 + %57 = OpLabel + OpBranch %73 + %73 = OpLabel + OpLoopMerge %74 %75 None + OpBranch %76 + %76 = OpLabel + %77 = OpLoad %8 %28 + OpSelectionMerge %78 None + OpBranchConditional %77 %79 %80 + %79 = OpLabel + %81 = OpLoad %10 %30 + OpSelectionMerge %82 None + OpSwitch %81 %83 1 %84 2 %85 + %83 = OpLabel + OpBranch %82 + %84 = OpLabel + %86 = OpLoad %8 %29 + %87 = OpSelect %10 %86 %16 %17 + %88 = OpLoad %10 %30 + %89 = OpIAdd %10 %88 %87 + OpStore %30 %89 + OpBranch %82 + %85 = OpLabel + OpBranch %75 + %82 = OpLabel + %90 = OpLoad %8 %27 + OpSelectionMerge %91 None + OpBranchConditional %90 %92 %91 + %92 = OpLabel + OpBranch %75 + %91 = OpLabel + OpBranch %78 + %80 = OpLabel + OpBranch %74 + %78 = OpLabel + OpBranch %75 + %75 = OpLabel + %93 = OpLoad %8 %29 + OpBranchConditional %93 %73 %74 + %74 = OpLabel + OpBranch %45 ; Was OpBranch %46 + %46 = OpLabel + OpBranch %44 + %45 = OpLabel + %94 = OpLoad %10 %30 + %95 = OpConvertSToF %21 %94 + %96 = OpCompositeConstruct %22 %95 %95 %95 %95 + OpStore %3 %96 + OpReturn + OpFunctionEnd + )"; + CheckEqual(env, after_op_0, context.get()); + ASSERT_TRUE(ops[1]->PreconditionHolds()); + ops[1]->TryToApply(); + CheckValid(env, context.get()); + + std::string after_op_1 = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %2 "main" %3 + OpExecutionMode %2 OriginUpperLeft + OpSource ESSL 310 + OpMemberDecorate %4 0 Offset 0 + OpMemberDecorate %4 1 Offset 4 + OpMemberDecorate %4 2 Offset 8 + OpMemberDecorate %4 3 Offset 12 + OpDecorate %4 Block + OpDecorate %5 DescriptorSet 0 + OpDecorate %5 Binding 0 + OpDecorate %3 Location 0 + %6 = OpTypeVoid + %7 = OpTypeFunction %6 + %8 = OpTypeBool + %9 = OpTypePointer Function %8 + %10 = OpTypeInt 32 1 + %4 = OpTypeStruct %10 %10 %10 %10 + %11 = OpTypePointer Uniform %4 + %5 = OpVariable %11 Uniform + %12 = OpConstant %10 0 + %13 = OpTypePointer Uniform %10 + %14 = OpTypeInt 32 0 + %15 = OpConstant %14 0 + %16 = OpConstant %10 1 + %17 = OpConstant %10 2 + %18 = OpConstant %10 3 + %19 = OpTypePointer Function %10 + %20 = OpConstantFalse %8 + %21 = OpTypeFloat 32 + %22 = OpTypeVector %21 4 + %23 = OpTypePointer Output %22 + %3 = OpVariable %23 Output + %97 = OpConstantTrue %8 + %2 = OpFunction %6 None %7 + %24 = OpLabel + %25 = OpVariable %9 Function + %26 = OpVariable %9 Function + %27 = OpVariable %9 Function + %28 = OpVariable %9 Function + %29 = OpVariable %9 Function + %30 = OpVariable %19 Function + %31 = OpAccessChain %13 %5 %12 + %32 = OpLoad %10 %31 + %33 = OpINotEqual %8 %32 %15 + OpStore %25 %33 + %34 = OpAccessChain %13 %5 %16 + %35 = OpLoad %10 %34 + %36 = OpINotEqual %8 %35 %15 + OpStore %26 %36 + %37 = OpAccessChain %13 %5 %17 + %38 = OpLoad %10 %37 + %39 = OpINotEqual %8 %38 %15 + OpStore %27 %39 + %40 = OpAccessChain %13 %5 %18 + %41 = OpLoad %10 %40 + %42 = OpINotEqual %8 %41 %15 + OpStore %28 %42 + %43 = OpLoad %8 %25 + OpStore %29 %43 + OpStore %30 %12 + OpBranch %44 + %44 = OpLabel + OpSelectionMerge %45 None ; Was OpLoopMerge %45 %46 None + OpBranchConditional %97 %47 %45 ; Was OpBranch %47 + %47 = OpLabel + %48 = OpLoad %8 %29 + OpBranchConditional %48 %49 %45 + %49 = OpLabel + %50 = OpLoad %8 %25 + OpSelectionMerge %51 None + OpBranchConditional %50 %52 %51 + %52 = OpLabel + %53 = OpLoad %8 %26 + OpStore %29 %53 + %54 = OpLoad %10 %30 + %55 = OpIAdd %10 %54 %16 + OpStore %30 %55 + OpBranch %51 + %51 = OpLabel + %56 = OpLoad %8 %26 + OpSelectionMerge %57 None + OpBranchConditional %56 %58 %57 + %58 = OpLabel + %59 = OpLoad %10 %30 + %60 = OpIAdd %10 %59 %16 + OpStore %30 %60 + %61 = OpLoad %8 %29 + %62 = OpLoad %8 %25 + %63 = OpLogicalOr %8 %61 %62 + OpStore %29 %63 + %64 = OpLoad %8 %27 + OpSelectionMerge %65 None + OpBranchConditional %64 %66 %65 + %66 = OpLabel + %67 = OpLoad %10 %30 + %68 = OpIAdd %10 %67 %17 + OpStore %30 %68 + %69 = OpLoad %8 %29 + %70 = OpLogicalNot %8 %69 + OpStore %29 %70 + OpBranch %65 ; Was OpBranch %46 + %65 = OpLabel + %71 = OpLoad %8 %29 + %72 = OpLogicalOr %8 %71 %20 + OpStore %29 %72 + OpBranch %57 ; Was OpBranch %46 + %57 = OpLabel + OpBranch %73 + %73 = OpLabel + OpSelectionMerge %74 None ; Was OpLoopMerge %74 %75 None + OpBranchConditional %97 %76 %74 ; Was OpBranch %76 + %76 = OpLabel + %77 = OpLoad %8 %28 + OpSelectionMerge %78 None + OpBranchConditional %77 %79 %80 + %79 = OpLabel + %81 = OpLoad %10 %30 + OpSelectionMerge %82 None + OpSwitch %81 %83 1 %84 2 %85 + %83 = OpLabel + OpBranch %82 + %84 = OpLabel + %86 = OpLoad %8 %29 + %87 = OpSelect %10 %86 %16 %17 + %88 = OpLoad %10 %30 + %89 = OpIAdd %10 %88 %87 + OpStore %30 %89 + OpBranch %82 + %85 = OpLabel + OpBranch %82 + %82 = OpLabel + %90 = OpLoad %8 %27 + OpSelectionMerge %91 None + OpBranchConditional %90 %92 %91 + %92 = OpLabel + OpBranch %91 + %91 = OpLabel + OpBranch %78 + %80 = OpLabel + OpBranch %78 ; Was OpBranch %74 + %78 = OpLabel + OpBranch %74 + %75 = OpLabel + %93 = OpLoad %8 %29 + OpBranchConditional %93 %73 %74 + %74 = OpLabel + OpBranch %45 ; Was OpBranch %46 + %46 = OpLabel + OpBranch %44 + %45 = OpLabel + %94 = OpLoad %10 %30 + %95 = OpConvertSToF %21 %94 + %96 = OpCompositeConstruct %22 %95 %95 %95 %95 + OpStore %3 %96 + OpReturn + OpFunctionEnd + )"; + CheckEqual(env, after_op_1, context.get()); +} + +TEST(StructuredLoopToSelectionReductionPassTest, ComplexOptimized) { + std::string shader = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %2 "main" %3 + OpExecutionMode %2 OriginUpperLeft + OpSource ESSL 310 + OpMemberDecorate %4 0 Offset 0 + OpMemberDecorate %4 1 Offset 4 + OpMemberDecorate %4 2 Offset 8 + OpMemberDecorate %4 3 Offset 12 + OpDecorate %4 Block + OpDecorate %5 DescriptorSet 0 + OpDecorate %5 Binding 0 + OpDecorate %3 Location 0 + %6 = OpTypeVoid + %7 = OpTypeFunction %6 + %8 = OpTypeBool + %10 = OpTypeInt 32 1 + %4 = OpTypeStruct %10 %10 %10 %10 + %11 = OpTypePointer Uniform %4 + %5 = OpVariable %11 Uniform + %12 = OpConstant %10 0 + %13 = OpTypePointer Uniform %10 + %14 = OpTypeInt 32 0 + %15 = OpConstant %14 0 + %16 = OpConstant %10 1 + %17 = OpConstant %10 2 + %18 = OpConstant %10 3 + %20 = OpConstantFalse %8 + %21 = OpTypeFloat 32 + %22 = OpTypeVector %21 4 + %23 = OpTypePointer Output %22 + %3 = OpVariable %23 Output + %2 = OpFunction %6 None %7 + %24 = OpLabel + %31 = OpAccessChain %13 %5 %12 + %32 = OpLoad %10 %31 + %33 = OpINotEqual %8 %32 %15 + %34 = OpAccessChain %13 %5 %16 + %35 = OpLoad %10 %34 + %36 = OpINotEqual %8 %35 %15 + %37 = OpAccessChain %13 %5 %17 + %38 = OpLoad %10 %37 + %39 = OpINotEqual %8 %38 %15 + %40 = OpAccessChain %13 %5 %18 + %41 = OpLoad %10 %40 + %42 = OpINotEqual %8 %41 %15 + OpBranch %44 + %44 = OpLabel + %98 = OpPhi %10 %12 %24 %107 %46 + %97 = OpPhi %8 %33 %24 %105 %46 + OpLoopMerge %45 %46 None + OpBranchConditional %97 %49 %45 + %49 = OpLabel + OpSelectionMerge %51 None + OpBranchConditional %33 %52 %51 + %52 = OpLabel + %55 = OpIAdd %10 %98 %16 + OpBranch %51 + %51 = OpLabel + %100 = OpPhi %10 %98 %49 %55 %52 + %113 = OpSelect %8 %33 %36 %97 + OpSelectionMerge %57 None + OpBranchConditional %36 %58 %57 + %58 = OpLabel + %60 = OpIAdd %10 %100 %16 + %63 = OpLogicalOr %8 %113 %33 + OpSelectionMerge %65 None + OpBranchConditional %39 %66 %65 + %66 = OpLabel + %68 = OpIAdd %10 %100 %18 + %70 = OpLogicalNot %8 %63 + OpBranch %46 + %65 = OpLabel + %72 = OpLogicalOr %8 %63 %20 + OpBranch %46 + %57 = OpLabel + OpBranch %73 + %73 = OpLabel + %99 = OpPhi %10 %100 %57 %109 %75 + OpLoopMerge %74 %75 None + OpBranch %76 + %76 = OpLabel + OpSelectionMerge %78 None + OpBranchConditional %42 %79 %80 + %79 = OpLabel + OpSelectionMerge %82 None + OpSwitch %99 %83 1 %84 2 %85 + %83 = OpLabel + OpBranch %82 + %84 = OpLabel + %87 = OpSelect %10 %113 %16 %17 + %89 = OpIAdd %10 %99 %87 + OpBranch %82 + %85 = OpLabel + OpBranch %75 + %82 = OpLabel + %110 = OpPhi %10 %99 %83 %89 %84 + OpSelectionMerge %91 None + OpBranchConditional %39 %92 %91 + %92 = OpLabel + OpBranch %75 + %91 = OpLabel + OpBranch %78 + %80 = OpLabel + OpBranch %74 + %78 = OpLabel + OpBranch %75 + %75 = OpLabel + %109 = OpPhi %10 %99 %85 %110 %92 %110 %78 + OpBranchConditional %113 %73 %74 + %74 = OpLabel + %108 = OpPhi %10 %99 %80 %109 %75 + OpBranch %46 + %46 = OpLabel + %107 = OpPhi %10 %68 %66 %60 %65 %108 %74 + %105 = OpPhi %8 %70 %66 %72 %65 %113 %74 + OpBranch %44 + %45 = OpLabel + %95 = OpConvertSToF %21 %98 + %96 = OpCompositeConstruct %22 %95 %95 %95 %95 + OpStore %3 %96 + OpReturn + OpFunctionEnd + )"; + + const auto env = SPV_ENV_UNIVERSAL_1_3; + const auto context = BuildModule(env, nullptr, shader, kReduceAssembleOption); + const auto pass = TestSubclass(env); + const auto ops = pass.WrapGetAvailableOpportunities(context.get()); + + ASSERT_EQ(2, ops.size()); + ASSERT_TRUE(ops[0]->PreconditionHolds()); + ops[0]->TryToApply(); + CheckValid(env, context.get()); + std::string after_op_0 = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %2 "main" %3 + OpExecutionMode %2 OriginUpperLeft + OpSource ESSL 310 + OpMemberDecorate %4 0 Offset 0 + OpMemberDecorate %4 1 Offset 4 + OpMemberDecorate %4 2 Offset 8 + OpMemberDecorate %4 3 Offset 12 + OpDecorate %4 Block + OpDecorate %5 DescriptorSet 0 + OpDecorate %5 Binding 0 + OpDecorate %3 Location 0 + %6 = OpTypeVoid + %7 = OpTypeFunction %6 + %8 = OpTypeBool + %10 = OpTypeInt 32 1 + %4 = OpTypeStruct %10 %10 %10 %10 + %11 = OpTypePointer Uniform %4 + %5 = OpVariable %11 Uniform + %12 = OpConstant %10 0 + %13 = OpTypePointer Uniform %10 + %14 = OpTypeInt 32 0 + %15 = OpConstant %14 0 + %16 = OpConstant %10 1 + %17 = OpConstant %10 2 + %18 = OpConstant %10 3 + %20 = OpConstantFalse %8 + %21 = OpTypeFloat 32 + %22 = OpTypeVector %21 4 + %23 = OpTypePointer Output %22 + %3 = OpVariable %23 Output + %114 = OpUndef %10 + %115 = OpUndef %8 + %2 = OpFunction %6 None %7 + %24 = OpLabel + %31 = OpAccessChain %13 %5 %12 + %32 = OpLoad %10 %31 + %33 = OpINotEqual %8 %32 %15 + %34 = OpAccessChain %13 %5 %16 + %35 = OpLoad %10 %34 + %36 = OpINotEqual %8 %35 %15 + %37 = OpAccessChain %13 %5 %17 + %38 = OpLoad %10 %37 + %39 = OpINotEqual %8 %38 %15 + %40 = OpAccessChain %13 %5 %18 + %41 = OpLoad %10 %40 + %42 = OpINotEqual %8 %41 %15 + OpBranch %44 + %44 = OpLabel + %98 = OpPhi %10 %12 %24 %114 %46 + %97 = OpPhi %8 %33 %24 %115 %46 + OpSelectionMerge %45 None ; Was OpLoopMerge %45 %46 None + OpBranchConditional %97 %49 %45 + %49 = OpLabel + OpSelectionMerge %51 None + OpBranchConditional %33 %52 %51 + %52 = OpLabel + %55 = OpIAdd %10 %98 %16 + OpBranch %51 + %51 = OpLabel + %100 = OpPhi %10 %98 %49 %55 %52 + %113 = OpSelect %8 %33 %36 %97 + OpSelectionMerge %57 None + OpBranchConditional %36 %58 %57 + %58 = OpLabel + %60 = OpIAdd %10 %100 %16 + %63 = OpLogicalOr %8 %113 %33 + OpSelectionMerge %65 None + OpBranchConditional %39 %66 %65 + %66 = OpLabel + %68 = OpIAdd %10 %100 %18 + %70 = OpLogicalNot %8 %63 + OpBranch %65 ; Was OpBranch %46 + %65 = OpLabel + %72 = OpLogicalOr %8 %63 %20 + OpBranch %57 ; Was OpBranch %46 + %57 = OpLabel + OpBranch %73 + %73 = OpLabel + %99 = OpPhi %10 %100 %57 %109 %75 + OpLoopMerge %74 %75 None + OpBranch %76 + %76 = OpLabel + OpSelectionMerge %78 None + OpBranchConditional %42 %79 %80 + %79 = OpLabel + OpSelectionMerge %82 None + OpSwitch %99 %83 1 %84 2 %85 + %83 = OpLabel + OpBranch %82 + %84 = OpLabel + %87 = OpSelect %10 %113 %16 %17 + %89 = OpIAdd %10 %99 %87 + OpBranch %82 + %85 = OpLabel + OpBranch %75 + %82 = OpLabel + %110 = OpPhi %10 %99 %83 %89 %84 + OpSelectionMerge %91 None + OpBranchConditional %39 %92 %91 + %92 = OpLabel + OpBranch %75 + %91 = OpLabel + OpBranch %78 + %80 = OpLabel + OpBranch %74 + %78 = OpLabel + OpBranch %75 + %75 = OpLabel + %109 = OpPhi %10 %99 %85 %110 %92 %110 %78 + OpBranchConditional %113 %73 %74 + %74 = OpLabel + %108 = OpPhi %10 %99 %80 %109 %75 + OpBranch %45 ; Was OpBranch %46 + %46 = OpLabel + %107 = OpPhi %10 ; Was OpPhi %10 %68 %66 %60 %65 %108 %74 + %105 = OpPhi %8 ; Was OpPhi %8 %70 %66 %72 %65 %113 %74 + OpBranch %44 + %45 = OpLabel + %95 = OpConvertSToF %21 %98 + %96 = OpCompositeConstruct %22 %95 %95 %95 %95 + OpStore %3 %96 + OpReturn + OpFunctionEnd + )"; + CheckEqual(env, after_op_0, context.get()); + + ASSERT_TRUE(ops[1]->PreconditionHolds()); + ops[1]->TryToApply(); + CheckValid(env, context.get()); + std::string after_op_1 = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %2 "main" %3 + OpExecutionMode %2 OriginUpperLeft + OpSource ESSL 310 + OpMemberDecorate %4 0 Offset 0 + OpMemberDecorate %4 1 Offset 4 + OpMemberDecorate %4 2 Offset 8 + OpMemberDecorate %4 3 Offset 12 + OpDecorate %4 Block + OpDecorate %5 DescriptorSet 0 + OpDecorate %5 Binding 0 + OpDecorate %3 Location 0 + %6 = OpTypeVoid + %7 = OpTypeFunction %6 + %8 = OpTypeBool + %10 = OpTypeInt 32 1 + %4 = OpTypeStruct %10 %10 %10 %10 + %11 = OpTypePointer Uniform %4 + %5 = OpVariable %11 Uniform + %12 = OpConstant %10 0 + %13 = OpTypePointer Uniform %10 + %14 = OpTypeInt 32 0 + %15 = OpConstant %14 0 + %16 = OpConstant %10 1 + %17 = OpConstant %10 2 + %18 = OpConstant %10 3 + %20 = OpConstantFalse %8 + %21 = OpTypeFloat 32 + %22 = OpTypeVector %21 4 + %23 = OpTypePointer Output %22 + %3 = OpVariable %23 Output + %114 = OpUndef %10 + %115 = OpUndef %8 + %116 = OpConstantTrue %8 + %2 = OpFunction %6 None %7 + %24 = OpLabel + %31 = OpAccessChain %13 %5 %12 + %32 = OpLoad %10 %31 + %33 = OpINotEqual %8 %32 %15 + %34 = OpAccessChain %13 %5 %16 + %35 = OpLoad %10 %34 + %36 = OpINotEqual %8 %35 %15 + %37 = OpAccessChain %13 %5 %17 + %38 = OpLoad %10 %37 + %39 = OpINotEqual %8 %38 %15 + %40 = OpAccessChain %13 %5 %18 + %41 = OpLoad %10 %40 + %42 = OpINotEqual %8 %41 %15 + OpBranch %44 + %44 = OpLabel + %98 = OpPhi %10 %12 %24 %114 %46 + %97 = OpPhi %8 %33 %24 %115 %46 + OpSelectionMerge %45 None ; Was OpLoopMerge %45 %46 None + OpBranchConditional %97 %49 %45 + %49 = OpLabel + OpSelectionMerge %51 None + OpBranchConditional %33 %52 %51 + %52 = OpLabel + %55 = OpIAdd %10 %98 %16 + OpBranch %51 + %51 = OpLabel + %100 = OpPhi %10 %98 %49 %55 %52 + %113 = OpSelect %8 %33 %36 %97 + OpSelectionMerge %57 None + OpBranchConditional %36 %58 %57 + %58 = OpLabel + %60 = OpIAdd %10 %100 %16 + %63 = OpLogicalOr %8 %113 %33 + OpSelectionMerge %65 None + OpBranchConditional %39 %66 %65 + %66 = OpLabel + %68 = OpIAdd %10 %100 %18 + %70 = OpLogicalNot %8 %63 + OpBranch %65 ; Was OpBranch %46 + %65 = OpLabel + %72 = OpLogicalOr %8 %63 %20 + OpBranch %57 ; Was OpBranch %46 + %57 = OpLabel + OpBranch %73 + %73 = OpLabel + %99 = OpPhi %10 %100 %57 %114 %75 + OpSelectionMerge %74 None ; Was OpLoopMerge %74 %75 None + OpBranchConditional %116 %76 %74 + %76 = OpLabel + OpSelectionMerge %78 None + OpBranchConditional %42 %79 %80 + %79 = OpLabel + OpSelectionMerge %82 None + OpSwitch %99 %83 1 %84 2 %85 + %83 = OpLabel + OpBranch %82 + %84 = OpLabel + %87 = OpSelect %10 %113 %16 %17 + %89 = OpIAdd %10 %99 %87 + OpBranch %82 + %85 = OpLabel + OpBranch %82 ; Was OpBranch %75 + %82 = OpLabel + %110 = OpPhi %10 %99 %83 %89 %84 %114 %85 ; Was OpPhi %10 %99 %83 %89 %84 + OpSelectionMerge %91 None + OpBranchConditional %39 %92 %91 + %92 = OpLabel + OpBranch %91 ; OpBranch %75 + %91 = OpLabel + OpBranch %78 + %80 = OpLabel + OpBranch %78 ; Was OpBranch %74 + %78 = OpLabel + OpBranch %74 ; Was OpBranch %75 + %75 = OpLabel + %109 = OpPhi %10 ; Was OpPhi %10 %99 %85 %110 %92 %110 %78 + OpBranchConditional %115 %73 %74 + %74 = OpLabel + %108 = OpPhi %10 %114 %75 %114 %78 %114 %73 ; Was OpPhi %10 %99 %80 %109 %75 + OpBranch %45 ; Was OpBranch %46 + %46 = OpLabel + %107 = OpPhi %10 ; Was OpPhi %10 %68 %66 %60 %65 %108 %74 + %105 = OpPhi %8 ; Was OpPhi %8 %70 %66 %72 %65 %113 %74 + OpBranch %44 + %45 = OpLabel + %95 = OpConvertSToF %21 %98 + %96 = OpCompositeConstruct %22 %95 %95 %95 %95 + OpStore %3 %96 + OpReturn + OpFunctionEnd + )"; + CheckEqual(env, after_op_1, context.get()); +} + +TEST(StructuredLoopToSelectionReductionPassTest, DominanceIssue) { + // Exposes a scenario where redirecting edges results in uses of ids being + // non-dominated. We replace such uses with OpUndef to account for this. + std::string shader = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %5 = OpTypeInt 32 1 + %7 = OpTypePointer Function %5 + %6 = OpTypeBool + %8 = OpConstantTrue %6 + %9 = OpConstant %5 10 + %10 = OpConstant %5 20 + %11 = OpConstant %5 30 + %4 = OpFunction %2 None %3 + %12 = OpLabel + OpBranch %13 + %13 = OpLabel + OpLoopMerge %14 %15 None + OpBranch %16 + %16 = OpLabel + OpSelectionMerge %17 None + OpBranchConditional %8 %18 %19 + %18 = OpLabel + OpBranch %14 + %19 = OpLabel + %20 = OpIAdd %5 %9 %10 + OpBranch %17 + %17 = OpLabel + %21 = OpIAdd %5 %20 %11 + OpBranchConditional %8 %14 %15 + %15 = OpLabel + OpBranch %13 + %14 = OpLabel + OpReturn + OpFunctionEnd + )"; + + const auto env = SPV_ENV_UNIVERSAL_1_3; + const auto context = BuildModule(env, nullptr, shader, kReduceAssembleOption); + const auto pass = TestSubclass(env); + const auto ops = pass.WrapGetAvailableOpportunities(context.get()); + ASSERT_EQ(1, ops.size()); + + ASSERT_TRUE(ops[0]->PreconditionHolds()); + ops[0]->TryToApply(); + CheckValid(env, context.get()); + + std::string expected = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %5 = OpTypeInt 32 1 + %7 = OpTypePointer Function %5 + %6 = OpTypeBool + %8 = OpConstantTrue %6 + %9 = OpConstant %5 10 + %10 = OpConstant %5 20 + %11 = OpConstant %5 30 + %22 = OpUndef %5 + %4 = OpFunction %2 None %3 + %12 = OpLabel + OpBranch %13 + %13 = OpLabel + OpSelectionMerge %14 None + OpBranchConditional %8 %16 %14 + %16 = OpLabel + OpSelectionMerge %17 None + OpBranchConditional %8 %18 %19 + %18 = OpLabel + OpBranch %17 + %19 = OpLabel + %20 = OpIAdd %5 %9 %10 + OpBranch %17 + %17 = OpLabel + %21 = OpIAdd %5 %22 %11 + OpBranchConditional %8 %14 %14 + %15 = OpLabel + OpBranch %13 + %14 = OpLabel + OpReturn + OpFunctionEnd + )"; + CheckEqual(env, expected, context.get()); +} + +TEST(StructuredLoopToSelectionReductionPassTest, AccessChainIssue) { + // Exposes a scenario where redirecting edges results in a use of an id + // generated by an access chain being non-dominated. + std::string shader = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" %56 + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + OpMemberDecorate %28 0 Offset 0 + OpDecorate %28 Block + OpDecorate %30 DescriptorSet 0 + OpDecorate %30 Binding 0 + OpDecorate %56 Location 0 + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeFloat 32 + %7 = OpTypeVector %6 2 + %8 = OpTypePointer Function %7 + %60 = OpTypePointer Private %7 + %10 = OpConstant %6 0 + %11 = OpConstantComposite %7 %10 %10 + %12 = OpTypePointer Function %6 + %59 = OpTypePointer Private %6 + %14 = OpTypeInt 32 1 + %15 = OpTypePointer Function %14 + %17 = OpConstant %14 0 + %24 = OpConstant %14 100 + %25 = OpTypeBool + %28 = OpTypeStruct %6 + %29 = OpTypePointer Uniform %28 + %30 = OpVariable %29 Uniform + %31 = OpTypePointer Uniform %6 + %39 = OpTypeInt 32 0 + %40 = OpConstant %39 1 + %45 = OpConstant %39 0 + %52 = OpConstant %14 1 + %54 = OpTypeVector %6 4 + %55 = OpTypePointer Output %54 + %56 = OpVariable %55 Output + %9 = OpVariable %60 Private + %4 = OpFunction %2 None %3 + %5 = OpLabel + %13 = OpVariable %12 Function + %16 = OpVariable %15 Function + %38 = OpVariable %12 Function + OpStore %9 %11 + OpStore %13 %10 + OpStore %16 %17 + OpBranch %18 + %18 = OpLabel + OpLoopMerge %20 %21 None + OpBranch %22 + %22 = OpLabel + %23 = OpLoad %14 %16 + %26 = OpSLessThan %25 %23 %24 + OpBranchConditional %26 %19 %20 + %19 = OpLabel + %27 = OpLoad %14 %16 + %32 = OpAccessChain %31 %30 %17 + %33 = OpLoad %6 %32 + %34 = OpConvertFToS %14 %33 + %35 = OpSLessThan %25 %27 %34 + OpSelectionMerge %37 None + OpBranchConditional %35 %36 %44 + %36 = OpLabel + %41 = OpAccessChain %59 %9 %40 + %42 = OpLoad %6 %41 + OpStore %38 %42 + OpBranch %20 + %44 = OpLabel + %46 = OpAccessChain %59 %9 %45 + OpBranch %37 + %37 = OpLabel + %47 = OpLoad %6 %46 + OpStore %38 %47 + %48 = OpLoad %6 %38 + %49 = OpLoad %6 %13 + %50 = OpFAdd %6 %49 %48 + OpStore %13 %50 + OpBranch %21 + %21 = OpLabel + %51 = OpLoad %14 %16 + %53 = OpIAdd %14 %51 %52 + OpStore %16 %53 + OpBranch %18 + %20 = OpLabel + %57 = OpLoad %6 %13 + %58 = OpCompositeConstruct %54 %57 %57 %57 %57 + OpStore %56 %58 + OpReturn + OpFunctionEnd + )"; + + const auto env = SPV_ENV_UNIVERSAL_1_3; + const auto context = BuildModule(env, nullptr, shader, kReduceAssembleOption); + const auto pass = TestSubclass(env); + const auto ops = pass.WrapGetAvailableOpportunities(context.get()); + ASSERT_EQ(1, ops.size()); + + ASSERT_TRUE(ops[0]->PreconditionHolds()); + ops[0]->TryToApply(); + CheckValid(env, context.get()); + + std::string expected = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" %56 + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + OpMemberDecorate %28 0 Offset 0 + OpDecorate %28 Block + OpDecorate %30 DescriptorSet 0 + OpDecorate %30 Binding 0 + OpDecorate %56 Location 0 + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeFloat 32 + %7 = OpTypeVector %6 2 + %8 = OpTypePointer Function %7 + %60 = OpTypePointer Private %7 + %10 = OpConstant %6 0 + %11 = OpConstantComposite %7 %10 %10 + %12 = OpTypePointer Function %6 + %59 = OpTypePointer Private %6 + %14 = OpTypeInt 32 1 + %15 = OpTypePointer Function %14 + %17 = OpConstant %14 0 + %24 = OpConstant %14 100 + %25 = OpTypeBool + %28 = OpTypeStruct %6 + %29 = OpTypePointer Uniform %28 + %30 = OpVariable %29 Uniform + %31 = OpTypePointer Uniform %6 + %39 = OpTypeInt 32 0 + %40 = OpConstant %39 1 + %45 = OpConstant %39 0 + %52 = OpConstant %14 1 + %54 = OpTypeVector %6 4 + %55 = OpTypePointer Output %54 + %56 = OpVariable %55 Output + %9 = OpVariable %60 Private + %61 = OpConstantTrue %25 + %62 = OpVariable %59 Private + %4 = OpFunction %2 None %3 + %5 = OpLabel + %13 = OpVariable %12 Function + %16 = OpVariable %15 Function + %38 = OpVariable %12 Function + OpStore %9 %11 + OpStore %13 %10 + OpStore %16 %17 + OpBranch %18 + %18 = OpLabel + OpSelectionMerge %20 None + OpBranchConditional %61 %22 %20 + %22 = OpLabel + %23 = OpLoad %14 %16 + %26 = OpSLessThan %25 %23 %24 + OpBranchConditional %26 %19 %20 + %19 = OpLabel + %27 = OpLoad %14 %16 + %32 = OpAccessChain %31 %30 %17 + %33 = OpLoad %6 %32 + %34 = OpConvertFToS %14 %33 + %35 = OpSLessThan %25 %27 %34 + OpSelectionMerge %37 None + OpBranchConditional %35 %36 %44 + %36 = OpLabel + %41 = OpAccessChain %59 %9 %40 + %42 = OpLoad %6 %41 + OpStore %38 %42 + OpBranch %37 + %44 = OpLabel + %46 = OpAccessChain %59 %9 %45 + OpBranch %37 + %37 = OpLabel + %47 = OpLoad %6 %62 + OpStore %38 %47 + %48 = OpLoad %6 %38 + %49 = OpLoad %6 %13 + %50 = OpFAdd %6 %49 %48 + OpStore %13 %50 + OpBranch %20 + %21 = OpLabel + %51 = OpLoad %14 %16 + %53 = OpIAdd %14 %51 %52 + OpStore %16 %53 + OpBranch %18 + %20 = OpLabel + %57 = OpLoad %6 %13 + %58 = OpCompositeConstruct %54 %57 %57 %57 %57 + OpStore %56 %58 + OpReturn + OpFunctionEnd + )"; + CheckEqual(env, expected, context.get()); +} + +TEST(StructuredLoopToSelectionReductionPassTest, DominanceAndPhiIssue) { + // Exposes an interesting scenario where a use in a phi stops being dominated + // by the block with which it is associated in the phi. + std::string shader = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %17 = OpTypeBool + %18 = OpConstantTrue %17 + %19 = OpConstantFalse %17 + %20 = OpTypeInt 32 1 + %21 = OpConstant %20 5 + %22 = OpConstant %20 6 + %4 = OpFunction %2 None %3 + %5 = OpLabel + OpBranch %6 + %6 = OpLabel + OpLoopMerge %16 %15 None + OpBranch %7 + %7 = OpLabel + OpSelectionMerge %13 None + OpBranchConditional %18 %8 %9 + %8 = OpLabel + OpSelectionMerge %12 None + OpBranchConditional %18 %10 %11 + %9 = OpLabel + OpBranch %16 + %10 = OpLabel + OpBranch %16 + %11 = OpLabel + %23 = OpIAdd %20 %21 %22 + OpBranch %12 + %12 = OpLabel + OpBranch %13 + %13 = OpLabel + OpBranch %14 + %14 = OpLabel + %24 = OpPhi %20 %23 %13 + OpBranchConditional %19 %15 %16 + %15 = OpLabel + OpBranch %6 + %16 = OpLabel + OpReturn + OpFunctionEnd + )"; + + const auto env = SPV_ENV_UNIVERSAL_1_3; + const auto context = BuildModule(env, nullptr, shader, kReduceAssembleOption); + const auto pass = TestSubclass(env); + const auto ops = pass.WrapGetAvailableOpportunities(context.get()); + ASSERT_EQ(1, ops.size()); + + ASSERT_TRUE(ops[0]->PreconditionHolds()); + ops[0]->TryToApply(); + + CheckValid(env, context.get()); + + std::string expected = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %17 = OpTypeBool + %18 = OpConstantTrue %17 + %19 = OpConstantFalse %17 + %20 = OpTypeInt 32 1 + %21 = OpConstant %20 5 + %22 = OpConstant %20 6 + %25 = OpUndef %20 + %4 = OpFunction %2 None %3 + %5 = OpLabel + OpBranch %6 + %6 = OpLabel + OpSelectionMerge %16 None + OpBranchConditional %18 %7 %16 + %7 = OpLabel + OpSelectionMerge %13 None + OpBranchConditional %18 %8 %9 + %8 = OpLabel + OpSelectionMerge %12 None + OpBranchConditional %18 %10 %11 + %9 = OpLabel + OpBranch %13 + %10 = OpLabel + OpBranch %12 + %11 = OpLabel + %23 = OpIAdd %20 %21 %22 + OpBranch %12 + %12 = OpLabel + OpBranch %13 + %13 = OpLabel + OpBranch %14 + %14 = OpLabel + %24 = OpPhi %20 %25 %13 + OpBranchConditional %19 %16 %16 + %15 = OpLabel + OpBranch %6 + %16 = OpLabel + OpReturn + OpFunctionEnd + )"; + CheckEqual(env, expected, context.get()); +} + +TEST(StructuredLoopToSelectionReductionPassTest, OpLineBeforeOpPhi) { + // Test to ensure the pass knows OpLine and OpPhi instructions can be + // interleaved. + std::string shader = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %2 "main" + OpExecutionMode %2 OriginUpperLeft + OpSource ESSL 310 + %3 = OpString "somefile" + %4 = OpTypeVoid + %5 = OpTypeFunction %4 + %6 = OpTypeInt 32 1 + %7 = OpConstant %6 10 + %8 = OpConstant %6 20 + %9 = OpConstant %6 30 + %10 = OpTypeBool + %11 = OpConstantTrue %10 + %2 = OpFunction %4 None %5 + %12 = OpLabel + OpBranch %13 + %13 = OpLabel + OpLoopMerge %14 %15 None + OpBranch %16 + %16 = OpLabel + OpSelectionMerge %17 None + OpBranchConditional %11 %18 %19 + %18 = OpLabel + %20 = OpIAdd %6 %7 %8 + %21 = OpIAdd %6 %7 %9 + OpBranch %17 + %19 = OpLabel + OpBranch %14 + %17 = OpLabel + %22 = OpPhi %6 %20 %18 + OpLine %3 0 0 + %23 = OpPhi %6 %21 %18 + OpBranch %15 + %15 = OpLabel + OpBranch %13 + %14 = OpLabel + OpReturn + OpFunctionEnd + )"; + + const auto env = SPV_ENV_UNIVERSAL_1_3; + const auto context = BuildModule(env, nullptr, shader, kReduceAssembleOption); + const auto pass = TestSubclass(env); + const auto ops = pass.WrapGetAvailableOpportunities(context.get()); + ASSERT_EQ(1, ops.size()); + + ASSERT_TRUE(ops[0]->PreconditionHolds()); + ops[0]->TryToApply(); + + CheckValid(env, context.get()); + + std::string expected = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %2 "main" + OpExecutionMode %2 OriginUpperLeft + OpSource ESSL 310 + %3 = OpString "somefile" + %4 = OpTypeVoid + %5 = OpTypeFunction %4 + %6 = OpTypeInt 32 1 + %7 = OpConstant %6 10 + %8 = OpConstant %6 20 + %9 = OpConstant %6 30 + %10 = OpTypeBool + %11 = OpConstantTrue %10 + %24 = OpUndef %6 + %2 = OpFunction %4 None %5 + %12 = OpLabel + OpBranch %13 + %13 = OpLabel + OpSelectionMerge %14 None + OpBranchConditional %11 %16 %14 + %16 = OpLabel + OpSelectionMerge %17 None + OpBranchConditional %11 %18 %19 + %18 = OpLabel + %20 = OpIAdd %6 %7 %8 + %21 = OpIAdd %6 %7 %9 + OpBranch %17 + %19 = OpLabel + OpBranch %17 + %17 = OpLabel + %22 = OpPhi %6 %20 %18 %24 %19 + OpLine %3 0 0 + %23 = OpPhi %6 %21 %18 %24 %19 + OpBranch %14 + %15 = OpLabel + OpBranch %13 + %14 = OpLabel + OpReturn + OpFunctionEnd + )"; + CheckEqual(env, expected, context.get()); +} + +TEST(StructuredLoopToSelectionReductionPassTest, + SelectionMergeIsContinueTarget) { + // Example where a loop's continue target is also the target of a selection. + // In this scenario we cautiously do not apply the transformation. + std::string shader = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Vertex %1 "main" + %2 = OpTypeVoid + %3 = OpTypeBool + %4 = OpTypeFunction %2 + %1 = OpFunction %2 None %4 + %5 = OpLabel + %6 = OpUndef %3 + OpBranch %7 + %7 = OpLabel + %8 = OpPhi %3 %6 %5 %9 %10 + OpLoopMerge %11 %10 None + OpBranch %12 + %12 = OpLabel + %13 = OpUndef %3 + OpSelectionMerge %10 None + OpBranchConditional %13 %14 %10 + %14 = OpLabel + OpBranch %10 + %10 = OpLabel + %9 = OpUndef %3 + OpBranchConditional %9 %7 %11 + %11 = OpLabel + OpReturn + OpFunctionEnd + )"; + + const auto env = SPV_ENV_UNIVERSAL_1_3; + const auto context = BuildModule(env, nullptr, shader, kReduceAssembleOption); + const auto pass = TestSubclass(env); + const auto ops = pass.WrapGetAvailableOpportunities(context.get()); + + // There should be no opportunities. + ASSERT_EQ(0, ops.size()); +} + +TEST(StructuredLoopToSelectionReductionPassTest, + SwitchSelectionMergeIsContinueTarget) { + // Another example where a loop's continue target is also the target of a + // selection; this time a selection associated with an OpSwitch. We + // cautiously do not apply the transformation. + std::string shader = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Vertex %1 "main" + %2 = OpTypeVoid + %3 = OpTypeBool + %5 = OpTypeInt 32 1 + %4 = OpTypeFunction %2 + %6 = OpConstant %5 2 + %7 = OpConstantTrue %3 + %1 = OpFunction %2 None %4 + %8 = OpLabel + OpBranch %9 + %9 = OpLabel + OpLoopMerge %14 %15 None + OpBranchConditional %7 %10 %14 + %10 = OpLabel + OpSelectionMerge %15 None + OpSwitch %6 %12 1 %11 2 %11 3 %15 + %11 = OpLabel + OpBranch %12 + %12 = OpLabel + OpBranch %15 + %15 = OpLabel + OpBranch %9 + %14 = OpLabel + OpReturn + OpFunctionEnd + )"; + + const auto env = SPV_ENV_UNIVERSAL_1_3; + const auto context = BuildModule(env, nullptr, shader, kReduceAssembleOption); + const auto pass = TestSubclass(env); + const auto ops = pass.WrapGetAvailableOpportunities(context.get()); + + // There should be no opportunities. + ASSERT_EQ(0, ops.size()); +} + +TEST(StructuredLoopToSelectionReductionPassTest, ContinueTargetIsSwitchTarget) { + std::string shader = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Vertex %1 "main" + %2 = OpTypeVoid + %3 = OpTypeBool + %5 = OpTypeInt 32 1 + %4 = OpTypeFunction %2 + %6 = OpConstant %5 2 + %7 = OpConstantTrue %3 + %1 = OpFunction %2 None %4 + %8 = OpLabel + OpBranch %9 + %9 = OpLabel + OpLoopMerge %14 %12 None + OpBranchConditional %7 %10 %14 + %10 = OpLabel + OpSelectionMerge %15 None + OpSwitch %6 %12 1 %11 2 %11 3 %15 + %11 = OpLabel + OpBranch %12 + %12 = OpLabel + OpBranch %9 + %15 = OpLabel + OpBranch %14 + %14 = OpLabel + OpReturn + OpFunctionEnd + )"; + + const auto env = SPV_ENV_UNIVERSAL_1_3; + const auto context = BuildModule(env, nullptr, shader, kReduceAssembleOption); + const auto pass = TestSubclass(env); + const auto ops = pass.WrapGetAvailableOpportunities(context.get()); + + ASSERT_EQ(1, ops.size()); + ASSERT_TRUE(ops[0]->PreconditionHolds()); + ops[0]->TryToApply(); + + CheckValid(env, context.get()); + + std::string expected = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Vertex %1 "main" + %2 = OpTypeVoid + %3 = OpTypeBool + %5 = OpTypeInt 32 1 + %4 = OpTypeFunction %2 + %6 = OpConstant %5 2 + %7 = OpConstantTrue %3 + %1 = OpFunction %2 None %4 + %8 = OpLabel + OpBranch %9 + %9 = OpLabel + OpSelectionMerge %14 None + OpBranchConditional %7 %10 %14 + %10 = OpLabel + OpSelectionMerge %15 None + OpSwitch %6 %15 1 %11 2 %11 3 %15 + %11 = OpLabel + OpBranch %15 + %12 = OpLabel + OpBranch %9 + %15 = OpLabel + OpBranch %14 + %14 = OpLabel + OpReturn + OpFunctionEnd + )"; + CheckEqual(env, expected, context.get()); +} + +TEST(StructuredLoopToSelectionReductionPassTest, + MultipleSwitchTargetsAreContinueTarget) { + std::string shader = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Vertex %1 "main" + %2 = OpTypeVoid + %3 = OpTypeBool + %5 = OpTypeInt 32 1 + %4 = OpTypeFunction %2 + %6 = OpConstant %5 2 + %7 = OpConstantTrue %3 + %1 = OpFunction %2 None %4 + %8 = OpLabel + OpBranch %9 + %9 = OpLabel + OpLoopMerge %14 %12 None + OpBranchConditional %7 %10 %14 + %10 = OpLabel + OpSelectionMerge %15 None + OpSwitch %6 %11 1 %12 2 %12 3 %15 + %11 = OpLabel + OpBranch %12 + %12 = OpLabel + OpBranch %9 + %15 = OpLabel + OpBranch %14 + %14 = OpLabel + OpReturn + OpFunctionEnd + )"; + + const auto env = SPV_ENV_UNIVERSAL_1_3; + const auto context = BuildModule(env, nullptr, shader, kReduceAssembleOption); + const auto pass = TestSubclass(env); + const auto ops = pass.WrapGetAvailableOpportunities(context.get()); + + ASSERT_EQ(1, ops.size()); + ASSERT_TRUE(ops[0]->PreconditionHolds()); + ops[0]->TryToApply(); + + CheckValid(env, context.get()); + + std::string expected = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Vertex %1 "main" + %2 = OpTypeVoid + %3 = OpTypeBool + %5 = OpTypeInt 32 1 + %4 = OpTypeFunction %2 + %6 = OpConstant %5 2 + %7 = OpConstantTrue %3 + %1 = OpFunction %2 None %4 + %8 = OpLabel + OpBranch %9 + %9 = OpLabel + OpSelectionMerge %14 None + OpBranchConditional %7 %10 %14 + %10 = OpLabel + OpSelectionMerge %15 None + OpSwitch %6 %11 1 %15 2 %15 3 %15 + %11 = OpLabel + OpBranch %15 + %12 = OpLabel + OpBranch %9 + %15 = OpLabel + OpBranch %14 + %14 = OpLabel + OpReturn + OpFunctionEnd + )"; + CheckEqual(env, expected, context.get()); +} + +TEST(StructuredLoopToSelectionReductionPassTest, LoopBranchesStraightToMerge) { + std::string shader = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Vertex %1 "main" + %2 = OpTypeVoid + %4 = OpTypeFunction %2 + %1 = OpFunction %2 None %4 + %8 = OpLabel + OpBranch %9 + %9 = OpLabel + OpLoopMerge %14 %12 None + OpBranch %14 + %12 = OpLabel + OpBranch %9 + %14 = OpLabel + OpReturn + OpFunctionEnd + )"; + + const auto env = SPV_ENV_UNIVERSAL_1_3; + const auto context = BuildModule(env, nullptr, shader, kReduceAssembleOption); + const auto pass = TestSubclass(env); + const auto ops = pass.WrapGetAvailableOpportunities(context.get()); + + ASSERT_EQ(1, ops.size()); + ASSERT_TRUE(ops[0]->PreconditionHolds()); + ops[0]->TryToApply(); + + CheckValid(env, context.get()); + + std::string expected = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Vertex %1 "main" + %2 = OpTypeVoid + %4 = OpTypeFunction %2 + %15 = OpTypeBool + %16 = OpConstantTrue %15 + %1 = OpFunction %2 None %4 + %8 = OpLabel + OpBranch %9 + %9 = OpLabel + OpSelectionMerge %14 None + OpBranchConditional %16 %14 %14 + %12 = OpLabel + OpBranch %9 + %14 = OpLabel + OpReturn + OpFunctionEnd + )"; + CheckEqual(env, expected, context.get()); +} + +TEST(StructuredLoopToSelectionReductionPassTest, + LoopConditionallyJumpsToMergeOrContinue) { + std::string shader = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Vertex %1 "main" + %2 = OpTypeVoid + %3 = OpTypeBool + %4 = OpTypeFunction %2 + %7 = OpConstantTrue %3 + %1 = OpFunction %2 None %4 + %8 = OpLabel + OpBranch %9 + %9 = OpLabel + OpLoopMerge %14 %12 None + OpBranchConditional %7 %14 %12 + %12 = OpLabel + OpBranch %9 + %14 = OpLabel + OpReturn + OpFunctionEnd + )"; + + const auto env = SPV_ENV_UNIVERSAL_1_3; + const auto context = BuildModule(env, nullptr, shader, kReduceAssembleOption); + const auto pass = TestSubclass(env); + const auto ops = pass.WrapGetAvailableOpportunities(context.get()); + + ASSERT_EQ(1, ops.size()); + ASSERT_TRUE(ops[0]->PreconditionHolds()); + ops[0]->TryToApply(); + + CheckValid(env, context.get()); + + std::string expected = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Vertex %1 "main" + %2 = OpTypeVoid + %3 = OpTypeBool + %4 = OpTypeFunction %2 + %7 = OpConstantTrue %3 + %1 = OpFunction %2 None %4 + %8 = OpLabel + OpBranch %9 + %9 = OpLabel + OpSelectionMerge %14 None + OpBranchConditional %7 %14 %14 + %12 = OpLabel + OpBranch %9 + %14 = OpLabel + OpReturn + OpFunctionEnd + )"; + CheckEqual(env, expected, context.get()); +} + +TEST(StructuredLoopToSelectionReductionPassTest, MultipleAccessChains) { + std::string shader = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeInt 32 1 + %7 = OpTypeStruct %6 + %8 = OpTypeStruct %7 + %9 = OpTypePointer Function %8 + %11 = OpConstant %6 3 + %12 = OpConstantComposite %7 %11 + %13 = OpConstantComposite %8 %12 + %14 = OpTypePointer Function %7 + %16 = OpConstant %6 0 + %19 = OpTypePointer Function %6 + %15 = OpTypeBool + %18 = OpConstantTrue %15 + %4 = OpFunction %2 None %3 + %5 = OpLabel + %10 = OpVariable %9 Function + %20 = OpVariable %19 Function + OpStore %10 %13 + OpBranch %23 + %23 = OpLabel + OpLoopMerge %25 %26 None + OpBranch %27 + %27 = OpLabel + OpSelectionMerge %28 None + OpBranchConditional %18 %29 %25 + %29 = OpLabel + %17 = OpAccessChain %14 %10 %16 + OpBranch %28 + %28 = OpLabel + %21 = OpAccessChain %19 %17 %16 + %22 = OpLoad %6 %21 + %24 = OpAccessChain %19 %10 %16 %16 + OpStore %24 %22 + OpBranch %25 + %26 = OpLabel + OpBranch %23 + %25 = OpLabel + OpReturn + OpFunctionEnd + )"; + + const auto env = SPV_ENV_UNIVERSAL_1_3; + const auto context = BuildModule(env, nullptr, shader, kReduceAssembleOption); + const auto pass = TestSubclass(env); + const auto ops = pass.WrapGetAvailableOpportunities(context.get()); + + ASSERT_EQ(1, ops.size()); + ASSERT_TRUE(ops[0]->PreconditionHolds()); + ops[0]->TryToApply(); + + CheckValid(env, context.get()); + + std::string expected = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeInt 32 1 + %7 = OpTypeStruct %6 + %8 = OpTypeStruct %7 + %9 = OpTypePointer Function %8 + %11 = OpConstant %6 3 + %12 = OpConstantComposite %7 %11 + %13 = OpConstantComposite %8 %12 + %14 = OpTypePointer Function %7 + %16 = OpConstant %6 0 + %19 = OpTypePointer Function %6 + %15 = OpTypeBool + %18 = OpConstantTrue %15 + %4 = OpFunction %2 None %3 + %5 = OpLabel + %10 = OpVariable %9 Function + %20 = OpVariable %19 Function + %30 = OpVariable %14 Function + OpStore %10 %13 + OpBranch %23 + %23 = OpLabel + OpSelectionMerge %25 None + OpBranchConditional %18 %27 %25 + %27 = OpLabel + OpSelectionMerge %28 None + OpBranchConditional %18 %29 %28 + %29 = OpLabel + %17 = OpAccessChain %14 %10 %16 + OpBranch %28 + %28 = OpLabel + %21 = OpAccessChain %19 %30 %16 + %22 = OpLoad %6 %21 + %24 = OpAccessChain %19 %10 %16 %16 + OpStore %24 %22 + OpBranch %25 + %26 = OpLabel + OpBranch %23 + %25 = OpLabel + OpReturn + OpFunctionEnd + )"; + CheckEqual(env, expected, context.get()); +} + +TEST(StructuredLoopToSelectionReductionPassTest, + UnreachableInnerLoopContinueBranchingToOuterLoopMerge) { + std::string shader = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %2 "main" + OpExecutionMode %2 OriginUpperLeft + OpSource ESSL 310 + %3 = OpTypeVoid + %4 = OpTypeFunction %3 + %5 = OpTypeBool + %6 = OpConstantTrue %5 + %2 = OpFunction %3 None %4 + %7 = OpLabel + OpBranch %8 + %8 = OpLabel + OpLoopMerge %9 %10 None + OpBranch %11 + %11 = OpLabel + OpLoopMerge %12 %13 None + OpBranch %12 + %13 = OpLabel + OpBranchConditional %6 %9 %11 + %12 = OpLabel + OpBranch %10 + %10 = OpLabel + OpBranchConditional %6 %9 %8 + %9 = OpLabel + OpReturn + OpFunctionEnd + )"; + + const auto env = SPV_ENV_UNIVERSAL_1_3; + const auto context = BuildModule(env, nullptr, shader, kReduceAssembleOption); + const auto pass = TestSubclass(env); + const auto ops = pass.WrapGetAvailableOpportunities(context.get()); + + ASSERT_EQ(2, ops.size()); + ASSERT_TRUE(ops[0]->PreconditionHolds()); + ops[0]->TryToApply(); + + CheckValid(env, context.get()); + + std::string after_op_0 = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %2 "main" + OpExecutionMode %2 OriginUpperLeft + OpSource ESSL 310 + %3 = OpTypeVoid + %4 = OpTypeFunction %3 + %5 = OpTypeBool + %6 = OpConstantTrue %5 + %2 = OpFunction %3 None %4 + %7 = OpLabel + OpBranch %8 + %8 = OpLabel + OpSelectionMerge %9 None + OpBranchConditional %6 %11 %9 + %11 = OpLabel + OpLoopMerge %12 %13 None + OpBranch %12 + %13 = OpLabel + OpBranchConditional %6 %9 %11 + %12 = OpLabel + OpBranch %9 + %10 = OpLabel + OpBranchConditional %6 %9 %8 + %9 = OpLabel + OpReturn + OpFunctionEnd + )"; + CheckEqual(env, after_op_0, context.get()); + + ASSERT_TRUE(ops[1]->PreconditionHolds()); + ops[1]->TryToApply(); + + CheckValid(env, context.get()); + + std::string after_op_1 = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %2 "main" + OpExecutionMode %2 OriginUpperLeft + OpSource ESSL 310 + %3 = OpTypeVoid + %4 = OpTypeFunction %3 + %5 = OpTypeBool + %6 = OpConstantTrue %5 + %2 = OpFunction %3 None %4 + %7 = OpLabel + OpBranch %8 + %8 = OpLabel + OpSelectionMerge %9 None + OpBranchConditional %6 %11 %9 + %11 = OpLabel + OpSelectionMerge %12 None + OpBranchConditional %6 %12 %12 + %13 = OpLabel + OpBranchConditional %6 %9 %11 + %12 = OpLabel + OpBranch %9 + %10 = OpLabel + OpBranchConditional %6 %9 %8 + %9 = OpLabel + OpReturn + OpFunctionEnd + )"; + CheckEqual(env, after_op_1, context.get()); +} + +TEST(StructuredLoopToSelectionReductionPassTest, + UnreachableInnerLoopContinueBranchingToOuterLoopMerge2) { + // In this test, the branch to the outer loop merge from the inner loop's + // continue is part of a structured selection. + std::string shader = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %2 "main" + OpExecutionMode %2 OriginUpperLeft + OpSource ESSL 310 + %3 = OpTypeVoid + %4 = OpTypeFunction %3 + %5 = OpTypeBool + %6 = OpConstantTrue %5 + %2 = OpFunction %3 None %4 + %7 = OpLabel + OpBranch %8 + %8 = OpLabel + OpLoopMerge %9 %10 None + OpBranch %11 + %11 = OpLabel + OpLoopMerge %12 %13 None + OpBranch %12 + %13 = OpLabel + OpSelectionMerge %14 None + OpBranchConditional %6 %9 %14 + %14 = OpLabel + OpBranch %11 + %12 = OpLabel + OpBranch %10 + %10 = OpLabel + OpBranchConditional %6 %9 %8 + %9 = OpLabel + OpReturn + OpFunctionEnd + )"; + + const auto env = SPV_ENV_UNIVERSAL_1_3; + const auto context = BuildModule(env, nullptr, shader, kReduceAssembleOption); + const auto pass = TestSubclass(env); + const auto ops = pass.WrapGetAvailableOpportunities(context.get()); + + ASSERT_EQ(2, ops.size()); + ASSERT_TRUE(ops[0]->PreconditionHolds()); + ops[0]->TryToApply(); + + CheckValid(env, context.get()); + + std::string after_op_0 = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %2 "main" + OpExecutionMode %2 OriginUpperLeft + OpSource ESSL 310 + %3 = OpTypeVoid + %4 = OpTypeFunction %3 + %5 = OpTypeBool + %6 = OpConstantTrue %5 + %2 = OpFunction %3 None %4 + %7 = OpLabel + OpBranch %8 + %8 = OpLabel + OpSelectionMerge %9 None + OpBranchConditional %6 %11 %9 + %11 = OpLabel + OpLoopMerge %12 %13 None + OpBranch %12 + %13 = OpLabel + OpSelectionMerge %14 None + OpBranchConditional %6 %9 %14 + %14 = OpLabel + OpBranch %11 + %12 = OpLabel + OpBranch %9 + %10 = OpLabel + OpBranchConditional %6 %9 %8 + %9 = OpLabel + OpReturn + OpFunctionEnd + )"; + CheckEqual(env, after_op_0, context.get()); + + ASSERT_TRUE(ops[1]->PreconditionHolds()); + ops[1]->TryToApply(); + + CheckValid(env, context.get()); + + std::string after_op_1 = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %2 "main" + OpExecutionMode %2 OriginUpperLeft + OpSource ESSL 310 + %3 = OpTypeVoid + %4 = OpTypeFunction %3 + %5 = OpTypeBool + %6 = OpConstantTrue %5 + %2 = OpFunction %3 None %4 + %7 = OpLabel + OpBranch %8 + %8 = OpLabel + OpSelectionMerge %9 None + OpBranchConditional %6 %11 %9 + %11 = OpLabel + OpSelectionMerge %12 None + OpBranchConditional %6 %12 %12 + %13 = OpLabel + OpSelectionMerge %14 None + OpBranchConditional %6 %9 %14 + %14 = OpLabel + OpBranch %11 + %12 = OpLabel + OpBranch %9 + %10 = OpLabel + OpBranchConditional %6 %9 %8 + %9 = OpLabel + OpReturn + OpFunctionEnd + )"; + CheckEqual(env, after_op_1, context.get()); +} + +TEST(StructuredLoopToSelectionReductionPassTest, + InnerLoopHeaderBranchesToOuterLoopMerge) { + std::string shader = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %2 "main" + OpExecutionMode %2 OriginUpperLeft + OpSource ESSL 310 + %3 = OpTypeVoid + %4 = OpTypeFunction %3 + %5 = OpTypeBool + %6 = OpConstantTrue %5 + %2 = OpFunction %3 None %4 + %7 = OpLabel + OpBranch %8 + %8 = OpLabel + OpLoopMerge %9 %10 None + OpBranch %11 + %11 = OpLabel + OpLoopMerge %12 %13 None + OpBranchConditional %6 %9 %13 + %13 = OpLabel + OpBranchConditional %6 %11 %12 + %12 = OpLabel + OpBranch %10 + %10 = OpLabel + OpBranchConditional %6 %9 %8 + %9 = OpLabel + OpReturn + OpFunctionEnd + )"; + + const auto env = SPV_ENV_UNIVERSAL_1_3; + const auto context = BuildModule(env, nullptr, shader, kReduceAssembleOption); + const auto pass = TestSubclass(env); + auto ops = pass.WrapGetAvailableOpportunities(context.get()); + + // We cannot transform the inner loop due to its header jumping straight to + // the outer loop merge (the inner loop's merge does not post-dominate its + // header). + ASSERT_EQ(1, ops.size()); + ASSERT_TRUE(ops[0]->PreconditionHolds()); + ops[0]->TryToApply(); + + CheckValid(env, context.get()); + + std::string after_op_0 = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %2 "main" + OpExecutionMode %2 OriginUpperLeft + OpSource ESSL 310 + %3 = OpTypeVoid + %4 = OpTypeFunction %3 + %5 = OpTypeBool + %6 = OpConstantTrue %5 + %2 = OpFunction %3 None %4 + %7 = OpLabel + OpBranch %8 + %8 = OpLabel + OpSelectionMerge %9 None + OpBranchConditional %6 %11 %9 + %11 = OpLabel + OpLoopMerge %12 %13 None + OpBranchConditional %6 %12 %13 + %13 = OpLabel + OpBranchConditional %6 %11 %12 + %12 = OpLabel + OpBranch %9 + %10 = OpLabel + OpBranchConditional %6 %9 %8 + %9 = OpLabel + OpReturn + OpFunctionEnd + )"; + CheckEqual(env, after_op_0, context.get()); + + // Now look again for more opportunities. + ops = pass.WrapGetAvailableOpportunities(context.get()); + + // What was the inner loop should now be transformable, as the jump to the + // outer loop's merge has been redirected. + ASSERT_EQ(1, ops.size()); + ASSERT_TRUE(ops[0]->PreconditionHolds()); + ops[0]->TryToApply(); + + CheckValid(env, context.get()); + + std::string after_another_op_0 = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %2 "main" + OpExecutionMode %2 OriginUpperLeft + OpSource ESSL 310 + %3 = OpTypeVoid + %4 = OpTypeFunction %3 + %5 = OpTypeBool + %6 = OpConstantTrue %5 + %2 = OpFunction %3 None %4 + %7 = OpLabel + OpBranch %8 + %8 = OpLabel + OpSelectionMerge %9 None + OpBranchConditional %6 %11 %9 + %11 = OpLabel + OpSelectionMerge %12 None + OpBranchConditional %6 %12 %12 + %13 = OpLabel + OpBranchConditional %6 %11 %12 + %12 = OpLabel + OpBranch %9 + %10 = OpLabel + OpBranchConditional %6 %9 %8 + %9 = OpLabel + OpReturn + OpFunctionEnd + )"; + CheckEqual(env, after_another_op_0, context.get()); +} + +TEST(StructuredLoopToSelectionReductionPassTest, LongAccessChains) { + std::string shader = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %2 "main" + OpExecutionMode %2 OriginUpperLeft + OpSource ESSL 310 + %3 = OpTypeVoid + %4 = OpTypeFunction %3 + %5 = OpTypeInt 32 1 + %6 = OpTypeInt 32 0 + %7 = OpConstant %6 5 + %8 = OpTypeArray %5 %7 + %9 = OpTypeStruct %8 + %10 = OpTypeStruct %9 %9 + %11 = OpConstant %6 2 + %12 = OpTypeArray %10 %11 + %13 = OpTypeStruct %12 + %14 = OpTypePointer Function %13 + %15 = OpConstant %5 0 + %16 = OpConstant %5 1 + %17 = OpConstant %5 2 + %18 = OpConstant %5 3 + %19 = OpConstant %5 4 + %20 = OpConstantComposite %8 %15 %16 %17 %18 %19 + %21 = OpConstantComposite %9 %20 + %22 = OpConstant %5 5 + %23 = OpConstant %5 6 + %24 = OpConstant %5 7 + %25 = OpConstant %5 8 + %26 = OpConstant %5 9 + %27 = OpConstantComposite %8 %22 %23 %24 %25 %26 + %28 = OpConstantComposite %9 %27 + %29 = OpConstantComposite %10 %21 %28 + %30 = OpConstant %5 10 + %31 = OpConstant %5 11 + %32 = OpConstant %5 12 + %33 = OpConstant %5 13 + %34 = OpConstant %5 14 + %35 = OpConstantComposite %8 %30 %31 %32 %33 %34 + %36 = OpConstantComposite %9 %35 + %37 = OpConstant %5 15 + %38 = OpConstant %5 16 + %39 = OpConstant %5 17 + %40 = OpConstant %5 18 + %41 = OpConstant %5 19 + %42 = OpConstantComposite %8 %37 %38 %39 %40 %41 + %43 = OpConstantComposite %9 %42 + %44 = OpConstantComposite %10 %36 %43 + %45 = OpConstantComposite %12 %29 %44 + %46 = OpConstantComposite %13 %45 + %47 = OpTypePointer Function %12 + %48 = OpTypePointer Function %10 + %49 = OpTypePointer Function %9 + %50 = OpTypePointer Function %8 + %51 = OpTypePointer Function %5 + %52 = OpTypeBool + %53 = OpConstantTrue %52 + %2 = OpFunction %3 None %4 + %54 = OpLabel + %55 = OpVariable %14 Function + OpStore %55 %46 + OpBranch %56 + %56 = OpLabel + OpLoopMerge %57 %58 None + OpBranchConditional %53 %57 %59 + %59 = OpLabel + OpSelectionMerge %60 None + OpBranchConditional %53 %61 %57 + %61 = OpLabel + %62 = OpAccessChain %47 %55 %15 + OpBranch %63 + %63 = OpLabel + OpSelectionMerge %64 None + OpBranchConditional %53 %65 %57 + %65 = OpLabel + %66 = OpAccessChain %48 %62 %16 + OpBranch %67 + %67 = OpLabel + OpSelectionMerge %68 None + OpBranchConditional %53 %69 %57 + %69 = OpLabel + %70 = OpAccessChain %49 %66 %16 + OpBranch %71 + %71 = OpLabel + OpSelectionMerge %72 None + OpBranchConditional %53 %73 %57 + %73 = OpLabel + %74 = OpAccessChain %50 %70 %15 + OpBranch %75 + %75 = OpLabel + OpSelectionMerge %76 None + OpBranchConditional %53 %77 %57 + %77 = OpLabel + %78 = OpAccessChain %51 %74 %17 + OpBranch %79 + %79 = OpLabel + OpSelectionMerge %80 None + OpBranchConditional %53 %81 %57 + %81 = OpLabel + %82 = OpLoad %5 %78 + OpBranch %80 + %80 = OpLabel + OpBranch %76 + %76 = OpLabel + OpBranch %72 + %72 = OpLabel + OpBranch %68 + %68 = OpLabel + OpBranch %64 + %64 = OpLabel + OpBranch %60 + %60 = OpLabel + OpBranch %58 + %58 = OpLabel + OpBranch %56 + %57 = OpLabel + OpReturn + OpFunctionEnd + )"; + + const auto env = SPV_ENV_UNIVERSAL_1_3; + const auto context = BuildModule(env, nullptr, shader, kReduceAssembleOption); + const auto pass = TestSubclass(env); + auto ops = pass.WrapGetAvailableOpportunities(context.get()); + + ASSERT_EQ(1, ops.size()); + ASSERT_TRUE(ops[0]->PreconditionHolds()); + ops[0]->TryToApply(); + + CheckValid(env, context.get()); + + // TODO(2183): When we have a more general solution for handling access + // chains, write an expected result for this test. + // std::string expected = R"( + // Expected text for transformed shader + //)"; + // CheckEqual(env, expected, context.get()); +} + +} // namespace +} // namespace reduce +} // namespace spvtools diff --git a/3rdparty/spirv-tools/test/reduce/validation_during_reduction_test.cpp b/3rdparty/spirv-tools/test/reduce/validation_during_reduction_test.cpp new file mode 100644 index 000000000..bb7d14e10 --- /dev/null +++ b/3rdparty/spirv-tools/test/reduce/validation_during_reduction_test.cpp @@ -0,0 +1,376 @@ +// Copyright (c) 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "reduce_test_util.h" + +#include "source/reduce/reducer.h" +#include "source/reduce/reduction_pass.h" +#include "source/reduce/remove_instruction_reduction_opportunity.h" + +namespace spvtools { +namespace reduce { +namespace { + +// A dumb reduction pass that removes global values regardless of whether they +// are referenced. This is very likely to make the resulting module invalid. We +// use this to test the reducer's behavior in the scenario where a bad reduction +// pass leads to an invalid module. +class BlindlyRemoveGlobalValuesPass : public ReductionPass { + public: + // Creates the reduction pass in the context of the given target environment + // |target_env| + explicit BlindlyRemoveGlobalValuesPass(const spv_target_env target_env) + : ReductionPass(target_env) {} + + ~BlindlyRemoveGlobalValuesPass() override = default; + + // The name of this pass. + std::string GetName() const final { return "BlindlyRemoveGlobalValuesPass"; }; + + protected: + // Adds opportunities to remove all global values. Assuming they are all + // referenced (directly or indirectly) from elsewhere in the module, each such + // opportunity will make the module invalid. + std::vector> GetAvailableOpportunities( + opt::IRContext* context) const final { + std::vector> result; + for (auto& inst : context->module()->types_values()) { + if (inst.HasResultId()) { + result.push_back( + MakeUnique(&inst)); + } + } + return result; + } +}; + +TEST(ValidationDuringReductionTest, CheckInvalidPassMakesNoProgress) { + // A module whose global values are all referenced, so that any application of + // MakeModuleInvalidPass will make the module invalid. + std::string original = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" %60 + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + OpName %4 "main" + OpName %16 "buf2" + OpMemberName %16 0 "i" + OpName %18 "" + OpName %25 "buf1" + OpMemberName %25 0 "f" + OpName %27 "" + OpName %60 "_GLF_color" + OpMemberDecorate %16 0 Offset 0 + OpDecorate %16 Block + OpDecorate %18 DescriptorSet 0 + OpDecorate %18 Binding 2 + OpMemberDecorate %25 0 Offset 0 + OpDecorate %25 Block + OpDecorate %27 DescriptorSet 0 + OpDecorate %27 Binding 1 + OpDecorate %60 Location 0 + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeInt 32 1 + %9 = OpConstant %6 0 + %16 = OpTypeStruct %6 + %17 = OpTypePointer Uniform %16 + %18 = OpVariable %17 Uniform + %19 = OpTypePointer Uniform %6 + %22 = OpTypeBool + %24 = OpTypeFloat 32 + %25 = OpTypeStruct %24 + %26 = OpTypePointer Uniform %25 + %27 = OpVariable %26 Uniform + %28 = OpTypePointer Uniform %24 + %31 = OpConstant %24 2 + %56 = OpConstant %6 1 + %58 = OpTypeVector %24 4 + %59 = OpTypePointer Output %58 + %60 = OpVariable %59 Output + %72 = OpUndef %24 + %74 = OpUndef %6 + %4 = OpFunction %2 None %3 + %5 = OpLabel + OpBranch %10 + %10 = OpLabel + %73 = OpPhi %6 %74 %5 %77 %34 + %71 = OpPhi %24 %72 %5 %76 %34 + %70 = OpPhi %6 %9 %5 %57 %34 + %20 = OpAccessChain %19 %18 %9 + %21 = OpLoad %6 %20 + %23 = OpSLessThan %22 %70 %21 + OpLoopMerge %12 %34 None + OpBranchConditional %23 %11 %12 + %11 = OpLabel + %29 = OpAccessChain %28 %27 %9 + %30 = OpLoad %24 %29 + %32 = OpFOrdGreaterThan %22 %30 %31 + OpSelectionMerge %34 None + OpBranchConditional %32 %33 %46 + %33 = OpLabel + %40 = OpFAdd %24 %71 %30 + %45 = OpISub %6 %73 %21 + OpBranch %34 + %46 = OpLabel + %50 = OpFMul %24 %71 %30 + %54 = OpSDiv %6 %73 %21 + OpBranch %34 + %34 = OpLabel + %77 = OpPhi %6 %45 %33 %54 %46 + %76 = OpPhi %24 %40 %33 %50 %46 + %57 = OpIAdd %6 %70 %56 + OpBranch %10 + %12 = OpLabel + %61 = OpAccessChain %28 %27 %9 + %62 = OpLoad %24 %61 + %66 = OpConvertSToF %24 %21 + %68 = OpConvertSToF %24 %73 + %69 = OpCompositeConstruct %58 %62 %71 %66 %68 + OpStore %60 %69 + OpReturn + OpFunctionEnd + )"; + + spv_target_env env = SPV_ENV_UNIVERSAL_1_3; + Reducer reducer(env); + reducer.SetMessageConsumer(NopDiagnostic); + + // Say that every module is interesting. + reducer.SetInterestingnessFunction( + [](const std::vector&, uint32_t) -> bool { return true; }); + + reducer.AddReductionPass(MakeUnique(env)); + + std::vector binary_in; + SpirvTools t(env); + + ASSERT_TRUE(t.Assemble(original, &binary_in, kReduceAssembleOption)); + std::vector binary_out; + spvtools::ReducerOptions reducer_options; + reducer_options.set_step_limit(500); + + reducer.Run(std::move(binary_in), &binary_out, reducer_options); + + // The reducer should have no impact. + CheckEqual(env, original, binary_out); +} + +TEST(ValidationDuringReductionTest, CheckNotAlwaysInvalidCanMakeProgress) { + // A module with just one unreferenced global value. All but one application + // of MakeModuleInvalidPass will make the module invalid. + std::string original = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" %60 + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + OpName %4 "main" + OpName %16 "buf2" + OpMemberName %16 0 "i" + OpName %18 "" + OpName %25 "buf1" + OpMemberName %25 0 "f" + OpName %27 "" + OpName %60 "_GLF_color" + OpMemberDecorate %16 0 Offset 0 + OpDecorate %16 Block + OpDecorate %18 DescriptorSet 0 + OpDecorate %18 Binding 2 + OpMemberDecorate %25 0 Offset 0 + OpDecorate %25 Block + OpDecorate %27 DescriptorSet 0 + OpDecorate %27 Binding 1 + OpDecorate %60 Location 0 + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeInt 32 1 + %9 = OpConstant %6 0 + %16 = OpTypeStruct %6 + %17 = OpTypePointer Uniform %16 + %18 = OpVariable %17 Uniform + %19 = OpTypePointer Uniform %6 + %22 = OpTypeBool + %24 = OpTypeFloat 32 + %25 = OpTypeStruct %24 + %26 = OpTypePointer Uniform %25 + %27 = OpVariable %26 Uniform + %28 = OpTypePointer Uniform %24 + %31 = OpConstant %24 2 + %56 = OpConstant %6 1 + %1000 = OpConstant %6 1000 ; It should be possible to remove this instruction without making the module invalid. + %58 = OpTypeVector %24 4 + %59 = OpTypePointer Output %58 + %60 = OpVariable %59 Output + %72 = OpUndef %24 + %74 = OpUndef %6 + %4 = OpFunction %2 None %3 + %5 = OpLabel + OpBranch %10 + %10 = OpLabel + %73 = OpPhi %6 %74 %5 %77 %34 + %71 = OpPhi %24 %72 %5 %76 %34 + %70 = OpPhi %6 %9 %5 %57 %34 + %20 = OpAccessChain %19 %18 %9 + %21 = OpLoad %6 %20 + %23 = OpSLessThan %22 %70 %21 + OpLoopMerge %12 %34 None + OpBranchConditional %23 %11 %12 + %11 = OpLabel + %29 = OpAccessChain %28 %27 %9 + %30 = OpLoad %24 %29 + %32 = OpFOrdGreaterThan %22 %30 %31 + OpSelectionMerge %34 None + OpBranchConditional %32 %33 %46 + %33 = OpLabel + %40 = OpFAdd %24 %71 %30 + %45 = OpISub %6 %73 %21 + OpBranch %34 + %46 = OpLabel + %50 = OpFMul %24 %71 %30 + %54 = OpSDiv %6 %73 %21 + OpBranch %34 + %34 = OpLabel + %77 = OpPhi %6 %45 %33 %54 %46 + %76 = OpPhi %24 %40 %33 %50 %46 + %57 = OpIAdd %6 %70 %56 + OpBranch %10 + %12 = OpLabel + %61 = OpAccessChain %28 %27 %9 + %62 = OpLoad %24 %61 + %66 = OpConvertSToF %24 %21 + %68 = OpConvertSToF %24 %73 + %69 = OpCompositeConstruct %58 %62 %71 %66 %68 + OpStore %60 %69 + OpReturn + OpFunctionEnd + )"; + + // This is the same as the original, except that the constant declaration of + // 1000 is gone. + std::string expected = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %4 "main" %60 + OpExecutionMode %4 OriginUpperLeft + OpSource ESSL 310 + OpName %4 "main" + OpName %16 "buf2" + OpMemberName %16 0 "i" + OpName %18 "" + OpName %25 "buf1" + OpMemberName %25 0 "f" + OpName %27 "" + OpName %60 "_GLF_color" + OpMemberDecorate %16 0 Offset 0 + OpDecorate %16 Block + OpDecorate %18 DescriptorSet 0 + OpDecorate %18 Binding 2 + OpMemberDecorate %25 0 Offset 0 + OpDecorate %25 Block + OpDecorate %27 DescriptorSet 0 + OpDecorate %27 Binding 1 + OpDecorate %60 Location 0 + %2 = OpTypeVoid + %3 = OpTypeFunction %2 + %6 = OpTypeInt 32 1 + %9 = OpConstant %6 0 + %16 = OpTypeStruct %6 + %17 = OpTypePointer Uniform %16 + %18 = OpVariable %17 Uniform + %19 = OpTypePointer Uniform %6 + %22 = OpTypeBool + %24 = OpTypeFloat 32 + %25 = OpTypeStruct %24 + %26 = OpTypePointer Uniform %25 + %27 = OpVariable %26 Uniform + %28 = OpTypePointer Uniform %24 + %31 = OpConstant %24 2 + %56 = OpConstant %6 1 + %58 = OpTypeVector %24 4 + %59 = OpTypePointer Output %58 + %60 = OpVariable %59 Output + %72 = OpUndef %24 + %74 = OpUndef %6 + %4 = OpFunction %2 None %3 + %5 = OpLabel + OpBranch %10 + %10 = OpLabel + %73 = OpPhi %6 %74 %5 %77 %34 + %71 = OpPhi %24 %72 %5 %76 %34 + %70 = OpPhi %6 %9 %5 %57 %34 + %20 = OpAccessChain %19 %18 %9 + %21 = OpLoad %6 %20 + %23 = OpSLessThan %22 %70 %21 + OpLoopMerge %12 %34 None + OpBranchConditional %23 %11 %12 + %11 = OpLabel + %29 = OpAccessChain %28 %27 %9 + %30 = OpLoad %24 %29 + %32 = OpFOrdGreaterThan %22 %30 %31 + OpSelectionMerge %34 None + OpBranchConditional %32 %33 %46 + %33 = OpLabel + %40 = OpFAdd %24 %71 %30 + %45 = OpISub %6 %73 %21 + OpBranch %34 + %46 = OpLabel + %50 = OpFMul %24 %71 %30 + %54 = OpSDiv %6 %73 %21 + OpBranch %34 + %34 = OpLabel + %77 = OpPhi %6 %45 %33 %54 %46 + %76 = OpPhi %24 %40 %33 %50 %46 + %57 = OpIAdd %6 %70 %56 + OpBranch %10 + %12 = OpLabel + %61 = OpAccessChain %28 %27 %9 + %62 = OpLoad %24 %61 + %66 = OpConvertSToF %24 %21 + %68 = OpConvertSToF %24 %73 + %69 = OpCompositeConstruct %58 %62 %71 %66 %68 + OpStore %60 %69 + OpReturn + OpFunctionEnd + )"; + + spv_target_env env = SPV_ENV_UNIVERSAL_1_3; + Reducer reducer(env); + reducer.SetMessageConsumer(NopDiagnostic); + + // Say that every module is interesting. + reducer.SetInterestingnessFunction( + [](const std::vector&, uint32_t) -> bool { return true; }); + + reducer.AddReductionPass(MakeUnique(env)); + + std::vector binary_in; + SpirvTools t(env); + + ASSERT_TRUE(t.Assemble(original, &binary_in, kReduceAssembleOption)); + std::vector binary_out; + spvtools::ReducerOptions reducer_options; + reducer_options.set_step_limit(500); + + reducer.Run(std::move(binary_in), &binary_out, reducer_options); + CheckEqual(env, expected, binary_out); +} + +} // namespace +} // namespace reduce +} // namespace spvtools diff --git a/3rdparty/spirv-tools/test/stats/CMakeLists.txt b/3rdparty/spirv-tools/test/stats/CMakeLists.txt index 3e4a0742f..393cb246d 100644 --- a/3rdparty/spirv-tools/test/stats/CMakeLists.txt +++ b/3rdparty/spirv-tools/test/stats/CMakeLists.txt @@ -17,15 +17,10 @@ set(VAL_TEST_COMMON_SRCS ${CMAKE_CURRENT_SOURCE_DIR}/../unit_spirv.h ) -add_spvtools_unittest(TARGET stats_aggregate +add_spvtools_unittest(TARGET stats SRCS stats_aggregate_test.cpp + stats_analyzer_test.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../../tools/stats/spirv_stats.cpp - ${VAL_TEST_COMMON_SRCS} - LIBS ${SPIRV_TOOLS} -) - -add_spvtools_unittest(TARGET stats_analyzer - SRCS stats_analyzer_test.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../../tools/stats/stats_analyzer.cpp ${VAL_TEST_COMMON_SRCS} LIBS ${SPIRV_TOOLS} diff --git a/3rdparty/spirv-tools/test/stats/stats_aggregate_test.cpp b/3rdparty/spirv-tools/test/stats/stats_aggregate_test.cpp index 505fe2d6d..074528543 100644 --- a/3rdparty/spirv-tools/test/stats/stats_aggregate_test.cpp +++ b/3rdparty/spirv-tools/test/stats/stats_aggregate_test.cpp @@ -51,13 +51,13 @@ void DiagnosticsMessageHandler(spv_message_level_t level, const char*, // Calls AggregateStats for binary compiled from |code|. void CompileAndAggregateStats(const std::string& code, SpirvStats* stats, spv_target_env env = SPV_ENV_UNIVERSAL_1_1) { - ScopedContext ctx(env); - SetContextMessageConsumer(ctx.context, DiagnosticsMessageHandler); + spvtools::Context ctx(env); + ctx.SetMessageConsumer(DiagnosticsMessageHandler); spv_binary binary; - ASSERT_EQ(SPV_SUCCESS, spvTextToBinary(ctx.context, code.c_str(), code.size(), - &binary, nullptr)); + ASSERT_EQ(SPV_SUCCESS, spvTextToBinary(ctx.CContext(), code.c_str(), + code.size(), &binary, nullptr)); - ASSERT_EQ(SPV_SUCCESS, AggregateStats(*ctx.context, binary->code, + ASSERT_EQ(SPV_SUCCESS, AggregateStats(ctx.CContext(), binary->code, binary->wordCount, nullptr, stats)); spvBinaryDestroy(binary); } diff --git a/3rdparty/spirv-tools/test/text_to_binary.extension_test.cpp b/3rdparty/spirv-tools/test/text_to_binary.extension_test.cpp index 0d8d324b8..5c0bf9885 100644 --- a/3rdparty/spirv-tools/test/text_to_binary.extension_test.cpp +++ b/3rdparty/spirv-tools/test/text_to_binary.extension_test.cpp @@ -510,6 +510,150 @@ INSTANTIATE_TEST_CASE_P( {SpvCapabilityVariablePointersStorageBuffer})}, })), ); +// SPV_KHR_vulkan_memory_model + +INSTANTIATE_TEST_CASE_P( + SPV_KHR_vulkan_memory_model, ExtensionRoundTripTest, + // We'll get coverage over operand tables by trying the universal + // environments, and at least one specific environment. + // + // Note: SPV_KHR_vulkan_memory_model adds scope enum value QueueFamilyKHR. + // Scope enums are used in ID definitions elsewhere, that don't know they + // are using particular enums. So the assembler doesn't support assembling + // those enums names into the corresponding values. So there is no asm/dis + // tests for those enums. + Combine( + Values(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_UNIVERSAL_1_1, + SPV_ENV_UNIVERSAL_1_3, SPV_ENV_VULKAN_1_0, SPV_ENV_VULKAN_1_1), + ValuesIn(std::vector{ + {"OpCapability VulkanMemoryModelKHR\n", + MakeInstruction(SpvOpCapability, + {SpvCapabilityVulkanMemoryModelKHR})}, + {"OpCapability VulkanMemoryModelDeviceScopeKHR\n", + MakeInstruction(SpvOpCapability, + {SpvCapabilityVulkanMemoryModelDeviceScopeKHR})}, + {"OpMemoryModel Logical VulkanKHR\n", + MakeInstruction(SpvOpMemoryModel, {SpvAddressingModelLogical, + SpvMemoryModelVulkanKHR})}, + {"OpStore %1 %2 MakePointerAvailableKHR %3\n", + MakeInstruction(SpvOpStore, + {1, 2, SpvMemoryAccessMakePointerAvailableKHRMask, + 3})}, + {"OpStore %1 %2 Volatile|MakePointerAvailableKHR %3\n", + MakeInstruction(SpvOpStore, + {1, 2, + int(SpvMemoryAccessMakePointerAvailableKHRMask) | + int(SpvMemoryAccessVolatileMask), + 3})}, + {"OpStore %1 %2 Aligned|MakePointerAvailableKHR 4 %3\n", + MakeInstruction(SpvOpStore, + {1, 2, + int(SpvMemoryAccessMakePointerAvailableKHRMask) | + int(SpvMemoryAccessAlignedMask), + 4, 3})}, + {"OpStore %1 %2 MakePointerAvailableKHR|NonPrivatePointerKHR %3\n", + MakeInstruction(SpvOpStore, + {1, 2, + int(SpvMemoryAccessMakePointerAvailableKHRMask) | + int(SpvMemoryAccessNonPrivatePointerKHRMask), + 3})}, + {"%2 = OpLoad %1 %3 MakePointerVisibleKHR %4\n", + MakeInstruction(SpvOpLoad, + {1, 2, 3, SpvMemoryAccessMakePointerVisibleKHRMask, + 4})}, + {"%2 = OpLoad %1 %3 Volatile|MakePointerVisibleKHR %4\n", + MakeInstruction(SpvOpLoad, + {1, 2, 3, + int(SpvMemoryAccessMakePointerVisibleKHRMask) | + int(SpvMemoryAccessVolatileMask), + 4})}, + {"%2 = OpLoad %1 %3 Aligned|MakePointerVisibleKHR 8 %4\n", + MakeInstruction(SpvOpLoad, + {1, 2, 3, + int(SpvMemoryAccessMakePointerVisibleKHRMask) | + int(SpvMemoryAccessAlignedMask), + 8, 4})}, + {"%2 = OpLoad %1 %3 MakePointerVisibleKHR|NonPrivatePointerKHR " + "%4\n", + MakeInstruction(SpvOpLoad, + {1, 2, 3, + int(SpvMemoryAccessMakePointerVisibleKHRMask) | + int(SpvMemoryAccessNonPrivatePointerKHRMask), + 4})}, + {"OpCopyMemory %1 %2 " + "MakePointerAvailableKHR|" + "MakePointerVisibleKHR|" + "NonPrivatePointerKHR " + "%3 %4\n", + MakeInstruction(SpvOpCopyMemory, + {1, 2, + (int(SpvMemoryAccessMakePointerVisibleKHRMask) | + int(SpvMemoryAccessMakePointerAvailableKHRMask) | + int(SpvMemoryAccessNonPrivatePointerKHRMask)), + 3, 4})}, + {"OpCopyMemorySized %1 %2 %3 " + "MakePointerAvailableKHR|" + "MakePointerVisibleKHR|" + "NonPrivatePointerKHR " + "%4 %5\n", + MakeInstruction(SpvOpCopyMemorySized, + {1, 2, 3, + (int(SpvMemoryAccessMakePointerVisibleKHRMask) | + int(SpvMemoryAccessMakePointerAvailableKHRMask) | + int(SpvMemoryAccessNonPrivatePointerKHRMask)), + 4, 5})}, + // Image operands + {"OpImageWrite %1 %2 %3 MakeTexelAvailableKHR " + "%4\n", + MakeInstruction( + SpvOpImageWrite, + {1, 2, 3, int(SpvImageOperandsMakeTexelAvailableKHRMask), 4})}, + {"OpImageWrite %1 %2 %3 MakeTexelAvailableKHR|NonPrivateTexelKHR " + "%4\n", + MakeInstruction(SpvOpImageWrite, + {1, 2, 3, + int(SpvImageOperandsMakeTexelAvailableKHRMask) | + int(SpvImageOperandsNonPrivateTexelKHRMask), + 4})}, + {"OpImageWrite %1 %2 %3 " + "MakeTexelAvailableKHR|NonPrivateTexelKHR|VolatileTexelKHR " + "%4\n", + MakeInstruction(SpvOpImageWrite, + {1, 2, 3, + int(SpvImageOperandsMakeTexelAvailableKHRMask) | + int(SpvImageOperandsNonPrivateTexelKHRMask) | + int(SpvImageOperandsVolatileTexelKHRMask), + 4})}, + {"%2 = OpImageRead %1 %3 %4 MakeTexelVisibleKHR " + "%5\n", + MakeInstruction(SpvOpImageRead, + {1, 2, 3, 4, + int(SpvImageOperandsMakeTexelVisibleKHRMask), + 5})}, + {"%2 = OpImageRead %1 %3 %4 " + "MakeTexelVisibleKHR|NonPrivateTexelKHR " + "%5\n", + MakeInstruction(SpvOpImageRead, + {1, 2, 3, 4, + int(SpvImageOperandsMakeTexelVisibleKHRMask) | + int(SpvImageOperandsNonPrivateTexelKHRMask), + 5})}, + {"%2 = OpImageRead %1 %3 %4 " + "MakeTexelVisibleKHR|NonPrivateTexelKHR|VolatileTexelKHR " + "%5\n", + MakeInstruction(SpvOpImageRead, + {1, 2, 3, 4, + int(SpvImageOperandsMakeTexelVisibleKHRMask) | + int(SpvImageOperandsNonPrivateTexelKHRMask) | + int(SpvImageOperandsVolatileTexelKHRMask), + 5})}, + + // Memory semantics ID values are numbers put into a SPIR-V + // constant integer referenced by Id. There is no token for + // them, and so no assembler or disassembler support required. + // Similar for Scope ID. + })), ); + // SPV_GOOGLE_decorate_string INSTANTIATE_TEST_CASE_P( diff --git a/3rdparty/spirv-tools/test/tools/opt/CMakeLists.txt b/3rdparty/spirv-tools/test/tools/opt/CMakeLists.txt index a6dc5262d..21aa247f1 100644 --- a/3rdparty/spirv-tools/test/tools/opt/CMakeLists.txt +++ b/3rdparty/spirv-tools/test/tools/opt/CMakeLists.txt @@ -14,7 +14,7 @@ if(NOT ${SPIRV_SKIP_TESTS}) if(${PYTHONINTERP_FOUND}) - add_test(NAME spirv_opt_tests + add_test(NAME spirv_opt_cli_tools_tests COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/../spirv_test_framework.py $ $ $ diff --git a/3rdparty/spirv-tools/test/tools/opt/flags.py b/3rdparty/spirv-tools/test/tools/opt/flags.py index 628d87108..69462fcc5 100644 --- a/3rdparty/spirv-tools/test/tools/opt/flags.py +++ b/3rdparty/spirv-tools/test/tools/opt/flags.py @@ -135,6 +135,7 @@ class TestPerformanceOptimizationPasses(expect.ValidObjectFile1_3, flags = ['-O'] expected_passes = [ + 'eliminate-dead-branches', 'merge-return', 'inline-entry-points-exhaustive', 'eliminate-dead-code-aggressive', @@ -181,6 +182,7 @@ class TestSizeOptimizationPasses(expect.ValidObjectFile1_3, flags = ['-Os'] expected_passes = [ + 'eliminate-dead-branches', 'merge-return', 'inline-entry-points-exhaustive', 'eliminate-dead-code-aggressive', @@ -235,6 +237,7 @@ class TestLegalizationPasses(expect.ValidObjectFile1_3, 'eliminate-local-multi-store', 'eliminate-dead-code-aggressive', 'ccp', + 'loop-unroll', 'eliminate-dead-branches', 'simplify-instructions', 'eliminate-dead-code-aggressive', @@ -255,7 +258,7 @@ class TestScalarReplacementArgsNegative(expect.ErrorMessageSubstr): """Tests invalid arguments to --scalar-replacement.""" spirv_args = ['--scalar-replacement=-10'] - expected_error_substr = 'must have no arguments or a positive integer argument' + expected_error_substr = 'must have no arguments or a non-negative integer argument' @inside_spirv_testsuite('SpirvOptFlags') @@ -263,7 +266,7 @@ class TestScalarReplacementArgsInvalidNumber(expect.ErrorMessageSubstr): """Tests invalid arguments to --scalar-replacement.""" spirv_args = ['--scalar-replacement=a10f'] - expected_error_substr = 'must have no arguments or a positive integer argument' + expected_error_substr = 'must have no arguments or a non-negative integer argument' @inside_spirv_testsuite('SpirvOptFlags') diff --git a/3rdparty/spirv-tools/test/tools/opt/oconfig.py b/3rdparty/spirv-tools/test/tools/opt/oconfig.py index 337237994..899d93e56 100644 --- a/3rdparty/spirv-tools/test/tools/opt/oconfig.py +++ b/3rdparty/spirv-tools/test/tools/opt/oconfig.py @@ -56,3 +56,18 @@ class TestOconfigComments(expect.SuccessfulReturn): --loop-unroll """, '.cfg') spirv_args = [shader, '-o', placeholder.TempFileName('output.spv'), config] + +@inside_spirv_testsuite('SpirvOptConfigFile') +class TestOconfigComments(expect.SuccessfulReturn): + """Tests empty config files are accepted. + + https://github.com/KhronosGroup/SPIRV-Tools/issues/1778 + """ + + shader = placeholder.FileSPIRVShader(empty_main_assembly(), '.spvasm') + config = placeholder.ConfigFlagsFile(""" +# This is a comment. +-O +--relax-struct-store +""", '.cfg') + spirv_args = [shader, '-o', placeholder.TempFileName('output.spv'), config] diff --git a/3rdparty/spirv-tools/test/util/CMakeLists.txt b/3rdparty/spirv-tools/test/util/CMakeLists.txt index 66d4e8a42..8cdb35f42 100644 --- a/3rdparty/spirv-tools/test/util/CMakeLists.txt +++ b/3rdparty/spirv-tools/test/util/CMakeLists.txt @@ -12,15 +12,9 @@ # See the License for the specific language governing permissions and # limitations under the License. -add_spvtools_unittest(TARGET util_intrusive_list +add_spvtools_unittest(TARGET utils SRCS ilist_test.cpp -) - -add_spvtools_unittest(TARGET bit_vector - SRCS bit_vector_test.cpp + bit_vector_test.cpp + small_vector_test.cpp LIBS SPIRV-Tools-opt ) - -add_spvtools_unittest(TARGET small_vector - SRCS small_vector_test.cpp -) diff --git a/3rdparty/spirv-tools/test/val/CMakeLists.txt b/3rdparty/spirv-tools/test/val/CMakeLists.txt index b1e87da66..d478a7d1c 100644 --- a/3rdparty/spirv-tools/test/val/CMakeLists.txt +++ b/3rdparty/spirv-tools/test/val/CMakeLists.txt @@ -29,6 +29,7 @@ add_spvtools_unittest(TARGET val_abcde val_capability_test.cpp val_cfg_test.cpp val_composites_test.cpp + val_constants_test.cpp val_conversion_test.cpp val_data_test.cpp val_decoration_test.cpp @@ -38,6 +39,7 @@ add_spvtools_unittest(TARGET val_abcde val_ext_inst_test.cpp ${VAL_TEST_COMMON_SRCS} LIBS ${SPIRV_TOOLS} + PCH_FILE pch_test_val ) add_spvtools_unittest(TARGET val_limits @@ -54,10 +56,13 @@ add_spvtools_unittest(TARGET val_ijklmnop val_layout_test.cpp val_literals_test.cpp val_logicals_test.cpp + val_memory_test.cpp + val_modes_test.cpp val_non_uniform_test.cpp val_primitives_test.cpp ${VAL_TEST_COMMON_SRCS} LIBS ${SPIRV_TOOLS} + PCH_FILE pch_test_val ) add_spvtools_unittest(TARGET val_stuvw @@ -71,4 +76,5 @@ add_spvtools_unittest(TARGET val_stuvw val_webgpu_test.cpp ${VAL_TEST_COMMON_SRCS} LIBS ${SPIRV_TOOLS} + PCH_FILE pch_test_val ) diff --git a/3rdparty/spirv-tools/test/val/pch_test_val.cpp b/3rdparty/spirv-tools/test/val/pch_test_val.cpp new file mode 100644 index 000000000..fc92e375a --- /dev/null +++ b/3rdparty/spirv-tools/test/val/pch_test_val.cpp @@ -0,0 +1,15 @@ +// Copyright (c) 2018 The Khronos Group Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "pch_test_val.h" diff --git a/3rdparty/spirv-tools/test/val/pch_test_val.h b/3rdparty/spirv-tools/test/val/pch_test_val.h new file mode 100644 index 000000000..7b5881c43 --- /dev/null +++ b/3rdparty/spirv-tools/test/val/pch_test_val.h @@ -0,0 +1,19 @@ +// Copyright (c) 2018 The Khronos Group Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include + +#include "gmock/gmock.h" +#include "test/unit_spirv.h" +#include "test/val/val_fixtures.h" diff --git a/3rdparty/spirv-tools/test/val/val_adjacency_test.cpp b/3rdparty/spirv-tools/test/val/val_adjacency_test.cpp index d62830514..5c1124ae5 100644 --- a/3rdparty/spirv-tools/test/val/val_adjacency_test.cpp +++ b/3rdparty/spirv-tools/test/val/val_adjacency_test.cpp @@ -34,6 +34,7 @@ TEST_F(ValidateAdjacency, OpPhiBeginsModuleFail) { OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft %void = OpTypeVoid %bool = OpTypeBool %true = OpConstantTrue %bool @@ -52,7 +53,8 @@ OpFunctionEnd CompileSuccessfully(module); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); - EXPECT_THAT(getDiagnosticString(), HasSubstr("ID 1 has not been defined")); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("ID 1[%bool] has not been defined")); } TEST_F(ValidateAdjacency, OpLoopMergeEndsModuleFail) { @@ -60,6 +62,7 @@ TEST_F(ValidateAdjacency, OpLoopMergeEndsModuleFail) { OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft %void = OpTypeVoid %func = OpTypeFunction %void %main = OpFunction %void None %func @@ -80,6 +83,7 @@ TEST_F(ValidateAdjacency, OpSelectionMergeEndsModuleFail) { OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft %void = OpTypeVoid %func = OpTypeFunction %void %main = OpFunction %void None %func @@ -103,6 +107,9 @@ std::string GenerateShaderCode( ss << capabilities_and_extensions << "\n"; ss << "OpMemoryModel Logical GLSL450\n"; ss << "OpEntryPoint " << execution_model << " %main \"main\"\n"; + if (execution_model == "Fragment") { + ss << "OpExecutionMode %main OriginUpperLeft\n"; + } ss << R"( %string = OpString "" @@ -112,7 +119,9 @@ std::string GenerateShaderCode( %true = OpConstantTrue %bool %false = OpConstantFalse %bool %zero = OpConstant %int 0 +%int_1 = OpConstant %int 1 %func = OpTypeFunction %void +%func_int = OpTypePointer Function %int %main = OpFunction %void None %func %main_entry = OpLabel )"; @@ -193,7 +202,179 @@ OpNop CompileSuccessfully(GenerateShaderCode(body)); EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpPhi must appear before all non-OpPhi instructions")); + HasSubstr("OpPhi must appear within a non-entry block before all " + "non-OpPhi instructions")); +} + +TEST_F(ValidateAdjacency, OpPhiPreceededByOpLineAndBadOpFail) { + const std::string body = R"( +OpSelectionMerge %end_label None +OpBranchConditional %true %true_label %false_label +%true_label = OpLabel +OpBranch %end_label +%false_label = OpLabel +OpBranch %end_label +%end_label = OpLabel +OpNop +OpLine %string 1 1 +%result = OpPhi %bool %true %true_label %false %false_label +)"; + + CompileSuccessfully(GenerateShaderCode(body)); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("OpPhi must appear within a non-entry block before all " + "non-OpPhi instructions")); +} + +TEST_F(ValidateAdjacency, OpPhiFollowedByOpLineGood) { + const std::string body = R"( +OpSelectionMerge %end_label None +OpBranchConditional %true %true_label %false_label +%true_label = OpLabel +OpBranch %end_label +%false_label = OpLabel +OpBranch %end_label +%end_label = OpLabel +%result = OpPhi %bool %true %true_label %false %false_label +OpLine %string 1 1 +OpNop +OpNop +OpLine %string 2 1 +OpNop +OpLine %string 3 1 +)"; + + CompileSuccessfully(GenerateShaderCode(body)); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions()); +} + +TEST_F(ValidateAdjacency, OpPhiMultipleOpLineAndOpPhiFail) { + const std::string body = R"( +OpSelectionMerge %end_label None +OpBranchConditional %true %true_label %false_label +%true_label = OpLabel +OpBranch %end_label +%false_label = OpLabel +OpBranch %end_label +%end_label = OpLabel +OpLine %string 1 1 +%value = OpPhi %int %zero %true_label %int_1 %false_label +OpNop +OpLine %string 2 1 +OpNop +OpLine %string 3 1 +%result = OpPhi %bool %true %true_label %false %false_label +)"; + + CompileSuccessfully(GenerateShaderCode(body)); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("OpPhi must appear within a non-entry block before all " + "non-OpPhi instructions")); +} + +TEST_F(ValidateAdjacency, OpPhiMultipleOpLineAndOpPhiGood) { + const std::string body = R"( +OpSelectionMerge %end_label None +OpBranchConditional %true %true_label %false_label +%true_label = OpLabel +OpBranch %end_label +%false_label = OpLabel +OpBranch %end_label +%end_label = OpLabel +OpLine %string 1 1 +%value = OpPhi %int %zero %true_label %int_1 %false_label +OpLine %string 2 1 +%result = OpPhi %bool %true %true_label %false %false_label +OpLine %string 3 1 +OpNop +OpNop +OpLine %string 4 1 +OpNop +)"; + + CompileSuccessfully(GenerateShaderCode(body)); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions()); +} + +TEST_F(ValidateAdjacency, OpPhiInEntryBlockBad) { + const std::string body = R"( +OpLine %string 1 1 +%value = OpPhi %int +OpLine %string 2 1 +OpNop +OpLine %string 3 1 +OpNop +)"; + + CompileSuccessfully(GenerateShaderCode(body)); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("OpPhi must appear within a non-entry block before all " + "non-OpPhi instructions")); +} + +TEST_F(ValidateAdjacency, OpVariableInFunctionGood) { + const std::string body = R"( +OpLine %string 1 1 +%var = OpVariable %func_int Function +OpLine %string 2 1 +OpNop +OpLine %string 3 1 +OpNop +)"; + + CompileSuccessfully(GenerateShaderCode(body)); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions()); +} + +TEST_F(ValidateAdjacency, OpVariableInFunctionMultipleGood) { + const std::string body = R"( +OpLine %string 1 1 +%1 = OpVariable %func_int Function +OpLine %string 2 1 +%2 = OpVariable %func_int Function +%3 = OpVariable %func_int Function +OpNop +OpLine %string 3 1 +OpNop +)"; + + CompileSuccessfully(GenerateShaderCode(body)); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions()); +} + +TEST_F(ValidateAdjacency, OpVariableInFunctionBad) { + const std::string body = R"( +%1 = OpUndef %int +%2 = OpVariable %func_int Function +)"; + + CompileSuccessfully(GenerateShaderCode(body)); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("All OpVariable instructions in a function must be the " + "first instructions")); +} + +TEST_F(ValidateAdjacency, OpVariableInFunctionMultipleBad) { + const std::string body = R"( +OpNop +%1 = OpVariable %func_int Function +OpLine %string 1 1 +%2 = OpVariable %func_int Function +OpNop +OpNop +OpLine %string 2 1 +%3 = OpVariable %func_int Function +)"; + + CompileSuccessfully(GenerateShaderCode(body)); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("All OpVariable instructions in a function must be the " + "first instructions")); } TEST_F(ValidateAdjacency, OpLoopMergePreceedsOpBranchSuccess) { diff --git a/3rdparty/spirv-tools/test/val/val_arithmetics_test.cpp b/3rdparty/spirv-tools/test/val/val_arithmetics_test.cpp index 1c8d88be5..87e006c12 100644 --- a/3rdparty/spirv-tools/test/val/val_arithmetics_test.cpp +++ b/3rdparty/spirv-tools/test/val/val_arithmetics_test.cpp @@ -39,6 +39,7 @@ OpCapability Matrix %ext_inst = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft %void = OpTypeVoid %func = OpTypeFunction %void %bool = OpTypeBool @@ -604,10 +605,9 @@ TEST_F(ValidateArithmetics, DotNotVectorTypeOperand1) { )"; CompileSuccessfully(GenerateCode(body).c_str()); - ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); - EXPECT_THAT( - getDiagnosticString(), - HasSubstr("Expected float vector as operand: Dot operand index 2")); + ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), HasSubstr("Operand 6[%float] cannot be a " + "type")); } TEST_F(ValidateArithmetics, DotNotVectorTypeOperand2) { diff --git a/3rdparty/spirv-tools/test/val/val_atomics_test.cpp b/3rdparty/spirv-tools/test/val/val_atomics_test.cpp index 9aece39aa..03bbe82f9 100644 --- a/3rdparty/spirv-tools/test/val/val_atomics_test.cpp +++ b/3rdparty/spirv-tools/test/val/val_atomics_test.cpp @@ -28,32 +28,29 @@ using ::testing::Not; using ValidateAtomics = spvtest::ValidateBase; -std::string GenerateShaderCode( - const std::string& body, - const std::string& capabilities_and_extensions = "") { +std::string GenerateShaderCodeImpl( + const std::string& body, const std::string& capabilities_and_extensions, + const std::string& definitions, const std::string& memory_model) { std::ostringstream ss; ss << R"( OpCapability Shader -OpCapability Int64 )"; - ss << capabilities_and_extensions; + ss << "OpMemoryModel Logical " << memory_model << "\n"; ss << R"( -OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft %void = OpTypeVoid %func = OpTypeFunction %void %bool = OpTypeBool %f32 = OpTypeFloat 32 %u32 = OpTypeInt 32 0 -%u64 = OpTypeInt 64 0 %f32vec4 = OpTypeVector %f32 4 %f32_0 = OpConstant %f32 0 %f32_1 = OpConstant %f32 1 %u32_0 = OpConstant %u32 0 %u32_1 = OpConstant %u32 1 -%u64_1 = OpConstant %u64 1 %f32vec4_0000 = OpConstantComposite %f32vec4 %f32_0 %f32_0 %f32_0 %f32_0 %cross_device = OpConstant %u32 0 @@ -61,6 +58,7 @@ OpEntryPoint Fragment %main "main" %workgroup = OpConstant %u32 2 %subgroup = OpConstant %u32 3 %invocation = OpConstant %u32 4 +%queuefamily = OpConstant %u32 5 %relaxed = OpConstant %u32 0 %acquire = OpConstant %u32 2 @@ -76,20 +74,17 @@ OpEntryPoint Fragment %main "main" %u32_ptr = OpTypePointer Workgroup %u32 %u32_var = OpVariable %u32_ptr Workgroup -%u64_ptr = OpTypePointer Workgroup %u64 -%u64_var = OpVariable %u64_ptr Workgroup - %f32vec4_ptr = OpTypePointer Workgroup %f32vec4 %f32vec4_var = OpVariable %f32vec4_ptr Workgroup %f32_ptr_function = OpTypePointer Function %f32 - +)"; + ss << definitions; + ss << R"( %main = OpFunction %void None %func %main_entry = OpLabel )"; - ss << body; - ss << R"( OpReturn OpFunctionEnd)"; @@ -97,6 +92,44 @@ OpFunctionEnd)"; return ss.str(); } +std::string GenerateShaderCode( + const std::string& body, + const std::string& capabilities_and_extensions = "", + const std::string& memory_model = "GLSL450") { + const std::string defintions = R"( +%u64 = OpTypeInt 64 0 +%s64 = OpTypeInt 64 1 + +%u64_1 = OpConstant %u64 1 +%s64_1 = OpConstant %s64 1 + +%u64_ptr = OpTypePointer Workgroup %u64 +%s64_ptr = OpTypePointer Workgroup %s64 +%u64_var = OpVariable %u64_ptr Workgroup +%s64_var = OpVariable %s64_ptr Workgroup +)"; + return GenerateShaderCodeImpl( + body, "OpCapability Int64\n" + capabilities_and_extensions, defintions, + memory_model); +} + +std::string GenerateWebGPUShaderCode( + const std::string& body, + const std::string& capabilities_and_extensions = "") { + const std::string vulkan_memory_capability = R"( +OpCapability VulkanMemoryModelDeviceScopeKHR +OpCapability VulkanMemoryModelKHR +)"; + const std::string vulkan_memory_extension = R"( +OpExtension "SPV_KHR_vulkan_memory_model" +)"; + return GenerateShaderCodeImpl(body, + vulkan_memory_capability + + capabilities_and_extensions + + vulkan_memory_extension, + "", "VulkanKHR"); +} + std::string GenerateKernelCode( const std::string& body, const std::string& capabilities_and_extensions = "") { @@ -154,6 +187,8 @@ OpMemoryModel Physical32 OpenCL %f32vec4_var = OpVariable %f32vec4_ptr Workgroup %f32_ptr_function = OpTypePointer Function %f32 +%f32_ptr_uniformconstant = OpTypePointer UniformConstant %f32 +%f32_uc_var = OpVariable %f32_ptr_uniformconstant UniformConstant %main = OpFunction %void None %func %main_entry = OpLabel @@ -200,6 +235,31 @@ TEST_F(ValidateAtomics, AtomicLoadVulkanSuccess) { ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_0)); } +TEST_F(ValidateAtomics, AtomicStoreOpenCLFunctionPointerStorageTypeSuccess) { + const std::string body = R"( +%f32_var_function = OpVariable %f32_ptr_function Function +OpAtomicStore %f32_var_function %device %relaxed %f32_1 +)"; + + CompileSuccessfully(GenerateKernelCode(body), SPV_ENV_OPENCL_1_2); + ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_OPENCL_1_2)); +} + +TEST_F(ValidateAtomics, AtomicStoreVulkanFunctionPointerStorageType) { + const std::string body = R"( +%f32_var_function = OpVariable %f32_ptr_function Function +OpAtomicStore %f32_var_function %device %relaxed %f32_1 +)"; + + CompileSuccessfully(GenerateShaderCode(body), SPV_ENV_VULKAN_1_0); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("AtomicStore: expected Pointer Storage Class to be Uniform, " + "Workgroup, CrossWorkgroup, Generic, AtomicCounter, Image or " + "StorageBuffer")); +} + // TODO(atgoo@github.com): the corresponding check fails Vulkan CTS, // reenable once fixed. TEST_F(ValidateAtomics, DISABLED_AtomicLoadVulkanSubgroup) { @@ -272,9 +332,85 @@ TEST_F(ValidateAtomics, AtomicLoadVulkanInt64) { CompileSuccessfully(GenerateShaderCode(body), SPV_ENV_VULKAN_1_0); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0)); - EXPECT_THAT(getDiagnosticString(), - HasSubstr("AtomicLoad: according to the Vulkan spec atomic " - "Result Type needs to be a 32-bit int scalar type")); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr( + "AtomicLoad: 64-bit atomics require the Int64Atomics capability")); +} + +TEST_F(ValidateAtomics, AtomicLoadWebGPUShaderSuccess) { + const std::string body = R"( +%val1 = OpAtomicLoad %u32 %u32_var %device %relaxed +%val2 = OpAtomicLoad %u32 %u32_var %workgroup %acquire +)"; + + CompileSuccessfully(GenerateWebGPUShaderCode(body), SPV_ENV_WEBGPU_0); + ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_WEBGPU_0)); +} + +TEST_F(ValidateAtomics, AtomicLoadWebGPUShaderSequentiallyConsistentFailure) { + const std::string body = R"( +%val3 = OpAtomicLoad %u32 %u32_var %subgroup %sequentially_consistent +)"; + + CompileSuccessfully(GenerateWebGPUShaderCode(body), SPV_ENV_WEBGPU_0); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_WEBGPU_0)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr( + "WebGPU spec disallows any bit masks in Memory Semantics that are " + "not Acquire, Release, AcquireRelease, UniformMemory, " + "WorkgroupMemory, ImageMemory, OutputMemoryKHR, MakeAvailableKHR, or " + "MakeVisibleKHR\n %34 = OpAtomicLoad %uint %29 %uint_3 %uint_16\n")); +} + +TEST_F(ValidateAtomics, VK_KHR_shader_atomic_int64Success) { + const std::string body = R"( +%val1 = OpAtomicUMin %u64 %u64_var %device %relaxed %u64_1 +%val2 = OpAtomicUMax %u64 %u64_var %device %relaxed %u64_1 +%val3 = OpAtomicSMin %u64 %u64_var %device %relaxed %u64_1 +%val4 = OpAtomicSMax %u64 %u64_var %device %relaxed %u64_1 +%val5 = OpAtomicAnd %u64 %u64_var %device %relaxed %u64_1 +%val6 = OpAtomicOr %u64 %u64_var %device %relaxed %u64_1 +%val7 = OpAtomicXor %u64 %u64_var %device %relaxed %u64_1 +%val8 = OpAtomicIAdd %u64 %u64_var %device %relaxed %u64_1 +%val9 = OpAtomicExchange %u64 %u64_var %device %relaxed %u64_1 +%val10 = OpAtomicCompareExchange %u64 %u64_var %device %relaxed %relaxed %u64_1 %u64_1 + +%val11 = OpAtomicUMin %s64 %s64_var %device %relaxed %s64_1 +%val12 = OpAtomicUMax %s64 %s64_var %device %relaxed %s64_1 +%val13 = OpAtomicSMin %s64 %s64_var %device %relaxed %s64_1 +%val14 = OpAtomicSMax %s64 %s64_var %device %relaxed %s64_1 +%val15 = OpAtomicAnd %s64 %s64_var %device %relaxed %s64_1 +%val16 = OpAtomicOr %s64 %s64_var %device %relaxed %s64_1 +%val17 = OpAtomicXor %s64 %s64_var %device %relaxed %s64_1 +%val18 = OpAtomicIAdd %s64 %s64_var %device %relaxed %s64_1 +%val19 = OpAtomicExchange %s64 %s64_var %device %relaxed %s64_1 +%val20 = OpAtomicCompareExchange %s64 %s64_var %device %relaxed %relaxed %s64_1 %s64_1 + +%val21 = OpAtomicLoad %u64 %u64_var %device %relaxed +%val22 = OpAtomicLoad %s64 %s64_var %device %relaxed + +OpAtomicStore %u64_var %device %relaxed %u64_1 +OpAtomicStore %s64_var %device %relaxed %s64_1 +)"; + + CompileSuccessfully(GenerateShaderCode(body, "OpCapability Int64Atomics\n"), + SPV_ENV_VULKAN_1_0); + ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_0)); +} + +TEST_F(ValidateAtomics, VK_KHR_shader_atomic_int64MissingCapability) { + const std::string body = R"( +%val1 = OpAtomicUMin %u64 %u64_var %device %relaxed %u64_1 +)"; + + CompileSuccessfully(GenerateShaderCode(body), SPV_ENV_VULKAN_1_0); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr( + "AtomicUMin: 64-bit atomics require the Int64Atomics capability")); } TEST_F(ValidateAtomics, AtomicLoadWrongResultType) { @@ -295,10 +431,9 @@ TEST_F(ValidateAtomics, AtomicLoadWrongPointerType) { )"; CompileSuccessfully(GenerateKernelCode(body)); - ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); - EXPECT_THAT( - getDiagnosticString(), - HasSubstr("AtomicLoad: expected Pointer to be of type OpTypePointer")); + ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Operand 27[%_ptr_Workgroup_float] cannot be a type")); } TEST_F(ValidateAtomics, AtomicLoadWrongPointerDataType) { @@ -321,8 +456,10 @@ TEST_F(ValidateAtomics, AtomicLoadWrongScopeType) { CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); - EXPECT_THAT(getDiagnosticString(), - HasSubstr("AtomicLoad: expected Scope to be 32-bit int")); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("AtomicLoad: expected Memory Scope to be a 32-bit int\n %40 = " + "OpAtomicLoad %float %28 %float_1 %uint_0_1\n")); } TEST_F(ValidateAtomics, AtomicLoadWrongMemorySemanticsType) { @@ -334,7 +471,7 @@ TEST_F(ValidateAtomics, AtomicLoadWrongMemorySemanticsType) { ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), - HasSubstr("AtomicLoad: expected Memory Semantics to be 32-bit int")); + HasSubstr("AtomicLoad: expected Memory Semantics to be a 32-bit int")); } TEST_F(ValidateAtomics, AtomicStoreKernelSuccess) { @@ -405,6 +542,31 @@ OpAtomicStore %u32_var %device %sequentially_consistent %u32_1 "Acquire, AcquireRelease and SequentiallyConsistent")); } +TEST_F(ValidateAtomics, AtomicStoreWebGPUSuccess) { + const std::string body = R"( +OpAtomicStore %u32_var %device %release %u32_1 +)"; + + CompileSuccessfully(GenerateWebGPUShaderCode(body), SPV_ENV_WEBGPU_0); + ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_WEBGPU_0)); +} + +TEST_F(ValidateAtomics, AtomicStoreWebGPUSequentiallyConsistent) { + const std::string body = R"( +OpAtomicStore %u32_var %device %sequentially_consistent %u32_1 +)"; + + CompileSuccessfully(GenerateWebGPUShaderCode(body), SPV_ENV_WEBGPU_0); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_WEBGPU_0)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr( + "WebGPU spec disallows any bit masks in Memory Semantics that are " + "not Acquire, Release, AcquireRelease, UniformMemory, " + "WorkgroupMemory, ImageMemory, OutputMemoryKHR, MakeAvailableKHR, or " + "MakeVisibleKHR\n OpAtomicStore %29 %uint_1_0 %uint_16 %uint_1\n")); +} + TEST_F(ValidateAtomics, AtomicStoreWrongPointerType) { const std::string body = R"( OpAtomicStore %f32_1 %device %relaxed %f32_1 @@ -433,8 +595,7 @@ OpAtomicStore %f32vec4_var %device %relaxed %f32_1 TEST_F(ValidateAtomics, AtomicStoreWrongPointerStorageType) { const std::string body = R"( -%f32_var_function = OpVariable %f32_ptr_function Function -OpAtomicStore %f32_var_function %device %relaxed %f32_1 +OpAtomicStore %f32_uc_var %device %relaxed %f32_1 )"; CompileSuccessfully(GenerateKernelCode(body)); @@ -453,8 +614,10 @@ OpAtomicStore %f32_var %f32_1 %relaxed %f32_1 CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); - EXPECT_THAT(getDiagnosticString(), - HasSubstr("AtomicStore: expected Scope to be 32-bit int")); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("AtomicStore: expected Memory Scope to be a 32-bit int\n " + "OpAtomicStore %28 %float_1 %uint_0_1 %float_1\n")); } TEST_F(ValidateAtomics, AtomicStoreWrongMemorySemanticsType) { @@ -466,7 +629,7 @@ OpAtomicStore %f32_var %device %f32_1 %f32_1 ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), - HasSubstr("AtomicStore: expected Memory Semantics to be 32-bit int")); + HasSubstr("AtomicStore: expected Memory Semantics to be a 32-bit int")); } TEST_F(ValidateAtomics, AtomicStoreWrongValueType) { @@ -537,11 +700,10 @@ TEST_F(ValidateAtomics, AtomicExchangeWrongPointerType) { )"; CompileSuccessfully(GenerateKernelCode(body)); - ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); - EXPECT_THAT( - getDiagnosticString(), - HasSubstr( - "AtomicExchange: expected Pointer to be of type OpTypePointer")); + ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Operand 33[%_ptr_Workgroup_v4float] cannot be a " + "type")); } TEST_F(ValidateAtomics, AtomicExchangeWrongPointerDataType) { @@ -566,8 +728,11 @@ OpAtomicStore %f32_var %device %relaxed %f32_1 CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); - EXPECT_THAT(getDiagnosticString(), - HasSubstr("AtomicExchange: expected Scope to be 32-bit int")); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr( + "AtomicExchange: expected Memory Scope to be a 32-bit int\n %40 = " + "OpAtomicExchange %float %28 %float_1 %uint_0_1 %float_0\n")); } TEST_F(ValidateAtomics, AtomicExchangeWrongMemorySemanticsType) { @@ -580,7 +745,8 @@ OpAtomicStore %f32_var %device %relaxed %f32_1 ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), - HasSubstr("AtomicExchange: expected Memory Semantics to be 32-bit int")); + HasSubstr( + "AtomicExchange: expected Memory Semantics to be a 32-bit int")); } TEST_F(ValidateAtomics, AtomicExchangeWrongValueType) { @@ -650,10 +816,10 @@ TEST_F(ValidateAtomics, AtomicCompareExchangeWrongPointerType) { )"; CompileSuccessfully(GenerateKernelCode(body)); - ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("AtomicCompareExchange: expected Pointer to be of type " - "OpTypePointer")); + HasSubstr("Operand 33[%_ptr_Workgroup_v4float] cannot be a " + "type")); } TEST_F(ValidateAtomics, AtomicCompareExchangeWrongPointerDataType) { @@ -680,7 +846,9 @@ OpAtomicStore %f32_var %device %relaxed %f32_1 ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), - HasSubstr("AtomicCompareExchange: expected Scope to be 32-bit int")); + HasSubstr("AtomicCompareExchange: expected Memory Scope to be a 32-bit " + "int\n %40 = OpAtomicCompareExchange %float %28 %float_1 " + "%uint_0_1 %uint_0_1 %float_0 %float_0\n")); } TEST_F(ValidateAtomics, AtomicCompareExchangeWrongMemorySemanticsType1) { @@ -691,10 +859,9 @@ OpAtomicStore %f32_var %device %relaxed %f32_1 CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); - EXPECT_THAT( - getDiagnosticString(), - HasSubstr( - "AtomicCompareExchange: expected Memory Semantics to be 32-bit int")); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("AtomicCompareExchange: expected Memory Semantics to " + "be a 32-bit int")); } TEST_F(ValidateAtomics, AtomicCompareExchangeWrongMemorySemanticsType2) { @@ -705,10 +872,9 @@ OpAtomicStore %f32_var %device %relaxed %f32_1 CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); - EXPECT_THAT( - getDiagnosticString(), - HasSubstr( - "AtomicCompareExchange: expected Memory Semantics to be 32-bit int")); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("AtomicCompareExchange: expected Memory Semantics to " + "be a 32-bit int")); } TEST_F(ValidateAtomics, AtomicCompareExchangeUnequalRelease) { @@ -860,9 +1026,11 @@ TEST_F(ValidateAtomics, AtomicFlagTestAndSetWrongScopeType) { CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); - EXPECT_THAT(getDiagnosticString(), - HasSubstr("AtomicFlagTestAndSet: " - "expected Scope to be 32-bit int")); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr( + "AtomicFlagTestAndSet: expected Memory Scope to be a 32-bit int\n " + "%40 = OpAtomicFlagTestAndSet %bool %30 %ulong_1 %uint_0_1\n")); } TEST_F(ValidateAtomics, AtomicFlagTestAndSetWrongMemorySemanticsType) { @@ -874,7 +1042,7 @@ TEST_F(ValidateAtomics, AtomicFlagTestAndSetWrongMemorySemanticsType) { ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), HasSubstr("AtomicFlagTestAndSet: " - "expected Memory Semantics to be 32-bit int")); + "expected Memory Semantics to be a 32-bit int")); } TEST_F(ValidateAtomics, AtomicFlagClearAcquire) { @@ -935,7 +1103,8 @@ OpAtomicFlagClear %u32_var %u64_1 %relaxed CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("AtomicFlagClear: expected Scope to be 32-bit int")); + HasSubstr("AtomicFlagClear: expected Memory Scope to be a 32-bit " + "int\n OpAtomicFlagClear %30 %ulong_1 %uint_0_1\n")); } TEST_F(ValidateAtomics, AtomicFlagClearWrongMemorySemanticsType) { @@ -947,7 +1116,8 @@ OpAtomicFlagClear %u32_var %device %u64_1 ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), - HasSubstr("AtomicFlagClear: expected Memory Semantics to be 32-bit int")); + HasSubstr( + "AtomicFlagClear: expected Memory Semantics to be a 32-bit int")); } TEST_F(ValidateAtomics, AtomicIIncrementAcquireAndRelease) { @@ -958,11 +1128,11 @@ OpAtomicStore %u32_var %device %relaxed %u32_1 CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); - EXPECT_THAT( - getDiagnosticString(), - HasSubstr("AtomicIIncrement: no more than one of the following Memory " - "Semantics bits can be set at the same time: Acquire, Release, " - "AcquireRelease or SequentiallyConsistent")); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("AtomicIIncrement: Memory Semantics can have at most " + "one of the following bits set: Acquire, Release, " + "AcquireRelease or SequentiallyConsistent\n %40 = " + "OpAtomicIIncrement %uint %30 %uint_1_0 %uint_6\n")); } TEST_F(ValidateAtomics, AtomicUniformMemorySemanticsShader) { @@ -988,17 +1158,17 @@ OpAtomicStore %u32_var %device %relaxed %u32_1 "requires capability Shader")); } +// Lack of the AtomicStorage capability is intentionally ignored, see +// https://github.com/KhronosGroup/glslang/issues/1618 for the reasoning why. TEST_F(ValidateAtomics, AtomicCounterMemorySemanticsNoCapability) { const std::string body = R"( -OpAtomicStore %u32_var %device %relaxed %u32_1 -%val1 = OpAtomicIIncrement %u32 %u32_var %device %acquire_release_atomic_counter_workgroup + OpAtomicStore %u32_var %device %relaxed %u32_1 +%val1 = OpAtomicIIncrement %u32 %u32_var %device +%acquire_release_atomic_counter_workgroup )"; CompileSuccessfully(GenerateKernelCode(body)); - ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); - EXPECT_THAT(getDiagnosticString(), - HasSubstr("AtomicIIncrement: Memory Semantics UniformMemory " - "requires capability AtomicStorage")); + ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); } TEST_F(ValidateAtomics, AtomicCounterMemorySemanticsWithCapability) { @@ -1011,6 +1181,683 @@ OpAtomicStore %u32_var %device %relaxed %u32_1 ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); } +TEST_F(ValidateAtomics, VulkanMemoryModelBanSequentiallyConsistentAtomicLoad) { + const std::string body = R"( +%ld = OpAtomicLoad %u32 %u32_var %workgroup %sequentially_consistent +)"; + + const std::string extra = R"( +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +)"; + + CompileSuccessfully(GenerateShaderCode(body, extra, "VulkanKHR"), + SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, + ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("SequentiallyConsistent memory semantics cannot be " + "used with the VulkanKHR memory model.")); +} + +TEST_F(ValidateAtomics, VulkanMemoryModelBanSequentiallyConsistentAtomicStore) { + const std::string body = R"( +OpAtomicStore %u32_var %workgroup %sequentially_consistent %u32_0 +)"; + + const std::string extra = R"( +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +)"; + + CompileSuccessfully(GenerateShaderCode(body, extra, "VulkanKHR"), + SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, + ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("SequentiallyConsistent memory semantics cannot be " + "used with the VulkanKHR memory model.")); +} + +TEST_F(ValidateAtomics, + VulkanMemoryModelBanSequentiallyConsistentAtomicExchange) { + const std::string body = R"( +%ex = OpAtomicExchange %u32 %u32_var %workgroup %sequentially_consistent %u32_0 +)"; + + const std::string extra = R"( +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +)"; + + CompileSuccessfully(GenerateShaderCode(body, extra, "VulkanKHR"), + SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, + ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("SequentiallyConsistent memory semantics cannot be " + "used with the VulkanKHR memory model.")); +} + +TEST_F(ValidateAtomics, + VulkanMemoryModelBanSequentiallyConsistentAtomicCompareExchangeEqual) { + const std::string body = R"( +%ex = OpAtomicCompareExchange %u32 %u32_var %workgroup %sequentially_consistent %relaxed %u32_0 %u32_0 +)"; + + const std::string extra = R"( +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +)"; + + CompileSuccessfully(GenerateShaderCode(body, extra, "VulkanKHR"), + SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, + ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("SequentiallyConsistent memory semantics cannot be " + "used with the VulkanKHR memory model.")); +} + +TEST_F(ValidateAtomics, + VulkanMemoryModelBanSequentiallyConsistentAtomicCompareExchangeUnequal) { + const std::string body = R"( +%ex = OpAtomicCompareExchange %u32 %u32_var %workgroup %relaxed %sequentially_consistent %u32_0 %u32_0 +)"; + + const std::string extra = R"( +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +)"; + + CompileSuccessfully(GenerateShaderCode(body, extra, "VulkanKHR"), + SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, + ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("SequentiallyConsistent memory semantics cannot be " + "used with the VulkanKHR memory model.")); +} + +TEST_F(ValidateAtomics, + VulkanMemoryModelBanSequentiallyConsistentAtomicIIncrement) { + const std::string body = R"( +%inc = OpAtomicIIncrement %u32 %u32_var %workgroup %sequentially_consistent +)"; + + const std::string extra = R"( +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +)"; + + CompileSuccessfully(GenerateShaderCode(body, extra, "VulkanKHR"), + SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, + ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("SequentiallyConsistent memory semantics cannot be " + "used with the VulkanKHR memory model.")); +} + +TEST_F(ValidateAtomics, + VulkanMemoryModelBanSequentiallyConsistentAtomicIDecrement) { + const std::string body = R"( +%dec = OpAtomicIDecrement %u32 %u32_var %workgroup %sequentially_consistent +)"; + + const std::string extra = R"( +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +)"; + + CompileSuccessfully(GenerateShaderCode(body, extra, "VulkanKHR"), + SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, + ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("SequentiallyConsistent memory semantics cannot be " + "used with the VulkanKHR memory model.")); +} + +TEST_F(ValidateAtomics, VulkanMemoryModelBanSequentiallyConsistentAtomicIAdd) { + const std::string body = R"( +%add = OpAtomicIAdd %u32 %u32_var %workgroup %sequentially_consistent %u32_0 +)"; + + const std::string extra = R"( +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +)"; + + CompileSuccessfully(GenerateShaderCode(body, extra, "VulkanKHR"), + SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, + ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("SequentiallyConsistent memory semantics cannot be " + "used with the VulkanKHR memory model.")); +} + +TEST_F(ValidateAtomics, VulkanMemoryModelBanSequentiallyConsistentAtomicISub) { + const std::string body = R"( +%sub = OpAtomicISub %u32 %u32_var %workgroup %sequentially_consistent %u32_0 +)"; + + const std::string extra = R"( +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +)"; + + CompileSuccessfully(GenerateShaderCode(body, extra, "VulkanKHR"), + SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, + ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("SequentiallyConsistent memory semantics cannot be " + "used with the VulkanKHR memory model.")); +} + +TEST_F(ValidateAtomics, VulkanMemoryModelBanSequentiallyConsistentAtomicSMin) { + const std::string body = R"( +%min = OpAtomicSMin %u32 %u32_var %workgroup %sequentially_consistent %u32_0 +)"; + + const std::string extra = R"( +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +)"; + + CompileSuccessfully(GenerateShaderCode(body, extra, "VulkanKHR"), + SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, + ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("SequentiallyConsistent memory semantics cannot be " + "used with the VulkanKHR memory model.")); +} + +TEST_F(ValidateAtomics, VulkanMemoryModelBanSequentiallyConsistentAtomicUMin) { + const std::string body = R"( +%min = OpAtomicUMin %u32 %u32_var %workgroup %sequentially_consistent %u32_0 +)"; + + const std::string extra = R"( +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +)"; + + CompileSuccessfully(GenerateShaderCode(body, extra, "VulkanKHR"), + SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, + ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("SequentiallyConsistent memory semantics cannot be " + "used with the VulkanKHR memory model.")); +} + +TEST_F(ValidateAtomics, VulkanMemoryModelBanSequentiallyConsistentAtomicSMax) { + const std::string body = R"( +%max = OpAtomicSMax %u32 %u32_var %workgroup %sequentially_consistent %u32_0 +)"; + + const std::string extra = R"( +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +)"; + + CompileSuccessfully(GenerateShaderCode(body, extra, "VulkanKHR"), + SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, + ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("SequentiallyConsistent memory semantics cannot be " + "used with the VulkanKHR memory model.")); +} + +TEST_F(ValidateAtomics, VulkanMemoryModelBanSequentiallyConsistentAtomicUMax) { + const std::string body = R"( +%max = OpAtomicUMax %u32 %u32_var %workgroup %sequentially_consistent %u32_0 +)"; + + const std::string extra = R"( +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +)"; + + CompileSuccessfully(GenerateShaderCode(body, extra, "VulkanKHR"), + SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, + ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("SequentiallyConsistent memory semantics cannot be " + "used with the VulkanKHR memory model.")); +} + +TEST_F(ValidateAtomics, VulkanMemoryModelBanSequentiallyConsistentAtomicAnd) { + const std::string body = R"( +%and = OpAtomicAnd %u32 %u32_var %workgroup %sequentially_consistent %u32_0 +)"; + + const std::string extra = R"( +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +)"; + + CompileSuccessfully(GenerateShaderCode(body, extra, "VulkanKHR"), + SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, + ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("SequentiallyConsistent memory semantics cannot be " + "used with the VulkanKHR memory model.")); +} + +TEST_F(ValidateAtomics, VulkanMemoryModelBanSequentiallyConsistentAtomicOr) { + const std::string body = R"( +%or = OpAtomicOr %u32 %u32_var %workgroup %sequentially_consistent %u32_0 +)"; + + const std::string extra = R"( +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +)"; + + CompileSuccessfully(GenerateShaderCode(body, extra, "VulkanKHR"), + SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, + ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("SequentiallyConsistent memory semantics cannot be " + "used with the VulkanKHR memory model.")); +} + +TEST_F(ValidateAtomics, VulkanMemoryModelBanSequentiallyConsistentAtomicXor) { + const std::string body = R"( +%xor = OpAtomicXor %u32 %u32_var %workgroup %sequentially_consistent %u32_0 +)"; + + const std::string extra = R"( +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +)"; + + CompileSuccessfully(GenerateShaderCode(body, extra, "VulkanKHR"), + SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, + ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("SequentiallyConsistent memory semantics cannot be " + "used with the VulkanKHR memory model.")); +} + +TEST_F(ValidateAtomics, OutputMemoryKHRRequiresVulkanMemoryModelKHR) { + const std::string text = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %1 "func" +OpExecutionMode %1 OriginUpperLeft +%2 = OpTypeVoid +%3 = OpTypeInt 32 0 +%semantics = OpConstant %3 4100 +%5 = OpTypeFunction %2 +%workgroup = OpConstant %3 2 +%ptr = OpTypePointer Workgroup %3 +%var = OpVariable %ptr Workgroup +%1 = OpFunction %2 None %5 +%7 = OpLabel +OpAtomicStore %var %workgroup %semantics %workgroup +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(text); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("AtomicStore: Memory Semantics OutputMemoryKHR " + "requires capability VulkanMemoryModelKHR")); +} + +TEST_F(ValidateAtomics, MakeAvailableKHRRequiresVulkanMemoryModelKHR) { + const std::string text = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %1 "func" +OpExecutionMode %1 OriginUpperLeft +%2 = OpTypeVoid +%3 = OpTypeInt 32 0 +%semantics = OpConstant %3 8196 +%5 = OpTypeFunction %2 +%workgroup = OpConstant %3 2 +%ptr = OpTypePointer Workgroup %3 +%var = OpVariable %ptr Workgroup +%1 = OpFunction %2 None %5 +%7 = OpLabel +OpAtomicStore %var %workgroup %semantics %workgroup +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(text); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("AtomicStore: Memory Semantics MakeAvailableKHR " + "requires capability VulkanMemoryModelKHR")); +} + +TEST_F(ValidateAtomics, MakeVisibleKHRRequiresVulkanMemoryModelKHR) { + const std::string text = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %1 "func" +OpExecutionMode %1 OriginUpperLeft +%2 = OpTypeVoid +%3 = OpTypeInt 32 0 +%semantics = OpConstant %3 16386 +%5 = OpTypeFunction %2 +%workgroup = OpConstant %3 2 +%ptr = OpTypePointer Workgroup %3 +%var = OpVariable %ptr Workgroup +%1 = OpFunction %2 None %5 +%7 = OpLabel +%ld = OpAtomicLoad %3 %var %workgroup %semantics +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(text); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("AtomicLoad: Memory Semantics MakeVisibleKHR requires " + "capability VulkanMemoryModelKHR")); +} + +TEST_F(ValidateAtomics, MakeAvailableKHRRequiresReleaseSemantics) { + const std::string text = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +OpEntryPoint Fragment %1 "func" +OpExecutionMode %1 OriginUpperLeft +%2 = OpTypeVoid +%3 = OpTypeInt 32 0 +%semantics = OpConstant %3 8448 +%5 = OpTypeFunction %2 +%workgroup = OpConstant %3 2 +%ptr = OpTypePointer Workgroup %3 +%var = OpVariable %ptr Workgroup +%1 = OpFunction %2 None %5 +%7 = OpLabel +OpAtomicStore %var %workgroup %semantics %workgroup +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(text, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, + ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("AtomicStore: MakeAvailableKHR Memory Semantics also requires " + "either Release or AcquireRelease Memory Semantics")); +} + +TEST_F(ValidateAtomics, MakeVisibleKHRRequiresAcquireSemantics) { + const std::string text = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +OpEntryPoint Fragment %1 "func" +OpExecutionMode %1 OriginUpperLeft +%2 = OpTypeVoid +%3 = OpTypeInt 32 0 +%semantics = OpConstant %3 16640 +%5 = OpTypeFunction %2 +%workgroup = OpConstant %3 2 +%ptr = OpTypePointer Workgroup %3 +%var = OpVariable %ptr Workgroup +%1 = OpFunction %2 None %5 +%7 = OpLabel +%ld = OpAtomicLoad %3 %var %workgroup %semantics +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(text, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, + ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("AtomicLoad: MakeVisibleKHR Memory Semantics also requires " + "either Acquire or AcquireRelease Memory Semantics")); +} + +TEST_F(ValidateAtomics, MakeAvailableKHRRequiresStorageSemantics) { + const std::string text = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +OpEntryPoint Fragment %1 "func" +OpExecutionMode %1 OriginUpperLeft +%2 = OpTypeVoid +%3 = OpTypeInt 32 0 +%semantics = OpConstant %3 8196 +%5 = OpTypeFunction %2 +%workgroup = OpConstant %3 2 +%ptr = OpTypePointer Workgroup %3 +%var = OpVariable %ptr Workgroup +%1 = OpFunction %2 None %5 +%7 = OpLabel +OpAtomicStore %var %workgroup %semantics %workgroup +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(text, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, + ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr( + "AtomicStore: expected Memory Semantics to include a storage class")); +} + +TEST_F(ValidateAtomics, MakeVisibleKHRRequiresStorageSemantics) { + const std::string text = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +OpEntryPoint Fragment %1 "func" +OpExecutionMode %1 OriginUpperLeft +%2 = OpTypeVoid +%3 = OpTypeInt 32 0 +%semantics = OpConstant %3 16386 +%5 = OpTypeFunction %2 +%workgroup = OpConstant %3 2 +%ptr = OpTypePointer Workgroup %3 +%var = OpVariable %ptr Workgroup +%1 = OpFunction %2 None %5 +%7 = OpLabel +%ld = OpAtomicLoad %3 %var %workgroup %semantics +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(text, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, + ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr( + "AtomicLoad: expected Memory Semantics to include a storage class")); +} + +TEST_F(ValidateAtomics, VulkanMemoryModelAllowsQueueFamilyKHR) { + const std::string body = R"( +%val = OpAtomicAnd %u32 %u32_var %queuefamily %relaxed %u32_1 +)"; + + const std::string extra = R"( +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +)"; + + CompileSuccessfully(GenerateShaderCode(body, extra, "VulkanKHR"), + SPV_ENV_VULKAN_1_1); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_1)); +} + +TEST_F(ValidateAtomics, NonVulkanMemoryModelDisallowsQueueFamilyKHR) { + const std::string body = R"( +%val = OpAtomicAnd %u32 %u32_var %queuefamily %relaxed %u32_1 +)"; + + CompileSuccessfully(GenerateShaderCode(body), SPV_ENV_VULKAN_1_1); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_1)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("AtomicAnd: Memory Scope QueueFamilyKHR requires " + "capability VulkanMemoryModelKHR\n %42 = OpAtomicAnd " + "%uint %29 %uint_5 %uint_0_1 %uint_1\n")); +} + +TEST_F(ValidateAtomics, SemanticsSpecConstantShader) { + const std::string spirv = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%spec_const = OpSpecConstant %int 0 +%workgroup = OpConstant %int 2 +%ptr_int_workgroup = OpTypePointer Workgroup %int +%var = OpVariable %ptr_int_workgroup Workgroup +%voidfn = OpTypeFunction %void +%func = OpFunction %void None %voidfn +%entry = OpLabel +%ld = OpAtomicLoad %int %var %workgroup %spec_const +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Memory Semantics ids must be OpConstant when Shader " + "capability is present")); +} + +TEST_F(ValidateAtomics, SemanticsSpecConstantKernel) { + const std::string spirv = R"( +OpCapability Kernel +OpCapability Linkage +OpMemoryModel Logical OpenCL +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%spec_const = OpSpecConstant %int 0 +%workgroup = OpConstant %int 2 +%ptr_int_workgroup = OpTypePointer Workgroup %int +%var = OpVariable %ptr_int_workgroup Workgroup +%voidfn = OpTypeFunction %void +%func = OpFunction %void None %voidfn +%entry = OpLabel +%ld = OpAtomicLoad %int %var %workgroup %spec_const +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions()); +} + +TEST_F(ValidateAtomics, ScopeSpecConstantShader) { + const std::string spirv = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%spec_const = OpSpecConstant %int 0 +%relaxed = OpConstant %int 0 +%ptr_int_workgroup = OpTypePointer Workgroup %int +%var = OpVariable %ptr_int_workgroup Workgroup +%voidfn = OpTypeFunction %void +%func = OpFunction %void None %voidfn +%entry = OpLabel +%ld = OpAtomicLoad %int %var %spec_const %relaxed +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr( + "Scope ids must be OpConstant when Shader capability is present")); +} + +TEST_F(ValidateAtomics, ScopeSpecConstantKernel) { + const std::string spirv = R"( +OpCapability Kernel +OpCapability Linkage +OpMemoryModel Logical OpenCL +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%spec_const = OpSpecConstant %int 0 +%relaxed = OpConstant %int 0 +%ptr_int_workgroup = OpTypePointer Workgroup %int +%var = OpVariable %ptr_int_workgroup Workgroup +%voidfn = OpTypeFunction %void +%func = OpFunction %void None %voidfn +%entry = OpLabel +%ld = OpAtomicLoad %int %var %spec_const %relaxed +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions()); +} + +TEST_F(ValidateAtomics, VulkanMemoryModelDeviceScopeBad) { + const std::string body = R"( +%val = OpAtomicAnd %u32 %u32_var %device %relaxed %u32_1 +)"; + + const std::string extra = R"(OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +)"; + + CompileSuccessfully(GenerateShaderCode(body, extra, "VulkanKHR"), + SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, + ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("Use of device scope with VulkanKHR memory model requires the " + "VulkanMemoryModelDeviceScopeKHR capability")); +} + +TEST_F(ValidateAtomics, VulkanMemoryModelDeviceScopeGood) { + const std::string body = R"( +%val = OpAtomicAnd %u32 %u32_var %device %relaxed %u32_1 +)"; + + const std::string extra = R"(OpCapability VulkanMemoryModelKHR +OpCapability VulkanMemoryModelDeviceScopeKHR +OpExtension "SPV_KHR_vulkan_memory_model" +)"; + + CompileSuccessfully(GenerateShaderCode(body, extra, "VulkanKHR"), + SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); +} + } // namespace } // namespace val } // namespace spvtools diff --git a/3rdparty/spirv-tools/test/val/val_barriers_test.cpp b/3rdparty/spirv-tools/test/val/val_barriers_test.cpp index 38c168eda..264d130bd 100644 --- a/3rdparty/spirv-tools/test/val/val_barriers_test.cpp +++ b/3rdparty/spirv-tools/test/val/val_barriers_test.cpp @@ -28,19 +28,26 @@ using ::testing::Not; using ValidateBarriers = spvtest::ValidateBase; -std::string GenerateShaderCode( - const std::string& body, - const std::string& capabilities_and_extensions = "", - const std::string& execution_model = "GLCompute") { +std::string GenerateShaderCodeImpl( + const std::string& body, const std::string& capabilities_and_extensions, + const std::string& definitions, const std::string& execution_model, + const std::string& memory_model) { std::ostringstream ss; ss << R"( OpCapability Shader -OpCapability Int64 )"; ss << capabilities_and_extensions; - ss << "OpMemoryModel Logical GLSL450\n"; + ss << memory_model << std::endl; ss << "OpEntryPoint " << execution_model << " %main \"main\"\n"; + if (execution_model == "Fragment") { + ss << "OpExecutionMode %main OriginUpperLeft\n"; + } else if (execution_model == "Geometry") { + ss << "OpExecutionMode %main InputPoints\n"; + ss << "OpExecutionMode %main OutputPoints\n"; + } else if (execution_model == "GLCompute") { + ss << "OpExecutionMode %main LocalSize 1 1 1\n"; + } ss << R"( %void = OpTypeVoid @@ -48,21 +55,21 @@ OpCapability Int64 %bool = OpTypeBool %f32 = OpTypeFloat 32 %u32 = OpTypeInt 32 0 -%u64 = OpTypeInt 64 0 %f32_0 = OpConstant %f32 0 %f32_1 = OpConstant %f32 1 %u32_0 = OpConstant %u32 0 %u32_1 = OpConstant %u32 1 %u32_4 = OpConstant %u32 4 -%u64_0 = OpConstant %u64 0 -%u64_1 = OpConstant %u64 1 - +)"; + ss << definitions; + ss << R"( %cross_device = OpConstant %u32 0 %device = OpConstant %u32 1 %workgroup = OpConstant %u32 2 %subgroup = OpConstant %u32 3 %invocation = OpConstant %u32 4 +%queuefamily = OpConstant %u32 5 %none = OpConstant %u32 0 %acquire = OpConstant %u32 2 @@ -88,6 +95,42 @@ OpFunctionEnd)"; return ss.str(); } +std::string GenerateShaderCode( + const std::string& body, + const std::string& capabilities_and_extensions = "", + const std::string& execution_model = "GLCompute") { + const std::string int64_capability = R"( +OpCapability Int64 +)"; + const std::string int64_declarations = R"( +%u64 = OpTypeInt 64 0 +%u64_0 = OpConstant %u64 0 +%u64_1 = OpConstant %u64 1 +)"; + const std::string memory_model = "OpMemoryModel Logical GLSL450"; + return GenerateShaderCodeImpl( + body, int64_capability + capabilities_and_extensions, int64_declarations, + execution_model, memory_model); +} + +std::string GenerateWebGPUShaderCode( + const std::string& body, + const std::string& capabilities_and_extensions = "", + const std::string& execution_model = "GLCompute") { + const std::string vulkan_memory_capability = R"( +OpCapability VulkanMemoryModelKHR +)"; + const std::string vulkan_memory_extension = R"( +OpExtension "SPV_KHR_vulkan_memory_model" +)"; + const std::string memory_model = "OpMemoryModel Logical VulkanKHR"; + return GenerateShaderCodeImpl(body, + vulkan_memory_capability + + capabilities_and_extensions + + vulkan_memory_extension, + "", execution_model, memory_model); +} + std::string GenerateKernelCode( const std::string& body, const std::string& capabilities_and_extensions = "") { @@ -132,9 +175,7 @@ OpMemoryModel Physical32 OpenCL %acquire_release = OpConstant %u32 8 %acquire_and_release = OpConstant %u32 6 %sequentially_consistent = OpConstant %u32 16 -%acquire_release_uniform_workgroup = OpConstant %u32 328 -%acquire_and_release_uniform = OpConstant %u32 70 -%uniform = OpConstant %u32 64 +%acquire_release_workgroup = OpConstant %u32 264 %named_barrier = OpTypeNamedBarrier @@ -172,7 +213,7 @@ OpControlBarrier %workgroup %workgroup %acquire OpControlBarrier %workgroup %device %release OpControlBarrier %cross_device %cross_device %acquire_release OpControlBarrier %cross_device %cross_device %sequentially_consistent -OpControlBarrier %cross_device %cross_device %acquire_release_uniform_workgroup +OpControlBarrier %cross_device %cross_device %acquire_release_workgroup )"; CompileSuccessfully(GenerateKernelCode(body), SPV_ENV_UNIVERSAL_1_1); @@ -204,6 +245,16 @@ OpControlBarrier %workgroup %workgroup %acquire_release_uniform_workgroup ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_0)); } +TEST_F(ValidateBarriers, OpControlBarrierWebGPUSuccess) { + const std::string body = R"( +OpControlBarrier %workgroup %queuefamily %none +OpControlBarrier %workgroup %workgroup %acquire_release_uniform_workgroup +)"; + + CompileSuccessfully(GenerateWebGPUShaderCode(body), SPV_ENV_WEBGPU_0); + ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_WEBGPU_0)); +} + TEST_F(ValidateBarriers, OpControlBarrierExecutionModelFragmentSpirv12) { const std::string body = R"( OpControlBarrier %device %device %none @@ -314,6 +365,18 @@ OpControlBarrier %device %workgroup %none "is limited to Workgroup and Subgroup")); } +TEST_F(ValidateBarriers, OpControlBarrierWebGPUExecutionScopeDevice) { + const std::string body = R"( +OpControlBarrier %device %workgroup %none +)"; + + CompileSuccessfully(GenerateWebGPUShaderCode(body), SPV_ENV_WEBGPU_0); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_WEBGPU_0)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("ControlBarrier: in WebGPU environment Execution Scope " + "is limited to Workgroup and Subgroup")); +} + TEST_F(ValidateBarriers, OpControlBarrierVulkanMemoryScopeSubgroup) { const std::string body = R"( OpControlBarrier %subgroup %subgroup %none @@ -550,8 +613,8 @@ OpMemoryBarrier %device %uniform TEST_F(ValidateBarriers, OpMemoryBarrierKernelSuccess) { const std::string body = R"( -OpMemoryBarrier %cross_device %acquire_release_uniform_workgroup -OpMemoryBarrier %device %uniform +OpMemoryBarrier %cross_device %acquire_release_workgroup +OpMemoryBarrier %device %none )"; CompileSuccessfully(GenerateKernelCode(body), SPV_ENV_UNIVERSAL_1_1); @@ -739,7 +802,7 @@ TEST_F(ValidateBarriers, OpNamedBarrierInitializeU64SubgroupCount) { TEST_F(ValidateBarriers, OpMemoryNamedBarrierSuccess) { const std::string body = R"( %barrier = OpNamedBarrierInitialize %named_barrier %u32_4 -OpMemoryNamedBarrier %barrier %workgroup %acquire_release_uniform_workgroup +OpMemoryNamedBarrier %barrier %workgroup %acquire_release_workgroup )"; CompileSuccessfully(GenerateKernelCode(body), SPV_ENV_UNIVERSAL_1_1); @@ -748,7 +811,7 @@ OpMemoryNamedBarrier %barrier %workgroup %acquire_release_uniform_workgroup TEST_F(ValidateBarriers, OpMemoryNamedBarrierNotNamedBarrier) { const std::string body = R"( -OpMemoryNamedBarrier %u32_1 %workgroup %acquire_release_uniform_workgroup +OpMemoryNamedBarrier %u32_1 %workgroup %acquire_release_workgroup )"; CompileSuccessfully(GenerateKernelCode(body), SPV_ENV_UNIVERSAL_1_1); @@ -762,7 +825,7 @@ OpMemoryNamedBarrier %u32_1 %workgroup %acquire_release_uniform_workgroup TEST_F(ValidateBarriers, OpMemoryNamedBarrierFloatMemoryScope) { const std::string body = R"( %barrier = OpNamedBarrierInitialize %named_barrier %u32_4 -OpMemoryNamedBarrier %barrier %f32_1 %acquire_release_uniform_workgroup +OpMemoryNamedBarrier %barrier %f32_1 %acquire_release_workgroup )"; CompileSuccessfully(GenerateKernelCode(body), SPV_ENV_UNIVERSAL_1_1); @@ -792,7 +855,7 @@ OpMemoryNamedBarrier %barrier %workgroup %f32_0 TEST_F(ValidateBarriers, OpMemoryNamedBarrierAcquireAndRelease) { const std::string body = R"( %barrier = OpNamedBarrierInitialize %named_barrier %u32_4 -OpMemoryNamedBarrier %barrier %workgroup %acquire_and_release_uniform +OpMemoryNamedBarrier %barrier %workgroup %acquire_and_release )"; CompileSuccessfully(GenerateKernelCode(body), SPV_ENV_UNIVERSAL_1_1); @@ -810,10 +873,410 @@ OpMemoryBarrier %u32 %u32_0 )"; CompileSuccessfully(GenerateKernelCode(body)); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), HasSubstr("Operand 5[%uint] cannot be a " + "type")); +} + +TEST_F(ValidateBarriers, + OpControlBarrierVulkanMemoryModelBanSequentiallyConsistent) { + const std::string text = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +OpEntryPoint Fragment %1 "func" +OpExecutionMode %1 OriginUpperLeft +%2 = OpTypeVoid +%3 = OpTypeInt 32 0 +%4 = OpConstant %3 16 +%5 = OpTypeFunction %2 +%6 = OpConstant %3 5 +%1 = OpFunction %2 None %5 +%7 = OpLabel +OpControlBarrier %6 %6 %4 +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(text, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, + ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("SequentiallyConsistent memory semantics cannot be " + "used with the VulkanKHR memory model.")); +} + +TEST_F(ValidateBarriers, + OpMemoryBarrierVulkanMemoryModelBanSequentiallyConsistent) { + const std::string text = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +OpEntryPoint Fragment %1 "func" +OpExecutionMode %1 OriginUpperLeft +%2 = OpTypeVoid +%3 = OpTypeInt 32 0 +%4 = OpConstant %3 16 +%5 = OpTypeFunction %2 +%6 = OpConstant %3 5 +%1 = OpFunction %2 None %5 +%7 = OpLabel +OpMemoryBarrier %6 %4 +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(text, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, + ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("SequentiallyConsistent memory semantics cannot be " + "used with the VulkanKHR memory model.")); +} + +TEST_F(ValidateBarriers, OutputMemoryKHRRequireVulkanMemoryModelKHR) { + const std::string text = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %1 "func" +OpExecutionMode %1 OriginUpperLeft +%2 = OpTypeVoid +%3 = OpTypeInt 32 0 +%semantics = OpConstant %3 4104 +%5 = OpTypeFunction %2 +%device = OpConstant %3 1 +%1 = OpFunction %2 None %5 +%7 = OpLabel +OpControlBarrier %device %device %semantics +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(text); EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("ControlBarrier: Memory Semantics OutputMemoryKHR " + "requires capability VulkanMemoryModelKHR")); +} + +TEST_F(ValidateBarriers, MakeAvailableKHRRequireVulkanMemoryModelKHR) { + const std::string text = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %1 "func" +OpExecutionMode %1 OriginUpperLeft +%2 = OpTypeVoid +%3 = OpTypeInt 32 0 +%semantics = OpConstant %3 8264 +%5 = OpTypeFunction %2 +%device = OpConstant %3 1 +%1 = OpFunction %2 None %5 +%7 = OpLabel +OpControlBarrier %device %device %semantics +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(text); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("ControlBarrier: Memory Semantics MakeAvailableKHR " + "requires capability VulkanMemoryModelKHR")); +} + +TEST_F(ValidateBarriers, MakeVisibleKHRRequireVulkanMemoryModelKHR) { + const std::string text = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %1 "func" +OpExecutionMode %1 OriginUpperLeft +%2 = OpTypeVoid +%3 = OpTypeInt 32 0 +%semantics = OpConstant %3 16456 +%5 = OpTypeFunction %2 +%device = OpConstant %3 1 +%1 = OpFunction %2 None %5 +%7 = OpLabel +OpControlBarrier %device %device %semantics +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(text); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("ControlBarrier: Memory Semantics MakeVisibleKHR " + "requires capability VulkanMemoryModelKHR")); +} + +TEST_F(ValidateBarriers, MakeAvailableKHRRequiresReleaseSemantics) { + const std::string text = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%workgroup = OpConstant %int 2 +%semantics = OpConstant %int 8448 +%functy = OpTypeFunction %void +%func = OpFunction %void None %functy +%1 = OpLabel +OpControlBarrier %workgroup %workgroup %semantics +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(text, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, + ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); EXPECT_THAT( getDiagnosticString(), - HasSubstr("MemoryBarrier: expected Memory Scope to be a 32-bit int")); + HasSubstr("ControlBarrier: MakeAvailableKHR Memory Semantics also " + "requires either Release or AcquireRelease Memory Semantics")); +} + +TEST_F(ValidateBarriers, MakeVisibleKHRRequiresAcquireSemantics) { + const std::string text = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%workgroup = OpConstant %int 2 +%semantics = OpConstant %int 16640 +%functy = OpTypeFunction %void +%func = OpFunction %void None %functy +%1 = OpLabel +OpControlBarrier %workgroup %workgroup %semantics +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(text, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, + ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("ControlBarrier: MakeVisibleKHR Memory Semantics also requires " + "either Acquire or AcquireRelease Memory Semantics")); +} + +TEST_F(ValidateBarriers, MakeAvailableKHRRequiresStorageSemantics) { + const std::string text = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%workgroup = OpConstant %int 2 +%semantics = OpConstant %int 8196 +%functy = OpTypeFunction %void +%func = OpFunction %void None %functy +%1 = OpLabel +OpMemoryBarrier %workgroup %semantics +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(text, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, + ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("MemoryBarrier: expected Memory Semantics to include a " + "storage class")); +} + +TEST_F(ValidateBarriers, MakeVisibleKHRRequiresStorageSemantics) { + const std::string text = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%workgroup = OpConstant %int 2 +%semantics = OpConstant %int 16386 +%functy = OpTypeFunction %void +%func = OpFunction %void None %functy +%1 = OpLabel +OpMemoryBarrier %workgroup %semantics +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(text, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, + ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("MemoryBarrier: expected Memory Semantics to include a " + "storage class")); +} + +TEST_F(ValidateBarriers, SemanticsSpecConstantShader) { + const std::string spirv = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%ptr_int_workgroup = OpTypePointer Workgroup %int +%var = OpVariable %ptr_int_workgroup Workgroup +%voidfn = OpTypeFunction %void +%spec_const = OpSpecConstant %int 0 +%workgroup = OpConstant %int 2 +%func = OpFunction %void None %voidfn +%entry = OpLabel +OpMemoryBarrier %workgroup %spec_const +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Memory Semantics ids must be OpConstant when Shader " + "capability is present")); +} + +TEST_F(ValidateBarriers, SemanticsSpecConstantKernel) { + const std::string spirv = R"( +OpCapability Kernel +OpCapability Linkage +OpMemoryModel Logical OpenCL +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%ptr_int_workgroup = OpTypePointer Workgroup %int +%var = OpVariable %ptr_int_workgroup Workgroup +%voidfn = OpTypeFunction %void +%spec_const = OpSpecConstant %int 0 +%workgroup = OpConstant %int 2 +%func = OpFunction %void None %voidfn +%entry = OpLabel +OpMemoryBarrier %workgroup %spec_const +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions()); +} + +TEST_F(ValidateBarriers, ScopeSpecConstantShader) { + const std::string spirv = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%ptr_int_workgroup = OpTypePointer Workgroup %int +%var = OpVariable %ptr_int_workgroup Workgroup +%voidfn = OpTypeFunction %void +%spec_const = OpSpecConstant %int 0 +%relaxed = OpConstant %int 0 +%func = OpFunction %void None %voidfn +%entry = OpLabel +OpMemoryBarrier %spec_const %relaxed +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Scope ids must be OpConstant when Shader " + "capability is present")); +} + +TEST_F(ValidateBarriers, ScopeSpecConstantKernel) { + const std::string spirv = R"( +OpCapability Kernel +OpCapability Linkage +OpMemoryModel Logical OpenCL +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%ptr_int_workgroup = OpTypePointer Workgroup %int +%var = OpVariable %ptr_int_workgroup Workgroup +%voidfn = OpTypeFunction %void +%spec_const = OpSpecConstant %int 0 +%relaxed = OpConstant %int 0 +%func = OpFunction %void None %voidfn +%entry = OpLabel +OpMemoryBarrier %spec_const %relaxed +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions()); +} + +TEST_F(ValidateBarriers, VulkanMemoryModelDeviceScopeBad) { + const std::string text = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%device = OpConstant %int 1 +%semantics = OpConstant %int 0 +%functy = OpTypeFunction %void +%func = OpFunction %void None %functy +%1 = OpLabel +OpMemoryBarrier %device %semantics +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(text, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, + ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("Use of device scope with VulkanKHR memory model requires the " + "VulkanMemoryModelDeviceScopeKHR capability")); +} + +TEST_F(ValidateBarriers, VulkanMemoryModelDeviceScopeGood) { + const std::string text = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpCapability VulkanMemoryModelDeviceScopeKHR +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%device = OpConstant %int 1 +%semantics = OpConstant %int 0 +%functy = OpTypeFunction %void +%func = OpFunction %void None %functy +%1 = OpLabel +OpMemoryBarrier %device %semantics +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(text, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); } } // namespace diff --git a/3rdparty/spirv-tools/test/val/val_bitwise_test.cpp b/3rdparty/spirv-tools/test/val/val_bitwise_test.cpp index 18ccd4f8e..1001def8f 100644 --- a/3rdparty/spirv-tools/test/val/val_bitwise_test.cpp +++ b/3rdparty/spirv-tools/test/val/val_bitwise_test.cpp @@ -42,6 +42,7 @@ OpCapability Float64)"; R"( OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft %void = OpTypeVoid %func = OpTypeFunction %void %bool = OpTypeBool diff --git a/3rdparty/spirv-tools/test/val/val_builtins_test.cpp b/3rdparty/spirv-tools/test/val/val_builtins_test.cpp index 0c8909cec..ec0758275 100644 --- a/3rdparty/spirv-tools/test/val/val_builtins_test.cpp +++ b/3rdparty/spirv-tools/test/val/val_builtins_test.cpp @@ -243,10 +243,20 @@ TEST_P(ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, InMain) { if (0 == std::strcmp(execution_model, "Fragment")) { execution_modes << "OpExecutionMode %" << entry_point.name << " OriginUpperLeft\n"; + if (0 == std::strcmp(built_in, "FragDepth")) { + execution_modes << "OpExecutionMode %" << entry_point.name + << " DepthReplacing\n"; + } } - if (0 == std::strcmp(built_in, "FragDepth")) { + if (0 == std::strcmp(execution_model, "Geometry")) { execution_modes << "OpExecutionMode %" << entry_point.name - << " DepthReplacing\n"; + << " InputPoints\n"; + execution_modes << "OpExecutionMode %" << entry_point.name + << " OutputPoints\n"; + } + if (0 == std::strcmp(execution_model, "GLCompute")) { + execution_modes << "OpExecutionMode %" << entry_point.name + << " LocalSize 1 1 1\n"; } entry_point.execution_modes = execution_modes.str(); @@ -300,10 +310,20 @@ TEST_P(ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, InFunction) { if (0 == std::strcmp(execution_model, "Fragment")) { execution_modes << "OpExecutionMode %" << entry_point.name << " OriginUpperLeft\n"; + if (0 == std::strcmp(built_in, "FragDepth")) { + execution_modes << "OpExecutionMode %" << entry_point.name + << " DepthReplacing\n"; + } } - if (0 == std::strcmp(built_in, "FragDepth")) { + if (0 == std::strcmp(execution_model, "Geometry")) { execution_modes << "OpExecutionMode %" << entry_point.name - << " DepthReplacing\n"; + << " InputPoints\n"; + execution_modes << "OpExecutionMode %" << entry_point.name + << " OutputPoints\n"; + } + if (0 == std::strcmp(execution_model, "GLCompute")) { + execution_modes << "OpExecutionMode %" << entry_point.name + << " LocalSize 1 1 1\n"; } entry_point.execution_modes = execution_modes.str(); @@ -366,10 +386,20 @@ TEST_P(ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, Variable) { if (0 == std::strcmp(execution_model, "Fragment")) { execution_modes << "OpExecutionMode %" << entry_point.name << " OriginUpperLeft\n"; + if (0 == std::strcmp(built_in, "FragDepth")) { + execution_modes << "OpExecutionMode %" << entry_point.name + << " DepthReplacing\n"; + } } - if (0 == std::strcmp(built_in, "FragDepth")) { + if (0 == std::strcmp(execution_model, "Geometry")) { execution_modes << "OpExecutionMode %" << entry_point.name - << " DepthReplacing\n"; + << " InputPoints\n"; + execution_modes << "OpExecutionMode %" << entry_point.name + << " OutputPoints\n"; + } + if (0 == std::strcmp(execution_model, "GLCompute")) { + execution_modes << "OpExecutionMode %" << entry_point.name + << " LocalSize 1 1 1\n"; } entry_point.execution_modes = execution_modes.str(); @@ -416,6 +446,16 @@ INSTANTIATE_TEST_CASE_P( "execution model is Fragment.", "which is called with execution model Fragment."))), ); +INSTANTIATE_TEST_CASE_P( + VertexIdAndInstanceIdVertexInput, + ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, + Combine(Values("VertexId", "InstanceId"), Values("Vertex"), Values("Input"), + Values("%u32"), + Values(TestResult( + SPV_ERROR_INVALID_DATA, + "Vulkan spec doesn't allow BuiltIn VertexId/InstanceId to be " + "used."))), ); + INSTANTIATE_TEST_CASE_P( ClipAndCullDistanceVertexInput, ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, @@ -1163,7 +1203,7 @@ INSTANTIATE_TEST_CASE_P( INSTANTIATE_TEST_CASE_P( SampleMaskWrongStorageClass, ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, - Combine(Values("SampleMask"), Values("Fragment"), Values("UniformConstant"), + Combine(Values("SampleMask"), Values("Fragment"), Values("Workgroup"), Values("%u32arr2"), Values(TestResult( SPV_ERROR_INVALID_DATA, @@ -1542,10 +1582,20 @@ TEST_P(ValidateVulkanCombineBuiltInArrayedVariable, Variable) { if (0 == std::strcmp(execution_model, "Fragment")) { execution_modes << "OpExecutionMode %" << entry_point.name << " OriginUpperLeft\n"; + if (0 == std::strcmp(built_in, "FragDepth")) { + execution_modes << "OpExecutionMode %" << entry_point.name + << " DepthReplacing\n"; + } } - if (0 == std::strcmp(built_in, "FragDepth")) { + if (0 == std::strcmp(execution_model, "Geometry")) { execution_modes << "OpExecutionMode %" << entry_point.name - << " DepthReplacing\n"; + << " InputPoints\n"; + execution_modes << "OpExecutionMode %" << entry_point.name + << " OutputPoints\n"; + } + if (0 == std::strcmp(execution_model, "GLCompute")) { + execution_modes << "OpExecutionMode %" << entry_point.name + << " LocalSize 1 1 1\n"; } entry_point.execution_modes = execution_modes.str(); @@ -1869,11 +1919,44 @@ OpMemberDecorate %output_type 0 BuiltIn Position OpStore %output_pos %pos )"; generator.entry_points_.push_back(std::move(entry_point)); + generator.entry_points_[0].execution_modes = + "OpExecutionMode %main InputPoints\nOpExecutionMode %main OutputPoints\n"; CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0); ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_0)); } +TEST_F(ValidateBuiltIns, WorkgroupIdNotVec3) { + CodeGenerator generator = GetDefaultShaderCodeGenerator(); + generator.before_types_ = R"( +OpDecorate %workgroup_size BuiltIn WorkgroupSize +OpDecorate %workgroup_id BuiltIn WorkgroupId +)"; + + generator.after_types_ = R"( +%workgroup_size = OpConstantComposite %u32vec3 %u32_1 %u32_1 %u32_1 + %input_ptr = OpTypePointer Input %u32vec2 + %workgroup_id = OpVariable %input_ptr Input +)"; + + EntryPoint entry_point; + entry_point.name = "main"; + entry_point.execution_model = "GLCompute"; + entry_point.interfaces = "%workgroup_id"; + entry_point.body = R"( +%copy_size = OpCopyObject %u32vec3 %workgroup_size + %load_id = OpLoad %u32vec2 %workgroup_id +)"; + generator.entry_points_.push_back(std::move(entry_point)); + + CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("According to the Vulkan spec BuiltIn WorkgroupId " + "variable needs to be a 3-component 32-bit int vector. " + "ID <2> (OpVariable) has 2 components.")); +} + TEST_F(ValidateBuiltIns, TwoBuiltInsFirstFails) { CodeGenerator generator = GetDefaultShaderCodeGenerator(); @@ -1904,6 +1987,8 @@ OpMemberDecorate %output_type 0 BuiltIn Position OpStore %output_pos %pos )"; generator.entry_points_.push_back(std::move(entry_point)); + generator.entry_points_[0].execution_modes = + "OpExecutionMode %main InputPoints\nOpExecutionMode %main OutputPoints\n"; CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0)); @@ -1942,6 +2027,8 @@ OpMemberDecorate %output_type 0 BuiltIn FragCoord OpStore %output_pos %pos )"; generator.entry_points_.push_back(std::move(entry_point)); + generator.entry_points_[0].execution_modes = + "OpExecutionMode %main InputPoints\nOpExecutionMode %main OutputPoints\n"; CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0)); @@ -2113,6 +2200,84 @@ OpFunctionEnd "be declared when using BuiltIn FragDepth")); } +TEST_F(ValidateBuiltIns, AllowInstanceIdWithIntersectionShader) { + CodeGenerator generator = GetDefaultShaderCodeGenerator(); + generator.capabilities_ += R"( +OpCapability RayTracingNV +)"; + + generator.extensions_ = R"( +OpExtension "SPV_NV_ray_tracing" +)"; + + generator.before_types_ = R"( +OpMemberDecorate %input_type 0 BuiltIn InstanceId +)"; + + generator.after_types_ = R"( +%input_type = OpTypeStruct %u32 +%input_ptr = OpTypePointer Input %input_type +%input = OpVariable %input_ptr Input +)"; + + EntryPoint entry_point; + entry_point.name = "main_d_r"; + entry_point.execution_model = "IntersectionNV"; + entry_point.interfaces = "%input"; + entry_point.body = R"( +%val2 = OpFunctionCall %void %foo +)"; + generator.entry_points_.push_back(std::move(entry_point)); + + generator.add_at_the_end_ = R"( +%foo = OpFunction %void None %func +%foo_entry = OpLabel +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0); + EXPECT_THAT(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_0)); +} + +TEST_F(ValidateBuiltIns, DisallowInstanceIdWithRayGenShader) { + CodeGenerator generator = GetDefaultShaderCodeGenerator(); + generator.capabilities_ += R"( +OpCapability RayTracingNV +)"; + + generator.extensions_ = R"( +OpExtension "SPV_NV_ray_tracing" +)"; + + generator.before_types_ = R"( +OpMemberDecorate %input_type 0 BuiltIn InstanceId +)"; + + generator.after_types_ = R"( +%input_type = OpTypeStruct %u32 +%input_ptr = OpTypePointer Input %input_type +%input_ptr_u32 = OpTypePointer Input %u32 +%input = OpVariable %input_ptr Input +)"; + + EntryPoint entry_point; + entry_point.name = "main_d_r"; + entry_point.execution_model = "RayGenerationNV"; + entry_point.interfaces = "%input"; + entry_point.body = R"( +%input_member = OpAccessChain %input_ptr_u32 %input %u32_0 +)"; + generator.entry_points_.push_back(std::move(entry_point)); + + CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Vulkan spec allows BuiltIn InstanceId to be used " + "only with IntersectionNV, ClosestHitNV and " + "AnyHitNV execution models")); +} + } // namespace } // namespace val } // namespace spvtools diff --git a/3rdparty/spirv-tools/test/val/val_capability_test.cpp b/3rdparty/spirv-tools/test/val/val_capability_test.cpp index 2ee7133cd..488e957ae 100644 --- a/3rdparty/spirv-tools/test/val/val_capability_test.cpp +++ b/3rdparty/spirv-tools/test/val/val_capability_test.cpp @@ -112,6 +112,8 @@ using ValidateCapabilityVulkan10 = spvtest::ValidateBase; using ValidateCapabilityOpenGL40 = spvtest::ValidateBase; // Always assembles using Vulkan 1.1. using ValidateCapabilityVulkan11 = spvtest::ValidateBase; +// Always assembles using WebGPU. +using ValidateCapabilityWebGPU = spvtest::ValidateBase; TEST_F(ValidateCapability, Default) { const char str[] = R"( @@ -289,8 +291,10 @@ const std::vector& AllVulkan10Capabilities() { "DerivativeControl", "Geometry", "Tessellation", + "Float16", "Float64", "Int64", + "Int64Atomics", "Int16", "TessellationPointSize", "GeometryPointSize", @@ -304,6 +308,7 @@ const std::vector& AllVulkan10Capabilities() { "CullDistance", "ImageCubeArray", "SampleRateShading", + "Int8", "SparseResidency", "MinLod", "SampledCubeArray", @@ -312,7 +317,9 @@ const std::vector& AllVulkan10Capabilities() { "InterpolationFunction", "StorageImageReadWithoutFormat", "StorageImageWriteWithoutFormat", - "MultiViewport"}; + "MultiViewport", + "TransformFeedback", + "GeometryStreams"}; return *r; } @@ -330,8 +337,10 @@ const std::vector& AllVulkan11Capabilities() { "DerivativeControl", "Geometry", "Tessellation", + "Float16", "Float64", "Int64", + "Int64Atomics", "Int16", "TessellationPointSize", "GeometryPointSize", @@ -345,6 +354,7 @@ const std::vector& AllVulkan11Capabilities() { "CullDistance", "ImageCubeArray", "SampleRateShading", + "Int8", "SparseResidency", "MinLod", "SampledCubeArray", @@ -372,10 +382,24 @@ const std::vector& AllVulkan11Capabilities() { "DeviceGroup", "MultiView", "VariablePointersStorageBuffer", - "VariablePointers"}; + "VariablePointers", + "TransformFeedback", + "GeometryStreams"}; return *r; } +const std::vector& AllWebGPUCapabilities() { + static const auto r = new std::vector{ + "", + "Shader", + "Matrix", + "Sampled1D", + "Image1D", + "ImageQuery", + "DerivativeControl"}; + return *r; +} + const std::vector& MatrixDependencies() { static const auto r = new std::vector{ "Matrix", @@ -566,6 +590,12 @@ const char kGLSL450MemoryModel[] = \ " OpCapability Shader" " OpMemoryModel Logical GLSL450 "; +const char kVulkanMemoryModel[] = \ + " OpCapability Shader" + " OpCapability VulkanMemoryModelKHR" + " OpExtension \"SPV_KHR_vulkan_memory_model\"" + " OpMemoryModel Logical VulkanKHR "; + const char kVoidFVoid[] = \ " %void = OpTypeVoid" " %void_f = OpTypeFunction %void" @@ -596,9 +626,12 @@ std::make_pair(std::string(kOpenCLMemoryModel) + std::string(kVoidFVoid), TessellationDependencies()), std::make_pair(std::string(kOpenCLMemoryModel) + " OpEntryPoint Geometry %func \"shader\"" + + " OpExecutionMode %func InputPoints" + + " OpExecutionMode %func OutputPoints" + std::string(kVoidFVoid), GeometryDependencies()), std::make_pair(std::string(kOpenCLMemoryModel) + " OpEntryPoint Fragment %func \"shader\"" + + " OpExecutionMode %func OriginUpperLeft" + std::string(kVoidFVoid), ShaderDependencies()), std::make_pair(std::string(kOpenCLMemoryModel) + " OpEntryPoint GLCompute %func \"shader\"" + @@ -657,6 +690,8 @@ INSTANTIATE_TEST_CASE_P(ExecutionMode, ValidateCapability, std::make_pair(std::string(kOpenCLMemoryModel) + "OpEntryPoint Geometry %func \"shader\" " "OpExecutionMode %func Invocations 42" + + " OpExecutionMode %func InputPoints" + + " OpExecutionMode %func OutputPoints" + std::string(kVoidFVoid), GeometryDependencies()), std::make_pair(std::string(kOpenCLMemoryModel) + "OpEntryPoint TessellationControl %func \"shader\" " @@ -679,20 +714,22 @@ std::make_pair(std::string(kOpenCLMemoryModel) + "OpExecutionMode %func VertexOrderCcw" + std::string(kVoidFVoid), TessellationDependencies()), std::make_pair(std::string(kOpenCLMemoryModel) + - "OpEntryPoint Vertex %func \"shader\" " + "OpEntryPoint Fragment %func \"shader\" " "OpExecutionMode %func PixelCenterInteger" + + " OpExecutionMode %func OriginUpperLeft" + std::string(kVoidFVoid), ShaderDependencies()), std::make_pair(std::string(kOpenCLMemoryModel) + - "OpEntryPoint Vertex %func \"shader\" " + "OpEntryPoint Fragment %func \"shader\" " "OpExecutionMode %func OriginUpperLeft" + std::string(kVoidFVoid), ShaderDependencies()), std::make_pair(std::string(kOpenCLMemoryModel) + - "OpEntryPoint Vertex %func \"shader\" " + "OpEntryPoint Fragment %func \"shader\" " "OpExecutionMode %func OriginLowerLeft" + std::string(kVoidFVoid), ShaderDependencies()), std::make_pair(std::string(kOpenCLMemoryModel) + - "OpEntryPoint Vertex %func \"shader\" " + "OpEntryPoint Fragment %func \"shader\" " "OpExecutionMode %func EarlyFragmentTests" + + " OpExecutionMode %func OriginUpperLeft" + std::string(kVoidFVoid), ShaderDependencies()), std::make_pair(std::string(kOpenCLMemoryModel) + "OpEntryPoint TessellationControl %func \"shader\" " @@ -703,20 +740,24 @@ std::make_pair(std::string(kOpenCLMemoryModel) + "OpExecutionMode %func Xfb" + std::string(kVoidFVoid), std::vector{"TransformFeedback"}), std::make_pair(std::string(kOpenCLMemoryModel) + - "OpEntryPoint Vertex %func \"shader\" " + "OpEntryPoint Fragment %func \"shader\" " "OpExecutionMode %func DepthReplacing" + + " OpExecutionMode %func OriginUpperLeft" + std::string(kVoidFVoid), ShaderDependencies()), std::make_pair(std::string(kOpenCLMemoryModel) + - "OpEntryPoint Vertex %func \"shader\" " + "OpEntryPoint Fragment %func \"shader\" " "OpExecutionMode %func DepthGreater" + + " OpExecutionMode %func OriginUpperLeft" + std::string(kVoidFVoid), ShaderDependencies()), std::make_pair(std::string(kOpenCLMemoryModel) + - "OpEntryPoint Vertex %func \"shader\" " + "OpEntryPoint Fragment %func \"shader\" " "OpExecutionMode %func DepthLess" + + " OpExecutionMode %func OriginUpperLeft" + std::string(kVoidFVoid), ShaderDependencies()), std::make_pair(std::string(kOpenCLMemoryModel) + - "OpEntryPoint Vertex %func \"shader\" " + "OpEntryPoint Fragment %func \"shader\" " "OpExecutionMode %func DepthUnchanged" + + " OpExecutionMode %func OriginUpperLeft" + std::string(kVoidFVoid), ShaderDependencies()), std::make_pair(std::string(kOpenCLMemoryModel) + "OpEntryPoint Kernel %func \"shader\" " @@ -729,18 +770,22 @@ std::make_pair(std::string(kGLSL450MemoryModel) + std::make_pair(std::string(kOpenCLMemoryModel) + "OpEntryPoint Geometry %func \"shader\" " "OpExecutionMode %func InputPoints" + + " OpExecutionMode %func OutputPoints" + std::string(kVoidFVoid), GeometryDependencies()), std::make_pair(std::string(kOpenCLMemoryModel) + "OpEntryPoint Geometry %func \"shader\" " "OpExecutionMode %func InputLines" + + " OpExecutionMode %func OutputLineStrip" + std::string(kVoidFVoid), GeometryDependencies()), std::make_pair(std::string(kOpenCLMemoryModel) + "OpEntryPoint Geometry %func \"shader\" " "OpExecutionMode %func InputLinesAdjacency" + + " OpExecutionMode %func OutputLineStrip" + std::string(kVoidFVoid), GeometryDependencies()), std::make_pair(std::string(kOpenCLMemoryModel) + "OpEntryPoint Geometry %func \"shader\" " "OpExecutionMode %func Triangles" + + " OpExecutionMode %func OutputTriangleStrip" + std::string(kVoidFVoid), GeometryDependencies()), std::make_pair(std::string(kOpenCLMemoryModel) + "OpEntryPoint TessellationControl %func \"shader\" " @@ -749,6 +794,7 @@ std::make_pair(std::string(kOpenCLMemoryModel) + std::make_pair(std::string(kOpenCLMemoryModel) + "OpEntryPoint Geometry %func \"shader\" " "OpExecutionMode %func InputTrianglesAdjacency" + + " OpExecutionMode %func OutputTriangleStrip" + std::string(kVoidFVoid), GeometryDependencies()), std::make_pair(std::string(kOpenCLMemoryModel) + "OpEntryPoint TessellationControl %func \"shader\" " @@ -761,6 +807,8 @@ std::make_pair(std::string(kOpenCLMemoryModel) + std::make_pair(std::string(kOpenCLMemoryModel) + "OpEntryPoint Geometry %func \"shader\" " "OpExecutionMode %func OutputVertices 42" + + " OpExecutionMode %func OutputPoints" + + " OpExecutionMode %func InputPoints" + std::string(kVoidFVoid), GeometryDependencies()), std::make_pair(std::string(kOpenCLMemoryModel) + "OpEntryPoint TessellationControl %func \"shader\" " @@ -769,14 +817,17 @@ std::make_pair(std::string(kOpenCLMemoryModel) + std::make_pair(std::string(kOpenCLMemoryModel) + "OpEntryPoint Geometry %func \"shader\" " "OpExecutionMode %func OutputPoints" + + " OpExecutionMode %func InputPoints" + std::string(kVoidFVoid), GeometryDependencies()), std::make_pair(std::string(kOpenCLMemoryModel) + "OpEntryPoint Geometry %func \"shader\" " "OpExecutionMode %func OutputLineStrip" + + " OpExecutionMode %func InputLines" + std::string(kVoidFVoid), GeometryDependencies()), std::make_pair(std::string(kOpenCLMemoryModel) + "OpEntryPoint Geometry %func \"shader\" " "OpExecutionMode %func OutputTriangleStrip" + + " OpExecutionMode %func Triangles" + std::string(kVoidFVoid), GeometryDependencies()), std::make_pair(std::string(kGLSL450MemoryModel) + "OpEntryPoint Kernel %func \"shader\" " @@ -1088,9 +1139,12 @@ std::make_pair(std::string(kOpenCLMemoryModel) + "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid), AllCapabilities()), std::make_pair(std::string(kOpenCLMemoryModel) + + // Uniform must target a non-void value. "OpEntryPoint Kernel %func \"compute\" \n" - "OpDecorate %intt Uniform\n" - "%intt = OpTypeInt 32 0\n" + std::string(kVoidFVoid), + "OpDecorate %int0 Uniform\n" + "%intt = OpTypeInt 32 0\n" + + "%int0 = OpConstantNull %intt" + + std::string(kVoidFVoid), ShaderDependencies()), std::make_pair(std::string(kGLSL450MemoryModel) + "OpEntryPoint Vertex %func \"shader\" \n" @@ -1502,6 +1556,16 @@ std::make_pair(std::string(kGLSL450MemoryModel) + AllSpirV10Capabilities()) )),); +INSTANTIATE_TEST_CASE_P(Capabilities, ValidateCapabilityWebGPU, + Combine( + // All capabilities to try. + ValuesIn(AllCapabilities()), + Values( +std::make_pair(std::string(kVulkanMemoryModel) + + "OpEntryPoint Vertex %func \"shader\" \n" + std::string(kVoidFVoid), + AllWebGPUCapabilities()) +)),); + INSTANTIATE_TEST_CASE_P(Capabilities, ValidateCapabilityVulkan11, Combine( // All capabilities to try. @@ -1693,6 +1757,17 @@ TEST_P(ValidateCapabilityOpenGL40, Capability) { } } +TEST_P(ValidateCapabilityWebGPU, Capability) { + const std::string capability = Capability(GetParam()); + if (Exists(capability, SPV_ENV_WEBGPU_0)) { + const std::string test_code = MakeAssembly(GetParam()); + CompileSuccessfully(test_code, SPV_ENV_WEBGPU_0); + ASSERT_EQ(ExpectedResult(GetParam()), + ValidateInstructions(SPV_ENV_WEBGPU_0)) + << test_code; + } +} + TEST_F(ValidateCapability, SemanticsIdIsAnIdNotALiteral) { // From https://github.com/KhronosGroup/SPIRV-Tools/issues/248 // The validator was interpreting the memory semantics ID number @@ -2296,6 +2371,37 @@ OpFunctionEnd << getDiagnosticString(); } +TEST_F(ValidateCapability, VulkanMemoryModelWithVulkanKHR) { + const std::string spirv = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpCapability Linkage +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)) + << getDiagnosticString(); +} + +TEST_F(ValidateCapability, VulkanMemoryModelWithGLSL450) { + const std::string spirv = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpCapability Linkage +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical GLSL450 +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, + ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("VulkanMemoryModelKHR capability must only be " + "specified if the VulkanKHR memory model is used")); +} + } // namespace } // namespace val } // namespace spvtools diff --git a/3rdparty/spirv-tools/test/val/val_cfg_test.cpp b/3rdparty/spirv-tools/test/val/val_cfg_test.cpp index 045166925..aed0a5788 100644 --- a/3rdparty/spirv-tools/test/val/val_cfg_test.cpp +++ b/3rdparty/spirv-tools/test/val/val_cfg_test.cpp @@ -378,8 +378,8 @@ TEST_P(ValidateCFG, BlockAppearsBeforeDominatorBad) { CompileSuccessfully(str); ASSERT_EQ(SPV_ERROR_INVALID_CFG, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - MatchesRegex("Block .\\[cont\\] appears in the binary " - "before its dominator .\\[branch\\]\n" + MatchesRegex("Block .\\[%cont\\] appears in the binary " + "before its dominator .\\[%branch\\]\n" " %branch = OpLabel\n")); } @@ -410,7 +410,7 @@ TEST_P(ValidateCFG, MergeBlockTargetedByMultipleHeaderBlocksBad) { if (is_shader) { ASSERT_EQ(SPV_ERROR_INVALID_CFG, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - MatchesRegex("Block .\\[merge\\] is already a merge block " + MatchesRegex("Block .\\[%merge\\] is already a merge block " "for another header\n" " %Main = OpFunction %void None %9\n")); } else { @@ -445,7 +445,7 @@ TEST_P(ValidateCFG, MergeBlockTargetedByMultipleHeaderBlocksSelectionBad) { if (is_shader) { ASSERT_EQ(SPV_ERROR_INVALID_CFG, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - MatchesRegex("Block .\\[merge\\] is already a merge block " + MatchesRegex("Block .\\[%merge\\] is already a merge block " "for another header\n" " %Main = OpFunction %void None %9\n")); } else { @@ -470,8 +470,8 @@ TEST_P(ValidateCFG, BranchTargetFirstBlockBadSinceEntryBlock) { CompileSuccessfully(str); ASSERT_EQ(SPV_ERROR_INVALID_CFG, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - MatchesRegex("First block .\\[entry\\] of function .\\[Main\\] " - "is targeted by block .\\[bad\\]\n" + MatchesRegex("First block .\\[%entry\\] of function " + ".\\[%Main\\] is targeted by block .\\[%bad\\]\n" " %Main = OpFunction %void None %10\n")); } @@ -494,10 +494,11 @@ TEST_P(ValidateCFG, BranchTargetFirstBlockBadSinceValue) { CompileSuccessfully(str); ASSERT_EQ(SPV_ERROR_INVALID_CFG, ValidateInstructions()); - EXPECT_THAT(getDiagnosticString(), - MatchesRegex("Block\\(s\\) \\{..\\} are referenced but not " - "defined in function .\\[Main\\]\n" - " %Main = OpFunction %void None %10\n")) + EXPECT_THAT( + getDiagnosticString(), + MatchesRegex("Block\\(s\\) \\{11\\[%11\\]\\} are referenced but not " + "defined in function .\\[%Main\\]\n %Main = OpFunction " + "%void None %10\n")) << str; } @@ -522,8 +523,8 @@ TEST_P(ValidateCFG, BranchConditionalTrueTargetFirstBlockBad) { CompileSuccessfully(str); ASSERT_EQ(SPV_ERROR_INVALID_CFG, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - MatchesRegex("First block .\\[entry\\] of function .\\[Main\\] " - "is targeted by block .\\[bad\\]\n" + MatchesRegex("First block .\\[%entry\\] of function .\\[%Main\\] " + "is targeted by block .\\[%bad\\]\n" " %Main = OpFunction %void None %10\n")); } @@ -551,8 +552,8 @@ TEST_P(ValidateCFG, BranchConditionalFalseTargetFirstBlockBad) { CompileSuccessfully(str); ASSERT_EQ(SPV_ERROR_INVALID_CFG, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - MatchesRegex("First block .\\[entry\\] of function .\\[Main\\] " - "is targeted by block .\\[bad\\]\n" + MatchesRegex("First block .\\[%entry\\] of function .\\[%Main\\] " + "is targeted by block .\\[%bad\\]\n" " %Main = OpFunction %void None %10\n")); } @@ -587,8 +588,8 @@ TEST_P(ValidateCFG, SwitchTargetFirstBlockBad) { CompileSuccessfully(str); ASSERT_EQ(SPV_ERROR_INVALID_CFG, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - MatchesRegex("First block .\\[entry\\] of function .\\[Main\\] " - "is targeted by block .\\[bad\\]\n" + MatchesRegex("First block .\\[%entry\\] of function .\\[%Main\\] " + "is targeted by block .\\[%bad\\]\n" " %Main = OpFunction %void None %10\n")); } @@ -623,8 +624,8 @@ TEST_P(ValidateCFG, BranchToBlockInOtherFunctionBad) { ASSERT_EQ(SPV_ERROR_INVALID_CFG, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), - MatchesRegex("Block\\(s\\) \\{.\\[middle2\\]\\} are referenced but not " - "defined in function .\\[Main\\]\n" + MatchesRegex("Block\\(s\\) \\{.\\[%middle2\\]\\} are referenced but not " + "defined in function .\\[%Main\\]\n" " %Main = OpFunction %void None %9\n")); } @@ -656,8 +657,8 @@ TEST_P(ValidateCFG, HeaderDoesntDominatesMergeBad) { EXPECT_THAT( getDiagnosticString(), MatchesRegex("The selection construct with the selection header " - ".\\[head\\] does not dominate the merge block " - ".\\[merge\\]\n %merge = OpLabel\n")); + ".\\[%head\\] does not dominate the merge block " + ".\\[%merge\\]\n %merge = OpLabel\n")); } else { ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); } @@ -689,8 +690,8 @@ TEST_P(ValidateCFG, HeaderDoesntStrictlyDominateMergeBad) { EXPECT_THAT( getDiagnosticString(), MatchesRegex("The selection construct with the selection header " - ".\\[head\\] does not strictly dominate the merge block " - ".\\[head\\]\n %head = OpLabel\n")); + ".\\[%head\\] does not strictly dominate the merge block " + ".\\[%head\\]\n %head = OpLabel\n")); } else { ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()) << str; } @@ -940,8 +941,8 @@ TEST_P(ValidateCFG, BackEdgeBlockDoesntPostDominateContinueTargetBad) { ASSERT_EQ(SPV_ERROR_INVALID_CFG, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), MatchesRegex("The continue construct with the continue target " - ".\\[loop2_merge\\] is not post dominated by the " - "back-edge block .\\[be_block\\]\n" + ".\\[%loop2_merge\\] is not post dominated by the " + "back-edge block .\\[%be_block\\]\n" " %be_block = OpLabel\n")); } else { ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); @@ -975,7 +976,7 @@ TEST_P(ValidateCFG, BranchingToNonLoopHeaderBlockBad) { ASSERT_EQ(SPV_ERROR_INVALID_CFG, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), - MatchesRegex("Back-edges \\(.\\[f\\] -> .\\[split\\]\\) can only " + MatchesRegex("Back-edges \\(.\\[%f\\] -> .\\[%split\\]\\) can only " "be formed between a block and a loop header.\n" " %f = OpLabel\n")); } else { @@ -1003,11 +1004,11 @@ TEST_P(ValidateCFG, BranchingToSameNonLoopHeaderBlockBad) { CompileSuccessfully(str); if (is_shader) { ASSERT_EQ(SPV_ERROR_INVALID_CFG, ValidateInstructions()); - EXPECT_THAT(getDiagnosticString(), - MatchesRegex( - "Back-edges \\(.\\[split\\] -> .\\[split\\]\\) can only be " - "formed between a block and a loop header.\n" - " %split = OpLabel\n")); + EXPECT_THAT( + getDiagnosticString(), + MatchesRegex( + "Back-edges \\(.\\[%split\\] -> .\\[%split\\]\\) can only be " + "formed between a block and a loop header.\n %split = OpLabel\n")); } else { ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); } @@ -1038,11 +1039,11 @@ TEST_P(ValidateCFG, MultipleBackEdgeBlocksToLoopHeaderBad) { CompileSuccessfully(str); if (is_shader) { ASSERT_EQ(SPV_ERROR_INVALID_CFG, ValidateInstructions()); - EXPECT_THAT(getDiagnosticString(), - MatchesRegex( - "Loop header .\\[loop\\] is targeted by 2 back-edge blocks " - "but the standard requires exactly one\n" - " %loop = OpLabel\n")) + EXPECT_THAT( + getDiagnosticString(), + MatchesRegex( + "Loop header .\\[%loop\\] is targeted by 2 back-edge blocks but " + "the standard requires exactly one\n %loop = OpLabel\n")) << str; } else { ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); @@ -1078,8 +1079,8 @@ TEST_P(ValidateCFG, ContinueTargetMustBePostDominatedByBackEdge) { ASSERT_EQ(SPV_ERROR_INVALID_CFG, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), MatchesRegex("The continue construct with the continue target " - ".\\[cheader\\] is not post dominated by the " - "back-edge block .\\[be_block\\]\n" + ".\\[%cheader\\] is not post dominated by the " + "back-edge block .\\[%be_block\\]\n" " %be_block = OpLabel\n")); } else { ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); @@ -1111,8 +1112,8 @@ TEST_P(ValidateCFG, BranchOutOfConstructToMergeBad) { ASSERT_EQ(SPV_ERROR_INVALID_CFG, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), MatchesRegex("The continue construct with the continue target " - ".\\[loop\\] is not post dominated by the " - "back-edge block .\\[cont\\]\n" + ".\\[%loop\\] is not post dominated by the " + "back-edge block .\\[%cont\\]\n" " %cont = OpLabel\n")) << str; } else { @@ -1147,8 +1148,8 @@ TEST_P(ValidateCFG, BranchOutOfConstructBad) { ASSERT_EQ(SPV_ERROR_INVALID_CFG, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), MatchesRegex("The continue construct with the continue target " - ".\\[loop\\] is not post dominated by the " - "back-edge block .\\[cont\\]\n" + ".\\[%loop\\] is not post dominated by the " + "back-edge block .\\[%cont\\]\n" " %cont = OpLabel\n")); } else { ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); @@ -1206,6 +1207,7 @@ TEST_F(ValidateCFG, LoopWithZeroBackEdgesBad) { OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %main "main" + OpExecutionMode %main OriginUpperLeft OpName %loop "loop" %voidt = OpTypeVoid %funct = OpTypeFunction %voidt @@ -1221,7 +1223,7 @@ TEST_F(ValidateCFG, LoopWithZeroBackEdgesBad) { ASSERT_EQ(SPV_ERROR_INVALID_CFG, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), - MatchesRegex("Loop header .\\[loop\\] is targeted by " + MatchesRegex("Loop header .\\[%loop\\] is targeted by " "0 back-edge blocks but the standard requires exactly " "one\n %loop = OpLabel\n")); } @@ -1231,6 +1233,7 @@ TEST_F(ValidateCFG, LoopWithBackEdgeFromUnreachableContinueConstructGood) { OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %main "main" + OpExecutionMode %main OriginUpperLeft OpName %loop "loop" %voidt = OpTypeVoid %funct = OpTypeFunction %voidt @@ -1465,6 +1468,7 @@ TEST_F(ValidateCFG, StructuredCFGBranchIntoSelectionBody) { OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft %void = OpTypeVoid %bool = OpTypeBool %true = OpConstantTrue %bool @@ -1564,8 +1568,8 @@ OpFunctionEnd EXPECT_THAT( getDiagnosticString(), HasSubstr( - "Case construct that targets 10 has branches to multiple other case " - "construct targets 12 and 11\n %10 = OpLabel")); + "Case construct that targets 10[%10] has branches to multiple other " + "case construct targets 12[%12] and 11[%11]\n %10 = OpLabel")); } TEST_F(ValidateCFG, MultipleFallThroughToDefault) { @@ -1599,7 +1603,7 @@ OpFunctionEnd EXPECT_THAT( getDiagnosticString(), HasSubstr("Multiple case constructs have branches to the case construct " - "that targets 10\n %10 = OpLabel")); + "that targets 10[%10]\n %10 = OpLabel")); } TEST_F(ValidateCFG, MultipleFallThroughToNonDefault) { @@ -1633,7 +1637,7 @@ OpFunctionEnd EXPECT_THAT( getDiagnosticString(), HasSubstr("Multiple case constructs have branches to the case construct " - "that targets 12\n %12 = OpLabel")); + "that targets 12[%12]\n %12 = OpLabel")); } TEST_F(ValidateCFG, DuplicateTargetWithFallThrough) { @@ -1694,8 +1698,8 @@ OpFunctionEnd ASSERT_EQ(SPV_ERROR_INVALID_CFG, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), - HasSubstr("Case construct that targets 12 has branches to the case " - "construct that targets 11, but does not immediately " + HasSubstr("Case construct that targets 12[%12] has branches to the case " + "construct that targets 11[%11], but does not immediately " "precede it in the OpSwitch's target list\n" " OpSwitch %uint_0 %10 0 %11 1 %12")); } @@ -1730,8 +1734,8 @@ OpFunctionEnd ASSERT_EQ(SPV_ERROR_INVALID_CFG, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), - HasSubstr("Case construct that targets 12 has branches to the case " - "construct that targets 11, but does not immediately " + HasSubstr("Case construct that targets 12[%12] has branches to the case " + "construct that targets 11[%11], but does not immediately " "precede it in the OpSwitch's target list\n" " OpSwitch %uint_0 %10 0 %11 1 %12")); } @@ -1768,17 +1772,52 @@ OpFunctionEnd ASSERT_EQ(SPV_ERROR_INVALID_CFG, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), - HasSubstr("Case construct that targets 12 has branches to the case " - "construct that targets 11, but does not immediately " + HasSubstr("Case construct that targets 12[%12] has branches to the case " + "construct that targets 11[%11], but does not immediately " "precede it in the OpSwitch's target list\n" " OpSwitch %uint_0 %10 0 %11 1 %12 2 %13")); } +TEST_F(ValidateCFG, GoodUnreachableSwitch) { + const std::string text = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %2 "main" +OpExecutionMode %2 OriginUpperLeft +%3 = OpTypeVoid +%4 = OpTypeFunction %3 +%5 = OpTypeBool +%6 = OpConstantTrue %5 +%7 = OpTypeInt 32 1 +%9 = OpConstant %7 0 +%2 = OpFunction %3 None %4 +%10 = OpLabel +OpSelectionMerge %11 None +OpBranchConditional %6 %12 %13 +%12 = OpLabel +OpReturn +%13 = OpLabel +OpReturn +%11 = OpLabel +OpSelectionMerge %14 None +OpSwitch %9 %14 0 %15 +%15 = OpLabel +OpBranch %14 +%14 = OpLabel +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(text); + EXPECT_THAT(SPV_SUCCESS, ValidateInstructions()); +} + TEST_F(ValidateCFG, InvalidCaseExit) { const std::string text = R"( OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %1 "func" +OpExecutionMode %1 OriginUpperLeft %2 = OpTypeVoid %3 = OpTypeInt 32 0 %4 = OpTypeFunction %2 @@ -1801,9 +1840,10 @@ OpFunctionEnd CompileSuccessfully(text); ASSERT_EQ(SPV_ERROR_INVALID_CFG, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("Case construct that targets 8 has invalid branch to " - "block 10 (not another case construct, corresponding " - "merge, outer loop merge or outer loop continue")); + HasSubstr("Case construct that targets 8[%8] has invalid branch " + "to block 10[%10] (not another case construct, " + "corresponding merge, outer loop merge or outer loop " + "continue)")); } TEST_F(ValidateCFG, GoodCaseExitsToOuterConstructs) { @@ -1811,6 +1851,7 @@ TEST_F(ValidateCFG, GoodCaseExitsToOuterConstructs) { OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft %void = OpTypeVoid %bool = OpTypeBool %true = OpConstantTrue %bool @@ -1841,6 +1882,184 @@ OpFunctionEnd ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); } +TEST_F(ValidateCFG, GoodUnreachableSelection) { + const std::string text = R"( +OpCapability Shader +%1 = OpExtInstImport "GLSL.std.450" +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft +%void = OpTypeVoid +%8 = OpTypeFunction %void +%bool = OpTypeBool +%false = OpConstantFalse %bool +%main = OpFunction %void None %8 +%15 = OpLabel +OpBranch %16 +%16 = OpLabel +OpLoopMerge %17 %18 None +OpBranch %19 +%19 = OpLabel +OpBranchConditional %false %21 %17 +%21 = OpLabel +OpSelectionMerge %22 None +OpBranchConditional %false %23 %22 +%23 = OpLabel +OpBranch %24 +%24 = OpLabel +OpLoopMerge %25 %26 None +OpBranch %27 +%27 = OpLabel +OpReturn +%26 = OpLabel +OpBranchConditional %false %24 %25 +%25 = OpLabel +OpSelectionMerge %28 None +OpBranchConditional %false %18 %28 +%28 = OpLabel +OpBranch %22 +%22 = OpLabel +OpBranch %18 +%18 = OpLabel +OpBranch %16 +%17 = OpLabel +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(text); + ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); +} + +TEST_F(ValidateCFG, ShaderWithPhiPtr) { + const std::string text = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %1 "main" + OpExecutionMode %1 LocalSize 1 1 1 + OpSource HLSL 600 + %bool = OpTypeBool +%_ptr_Function_bool = OpTypePointer Function %bool + %void = OpTypeVoid + %5 = OpTypeFunction %void + %1 = OpFunction %void None %5 + %6 = OpLabel + %7 = OpVariable %_ptr_Function_bool Function + %8 = OpVariable %_ptr_Function_bool Function + %9 = OpUndef %bool + OpSelectionMerge %10 None + OpBranchConditional %9 %11 %10 + %11 = OpLabel + OpBranch %10 + %10 = OpLabel + %12 = OpPhi %_ptr_Function_bool %7 %6 %8 %11 + OpReturn + OpFunctionEnd +)"; + + CompileSuccessfully(text); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Using pointers with OpPhi requires capability " + "VariablePointers or VariablePointersStorageBuffer")); +} + +TEST_F(ValidateCFG, VarPtrShaderWithPhiPtr) { + const std::string text = R"( + OpCapability Shader + OpCapability VariablePointers + OpExtension "SPV_KHR_variable_pointers" + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %1 "main" + OpExecutionMode %1 LocalSize 1 1 1 + OpSource HLSL 600 + %bool = OpTypeBool +%_ptr_Function_bool = OpTypePointer Function %bool + %void = OpTypeVoid + %5 = OpTypeFunction %void + %1 = OpFunction %void None %5 + %6 = OpLabel + %7 = OpVariable %_ptr_Function_bool Function + %8 = OpVariable %_ptr_Function_bool Function + %9 = OpUndef %bool + OpSelectionMerge %10 None + OpBranchConditional %9 %11 %10 + %11 = OpLabel + OpBranch %10 + %10 = OpLabel + %12 = OpPhi %_ptr_Function_bool %7 %6 %8 %11 + OpReturn + OpFunctionEnd +)"; + + CompileSuccessfully(text); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions()); +} + +TEST_F(ValidateCFG, VarPtrStgBufShaderWithPhiStgBufPtr) { + const std::string text = R"( + OpCapability Shader + OpCapability VariablePointersStorageBuffer + OpExtension "SPV_KHR_variable_pointers" + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %1 "main" + OpExecutionMode %1 LocalSize 1 1 1 + OpSource HLSL 600 + %bool = OpTypeBool + %float = OpTypeFloat 32 +%_ptr_StorageBuffer_float = OpTypePointer StorageBuffer %float + %7 = OpVariable %_ptr_StorageBuffer_float StorageBuffer + %8 = OpVariable %_ptr_StorageBuffer_float StorageBuffer + %void = OpTypeVoid + %5 = OpTypeFunction %void + %1 = OpFunction %void None %5 + %6 = OpLabel + %9 = OpUndef %bool + OpSelectionMerge %10 None + OpBranchConditional %9 %11 %10 + %11 = OpLabel + OpBranch %10 + %10 = OpLabel + %12 = OpPhi %_ptr_StorageBuffer_float %7 %6 %8 %11 + OpReturn + OpFunctionEnd +)"; + + CompileSuccessfully(text); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions()); +} + +TEST_F(ValidateCFG, KernelWithPhiPtr) { + const std::string text = R"( + OpCapability Kernel + OpCapability Addresses + OpMemoryModel Physical32 OpenCL + OpEntryPoint Kernel %1 "main" + OpExecutionMode %1 LocalSize 1 1 1 + OpSource HLSL 600 + %bool = OpTypeBool +%_ptr_Function_bool = OpTypePointer Function %bool + %void = OpTypeVoid + %5 = OpTypeFunction %void + %1 = OpFunction %void None %5 + %6 = OpLabel + %7 = OpVariable %_ptr_Function_bool Function + %8 = OpVariable %_ptr_Function_bool Function + %9 = OpUndef %bool + OpSelectionMerge %10 None + OpBranchConditional %9 %11 %10 + %11 = OpLabel + OpBranch %10 + %10 = OpLabel + %12 = OpPhi %_ptr_Function_bool %7 %6 %8 %11 + OpReturn + OpFunctionEnd +)"; + + CompileSuccessfully(text); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions()); +} + /// TODO(umar): Nested CFG constructs } // namespace diff --git a/3rdparty/spirv-tools/test/val/val_composites_test.cpp b/3rdparty/spirv-tools/test/val/val_composites_test.cpp index 063626d1d..bf7f15d51 100644 --- a/3rdparty/spirv-tools/test/val/val_composites_test.cpp +++ b/3rdparty/spirv-tools/test/val/val_composites_test.cpp @@ -41,6 +41,9 @@ OpCapability Float64 ss << capabilities_and_extensions; ss << "OpMemoryModel Logical GLSL450\n"; ss << "OpEntryPoint " << execution_model << " %main \"main\"\n"; + if (execution_model == "Fragment") { + ss << "OpExecutionMode %main OriginUpperLeft\n"; + } ss << R"( %void = OpTypeVoid @@ -149,15 +152,14 @@ OpMemoryModel Logical GLSL450 ; } %f32arr = OpTypeRuntimeArray %float -%bool = OpTypeBool %v4float = OpTypeVector %float 4 %array5_mat4x3 = OpTypeArray %mat4x3 %int_5 %array5_vec4 = OpTypeArray %v4float %int_5 %_ptr_Uniform_float = OpTypePointer Uniform %float %_ptr_Function_vec4 = OpTypePointer Function %v4float %_ptr_Uniform_vec4 = OpTypePointer Uniform %v4float -%struct_s = OpTypeStruct %bool %array5_vec4 %int %array5_mat4x3 -%struct_blockName = OpTypeStruct %struct_s %bool %f32arr +%struct_s = OpTypeStruct %int %array5_vec4 %int %array5_mat4x3 +%struct_blockName = OpTypeStruct %struct_s %int %f32arr %_ptr_Uniform_blockName = OpTypePointer Uniform %struct_blockName %_ptr_Uniform_struct_s = OpTypePointer Uniform %struct_s %_ptr_Uniform_array5_mat4x3 = OpTypePointer Uniform %array5_mat4x3 @@ -318,11 +320,9 @@ TEST_F(ValidateComposites, CompositeConstructVectorWrongConsituent1) { )"; CompileSuccessfully(GenerateShaderCode(body).c_str()); - ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); - EXPECT_THAT( - getDiagnosticString(), - HasSubstr("Expected Constituents to be scalars or vectors of the same " - "type as Result Type components")); + ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), HasSubstr("Operand 5[%float] cannot be a " + "type")); } TEST_F(ValidateComposites, CompositeConstructVectorWrongConsituent2) { @@ -538,7 +538,8 @@ TEST_F(ValidateComposites, CopyObjectResultTypeNotType) { CompileSuccessfully(GenerateShaderCode(body).c_str()); ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); - EXPECT_THAT(getDiagnosticString(), HasSubstr("ID 19 is not a type id")); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("ID 19[%float_0] is not a type id")); } TEST_F(ValidateComposites, CopyObjectWrongOperandType) { @@ -658,10 +659,9 @@ TEST_F(ValidateComposites, CompositeExtractNotObject) { )"; CompileSuccessfully(GenerateShaderCode(body)); - ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); - EXPECT_THAT(getDiagnosticString(), - HasSubstr("Expected Composite to be an object " - "of composite type")); + ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), HasSubstr("Operand 11[%v4float] cannot " + "be a type")); } TEST_F(ValidateComposites, CompositeExtractNotComposite) { @@ -1364,7 +1364,7 @@ TEST_F(ValidateComposites, CompositeExtractStructIndexOutOfBoundBad) { EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), HasSubstr("Index is out of bounds, can not find index 3 in the " - "structure '26'. This structure has 3 members. " + "structure '25'. This structure has 3 members. " "Largest valid index is 2.")); } @@ -1385,7 +1385,7 @@ TEST_F(ValidateComposites, CompositeInsertStructIndexOutOfBoundBad) { EXPECT_THAT( getDiagnosticString(), HasSubstr("Index is out of bounds, can not find index 3 in the structure " - " '26'. This structure has 3 members. Largest valid index " + " '25'. This structure has 3 members. Largest valid index " "is 2.")); } @@ -1467,6 +1467,30 @@ OpFunctionEnd EXPECT_EQ(SPV_SUCCESS, ValidateInstructions()); } +TEST_F(ValidateComposites, ExtractDynamicLabelIndex) { + const std::string spirv = R"( +OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +%void = OpTypeVoid +%float = OpTypeFloat 32 +%v4float = OpTypeVector %float 4 +%void_fn = OpTypeFunction %void +%float_0 = OpConstant %float 0 +%v4float_0 = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0 +%func = OpFunction %void None %void_fn +%1 = OpLabel +%ex = OpVectorExtractDynamic %float %v4float_0 %v4float_0 +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Expected Index to be int scalar")); +} + } // namespace } // namespace val } // namespace spvtools diff --git a/3rdparty/spirv-tools/test/val/val_constants_test.cpp b/3rdparty/spirv-tools/test/val/val_constants_test.cpp new file mode 100644 index 000000000..80bc9709b --- /dev/null +++ b/3rdparty/spirv-tools/test/val/val_constants_test.cpp @@ -0,0 +1,285 @@ +// Copyright (c) 2019 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Test validation of constants. +// +// This file contains newer tests. Older tests may be in other files such as +// val_id_test.cpp. + +#include +#include + +#include "gmock/gmock.h" +#include "test/unit_spirv.h" +#include "test/val/val_fixtures.h" + +namespace spvtools { +namespace val { +namespace { + +using ::testing::Eq; +using ::testing::HasSubstr; +using ::testing::ValuesIn; + +using ValidateConstant = spvtest::ValidateBase; + +#define kBasicTypes \ + "%bool = OpTypeBool " \ + "%uint = OpTypeInt 32 0 " \ + "%uint2 = OpTypeVector %uint 2 " \ + "%float = OpTypeFloat 32 " \ + "%_ptr_uint = OpTypePointer Workgroup %uint " \ + "%uint_0 = OpConstantNull %uint " \ + "%uint2_0 = OpConstantNull %uint " \ + "%float_0 = OpConstantNull %float " \ + "%false = OpConstantFalse %bool " \ + "%true = OpConstantTrue %bool " \ + "%null = OpConstantNull %_ptr_uint " + +#define kShaderPreamble \ + "OpCapability Shader\n" \ + "OpCapability Linkage\n" \ + "OpMemoryModel Logical Simple\n" + +#define kKernelPreamble \ + "OpCapability Kernel\n" \ + "OpCapability Linkage\n" \ + "OpCapability Addresses\n" \ + "OpMemoryModel Physical32 OpenCL\n" + +struct ConstantOpCase { + spv_target_env env; + std::string assembly; + bool expect_success; + std::string expect_err; +}; + +using ValidateConstantOp = spvtest::ValidateBase; + +TEST_P(ValidateConstantOp, Samples) { + const auto env = GetParam().env; + CompileSuccessfully(GetParam().assembly, env); + const auto result = ValidateInstructions(env); + if (GetParam().expect_success) { + EXPECT_EQ(SPV_SUCCESS, result); + EXPECT_THAT(getDiagnosticString(), Eq("")); + } else { + EXPECT_EQ(SPV_ERROR_INVALID_ID, result); + EXPECT_THAT(getDiagnosticString(), HasSubstr(GetParam().expect_err)); + } +} + +#define GOOD_SHADER_10(STR) \ + { SPV_ENV_UNIVERSAL_1_0, kShaderPreamble kBasicTypes STR, true, "" } +#define GOOD_KERNEL_10(STR) \ + { SPV_ENV_UNIVERSAL_1_0, kKernelPreamble kBasicTypes STR, true, "" } +INSTANTIATE_TEST_CASE_P( + UniversalInShader, ValidateConstantOp, + ValuesIn(std::vector{ + // TODO(dneto): Conversions must change width. + GOOD_SHADER_10("%v = OpSpecConstantOp %uint SConvert %uint_0"), + GOOD_SHADER_10("%v = OpSpecConstantOp %float FConvert %float_0"), + GOOD_SHADER_10("%v = OpSpecConstantOp %uint SNegate %uint_0"), + GOOD_SHADER_10("%v = OpSpecConstantOp %uint Not %uint_0"), + GOOD_SHADER_10("%v = OpSpecConstantOp %uint IAdd %uint_0 %uint_0"), + GOOD_SHADER_10("%v = OpSpecConstantOp %uint ISub %uint_0 %uint_0"), + GOOD_SHADER_10("%v = OpSpecConstantOp %uint IMul %uint_0 %uint_0"), + GOOD_SHADER_10("%v = OpSpecConstantOp %uint UDiv %uint_0 %uint_0"), + GOOD_SHADER_10("%v = OpSpecConstantOp %uint SDiv %uint_0 %uint_0"), + GOOD_SHADER_10("%v = OpSpecConstantOp %uint UMod %uint_0 %uint_0"), + GOOD_SHADER_10("%v = OpSpecConstantOp %uint SRem %uint_0 %uint_0"), + GOOD_SHADER_10("%v = OpSpecConstantOp %uint SMod %uint_0 %uint_0"), + GOOD_SHADER_10( + "%v = OpSpecConstantOp %uint ShiftRightLogical %uint_0 %uint_0"), + GOOD_SHADER_10( + "%v = OpSpecConstantOp %uint ShiftRightArithmetic %uint_0 %uint_0"), + GOOD_SHADER_10( + "%v = OpSpecConstantOp %uint ShiftLeftLogical %uint_0 %uint_0"), + GOOD_SHADER_10("%v = OpSpecConstantOp %uint BitwiseOr %uint_0 %uint_0"), + GOOD_SHADER_10( + "%v = OpSpecConstantOp %uint BitwiseXor %uint_0 %uint_0"), + GOOD_SHADER_10( + "%v = OpSpecConstantOp %uint2 VectorShuffle %uint2_0 %uint2_0 1 3"), + GOOD_SHADER_10( + "%v = OpSpecConstantOp %uint CompositeExtract %uint2_0 1"), + GOOD_SHADER_10( + "%v = OpSpecConstantOp %uint2 CompositeInsert %uint_0 %uint2_0 1"), + GOOD_SHADER_10("%v = OpSpecConstantOp %bool LogicalOr %true %false"), + GOOD_SHADER_10("%v = OpSpecConstantOp %bool LogicalNot %true"), + GOOD_SHADER_10("%v = OpSpecConstantOp %bool LogicalAnd %true %false"), + GOOD_SHADER_10("%v = OpSpecConstantOp %bool LogicalEqual %true %false"), + GOOD_SHADER_10( + "%v = OpSpecConstantOp %bool LogicalNotEqual %true %false"), + GOOD_SHADER_10( + "%v = OpSpecConstantOp %uint Select %true %uint_0 %uint_0"), + GOOD_SHADER_10("%v = OpSpecConstantOp %bool IEqual %uint_0 %uint_0"), + GOOD_SHADER_10("%v = OpSpecConstantOp %bool INotEqual %uint_0 %uint_0"), + GOOD_SHADER_10("%v = OpSpecConstantOp %bool ULessThan %uint_0 %uint_0"), + GOOD_SHADER_10("%v = OpSpecConstantOp %bool SLessThan %uint_0 %uint_0"), + GOOD_SHADER_10( + "%v = OpSpecConstantOp %bool ULessThanEqual %uint_0 %uint_0"), + GOOD_SHADER_10( + "%v = OpSpecConstantOp %bool SLessThanEqual %uint_0 %uint_0"), + GOOD_SHADER_10( + "%v = OpSpecConstantOp %bool UGreaterThan %uint_0 %uint_0"), + GOOD_SHADER_10( + "%v = OpSpecConstantOp %bool UGreaterThanEqual %uint_0 %uint_0"), + GOOD_SHADER_10( + "%v = OpSpecConstantOp %bool SGreaterThan %uint_0 %uint_0"), + GOOD_SHADER_10( + "%v = OpSpecConstantOp %bool SGreaterThanEqual %uint_0 %uint_0"), + })); + +INSTANTIATE_TEST_CASE_P( + UniversalInKernel, ValidateConstantOp, + ValuesIn(std::vector{ + // TODO(dneto): Conversions must change width. + GOOD_KERNEL_10("%v = OpSpecConstantOp %uint SConvert %uint_0"), + GOOD_KERNEL_10("%v = OpSpecConstantOp %float FConvert %float_0"), + GOOD_KERNEL_10("%v = OpSpecConstantOp %uint SNegate %uint_0"), + GOOD_KERNEL_10("%v = OpSpecConstantOp %uint Not %uint_0"), + GOOD_KERNEL_10("%v = OpSpecConstantOp %uint IAdd %uint_0 %uint_0"), + GOOD_KERNEL_10("%v = OpSpecConstantOp %uint ISub %uint_0 %uint_0"), + GOOD_KERNEL_10("%v = OpSpecConstantOp %uint IMul %uint_0 %uint_0"), + GOOD_KERNEL_10("%v = OpSpecConstantOp %uint UDiv %uint_0 %uint_0"), + GOOD_KERNEL_10("%v = OpSpecConstantOp %uint SDiv %uint_0 %uint_0"), + GOOD_KERNEL_10("%v = OpSpecConstantOp %uint UMod %uint_0 %uint_0"), + GOOD_KERNEL_10("%v = OpSpecConstantOp %uint SRem %uint_0 %uint_0"), + GOOD_KERNEL_10("%v = OpSpecConstantOp %uint SMod %uint_0 %uint_0"), + GOOD_KERNEL_10( + "%v = OpSpecConstantOp %uint ShiftRightLogical %uint_0 %uint_0"), + GOOD_KERNEL_10( + "%v = OpSpecConstantOp %uint ShiftRightArithmetic %uint_0 %uint_0"), + GOOD_KERNEL_10( + "%v = OpSpecConstantOp %uint ShiftLeftLogical %uint_0 %uint_0"), + GOOD_KERNEL_10("%v = OpSpecConstantOp %uint BitwiseOr %uint_0 %uint_0"), + GOOD_KERNEL_10( + "%v = OpSpecConstantOp %uint BitwiseXor %uint_0 %uint_0"), + GOOD_KERNEL_10( + "%v = OpSpecConstantOp %uint2 VectorShuffle %uint2_0 %uint2_0 1 3"), + GOOD_KERNEL_10( + "%v = OpSpecConstantOp %uint CompositeExtract %uint2_0 1"), + GOOD_KERNEL_10( + "%v = OpSpecConstantOp %uint2 CompositeInsert %uint_0 %uint2_0 1"), + GOOD_KERNEL_10("%v = OpSpecConstantOp %bool LogicalOr %true %false"), + GOOD_KERNEL_10("%v = OpSpecConstantOp %bool LogicalNot %true"), + GOOD_KERNEL_10("%v = OpSpecConstantOp %bool LogicalAnd %true %false"), + GOOD_KERNEL_10("%v = OpSpecConstantOp %bool LogicalEqual %true %false"), + GOOD_KERNEL_10( + "%v = OpSpecConstantOp %bool LogicalNotEqual %true %false"), + GOOD_KERNEL_10( + "%v = OpSpecConstantOp %uint Select %true %uint_0 %uint_0"), + GOOD_KERNEL_10("%v = OpSpecConstantOp %bool IEqual %uint_0 %uint_0"), + GOOD_KERNEL_10("%v = OpSpecConstantOp %bool INotEqual %uint_0 %uint_0"), + GOOD_KERNEL_10("%v = OpSpecConstantOp %bool ULessThan %uint_0 %uint_0"), + GOOD_KERNEL_10("%v = OpSpecConstantOp %bool SLessThan %uint_0 %uint_0"), + GOOD_KERNEL_10( + "%v = OpSpecConstantOp %bool ULessThanEqual %uint_0 %uint_0"), + GOOD_KERNEL_10( + "%v = OpSpecConstantOp %bool SLessThanEqual %uint_0 %uint_0"), + GOOD_KERNEL_10( + "%v = OpSpecConstantOp %bool UGreaterThan %uint_0 %uint_0"), + GOOD_KERNEL_10( + "%v = OpSpecConstantOp %bool UGreaterThanEqual %uint_0 %uint_0"), + GOOD_KERNEL_10( + "%v = OpSpecConstantOp %bool SGreaterThan %uint_0 %uint_0"), + GOOD_KERNEL_10( + "%v = OpSpecConstantOp %bool SGreaterThanEqual %uint_0 %uint_0"), + })); + +INSTANTIATE_TEST_CASE_P( + KernelInKernel, ValidateConstantOp, + ValuesIn(std::vector{ + // TODO(dneto): Conversions must change width. + GOOD_KERNEL_10("%v = OpSpecConstantOp %uint ConvertFToS %float_0"), + GOOD_KERNEL_10("%v = OpSpecConstantOp %float ConvertSToF %uint_0"), + GOOD_KERNEL_10("%v = OpSpecConstantOp %uint ConvertFToU %float_0"), + GOOD_KERNEL_10("%v = OpSpecConstantOp %float ConvertUToF %uint_0"), + GOOD_KERNEL_10("%v = OpSpecConstantOp %uint UConvert %uint_0"), + GOOD_KERNEL_10( + "%v = OpSpecConstantOp %_ptr_uint GenericCastToPtr %null"), + GOOD_KERNEL_10( + "%v = OpSpecConstantOp %_ptr_uint PtrCastToGeneric %null"), + GOOD_KERNEL_10("%v = OpSpecConstantOp %uint Bitcast %uint_0"), + GOOD_KERNEL_10("%v = OpSpecConstantOp %float FNegate %float_0"), + GOOD_KERNEL_10("%v = OpSpecConstantOp %float FAdd %float_0 %float_0"), + GOOD_KERNEL_10("%v = OpSpecConstantOp %float FSub %float_0 %float_0"), + GOOD_KERNEL_10("%v = OpSpecConstantOp %float FMul %float_0 %float_0"), + GOOD_KERNEL_10("%v = OpSpecConstantOp %float FDiv %float_0 %float_0"), + GOOD_KERNEL_10("%v = OpSpecConstantOp %float FRem %float_0 %float_0"), + GOOD_KERNEL_10("%v = OpSpecConstantOp %float FMod %float_0 %float_0"), + GOOD_KERNEL_10( + "%v = OpSpecConstantOp %_ptr_uint AccessChain %null %uint_0"), + GOOD_KERNEL_10("%v = OpSpecConstantOp %_ptr_uint InBoundsAccessChain " + "%null %uint_0"), + GOOD_KERNEL_10( + "%v = OpSpecConstantOp %_ptr_uint PtrAccessChain %null %uint_0"), + GOOD_KERNEL_10("%v = OpSpecConstantOp %_ptr_uint " + "InBoundsPtrAccessChain %null %uint_0"), + })); + +#define BAD_SHADER_10(STR, NAME) \ + { \ + SPV_ENV_UNIVERSAL_1_0, kShaderPreamble kBasicTypes STR, false, \ + "Specialization constant operation " NAME \ + " requires Kernel capability" \ + } +INSTANTIATE_TEST_CASE_P( + KernelInShader, ValidateConstantOp, + ValuesIn(std::vector{ + // TODO(dneto): Conversions must change width. + BAD_SHADER_10("%v = OpSpecConstantOp %uint ConvertFToS %float_0", + "ConvertFToS"), + BAD_SHADER_10("%v = OpSpecConstantOp %float ConvertSToF %uint_0", + "ConvertSToF"), + BAD_SHADER_10("%v = OpSpecConstantOp %uint ConvertFToU %float_0", + "ConvertFToU"), + BAD_SHADER_10("%v = OpSpecConstantOp %float ConvertUToF %uint_0", + "ConvertUToF"), + BAD_SHADER_10("%v = OpSpecConstantOp %_ptr_uint GenericCastToPtr %null", + "GenericCastToPtr"), + BAD_SHADER_10("%v = OpSpecConstantOp %_ptr_uint PtrCastToGeneric %null", + "PtrCastToGeneric"), + BAD_SHADER_10("%v = OpSpecConstantOp %uint Bitcast %uint_0", "Bitcast"), + BAD_SHADER_10("%v = OpSpecConstantOp %float FNegate %float_0", + "FNegate"), + BAD_SHADER_10("%v = OpSpecConstantOp %float FAdd %float_0 %float_0", + "FAdd"), + BAD_SHADER_10("%v = OpSpecConstantOp %float FSub %float_0 %float_0", + "FSub"), + BAD_SHADER_10("%v = OpSpecConstantOp %float FMul %float_0 %float_0", + "FMul"), + BAD_SHADER_10("%v = OpSpecConstantOp %float FDiv %float_0 %float_0", + "FDiv"), + BAD_SHADER_10("%v = OpSpecConstantOp %float FRem %float_0 %float_0", + "FRem"), + BAD_SHADER_10("%v = OpSpecConstantOp %float FMod %float_0 %float_0", + "FMod"), + BAD_SHADER_10( + "%v = OpSpecConstantOp %_ptr_uint AccessChain %null %uint_0", + "AccessChain"), + BAD_SHADER_10("%v = OpSpecConstantOp %_ptr_uint InBoundsAccessChain " + "%null %uint_0", + "InBoundsAccessChain"), + BAD_SHADER_10( + "%v = OpSpecConstantOp %_ptr_uint PtrAccessChain %null %uint_0", + "PtrAccessChain"), + BAD_SHADER_10("%v = OpSpecConstantOp %_ptr_uint " + "InBoundsPtrAccessChain %null %uint_0", + "InBoundsPtrAccessChain"), + })); + +} // namespace +} // namespace val +} // namespace spvtools diff --git a/3rdparty/spirv-tools/test/val/val_conversion_test.cpp b/3rdparty/spirv-tools/test/val/val_conversion_test.cpp index e0b8a0018..4161c7428 100644 --- a/3rdparty/spirv-tools/test/val/val_conversion_test.cpp +++ b/3rdparty/spirv-tools/test/val/val_conversion_test.cpp @@ -31,17 +31,23 @@ using ValidateConversion = spvtest::ValidateBase; std::string GenerateShaderCode( const std::string& body, - const std::string& capabilities_and_extensions = "") { + const std::string& capabilities_and_extensions = "", + const std::string& decorations = "", const std::string& types = "", + const std::string& variables = "") { const std::string capabilities = R"( OpCapability Shader OpCapability Int64 OpCapability Float64)"; - const std::string after_extension_before_body = + const std::string after_extension_before_decorations = R"( OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft)"; + + const std::string after_decorations_before_types = + R"( %void = OpTypeVoid %func = OpTypeFunction %void %bool = OpTypeBool @@ -139,8 +145,10 @@ OpEntryPoint Fragment %main "main" %true = OpConstantTrue %bool %false = OpConstantFalse %bool -%f32ptr_func = OpTypePointer Function %f32 +%f32ptr_func = OpTypePointer Function %f32)"; + const std::string after_variables_before_body = + R"( %main = OpFunction %void None %func %main_entry = OpLabel)"; @@ -150,7 +158,9 @@ OpReturn OpFunctionEnd)"; return capabilities + capabilities_and_extensions + - after_extension_before_body + body + after_body; + after_extension_before_decorations + decorations + + after_decorations_before_types + types + variables + + after_variables_before_body + body + after_body; } std::string GenerateKernelCode( @@ -629,6 +639,170 @@ TEST_F(ValidateConversion, QuantizeToF16WrongInputType) { "Expected input type to be equal to Result Type: QuantizeToF16")); } +TEST_F(ValidateConversion, ConvertFToS8BitStorage) { + const std::string capabilities_and_extensions = R"( +OpCapability StorageBuffer8BitAccess +OpExtension "SPV_KHR_8bit_storage" +OpExtension "SPV_KHR_storage_buffer_storage_class" +)"; + + const std::string decorations = R"( +OpDecorate %ssbo Block +OpDecorate %ssbo Binding 0 +OpDecorate %ssbo DescriptorSet 0 +OpMemberDecorate %ssbo 0 Offset 0 +)"; + + const std::string types = R"( +%i8 = OpTypeInt 8 1 +%i8ptr = OpTypePointer StorageBuffer %i8 +%ssbo = OpTypeStruct %i8 +%ssboptr = OpTypePointer StorageBuffer %ssbo +)"; + + const std::string variables = R"( +%var = OpVariable %ssboptr StorageBuffer +)"; + + const std::string body = R"( +%val = OpConvertFToS %i8 %f32_2 +%accesschain = OpAccessChain %i8ptr %var %u32_0 +OpStore %accesschain %val +)"; + + CompileSuccessfully(GenerateShaderCode(body, capabilities_and_extensions, + decorations, types, variables) + .c_str()); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr( + "Invalid cast to 8-bit integer from a floating-point: ConvertFToS")); +} + +TEST_F(ValidateConversion, ConvertFToU8BitStorage) { + const std::string capabilities_and_extensions = R"( +OpCapability StorageBuffer8BitAccess +OpExtension "SPV_KHR_8bit_storage" +OpExtension "SPV_KHR_storage_buffer_storage_class" +)"; + + const std::string decorations = R"( +OpDecorate %ssbo Block +OpDecorate %ssbo Binding 0 +OpDecorate %ssbo DescriptorSet 0 +OpMemberDecorate %ssbo 0 Offset 0 +)"; + + const std::string types = R"( +%u8 = OpTypeInt 8 0 +%u8ptr = OpTypePointer StorageBuffer %u8 +%ssbo = OpTypeStruct %u8 +%ssboptr = OpTypePointer StorageBuffer %ssbo +)"; + + const std::string variables = R"( +%var = OpVariable %ssboptr StorageBuffer +)"; + + const std::string body = R"( +%val = OpConvertFToU %u8 %f32_2 +%accesschain = OpAccessChain %u8ptr %var %u32_0 +OpStore %accesschain %val +)"; + + CompileSuccessfully(GenerateShaderCode(body, capabilities_and_extensions, + decorations, types, variables) + .c_str()); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr( + "Invalid cast to 8-bit integer from a floating-point: ConvertFToU")); +} + +TEST_F(ValidateConversion, ConvertSToF8BitStorage) { + const std::string capabilities_and_extensions = R"( +OpCapability StorageBuffer8BitAccess +OpExtension "SPV_KHR_8bit_storage" +OpExtension "SPV_KHR_storage_buffer_storage_class" +)"; + + const std::string decorations = R"( +OpDecorate %ssbo Block +OpDecorate %ssbo Binding 0 +OpDecorate %ssbo DescriptorSet 0 +OpMemberDecorate %ssbo 0 Offset 0 +)"; + + const std::string types = R"( +%i8 = OpTypeInt 8 1 +%i8ptr = OpTypePointer StorageBuffer %i8 +%ssbo = OpTypeStruct %i8 +%ssboptr = OpTypePointer StorageBuffer %ssbo +)"; + + const std::string variables = R"( +%var = OpVariable %ssboptr StorageBuffer +)"; + + const std::string body = R"( +%accesschain = OpAccessChain %i8ptr %var %u32_0 +%load = OpLoad %i8 %accesschain +%val = OpConvertSToF %f32 %load +)"; + + CompileSuccessfully(GenerateShaderCode(body, capabilities_and_extensions, + decorations, types, variables) + .c_str()); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr( + "Invalid cast to floating-point from an 8-bit integer: ConvertSToF")); +} + +TEST_F(ValidateConversion, ConvertUToF8BitStorage) { + const std::string capabilities_and_extensions = R"( +OpCapability StorageBuffer8BitAccess +OpExtension "SPV_KHR_8bit_storage" +OpExtension "SPV_KHR_storage_buffer_storage_class" +)"; + + const std::string decorations = R"( +OpDecorate %ssbo Block +OpDecorate %ssbo Binding 0 +OpDecorate %ssbo DescriptorSet 0 +OpMemberDecorate %ssbo 0 Offset 0 +)"; + + const std::string types = R"( +%u8 = OpTypeInt 8 0 +%u8ptr = OpTypePointer StorageBuffer %u8 +%ssbo = OpTypeStruct %u8 +%ssboptr = OpTypePointer StorageBuffer %ssbo +)"; + + const std::string variables = R"( +%var = OpVariable %ssboptr StorageBuffer +)"; + + const std::string body = R"( +%accesschain = OpAccessChain %u8ptr %var %u32_0 +%load = OpLoad %u8 %accesschain +%val = OpConvertUToF %f32 %load +)"; + + CompileSuccessfully(GenerateShaderCode(body, capabilities_and_extensions, + decorations, types, variables) + .c_str()); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr( + "Invalid cast to floating-point from an 8-bit integer: ConvertUToF")); +} + TEST_F(ValidateConversion, ConvertPtrToUSuccess) { const std::string body = R"( %ptr = OpVariable %f32ptr_func Function @@ -798,9 +972,9 @@ TEST_F(ValidateConversion, PtrCastToGenericWrongInputType) { )"; CompileSuccessfully(GenerateKernelCode(body).c_str()); - ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); - EXPECT_THAT(getDiagnosticString(), - HasSubstr("Expected input to be a pointer: PtrCastToGeneric")); + ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), HasSubstr("Operand 4[%float] cannot be a " + "type")); } TEST_F(ValidateConversion, PtrCastToGenericWrongInputStorageClass) { @@ -1034,9 +1208,9 @@ TEST_F(ValidateConversion, BitcastInputHasNoType) { )"; CompileSuccessfully(GenerateKernelCode(body).c_str()); - ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); - EXPECT_THAT(getDiagnosticString(), - HasSubstr("Expected input to have a type: Bitcast")); + ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), HasSubstr("Operand 4[%float] cannot be a " + "type")); } TEST_F(ValidateConversion, BitcastWrongResultType) { @@ -1105,6 +1279,29 @@ TEST_F(ValidateConversion, BitcastDifferentTotalBitWidth) { "Bitcast")); } +TEST_F(ValidateConversion, ConvertUToPtrInputIsAType) { + const std::string spirv = R"( +OpCapability Addresses +OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +%int = OpTypeInt 32 0 +%ptr_int = OpTypePointer Function %int +%void = OpTypeVoid +%voidfn = OpTypeFunction %void +%func = OpFunction %void None %voidfn +%entry = OpLabel +%1 = OpConvertUToPtr %ptr_int %int +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), HasSubstr("Operand 1[%uint] cannot be a " + "type")); +} + } // namespace } // namespace val } // namespace spvtools diff --git a/3rdparty/spirv-tools/test/val/val_data_test.cpp b/3rdparty/spirv-tools/test/val/val_data_test.cpp index d022d8b8a..fcf447a59 100644 --- a/3rdparty/spirv-tools/test/val/val_data_test.cpp +++ b/3rdparty/spirv-tools/test/val/val_data_test.cpp @@ -290,6 +290,17 @@ TEST_F(ValidateData, storage_input_output_16_good) { ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); } +TEST_F(ValidateData, amd_gpu_shader_half_float_fetch_16_good) { + std::string str = R"( + OpCapability Shader + OpCapability Linkage + OpExtension "SPV_AMD_gpu_shader_half_float_fetch" + OpMemoryModel Logical GLSL450 + %2 = OpTypeFloat 16)"; + CompileSuccessfully(str.c_str()); + ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); +} + TEST_F(ValidateData, int16_bad) { std::string str = header + "%2 = OpTypeInt 16 1"; CompileSuccessfully(str.c_str()); @@ -375,7 +386,8 @@ TEST_F(ValidateData, ids_should_be_validated_before_data) { )"; CompileSuccessfully(str.c_str()); ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); - EXPECT_THAT(getDiagnosticString(), HasSubstr("ID 3 has not been defined")); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("ID 3[%3] has not been defined")); } TEST_F(ValidateData, matrix_bad_column_type) { @@ -562,8 +574,8 @@ OpTypeForwardPointer %_ptr_Generic_struct_A Generic CompileSuccessfully(str.c_str()); ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("Found a forward reference to a non-pointer type in " - "OpTypeStruct instruction.")); + HasSubstr("Pointer type in OpTypeForwardPointer is not a pointer " + "type.\n OpTypeForwardPointer %float Generic\n")); } TEST_F(ValidateData, forward_ref_points_to_non_struct) { @@ -603,11 +615,24 @@ TEST_F(ValidateData, ext_16bit_storage_caps_allow_free_fp_rounding_mode) { OpCapability Linkage OpCapability )") + cap + R"( + OpExtension "SPV_KHR_storage_buffer_storage_class" + OpExtension "SPV_KHR_variable_pointers" OpExtension "SPV_KHR_16bit_storage" OpMemoryModel Logical GLSL450 - OpDecorate %2 FPRoundingMode )" + mode + R"( - %1 = OpTypeFloat 32 - %2 = OpConstant %1 1.25 + OpDecorate %_ FPRoundingMode )" + mode + R"( + %half = OpTypeFloat 16 + %float = OpTypeFloat 32 + %float_1_25 = OpConstant %float 1.25 + %half_ptr = OpTypePointer StorageBuffer %half + %half_ptr_var = OpVariable %half_ptr StorageBuffer + %void = OpTypeVoid + %func = OpTypeFunction %void + %main = OpFunction %void None %func + %main_entry = OpLabel + %_ = OpFConvert %half %float_1_25 + OpStore %half_ptr_var %_ + OpReturn + OpFunctionEnd )"; CompileSuccessfully(str.c_str()); ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); @@ -620,11 +645,24 @@ TEST_F(ValidateData, vulkan_disallow_free_fp_rounding_mode) { for (const auto env : {SPV_ENV_VULKAN_1_0, SPV_ENV_VULKAN_1_1}) { std::string str = std::string(R"( OpCapability Shader + OpExtension "SPV_KHR_storage_buffer_storage_class" + OpExtension "SPV_KHR_variable_pointers" OpMemoryModel Logical GLSL450 - OpDecorate %2 FPRoundingMode )") + + OpDecorate %_ FPRoundingMode )") + mode + R"( - %1 = OpTypeFloat 32 - %2 = OpConstant %1 1.25 + %half = OpTypeFloat 16 + %float = OpTypeFloat 32 + %float_1_25 = OpConstant %float 1.25 + %half_ptr = OpTypePointer StorageBuffer %half + %half_ptr_var = OpVariable %half_ptr StorageBuffer + %void = OpTypeVoid + %func = OpTypeFunction %void + %main = OpFunction %void None %func + %main_entry = OpLabel + %_ = OpFConvert %half %float_1_25 + OpStore %half_ptr_var %_ + OpReturn + OpFunctionEnd )"; CompileSuccessfully(str.c_str()); ASSERT_EQ(SPV_ERROR_INVALID_CAPABILITY, ValidateInstructions(env)); @@ -637,6 +675,34 @@ TEST_F(ValidateData, vulkan_disallow_free_fp_rounding_mode) { } } +TEST_F(ValidateData, void_array) { + std::string str = header + R"( + %void = OpTypeVoid + %int = OpTypeInt 32 0 + %int_5 = OpConstant %int 5 + %array = OpTypeArray %void %int_5 + )"; + + CompileSuccessfully(str.c_str()); + ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("OpTypeArray Element Type '1[%void]' is a void type.")); +} + +TEST_F(ValidateData, void_runtime_array) { + std::string str = header + R"( + %void = OpTypeVoid + %array = OpTypeRuntimeArray %void + )"; + + CompileSuccessfully(str.c_str()); + ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr( + "OpTypeRuntimeArray Element Type '1[%void]' is a void type.")); +} } // namespace } // namespace val } // namespace spvtools diff --git a/3rdparty/spirv-tools/test/val/val_decoration_test.cpp b/3rdparty/spirv-tools/test/val/val_decoration_test.cpp index c968183ca..3a4320dba 100644 --- a/3rdparty/spirv-tools/test/val/val_decoration_test.cpp +++ b/3rdparty/spirv-tools/test/val/val_decoration_test.cpp @@ -37,7 +37,7 @@ TEST_F(ValidateDecorations, ValidateOpDecorateRegistration) { OpCapability Linkage OpMemoryModel Logical GLSL450 OpDecorate %1 ArrayStride 4 - OpDecorate %1 Uniform + OpDecorate %1 RelaxedPrecision %2 = OpTypeFloat 32 %1 = OpTypeRuntimeArray %2 ; Since %1 is used first in Decoration, it gets id 1. @@ -49,7 +49,7 @@ TEST_F(ValidateDecorations, ValidateOpDecorateRegistration) { EXPECT_THAT( vstate_->id_decorations(id), Eq(std::vector{Decoration(SpvDecorationArrayStride, {4}), - Decoration(SpvDecorationUniform)})); + Decoration(SpvDecorationRelaxedPrecision)})); } TEST_F(ValidateDecorations, ValidateOpMemberDecorateRegistration) { @@ -85,6 +85,30 @@ TEST_F(ValidateDecorations, ValidateOpMemberDecorateRegistration) { Decoration(SpvDecorationBufferBlock)})); } +TEST_F(ValidateDecorations, ValidateOpMemberDecorateOutOfBound) { + std::string spirv = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %1 "Main" + OpExecutionMode %1 OriginUpperLeft + OpMemberDecorate %_struct_2 1 RelaxedPrecision + %void = OpTypeVoid + %4 = OpTypeFunction %void + %float = OpTypeFloat 32 + %_struct_2 = OpTypeStruct %float + %1 = OpFunction %void None %4 + %6 = OpLabel + OpReturn + OpFunctionEnd +)"; + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateAndRetrieveValidationState()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Index 1 provided in OpMemberDecorate for struct " + "2[%_struct_2] is out of bounds. The structure has 1 " + "members. Largest valid index is 0.")); +} + TEST_F(ValidateDecorations, ValidateGroupDecorateRegistration) { std::string spirv = R"( OpCapability Shader @@ -124,6 +148,44 @@ TEST_F(ValidateDecorations, ValidateGroupDecorateRegistration) { EXPECT_THAT(vstate_->id_decorations(4), Eq(expected_decorations)); } +TEST_F(ValidateDecorations, WebGPUOpDecorationGroupBad) { + std::string spirv = R"( + OpCapability Shader + OpCapability VulkanMemoryModelKHR + OpExtension "SPV_KHR_vulkan_memory_model" + OpMemoryModel Logical VulkanKHR + OpDecorate %1 DescriptorSet 0 + OpDecorate %1 NonWritable + OpDecorate %1 Restrict + %1 = OpDecorationGroup + OpGroupDecorate %1 %2 %3 + OpGroupDecorate %1 %4 + %float = OpTypeFloat 32 +%_runtimearr_float = OpTypeRuntimeArray %float + %_struct_9 = OpTypeStruct %_runtimearr_float +%_ptr_Uniform__struct_9 = OpTypePointer Uniform %_struct_9 + %2 = OpVariable %_ptr_Uniform__struct_9 Uniform + %_struct_10 = OpTypeStruct %_runtimearr_float +%_ptr_Uniform__struct_10 = OpTypePointer Uniform %_struct_10 + %3 = OpVariable %_ptr_Uniform__struct_10 Uniform + %_struct_11 = OpTypeStruct %_runtimearr_float +%_ptr_Uniform__struct_11 = OpTypePointer Uniform %_struct_11 + %4 = OpVariable %_ptr_Uniform__struct_11 Uniform + )"; + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_ERROR_INVALID_BINARY, ValidateInstructions(SPV_ENV_WEBGPU_0)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("OpDecorationGroup is not allowed in the WebGPU " + "execution environment.\n %1 = OpDecorationGroup\n")); +} + +// For WebGPU, OpGroupDecorate does not have a test case, because it requires +// being preceded by OpDecorationGroup, which will cause a validation error. + +// For WebGPU, OpGroupMemberDecorate does not have a test case, because it +// requires being preceded by OpDecorationGroup, which will cause a validation +// error. + TEST_F(ValidateDecorations, ValidateGroupMemberDecorateRegistration) { std::string spirv = R"( OpCapability Shader @@ -238,10 +300,11 @@ TEST_F(ValidateDecorations, StructContainsBuiltInStructBad) { CompileSuccessfully(spirv); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateAndRetrieveValidationState()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("Structure 1 contains members with BuiltIn " - "decoration. Therefore this structure may not be " - "contained as a member of another structure type. " - "Structure 4 contains structure 1.")); + HasSubstr("Structure 1[%_struct_1] contains members with " + "BuiltIn decoration. Therefore this structure may not " + "be contained as a member of another structure type. " + "Structure 4[%_struct_4] contains structure " + "1[%_struct_1].")); } TEST_F(ValidateDecorations, StructContainsNonBuiltInStructGood) { @@ -263,6 +326,8 @@ TEST_F(ValidateDecorations, MultipleBuiltInObjectsConsumedByOpEntryPointBad) { OpCapability Geometry OpMemoryModel Logical GLSL450 OpEntryPoint Geometry %main "main" %in_1 %in_2 + OpExecutionMode %main InputPoints + OpExecutionMode %main OutputPoints OpMemberDecorate %struct_1 0 BuiltIn InvocationId OpMemberDecorate %struct_2 0 BuiltIn Position %int = OpTypeInt 32 1 @@ -295,6 +360,8 @@ TEST_F(ValidateDecorations, OpCapability Geometry OpMemoryModel Logical GLSL450 OpEntryPoint Geometry %main "main" %in_1 %out_1 + OpExecutionMode %main InputPoints + OpExecutionMode %main OutputPoints OpMemberDecorate %struct_1 0 BuiltIn InvocationId OpMemberDecorate %struct_2 0 BuiltIn Position %int = OpTypeInt 32 1 @@ -322,6 +389,8 @@ TEST_F(ValidateDecorations, NoBuiltInObjectsConsumedByOpEntryPointGood) { OpCapability Geometry OpMemoryModel Logical GLSL450 OpEntryPoint Geometry %main "main" %in_1 %out_1 + OpExecutionMode %main InputPoints + OpExecutionMode %main OutputPoints %int = OpTypeInt 32 1 %void = OpTypeVoid %func = OpTypeFunction %void @@ -591,12 +660,12 @@ TEST_F(ValidateDecorations, RuntimeArrayOfDescriptorSetsIsAllowed) { %10 = OpTypeImage %float 2D 0 0 0 1 Unknown %11 = OpTypeSampledImage %10 %_runtimearr_11 = OpTypeRuntimeArray %11 -%_ptr_UniformConstant__runtimearr_11 = OpTypePointer UniformConstant %_runtimearr_11 - %s2d = OpVariable %_ptr_UniformConstant__runtimearr_11 UniformConstant +%_ptr_Uniform__runtimearr_11 = OpTypePointer Uniform %_runtimearr_11 + %s2d = OpVariable %_ptr_Uniform__runtimearr_11 Uniform %int = OpTypeInt 32 1 %_ptr_Input_int = OpTypePointer Input %int %i = OpVariable %_ptr_Input_int Input -%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11 +%_ptr_Uniform_11 = OpTypePointer Uniform %11 %v2float = OpTypeVector %float 2 %float_0_300000012 = OpConstant %float 0.300000012 %24 = OpConstantComposite %v2float %float_0_300000012 %float_0_300000012 @@ -605,7 +674,7 @@ TEST_F(ValidateDecorations, RuntimeArrayOfDescriptorSetsIsAllowed) { %5 = OpLabel %v = OpVariable %_ptr_Function_v4float Function %18 = OpLoad %int %i - %20 = OpAccessChain %_ptr_UniformConstant_11 %s2d %18 + %20 = OpAccessChain %_ptr_Uniform_11 %s2d %18 %21 = OpLoad %11 %20 %26 = OpImageSampleExplicitLod %v4float %21 %24 Lod %float_0 OpStore %v %26 @@ -616,119 +685,6 @@ TEST_F(ValidateDecorations, RuntimeArrayOfDescriptorSetsIsAllowed) { EXPECT_EQ(SPV_SUCCESS, ValidateAndRetrieveValidationState()); } -// #version 440 -// #extension GL_EXT_nonuniform_qualifier : enable -// layout(binding = 1) uniform sampler2D s2d[][2]; -// layout(location = 0) in nonuniformEXT int i; -// void main() -// { -// vec4 v = texture(s2d[i][i], vec2(0.3)); -// } -TEST_F(ValidateDecorations, RuntimeArrayOfArraysOfDescriptorSetsIsDisallowed) { - const spv_target_env env = SPV_ENV_VULKAN_1_0; - std::string spirv = R"( - OpCapability Shader - OpCapability ShaderNonUniformEXT - OpCapability RuntimeDescriptorArrayEXT - OpCapability SampledImageArrayNonUniformIndexingEXT - OpExtension "SPV_EXT_descriptor_indexing" - %1 = OpExtInstImport "GLSL.std.450" - OpMemoryModel Logical GLSL450 - OpEntryPoint Vertex %main "main" %i - OpSource GLSL 440 - OpSourceExtension "GL_EXT_nonuniform_qualifier" - OpName %main "main" - OpName %v "v" - OpName %s2d "s2d" - OpName %i "i" - OpDecorate %s2d DescriptorSet 0 - OpDecorate %s2d Binding 1 - OpDecorate %i Location 0 - OpDecorate %i NonUniformEXT - OpDecorate %21 NonUniformEXT - OpDecorate %22 NonUniformEXT - OpDecorate %25 NonUniformEXT - %void = OpTypeVoid - %3 = OpTypeFunction %void - %float = OpTypeFloat 32 - %v4float = OpTypeVector %float 4 -%_ptr_Function_v4float = OpTypePointer Function %v4float - %10 = OpTypeImage %float 2D 0 0 0 1 Unknown - %11 = OpTypeSampledImage %10 - %uint = OpTypeInt 32 0 - %uint_2 = OpConstant %uint 2 -%_arr_11_uint_2 = OpTypeArray %11 %uint_2 -%_runtimearr__arr_11_uint_2 = OpTypeRuntimeArray %_arr_11_uint_2 -%_ptr_UniformConstant__runtimearr__arr_11_uint_2 = OpTypePointer UniformConstant %_runtimearr__arr_11_uint_2 - %s2d = OpVariable %_ptr_UniformConstant__runtimearr__arr_11_uint_2 UniformConstant - %int = OpTypeInt 32 1 -%_ptr_Input_int = OpTypePointer Input %int - %i = OpVariable %_ptr_Input_int Input -%_ptr_UniformConstant_11 = OpTypePointer UniformConstant %11 - %v2float = OpTypeVector %float 2 -%float_0_300000012 = OpConstant %float 0.300000012 - %28 = OpConstantComposite %v2float %float_0_300000012 %float_0_300000012 - %float_0 = OpConstant %float 0 - %main = OpFunction %void None %3 - %5 = OpLabel - %v = OpVariable %_ptr_Function_v4float Function - %21 = OpLoad %int %i - %22 = OpLoad %int %i - %24 = OpAccessChain %_ptr_UniformConstant_11 %s2d %21 %22 - %25 = OpLoad %11 %24 - %30 = OpImageSampleExplicitLod %v4float %25 %28 Lod %float_0 - OpStore %v %30 - OpReturn - OpFunctionEnd -)"; - CompileSuccessfully(spirv, env); - - EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateAndRetrieveValidationState(env)); - EXPECT_THAT(getDiagnosticString(), - HasSubstr("Only a single level of array is allowed for " - "descriptor set variables")); -} - -// #version 440 -// layout (set=1, binding=1) uniform sampler2D variableName[2][2]; -// void main() { -// } -TEST_F(ValidateDecorations, ArrayOfArraysOfDescriptorSetsIsDisallowed) { - const spv_target_env env = SPV_ENV_VULKAN_1_0; - std::string spirv = R"( - OpCapability Shader - %1 = OpExtInstImport "GLSL.std.450" - OpMemoryModel Logical GLSL450 - OpEntryPoint Vertex %main "main" - OpSource GLSL 440 - OpName %main "main" - OpName %variableName "variableName" - OpDecorate %variableName DescriptorSet 1 - OpDecorate %variableName Binding 1 - %void = OpTypeVoid - %3 = OpTypeFunction %void - %float = OpTypeFloat 32 - %7 = OpTypeImage %float 2D 0 0 0 1 Unknown - %8 = OpTypeSampledImage %7 - %uint = OpTypeInt 32 0 - %uint_2 = OpConstant %uint 2 -%_arr_8_uint_2 = OpTypeArray %8 %uint_2 -%_arr__arr_8_uint_2_uint_2 = OpTypeArray %_arr_8_uint_2 %uint_2 -%_ptr_UniformConstant__arr__arr_8_uint_2_uint_2 = OpTypePointer UniformConstant %_arr__arr_8_uint_2_uint_2 -%variableName = OpVariable %_ptr_UniformConstant__arr__arr_8_uint_2_uint_2 UniformConstant - %main = OpFunction %void None %3 - %5 = OpLabel - OpReturn - OpFunctionEnd -)"; - CompileSuccessfully(spirv, env); - - EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateAndRetrieveValidationState(env)); - EXPECT_THAT(getDiagnosticString(), - HasSubstr("Only a single level of array is allowed for " - "descriptor set variables")); -} - TEST_F(ValidateDecorations, BlockMissingOffsetBad) { std::string spirv = R"( OpCapability Shader @@ -1642,7 +1598,7 @@ TEST_F(ValidateDecorations, getDiagnosticString(), HasSubstr( "Structure id 2 decorated as Block for variable in Uniform storage " - "class must follow standard uniform buffer layout rules: member 1 at " + "class must follow relaxed uniform buffer layout rules: member 1 at " "offset 5 is not aligned to scalar element size 4")); } @@ -1679,6 +1635,263 @@ TEST_F(ValidateDecorations, EXPECT_THAT(getDiagnosticString(), Eq("")); } +TEST_F(ValidateDecorations, + BlockLayoutPermitsTightScalarVec3PackingWithScalarLayoutGood) { + // Same as previous test, but with scalar block layout. + std::string spirv = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Vertex %main "main" + OpSource GLSL 450 + OpMemberDecorate %S 0 Offset 0 + OpMemberDecorate %S 1 Offset 4 + OpDecorate %S Block + OpDecorate %B DescriptorSet 0 + OpDecorate %B Binding 0 + %void = OpTypeVoid + %3 = OpTypeFunction %void + %float = OpTypeFloat 32 + %v3float = OpTypeVector %float 3 + %S = OpTypeStruct %float %v3float +%_ptr_Uniform_S = OpTypePointer Uniform %S + %B = OpVariable %_ptr_Uniform_S Uniform + %main = OpFunction %void None %3 + %5 = OpLabel + OpReturn + OpFunctionEnd + )"; + + CompileSuccessfully(spirv); + spvValidatorOptionsSetScalarBlockLayout(getValidatorOptions(), true); + EXPECT_EQ(SPV_SUCCESS, + ValidateAndRetrieveValidationState(SPV_ENV_VULKAN_1_0)); + EXPECT_THAT(getDiagnosticString(), Eq("")); +} + +TEST_F(ValidateDecorations, + BlockLayoutPermitsScalarAlignedArrayWithScalarLayoutGood) { + // The array at offset 4 is ok with scalar block layout. + std::string spirv = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Vertex %main "main" + OpSource GLSL 450 + OpMemberDecorate %S 0 Offset 0 + OpMemberDecorate %S 1 Offset 4 + OpDecorate %S Block + OpDecorate %B DescriptorSet 0 + OpDecorate %B Binding 0 + OpDecorate %arr_float ArrayStride 4 + %void = OpTypeVoid + %3 = OpTypeFunction %void + %uint = OpTypeInt 32 0 + %uint_3 = OpConstant %uint 3 + %float = OpTypeFloat 32 + %arr_float = OpTypeArray %float %uint_3 + %S = OpTypeStruct %float %arr_float +%_ptr_Uniform_S = OpTypePointer Uniform %S + %B = OpVariable %_ptr_Uniform_S Uniform + %main = OpFunction %void None %3 + %5 = OpLabel + OpReturn + OpFunctionEnd + )"; + + CompileSuccessfully(spirv); + spvValidatorOptionsSetScalarBlockLayout(getValidatorOptions(), true); + EXPECT_EQ(SPV_SUCCESS, + ValidateAndRetrieveValidationState(SPV_ENV_VULKAN_1_0)); + EXPECT_THAT(getDiagnosticString(), Eq("")); +} + +TEST_F(ValidateDecorations, + BlockLayoutPermitsScalarAlignedArrayOfVec3WithScalarLayoutGood) { + // The array at offset 4 is ok with scalar block layout, even though + // its elements are vec3. + // This is the same as the previous case, but the array elements are vec3 + // instead of float. + std::string spirv = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Vertex %main "main" + OpSource GLSL 450 + OpMemberDecorate %S 0 Offset 0 + OpMemberDecorate %S 1 Offset 4 + OpDecorate %S Block + OpDecorate %B DescriptorSet 0 + OpDecorate %B Binding 0 + OpDecorate %arr_vec3 ArrayStride 12 + %void = OpTypeVoid + %3 = OpTypeFunction %void + %uint = OpTypeInt 32 0 + %uint_3 = OpConstant %uint 3 + %float = OpTypeFloat 32 + %vec3 = OpTypeVector %float 3 + %arr_vec3 = OpTypeArray %vec3 %uint_3 + %S = OpTypeStruct %float %arr_vec3 +%_ptr_Uniform_S = OpTypePointer Uniform %S + %B = OpVariable %_ptr_Uniform_S Uniform + %main = OpFunction %void None %3 + %5 = OpLabel + OpReturn + OpFunctionEnd + )"; + + CompileSuccessfully(spirv); + spvValidatorOptionsSetScalarBlockLayout(getValidatorOptions(), true); + EXPECT_EQ(SPV_SUCCESS, + ValidateAndRetrieveValidationState(SPV_ENV_VULKAN_1_0)); + EXPECT_THAT(getDiagnosticString(), Eq("")); +} + +TEST_F(ValidateDecorations, + BlockLayoutPermitsScalarAlignedStructWithScalarLayoutGood) { + // Scalar block layout permits the struct at offset 4, even though + // it contains a vector with base alignment 8 and scalar alignment 4. + std::string spirv = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Vertex %main "main" + OpSource GLSL 450 + OpMemberDecorate %S 0 Offset 0 + OpMemberDecorate %S 1 Offset 4 + OpMemberDecorate %st 0 Offset 0 + OpMemberDecorate %st 1 Offset 8 + OpDecorate %S Block + OpDecorate %B DescriptorSet 0 + OpDecorate %B Binding 0 + %void = OpTypeVoid + %3 = OpTypeFunction %void + %float = OpTypeFloat 32 + %vec2 = OpTypeVector %float 2 + %st = OpTypeStruct %vec2 %float + %S = OpTypeStruct %float %st +%_ptr_Uniform_S = OpTypePointer Uniform %S + %B = OpVariable %_ptr_Uniform_S Uniform + %main = OpFunction %void None %3 + %5 = OpLabel + OpReturn + OpFunctionEnd + )"; + + CompileSuccessfully(spirv); + spvValidatorOptionsSetScalarBlockLayout(getValidatorOptions(), true); + EXPECT_EQ(SPV_SUCCESS, + ValidateAndRetrieveValidationState(SPV_ENV_VULKAN_1_0)); + EXPECT_THAT(getDiagnosticString(), Eq("")); +} + +TEST_F( + ValidateDecorations, + BlockLayoutPermitsFieldsInBaseAlignmentPaddingAtEndOfStructWithScalarLayoutGood) { + // Scalar block layout permits fields in what would normally be the padding at + // the end of a struct. + std::string spirv = R"( + OpCapability Shader + OpCapability Float64 + OpMemoryModel Logical GLSL450 + OpEntryPoint Vertex %main "main" + OpSource GLSL 450 + OpMemberDecorate %st 0 Offset 0 + OpMemberDecorate %st 1 Offset 8 + OpMemberDecorate %S 0 Offset 0 + OpMemberDecorate %S 1 Offset 12 + OpDecorate %S Block + OpDecorate %B DescriptorSet 0 + OpDecorate %B Binding 0 + %void = OpTypeVoid + %3 = OpTypeFunction %void + %float = OpTypeFloat 32 + %double = OpTypeFloat 64 + %st = OpTypeStruct %double %float + %S = OpTypeStruct %st %float +%_ptr_Uniform_S = OpTypePointer Uniform %S + %B = OpVariable %_ptr_Uniform_S Uniform + %main = OpFunction %void None %3 + %5 = OpLabel + OpReturn + OpFunctionEnd + )"; + + CompileSuccessfully(spirv); + spvValidatorOptionsSetScalarBlockLayout(getValidatorOptions(), true); + EXPECT_EQ(SPV_SUCCESS, + ValidateAndRetrieveValidationState(SPV_ENV_VULKAN_1_0)); + EXPECT_THAT(getDiagnosticString(), Eq("")); +} + +TEST_F( + ValidateDecorations, + BlockLayoutPermitsStraddlingVectorWithScalarLayoutOverrideRelaxBlockLayoutGood) { + // Same as previous, but set relaxed block layout first. Scalar layout always + // wins. + std::string spirv = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Vertex %main "main" + OpSource GLSL 450 + OpMemberDecorate %S 0 Offset 0 + OpMemberDecorate %S 1 Offset 4 + OpDecorate %S Block + OpDecorate %B DescriptorSet 0 + OpDecorate %B Binding 0 + %void = OpTypeVoid + %3 = OpTypeFunction %void + %float = OpTypeFloat 32 + %vec4 = OpTypeVector %float 4 + %S = OpTypeStruct %float %vec4 +%_ptr_Uniform_S = OpTypePointer Uniform %S + %B = OpVariable %_ptr_Uniform_S Uniform + %main = OpFunction %void None %3 + %5 = OpLabel + OpReturn + OpFunctionEnd + )"; + + CompileSuccessfully(spirv); + spvValidatorOptionsSetRelaxBlockLayout(getValidatorOptions(), true); + spvValidatorOptionsSetScalarBlockLayout(getValidatorOptions(), true); + EXPECT_EQ(SPV_SUCCESS, + ValidateAndRetrieveValidationState(SPV_ENV_VULKAN_1_0)); + EXPECT_THAT(getDiagnosticString(), Eq("")); +} + +TEST_F( + ValidateDecorations, + BlockLayoutPermitsStraddlingVectorWithRelaxedLayoutOverridenByScalarBlockLayoutGood) { + // Same as previous, but set scalar block layout first. Scalar layout always + // wins. + std::string spirv = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Vertex %main "main" + OpSource GLSL 450 + OpMemberDecorate %S 0 Offset 0 + OpMemberDecorate %S 1 Offset 4 + OpDecorate %S Block + OpDecorate %B DescriptorSet 0 + OpDecorate %B Binding 0 + %void = OpTypeVoid + %3 = OpTypeFunction %void + %float = OpTypeFloat 32 + %vec4 = OpTypeVector %float 4 + %S = OpTypeStruct %float %vec4 +%_ptr_Uniform_S = OpTypePointer Uniform %S + %B = OpVariable %_ptr_Uniform_S Uniform + %main = OpFunction %void None %3 + %5 = OpLabel + OpReturn + OpFunctionEnd + )"; + + CompileSuccessfully(spirv); + spvValidatorOptionsSetScalarBlockLayout(getValidatorOptions(), true); + spvValidatorOptionsSetRelaxBlockLayout(getValidatorOptions(), true); + EXPECT_EQ(SPV_SUCCESS, + ValidateAndRetrieveValidationState(SPV_ENV_VULKAN_1_0)); + EXPECT_THAT(getDiagnosticString(), Eq("")); +} + TEST_F(ValidateDecorations, BufferBlock16bitStandardStorageBufferLayout) { std::string spirv = R"( OpCapability Shader @@ -1800,6 +2013,8 @@ TEST_F(ValidateDecorations, BlockArrayBadAlignmentWithRelaxedLayoutStillBad) { OpEntryPoint Vertex %main "main" OpSource GLSL 450 OpDecorate %_arr_float_uint_2 ArrayStride 16 + OpDecorate %u DescriptorSet 0 + OpDecorate %u Binding 0 OpMemberDecorate %S 0 Offset 0 OpMemberDecorate %S 1 Offset 8 OpDecorate %S Block @@ -1826,7 +2041,7 @@ TEST_F(ValidateDecorations, BlockArrayBadAlignmentWithRelaxedLayoutStillBad) { EXPECT_THAT( getDiagnosticString(), HasSubstr( - "Structure id 3 decorated as Block for variable in Uniform " + "Structure id 4 decorated as Block for variable in Uniform " "storage class must follow standard uniform buffer layout rules: " "member 1 at offset 8 is not aligned to 16")); } @@ -1840,6 +2055,8 @@ TEST_F(ValidateDecorations, BlockArrayBadAlignmentWithVulkan1_1StillBad) { OpEntryPoint Vertex %main "main" OpSource GLSL 450 OpDecorate %_arr_float_uint_2 ArrayStride 16 + OpDecorate %u DescriptorSet 0 + OpDecorate %u Binding 0 OpMemberDecorate %S 0 Offset 0 OpMemberDecorate %S 1 Offset 8 OpDecorate %S Block @@ -1865,8 +2082,8 @@ TEST_F(ValidateDecorations, BlockArrayBadAlignmentWithVulkan1_1StillBad) { EXPECT_THAT( getDiagnosticString(), HasSubstr( - "Structure id 3 decorated as Block for variable in Uniform " - "storage class must follow standard uniform buffer layout rules: " + "Structure id 4 decorated as Block for variable in Uniform " + "storage class must follow relaxed uniform buffer layout rules: " "member 1 at offset 8 is not aligned to 16")); } @@ -2007,6 +2224,797 @@ TEST_F(ValidateDecorations, "rules: member 1 at offset 4 is not aligned to 16")); } +TEST_F(ValidateDecorations, PushConstantMissingBlockGood) { + std::string spirv = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %1 "main" + OpExecutionMode %1 OriginUpperLeft + + OpMemberDecorate %struct 0 Offset 0 + + %void = OpTypeVoid + %voidfn = OpTypeFunction %void + %float = OpTypeFloat 32 + %struct = OpTypeStruct %float + %ptr = OpTypePointer PushConstant %struct + %pc = OpVariable %ptr PushConstant + + %1 = OpFunction %void None %voidfn + %label = OpLabel + OpReturn + OpFunctionEnd +)"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_SUCCESS, ValidateAndRetrieveValidationState()) + << getDiagnosticString(); +} + +TEST_F(ValidateDecorations, VulkanPushConstantMissingBlockBad) { + std::string spirv = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %1 "main" + OpExecutionMode %1 OriginUpperLeft + + OpMemberDecorate %struct 0 Offset 0 + + %void = OpTypeVoid + %voidfn = OpTypeFunction %void + %float = OpTypeFloat 32 + %struct = OpTypeStruct %float + %ptr = OpTypePointer PushConstant %struct + %pc = OpVariable %ptr PushConstant + + %1 = OpFunction %void None %voidfn + %label = OpLabel + OpReturn + OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_VULKAN_1_1); + EXPECT_EQ(SPV_ERROR_INVALID_ID, + ValidateAndRetrieveValidationState(SPV_ENV_VULKAN_1_1)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("PushConstant id '2' is missing Block decoration.\n" + "From Vulkan spec, section 14.5.1:\n" + "Such variables must be identified with a Block " + "decoration")); +} + +TEST_F(ValidateDecorations, MultiplePushConstantsSingleEntryPointGood) { + std::string spirv = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %1 "main" + OpExecutionMode %1 OriginUpperLeft + + OpDecorate %struct Block + OpMemberDecorate %struct 0 Offset 0 + + %void = OpTypeVoid + %voidfn = OpTypeFunction %void + %float = OpTypeFloat 32 + %int = OpTypeInt 32 0 + %int_0 = OpConstant %int 0 + %struct = OpTypeStruct %float + %ptr = OpTypePointer PushConstant %struct + %ptr_float = OpTypePointer PushConstant %float + %pc1 = OpVariable %ptr PushConstant + %pc2 = OpVariable %ptr PushConstant + + %1 = OpFunction %void None %voidfn + %label = OpLabel + %2 = OpAccessChain %ptr_float %pc1 %int_0 + %3 = OpLoad %float %2 + %4 = OpAccessChain %ptr_float %pc2 %int_0 + %5 = OpLoad %float %4 + OpReturn + OpFunctionEnd +)"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_SUCCESS, ValidateAndRetrieveValidationState()) + << getDiagnosticString(); +} + +TEST_F(ValidateDecorations, + VulkanMultiplePushConstantsDifferentEntryPointGood) { + std::string spirv = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Vertex %1 "func1" + OpEntryPoint Fragment %2 "func2" + OpExecutionMode %2 OriginUpperLeft + + OpDecorate %struct Block + OpMemberDecorate %struct 0 Offset 0 + + %void = OpTypeVoid + %voidfn = OpTypeFunction %void + %float = OpTypeFloat 32 + %int = OpTypeInt 32 0 + %int_0 = OpConstant %int 0 + %struct = OpTypeStruct %float + %ptr = OpTypePointer PushConstant %struct + %ptr_float = OpTypePointer PushConstant %float + %pc1 = OpVariable %ptr PushConstant + %pc2 = OpVariable %ptr PushConstant + + %1 = OpFunction %void None %voidfn + %label1 = OpLabel + %3 = OpAccessChain %ptr_float %pc1 %int_0 + %4 = OpLoad %float %3 + OpReturn + OpFunctionEnd + + %2 = OpFunction %void None %voidfn + %label2 = OpLabel + %5 = OpAccessChain %ptr_float %pc2 %int_0 + %6 = OpLoad %float %5 + OpReturn + OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_VULKAN_1_1); + EXPECT_EQ(SPV_SUCCESS, ValidateAndRetrieveValidationState(SPV_ENV_VULKAN_1_1)) + << getDiagnosticString(); +} + +TEST_F(ValidateDecorations, + VulkanMultiplePushConstantsUnusedSingleEntryPointGood) { + std::string spirv = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %1 "main" + OpExecutionMode %1 OriginUpperLeft + + OpDecorate %struct Block + OpMemberDecorate %struct 0 Offset 0 + + %void = OpTypeVoid + %voidfn = OpTypeFunction %void + %float = OpTypeFloat 32 + %int = OpTypeInt 32 0 + %int_0 = OpConstant %int 0 + %struct = OpTypeStruct %float + %ptr = OpTypePointer PushConstant %struct + %ptr_float = OpTypePointer PushConstant %float + %pc1 = OpVariable %ptr PushConstant + %pc2 = OpVariable %ptr PushConstant + + %1 = OpFunction %void None %voidfn + %label = OpLabel + OpReturn + OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_VULKAN_1_1); + EXPECT_EQ(SPV_SUCCESS, ValidateAndRetrieveValidationState(SPV_ENV_VULKAN_1_1)) + << getDiagnosticString(); +} + +TEST_F(ValidateDecorations, VulkanMultiplePushConstantsSingleEntryPointBad) { + std::string spirv = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %1 "main" + OpExecutionMode %1 OriginUpperLeft + + OpDecorate %struct Block + OpMemberDecorate %struct 0 Offset 0 + + %void = OpTypeVoid + %voidfn = OpTypeFunction %void + %float = OpTypeFloat 32 + %int = OpTypeInt 32 0 + %int_0 = OpConstant %int 0 + %struct = OpTypeStruct %float + %ptr = OpTypePointer PushConstant %struct + %ptr_float = OpTypePointer PushConstant %float + %pc1 = OpVariable %ptr PushConstant + %pc2 = OpVariable %ptr PushConstant + + %1 = OpFunction %void None %voidfn + %label = OpLabel + %2 = OpAccessChain %ptr_float %pc1 %int_0 + %3 = OpLoad %float %2 + %4 = OpAccessChain %ptr_float %pc2 %int_0 + %5 = OpLoad %float %4 + OpReturn + OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_VULKAN_1_1); + EXPECT_EQ(SPV_ERROR_INVALID_ID, + ValidateAndRetrieveValidationState(SPV_ENV_VULKAN_1_1)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr( + "Entry point id '1' uses more than one PushConstant interface.\n" + "From Vulkan spec, section 14.5.1:\n" + "There must be no more than one push constant block " + "statically used per shader entry point.")); +} + +TEST_F(ValidateDecorations, + VulkanMultiplePushConstantsDifferentEntryPointSubFunctionGood) { + std::string spirv = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Vertex %1 "func1" + OpEntryPoint Fragment %2 "func2" + OpExecutionMode %2 OriginUpperLeft + + OpDecorate %struct Block + OpMemberDecorate %struct 0 Offset 0 + + %void = OpTypeVoid + %voidfn = OpTypeFunction %void + %float = OpTypeFloat 32 + %int = OpTypeInt 32 0 + %int_0 = OpConstant %int 0 + %struct = OpTypeStruct %float + %ptr = OpTypePointer PushConstant %struct + %ptr_float = OpTypePointer PushConstant %float + %pc1 = OpVariable %ptr PushConstant + %pc2 = OpVariable %ptr PushConstant + + %sub1 = OpFunction %void None %voidfn + %label_sub1 = OpLabel + %3 = OpAccessChain %ptr_float %pc1 %int_0 + %4 = OpLoad %float %3 + OpReturn + OpFunctionEnd + + %sub2 = OpFunction %void None %voidfn + %label_sub2 = OpLabel + %5 = OpAccessChain %ptr_float %pc2 %int_0 + %6 = OpLoad %float %5 + OpReturn + OpFunctionEnd + + %1 = OpFunction %void None %voidfn + %label1 = OpLabel + %call1 = OpFunctionCall %void %sub1 + OpReturn + OpFunctionEnd + + %2 = OpFunction %void None %voidfn + %label2 = OpLabel + %call2 = OpFunctionCall %void %sub2 + OpReturn + OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_VULKAN_1_1); + EXPECT_EQ(SPV_SUCCESS, ValidateAndRetrieveValidationState(SPV_ENV_VULKAN_1_1)) + << getDiagnosticString(); +} + +TEST_F(ValidateDecorations, + VulkanMultiplePushConstantsSingleEntryPointSubFunctionBad) { + std::string spirv = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %1 "main" + OpExecutionMode %1 OriginUpperLeft + + OpDecorate %struct Block + OpMemberDecorate %struct 0 Offset 0 + + %void = OpTypeVoid + %voidfn = OpTypeFunction %void + %float = OpTypeFloat 32 + %int = OpTypeInt 32 0 + %int_0 = OpConstant %int 0 + %struct = OpTypeStruct %float + %ptr = OpTypePointer PushConstant %struct + %ptr_float = OpTypePointer PushConstant %float + %pc1 = OpVariable %ptr PushConstant + %pc2 = OpVariable %ptr PushConstant + + %sub1 = OpFunction %void None %voidfn + %label_sub1 = OpLabel + %3 = OpAccessChain %ptr_float %pc1 %int_0 + %4 = OpLoad %float %3 + OpReturn + OpFunctionEnd + + %sub2 = OpFunction %void None %voidfn + %label_sub2 = OpLabel + %5 = OpAccessChain %ptr_float %pc2 %int_0 + %6 = OpLoad %float %5 + OpReturn + OpFunctionEnd + + %1 = OpFunction %void None %voidfn + %label1 = OpLabel + %call1 = OpFunctionCall %void %sub1 + %call2 = OpFunctionCall %void %sub2 + OpReturn + OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_VULKAN_1_1); + EXPECT_EQ(SPV_ERROR_INVALID_ID, + ValidateAndRetrieveValidationState(SPV_ENV_VULKAN_1_1)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr( + "Entry point id '1' uses more than one PushConstant interface.\n" + "From Vulkan spec, section 14.5.1:\n" + "There must be no more than one push constant block " + "statically used per shader entry point.")); +} + +TEST_F(ValidateDecorations, VulkanUniformMissingDescriptorSetBad) { + std::string spirv = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %1 "main" + OpExecutionMode %1 OriginUpperLeft + + OpDecorate %struct Block + OpMemberDecorate %struct 0 Offset 0 + OpDecorate %var Binding 0 + + %void = OpTypeVoid + %voidfn = OpTypeFunction %void + %float = OpTypeFloat 32 + %struct = OpTypeStruct %float + %ptr = OpTypePointer Uniform %struct +%ptr_float = OpTypePointer Uniform %float + %var = OpVariable %ptr Uniform + %int = OpTypeInt 32 0 + %int_0 = OpConstant %int 0 + + %1 = OpFunction %void None %voidfn + %label = OpLabel + %2 = OpAccessChain %ptr_float %var %int_0 + %3 = OpLoad %float %2 + OpReturn + OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_VULKAN_1_1); + EXPECT_EQ(SPV_ERROR_INVALID_ID, + ValidateAndRetrieveValidationState(SPV_ENV_VULKAN_1_1)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Uniform id '3' is missing DescriptorSet decoration.\n" + "From Vulkan spec, section 14.5.2:\n" + "These variables must have DescriptorSet and Binding " + "decorations specified")); +} + +TEST_F(ValidateDecorations, VulkanUniformMissingBindingBad) { + std::string spirv = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %1 "main" + OpExecutionMode %1 OriginUpperLeft + + OpDecorate %struct Block + OpMemberDecorate %struct 0 Offset 0 + OpDecorate %var DescriptorSet 0 + + %void = OpTypeVoid + %voidfn = OpTypeFunction %void + %float = OpTypeFloat 32 + %struct = OpTypeStruct %float + %ptr = OpTypePointer Uniform %struct +%ptr_float = OpTypePointer Uniform %float + %var = OpVariable %ptr Uniform + %int = OpTypeInt 32 0 + %int_0 = OpConstant %int 0 + + %1 = OpFunction %void None %voidfn + %label = OpLabel + %2 = OpAccessChain %ptr_float %var %int_0 + %3 = OpLoad %float %2 + OpReturn + OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_VULKAN_1_1); + EXPECT_EQ(SPV_ERROR_INVALID_ID, + ValidateAndRetrieveValidationState(SPV_ENV_VULKAN_1_1)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Uniform id '3' is missing Binding decoration.\n" + "From Vulkan spec, section 14.5.2:\n" + "These variables must have DescriptorSet and Binding " + "decorations specified")); +} + +TEST_F(ValidateDecorations, VulkanUniformConstantMissingDescriptorSetBad) { + std::string spirv = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %1 "main" + OpExecutionMode %1 OriginUpperLeft + + OpDecorate %var Binding 0 + + %void = OpTypeVoid + %voidfn = OpTypeFunction %void + %sampler = OpTypeSampler + %ptr = OpTypePointer UniformConstant %sampler + %var = OpVariable %ptr UniformConstant + + %1 = OpFunction %void None %voidfn + %label = OpLabel + %2 = OpLoad %sampler %var + OpReturn + OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_VULKAN_1_1); + EXPECT_EQ(SPV_ERROR_INVALID_ID, + ValidateAndRetrieveValidationState(SPV_ENV_VULKAN_1_1)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("UniformConstant id '2' is missing DescriptorSet decoration.\n" + "From Vulkan spec, section 14.5.2:\n" + "These variables must have DescriptorSet and Binding " + "decorations specified")); +} + +TEST_F(ValidateDecorations, VulkanUniformConstantMissingBindingBad) { + std::string spirv = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %1 "main" + OpExecutionMode %1 OriginUpperLeft + + OpDecorate %var DescriptorSet 0 + + %void = OpTypeVoid + %voidfn = OpTypeFunction %void + %sampler = OpTypeSampler + %ptr = OpTypePointer UniformConstant %sampler + %var = OpVariable %ptr UniformConstant + + %1 = OpFunction %void None %voidfn + %label = OpLabel + %2 = OpLoad %sampler %var + OpReturn + OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_VULKAN_1_1); + EXPECT_EQ(SPV_ERROR_INVALID_ID, + ValidateAndRetrieveValidationState(SPV_ENV_VULKAN_1_1)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("UniformConstant id '2' is missing Binding decoration.\n" + "From Vulkan spec, section 14.5.2:\n" + "These variables must have DescriptorSet and Binding " + "decorations specified")); +} + +TEST_F(ValidateDecorations, VulkanStorageBufferMissingDescriptorSetBad) { + std::string spirv = R"( + OpCapability Shader + OpExtension "SPV_KHR_storage_buffer_storage_class" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %1 "main" + OpExecutionMode %1 OriginUpperLeft + + OpDecorate %struct Block + OpDecorate %var Binding 0 + + %void = OpTypeVoid + %voidfn = OpTypeFunction %void + %float = OpTypeFloat 32 + %struct = OpTypeStruct %float + %ptr = OpTypePointer StorageBuffer %struct + %var = OpVariable %ptr StorageBuffer +%ptr_float = OpTypePointer StorageBuffer %float + %int = OpTypeInt 32 0 + %int_0 = OpConstant %int 0 + + %1 = OpFunction %void None %voidfn + %label = OpLabel + %2 = OpAccessChain %ptr_float %var %int_0 + %3 = OpLoad %float %2 + OpReturn + OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_VULKAN_1_1); + EXPECT_EQ(SPV_ERROR_INVALID_ID, + ValidateAndRetrieveValidationState(SPV_ENV_VULKAN_1_1)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("StorageBuffer id '3' is missing DescriptorSet decoration.\n" + "From Vulkan spec, section 14.5.2:\n" + "These variables must have DescriptorSet and Binding " + "decorations specified")); +} + +TEST_F(ValidateDecorations, VulkanStorageBufferMissingBindingBad) { + std::string spirv = R"( + OpCapability Shader + OpExtension "SPV_KHR_storage_buffer_storage_class" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %1 "main" + OpExecutionMode %1 OriginUpperLeft + + OpDecorate %struct Block + OpDecorate %var DescriptorSet 0 + + %void = OpTypeVoid + %voidfn = OpTypeFunction %void + %float = OpTypeFloat 32 + %struct = OpTypeStruct %float + %ptr = OpTypePointer StorageBuffer %struct + %var = OpVariable %ptr StorageBuffer +%ptr_float = OpTypePointer StorageBuffer %float + %int = OpTypeInt 32 0 + %int_0 = OpConstant %int 0 + + %1 = OpFunction %void None %voidfn + %label = OpLabel + %2 = OpAccessChain %ptr_float %var %int_0 + %3 = OpLoad %float %2 + OpReturn + OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_VULKAN_1_1); + EXPECT_EQ(SPV_ERROR_INVALID_ID, + ValidateAndRetrieveValidationState(SPV_ENV_VULKAN_1_1)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("StorageBuffer id '3' is missing Binding decoration.\n" + "From Vulkan spec, section 14.5.2:\n" + "These variables must have DescriptorSet and Binding " + "decorations specified")); +} + +TEST_F(ValidateDecorations, + VulkanStorageBufferMissingDescriptorSetSubFunctionBad) { + std::string spirv = R"( + OpCapability Shader + OpExtension "SPV_KHR_storage_buffer_storage_class" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %1 "main" + OpExecutionMode %1 OriginUpperLeft + + OpDecorate %struct Block + OpDecorate %var Binding 0 + + %void = OpTypeVoid + %voidfn = OpTypeFunction %void + %float = OpTypeFloat 32 + %struct = OpTypeStruct %float + %ptr = OpTypePointer StorageBuffer %struct + %var = OpVariable %ptr StorageBuffer +%ptr_float = OpTypePointer StorageBuffer %float + %int = OpTypeInt 32 0 + %int_0 = OpConstant %int 0 + + %1 = OpFunction %void None %voidfn + %label = OpLabel + %call = OpFunctionCall %void %2 + OpReturn + OpFunctionEnd + %2 = OpFunction %void None %voidfn + %label2 = OpLabel + %3 = OpAccessChain %ptr_float %var %int_0 + %4 = OpLoad %float %3 + OpReturn + OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_VULKAN_1_1); + EXPECT_EQ(SPV_ERROR_INVALID_ID, + ValidateAndRetrieveValidationState(SPV_ENV_VULKAN_1_1)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("StorageBuffer id '3' is missing DescriptorSet decoration.\n" + "From Vulkan spec, section 14.5.2:\n" + "These variables must have DescriptorSet and Binding " + "decorations specified")); +} + +TEST_F(ValidateDecorations, + VulkanStorageBufferMissingDescriptorAndBindingUnusedGood) { + std::string spirv = R"( + OpCapability Shader + OpExtension "SPV_KHR_storage_buffer_storage_class" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %1 "main" + OpExecutionMode %1 OriginUpperLeft + + OpDecorate %struct BufferBlock + + %void = OpTypeVoid + %voidfn = OpTypeFunction %void + %float = OpTypeFloat 32 + %struct = OpTypeStruct %float + %ptr = OpTypePointer StorageBuffer %struct + %var = OpVariable %ptr StorageBuffer + + %1 = OpFunction %void None %voidfn + %label = OpLabel + OpReturn + OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_VULKAN_1_1); + EXPECT_EQ(SPV_SUCCESS, + ValidateAndRetrieveValidationState(SPV_ENV_VULKAN_1_1)); +} + +TEST_F(ValidateDecorations, UniformMissingDescriptorSetGood) { + std::string spirv = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %1 "main" + OpExecutionMode %1 OriginUpperLeft + + OpDecorate %struct Block + OpMemberDecorate %struct 0 Offset 0 + OpDecorate %var Binding 0 + + %void = OpTypeVoid + %voidfn = OpTypeFunction %void + %float = OpTypeFloat 32 + %struct = OpTypeStruct %float + %ptr = OpTypePointer Uniform %struct + %var = OpVariable %ptr Uniform + + %1 = OpFunction %void None %voidfn + %label = OpLabel + OpReturn + OpFunctionEnd +)"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_SUCCESS, ValidateAndRetrieveValidationState()) + << getDiagnosticString(); +} + +TEST_F(ValidateDecorations, UniformMissingBindingGood) { + std::string spirv = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %1 "main" + OpExecutionMode %1 OriginUpperLeft + + OpDecorate %struct Block + OpMemberDecorate %struct 0 Offset 0 + OpDecorate %var DescriptorSet 0 + + %void = OpTypeVoid + %voidfn = OpTypeFunction %void + %float = OpTypeFloat 32 + %struct = OpTypeStruct %float + %ptr = OpTypePointer Uniform %struct + %var = OpVariable %ptr Uniform + + %1 = OpFunction %void None %voidfn + %label = OpLabel + OpReturn + OpFunctionEnd +)"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_SUCCESS, ValidateAndRetrieveValidationState()) + << getDiagnosticString(); +} + +TEST_F(ValidateDecorations, UniformConstantMissingDescriptorSetGood) { + std::string spirv = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %1 "main" + OpExecutionMode %1 OriginUpperLeft + + OpDecorate %var Binding 0 + + %void = OpTypeVoid + %voidfn = OpTypeFunction %void + %sampler = OpTypeSampler + %ptr = OpTypePointer UniformConstant %sampler + %var = OpVariable %ptr UniformConstant + + %1 = OpFunction %void None %voidfn + %label = OpLabel + OpReturn + OpFunctionEnd +)"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_SUCCESS, ValidateAndRetrieveValidationState()) + << getDiagnosticString(); +} + +TEST_F(ValidateDecorations, UniformConstantMissingBindingGood) { + std::string spirv = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %1 "main" + OpExecutionMode %1 OriginUpperLeft + + OpDecorate %var DescriptorSet 0 + + %void = OpTypeVoid + %voidfn = OpTypeFunction %void + %sampler = OpTypeSampler + %ptr = OpTypePointer UniformConstant %sampler + %var = OpVariable %ptr UniformConstant + + %1 = OpFunction %void None %voidfn + %label = OpLabel + OpReturn + OpFunctionEnd +)"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_SUCCESS, ValidateAndRetrieveValidationState()) + << getDiagnosticString(); +} + +TEST_F(ValidateDecorations, StorageBufferMissingDescriptorSetGood) { + std::string spirv = R"( + OpCapability Shader + OpExtension "SPV_KHR_storage_buffer_storage_class" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %1 "main" + OpExecutionMode %1 OriginUpperLeft + + OpDecorate %struct BufferBlock + OpDecorate %var Binding 0 + + %void = OpTypeVoid + %voidfn = OpTypeFunction %void + %float = OpTypeFloat 32 + %struct = OpTypeStruct %float + %ptr = OpTypePointer StorageBuffer %struct + %var = OpVariable %ptr StorageBuffer + + %1 = OpFunction %void None %voidfn + %label = OpLabel + OpReturn + OpFunctionEnd +)"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_SUCCESS, ValidateAndRetrieveValidationState()) + << getDiagnosticString(); +} + +TEST_F(ValidateDecorations, StorageBufferMissingBindingGood) { + std::string spirv = R"( + OpCapability Shader + OpExtension "SPV_KHR_storage_buffer_storage_class" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %1 "main" + OpExecutionMode %1 OriginUpperLeft + + OpDecorate %struct BufferBlock + OpDecorate %var DescriptorSet 0 + + %void = OpTypeVoid + %voidfn = OpTypeFunction %void + %float = OpTypeFloat 32 + %struct = OpTypeStruct %float + %ptr = OpTypePointer StorageBuffer %struct + %var = OpVariable %ptr StorageBuffer + + %1 = OpFunction %void None %voidfn + %label = OpLabel + OpReturn + OpFunctionEnd +)"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_SUCCESS, ValidateAndRetrieveValidationState()) + << getDiagnosticString(); +} + TEST_F(ValidateDecorations, StorageBufferStorageClassArrayBaseAlignmentGood) { // Spot check buffer rules when using StorageBuffer storage class with Block // decoration. @@ -3014,6 +4022,7 @@ TEST_F(ValidateDecorations, EntryPointVariableWrongStorageClass) { OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %1 "func" %var +OpExecutionMode %1 OriginUpperLeft %void = OpTypeVoid %int = OpTypeInt 32 0 %ptr_int_Workgroup = OpTypePointer Workgroup %int @@ -3032,6 +4041,775 @@ OpFunctionEnd "Storage Class of Input(1) or Output(3). Found Storage " "Class 4 for Entry Point id 1.")); } + +TEST_F(ValidateDecorations, VulkanMemoryModelNonCoherent) { + const std::string spirv = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpCapability Linkage +OpExtension "SPV_KHR_vulkan_memory_model" +OpExtension "SPV_KHR_storage_buffer_storage_class" +OpMemoryModel Logical VulkanKHR +OpDecorate %1 Coherent +%2 = OpTypeInt 32 0 +%3 = OpTypePointer StorageBuffer %2 +%1 = OpVariable %3 StorageBuffer +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Coherent decoration targeting 1[%1] is " + "banned when using the Vulkan memory model.")); +} + +TEST_F(ValidateDecorations, VulkanMemoryModelNoCoherentMember) { + const std::string spirv = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpCapability Linkage +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +OpMemberDecorate %1 0 Coherent +%2 = OpTypeInt 32 0 +%1 = OpTypeStruct %2 %2 +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("Coherent decoration targeting 1[%_struct_1] (member index 0) " + "is banned when using the Vulkan memory model.")); +} + +TEST_F(ValidateDecorations, VulkanMemoryModelNoVolatile) { + const std::string spirv = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpCapability Linkage +OpExtension "SPV_KHR_vulkan_memory_model" +OpExtension "SPV_KHR_storage_buffer_storage_class" +OpMemoryModel Logical VulkanKHR +OpDecorate %1 Volatile +%2 = OpTypeInt 32 0 +%3 = OpTypePointer StorageBuffer %2 +%1 = OpVariable %3 StorageBuffer +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Volatile decoration targeting 1[%1] is banned when " + "using the Vulkan memory model.")); +} + +TEST_F(ValidateDecorations, VulkanMemoryModelNoVolatileMember) { + const std::string spirv = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpCapability Linkage +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +OpMemberDecorate %1 1 Volatile +%2 = OpTypeInt 32 0 +%1 = OpTypeStruct %2 %2 +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Volatile decoration targeting 1[%_struct_1] (member " + "index 1) is banned when using the Vulkan memory " + "model.")); +} + +TEST_F(ValidateDecorations, FPRoundingModeGood) { + std::string spirv = R"( +OpCapability Shader +OpCapability Linkage +OpCapability StorageBuffer16BitAccess +OpExtension "SPV_KHR_storage_buffer_storage_class" +OpExtension "SPV_KHR_variable_pointers" +OpExtension "SPV_KHR_16bit_storage" +OpMemoryModel Logical GLSL450 +OpEntryPoint GLCompute %main "main" +OpDecorate %_ FPRoundingMode RTE +%half = OpTypeFloat 16 +%float = OpTypeFloat 32 +%float_1_25 = OpConstant %float 1.25 +%half_ptr = OpTypePointer StorageBuffer %half +%half_ptr_var = OpVariable %half_ptr StorageBuffer +%void = OpTypeVoid +%func = OpTypeFunction %void +%main = OpFunction %void None %func +%main_entry = OpLabel +%_ = OpFConvert %half %float_1_25 +OpStore %half_ptr_var %_ +OpReturn +OpFunctionEnd + )"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_SUCCESS, ValidateAndRetrieveValidationState()); +} + +TEST_F(ValidateDecorations, FPRoundingModeVectorGood) { + std::string spirv = R"( +OpCapability Shader +OpCapability Linkage +OpCapability StorageBuffer16BitAccess +OpExtension "SPV_KHR_storage_buffer_storage_class" +OpExtension "SPV_KHR_variable_pointers" +OpExtension "SPV_KHR_16bit_storage" +OpMemoryModel Logical GLSL450 +OpEntryPoint GLCompute %main "main" +OpDecorate %_ FPRoundingMode RTE +%half = OpTypeFloat 16 +%float = OpTypeFloat 32 +%v2half = OpTypeVector %half 2 +%v2float = OpTypeVector %float 2 +%float_1_25 = OpConstant %float 1.25 +%floats = OpConstantComposite %v2float %float_1_25 %float_1_25 +%halfs_ptr = OpTypePointer StorageBuffer %v2half +%halfs_ptr_var = OpVariable %halfs_ptr StorageBuffer +%void = OpTypeVoid +%func = OpTypeFunction %void +%main = OpFunction %void None %func +%main_entry = OpLabel +%_ = OpFConvert %v2half %floats +OpStore %halfs_ptr_var %_ +OpReturn +OpFunctionEnd + )"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_SUCCESS, ValidateAndRetrieveValidationState()); +} + +TEST_F(ValidateDecorations, FPRoundingModeNotOpFConvert) { + std::string spirv = R"( +OpCapability Shader +OpCapability Linkage +OpCapability StorageBuffer16BitAccess +OpExtension "SPV_KHR_storage_buffer_storage_class" +OpExtension "SPV_KHR_variable_pointers" +OpExtension "SPV_KHR_16bit_storage" +OpMemoryModel Logical GLSL450 +OpEntryPoint GLCompute %main "main" +OpDecorate %_ FPRoundingMode RTE +%short = OpTypeInt 16 1 +%int = OpTypeInt 32 1 +%int_17 = OpConstant %int 17 +%short_ptr = OpTypePointer StorageBuffer %short +%short_ptr_var = OpVariable %short_ptr StorageBuffer +%void = OpTypeVoid +%func = OpTypeFunction %void +%main = OpFunction %void None %func +%main_entry = OpLabel +%_ = OpSConvert %short %int_17 +OpStore %short_ptr_var %_ +OpReturn +OpFunctionEnd + )"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateAndRetrieveValidationState()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("FPRoundingMode decoration can be applied only to a " + "width-only conversion instruction for floating-point " + "object.")); +} + +TEST_F(ValidateDecorations, FPRoundingModeNoOpStoreGood) { + std::string spirv = R"( +OpCapability Shader +OpCapability Linkage +OpCapability StorageBuffer16BitAccess +OpExtension "SPV_KHR_storage_buffer_storage_class" +OpExtension "SPV_KHR_variable_pointers" +OpExtension "SPV_KHR_16bit_storage" +OpMemoryModel Logical GLSL450 +OpEntryPoint GLCompute %main "main" +OpDecorate %_ FPRoundingMode RTE +%half = OpTypeFloat 16 +%float = OpTypeFloat 32 +%float_1_25 = OpConstant %float 1.25 +%half_ptr = OpTypePointer StorageBuffer %half +%half_ptr_var = OpVariable %half_ptr StorageBuffer +%void = OpTypeVoid +%func = OpTypeFunction %void +%main = OpFunction %void None %func +%main_entry = OpLabel +%_ = OpFConvert %half %float_1_25 +OpReturn +OpFunctionEnd + )"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_SUCCESS, ValidateAndRetrieveValidationState()); +} + +TEST_F(ValidateDecorations, FPRoundingModeFConvert64to16Good) { + std::string spirv = R"( +OpCapability Shader +OpCapability Linkage +OpCapability StorageBuffer16BitAccess +OpCapability Float64 +OpExtension "SPV_KHR_storage_buffer_storage_class" +OpExtension "SPV_KHR_variable_pointers" +OpExtension "SPV_KHR_16bit_storage" +OpMemoryModel Logical GLSL450 +OpEntryPoint GLCompute %main "main" +OpDecorate %_ FPRoundingMode RTE +%half = OpTypeFloat 16 +%double = OpTypeFloat 64 +%double_1_25 = OpConstant %double 1.25 +%half_ptr = OpTypePointer StorageBuffer %half +%half_ptr_var = OpVariable %half_ptr StorageBuffer +%void = OpTypeVoid +%func = OpTypeFunction %void +%main = OpFunction %void None %func +%main_entry = OpLabel +%_ = OpFConvert %half %double_1_25 +OpStore %half_ptr_var %_ +OpReturn +OpFunctionEnd + )"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_SUCCESS, ValidateAndRetrieveValidationState()); +} + +TEST_F(ValidateDecorations, FPRoundingModeNotStoreInFloat16) { + std::string spirv = R"( +OpCapability Shader +OpCapability Linkage +OpCapability StorageBuffer16BitAccess +OpCapability Float64 +OpExtension "SPV_KHR_storage_buffer_storage_class" +OpExtension "SPV_KHR_variable_pointers" +OpExtension "SPV_KHR_16bit_storage" +OpMemoryModel Logical GLSL450 +OpEntryPoint GLCompute %main "main" +OpDecorate %_ FPRoundingMode RTE +%float = OpTypeFloat 32 +%double = OpTypeFloat 64 +%double_1_25 = OpConstant %double 1.25 +%float_ptr = OpTypePointer StorageBuffer %float +%float_ptr_var = OpVariable %float_ptr StorageBuffer +%void = OpTypeVoid +%func = OpTypeFunction %void +%main = OpFunction %void None %func +%main_entry = OpLabel +%_ = OpFConvert %float %double_1_25 +OpStore %float_ptr_var %_ +OpReturn +OpFunctionEnd + )"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateAndRetrieveValidationState()); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("FPRoundingMode decoration can be applied only to the " + "Object operand of an OpStore storing through a " + "pointer to a 16-bit floating-point scalar or vector object.")); +} + +TEST_F(ValidateDecorations, FPRoundingModeBadStorageClass) { + std::string spirv = R"( +OpCapability Shader +OpCapability Linkage +OpCapability StorageBuffer16BitAccess +OpExtension "SPV_KHR_storage_buffer_storage_class" +OpExtension "SPV_KHR_variable_pointers" +OpExtension "SPV_KHR_16bit_storage" +OpMemoryModel Logical GLSL450 +OpEntryPoint GLCompute %main "main" +OpDecorate %_ FPRoundingMode RTE +%half = OpTypeFloat 16 +%float = OpTypeFloat 32 +%float_1_25 = OpConstant %float 1.25 +%half_ptr = OpTypePointer Private %half +%half_ptr_var = OpVariable %half_ptr Private +%void = OpTypeVoid +%func = OpTypeFunction %void +%main = OpFunction %void None %func +%main_entry = OpLabel +%_ = OpFConvert %half %float_1_25 +OpStore %half_ptr_var %_ +OpReturn +OpFunctionEnd + )"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateAndRetrieveValidationState()); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("FPRoundingMode decoration can be applied only to the " + "Object operand of an OpStore in the StorageBuffer, Uniform, " + "PushConstant, Input, or Output Storage Classes.")); +} + +TEST_F(ValidateDecorations, FPRoundingModeMultipleOpStoreGood) { + std::string spirv = R"( +OpCapability Shader +OpCapability Linkage +OpCapability StorageBuffer16BitAccess +OpExtension "SPV_KHR_storage_buffer_storage_class" +OpExtension "SPV_KHR_variable_pointers" +OpExtension "SPV_KHR_16bit_storage" +OpMemoryModel Logical GLSL450 +OpEntryPoint GLCompute %main "main" +OpDecorate %_ FPRoundingMode RTE +%half = OpTypeFloat 16 +%float = OpTypeFloat 32 +%float_1_25 = OpConstant %float 1.25 +%half_ptr = OpTypePointer StorageBuffer %half +%half_ptr_var_0 = OpVariable %half_ptr StorageBuffer +%half_ptr_var_1 = OpVariable %half_ptr StorageBuffer +%half_ptr_var_2 = OpVariable %half_ptr StorageBuffer +%void = OpTypeVoid +%func = OpTypeFunction %void +%main = OpFunction %void None %func +%main_entry = OpLabel +%_ = OpFConvert %half %float_1_25 +OpStore %half_ptr_var_0 %_ +OpStore %half_ptr_var_1 %_ +OpStore %half_ptr_var_2 %_ +OpReturn +OpFunctionEnd + )"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_SUCCESS, ValidateAndRetrieveValidationState()); +} + +TEST_F(ValidateDecorations, FPRoundingModeMultipleUsesBad) { + std::string spirv = R"( +OpCapability Shader +OpCapability Linkage +OpCapability StorageBuffer16BitAccess +OpExtension "SPV_KHR_storage_buffer_storage_class" +OpExtension "SPV_KHR_variable_pointers" +OpExtension "SPV_KHR_16bit_storage" +OpMemoryModel Logical GLSL450 +OpEntryPoint GLCompute %main "main" +OpDecorate %_ FPRoundingMode RTE +%half = OpTypeFloat 16 +%float = OpTypeFloat 32 +%float_1_25 = OpConstant %float 1.25 +%half_ptr = OpTypePointer StorageBuffer %half +%half_ptr_var_0 = OpVariable %half_ptr StorageBuffer +%half_ptr_var_1 = OpVariable %half_ptr StorageBuffer +%void = OpTypeVoid +%func = OpTypeFunction %void +%main = OpFunction %void None %func +%main_entry = OpLabel +%_ = OpFConvert %half %float_1_25 +OpStore %half_ptr_var_0 %_ +%result = OpFAdd %half %_ %_ +OpStore %half_ptr_var_1 %_ +OpReturn +OpFunctionEnd + )"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateAndRetrieveValidationState()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("FPRoundingMode decoration can be applied only to the " + "Object operand of an OpStore.")); +} + +TEST_F(ValidateDecorations, GroupDecorateTargetsDecorationGroup) { + std::string spirv = R"( +OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +%1 = OpDecorationGroup +OpGroupDecorate %1 %1 +)"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("OpGroupDecorate may not target OpDecorationGroup " + "'1[%1]'")); +} + +TEST_F(ValidateDecorations, GroupDecorateTargetsDecorationGroup2) { + std::string spirv = R"( +OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +%1 = OpDecorationGroup +OpGroupDecorate %1 %2 %1 +%2 = OpTypeVoid +)"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("OpGroupDecorate may not target OpDecorationGroup " + "'1[%1]'")); +} + +TEST_F(ValidateDecorations, RecurseThroughRuntimeArray) { + const std::string spirv = R"( +OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +OpDecorate %outer Block +OpMemberDecorate %inner 0 Offset 0 +OpMemberDecorate %inner 1 Offset 1 +OpDecorate %runtime ArrayStride 16 +OpMemberDecorate %outer 0 Offset 0 +%int = OpTypeInt 32 0 +%inner = OpTypeStruct %int %int +%runtime = OpTypeRuntimeArray %inner +%outer = OpTypeStruct %runtime +%outer_ptr = OpTypePointer Uniform %outer +%var = OpVariable %outer_ptr Uniform +)"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("Structure id 2 decorated as Block for variable in Uniform " + "storage class must follow standard uniform buffer layout " + "rules: member 1 at offset 1 is not aligned to 4")); +} + +TEST_F(ValidateDecorations, EmptyStructAtNonZeroOffsetGood) { + const std::string spirv = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint GLCompute %main "main" +OpExecutionMode %main LocalSize 1 1 1 +OpDecorate %struct Block +OpMemberDecorate %struct 0 Offset 0 +OpMemberDecorate %struct 1 Offset 16 +OpDecorate %var DescriptorSet 0 +OpDecorate %var Binding 0 +%void = OpTypeVoid +%float = OpTypeFloat 32 +%empty = OpTypeStruct +%struct = OpTypeStruct %float %empty +%ptr_struct_ubo = OpTypePointer Uniform %struct +%var = OpVariable %ptr_struct_ubo Uniform +%voidfn = OpTypeFunction %void +%main = OpFunction %void None %voidfn +%entry = OpLabel +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions()); +} + +// Uniform decoration + +TEST_F(ValidateDecorations, UniformDecorationGood) { + const std::string spirv = R"( +OpCapability Shader +OpMemoryModel Logical Simple +OpEntryPoint GLCompute %main "main" +OpExecutionMode %main LocalSize 1 1 1 +OpDecorate %int0 Uniform +OpDecorate %var Uniform +OpDecorate %val Uniform +%void = OpTypeVoid +%int = OpTypeInt 32 1 +%int0 = OpConstantNull %int +%intptr = OpTypePointer Private %int +%var = OpVariable %intptr Private +%fn = OpTypeFunction %void +%main = OpFunction %void None %fn +%entry = OpLabel +%val = OpLoad %int %var +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), Eq("")); +} + +TEST_F(ValidateDecorations, UniformDecorationTargetsTypeBad) { + const std::string spirv = R"( +OpCapability Shader +OpMemoryModel Logical Simple +OpEntryPoint GLCompute %main "main" +OpExecutionMode %main LocalSize 1 1 1 +OpDecorate %fn Uniform +%void = OpTypeVoid +%fn = OpTypeFunction %void +%main = OpFunction %void None %fn +%entry = OpLabel +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Uniform decoration applied to a non-object")); + EXPECT_THAT(getDiagnosticString(), HasSubstr("%2 = OpTypeFunction %void")); +} + +TEST_F(ValidateDecorations, UniformDecorationTargetsVoidValueBad) { + const std::string spirv = R"( +OpCapability Shader +OpMemoryModel Logical Simple +OpEntryPoint GLCompute %main "main" +OpExecutionMode %main LocalSize 1 1 1 +OpName %call "call" +OpName %myfunc "myfunc" +OpDecorate %call Uniform +%void = OpTypeVoid +%fnty = OpTypeFunction %void +%myfunc = OpFunction %void None %fnty +%myfuncentry = OpLabel +OpReturn +OpFunctionEnd +%main = OpFunction %void None %fnty +%entry = OpLabel +%call = OpFunctionCall %void %myfunc +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Uniform decoration applied to a value with void type\n" + " %call = OpFunctionCall %void %myfunc")); +} + +TEST_F(ValidateDecorations, MultipleOffsetDecorationsOnSameID) { + std::string spirv = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %1 "main" + OpExecutionMode %1 OriginUpperLeft + + OpMemberDecorate %struct 0 Offset 0 + OpMemberDecorate %struct 0 Offset 0 + + %void = OpTypeVoid + %voidfn = OpTypeFunction %void + %float = OpTypeFloat 32 + %struct = OpTypeStruct %float + + %1 = OpFunction %void None %voidfn + %label = OpLabel + OpReturn + OpFunctionEnd +)"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateAndRetrieveValidationState()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("ID '2', member '0' decorated with Offset multiple " + "times is not allowed.")); +} + +TEST_F(ValidateDecorations, MultipleArrayStrideDecorationsOnSameID) { + std::string spirv = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %1 "main" + OpExecutionMode %1 OriginUpperLeft + + OpDecorate %array ArrayStride 4 + OpDecorate %array ArrayStride 4 + + %void = OpTypeVoid + %voidfn = OpTypeFunction %void + %float = OpTypeFloat 32 + %uint = OpTypeInt 32 0 + %uint_4 = OpConstant %uint 4 + %array = OpTypeArray %float %uint_4 + + %1 = OpFunction %void None %voidfn + %label = OpLabel + OpReturn + OpFunctionEnd +)"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateAndRetrieveValidationState()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("ID '2' decorated with ArrayStride multiple " + "times is not allowed.")); +} + +TEST_F(ValidateDecorations, MultipleMatrixStrideDecorationsOnSameID) { + std::string spirv = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %1 "main" + OpExecutionMode %1 OriginUpperLeft + + OpMemberDecorate %struct 0 Offset 0 + OpMemberDecorate %struct 0 ColMajor + OpMemberDecorate %struct 0 MatrixStride 16 + OpMemberDecorate %struct 0 MatrixStride 16 + + %void = OpTypeVoid + %voidfn = OpTypeFunction %void + %float = OpTypeFloat 32 + %fvec4 = OpTypeVector %float 4 + %fmat4 = OpTypeMatrix %fvec4 4 + %struct = OpTypeStruct %fmat4 + + %1 = OpFunction %void None %voidfn + %label = OpLabel + OpReturn + OpFunctionEnd +)"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateAndRetrieveValidationState()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("ID '2', member '0' decorated with MatrixStride " + "multiple times is not allowed.")); +} + +TEST_F(ValidateDecorations, MultipleRowMajorDecorationsOnSameID) { + std::string spirv = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %1 "main" + OpExecutionMode %1 OriginUpperLeft + + OpMemberDecorate %struct 0 Offset 0 + OpMemberDecorate %struct 0 MatrixStride 16 + OpMemberDecorate %struct 0 RowMajor + OpMemberDecorate %struct 0 RowMajor + + %void = OpTypeVoid + %voidfn = OpTypeFunction %void + %float = OpTypeFloat 32 + %fvec4 = OpTypeVector %float 4 + %fmat4 = OpTypeMatrix %fvec4 4 + %struct = OpTypeStruct %fmat4 + + %1 = OpFunction %void None %voidfn + %label = OpLabel + OpReturn + OpFunctionEnd +)"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateAndRetrieveValidationState()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("ID '2', member '0' decorated with RowMajor multiple " + "times is not allowed.")); +} + +TEST_F(ValidateDecorations, MultipleColMajorDecorationsOnSameID) { + std::string spirv = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %1 "main" + OpExecutionMode %1 OriginUpperLeft + + OpMemberDecorate %struct 0 Offset 0 + OpMemberDecorate %struct 0 MatrixStride 16 + OpMemberDecorate %struct 0 ColMajor + OpMemberDecorate %struct 0 ColMajor + + %void = OpTypeVoid + %voidfn = OpTypeFunction %void + %float = OpTypeFloat 32 + %fvec4 = OpTypeVector %float 4 + %fmat4 = OpTypeMatrix %fvec4 4 + %struct = OpTypeStruct %fmat4 + + %1 = OpFunction %void None %voidfn + %label = OpLabel + OpReturn + OpFunctionEnd +)"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateAndRetrieveValidationState()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("ID '2', member '0' decorated with ColMajor multiple " + "times is not allowed.")); +} + +TEST_F(ValidateDecorations, RowMajorAndColMajorDecorationsOnSameID) { + std::string spirv = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %1 "main" + OpExecutionMode %1 OriginUpperLeft + + OpMemberDecorate %struct 0 Offset 0 + OpMemberDecorate %struct 0 MatrixStride 16 + OpMemberDecorate %struct 0 ColMajor + OpMemberDecorate %struct 0 RowMajor + + %void = OpTypeVoid + %voidfn = OpTypeFunction %void + %float = OpTypeFloat 32 + %fvec4 = OpTypeVector %float 4 + %fmat4 = OpTypeMatrix %fvec4 4 + %struct = OpTypeStruct %fmat4 + + %1 = OpFunction %void None %voidfn + %label = OpLabel + OpReturn + OpFunctionEnd +)"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateAndRetrieveValidationState()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("ID '2', member '0' decorated with both RowMajor and " + "ColMajor is not allowed.")); +} + +TEST_F(ValidateDecorations, BlockAndBufferBlockDecorationsOnSameID) { + std::string spirv = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %1 "main" + OpExecutionMode %1 OriginUpperLeft + + OpDecorate %struct Block + OpDecorate %struct BufferBlock + OpMemberDecorate %struct 0 Offset 0 + OpMemberDecorate %struct 0 MatrixStride 16 + OpMemberDecorate %struct 0 RowMajor + + %void = OpTypeVoid + %voidfn = OpTypeFunction %void + %float = OpTypeFloat 32 + %fvec4 = OpTypeVector %float 4 + %fmat4 = OpTypeMatrix %fvec4 4 + %struct = OpTypeStruct %fmat4 + + %1 = OpFunction %void None %voidfn + %label = OpLabel + OpReturn + OpFunctionEnd +)"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateAndRetrieveValidationState()); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr( + "ID '2' decorated with both BufferBlock and Block is not allowed.")); +} + } // namespace } // namespace val } // namespace spvtools diff --git a/3rdparty/spirv-tools/test/val/val_derivatives_test.cpp b/3rdparty/spirv-tools/test/val/val_derivatives_test.cpp index 93a70e87c..480042a7d 100644 --- a/3rdparty/spirv-tools/test/val/val_derivatives_test.cpp +++ b/3rdparty/spirv-tools/test/val/val_derivatives_test.cpp @@ -44,6 +44,9 @@ OpCapability DerivativeControl << " %f32_var_input" << " %f32vec4_var_input" << "\n"; + if (execution_model == "Fragment") { + ss << "OpExecutionMode %main OriginUpperLeft\n"; + } ss << R"( %void = OpTypeVoid @@ -116,11 +119,9 @@ TEST_F(ValidateDerivatives, OpDPdxWrongResultType) { )"; CompileSuccessfully(GenerateShaderCode(body).c_str()); - ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); - EXPECT_THAT( - getDiagnosticString(), - HasSubstr("Expected Result Type to be float scalar or vector type: " - "DPdx")); + ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), HasSubstr("Operand 10[%v4float] cannot " + "be a type")); } TEST_F(ValidateDerivatives, OpDPdxWrongPType) { diff --git a/3rdparty/spirv-tools/test/val/val_ext_inst_test.cpp b/3rdparty/spirv-tools/test/val/val_ext_inst_test.cpp index 40126fd9d..d1505da45 100644 --- a/3rdparty/spirv-tools/test/val/val_ext_inst_test.cpp +++ b/3rdparty/spirv-tools/test/val/val_ext_inst_test.cpp @@ -107,6 +107,9 @@ OpCapability Int64 << " %u32vec2_input" << " %u64_input" << "\n"; + if (execution_model == "Fragment") { + ss << "OpExecutionMode %main OriginUpperLeft\n"; + } ss << R"( %void = OpTypeVoid @@ -3332,7 +3335,7 @@ TEST_P(ValidateOpenCLStdUMul24Like, FloatResultType) { TEST_P(ValidateOpenCLStdUMul24Like, U64ResultType) { const std::string ext_inst_name = GetParam(); const std::string body = - "%val1 = OpExtInst %u64 %extinst " + ext_inst_name + " %u64_0 %u64\n"; + "%val1 = OpExtInst %u64 %extinst " + ext_inst_name + " %u64_0 %u64_0\n"; CompileSuccessfully(GenerateKernelCode(body)); ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); @@ -4130,10 +4133,9 @@ TEST_P(ValidateOpenCLStdVStoreHalfLike, PNotPointer) { } CompileSuccessfully(GenerateKernelCode(ss.str())); - ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpenCL.std " + ext_inst_name + - ": expected operand P to be a pointer")); + HasSubstr("Operand 89[%_ptr_Workgroup_half] cannot be a type")); } TEST_P(ValidateOpenCLStdVStoreHalfLike, ConstPointer) { @@ -4303,10 +4305,9 @@ TEST_P(ValidateOpenCLStdVLoadHalfLike, PNotPointer) { << " %u32_1 %f16_ptr_workgroup 2\n"; CompileSuccessfully(GenerateKernelCode(ss.str())); - ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpenCL.std " + ext_inst_name + - ": expected operand P to be a pointer")); + HasSubstr("Operand 89[%_ptr_Workgroup_half] cannot be a type")); } TEST_P(ValidateOpenCLStdVLoadHalfLike, OffsetWrongStorageType) { @@ -4476,10 +4477,10 @@ TEST_F(ValidateExtInst, VLoadNPNotPointer) { "%f32_ptr_uniform_constant 2\n"; CompileSuccessfully(GenerateKernelCode(ss.str())); - ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); - EXPECT_THAT( - getDiagnosticString(), - HasSubstr("OpenCL.std vloadn: expected operand P to be a pointer")); + ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Operand 120[%_ptr_UniformConstant_float] cannot be a " + "type")); } TEST_F(ValidateExtInst, VLoadNWrongStorageClass) { @@ -4589,10 +4590,10 @@ TEST_F(ValidateExtInst, VLoadHalfPNotPointer) { "%f16_ptr_uniform_constant\n"; CompileSuccessfully(GenerateKernelCode(ss.str())); - ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); - EXPECT_THAT( - getDiagnosticString(), - HasSubstr("OpenCL.std vload_half: expected operand P to be a pointer")); + ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Operand 114[%_ptr_UniformConstant_half] cannot be a " + "type")); } TEST_F(ValidateExtInst, VLoadHalfWrongStorageClass) { @@ -4743,10 +4744,9 @@ TEST_F(ValidateExtInst, VStoreNPNotPointer) { "%f32_ptr_generic\n"; CompileSuccessfully(GenerateKernelCode(ss.str())); - ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); - EXPECT_THAT( - getDiagnosticString(), - HasSubstr("OpenCL.std vstoren: expected operand P to be a pointer")); + ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Operand 124[%_ptr_Generic_float] cannot be a type")); } TEST_F(ValidateExtInst, VStoreNPNotGeneric) { @@ -5058,10 +5058,10 @@ TEST_F(ValidateExtInst, OpenCLStdPrintfFormatNotPointer) { )"; CompileSuccessfully(GenerateKernelCode(body)); - ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); - EXPECT_THAT( - getDiagnosticString(), - HasSubstr("OpenCL.std printf: expected operand Format to be a pointer")); + ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Operand 134[%_ptr_UniformConstant_uchar] cannot be a " + "type")); } TEST_F(ValidateExtInst, OpenCLStdPrintfFormatNotUniformConstStorageClass) { @@ -5151,10 +5151,10 @@ TEST_F(ValidateExtInst, OpenCLStdPrefetchPtrNotPointer) { )"; CompileSuccessfully(GenerateKernelCode(body)); - ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); - EXPECT_THAT( - getDiagnosticString(), - HasSubstr("OpenCL.std prefetch: expected operand Ptr to be a pointer")); + ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Operand 99[%_ptr_CrossWorkgroup_uint] cannot be a " + "type")); } TEST_F(ValidateExtInst, OpenCLStdPrefetchPtrNotCrossWorkgroup) { diff --git a/3rdparty/spirv-tools/test/val/val_extensions_test.cpp b/3rdparty/spirv-tools/test/val/val_extensions_test.cpp index b185c3ca7..3d6466d5c 100644 --- a/3rdparty/spirv-tools/test/val/val_extensions_test.cpp +++ b/3rdparty/spirv-tools/test/val/val_extensions_test.cpp @@ -88,6 +88,29 @@ TEST_P(ValidateUnknownExtensions, FailSilently) { EXPECT_THAT(getDiagnosticString(), HasSubstr(GetErrorString(extension))); } +TEST_F(ValidateUnknownExtensions, HitMaxNumOfWarnings) { + const std::string str = + std::string("OpCapability Shader\n") + "OpCapability Linkage\n" + + "OpExtension \"bad_ext\"\n" + "OpExtension \"bad_ext\"\n" + + "OpExtension \"bad_ext\"\n" + "OpExtension \"bad_ext\"\n" + + "OpExtension \"bad_ext\"\n" + "OpExtension \"bad_ext\"\n" + + "OpExtension \"bad_ext\"\n" + "OpExtension \"bad_ext\"\n" + + "OpExtension \"bad_ext\"\n" + "OpExtension \"bad_ext\"\n" + + "OpExtension \"bad_ext\"\n" + "OpExtension \"bad_ext\"\n" + + "OpExtension \"bad_ext\"\n" + "OpExtension \"bad_ext\"\n" + + "OpExtension \"bad_ext\"\n" + "OpExtension \"bad_ext\"\n" + + "OpExtension \"bad_ext\"\n" + "OpExtension \"bad_ext\"\n" + + "OpExtension \"bad_ext\"\n" + "OpExtension \"bad_ext\"\n" + + "OpExtension \"bad_ext\"\n" + "OpExtension \"bad_ext\"\n" + + "OpExtension \"bad_ext\"\n" + "OpExtension \"bad_ext\"\n" + + "OpExtension \"bad_ext\"\n" + "OpExtension \"bad_ext\"\n" + + "OpMemoryModel Logical GLSL450"; + CompileSuccessfully(str.c_str()); + ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Other warnings have been suppressed.")); +} + TEST_F(ValidateExtensionCapabilities, DeclCapabilitySuccess) { const std::string str = "OpCapability Shader\nOpCapability Linkage\nOpCapability DeviceGroup\n" diff --git a/3rdparty/spirv-tools/test/val/val_id_test.cpp b/3rdparty/spirv-tools/test/val/val_id_test.cpp index 6d907b188..25fac88d1 100644 --- a/3rdparty/spirv-tools/test/val/val_id_test.cpp +++ b/3rdparty/spirv-tools/test/val/val_id_test.cpp @@ -37,6 +37,19 @@ using ::testing::ValuesIn; using ValidateIdWithMessage = spvtest::ValidateBase; +std::string kOpCapabilitySetupWithoutVector16 = R"( + OpCapability Shader + OpCapability Linkage + OpCapability Addresses + OpCapability Int8 + OpCapability Int16 + OpCapability Int64 + OpCapability Float64 + OpCapability LiteralSampler + OpCapability Pipes + OpCapability DeviceEnqueue +)"; + std::string kOpCapabilitySetup = R"( OpCapability Shader OpCapability Linkage @@ -51,7 +64,18 @@ std::string kOpCapabilitySetup = R"( OpCapability Vector16 )"; -std::string kGLSL450MemoryModel = kOpCapabilitySetup + R"( +std::string kOpVariablePtrSetUp = R"( + OpCapability VariablePointers + OpExtension "SPV_KHR_variable_pointers" +)"; + +std::string kGLSL450MemoryModel = + kOpCapabilitySetup + kOpVariablePtrSetUp + R"( + OpMemoryModel Logical GLSL450 +)"; + +std::string kGLSL450MemoryModelWithoutVector16 = + kOpCapabilitySetupWithoutVector16 + kOpVariablePtrSetUp + R"( OpMemoryModel Logical GLSL450 )"; @@ -181,7 +205,7 @@ TEST_F(ValidateIdWithMessage, OpMemberNameTypeBad) { EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), - HasSubstr("OpMemberName Type '1[foo]' is not a struct type.")); + HasSubstr("OpMemberName Type '1[%uint]' is not a struct type.")); } TEST_F(ValidateIdWithMessage, OpMemberNameMemberBad) { std::string spirv = kGLSL450MemoryModel + R"( @@ -192,8 +216,8 @@ TEST_F(ValidateIdWithMessage, OpMemberNameMemberBad) { EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), - HasSubstr("OpMemberName Member '1[foo]' index is larger than " - "Type '1[foo]'s member count.")); + HasSubstr("OpMemberName Member '1[%_struct_1]' index is larger " + "than Type '1[%_struct_1]'s member count.")); } TEST_F(ValidateIdWithMessage, OpLineGood) { @@ -215,7 +239,7 @@ TEST_F(ValidateIdWithMessage, OpLineFileBad) { CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpLine Target '1' is not an OpString.")); + HasSubstr("OpLine Target '1[%uint]' is not an OpString.")); } TEST_F(ValidateIdWithMessage, OpDecorateGood) { @@ -237,7 +261,7 @@ OpDecorate %1 GLSLShared)"; TEST_F(ValidateIdWithMessage, OpMemberDecorateGood) { std::string spirv = kGLSL450MemoryModel + R"( - OpMemberDecorate %2 0 Uniform + OpMemberDecorate %2 0 RelaxedPrecision %1 = OpTypeInt 32 0 %2 = OpTypeStruct %1 %1)"; CompileSuccessfully(spirv.c_str()); @@ -245,32 +269,31 @@ TEST_F(ValidateIdWithMessage, OpMemberDecorateGood) { } TEST_F(ValidateIdWithMessage, OpMemberDecorateBad) { std::string spirv = kGLSL450MemoryModel + R"( - OpMemberDecorate %1 0 Uniform + OpMemberDecorate %1 0 RelaxedPrecision %1 = OpTypeInt 32 0)"; CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); - EXPECT_THAT( - getDiagnosticString(), - HasSubstr( - "OpMemberDecorate Structure type '1' is not a struct type.")); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("OpMemberDecorate Structure type '1[%uint]' is " + "not a struct type.")); } TEST_F(ValidateIdWithMessage, OpMemberDecorateMemberBad) { std::string spirv = kGLSL450MemoryModel + R"( - OpMemberDecorate %1 3 Uniform + OpMemberDecorate %1 3 RelaxedPrecision %int = OpTypeInt 32 0 %1 = OpTypeStruct %int %int)"; CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), HasSubstr("Index 3 provided in OpMemberDecorate for struct " - "1 is out of bounds. The structure has 2 members. " - "Largest valid index is 1.")); + "1[%_struct_1] is out of bounds. The structure has 2 " + "members. Largest valid index is 1.")); } TEST_F(ValidateIdWithMessage, OpGroupDecorateGood) { std::string spirv = kGLSL450MemoryModel + R"( %1 = OpDecorationGroup - OpDecorate %1 Uniform + OpDecorate %1 RelaxedPrecision OpDecorate %1 GLSLShared OpGroupDecorate %1 %3 %4 %2 = OpTypeInt 32 0 @@ -282,7 +305,7 @@ TEST_F(ValidateIdWithMessage, OpGroupDecorateGood) { TEST_F(ValidateIdWithMessage, OpDecorationGroupBad) { std::string spirv = kGLSL450MemoryModel + R"( %1 = OpDecorationGroup - OpDecorate %1 Uniform + OpDecorate %1 RelaxedPrecision OpDecorate %1 GLSLShared OpMemberDecorate %1 0 Constant )"; @@ -305,13 +328,13 @@ TEST_F(ValidateIdWithMessage, OpGroupDecorateDecorationGroupBad) { CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpGroupDecorate Decoration group '1' is not a " - "decoration group.")); + HasSubstr("OpGroupDecorate Decoration group '1[%1]' is not " + "a decoration group.")); } TEST_F(ValidateIdWithMessage, OpGroupDecorateTargetBad) { std::string spirv = kGLSL450MemoryModel + R"( %1 = OpDecorationGroup - OpDecorate %1 Uniform + OpDecorate %1 RelaxedPrecision OpDecorate %1 GLSLShared OpGroupDecorate %1 %3 %2 = OpTypeInt 32 0)"; @@ -331,8 +354,8 @@ TEST_F(ValidateIdWithMessage, OpGroupMemberDecorateDecorationGroupBad) { CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpGroupMemberDecorate Decoration group '1' is " - "not a decoration group.")); + HasSubstr("OpGroupMemberDecorate Decoration group '1[%1]' " + "is not a decoration group.")); } TEST_F(ValidateIdWithMessage, OpGroupMemberDecorateIdNotStructBad) { std::string spirv = kGLSL450MemoryModel + R"( @@ -342,8 +365,8 @@ TEST_F(ValidateIdWithMessage, OpGroupMemberDecorateIdNotStructBad) { CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpGroupMemberDecorate Structure type '2' is not " - "a struct type.")); + HasSubstr("OpGroupMemberDecorate Structure type '2[%uint]' " + "is not a struct type.")); } TEST_F(ValidateIdWithMessage, OpGroupMemberDecorateIndexOutOfBoundBad) { std::string spirv = kGLSL450MemoryModel + R"( @@ -357,8 +380,8 @@ TEST_F(ValidateIdWithMessage, OpGroupMemberDecorateIndexOutOfBoundBad) { EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), HasSubstr("Index 3 provided in OpGroupMemberDecorate for struct " - " 2 is out of bounds. The structure has 3 members. " - "Largest valid index is 2.")); + " 2[%_struct_2] is out of bounds. The structure " + "has 3 members. Largest valid index is 2.")); } // TODO: OpExtInst @@ -382,9 +405,9 @@ TEST_F(ValidateIdWithMessage, OpEntryPointFunctionBad) { %1 = OpTypeVoid)"; CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); - EXPECT_THAT( - getDiagnosticString(), - HasSubstr("OpEntryPoint Entry Point '1' is not a function.")); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("OpEntryPoint Entry Point '1[%void]' is not a " + "function.")); } TEST_F(ValidateIdWithMessage, OpEntryPointParameterCountBad) { std::string spirv = kGLSL450MemoryModel + R"( @@ -398,8 +421,8 @@ TEST_F(ValidateIdWithMessage, OpEntryPointParameterCountBad) { CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpEntryPoint Entry Point '1's function parameter " - "count is not zero")); + HasSubstr("OpEntryPoint Entry Point '1[%1]'s function " + "parameter count is not zero")); } TEST_F(ValidateIdWithMessage, OpEntryPointReturnTypeBad) { std::string spirv = kGLSL450MemoryModel + R"( @@ -414,8 +437,8 @@ TEST_F(ValidateIdWithMessage, OpEntryPointReturnTypeBad) { CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpEntryPoint Entry Point '1's function return " - "type is not void.")); + HasSubstr("OpEntryPoint Entry Point '1[%1]'s function " + "return type is not void.")); } TEST_F(ValidateIdWithMessage, OpEntryPointInterfaceIsNotVariableTypeBad) { @@ -424,6 +447,8 @@ TEST_F(ValidateIdWithMessage, OpEntryPointInterfaceIsNotVariableTypeBad) { OpCapability Geometry OpMemoryModel Logical GLSL450 OpEntryPoint Geometry %main "main" %ptr_builtin_1 + OpExecutionMode %main InputPoints + OpExecutionMode %main OutputPoints OpMemberDecorate %struct_1 0 BuiltIn InvocationId %int = OpTypeInt 32 1 %void = OpTypeVoid @@ -448,6 +473,8 @@ TEST_F(ValidateIdWithMessage, OpEntryPointInterfaceStorageClassBad) { OpCapability Geometry OpMemoryModel Logical GLSL450 OpEntryPoint Geometry %main "main" %in_1 + OpExecutionMode %main InputPoints + OpExecutionMode %main OutputPoints OpMemberDecorate %struct_1 0 BuiltIn InvocationId %int = OpTypeInt 32 1 %void = OpTypeVoid @@ -494,8 +521,8 @@ TEST_F(ValidateIdWithMessage, OpExecutionModeEntryPointMissing) { CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpExecutionMode Entry Point '1' is not the Entry " - "Point operand of an OpEntryPoint.")); + HasSubstr("OpExecutionMode Entry Point '1[%1]' is not the " + "Entry Point operand of an OpEntryPoint.")); } TEST_F(ValidateIdWithMessage, OpExecutionModeEntryPointBad) { @@ -513,8 +540,8 @@ TEST_F(ValidateIdWithMessage, OpExecutionModeEntryPointBad) { CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpExecutionMode Entry Point '2' is not the Entry " - "Point operand of an OpEntryPoint.")); + HasSubstr("OpExecutionMode Entry Point '2[%2]' is not the " + "Entry Point operand of an OpEntryPoint.")); } TEST_F(ValidateIdWithMessage, OpTypeVectorFloat) { @@ -558,7 +585,76 @@ TEST_F(ValidateIdWithMessage, OpTypeVectorComponentTypeBad) { EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), - HasSubstr("OpTypeVector Component Type '2' is not a scalar type.")); + HasSubstr("OpTypeVector Component Type " + "'2[%_ptr_UniformConstant_float]' is not a scalar type.")); +} + +TEST_F(ValidateIdWithMessage, OpTypeVectorColumnCountLessThanTwoBad) { + std::string spirv = kGLSL450MemoryModel + R"( +%1 = OpTypeFloat 32 +%2 = OpTypeVector %1 1)"; + CompileSuccessfully(spirv.c_str()); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("Illegal number of components (1) for TypeVector\n %v1float = " + "OpTypeVector %float 1\n")); +} + +TEST_F(ValidateIdWithMessage, OpTypeVectorColumnCountGreaterThanFourBad) { + std::string spirv = kGLSL450MemoryModel + R"( +%1 = OpTypeFloat 32 +%2 = OpTypeVector %1 5)"; + CompileSuccessfully(spirv.c_str()); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("Illegal number of components (5) for TypeVector\n %v5float = " + "OpTypeVector %float 5\n")); +} + +TEST_F(ValidateIdWithMessage, OpTypeVectorColumnCountEightWithoutVector16Bad) { + std::string spirv = kGLSL450MemoryModelWithoutVector16 + R"( +%1 = OpTypeFloat 32 +%2 = OpTypeVector %1 8)"; + + CompileSuccessfully(spirv.c_str()); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("Having 8 components for TypeVector requires the Vector16 " + "capability\n %v8float = OpTypeVector %float 8\n")); +} + +TEST_F(ValidateIdWithMessage, + OpTypeVectorColumnCountSixteenWithoutVector16Bad) { + std::string spirv = kGLSL450MemoryModelWithoutVector16 + R"( +%1 = OpTypeFloat 32 +%2 = OpTypeVector %1 16)"; + + CompileSuccessfully(spirv.c_str()); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("Having 16 components for TypeVector requires the Vector16 " + "capability\n %v16float = OpTypeVector %float 16\n")); +} + +TEST_F(ValidateIdWithMessage, OpTypeVectorColumnCountOfEightWithVector16Good) { + std::string spirv = kGLSL450MemoryModel + R"( +%1 = OpTypeFloat 32 +%2 = OpTypeVector %1 8)"; + CompileSuccessfully(spirv.c_str()); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions()); +} + +TEST_F(ValidateIdWithMessage, + OpTypeVectorColumnCountOfSixteenWithVector16Good) { + std::string spirv = kGLSL450MemoryModel + R"( +%1 = OpTypeFloat 32 +%2 = OpTypeVector %1 16)"; + CompileSuccessfully(spirv.c_str()); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions()); } TEST_F(ValidateIdWithMessage, OpTypeMatrixGood) { @@ -569,14 +665,56 @@ TEST_F(ValidateIdWithMessage, OpTypeMatrixGood) { CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_SUCCESS, ValidateInstructions()); } -TEST_F(ValidateIdWithMessage, OpTypeMatrixColumnTypeBad) { + +TEST_F(ValidateIdWithMessage, OpTypeMatrixColumnTypeNonVectorBad) { std::string spirv = kGLSL450MemoryModel + R"( -%1 = OpTypeInt 32 0 +%1 = OpTypeFloat 32 %2 = OpTypeMatrix %1 3)"; CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); - EXPECT_THAT(getDiagnosticString(), - HasSubstr("Columns in a matrix must be of type vector.")); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("olumns in a matrix must be of type vector.\n %mat3float = " + "OpTypeMatrix %float 3\n")); +} + +TEST_F(ValidateIdWithMessage, OpTypeMatrixVectorTypeNonFloatBad) { + std::string spirv = kGLSL450MemoryModel + R"( +%1 = OpTypeInt 16 0 +%2 = OpTypeVector %1 2 +%3 = OpTypeMatrix %2 2)"; + CompileSuccessfully(spirv.c_str()); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("Matrix types can only be parameterized with floating-point " + "types.\n %mat2v2ushort = OpTypeMatrix %v2ushort 2\n")); +} + +TEST_F(ValidateIdWithMessage, OpTypeMatrixColumnCountLessThanTwoBad) { + std::string spirv = kGLSL450MemoryModel + R"( +%1 = OpTypeFloat 32 +%2 = OpTypeVector %1 2 +%3 = OpTypeMatrix %2 1)"; + CompileSuccessfully(spirv.c_str()); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("Matrix types can only be parameterized as having only 2, 3, " + "or 4 columns.\n %mat1v2float = OpTypeMatrix %v2float 1\n")); +} + +TEST_F(ValidateIdWithMessage, OpTypeMatrixColumnCountGreaterThanFourBad) { + std::string spirv = kGLSL450MemoryModel + R"( +%1 = OpTypeFloat 32 +%2 = OpTypeVector %1 2 +%3 = OpTypeMatrix %2 8)"; + CompileSuccessfully(spirv.c_str()); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("Matrix types can only be parameterized as having only 2, 3, " + "or 4 columns.\n %mat8v2float = OpTypeMatrix %v2float 8\n")); } TEST_F(ValidateIdWithMessage, OpTypeSamplerGood) { @@ -604,7 +742,8 @@ TEST_F(ValidateIdWithMessage, OpTypeArrayElementTypeBad) { CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpTypeArray Element Type '2' is not a type.")); + HasSubstr("OpTypeArray Element Type '2[%uint_1]' is not a " + "type.")); } // Signed or unsigned. @@ -645,7 +784,8 @@ class OpTypeArrayLengthTest spvValidate(ScopedContext().context, &cbinary, &diagnostic_); if (status != SPV_SUCCESS) { spvDiagnosticPrint(diagnostic_); - EXPECT_THAT(std::string(diagnostic_->error), HasSubstr(expected_err)); + EXPECT_THAT(std::string(diagnostic_->error), + testing::ContainsRegex(expected_err)); } return status; } @@ -679,35 +819,35 @@ TEST_P(OpTypeArrayLengthTest, LengthPositive) { TEST_P(OpTypeArrayLengthTest, LengthZero) { const int width = GetParam(); - EXPECT_EQ( - SPV_ERROR_INVALID_ID, - Val(CompileSuccessfully(MakeArrayLength("0", kSigned, width)), - "OpTypeArray Length '2' default value must be at least 1.")); - EXPECT_EQ( - SPV_ERROR_INVALID_ID, - Val(CompileSuccessfully(MakeArrayLength("0", kUnsigned, width)), - "OpTypeArray Length '2' default value must be at least 1.")); + EXPECT_EQ(SPV_ERROR_INVALID_ID, + Val(CompileSuccessfully(MakeArrayLength("0", kSigned, width)), + "OpTypeArray Length '2\\[%.*\\]' default value must be at " + "least 1.")); + EXPECT_EQ(SPV_ERROR_INVALID_ID, + Val(CompileSuccessfully(MakeArrayLength("0", kUnsigned, width)), + "OpTypeArray Length '2\\[%.*\\]' default value must be at " + "least 1.")); } TEST_P(OpTypeArrayLengthTest, LengthNegative) { const int width = GetParam(); - EXPECT_EQ( - SPV_ERROR_INVALID_ID, - Val(CompileSuccessfully(MakeArrayLength("-1", kSigned, width)), - "OpTypeArray Length '2' default value must be at least 1.")); - EXPECT_EQ( - SPV_ERROR_INVALID_ID, - Val(CompileSuccessfully(MakeArrayLength("-2", kSigned, width)), - "OpTypeArray Length '2' default value must be at least 1.")); - EXPECT_EQ( - SPV_ERROR_INVALID_ID, - Val(CompileSuccessfully(MakeArrayLength("-123", kSigned, width)), - "OpTypeArray Length '2' default value must be at least 1.")); + EXPECT_EQ(SPV_ERROR_INVALID_ID, + Val(CompileSuccessfully(MakeArrayLength("-1", kSigned, width)), + "OpTypeArray Length '2\\[%.*\\]' default value must be at " + "least 1.")); + EXPECT_EQ(SPV_ERROR_INVALID_ID, + Val(CompileSuccessfully(MakeArrayLength("-2", kSigned, width)), + "OpTypeArray Length '2\\[%.*\\]' default value must be at " + "least 1.")); + EXPECT_EQ(SPV_ERROR_INVALID_ID, + Val(CompileSuccessfully(MakeArrayLength("-123", kSigned, width)), + "OpTypeArray Length '2\\[%.*\\]' default value must be at " + "least 1.")); const std::string neg_max = "0x8" + std::string(width / 4 - 1, '0'); - EXPECT_EQ( - SPV_ERROR_INVALID_ID, - Val(CompileSuccessfully(MakeArrayLength(neg_max, kSigned, width)), - "OpTypeArray Length '2' default value must be at least 1.")); + EXPECT_EQ(SPV_ERROR_INVALID_ID, + Val(CompileSuccessfully(MakeArrayLength(neg_max, kSigned, width)), + "OpTypeArray Length '2\\[%.*\\]' default value must be at " + "least 1.")); } // The only valid widths for integers are 8, 16, 32, and 64. @@ -728,7 +868,7 @@ TEST_F(ValidateIdWithMessage, OpTypeArrayLengthNull) { EXPECT_THAT( getDiagnosticString(), HasSubstr( - "OpTypeArray Length '2' default value must be at least 1.")); + "OpTypeArray Length '2[%2]' default value must be at least 1.")); } TEST_F(ValidateIdWithMessage, OpTypeArrayLengthSpecConst) { @@ -767,7 +907,8 @@ TEST_F(ValidateIdWithMessage, OpTypeRuntimeArrayBad) { EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), - HasSubstr("OpTypeRuntimeArray Element Type '2' is not a type.")); + HasSubstr("OpTypeRuntimeArray Element Type '2[%uint_0]' is not a " + "type.")); } // TODO: Object of this type can only be created with OpVariable using the // Unifrom Storage Class @@ -790,7 +931,8 @@ TEST_F(ValidateIdWithMessage, OpTypeStructMemberTypeBad) { CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpTypeStruct Member Type '3' is not a type.")); + HasSubstr("OpTypeStruct Member Type '3[%double_0]' is not " + "a type.")); } TEST_F(ValidateIdWithMessage, OpTypePointerGood) { @@ -808,7 +950,8 @@ TEST_F(ValidateIdWithMessage, OpTypePointerBad) { CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpTypePointer Type '2' is not a type.")); + HasSubstr("OpTypePointer Type '2[%uint_0]' is not a " + "type.")); } TEST_F(ValidateIdWithMessage, OpTypeFunctionGood) { @@ -826,7 +969,8 @@ TEST_F(ValidateIdWithMessage, OpTypeFunctionReturnTypeBad) { CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpTypeFunction Return Type '2' is not a type.")); + HasSubstr("OpTypeFunction Return Type '2[%uint_0]' is not " + "a type.")); } TEST_F(ValidateIdWithMessage, OpTypeFunctionParameterBad) { std::string spirv = kGLSL450MemoryModel + R"( @@ -838,7 +982,20 @@ TEST_F(ValidateIdWithMessage, OpTypeFunctionParameterBad) { EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), - HasSubstr("OpTypeFunction Parameter Type '3' is not a type.")); + HasSubstr("OpTypeFunction Parameter Type '3[%uint_0]' is not a " + "type.")); +} + +TEST_F(ValidateIdWithMessage, OpTypeFunctionParameterTypeVoidBad) { + std::string spirv = kGLSL450MemoryModel + R"( +%1 = OpTypeVoid +%2 = OpTypeInt 32 0 +%4 = OpTypeFunction %1 %2 %1)"; + CompileSuccessfully(spirv.c_str()); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("OpTypeFunction Parameter Type '1[%void]' cannot " + "be OpTypeVoid.")); } TEST_F(ValidateIdWithMessage, OpTypePipeGood) { @@ -865,7 +1022,8 @@ TEST_F(ValidateIdWithMessage, OpConstantTrueBad) { EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), - HasSubstr("OpConstantTrue Result Type '1' is not a boolean type.")); + HasSubstr("OpConstantTrue Result Type '1[%void]' is not a boolean " + "type.")); } TEST_F(ValidateIdWithMessage, OpConstantFalseGood) { @@ -883,7 +1041,8 @@ TEST_F(ValidateIdWithMessage, OpConstantFalseBad) { EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), - HasSubstr("OpConstantFalse Result Type '1' is not a boolean type.")); + HasSubstr("OpConstantFalse Result Type '1[%void]' is not a boolean " + "type.")); } TEST_F(ValidateIdWithMessage, OpConstantGood) { @@ -933,8 +1092,8 @@ TEST_F(ValidateIdWithMessage, OpConstantCompositeVectorResultTypeBad) { EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), - HasSubstr( - "OpConstantComposite Result Type '1' is not a composite type.")); + HasSubstr("OpConstantComposite Result Type '1[%float]' is not a " + "composite type.")); } TEST_F(ValidateIdWithMessage, OpConstantCompositeVectorConstituentTypeBad) { std::string spirv = kGLSL450MemoryModel + R"( @@ -948,8 +1107,9 @@ TEST_F(ValidateIdWithMessage, OpConstantCompositeVectorConstituentTypeBad) { EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), - HasSubstr("OpConstantComposite Constituent '5's type does not match " - "Result Type '2's vector element type.")); + HasSubstr("OpConstantComposite Constituent '5[%uint_42]'s type " + "does not match Result Type '2[%v4float]'s vector " + "element type.")); } TEST_F(ValidateIdWithMessage, OpConstantCompositeVectorConstituentUndefTypeBad) { @@ -964,8 +1124,8 @@ TEST_F(ValidateIdWithMessage, EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), - HasSubstr("OpConstantComposite Constituent '5's type does not match " - "Result Type '2's vector element type.")); + HasSubstr("OpConstantComposite Constituent '5[%5]'s type does not " + "match Result Type '2[%v4float]'s vector element type.")); } TEST_F(ValidateIdWithMessage, OpConstantCompositeMatrixGood) { std::string spirv = kGLSL450MemoryModel + R"( @@ -1013,9 +1173,9 @@ TEST_F(ValidateIdWithMessage, OpConstantCompositeMatrixConstituentTypeBad) { CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpConstantComposite Constituent '10' vector " - "component count does not match Result Type '4's " - "vector component count.")); + HasSubstr("OpConstantComposite Constituent '10[%10]' vector " + "component count does not match Result Type " + "'4[%mat4v4float]'s vector component count.")); } TEST_F(ValidateIdWithMessage, OpConstantCompositeMatrixConstituentUndefTypeBad) { @@ -1034,9 +1194,9 @@ TEST_F(ValidateIdWithMessage, CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpConstantComposite Constituent '10' vector " - "component count does not match Result Type '4's " - "vector component count.")); + HasSubstr("OpConstantComposite Constituent '10[%10]' vector " + "component count does not match Result Type " + "'4[%mat4v4float]'s vector component count.")); } TEST_F(ValidateIdWithMessage, OpConstantCompositeArrayGood) { std::string spirv = kGLSL450MemoryModel + R"( @@ -1057,16 +1217,30 @@ TEST_F(ValidateIdWithMessage, OpConstantCompositeArrayWithUndefGood) { CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_SUCCESS, ValidateInstructions()); } -TEST_F(ValidateIdWithMessage, OpConstantCompositeArrayConstConstituentBad) { + +TEST_F(ValidateIdWithMessage, OpConstantCompositeArrayConstConstituentTypeBad) { std::string spirv = kGLSL450MemoryModel + R"( %1 = OpTypeInt 32 0 %2 = OpConstant %1 4 %3 = OpTypeArray %1 %2 %4 = OpConstantComposite %3 %2 %2 %2 %1)"; // Uses a type as operand + CompileSuccessfully(spirv.c_str()); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), HasSubstr("Operand 1[%uint] cannot be a " + "type")); +} +TEST_F(ValidateIdWithMessage, OpConstantCompositeArrayConstConstituentBad) { + std::string spirv = kGLSL450MemoryModel + R"( +%1 = OpTypeInt 32 0 +%2 = OpConstant %1 4 +%3 = OpTypeArray %1 %2 +%4 = OpTypePointer Uniform %1 +%5 = OpVariable %4 Uniform +%6 = OpConstantComposite %3 %2 %2 %2 %5)"; CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpConstantComposite Constituent '1' is not a " + HasSubstr("OpConstantComposite Constituent '5[%5]' is not a " "constant or undef.")); } TEST_F(ValidateIdWithMessage, OpConstantCompositeArrayConstituentTypeBad) { @@ -1080,8 +1254,10 @@ TEST_F(ValidateIdWithMessage, OpConstantCompositeArrayConstituentTypeBad) { CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpConstantComposite Constituent '5's type does " - "not match Result Type '3's array element type.")); + HasSubstr("OpConstantComposite Constituent " + "'5[%float_3_1400001]'s type does not match Result " + "Type '3[%_arr_uint_uint_4]'s array element " + "type.")); } TEST_F(ValidateIdWithMessage, OpConstantCompositeArrayConstituentUndefTypeBad) { std::string spirv = kGLSL450MemoryModel + R"( @@ -1094,8 +1270,10 @@ TEST_F(ValidateIdWithMessage, OpConstantCompositeArrayConstituentUndefTypeBad) { CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpConstantComposite Constituent '5's type does " - "not match Result Type '3's array element type.")); + HasSubstr("OpConstantComposite Constituent " + "'5[%5]'s type does not match Result " + "Type '3[%_arr_uint_uint_4]'s array element " + "type.")); } TEST_F(ValidateIdWithMessage, OpConstantCompositeStructGood) { std::string spirv = kGLSL450MemoryModel + R"( @@ -1130,8 +1308,9 @@ TEST_F(ValidateIdWithMessage, OpConstantCompositeStructMemberTypeBad) { CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpConstantComposite Constituent '5' type does " - "not match the Result Type '3's member type.")); + HasSubstr("OpConstantComposite Constituent " + "'5[%ulong_4300000000]' type does not match the " + "Result Type '3[%_struct_3]'s member type.")); } TEST_F(ValidateIdWithMessage, OpConstantCompositeStructMemberUndefTypeBad) { @@ -1145,8 +1324,9 @@ TEST_F(ValidateIdWithMessage, OpConstantCompositeStructMemberUndefTypeBad) { CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpConstantComposite Constituent '5' type does " - "not match the Result Type '3's member type.")); + HasSubstr("OpConstantComposite Constituent '5[%5]' type " + "does not match the Result Type '3[%_struct_3]'s " + "member type.")); } TEST_F(ValidateIdWithMessage, OpConstantSamplerGood) { @@ -1166,7 +1346,8 @@ TEST_F(ValidateIdWithMessage, OpConstantSamplerResultTypeBad) { EXPECT_THAT( getDiagnosticString(), HasSubstr( - "OpConstantSampler Result Type '1' is not a sampler type.")); + "OpConstantSampler Result Type '1[%float]' is not a sampler " + "type.")); } TEST_F(ValidateIdWithMessage, OpConstantNullGood) { @@ -1213,8 +1394,8 @@ TEST_F(ValidateIdWithMessage, OpConstantNullBasicBad) { EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), - HasSubstr( - "OpConstantNull Result Type '1' cannot have a null value.")); + HasSubstr("OpConstantNull Result Type '1[%void]' cannot have a null " + "value.")); } TEST_F(ValidateIdWithMessage, OpConstantNullArrayBad) { @@ -1229,7 +1410,8 @@ TEST_F(ValidateIdWithMessage, OpConstantNullArrayBad) { EXPECT_THAT( getDiagnosticString(), HasSubstr( - "OpConstantNull Result Type '4' cannot have a null value.")); + "OpConstantNull Result Type '4[%_arr_2_uint_4]' cannot have a " + "null value.")); } TEST_F(ValidateIdWithMessage, OpConstantNullStructBad) { @@ -1239,10 +1421,9 @@ TEST_F(ValidateIdWithMessage, OpConstantNullStructBad) { %4 = OpConstantNull %3)"; CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); - EXPECT_THAT( - getDiagnosticString(), - HasSubstr( - "OpConstantNull Result Type '2' cannot have a null value.")); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("OpConstantNull Result Type '2[%_struct_2]' " + "cannot have a null value.")); } TEST_F(ValidateIdWithMessage, OpConstantNullRuntimeArrayBad) { @@ -1255,7 +1436,8 @@ TEST_F(ValidateIdWithMessage, OpConstantNullRuntimeArrayBad) { EXPECT_THAT( getDiagnosticString(), HasSubstr( - "OpConstantNull Result Type '2' cannot have a null value.")); + "OpConstantNull Result Type '2[%_runtimearr_bool]' cannot have " + "a null value.")); } TEST_F(ValidateIdWithMessage, OpSpecConstantTrueGood) { @@ -1361,9 +1543,9 @@ TEST_F(ValidateIdWithMessage, OpSpecConstantCompositeVectorConstituentTypeBad) { CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpSpecConstantComposite Constituent '5's type " - "does not match Result Type '2's vector element " - "type.")); + HasSubstr("OpSpecConstantComposite Constituent " + "'5[%uint_42]'s type does not match Result Type " + "'2[%v4float]'s vector element type.")); } // Invalid: Constituent is not a constant @@ -1374,12 +1556,14 @@ TEST_F(ValidateIdWithMessage, %2 = OpTypeVector %1 4 %3 = OpTypeInt 32 0 %4 = OpSpecConstant %1 3.14 -%6 = OpSpecConstantComposite %2 %3 %4 %4 %4)"; +%5 = OpTypePointer Uniform %1 +%6 = OpVariable %5 Uniform +%7 = OpSpecConstantComposite %2 %6 %4 %4 %4)"; CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpSpecConstantComposite Constituent '3' is not a " - "constant or undef.")); + HasSubstr("OpSpecConstantComposite Constituent '6[%6]' is " + "not a constant or undef.")); } // Invalid: Vector contains a mix of Undef-int and Float. @@ -1395,9 +1579,9 @@ TEST_F(ValidateIdWithMessage, CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpSpecConstantComposite Constituent '5's type " - "does not match Result Type '2's vector element " - "type.")); + HasSubstr("OpSpecConstantComposite Constituent '5[%5]'s " + "type does not match Result Type '2[%v4float]'s " + "vector element type.")); } // Invalid: Vector expects 3 components, but 4 specified. @@ -1412,8 +1596,8 @@ TEST_F(ValidateIdWithMessage, OpSpecConstantCompositeVectorNumComponentsBad) { EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), HasSubstr("OpSpecConstantComposite Constituent count does " - "not match Result Type '2's vector component " - "count.")); + "not match Result Type '2[%v3float]'s vector " + "component count.")); } // Valid: 4x4 matrix of floats @@ -1467,9 +1651,9 @@ TEST_F(ValidateIdWithMessage, OpSpecConstantCompositeMatrixConstituentTypeBad) { CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpSpecConstantComposite Constituent '10' vector " - "component count does not match Result Type '4's " - "vector component count.")); + HasSubstr("OpSpecConstantComposite Constituent '10[%10]' " + "vector component count does not match Result Type " + " '4[%mat4v4float]'s vector component count.")); } // Invalid: Matrix type expects 4 columns but only 3 specified. @@ -1489,7 +1673,8 @@ TEST_F(ValidateIdWithMessage, OpSpecConstantCompositeMatrixNumColsBad) { EXPECT_THAT( getDiagnosticString(), HasSubstr("OpSpecConstantComposite Constituent count does " - "not match Result Type '3's matrix column count.")); + "not match Result Type '3[%mat4v4float]'s matrix column " + "count.")); } // Invalid: Composite contains a non-const/undef component @@ -1501,12 +1686,14 @@ TEST_F(ValidateIdWithMessage, %3 = OpTypeVector %1 4 %4 = OpTypeMatrix %3 4 %5 = OpSpecConstantComposite %3 %2 %2 %2 %2 - %6 = OpSpecConstantComposite %4 %5 %5 %5 %1)"; + %6 = OpTypePointer Uniform %1 + %7 = OpVariable %6 Uniform + %8 = OpSpecConstantComposite %4 %5 %5 %5 %7)"; CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpSpecConstantComposite Constituent '1' is not a " - "constant composite or undef.")); + HasSubstr("OpSpecConstantComposite Constituent '7[%7]' is " + "not a constant composite or undef.")); } // Invalid: Composite contains a column that is *not* a vector (it's an array) @@ -1525,9 +1712,9 @@ TEST_F(ValidateIdWithMessage, OpSpecConstantCompositeMatrixColTypeBad) { CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpSpecConstantComposite Constituent '8' type " - "does not match Result Type '7's matrix column " - "type.")); + HasSubstr("OpSpecConstantComposite Constituent '8[%8]' type " + "does not match Result Type '7[%mat4v4float]'s " + "matrix column type.")); } // Invalid: Matrix with an Undef column of the wrong size. @@ -1548,9 +1735,9 @@ TEST_F(ValidateIdWithMessage, CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpSpecConstantComposite Constituent '10' vector " - "component count does not match Result Type '4's " - "vector component count.")); + HasSubstr("OpSpecConstantComposite Constituent '10[%10]' " + "vector component count does not match Result Type " + " '4[%mat4v4float]'s vector component count.")); } // Invalid: Matrix in which some columns are Int and some are Float. @@ -1569,9 +1756,9 @@ TEST_F(ValidateIdWithMessage, OpSpecConstantCompositeMatrixColumnTypeBad) { CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpSpecConstantComposite Constituent '8' " - "component type does not match Result Type '5's " - "matrix column component type.")); + HasSubstr("OpSpecConstantComposite Constituent '8[%8]' " + "component type does not match Result Type " + "'5[%mat2v2float]'s matrix column component type.")); } // Valid: Array of integers @@ -1599,7 +1786,8 @@ TEST_F(ValidateIdWithMessage, OpSpecConstantCompositeArrayNumComponentsBad) { EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), HasSubstr("OpSpecConstantComposite Constituent count does not " - "match Result Type '3's array length.")); + "match Result Type '3[%_arr_uint_uint_4]'s array " + "length.")); } // Valid: Array of Integers and Undef-int @@ -1620,12 +1808,14 @@ TEST_F(ValidateIdWithMessage, OpSpecConstantCompositeArrayConstConstituentBad) { %1 = OpTypeInt 32 0 %2 = OpConstant %1 4 %3 = OpTypeArray %1 %2 -%4 = OpSpecConstantComposite %3 %2 %2 %2 %1)"; +%4 = OpTypePointer Uniform %1 +%5 = OpVariable %4 Uniform +%6 = OpSpecConstantComposite %3 %2 %2 %2 %5)"; CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpSpecConstantComposite Constituent '1' is not a " - "constant or undef.")); + HasSubstr("OpSpecConstantComposite Constituent '5[%5]' is " + "not a constant or undef.")); } // Invalid: Array has a mix of Int and Float components. @@ -1640,9 +1830,9 @@ TEST_F(ValidateIdWithMessage, OpSpecConstantCompositeArrayConstituentTypeBad) { CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpSpecConstantComposite Constituent '5's type " - "does not match Result Type '3's array element " - "type.")); + HasSubstr("OpSpecConstantComposite Constituent '5[%5]'s " + "type does not match Result Type " + "'3[%_arr_uint_uint_4]'s array element type.")); } // Invalid: Array has a mix of Int and Undef-float. @@ -1658,9 +1848,9 @@ TEST_F(ValidateIdWithMessage, CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpSpecConstantComposite Constituent '5's type " - "does not match Result Type '3's array element " - "type.")); + HasSubstr("OpSpecConstantComposite Constituent '5[%5]'s " + "type does not match Result Type " + "'3[%_arr_uint_2]'s array element type.")); } // Valid: Struct of {Int32,Int32,Int64}. @@ -1688,9 +1878,9 @@ TEST_F(ValidateIdWithMessage, CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpSpecConstantComposite Constituent '2' count " - "does not match Result Type '2's struct member " - "count.")); + HasSubstr("OpSpecConstantComposite Constituent " + "'2[%_struct_2]' count does not match Result Type " + " '2[%_struct_2]'s struct member count.")); } // Valid: Struct uses Undef-int64. @@ -1714,12 +1904,14 @@ TEST_F(ValidateIdWithMessage, OpSpecConstantCompositeStructNonConstBad) { %3 = OpTypeStruct %1 %1 %2 %4 = OpSpecConstant %1 42 %5 = OpUndef %2 -%6 = OpSpecConstantComposite %3 %4 %1 %5)"; +%6 = OpTypePointer Uniform %1 +%7 = OpVariable %6 Uniform +%8 = OpSpecConstantComposite %3 %4 %7 %5)"; CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpSpecConstantComposite Constituent '1' is not a " - "constant or undef.")); + HasSubstr("OpSpecConstantComposite Constituent '7[%7]' is " + "not a constant or undef.")); } // Invalid: Struct component type does not match expected specialization type. @@ -1735,9 +1927,9 @@ TEST_F(ValidateIdWithMessage, OpSpecConstantCompositeStructMemberTypeBad) { CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpSpecConstantComposite Constituent '5' type " - "does not match the Result Type '3's member " - "type.")); + HasSubstr("OpSpecConstantComposite Constituent '5[%5]' type " + "does not match the Result Type '3[%_struct_3]'s " + "member type.")); } // Invalid: Undef-int64 used when Int32 was expected. @@ -1752,9 +1944,9 @@ TEST_F(ValidateIdWithMessage, OpSpecConstantCompositeStructMemberUndefTypeBad) { CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpSpecConstantComposite Constituent '5' type " - "does not match the Result Type '3's member " - "type.")); + HasSubstr("OpSpecConstantComposite Constituent '5[%5]' type " + "does not match the Result Type '3[%_struct_3]'s " + "member type.")); } // TODO: OpSpecConstantOp @@ -1781,8 +1973,9 @@ TEST_F(ValidateIdWithMessage, OpVariableInitializerGlobalVariableGood) { %1 = OpTypeInt 32 0 %2 = OpTypePointer Uniform %1 %3 = OpVariable %2 Uniform -%4 = OpTypePointer Uniform %2 ; pointer to pointer -%5 = OpVariable %4 Uniform %3)"; +%4 = OpTypePointer Private %2 ; pointer to pointer +%5 = OpVariable %4 Private %3 +)"; CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_SUCCESS, ValidateInstructions()); } @@ -1795,7 +1988,8 @@ TEST_F(ValidateIdWithMessage, OpVariableResultTypeBad) { EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), - HasSubstr("OpVariable Result Type '1' is not a pointer type.")); + HasSubstr("OpVariable Result Type '1[%uint]' is not a pointer " + "type.")); } TEST_F(ValidateIdWithMessage, OpVariableInitializerIsTypeBad) { std::string spirv = kGLSL450MemoryModel + R"( @@ -1804,9 +1998,8 @@ TEST_F(ValidateIdWithMessage, OpVariableInitializerIsTypeBad) { %3 = OpVariable %2 Input %2)"; CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); - EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpVariable Initializer '2' is not a constant or " - "module-scope variable")); + EXPECT_THAT(getDiagnosticString(), HasSubstr("Operand 2[%_ptr_Input_uint] " + "cannot be a type")); } TEST_F(ValidateIdWithMessage, OpVariableInitializerIsFunctionVarBad) { @@ -1826,8 +2019,8 @@ OpFunctionEnd CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpVariable Initializer '8' is not a constant or " - "module-scope variable")); + HasSubstr("OpVariable Initializer '8[%8]' is not a constant " + "or module-scope variable")); } TEST_F(ValidateIdWithMessage, OpVariableInitializerIsModuleVarGood) { @@ -1848,6 +2041,209 @@ OpFunctionEnd EXPECT_EQ(SPV_SUCCESS, ValidateInstructions()); } +TEST_F(ValidateIdWithMessage, OpVariableContainsBoolBad) { + std::string spirv = kGLSL450MemoryModel + R"( +%bool = OpTypeBool +%int = OpTypeInt 32 0 +%block = OpTypeStruct %bool %int +%_ptr_Uniform_block = OpTypePointer Uniform %block +%var = OpVariable %_ptr_Uniform_block Uniform +%void = OpTypeVoid +%fnty = OpTypeFunction %void +%main = OpFunction %void None %fnty +%entry = OpLabel +%load = OpLoad %block %var +OpReturn +OpFunctionEnd +)"; + CompileSuccessfully(spirv.c_str()); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("If OpTypeBool is stored in conjunction with OpVariable" + ", it can only be used with non-externally visible " + "shader Storage Classes: Workgroup, CrossWorkgroup, " + "Private, and Function")); +} + +TEST_F(ValidateIdWithMessage, OpVariableContainsBoolPointerGood) { + std::string spirv = kGLSL450MemoryModel + R"( +%bool = OpTypeBool +%boolptr = OpTypePointer Uniform %bool +%int = OpTypeInt 32 0 +%block = OpTypeStruct %boolptr %int +%_ptr_Uniform_block = OpTypePointer Uniform %block +%var = OpVariable %_ptr_Uniform_block Uniform +%void = OpTypeVoid +%fnty = OpTypeFunction %void +%main = OpFunction %void None %fnty +%entry = OpLabel +%load = OpLoad %block %var +OpReturn +OpFunctionEnd +)"; + CompileSuccessfully(spirv.c_str()); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions()); +} + +TEST_F(ValidateIdWithMessage, OpVariableContainsBuiltinBoolGood) { + std::string spirv = kGLSL450MemoryModel + R"( +OpMemberDecorate %input 0 BuiltIn FrontFacing +%bool = OpTypeBool +%input = OpTypeStruct %bool +%_ptr_input = OpTypePointer Input %input +%var = OpVariable %_ptr_input Input +%void = OpTypeVoid +%fnty = OpTypeFunction %void +%main = OpFunction %void None %fnty +%entry = OpLabel +%load = OpLoad %input %var +OpReturn +OpFunctionEnd +)"; + CompileSuccessfully(spirv.c_str()); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions()); +} + +TEST_F(ValidateIdWithMessage, OpVariableContainsRayPayloadBoolGood) { + std::string spirv = R"( +OpCapability RayTracingNV +OpCapability Shader +OpCapability Linkage +OpExtension "SPV_NV_ray_tracing" +OpMemoryModel Logical GLSL450 +%bool = OpTypeBool +%PerRayData = OpTypeStruct %bool +%_ptr_PerRayData = OpTypePointer RayPayloadNV %PerRayData +%var = OpVariable %_ptr_PerRayData RayPayloadNV +%void = OpTypeVoid +%fnty = OpTypeFunction %void +%main = OpFunction %void None %fnty +%entry = OpLabel +%load = OpLoad %PerRayData %var +OpReturn +OpFunctionEnd +)"; + CompileSuccessfully(spirv.c_str()); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions()); +} + +TEST_F(ValidateIdWithMessage, OpVariablePointerNoVariablePointersBad) { + const std::string spirv = R"( +OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%_ptr_workgroup_int = OpTypePointer Workgroup %int +%_ptr_function_ptr = OpTypePointer Function %_ptr_workgroup_int +%voidfn = OpTypeFunction %void +%func = OpFunction %void None %voidfn +%entry = OpLabel +%var = OpVariable %_ptr_function_ptr Function +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr( + "In Logical addressing, variables may not allocate a pointer type")); +} + +TEST_F(ValidateIdWithMessage, + OpVariablePointerNoVariablePointersRelaxedLogicalGood) { + const std::string spirv = R"( +OpCapability Shader +OpCapability Linkage +OpMemoryModel Logical GLSL450 +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%_ptr_workgroup_int = OpTypePointer Workgroup %int +%_ptr_function_ptr = OpTypePointer Function %_ptr_workgroup_int +%voidfn = OpTypeFunction %void +%func = OpFunction %void None %voidfn +%entry = OpLabel +%var = OpVariable %_ptr_function_ptr Function +OpReturn +OpFunctionEnd +)"; + + auto options = getValidatorOptions(); + options->relax_logical_pointer = true; + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions()); +} + +TEST_F(ValidateIdWithMessage, + OpVariablePointerVariablePointersStorageBufferGood) { + const std::string spirv = R"( +OpCapability Shader +OpCapability Linkage +OpCapability VariablePointersStorageBuffer +OpExtension "SPV_KHR_variable_pointers" +OpMemoryModel Logical GLSL450 +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%_ptr_workgroup_int = OpTypePointer Workgroup %int +%_ptr_function_ptr = OpTypePointer Function %_ptr_workgroup_int +%voidfn = OpTypeFunction %void +%func = OpFunction %void None %voidfn +%entry = OpLabel +%var = OpVariable %_ptr_function_ptr Function +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions()); +} + +TEST_F(ValidateIdWithMessage, OpVariablePointerVariablePointersGood) { + const std::string spirv = R"( +OpCapability Shader +OpCapability Linkage +OpCapability VariablePointers +OpExtension "SPV_KHR_variable_pointers" +OpMemoryModel Logical GLSL450 +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%_ptr_workgroup_int = OpTypePointer Workgroup %int +%_ptr_function_ptr = OpTypePointer Function %_ptr_workgroup_int +%voidfn = OpTypeFunction %void +%func = OpFunction %void None %voidfn +%entry = OpLabel +%var = OpVariable %_ptr_function_ptr Function +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions()); +} + +TEST_F(ValidateIdWithMessage, OpVariablePointerVariablePointersBad) { + const std::string spirv = R"( +OpCapability Shader +OpCapability VariablePointers +OpExtension "SPV_KHR_variable_pointers" +OpMemoryModel Logical GLSL450 +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%_ptr_workgroup_int = OpTypePointer Workgroup %int +%_ptr_uniform_ptr = OpTypePointer Uniform %_ptr_workgroup_int +%var = OpVariable %_ptr_uniform_ptr Uniform +)"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("In Logical addressing with variable pointers, " + "variables that allocate pointers must be in Function " + "or Private storage classes")); +} + TEST_F(ValidateIdWithMessage, OpLoadGood) { std::string spirv = kGLSL450MemoryModel + R"( %1 = OpTypeVoid @@ -1979,9 +2375,9 @@ TEST_F(ValidateIdWithMessage, OpLoadVarPtrOpPhiGood) { EXPECT_EQ(SPV_SUCCESS, ValidateInstructions()); } -// Without the VariablePointers Capability, OpLoad will not allow loading -// through a variable pointer. -TEST_F(ValidateIdWithMessage, OpLoadVarPtrOpPhiBad) { +// Without the VariablePointers Capability, OpPhi can have a pointer result +// type. +TEST_F(ValidateIdWithMessage, OpPhiBad) { std::string result_strategy = R"( %is_neg = OpSLessThan %bool %i %zero OpSelectionMerge %end_label None @@ -2000,8 +2396,10 @@ TEST_F(ValidateIdWithMessage, OpLoadVarPtrOpPhiBad) { false /* Add VariablePointers Capability?*/, false /* Use Helper Function? */); CompileSuccessfully(spirv.str()); - EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); - EXPECT_THAT(getDiagnosticString(), HasSubstr("is not a logical pointer")); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Using pointers with OpPhi requires capability " + "VariablePointers or VariablePointersStorageBuffer")); } // With the VariablePointer Capability, OpLoad should allow loading through a @@ -2038,8 +2436,9 @@ TEST_F(ValidateIdWithMessage, OpLoadResultTypeBad) { CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpLoad Result Type '3' does not match Pointer " - " '5's type.")); + HasSubstr("OpLoad Result Type " + "'3[%_ptr_UniformConstant_uint]' does not match " + "Pointer '5[%5]'s type.")); } TEST_F(ValidateIdWithMessage, OpLoadPointerBad) { @@ -2058,7 +2457,8 @@ TEST_F(ValidateIdWithMessage, OpLoadPointerBad) { EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); // Prove that SSA checks trigger for a bad Id value. // The next test case show the not-a-logical-pointer case. - EXPECT_THAT(getDiagnosticString(), HasSubstr("ID 8 has not been defined")); + EXPECT_THAT(getDiagnosticString(), HasSubstr("ID 8[%8] has not been " + "defined")); } // Disabled as bitcasting type to object is now not valid. @@ -2094,7 +2494,7 @@ TEST_F(ValidateIdWithMessage, OpStoreGood) { %3 = OpTypePointer Uniform %2 %4 = OpTypeFunction %1 %5 = OpConstant %2 42 -%6 = OpVariable %3 UniformConstant +%6 = OpVariable %3 Uniform %7 = OpFunction %1 None %4 %8 = OpLabel OpStore %6 %5 @@ -2111,15 +2511,17 @@ TEST_F(ValidateIdWithMessage, OpStorePointerBad) { %4 = OpTypeFunction %1 %5 = OpConstant %2 42 %6 = OpVariable %3 UniformConstant -%7 = OpFunction %1 None %4 -%8 = OpLabel - OpStore %3 %5 +%7 = OpConstant %2 0 +%8 = OpFunction %1 None %4 +%9 = OpLabel + OpStore %7 %5 OpReturn OpFunctionEnd)"; CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpStore Pointer '3' is not a logical pointer.")); + HasSubstr("OpStore Pointer '7[%uint_0]' is not a logical " + "pointer.")); } // Disabled as bitcasting type to object is now not valid. @@ -2189,7 +2591,7 @@ TEST_F(ValidateIdWithMessage, OpStoreObjectGood) { %3 = OpTypePointer Uniform %2 %4 = OpTypeFunction %1 %5 = OpConstant %2 42 -%6 = OpVariable %3 UniformConstant +%6 = OpVariable %3 Uniform %7 = OpFunction %1 None %4 %8 = OpLabel %9 = OpUndef %1 @@ -2199,7 +2601,7 @@ TEST_F(ValidateIdWithMessage, OpStoreObjectGood) { CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpStore Object '9's type is void.")); + HasSubstr("OpStore Object '9[%9]'s type is void.")); } TEST_F(ValidateIdWithMessage, OpStoreTypeBad) { std::string spirv = kGLSL450MemoryModel + R"( @@ -2209,7 +2611,7 @@ TEST_F(ValidateIdWithMessage, OpStoreTypeBad) { %3 = OpTypePointer Uniform %2 %4 = OpTypeFunction %1 %5 = OpConstant %9 3.14 -%6 = OpVariable %3 UniformConstant +%6 = OpVariable %3 Uniform %7 = OpFunction %1 None %4 %8 = OpLabel OpStore %6 %5 @@ -2218,8 +2620,8 @@ TEST_F(ValidateIdWithMessage, OpStoreTypeBad) { CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpStore Pointer '7's type does not match Object " - " '6's type.")); + HasSubstr("OpStore Pointer '7[%7]'s type does not match " + "Object '6[%float_3_1400001]'s type.")); } // The next series of test check test a relaxation of the rules for stores to @@ -2251,8 +2653,8 @@ TEST_F(ValidateIdWithMessage, OpStoreTypeBadStruct) { CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpStore Pointer '8's type does not match Object " - " '11's type.")); + HasSubstr("OpStore Pointer '8[%8]'s type does not match " + "Object '11[%11]'s type.")); } // Same code as the last test. The difference is that we relax the rule. @@ -2382,8 +2784,8 @@ TEST_F(ValidateIdWithMessage, OpStoreTypeBadRelaxedStruct1) { EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), - HasSubstr("OpStore Pointer '13's layout does not match Object " - " '16's layout.")); + HasSubstr("OpStore Pointer '13[%13]'s layout does not match Object " + " '16[%16]'s layout.")); } // This test check that the even with the relaxed rules an error is identified @@ -2422,8 +2824,8 @@ TEST_F(ValidateIdWithMessage, OpStoreTypeBadRelaxedStruct2) { EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), - HasSubstr("OpStore Pointer '13's layout does not match Object " - " '16's layout.")); + HasSubstr("OpStore Pointer '13[%13]'s layout does not match Object " + " '16[%16]'s layout.")); } TEST_F(ValidateIdWithMessage, OpStoreTypeRelaxedLogicalPointerReturnPointer) { @@ -2474,7 +2876,7 @@ TEST_F(ValidateIdWithMessage, OpStoreVoid) { %2 = OpTypeInt 32 0 %3 = OpTypePointer Uniform %2 %4 = OpTypeFunction %1 -%6 = OpVariable %3 UniformConstant +%6 = OpVariable %3 Uniform %7 = OpFunction %1 None %4 %8 = OpLabel %9 = OpFunctionCall %1 %7 @@ -2484,7 +2886,7 @@ TEST_F(ValidateIdWithMessage, OpStoreVoid) { CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpStore Object '8's type is void.")); + HasSubstr("OpStore Object '8[%8]'s type is void.")); } TEST_F(ValidateIdWithMessage, OpStoreLabel) { @@ -2493,7 +2895,7 @@ TEST_F(ValidateIdWithMessage, OpStoreLabel) { %2 = OpTypeInt 32 0 %3 = OpTypePointer Uniform %2 %4 = OpTypeFunction %1 -%6 = OpVariable %3 UniformConstant +%6 = OpVariable %3 Uniform %7 = OpFunction %1 None %4 %8 = OpLabel OpStore %6 %8 @@ -2502,7 +2904,7 @@ TEST_F(ValidateIdWithMessage, OpStoreLabel) { CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpStore Object '7' is not an object.")); + HasSubstr("Operand 7[%7] requires a type")); } // TODO: enable when this bug is fixed: @@ -2599,7 +3001,7 @@ OpFunctionEnd CompileSuccessfully(spirv); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("Target operand '6' is not a pointer.")); + HasSubstr("Target operand '6[%6]' is not a pointer.")); } TEST_F(ValidateIdWithMessage, OpCopyMemoryNonPointerSource) { @@ -2620,7 +3022,7 @@ OpFunctionEnd CompileSuccessfully(spirv); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("Source operand '6' is not a pointer.")); + HasSubstr("Source operand '6[%6]' is not a pointer.")); } TEST_F(ValidateIdWithMessage, OpCopyMemoryBad) { @@ -2643,8 +3045,8 @@ TEST_F(ValidateIdWithMessage, OpCopyMemoryBad) { CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("Target '5's type does not match " - "Source '2's type.")); + HasSubstr("Target '5[%5]'s type does not match " + "Source '2[%uint]'s type.")); } TEST_F(ValidateIdWithMessage, OpCopyMemoryVoidTarget) { @@ -2666,7 +3068,8 @@ OpFunctionEnd CompileSuccessfully(spirv); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("Target operand '7' cannot be a void pointer.")); + HasSubstr("Target operand '7[%7]' cannot be a void " + "pointer.")); } TEST_F(ValidateIdWithMessage, OpCopyMemoryVoidSource) { @@ -2688,7 +3091,8 @@ OpFunctionEnd CompileSuccessfully(spirv); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("Source operand '7' cannot be a void pointer.")); + HasSubstr("Source operand '7[%7]' cannot be a void " + "pointer.")); } TEST_F(ValidateIdWithMessage, OpCopyMemorySizedGood) { @@ -2720,13 +3124,13 @@ TEST_F(ValidateIdWithMessage, OpCopyMemorySizedTargetBad) { %7 = OpTypeFunction %1 %8 = OpFunction %1 None %7 %9 = OpLabel - OpCopyMemorySized %9 %6 %5 None + OpCopyMemorySized %5 %5 %5 None OpReturn OpFunctionEnd)"; CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("Target operand '9' is not a pointer.")); + HasSubstr("Target operand '5[%uint_4]' is not a pointer.")); } TEST_F(ValidateIdWithMessage, OpCopyMemorySizedSourceBad) { std::string spirv = kGLSL450MemoryModel + R"( @@ -2745,7 +3149,7 @@ TEST_F(ValidateIdWithMessage, OpCopyMemorySizedSourceBad) { CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("Source operand '5' is not a pointer.")); + HasSubstr("Source operand '5[%uint_4]' is not a pointer.")); } TEST_F(ValidateIdWithMessage, OpCopyMemorySizedSizeBad) { std::string spirv = kGLSL450MemoryModel + R"( @@ -2766,7 +3170,7 @@ TEST_F(ValidateIdWithMessage, OpCopyMemorySizedSizeBad) { EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), - HasSubstr("Size operand '6' must be a scalar integer type.")); + HasSubstr("Size operand '6[%6]' must be a scalar integer type.")); } TEST_F(ValidateIdWithMessage, OpCopyMemorySizedSizeTypeBad) { std::string spirv = kGLSL450MemoryModel + R"( @@ -2789,7 +3193,8 @@ TEST_F(ValidateIdWithMessage, OpCopyMemorySizedSizeTypeBad) { EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), - HasSubstr("Size operand '9' must be a scalar integer type.")); + HasSubstr("Size operand '9[%float_1]' must be a scalar integer " + "type.")); } TEST_F(ValidateIdWithMessage, OpCopyMemorySizedSizeConstantNull) { @@ -2813,7 +3218,8 @@ OpFunctionEnd CompileSuccessfully(spirv); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("Size operand '3' cannot be a constant zero.")); + HasSubstr("Size operand '3[%3]' cannot be a constant " + "zero.")); } TEST_F(ValidateIdWithMessage, OpCopyMemorySizedSizeConstantZero) { @@ -2837,7 +3243,8 @@ OpFunctionEnd CompileSuccessfully(spirv); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("Size operand '3' cannot be a constant zero.")); + HasSubstr("Size operand '3[%uint_0]' cannot be a constant " + "zero.")); } TEST_F(ValidateIdWithMessage, OpCopyMemorySizedSizeConstantZero64) { @@ -2861,7 +3268,8 @@ OpFunctionEnd CompileSuccessfully(spirv); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("Size operand '3' cannot be a constant zero.")); + HasSubstr("Size operand '3[%ulong_0]' cannot be a constant " + "zero.")); } TEST_F(ValidateIdWithMessage, OpCopyMemorySizedSizeConstantNegative) { @@ -2886,7 +3294,8 @@ OpFunctionEnd EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), - HasSubstr("Size operand '3' cannot have the sign bit set to 1.")); + HasSubstr("Size operand '3[%int_n1]' cannot have the sign bit set " + "to 1.")); } TEST_F(ValidateIdWithMessage, OpCopyMemorySizedSizeConstantNegative64) { @@ -2911,7 +3320,8 @@ OpFunctionEnd EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), - HasSubstr("Size operand '3' cannot have the sign bit set to 1.")); + HasSubstr("Size operand '3[%long_n1]' cannot have the sign bit set " + "to 1.")); } TEST_F(ValidateIdWithMessage, OpCopyMemorySizedSizeUnsignedNegative) { @@ -2991,15 +3401,14 @@ const char kDeeplyNestedStructureSetup[] = R"( ; } %f32arr = OpTypeRuntimeArray %float -%bool = OpTypeBool %v4float = OpTypeVector %float 4 %array5_mat4x3 = OpTypeArray %mat4x3 %int_5 %array5_vec4 = OpTypeArray %v4float %int_5 %_ptr_Uniform_float = OpTypePointer Uniform %float %_ptr_Function_vec4 = OpTypePointer Function %v4float %_ptr_Uniform_vec4 = OpTypePointer Uniform %v4float -%struct_s = OpTypeStruct %bool %array5_vec4 %int %array5_mat4x3 -%struct_blockName = OpTypeStruct %struct_s %bool %f32arr +%struct_s = OpTypeStruct %int %array5_vec4 %int %array5_mat4x3 +%struct_blockName = OpTypeStruct %struct_s %int %f32arr %_ptr_Uniform_blockName = OpTypePointer Uniform %struct_blockName %_ptr_Uniform_struct_s = OpTypePointer Uniform %struct_s %_ptr_Uniform_array5_mat4x3 = OpTypePointer Uniform %array5_mat4x3 @@ -3007,6 +3416,7 @@ const char kDeeplyNestedStructureSetup[] = R"( %_ptr_Uniform_v3float = OpTypePointer Uniform %v3float %blockName_var = OpVariable %_ptr_Uniform_blockName Uniform %spec_int = OpSpecConstant %int 2 +%float_0 = OpConstant %float 0 %func = OpFunction %void None %void_f %my_label = OpLabel )"; @@ -3051,7 +3461,7 @@ OpFunctionEnd )"; const std::string expected_err = "The Result Type of " + instr + - " '36' must be " + " '36[%36]' must be " "OpTypePointer. Found OpTypeFloat."; CompileSuccessfully(spirv); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); @@ -3069,12 +3479,10 @@ TEST_P(AccessChainInstructionTest, AccessChainBaseTypeVoidBad) { OpReturn OpFunctionEnd )"; - const std::string expected_err = "The Base '1' in " + instr + - " instruction must " - "be a pointer."; CompileSuccessfully(spirv); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); - EXPECT_THAT(getDiagnosticString(), HasSubstr(expected_err)); + EXPECT_THAT(getDiagnosticString(), HasSubstr("Operand 1[%void] cannot be a " + "type")); } // Invalid. The base type of an access chain instruction must be a pointer. @@ -3089,12 +3497,10 @@ TEST_P(AccessChainInstructionTest, AccessChainBaseTypeNonPtrVariableBad) { OpReturn OpFunctionEnd )"; - const std::string expected_err = "The Base '8' in " + instr + - " instruction must " - "be a pointer."; CompileSuccessfully(spirv); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); - EXPECT_THAT(getDiagnosticString(), HasSubstr(expected_err)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Operand 8[%_ptr_Private_float] cannot be a type")); } // Invalid: The storage class of Base and Result do not match. @@ -3313,7 +3719,7 @@ TEST_P(AccessChainInstructionTest, AccessChainUndefinedIndexBad) { std::string spirv = kGLSL450MemoryModel + kDeeplyNestedStructureSetup + R"( %entry = )" + instr + R"( %_ptr_Private_float %my_matrix )" + elem + - R"(%float %int_1 + R"(%float_0 %int_1 OpReturn OpFunctionEnd )"; @@ -3397,8 +3803,8 @@ OpFunctionEnd )"; const std::string expected_err = "Index is out of bounds: " + instr + " can not find index 3 into the structure " - " '26'. This structure has 3 members. " - "Largest valid index is 2."; + " '25[%_struct_25]'. This structure " + "has 3 members. Largest valid index is 2."; CompileSuccessfully(spirv); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), HasSubstr(expected_err)); @@ -3544,8 +3950,9 @@ TEST_F(ValidateIdWithMessage, OpFunctionResultTypeBad) { CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpFunction Result Type '2' does not match the " - "Function Type's return type '1'.")); + HasSubstr("OpFunction Result Type '2[%uint]' does not " + "match the Function Type's return type " + "'1[%void]'.")); } TEST_F(ValidateIdWithMessage, OpReturnValueTypeBad) { std::string spirv = kGLSL450MemoryModel + R"( @@ -3560,8 +3967,8 @@ TEST_F(ValidateIdWithMessage, OpReturnValueTypeBad) { CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpReturnValue Value '3's type does not match " - "OpFunction's return type.")); + HasSubstr("OpReturnValue Value '3[%float_0]'s type does " + "not match OpFunction's return type.")); } TEST_F(ValidateIdWithMessage, OpFunctionFunctionTypeBad) { std::string spirv = kGLSL450MemoryModel + R"( @@ -3575,7 +3982,8 @@ OpFunctionEnd)"; EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), - HasSubstr("OpFunction Function Type '2' is not a function type.")); + HasSubstr("OpFunction Function Type '2[%uint]' is not a function " + "type.")); } TEST_F(ValidateIdWithMessage, OpFunctionUseBad) { @@ -3591,7 +3999,7 @@ OpFunctionEnd CompileSuccessfully(spirv); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("Invalid use of function result id 3.")); + HasSubstr("Invalid use of function result id 3[%3].")); } TEST_F(ValidateIdWithMessage, OpFunctionParameterGood) { @@ -3635,8 +4043,8 @@ TEST_F(ValidateIdWithMessage, OpFunctionParameterResultTypeBad) { EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), - HasSubstr("OpFunctionParameter Result Type '1' does not match the " - "OpTypeFunction parameter type of the same index.")); + HasSubstr("OpFunctionParameter Result Type '1[%void]' does not " + "match the OpTypeFunction parameter type of the same index.")); } TEST_F(ValidateIdWithMessage, OpFunctionCallGood) { @@ -3684,8 +4092,9 @@ TEST_F(ValidateIdWithMessage, OpFunctionCallResultTypeBad) { CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpFunctionCall Result Type '1's type does not " - "match Function '2's return type.")); + HasSubstr("OpFunctionCall Result Type '1[%void]'s type " + "does not match Function '2[%uint]'s return " + "type.")); } TEST_F(ValidateIdWithMessage, OpFunctionCallFunctionBad) { std::string spirv = kGLSL450MemoryModel + R"( @@ -3703,7 +4112,8 @@ TEST_F(ValidateIdWithMessage, OpFunctionCallFunctionBad) { CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpFunctionCall Function '5' is not a function.")); + HasSubstr("OpFunctionCall Function '5[%uint_42]' is not a " + "function.")); } TEST_F(ValidateIdWithMessage, OpFunctionCallArgumentTypeBad) { std::string spirv = kGLSL450MemoryModel + R"( @@ -3731,8 +4141,9 @@ TEST_F(ValidateIdWithMessage, OpFunctionCallArgumentTypeBad) { CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpFunctionCall Argument '7's type does not match " - "Function '2's parameter type.")); + HasSubstr("OpFunctionCall Argument '7[%float_3_1400001]'s " + "type does not match Function '2[%uint]'s " + "parameter type.")); } // Valid: OpSampledImage result is used in the same block by @@ -3763,8 +4174,8 @@ OpFunctionEnd)"; getDiagnosticString(), HasSubstr("All OpSampledImage instructions must be in the same block in " "which their Result are consumed. OpSampledImage Result " - "Type '23' has a consumer in a different basic block. The " - "consumer instruction is '25'.")); + "Type '23[%23]' has a consumer in a different basic " + "block. The consumer instruction is '25[%25]'.")); } // Invalid: OpSampledImage result is used by OpSelect @@ -3968,7 +4379,7 @@ TEST_F(ValidateIdWithMessage, OpVectorShuffleComponentCount) { EXPECT_THAT( getDiagnosticString(), HasSubstr("OpVectorShuffle component literals count does not match " - "Result Type '2's vector component count.")); + "Result Type '2[%v3uint]'s vector component count.")); } TEST_F(ValidateIdWithMessage, OpVectorShuffleVector1Type) { @@ -4111,6 +4522,39 @@ TEST_F(ValidateIdWithMessage, OpVectorShuffleLiterals) { "size of 5.")); } +TEST_F(ValidateIdWithMessage, WebGPUOpVectorShuffle0xFFFFFFFFLiteralBad) { + std::string spirv = R"( + OpCapability Shader + OpCapability VulkanMemoryModelKHR + OpExtension "SPV_KHR_vulkan_memory_model" + OpMemoryModel Logical VulkanKHR +%float = OpTypeFloat 32 +%vec2 = OpTypeVector %float 2 +%vec3 = OpTypeVector %float 3 +%vec4 = OpTypeVector %float 4 +%ptr_vec2 = OpTypePointer Function %vec2 +%ptr_vec3 = OpTypePointer Function %vec3 +%float_1 = OpConstant %float 1 +%float_2 = OpConstant %float 2 +%1 = OpConstantComposite %vec2 %float_2 %float_1 +%2 = OpConstantComposite %vec3 %float_1 %float_2 %float_2 +%3 = OpTypeFunction %vec4 +%4 = OpFunction %vec4 None %3 +%5 = OpLabel +%var = OpVariable %ptr_vec2 Function %1 +%var2 = OpVariable %ptr_vec3 Function %2 +%6 = OpLoad %vec2 %var +%7 = OpLoad %vec3 %var2 +%8 = OpVectorShuffle %vec4 %6 %7 4 3 1 0xffffffff + OpReturnValue %8 + OpFunctionEnd)"; + CompileSuccessfully(spirv.c_str(), SPV_ENV_WEBGPU_0); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions(SPV_ENV_WEBGPU_0)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Component literal at operand 3 cannot be 0xFFFFFFFF in" + " WebGPU execution environment.")); +} + // TODO: OpCompositeConstruct // TODO: OpCompositeExtract // TODO: OpCompositeInsert @@ -4212,7 +4656,8 @@ OpFunctionEnd CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); - EXPECT_THAT(getDiagnosticString(), HasSubstr("ID 3 is not a type id")); + EXPECT_THAT(getDiagnosticString(), HasSubstr("ID 3[%true] is not a type " + "id")); } TEST_F(ValidateIdWithMessage, OpPhiSamePredecessor) { @@ -4324,8 +4769,9 @@ OpFunctionEnd CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpPhi's result type 2 does not match incoming " - "value 6 type 5.")); + HasSubstr("OpPhi's result type 2[%bool] does not match " + "incoming value 6[%uint_0] type " + "5[%uint].")); } TEST_F(ValidateIdWithMessage, OpPhiPredecessorNotABlock) { @@ -4349,9 +4795,9 @@ OpFunctionEnd CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); - EXPECT_THAT( - getDiagnosticString(), - HasSubstr("OpPhi's incoming basic block 3 is not an OpLabel.")); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("OpPhi's incoming basic block 3[%true] is not an " + "OpLabel.")); } TEST_F(ValidateIdWithMessage, OpPhiNotAPredecessor) { @@ -4376,8 +4822,8 @@ OpFunctionEnd CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpPhi's incoming basic block 9 is not a " - "predecessor of 8.")); + HasSubstr("OpPhi's incoming basic block 9[%9] is not a " + "predecessor of 8[%8].")); } TEST_F(ValidateIdWithMessage, OpBranchConditionalGood) { @@ -4470,6 +4916,17 @@ TEST_F(ValidateIdWithMessage, OpBranchConditional_TooManyWeights) { HasSubstr("OpBranchConditional requires either 3 or 5 parameters")); } +TEST_F(ValidateIdWithMessage, OpBranchConditional_ConditionIsAType) { + std::string spirv = BranchConditionalSetup + R"( +OpBranchConditional %bool %target_t %target_f +)" + BranchConditionalTail; + + CompileSuccessfully(spirv.c_str()); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), HasSubstr("Operand 3[%bool] cannot be a " + "type")); +} + // TODO: OpSwitch TEST_F(ValidateIdWithMessage, OpReturnValueConstantGood) { @@ -4529,9 +4986,8 @@ TEST_F(ValidateIdWithMessage, OpReturnValueIsType) { OpFunctionEnd)"; CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); - EXPECT_THAT( - getDiagnosticString(), - HasSubstr("OpReturnValue Value '1' does not represent a value.")); + EXPECT_THAT(getDiagnosticString(), HasSubstr("Operand 1[%void] cannot be a " + "type")); } TEST_F(ValidateIdWithMessage, OpReturnValueIsLabel) { @@ -4545,9 +5001,8 @@ TEST_F(ValidateIdWithMessage, OpReturnValueIsLabel) { OpFunctionEnd)"; CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); - EXPECT_THAT( - getDiagnosticString(), - HasSubstr("OpReturnValue Value '5' does not represent a value.")); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Operand 5[%5] requires a type")); } TEST_F(ValidateIdWithMessage, OpReturnValueIsVoid) { @@ -4564,7 +5019,8 @@ TEST_F(ValidateIdWithMessage, OpReturnValueIsVoid) { EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), - HasSubstr("OpReturnValue value's type '1' is missing or void.")); + HasSubstr("OpReturnValue value's type '1[%void]' is missing or " + "void.")); } TEST_F(ValidateIdWithMessage, OpReturnValueIsVariableInPhysical) { @@ -4573,7 +5029,7 @@ TEST_F(ValidateIdWithMessage, OpReturnValueIsVariableInPhysical) { OpMemoryModel Physical32 OpenCL %1 = OpTypeVoid %2 = OpTypeInt 32 0 -%3 = OpTypePointer Private %2 +%3 = OpTypePointer Function %2 %4 = OpTypeFunction %3 %5 = OpFunction %3 None %4 %6 = OpLabel @@ -4590,7 +5046,7 @@ TEST_F(ValidateIdWithMessage, OpReturnValueIsVariableInLogical) { OpMemoryModel Logical GLSL450 %1 = OpTypeVoid %2 = OpTypeInt 32 0 -%3 = OpTypePointer Private %2 +%3 = OpTypePointer Function %2 %4 = OpTypeFunction %3 %5 = OpFunction %3 None %4 %6 = OpLabel @@ -4600,8 +5056,9 @@ TEST_F(ValidateIdWithMessage, OpReturnValueIsVariableInLogical) { CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpReturnValue value's type '3' is a pointer, " - "which is invalid in the Logical addressing model.")); + HasSubstr("OpReturnValue value's type " + "'3[%_ptr_Function_uint]' is a pointer, which is " + "invalid in the Logical addressing model.")); } // With the VariablePointer Capability, the return value of a function is @@ -4673,7 +5130,8 @@ TEST_F(ValidateIdWithMessage, UndefinedIdScope) { )"; CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); - EXPECT_THAT(getDiagnosticString(), HasSubstr("ID 7 has not been defined")); + EXPECT_THAT(getDiagnosticString(), HasSubstr("ID 7[%7] has not been " + "defined")); } TEST_F(ValidateIdWithMessage, UndefinedIdMemSem) { @@ -4690,7 +5148,8 @@ TEST_F(ValidateIdWithMessage, UndefinedIdMemSem) { )"; CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); - EXPECT_THAT(getDiagnosticString(), HasSubstr("ID 7 has not been defined")); + EXPECT_THAT(getDiagnosticString(), HasSubstr("ID 7[%7] has not been " + "defined")); } TEST_F(ValidateIdWithMessage, @@ -4761,6 +5220,33 @@ TEST_F(ValidateIdWithMessage, OpPtrAccessChainGood) { EXPECT_EQ(SPV_SUCCESS, ValidateInstructions()); } +TEST_F(ValidateIdWithMessage, StgBufOpPtrAccessChainGood) { + std::string spirv = R"( + OpCapability Shader + OpCapability Linkage + OpCapability VariablePointersStorageBuffer + OpExtension "SPV_KHR_variable_pointers" + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %3 "" +%int = OpTypeInt 32 0 +%int_2 = OpConstant %int 2 +%int_4 = OpConstant %int 4 +%struct = OpTypeStruct %int +%array = OpTypeArray %struct %int_4 +%ptr = OpTypePointer StorageBuffer %array +%var = OpVariable %ptr StorageBuffer +%1 = OpTypeVoid +%2 = OpTypeFunction %1 +%3 = OpFunction %1 None %2 +%4 = OpLabel +%5 = OpPtrAccessChain %ptr %var %int_2 + OpReturn + OpFunctionEnd +)"; + CompileSuccessfully(spirv.c_str()); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions()); +} + TEST_F(ValidateIdWithMessage, OpLoadBitcastPointerGood) { std::string spirv = kOpenCLMemoryModel64 + R"( %2 = OpTypeVoid @@ -4798,7 +5284,8 @@ TEST_F(ValidateIdWithMessage, OpLoadBitcastNonPointerBad) { EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), - HasSubstr("OpLoad type for pointer '11' is not a pointer type.")); + HasSubstr("OpLoad type for pointer '11[%11]' is not a pointer " + "type.")); } TEST_F(ValidateIdWithMessage, OpStoreBitcastPointerGood) { std::string spirv = kOpenCLMemoryModel64 + R"( @@ -4838,7 +5325,8 @@ TEST_F(ValidateIdWithMessage, OpStoreBitcastNonPointerBad) { EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), - HasSubstr("OpStore type for pointer '11' is not a pointer type.")); + HasSubstr("OpStore type for pointer '11[%11]' is not a pointer " + "type.")); } // Result resulting from an instruction within a function may not be used @@ -4865,7 +5353,8 @@ OpFunctionEnd EXPECT_THAT( getDiagnosticString(), HasSubstr( - "ID 7 defined in block 6 does not dominate its use in block 9")); + "ID 7[%7] defined in block 6[%6] does not dominate its use in block " + "9[%9]")); } TEST_F(ValidateIdWithMessage, SpecIdTargetNotSpecializationConstant) { @@ -4883,8 +5372,9 @@ OpFunctionEnd CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpDecorate SpecId decoration target '1' is not a " - "scalar specialization constant.")); + HasSubstr("OpDecorate SpecId decoration target " + "'1[%uint_3]' is not a scalar specialization " + "constant.")); } TEST_F(ValidateIdWithMessage, SpecIdTargetOpSpecConstantOpBad) { @@ -4904,8 +5394,8 @@ OpFunctionEnd CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpDecorate SpecId decoration target '1' is not a " - "scalar specialization constant.")); + HasSubstr("OpDecorate SpecId decoration target '1[%1]' is " + "not a scalar specialization constant.")); } TEST_F(ValidateIdWithMessage, SpecIdTargetOpSpecConstantCompositeBad) { @@ -4924,8 +5414,8 @@ OpFunctionEnd CompileSuccessfully(spirv.c_str()); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("OpDecorate SpecId decoration target '1' is not a " - "scalar specialization constant.")); + HasSubstr("OpDecorate SpecId decoration target '1[%1]' is " + "not a scalar specialization constant.")); } TEST_F(ValidateIdWithMessage, SpecIdTargetGood) { @@ -4973,7 +5463,7 @@ TEST_F(ValidateIdWithMessage, CorrectErrorForShuffle) { HasSubstr( "Component index 4 is out of bounds for combined (Vector1 + Vector2) " "size of 4.")); - EXPECT_EQ(23, getErrorPosition().index); + EXPECT_EQ(25, getErrorPosition().index); } TEST_F(ValidateIdWithMessage, VoidStructMember) { @@ -5001,7 +5491,7 @@ TEST_F(ValidateIdWithMessage, TypeFunctionBadUse) { CompileSuccessfully(spirv); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - HasSubstr("Invalid use of function type result id 2.")); + HasSubstr("Invalid use of function type result id 2[%2].")); } TEST_F(ValidateIdWithMessage, BadTypeId) { @@ -5019,73 +5509,893 @@ TEST_F(ValidateIdWithMessage, BadTypeId) { CompileSuccessfully(spirv); EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); - EXPECT_THAT(getDiagnosticString(), HasSubstr("ID 4 is not a type id")); + EXPECT_THAT(getDiagnosticString(), HasSubstr("ID 4[%float_0] is not a type " + "id")); } -// TODO: OpLifetimeStart -// TODO: OpLifetimeStop -// TODO: OpAtomicInit -// TODO: OpAtomicLoad -// TODO: OpAtomicStore -// TODO: OpAtomicExchange -// TODO: OpAtomicCompareExchange -// TODO: OpAtomicCompareExchangeWeak -// TODO: OpAtomicIIncrement -// TODO: OpAtomicIDecrement -// TODO: OpAtomicIAdd -// TODO: OpAtomicISub -// TODO: OpAtomicUMin -// TODO: OpAtomicUMax -// TODO: OpAtomicAnd -// TODO: OpAtomicOr -// TODO: OpAtomicXor -// TODO: OpAtomicIMin -// TODO: OpAtomicIMax -// TODO: OpEmitStreamVertex -// TODO: OpEndStreamPrimitive -// TODO: OpAsyncGroupCopy -// TODO: OpWaitGroupEvents -// TODO: OpGroupAll -// TODO: OpGroupAny -// TODO: OpGroupBroadcast -// TODO: OpGroupIAdd -// TODO: OpGroupFAdd -// TODO: OpGroupFMin -// TODO: OpGroupUMin -// TODO: OpGroupSMin -// TODO: OpGroupFMax -// TODO: OpGroupUMax -// TODO: OpGroupSMax -// TODO: OpEnqueueMarker -// TODO: OpEnqueueKernel -// TODO: OpGetKernelNDrangeSubGroupCount -// TODO: OpGetKernelNDrangeMaxSubGroupSize -// TODO: OpGetKernelWorkGroupSize -// TODO: OpGetKernelPreferredWorkGroupSizeMultiple -// TODO: OpRetainEvent -// TODO: OpReleaseEvent -// TODO: OpCreateUserEvent -// TODO: OpIsValidEvent -// TODO: OpSetUserEventStatus -// TODO: OpCaptureEventProfilingInfo -// TODO: OpGetDefaultQueue -// TODO: OpBuildNDRange -// TODO: OpReadPipe -// TODO: OpWritePipe -// TODO: OpReservedReadPipe -// TODO: OpReservedWritePipe -// TODO: OpReserveReadPipePackets -// TODO: OpReserveWritePipePackets -// TODO: OpCommitReadPipe -// TODO: OpCommitWritePipe -// TODO: OpIsValidReserveId -// TODO: OpGetNumPipePackets -// TODO: OpGetMaxPipePackets -// TODO: OpGroupReserveReadPipePackets -// TODO: OpGroupReserveWritePipePackets -// TODO: OpGroupCommitReadPipe -// TODO: OpGroupCommitWritePipe +TEST_F(ValidateIdWithMessage, VulkanMemoryModelLoadMakePointerVisibleGood) { + std::string spirv = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpCapability Linkage +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +%1 = OpTypeVoid +%2 = OpTypeInt 32 0 +%3 = OpTypePointer Workgroup %2 +%4 = OpVariable %3 Workgroup +%5 = OpTypeFunction %1 +%6 = OpConstant %2 2 +%7 = OpFunction %1 None %5 +%8 = OpLabel +%9 = OpLoad %2 %4 NonPrivatePointerKHR|MakePointerVisibleKHR %6 +OpReturn +OpFunctionEnd +)"; + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); +} + +TEST_F(ValidateIdWithMessage, + VulkanMemoryModelLoadMakePointerVisibleMissingNonPrivatePointer) { + std::string spirv = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpCapability Linkage +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +%1 = OpTypeVoid +%2 = OpTypeInt 32 0 +%3 = OpTypePointer Workgroup %2 +%4 = OpVariable %3 Workgroup +%5 = OpTypeFunction %1 +%6 = OpConstant %2 2 +%7 = OpFunction %1 None %5 +%8 = OpLabel +%9 = OpLoad %2 %4 MakePointerVisibleKHR %6 +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("NonPrivatePointerKHR must be specified if " + "MakePointerVisibleKHR is specified.")); +} + +TEST_F(ValidateIdWithMessage, + VulkanMemoryModelLoadNonPrivatePointerBadStorageClass) { + std::string spirv = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpCapability Linkage +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +%1 = OpTypeVoid +%2 = OpTypeInt 32 0 +%3 = OpTypePointer Private %2 +%4 = OpVariable %3 Private +%5 = OpTypeFunction %1 +%6 = OpConstant %2 2 +%7 = OpFunction %1 None %5 +%8 = OpLabel +%9 = OpLoad %2 %4 NonPrivatePointerKHR +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("NonPrivatePointerKHR requires a pointer in Uniform, " + "Workgroup, CrossWorkgroup, Generic, Image or " + "StorageBuffer storage classes.")); +} + +TEST_F(ValidateIdWithMessage, + VulkanMemoryModelLoadMakePointerAvailableCannotBeUsed) { + std::string spirv = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpCapability Linkage +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +%1 = OpTypeVoid +%2 = OpTypeInt 32 0 +%3 = OpTypePointer Workgroup %2 +%4 = OpVariable %3 Workgroup +%5 = OpTypeFunction %1 +%6 = OpConstant %2 2 +%7 = OpFunction %1 None %5 +%8 = OpLabel +%9 = OpLoad %2 %4 NonPrivatePointerKHR|MakePointerAvailableKHR %6 +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("MakePointerAvailableKHR cannot be used with OpLoad")); +} + +TEST_F(ValidateIdWithMessage, VulkanMemoryModelStoreMakePointerAvailableGood) { + std::string spirv = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpCapability Linkage +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +%1 = OpTypeVoid +%2 = OpTypeInt 32 0 +%3 = OpTypePointer Uniform %2 +%4 = OpVariable %3 Uniform +%5 = OpTypeFunction %1 +%6 = OpConstant %2 5 +%7 = OpFunction %1 None %5 +%8 = OpLabel +OpStore %4 %6 NonPrivatePointerKHR|MakePointerAvailableKHR %6 +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); +} + +TEST_F(ValidateIdWithMessage, + VulkanMemoryModelStoreMakePointerAvailableMissingNonPrivatePointer) { + std::string spirv = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpCapability Linkage +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +%1 = OpTypeVoid +%2 = OpTypeInt 32 0 +%3 = OpTypePointer Uniform %2 +%4 = OpVariable %3 Uniform +%5 = OpTypeFunction %1 +%6 = OpConstant %2 5 +%7 = OpFunction %1 None %5 +%8 = OpLabel +OpStore %4 %6 MakePointerAvailableKHR %6 +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("NonPrivatePointerKHR must be specified if " + "MakePointerAvailableKHR is specified.")); +} + +TEST_F(ValidateIdWithMessage, + VulkanMemoryModelStoreNonPrivatePointerBadStorageClass) { + std::string spirv = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpCapability Linkage +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +%1 = OpTypeVoid +%2 = OpTypeInt 32 0 +%3 = OpTypePointer Output %2 +%4 = OpVariable %3 Output +%5 = OpTypeFunction %1 +%6 = OpConstant %2 5 +%7 = OpFunction %1 None %5 +%8 = OpLabel +OpStore %4 %6 NonPrivatePointerKHR +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("NonPrivatePointerKHR requires a pointer in Uniform, " + "Workgroup, CrossWorkgroup, Generic, Image or " + "StorageBuffer storage classes.")); +} + +TEST_F(ValidateIdWithMessage, + VulkanMemoryModelStoreMakePointerVisibleCannotBeUsed) { + std::string spirv = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpCapability Linkage +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +%1 = OpTypeVoid +%2 = OpTypeInt 32 0 +%3 = OpTypePointer Uniform %2 +%4 = OpVariable %3 Uniform +%5 = OpTypeFunction %1 +%6 = OpConstant %2 5 +%7 = OpFunction %1 None %5 +%8 = OpLabel +OpStore %4 %6 NonPrivatePointerKHR|MakePointerVisibleKHR %6 +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("MakePointerVisibleKHR cannot be used with OpStore.")); +} + +TEST_F(ValidateIdWithMessage, VulkanMemoryModelCopyMemoryAvailable) { + std::string spirv = R"( +OpCapability Shader +OpCapability Linkage +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +%1 = OpTypeVoid +%2 = OpTypeInt 32 0 +%3 = OpTypePointer Workgroup %2 +%4 = OpVariable %3 Workgroup +%5 = OpTypePointer Uniform %2 +%6 = OpVariable %5 Uniform +%7 = OpConstant %2 2 +%8 = OpConstant %2 5 +%9 = OpTypeFunction %1 +%10 = OpFunction %1 None %9 +%11 = OpLabel +OpCopyMemory %4 %6 NonPrivatePointerKHR|MakePointerAvailableKHR %7 +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); +} + +TEST_F(ValidateIdWithMessage, VulkanMemoryModelCopyMemoryVisible) { + std::string spirv = R"( +OpCapability Shader +OpCapability Linkage +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +%1 = OpTypeVoid +%2 = OpTypeInt 32 0 +%3 = OpTypePointer Workgroup %2 +%4 = OpVariable %3 Workgroup +%5 = OpTypePointer Uniform %2 +%6 = OpVariable %5 Uniform +%7 = OpConstant %2 2 +%8 = OpConstant %2 5 +%9 = OpTypeFunction %1 +%10 = OpFunction %1 None %9 +%11 = OpLabel +OpCopyMemory %4 %6 NonPrivatePointerKHR|MakePointerVisibleKHR %8 +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); +} + +TEST_F(ValidateIdWithMessage, VulkanMemoryModelCopyMemoryAvailableAndVisible) { + std::string spirv = R"( +OpCapability Shader +OpCapability Linkage +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +%1 = OpTypeVoid +%2 = OpTypeInt 32 0 +%3 = OpTypePointer Workgroup %2 +%4 = OpVariable %3 Workgroup +%5 = OpTypePointer Uniform %2 +%6 = OpVariable %5 Uniform +%7 = OpConstant %2 2 +%8 = OpConstant %2 5 +%9 = OpTypeFunction %1 +%10 = OpFunction %1 None %9 +%11 = OpLabel +OpCopyMemory %4 %6 NonPrivatePointerKHR|MakePointerAvailableKHR|MakePointerVisibleKHR %7 %8 +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); +} + +TEST_F(ValidateIdWithMessage, + VulkanMemoryModelCopyMemoryAvailableMissingNonPrivatePointer) { + std::string spirv = R"( +OpCapability Shader +OpCapability Linkage +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +%1 = OpTypeVoid +%2 = OpTypeInt 32 0 +%3 = OpTypePointer Workgroup %2 +%4 = OpVariable %3 Workgroup +%5 = OpTypePointer Uniform %2 +%6 = OpVariable %5 Uniform +%7 = OpConstant %2 2 +%8 = OpConstant %2 5 +%9 = OpTypeFunction %1 +%10 = OpFunction %1 None %9 +%11 = OpLabel +OpCopyMemory %4 %6 MakePointerAvailableKHR %7 +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("NonPrivatePointerKHR must be specified if " + "MakePointerAvailableKHR is specified.")); +} + +TEST_F(ValidateIdWithMessage, + VulkanMemoryModelCopyMemoryVisibleMissingNonPrivatePointer) { + std::string spirv = R"( +OpCapability Shader +OpCapability Linkage +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +%1 = OpTypeVoid +%2 = OpTypeInt 32 0 +%3 = OpTypePointer Workgroup %2 +%4 = OpVariable %3 Workgroup +%5 = OpTypePointer Uniform %2 +%6 = OpVariable %5 Uniform +%7 = OpConstant %2 2 +%8 = OpConstant %2 5 +%9 = OpTypeFunction %1 +%10 = OpFunction %1 None %9 +%11 = OpLabel +OpCopyMemory %4 %6 MakePointerVisibleKHR %8 +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("NonPrivatePointerKHR must be specified if " + "MakePointerVisibleKHR is specified.")); +} + +TEST_F(ValidateIdWithMessage, + VulkanMemoryModelCopyMemoryAvailableBadStorageClass) { + std::string spirv = R"( +OpCapability Shader +OpCapability Linkage +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +%1 = OpTypeVoid +%2 = OpTypeInt 32 0 +%3 = OpTypePointer Output %2 +%4 = OpVariable %3 Output +%5 = OpTypePointer Uniform %2 +%6 = OpVariable %5 Uniform +%7 = OpConstant %2 2 +%8 = OpConstant %2 5 +%9 = OpTypeFunction %1 +%10 = OpFunction %1 None %9 +%11 = OpLabel +OpCopyMemory %4 %6 NonPrivatePointerKHR +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("NonPrivatePointerKHR requires a pointer in Uniform, " + "Workgroup, CrossWorkgroup, Generic, Image or " + "StorageBuffer storage classes.")); +} + +TEST_F(ValidateIdWithMessage, + VulkanMemoryModelCopyMemoryVisibleBadStorageClass) { + std::string spirv = R"( +OpCapability Shader +OpCapability Linkage +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +%1 = OpTypeVoid +%2 = OpTypeInt 32 0 +%3 = OpTypePointer Workgroup %2 +%4 = OpVariable %3 Workgroup +%5 = OpTypePointer Input %2 +%6 = OpVariable %5 Input +%7 = OpConstant %2 2 +%8 = OpConstant %2 5 +%9 = OpTypeFunction %1 +%10 = OpFunction %1 None %9 +%11 = OpLabel +OpCopyMemory %4 %6 NonPrivatePointerKHR +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("NonPrivatePointerKHR requires a pointer in Uniform, " + "Workgroup, CrossWorkgroup, Generic, Image or " + "StorageBuffer storage classes.")); +} + +TEST_F(ValidateIdWithMessage, VulkanMemoryModelCopyMemorySizedAvailable) { + std::string spirv = R"( +OpCapability Shader +OpCapability Linkage +OpCapability Addresses +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +%1 = OpTypeVoid +%2 = OpTypeInt 32 0 +%3 = OpTypePointer Workgroup %2 +%4 = OpVariable %3 Workgroup +%5 = OpTypePointer Uniform %2 +%6 = OpVariable %5 Uniform +%7 = OpConstant %2 2 +%8 = OpConstant %2 5 +%9 = OpTypeFunction %1 +%10 = OpFunction %1 None %9 +%11 = OpLabel +OpCopyMemorySized %4 %6 %7 NonPrivatePointerKHR|MakePointerAvailableKHR %7 +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); +} + +TEST_F(ValidateIdWithMessage, VulkanMemoryModelCopyMemorySizedVisible) { + std::string spirv = R"( +OpCapability Shader +OpCapability Linkage +OpCapability Addresses +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +%1 = OpTypeVoid +%2 = OpTypeInt 32 0 +%3 = OpTypePointer Workgroup %2 +%4 = OpVariable %3 Workgroup +%5 = OpTypePointer Uniform %2 +%6 = OpVariable %5 Uniform +%7 = OpConstant %2 2 +%8 = OpConstant %2 5 +%9 = OpTypeFunction %1 +%10 = OpFunction %1 None %9 +%11 = OpLabel +OpCopyMemorySized %4 %6 %7 NonPrivatePointerKHR|MakePointerVisibleKHR %8 +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); +} + +TEST_F(ValidateIdWithMessage, + VulkanMemoryModelCopyMemorySizedAvailableAndVisible) { + std::string spirv = R"( +OpCapability Shader +OpCapability Linkage +OpCapability Addresses +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +%1 = OpTypeVoid +%2 = OpTypeInt 32 0 +%3 = OpTypePointer Workgroup %2 +%4 = OpVariable %3 Workgroup +%5 = OpTypePointer Uniform %2 +%6 = OpVariable %5 Uniform +%7 = OpConstant %2 2 +%8 = OpConstant %2 5 +%9 = OpTypeFunction %1 +%10 = OpFunction %1 None %9 +%11 = OpLabel +OpCopyMemorySized %4 %6 %7 NonPrivatePointerKHR|MakePointerAvailableKHR|MakePointerVisibleKHR %7 %8 +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); +} + +TEST_F(ValidateIdWithMessage, + VulkanMemoryModelCopyMemorySizedAvailableMissingNonPrivatePointer) { + std::string spirv = R"( +OpCapability Shader +OpCapability Linkage +OpCapability Addresses +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +%1 = OpTypeVoid +%2 = OpTypeInt 32 0 +%3 = OpTypePointer Workgroup %2 +%4 = OpVariable %3 Workgroup +%5 = OpTypePointer Uniform %2 +%6 = OpVariable %5 Uniform +%7 = OpConstant %2 2 +%8 = OpConstant %2 5 +%9 = OpTypeFunction %1 +%10 = OpFunction %1 None %9 +%11 = OpLabel +OpCopyMemorySized %4 %6 %7 MakePointerAvailableKHR %7 +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("NonPrivatePointerKHR must be specified if " + "MakePointerAvailableKHR is specified.")); +} + +TEST_F(ValidateIdWithMessage, + VulkanMemoryModelCopyMemorySizedVisibleMissingNonPrivatePointer) { + std::string spirv = R"( +OpCapability Shader +OpCapability Linkage +OpCapability Addresses +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +%1 = OpTypeVoid +%2 = OpTypeInt 32 0 +%3 = OpTypePointer Workgroup %2 +%4 = OpVariable %3 Workgroup +%5 = OpTypePointer Uniform %2 +%6 = OpVariable %5 Uniform +%7 = OpConstant %2 2 +%8 = OpConstant %2 5 +%9 = OpTypeFunction %1 +%10 = OpFunction %1 None %9 +%11 = OpLabel +OpCopyMemorySized %4 %6 %7 MakePointerVisibleKHR %8 +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("NonPrivatePointerKHR must be specified if " + "MakePointerVisibleKHR is specified.")); +} + +TEST_F(ValidateIdWithMessage, + VulkanMemoryModelCopyMemorySizedAvailableBadStorageClass) { + std::string spirv = R"( +OpCapability Shader +OpCapability Linkage +OpCapability Addresses +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +%1 = OpTypeVoid +%2 = OpTypeInt 32 0 +%3 = OpTypePointer Output %2 +%4 = OpVariable %3 Output +%5 = OpTypePointer Uniform %2 +%6 = OpVariable %5 Uniform +%7 = OpConstant %2 2 +%8 = OpConstant %2 5 +%9 = OpTypeFunction %1 +%10 = OpFunction %1 None %9 +%11 = OpLabel +OpCopyMemorySized %4 %6 %7 NonPrivatePointerKHR +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("NonPrivatePointerKHR requires a pointer in Uniform, " + "Workgroup, CrossWorkgroup, Generic, Image or " + "StorageBuffer storage classes.")); +} + +TEST_F(ValidateIdWithMessage, + VulkanMemoryModelCopyMemorySizedVisibleBadStorageClass) { + std::string spirv = R"( +OpCapability Shader +OpCapability Linkage +OpCapability Addresses +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +%1 = OpTypeVoid +%2 = OpTypeInt 32 0 +%3 = OpTypePointer Workgroup %2 +%4 = OpVariable %3 Workgroup +%5 = OpTypePointer Input %2 +%6 = OpVariable %5 Input +%7 = OpConstant %2 2 +%8 = OpConstant %2 5 +%9 = OpTypeFunction %1 +%10 = OpFunction %1 None %9 +%11 = OpLabel +OpCopyMemorySized %4 %6 %7 NonPrivatePointerKHR +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("NonPrivatePointerKHR requires a pointer in Uniform, " + "Workgroup, CrossWorkgroup, Generic, Image or " + "StorageBuffer storage classes.")); +} + +TEST_F(ValidateIdWithMessage, IdDefInUnreachableBlock1) { + const std::string spirv = kNoKernelGLSL450MemoryModel + R"( +%1 = OpTypeVoid +%2 = OpTypeFunction %1 +%3 = OpTypeFloat 32 +%4 = OpTypeFunction %3 +%5 = OpFunction %1 None %2 +%6 = OpLabel +%7 = OpFunctionCall %3 %8 +OpUnreachable +OpFunctionEnd +%8 = OpFunction %3 None %4 +%9 = OpLabel +OpReturnValue %7 +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("ID 7[%7] defined in block 6[%6] does not dominate its " + "use in block 9[%9]\n %9 = OpLabel")); +} + +TEST_F(ValidateIdWithMessage, IdDefInUnreachableBlock2) { + const std::string spirv = kNoKernelGLSL450MemoryModel + R"( +%1 = OpTypeVoid +%2 = OpTypeFunction %1 +%3 = OpTypeFloat 32 +%4 = OpTypeFunction %3 +%5 = OpFunction %1 None %2 +%6 = OpLabel +OpReturn +%7 = OpLabel +%8 = OpFunctionCall %3 %9 +OpUnreachable +OpFunctionEnd +%9 = OpFunction %3 None %4 +%10 = OpLabel +OpReturnValue %8 +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("ID 8[%8] defined in block 7[%7] does not dominate its " + "use in block 10[%10]\n %10 = OpLabel")); +} + +TEST_F(ValidateIdWithMessage, IdDefInUnreachableBlock3) { + const std::string spirv = kNoKernelGLSL450MemoryModel + R"( +%1 = OpTypeVoid +%2 = OpTypeFunction %1 +%3 = OpTypeFloat 32 +%4 = OpTypeFunction %3 +%5 = OpFunction %1 None %2 +%6 = OpLabel +OpReturn +%7 = OpLabel +%8 = OpFunctionCall %3 %9 +OpReturn +OpFunctionEnd +%9 = OpFunction %3 None %4 +%10 = OpLabel +OpReturnValue %8 +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("ID 8[%8] defined in block 7[%7] does not dominate its " + "use in block 10[%10]\n %10 = OpLabel")); +} + +TEST_F(ValidateIdWithMessage, IdDefInUnreachableBlock4) { + const std::string spirv = kNoKernelGLSL450MemoryModel + R"( +%1 = OpTypeVoid +%2 = OpTypeFunction %1 +%3 = OpTypeFloat 32 +%4 = OpTypeFunction %3 +%5 = OpFunction %1 None %2 +%6 = OpLabel +OpReturn +%7 = OpLabel +%8 = OpUndef %3 +%9 = OpCopyObject %3 %8 +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); +} + +TEST_F(ValidateIdWithMessage, IdDefInUnreachableBlock5) { + const std::string spirv = kNoKernelGLSL450MemoryModel + R"( +%1 = OpTypeVoid +%2 = OpTypeFunction %1 +%3 = OpTypeFloat 32 +%4 = OpTypeFunction %3 +%5 = OpFunction %1 None %2 +%6 = OpLabel +OpReturn +%7 = OpLabel +%8 = OpUndef %3 +OpBranch %9 +%9 = OpLabel +%10 = OpCopyObject %3 %8 +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); +} + +TEST_F(ValidateIdWithMessage, IdDefInUnreachableBlock6) { + const std::string spirv = kNoKernelGLSL450MemoryModel + R"( +%1 = OpTypeVoid +%2 = OpTypeFunction %1 +%3 = OpTypeFloat 32 +%4 = OpTypeFunction %3 +%5 = OpFunction %1 None %2 +%6 = OpLabel +OpBranch %7 +%8 = OpLabel +%9 = OpUndef %3 +OpBranch %7 +%7 = OpLabel +%10 = OpCopyObject %3 %9 +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("ID 9[%9] defined in block 8[%8] does not dominate its " + "use in block 7[%7]\n %7 = OpLabel")); +} + +TEST_F(ValidateIdWithMessage, ReachableDefUnreachableUse) { + const std::string spirv = kNoKernelGLSL450MemoryModel + R"( +%1 = OpTypeVoid +%2 = OpTypeFunction %1 +%3 = OpTypeFloat 32 +%4 = OpTypeFunction %3 +%5 = OpFunction %1 None %2 +%6 = OpLabel +%7 = OpUndef %3 +OpReturn +%8 = OpLabel +%9 = OpCopyObject %3 %7 +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); +} + +TEST_F(ValidateIdWithMessage, UnreachableDefUsedInPhi) { + const std::string spirv = kNoKernelGLSL450MemoryModel + R"( + %void = OpTypeVoid + %3 = OpTypeFunction %void + %float = OpTypeFloat 32 + %bool = OpTypeBool + %6 = OpTypeFunction %float + %1 = OpFunction %void None %3 + %7 = OpLabel + %8 = OpUndef %bool + OpSelectionMerge %9 None + OpBranchConditional %8 %10 %9 + %10 = OpLabel + %11 = OpUndef %float + OpBranch %9 + %12 = OpLabel + %13 = OpUndef %float + OpUnreachable + %9 = OpLabel + %14 = OpPhi %float %11 %10 %13 %7 + OpReturn + OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("In OpPhi instruction 14[%14], ID 13[%13] definition does not " + "dominate its parent 7[%7]\n %14 = OpPhi %float %11 %10 %13 " + "%7")); +} + +TEST_F(ValidateIdWithMessage, OpTypeForwardPointerNotAPointerType) { + std::string spirv = R"( + OpCapability GenericPointer + OpCapability VariablePointersStorageBuffer + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %1 "main" + OpExecutionMode %1 OriginLowerLeft + OpTypeForwardPointer %2 CrossWorkgroup +%2 = OpTypeVoid +%3 = OpTypeFunction %2 +%1 = OpFunction %2 DontInline %3 +%4 = OpLabel + OpReturn + OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Pointer type in OpTypeForwardPointer is not a pointer " + "type.\n OpTypeForwardPointer %void CrossWorkgroup")); +} + +TEST_F(ValidateIdWithMessage, OpTypeForwardPointerWrongStorageClass) { + std::string spirv = R"( + OpCapability GenericPointer + OpCapability VariablePointersStorageBuffer + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %1 "main" + OpExecutionMode %1 OriginLowerLeft + OpTypeForwardPointer %2 CrossWorkgroup +%int = OpTypeInt 32 1 +%2 = OpTypePointer Function %int +%void = OpTypeVoid +%3 = OpTypeFunction %void +%1 = OpFunction %void None %3 +%4 = OpLabel + OpReturn + OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("Storage class in OpTypeForwardPointer does not match the " + "pointer definition.\n OpTypeForwardPointer " + "%_ptr_Function_int CrossWorkgroup")); +} } // namespace } // namespace val } // namespace spvtools diff --git a/3rdparty/spirv-tools/test/val/val_image_test.cpp b/3rdparty/spirv-tools/test/val/val_image_test.cpp index 03f3eeb99..79aecb25b 100644 --- a/3rdparty/spirv-tools/test/val/val_image_test.cpp +++ b/3rdparty/spirv-tools/test/val/val_image_test.cpp @@ -34,7 +34,8 @@ std::string GenerateShaderCode( const std::string& body, const std::string& capabilities_and_extensions = "", const std::string& execution_model = "Fragment", - const spv_target_env env = SPV_ENV_UNIVERSAL_1_0) { + const spv_target_env env = SPV_ENV_UNIVERSAL_1_0, + const std::string& memory_model = "GLSL450") { std::ostringstream ss; ss << R"( OpCapability Shader @@ -46,6 +47,7 @@ OpCapability ImageQuery OpCapability Int64 OpCapability Float64 OpCapability SparseResidency +OpCapability ImageBuffer )"; if (env == SPV_ENV_UNIVERSAL_1_0) { @@ -53,8 +55,42 @@ OpCapability SparseResidency } ss << capabilities_and_extensions; - ss << "OpMemoryModel Logical GLSL450\n"; + ss << "OpMemoryModel Logical " << memory_model << "\n"; ss << "OpEntryPoint " << execution_model << " %main \"main\"\n"; + if (execution_model == "Fragment") { + ss << "OpExecutionMode %main OriginUpperLeft\n"; + } + + if (env == SPV_ENV_VULKAN_1_0) { + ss << R"( +OpDecorate %uniform_image_f32_1d_0001 DescriptorSet 0 +OpDecorate %uniform_image_f32_1d_0001 Binding 0 +OpDecorate %uniform_image_f32_1d_0002_rgba32f DescriptorSet 0 +OpDecorate %uniform_image_f32_1d_0002_rgba32f Binding 1 +OpDecorate %uniform_image_f32_2d_0001 DescriptorSet 0 +OpDecorate %uniform_image_f32_2d_0001 Binding 2 +OpDecorate %uniform_image_f32_2d_0010 DescriptorSet 0 +OpDecorate %uniform_image_f32_2d_0010 Binding 3 +OpDecorate %uniform_image_u32_2d_0001 DescriptorSet 1 +OpDecorate %uniform_image_u32_2d_0001 Binding 0 +OpDecorate %uniform_image_u32_2d_0000 DescriptorSet 1 +OpDecorate %uniform_image_u32_2d_0000 Binding 1 +OpDecorate %uniform_image_s32_3d_0001 DescriptorSet 1 +OpDecorate %uniform_image_s32_3d_0001 Binding 2 +OpDecorate %uniform_image_f32_2d_0002 DescriptorSet 1 +OpDecorate %uniform_image_f32_2d_0002 Binding 3 +OpDecorate %uniform_image_f32_spd_0002 DescriptorSet 2 +OpDecorate %uniform_image_f32_spd_0002 Binding 0 +OpDecorate %uniform_image_f32_3d_0111 DescriptorSet 2 +OpDecorate %uniform_image_f32_3d_0111 Binding 1 +OpDecorate %uniform_image_f32_cube_0101 DescriptorSet 2 +OpDecorate %uniform_image_f32_cube_0101 Binding 2 +OpDecorate %uniform_image_f32_cube_0102_rgba32f DescriptorSet 2 +OpDecorate %uniform_image_f32_cube_0102_rgba32f Binding 3 +OpDecorate %uniform_sampler DescriptorSet 3 +OpDecorate %uniform_sampler Binding 0 +)"; + } ss << R"( %void = OpTypeVoid @@ -209,6 +245,22 @@ OpCapability SparseResidency %type_sampler = OpTypeSampler %ptr_sampler = OpTypePointer UniformConstant %type_sampler %uniform_sampler = OpVariable %ptr_sampler UniformConstant + +%type_image_u32_buffer_0002_r32ui = OpTypeImage %u32 Buffer 0 0 0 2 R32ui +%ptr_Image_u32 = OpTypePointer Image %u32 +%ptr_image_u32_buffer_0002_r32ui = OpTypePointer Private %type_image_u32_buffer_0002_r32ui +%private_image_u32_buffer_0002_r32ui = OpVariable %ptr_image_u32_buffer_0002_r32ui Private + +%ptr_Image_u32arr4 = OpTypePointer Image %u32arr4 + +%type_image_u32_spd_0002 = OpTypeImage %u32 SubpassData 0 0 0 2 Unknown +%ptr_image_u32_spd_0002 = OpTypePointer Private %type_image_u32_spd_0002 +%private_image_u32_spd_0002 = OpVariable %ptr_image_u32_spd_0002 Private + +%type_image_f32_buffer_0002_r32ui = OpTypeImage %f32 Buffer 0 0 0 2 R32ui +%ptr_Image_f32 = OpTypePointer Image %f32 +%ptr_image_f32_buffer_0002_r32ui = OpTypePointer Private %type_image_f32_buffer_0002_r32ui +%private_image_f32_buffer_0002_r32ui = OpVariable %ptr_image_f32_buffer_0002_r32ui Private )"; if (env == SPV_ENV_UNIVERSAL_1_0) { @@ -357,7 +409,8 @@ OpMemoryModel Logical GLSL450 )"; if (include_entry_point) { - ss << "OpEntryPoint Fragment %main \"main\""; + ss << "OpEntryPoint Fragment %main \"main\"\n"; + ss << "OpExecutionMode %main OriginUpperLeft"; } ss << R"( %void = OpTypeVoid @@ -593,6 +646,157 @@ TEST_F(ValidateImage, SampledImageNotSampler) { HasSubstr("Expected Sampler to be of type OpTypeSampler")); } +TEST_F(ValidateImage, ImageTexelPointerSuccess) { + const std::string body = R"( +%texel_ptr = OpImageTexelPointer %ptr_Image_u32 %private_image_u32_buffer_0002_r32ui %u32_0 %u32_0 +%sum = OpAtomicIAdd %u32 %texel_ptr %u32_1 %u32_0 %u32_1 +)"; + + CompileSuccessfully(GenerateShaderCode(body).c_str()); + ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); +} + +TEST_F(ValidateImage, ImageTexelPointerResultTypeNotPointer) { + const std::string body = R"( +%texel_ptr = OpImageTexelPointer %type_image_u32_buffer_0002_r32ui %private_image_u32_buffer_0002_r32ui %u32_0 %u32_0 +%sum = OpAtomicIAdd %u32 %texel_ptr %u32_1 %u32_0 %u32_1 +)"; + + CompileSuccessfully(GenerateShaderCode(body).c_str()); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Expected Result Type to be OpTypePointer")); +} + +TEST_F(ValidateImage, ImageTexelPointerResultTypeNotImageClass) { + const std::string body = R"( +%texel_ptr = OpImageTexelPointer %ptr_image_f32_cube_0101 %private_image_u32_buffer_0002_r32ui %u32_0 %u32_0 +%sum = OpAtomicIAdd %u32 %texel_ptr %u32_1 %u32_0 %u32_1 +)"; + + CompileSuccessfully(GenerateShaderCode(body).c_str()); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Expected Result Type to be OpTypePointer whose " + "Storage Class operand is Image")); +} + +TEST_F(ValidateImage, ImageTexelPointerResultTypeNotNumericNorVoid) { + const std::string body = R"( +%texel_ptr = OpImageTexelPointer %ptr_Image_u32arr4 %private_image_u32_buffer_0002_r32ui %u32_0 %u32_0 +%sum = OpAtomicIAdd %u32 %texel_ptr %u32_1 %u32_0 %u32_1 +)"; + + CompileSuccessfully(GenerateShaderCode(body).c_str()); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("Expected Result Type to be OpTypePointer whose Type operand " + "must be a scalar numerical type or OpTypeVoid")); +} + +TEST_F(ValidateImage, ImageTexelPointerImageNotResultTypePointer) { + const std::string body = R"( +%texel_ptr = OpImageTexelPointer %ptr_Image_u32 %type_image_f32_buffer_0002_r32ui %u32_0 %u32_0 +%sum = OpAtomicIAdd %u32 %texel_ptr %u32_1 %u32_0 %u32_1 +)"; + + CompileSuccessfully(GenerateShaderCode(body).c_str()); + ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), HasSubstr("Operand 136[%136] cannot be a " + "type")); +} + +TEST_F(ValidateImage, ImageTexelPointerImageNotImage) { + const std::string body = R"( +%texel_ptr = OpImageTexelPointer %ptr_Image_u32 %uniform_sampler %u32_0 %u32_0 +%sum = OpAtomicIAdd %u32 %texel_ptr %u32_1 %u32_0 %u32_1 +)"; + + CompileSuccessfully(GenerateShaderCode(body).c_str()); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("Expected Image to be OpTypePointer with Type OpTypeImage")); +} + +TEST_F(ValidateImage, ImageTexelPointerImageSampledNotResultType) { + const std::string body = R"( +%texel_ptr = OpImageTexelPointer %ptr_Image_u32 %uniform_image_f32_cube_0101 %u32_0 %u32_0 +%sum = OpAtomicIAdd %u32 %texel_ptr %u32_1 %u32_0 %u32_1 +)"; + + CompileSuccessfully(GenerateShaderCode(body).c_str()); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Expected Image 'Sampled Type' to be the same as the " + "Type pointed to by Result Type")); +} + +TEST_F(ValidateImage, ImageTexelPointerImageDimSubpassDataBad) { + const std::string body = R"( +%texel_ptr = OpImageTexelPointer %ptr_Image_u32 %private_image_u32_spd_0002 %u32_0 %u32_0 +%sum = OpAtomicIAdd %u32 %texel_ptr %u32_1 %u32_0 %u32_1 +)"; + + CompileSuccessfully(GenerateShaderCode(body).c_str()); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr( + "Image Dim SubpassData cannot be used with OpImageTexelPointer")); +} + +TEST_F(ValidateImage, ImageTexelPointerImageCoordTypeBad) { + const std::string body = R"( +%texel_ptr = OpImageTexelPointer %ptr_Image_f32 %private_image_f32_buffer_0002_r32ui %f32_0 %f32_0 +%sum = OpAtomicIAdd %f32 %texel_ptr %f32_1 %f32_0 %f32_1 +)"; + + CompileSuccessfully(GenerateShaderCode(body).c_str()); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Expected Coordinate to be integer scalar or vector")); +} + +TEST_F(ValidateImage, ImageTexelPointerImageCoordSizeBad) { + const std::string body = R"( +%texel_ptr = OpImageTexelPointer %ptr_Image_u32 %uniform_image_u32_2d_0000 %u32vec3_012 %u32_0 +%sum = OpAtomicIAdd %u32 %texel_ptr %u32_1 %u32_0 %u32_1 +)"; + + CompileSuccessfully(GenerateShaderCode(body).c_str()); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("Expected Coordinate to have 2 components, but given 3")); +} + +TEST_F(ValidateImage, ImageTexelPointerSampleNotIntScalar) { + const std::string body = R"( +%texel_ptr = OpImageTexelPointer %ptr_Image_u32 %private_image_u32_buffer_0002_r32ui %u32_0 %f32_0 +%sum = OpAtomicIAdd %u32 %texel_ptr %u32_1 %u32_0 %u32_1 +)"; + + CompileSuccessfully(GenerateShaderCode(body).c_str()); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Expected Sample to be integer scalar")); +} + +TEST_F(ValidateImage, ImageTexelPointerSampleNotZeroForImageWithMSZero) { + const std::string body = R"( +%texel_ptr = OpImageTexelPointer %ptr_Image_u32 %private_image_u32_buffer_0002_r32ui %u32_0 %u32_1 +%sum = OpAtomicIAdd %u32 %texel_ptr %u32_1 %u32_0 %u32_1 +)"; + + CompileSuccessfully(GenerateShaderCode(body).c_str()); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Expected Sample for Image with MS 0 to be a valid " + " for the value 0")); +} + TEST_F(ValidateImage, SampleImplicitLodSuccess) { const std::string body = R"( %img = OpLoad %type_image_f32_2d_0001 %uniform_image_f32_2d_0001 @@ -604,10 +808,17 @@ TEST_F(ValidateImage, SampleImplicitLodSuccess) { %res5 = OpImageSampleImplicitLod %f32vec4 %simg %f32vec2_hh Offset %s32vec2_01 %res6 = OpImageSampleImplicitLod %f32vec4 %simg %f32vec2_hh MinLod %f32_0_5 %res7 = OpImageSampleImplicitLod %f32vec4 %simg %f32vec2_hh Bias|Offset|MinLod %f32_0_25 %s32vec2_01 %f32_0_5 +%res8 = OpImageSampleImplicitLod %f32vec4 %simg %f32vec2_hh NonPrivateTexelKHR )"; - CompileSuccessfully(GenerateShaderCode(body).c_str()); - ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); + const std::string extra = R"( +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +)"; + CompileSuccessfully(GenerateShaderCode(body, extra, "Fragment", + SPV_ENV_UNIVERSAL_1_3, "VulkanKHR") + .c_str()); + ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); } TEST_F(ValidateImage, SampleImplicitLodWrongResultType) { @@ -717,10 +928,17 @@ TEST_F(ValidateImage, SampleExplicitLodSuccessShader) { %res3 = OpImageSampleExplicitLod %f32vec4 %simg %f32vec2_hh ConstOffset %s32vec2_01 %res4 = OpImageSampleExplicitLod %f32vec4 %simg %f32vec3_hhh Offset %s32vec2_01 %res5 = OpImageSampleExplicitLod %f32vec4 %simg %f32vec2_hh Grad|Offset|MinLod %f32vec2_10 %f32vec2_01 %s32vec2_01 %f32_0_5 +%res6 = OpImageSampleExplicitLod %f32vec4 %simg %f32vec4_0000 Lod|NonPrivateTexelKHR %f32_1 )"; - CompileSuccessfully(GenerateShaderCode(body).c_str()); - ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); + const std::string extra = R"( +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +)"; + CompileSuccessfully(GenerateShaderCode(body, extra, "Fragment", + SPV_ENV_UNIVERSAL_1_3, "VulkanKHR") + .c_str()); + ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); } TEST_F(ValidateImage, SampleExplicitLodSuccessKernel) { @@ -1295,10 +1513,17 @@ TEST_F(ValidateImage, SampleProjExplicitLodSuccess2D) { %res4 = OpImageSampleProjExplicitLod %f32vec4 %simg %f32vec3_hhh ConstOffset %s32vec2_01 %res5 = OpImageSampleProjExplicitLod %f32vec4 %simg %f32vec3_hhh Offset %s32vec2_01 %res7 = OpImageSampleProjExplicitLod %f32vec4 %simg %f32vec3_hhh Grad|Offset %f32vec2_10 %f32vec2_01 %s32vec2_01 +%res8 = OpImageSampleProjExplicitLod %f32vec4 %simg %f32vec3_hhh Lod|NonPrivateTexelKHR %f32_1 )"; - CompileSuccessfully(GenerateShaderCode(body).c_str()); - ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); + const std::string extra = R"( +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +)"; + CompileSuccessfully(GenerateShaderCode(body, extra, "Fragment", + SPV_ENV_UNIVERSAL_1_3, "VulkanKHR") + .c_str()); + ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); } TEST_F(ValidateImage, SampleProjExplicitLodSuccessRect) { @@ -1422,10 +1647,17 @@ TEST_F(ValidateImage, SampleProjImplicitLodSuccess) { %res5 = OpImageSampleProjImplicitLod %f32vec4 %simg %f32vec3_hhh Offset %s32vec2_01 %res6 = OpImageSampleProjImplicitLod %f32vec4 %simg %f32vec3_hhh MinLod %f32_0_5 %res7 = OpImageSampleProjImplicitLod %f32vec4 %simg %f32vec3_hhh Bias|Offset|MinLod %f32_0_25 %s32vec2_01 %f32_0_5 +%res8 = OpImageSampleProjImplicitLod %f32vec4 %simg %f32vec3_hhh NonPrivateTexelKHR )"; - CompileSuccessfully(GenerateShaderCode(body).c_str()); - ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); + const std::string extra = R"( +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +)"; + CompileSuccessfully(GenerateShaderCode(body, extra, "Fragment", + SPV_ENV_UNIVERSAL_1_3, "VulkanKHR") + .c_str()); + ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); } TEST_F(ValidateImage, SampleProjImplicitLodWrongResultType) { @@ -1536,10 +1768,17 @@ TEST_F(ValidateImage, SampleDrefImplicitLodSuccess) { %res5 = OpImageSampleDrefImplicitLod %u32 %simg %f32vec2_hh %f32_1 Offset %s32vec2_01 %res6 = OpImageSampleDrefImplicitLod %u32 %simg %f32vec2_hh %f32_1 MinLod %f32_0_5 %res7 = OpImageSampleDrefImplicitLod %u32 %simg %f32vec2_hh %f32_1 Bias|Offset|MinLod %f32_0_25 %s32vec2_01 %f32_0_5 +%res8 = OpImageSampleDrefImplicitLod %u32 %simg %f32vec2_hh %f32_1 NonPrivateTexelKHR )"; - CompileSuccessfully(GenerateShaderCode(body).c_str()); - ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); + const std::string extra = R"( +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +)"; + CompileSuccessfully(GenerateShaderCode(body, extra, "Fragment", + SPV_ENV_UNIVERSAL_1_3, "VulkanKHR") + .c_str()); + ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); } TEST_F(ValidateImage, SampleDrefImplicitLodWrongResultType) { @@ -1652,10 +1891,17 @@ TEST_F(ValidateImage, SampleDrefExplicitLodSuccess) { %res4 = OpImageSampleDrefExplicitLod %s32 %simg %f32vec3_hhh %f32_1 ConstOffset %s32vec3_012 %res5 = OpImageSampleDrefExplicitLod %s32 %simg %f32vec4_0000 %f32_1 Offset %s32vec3_012 %res7 = OpImageSampleDrefExplicitLod %s32 %simg %f32vec3_hhh %f32_1 Grad|Offset %f32vec3_hhh %f32vec3_hhh %s32vec3_012 +%res8 = OpImageSampleDrefExplicitLod %s32 %simg %f32vec4_0000 %f32_1 Lod|NonPrivateTexelKHR %f32_1 )"; - CompileSuccessfully(GenerateShaderCode(body).c_str()); - ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); + const std::string extra = R"( +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +)"; + CompileSuccessfully(GenerateShaderCode(body, extra, "Fragment", + SPV_ENV_UNIVERSAL_1_3, "VulkanKHR") + .c_str()); + ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); } TEST_F(ValidateImage, SampleDrefExplicitLodWrongResultType) { @@ -1769,10 +2015,17 @@ TEST_F(ValidateImage, SampleProjDrefImplicitLodSuccess) { %res5 = OpImageSampleProjDrefImplicitLod %f32 %simg %f32vec3_hhh %f32_0_5 Offset %s32vec2_01 %res6 = OpImageSampleProjDrefImplicitLod %f32 %simg %f32vec3_hhh %f32_0_5 MinLod %f32_0_5 %res7 = OpImageSampleProjDrefImplicitLod %f32 %simg %f32vec3_hhh %f32_0_5 Bias|Offset|MinLod %f32_0_25 %s32vec2_01 %f32_0_5 +%res8 = OpImageSampleProjDrefImplicitLod %f32 %simg %f32vec3_hhh %f32_0_5 NonPrivateTexelKHR )"; - CompileSuccessfully(GenerateShaderCode(body).c_str()); - ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); + const std::string extra = R"( +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +)"; + CompileSuccessfully(GenerateShaderCode(body, extra, "Fragment", + SPV_ENV_UNIVERSAL_1_3, "VulkanKHR") + .c_str()); + ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); } TEST_F(ValidateImage, SampleProjDrefImplicitLodWrongResultType) { @@ -1885,10 +2138,17 @@ TEST_F(ValidateImage, SampleProjDrefExplicitLodSuccess) { %res3 = OpImageSampleProjDrefExplicitLod %f32 %simg %f32vec2_hh %f32_0_5 ConstOffset %s32_1 %res4 = OpImageSampleProjDrefExplicitLod %f32 %simg %f32vec2_hh %f32_0_5 Offset %s32_1 %res5 = OpImageSampleProjDrefExplicitLod %f32 %simg %f32vec2_hh %f32_0_5 Grad|Offset %f32_0_5 %f32_0_5 %s32_1 +%res6 = OpImageSampleProjDrefExplicitLod %f32 %simg %f32vec2_hh %f32_0_5 Lod|NonPrivateTexelKHR %f32_1 )"; - CompileSuccessfully(GenerateShaderCode(body).c_str()); - ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); + const std::string extra = R"( +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +)"; + CompileSuccessfully(GenerateShaderCode(body, extra, "Fragment", + SPV_ENV_UNIVERSAL_1_3, "VulkanKHR") + .c_str()); + ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); } TEST_F(ValidateImage, SampleProjDrefExplicitLodWrongResultType) { @@ -1979,12 +2239,19 @@ TEST_F(ValidateImage, SampleProjDrefExplicitLodCoordinateSizeTooSmall) { TEST_F(ValidateImage, FetchSuccess) { const std::string body = R"( -%img = OpLoad %type_image_f32_rect_0001 %uniform_image_f32_rect_0001 +%img = OpLoad %type_image_f32_1d_0001 %uniform_image_f32_1d_0001 %res1 = OpImageFetch %f32vec4 %img %u32vec2_01 +%res2 = OpImageFetch %f32vec4 %img %u32vec2_01 NonPrivateTexelKHR )"; - CompileSuccessfully(GenerateShaderCode(body).c_str()); - ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); + const std::string extra = R"( +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +)"; + CompileSuccessfully(GenerateShaderCode(body, extra, "Fragment", + SPV_ENV_UNIVERSAL_1_3, "VulkanKHR") + .c_str()); + ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); } TEST_F(ValidateImage, FetchWrongResultType) { @@ -2118,10 +2385,17 @@ TEST_F(ValidateImage, GatherSuccess) { %simg = OpSampledImage %type_sampled_image_f32_2d_0001 %img %sampler %res1 = OpImageGather %f32vec4 %simg %f32vec4_0000 %u32_1 %res2 = OpImageGather %f32vec4 %simg %f32vec4_0000 %u32_1 ConstOffsets %const_offsets +%res3 = OpImageGather %f32vec4 %simg %f32vec4_0000 %u32_1 NonPrivateTexelKHR )"; - CompileSuccessfully(GenerateShaderCode(body).c_str()); - ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); + const std::string extra = R"( +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +)"; + CompileSuccessfully(GenerateShaderCode(body, extra, "Fragment", + SPV_ENV_UNIVERSAL_1_3, "VulkanKHR") + .c_str()); + ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); } TEST_F(ValidateImage, GatherWrongResultType) { @@ -2367,10 +2641,17 @@ TEST_F(ValidateImage, DrefGatherSuccess) { %simg = OpSampledImage %type_sampled_image_f32_2d_0001 %img %sampler %res1 = OpImageDrefGather %f32vec4 %simg %f32vec4_0000 %f32_0_5 %res2 = OpImageDrefGather %f32vec4 %simg %f32vec4_0000 %f32_0_5 ConstOffsets %const_offsets +%res3 = OpImageDrefGather %f32vec4 %simg %f32vec4_0000 %f32_0_5 NonPrivateTexelKHR )"; - CompileSuccessfully(GenerateShaderCode(body).c_str()); - ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); + const std::string extra = R"( +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +)"; + CompileSuccessfully(GenerateShaderCode(body, extra, "Fragment", + SPV_ENV_UNIVERSAL_1_3, "VulkanKHR") + .c_str()); + ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); } TEST_F(ValidateImage, DrefGatherVoidSampledType) { @@ -3041,7 +3322,7 @@ TEST_F(ValidateImage, QuerySizeLodWrongLodType) { TEST_F(ValidateImage, QuerySizeSuccess) { const std::string body = R"( -%img = OpLoad %type_image_f32_2d_0001 %uniform_image_f32_2d_0001 +%img = OpLoad %type_image_f32_2d_0010 %uniform_image_f32_2d_0010 %res1 = OpImageQuerySize %u32vec2 %img )"; @@ -3051,7 +3332,7 @@ TEST_F(ValidateImage, QuerySizeSuccess) { TEST_F(ValidateImage, QuerySizeWrongResultType) { const std::string body = R"( -%img = OpLoad %type_image_f32_2d_0001 %uniform_image_f32_2d_0001 +%img = OpLoad %type_image_f32_2d_0010 %uniform_image_f32_2d_0010 %res1 = OpImageQuerySize %f32vec2 %img )"; @@ -3064,7 +3345,7 @@ TEST_F(ValidateImage, QuerySizeWrongResultType) { TEST_F(ValidateImage, QuerySizeNotImage) { const std::string body = R"( -%img = OpLoad %type_image_f32_2d_0001 %uniform_image_f32_2d_0001 +%img = OpLoad %type_image_f32_2d_0010 %uniform_image_f32_2d_0010 %sampler = OpLoad %type_sampler %uniform_sampler %simg = OpSampledImage %type_sampled_image_f32_2d_0001 %img %sampler %res1 = OpImageQuerySize %u32vec2 %simg @@ -3076,7 +3357,43 @@ TEST_F(ValidateImage, QuerySizeNotImage) { HasSubstr("Expected Image to be of type OpTypeImage")); } -// TODO(atgoo@github.com) Add more tests for OpQuerySize. +TEST_F(ValidateImage, QuerySizeDimSubpassDataBad) { + const std::string body = R"( +%img = OpLoad %type_image_f32_spd_0002 %uniform_image_f32_spd_0002 +%res1 = OpImageQuerySize %u32vec2 %img +)"; + + CompileSuccessfully(GenerateShaderCode(body).c_str()); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("Image 'Dim' must be 1D, Buffer, 2D, Cube, 3D or Rect")); +} + +TEST_F(ValidateImage, QuerySizeWrongSampling) { + const std::string body = R"( +%img = OpLoad %type_image_f32_2d_0001 %uniform_image_f32_2d_0001 +%res1 = OpImageQuerySize %u32vec2 %img +)"; + + CompileSuccessfully(GenerateKernelCode(body).c_str()); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("Image must have either 'MS'=1 or 'Sampled'=0 or 'Sampled'=2")); +} + +TEST_F(ValidateImage, QuerySizeWrongNumberOfComponents) { + const std::string body = R"( +%img = OpLoad %type_image_f32_3d_0111 %uniform_image_f32_3d_0111 +%res1 = OpImageQuerySize %u32vec2 %img +)"; + + CompileSuccessfully(GenerateShaderCode(body).c_str()); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Result Type has 2 components, but 4 expected")); +} TEST_F(ValidateImage, QueryLodSuccessKernel) { const std::string body = R"( @@ -3339,10 +3656,17 @@ TEST_F(ValidateImage, SparseSampleImplicitLodSuccess) { %res5 = OpImageSparseSampleImplicitLod %struct_u32_f32vec4 %simg %f32vec2_hh Offset %s32vec2_01 %res6 = OpImageSparseSampleImplicitLod %struct_u32_f32vec4 %simg %f32vec2_hh MinLod %f32_0_5 %res7 = OpImageSparseSampleImplicitLod %struct_u64_f32vec4 %simg %f32vec2_hh Bias|Offset|MinLod %f32_0_25 %s32vec2_01 %f32_0_5 +%res8 = OpImageSparseSampleImplicitLod %struct_u32_f32vec4 %simg %f32vec2_hh NonPrivateTexelKHR )"; - CompileSuccessfully(GenerateShaderCode(body).c_str()); - ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); + const std::string extra = R"( +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +)"; + CompileSuccessfully(GenerateShaderCode(body, extra, "Fragment", + SPV_ENV_UNIVERSAL_1_3, "VulkanKHR") + .c_str()); + ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); } TEST_F(ValidateImage, SparseSampleImplicitLodResultTypeNotStruct) { @@ -3460,10 +3784,17 @@ TEST_F(ValidateImage, SparseSampleDrefImplicitLodSuccess) { %res5 = OpImageSparseSampleDrefImplicitLod %struct_u32_u32 %simg %f32vec2_hh %f32_1 Offset %s32vec2_01 %res6 = OpImageSparseSampleDrefImplicitLod %struct_u32_u32 %simg %f32vec2_hh %f32_1 MinLod %f32_0_5 %res7 = OpImageSparseSampleDrefImplicitLod %struct_u32_u32 %simg %f32vec2_hh %f32_1 Bias|Offset|MinLod %f32_0_25 %s32vec2_01 %f32_0_5 +%res8 = OpImageSparseSampleDrefImplicitLod %struct_u32_u32 %simg %f32vec2_hh %f32_1 NonPrivateTexelKHR )"; - CompileSuccessfully(GenerateShaderCode(body).c_str()); - ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); + const std::string extra = R"( +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +)"; + CompileSuccessfully(GenerateShaderCode(body, extra, "Fragment", + SPV_ENV_UNIVERSAL_1_3, "VulkanKHR") + .c_str()); + ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); } TEST_F(ValidateImage, SparseSampleDrefImplicitLodResultTypeNotStruct) { @@ -3545,12 +3876,19 @@ TEST_F(ValidateImage, SparseSampleDrefImplicitLodDifferentSampledType) { TEST_F(ValidateImage, SparseFetchSuccess) { const std::string body = R"( -%img = OpLoad %type_image_f32_rect_0001 %uniform_image_f32_rect_0001 +%img = OpLoad %type_image_f32_1d_0001 %uniform_image_f32_1d_0001 %res1 = OpImageSparseFetch %struct_u32_f32vec4 %img %u32vec2_01 +%res2 = OpImageSparseFetch %struct_u32_f32vec4 %img %u32vec2_01 NonPrivateTexelKHR )"; - CompileSuccessfully(GenerateShaderCode(body).c_str()); - ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); + const std::string extra = R"( +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +)"; + CompileSuccessfully(GenerateShaderCode(body, extra, "Fragment", + SPV_ENV_UNIVERSAL_1_3, "VulkanKHR") + .c_str()); + ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); } TEST_F(ValidateImage, SparseFetchResultTypeNotStruct) { @@ -3757,10 +4095,17 @@ TEST_F(ValidateImage, SparseGatherSuccess) { %sampler = OpLoad %type_sampler %uniform_sampler %simg = OpSampledImage %type_sampled_image_f32_2d_0001 %img %sampler %res1 = OpImageSparseGather %struct_u32_f32vec4 %simg %f32vec4_0000 %u32_1 +%res2 = OpImageSparseGather %struct_u32_f32vec4 %simg %f32vec4_0000 %u32_1 NonPrivateTexelKHR )"; - CompileSuccessfully(GenerateShaderCode(body).c_str()); - ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); + const std::string extra = R"( +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +)"; + CompileSuccessfully(GenerateShaderCode(body, extra, "Fragment", + SPV_ENV_UNIVERSAL_1_3, "VulkanKHR") + .c_str()); + ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); } TEST_F(ValidateImage, SparseGatherResultTypeNotStruct) { @@ -3887,6 +4232,226 @@ TEST_F(ValidateImage, SparseTexelsResidentResultTypeNotBool) { HasSubstr("Expected Result Type to be bool scalar type")); } +TEST_F(ValidateImage, MakeTexelVisibleKHRSuccessImageRead) { + const std::string body = R"( +%img = OpLoad %type_image_u32_2d_0000 %uniform_image_u32_2d_0000 +%res1 = OpImageRead %u32vec4 %img %u32vec2_01 MakeTexelVisibleKHR|NonPrivateTexelKHR %u32_2 +)"; + + const std::string extra = R"( +OpCapability StorageImageReadWithoutFormat +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +)"; + CompileSuccessfully(GenerateShaderCode(body, extra, "Fragment", + SPV_ENV_UNIVERSAL_1_3, "VulkanKHR") + .c_str()); + ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); +} + +TEST_F(ValidateImage, MakeTexelVisibleKHRSuccessImageSparseRead) { + const std::string body = R"( +%img = OpLoad %type_image_f32_2d_0002 %uniform_image_f32_2d_0002 +%res1 = OpImageSparseRead %struct_u32_f32vec4 %img %u32vec2_01 MakeTexelVisibleKHR|NonPrivateTexelKHR %u32_2 +)"; + + const std::string extra = R"( +OpCapability StorageImageReadWithoutFormat +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +)"; + CompileSuccessfully(GenerateShaderCode(body, extra, "Fragment", + SPV_ENV_UNIVERSAL_1_3, "VulkanKHR") + .c_str()); + ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); +} + +TEST_F(ValidateImage, MakeTexelVisibleKHRFailureOpcode) { + const std::string body = R"( +%img = OpLoad %type_image_f32_2d_0001 %uniform_image_f32_2d_0001 +%sampler = OpLoad %type_sampler %uniform_sampler +%simg = OpSampledImage %type_sampled_image_f32_2d_0001 %img %sampler +%res1 = OpImageSampleImplicitLod %f32vec4 %simg %f32vec2_hh MakeTexelVisibleKHR|NonPrivateTexelKHR %u32_1 +)"; + + const std::string extra = R"( +OpCapability StorageImageReadWithoutFormat +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +)"; + CompileSuccessfully(GenerateShaderCode(body, extra, "Fragment", + SPV_ENV_UNIVERSAL_1_3, "VulkanKHR") + .c_str()); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, + ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("Image Operand MakeTexelVisibleKHR can only be used with " + "OpImageRead or OpImageSparseRead: OpImageSampleImplicitLod")); +} + +TEST_F(ValidateImage, MakeTexelVisibleKHRFailureMissingNonPrivate) { + const std::string body = R"( +%img = OpLoad %type_image_u32_2d_0000 %uniform_image_u32_2d_0000 +%res1 = OpImageRead %u32vec4 %img %u32vec2_01 MakeTexelVisibleKHR %u32_1 +)"; + + const std::string extra = R"( +OpCapability StorageImageReadWithoutFormat +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +)"; + CompileSuccessfully(GenerateShaderCode(body, extra, "Fragment", + SPV_ENV_UNIVERSAL_1_3, "VulkanKHR") + .c_str()); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, + ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Image Operand MakeTexelVisibleKHR requires " + "NonPrivateTexelKHR is also specified: OpImageRead")); +} + +TEST_F(ValidateImage, MakeTexelAvailableKHRSuccessImageWrite) { + const std::string body = R"( +%img = OpLoad %type_image_u32_2d_0000 %uniform_image_u32_2d_0000 +%res1 = OpImageWrite %img %u32vec2_01 %u32vec4_0123 MakeTexelAvailableKHR|NonPrivateTexelKHR %u32_2 +)"; + + const std::string extra = R"( +OpCapability StorageImageWriteWithoutFormat +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +)"; + CompileSuccessfully(GenerateShaderCode(body, extra, "Fragment", + SPV_ENV_UNIVERSAL_1_3, "VulkanKHR") + .c_str()); + ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); +} + +TEST_F(ValidateImage, MakeTexelAvailableKHRFailureOpcode) { + const std::string body = R"( +%img = OpLoad %type_image_f32_2d_0001 %uniform_image_f32_2d_0001 +%sampler = OpLoad %type_sampler %uniform_sampler +%simg = OpSampledImage %type_sampled_image_f32_2d_0001 %img %sampler +%res1 = OpImageSampleImplicitLod %f32vec4 %simg %f32vec2_hh MakeTexelAvailableKHR|NonPrivateTexelKHR %u32_1 +)"; + + const std::string extra = R"( +OpCapability StorageImageReadWithoutFormat +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +)"; + CompileSuccessfully(GenerateShaderCode(body, extra, "Fragment", + SPV_ENV_UNIVERSAL_1_3, "VulkanKHR") + .c_str()); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, + ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Image Operand MakeTexelAvailableKHR can only be used " + "with OpImageWrite: OpImageSampleImplicitLod")); +} + +TEST_F(ValidateImage, MakeTexelAvailableKHRFailureMissingNonPrivate) { + const std::string body = R"( +%img = OpLoad %type_image_u32_2d_0000 %uniform_image_u32_2d_0000 +%res1 = OpImageWrite %img %u32vec2_01 %u32vec4_0123 MakeTexelAvailableKHR %u32_1 +)"; + + const std::string extra = R"( +OpCapability StorageImageWriteWithoutFormat +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +)"; + CompileSuccessfully(GenerateShaderCode(body, extra, "Fragment", + SPV_ENV_UNIVERSAL_1_3, "VulkanKHR") + .c_str()); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, + ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Image Operand MakeTexelAvailableKHR requires " + "NonPrivateTexelKHR is also specified: OpImageWrite")); +} + +TEST_F(ValidateImage, VulkanMemoryModelDeviceScopeImageWriteBad) { + const std::string body = R"( +%img = OpLoad %type_image_u32_2d_0000 %uniform_image_u32_2d_0000 +%res1 = OpImageWrite %img %u32vec2_01 %u32vec4_0123 MakeTexelAvailableKHR|NonPrivateTexelKHR %u32_1 +)"; + + const std::string extra = R"( +OpCapability StorageImageWriteWithoutFormat +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +)"; + CompileSuccessfully(GenerateShaderCode(body, extra, "Fragment", + SPV_ENV_UNIVERSAL_1_3, "VulkanKHR") + .c_str()); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, + ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("Use of device scope with VulkanKHR memory model requires the " + "VulkanMemoryModelDeviceScopeKHR capability")); +} + +TEST_F(ValidateImage, VulkanMemoryModelDeviceScopeImageWriteGood) { + const std::string body = R"( +%img = OpLoad %type_image_u32_2d_0000 %uniform_image_u32_2d_0000 +%res1 = OpImageWrite %img %u32vec2_01 %u32vec4_0123 MakeTexelAvailableKHR|NonPrivateTexelKHR %u32_1 +)"; + + const std::string extra = R"( +OpCapability StorageImageWriteWithoutFormat +OpCapability VulkanMemoryModelKHR +OpCapability VulkanMemoryModelDeviceScopeKHR +OpExtension "SPV_KHR_vulkan_memory_model" +)"; + CompileSuccessfully(GenerateShaderCode(body, extra, "Fragment", + SPV_ENV_UNIVERSAL_1_3, "VulkanKHR") + .c_str()); + ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); +} + +TEST_F(ValidateImage, VulkanMemoryModelDeviceScopeImageReadBad) { + const std::string body = R"( +%img = OpLoad %type_image_u32_2d_0000 %uniform_image_u32_2d_0000 +%res1 = OpImageRead %u32vec4 %img %u32vec2_01 MakeTexelVisibleKHR|NonPrivateTexelKHR %u32_1 +)"; + + const std::string extra = R"( +OpCapability StorageImageReadWithoutFormat +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +)"; + CompileSuccessfully(GenerateShaderCode(body, extra, "Fragment", + SPV_ENV_UNIVERSAL_1_3, "VulkanKHR") + .c_str()); + ASSERT_EQ(SPV_ERROR_INVALID_DATA, + ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("Use of device scope with VulkanKHR memory model requires the " + "VulkanMemoryModelDeviceScopeKHR capability")); +} + +TEST_F(ValidateImage, VulkanMemoryModelDeviceScopeImageReadGood) { + const std::string body = R"( +%img = OpLoad %type_image_u32_2d_0000 %uniform_image_u32_2d_0000 +%res1 = OpImageRead %u32vec4 %img %u32vec2_01 MakeTexelVisibleKHR|NonPrivateTexelKHR %u32_1 +)"; + + const std::string extra = R"( +OpCapability StorageImageReadWithoutFormat +OpCapability VulkanMemoryModelKHR +OpCapability VulkanMemoryModelDeviceScopeKHR +OpExtension "SPV_KHR_vulkan_memory_model" +)"; + CompileSuccessfully(GenerateShaderCode(body, extra, "Fragment", + SPV_ENV_UNIVERSAL_1_3, "VulkanKHR") + .c_str()); + ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); +} + } // namespace } // namespace val } // namespace spvtools diff --git a/3rdparty/spirv-tools/test/val/val_interfaces_test.cpp b/3rdparty/spirv-tools/test/val/val_interfaces_test.cpp index b673a040f..ce430f615 100644 --- a/3rdparty/spirv-tools/test/val/val_interfaces_test.cpp +++ b/3rdparty/spirv-tools/test/val/val_interfaces_test.cpp @@ -31,6 +31,7 @@ TEST_F(ValidateInterfacesTest, EntryPointMissingInput) { OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %1 "func" +OpExecutionMode %1 OriginUpperLeft %2 = OpTypeVoid %3 = OpTypeInt 32 0 %4 = OpTypePointer Input %3 @@ -56,6 +57,7 @@ TEST_F(ValidateInterfacesTest, EntryPointMissingOutput) { OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %1 "func" +OpExecutionMode %1 OriginUpperLeft %2 = OpTypeVoid %3 = OpTypeInt 32 0 %4 = OpTypePointer Output %3 @@ -81,6 +83,7 @@ TEST_F(ValidateInterfacesTest, InterfaceMissingUseInSubfunction) { OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %1 "func" +OpExecutionMode %1 OriginUpperLeft %2 = OpTypeVoid %3 = OpTypeInt 32 0 %4 = OpTypePointer Input %3 @@ -112,6 +115,7 @@ OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %1 "func" %2 OpEntryPoint Fragment %1 "func2" +OpExecutionMode %1 OriginUpperLeft %3 = OpTypeVoid %4 = OpTypeInt 32 0 %5 = OpTypePointer Input %4 @@ -138,6 +142,7 @@ OpCapability Shader OpCapability VariablePointers OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %1 "func" +OpExecutionMode %1 OriginUpperLeft %2 = OpTypeVoid %3 = OpTypeInt 32 0 %4 = OpTypePointer Input %3 diff --git a/3rdparty/spirv-tools/test/val/val_layout_test.cpp b/3rdparty/spirv-tools/test/val/val_layout_test.cpp index 145c5439b..e502d8c24 100644 --- a/3rdparty/spirv-tools/test/val/val_layout_test.cpp +++ b/3rdparty/spirv-tools/test/val/val_layout_test.cpp @@ -481,6 +481,7 @@ TEST_F(ValidateEntryPoint, FunctionIsTargetOfEntryPointAndFunctionCallBad) { OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %foo "foo" + OpExecutionMode %foo OriginUpperLeft %voidt = OpTypeVoid %funct = OpTypeFunction %voidt %foo = OpFunction %voidt None %funct @@ -647,6 +648,57 @@ TEST_F(ValidateLayout, ModuleProcessedInvalidInBasicBlock) { HasSubstr("ModuleProcessed cannot appear in a function declaration")); } +TEST_F(ValidateLayout, WebGPUCallerBeforeCalleeBad) { + char str[] = R"( + OpCapability Shader + OpCapability VulkanMemoryModelKHR + OpExtension "SPV_KHR_vulkan_memory_model" + OpMemoryModel Logical VulkanKHR + OpEntryPoint GLCompute %main "main" +%void = OpTypeVoid +%voidfn = OpTypeFunction %void +%main = OpFunction %void None %voidfn +%1 = OpLabel +%2 = OpFunctionCall %void %callee + OpReturn + OpFunctionEnd +%callee = OpFunction %void None %voidfn +%3 = OpLabel + OpReturn + OpFunctionEnd +)"; + + CompileSuccessfully(str, SPV_ENV_WEBGPU_0); + ASSERT_EQ(SPV_ERROR_INVALID_LAYOUT, ValidateInstructions(SPV_ENV_WEBGPU_0)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("For WebGPU, functions need to be defined before being " + "called.\n %5 = OpFunctionCall %void %6\n")); +} + +TEST_F(ValidateLayout, WebGPUCalleeBeforeCallerGood) { + char str[] = R"( + OpCapability Shader + OpCapability VulkanMemoryModelKHR + OpExtension "SPV_KHR_vulkan_memory_model" + OpMemoryModel Logical VulkanKHR + OpEntryPoint GLCompute %main "main" +%void = OpTypeVoid +%voidfn = OpTypeFunction %void +%callee = OpFunction %void None %voidfn +%3 = OpLabel + OpReturn + OpFunctionEnd +%main = OpFunction %void None %voidfn +%1 = OpLabel +%2 = OpFunctionCall %void %callee + OpReturn + OpFunctionEnd +)"; + + CompileSuccessfully(str, SPV_ENV_WEBGPU_0); + ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_WEBGPU_0)); +} + // TODO(umar): Test optional instructions } // namespace diff --git a/3rdparty/spirv-tools/test/val/val_limits_test.cpp b/3rdparty/spirv-tools/test/val/val_limits_test.cpp index 55bf1e5f1..791b709ff 100644 --- a/3rdparty/spirv-tools/test/val/val_limits_test.cpp +++ b/3rdparty/spirv-tools/test/val/val_limits_test.cpp @@ -79,6 +79,70 @@ TEST_F(ValidateLimits, IdEqualToBoundBad) { HasSubstr("Result '64' must be less than the ID bound '64'.")); } +TEST_F(ValidateLimits, IdBoundTooBigDeaultLimit) { + std::string str = header; + + CompileSuccessfully(str); + + // The largest ID used in this program is 64. Let's overwrite the ID bound in + // the header to be 64. This should result in an error because all IDs must + // satisfy: 0 < id < bound. + OverwriteAssembledBinary(3, 0x4FFFFF); + + ASSERT_EQ(SPV_ERROR_INVALID_BINARY, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Invalid SPIR-V. The id bound is larger than the max " + "id bound 4194303.")); +} + +TEST_F(ValidateLimits, IdBoundAtSetLimit) { + std::string str = header; + + CompileSuccessfully(str); + + // The largest ID used in this program is 64. Let's overwrite the ID bound in + // the header to be 64. This should result in an error because all IDs must + // satisfy: 0 < id < bound. + uint32_t id_bound = 0x4FFFFF; + + OverwriteAssembledBinary(3, id_bound); + getValidatorOptions()->universal_limits_.max_id_bound = id_bound; + + ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); +} + +TEST_F(ValidateLimits, IdBoundJustAboveSetLimit) { + std::string str = header; + + CompileSuccessfully(str); + + // The largest ID used in this program is 64. Let's overwrite the ID bound in + // the header to be 64. This should result in an error because all IDs must + // satisfy: 0 < id < bound. + uint32_t id_bound = 5242878; + + OverwriteAssembledBinary(3, id_bound); + getValidatorOptions()->universal_limits_.max_id_bound = id_bound - 1; + + ASSERT_EQ(SPV_ERROR_INVALID_BINARY, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Invalid SPIR-V. The id bound is larger than the max " + "id bound 5242877.")); +} + +TEST_F(ValidateLimits, IdBoundAtInMaxLimit) { + std::string str = header; + + CompileSuccessfully(str); + + uint32_t id_bound = std::numeric_limits::max(); + + OverwriteAssembledBinary(3, id_bound); + getValidatorOptions()->universal_limits_.max_id_bound = id_bound; + + ASSERT_EQ(SPV_SUCCESS, ValidateInstructions()); +} + TEST_F(ValidateLimits, StructNumMembersGood) { std::ostringstream spirv; spirv << header << R"( @@ -289,7 +353,7 @@ TEST_F(ValidateLimits, OpTypeFunctionBad) { EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), HasSubstr("OpTypeFunction may not take more than 255 arguments. " - "OpTypeFunction '2' has 256 arguments.")); + "OpTypeFunction '2[%2]' has 256 arguments.")); } // Valid: OpTypeFunction with 100 arguments (Custom limit: 100) @@ -325,7 +389,7 @@ TEST_F(ValidateLimits, CustomizedOpTypeFunctionBad) { EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), HasSubstr("OpTypeFunction may not take more than 100 arguments. " - "OpTypeFunction '2' has 101 arguments.")); + "OpTypeFunction '2[%2]' has 101 arguments.")); } // Valid: module has 65,535 global variables. @@ -649,14 +713,6 @@ void GenerateSpirvProgramWithCfgNestingDepth(std::string& str, int depth) { } // clang-format on -// Valid: Control Flow Nesting depth is 1023. -TEST_F(ValidateLimits, ControlFlowDepthGood) { - std::string spirv; - GenerateSpirvProgramWithCfgNestingDepth(spirv, 1023); - CompileSuccessfully(spirv); - EXPECT_EQ(SPV_SUCCESS, ValidateInstructions()); -} - // Invalid: Control Flow Nesting depth is 1024. (limit is 1023). TEST_F(ValidateLimits, ControlFlowDepthBad) { std::string spirv; diff --git a/3rdparty/spirv-tools/test/val/val_logicals_test.cpp b/3rdparty/spirv-tools/test/val/val_logicals_test.cpp index 449cdd54f..f457887c0 100644 --- a/3rdparty/spirv-tools/test/val/val_logicals_test.cpp +++ b/3rdparty/spirv-tools/test/val/val_logicals_test.cpp @@ -43,6 +43,7 @@ OpCapability Float64)"; %ext_inst = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft %void = OpTypeVoid %func = OpTypeFunction %void %bool = OpTypeBool diff --git a/3rdparty/spirv-tools/test/val/val_memory_test.cpp b/3rdparty/spirv-tools/test/val/val_memory_test.cpp new file mode 100644 index 000000000..a5e5f9101 --- /dev/null +++ b/3rdparty/spirv-tools/test/val/val_memory_test.cpp @@ -0,0 +1,1542 @@ +// Copyright (c) 2018 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Validation tests for memory/storage + +#include +#include + +#include "gmock/gmock.h" +#include "test/unit_spirv.h" +#include "test/val/val_fixtures.h" + +namespace spvtools { +namespace val { +namespace { + +using ::testing::Eq; +using ::testing::HasSubstr; + +using ValidateMemory = spvtest::ValidateBase; + +TEST_F(ValidateMemory, VulkanUniformConstantOnNonOpaqueResourceBad) { + std::string spirv = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft +%float = OpTypeFloat 32 +%float_ptr = OpTypePointer UniformConstant %float +%2 = OpVariable %float_ptr UniformConstant +%void = OpTypeVoid +%functy = OpTypeFunction %void +%func = OpFunction %void None %functy +%1 = OpLabel +OpReturn +OpFunctionEnd +)"; + CompileSuccessfully(spirv.c_str(), SPV_ENV_VULKAN_1_1); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions(SPV_ENV_VULKAN_1_1)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("From Vulkan spec, section 14.5.2:\n" + "Variables identified with the UniformConstant storage class " + "are used only as handles to refer to opaque resources. Such " + "variables must be typed as OpTypeImage, OpTypeSampler, " + "OpTypeSampledImage, OpTypeAccelerationStructureNV, or an " + "array of one of these types.")); +} + +TEST_F(ValidateMemory, VulkanUniformConstantOnOpaqueResourceGood) { + std::string spirv = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft +OpDecorate %2 DescriptorSet 0 +OpDecorate %2 Binding 0 +%sampler = OpTypeSampler +%sampler_ptr = OpTypePointer UniformConstant %sampler +%2 = OpVariable %sampler_ptr UniformConstant +%void = OpTypeVoid +%functy = OpTypeFunction %void +%func = OpFunction %void None %functy +%1 = OpLabel +OpReturn +OpFunctionEnd +)"; + CompileSuccessfully(spirv.c_str(), SPV_ENV_VULKAN_1_1); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_1)); +} + +TEST_F(ValidateMemory, VulkanUniformConstantOnNonOpaqueResourceArrayBad) { + std::string spirv = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft +%float = OpTypeFloat 32 +%uint = OpTypeInt 32 0 +%array_size = OpConstant %uint 5 +%array = OpTypeArray %float %array_size +%array_ptr = OpTypePointer UniformConstant %array +%2 = OpVariable %array_ptr UniformConstant +%void = OpTypeVoid +%functy = OpTypeFunction %void +%func = OpFunction %void None %functy +%1 = OpLabel +OpReturn +OpFunctionEnd +)"; + CompileSuccessfully(spirv.c_str(), SPV_ENV_VULKAN_1_1); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions(SPV_ENV_VULKAN_1_1)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("From Vulkan spec, section 14.5.2:\n" + "Variables identified with the UniformConstant storage class " + "are used only as handles to refer to opaque resources. Such " + "variables must be typed as OpTypeImage, OpTypeSampler, " + "OpTypeSampledImage, OpTypeAccelerationStructureNV, or an " + "array of one of these types.")); +} + +TEST_F(ValidateMemory, VulkanUniformConstantOnOpaqueResourceArrayGood) { + std::string spirv = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft +OpDecorate %2 DescriptorSet 0 +OpDecorate %2 Binding 0 +%sampler = OpTypeSampler +%uint = OpTypeInt 32 0 +%array_size = OpConstant %uint 5 +%array = OpTypeArray %sampler %array_size +%array_ptr = OpTypePointer UniformConstant %array +%2 = OpVariable %array_ptr UniformConstant +%void = OpTypeVoid +%functy = OpTypeFunction %void +%func = OpFunction %void None %functy +%1 = OpLabel +OpReturn +OpFunctionEnd +)"; + CompileSuccessfully(spirv.c_str(), SPV_ENV_VULKAN_1_1); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_1)); +} + +TEST_F(ValidateMemory, VulkanUniformConstantOnOpaqueResourceRuntimeArrayGood) { + std::string spirv = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft +OpDecorate %2 DescriptorSet 0 +OpDecorate %2 Binding 0 +%sampler = OpTypeSampler +%uint = OpTypeInt 32 0 +%array = OpTypeRuntimeArray %sampler +%array_ptr = OpTypePointer UniformConstant %array +%2 = OpVariable %array_ptr UniformConstant +%void = OpTypeVoid +%functy = OpTypeFunction %void +%func = OpFunction %void None %functy +%1 = OpLabel +OpReturn +OpFunctionEnd +)"; + CompileSuccessfully(spirv.c_str(), SPV_ENV_VULKAN_1_1); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_1)); +} + +TEST_F(ValidateMemory, VulkanUniformOnIntBad) { + char src[] = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint GLCompute %kernel "main" + OpExecutionMode %kernel LocalSize 1 1 1 + + OpDecorate %var DescriptorSet 0 + OpDecorate %var Binding 0 + + %voidty = OpTypeVoid +%kernelty = OpTypeFunction %voidty + %intty = OpTypeInt 32 0 + %varty = OpTypePointer Uniform %intty + %value = OpConstant %intty 42 + + %var = OpVariable %varty Uniform + + %kernel = OpFunction %voidty None %kernelty + %label = OpLabel + OpStore %var %value + OpReturn + OpFunctionEnd +)"; + CompileSuccessfully(src, SPV_ENV_VULKAN_1_1); + ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions(SPV_ENV_VULKAN_1_1)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("From Vulkan spec, section 14.5.2:\n" + "Variables identified with the Uniform storage class are used " + "to access transparent buffer backed resources. Such variables " + "must be typed as OpTypeStruct, or an array of this type")); +} + +// #version 440 +// #extension GL_EXT_nonuniform_qualifier : enable +// layout(binding = 1) uniform sampler2D s2d[][2]; +// layout(location = 0) in nonuniformEXT int i; +// void main() +// { +// vec4 v = texture(s2d[i][i], vec2(0.3)); +// } +TEST_F(ValidateMemory, VulkanUniformOnRuntimeArrayOfArrayBad) { + char src[] = R"( + OpCapability Shader + OpCapability ShaderNonUniformEXT + OpCapability RuntimeDescriptorArrayEXT + OpCapability SampledImageArrayNonUniformIndexingEXT + OpExtension "SPV_EXT_descriptor_indexing" + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Vertex %main "main" %i + OpSource GLSL 440 + OpSourceExtension "GL_EXT_nonuniform_qualifier" + OpName %main "main" + OpName %v "v" + OpName %s2d "s2d" + OpName %i "i" + OpDecorate %s2d DescriptorSet 0 + OpDecorate %s2d Binding 1 + OpDecorate %i Location 0 + OpDecorate %i NonUniformEXT + OpDecorate %21 NonUniformEXT + OpDecorate %22 NonUniformEXT + OpDecorate %25 NonUniformEXT + %void = OpTypeVoid + %3 = OpTypeFunction %void + %float = OpTypeFloat 32 + %v4float = OpTypeVector %float 4 +%_ptr_Function_v4float = OpTypePointer Function %v4float + %10 = OpTypeImage %float 2D 0 0 0 1 Unknown + %11 = OpTypeSampledImage %10 + %uint = OpTypeInt 32 0 + %uint_2 = OpConstant %uint 2 +%_arr_11_uint_2 = OpTypeArray %11 %uint_2 +%_runtimearr__arr_11_uint_2 = OpTypeRuntimeArray %_arr_11_uint_2 +%_ptr_Uniform__runtimearr__arr_11_uint_2 = OpTypePointer Uniform %_runtimearr__arr_11_uint_2 + %s2d = OpVariable %_ptr_Uniform__runtimearr__arr_11_uint_2 Uniform + %int = OpTypeInt 32 1 +%_ptr_Input_int = OpTypePointer Input %int + %i = OpVariable %_ptr_Input_int Input +%_ptr_Uniform_11 = OpTypePointer Uniform %11 + %v2float = OpTypeVector %float 2 +%float_0_300000012 = OpConstant %float 0.300000012 + %28 = OpConstantComposite %v2float %float_0_300000012 %float_0_300000012 + %float_0 = OpConstant %float 0 + %main = OpFunction %void None %3 + %5 = OpLabel + %v = OpVariable %_ptr_Function_v4float Function + %21 = OpLoad %int %i + %22 = OpLoad %int %i + %24 = OpAccessChain %_ptr_Uniform_11 %s2d %21 %22 + %25 = OpLoad %11 %24 + %30 = OpImageSampleExplicitLod %v4float %25 %28 Lod %float_0 + OpStore %v %30 + OpReturn + OpFunctionEnd +)"; + CompileSuccessfully(src, SPV_ENV_VULKAN_1_1); + ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions(SPV_ENV_VULKAN_1_1)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("From Vulkan spec, section 14.5.2:\n" + "Variables identified with the Uniform storage class are used " + "to access transparent buffer backed resources. Such variables " + "must be typed as OpTypeStruct, or an array of this type")); +} + +// #version 440 +// layout (set=1, binding=1) uniform sampler2D variableName[2][2]; +// void main() { +// } +TEST_F(ValidateMemory, VulkanUniformOnArrayOfArrayBad) { + char src[] = R"( + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Vertex %main "main" + OpSource GLSL 440 + OpName %main "main" + OpName %variableName "variableName" + OpDecorate %variableName DescriptorSet 1 + OpDecorate %variableName Binding 1 + %void = OpTypeVoid + %3 = OpTypeFunction %void + %float = OpTypeFloat 32 + %7 = OpTypeImage %float 2D 0 0 0 1 Unknown + %8 = OpTypeSampledImage %7 + %uint = OpTypeInt 32 0 + %uint_2 = OpConstant %uint 2 +%_arr_8_uint_2 = OpTypeArray %8 %uint_2 +%_arr__arr_8_uint_2_uint_2 = OpTypeArray %_arr_8_uint_2 %uint_2 +%_ptr_Uniform__arr__arr_8_uint_2_uint_2 = OpTypePointer Uniform %_arr__arr_8_uint_2_uint_2 +%variableName = OpVariable %_ptr_Uniform__arr__arr_8_uint_2_uint_2 Uniform + %main = OpFunction %void None %3 + %5 = OpLabel + OpReturn + OpFunctionEnd +)"; + CompileSuccessfully(src, SPV_ENV_VULKAN_1_1); + ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions(SPV_ENV_VULKAN_1_1)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("From Vulkan spec, section 14.5.2:\n" + "Variables identified with the Uniform storage class are used " + "to access transparent buffer backed resources. Such variables " + "must be typed as OpTypeStruct, or an array of this type")); +} + +TEST_F(ValidateMemory, MismatchingStorageClassesBad) { + std::string spirv = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft +%float = OpTypeFloat 32 +%float_ptr = OpTypePointer Uniform %float +%void = OpTypeVoid +%functy = OpTypeFunction %void +%func = OpFunction %void None %functy +%1 = OpLabel +%2 = OpVariable %float_ptr Function +OpReturn +OpFunctionEnd +)"; + CompileSuccessfully(spirv.c_str()); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr( + "From SPIR-V spec, section 3.32.8 on OpVariable:\n" + "Its Storage Class operand must be the same as the Storage Class " + "operand of the result type.")); +} + +TEST_F(ValidateMemory, MatchingStorageClassesGood) { + std::string spirv = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft +%float = OpTypeFloat 32 +%float_ptr = OpTypePointer Function %float +%void = OpTypeVoid +%functy = OpTypeFunction %void +%func = OpFunction %void None %functy +%1 = OpLabel +%2 = OpVariable %float_ptr Function +OpReturn +OpFunctionEnd +)"; + CompileSuccessfully(spirv.c_str()); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions()); +} + +TEST_F(ValidateMemory, WebGPUInitializerWithOutputStorageClassesGood) { + std::string spirv = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft +%float = OpTypeFloat 32 +%float_ptr = OpTypePointer Output %float +%init_val = OpConstant %float 1.0 +%1 = OpVariable %float_ptr Output %init_val +%void = OpTypeVoid +%functy = OpTypeFunction %void +%func = OpFunction %void None %functy +%2 = OpLabel +OpReturn +OpFunctionEnd +)"; + CompileSuccessfully(spirv.c_str(), SPV_ENV_WEBGPU_0); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_WEBGPU_0)); +} + +TEST_F(ValidateMemory, WebGPUInitializerWithFunctionStorageClassesGood) { + std::string spirv = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft +%float = OpTypeFloat 32 +%float_ptr = OpTypePointer Function %float +%init_val = OpConstant %float 1.0 +%void = OpTypeVoid +%functy = OpTypeFunction %void +%func = OpFunction %void None %functy +%1 = OpLabel +%2 = OpVariable %float_ptr Function %init_val +OpReturn +OpFunctionEnd +)"; + CompileSuccessfully(spirv.c_str(), SPV_ENV_WEBGPU_0); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_WEBGPU_0)); +} + +TEST_F(ValidateMemory, WebGPUInitializerWithPrivateStorageClassesGood) { + std::string spirv = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft +%float = OpTypeFloat 32 +%float_ptr = OpTypePointer Private %float +%init_val = OpConstant %float 1.0 +%1 = OpVariable %float_ptr Private %init_val +%void = OpTypeVoid +%functy = OpTypeFunction %void +%func = OpFunction %void None %functy +%2 = OpLabel +OpReturn +OpFunctionEnd +)"; + CompileSuccessfully(spirv.c_str(), SPV_ENV_WEBGPU_0); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_WEBGPU_0)); +} + +TEST_F(ValidateMemory, WebGPUInitializerWithDisallowedStorageClassesBad) { + std::string spirv = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft +%float = OpTypeFloat 32 +%float_ptr = OpTypePointer Uniform %float +%init_val = OpConstant %float 1.0 +%1 = OpVariable %float_ptr Uniform %init_val +%void = OpTypeVoid +%functy = OpTypeFunction %void +%func = OpFunction %void None %functy +%2 = OpLabel +OpReturn +OpFunctionEnd +)"; + CompileSuccessfully(spirv.c_str(), SPV_ENV_WEBGPU_0); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions(SPV_ENV_WEBGPU_0)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr( + "OpVariable, '5[%5]', has a disallowed initializer & storage " + "class combination.\nFrom WebGPU execution environment spec:\n" + "Variable declarations that include initializers must have one of " + "the following storage classes: Output, Private, or Function\n" + " %5 = OpVariable %_ptr_Uniform_float Uniform %float_1\n")); +} + +TEST_F(ValidateMemory, VulkanInitializerWithOutputStorageClassesGood) { + std::string spirv = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft +%float = OpTypeFloat 32 +%float_ptr = OpTypePointer Output %float +%init_val = OpConstant %float 1.0 +%1 = OpVariable %float_ptr Output %init_val +%void = OpTypeVoid +%functy = OpTypeFunction %void +%func = OpFunction %void None %functy +%2 = OpLabel +OpReturn +OpFunctionEnd +)"; + CompileSuccessfully(spirv.c_str(), SPV_ENV_VULKAN_1_1); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_1)); +} + +TEST_F(ValidateMemory, VulkanInitializerWithFunctionStorageClassesGood) { + std::string spirv = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft +%float = OpTypeFloat 32 +%float_ptr = OpTypePointer Function %float +%init_val = OpConstant %float 1.0 +%void = OpTypeVoid +%functy = OpTypeFunction %void +%func = OpFunction %void None %functy +%1 = OpLabel +%2 = OpVariable %float_ptr Function %init_val +OpReturn +OpFunctionEnd +)"; + CompileSuccessfully(spirv.c_str(), SPV_ENV_VULKAN_1_1); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_1)); +} + +TEST_F(ValidateMemory, VulkanInitializerWithPrivateStorageClassesGood) { + std::string spirv = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft +%float = OpTypeFloat 32 +%float_ptr = OpTypePointer Private %float +%init_val = OpConstant %float 1.0 +%1 = OpVariable %float_ptr Private %init_val +%void = OpTypeVoid +%functy = OpTypeFunction %void +%func = OpFunction %void None %functy +%2 = OpLabel +OpReturn +OpFunctionEnd +)"; + CompileSuccessfully(spirv.c_str(), SPV_ENV_VULKAN_1_1); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_1)); +} + +TEST_F(ValidateMemory, VulkanInitializerWithDisallowedStorageClassesBad) { + std::string spirv = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft +%float = OpTypeFloat 32 +%float_ptr = OpTypePointer Input %float +%init_val = OpConstant %float 1.0 +%1 = OpVariable %float_ptr Input %init_val +%void = OpTypeVoid +%functy = OpTypeFunction %void +%func = OpFunction %void None %functy +%2 = OpLabel +OpReturn +OpFunctionEnd +)"; + CompileSuccessfully(spirv.c_str(), SPV_ENV_VULKAN_1_1); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions(SPV_ENV_VULKAN_1_1)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr( + "OpVariable, '5[%5]', has a disallowed initializer & storage " + "class combination.\nFrom Vulkan spec, Appendix A:\n" + "Variable declarations that include initializers must have one of " + "the following storage classes: Output, Private, or Function\n " + "%5 = OpVariable %_ptr_Input_float Input %float_1\n")); +} + +TEST_F(ValidateMemory, ArrayLenCorrectResultType) { + std::string spirv = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %1 "main" + OpExecutionMode %1 OriginUpperLeft + %void = OpTypeVoid + %3 = OpTypeFunction %void + %float = OpTypeFloat 32 + %uint = OpTypeInt 32 0 +%_runtimearr_float = OpTypeRuntimeArray %float + %_struct_7 = OpTypeStruct %_runtimearr_float +%_ptr_Function__struct_7 = OpTypePointer Function %_struct_7 + %1 = OpFunction %void None %3 + %9 = OpLabel + %10 = OpVariable %_ptr_Function__struct_7 Function + %11 = OpArrayLength %uint %10 0 + OpReturn + OpFunctionEnd + +)"; + + CompileSuccessfully(spirv.c_str()); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions()); +} + +TEST_F(ValidateMemory, ArrayLenIndexCorrectWith2Members) { + std::string spirv = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %1 "main" + OpExecutionMode %1 OriginUpperLeft + %void = OpTypeVoid + %3 = OpTypeFunction %void + %float = OpTypeFloat 32 + %uint = OpTypeInt 32 0 +%_runtimearr_float = OpTypeRuntimeArray %float + %_struct_7 = OpTypeStruct %float %_runtimearr_float +%_ptr_Function__struct_7 = OpTypePointer Function %_struct_7 + %1 = OpFunction %void None %3 + %9 = OpLabel + %10 = OpVariable %_ptr_Function__struct_7 Function + %11 = OpArrayLength %uint %10 1 + OpReturn + OpFunctionEnd + +)"; + + CompileSuccessfully(spirv.c_str()); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions()); +} + +TEST_F(ValidateMemory, ArrayLenResultNotIntType) { + std::string spirv = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %1 "main" + OpExecutionMode %1 OriginUpperLeft + %void = OpTypeVoid + %3 = OpTypeFunction %void + %float = OpTypeFloat 32 +%_runtimearr_float = OpTypeRuntimeArray %float + %_struct_6 = OpTypeStruct %_runtimearr_float +%_ptr_Function__struct_6 = OpTypePointer Function %_struct_6 + %1 = OpFunction %void None %3 + %8 = OpLabel + %9 = OpVariable %_ptr_Function__struct_6 Function + %10 = OpArrayLength %float %9 0 + OpReturn + OpFunctionEnd +)"; + + CompileSuccessfully(spirv.c_str()); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr( + "The Result Type of OpArrayLength '10[%10]' must be OpTypeInt " + "with width 32 and signedness 0.\n %10 = OpArrayLength %float %9 " + "0\n")); +} + +TEST_F(ValidateMemory, ArrayLenResultNot32bits) { + std::string spirv = R"( + OpCapability Shader + OpCapability Int16 + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %1 "main" + OpExecutionMode %1 OriginUpperLeft + %void = OpTypeVoid + %3 = OpTypeFunction %void + %float = OpTypeFloat 32 + %ushort = OpTypeInt 16 0 +%_runtimearr_float = OpTypeRuntimeArray %float + %_struct_7 = OpTypeStruct %_runtimearr_float +%_ptr_Function__struct_7 = OpTypePointer Function %_struct_7 + %1 = OpFunction %void None %3 + %9 = OpLabel + %10 = OpVariable %_ptr_Function__struct_7 Function + %11 = OpArrayLength %ushort %10 0 + OpReturn + OpFunctionEnd + +)"; + + CompileSuccessfully(spirv.c_str()); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr( + "The Result Type of OpArrayLength '11[%11]' must be OpTypeInt " + "with width 32 and signedness 0.\n %11 = OpArrayLength %ushort %10 " + "0\n")); +} + +TEST_F(ValidateMemory, ArrayLenResultSigned) { + std::string spirv = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %1 "main" + OpExecutionMode %1 OriginUpperLeft + %void = OpTypeVoid + %3 = OpTypeFunction %void + %float = OpTypeFloat 32 + %int = OpTypeInt 32 1 +%_runtimearr_float = OpTypeRuntimeArray %float + %_struct_7 = OpTypeStruct %_runtimearr_float +%_ptr_Function__struct_7 = OpTypePointer Function %_struct_7 + %1 = OpFunction %void None %3 + %9 = OpLabel + %10 = OpVariable %_ptr_Function__struct_7 Function + %11 = OpArrayLength %int %10 0 + OpReturn + OpFunctionEnd + +)"; + + CompileSuccessfully(spirv.c_str()); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr( + "The Result Type of OpArrayLength '11[%11]' must be OpTypeInt " + "with width 32 and signedness 0.\n %11 = OpArrayLength %int %10 " + "0\n")); +} + +TEST_F(ValidateMemory, ArrayLenInputNotStruct) { + std::string spirv = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %1 "main" + OpExecutionMode %1 OriginUpperLeft + %void = OpTypeVoid + %3 = OpTypeFunction %void + %float = OpTypeFloat 32 + %uint = OpTypeInt 32 0 +%_runtimearr_float = OpTypeRuntimeArray %float + %_struct_7 = OpTypeStruct %_runtimearr_float +%_ptr_Function_float = OpTypePointer Function %float + %1 = OpFunction %void None %3 + %9 = OpLabel + %10 = OpVariable %_ptr_Function_float Function + %11 = OpArrayLength %uint %10 0 + OpReturn + OpFunctionEnd + +)"; + + CompileSuccessfully(spirv.c_str()); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("The Struture's type in OpArrayLength '11[%11]' " + "must be a pointer to an OpTypeStruct.")); +} + +TEST_F(ValidateMemory, ArrayLenInputLastMemberNoRTA) { + std::string spirv = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %1 "main" + OpExecutionMode %1 OriginUpperLeft + %void = OpTypeVoid + %3 = OpTypeFunction %void + %float = OpTypeFloat 32 + %uint = OpTypeInt 32 0 +%_runtimearr_float = OpTypeRuntimeArray %float + %_struct_7 = OpTypeStruct %float +%_ptr_Function__struct_7 = OpTypePointer Function %_struct_7 + %1 = OpFunction %void None %3 + %9 = OpLabel + %10 = OpVariable %_ptr_Function__struct_7 Function + %11 = OpArrayLength %uint %10 0 + OpReturn + OpFunctionEnd + +)"; + + CompileSuccessfully(spirv.c_str()); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("The Struture's last member in OpArrayLength '11[%11]' " + "must be an OpTypeRuntimeArray.\n %11 = OpArrayLength %uint " + "%10 0\n")); +} + +TEST_F(ValidateMemory, ArrayLenInputLastMemberNoRTA2) { + std::string spirv = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %1 "main" + OpExecutionMode %1 OriginUpperLeft + %void = OpTypeVoid + %3 = OpTypeFunction %void + %float = OpTypeFloat 32 + %uint = OpTypeInt 32 0 +%_runtimearr_float = OpTypeRuntimeArray %float + %_struct_7 = OpTypeStruct %_runtimearr_float %float +%_ptr_Function__struct_7 = OpTypePointer Function %_struct_7 + %1 = OpFunction %void None %3 + %9 = OpLabel + %10 = OpVariable %_ptr_Function__struct_7 Function + %11 = OpArrayLength %uint %10 1 + OpReturn + OpFunctionEnd + +)"; + + CompileSuccessfully(spirv.c_str()); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("The Struture's last member in OpArrayLength '11[%11]' " + "must be an OpTypeRuntimeArray.\n %11 = OpArrayLength %uint " + "%10 1\n")); +} + +TEST_F(ValidateMemory, ArrayLenIndexNotLastMember) { + std::string spirv = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %1 "main" + OpExecutionMode %1 OriginUpperLeft + %void = OpTypeVoid + %3 = OpTypeFunction %void + %float = OpTypeFloat 32 + %uint = OpTypeInt 32 0 +%_runtimearr_float = OpTypeRuntimeArray %float + %_struct_7 = OpTypeStruct %float %_runtimearr_float +%_ptr_Function__struct_7 = OpTypePointer Function %_struct_7 + %1 = OpFunction %void None %3 + %9 = OpLabel + %10 = OpVariable %_ptr_Function__struct_7 Function + %11 = OpArrayLength %uint %10 0 + OpReturn + OpFunctionEnd + +)"; + + CompileSuccessfully(spirv.c_str()); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr( + "The array member in OpArrayLength '11[%11]' must be an the " + "last member of the struct.\n %11 = OpArrayLength %uint %10 0\n")); +} + +TEST_F(ValidateMemory, ArrayLenIndexNotPointerToStruct) { + std::string spirv = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %1 "main" + OpExecutionMode %1 OriginUpperLeft + %void = OpTypeVoid + %3 = OpTypeFunction %void + %float = OpTypeFloat 32 + %uint = OpTypeInt 32 0 +%_runtimearr_float = OpTypeRuntimeArray %float + %_struct_7 = OpTypeStruct %float %_runtimearr_float +%_ptr_Function__struct_7 = OpTypePointer Function %_struct_7 + %1 = OpFunction %void None %3 + %9 = OpLabel + %10 = OpVariable %_ptr_Function__struct_7 Function + %11 = OpLoad %_struct_7 %10 + %12 = OpArrayLength %uint %11 0 + OpReturn + OpFunctionEnd + +)"; + + CompileSuccessfully(spirv.c_str()); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr( + "The Struture's type in OpArrayLength '12[%12]' must be a " + "pointer to an OpTypeStruct.\n %12 = OpArrayLength %uint %11 0\n")); +} + +TEST_F(ValidateMemory, ArrayLenPointerIsAType) { + std::string spirv = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %1 "main" + OpExecutionMode %1 OriginUpperLeft + %void = OpTypeVoid + %3 = OpTypeFunction %void + %float = OpTypeFloat 32 + %uint = OpTypeInt 32 0 + %1 = OpFunction %void None %3 + %9 = OpLabel + %12 = OpArrayLength %uint %float 0 + OpReturn + OpFunctionEnd + +)"; + + CompileSuccessfully(spirv.c_str()); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), HasSubstr("Operand 4[%float] cannot be a " + "type")); +} + +TEST_F(ValidateMemory, PushConstantNotStructGood) { + std::string spirv = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %1 "main" + OpExecutionMode %1 OriginUpperLeft + + %void = OpTypeVoid + %voidfn = OpTypeFunction %void + %float = OpTypeFloat 32 + %ptr = OpTypePointer PushConstant %float + %pc = OpVariable %ptr PushConstant + + %1 = OpFunction %void None %voidfn + %label = OpLabel + OpReturn + OpFunctionEnd +)"; + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions()); +} + +TEST_F(ValidateMemory, VulkanPushConstantNotStructBad) { + std::string spirv = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %1 "main" + OpExecutionMode %1 OriginUpperLeft + + %void = OpTypeVoid + %voidfn = OpTypeFunction %void + %float = OpTypeFloat 32 + %ptr = OpTypePointer PushConstant %float + %pc = OpVariable %ptr PushConstant + + %1 = OpFunction %void None %voidfn + %label = OpLabel + OpReturn + OpFunctionEnd +)"; + CompileSuccessfully(spirv, SPV_ENV_VULKAN_1_1); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions(SPV_ENV_VULKAN_1_1)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("PushConstant OpVariable '6[%6]' has illegal " + "type.\nFrom Vulkan spec, section 14.5.1:\n" + "Such variables must be typed as OpTypeStruct, " + "or an array of this type")); +} + +TEST_F(ValidateMemory, VulkanPushConstant) { + std::string spirv = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %1 "main" + OpExecutionMode %1 OriginUpperLeft + + OpDecorate %struct Block + OpMemberDecorate %struct 0 Offset 0 + + %void = OpTypeVoid + %voidfn = OpTypeFunction %void + %float = OpTypeFloat 32 + %struct = OpTypeStruct %float + %ptr = OpTypePointer PushConstant %struct + %pc = OpVariable %ptr PushConstant + + %1 = OpFunction %void None %voidfn + %label = OpLabel + OpReturn + OpFunctionEnd +)"; + CompileSuccessfully(spirv, SPV_ENV_VULKAN_1_1); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_1)); +} + +TEST_F(ValidateMemory, VulkanMemoryModelDeviceScopeLoadBad1) { + const std::string spirv = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpCapability Linkage +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%device = OpConstant %int 1 +%int_ptr_ssbo = OpTypePointer StorageBuffer %int +%var = OpVariable %int_ptr_ssbo StorageBuffer +%voidfn = OpTypeFunction %void +%func = OpFunction %void None %voidfn +%entry = OpLabel +%load = OpLoad %int %var MakePointerVisibleKHR|NonPrivatePointerKHR %device +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, + ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("Use of device scope with VulkanKHR memory model requires the " + "VulkanMemoryModelDeviceScopeKHR capability")); +} + +TEST_F(ValidateMemory, VulkanMemoryModelDeviceScopeLoadBad2) { + const std::string spirv = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpCapability Linkage +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%device = OpConstant %int 1 +%int_ptr_ssbo = OpTypePointer StorageBuffer %int +%var = OpVariable %int_ptr_ssbo StorageBuffer +%voidfn = OpTypeFunction %void +%func = OpFunction %void None %voidfn +%entry = OpLabel +%load = OpLoad %int %var Aligned|MakePointerVisibleKHR|NonPrivatePointerKHR 4 %device +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, + ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("Use of device scope with VulkanKHR memory model requires the " + "VulkanMemoryModelDeviceScopeKHR capability")); +} + +TEST_F(ValidateMemory, VulkanMemoryModelDeviceScopeLoadGood1) { + const std::string spirv = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpCapability VulkanMemoryModelDeviceScopeKHR +OpCapability Linkage +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%device = OpConstant %int 1 +%int_ptr_ssbo = OpTypePointer StorageBuffer %int +%var = OpVariable %int_ptr_ssbo StorageBuffer +%voidfn = OpTypeFunction %void +%func = OpFunction %void None %voidfn +%entry = OpLabel +%load = OpLoad %int %var MakePointerVisibleKHR|NonPrivatePointerKHR %device +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); +} + +TEST_F(ValidateMemory, VulkanMemoryModelDeviceScopeLoadGood2) { + const std::string spirv = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpCapability VulkanMemoryModelDeviceScopeKHR +OpCapability Linkage +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%device = OpConstant %int 1 +%int_ptr_ssbo = OpTypePointer StorageBuffer %int +%var = OpVariable %int_ptr_ssbo StorageBuffer +%voidfn = OpTypeFunction %void +%func = OpFunction %void None %voidfn +%entry = OpLabel +%load = OpLoad %int %var Aligned|MakePointerVisibleKHR|NonPrivatePointerKHR 4 %device +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); +} + +TEST_F(ValidateMemory, VulkanMemoryModelDeviceScopeStoreBad1) { + const std::string spirv = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpCapability Linkage +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%device = OpConstant %int 1 +%int_ptr_ssbo = OpTypePointer StorageBuffer %int +%var = OpVariable %int_ptr_ssbo StorageBuffer +%voidfn = OpTypeFunction %void +%func = OpFunction %void None %voidfn +%entry = OpLabel +OpStore %var %device MakePointerAvailableKHR|NonPrivatePointerKHR %device +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, + ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("Use of device scope with VulkanKHR memory model requires the " + "VulkanMemoryModelDeviceScopeKHR capability")); +} + +TEST_F(ValidateMemory, VulkanMemoryModelDeviceScopeStoreBad2) { + const std::string spirv = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpCapability Linkage +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%device = OpConstant %int 1 +%int_ptr_ssbo = OpTypePointer StorageBuffer %int +%var = OpVariable %int_ptr_ssbo StorageBuffer +%voidfn = OpTypeFunction %void +%func = OpFunction %void None %voidfn +%entry = OpLabel +OpStore %var %device Aligned|MakePointerAvailableKHR|NonPrivatePointerKHR 4 %device +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, + ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("Use of device scope with VulkanKHR memory model requires the " + "VulkanMemoryModelDeviceScopeKHR capability")); +} + +TEST_F(ValidateMemory, VulkanMemoryModelDeviceScopeStoreGood1) { + const std::string spirv = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpCapability VulkanMemoryModelDeviceScopeKHR +OpCapability Linkage +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%device = OpConstant %int 1 +%int_ptr_ssbo = OpTypePointer StorageBuffer %int +%var = OpVariable %int_ptr_ssbo StorageBuffer +%voidfn = OpTypeFunction %void +%func = OpFunction %void None %voidfn +%entry = OpLabel +OpStore %var %device MakePointerAvailableKHR|NonPrivatePointerKHR %device +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); +} + +TEST_F(ValidateMemory, VulkanMemoryModelDeviceScopeStoreGood2) { + const std::string spirv = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpCapability VulkanMemoryModelDeviceScopeKHR +OpCapability Linkage +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%device = OpConstant %int 1 +%int_ptr_ssbo = OpTypePointer StorageBuffer %int +%var = OpVariable %int_ptr_ssbo StorageBuffer +%voidfn = OpTypeFunction %void +%func = OpFunction %void None %voidfn +%entry = OpLabel +OpStore %var %device Aligned|MakePointerAvailableKHR|NonPrivatePointerKHR 4 %device +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); +} + +TEST_F(ValidateMemory, VulkanMemoryModelDeviceScopeCopyMemoryBad1) { + const std::string spirv = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpCapability Linkage +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%device = OpConstant %int 1 +%int_ptr_ssbo = OpTypePointer StorageBuffer %int +%var1 = OpVariable %int_ptr_ssbo StorageBuffer +%var2 = OpVariable %int_ptr_ssbo StorageBuffer +%voidfn = OpTypeFunction %void +%func = OpFunction %void None %voidfn +%entry = OpLabel +OpCopyMemory %var1 %var2 MakePointerAvailableKHR|NonPrivatePointerKHR %device +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, + ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("Use of device scope with VulkanKHR memory model requires the " + "VulkanMemoryModelDeviceScopeKHR capability")); +} + +TEST_F(ValidateMemory, VulkanMemoryModelDeviceScopeCopyMemoryBad2) { + const std::string spirv = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpCapability Linkage +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%device = OpConstant %int 1 +%workgroup = OpConstant %int 1 +%int_ptr_ssbo = OpTypePointer StorageBuffer %int +%var1 = OpVariable %int_ptr_ssbo StorageBuffer +%var2 = OpVariable %int_ptr_ssbo StorageBuffer +%voidfn = OpTypeFunction %void +%func = OpFunction %void None %voidfn +%entry = OpLabel +OpCopyMemory %var1 %var2 Aligned|MakePointerVisibleKHR|MakePointerAvailableKHR|NonPrivatePointerKHR 4 %device %workgroup +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, + ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("Use of device scope with VulkanKHR memory model requires the " + "VulkanMemoryModelDeviceScopeKHR capability")); +} + +TEST_F(ValidateMemory, VulkanMemoryModelDeviceScopeCopyMemoryBad3) { + const std::string spirv = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpCapability Linkage +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%device = OpConstant %int 1 +%workgroup = OpConstant %int 1 +%int_ptr_ssbo = OpTypePointer StorageBuffer %int +%var1 = OpVariable %int_ptr_ssbo StorageBuffer +%var2 = OpVariable %int_ptr_ssbo StorageBuffer +%voidfn = OpTypeFunction %void +%func = OpFunction %void None %voidfn +%entry = OpLabel +OpCopyMemory %var1 %var2 Aligned|MakePointerVisibleKHR|MakePointerAvailableKHR|NonPrivatePointerKHR 4 %workgroup %device +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, + ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("Use of device scope with VulkanKHR memory model requires the " + "VulkanMemoryModelDeviceScopeKHR capability")); +} + +TEST_F(ValidateMemory, VulkanMemoryModelDeviceScopeCopyMemoryGood1) { + const std::string spirv = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpCapability VulkanMemoryModelDeviceScopeKHR +OpCapability Linkage +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%device = OpConstant %int 1 +%int_ptr_ssbo = OpTypePointer StorageBuffer %int +%var1 = OpVariable %int_ptr_ssbo StorageBuffer +%var2 = OpVariable %int_ptr_ssbo StorageBuffer +%voidfn = OpTypeFunction %void +%func = OpFunction %void None %voidfn +%entry = OpLabel +OpCopyMemory %var1 %var2 MakePointerAvailableKHR|NonPrivatePointerKHR %device +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); +} + +TEST_F(ValidateMemory, VulkanMemoryModelDeviceScopeCopyMemoryGood2) { + const std::string spirv = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpCapability VulkanMemoryModelDeviceScopeKHR +OpCapability Linkage +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%device = OpConstant %int 1 +%workgroup = OpConstant %int 2 +%int_ptr_ssbo = OpTypePointer StorageBuffer %int +%var1 = OpVariable %int_ptr_ssbo StorageBuffer +%var2 = OpVariable %int_ptr_ssbo StorageBuffer +%voidfn = OpTypeFunction %void +%func = OpFunction %void None %voidfn +%entry = OpLabel +OpCopyMemory %var1 %var2 Aligned|MakePointerVisibleKHR|MakePointerAvailableKHR|NonPrivatePointerKHR 4 %device %workgroup +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); +} + +TEST_F(ValidateMemory, VulkanMemoryModelDeviceScopeCopyMemoryGood3) { + const std::string spirv = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpCapability VulkanMemoryModelDeviceScopeKHR +OpCapability Linkage +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%device = OpConstant %int 1 +%workgroup = OpConstant %int 2 +%int_ptr_ssbo = OpTypePointer StorageBuffer %int +%var1 = OpVariable %int_ptr_ssbo StorageBuffer +%var2 = OpVariable %int_ptr_ssbo StorageBuffer +%voidfn = OpTypeFunction %void +%func = OpFunction %void None %voidfn +%entry = OpLabel +OpCopyMemory %var1 %var2 Aligned|MakePointerVisibleKHR|MakePointerAvailableKHR|NonPrivatePointerKHR 4 %workgroup %device +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); +} + +TEST_F(ValidateMemory, VulkanMemoryModelDeviceScopeCopyMemorySizedBad1) { + const std::string spirv = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpCapability Linkage +OpCapability Addresses +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%device = OpConstant %int 1 +%int_ptr_ssbo = OpTypePointer StorageBuffer %int +%var1 = OpVariable %int_ptr_ssbo StorageBuffer +%var2 = OpVariable %int_ptr_ssbo StorageBuffer +%voidfn = OpTypeFunction %void +%func = OpFunction %void None %voidfn +%entry = OpLabel +OpCopyMemorySized %var1 %var2 %device MakePointerAvailableKHR|NonPrivatePointerKHR %device +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, + ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("Use of device scope with VulkanKHR memory model requires the " + "VulkanMemoryModelDeviceScopeKHR capability")); +} + +TEST_F(ValidateMemory, VulkanMemoryModelDeviceScopeCopyMemorySizedBad2) { + const std::string spirv = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpCapability Linkage +OpCapability Addresses +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%device = OpConstant %int 1 +%workgroup = OpConstant %int 1 +%int_ptr_ssbo = OpTypePointer StorageBuffer %int +%var1 = OpVariable %int_ptr_ssbo StorageBuffer +%var2 = OpVariable %int_ptr_ssbo StorageBuffer +%voidfn = OpTypeFunction %void +%func = OpFunction %void None %voidfn +%entry = OpLabel +OpCopyMemorySized %var1 %var2 %device Aligned|MakePointerVisibleKHR|MakePointerAvailableKHR|NonPrivatePointerKHR 4 %device %workgroup +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, + ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("Use of device scope with VulkanKHR memory model requires the " + "VulkanMemoryModelDeviceScopeKHR capability")); +} + +TEST_F(ValidateMemory, VulkanMemoryModelDeviceScopeCopyMemorySizedBad3) { + const std::string spirv = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpCapability Linkage +OpCapability Addresses +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%device = OpConstant %int 1 +%workgroup = OpConstant %int 1 +%int_ptr_ssbo = OpTypePointer StorageBuffer %int +%var1 = OpVariable %int_ptr_ssbo StorageBuffer +%var2 = OpVariable %int_ptr_ssbo StorageBuffer +%voidfn = OpTypeFunction %void +%func = OpFunction %void None %voidfn +%entry = OpLabel +OpCopyMemorySized %var1 %var2 %device Aligned|MakePointerVisibleKHR|MakePointerAvailableKHR|NonPrivatePointerKHR 4 %workgroup %device +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_ERROR_INVALID_DATA, + ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("Use of device scope with VulkanKHR memory model requires the " + "VulkanMemoryModelDeviceScopeKHR capability")); +} + +TEST_F(ValidateMemory, VulkanMemoryModelDeviceScopeCopyMemorySizedGood1) { + const std::string spirv = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpCapability VulkanMemoryModelDeviceScopeKHR +OpCapability Linkage +OpCapability Addresses +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%device = OpConstant %int 1 +%int_ptr_ssbo = OpTypePointer StorageBuffer %int +%var1 = OpVariable %int_ptr_ssbo StorageBuffer +%var2 = OpVariable %int_ptr_ssbo StorageBuffer +%voidfn = OpTypeFunction %void +%func = OpFunction %void None %voidfn +%entry = OpLabel +OpCopyMemorySized %var1 %var2 %device MakePointerAvailableKHR|NonPrivatePointerKHR %device +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); +} + +TEST_F(ValidateMemory, VulkanMemoryModelDeviceScopeCopyMemorySizedGood2) { + const std::string spirv = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpCapability VulkanMemoryModelDeviceScopeKHR +OpCapability Linkage +OpCapability Addresses +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%device = OpConstant %int 1 +%workgroup = OpConstant %int 2 +%int_ptr_ssbo = OpTypePointer StorageBuffer %int +%var1 = OpVariable %int_ptr_ssbo StorageBuffer +%var2 = OpVariable %int_ptr_ssbo StorageBuffer +%voidfn = OpTypeFunction %void +%func = OpFunction %void None %voidfn +%entry = OpLabel +OpCopyMemorySized %var1 %var2 %device Aligned|MakePointerVisibleKHR|MakePointerAvailableKHR|NonPrivatePointerKHR 4 %device %workgroup +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); +} + +TEST_F(ValidateMemory, VulkanMemoryModelDeviceScopeCopyMemorySizedGood3) { + const std::string spirv = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpCapability VulkanMemoryModelDeviceScopeKHR +OpCapability Linkage +OpCapability Addresses +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +%void = OpTypeVoid +%int = OpTypeInt 32 0 +%device = OpConstant %int 1 +%workgroup = OpConstant %int 2 +%int_ptr_ssbo = OpTypePointer StorageBuffer %int +%var1 = OpVariable %int_ptr_ssbo StorageBuffer +%var2 = OpVariable %int_ptr_ssbo StorageBuffer +%voidfn = OpTypeFunction %void +%func = OpFunction %void None %voidfn +%entry = OpLabel +OpCopyMemorySized %var1 %var2 %device Aligned|MakePointerVisibleKHR|MakePointerAvailableKHR|NonPrivatePointerKHR 4 %workgroup %device +OpReturn +OpFunctionEnd +)"; + + CompileSuccessfully(spirv, SPV_ENV_UNIVERSAL_1_3); + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_3)); +} + +TEST_F(ValidateMemory, ArrayLengthStructIsLabel) { + const std::string spirv = R"( +OpCapability Tessellation +OpMemoryModel Logical GLSL450 +OpName %20 "incorrect" +%void = OpTypeVoid +%3 = OpTypeFunction %void +%float = OpTypeFloat 32 +%v4float = OpTypeVector %float 4 +%uint = OpTypeInt 32 0 +%4 = OpFunction %void None %3 +%20 = OpLabel +%24 = OpArrayLength %uint %20 0 +%25 = OpLoad %v4float %24 +OpReturnValue %25 +OpFunctionEnd +)"; + + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Operand 1[%incorrect] requires a type")); +} + +} // namespace +} // namespace val +} // namespace spvtools diff --git a/3rdparty/spirv-tools/test/val/val_modes_test.cpp b/3rdparty/spirv-tools/test/val/val_modes_test.cpp new file mode 100644 index 000000000..7f1ef093d --- /dev/null +++ b/3rdparty/spirv-tools/test/val/val_modes_test.cpp @@ -0,0 +1,801 @@ +// Copyright (c) 2018 Google LLC. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#include +#include + +#include "gmock/gmock.h" +#include "source/spirv_target_env.h" +#include "test/test_fixture.h" +#include "test/unit_spirv.h" +#include "test/val/val_fixtures.h" + +namespace spvtools { +namespace val { +namespace { + +using ::testing::Combine; +using ::testing::HasSubstr; +using ::testing::Values; +using ::testing::ValuesIn; + +using ValidateMode = spvtest::ValidateBase; + +const std::string kVoidFunction = R"(%void = OpTypeVoid +%void_fn = OpTypeFunction %void +%main = OpFunction %void None %void_fn +%entry = OpLabel +OpReturn +OpFunctionEnd +)"; + +TEST_F(ValidateMode, GLComputeNoMode) { + const std::string spirv = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint GLCompute %main "main" +)" + kVoidFunction; + + CompileSuccessfully(spirv); + EXPECT_THAT(SPV_SUCCESS, ValidateInstructions()); +} + +TEST_F(ValidateMode, GLComputeNoModeVulkan) { + const std::string spirv = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint GLCompute %main "main" +)" + kVoidFunction; + + spv_target_env env = SPV_ENV_VULKAN_1_0; + CompileSuccessfully(spirv, env); + EXPECT_THAT(SPV_ERROR_INVALID_DATA, ValidateInstructions(env)); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("In the Vulkan environment, GLCompute execution model entry " + "points require either the LocalSize execution mode or an " + "object decorated with WorkgroupSize must be specified.")); +} + +TEST_F(ValidateMode, GLComputeNoModeVulkanWorkgroupSize) { + const std::string spirv = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint GLCompute %main "main" +OpDecorate %int3_1 BuiltIn WorkgroupSize +%int = OpTypeInt 32 0 +%int3 = OpTypeVector %int 3 +%int_1 = OpConstant %int 1 +%int3_1 = OpConstantComposite %int3 %int_1 %int_1 %int_1 +)" + kVoidFunction; + + spv_target_env env = SPV_ENV_VULKAN_1_0; + CompileSuccessfully(spirv, env); + EXPECT_THAT(SPV_SUCCESS, ValidateInstructions(env)); +} + +TEST_F(ValidateMode, GLComputeVulkanLocalSize) { + const std::string spirv = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint GLCompute %main "main" +OpExecutionMode %main LocalSize 1 1 1 +)" + kVoidFunction; + + spv_target_env env = SPV_ENV_VULKAN_1_0; + CompileSuccessfully(spirv, env); + EXPECT_THAT(SPV_SUCCESS, ValidateInstructions(env)); +} + +TEST_F(ValidateMode, FragmentOriginLowerLeftVulkan) { + const std::string spirv = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginLowerLeft +)" + kVoidFunction; + + spv_target_env env = SPV_ENV_VULKAN_1_0; + CompileSuccessfully(spirv, env); + EXPECT_THAT(SPV_ERROR_INVALID_DATA, ValidateInstructions(env)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("In the Vulkan environment, the OriginLowerLeft " + "execution mode must not be used.")); +} + +TEST_F(ValidateMode, FragmentPixelCenterIntegerVulkan) { + const std::string spirv = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft +OpExecutionMode %main PixelCenterInteger +)" + kVoidFunction; + + spv_target_env env = SPV_ENV_VULKAN_1_0; + CompileSuccessfully(spirv, env); + EXPECT_THAT(SPV_ERROR_INVALID_DATA, ValidateInstructions(env)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("In the Vulkan environment, the PixelCenterInteger " + "execution mode must not be used.")); +} + +TEST_F(ValidateMode, GeometryNoOutputMode) { + const std::string spirv = R"( +OpCapability Geometry +OpMemoryModel Logical GLSL450 +OpEntryPoint Geometry %main "main" +OpExecutionMode %main InputPoints +)" + kVoidFunction; + + CompileSuccessfully(spirv); + EXPECT_THAT(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Geometry execution model entry points must specify " + "exactly one of OutputPoints, OutputLineStrip or " + "OutputTriangleStrip execution modes.")); +} + +TEST_F(ValidateMode, GeometryNoInputMode) { + const std::string spirv = R"( +OpCapability Geometry +OpMemoryModel Logical GLSL450 +OpEntryPoint Geometry %main "main" +OpExecutionMode %main OutputPoints +)" + kVoidFunction; + + CompileSuccessfully(spirv); + EXPECT_THAT(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("Geometry execution model entry points must specify exactly " + "one of InputPoints, InputLines, InputLinesAdjacency, " + "Triangles or InputTrianglesAdjacency execution modes.")); +} + +TEST_F(ValidateMode, FragmentNoOrigin) { + const std::string spirv = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" +)" + kVoidFunction; + + CompileSuccessfully(spirv); + EXPECT_THAT(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("Fragment execution model entry points require either an " + "OriginUpperLeft or OriginLowerLeft execution mode.")); +} + +TEST_F(ValidateMode, FragmentBothOrigins) { + const std::string spirv = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft +OpExecutionMode %main OriginLowerLeft +)" + kVoidFunction; + + CompileSuccessfully(spirv); + EXPECT_THAT(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("Fragment execution model entry points can only specify one of " + "OriginUpperLeft or OriginLowerLeft execution modes.")); +} + +TEST_F(ValidateMode, FragmentDepthGreaterAndLess) { + const std::string spirv = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft +OpExecutionMode %main DepthGreater +OpExecutionMode %main DepthLess +)" + kVoidFunction; + + CompileSuccessfully(spirv); + EXPECT_THAT(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Fragment execution model entry points can specify at " + "most one of DepthGreater, DepthLess or DepthUnchanged " + "execution modes.")); +} + +TEST_F(ValidateMode, FragmentDepthGreaterAndUnchanged) { + const std::string spirv = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft +OpExecutionMode %main DepthGreater +OpExecutionMode %main DepthUnchanged +)" + kVoidFunction; + + CompileSuccessfully(spirv); + EXPECT_THAT(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Fragment execution model entry points can specify at " + "most one of DepthGreater, DepthLess or DepthUnchanged " + "execution modes.")); +} + +TEST_F(ValidateMode, FragmentDepthLessAndUnchanged) { + const std::string spirv = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft +OpExecutionMode %main DepthLess +OpExecutionMode %main DepthUnchanged +)" + kVoidFunction; + + CompileSuccessfully(spirv); + EXPECT_THAT(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Fragment execution model entry points can specify at " + "most one of DepthGreater, DepthLess or DepthUnchanged " + "execution modes.")); +} + +TEST_F(ValidateMode, FragmentAllDepths) { + const std::string spirv = R"( +OpCapability Shader +OpMemoryModel Logical GLSL450 +OpEntryPoint Fragment %main "main" +OpExecutionMode %main OriginUpperLeft +OpExecutionMode %main DepthGreater +OpExecutionMode %main DepthLess +OpExecutionMode %main DepthUnchanged +)" + kVoidFunction; + + CompileSuccessfully(spirv); + EXPECT_THAT(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Fragment execution model entry points can specify at " + "most one of DepthGreater, DepthLess or DepthUnchanged " + "execution modes.")); +} + +TEST_F(ValidateMode, TessellationControlSpacingEqualAndFractionalOdd) { + const std::string spirv = R"( +OpCapability Tessellation +OpMemoryModel Logical GLSL450 +OpEntryPoint TessellationControl %main "main" +OpExecutionMode %main SpacingEqual +OpExecutionMode %main SpacingFractionalOdd +)" + kVoidFunction; + + CompileSuccessfully(spirv); + EXPECT_THAT(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Tessellation execution model entry points can specify " + "at most one of SpacingEqual, SpacingFractionalOdd or " + "SpacingFractionalEven execution modes.")); +} + +TEST_F(ValidateMode, TessellationControlSpacingEqualAndSpacingFractionalEven) { + const std::string spirv = R"( +OpCapability Tessellation +OpMemoryModel Logical GLSL450 +OpEntryPoint TessellationControl %main "main" +OpExecutionMode %main SpacingEqual +OpExecutionMode %main SpacingFractionalEven +)" + kVoidFunction; + + CompileSuccessfully(spirv); + EXPECT_THAT(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Tessellation execution model entry points can specify " + "at most one of SpacingEqual, SpacingFractionalOdd or " + "SpacingFractionalEven execution modes.")); +} + +TEST_F(ValidateMode, + TessellationControlSpacingFractionalOddAndSpacingFractionalEven) { + const std::string spirv = R"( +OpCapability Tessellation +OpMemoryModel Logical GLSL450 +OpEntryPoint TessellationControl %main "main" +OpExecutionMode %main SpacingFractionalOdd +OpExecutionMode %main SpacingFractionalEven +)" + kVoidFunction; + + CompileSuccessfully(spirv); + EXPECT_THAT(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Tessellation execution model entry points can specify " + "at most one of SpacingEqual, SpacingFractionalOdd or " + "SpacingFractionalEven execution modes.")); +} + +TEST_F(ValidateMode, TessellationControlAllSpacing) { + const std::string spirv = R"( +OpCapability Tessellation +OpMemoryModel Logical GLSL450 +OpEntryPoint TessellationControl %main "main" +OpExecutionMode %main SpacingEqual +OpExecutionMode %main SpacingFractionalOdd +OpExecutionMode %main SpacingFractionalEven +)" + kVoidFunction; + + CompileSuccessfully(spirv); + EXPECT_THAT(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Tessellation execution model entry points can specify " + "at most one of SpacingEqual, SpacingFractionalOdd or " + "SpacingFractionalEven execution modes.")); +} + +TEST_F(ValidateMode, + TessellationEvaluationSpacingEqualAndSpacingFractionalOdd) { + const std::string spirv = R"( +OpCapability Tessellation +OpMemoryModel Logical GLSL450 +OpEntryPoint TessellationEvaluation %main "main" +OpExecutionMode %main SpacingEqual +OpExecutionMode %main SpacingFractionalOdd +)" + kVoidFunction; + + CompileSuccessfully(spirv); + EXPECT_THAT(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Tessellation execution model entry points can specify " + "at most one of SpacingEqual, SpacingFractionalOdd or " + "SpacingFractionalEven execution modes.")); +} + +TEST_F(ValidateMode, + TessellationEvaluationSpacingEqualAndSpacingFractionalEven) { + const std::string spirv = R"( +OpCapability Tessellation +OpMemoryModel Logical GLSL450 +OpEntryPoint TessellationEvaluation %main "main" +OpExecutionMode %main SpacingEqual +OpExecutionMode %main SpacingFractionalEven +)" + kVoidFunction; + + CompileSuccessfully(spirv); + EXPECT_THAT(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Tessellation execution model entry points can specify " + "at most one of SpacingEqual, SpacingFractionalOdd or " + "SpacingFractionalEven execution modes.")); +} + +TEST_F(ValidateMode, + TessellationEvaluationSpacingFractionalOddAndSpacingFractionalEven) { + const std::string spirv = R"( +OpCapability Tessellation +OpMemoryModel Logical GLSL450 +OpEntryPoint TessellationEvaluation %main "main" +OpExecutionMode %main SpacingFractionalOdd +OpExecutionMode %main SpacingFractionalEven +)" + kVoidFunction; + + CompileSuccessfully(spirv); + EXPECT_THAT(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Tessellation execution model entry points can specify " + "at most one of SpacingEqual, SpacingFractionalOdd or " + "SpacingFractionalEven execution modes.")); +} + +TEST_F(ValidateMode, TessellationEvaluationAllSpacing) { + const std::string spirv = R"( +OpCapability Tessellation +OpMemoryModel Logical GLSL450 +OpEntryPoint TessellationEvaluation %main "main" +OpExecutionMode %main SpacingEqual +OpExecutionMode %main SpacingFractionalOdd +OpExecutionMode %main SpacingFractionalEven +)" + kVoidFunction; + + CompileSuccessfully(spirv); + EXPECT_THAT(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Tessellation execution model entry points can specify " + "at most one of SpacingEqual, SpacingFractionalOdd or " + "SpacingFractionalEven execution modes.")); +} + +TEST_F(ValidateMode, TessellationControlBothVertex) { + const std::string spirv = R"( +OpCapability Tessellation +OpMemoryModel Logical GLSL450 +OpEntryPoint TessellationControl %main "main" +OpExecutionMode %main VertexOrderCw +OpExecutionMode %main VertexOrderCcw +)" + kVoidFunction; + + CompileSuccessfully(spirv); + EXPECT_THAT(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("Tessellation execution model entry points can specify at most " + "one of VertexOrderCw or VertexOrderCcw execution modes.")); +} + +TEST_F(ValidateMode, TessellationEvaluationBothVertex) { + const std::string spirv = R"( +OpCapability Tessellation +OpMemoryModel Logical GLSL450 +OpEntryPoint TessellationEvaluation %main "main" +OpExecutionMode %main VertexOrderCw +OpExecutionMode %main VertexOrderCcw +)" + kVoidFunction; + + CompileSuccessfully(spirv); + EXPECT_THAT(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("Tessellation execution model entry points can specify at most " + "one of VertexOrderCw or VertexOrderCcw execution modes.")); +} + +using ValidateModeGeometry = spvtest::ValidateBase, + std::tuple>>; + +TEST_P(ValidateModeGeometry, ExecutionMode) { + std::vector input_modes; + std::vector output_modes; + input_modes.push_back(std::get<0>(std::get<0>(GetParam()))); + input_modes.push_back(std::get<1>(std::get<0>(GetParam()))); + input_modes.push_back(std::get<2>(std::get<0>(GetParam()))); + input_modes.push_back(std::get<3>(std::get<0>(GetParam()))); + input_modes.push_back(std::get<4>(std::get<0>(GetParam()))); + output_modes.push_back(std::get<0>(std::get<1>(GetParam()))); + output_modes.push_back(std::get<1>(std::get<1>(GetParam()))); + output_modes.push_back(std::get<2>(std::get<1>(GetParam()))); + + std::ostringstream sstr; + sstr << "OpCapability Geometry\n"; + sstr << "OpMemoryModel Logical GLSL450\n"; + sstr << "OpEntryPoint Geometry %main \"main\"\n"; + size_t num_input_modes = 0; + for (auto input : input_modes) { + if (!input.empty()) { + num_input_modes++; + sstr << "OpExecutionMode %main " << input << "\n"; + } + } + size_t num_output_modes = 0; + for (auto output : output_modes) { + if (!output.empty()) { + num_output_modes++; + sstr << "OpExecutionMode %main " << output << "\n"; + } + } + sstr << "%void = OpTypeVoid\n"; + sstr << "%void_fn = OpTypeFunction %void\n"; + sstr << "%int = OpTypeInt 32 0\n"; + sstr << "%int1 = OpConstant %int 1\n"; + sstr << "%main = OpFunction %void None %void_fn\n"; + sstr << "%entry = OpLabel\n"; + sstr << "OpReturn\n"; + sstr << "OpFunctionEnd\n"; + + CompileSuccessfully(sstr.str()); + if (num_input_modes == 1 && num_output_modes == 1) { + EXPECT_THAT(SPV_SUCCESS, ValidateInstructions()); + } else { + EXPECT_THAT(SPV_ERROR_INVALID_DATA, ValidateInstructions()); + if (num_input_modes != 1) { + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Geometry execution model entry points must " + "specify exactly one of InputPoints, InputLines, " + "InputLinesAdjacency, Triangles or " + "InputTrianglesAdjacency execution modes.")); + } else { + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("Geometry execution model entry points must specify " + "exactly one of OutputPoints, OutputLineStrip or " + "OutputTriangleStrip execution modes.")); + } + } +} + +INSTANTIATE_TEST_CASE_P( + GeometryRequiredModes, ValidateModeGeometry, + Combine(Combine(Values("InputPoints", ""), Values("InputLines", ""), + Values("InputLinesAdjacency", ""), Values("Triangles", ""), + Values("InputTrianglesAdjacency", "")), + Combine(Values("OutputPoints", ""), Values("OutputLineStrip", ""), + Values("OutputTriangleStrip", "")))); + +using ValidateModeExecution = + spvtest::ValidateBase>; + +TEST_P(ValidateModeExecution, ExecutionMode) { + const spv_result_t expectation = std::get<0>(GetParam()); + const std::string error = std::get<1>(GetParam()); + const std::string model = std::get<2>(GetParam()); + const std::string mode = std::get<3>(GetParam()); + const spv_target_env env = std::get<4>(GetParam()); + + std::ostringstream sstr; + sstr << "OpCapability Shader\n"; + sstr << "OpCapability Geometry\n"; + sstr << "OpCapability Tessellation\n"; + sstr << "OpCapability TransformFeedback\n"; + if (!spvIsVulkanEnv(env)) { + sstr << "OpCapability Kernel\n"; + if (env == SPV_ENV_UNIVERSAL_1_3) { + sstr << "OpCapability SubgroupDispatch\n"; + } + } + sstr << "OpMemoryModel Logical GLSL450\n"; + sstr << "OpEntryPoint " << model << " %main \"main\"\n"; + if (mode.find("LocalSizeId") == 0 || mode.find("LocalSizeHintId") == 0 || + mode.find("SubgroupsPerWorkgroupId") == 0) { + sstr << "OpExecutionModeId %main " << mode << "\n"; + } else { + sstr << "OpExecutionMode %main " << mode << "\n"; + } + if (model == "Geometry") { + if (!(mode.find("InputPoints") == 0 || mode.find("InputLines") == 0 || + mode.find("InputLinesAdjacency") == 0 || + mode.find("Triangles") == 0 || + mode.find("InputTrianglesAdjacency") == 0)) { + // Exactly one of the above modes is required for Geometry shaders. + sstr << "OpExecutionMode %main InputPoints\n"; + } + if (!(mode.find("OutputPoints") == 0 || mode.find("OutputLineStrip") == 0 || + mode.find("OutputTriangleStrip") == 0)) { + // Exactly one of the above modes is required for Geometry shaders. + sstr << "OpExecutionMode %main OutputPoints\n"; + } + } else if (model == "Fragment") { + if (!(mode.find("OriginUpperLeft") == 0 || + mode.find("OriginLowerLeft") == 0)) { + // Exactly one of the above modes is required for Fragment shaders. + sstr << "OpExecutionMode %main OriginUpperLeft\n"; + } + } + sstr << "%void = OpTypeVoid\n"; + sstr << "%void_fn = OpTypeFunction %void\n"; + sstr << "%int = OpTypeInt 32 0\n"; + sstr << "%int1 = OpConstant %int 1\n"; + sstr << "%main = OpFunction %void None %void_fn\n"; + sstr << "%entry = OpLabel\n"; + sstr << "OpReturn\n"; + sstr << "OpFunctionEnd\n"; + + CompileSuccessfully(sstr.str(), env); + EXPECT_THAT(expectation, ValidateInstructions(env)); + if (expectation != SPV_SUCCESS) { + EXPECT_THAT(getDiagnosticString(), HasSubstr(error)); + } +} + +INSTANTIATE_TEST_CASE_P( + ValidateModeGeometryOnlyGoodSpv10, ValidateModeExecution, + Combine(Values(SPV_SUCCESS), Values(""), Values("Geometry"), + Values("Invocations 3", "InputPoints", "InputLines", + "InputLinesAdjacency", "InputTrianglesAdjacency", + "OutputPoints", "OutputLineStrip", "OutputTriangleStrip"), + Values(SPV_ENV_UNIVERSAL_1_0))); + +INSTANTIATE_TEST_CASE_P( + ValidateModeGeometryOnlyBadSpv10, ValidateModeExecution, + Combine(Values(SPV_ERROR_INVALID_DATA), + Values("Execution mode can only be used with the Geometry " + "execution model."), + Values("Fragment", "TessellationEvaluation", "TessellationControl", + "GLCompute", "Vertex", "Kernel"), + Values("Invocations 3", "InputPoints", "InputLines", + "InputLinesAdjacency", "InputTrianglesAdjacency", + "OutputPoints", "OutputLineStrip", "OutputTriangleStrip"), + Values(SPV_ENV_UNIVERSAL_1_0))); + +INSTANTIATE_TEST_CASE_P( + ValidateModeTessellationOnlyGoodSpv10, ValidateModeExecution, + Combine(Values(SPV_SUCCESS), Values(""), + Values("TessellationControl", "TessellationEvaluation"), + Values("SpacingEqual", "SpacingFractionalEven", + "SpacingFractionalOdd", "VertexOrderCw", "VertexOrderCcw", + "PointMode", "Quads", "Isolines"), + Values(SPV_ENV_UNIVERSAL_1_0))); + +INSTANTIATE_TEST_CASE_P( + ValidateModeTessellationOnlyBadSpv10, ValidateModeExecution, + Combine(Values(SPV_ERROR_INVALID_DATA), + Values("Execution mode can only be used with a tessellation " + "execution model."), + Values("Fragment", "Geometry", "GLCompute", "Vertex", "Kernel"), + Values("SpacingEqual", "SpacingFractionalEven", + "SpacingFractionalOdd", "VertexOrderCw", "VertexOrderCcw", + "PointMode", "Quads", "Isolines"), + Values(SPV_ENV_UNIVERSAL_1_0))); + +INSTANTIATE_TEST_CASE_P(ValidateModeGeometryAndTessellationGoodSpv10, + ValidateModeExecution, + Combine(Values(SPV_SUCCESS), Values(""), + Values("TessellationControl", + "TessellationEvaluation", "Geometry"), + Values("Triangles", "OutputVertices 3"), + Values(SPV_ENV_UNIVERSAL_1_0))); + +INSTANTIATE_TEST_CASE_P( + ValidateModeGeometryAndTessellationBadSpv10, ValidateModeExecution, + Combine(Values(SPV_ERROR_INVALID_DATA), + Values("Execution mode can only be used with a Geometry or " + "tessellation execution model."), + Values("Fragment", "GLCompute", "Vertex", "Kernel"), + Values("Triangles", "OutputVertices 3"), + Values(SPV_ENV_UNIVERSAL_1_0))); + +INSTANTIATE_TEST_CASE_P( + ValidateModeFragmentOnlyGoodSpv10, ValidateModeExecution, + Combine(Values(SPV_SUCCESS), Values(""), Values("Fragment"), + Values("PixelCenterInteger", "OriginUpperLeft", "OriginLowerLeft", + "EarlyFragmentTests", "DepthReplacing", "DepthLess", + "DepthUnchanged"), + Values(SPV_ENV_UNIVERSAL_1_0))); + +INSTANTIATE_TEST_CASE_P( + ValidateModeFragmentOnlyBadSpv10, ValidateModeExecution, + Combine(Values(SPV_ERROR_INVALID_DATA), + Values("Execution mode can only be used with the Fragment " + "execution model."), + Values("Geometry", "TessellationControl", "TessellationEvaluation", + "GLCompute", "Vertex", "Kernel"), + Values("PixelCenterInteger", "OriginUpperLeft", "OriginLowerLeft", + "EarlyFragmentTests", "DepthReplacing", "DepthLess", + "DepthUnchanged"), + Values(SPV_ENV_UNIVERSAL_1_0))); + +INSTANTIATE_TEST_CASE_P(ValidateModeKernelOnlyGoodSpv13, ValidateModeExecution, + Combine(Values(SPV_SUCCESS), Values(""), + Values("Kernel"), + Values("LocalSizeHint 1 1 1", "VecTypeHint 4", + "ContractionOff", + "LocalSizeHintId %int1"), + Values(SPV_ENV_UNIVERSAL_1_3))); + +INSTANTIATE_TEST_CASE_P( + ValidateModeKernelOnlyBadSpv13, ValidateModeExecution, + Combine( + Values(SPV_ERROR_INVALID_DATA), + Values( + "Execution mode can only be used with the Kernel execution model."), + Values("Geometry", "TessellationControl", "TessellationEvaluation", + "GLCompute", "Vertex", "Fragment"), + Values("LocalSizeHint 1 1 1", "VecTypeHint 4", "ContractionOff", + "LocalSizeHintId %int1"), + Values(SPV_ENV_UNIVERSAL_1_3))); + +INSTANTIATE_TEST_CASE_P( + ValidateModeGLComputeAndKernelGoodSpv13, ValidateModeExecution, + Combine(Values(SPV_SUCCESS), Values(""), Values("Kernel", "GLCompute"), + Values("LocalSize 1 1 1", "LocalSizeId %int1 %int1 %int1"), + Values(SPV_ENV_UNIVERSAL_1_3))); + +INSTANTIATE_TEST_CASE_P( + ValidateModeGLComputeAndKernelBadSpv13, ValidateModeExecution, + Combine(Values(SPV_ERROR_INVALID_DATA), + Values("Execution mode can only be used with a Kernel or GLCompute " + "execution model."), + Values("Geometry", "TessellationControl", "TessellationEvaluation", + "Fragment", "Vertex"), + Values("LocalSize 1 1 1", "LocalSizeId %int1 %int1 %int1"), + Values(SPV_ENV_UNIVERSAL_1_3))); + +INSTANTIATE_TEST_CASE_P( + ValidateModeAllGoodSpv13, ValidateModeExecution, + Combine(Values(SPV_SUCCESS), Values(""), + Values("Kernel", "GLCompute", "Geometry", "TessellationControl", + "TessellationEvaluation", "Fragment", "Vertex"), + Values("Xfb", "Initializer", "Finalizer", "SubgroupSize 1", + "SubgroupsPerWorkgroup 1", "SubgroupsPerWorkgroupId %int1"), + Values(SPV_ENV_UNIVERSAL_1_3))); + +TEST_F(ValidateModeExecution, MeshNVLocalSize) { + const std::string spirv = R"( +OpCapability Shader +OpCapability MeshShadingNV +OpExtension "SPV_NV_mesh_shader" +OpMemoryModel Logical GLSL450 +OpEntryPoint MeshNV %main "main" +OpExecutionMode %main LocalSize 1 1 1 +)" + kVoidFunction; + + CompileSuccessfully(spirv); + EXPECT_THAT(SPV_SUCCESS, ValidateInstructions()); +} + +TEST_F(ValidateModeExecution, TaskNVLocalSize) { + const std::string spirv = R"( +OpCapability Shader +OpCapability MeshShadingNV +OpExtension "SPV_NV_mesh_shader" +OpMemoryModel Logical GLSL450 +OpEntryPoint TaskNV %main "main" +OpExecutionMode %main LocalSize 1 1 1 +)" + kVoidFunction; + + CompileSuccessfully(spirv); + EXPECT_THAT(SPV_SUCCESS, ValidateInstructions()); +} + +TEST_F(ValidateModeExecution, MeshNVOutputPoints) { + const std::string spirv = R"( +OpCapability Shader +OpCapability MeshShadingNV +OpExtension "SPV_NV_mesh_shader" +OpMemoryModel Logical GLSL450 +OpEntryPoint MeshNV %main "main" +OpExecutionMode %main OutputPoints +)" + kVoidFunction; + + CompileSuccessfully(spirv); + EXPECT_THAT(SPV_SUCCESS, ValidateInstructions()); +} + +TEST_F(ValidateModeExecution, MeshNVOutputVertices) { + const std::string spirv = R"( +OpCapability Shader +OpCapability MeshShadingNV +OpExtension "SPV_NV_mesh_shader" +OpMemoryModel Logical GLSL450 +OpEntryPoint MeshNV %main "main" +OpExecutionMode %main OutputVertices 42 +)" + kVoidFunction; + + CompileSuccessfully(spirv); + EXPECT_THAT(SPV_SUCCESS, ValidateInstructions()); +} + +TEST_F(ValidateModeExecution, MeshNVLocalSizeId) { + const std::string spirv = R"( +OpCapability Shader +OpCapability MeshShadingNV +OpExtension "SPV_NV_mesh_shader" +OpMemoryModel Logical GLSL450 +OpEntryPoint MeshNV %main "main" +OpExecutionModeId %main LocalSizeId %int_1 %int_1 %int_1 +%int = OpTypeInt 32 0 +%int_1 = OpConstant %int 1 +)" + kVoidFunction; + + spv_target_env env = SPV_ENV_UNIVERSAL_1_3; + CompileSuccessfully(spirv, env); + EXPECT_THAT(SPV_SUCCESS, ValidateInstructions(env)); +} + +TEST_F(ValidateModeExecution, TaskNVLocalSizeId) { + const std::string spirv = R"( +OpCapability Shader +OpCapability MeshShadingNV +OpExtension "SPV_NV_mesh_shader" +OpMemoryModel Logical GLSL450 +OpEntryPoint TaskNV %main "main" +OpExecutionModeId %main LocalSizeId %int_1 %int_1 %int_1 +%int = OpTypeInt 32 0 +%int_1 = OpConstant %int 1 +)" + kVoidFunction; + + spv_target_env env = SPV_ENV_UNIVERSAL_1_3; + CompileSuccessfully(spirv, env); + EXPECT_THAT(SPV_SUCCESS, ValidateInstructions(env)); +} + +} // namespace +} // namespace val +} // namespace spvtools diff --git a/3rdparty/spirv-tools/test/val/val_non_uniform_test.cpp b/3rdparty/spirv-tools/test/val/val_non_uniform_test.cpp index 6ff5c127b..a185d8782 100644 --- a/3rdparty/spirv-tools/test/val/val_non_uniform_test.cpp +++ b/3rdparty/spirv-tools/test/val/val_non_uniform_test.cpp @@ -49,14 +49,19 @@ OpCapability GroupNonUniformQuad ss << capabilities_and_extensions; ss << "OpMemoryModel Logical GLSL450\n"; ss << "OpEntryPoint " << execution_model << " %main \"main\"\n"; + if (execution_model == "GLCompute") { + ss << "OpExecutionMode %main LocalSize 1 1 1\n"; + } ss << R"( %void = OpTypeVoid %func = OpTypeFunction %void %bool = OpTypeBool %u32 = OpTypeInt 32 0 +%int = OpTypeInt 32 1 %float = OpTypeFloat 32 %u32vec4 = OpTypeVector %u32 4 +%u32vec3 = OpTypeVector %u32 3 %true = OpConstantTrue %bool %false = OpConstantFalse %bool @@ -66,6 +71,7 @@ OpCapability GroupNonUniformQuad %float_0 = OpConstant %float 0 %u32vec4_null = OpConstantComposite %u32vec4 %u32_0 %u32_0 %u32_0 %u32_0 +%u32vec3_null = OpConstantComposite %u32vec3 %u32_0 %u32_0 %u32_0 %cross_device = OpConstant %u32 0 %device = OpConstant %u32 1 @@ -94,8 +100,8 @@ OpFunctionEnd)"; SpvScope scopes[] = {SpvScopeCrossDevice, SpvScopeDevice, SpvScopeWorkgroup, SpvScopeSubgroup, SpvScopeInvocation}; -using GroupNonUniformScope = spvtest::ValidateBase< - std::tuple>; +using GroupNonUniform = spvtest::ValidateBase< + std::tuple>; std::string ConvertScope(SpvScope scope) { switch (scope) { @@ -114,11 +120,12 @@ std::string ConvertScope(SpvScope scope) { } } -TEST_P(GroupNonUniformScope, Vulkan1p1) { +TEST_P(GroupNonUniform, Vulkan1p1) { std::string opcode = std::get<0>(GetParam()); std::string type = std::get<1>(GetParam()); SpvScope execution_scope = std::get<2>(GetParam()); std::string args = std::get<3>(GetParam()); + std::string error = std::get<4>(GetParam()); std::ostringstream sstr; sstr << "%result = " << opcode << " "; @@ -128,22 +135,28 @@ TEST_P(GroupNonUniformScope, Vulkan1p1) { CompileSuccessfully(GenerateShaderCode(sstr.str()), SPV_ENV_VULKAN_1_1); spv_result_t result = ValidateInstructions(SPV_ENV_VULKAN_1_1); - if (execution_scope == SpvScopeSubgroup) { - EXPECT_EQ(SPV_SUCCESS, result); + if (error == "") { + if (execution_scope == SpvScopeSubgroup) { + EXPECT_EQ(SPV_SUCCESS, result); + } else { + EXPECT_EQ(SPV_ERROR_INVALID_DATA, result); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr( + "in Vulkan environment Execution scope is limited to Subgroup")); + } } else { EXPECT_EQ(SPV_ERROR_INVALID_DATA, result); - EXPECT_THAT( - getDiagnosticString(), - HasSubstr( - "in Vulkan environment Execution scope is limited to Subgroup")); + EXPECT_THAT(getDiagnosticString(), HasSubstr(error)); } } -TEST_P(GroupNonUniformScope, Spirv1p3) { +TEST_P(GroupNonUniform, Spirv1p3) { std::string opcode = std::get<0>(GetParam()); std::string type = std::get<1>(GetParam()); SpvScope execution_scope = std::get<2>(GetParam()); std::string args = std::get<3>(GetParam()); + std::string error = std::get<4>(GetParam()); std::ostringstream sstr; sstr << "%result = " << opcode << " "; @@ -153,99 +166,127 @@ TEST_P(GroupNonUniformScope, Spirv1p3) { CompileSuccessfully(GenerateShaderCode(sstr.str()), SPV_ENV_UNIVERSAL_1_3); spv_result_t result = ValidateInstructions(SPV_ENV_UNIVERSAL_1_3); - if (execution_scope == SpvScopeSubgroup || - execution_scope == SpvScopeWorkgroup) { - EXPECT_EQ(SPV_SUCCESS, result); + if (error == "") { + if (execution_scope == SpvScopeSubgroup || + execution_scope == SpvScopeWorkgroup) { + EXPECT_EQ(SPV_SUCCESS, result); + } else { + EXPECT_EQ(SPV_ERROR_INVALID_DATA, result); + EXPECT_THAT( + getDiagnosticString(), + HasSubstr("Execution scope is limited to Subgroup or Workgroup")); + } } else { EXPECT_EQ(SPV_ERROR_INVALID_DATA, result); - EXPECT_THAT( - getDiagnosticString(), - HasSubstr("Execution scope is limited to Subgroup or Workgroup")); + EXPECT_THAT(getDiagnosticString(), HasSubstr(error)); } } -INSTANTIATE_TEST_CASE_P(GroupNonUniformElect, GroupNonUniformScope, +INSTANTIATE_TEST_CASE_P(GroupNonUniformElect, GroupNonUniform, Combine(Values("OpGroupNonUniformElect"), - Values("%bool"), ValuesIn(scopes), Values(""))); + Values("%bool"), ValuesIn(scopes), Values(""), + Values(""))); -INSTANTIATE_TEST_CASE_P(GroupNonUniformVote, GroupNonUniformScope, +INSTANTIATE_TEST_CASE_P(GroupNonUniformVote, GroupNonUniform, Combine(Values("OpGroupNonUniformAll", "OpGroupNonUniformAny", "OpGroupNonUniformAllEqual"), Values("%bool"), ValuesIn(scopes), - Values("%true"))); + Values("%true"), Values(""))); -INSTANTIATE_TEST_CASE_P(GroupNonUniformBroadcast, GroupNonUniformScope, +INSTANTIATE_TEST_CASE_P(GroupNonUniformBroadcast, GroupNonUniform, Combine(Values("OpGroupNonUniformBroadcast"), Values("%bool"), ValuesIn(scopes), - Values("%true %u32_0"))); + Values("%true %u32_0"), Values(""))); -INSTANTIATE_TEST_CASE_P(GroupNonUniformBroadcastFirst, GroupNonUniformScope, +INSTANTIATE_TEST_CASE_P(GroupNonUniformBroadcastFirst, GroupNonUniform, Combine(Values("OpGroupNonUniformBroadcastFirst"), Values("%bool"), ValuesIn(scopes), - Values("%true"))); + Values("%true"), Values(""))); -INSTANTIATE_TEST_CASE_P(GroupNonUniformBallot, GroupNonUniformScope, +INSTANTIATE_TEST_CASE_P(GroupNonUniformBallot, GroupNonUniform, Combine(Values("OpGroupNonUniformBallot"), Values("%u32vec4"), ValuesIn(scopes), - Values("%true"))); + Values("%true"), Values(""))); -INSTANTIATE_TEST_CASE_P(GroupNonUniformInverseBallot, GroupNonUniformScope, +INSTANTIATE_TEST_CASE_P(GroupNonUniformInverseBallot, GroupNonUniform, Combine(Values("OpGroupNonUniformInverseBallot"), Values("%bool"), ValuesIn(scopes), - Values("%u32vec4_null"))); + Values("%u32vec4_null"), Values(""))); -INSTANTIATE_TEST_CASE_P(GroupNonUniformBallotBitExtract, GroupNonUniformScope, +INSTANTIATE_TEST_CASE_P(GroupNonUniformBallotBitExtract, GroupNonUniform, Combine(Values("OpGroupNonUniformBallotBitExtract"), Values("%bool"), ValuesIn(scopes), - Values("%u32vec4_null %u32_0"))); + Values("%u32vec4_null %u32_0"), Values(""))); -INSTANTIATE_TEST_CASE_P(GroupNonUniformBallotBitCount, GroupNonUniformScope, +INSTANTIATE_TEST_CASE_P(GroupNonUniformBallotBitCount, GroupNonUniform, Combine(Values("OpGroupNonUniformBallotBitCount"), Values("%u32"), ValuesIn(scopes), - Values("Reduce %u32vec4_null"))); + Values("Reduce %u32vec4_null"), Values(""))); -INSTANTIATE_TEST_CASE_P(GroupNonUniformBallotFind, GroupNonUniformScope, +INSTANTIATE_TEST_CASE_P(GroupNonUniformBallotFind, GroupNonUniform, Combine(Values("OpGroupNonUniformBallotFindLSB", "OpGroupNonUniformBallotFindMSB"), Values("%u32"), ValuesIn(scopes), - Values("%u32vec4_null"))); + Values("%u32vec4_null"), Values(""))); -INSTANTIATE_TEST_CASE_P(GroupNonUniformShuffle, GroupNonUniformScope, +INSTANTIATE_TEST_CASE_P(GroupNonUniformShuffle, GroupNonUniform, Combine(Values("OpGroupNonUniformShuffle", "OpGroupNonUniformShuffleXor", "OpGroupNonUniformShuffleUp", "OpGroupNonUniformShuffleDown"), Values("%u32"), ValuesIn(scopes), - Values("%u32_0 %u32_0"))); + Values("%u32_0 %u32_0"), Values(""))); INSTANTIATE_TEST_CASE_P( - GroupNonUniformIntegerArithmetic, GroupNonUniformScope, + GroupNonUniformIntegerArithmetic, GroupNonUniform, Combine(Values("OpGroupNonUniformIAdd", "OpGroupNonUniformIMul", "OpGroupNonUniformSMin", "OpGroupNonUniformUMin", "OpGroupNonUniformSMax", "OpGroupNonUniformUMax", "OpGroupNonUniformBitwiseAnd", "OpGroupNonUniformBitwiseOr", "OpGroupNonUniformBitwiseXor"), - Values("%u32"), ValuesIn(scopes), Values("Reduce %u32_0"))); + Values("%u32"), ValuesIn(scopes), Values("Reduce %u32_0"), + Values(""))); INSTANTIATE_TEST_CASE_P( - GroupNonUniformFloatArithmetic, GroupNonUniformScope, + GroupNonUniformFloatArithmetic, GroupNonUniform, Combine(Values("OpGroupNonUniformFAdd", "OpGroupNonUniformFMul", "OpGroupNonUniformFMin", "OpGroupNonUniformFMax"), - Values("%float"), ValuesIn(scopes), Values("Reduce %float_0"))); + Values("%float"), ValuesIn(scopes), Values("Reduce %float_0"), + Values(""))); -INSTANTIATE_TEST_CASE_P(GroupNonUniformLogicalArithmetic, GroupNonUniformScope, +INSTANTIATE_TEST_CASE_P(GroupNonUniformLogicalArithmetic, GroupNonUniform, Combine(Values("OpGroupNonUniformLogicalAnd", "OpGroupNonUniformLogicalOr", "OpGroupNonUniformLogicalXor"), Values("%bool"), ValuesIn(scopes), - Values("Reduce %true"))); + Values("Reduce %true"), Values(""))); -INSTANTIATE_TEST_CASE_P(GroupNonUniformQuad, GroupNonUniformScope, +INSTANTIATE_TEST_CASE_P(GroupNonUniformQuad, GroupNonUniform, Combine(Values("OpGroupNonUniformQuadBroadcast", "OpGroupNonUniformQuadSwap"), Values("%u32"), ValuesIn(scopes), - Values("%u32_0 %u32_0"))); + Values("%u32_0 %u32_0"), Values(""))); + +INSTANTIATE_TEST_CASE_P(GroupNonUniformBallotBitCountScope, GroupNonUniform, + Combine(Values("OpGroupNonUniformBallotBitCount"), + Values("%u32"), ValuesIn(scopes), + Values("Reduce %u32vec4_null"), Values(""))); + +INSTANTIATE_TEST_CASE_P( + GroupNonUniformBallotBitCountBadResultType, GroupNonUniform, + Combine( + Values("OpGroupNonUniformBallotBitCount"), Values("%float", "%int"), + Values(SpvScopeSubgroup), Values("Reduce %u32vec4_null"), + Values("Expected Result Type to be an unsigned integer type scalar."))); + +INSTANTIATE_TEST_CASE_P(GroupNonUniformBallotBitCountBadValue, GroupNonUniform, + Combine(Values("OpGroupNonUniformBallotBitCount"), + Values("%u32"), Values(SpvScopeSubgroup), + Values("Reduce %u32vec3_null", "Reduce %u32_0", + "Reduce %float_0"), + Values("Expected Value to be a vector of four " + "components of integer type scalar"))); } // namespace } // namespace val diff --git a/3rdparty/spirv-tools/test/val/val_primitives_test.cpp b/3rdparty/spirv-tools/test/val/val_primitives_test.cpp index f02ba8057..04d0a4f8a 100644 --- a/3rdparty/spirv-tools/test/val/val_primitives_test.cpp +++ b/3rdparty/spirv-tools/test/val/val_primitives_test.cpp @@ -37,6 +37,10 @@ std::string GenerateShaderCode( ss << capabilities_and_extensions << "\n"; ss << "OpMemoryModel Logical GLSL450\n"; ss << "OpEntryPoint " << execution_model << " %main \"main\"\n"; + if (execution_model == "Geometry") { + ss << "OpExecutionMode %main InputPoints\n"; + ss << "OpExecutionMode %main OutputPoints\n"; + } ss << R"( %void = OpTypeVoid diff --git a/3rdparty/spirv-tools/test/val/val_ssa_test.cpp b/3rdparty/spirv-tools/test/val/val_ssa_test.cpp index 25944f518..5d8fa4b7e 100644 --- a/3rdparty/spirv-tools/test/val/val_ssa_test.cpp +++ b/3rdparty/spirv-tools/test/val/val_ssa_test.cpp @@ -118,7 +118,7 @@ TEST_F(ValidateSSA, DominateUsageWithinBlockBad) { CompileSuccessfully(str); ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - MatchesRegex("ID .\\[bad\\] has not been defined\n" + MatchesRegex("ID .\\[%bad\\] has not been defined\n" " %8 = OpIAdd %uint %uint_1 %bad\n")); } @@ -141,7 +141,7 @@ TEST_F(ValidateSSA, DominateUsageSameInstructionBad) { CompileSuccessfully(str); ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - MatchesRegex("ID .\\[sum\\] has not been defined\n" + MatchesRegex("ID .\\[%sum\\] has not been defined\n" " %sum = OpIAdd %uint %uint_1 %sum\n")); } @@ -202,7 +202,9 @@ TEST_F(ValidateSSA, ForwardMemberNameMissingTargetBad) { )"; CompileSuccessfully(str); ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); - EXPECT_THAT(getDiagnosticString(), HasSubstr("size")); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("The following forward referenced IDs have not been " + "defined:\n2[%2]")); } TEST_F(ValidateSSA, ForwardDecorateGood) { @@ -1124,17 +1126,18 @@ TEST_F(ValidateSSA, IdDoesNotDominateItsUseBad) { ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), - MatchesRegex("ID .\\[eleven\\] defined in block .\\[true_block\\] does " - "not dominate its use in block .\\[false_block\\]\n" + MatchesRegex("ID .\\[%eleven\\] defined in block .\\[%true_block\\] " + "does not dominate its use in block .\\[%false_block\\]\n" " %false_block = OpLabel\n")); } TEST_F(ValidateSSA, PhiUseDoesntDominateDefinitionGood) { std::string str = kHeader + kBasicTypes + R"( +%funcintptrt = OpTypePointer Function %uintt %func = OpFunction %voidt None %vfunct %entry = OpLabel -%var_one = OpVariable %intptrt Function %one +%var_one = OpVariable %funcintptrt Function %one %one_val = OpLoad %uintt %var_one OpBranch %loop %loop = OpLabel @@ -1184,7 +1187,7 @@ TEST_F(ValidateSSA, CompileSuccessfully(str); ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT(getDiagnosticString(), - MatchesRegex("ID .\\[inew\\] has not been defined\n" + MatchesRegex("ID .\\[%inew\\] has not been defined\n" " %19 = OpIAdd %uint %inew %uint_1\n")); } @@ -1267,8 +1270,8 @@ TEST_F(ValidateSSA, PhiVariableDefNotDominatedByParentBlockBad) { ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), - MatchesRegex("In OpPhi instruction .\\[phi\\], ID .\\[true_copy\\] " - "definition does not dominate its parent .\\[if_false\\]\n" + MatchesRegex("In OpPhi instruction .\\[%phi\\], ID .\\[%true_copy\\] " + "definition does not dominate its parent .\\[%if_false\\]\n" " %phi = OpPhi %bool %true_copy %if_false %false_copy " "%if_true\n")); } @@ -1395,8 +1398,8 @@ TEST_F(ValidateSSA, UseFunctionParameterFromOtherFunctionBad) { ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions()); EXPECT_THAT( getDiagnosticString(), - MatchesRegex("ID .\\[first\\] used in function .\\[func2\\] is used " - "outside of it's defining function .\\[func\\]\n" + MatchesRegex("ID .\\[%first\\] used in function .\\[%func2\\] is used " + "outside of it's defining function .\\[%func\\]\n" " %func = OpFunction %void None %14\n")); } diff --git a/3rdparty/spirv-tools/test/val/val_state_test.cpp b/3rdparty/spirv-tools/test/val/val_state_test.cpp index 699b224ad..18a4ef99e 100644 --- a/3rdparty/spirv-tools/test/val/val_state_test.cpp +++ b/3rdparty/spirv-tools/test/val/val_state_test.cpp @@ -41,7 +41,7 @@ class ValidationStateTest : public testing::Test { ValidationStateTest() : context_(spvContextCreate(SPV_ENV_UNIVERSAL_1_0)), options_(spvValidatorOptionsCreate()), - state_(context_, options_, kFakeBinary, 0) {} + state_(context_, options_, kFakeBinary, 0, 1) {} ~ValidationStateTest() { spvContextDestroy(context_); diff --git a/3rdparty/spirv-tools/test/val/val_storage_test.cpp b/3rdparty/spirv-tools/test/val/val_storage_test.cpp index 46b3ddcbb..aa1eecda8 100644 --- a/3rdparty/spirv-tools/test/val/val_storage_test.cpp +++ b/3rdparty/spirv-tools/test/val/val_storage_test.cpp @@ -73,29 +73,38 @@ TEST_F(ValidateStorage, FunctionStorageOutsideFunction) { TEST_F(ValidateStorage, OtherStorageOutsideFunction) { char str[] = R"( - OpCapability Shader - OpCapability Kernel - OpCapability AtomicStorage - OpCapability Linkage - OpMemoryModel Logical GLSL450 -%intt = OpTypeInt 32 0 -%voidt = OpTypeVoid -%vfunct = OpTypeFunction %voidt -%ptrt = OpTypePointer Function %intt -%unicon = OpVariable %ptrt UniformConstant -%input = OpVariable %ptrt Input -%unif = OpVariable %ptrt Uniform -%output = OpVariable %ptrt Output -%wgroup = OpVariable %ptrt Workgroup -%xwgrp = OpVariable %ptrt CrossWorkgroup -%priv = OpVariable %ptrt Private -%pushco = OpVariable %ptrt PushConstant -%atomct = OpVariable %ptrt AtomicCounter -%image = OpVariable %ptrt Image -%func = OpFunction %voidt None %vfunct -%funcl = OpLabel - OpReturn - OpFunctionEnd + OpCapability Shader + OpCapability Kernel + OpCapability AtomicStorage + OpCapability Linkage + OpMemoryModel Logical GLSL450 +%intt = OpTypeInt 32 0 +%voidt = OpTypeVoid +%vfunct = OpTypeFunction %voidt +%uniconptrt = OpTypePointer UniformConstant %intt +%unicon = OpVariable %uniconptrt UniformConstant +%inputptrt = OpTypePointer Input %intt +%input = OpVariable %inputptrt Input +%unifptrt = OpTypePointer Uniform %intt +%unif = OpVariable %unifptrt Uniform +%outputptrt = OpTypePointer Output %intt +%output = OpVariable %outputptrt Output +%wgroupptrt = OpTypePointer Workgroup %intt +%wgroup = OpVariable %wgroupptrt Workgroup +%xwgrpptrt = OpTypePointer CrossWorkgroup %intt +%xwgrp = OpVariable %xwgrpptrt CrossWorkgroup +%privptrt = OpTypePointer Private %intt +%priv = OpVariable %privptrt Private +%pushcoptrt = OpTypePointer PushConstant %intt +%pushco = OpVariable %pushcoptrt PushConstant +%atomcptrt = OpTypePointer AtomicCounter %intt +%atomct = OpVariable %atomcptrt AtomicCounter +%imageptrt = OpTypePointer Image %intt +%image = OpVariable %imageptrt Image +%func = OpFunction %voidt None %vfunct +%funcl = OpLabel + OpReturn + OpFunctionEnd )"; CompileSuccessfully(str); diff --git a/3rdparty/spirv-tools/test/val/val_validation_state_test.cpp b/3rdparty/spirv-tools/test/val/val_validation_state_test.cpp index 68504c528..e010fe9f2 100644 --- a/3rdparty/spirv-tools/test/val/val_validation_state_test.cpp +++ b/3rdparty/spirv-tools/test/val/val_validation_state_test.cpp @@ -29,11 +29,17 @@ using ::testing::HasSubstr; using ValidationStateTest = spvtest::ValidateBase; -const char header[] = +const char kHeader[] = " OpCapability Shader" " OpCapability Linkage" " OpMemoryModel Logical GLSL450 "; +const char kVulkanMemoryHeader[] = + " OpCapability Shader" + " OpCapability VulkanMemoryModelKHR" + " OpExtension \"SPV_KHR_vulkan_memory_model\"" + " OpMemoryModel Logical VulkanKHR "; + const char kVoidFVoid[] = " %void = OpTypeVoid" " %void_f = OpTypeFunction %void" @@ -42,9 +48,79 @@ const char kVoidFVoid[] = " OpReturn" " OpFunctionEnd "; +// k*RecursiveBody examples originally from test/opt/function_test.cpp +const char* kNonRecursiveBody = R"( +OpEntryPoint Fragment %1 "main" +OpExecutionMode %1 OriginUpperLeft +%void = OpTypeVoid +%4 = OpTypeFunction %void +%float = OpTypeFloat 32 +%_struct_6 = OpTypeStruct %float %float +%7 = OpTypeFunction %_struct_6 +%12 = OpFunction %_struct_6 None %7 +%13 = OpLabel +OpUnreachable +OpFunctionEnd +%9 = OpFunction %_struct_6 None %7 +%10 = OpLabel +%11 = OpFunctionCall %_struct_6 %12 +OpUnreachable +OpFunctionEnd +%1 = OpFunction %void Pure|Const %4 +%8 = OpLabel +%2 = OpFunctionCall %_struct_6 %9 +OpKill +OpFunctionEnd +)"; + +const char* kDirectlyRecursiveBody = R"( +OpEntryPoint Fragment %1 "main" +OpExecutionMode %1 OriginUpperLeft +%void = OpTypeVoid +%4 = OpTypeFunction %void +%float = OpTypeFloat 32 +%_struct_6 = OpTypeStruct %float %float +%7 = OpTypeFunction %_struct_6 +%9 = OpFunction %_struct_6 None %7 +%10 = OpLabel +%11 = OpFunctionCall %_struct_6 %9 +OpKill +OpFunctionEnd +%1 = OpFunction %void Pure|Const %4 +%8 = OpLabel +%2 = OpFunctionCall %_struct_6 %9 +OpUnreachable +OpFunctionEnd +)"; + +const char* kIndirectlyRecursiveBody = R"( +OpEntryPoint Fragment %1 "main" +OpExecutionMode %1 OriginUpperLeft +%void = OpTypeVoid +%4 = OpTypeFunction %void +%float = OpTypeFloat 32 +%_struct_6 = OpTypeStruct %float %float +%7 = OpTypeFunction %_struct_6 +%9 = OpFunction %_struct_6 None %7 +%10 = OpLabel +%11 = OpFunctionCall %_struct_6 %12 +OpUnreachable +OpFunctionEnd +%12 = OpFunction %_struct_6 None %7 +%13 = OpLabel +%14 = OpFunctionCall %_struct_6 %9 +OpUnreachable +OpFunctionEnd +%1 = OpFunction %void Pure|Const %4 +%8 = OpLabel +%2 = OpFunctionCall %_struct_6 %9 +OpKill +OpFunctionEnd +)"; + // Tests that the instruction count in ValidationState is correct. TEST_F(ValidationStateTest, CheckNumInstructions) { - std::string spirv = std::string(header) + "%int = OpTypeInt 32 0"; + std::string spirv = std::string(kHeader) + "%int = OpTypeInt 32 0"; CompileSuccessfully(spirv); EXPECT_EQ(SPV_SUCCESS, ValidateAndRetrieveValidationState()); EXPECT_EQ(size_t(4), vstate_->ordered_instructions().size()); @@ -52,7 +128,7 @@ TEST_F(ValidationStateTest, CheckNumInstructions) { // Tests that the number of global variables in ValidationState is correct. TEST_F(ValidationStateTest, CheckNumGlobalVars) { - std::string spirv = std::string(header) + R"( + std::string spirv = std::string(kHeader) + R"( %int = OpTypeInt 32 0 %_ptr_int = OpTypePointer Input %int %var_1 = OpVariable %_ptr_int Input @@ -65,7 +141,7 @@ TEST_F(ValidationStateTest, CheckNumGlobalVars) { // Tests that the number of local variables in ValidationState is correct. TEST_F(ValidationStateTest, CheckNumLocalVars) { - std::string spirv = std::string(header) + R"( + std::string spirv = std::string(kHeader) + R"( %int = OpTypeInt 32 0 %_ptr_int = OpTypePointer Function %int %voidt = OpTypeVoid @@ -85,7 +161,7 @@ TEST_F(ValidationStateTest, CheckNumLocalVars) { // Tests that the "id bound" in ValidationState is correct. TEST_F(ValidationStateTest, CheckIdBound) { - std::string spirv = std::string(header) + R"( + std::string spirv = std::string(kHeader) + R"( %int = OpTypeInt 32 0 %voidt = OpTypeVoid )"; @@ -96,7 +172,7 @@ TEST_F(ValidationStateTest, CheckIdBound) { // Tests that the entry_points in ValidationState is correct. TEST_F(ValidationStateTest, CheckEntryPoints) { - std::string spirv = std::string(header) + + std::string spirv = std::string(kHeader) + " OpEntryPoint Vertex %func \"shader\"" + std::string(kVoidFVoid); CompileSuccessfully(spirv); @@ -154,6 +230,82 @@ TEST_F(ValidationStateTest, CheckAccessChainIndexesLimitOption) { EXPECT_EQ(100u, options_->universal_limits_.max_access_chain_indexes); } +TEST_F(ValidationStateTest, CheckNonRecursiveBodyGood) { + std::string spirv = std::string(kHeader) + kNonRecursiveBody; + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_SUCCESS, ValidateAndRetrieveValidationState()); +} + +TEST_F(ValidationStateTest, CheckVulkanNonRecursiveBodyGood) { + std::string spirv = std::string(kVulkanMemoryHeader) + kNonRecursiveBody; + CompileSuccessfully(spirv, SPV_ENV_VULKAN_1_1); + EXPECT_EQ(SPV_SUCCESS, + ValidateAndRetrieveValidationState(SPV_ENV_VULKAN_1_1)); +} + +TEST_F(ValidationStateTest, CheckWebGPUNonRecursiveBodyGood) { + std::string spirv = std::string(kVulkanMemoryHeader) + kNonRecursiveBody; + CompileSuccessfully(spirv, SPV_ENV_WEBGPU_0); + EXPECT_EQ(SPV_SUCCESS, ValidateAndRetrieveValidationState(SPV_ENV_WEBGPU_0)); +} + +TEST_F(ValidationStateTest, CheckDirectlyRecursiveBodyGood) { + std::string spirv = std::string(kHeader) + kDirectlyRecursiveBody; + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_SUCCESS, ValidateAndRetrieveValidationState()); +} + +TEST_F(ValidationStateTest, CheckVulkanDirectlyRecursiveBodyBad) { + std::string spirv = std::string(kVulkanMemoryHeader) + kDirectlyRecursiveBody; + CompileSuccessfully(spirv, SPV_ENV_VULKAN_1_1); + EXPECT_EQ(SPV_ERROR_INVALID_BINARY, + ValidateAndRetrieveValidationState(SPV_ENV_VULKAN_1_1)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Entry points may not have a call graph with cycles.\n " + " %1 = OpFunction %void Pure|Const %3\n")); +} + +TEST_F(ValidationStateTest, CheckWebGPUDirectlyRecursiveBodyBad) { + std::string spirv = std::string(kVulkanMemoryHeader) + kDirectlyRecursiveBody; + CompileSuccessfully(spirv, SPV_ENV_WEBGPU_0); + EXPECT_EQ(SPV_ERROR_INVALID_BINARY, + ValidateAndRetrieveValidationState(SPV_ENV_WEBGPU_0)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Entry points may not have a call graph with cycles.\n " + " %1 = OpFunction %void Pure|Const %3\n")); +} + +TEST_F(ValidationStateTest, CheckIndirectlyRecursiveBodyGood) { + std::string spirv = std::string(kHeader) + kIndirectlyRecursiveBody; + CompileSuccessfully(spirv); + EXPECT_EQ(SPV_SUCCESS, ValidateAndRetrieveValidationState()); +} + +TEST_F(ValidationStateTest, CheckVulkanIndirectlyRecursiveBodyBad) { + std::string spirv = + std::string(kVulkanMemoryHeader) + kIndirectlyRecursiveBody; + CompileSuccessfully(spirv, SPV_ENV_VULKAN_1_1); + EXPECT_EQ(SPV_ERROR_INVALID_BINARY, + ValidateAndRetrieveValidationState(SPV_ENV_VULKAN_1_1)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Entry points may not have a call graph with cycles.\n " + " %1 = OpFunction %void Pure|Const %3\n")); +} + +// Indirectly recursive functions are caught by the function definition layout +// rules, because they cause a situation where there are 2 functions that have +// to be before each other, and layout is checked earlier. +TEST_F(ValidationStateTest, CheckWebGPUIndirectlyRecursiveBodyBad) { + std::string spirv = + std::string(kVulkanMemoryHeader) + kIndirectlyRecursiveBody; + CompileSuccessfully(spirv, SPV_ENV_WEBGPU_0); + EXPECT_EQ(SPV_ERROR_INVALID_LAYOUT, + ValidateAndRetrieveValidationState(SPV_ENV_WEBGPU_0)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("For WebGPU, functions need to be defined before being " + "called.\n %9 = OpFunctionCall %_struct_5 %10\n")); +} + } // namespace } // namespace val } // namespace spvtools diff --git a/3rdparty/spirv-tools/test/val/val_version_test.cpp b/3rdparty/spirv-tools/test/val/val_version_test.cpp index fa252ac86..eb9bbb960 100644 --- a/3rdparty/spirv-tools/test/val/val_version_test.cpp +++ b/3rdparty/spirv-tools/test/val/val_version_test.cpp @@ -31,6 +31,22 @@ const std::string vulkan_spirv = R"( OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft +%void = OpTypeVoid +%functy = OpTypeFunction %void +%func = OpFunction %void None %functy +%1 = OpLabel +OpReturn +OpFunctionEnd +)"; + +const std::string webgpu_spirv = R"( +OpCapability Shader +OpCapability VulkanMemoryModelKHR +OpExtension "SPV_KHR_vulkan_memory_model" +OpMemoryModel Logical VulkanKHR +OpEntryPoint Fragment %func "func" +OpExecutionMode %func OriginUpperLeft %void = OpTypeVoid %functy = OpTypeFunction %void %func = OpFunction %void None %functy @@ -106,7 +122,7 @@ INSTANTIATE_TEST_CASE_P(Universal, ValidateVersion, std::make_tuple(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_OPENGL_4_2, vulkan_spirv, true), std::make_tuple(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_OPENGL_4_3, vulkan_spirv, true), std::make_tuple(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_OPENGL_4_5, vulkan_spirv, true), - std::make_tuple(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_WEBGPU_0, vulkan_spirv, true), + std::make_tuple(SPV_ENV_UNIVERSAL_1_0, SPV_ENV_WEBGPU_0, webgpu_spirv, true), std::make_tuple(SPV_ENV_UNIVERSAL_1_1, SPV_ENV_UNIVERSAL_1_0, vulkan_spirv, false), std::make_tuple(SPV_ENV_UNIVERSAL_1_1, SPV_ENV_UNIVERSAL_1_1, vulkan_spirv, true), @@ -119,7 +135,7 @@ INSTANTIATE_TEST_CASE_P(Universal, ValidateVersion, std::make_tuple(SPV_ENV_UNIVERSAL_1_1, SPV_ENV_OPENGL_4_2, vulkan_spirv, false), std::make_tuple(SPV_ENV_UNIVERSAL_1_1, SPV_ENV_OPENGL_4_3, vulkan_spirv, false), std::make_tuple(SPV_ENV_UNIVERSAL_1_1, SPV_ENV_OPENGL_4_5, vulkan_spirv, false), - std::make_tuple(SPV_ENV_UNIVERSAL_1_1, SPV_ENV_WEBGPU_0, vulkan_spirv, true), + std::make_tuple(SPV_ENV_UNIVERSAL_1_1, SPV_ENV_WEBGPU_0, webgpu_spirv, true), std::make_tuple(SPV_ENV_UNIVERSAL_1_2, SPV_ENV_UNIVERSAL_1_0, vulkan_spirv, false), std::make_tuple(SPV_ENV_UNIVERSAL_1_2, SPV_ENV_UNIVERSAL_1_1, vulkan_spirv, false), @@ -132,7 +148,7 @@ INSTANTIATE_TEST_CASE_P(Universal, ValidateVersion, std::make_tuple(SPV_ENV_UNIVERSAL_1_2, SPV_ENV_OPENGL_4_2, vulkan_spirv, false), std::make_tuple(SPV_ENV_UNIVERSAL_1_2, SPV_ENV_OPENGL_4_3, vulkan_spirv, false), std::make_tuple(SPV_ENV_UNIVERSAL_1_2, SPV_ENV_OPENGL_4_5, vulkan_spirv, false), - std::make_tuple(SPV_ENV_UNIVERSAL_1_2, SPV_ENV_WEBGPU_0, vulkan_spirv, true), + std::make_tuple(SPV_ENV_UNIVERSAL_1_2, SPV_ENV_WEBGPU_0, webgpu_spirv, true), std::make_tuple(SPV_ENV_UNIVERSAL_1_3, SPV_ENV_UNIVERSAL_1_0, vulkan_spirv, false), std::make_tuple(SPV_ENV_UNIVERSAL_1_3, SPV_ENV_UNIVERSAL_1_1, vulkan_spirv, false), @@ -145,7 +161,7 @@ INSTANTIATE_TEST_CASE_P(Universal, ValidateVersion, std::make_tuple(SPV_ENV_UNIVERSAL_1_3, SPV_ENV_OPENGL_4_2, vulkan_spirv, false), std::make_tuple(SPV_ENV_UNIVERSAL_1_3, SPV_ENV_OPENGL_4_3, vulkan_spirv, false), std::make_tuple(SPV_ENV_UNIVERSAL_1_3, SPV_ENV_OPENGL_4_5, vulkan_spirv, false), - std::make_tuple(SPV_ENV_UNIVERSAL_1_3, SPV_ENV_WEBGPU_0, vulkan_spirv, true) + std::make_tuple(SPV_ENV_UNIVERSAL_1_3, SPV_ENV_WEBGPU_0, webgpu_spirv, true) ) ); diff --git a/3rdparty/spirv-tools/test/val/val_webgpu_test.cpp b/3rdparty/spirv-tools/test/val/val_webgpu_test.cpp index b65d08fe6..48ea21db2 100644 --- a/3rdparty/spirv-tools/test/val/val_webgpu_test.cpp +++ b/3rdparty/spirv-tools/test/val/val_webgpu_test.cpp @@ -29,11 +29,19 @@ using ValidateWebGPU = spvtest::ValidateBase; TEST_F(ValidateWebGPU, OpUndefIsDisallowed) { std::string spirv = R"( - OpCapability Shader - OpCapability Linkage - OpMemoryModel Logical GLSL450 - %float = OpTypeFloat 32 - %1 = OpUndef %float + OpCapability Shader + OpCapability VulkanMemoryModelKHR + OpExtension "SPV_KHR_vulkan_memory_model" + OpMemoryModel Logical VulkanKHR + OpEntryPoint Vertex %func "shader" +%float = OpTypeFloat 32 +%1 = OpUndef %float +%void = OpTypeVoid +%void_f = OpTypeFunction %void +%func = OpFunction %void None %void_f +%label = OpLabel + OpReturn + OpFunctionEnd )"; CompileSuccessfully(spirv); @@ -46,6 +54,228 @@ TEST_F(ValidateWebGPU, OpUndefIsDisallowed) { EXPECT_THAT(getDiagnosticString(), HasSubstr("OpUndef is disallowed")); } +TEST_F(ValidateWebGPU, OpNameIsDisallowed) { + std::string spirv = R"( + OpCapability Shader + OpCapability VulkanMemoryModelKHR + OpExtension "SPV_KHR_vulkan_memory_model" + OpMemoryModel Logical VulkanKHR + OpName %1 "foo" +%1 = OpTypeFloat 32 +)"; + + CompileSuccessfully(spirv); + + EXPECT_EQ(SPV_ERROR_INVALID_BINARY, ValidateInstructions(SPV_ENV_WEBGPU_0)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Debugging instructions are not allowed in the WebGPU " + "execution environment.\n OpName %foo \"foo\"\n")); +} + +TEST_F(ValidateWebGPU, OpMemberNameIsDisallowed) { + std::string spirv = R"( + OpCapability Shader + OpCapability VulkanMemoryModelKHR + OpExtension "SPV_KHR_vulkan_memory_model" + OpMemoryModel Logical VulkanKHR + OpMemberName %2 0 "foo" +%1 = OpTypeFloat 32 +%2 = OpTypeStruct %1 +)"; + + CompileSuccessfully(spirv); + + EXPECT_EQ(SPV_ERROR_INVALID_BINARY, ValidateInstructions(SPV_ENV_WEBGPU_0)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Debugging instructions are not allowed in the WebGPU " + "execution environment.\n OpMemberName %_struct_1 0 " + "\"foo\"\n")); +} + +TEST_F(ValidateWebGPU, OpSourceIsDisallowed) { + std::string spirv = R"( + OpCapability Shader + OpCapability VulkanMemoryModelKHR + OpExtension "SPV_KHR_vulkan_memory_model" + OpMemoryModel Logical VulkanKHR + OpSource GLSL 450 +)"; + + CompileSuccessfully(spirv); + + EXPECT_EQ(SPV_ERROR_INVALID_BINARY, ValidateInstructions(SPV_ENV_WEBGPU_0)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Debugging instructions are not allowed in the WebGPU " + "execution environment.\n OpSource GLSL 450\n")); +} + +// OpSourceContinued does not have a test case, because it requires being +// preceded by OpSource, which will cause a validation error. + +TEST_F(ValidateWebGPU, OpSourceExtensionIsDisallowed) { + std::string spirv = R"( + OpCapability Shader + OpCapability VulkanMemoryModelKHR + OpExtension "SPV_KHR_vulkan_memory_model" + OpMemoryModel Logical VulkanKHR + OpSourceExtension "bar" +)"; + + CompileSuccessfully(spirv); + + EXPECT_EQ(SPV_ERROR_INVALID_BINARY, ValidateInstructions(SPV_ENV_WEBGPU_0)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Debugging instructions are not allowed in the WebGPU " + "execution environment.\n OpSourceExtension " + "\"bar\"\n")); +} + +TEST_F(ValidateWebGPU, OpStringIsDisallowed) { + std::string spirv = R"( + OpCapability Shader + OpCapability VulkanMemoryModelKHR + OpExtension "SPV_KHR_vulkan_memory_model" + OpMemoryModel Logical VulkanKHR +%1 = OpString "foo" +)"; + + CompileSuccessfully(spirv); + + EXPECT_EQ(SPV_ERROR_INVALID_BINARY, ValidateInstructions(SPV_ENV_WEBGPU_0)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Debugging instructions are not allowed in the WebGPU " + "execution environment.\n %1 = OpString \"foo\"\n")); +} + +// OpLine does not have a test case, because it requires being preceded by +// OpString, which will cause a validation error. + +TEST_F(ValidateWebGPU, OpNoLineDisallowed) { + std::string spirv = R"( + OpCapability Shader + OpCapability VulkanMemoryModelKHR + OpExtension "SPV_KHR_vulkan_memory_model" + OpMemoryModel Logical VulkanKHR + OpNoLine +)"; + + CompileSuccessfully(spirv); + + EXPECT_EQ(SPV_ERROR_INVALID_BINARY, ValidateInstructions(SPV_ENV_WEBGPU_0)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Debugging instructions are not allowed in the WebGPU " + "execution environment.\n OpNoLine\n")); +} + +TEST_F(ValidateWebGPU, LogicalAddressingVulkanKHRMemoryGood) { + std::string spirv = R"( + OpCapability Shader + OpCapability VulkanMemoryModelKHR + OpExtension "SPV_KHR_vulkan_memory_model" + OpMemoryModel Logical VulkanKHR + OpEntryPoint Vertex %func "shader" +%void = OpTypeVoid +%void_f = OpTypeFunction %void +%func = OpFunction %void None %void_f +%label = OpLabel + OpReturn + OpFunctionEnd +)"; + + CompileSuccessfully(spirv); + + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_WEBGPU_0)); +} + +TEST_F(ValidateWebGPU, NonLogicalAddressingModelBad) { + std::string spirv = R"( + OpCapability Shader + OpCapability VulkanMemoryModelKHR + OpExtension "SPV_KHR_vulkan_memory_model" + OpMemoryModel Physical32 VulkanKHR +)"; + + CompileSuccessfully(spirv); + + EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_WEBGPU_0)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Addressing model must be Logical for WebGPU " + "environment.\n OpMemoryModel Physical32 " + "VulkanKHR\n")); +} + +TEST_F(ValidateWebGPU, NonVulkanKHRMemoryModelBad) { + std::string spirv = R"( + OpCapability Shader + OpMemoryModel Logical GLSL450 + OpNoLine +)"; + + CompileSuccessfully(spirv); + + EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_WEBGPU_0)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("Memory model must be VulkanKHR for WebGPU " + "environment.\n OpMemoryModel Logical GLSL450\n")); +} + +TEST_F(ValidateWebGPU, WhitelistedExtendedInstructionsImportGood) { + std::string spirv = R"( + OpCapability Shader + OpCapability VulkanMemoryModelKHR + OpExtension "SPV_KHR_vulkan_memory_model" +%1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical VulkanKHR + OpEntryPoint Vertex %func "shader" +%void = OpTypeVoid +%void_f = OpTypeFunction %void +%func = OpFunction %void None %void_f +%label = OpLabel + OpReturn + OpFunctionEnd +)"; + + CompileSuccessfully(spirv); + + EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_WEBGPU_0)); +} + +TEST_F(ValidateWebGPU, NonWhitelistedExtendedInstructionsImportBad) { + std::string spirv = R"( + OpCapability Shader + OpCapability VulkanMemoryModelKHR + OpExtension "SPV_KHR_vulkan_memory_model" +%1 = OpExtInstImport "OpenCL.std" + OpMemoryModel Logical VulkanKHR +)"; + + CompileSuccessfully(spirv); + + EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_WEBGPU_0)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("For WebGPU, the only valid parameter to " + "OpExtInstImport is \"GLSL.std.450\".\n %1 = " + "OpExtInstImport \"OpenCL.std\"\n")); +} + +TEST_F(ValidateWebGPU, NonVulkanKHRMemoryModelExtensionBad) { + std::string spirv = R"( + OpCapability Shader + OpCapability VulkanMemoryModelKHR + OpExtension "SPV_KHR_8bit_storage" + OpExtension "SPV_KHR_vulkan_memory_model" + OpMemoryModel Logical VulkanKHR +)"; + + CompileSuccessfully(spirv); + + EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_WEBGPU_0)); + EXPECT_THAT(getDiagnosticString(), + HasSubstr("For WebGPU, the only valid parameter to OpExtension " + "is \"SPV_KHR_vulkan_memory_model\".\n OpExtension " + "\"SPV_KHR_8bit_storage\"\n")); +} + } // namespace } // namespace val } // namespace spvtools diff --git a/3rdparty/spirv-tools/tools/CMakeLists.txt b/3rdparty/spirv-tools/tools/CMakeLists.txt index 67143d879..9fb3a91a0 100644 --- a/3rdparty/spirv-tools/tools/CMakeLists.txt +++ b/3rdparty/spirv-tools/tools/CMakeLists.txt @@ -42,6 +42,7 @@ if (NOT ${SPIRV_SKIP_EXECUTABLES}) add_spvtools_tool(TARGET spirv-dis SRCS dis/dis.cpp LIBS ${SPIRV_TOOLS}) add_spvtools_tool(TARGET spirv-val SRCS val/val.cpp util/cli_consumer.cpp LIBS ${SPIRV_TOOLS}) add_spvtools_tool(TARGET spirv-opt SRCS opt/opt.cpp util/cli_consumer.cpp LIBS SPIRV-Tools-opt ${SPIRV_TOOLS}) + add_spvtools_tool(TARGET spirv-reduce SRCS reduce/reduce.cpp util/cli_consumer.cpp LIBS SPIRV-Tools-reduce ${SPIRV_TOOLS}) add_spvtools_tool(TARGET spirv-link SRCS link/linker.cpp LIBS SPIRV-Tools-link ${SPIRV_TOOLS}) add_spvtools_tool(TARGET spirv-stats SRCS stats/stats.cpp @@ -61,7 +62,7 @@ if (NOT ${SPIRV_SKIP_EXECUTABLES}) ${SPIRV_HEADER_INCLUDE_DIR}) set(SPIRV_INSTALL_TARGETS spirv-as spirv-dis spirv-val spirv-opt spirv-stats - spirv-cfg spirv-link) + spirv-cfg spirv-link spirv-reduce) if(SPIRV_BUILD_COMPRESSION) add_spvtools_tool(TARGET spirv-markv diff --git a/3rdparty/spirv-tools/tools/lesspipe/spirv-lesspipe.sh b/3rdparty/spirv-tools/tools/lesspipe/spirv-lesspipe.sh index 81e335501..57684a201 100644 --- a/3rdparty/spirv-tools/tools/lesspipe/spirv-lesspipe.sh +++ b/3rdparty/spirv-tools/tools/lesspipe/spirv-lesspipe.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env sh # Copyright (c) 2016 The Khronos Group Inc. # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/3rdparty/spirv-tools/tools/opt/opt.cpp b/3rdparty/spirv-tools/tools/opt/opt.cpp index fcd260e45..db056b1c3 100644 --- a/3rdparty/spirv-tools/tools/opt/opt.cpp +++ b/3rdparty/spirv-tools/tools/opt/opt.cpp @@ -23,9 +23,9 @@ #include #include "source/opt/log.h" -#include "source/opt/loop_peeling.h" -#include "source/opt/set_spec_constant_default_value_pass.h" -#include "source/spirv_validator_options.h" +#include "source/spirv_target_env.h" +#include "source/util/string_utils.h" +#include "spirv-tools/libspirv.hpp" #include "spirv-tools/optimizer.hpp" #include "tools/io.h" #include "tools/util/cli_consumer.h" @@ -79,6 +79,12 @@ std::string GetSizePasses() { return GetListOfPassesAsString(optimizer); } +std::string GetWebGPUPasses() { + spvtools::Optimizer optimizer(SPV_ENV_WEBGPU_0); + optimizer.RegisterWebGPUPasses(); + return GetListOfPassesAsString(optimizer); +} + void PrintUsage(const char* program) { // NOTE: Please maintain flags in lexicographical order. printf( @@ -190,9 +196,9 @@ Options (in lexicographical order): Looks for instructions in the same basic block that compute the same value, and deletes the redundant ones. --loop-fission - Splits any top level loops in which the register pressure has exceeded - a given threshold. The threshold must follow the use of this flag and - must be a positive integer value. + Splits any top level loops in which the register pressure has + exceeded a given threshold. The threshold must follow the use of + this flag and must be a positive integer value. --loop-fusion Identifies adjacent loops with the same lower and upper bound. If this is legal, then merge the loops into a single loop. @@ -200,6 +206,9 @@ Options (in lexicographical order): registers too much, while reducing the number of loads from memory. Takes an additional positive integer argument to set the maximum number of registers. + --loop-invariant-code-motion + Identifies code in loops that has the same value for every + iteration of the loop, and move it to the loop pre-header. --loop-unroll Fully unrolls loops marked with the Unroll flag --loop-unroll-partial @@ -214,6 +223,10 @@ Options (in lexicographical order): growth threshold. The threshold prevents the loop peeling from happening if the code size increase created by the optimization is above the threshold. + --max-id-bound= + Sets the maximum value for the id bound for the moudle. The + default is the minimum value for this limit, 0x3FFFFF. See + section 2.17 of the Spir-V specification. --merge-blocks Join two blocks into a single block if the second has the first as its only predecessor. Performed only on entry point @@ -332,6 +345,11 @@ Options (in lexicographical order): --strip-reflect Remove all reflection information. For now, this covers reflection information defined by SPV_GOOGLE_hlsl_functionality1. + --target-env= + Set the target environment. Without this flag the target + enviroment defaults to spv1.3. + must be one of vulkan1.0, vulkan1.1, opencl2.2, spv1.0, + spv1.1, spv1.2, spv1.3, or webgpu0. --time-report Print the resource utilization of each pass (e.g., CPU time, RSS) to standard error output. Currently it supports only Unix @@ -339,10 +357,25 @@ Options (in lexicographical order): prints CPU/WALL/USR/SYS time (and RSS if possible), but note that USR/SYS time are returned by getrusage() and can have a small error. + --upgrade-memory-model + Upgrades the Logical GLSL450 memory model to Logical VulkanKHR. + Transforms memory, image, atomic and barrier operations to conform + to that model's requirements. --vector-dce This pass looks for components of vectors that are unused, and removes them from the vector. Note this would still leave around lots of dead code that a pass of ADCE will be able to remove. + --webgpu-mode + Turns on the prescribed passes for WebGPU and sets the target + environmet to webgpu0. Other passes may be turned on via + additional flags, but such combinations are not tested. + Using --target-env with this flag is not allowed. + + This flag is the equivalent of passing in --target-env=webgpu0 + and specifying the following optimization code names: + %s + + NOTE: This flag is a WIP and its behaviour is subject to change. --workaround-1209 Rewrites instructions for which there are known driver bugs to avoid triggering those bugs. @@ -355,7 +388,8 @@ Options (in lexicographical order): Display optimizer version information. )", program, program, GetLegalizationPasses().c_str(), - GetOptimizationPasses().c_str(), GetSizePasses().c_str()); + GetOptimizationPasses().c_str(), GetSizePasses().c_str(), + GetWebGPUPasses().c_str()); } // Reads command-line flags the file specified in |oconfig_flag|. This string @@ -406,18 +440,22 @@ bool ReadFlagsFromFile(const char* oconfig_flag, OptStatus ParseFlags(int argc, const char** argv, spvtools::Optimizer* optimizer, const char** in_file, - const char** out_file, spvtools::ValidatorOptions* options, - bool* skip_validator); + const char** out_file, + spvtools::ValidatorOptions* validator_options, + spvtools::OptimizerOptions* optimizer_options); // Parses and handles the -Oconfig flag. |prog_name| contains the name of // the spirv-opt binary (used to build a new argv vector for the recursive // invocation to ParseFlags). |opt_flag| contains the -Oconfig=FILENAME flag. -// |optimizer|, |in_file| and |out_file| are as in ParseFlags. +// |optimizer|, |in_file|, |out_file|, |validator_options|, and +// |optimizer_options| are as in ParseFlags. // // This returns the same OptStatus instance returned by ParseFlags. OptStatus ParseOconfigFlag(const char* prog_name, const char* opt_flag, spvtools::Optimizer* optimizer, const char** in_file, - const char** out_file) { + const char** out_file, + spvtools::ValidatorOptions* validator_options, + spvtools::OptimizerOptions* optimizer_options) { std::vector flags; flags.push_back(prog_name); @@ -440,9 +478,8 @@ OptStatus ParseOconfigFlag(const char* prog_name, const char* opt_flag, new_argv[i] = flags[i].c_str(); } - bool skip_validator = false; return ParseFlags(static_cast(flags.size()), new_argv, optimizer, - in_file, out_file, nullptr, &skip_validator); + in_file, out_file, validator_options, optimizer_options); } // Canonicalize the flag in |argv[argi]| of the form '--pass arg' into @@ -485,9 +522,9 @@ std::string CanonicalizeFlag(const char** argv, int argc, int* argi) { return canonical_arg.str(); } -// the number of command-line flags. |argv| points to an array of strings -// holding the flags. |optimizer| is the Optimizer instance used to optimize the -// program. +// Parses command-line flags. |argc| contains the number of command-line flags. +// |argv| points to an array of strings holding the flags. |optimizer| is the +// Optimizer instance used to optimize the program. // // On return, this function stores the name of the input program in |in_file|. // The name of the output file in |out_file|. The return value indicates whether @@ -495,9 +532,12 @@ std::string CanonicalizeFlag(const char** argv, int argc, int* argi) { // success. OptStatus ParseFlags(int argc, const char** argv, spvtools::Optimizer* optimizer, const char** in_file, - const char** out_file, spvtools::ValidatorOptions* options, - bool* skip_validator) { + const char** out_file, + spvtools::ValidatorOptions* validator_options, + spvtools::OptimizerOptions* optimizer_options) { std::vector pass_flags; + bool target_env_set = false; + bool webgpu_mode_set = false; for (int argi = 1; argi < argc; ++argi) { const char* cur_arg = argv[argi]; if ('-' == cur_arg[0]) { @@ -526,18 +566,63 @@ OptStatus ParseFlags(int argc, const char** argv, } } else if (0 == strncmp(cur_arg, "-Oconfig=", sizeof("-Oconfig=") - 1)) { OptStatus status = - ParseOconfigFlag(argv[0], cur_arg, optimizer, in_file, out_file); + ParseOconfigFlag(argv[0], cur_arg, optimizer, in_file, out_file, + validator_options, optimizer_options); if (status.action != OPT_CONTINUE) { return status; } } else if (0 == strcmp(cur_arg, "--skip-validation")) { - *skip_validator = true; + optimizer_options->set_run_validator(false); } else if (0 == strcmp(cur_arg, "--print-all")) { optimizer->SetPrintAll(&std::cerr); } else if (0 == strcmp(cur_arg, "--time-report")) { optimizer->SetTimeReport(&std::cerr); } else if (0 == strcmp(cur_arg, "--relax-struct-store")) { - options->SetRelaxStructStore(true); + validator_options->SetRelaxStructStore(true); + } else if (0 == strncmp(cur_arg, "--max-id-bound=", + sizeof("--max-id-bound=") - 1)) { + auto split_flag = spvtools::utils::SplitFlagArgs(cur_arg); + // Will not allow values in the range [2^31,2^32). + uint32_t max_id_bound = + static_cast(atoi(split_flag.second.c_str())); + + // That SPIR-V mandates the minimum value for max id bound but + // implementations may allow higher minimum bounds. + if (max_id_bound < kDefaultMaxIdBound) { + spvtools::Error(opt_diagnostic, nullptr, {}, + "The max id bound must be at least 0x3FFFFF"); + return {OPT_STOP, 1}; + } + optimizer_options->set_max_id_bound(max_id_bound); + validator_options->SetUniversalLimit(spv_validator_limit_max_id_bound, + max_id_bound); + } else if (0 == strncmp(cur_arg, + "--target-env=", sizeof("--target-env=") - 1)) { + if (webgpu_mode_set) { + spvtools::Error(opt_diagnostic, nullptr, {}, + "Cannot use both --webgpu-mode and --target-env at " + "the same time"); + return {OPT_STOP, 1}; + } + const auto split_flag = spvtools::utils::SplitFlagArgs(cur_arg); + const auto target_env_str = split_flag.second.c_str(); + spv_target_env target_env; + if (!spvParseTargetEnv(target_env_str, &target_env)) { + spvtools::Error(opt_diagnostic, nullptr, {}, + "Invalid value passed to --target-env"); + return {OPT_STOP, 1}; + } + optimizer->SetTargetEnv(target_env); + } else if (0 == strcmp(cur_arg, "--webgpu-mode")) { + if (target_env_set) { + spvtools::Error(opt_diagnostic, nullptr, {}, + "Cannot use both --webgpu-mode and --target-env at " + "the same time"); + return {OPT_STOP, 1}; + } + + optimizer->SetTargetEnv(SPV_ENV_WEBGPU_0); + optimizer->RegisterWebGPUPasses(); } else { // Some passes used to accept the form '--pass arg', canonicalize them // to '--pass=arg'. @@ -546,7 +631,7 @@ OptStatus ParseFlags(int argc, const char** argv, // If we were requested to legalize SPIR-V generated from the HLSL // front-end, skip validation. if (0 == strcmp(cur_arg, "--legalize-hlsl")) { - options->SetRelaxLogicalPointer(true); + validator_options->SetRelaxLogicalPointer(true); } } } else { @@ -572,16 +657,18 @@ OptStatus ParseFlags(int argc, const char** argv, int main(int argc, const char** argv) { const char* in_file = nullptr; const char* out_file = nullptr; - bool skip_validator = false; spv_target_env target_env = kDefaultEnvironment; - spvtools::ValidatorOptions options; + spvtools::Optimizer optimizer(target_env); optimizer.SetMessageConsumer(spvtools::utils::CLIMessageConsumer); + spvtools::ValidatorOptions validator_options; + spvtools::OptimizerOptions optimizer_options; OptStatus status = ParseFlags(argc, argv, &optimizer, &in_file, &out_file, - &options, &skip_validator); + &validator_options, &optimizer_options); + optimizer_options.set_validator_options(validator_options); if (status.action == OPT_STOP) { return status.code; @@ -599,8 +686,8 @@ int main(int argc, const char** argv) { // By using the same vector as input and output, we save time in the case // that there was no change. - bool ok = optimizer.Run(binary.data(), binary.size(), &binary, options, - skip_validator); + bool ok = + optimizer.Run(binary.data(), binary.size(), &binary, optimizer_options); if (!WriteFile(out_file, "wb", binary.data(), binary.size())) { return 1; diff --git a/3rdparty/spirv-tools/tools/reduce/reduce.cpp b/3rdparty/spirv-tools/tools/reduce/reduce.cpp new file mode 100644 index 000000000..65325f745 --- /dev/null +++ b/3rdparty/spirv-tools/tools/reduce/reduce.cpp @@ -0,0 +1,242 @@ +// Copyright (c) 2018 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#include +#include +#include + +#include "source/opt/build_module.h" +#include "source/opt/ir_context.h" +#include "source/opt/log.h" +#include "source/reduce/operand_to_const_reduction_pass.h" +#include "source/reduce/operand_to_dominating_id_reduction_pass.h" +#include "source/reduce/operand_to_undef_reduction_pass.h" +#include "source/reduce/reducer.h" +#include "source/reduce/remove_opname_instruction_reduction_pass.h" +#include "source/reduce/remove_unreferenced_instruction_reduction_pass.h" +#include "source/reduce/structured_loop_to_selection_reduction_pass.h" +#include "source/spirv_reducer_options.h" +#include "source/util/make_unique.h" +#include "source/util/string_utils.h" +#include "spirv-tools/libspirv.hpp" +#include "tools/io.h" +#include "tools/util/cli_consumer.h" + +using namespace spvtools::reduce; + +namespace { + +using ErrorOrInt = std::pair; + +// Check that the std::system function can actually be used. +bool CheckExecuteCommand() { + int res = std::system(nullptr); + return res != 0; +} + +// Execute a command using the shell. +// Returns true if and only if the command's exit status was 0. +bool ExecuteCommand(const std::string& command) { + errno = 0; + int status = std::system(command.c_str()); + assert(errno == 0 && "failed to execute command"); + // The result returned by 'system' is implementation-defined, but is + // usually the case that the returned value is 0 when the command's exit + // code was 0. We are assuming that here, and that's all we depend on. + return status == 0; +} + +// Status and actions to perform after parsing command-line arguments. +enum ReduceActions { REDUCE_CONTINUE, REDUCE_STOP }; + +struct ReduceStatus { + ReduceActions action; + int code; +}; + +void PrintUsage(const char* program) { + // NOTE: Please maintain flags in lexicographical order. + printf( + R"(%s - Reduce a SPIR-V binary file with respect to a user-provided + interestingness test. + +USAGE: %s [options] + +The SPIR-V binary is read from . + +Whether a binary is interesting is determined by , which +is typically a script. + +NOTE: The reducer is a work in progress. + +Options (in lexicographical order): + -h, --help + Print this help. + --step-limit + 32-bit unsigned integer specifying maximum number of + steps the reducer will take before giving up. + --version + Display reducer version information. +)", + program, program); +} + +// Message consumer for this tool. Used to emit diagnostics during +// initialization and setup. Note that |source| and |position| are irrelevant +// here because we are still not processing a SPIR-V input file. +void ReduceDiagnostic(spv_message_level_t level, const char* /*source*/, + const spv_position_t& /*position*/, const char* message) { + if (level == SPV_MSG_ERROR) { + fprintf(stderr, "error: "); + } + fprintf(stderr, "%s\n", message); +} + +ReduceStatus ParseFlags(int argc, const char** argv, const char** in_file, + const char** interestingness_test, + spvtools::ReducerOptions* reducer_options) { + uint32_t positional_arg_index = 0; + + for (int argi = 1; argi < argc; ++argi) { + const char* cur_arg = argv[argi]; + if ('-' == cur_arg[0]) { + if (0 == strcmp(cur_arg, "--version")) { + spvtools::Logf(ReduceDiagnostic, SPV_MSG_INFO, nullptr, {}, "%s\n", + spvSoftwareVersionDetailsString()); + return {REDUCE_STOP, 0}; + } else if (0 == strcmp(cur_arg, "--help") || 0 == strcmp(cur_arg, "-h")) { + PrintUsage(argv[0]); + return {REDUCE_STOP, 0}; + } else if ('\0' == cur_arg[1]) { + // We do not support reduction from standard input. We could support + // this if there was a compelling use case. + PrintUsage(argv[0]); + return {REDUCE_STOP, 0}; + } else if (0 == strncmp(cur_arg, + "--step-limit=", sizeof("--step-limit=") - 1)) { + const auto split_flag = spvtools::utils::SplitFlagArgs(cur_arg); + char* end = nullptr; + errno = 0; + const auto step_limit = + static_cast(strtol(split_flag.second.c_str(), &end, 10)); + assert(end != split_flag.second.c_str() && errno == 0); + reducer_options->set_step_limit(step_limit); + } + } else if (positional_arg_index == 0) { + // Input file name + assert(!*in_file); + *in_file = cur_arg; + positional_arg_index++; + } else if (positional_arg_index == 1) { + assert(!*interestingness_test); + *interestingness_test = cur_arg; + positional_arg_index++; + } else { + spvtools::Error(ReduceDiagnostic, nullptr, {}, + "Too many positional arguments specified"); + return {REDUCE_STOP, 1}; + } + } + + if (!*in_file) { + spvtools::Error(ReduceDiagnostic, nullptr, {}, "No input file specified"); + return {REDUCE_STOP, 1}; + } + + if (!*interestingness_test) { + spvtools::Error(ReduceDiagnostic, nullptr, {}, + "No interestingness test specified"); + return {REDUCE_STOP, 1}; + } + + return {REDUCE_CONTINUE, 0}; +} + +} // namespace + +const auto kDefaultEnvironment = SPV_ENV_UNIVERSAL_1_3; + +int main(int argc, const char** argv) { + const char* in_file = nullptr; + const char* interestingness_test = nullptr; + + spv_target_env target_env = kDefaultEnvironment; + spvtools::ReducerOptions reducer_options; + + ReduceStatus status = + ParseFlags(argc, argv, &in_file, &interestingness_test, &reducer_options); + + if (status.action == REDUCE_STOP) { + return status.code; + } + + if (!CheckExecuteCommand()) { + std::cerr << "could not find shell interpreter for executing a command" + << std::endl; + return 2; + } + + Reducer reducer(target_env); + + reducer.SetInterestingnessFunction( + [interestingness_test](std::vector binary, + uint32_t reductions_applied) -> bool { + std::stringstream ss; + ss << "temp_" << std::setw(4) << std::setfill('0') << reductions_applied + << ".spv"; + const auto spv_file = ss.str(); + const std::string command = + std::string(interestingness_test) + " " + spv_file; + auto write_file_succeeded = + WriteFile(spv_file.c_str(), "wb", &binary[0], binary.size()); + (void)(write_file_succeeded); + assert(write_file_succeeded); + return ExecuteCommand(command); + }); + + reducer.AddReductionPass( + spvtools::MakeUnique(target_env)); + reducer.AddReductionPass( + spvtools::MakeUnique(target_env)); + reducer.AddReductionPass( + spvtools::MakeUnique(target_env)); + reducer.AddReductionPass( + spvtools::MakeUnique(target_env)); + reducer.AddReductionPass( + spvtools::MakeUnique( + target_env)); + reducer.AddReductionPass( + spvtools::MakeUnique(target_env)); + + reducer.SetMessageConsumer(spvtools::utils::CLIMessageConsumer); + + std::vector binary_in; + if (!ReadFile(in_file, "rb", &binary_in)) { + return 1; + } + + std::vector binary_out; + const auto reduction_status = + reducer.Run(std::move(binary_in), &binary_out, reducer_options); + + if (reduction_status == + Reducer::ReductionResultStatus::kInitialStateNotInteresting || + !WriteFile("_reduced_final.spv", "wb", binary_out.data(), + binary_out.size())) { + return 1; + } + + return 0; +} diff --git a/3rdparty/spirv-tools/tools/stats/spirv_stats.cpp b/3rdparty/spirv-tools/tools/stats/spirv_stats.cpp index 7751c6402..609a6c972 100644 --- a/3rdparty/spirv-tools/tools/stats/spirv_stats.cpp +++ b/3rdparty/spirv-tools/tools/stats/spirv_stats.cpp @@ -147,13 +147,13 @@ class StatsAggregator { } // namespace -spv_result_t AggregateStats(const spv_context_t& context, const uint32_t* words, +spv_result_t AggregateStats(const spv_context context, const uint32_t* words, const size_t num_words, spv_diagnostic* pDiagnostic, SpirvStats* stats) { std::unique_ptr vstate; spv_validator_options_t options; spv_result_t result = ValidateBinaryAndKeepValidationState( - &context, &options, words, num_words, pDiagnostic, &vstate); + context, &options, words, num_words, pDiagnostic, &vstate); if (result != SPV_SUCCESS) return result; StatsAggregator stats_aggregator(stats, vstate.get()); diff --git a/3rdparty/spirv-tools/tools/stats/spirv_stats.h b/3rdparty/spirv-tools/tools/stats/spirv_stats.h index 16e720fe3..757695775 100644 --- a/3rdparty/spirv-tools/tools/stats/spirv_stats.h +++ b/3rdparty/spirv-tools/tools/stats/spirv_stats.h @@ -83,7 +83,7 @@ struct SpirvStats { }; // Aggregates existing |stats| with new stats extracted from |binary|. -spv_result_t AggregateStats(const spv_context_t& context, const uint32_t* words, +spv_result_t AggregateStats(const spv_context context, const uint32_t* words, const size_t num_words, spv_diagnostic* pDiagnostic, SpirvStats* stats); diff --git a/3rdparty/spirv-tools/tools/stats/stats.cpp b/3rdparty/spirv-tools/tools/stats/stats.cpp index 256ec1e1b..30e3bccd6 100644 --- a/3rdparty/spirv-tools/tools/stats/stats.cpp +++ b/3rdparty/spirv-tools/tools/stats/stats.cpp @@ -19,7 +19,6 @@ #include #include -#include "source/table.h" #include "spirv-tools/libspirv.h" #include "tools/io.h" #include "tools/stats/spirv_stats.h" @@ -27,12 +26,6 @@ namespace { -struct ScopedContext { - ScopedContext(spv_target_env env) : context(spvContextCreate(env)) {} - ~ScopedContext() { spvContextDestroy(context); } - spv_context context; -}; - void PrintUsage(char* argv0) { printf( R"(%s - Collect statistics from one or more SPIR-V binary file(s). @@ -120,8 +113,8 @@ int main(int argc, char** argv) { std::cerr << "Processing " << paths.size() << " files..." << std::endl; - ScopedContext ctx(SPV_ENV_UNIVERSAL_1_1); - spvtools::SetContextMessageConsumer(ctx.context, DiagnosticsMessageHandler); + spvtools::Context ctx(SPV_ENV_UNIVERSAL_1_1); + ctx.SetMessageConsumer(DiagnosticsMessageHandler); spvtools::stats::SpirvStats stats; stats.opcode_markov_hist.resize(1); @@ -138,7 +131,7 @@ int main(int argc, char** argv) { if (!ReadFile(path, "rb", &contents)) return 1; if (SPV_SUCCESS != - spvtools::stats::AggregateStats(*ctx.context, contents.data(), + spvtools::stats::AggregateStats(ctx.CContext(), contents.data(), contents.size(), nullptr, &stats)) { std::cerr << "error: Failed to aggregate stats for " << path << std::endl; return 1; diff --git a/3rdparty/spirv-tools/tools/val/val.cpp b/3rdparty/spirv-tools/tools/val/val.cpp index 172dd121d..8b1d048fd 100644 --- a/3rdparty/spirv-tools/tools/val/val.cpp +++ b/3rdparty/spirv-tools/tools/val/val.cpp @@ -45,11 +45,18 @@ Options: --max-function-args --max-control-flow-nesting-depth --max-access-chain-indexes + --max-id-bound --relax-logical-pointer Allow allocating an object of a pointer type and returning a pointer value from a function in logical addressing mode - --relax-block-layout Enable VK_HR_relaxed_block_layout when checking standard - uniform/storage buffer layout - --skip-block-layout Skip checking standard uniform/storage buffer layout + --relax-block-layout Enable VK_KHR_relaxed_block_layout when checking standard + uniform, storage buffer, and push constant layouts. + This is the default when targeting Vulkan 1.1 or later. + --scalar-block-layout Enable VK_EXT_scalar_block_layout when checking standard + uniform, storage buffer, and push constant layouts. Scalar layout + rules are more permissive than relaxed block layout so in effect + this will override the --relax-block-layout option. + --skip-block-layout Skip checking standard uniform/storage buffer layout. + Overrides any --relax-block-layout or --scalar-block-layout option. --relax-struct-store Allow store from one struct type to a different type with compatible layout and members. @@ -127,6 +134,8 @@ int main(int argc, char** argv) { options.SetRelaxLogicalPointer(true); } else if (0 == strcmp(cur_arg, "--relax-block-layout")) { options.SetRelaxBlockLayout(true); + } else if (0 == strcmp(cur_arg, "--scalar-block-layout")) { + options.SetScalarBlockLayout(true); } else if (0 == strcmp(cur_arg, "--skip-block-layout")) { options.SetSkipBlockLayout(true); } else if (0 == strcmp(cur_arg, "--relax-struct-store")) { diff --git a/3rdparty/spirv-tools/utils/check_copyright.py b/3rdparty/spirv-tools/utils/check_copyright.py index 85ea12891..fc249e9bd 100755 --- a/3rdparty/spirv-tools/utils/check_copyright.py +++ b/3rdparty/spirv-tools/utils/check_copyright.py @@ -32,9 +32,9 @@ AUTHORS = ['The Khronos Group Inc.', 'Google Inc.', 'Google LLC', 'Pierre Moreau'] -CURRENT_YEAR='2018' +CURRENT_YEAR='2019' -YEARS = '(2014-2016|2015-2016|2016|2016-2017|2017|2018)' +YEARS = '(2014-2016|2015-2016|2016|2016-2017|2017|2018|2019)' COPYRIGHT_RE = re.compile( 'Copyright \(c\) {} ({})'.format(YEARS, '|'.join(AUTHORS))) diff --git a/scripts/shaderc.lua b/scripts/shaderc.lua index 805e3e760..7e34656bc 100644 --- a/scripts/shaderc.lua +++ b/scripts/shaderc.lua @@ -65,6 +65,8 @@ project "spirv-opt" path.join(SPIRV_TOOLS, "source/spirv_definition.h"), path.join(SPIRV_TOOLS, "source/spirv_endian.cpp"), path.join(SPIRV_TOOLS, "source/spirv_endian.h"), + path.join(SPIRV_TOOLS, "source/spirv_optimizer_options.cpp"), + path.join(SPIRV_TOOLS, "source/spirv_reducer_options.cpp"), path.join(SPIRV_TOOLS, "source/spirv_target_env.cpp"), path.join(SPIRV_TOOLS, "source/spirv_target_env.h"), path.join(SPIRV_TOOLS, "source/spirv_validator_options.cpp"), @@ -89,6 +91,8 @@ project "spirv-opt" path.join(SPIRV_TOOLS, "source/val/decoration.h"), path.join(SPIRV_TOOLS, "source/val/function.cpp"), path.join(SPIRV_TOOLS, "source/val/instruction.cpp"), + path.join(SPIRV_TOOLS, "source/val/validate.cpp"), + path.join(SPIRV_TOOLS, "source/val/validate.h"), path.join(SPIRV_TOOLS, "source/val/validate_adjacency.cpp"), path.join(SPIRV_TOOLS, "source/val/validate_annotation.cpp"), path.join(SPIRV_TOOLS, "source/val/validate_arithmetics.cpp"), @@ -106,22 +110,22 @@ project "spirv-opt" path.join(SPIRV_TOOLS, "source/val/validate_decorations.cpp"), path.join(SPIRV_TOOLS, "source/val/validate_derivatives.cpp"), path.join(SPIRV_TOOLS, "source/val/validate_execution_limitations.cpp"), - path.join(SPIRV_TOOLS, "source/val/validate_ext_inst.cpp"), + path.join(SPIRV_TOOLS, "source/val/validate_extensions.cpp"), path.join(SPIRV_TOOLS, "source/val/validate_function.cpp"), path.join(SPIRV_TOOLS, "source/val/validate_id.cpp"), path.join(SPIRV_TOOLS, "source/val/validate_image.cpp"), - path.join(SPIRV_TOOLS, "source/val/validate_interfaces.cpp"), path.join(SPIRV_TOOLS, "source/val/validate_instruction.cpp"), + path.join(SPIRV_TOOLS, "source/val/validate_interfaces.cpp"), path.join(SPIRV_TOOLS, "source/val/validate_layout.cpp"), path.join(SPIRV_TOOLS, "source/val/validate_literals.cpp"), path.join(SPIRV_TOOLS, "source/val/validate_logicals.cpp"), path.join(SPIRV_TOOLS, "source/val/validate_memory.cpp"), + path.join(SPIRV_TOOLS, "source/val/validate_memory_semantics.cpp"), path.join(SPIRV_TOOLS, "source/val/validate_mode_setting.cpp"), path.join(SPIRV_TOOLS, "source/val/validate_non_uniform.cpp"), path.join(SPIRV_TOOLS, "source/val/validate_primitives.cpp"), + path.join(SPIRV_TOOLS, "source/val/validate_scopes.cpp"), path.join(SPIRV_TOOLS, "source/val/validate_type.cpp"), - path.join(SPIRV_TOOLS, "source/val/validate.cpp"), - path.join(SPIRV_TOOLS, "source/val/validate.h"), path.join(SPIRV_TOOLS, "source/val/validation_state.cpp"), } @@ -461,6 +465,7 @@ project "glsl-optimizer" "-fno-strict-aliasing", -- glsl-optimizer has bugs if strict aliasing is used. "-Wno-implicit-fallthrough", + "-Wno-parentheses", "-Wno-sign-compare", "-Wno-unused-function", "-Wno-unused-parameter",

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 MxS$naJh=S-17U4K_5c6? literal 0 HcmV?d00001 diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/flags.make b/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/flags.make new file mode 100644 index 000000000..ee9a3be31 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# compile CXX with /usr/bin/c++ +CXX_FLAGS = -g -fPIC -Wall -Wextra -Wnon-virtual-dtor -Wno-missing-field-initializers -Werror -std=c++11 -fno-exceptions -fno-rtti -Wno-long-long -Wshadow -Wundef -Wconversion -Wno-sign-conversion -std=gnu++11 + +CXX_DEFINES = -DSPIRV_CHECK_CONTEXT -DSPIRV_COLOR_TERMINAL -DSPIRV_LINUX -DSPIRV_TIMER_ENABLED + +CXX_INCLUDES = -I/home/bkaradzic/Private/projects/_github/SPIRV-Tools -I/home/bkaradzic/Private/projects/_github/SPIRV-Tools/include -I/home/bkaradzic/Private/projects/_github/SPIRV-Tools/build -I/home/bkaradzic/Private/projects/_github/SPIRV-Tools/external/SPIRV-Headers/include + diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/id_descriptor.cpp.o b/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/id_descriptor.cpp.o new file mode 100644 index 0000000000000000000000000000000000000000..dc81cceb8d17fec1e78326f5b5afbad147c34a5e GIT binary patch literal 363408 zcmcG12bdK__I=lTZ+J}}g5+cZ1{H=O4+sM?GAdcJAd(c6B+MX+iUZ+iwqHD&0nN?Z-=iFOe-S5qyyZilrd~~IA>ej7Wv8#Lf&CTz9YRnif z_-DMXUKk5fJ#T6K3>V3hP@cElJSjQvMVxt7TmL@mud)99)_=hIYpuV|`VU(FVe7BA z{v+0Z)cTKEf3x+sSbwYapRoQ@*57XZ9oB!^`p;VbdF$`A{@<+sqV-?4{;Sr1&H8Ux z|4r+^ZT-F0f7kl|u>J?u|Iqp$S^s0}e`@{DtpA1e_gnvK>wjbYZ>|5G^?$JbPuBm% z`v0>2Z`MC#{lnI0qp{s$)=yZ!ob{8|FK_({)~{&&%GR%9{Y>juvwjWh*R*~u>({n^ z9qZS#ego?_vVIfmA7lOFtbe@qn_9oQ^;=l~MC-S-ezx^w)M}k{#fge zv;G9@pJ)Av)}Lhk^R0h@^`}^Wn)Rn!|3d4}w0@EGXIX!?^)IphrPja9`g5&6&-(MN zzrgxeS$~oBi>+T`{cEhh#QN7-f2sBVV*Tr_zufvaT7RYWZ?gW)*1y&Iw_AUe_3yI& zJ=R}s{rjwczx5xm{yO-B3yMEEvta&L%?pYz+p{zOt4A*GaQn`Dj%aUZ{^#^cMtxpT zlE0^*c&9`QIz3bMFWVPvFFdJaum#=v>JqNU>tN)pF6M@a?6`JcDmj>49fM)7@(5; zl?C&+4+~0Ku)U~p!IH|vx1I>6U`acM3znQrPZedBCH;p{UO@?jKVMM%wjw+8MKY19 zoAa7f-Mqb^Q~s8!^UK2^O3$lPP%?N+!H$m-1!gz&+J)p@C3y*JgazBHF1P{(DLIp1 z)y*E|?ARAWjuNjpe;rbxz~FTS#m+#Gv|f?}V;1M{1_c+=LmI4mk>(yYOd)Ig`P&mx zj}N3C`v(^6%-;?*s0S3ti)l@^&+MeRgUb7gL%{_u`_1^Dq0|6y?mj?BHRnGDTS_9c#%^kndD4kqt$l($c?4 z2Y-s$wz1Nm-*foz;Ze^p2l}yh_;5Eb9y>Pa#f_|4F2CbSxR!I&9i#$PgN zT&w;wCe0dCIHA?_8Pm?6Fs^WBtI_98Dx6p}w$+*aPa8Poq(RfBO`h3m=Cq<2<0iD4 zG=B8>2{Xsdm^8g`+KiUtrcd`Snl@wn%+W0;OqpJIaq}!MM7Iim}k%$z=}kcH>wo;JRx zEA^CVlP5#gq-j%gbNkPjHg3YqnWs&iSvaFe(wd{NnUZz%^f5DLP8iQp0&sL;(=3^W zFdrPme84Vx00!ec!KC7%A4~Fo)OkZFCHV&nxYfaCE|SWO#WEuu;6BPL_@(Icg5uo~ z2J@BV`Kc+XG2od63%6IjVS6N9RYG3&aA@Zhbb5MbIfnNq;2sQgMc;{30sQ_PcPuj# zISN~Aq`)Q)hPq)#wz^@y5|IVP{r&yNNCr1k?7)mf+rUOHA9|a!lP$|HD1KUlUP0E= zut33%gR!z|gGmGOc6`M7%Hs3C%0>E;2L?x2s+DL6mocbMz>@0fBb4#0f@s5Z4VJp2Y$vO19&L+TUJbp8QTRz0Nup!Hm3?OYLLk2Dg5 z**PwkOM?p3aLPz_X| z2rb5uhL)3Bm#R>-1*~}kOS)blRVvlfAa)6QSZE`ZfKvXTH>K({|FQ#KVQo=MwkLfc ztMq7z>NkJ8U#4!6dWM}u`T=B0wab!QcC8>_2_}R8re@mi{bBGeF!*{Hd`;9?x=-3t zpi9wHTxfz?*xd@U*-b++R{SM{ai#1rWbG`;--2e`6}5LU2Dc1w^!}3kHKCN}5yeKO z=0cfWNm)`UhBOrPeZYovWxp?E(OMIhi-F&d1n5z{ZmF}HX6Ik zxtChA3;h>^Lsx}An9s2g{?|f-oqHWO8%5^Nf|5F@B`gs(5AGCh*q%C9<{>M(ThaDt zXO=Yv9h3%)jC^U!!RUp3EEKjJ%~8?^5OZOjmz=g>u23=!90iyQ6B^3RQ2W_rD8+I2 zAdai72_~>%6IM4}UyNlQ&!A<3`f{Ec%vG;u8LJ-WO_|hXR};)X!OkL(QEXRk>8%G+ zyDIXdHt1);ny)j2bQ&0RH)e=kQ6+VTh*b3%C;(Pab8IJ2@%dl*-3JvEzY{HM{y_Av0og(O{Keq4eF{} zgHR!Uj-1$SzbL7iBmtkqnE_Dt#;zUFa|>Wpn~6LO8l3gPG@Fw$CfyF+Vn8D;MXEdDgq{We;IlvS(@G?JICbzrM*j?oIQYF86^Dt;*lT(VO(X2IMV z&Oew1w`b#s@BsERRX1(t2|?s;GcTxD`V#y<)Qz13Yon+b_JTjxI5;ff$`q_`)PD;O zpZKp^S>r_)VLdGgx5Z_z6VK-#MjzoC!6lD(L{7cHUZvNf13@zedln2m9j{!cY!kck zn#kDZNG`_2CQEC`Dkw%{ax=)HU0b@m*~kkZx~6f9s6$}KM{%CwA{OiogQMjo+`-8m zCNV5zeQ>!!0D;;~a5kXlJ?F5$P!QIu<0KsEr=pr0faos!3X@yd`RuBR-A_HuBYoT% zfFs`W*m6onagIZIK^|yV=4zTJ zo7a^6cUisg$o*3hZ58y*b> zNE)X!#UC!or6!l==nT*>W!2lAT7f-b6gQDzN}b$^TX4ta_7CVQXeHV0VKPZsl(LQ1GQEJ?47jB<#Xxqr5z{Zq-$VRs_7zXp7M)!s}!YAux%`xdiBd}9oA5JOJFsBz6|KnYq zZAfU5K2_>SNR#|uNG&};qqnE&x0P5vXieTvx_y4cC@CWcCSu1s=w?xDHG8{b?_dpP zgB*x92!vx}fmCF4>rlA&EyDyyHcrq2l%~V2`(WLZv7e$MMY}P-@6t*I8gV`Xq*2`} zMWW9EMW%rKeDC6KWv%9^QSai8r;LPG9#3>-lYdbeC8~9%i}YeRgzxnw4t6VAjn;k*FOu zw0c8~a5$ifIdr4@R2Y--oq61tdhWT!{LA)uRTuD`Gr$prxoPKZHn%wxO?asNbM)M$w~nKtg&p|F-T^3J?$+tK7?Vt)-Z5PBz# z?)rN$GX)bfPhwI>O&Kwr8PUEvYX9)2U$O_9vh1>+q#nVhe{yFOcD~}$HR^>LM8z@D{pMap?yv&O9n<*I90Q!UQ>-pM@;~1)V&O~gkKr&aduERZy*;8w(90WR!Epc1#!J6E z&i6c@uSW(EhSL5mG&2jwd+og+uJpV<#OfbM079sC!TwdK9=-!4a0zXUGt4^ox$QKqM!}MgL z*K)*ee+6k33B_A!Hk ze7{}5qwuC%eOw~kf=?1W8#!_SbR;M_Ri&K-&p_gkAeWIs6@8KDBp`*UsFwOV(W+>{ z5}?b-h^WL@+C`-`0Jga7pR&@C65b*0MZm8G6l;wS34DyiZv!BjjW4Ksu{hcdms*lS z&7wQu)+bmu6E*g{roh{m!Kou0zF+QnUqPq7;0y|Qo}zrq-1EK%IvL0eqEbOcPY{%) zUJc~t02M7w(MqJN9_(GP1n_54Iij!-RbW>q@Ldr1mnK`aP8A;Q9#42)6-M~(0iB3TyT?IF zS9pcMd4NVZSZXLvXe(v&-EYsE3g+dd*m^tc{`n*x$oAkc#fJ%r@P14ySz z&H9+)uK?TYa8XwArxpJOSiD@cGTPB((pBbb%B%y{No6px1Os(@fHm?6%&3Y# zDE&fEuX1!}rYQ4}GH(HEZ7MUOXA%P%rEdq}O-G`3GJ2!pYAEwduzqsPf3qRA9xWBG zko3HIxU``k;nW)`jay|imz;R@DQ_kxlr#x=lYU0xBi+Pme zizoV=1iYi;&_q_}X2Oy2I{^65fMelS0?Y874rmr(nFHHSz)Q?^JA}Ef1GL=bR=8W3 z`yoIZU2aLQTOgkNZN|%h-f+1U9w6S8=u+k@K;Nh39uelQSl;uh;Svj2&BukgTL8)? zESjru&giHQg`WnfUm9E(!V>{aO@l8Bg)aiMBn`eQgjWMvmj+)au=M!n0KJ$7FAw35 z0ezVUbEWY-$sNZIqdYFHn2w1x0-HuiZb?XX8N!y{qol`_bP5Q4Q%H7T{Z;XCz$OK_ zwd*Tk@mB&`Ojzuyl0Vg)w;_2=kW;5-#lKSgNnpL5?$k*LF;yS2rsZ(*tmyR53#78cLY}czUW7EvawF zDF%LBz_E219+t8O&_jeHbr~P#-U;aCwA|Ce+@AvaDlPYA0?WA0sDynjF0Ex`p1CUI zWC3sMIFWhgx{%Wc_%O$b%rm!!oC|?p>Nt@(WJAbV4t$m4MD%$kl`Oyivc0$IpDh;Co*?W3^`u_|F`2%PAPlM4%xM< z;BEs~XolzjSsW7cKsqCZXl=?J4DKS=p`7u+3mxZc);v$kZE3MEzjhj#%YU#=BtccTCOP0)RGCZy||(3Ebt?#1#(m=vq52B%TCPuhPU) zhP))qat`Q4saeu{-;$7hEtt2LW?Pl-4T+mUdMT9{T0twgS=dtTPr&@ivE|PYBMtCF zD7FeV#*J`AEJ3lh{Bqbrc%De?08$S}l+CS{S~ujJ1^j{(juE0Z(uqPeSAcL;K(giJ z3nWc*2cV4s9NIbBK4*pOm%;q%2<$MkEu}Ebmr>308skcANN5~R1 zSI9mW%qz-Zmuj;x%T1s^E8iz6DDqx8mmgJTZ@ajGMWg+fOLp61x(a$E)W zsxoqf&8IoGx*S`;-sN(HJT>Wy!jnQj1nFlIxpC0@c&Cirr@bj`Q?aJ!)xxD6g2T_+ z;RC^?j8?$gkrUa5><{6-fCi<({}!0%7iJ2enQ3qpY)tJ&^cp~S25>m|qAO2>ki8Ym z7aZFyXjbPgA@QFe{osh{rs@+CD;?!|4REQc*ig};M})+7Amuw^deN7L#Ir$~>4>iA zsMxDR_BCMMTAFQZbW2El45a5AFh9WhZboh@XOMlf1M+kwK|^{&>mOSPDM+2!f55I2O37HX>TaM@Y8Hw+xkUma6>iAZ^F>Jg!(9 zR|Z+4JOi@$u%=#O5on_ss#m{)`jaYPZlJMZ6)(my?KzCpi%YB2LA(*J*e#T+NJ5Yt zq@ElgdT^(3hQI>=jSOIOCvz``1tFMc4W2h874s6mKrJ^979(1-gM2)B;Q9F zUgC0uXE0Q~A897Y^!SH}wWk!1A20#FmF}C&x&c{L2QTp`611G7p2}~4FBXt>)Jt@K zTJL!cktBVrFY-vB7c*CX1o&8zj(VCdsb$bAk!Ho4Arm1>s$qsR*^EIvwp**gqED05 zQFKY|!$5QwgG;@QACO= zKaUjiKAOz-1-*&xFI2I!LomKz z+>8dN4M7t8PK@#kI*^u6mliNg)bU<_{|gY%jY#4mK!pr7%*kk!H(@36H!At&MtV!G zkl3{=#Jg^TcuPMPZ`on-{?Y{cWHh?Ivv@ZQ6>s@W@m3UzcjI#LR{mAIoA!x!^Y7x_ z((GntzqN;Ww+|C<)y3l7xm>)v){A$~TjJgKvv?2GzlHhMbr$cTA>ysSP`pQO6mP>L z;ywDJcpESucKh^P>0_%zp9f80yoxQGG+>bZ*qh&@7!B9c^fk&W(<@`I_2%%_N^r zyNzp@F2~?jj4j{zDAO0MnV8cgNT_AF>L;#2LK|W5vs`!xjJT<|3QjdRUf&59dX1Y1 z!tVMOQ34j7T?jGtKjeNCN1rBwSZ@YMnbA`i%oPcAIo`Nvb zkN}ZNY57_LPn*%V!MTJS2DF$+2_qcm_9Jq}I?mIMLlK5Xv--##ug8S<$T=2eS%hEJ z!ia2w+d(2?J=IU2!_s_5Q5y4T#&Hv-o$EE$$FR)U4+6Z#{LGdLQkEUhpK-ZOP#@d6 z3rs!iQnYoiGJDv%!+~nTBE#{WI3Eexy8OtN=dGXuS*zf*f}^dwOc1KKkthL+vUQg` z^z~F!>&9xE(W#6S4go;V>Z+^Q*wtW{(O&e%k=i))novgr|km8JuC{Fi@(5 z7aZr(BXVAMoK=n^txKa>ecllc6Sk7m9c5YMeL-l>zY~e*_mLnp-w#0^&8V&WsmrLX z`=yI3%gbnz-3#SpG-*9hyqroHRjPq|#Yp2gzj-y~kI=0YiGBi?CU#XJ2p@p|tTN}qSd>-(vA{k{`# zK#@=ej)rG@&XBQFyU6YdH)ww?9qG5OC2i1tX)PD{8> za^DNim*g-|s)Ut}Qw1g|n{%h*NE*%RbH8wy(3_mKD9a)b3PN+9OC+M-BZAO; z3xhnGQG295+-64Yk∈%JM3p46pv@^B^F>29!_MhHGuY-4Y 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 e86EU{I_ezucQyB1_MEvGQcjWp literal 0 HcmV?d00001 diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/libspirv.cpp.o b/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/libspirv.cpp.o new file mode 100644 index 0000000000000000000000000000000000000000..8cf977e412102acbbc56b595a2a39f262879c74f GIT binary patch literal 294232 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�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 Z4qE=g=Gk)(Gv+@N@i$+^uU3k!|9^Mw!^!{v literal 0 HcmV?d00001 diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/link.txt b/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/link.txt new file mode 100644 index 000000000..d4c824b67 --- /dev/null +++ b/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/link.txt @@ -0,0 +1,2 @@ +/usr/bin/ar qc libSPIRV-Tools.a CMakeFiles/SPIRV-Tools.dir/util/bit_vector.cpp.o CMakeFiles/SPIRV-Tools.dir/util/parse_number.cpp.o CMakeFiles/SPIRV-Tools.dir/util/string_utils.cpp.o CMakeFiles/SPIRV-Tools.dir/assembly_grammar.cpp.o CMakeFiles/SPIRV-Tools.dir/binary.cpp.o CMakeFiles/SPIRV-Tools.dir/diagnostic.cpp.o CMakeFiles/SPIRV-Tools.dir/disassemble.cpp.o CMakeFiles/SPIRV-Tools.dir/enum_string_mapping.cpp.o CMakeFiles/SPIRV-Tools.dir/ext_inst.cpp.o CMakeFiles/SPIRV-Tools.dir/extensions.cpp.o CMakeFiles/SPIRV-Tools.dir/id_descriptor.cpp.o CMakeFiles/SPIRV-Tools.dir/libspirv.cpp.o CMakeFiles/SPIRV-Tools.dir/name_mapper.cpp.o CMakeFiles/SPIRV-Tools.dir/opcode.cpp.o CMakeFiles/SPIRV-Tools.dir/operand.cpp.o CMakeFiles/SPIRV-Tools.dir/parsed_operand.cpp.o CMakeFiles/SPIRV-Tools.dir/print.cpp.o CMakeFiles/SPIRV-Tools.dir/software_version.cpp.o CMakeFiles/SPIRV-Tools.dir/spirv_endian.cpp.o CMakeFiles/SPIRV-Tools.dir/spirv_optimizer_options.cpp.o CMakeFiles/SPIRV-Tools.dir/spirv_target_env.cpp.o CMakeFiles/SPIRV-Tools.dir/spirv_validator_options.cpp.o CMakeFiles/SPIRV-Tools.dir/table.cpp.o CMakeFiles/SPIRV-Tools.dir/text.cpp.o CMakeFiles/SPIRV-Tools.dir/text_handler.cpp.o CMakeFiles/SPIRV-Tools.dir/val/validate.cpp.o CMakeFiles/SPIRV-Tools.dir/val/validate_adjacency.cpp.o CMakeFiles/SPIRV-Tools.dir/val/validate_annotation.cpp.o CMakeFiles/SPIRV-Tools.dir/val/validate_arithmetics.cpp.o CMakeFiles/SPIRV-Tools.dir/val/validate_atomics.cpp.o CMakeFiles/SPIRV-Tools.dir/val/validate_barriers.cpp.o CMakeFiles/SPIRV-Tools.dir/val/validate_bitwise.cpp.o CMakeFiles/SPIRV-Tools.dir/val/validate_builtins.cpp.o CMakeFiles/SPIRV-Tools.dir/val/validate_capability.cpp.o CMakeFiles/SPIRV-Tools.dir/val/validate_cfg.cpp.o CMakeFiles/SPIRV-Tools.dir/val/validate_composites.cpp.o CMakeFiles/SPIRV-Tools.dir/val/validate_constants.cpp.o CMakeFiles/SPIRV-Tools.dir/val/validate_conversion.cpp.o CMakeFiles/SPIRV-Tools.dir/val/validate_datarules.cpp.o CMakeFiles/SPIRV-Tools.dir/val/validate_debug.cpp.o CMakeFiles/SPIRV-Tools.dir/val/validate_decorations.cpp.o CMakeFiles/SPIRV-Tools.dir/val/validate_derivatives.cpp.o CMakeFiles/SPIRV-Tools.dir/val/validate_ext_inst.cpp.o CMakeFiles/SPIRV-Tools.dir/val/validate_execution_limitations.cpp.o CMakeFiles/SPIRV-Tools.dir/val/validate_function.cpp.o CMakeFiles/SPIRV-Tools.dir/val/validate_id.cpp.o CMakeFiles/SPIRV-Tools.dir/val/validate_image.cpp.o CMakeFiles/SPIRV-Tools.dir/val/validate_interfaces.cpp.o CMakeFiles/SPIRV-Tools.dir/val/validate_instruction.cpp.o CMakeFiles/SPIRV-Tools.dir/val/validate_layout.cpp.o CMakeFiles/SPIRV-Tools.dir/val/validate_literals.cpp.o CMakeFiles/SPIRV-Tools.dir/val/validate_logicals.cpp.o CMakeFiles/SPIRV-Tools.dir/val/validate_memory.cpp.o CMakeFiles/SPIRV-Tools.dir/val/validate_mode_setting.cpp.o CMakeFiles/SPIRV-Tools.dir/val/validate_non_uniform.cpp.o CMakeFiles/SPIRV-Tools.dir/val/validate_primitives.cpp.o CMakeFiles/SPIRV-Tools.dir/val/validate_type.cpp.o CMakeFiles/SPIRV-Tools.dir/val/basic_block.cpp.o CMakeFiles/SPIRV-Tools.dir/val/construct.cpp.o CMakeFiles/SPIRV-Tools.dir/val/function.cpp.o CMakeFiles/SPIRV-Tools.dir/val/instruction.cpp.o CMakeFiles/SPIRV-Tools.dir/val/validation_state.cpp.o CMakeFiles/SPIRV-Tools.dir/util/timer.cpp.o +/usr/bin/ranlib libSPIRV-Tools.a diff --git a/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/name_mapper.cpp.o b/3rdparty/spirv-tools/build/source/CMakeFiles/SPIRV-Tools.dir/name_mapper.cpp.o new file mode 100644 index 0000000000000000000000000000000000000000..c994f8bbbfaf1d5277fc16ce383eae0ba11375b3 GIT binary patch literal 683760 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%0D&{-MC{Ib&w!-pAek;6X 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ψ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