Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 1 | /* |
Hans-Kristian Arntzen | f9818f0 | 2020-01-16 15:24:37 +0100 | [diff] [blame] | 2 | * Copyright 2015-2020 Arm Limited |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 3 | * |
| 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 | * you may not use this file except in compliance with the License. |
| 6 | * You may obtain a copy of the License at |
| 7 | * |
| 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
| 9 | * |
| 10 | * Unless required by applicable law or agreed to in writing, software |
| 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
| 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 | * See the License for the specific language governing permissions and |
| 14 | * limitations under the License. |
| 15 | */ |
| 16 | |
Hans-Kristian Arntzen | 147e53a | 2016-04-04 09:36:04 +0200 | [diff] [blame] | 17 | #include "spirv_cpp.hpp" |
grovesNL | 94cd777 | 2018-03-01 23:47:08 -0700 | [diff] [blame] | 18 | #include "spirv_cross_util.hpp" |
Bill Hollings | 77f5812 | 2017-08-11 14:54:58 -0400 | [diff] [blame] | 19 | #include "spirv_glsl.hpp" |
Robert Konrad | 216a681 | 2017-01-25 17:30:52 +0100 | [diff] [blame] | 20 | #include "spirv_hlsl.hpp" |
Hans-Kristian Arntzen | 24df8f0 | 2017-02-04 10:26:26 +0100 | [diff] [blame] | 21 | #include "spirv_msl.hpp" |
Hans-Kristian Arntzen | 5bcf02f | 2018-10-05 11:30:57 +0200 | [diff] [blame] | 22 | #include "spirv_parser.hpp" |
Brad Davis | 709d3c6 | 2018-06-03 11:16:37 -0700 | [diff] [blame] | 23 | #include "spirv_reflect.hpp" |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 24 | #include <algorithm> |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 25 | #include <cstdio> |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 26 | #include <cstring> |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 27 | #include <functional> |
| 28 | #include <limits> |
| 29 | #include <memory> |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 30 | #include <stdexcept> |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 31 | #include <unordered_map> |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 32 | #include <unordered_set> |
| 33 | |
Hans-Kristian Arntzen | 0b9a884 | 2019-05-24 15:23:29 +0200 | [diff] [blame] | 34 | #ifdef HAVE_SPIRV_CROSS_GIT_VERSION |
| 35 | #include "gitversion.h" |
| 36 | #endif |
| 37 | |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 38 | using namespace spv; |
Hans-Kristian Arntzen | 9b92e68 | 2019-03-29 10:29:44 +0100 | [diff] [blame] | 39 | using namespace SPIRV_CROSS_NAMESPACE; |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 40 | using namespace std; |
| 41 | |
Panagiotis Christopoulos Charitos | 7f69f93 | 2016-12-15 20:46:10 +0100 | [diff] [blame] | 42 | #ifdef SPIRV_CROSS_EXCEPTIONS_TO_ASSERTIONS |
Hans-Kristian Arntzen | d9cbc03 | 2017-09-08 09:33:34 +0200 | [diff] [blame] | 43 | static inline void THROW(const char *str) |
| 44 | { |
| 45 | fprintf(stderr, "SPIRV-Cross will abort: %s\n", str); |
| 46 | fflush(stderr); |
| 47 | abort(); |
| 48 | } |
Panagiotis Christopoulos Charitos | 7f69f93 | 2016-12-15 20:46:10 +0100 | [diff] [blame] | 49 | #else |
Hans-Kristian Arntzen | c92b839 | 2017-02-16 11:06:57 +0100 | [diff] [blame] | 50 | #define THROW(x) throw runtime_error(x) |
Panagiotis Christopoulos Charitos | 7f69f93 | 2016-12-15 20:46:10 +0100 | [diff] [blame] | 51 | #endif |
| 52 | |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 53 | struct CLIParser; |
| 54 | struct CLICallbacks |
| 55 | { |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 56 | void add(const char *cli, const function<void(CLIParser &)> &func) |
| 57 | { |
| 58 | callbacks[cli] = func; |
| 59 | } |
| 60 | unordered_map<string, function<void(CLIParser &)>> callbacks; |
| 61 | function<void()> error_handler; |
| 62 | function<void(const char *)> default_handler; |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 63 | }; |
| 64 | |
| 65 | struct CLIParser |
| 66 | { |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 67 | CLIParser(CLICallbacks cbs_, int argc_, char *argv_[]) |
| 68 | : cbs(move(cbs_)) |
| 69 | , argc(argc_) |
| 70 | , argv(argv_) |
| 71 | { |
| 72 | } |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 73 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 74 | bool parse() |
| 75 | { |
Panagiotis Christopoulos Charitos | 7f69f93 | 2016-12-15 20:46:10 +0100 | [diff] [blame] | 76 | #ifndef SPIRV_CROSS_EXCEPTIONS_TO_ASSERTIONS |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 77 | try |
Panagiotis Christopoulos Charitos | 7f69f93 | 2016-12-15 20:46:10 +0100 | [diff] [blame] | 78 | #endif |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 79 | { |
| 80 | while (argc && !ended_state) |
| 81 | { |
| 82 | const char *next = *argv++; |
| 83 | argc--; |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 84 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 85 | if (*next != '-' && cbs.default_handler) |
| 86 | { |
| 87 | cbs.default_handler(next); |
| 88 | } |
| 89 | else |
| 90 | { |
| 91 | auto itr = cbs.callbacks.find(next); |
| 92 | if (itr == ::end(cbs.callbacks)) |
| 93 | { |
Panagiotis Christopoulos Charitos | 7f69f93 | 2016-12-15 20:46:10 +0100 | [diff] [blame] | 94 | THROW("Invalid argument"); |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 95 | } |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 96 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 97 | itr->second(*this); |
| 98 | } |
| 99 | } |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 100 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 101 | return true; |
| 102 | } |
Panagiotis Christopoulos Charitos | 7f69f93 | 2016-12-15 20:46:10 +0100 | [diff] [blame] | 103 | #ifndef SPIRV_CROSS_EXCEPTIONS_TO_ASSERTIONS |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 104 | catch (...) |
| 105 | { |
| 106 | if (cbs.error_handler) |
| 107 | { |
| 108 | cbs.error_handler(); |
| 109 | } |
| 110 | return false; |
| 111 | } |
Panagiotis Christopoulos Charitos | 7f69f93 | 2016-12-15 20:46:10 +0100 | [diff] [blame] | 112 | #endif |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 113 | } |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 114 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 115 | void end() |
| 116 | { |
| 117 | ended_state = true; |
| 118 | } |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 119 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 120 | uint32_t next_uint() |
| 121 | { |
| 122 | if (!argc) |
| 123 | { |
Panagiotis Christopoulos Charitos | 7f69f93 | 2016-12-15 20:46:10 +0100 | [diff] [blame] | 124 | THROW("Tried to parse uint, but nothing left in arguments"); |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 125 | } |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 126 | |
Hans-Kristian Arntzen | 3a9b045 | 2018-06-03 12:00:22 +0200 | [diff] [blame] | 127 | uint64_t val = stoul(*argv); |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 128 | if (val > numeric_limits<uint32_t>::max()) |
| 129 | { |
Panagiotis Christopoulos Charitos | 7f69f93 | 2016-12-15 20:46:10 +0100 | [diff] [blame] | 130 | THROW("next_uint() out of range"); |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 131 | } |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 132 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 133 | argc--; |
| 134 | argv++; |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 135 | |
Hans-Kristian Arntzen | 3a9b045 | 2018-06-03 12:00:22 +0200 | [diff] [blame] | 136 | return uint32_t(val); |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 137 | } |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 138 | |
Chip Davis | b29f83c | 2020-04-10 01:13:33 -0500 | [diff] [blame] | 139 | uint32_t next_hex_uint() |
| 140 | { |
| 141 | if (!argc) |
| 142 | { |
| 143 | THROW("Tried to parse uint, but nothing left in arguments"); |
| 144 | } |
| 145 | |
| 146 | uint64_t val = stoul(*argv, nullptr, 16); |
| 147 | if (val > numeric_limits<uint32_t>::max()) |
| 148 | { |
| 149 | THROW("next_uint() out of range"); |
| 150 | } |
| 151 | |
| 152 | argc--; |
| 153 | argv++; |
| 154 | |
| 155 | return uint32_t(val); |
| 156 | } |
| 157 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 158 | double next_double() |
| 159 | { |
| 160 | if (!argc) |
| 161 | { |
Panagiotis Christopoulos Charitos | 7f69f93 | 2016-12-15 20:46:10 +0100 | [diff] [blame] | 162 | THROW("Tried to parse double, but nothing left in arguments"); |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 163 | } |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 164 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 165 | double val = stod(*argv); |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 166 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 167 | argc--; |
| 168 | argv++; |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 169 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 170 | return val; |
| 171 | } |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 172 | |
Brad Davis | 709d3c6 | 2018-06-03 11:16:37 -0700 | [diff] [blame] | 173 | // Return a string only if it's not prefixed with `--`, otherwise return the default value |
Brad Davis | 7620400 | 2018-06-20 10:25:38 -0700 | [diff] [blame] | 174 | const char *next_value_string(const char *default_value) |
Brad Davis | 709d3c6 | 2018-06-03 11:16:37 -0700 | [diff] [blame] | 175 | { |
| 176 | if (!argc) |
| 177 | { |
Brad Davis | 7620400 | 2018-06-20 10:25:38 -0700 | [diff] [blame] | 178 | return default_value; |
Brad Davis | 709d3c6 | 2018-06-03 11:16:37 -0700 | [diff] [blame] | 179 | } |
| 180 | |
| 181 | if (0 == strncmp("--", *argv, 2)) |
| 182 | { |
Brad Davis | 7620400 | 2018-06-20 10:25:38 -0700 | [diff] [blame] | 183 | return default_value; |
Brad Davis | 709d3c6 | 2018-06-03 11:16:37 -0700 | [diff] [blame] | 184 | } |
| 185 | |
| 186 | return next_string(); |
| 187 | } |
| 188 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 189 | const char *next_string() |
| 190 | { |
| 191 | if (!argc) |
| 192 | { |
Panagiotis Christopoulos Charitos | 7f69f93 | 2016-12-15 20:46:10 +0100 | [diff] [blame] | 193 | THROW("Tried to parse string, but nothing left in arguments"); |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 194 | } |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 195 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 196 | const char *ret = *argv; |
| 197 | argc--; |
| 198 | argv++; |
| 199 | return ret; |
| 200 | } |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 201 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 202 | CLICallbacks cbs; |
| 203 | int argc; |
| 204 | char **argv; |
| 205 | bool ended_state = false; |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 206 | }; |
| 207 | |
Hanno | 4560ee2 | 2020-04-09 17:30:20 +0200 | [diff] [blame] | 208 | #if defined(__clang__) || defined(__GNUC__) |
| 209 | #pragma GCC diagnostic push |
| 210 | #pragma GCC diagnostic ignored "-Wdeprecated-declarations" |
| 211 | #elif defined(_MSC_VER) |
| 212 | #pragma warning(push) |
| 213 | #pragma warning(disable : 4996) |
| 214 | #endif |
| 215 | |
Hans-Kristian Arntzen | 3fe57d3 | 2019-04-09 12:46:23 +0200 | [diff] [blame] | 216 | static vector<uint32_t> read_spirv_file(const char *path) |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 217 | { |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 218 | FILE *file = fopen(path, "rb"); |
| 219 | if (!file) |
| 220 | { |
Hans-Kristian Arntzen | 5bcf02f | 2018-10-05 11:30:57 +0200 | [diff] [blame] | 221 | fprintf(stderr, "Failed to open SPIR-V file: %s\n", path); |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 222 | return {}; |
| 223 | } |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 224 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 225 | fseek(file, 0, SEEK_END); |
| 226 | long len = ftell(file) / sizeof(uint32_t); |
| 227 | rewind(file); |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 228 | |
Hans-Kristian Arntzen | 3fe57d3 | 2019-04-09 12:46:23 +0200 | [diff] [blame] | 229 | vector<uint32_t> spirv(len); |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 230 | if (fread(spirv.data(), sizeof(uint32_t), len, file) != size_t(len)) |
| 231 | spirv.clear(); |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 232 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 233 | fclose(file); |
| 234 | return spirv; |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 235 | } |
| 236 | |
| 237 | static bool write_string_to_file(const char *path, const char *string) |
| 238 | { |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 239 | FILE *file = fopen(path, "w"); |
| 240 | if (!file) |
| 241 | { |
hesiod | ba38158 | 2017-05-30 17:17:51 +0300 | [diff] [blame] | 242 | fprintf(stderr, "Failed to write file: %s\n", path); |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 243 | return false; |
| 244 | } |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 245 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 246 | fprintf(file, "%s", string); |
| 247 | fclose(file); |
| 248 | return true; |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 249 | } |
| 250 | |
Hanno | 4560ee2 | 2020-04-09 17:30:20 +0200 | [diff] [blame] | 251 | #if defined(__clang__) || defined(__GNUC__) |
| 252 | #pragma GCC diagnostic pop |
| 253 | #elif defined(_MSC_VER) |
| 254 | #pragma warning(pop) |
| 255 | #endif |
| 256 | |
Hans-Kristian Arntzen | a489ba7 | 2019-04-02 11:19:03 +0200 | [diff] [blame] | 257 | static void print_resources(const Compiler &compiler, const char *tag, const SmallVector<Resource> &resources) |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 258 | { |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 259 | fprintf(stderr, "%s\n", tag); |
| 260 | fprintf(stderr, "=============\n\n"); |
Hans-Kristian Arntzen | ec45c9e | 2017-04-19 17:33:14 +0200 | [diff] [blame] | 261 | bool print_ssbo = !strcmp(tag, "ssbos"); |
| 262 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 263 | for (auto &res : resources) |
| 264 | { |
| 265 | auto &type = compiler.get_type(res.type_id); |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 266 | |
Hans-Kristian Arntzen | ec45c9e | 2017-04-19 17:33:14 +0200 | [diff] [blame] | 267 | if (print_ssbo && compiler.buffer_is_hlsl_counter_buffer(res.id)) |
| 268 | continue; |
| 269 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 270 | // If we don't have a name, use the fallback for the type instead of the variable |
| 271 | // for SSBOs and UBOs since those are the only meaningful names to use externally. |
| 272 | // Push constant blocks are still accessed by name and not block name, even though they are technically Blocks. |
| 273 | bool is_push_constant = compiler.get_storage_class(res.id) == StorageClassPushConstant; |
Hans-Kristian Arntzen | e8e5884 | 2018-03-12 13:09:25 +0100 | [diff] [blame] | 274 | bool is_block = compiler.get_decoration_bitset(type.self).get(DecorationBlock) || |
| 275 | compiler.get_decoration_bitset(type.self).get(DecorationBufferBlock); |
Hans-Kristian Arntzen | b9600aa | 2016-11-29 09:04:28 +0100 | [diff] [blame] | 276 | bool is_sized_block = is_block && (compiler.get_storage_class(res.id) == StorageClassUniform || |
| 277 | compiler.get_storage_class(res.id) == StorageClassUniformConstant); |
Hans-Kristian Arntzen | 333980a | 2019-09-05 12:43:40 +0200 | [diff] [blame] | 278 | ID fallback_id = !is_push_constant && is_block ? ID(res.base_type_id) : ID(res.id); |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 279 | |
Hans-Kristian Arntzen | 2d79d36 | 2016-11-28 15:01:36 +0100 | [diff] [blame] | 280 | uint32_t block_size = 0; |
Hans-Kristian Arntzen | e86018f | 2018-09-10 11:08:47 +0200 | [diff] [blame] | 281 | uint32_t runtime_array_stride = 0; |
Hans-Kristian Arntzen | b9600aa | 2016-11-29 09:04:28 +0100 | [diff] [blame] | 282 | if (is_sized_block) |
Hans-Kristian Arntzen | e86018f | 2018-09-10 11:08:47 +0200 | [diff] [blame] | 283 | { |
| 284 | auto &base_type = compiler.get_type(res.base_type_id); |
| 285 | block_size = uint32_t(compiler.get_declared_struct_size(base_type)); |
| 286 | runtime_array_stride = uint32_t(compiler.get_declared_struct_size_runtime_array(base_type, 1) - |
| 287 | compiler.get_declared_struct_size_runtime_array(base_type, 0)); |
| 288 | } |
Hans-Kristian Arntzen | 2d79d36 | 2016-11-28 15:01:36 +0100 | [diff] [blame] | 289 | |
Hans-Kristian Arntzen | 3a9b045 | 2018-06-03 12:00:22 +0200 | [diff] [blame] | 290 | Bitset mask; |
| 291 | if (print_ssbo) |
| 292 | mask = compiler.get_buffer_block_flags(res.id); |
| 293 | else |
| 294 | mask = compiler.get_decoration_bitset(res.id); |
| 295 | |
Hans-Kristian Arntzen | 5c24d99 | 2016-07-12 21:20:18 +0200 | [diff] [blame] | 296 | string array; |
| 297 | for (auto arr : type.array) |
| 298 | array = join("[", arr ? convert_to_string(arr) : "", "]") + array; |
| 299 | |
Hans-Kristian Arntzen | 333980a | 2019-09-05 12:43:40 +0200 | [diff] [blame] | 300 | fprintf(stderr, " ID %03u : %s%s", uint32_t(res.id), |
Hans-Kristian Arntzen | 5c24d99 | 2016-07-12 21:20:18 +0200 | [diff] [blame] | 301 | !res.name.empty() ? res.name.c_str() : compiler.get_fallback_name(fallback_id).c_str(), array.c_str()); |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 302 | |
Hans-Kristian Arntzen | e8e5884 | 2018-03-12 13:09:25 +0100 | [diff] [blame] | 303 | if (mask.get(DecorationLocation)) |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 304 | fprintf(stderr, " (Location : %u)", compiler.get_decoration(res.id, DecorationLocation)); |
Hans-Kristian Arntzen | e8e5884 | 2018-03-12 13:09:25 +0100 | [diff] [blame] | 305 | if (mask.get(DecorationDescriptorSet)) |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 306 | fprintf(stderr, " (Set : %u)", compiler.get_decoration(res.id, DecorationDescriptorSet)); |
Hans-Kristian Arntzen | e8e5884 | 2018-03-12 13:09:25 +0100 | [diff] [blame] | 307 | if (mask.get(DecorationBinding)) |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 308 | fprintf(stderr, " (Binding : %u)", compiler.get_decoration(res.id, DecorationBinding)); |
Hans-Kristian Arntzen | 941ccee | 2020-04-03 12:26:42 +0200 | [diff] [blame] | 309 | if (static_cast<const CompilerGLSL &>(compiler).variable_is_depth_or_compare(res.id)) |
| 310 | fprintf(stderr, " (comparison)"); |
Hans-Kristian Arntzen | e8e5884 | 2018-03-12 13:09:25 +0100 | [diff] [blame] | 311 | if (mask.get(DecorationInputAttachmentIndex)) |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 312 | fprintf(stderr, " (Attachment : %u)", compiler.get_decoration(res.id, DecorationInputAttachmentIndex)); |
Hans-Kristian Arntzen | e8e5884 | 2018-03-12 13:09:25 +0100 | [diff] [blame] | 313 | if (mask.get(DecorationNonReadable)) |
Hans-Kristian Arntzen | 97f7ab8 | 2017-01-05 18:16:33 +0100 | [diff] [blame] | 314 | fprintf(stderr, " writeonly"); |
Hans-Kristian Arntzen | e8e5884 | 2018-03-12 13:09:25 +0100 | [diff] [blame] | 315 | if (mask.get(DecorationNonWritable)) |
Hans-Kristian Arntzen | 97f7ab8 | 2017-01-05 18:16:33 +0100 | [diff] [blame] | 316 | fprintf(stderr, " readonly"); |
Hans-Kristian Arntzen | b9600aa | 2016-11-29 09:04:28 +0100 | [diff] [blame] | 317 | if (is_sized_block) |
Hans-Kristian Arntzen | e86018f | 2018-09-10 11:08:47 +0200 | [diff] [blame] | 318 | { |
Hans-Kristian Arntzen | 2d79d36 | 2016-11-28 15:01:36 +0100 | [diff] [blame] | 319 | fprintf(stderr, " (BlockSize : %u bytes)", block_size); |
Hans-Kristian Arntzen | e86018f | 2018-09-10 11:08:47 +0200 | [diff] [blame] | 320 | if (runtime_array_stride) |
| 321 | fprintf(stderr, " (Unsized array stride: %u bytes)", runtime_array_stride); |
| 322 | } |
Hans-Kristian Arntzen | ec45c9e | 2017-04-19 17:33:14 +0200 | [diff] [blame] | 323 | |
| 324 | uint32_t counter_id = 0; |
| 325 | if (print_ssbo && compiler.buffer_get_hlsl_counter_buffer(res.id, counter_id)) |
| 326 | fprintf(stderr, " (HLSL counter buffer ID: %u)", counter_id); |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 327 | fprintf(stderr, "\n"); |
| 328 | } |
| 329 | fprintf(stderr, "=============\n\n"); |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 330 | } |
| 331 | |
Hans-Kristian Arntzen | 042475e | 2016-07-28 11:16:02 +0200 | [diff] [blame] | 332 | static const char *execution_model_to_str(spv::ExecutionModel model) |
| 333 | { |
| 334 | switch (model) |
| 335 | { |
| 336 | case spv::ExecutionModelVertex: |
| 337 | return "vertex"; |
| 338 | case spv::ExecutionModelTessellationControl: |
| 339 | return "tessellation control"; |
| 340 | case ExecutionModelTessellationEvaluation: |
| 341 | return "tessellation evaluation"; |
| 342 | case ExecutionModelGeometry: |
| 343 | return "geometry"; |
| 344 | case ExecutionModelFragment: |
| 345 | return "fragment"; |
| 346 | case ExecutionModelGLCompute: |
| 347 | return "compute"; |
Hans-Kristian Arntzen | 88ce958 | 2019-03-27 10:21:30 +0100 | [diff] [blame] | 348 | case ExecutionModelRayGenerationNV: |
| 349 | return "raygenNV"; |
| 350 | case ExecutionModelIntersectionNV: |
| 351 | return "intersectionNV"; |
| 352 | case ExecutionModelCallableNV: |
| 353 | return "callableNV"; |
| 354 | case ExecutionModelAnyHitNV: |
| 355 | return "anyhitNV"; |
| 356 | case ExecutionModelClosestHitNV: |
| 357 | return "closesthitNV"; |
| 358 | case ExecutionModelMissNV: |
| 359 | return "missNV"; |
Hans-Kristian Arntzen | 042475e | 2016-07-28 11:16:02 +0200 | [diff] [blame] | 360 | default: |
| 361 | return "???"; |
| 362 | } |
| 363 | } |
| 364 | |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 365 | static void print_resources(const Compiler &compiler, const ShaderResources &res) |
| 366 | { |
Hans-Kristian Arntzen | e8e5884 | 2018-03-12 13:09:25 +0100 | [diff] [blame] | 367 | auto &modes = compiler.get_execution_mode_bitset(); |
Hans-Kristian Arntzen | 3c285a1 | 2016-07-04 13:30:05 +0200 | [diff] [blame] | 368 | |
Hans-Kristian Arntzen | 042475e | 2016-07-28 11:16:02 +0200 | [diff] [blame] | 369 | fprintf(stderr, "Entry points:\n"); |
Hans-Kristian Arntzen | eecbeaa | 2018-03-01 14:00:04 +0100 | [diff] [blame] | 370 | auto entry_points = compiler.get_entry_points_and_stages(); |
Hans-Kristian Arntzen | 042475e | 2016-07-28 11:16:02 +0200 | [diff] [blame] | 371 | for (auto &e : entry_points) |
Hans-Kristian Arntzen | eecbeaa | 2018-03-01 14:00:04 +0100 | [diff] [blame] | 372 | fprintf(stderr, " %s (%s)\n", e.name.c_str(), execution_model_to_str(e.execution_model)); |
Hans-Kristian Arntzen | 042475e | 2016-07-28 11:16:02 +0200 | [diff] [blame] | 373 | fprintf(stderr, "\n"); |
| 374 | |
Hans-Kristian Arntzen | 3c285a1 | 2016-07-04 13:30:05 +0200 | [diff] [blame] | 375 | fprintf(stderr, "Execution modes:\n"); |
Hans-Kristian Arntzen | e8e5884 | 2018-03-12 13:09:25 +0100 | [diff] [blame] | 376 | modes.for_each_bit([&](uint32_t i) { |
Hans-Kristian Arntzen | 3c285a1 | 2016-07-04 13:30:05 +0200 | [diff] [blame] | 377 | auto mode = static_cast<ExecutionMode>(i); |
| 378 | uint32_t arg0 = compiler.get_execution_mode_argument(mode, 0); |
| 379 | uint32_t arg1 = compiler.get_execution_mode_argument(mode, 1); |
| 380 | uint32_t arg2 = compiler.get_execution_mode_argument(mode, 2); |
| 381 | |
| 382 | switch (static_cast<ExecutionMode>(i)) |
| 383 | { |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 384 | case ExecutionModeInvocations: |
| 385 | fprintf(stderr, " Invocations: %u\n", arg0); |
| 386 | break; |
Hans-Kristian Arntzen | 3c285a1 | 2016-07-04 13:30:05 +0200 | [diff] [blame] | 387 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 388 | case ExecutionModeLocalSize: |
| 389 | fprintf(stderr, " LocalSize: (%u, %u, %u)\n", arg0, arg1, arg2); |
| 390 | break; |
Hans-Kristian Arntzen | 3c285a1 | 2016-07-04 13:30:05 +0200 | [diff] [blame] | 391 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 392 | case ExecutionModeOutputVertices: |
| 393 | fprintf(stderr, " OutputVertices: %u\n", arg0); |
| 394 | break; |
Hans-Kristian Arntzen | 3c285a1 | 2016-07-04 13:30:05 +0200 | [diff] [blame] | 395 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 396 | #define CHECK_MODE(m) \ |
| 397 | case ExecutionMode##m: \ |
| 398 | fprintf(stderr, " %s\n", #m); \ |
| 399 | break |
| 400 | CHECK_MODE(SpacingEqual); |
| 401 | CHECK_MODE(SpacingFractionalEven); |
| 402 | CHECK_MODE(SpacingFractionalOdd); |
| 403 | CHECK_MODE(VertexOrderCw); |
| 404 | CHECK_MODE(VertexOrderCcw); |
| 405 | CHECK_MODE(PixelCenterInteger); |
| 406 | CHECK_MODE(OriginUpperLeft); |
| 407 | CHECK_MODE(OriginLowerLeft); |
| 408 | CHECK_MODE(EarlyFragmentTests); |
| 409 | CHECK_MODE(PointMode); |
| 410 | CHECK_MODE(Xfb); |
| 411 | CHECK_MODE(DepthReplacing); |
| 412 | CHECK_MODE(DepthGreater); |
| 413 | CHECK_MODE(DepthLess); |
| 414 | CHECK_MODE(DepthUnchanged); |
| 415 | CHECK_MODE(LocalSizeHint); |
| 416 | CHECK_MODE(InputPoints); |
| 417 | CHECK_MODE(InputLines); |
| 418 | CHECK_MODE(InputLinesAdjacency); |
| 419 | CHECK_MODE(Triangles); |
| 420 | CHECK_MODE(InputTrianglesAdjacency); |
| 421 | CHECK_MODE(Quads); |
| 422 | CHECK_MODE(Isolines); |
| 423 | CHECK_MODE(OutputPoints); |
| 424 | CHECK_MODE(OutputLineStrip); |
| 425 | CHECK_MODE(OutputTriangleStrip); |
| 426 | CHECK_MODE(VecTypeHint); |
| 427 | CHECK_MODE(ContractionOff); |
Hans-Kristian Arntzen | 3c285a1 | 2016-07-04 13:30:05 +0200 | [diff] [blame] | 428 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 429 | default: |
| 430 | break; |
Hans-Kristian Arntzen | 3c285a1 | 2016-07-04 13:30:05 +0200 | [diff] [blame] | 431 | } |
Hans-Kristian Arntzen | e8e5884 | 2018-03-12 13:09:25 +0100 | [diff] [blame] | 432 | }); |
Hans-Kristian Arntzen | 3c285a1 | 2016-07-04 13:30:05 +0200 | [diff] [blame] | 433 | fprintf(stderr, "\n"); |
| 434 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 435 | print_resources(compiler, "subpass inputs", res.subpass_inputs); |
| 436 | print_resources(compiler, "inputs", res.stage_inputs); |
| 437 | print_resources(compiler, "outputs", res.stage_outputs); |
| 438 | print_resources(compiler, "textures", res.sampled_images); |
Hans-Kristian Arntzen | 378fbe8 | 2016-09-11 13:47:06 +0200 | [diff] [blame] | 439 | print_resources(compiler, "separate images", res.separate_images); |
Hans-Kristian Arntzen | e920208 | 2016-09-10 13:05:35 +0200 | [diff] [blame] | 440 | print_resources(compiler, "separate samplers", res.separate_samplers); |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 441 | print_resources(compiler, "images", res.storage_images); |
| 442 | print_resources(compiler, "ssbos", res.storage_buffers); |
| 443 | print_resources(compiler, "ubos", res.uniform_buffers); |
| 444 | print_resources(compiler, "push", res.push_constant_buffers); |
| 445 | print_resources(compiler, "counters", res.atomic_counters); |
Hans-Kristian Arntzen | 88ce958 | 2019-03-27 10:21:30 +0100 | [diff] [blame] | 446 | print_resources(compiler, "acceleration structures", res.acceleration_structures); |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 447 | } |
| 448 | |
Hans-Kristian Arntzen | a489ba7 | 2019-04-02 11:19:03 +0200 | [diff] [blame] | 449 | static void print_push_constant_resources(const Compiler &compiler, const SmallVector<Resource> &res) |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 450 | { |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 451 | for (auto &block : res) |
| 452 | { |
| 453 | auto ranges = compiler.get_active_buffer_ranges(block.id); |
| 454 | fprintf(stderr, "Active members in buffer: %s\n", |
| 455 | !block.name.empty() ? block.name.c_str() : compiler.get_fallback_name(block.id).c_str()); |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 456 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 457 | fprintf(stderr, "==================\n\n"); |
| 458 | for (auto &range : ranges) |
| 459 | { |
Hans-Kristian Arntzen | 5c24d99 | 2016-07-12 21:20:18 +0200 | [diff] [blame] | 460 | const auto &name = compiler.get_member_name(block.base_type_id, range.index); |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 461 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 462 | fprintf(stderr, "Member #%3u (%s): Offset: %4u, Range: %4u\n", range.index, |
| 463 | !name.empty() ? name.c_str() : compiler.get_fallback_member_name(range.index).c_str(), |
| 464 | unsigned(range.offset), unsigned(range.range)); |
| 465 | } |
| 466 | fprintf(stderr, "==================\n\n"); |
| 467 | } |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 468 | } |
| 469 | |
Hans-Kristian Arntzen | 6bd545b | 2016-09-17 15:16:07 +0200 | [diff] [blame] | 470 | static void print_spec_constants(const Compiler &compiler) |
| 471 | { |
| 472 | auto spec_constants = compiler.get_specialization_constants(); |
| 473 | fprintf(stderr, "Specialization constants\n"); |
| 474 | fprintf(stderr, "==================\n\n"); |
| 475 | for (auto &c : spec_constants) |
Hans-Kristian Arntzen | 333980a | 2019-09-05 12:43:40 +0200 | [diff] [blame] | 476 | fprintf(stderr, "ID: %u, Spec ID: %u\n", uint32_t(c.id), c.constant_id); |
Hans-Kristian Arntzen | 6bd545b | 2016-09-17 15:16:07 +0200 | [diff] [blame] | 477 | fprintf(stderr, "==================\n\n"); |
| 478 | } |
| 479 | |
Hans-Kristian Arntzen | 8d7a909 | 2017-08-15 15:27:53 +0200 | [diff] [blame] | 480 | static void print_capabilities_and_extensions(const Compiler &compiler) |
| 481 | { |
| 482 | fprintf(stderr, "Capabilities\n"); |
| 483 | fprintf(stderr, "============\n"); |
| 484 | for (auto &capability : compiler.get_declared_capabilities()) |
| 485 | fprintf(stderr, "Capability: %u\n", static_cast<unsigned>(capability)); |
| 486 | fprintf(stderr, "============\n\n"); |
| 487 | |
| 488 | fprintf(stderr, "Extensions\n"); |
| 489 | fprintf(stderr, "============\n"); |
| 490 | for (auto &ext : compiler.get_declared_extensions()) |
| 491 | fprintf(stderr, "Extension: %s\n", ext.c_str()); |
| 492 | fprintf(stderr, "============\n\n"); |
| 493 | } |
| 494 | |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 495 | struct PLSArg |
| 496 | { |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 497 | PlsFormat format; |
| 498 | string name; |
| 499 | }; |
| 500 | |
| 501 | struct Remap |
| 502 | { |
| 503 | string src_name; |
| 504 | string dst_name; |
| 505 | unsigned components; |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 506 | }; |
| 507 | |
Panagiotis Christopoulos Charitos | 66e76d9 | 2016-09-20 10:17:41 +0200 | [diff] [blame] | 508 | struct VariableTypeRemap |
| 509 | { |
| 510 | string variable_name; |
| 511 | string new_variable_type; |
| 512 | }; |
| 513 | |
Hans-Kristian Arntzen | d89d0e0 | 2017-07-24 09:29:20 +0200 | [diff] [blame] | 514 | struct InterfaceVariableRename |
| 515 | { |
| 516 | StorageClass storageClass; |
| 517 | uint32_t location; |
| 518 | string variable_name; |
Jason Chan | 3281e82 | 2017-06-25 15:16:09 +0200 | [diff] [blame] | 519 | }; |
| 520 | |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 521 | struct CLIArguments |
| 522 | { |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 523 | const char *input = nullptr; |
| 524 | const char *output = nullptr; |
| 525 | const char *cpp_interface_name = nullptr; |
| 526 | uint32_t version = 0; |
Hans-Kristian Arntzen | 2e3c6ec | 2017-02-16 11:17:12 +0100 | [diff] [blame] | 527 | uint32_t shader_model = 0; |
Bill Hollings | bac657d | 2017-11-07 15:38:13 -0500 | [diff] [blame] | 528 | uint32_t msl_version = 0; |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 529 | bool es = false; |
| 530 | bool set_version = false; |
Hans-Kristian Arntzen | 2e3c6ec | 2017-02-16 11:17:12 +0100 | [diff] [blame] | 531 | bool set_shader_model = false; |
Bill Hollings | bac657d | 2017-11-07 15:38:13 -0500 | [diff] [blame] | 532 | bool set_msl_version = false; |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 533 | bool set_es = false; |
| 534 | bool dump_resources = false; |
| 535 | bool force_temporary = false; |
| 536 | bool flatten_ubo = false; |
| 537 | bool fixup = false; |
Hans-Kristian Arntzen | bdfa97a | 2017-08-03 13:02:59 +0200 | [diff] [blame] | 538 | bool yflip = false; |
Hans-Kristian Arntzen | 36650c8 | 2017-05-22 15:30:43 +0200 | [diff] [blame] | 539 | bool sso = false; |
Hans-Kristian Arntzen | b29629f | 2018-06-22 10:01:38 +0200 | [diff] [blame] | 540 | bool support_nonzero_baseinstance = true; |
Chip Davis | c51e5b7 | 2019-01-08 16:33:32 -0600 | [diff] [blame] | 541 | bool msl_capture_output_to_buffer = false; |
Chip Davis | 2583321 | 2018-09-19 20:36:33 -0500 | [diff] [blame] | 542 | bool msl_swizzle_texture_samples = false; |
Chip Davis | 3a9af96 | 2018-09-26 20:06:05 -0500 | [diff] [blame] | 543 | bool msl_ios = false; |
Hans-Kristian Arntzen | b8033d7 | 2019-01-14 14:53:47 +0100 | [diff] [blame] | 544 | bool msl_pad_fragment_output = false; |
Chip Davis | 41d9424 | 2019-02-05 23:47:50 -0600 | [diff] [blame] | 545 | bool msl_domain_lower_left = false; |
Hans-Kristian Arntzen | e47a77d | 2019-03-14 10:29:34 +0100 | [diff] [blame] | 546 | bool msl_argument_buffers = false; |
Hans-Kristian Arntzen | fc4f39b | 2019-04-23 12:17:21 +0200 | [diff] [blame] | 547 | bool msl_texture_buffer_native = false; |
Lukas Hermanns | f3a6d28 | 2019-09-27 15:49:54 -0400 | [diff] [blame] | 548 | bool msl_framebuffer_fetch = false; |
Lukas Hermanns | ffbd801 | 2019-10-09 11:22:25 -0400 | [diff] [blame] | 549 | bool msl_invariant_float_math = false; |
Lukas Hermanns | f3a6d28 | 2019-09-27 15:49:54 -0400 | [diff] [blame] | 550 | bool msl_emulate_cube_array = false; |
Chip Davis | 7eecf5a | 2019-05-31 12:06:20 -0500 | [diff] [blame] | 551 | bool msl_multiview = false; |
Chip Davis | cab7335 | 2020-08-23 16:44:41 -0500 | [diff] [blame] | 552 | bool msl_multiview_layered_rendering = true; |
Chip Davis | 6a58554 | 2019-07-12 21:50:50 -0500 | [diff] [blame] | 553 | bool msl_view_index_from_device_index = false; |
Chip Davis | fb5ee4c | 2019-07-22 13:08:04 -0500 | [diff] [blame] | 554 | bool msl_dispatch_base = false; |
Akio Gaule | 1280df6 | 2019-11-27 01:02:46 -0800 | [diff] [blame] | 555 | bool msl_decoration_binding = false; |
Hans-Kristian Arntzen | c3bd136 | 2020-01-16 11:07:30 +0100 | [diff] [blame] | 556 | bool msl_force_active_argument_buffer_resources = false; |
Hans-Kristian Arntzen | c9d4f9c | 2020-02-24 12:47:14 +0100 | [diff] [blame] | 557 | bool msl_force_native_arrays = false; |
Chip Davis | b29f83c | 2020-04-10 01:13:33 -0500 | [diff] [blame] | 558 | bool msl_enable_frag_depth_builtin = true; |
| 559 | bool msl_enable_frag_stencil_ref_builtin = true; |
| 560 | uint32_t msl_enable_frag_output_mask = 0xffffffff; |
Hans-Kristian Arntzen | ebf4636 | 2020-04-20 09:48:20 +0200 | [diff] [blame] | 561 | bool msl_enable_clip_distance_user_varying = true; |
Chip Davis | 688c5fc | 2020-02-20 21:38:28 -0600 | [diff] [blame] | 562 | bool msl_multi_patch_workgroup = false; |
| 563 | bool msl_vertex_for_tessellation = false; |
Tomek Ponitka | 18f23c4 | 2020-07-22 18:37:17 +0200 | [diff] [blame] | 564 | uint32_t msl_additional_fixed_sample_mask = 0xffffffff; |
Chip Davis | 4cf840e | 2020-08-27 19:24:20 -0500 | [diff] [blame] | 565 | bool msl_arrayed_subpass_input = false; |
Chip Davis | 21d38f7 | 2020-10-13 13:20:49 -0500 | [diff] [blame^] | 566 | uint32_t msl_r32ui_linear_texture_alignment = 4; |
| 567 | uint32_t msl_r32ui_alignment_constant_id = 65535; |
Hans-Kristian Arntzen | 0474848 | 2019-03-19 10:58:37 +0100 | [diff] [blame] | 568 | bool glsl_emit_push_constant_as_ubo = false; |
Laszlo Agocs | 7bc3149 | 2019-05-11 16:30:33 +0200 | [diff] [blame] | 569 | bool glsl_emit_ubo_as_plain_uniforms = false; |
Hans-Kristian Arntzen | 57c93d4 | 2020-07-28 15:15:24 +0200 | [diff] [blame] | 570 | bool glsl_force_flattened_io_blocks = false; |
Hans-Kristian Arntzen | 04e877d | 2020-03-19 14:20:37 +0100 | [diff] [blame] | 571 | SmallVector<pair<uint32_t, uint32_t>> glsl_ext_framebuffer_fetch; |
Hans-Kristian Arntzen | 12ca9d1 | 2019-07-25 11:07:14 +0200 | [diff] [blame] | 572 | bool vulkan_glsl_disable_ext_samplerless_texture_functions = false; |
Hans-Kristian Arntzen | 65af09d | 2019-05-28 13:41:46 +0200 | [diff] [blame] | 573 | bool emit_line_directives = false; |
Hans-Kristian Arntzen | 95cd20f | 2020-03-04 16:41:00 +0100 | [diff] [blame] | 574 | bool enable_storage_image_qualifier_deduction = true; |
Hans-Kristian Arntzen | b8905bb | 2020-03-26 11:21:23 +0100 | [diff] [blame] | 575 | bool force_zero_initialized_variables = false; |
Hans-Kristian Arntzen | a489ba7 | 2019-04-02 11:19:03 +0200 | [diff] [blame] | 576 | SmallVector<uint32_t> msl_discrete_descriptor_sets; |
Hans-Kristian Arntzen | 4bb673a | 2019-10-14 12:51:48 +0200 | [diff] [blame] | 577 | SmallVector<uint32_t> msl_device_argument_buffers; |
Chip Davis | cb35934 | 2019-09-05 23:14:12 -0500 | [diff] [blame] | 578 | SmallVector<pair<uint32_t, uint32_t>> msl_dynamic_buffers; |
Chip Davis | fedbc35 | 2019-12-16 22:58:16 -0600 | [diff] [blame] | 579 | SmallVector<pair<uint32_t, uint32_t>> msl_inline_uniform_blocks; |
Chip Davis | 5281d99 | 2020-06-13 23:03:30 -0500 | [diff] [blame] | 580 | SmallVector<MSLShaderInput> msl_shader_inputs; |
Hans-Kristian Arntzen | a489ba7 | 2019-04-02 11:19:03 +0200 | [diff] [blame] | 581 | SmallVector<PLSArg> pls_in; |
| 582 | SmallVector<PLSArg> pls_out; |
| 583 | SmallVector<Remap> remaps; |
| 584 | SmallVector<string> extensions; |
| 585 | SmallVector<VariableTypeRemap> variable_type_remaps; |
| 586 | SmallVector<InterfaceVariableRename> interface_variable_renames; |
| 587 | SmallVector<HLSLVertexAttributeRemap> hlsl_attr_remap; |
Hans-Kristian Arntzen | 042475e | 2016-07-28 11:16:02 +0200 | [diff] [blame] | 588 | string entry; |
Hans-Kristian Arntzen | eecbeaa | 2018-03-01 14:00:04 +0100 | [diff] [blame] | 589 | string entry_stage; |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 590 | |
Hans-Kristian Arntzen | eecbeaa | 2018-03-01 14:00:04 +0100 | [diff] [blame] | 591 | struct Rename |
| 592 | { |
| 593 | string old_name; |
| 594 | string new_name; |
| 595 | ExecutionModel execution_model; |
| 596 | }; |
Hans-Kristian Arntzen | a489ba7 | 2019-04-02 11:19:03 +0200 | [diff] [blame] | 597 | SmallVector<Rename> entry_point_rename; |
Hans-Kristian Arntzen | 4427cb9 | 2017-11-13 13:49:11 +0100 | [diff] [blame] | 598 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 599 | uint32_t iterations = 1; |
| 600 | bool cpp = false; |
Brad Davis | 709d3c6 | 2018-06-03 11:16:37 -0700 | [diff] [blame] | 601 | string reflect; |
Bill Hollings | 5ad73f3 | 2017-03-19 21:06:21 -0400 | [diff] [blame] | 602 | bool msl = false; |
Robert Konrad | 216a681 | 2017-01-25 17:30:52 +0100 | [diff] [blame] | 603 | bool hlsl = false; |
Hans-Kristian Arntzen | 17d88ca | 2017-05-04 10:10:30 +0200 | [diff] [blame] | 604 | bool hlsl_compat = false; |
Hans-Kristian Arntzen | a2a44d9 | 2019-01-11 10:32:14 +0100 | [diff] [blame] | 605 | bool hlsl_support_nonzero_base = false; |
Hans-Kristian Arntzen | c27e1ef | 2020-03-04 16:32:52 +0100 | [diff] [blame] | 606 | bool hlsl_force_storage_buffer_as_uav = false; |
Hans-Kristian Arntzen | 28bf905 | 2020-04-03 11:21:41 +0200 | [diff] [blame] | 607 | bool hlsl_nonwritable_uav_texture_as_srv = false; |
Hans-Kristian Arntzen | 2d52006 | 2020-06-04 11:35:21 +0200 | [diff] [blame] | 608 | bool hlsl_enable_16bit_types = false; |
Hans-Kristian Arntzen | e38cbb9 | 2019-11-12 10:49:01 +0100 | [diff] [blame] | 609 | HLSLBindingFlags hlsl_binding_flags = 0; |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 610 | bool vulkan_semantics = false; |
Hans-Kristian Arntzen | 470ae7a | 2017-05-22 17:40:00 +0200 | [diff] [blame] | 611 | bool flatten_multidimensional_arrays = false; |
Hans-Kristian Arntzen | 6599a41 | 2017-09-08 09:56:06 +0200 | [diff] [blame] | 612 | bool use_420pack_extension = true; |
Hans-Kristian Arntzen | f61a5d1 | 2016-08-26 12:58:50 +0200 | [diff] [blame] | 613 | bool remove_unused = false; |
Hans-Kristian Arntzen | ba15dae | 2018-05-23 20:34:26 +0100 | [diff] [blame] | 614 | bool combined_samplers_inherit_bindings = false; |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 615 | }; |
| 616 | |
Hans-Kristian Arntzen | 0b9a884 | 2019-05-24 15:23:29 +0200 | [diff] [blame] | 617 | static void print_version() |
| 618 | { |
| 619 | #ifdef HAVE_SPIRV_CROSS_GIT_VERSION |
| 620 | fprintf(stderr, "%s\n", SPIRV_CROSS_GIT_REVISION); |
| 621 | #else |
| 622 | fprintf(stderr, "Git revision unknown. Build with CMake to create timestamp and revision info.\n"); |
| 623 | #endif |
| 624 | } |
| 625 | |
Hans-Kristian Arntzen | 165392a | 2020-05-28 13:23:33 +0200 | [diff] [blame] | 626 | static void print_help_backend() |
| 627 | { |
Hans-Kristian Arntzen | d573a95 | 2020-07-01 11:42:58 +0200 | [diff] [blame] | 628 | // clang-format off |
Hans-Kristian Arntzen | 165392a | 2020-05-28 13:23:33 +0200 | [diff] [blame] | 629 | fprintf(stderr, "\nSelect backend:\n" |
| 630 | "\tBy default, OpenGL-style GLSL is the target, with #version and GLSL/ESSL information inherited from the SPIR-V module if present.\n" |
| 631 | "\t[--vulkan-semantics] or [-V]:\n\t\tEmit Vulkan GLSL instead of plain GLSL. Makes use of Vulkan-only features to match SPIR-V.\n" |
| 632 | "\t[--msl]:\n\t\tEmit Metal Shading Language (MSL).\n" |
| 633 | "\t[--hlsl]:\n\t\tEmit HLSL.\n" |
| 634 | "\t[--reflect]:\n\t\tEmit JSON reflection.\n" |
| 635 | "\t[--cpp]:\n\t\tDEPRECATED. Emits C++ code.\n" |
| 636 | ); |
Hans-Kristian Arntzen | d573a95 | 2020-07-01 11:42:58 +0200 | [diff] [blame] | 637 | // clang-format on |
Hans-Kristian Arntzen | 165392a | 2020-05-28 13:23:33 +0200 | [diff] [blame] | 638 | } |
| 639 | |
| 640 | static void print_help_glsl() |
| 641 | { |
Hans-Kristian Arntzen | d573a95 | 2020-07-01 11:42:58 +0200 | [diff] [blame] | 642 | // clang-format off |
Hans-Kristian Arntzen | 165392a | 2020-05-28 13:23:33 +0200 | [diff] [blame] | 643 | fprintf(stderr, "\nGLSL options:\n" |
| 644 | "\t[--es]:\n\t\tForce ESSL.\n" |
| 645 | "\t[--no-es]:\n\t\tForce desktop GLSL.\n" |
| 646 | "\t[--version <GLSL version>]:\n\t\tE.g. --version 450 will emit '#version 450' in shader.\n" |
| 647 | "\t\tCode generation will depend on the version used.\n" |
| 648 | "\t[--flatten-ubo]:\n\t\tEmit UBOs as plain uniform arrays which are suitable for use with glUniform4*v().\n" |
| 649 | "\t\tThis can be an optimization on GL implementations where this is faster or works around buggy driver implementations.\n" |
| 650 | "\t\tE.g.: uniform MyUBO { vec4 a; float b, c, d, e; }; will be emitted as uniform vec4 MyUBO[2];\n" |
| 651 | "\t\tCaveat: You cannot mix and match floating-point and integer in the same UBO with this option.\n" |
| 652 | "\t\tLegacy GLSL/ESSL (where this flattening makes sense) does not support bit-casting, which would have been the obvious workaround.\n" |
| 653 | "\t[--extension ext]:\n\t\tAdd #extension string of your choosing to GLSL output.\n" |
| 654 | "\t\tUseful if you use variable name remapping to something that requires an extension unknown to SPIRV-Cross.\n" |
| 655 | "\t[--remove-unused-variables]:\n\t\tDo not emit interface variables which are not statically accessed by the shader.\n" |
| 656 | "\t[--separate-shader-objects]:\n\t\tRedeclare gl_PerVertex blocks to be suitable for desktop GL separate shader objects.\n" |
| 657 | "\t[--glsl-emit-push-constant-as-ubo]:\n\t\tInstead of a plain uniform of struct for push constants, emit a UBO block instead.\n" |
| 658 | "\t[--glsl-emit-ubo-as-plain-uniforms]:\n\t\tInstead of emitting UBOs, emit them as plain uniform structs.\n" |
| 659 | "\t[--glsl-remap-ext-framebuffer-fetch input-attachment color-location]:\n\t\tRemaps an input attachment to use GL_EXT_shader_framebuffer_fetch.\n" |
| 660 | "\t\tgl_LastFragData[location] is read from. The attachment to read from must be declared as an output in the shader.\n" |
| 661 | "\t[--vulkan-glsl-disable-ext-samplerless-texture-functions]:\n\t\tDo not allow use of GL_EXT_samperless_texture_functions, even in Vulkan GLSL.\n" |
| 662 | "\t\tUse of texelFetch and similar might have to create dummy samplers to work around it.\n" |
| 663 | "\t[--combined-samplers-inherit-bindings]:\n\t\tInherit binding information from the textures when building combined image samplers from separate textures and samplers.\n" |
| 664 | "\t[--no-support-nonzero-baseinstance]:\n\t\tWhen using gl_InstanceIndex with desktop GL,\n" |
| 665 | "\t\tassume that base instance is always 0, and do not attempt to fix up gl_InstanceID to match Vulkan semantics.\n" |
| 666 | "\t[--pls-in format input-name]:\n\t\tRemaps a subpass input with name into a GL_EXT_pixel_local_storage input.\n" |
| 667 | "\t\tEntry in PLS block is ordered where first --pls-in marks the first entry. Can be called multiple times.\n" |
| 668 | "\t\tFormats allowed: r11f_g11f_b10f, r32f, rg16f, rg16, rgb10_a2, rgba8, rgba8i, rgba8ui, rg16i, rgb10_a2ui, rg16ui, r32ui.\n" |
| 669 | "\t\tRequires ESSL.\n" |
| 670 | "\t[--pls-out format output-name]:\n\t\tRemaps a color output with name into a GL_EXT_pixel_local_storage output.\n" |
| 671 | "\t\tEntry in PLS block is ordered where first --pls-output marks the first entry. Can be called multiple times.\n" |
| 672 | "\t\tFormats allowed: r11f_g11f_b10f, r32f, rg16f, rg16, rgb10_a2, rgba8, rgba8i, rgba8ui, rg16i, rgb10_a2ui, rg16ui, r32ui.\n" |
| 673 | "\t\tRequires ESSL.\n" |
| 674 | "\t[--remap source_name target_name components]:\n\t\tRemaps a variable to a different name with N components.\n" |
| 675 | "\t\tMain use case is to remap a subpass input to gl_LastFragDepthARM.\n" |
| 676 | "\t\tE.g.:\n" |
| 677 | "\t\tuniform subpassInput uDepth;\n" |
| 678 | "\t\t--remap uDepth gl_LastFragDepthARM 1 --extension GL_ARM_shader_framebuffer_fetch_depth_stencil\n" |
| 679 | "\t[--no-420pack-extension]:\n\t\tDo not make use of GL_ARB_shading_language_420pack in older GL targets to support layout(binding).\n" |
| 680 | "\t[--remap-variable-type <variable_name> <new_variable_type>]:\n\t\tRemaps a variable type based on name.\n" |
| 681 | "\t\tPrimary use case is supporting external samplers in ESSL for video rendering on Android where you could remap a texture to a YUV one.\n" |
Hans-Kristian Arntzen | 57c93d4 | 2020-07-28 15:15:24 +0200 | [diff] [blame] | 682 | "\t[--glsl-force-flattened-io-blocks]:\n\t\tAlways flatten I/O blocks and structs.\n" |
Hans-Kristian Arntzen | 165392a | 2020-05-28 13:23:33 +0200 | [diff] [blame] | 683 | ); |
Hans-Kristian Arntzen | d573a95 | 2020-07-01 11:42:58 +0200 | [diff] [blame] | 684 | // clang-format on |
Hans-Kristian Arntzen | 165392a | 2020-05-28 13:23:33 +0200 | [diff] [blame] | 685 | } |
| 686 | |
| 687 | static void print_help_hlsl() |
| 688 | { |
Hans-Kristian Arntzen | d573a95 | 2020-07-01 11:42:58 +0200 | [diff] [blame] | 689 | // clang-format off |
Hans-Kristian Arntzen | 165392a | 2020-05-28 13:23:33 +0200 | [diff] [blame] | 690 | fprintf(stderr, "\nHLSL options:\n" |
| 691 | "\t[--shader-model]:\n\t\tEnables a specific shader model, e.g. --shader-model 50 for SM 5.0.\n" |
| 692 | "\t[--hlsl-enable-compat]:\n\t\tAllow point size and point coord to be used, even if they won't work as expected.\n" |
| 693 | "\t\tPointSize is ignored, and PointCoord returns (0.5, 0.5).\n" |
| 694 | "\t[--hlsl-support-nonzero-basevertex-baseinstance]:\n\t\tSupport base vertex and base instance by emitting a special cbuffer declared as:\n" |
| 695 | "\t\tcbuffer SPIRV_Cross_VertexInfo { int SPIRV_Cross_BaseVertex; int SPIRV_Cross_BaseInstance; };\n" |
| 696 | "\t[--hlsl-auto-binding (push, cbv, srv, uav, sampler, all)]\n" |
| 697 | "\t\tDo not emit any : register(#) bindings for specific resource types, and rely on HLSL compiler to assign something.\n" |
| 698 | "\t[--hlsl-force-storage-buffer-as-uav]:\n\t\tAlways emit SSBOs as UAVs, even when marked as read-only.\n" |
| 699 | "\t\tNormally, SSBOs marked with NonWritable will be emitted as SRVs.\n" |
| 700 | "\t[--hlsl-nonwritable-uav-texture-as-srv]:\n\t\tEmit NonWritable storage images as SRV textures instead of UAV.\n" |
| 701 | "\t\tUsing this option messes with the type system. SPIRV-Cross cannot guarantee that this will work.\n" |
| 702 | "\t\tOne major problem area with this feature is function arguments, where we won't know if we're seeing a UAV or SRV.\n" |
| 703 | "\t\tShader must ensure that read/write state is consistent at all call sites.\n" |
| 704 | "\t[--set-hlsl-vertex-input-semantic <location> <semantic>]:\n\t\tEmits a specific vertex input semantic for a given location.\n" |
| 705 | "\t\tOtherwise, TEXCOORD# is used as semantics, where # is location.\n" |
Hans-Kristian Arntzen | 2d52006 | 2020-06-04 11:35:21 +0200 | [diff] [blame] | 706 | "\t[--hlsl-enable-16bit-types]:\n\t\tEnables native use of half/int16_t/uint16_t and ByteAddressBuffer interaction with these types. Requires SM 6.2.\n" |
Hans-Kristian Arntzen | 165392a | 2020-05-28 13:23:33 +0200 | [diff] [blame] | 707 | ); |
Hans-Kristian Arntzen | d573a95 | 2020-07-01 11:42:58 +0200 | [diff] [blame] | 708 | // clang-format on |
Hans-Kristian Arntzen | 165392a | 2020-05-28 13:23:33 +0200 | [diff] [blame] | 709 | } |
| 710 | |
| 711 | static void print_help_msl() |
| 712 | { |
Hans-Kristian Arntzen | d573a95 | 2020-07-01 11:42:58 +0200 | [diff] [blame] | 713 | // clang-format off |
Hans-Kristian Arntzen | 165392a | 2020-05-28 13:23:33 +0200 | [diff] [blame] | 714 | fprintf(stderr, "\nMSL options:\n" |
| 715 | "\t[--msl-version <MMmmpp>]:\n\t\tUses a specific MSL version, e.g. --msl-version 20100 for MSL 2.1.\n" |
| 716 | "\t[--msl-capture-output]:\n\t\tWrites geometry varyings to a buffer instead of as stage-outputs.\n" |
| 717 | "\t[--msl-swizzle-texture-samples]:\n\t\tWorks around lack of support for VkImageView component swizzles.\n" |
| 718 | "\t\tThis has a massive impact on performance and bloat. Do not use this unless you are absolutely forced to.\n" |
| 719 | "\t\tTo use this feature, the API side must pass down swizzle buffers.\n" |
| 720 | "\t\tShould only be used by translation layers as a last resort.\n" |
| 721 | "\t\tRecent Metal versions do not require this workaround.\n" |
| 722 | "\t[--msl-ios]:\n\t\tTarget iOS Metal instead of macOS Metal.\n" |
| 723 | "\t[--msl-pad-fragment-output]:\n\t\tAlways emit color outputs as 4-component variables.\n" |
| 724 | "\t\tIn Metal, the fragment shader must emit at least as many components as the render target format.\n" |
| 725 | "\t[--msl-domain-lower-left]:\n\t\tUse a lower-left tessellation domain.\n" |
| 726 | "\t[--msl-argument-buffers]:\n\t\tEmit Indirect Argument buffers instead of plain bindings.\n" |
| 727 | "\t\tRequires MSL 2.0 to be enabled.\n" |
| 728 | "\t[--msl-texture-buffer-native]:\n\t\tEnable native support for texel buffers. Otherwise, it is emulated as a normal texture.\n" |
| 729 | "\t[--msl-framebuffer-fetch]:\n\t\tImplement subpass inputs with frame buffer fetch.\n" |
| 730 | "\t\tEmits [[color(N)]] inputs in fragment stage.\n" |
| 731 | "\t\tRequires iOS Metal.\n" |
| 732 | "\t[--msl-emulate-cube-array]:\n\t\tEmulate cube arrays with 2D array and manual math.\n" |
| 733 | "\t[--msl-discrete-descriptor-set <index>]:\n\t\tWhen using argument buffers, forces a specific descriptor set to be implemented without argument buffers.\n" |
| 734 | "\t\tUseful for implementing push descriptors in emulation layers.\n" |
| 735 | "\t\tCan be used multiple times for each descriptor set in question.\n" |
| 736 | "\t[--msl-device-argument-buffer <descriptor set index>]:\n\t\tUse device address space to hold indirect argument buffers instead of constant.\n" |
| 737 | "\t\tComes up when trying to support argument buffers which are larger than 64 KiB.\n" |
| 738 | "\t[--msl-multiview]:\n\t\tEnable SPV_KHR_multiview emulation.\n" |
Chip Davis | cab7335 | 2020-08-23 16:44:41 -0500 | [diff] [blame] | 739 | "\t[--msl-multiview-no-layered-rendering]:\n\t\tDon't set [[render_target_array_index]] in multiview shaders.\n" |
| 740 | "\t\tUseful for devices which don't support layered rendering. Only effective when --msl-multiview is enabled.\n" |
Hans-Kristian Arntzen | 165392a | 2020-05-28 13:23:33 +0200 | [diff] [blame] | 741 | "\t[--msl-view-index-from-device-index]:\n\t\tTreat the view index as the device index instead.\n" |
| 742 | "\t\tFor multi-GPU rendering.\n" |
| 743 | "\t[--msl-dispatch-base]:\n\t\tAdd support for vkCmdDispatchBase() or similar APIs.\n" |
| 744 | "\t\tOffsets the workgroup ID based on a buffer.\n" |
| 745 | "\t[--msl-dynamic-buffer <set index> <binding>]:\n\t\tMarks a buffer as having dynamic offset.\n" |
| 746 | "\t\tThe offset is applied in the shader with pointer arithmetic.\n" |
| 747 | "\t\tUseful for argument buffers where it is non-trivial to apply dynamic offset otherwise.\n" |
| 748 | "\t[--msl-inline-uniform-block <set index> <binding>]:\n\t\tIn argument buffers, mark an UBO as being an inline uniform block which is embedded into the argument buffer itself.\n" |
| 749 | "\t[--msl-decoration-binding]:\n\t\tUse SPIR-V bindings directly as MSL bindings.\n" |
| 750 | "\t\tThis does not work in the general case as there is no descriptor set support, and combined image samplers are split up.\n" |
| 751 | "\t\tHowever, if the shader author knows of binding limitations, this option will avoid the need for reflection on Metal side.\n" |
| 752 | "\t[--msl-force-active-argument-buffer-resources]:\n\t\tAlways emit resources which are part of argument buffers.\n" |
| 753 | "\t\tThis makes sure that similar shaders with same resource declarations can share the argument buffer as declaring an argument buffer implies an ABI.\n" |
| 754 | "\t[--msl-force-native-arrays]:\n\t\tRather than implementing array types as a templated value type ala std::array<T>, use plain, native arrays.\n" |
| 755 | "\t\tThis will lead to worse code-gen, but can work around driver bugs on certain driver revisions of certain Intel-based Macbooks where template arrays break.\n" |
| 756 | "\t[--msl-disable-frag-depth-builtin]:\n\t\tDisables FragDepth output. Useful if pipeline does not enable depth, as pipeline creation might otherwise fail.\n" |
| 757 | "\t[--msl-disable-frag-stencil-ref-builtin]:\n\t\tDisable FragStencilRef output. Useful if pipeline does not enable stencil output, as pipeline creation might otherwise fail.\n" |
| 758 | "\t[--msl-enable-frag-output-mask <mask>]:\n\t\tOnly selectively enable fragment outputs. Useful if pipeline does not enable fragment output for certain locations, as pipeline creation might otherwise fail.\n" |
| 759 | "\t[--msl-no-clip-distance-user-varying]:\n\t\tDo not emit user varyings to emulate gl_ClipDistance in fragment shaders.\n" |
Chip Davis | 5281d99 | 2020-06-13 23:03:30 -0500 | [diff] [blame] | 760 | "\t[--msl-shader-input <index> <format> <size>]:\n\t\tSpecify the format of the shader input at <index>.\n" |
Chip Davis | 688c5fc | 2020-02-20 21:38:28 -0600 | [diff] [blame] | 761 | "\t\t<format> can be 'any32', 'any16', 'u16', 'u8', or 'other', to indicate a 32-bit opaque value, 16-bit opaque value, 16-bit unsigned integer, 8-bit unsigned integer, " |
Chip Davis | 5281d99 | 2020-06-13 23:03:30 -0500 | [diff] [blame] | 762 | "or other-typed variable. <size> is the vector length of the variable, which must be greater than or equal to that declared in the shader.\n" |
Chip Davis | 688c5fc | 2020-02-20 21:38:28 -0600 | [diff] [blame] | 763 | "\t\tUseful if shader stage interfaces don't match up, as pipeline creation might otherwise fail.\n" |
| 764 | "\t[--msl-multi-patch-workgroup]:\n\t\tUse the new style of tessellation control processing, where multiple patches are processed per workgroup.\n" |
| 765 | "\t\tThis should increase throughput by ensuring all the GPU's SIMD lanes are occupied, but it is not compatible with the old style.\n" |
| 766 | "\t\tIn addition, this style also passes input variables in buffers directly instead of using vertex attribute processing.\n" |
| 767 | "\t\tIn a future version of SPIRV-Cross, this will become the default.\n" |
| 768 | "\t[--msl-vertex-for-tessellation]:\n\t\tWhen handling a vertex shader, marks it as one that will be used with a new-style tessellation control shader.\n" |
Tomek Ponitka | 18f23c4 | 2020-07-22 18:37:17 +0200 | [diff] [blame] | 769 | "\t\tThe vertex shader is output to MSL as a compute kernel which outputs vertices to the buffer in the order they are received, rather than in index order as with --msl-capture-output normally.\n" |
| 770 | "\t[--msl-additional-fixed-sample-mask <mask>]:\n" |
Chip Davis | 4cf840e | 2020-08-27 19:24:20 -0500 | [diff] [blame] | 771 | "\t\tSet an additional fixed sample mask. If the shader outputs a sample mask, then the final sample mask will be a bitwise AND of the two.\n" |
| 772 | "\t[--msl-arrayed-subpass-input]:\n\t\tAssume that images of dimension SubpassData have multiple layers. Layered input attachments are accessed relative to BuiltInLayer.\n" |
Chip Davis | 21d38f7 | 2020-10-13 13:20:49 -0500 | [diff] [blame^] | 773 | "\t\tThis option has no effect if multiview is also enabled.\n" |
| 774 | "\t[--msl-r32ui-linear-texture-align <alignment>]:\n\t\tThe required alignment of linear textures of format MTLPixelFormatR32Uint.\n" |
| 775 | "\t\tThis is used to align the row stride for atomic accesses to such images.\n" |
| 776 | "\t[--msl-r32ui-linear-texture-align-constant-id <id>]:\n\t\tThe function constant ID to use for the linear texture alignment.\n" |
| 777 | "\t\tOn MSL 1.2 or later, you can override the alignment by setting this function constant.\n"); |
Hans-Kristian Arntzen | d573a95 | 2020-07-01 11:42:58 +0200 | [diff] [blame] | 778 | // clang-format on |
Hans-Kristian Arntzen | 165392a | 2020-05-28 13:23:33 +0200 | [diff] [blame] | 779 | } |
| 780 | |
| 781 | static void print_help_common() |
| 782 | { |
Hans-Kristian Arntzen | d573a95 | 2020-07-01 11:42:58 +0200 | [diff] [blame] | 783 | // clang-format off |
Hans-Kristian Arntzen | 165392a | 2020-05-28 13:23:33 +0200 | [diff] [blame] | 784 | fprintf(stderr, "\nCommon options:\n" |
| 785 | "\t[--entry name]:\n\t\tUse a specific entry point. By default, the first entry point in the module is used.\n" |
| 786 | "\t[--stage <stage (vert, frag, geom, tesc, tese comp)>]:\n\t\tForces use of a certain shader stage.\n" |
| 787 | "\t\tCan disambiguate the entry point if more than one entry point exists with same name, but different stage.\n" |
| 788 | "\t[--emit-line-directives]:\n\t\tIf SPIR-V has OpLine directives, aim to emit those accurately in output code as well.\n" |
| 789 | "\t[--rename-entry-point <old> <new> <stage>]:\n\t\tRenames an entry point from what is declared in SPIR-V to code output.\n" |
| 790 | "\t\tMostly relevant for HLSL or MSL.\n" |
| 791 | "\t[--rename-interface-variable <in|out> <location> <new_variable_name>]:\n\t\tRename an interface variable based on location decoration.\n" |
| 792 | "\t[--force-zero-initialized-variables]:\n\t\tForces temporary variables to be initialized to zero.\n" |
| 793 | "\t\tCan be useful in environments where compilers do not allow potentially uninitialized variables.\n" |
| 794 | "\t\tThis usually comes up with Phi temporaries.\n" |
| 795 | "\t[--fixup-clipspace]:\n\t\tFixup Z clip-space at the end of a vertex shader. The behavior is backend-dependent.\n" |
| 796 | "\t\tGLSL: Rewrites [0, w] Z range (D3D/Metal/Vulkan) to GL-style [-w, w].\n" |
| 797 | "\t\tHLSL/MSL: Rewrites [-w, w] Z range (GL) to D3D/Metal/Vulkan-style [0, w].\n" |
| 798 | "\t[--flip-vert-y]:\n\t\tInverts gl_Position.y (or equivalent) at the end of a vertex shader. This is equivalent to using negative viewport height.\n" |
| 799 | ); |
Hans-Kristian Arntzen | d573a95 | 2020-07-01 11:42:58 +0200 | [diff] [blame] | 800 | // clang-format on |
Hans-Kristian Arntzen | 165392a | 2020-05-28 13:23:33 +0200 | [diff] [blame] | 801 | } |
| 802 | |
| 803 | static void print_help_obscure() |
| 804 | { |
Hans-Kristian Arntzen | d573a95 | 2020-07-01 11:42:58 +0200 | [diff] [blame] | 805 | // clang-format off |
Hans-Kristian Arntzen | 165392a | 2020-05-28 13:23:33 +0200 | [diff] [blame] | 806 | fprintf(stderr, "\nObscure options:\n" |
| 807 | "\tThese options are not meant to be used on a regular basis. They have some occasional uses in the test suite.\n" |
| 808 | |
| 809 | "\t[--force-temporary]:\n\t\tAggressively emit temporary expressions instead of forwarding expressions. Very rarely used and under-tested.\n" |
| 810 | "\t[--revision]:\n\t\tPrints build timestamp and Git commit information (updated when cmake is configured).\n" |
| 811 | "\t[--iterations iter]:\n\t\tRecompiles the same shader over and over, benchmarking related.\n" |
| 812 | "\t[--disable-storage-image-qualifier-deduction]:\n\t\tIf storage images are received without any nonwritable or nonreadable information,\n""" |
| 813 | "\t\tdo not attempt to analyze usage, and always emit read/write state.\n" |
| 814 | "\t[--flatten-multidimensional-arrays]:\n\t\tDo not support multi-dimensional arrays and flatten them to one dimension.\n" |
| 815 | "\t[--cpp-interface-name <name>]:\n\t\tEmit a specific class name in C++ codegen.\n" |
| 816 | ); |
Hans-Kristian Arntzen | d573a95 | 2020-07-01 11:42:58 +0200 | [diff] [blame] | 817 | // clang-format on |
Hans-Kristian Arntzen | 165392a | 2020-05-28 13:23:33 +0200 | [diff] [blame] | 818 | } |
| 819 | |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 820 | static void print_help() |
| 821 | { |
Hans-Kristian Arntzen | 0b9a884 | 2019-05-24 15:23:29 +0200 | [diff] [blame] | 822 | print_version(); |
| 823 | |
Hans-Kristian Arntzen | d573a95 | 2020-07-01 11:42:58 +0200 | [diff] [blame] | 824 | // clang-format off |
Hans-Kristian Arntzen | 165392a | 2020-05-28 13:23:33 +0200 | [diff] [blame] | 825 | fprintf(stderr, "Usage: spirv-cross <...>\n" |
| 826 | "\nBasic:\n" |
Hans-Kristian Arntzen | e30a942 | 2018-04-18 16:19:55 +0200 | [diff] [blame] | 827 | "\t[SPIR-V file]\n" |
Hans-Kristian Arntzen | 165392a | 2020-05-28 13:23:33 +0200 | [diff] [blame] | 828 | "\t[--output <output path>]: If not provided, prints output to stdout.\n" |
| 829 | "\t[--dump-resources]:\n\t\tPrints a basic reflection of the SPIR-V module along with other output.\n" |
| 830 | "\t[--help]:\n\t\tPrints this help message.\n" |
| 831 | ); |
Hans-Kristian Arntzen | d573a95 | 2020-07-01 11:42:58 +0200 | [diff] [blame] | 832 | // clang-format on |
Hans-Kristian Arntzen | 165392a | 2020-05-28 13:23:33 +0200 | [diff] [blame] | 833 | |
| 834 | print_help_backend(); |
| 835 | print_help_common(); |
| 836 | print_help_glsl(); |
| 837 | print_help_msl(); |
| 838 | print_help_hlsl(); |
| 839 | print_help_obscure(); |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 840 | } |
| 841 | |
Hans-Kristian Arntzen | a489ba7 | 2019-04-02 11:19:03 +0200 | [diff] [blame] | 842 | static bool remap_generic(Compiler &compiler, const SmallVector<Resource> &resources, const Remap &remap) |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 843 | { |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 844 | auto itr = |
| 845 | find_if(begin(resources), end(resources), [&remap](const Resource &res) { return res.name == remap.src_name; }); |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 846 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 847 | if (itr != end(resources)) |
| 848 | { |
| 849 | compiler.set_remapped_variable_state(itr->id, true); |
| 850 | compiler.set_name(itr->id, remap.dst_name); |
| 851 | compiler.set_subpass_input_remapped_components(itr->id, remap.components); |
| 852 | return true; |
| 853 | } |
| 854 | else |
| 855 | return false; |
| 856 | } |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 857 | |
Hans-Kristian Arntzen | 3fe57d3 | 2019-04-09 12:46:23 +0200 | [diff] [blame] | 858 | static vector<PlsRemap> remap_pls(const SmallVector<PLSArg> &pls_variables, const SmallVector<Resource> &resources, |
| 859 | const SmallVector<Resource> *secondary_resources) |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 860 | { |
Hans-Kristian Arntzen | 3fe57d3 | 2019-04-09 12:46:23 +0200 | [diff] [blame] | 861 | vector<PlsRemap> ret; |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 862 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 863 | for (auto &pls : pls_variables) |
| 864 | { |
| 865 | bool found = false; |
| 866 | for (auto &res : resources) |
| 867 | { |
| 868 | if (res.name == pls.name) |
| 869 | { |
| 870 | ret.push_back({ res.id, pls.format }); |
| 871 | found = true; |
| 872 | break; |
| 873 | } |
| 874 | } |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 875 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 876 | if (!found && secondary_resources) |
| 877 | { |
| 878 | for (auto &res : *secondary_resources) |
| 879 | { |
| 880 | if (res.name == pls.name) |
| 881 | { |
| 882 | ret.push_back({ res.id, pls.format }); |
| 883 | found = true; |
| 884 | break; |
| 885 | } |
| 886 | } |
| 887 | } |
| 888 | |
| 889 | if (!found) |
| 890 | fprintf(stderr, "Did not find stage input/output/target with name \"%s\".\n", pls.name.c_str()); |
| 891 | } |
| 892 | |
| 893 | return ret; |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 894 | } |
| 895 | |
| 896 | static PlsFormat pls_format(const char *str) |
| 897 | { |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 898 | if (!strcmp(str, "r11f_g11f_b10f")) |
| 899 | return PlsR11FG11FB10F; |
| 900 | else if (!strcmp(str, "r32f")) |
| 901 | return PlsR32F; |
| 902 | else if (!strcmp(str, "rg16f")) |
| 903 | return PlsRG16F; |
| 904 | else if (!strcmp(str, "rg16")) |
| 905 | return PlsRG16; |
| 906 | else if (!strcmp(str, "rgb10_a2")) |
| 907 | return PlsRGB10A2; |
| 908 | else if (!strcmp(str, "rgba8")) |
| 909 | return PlsRGBA8; |
| 910 | else if (!strcmp(str, "rgba8i")) |
| 911 | return PlsRGBA8I; |
| 912 | else if (!strcmp(str, "rgba8ui")) |
| 913 | return PlsRGBA8UI; |
| 914 | else if (!strcmp(str, "rg16i")) |
| 915 | return PlsRG16I; |
| 916 | else if (!strcmp(str, "rgb10_a2ui")) |
| 917 | return PlsRGB10A2UI; |
| 918 | else if (!strcmp(str, "rg16ui")) |
| 919 | return PlsRG16UI; |
| 920 | else if (!strcmp(str, "r32ui")) |
| 921 | return PlsR32UI; |
| 922 | else |
| 923 | return PlsNone; |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 924 | } |
| 925 | |
Hans-Kristian Arntzen | eecbeaa | 2018-03-01 14:00:04 +0100 | [diff] [blame] | 926 | static ExecutionModel stage_to_execution_model(const std::string &stage) |
| 927 | { |
| 928 | if (stage == "vert") |
| 929 | return ExecutionModelVertex; |
| 930 | else if (stage == "frag") |
| 931 | return ExecutionModelFragment; |
| 932 | else if (stage == "comp") |
| 933 | return ExecutionModelGLCompute; |
| 934 | else if (stage == "tesc") |
| 935 | return ExecutionModelTessellationControl; |
| 936 | else if (stage == "tese") |
| 937 | return ExecutionModelTessellationEvaluation; |
| 938 | else if (stage == "geom") |
| 939 | return ExecutionModelGeometry; |
| 940 | else |
| 941 | SPIRV_CROSS_THROW("Invalid stage."); |
| 942 | } |
| 943 | |
Hans-Kristian Arntzen | e38cbb9 | 2019-11-12 10:49:01 +0100 | [diff] [blame] | 944 | static HLSLBindingFlags hlsl_resource_type_to_flag(const std::string &arg) |
| 945 | { |
| 946 | if (arg == "push") |
| 947 | return HLSL_BINDING_AUTO_PUSH_CONSTANT_BIT; |
| 948 | else if (arg == "cbv") |
| 949 | return HLSL_BINDING_AUTO_CBV_BIT; |
| 950 | else if (arg == "srv") |
| 951 | return HLSL_BINDING_AUTO_SRV_BIT; |
| 952 | else if (arg == "uav") |
| 953 | return HLSL_BINDING_AUTO_UAV_BIT; |
| 954 | else if (arg == "sampler") |
| 955 | return HLSL_BINDING_AUTO_SAMPLER_BIT; |
| 956 | else if (arg == "all") |
| 957 | return HLSL_BINDING_AUTO_ALL; |
| 958 | else |
| 959 | { |
| 960 | fprintf(stderr, "Invalid resource type for --hlsl-auto-binding: %s\n", arg.c_str()); |
| 961 | return 0; |
| 962 | } |
| 963 | } |
| 964 | |
Hans-Kristian Arntzen | 3fe57d3 | 2019-04-09 12:46:23 +0200 | [diff] [blame] | 965 | static string compile_iteration(const CLIArguments &args, std::vector<uint32_t> spirv_file) |
Hans-Kristian Arntzen | c60b9a1 | 2019-04-08 11:53:13 +0200 | [diff] [blame] | 966 | { |
| 967 | Parser spirv_parser(move(spirv_file)); |
| 968 | spirv_parser.parse(); |
| 969 | |
| 970 | unique_ptr<CompilerGLSL> compiler; |
| 971 | bool combined_image_samplers = false; |
| 972 | bool build_dummy_sampler = false; |
| 973 | |
| 974 | if (args.cpp) |
| 975 | { |
| 976 | compiler.reset(new CompilerCPP(move(spirv_parser.get_parsed_ir()))); |
| 977 | if (args.cpp_interface_name) |
| 978 | static_cast<CompilerCPP *>(compiler.get())->set_interface_name(args.cpp_interface_name); |
| 979 | } |
| 980 | else if (args.msl) |
| 981 | { |
| 982 | compiler.reset(new CompilerMSL(move(spirv_parser.get_parsed_ir()))); |
| 983 | |
| 984 | auto *msl_comp = static_cast<CompilerMSL *>(compiler.get()); |
| 985 | auto msl_opts = msl_comp->get_msl_options(); |
| 986 | if (args.set_msl_version) |
| 987 | msl_opts.msl_version = args.msl_version; |
| 988 | msl_opts.capture_output_to_buffer = args.msl_capture_output_to_buffer; |
| 989 | msl_opts.swizzle_texture_samples = args.msl_swizzle_texture_samples; |
Lukas Hermanns | ffbd801 | 2019-10-09 11:22:25 -0400 | [diff] [blame] | 990 | msl_opts.invariant_float_math = args.msl_invariant_float_math; |
Hans-Kristian Arntzen | c60b9a1 | 2019-04-08 11:53:13 +0200 | [diff] [blame] | 991 | if (args.msl_ios) |
Lukas Hermanns | f3a6d28 | 2019-09-27 15:49:54 -0400 | [diff] [blame] | 992 | { |
Hans-Kristian Arntzen | c60b9a1 | 2019-04-08 11:53:13 +0200 | [diff] [blame] | 993 | msl_opts.platform = CompilerMSL::Options::iOS; |
Lukas Hermanns | f3a6d28 | 2019-09-27 15:49:54 -0400 | [diff] [blame] | 994 | msl_opts.ios_use_framebuffer_fetch_subpasses = args.msl_framebuffer_fetch; |
| 995 | msl_opts.emulate_cube_array = args.msl_emulate_cube_array; |
| 996 | } |
Hans-Kristian Arntzen | c60b9a1 | 2019-04-08 11:53:13 +0200 | [diff] [blame] | 997 | msl_opts.pad_fragment_output_components = args.msl_pad_fragment_output; |
| 998 | msl_opts.tess_domain_origin_lower_left = args.msl_domain_lower_left; |
| 999 | msl_opts.argument_buffers = args.msl_argument_buffers; |
Hans-Kristian Arntzen | fc4f39b | 2019-04-23 12:17:21 +0200 | [diff] [blame] | 1000 | msl_opts.texture_buffer_native = args.msl_texture_buffer_native; |
Chip Davis | 7eecf5a | 2019-05-31 12:06:20 -0500 | [diff] [blame] | 1001 | msl_opts.multiview = args.msl_multiview; |
Chip Davis | cab7335 | 2020-08-23 16:44:41 -0500 | [diff] [blame] | 1002 | msl_opts.multiview_layered_rendering = args.msl_multiview_layered_rendering; |
Chip Davis | 6a58554 | 2019-07-12 21:50:50 -0500 | [diff] [blame] | 1003 | msl_opts.view_index_from_device_index = args.msl_view_index_from_device_index; |
Chip Davis | fb5ee4c | 2019-07-22 13:08:04 -0500 | [diff] [blame] | 1004 | msl_opts.dispatch_base = args.msl_dispatch_base; |
Akio Gaule | 1280df6 | 2019-11-27 01:02:46 -0800 | [diff] [blame] | 1005 | msl_opts.enable_decoration_binding = args.msl_decoration_binding; |
Hans-Kristian Arntzen | c3bd136 | 2020-01-16 11:07:30 +0100 | [diff] [blame] | 1006 | msl_opts.force_active_argument_buffer_resources = args.msl_force_active_argument_buffer_resources; |
Hans-Kristian Arntzen | c9d4f9c | 2020-02-24 12:47:14 +0100 | [diff] [blame] | 1007 | msl_opts.force_native_arrays = args.msl_force_native_arrays; |
Chip Davis | b29f83c | 2020-04-10 01:13:33 -0500 | [diff] [blame] | 1008 | msl_opts.enable_frag_depth_builtin = args.msl_enable_frag_depth_builtin; |
| 1009 | msl_opts.enable_frag_stencil_ref_builtin = args.msl_enable_frag_stencil_ref_builtin; |
| 1010 | msl_opts.enable_frag_output_mask = args.msl_enable_frag_output_mask; |
Hans-Kristian Arntzen | ebf4636 | 2020-04-20 09:48:20 +0200 | [diff] [blame] | 1011 | msl_opts.enable_clip_distance_user_varying = args.msl_enable_clip_distance_user_varying; |
Chip Davis | 688c5fc | 2020-02-20 21:38:28 -0600 | [diff] [blame] | 1012 | msl_opts.multi_patch_workgroup = args.msl_multi_patch_workgroup; |
| 1013 | msl_opts.vertex_for_tessellation = args.msl_vertex_for_tessellation; |
Tomek Ponitka | 18f23c4 | 2020-07-22 18:37:17 +0200 | [diff] [blame] | 1014 | msl_opts.additional_fixed_sample_mask = args.msl_additional_fixed_sample_mask; |
Chip Davis | 4cf840e | 2020-08-27 19:24:20 -0500 | [diff] [blame] | 1015 | msl_opts.arrayed_subpass_input = args.msl_arrayed_subpass_input; |
Chip Davis | 21d38f7 | 2020-10-13 13:20:49 -0500 | [diff] [blame^] | 1016 | msl_opts.r32ui_linear_texture_alignment = args.msl_r32ui_linear_texture_alignment; |
| 1017 | msl_opts.r32ui_alignment_constant_id = args.msl_r32ui_alignment_constant_id; |
Hans-Kristian Arntzen | c60b9a1 | 2019-04-08 11:53:13 +0200 | [diff] [blame] | 1018 | msl_comp->set_msl_options(msl_opts); |
| 1019 | for (auto &v : args.msl_discrete_descriptor_sets) |
| 1020 | msl_comp->add_discrete_descriptor_set(v); |
Hans-Kristian Arntzen | 4bb673a | 2019-10-14 12:51:48 +0200 | [diff] [blame] | 1021 | for (auto &v : args.msl_device_argument_buffers) |
| 1022 | msl_comp->set_argument_buffer_device_address_space(v, true); |
Chip Davis | cb35934 | 2019-09-05 23:14:12 -0500 | [diff] [blame] | 1023 | uint32_t i = 0; |
| 1024 | for (auto &v : args.msl_dynamic_buffers) |
| 1025 | msl_comp->add_dynamic_buffer(v.first, v.second, i++); |
Chip Davis | fedbc35 | 2019-12-16 22:58:16 -0600 | [diff] [blame] | 1026 | for (auto &v : args.msl_inline_uniform_blocks) |
| 1027 | msl_comp->add_inline_uniform_block(v.first, v.second); |
Chip Davis | 5281d99 | 2020-06-13 23:03:30 -0500 | [diff] [blame] | 1028 | for (auto &v : args.msl_shader_inputs) |
| 1029 | msl_comp->add_msl_shader_input(v); |
Hans-Kristian Arntzen | c60b9a1 | 2019-04-08 11:53:13 +0200 | [diff] [blame] | 1030 | } |
| 1031 | else if (args.hlsl) |
| 1032 | compiler.reset(new CompilerHLSL(move(spirv_parser.get_parsed_ir()))); |
| 1033 | else |
| 1034 | { |
| 1035 | combined_image_samplers = !args.vulkan_semantics; |
Hans-Kristian Arntzen | 12ca9d1 | 2019-07-25 11:07:14 +0200 | [diff] [blame] | 1036 | if (!args.vulkan_semantics || args.vulkan_glsl_disable_ext_samplerless_texture_functions) |
Hans-Kristian Arntzen | c60b9a1 | 2019-04-08 11:53:13 +0200 | [diff] [blame] | 1037 | build_dummy_sampler = true; |
| 1038 | compiler.reset(new CompilerGLSL(move(spirv_parser.get_parsed_ir()))); |
| 1039 | } |
| 1040 | |
| 1041 | if (!args.variable_type_remaps.empty()) |
| 1042 | { |
| 1043 | auto remap_cb = [&](const SPIRType &, const string &name, string &out) -> void { |
| 1044 | for (const VariableTypeRemap &remap : args.variable_type_remaps) |
| 1045 | if (name == remap.variable_name) |
| 1046 | out = remap.new_variable_type; |
| 1047 | }; |
| 1048 | |
| 1049 | compiler->set_variable_type_remap_callback(move(remap_cb)); |
| 1050 | } |
| 1051 | |
| 1052 | for (auto &rename : args.entry_point_rename) |
| 1053 | compiler->rename_entry_point(rename.old_name, rename.new_name, rename.execution_model); |
| 1054 | |
| 1055 | auto entry_points = compiler->get_entry_points_and_stages(); |
| 1056 | auto entry_point = args.entry; |
| 1057 | ExecutionModel model = ExecutionModelMax; |
| 1058 | |
| 1059 | if (!args.entry_stage.empty()) |
| 1060 | { |
| 1061 | model = stage_to_execution_model(args.entry_stage); |
| 1062 | if (entry_point.empty()) |
| 1063 | { |
| 1064 | // Just use the first entry point with this stage. |
| 1065 | for (auto &e : entry_points) |
| 1066 | { |
| 1067 | if (e.execution_model == model) |
| 1068 | { |
| 1069 | entry_point = e.name; |
| 1070 | break; |
| 1071 | } |
| 1072 | } |
| 1073 | |
| 1074 | if (entry_point.empty()) |
| 1075 | { |
| 1076 | fprintf(stderr, "Could not find an entry point with stage: %s\n", args.entry_stage.c_str()); |
| 1077 | exit(EXIT_FAILURE); |
| 1078 | } |
| 1079 | } |
| 1080 | else |
| 1081 | { |
| 1082 | // Make sure both stage and name exists. |
| 1083 | bool exists = false; |
| 1084 | for (auto &e : entry_points) |
| 1085 | { |
| 1086 | if (e.execution_model == model && e.name == entry_point) |
| 1087 | { |
| 1088 | exists = true; |
| 1089 | break; |
| 1090 | } |
| 1091 | } |
| 1092 | |
| 1093 | if (!exists) |
| 1094 | { |
| 1095 | fprintf(stderr, "Could not find an entry point %s with stage: %s\n", entry_point.c_str(), |
| 1096 | args.entry_stage.c_str()); |
| 1097 | exit(EXIT_FAILURE); |
| 1098 | } |
| 1099 | } |
| 1100 | } |
| 1101 | else if (!entry_point.empty()) |
| 1102 | { |
| 1103 | // Make sure there is just one entry point with this name, or the stage |
| 1104 | // is ambiguous. |
| 1105 | uint32_t stage_count = 0; |
| 1106 | for (auto &e : entry_points) |
| 1107 | { |
| 1108 | if (e.name == entry_point) |
| 1109 | { |
| 1110 | stage_count++; |
| 1111 | model = e.execution_model; |
| 1112 | } |
| 1113 | } |
| 1114 | |
| 1115 | if (stage_count == 0) |
| 1116 | { |
| 1117 | fprintf(stderr, "There is no entry point with name: %s\n", entry_point.c_str()); |
| 1118 | exit(EXIT_FAILURE); |
| 1119 | } |
| 1120 | else if (stage_count > 1) |
| 1121 | { |
| 1122 | fprintf(stderr, "There is more than one entry point with name: %s. Use --stage.\n", entry_point.c_str()); |
| 1123 | exit(EXIT_FAILURE); |
| 1124 | } |
| 1125 | } |
| 1126 | |
| 1127 | if (!entry_point.empty()) |
| 1128 | compiler->set_entry_point(entry_point, model); |
| 1129 | |
| 1130 | if (!args.set_version && !compiler->get_common_options().version) |
| 1131 | { |
| 1132 | fprintf(stderr, "Didn't specify GLSL version and SPIR-V did not specify language.\n"); |
| 1133 | print_help(); |
| 1134 | exit(EXIT_FAILURE); |
| 1135 | } |
| 1136 | |
| 1137 | CompilerGLSL::Options opts = compiler->get_common_options(); |
| 1138 | if (args.set_version) |
| 1139 | opts.version = args.version; |
| 1140 | if (args.set_es) |
| 1141 | opts.es = args.es; |
| 1142 | opts.force_temporary = args.force_temporary; |
| 1143 | opts.separate_shader_objects = args.sso; |
| 1144 | opts.flatten_multidimensional_arrays = args.flatten_multidimensional_arrays; |
| 1145 | opts.enable_420pack_extension = args.use_420pack_extension; |
| 1146 | opts.vulkan_semantics = args.vulkan_semantics; |
| 1147 | opts.vertex.fixup_clipspace = args.fixup; |
| 1148 | opts.vertex.flip_vert_y = args.yflip; |
| 1149 | opts.vertex.support_nonzero_base_instance = args.support_nonzero_baseinstance; |
| 1150 | opts.emit_push_constant_as_uniform_buffer = args.glsl_emit_push_constant_as_ubo; |
Laszlo Agocs | 7bc3149 | 2019-05-11 16:30:33 +0200 | [diff] [blame] | 1151 | opts.emit_uniform_buffer_as_plain_uniforms = args.glsl_emit_ubo_as_plain_uniforms; |
Hans-Kristian Arntzen | 57c93d4 | 2020-07-28 15:15:24 +0200 | [diff] [blame] | 1152 | opts.force_flattened_io_blocks = args.glsl_force_flattened_io_blocks; |
Hans-Kristian Arntzen | 65af09d | 2019-05-28 13:41:46 +0200 | [diff] [blame] | 1153 | opts.emit_line_directives = args.emit_line_directives; |
Hans-Kristian Arntzen | 95cd20f | 2020-03-04 16:41:00 +0100 | [diff] [blame] | 1154 | opts.enable_storage_image_qualifier_deduction = args.enable_storage_image_qualifier_deduction; |
Hans-Kristian Arntzen | b8905bb | 2020-03-26 11:21:23 +0100 | [diff] [blame] | 1155 | opts.force_zero_initialized_variables = args.force_zero_initialized_variables; |
Hans-Kristian Arntzen | c60b9a1 | 2019-04-08 11:53:13 +0200 | [diff] [blame] | 1156 | compiler->set_common_options(opts); |
| 1157 | |
Hans-Kristian Arntzen | 04e877d | 2020-03-19 14:20:37 +0100 | [diff] [blame] | 1158 | for (auto &fetch : args.glsl_ext_framebuffer_fetch) |
| 1159 | compiler->remap_ext_framebuffer_fetch(fetch.first, fetch.second); |
| 1160 | |
Hans-Kristian Arntzen | c60b9a1 | 2019-04-08 11:53:13 +0200 | [diff] [blame] | 1161 | // Set HLSL specific options. |
| 1162 | if (args.hlsl) |
| 1163 | { |
| 1164 | auto *hlsl = static_cast<CompilerHLSL *>(compiler.get()); |
| 1165 | auto hlsl_opts = hlsl->get_hlsl_options(); |
| 1166 | if (args.set_shader_model) |
| 1167 | { |
| 1168 | if (args.shader_model < 30) |
| 1169 | { |
| 1170 | fprintf(stderr, "Shader model earlier than 30 (3.0) not supported.\n"); |
| 1171 | exit(EXIT_FAILURE); |
| 1172 | } |
| 1173 | |
| 1174 | hlsl_opts.shader_model = args.shader_model; |
| 1175 | } |
| 1176 | |
| 1177 | if (args.hlsl_compat) |
| 1178 | { |
| 1179 | // Enable all compat options. |
| 1180 | hlsl_opts.point_size_compat = true; |
| 1181 | hlsl_opts.point_coord_compat = true; |
| 1182 | } |
| 1183 | |
| 1184 | if (hlsl_opts.shader_model <= 30) |
| 1185 | { |
| 1186 | combined_image_samplers = true; |
| 1187 | build_dummy_sampler = true; |
| 1188 | } |
| 1189 | |
| 1190 | hlsl_opts.support_nonzero_base_vertex_base_instance = args.hlsl_support_nonzero_base; |
Hans-Kristian Arntzen | c27e1ef | 2020-03-04 16:32:52 +0100 | [diff] [blame] | 1191 | hlsl_opts.force_storage_buffer_as_uav = args.hlsl_force_storage_buffer_as_uav; |
Hans-Kristian Arntzen | 28bf905 | 2020-04-03 11:21:41 +0200 | [diff] [blame] | 1192 | hlsl_opts.nonwritable_uav_texture_as_srv = args.hlsl_nonwritable_uav_texture_as_srv; |
Hans-Kristian Arntzen | 2d52006 | 2020-06-04 11:35:21 +0200 | [diff] [blame] | 1193 | hlsl_opts.enable_16bit_types = args.hlsl_enable_16bit_types; |
Hans-Kristian Arntzen | c60b9a1 | 2019-04-08 11:53:13 +0200 | [diff] [blame] | 1194 | hlsl->set_hlsl_options(hlsl_opts); |
Hans-Kristian Arntzen | e38cbb9 | 2019-11-12 10:49:01 +0100 | [diff] [blame] | 1195 | hlsl->set_resource_binding_flags(args.hlsl_binding_flags); |
Hans-Kristian Arntzen | c60b9a1 | 2019-04-08 11:53:13 +0200 | [diff] [blame] | 1196 | } |
| 1197 | |
| 1198 | if (build_dummy_sampler) |
| 1199 | { |
| 1200 | uint32_t sampler = compiler->build_dummy_sampler_for_combined_images(); |
| 1201 | if (sampler != 0) |
| 1202 | { |
| 1203 | // Set some defaults to make validation happy. |
| 1204 | compiler->set_decoration(sampler, DecorationDescriptorSet, 0); |
| 1205 | compiler->set_decoration(sampler, DecorationBinding, 0); |
| 1206 | } |
| 1207 | } |
| 1208 | |
| 1209 | ShaderResources res; |
| 1210 | if (args.remove_unused) |
| 1211 | { |
| 1212 | auto active = compiler->get_active_interface_variables(); |
| 1213 | res = compiler->get_shader_resources(active); |
| 1214 | compiler->set_enabled_interface_variables(move(active)); |
| 1215 | } |
| 1216 | else |
| 1217 | res = compiler->get_shader_resources(); |
| 1218 | |
| 1219 | if (args.flatten_ubo) |
| 1220 | { |
| 1221 | for (auto &ubo : res.uniform_buffers) |
| 1222 | compiler->flatten_buffer_block(ubo.id); |
| 1223 | for (auto &ubo : res.push_constant_buffers) |
| 1224 | compiler->flatten_buffer_block(ubo.id); |
| 1225 | } |
| 1226 | |
| 1227 | auto pls_inputs = remap_pls(args.pls_in, res.stage_inputs, &res.subpass_inputs); |
| 1228 | auto pls_outputs = remap_pls(args.pls_out, res.stage_outputs, nullptr); |
| 1229 | compiler->remap_pixel_local_storage(move(pls_inputs), move(pls_outputs)); |
| 1230 | |
| 1231 | for (auto &ext : args.extensions) |
| 1232 | compiler->require_extension(ext); |
| 1233 | |
| 1234 | for (auto &remap : args.remaps) |
| 1235 | { |
| 1236 | if (remap_generic(*compiler, res.stage_inputs, remap)) |
| 1237 | continue; |
| 1238 | if (remap_generic(*compiler, res.stage_outputs, remap)) |
| 1239 | continue; |
| 1240 | if (remap_generic(*compiler, res.subpass_inputs, remap)) |
| 1241 | continue; |
| 1242 | } |
| 1243 | |
| 1244 | for (auto &rename : args.interface_variable_renames) |
| 1245 | { |
| 1246 | if (rename.storageClass == StorageClassInput) |
| 1247 | spirv_cross_util::rename_interface_variable(*compiler, res.stage_inputs, rename.location, |
| 1248 | rename.variable_name); |
| 1249 | else if (rename.storageClass == StorageClassOutput) |
| 1250 | spirv_cross_util::rename_interface_variable(*compiler, res.stage_outputs, rename.location, |
| 1251 | rename.variable_name); |
| 1252 | else |
| 1253 | { |
| 1254 | fprintf(stderr, "error at --rename-interface-variable <in|out> ...\n"); |
| 1255 | exit(EXIT_FAILURE); |
| 1256 | } |
| 1257 | } |
| 1258 | |
Hans-Kristian Arntzen | c60b9a1 | 2019-04-08 11:53:13 +0200 | [diff] [blame] | 1259 | if (combined_image_samplers) |
| 1260 | { |
| 1261 | compiler->build_combined_image_samplers(); |
| 1262 | if (args.combined_samplers_inherit_bindings) |
| 1263 | spirv_cross_util::inherit_combined_sampler_bindings(*compiler); |
| 1264 | |
| 1265 | // Give the remapped combined samplers new names. |
| 1266 | for (auto &remap : compiler->get_combined_image_samplers()) |
| 1267 | { |
| 1268 | compiler->set_name(remap.combined_id, join("SPIRV_Cross_Combined", compiler->get_name(remap.image_id), |
| 1269 | compiler->get_name(remap.sampler_id))); |
| 1270 | } |
| 1271 | } |
| 1272 | |
| 1273 | if (args.hlsl) |
| 1274 | { |
| 1275 | auto *hlsl_compiler = static_cast<CompilerHLSL *>(compiler.get()); |
| 1276 | uint32_t new_builtin = hlsl_compiler->remap_num_workgroups_builtin(); |
| 1277 | if (new_builtin) |
| 1278 | { |
| 1279 | hlsl_compiler->set_decoration(new_builtin, DecorationDescriptorSet, 0); |
| 1280 | hlsl_compiler->set_decoration(new_builtin, DecorationBinding, 0); |
| 1281 | } |
| 1282 | } |
| 1283 | |
| 1284 | if (args.hlsl) |
| 1285 | { |
| 1286 | for (auto &remap : args.hlsl_attr_remap) |
| 1287 | static_cast<CompilerHLSL *>(compiler.get())->add_vertex_attribute_remap(remap); |
| 1288 | } |
| 1289 | |
Hans-Kristian Arntzen | 941ccee | 2020-04-03 12:26:42 +0200 | [diff] [blame] | 1290 | auto ret = compiler->compile(); |
| 1291 | |
| 1292 | if (args.dump_resources) |
| 1293 | { |
| 1294 | print_resources(*compiler, res); |
| 1295 | print_push_constant_resources(*compiler, res.push_constant_buffers); |
| 1296 | print_spec_constants(*compiler); |
| 1297 | print_capabilities_and_extensions(*compiler); |
| 1298 | } |
| 1299 | |
| 1300 | return ret; |
Hans-Kristian Arntzen | c60b9a1 | 2019-04-08 11:53:13 +0200 | [diff] [blame] | 1301 | } |
| 1302 | |
Hans-Kristian Arntzen | d9cbc03 | 2017-09-08 09:33:34 +0200 | [diff] [blame] | 1303 | static int main_inner(int argc, char *argv[]) |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 1304 | { |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 1305 | CLIArguments args; |
| 1306 | CLICallbacks cbs; |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 1307 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 1308 | cbs.add("--help", [](CLIParser &parser) { |
| 1309 | print_help(); |
| 1310 | parser.end(); |
| 1311 | }); |
Hans-Kristian Arntzen | 0b9a884 | 2019-05-24 15:23:29 +0200 | [diff] [blame] | 1312 | cbs.add("--revision", [](CLIParser &parser) { |
| 1313 | print_version(); |
| 1314 | parser.end(); |
| 1315 | }); |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 1316 | cbs.add("--output", [&args](CLIParser &parser) { args.output = parser.next_string(); }); |
| 1317 | cbs.add("--es", [&args](CLIParser &) { |
| 1318 | args.es = true; |
| 1319 | args.set_es = true; |
| 1320 | }); |
| 1321 | cbs.add("--no-es", [&args](CLIParser &) { |
| 1322 | args.es = false; |
| 1323 | args.set_es = true; |
| 1324 | }); |
| 1325 | cbs.add("--version", [&args](CLIParser &parser) { |
| 1326 | args.version = parser.next_uint(); |
| 1327 | args.set_version = true; |
| 1328 | }); |
| 1329 | cbs.add("--dump-resources", [&args](CLIParser &) { args.dump_resources = true; }); |
| 1330 | cbs.add("--force-temporary", [&args](CLIParser &) { args.force_temporary = true; }); |
| 1331 | cbs.add("--flatten-ubo", [&args](CLIParser &) { args.flatten_ubo = true; }); |
| 1332 | cbs.add("--fixup-clipspace", [&args](CLIParser &) { args.fixup = true; }); |
Hans-Kristian Arntzen | bdfa97a | 2017-08-03 13:02:59 +0200 | [diff] [blame] | 1333 | cbs.add("--flip-vert-y", [&args](CLIParser &) { args.yflip = true; }); |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 1334 | cbs.add("--iterations", [&args](CLIParser &parser) { args.iterations = parser.next_uint(); }); |
| 1335 | cbs.add("--cpp", [&args](CLIParser &) { args.cpp = true; }); |
Brad Davis | 0ad0f94 | 2018-06-21 07:43:52 -0700 | [diff] [blame] | 1336 | cbs.add("--reflect", [&args](CLIParser &parser) { args.reflect = parser.next_value_string("json"); }); |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 1337 | cbs.add("--cpp-interface-name", [&args](CLIParser &parser) { args.cpp_interface_name = parser.next_string(); }); |
Bill Hollings | 5ad73f3 | 2017-03-19 21:06:21 -0400 | [diff] [blame] | 1338 | cbs.add("--metal", [&args](CLIParser &) { args.msl = true; }); // Legacy compatibility |
Hans-Kristian Arntzen | 0474848 | 2019-03-19 10:58:37 +0100 | [diff] [blame] | 1339 | cbs.add("--glsl-emit-push-constant-as-ubo", [&args](CLIParser &) { args.glsl_emit_push_constant_as_ubo = true; }); |
Laszlo Agocs | 7bc3149 | 2019-05-11 16:30:33 +0200 | [diff] [blame] | 1340 | cbs.add("--glsl-emit-ubo-as-plain-uniforms", [&args](CLIParser &) { args.glsl_emit_ubo_as_plain_uniforms = true; }); |
Hans-Kristian Arntzen | 57c93d4 | 2020-07-28 15:15:24 +0200 | [diff] [blame] | 1341 | cbs.add("--glsl-force-flattened-io-blocks", [&args](CLIParser &) { args.glsl_force_flattened_io_blocks = true; }); |
Hans-Kristian Arntzen | 04e877d | 2020-03-19 14:20:37 +0100 | [diff] [blame] | 1342 | cbs.add("--glsl-remap-ext-framebuffer-fetch", [&args](CLIParser &parser) { |
| 1343 | uint32_t input_index = parser.next_uint(); |
| 1344 | uint32_t color_attachment = parser.next_uint(); |
| 1345 | args.glsl_ext_framebuffer_fetch.push_back({ input_index, color_attachment }); |
| 1346 | }); |
Hans-Kristian Arntzen | b97e9b0 | 2019-08-01 09:51:44 +0200 | [diff] [blame] | 1347 | cbs.add("--vulkan-glsl-disable-ext-samplerless-texture-functions", |
| 1348 | [&args](CLIParser &) { args.vulkan_glsl_disable_ext_samplerless_texture_functions = true; }); |
Hans-Kristian Arntzen | c2655ab | 2020-03-19 14:21:42 +0100 | [diff] [blame] | 1349 | cbs.add("--disable-storage-image-qualifier-deduction", |
| 1350 | [&args](CLIParser &) { args.enable_storage_image_qualifier_deduction = false; }); |
Hans-Kristian Arntzen | b8905bb | 2020-03-26 11:21:23 +0100 | [diff] [blame] | 1351 | cbs.add("--force-zero-initialized-variables", |
| 1352 | [&args](CLIParser &) { args.force_zero_initialized_variables = true; }); |
Bill Hollings | 5ad73f3 | 2017-03-19 21:06:21 -0400 | [diff] [blame] | 1353 | cbs.add("--msl", [&args](CLIParser &) { args.msl = true; }); |
Robert Konrad | 216a681 | 2017-01-25 17:30:52 +0100 | [diff] [blame] | 1354 | cbs.add("--hlsl", [&args](CLIParser &) { args.hlsl = true; }); |
Hans-Kristian Arntzen | 17d88ca | 2017-05-04 10:10:30 +0200 | [diff] [blame] | 1355 | cbs.add("--hlsl-enable-compat", [&args](CLIParser &) { args.hlsl_compat = true; }); |
Hans-Kristian Arntzen | 6e1c3cc | 2019-01-11 12:56:00 +0100 | [diff] [blame] | 1356 | cbs.add("--hlsl-support-nonzero-basevertex-baseinstance", |
| 1357 | [&args](CLIParser &) { args.hlsl_support_nonzero_base = true; }); |
Hans-Kristian Arntzen | e38cbb9 | 2019-11-12 10:49:01 +0100 | [diff] [blame] | 1358 | cbs.add("--hlsl-auto-binding", [&args](CLIParser &parser) { |
| 1359 | args.hlsl_binding_flags |= hlsl_resource_type_to_flag(parser.next_string()); |
| 1360 | }); |
Hans-Kristian Arntzen | c2655ab | 2020-03-19 14:21:42 +0100 | [diff] [blame] | 1361 | cbs.add("--hlsl-force-storage-buffer-as-uav", |
| 1362 | [&args](CLIParser &) { args.hlsl_force_storage_buffer_as_uav = true; }); |
Hans-Kristian Arntzen | 28bf905 | 2020-04-03 11:21:41 +0200 | [diff] [blame] | 1363 | cbs.add("--hlsl-nonwritable-uav-texture-as-srv", |
| 1364 | [&args](CLIParser &) { args.hlsl_nonwritable_uav_texture_as_srv = true; }); |
Hans-Kristian Arntzen | 2d52006 | 2020-06-04 11:35:21 +0200 | [diff] [blame] | 1365 | cbs.add("--hlsl-enable-16bit-types", [&args](CLIParser &) { args.hlsl_enable_16bit_types = true; }); |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 1366 | cbs.add("--vulkan-semantics", [&args](CLIParser &) { args.vulkan_semantics = true; }); |
Hans-Kristian Arntzen | 3f2de0d | 2020-03-02 11:55:57 +0100 | [diff] [blame] | 1367 | cbs.add("-V", [&args](CLIParser &) { args.vulkan_semantics = true; }); |
Hans-Kristian Arntzen | 470ae7a | 2017-05-22 17:40:00 +0200 | [diff] [blame] | 1368 | cbs.add("--flatten-multidimensional-arrays", [&args](CLIParser &) { args.flatten_multidimensional_arrays = true; }); |
Hans-Kristian Arntzen | 6599a41 | 2017-09-08 09:56:06 +0200 | [diff] [blame] | 1369 | cbs.add("--no-420pack-extension", [&args](CLIParser &) { args.use_420pack_extension = false; }); |
Chip Davis | c51e5b7 | 2019-01-08 16:33:32 -0600 | [diff] [blame] | 1370 | cbs.add("--msl-capture-output", [&args](CLIParser &) { args.msl_capture_output_to_buffer = true; }); |
Chip Davis | 2583321 | 2018-09-19 20:36:33 -0500 | [diff] [blame] | 1371 | cbs.add("--msl-swizzle-texture-samples", [&args](CLIParser &) { args.msl_swizzle_texture_samples = true; }); |
Chip Davis | 3a9af96 | 2018-09-26 20:06:05 -0500 | [diff] [blame] | 1372 | cbs.add("--msl-ios", [&args](CLIParser &) { args.msl_ios = true; }); |
Hans-Kristian Arntzen | b8033d7 | 2019-01-14 14:53:47 +0100 | [diff] [blame] | 1373 | cbs.add("--msl-pad-fragment-output", [&args](CLIParser &) { args.msl_pad_fragment_output = true; }); |
Chip Davis | 41d9424 | 2019-02-05 23:47:50 -0600 | [diff] [blame] | 1374 | cbs.add("--msl-domain-lower-left", [&args](CLIParser &) { args.msl_domain_lower_left = true; }); |
Hans-Kristian Arntzen | e47a77d | 2019-03-14 10:29:34 +0100 | [diff] [blame] | 1375 | cbs.add("--msl-argument-buffers", [&args](CLIParser &) { args.msl_argument_buffers = true; }); |
Hans-Kristian Arntzen | e2aadf8 | 2019-03-15 21:53:21 +0100 | [diff] [blame] | 1376 | cbs.add("--msl-discrete-descriptor-set", |
| 1377 | [&args](CLIParser &parser) { args.msl_discrete_descriptor_sets.push_back(parser.next_uint()); }); |
Hans-Kristian Arntzen | 4bb673a | 2019-10-14 12:51:48 +0200 | [diff] [blame] | 1378 | cbs.add("--msl-device-argument-buffer", |
| 1379 | [&args](CLIParser &parser) { args.msl_device_argument_buffers.push_back(parser.next_uint()); }); |
Hans-Kristian Arntzen | fc4f39b | 2019-04-23 12:17:21 +0200 | [diff] [blame] | 1380 | cbs.add("--msl-texture-buffer-native", [&args](CLIParser &) { args.msl_texture_buffer_native = true; }); |
Lukas Hermanns | f3a6d28 | 2019-09-27 15:49:54 -0400 | [diff] [blame] | 1381 | cbs.add("--msl-framebuffer-fetch", [&args](CLIParser &) { args.msl_framebuffer_fetch = true; }); |
Lukas Hermanns | ffbd801 | 2019-10-09 11:22:25 -0400 | [diff] [blame] | 1382 | cbs.add("--msl-invariant-float-math", [&args](CLIParser &) { args.msl_invariant_float_math = true; }); |
Lukas Hermanns | f3a6d28 | 2019-09-27 15:49:54 -0400 | [diff] [blame] | 1383 | cbs.add("--msl-emulate-cube-array", [&args](CLIParser &) { args.msl_emulate_cube_array = true; }); |
Chip Davis | 7eecf5a | 2019-05-31 12:06:20 -0500 | [diff] [blame] | 1384 | cbs.add("--msl-multiview", [&args](CLIParser &) { args.msl_multiview = true; }); |
Chip Davis | cab7335 | 2020-08-23 16:44:41 -0500 | [diff] [blame] | 1385 | cbs.add("--msl-multiview-no-layered-rendering", |
| 1386 | [&args](CLIParser &) { args.msl_multiview_layered_rendering = false; }); |
Chip Davis | 6a58554 | 2019-07-12 21:50:50 -0500 | [diff] [blame] | 1387 | cbs.add("--msl-view-index-from-device-index", |
| 1388 | [&args](CLIParser &) { args.msl_view_index_from_device_index = true; }); |
Chip Davis | fb5ee4c | 2019-07-22 13:08:04 -0500 | [diff] [blame] | 1389 | cbs.add("--msl-dispatch-base", [&args](CLIParser &) { args.msl_dispatch_base = true; }); |
Chip Davis | cb35934 | 2019-09-05 23:14:12 -0500 | [diff] [blame] | 1390 | cbs.add("--msl-dynamic-buffer", [&args](CLIParser &parser) { |
| 1391 | args.msl_argument_buffers = true; |
Hans-Kristian Arntzen | afa5480 | 2019-09-06 10:17:31 +0200 | [diff] [blame] | 1392 | // Make sure next_uint() is called in-order. |
Hans-Kristian Arntzen | 1935f1a | 2019-09-06 10:11:18 +0200 | [diff] [blame] | 1393 | uint32_t desc_set = parser.next_uint(); |
| 1394 | uint32_t binding = parser.next_uint(); |
| 1395 | args.msl_dynamic_buffers.push_back(make_pair(desc_set, binding)); |
Chip Davis | cb35934 | 2019-09-05 23:14:12 -0500 | [diff] [blame] | 1396 | }); |
Akio Gaule | 1280df6 | 2019-11-27 01:02:46 -0800 | [diff] [blame] | 1397 | cbs.add("--msl-decoration-binding", [&args](CLIParser &) { args.msl_decoration_binding = true; }); |
Hans-Kristian Arntzen | 7a41125 | 2020-01-16 15:20:59 +0100 | [diff] [blame] | 1398 | cbs.add("--msl-force-active-argument-buffer-resources", |
| 1399 | [&args](CLIParser &) { args.msl_force_active_argument_buffer_resources = true; }); |
Chip Davis | fedbc35 | 2019-12-16 22:58:16 -0600 | [diff] [blame] | 1400 | cbs.add("--msl-inline-uniform-block", [&args](CLIParser &parser) { |
| 1401 | args.msl_argument_buffers = true; |
| 1402 | // Make sure next_uint() is called in-order. |
| 1403 | uint32_t desc_set = parser.next_uint(); |
| 1404 | uint32_t binding = parser.next_uint(); |
| 1405 | args.msl_inline_uniform_blocks.push_back(make_pair(desc_set, binding)); |
| 1406 | }); |
Hans-Kristian Arntzen | c2655ab | 2020-03-19 14:21:42 +0100 | [diff] [blame] | 1407 | cbs.add("--msl-force-native-arrays", [&args](CLIParser &) { args.msl_force_native_arrays = true; }); |
Chip Davis | b29f83c | 2020-04-10 01:13:33 -0500 | [diff] [blame] | 1408 | cbs.add("--msl-disable-frag-depth-builtin", [&args](CLIParser &) { args.msl_enable_frag_depth_builtin = false; }); |
| 1409 | cbs.add("--msl-disable-frag-stencil-ref-builtin", |
| 1410 | [&args](CLIParser &) { args.msl_enable_frag_stencil_ref_builtin = false; }); |
| 1411 | cbs.add("--msl-enable-frag-output-mask", |
| 1412 | [&args](CLIParser &parser) { args.msl_enable_frag_output_mask = parser.next_hex_uint(); }); |
Hans-Kristian Arntzen | ebf4636 | 2020-04-20 09:48:20 +0200 | [diff] [blame] | 1413 | cbs.add("--msl-no-clip-distance-user-varying", |
| 1414 | [&args](CLIParser &) { args.msl_enable_clip_distance_user_varying = false; }); |
Chip Davis | 5281d99 | 2020-06-13 23:03:30 -0500 | [diff] [blame] | 1415 | cbs.add("--msl-shader-input", [&args](CLIParser &parser) { |
| 1416 | MSLShaderInput input; |
| 1417 | // Make sure next_uint() is called in-order. |
| 1418 | input.location = parser.next_uint(); |
| 1419 | const char *format = parser.next_value_string("other"); |
Chip Davis | 688c5fc | 2020-02-20 21:38:28 -0600 | [diff] [blame] | 1420 | if (strcmp(format, "any32") == 0) |
| 1421 | input.format = MSL_SHADER_INPUT_FORMAT_ANY32; |
| 1422 | else if (strcmp(format, "any16") == 0) |
| 1423 | input.format = MSL_SHADER_INPUT_FORMAT_ANY16; |
| 1424 | else if (strcmp(format, "u16") == 0) |
| 1425 | input.format = MSL_SHADER_INPUT_FORMAT_UINT16; |
Chip Davis | 5281d99 | 2020-06-13 23:03:30 -0500 | [diff] [blame] | 1426 | else if (strcmp(format, "u8") == 0) |
Chip Davis | 688c5fc | 2020-02-20 21:38:28 -0600 | [diff] [blame] | 1427 | input.format = MSL_SHADER_INPUT_FORMAT_UINT8; |
Chip Davis | 5281d99 | 2020-06-13 23:03:30 -0500 | [diff] [blame] | 1428 | else |
Chip Davis | 688c5fc | 2020-02-20 21:38:28 -0600 | [diff] [blame] | 1429 | input.format = MSL_SHADER_INPUT_FORMAT_OTHER; |
Chip Davis | 5281d99 | 2020-06-13 23:03:30 -0500 | [diff] [blame] | 1430 | input.vecsize = parser.next_uint(); |
| 1431 | args.msl_shader_inputs.push_back(input); |
| 1432 | }); |
Chip Davis | 688c5fc | 2020-02-20 21:38:28 -0600 | [diff] [blame] | 1433 | cbs.add("--msl-multi-patch-workgroup", [&args](CLIParser &) { args.msl_multi_patch_workgroup = true; }); |
| 1434 | cbs.add("--msl-vertex-for-tessellation", [&args](CLIParser &) { args.msl_vertex_for_tessellation = true; }); |
Tomek Ponitka | 18f23c4 | 2020-07-22 18:37:17 +0200 | [diff] [blame] | 1435 | cbs.add("--msl-additional-fixed-sample-mask", |
| 1436 | [&args](CLIParser &parser) { args.msl_additional_fixed_sample_mask = parser.next_hex_uint(); }); |
Chip Davis | 4cf840e | 2020-08-27 19:24:20 -0500 | [diff] [blame] | 1437 | cbs.add("--msl-arrayed-subpass-input", [&args](CLIParser &) { args.msl_arrayed_subpass_input = true; }); |
Chip Davis | 21d38f7 | 2020-10-13 13:20:49 -0500 | [diff] [blame^] | 1438 | cbs.add("--msl-r32ui-linear-texture-align", |
| 1439 | [&args](CLIParser &parser) { args.msl_r32ui_linear_texture_alignment = parser.next_uint(); }); |
| 1440 | cbs.add("--msl-r32ui-linear-texture-align-constant-id", |
| 1441 | [&args](CLIParser &parser) { args.msl_r32ui_alignment_constant_id = parser.next_uint(); }); |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 1442 | cbs.add("--extension", [&args](CLIParser &parser) { args.extensions.push_back(parser.next_string()); }); |
Hans-Kristian Arntzen | 4427cb9 | 2017-11-13 13:49:11 +0100 | [diff] [blame] | 1443 | cbs.add("--rename-entry-point", [&args](CLIParser &parser) { |
| 1444 | auto old_name = parser.next_string(); |
| 1445 | auto new_name = parser.next_string(); |
Hans-Kristian Arntzen | eecbeaa | 2018-03-01 14:00:04 +0100 | [diff] [blame] | 1446 | auto model = stage_to_execution_model(parser.next_string()); |
| 1447 | args.entry_point_rename.push_back({ old_name, new_name, move(model) }); |
Hans-Kristian Arntzen | 4427cb9 | 2017-11-13 13:49:11 +0100 | [diff] [blame] | 1448 | }); |
Hans-Kristian Arntzen | 042475e | 2016-07-28 11:16:02 +0200 | [diff] [blame] | 1449 | cbs.add("--entry", [&args](CLIParser &parser) { args.entry = parser.next_string(); }); |
Hans-Kristian Arntzen | eecbeaa | 2018-03-01 14:00:04 +0100 | [diff] [blame] | 1450 | cbs.add("--stage", [&args](CLIParser &parser) { args.entry_stage = parser.next_string(); }); |
Hans-Kristian Arntzen | 36650c8 | 2017-05-22 15:30:43 +0200 | [diff] [blame] | 1451 | cbs.add("--separate-shader-objects", [&args](CLIParser &) { args.sso = true; }); |
Hans-Kristian Arntzen | 4f88f97 | 2017-11-13 09:46:45 +0100 | [diff] [blame] | 1452 | cbs.add("--set-hlsl-vertex-input-semantic", [&args](CLIParser &parser) { |
| 1453 | HLSLVertexAttributeRemap remap; |
| 1454 | remap.location = parser.next_uint(); |
| 1455 | remap.semantic = parser.next_string(); |
| 1456 | args.hlsl_attr_remap.push_back(move(remap)); |
| 1457 | }); |
| 1458 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 1459 | cbs.add("--remap", [&args](CLIParser &parser) { |
Hans-Kristian Arntzen | f486142 | 2017-11-13 09:52:35 +0100 | [diff] [blame] | 1460 | string src = parser.next_string(); |
| 1461 | string dst = parser.next_string(); |
| 1462 | uint32_t components = parser.next_uint(); |
| 1463 | args.remaps.push_back({ move(src), move(dst), components }); |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 1464 | }); |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 1465 | |
Panagiotis Christopoulos Charitos | 66e76d9 | 2016-09-20 10:17:41 +0200 | [diff] [blame] | 1466 | cbs.add("--remap-variable-type", [&args](CLIParser &parser) { |
| 1467 | string var_name = parser.next_string(); |
| 1468 | string new_type = parser.next_string(); |
| 1469 | args.variable_type_remaps.push_back({ move(var_name), move(new_type) }); |
| 1470 | }); |
| 1471 | |
Jason Chan | 9f1eb5a | 2017-06-23 22:20:42 +0200 | [diff] [blame] | 1472 | cbs.add("--rename-interface-variable", [&args](CLIParser &parser) { |
Jason Chan | 3281e82 | 2017-06-25 15:16:09 +0200 | [diff] [blame] | 1473 | StorageClass cls = StorageClassMax; |
| 1474 | string clsStr = parser.next_string(); |
| 1475 | if (clsStr == "in") |
| 1476 | cls = StorageClassInput; |
| 1477 | else if (clsStr == "out") |
| 1478 | cls = StorageClassOutput; |
| 1479 | |
Jason Chan | 9f1eb5a | 2017-06-23 22:20:42 +0200 | [diff] [blame] | 1480 | uint32_t loc = parser.next_uint(); |
| 1481 | string var_name = parser.next_string(); |
Jason Chan | 3281e82 | 2017-06-25 15:16:09 +0200 | [diff] [blame] | 1482 | args.interface_variable_renames.push_back({ cls, loc, move(var_name) }); |
Jason Chan | 9f1eb5a | 2017-06-23 22:20:42 +0200 | [diff] [blame] | 1483 | }); |
| 1484 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 1485 | cbs.add("--pls-in", [&args](CLIParser &parser) { |
| 1486 | auto fmt = pls_format(parser.next_string()); |
| 1487 | auto name = parser.next_string(); |
| 1488 | args.pls_in.push_back({ move(fmt), move(name) }); |
| 1489 | }); |
| 1490 | cbs.add("--pls-out", [&args](CLIParser &parser) { |
| 1491 | auto fmt = pls_format(parser.next_string()); |
| 1492 | auto name = parser.next_string(); |
| 1493 | args.pls_out.push_back({ move(fmt), move(name) }); |
| 1494 | }); |
Hans-Kristian Arntzen | 2e3c6ec | 2017-02-16 11:17:12 +0100 | [diff] [blame] | 1495 | cbs.add("--shader-model", [&args](CLIParser &parser) { |
| 1496 | args.shader_model = parser.next_uint(); |
| 1497 | args.set_shader_model = true; |
| 1498 | }); |
Bill Hollings | bac657d | 2017-11-07 15:38:13 -0500 | [diff] [blame] | 1499 | cbs.add("--msl-version", [&args](CLIParser &parser) { |
| 1500 | args.msl_version = parser.next_uint(); |
| 1501 | args.set_msl_version = true; |
| 1502 | }); |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 1503 | |
Hans-Kristian Arntzen | f61a5d1 | 2016-08-26 12:58:50 +0200 | [diff] [blame] | 1504 | cbs.add("--remove-unused-variables", [&args](CLIParser &) { args.remove_unused = true; }); |
Hans-Kristian Arntzen | a1b3964 | 2018-05-25 10:14:13 +0200 | [diff] [blame] | 1505 | cbs.add("--combined-samplers-inherit-bindings", |
| 1506 | [&args](CLIParser &) { args.combined_samplers_inherit_bindings = true; }); |
Hans-Kristian Arntzen | f61a5d1 | 2016-08-26 12:58:50 +0200 | [diff] [blame] | 1507 | |
Hans-Kristian Arntzen | b29629f | 2018-06-22 10:01:38 +0200 | [diff] [blame] | 1508 | cbs.add("--no-support-nonzero-baseinstance", [&](CLIParser &) { args.support_nonzero_baseinstance = false; }); |
Hans-Kristian Arntzen | 65af09d | 2019-05-28 13:41:46 +0200 | [diff] [blame] | 1509 | cbs.add("--emit-line-directives", [&args](CLIParser &) { args.emit_line_directives = true; }); |
Hans-Kristian Arntzen | b29629f | 2018-06-22 10:01:38 +0200 | [diff] [blame] | 1510 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 1511 | cbs.default_handler = [&args](const char *value) { args.input = value; }; |
| 1512 | cbs.error_handler = [] { print_help(); }; |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 1513 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 1514 | CLIParser parser{ move(cbs), argc - 1, argv + 1 }; |
| 1515 | if (!parser.parse()) |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 1516 | return EXIT_FAILURE; |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 1517 | else if (parser.ended_state) |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 1518 | return EXIT_SUCCESS; |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 1519 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 1520 | if (!args.input) |
| 1521 | { |
| 1522 | fprintf(stderr, "Didn't specify input file.\n"); |
| 1523 | print_help(); |
| 1524 | return EXIT_FAILURE; |
| 1525 | } |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 1526 | |
Hans-Kristian Arntzen | 5bcf02f | 2018-10-05 11:30:57 +0200 | [diff] [blame] | 1527 | auto spirv_file = read_spirv_file(args.input); |
| 1528 | if (spirv_file.empty()) |
| 1529 | return EXIT_FAILURE; |
Hans-Kristian Arntzen | 5bcf02f | 2018-10-05 11:30:57 +0200 | [diff] [blame] | 1530 | |
Brad Davis | 6c88b00 | 2018-06-18 09:30:16 -0700 | [diff] [blame] | 1531 | // Special case reflection because it has little to do with the path followed by code-outputting compilers |
| 1532 | if (!args.reflect.empty()) |
| 1533 | { |
Hans-Kristian Arntzen | c60b9a1 | 2019-04-08 11:53:13 +0200 | [diff] [blame] | 1534 | Parser spirv_parser(move(spirv_file)); |
| 1535 | spirv_parser.parse(); |
| 1536 | |
Hans-Kristian Arntzen | 5bcf02f | 2018-10-05 11:30:57 +0200 | [diff] [blame] | 1537 | CompilerReflection compiler(move(spirv_parser.get_parsed_ir())); |
Brad Davis | 6c88b00 | 2018-06-18 09:30:16 -0700 | [diff] [blame] | 1538 | compiler.set_format(args.reflect); |
| 1539 | auto json = compiler.compile(); |
| 1540 | if (args.output) |
| 1541 | write_string_to_file(args.output, json.c_str()); |
| 1542 | else |
| 1543 | printf("%s", json.c_str()); |
| 1544 | return EXIT_SUCCESS; |
| 1545 | } |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 1546 | |
Hans-Kristian Arntzen | c60b9a1 | 2019-04-08 11:53:13 +0200 | [diff] [blame] | 1547 | string compiled_output; |
Hans-Kristian Arntzen | bcb5560 | 2016-09-10 13:56:36 +0200 | [diff] [blame] | 1548 | |
Hans-Kristian Arntzen | c60b9a1 | 2019-04-08 11:53:13 +0200 | [diff] [blame] | 1549 | if (args.iterations == 1) |
| 1550 | compiled_output = compile_iteration(args, move(spirv_file)); |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 1551 | else |
Hans-Kristian Arntzen | bcb5560 | 2016-09-10 13:56:36 +0200 | [diff] [blame] | 1552 | { |
Hans-Kristian Arntzen | c60b9a1 | 2019-04-08 11:53:13 +0200 | [diff] [blame] | 1553 | for (unsigned i = 0; i < args.iterations; i++) |
| 1554 | compiled_output = compile_iteration(args, spirv_file); |
Hans-Kristian Arntzen | 4f88f97 | 2017-11-13 09:46:45 +0100 | [diff] [blame] | 1555 | } |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 1556 | |
| 1557 | if (args.output) |
Hans-Kristian Arntzen | c60b9a1 | 2019-04-08 11:53:13 +0200 | [diff] [blame] | 1558 | write_string_to_file(args.output, compiled_output.c_str()); |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 1559 | else |
Hans-Kristian Arntzen | c60b9a1 | 2019-04-08 11:53:13 +0200 | [diff] [blame] | 1560 | printf("%s", compiled_output.c_str()); |
Hans-Kristian Arntzen | d9cbc03 | 2017-09-08 09:33:34 +0200 | [diff] [blame] | 1561 | |
| 1562 | return EXIT_SUCCESS; |
| 1563 | } |
| 1564 | |
| 1565 | int main(int argc, char *argv[]) |
| 1566 | { |
| 1567 | #ifdef SPIRV_CROSS_EXCEPTIONS_TO_ASSERTIONS |
| 1568 | return main_inner(argc, argv); |
| 1569 | #else |
| 1570 | // Make sure we catch the exception or it just disappears into the aether on Windows. |
| 1571 | try |
| 1572 | { |
| 1573 | return main_inner(argc, argv); |
| 1574 | } |
| 1575 | catch (const std::exception &e) |
| 1576 | { |
| 1577 | fprintf(stderr, "SPIRV-Cross threw an exception: %s\n", e.what()); |
| 1578 | return EXIT_FAILURE; |
| 1579 | } |
| 1580 | #endif |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 1581 | } |