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 | ce3fe29 | 2017-01-12 10:57:44 +0100 | [diff] [blame] | 38 | #ifdef _MSC_VER |
Hans-Kristian Arntzen | 27f4f75 | 2017-01-13 16:32:54 +0100 | [diff] [blame] | 39 | #pragma warning(disable : 4996) |
Hans-Kristian Arntzen | ce3fe29 | 2017-01-12 10:57:44 +0100 | [diff] [blame] | 40 | #endif |
| 41 | |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 42 | using namespace spv; |
Hans-Kristian Arntzen | 9b92e68 | 2019-03-29 10:29:44 +0100 | [diff] [blame] | 43 | using namespace SPIRV_CROSS_NAMESPACE; |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 44 | using namespace std; |
| 45 | |
Panagiotis Christopoulos Charitos | 7f69f93 | 2016-12-15 20:46:10 +0100 | [diff] [blame] | 46 | #ifdef SPIRV_CROSS_EXCEPTIONS_TO_ASSERTIONS |
Hans-Kristian Arntzen | d9cbc03 | 2017-09-08 09:33:34 +0200 | [diff] [blame] | 47 | static inline void THROW(const char *str) |
| 48 | { |
| 49 | fprintf(stderr, "SPIRV-Cross will abort: %s\n", str); |
| 50 | fflush(stderr); |
| 51 | abort(); |
| 52 | } |
Panagiotis Christopoulos Charitos | 7f69f93 | 2016-12-15 20:46:10 +0100 | [diff] [blame] | 53 | #else |
Hans-Kristian Arntzen | c92b839 | 2017-02-16 11:06:57 +0100 | [diff] [blame] | 54 | #define THROW(x) throw runtime_error(x) |
Panagiotis Christopoulos Charitos | 7f69f93 | 2016-12-15 20:46:10 +0100 | [diff] [blame] | 55 | #endif |
| 56 | |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 57 | struct CLIParser; |
| 58 | struct CLICallbacks |
| 59 | { |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 60 | void add(const char *cli, const function<void(CLIParser &)> &func) |
| 61 | { |
| 62 | callbacks[cli] = func; |
| 63 | } |
| 64 | unordered_map<string, function<void(CLIParser &)>> callbacks; |
| 65 | function<void()> error_handler; |
| 66 | function<void(const char *)> default_handler; |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 67 | }; |
| 68 | |
| 69 | struct CLIParser |
| 70 | { |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 71 | CLIParser(CLICallbacks cbs_, int argc_, char *argv_[]) |
| 72 | : cbs(move(cbs_)) |
| 73 | , argc(argc_) |
| 74 | , argv(argv_) |
| 75 | { |
| 76 | } |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 77 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 78 | bool parse() |
| 79 | { |
Panagiotis Christopoulos Charitos | 7f69f93 | 2016-12-15 20:46:10 +0100 | [diff] [blame] | 80 | #ifndef SPIRV_CROSS_EXCEPTIONS_TO_ASSERTIONS |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 81 | try |
Panagiotis Christopoulos Charitos | 7f69f93 | 2016-12-15 20:46:10 +0100 | [diff] [blame] | 82 | #endif |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 83 | { |
| 84 | while (argc && !ended_state) |
| 85 | { |
| 86 | const char *next = *argv++; |
| 87 | argc--; |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 88 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 89 | if (*next != '-' && cbs.default_handler) |
| 90 | { |
| 91 | cbs.default_handler(next); |
| 92 | } |
| 93 | else |
| 94 | { |
| 95 | auto itr = cbs.callbacks.find(next); |
| 96 | if (itr == ::end(cbs.callbacks)) |
| 97 | { |
Panagiotis Christopoulos Charitos | 7f69f93 | 2016-12-15 20:46:10 +0100 | [diff] [blame] | 98 | THROW("Invalid argument"); |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 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 | itr->second(*this); |
| 102 | } |
| 103 | } |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 104 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 105 | return true; |
| 106 | } |
Panagiotis Christopoulos Charitos | 7f69f93 | 2016-12-15 20:46:10 +0100 | [diff] [blame] | 107 | #ifndef SPIRV_CROSS_EXCEPTIONS_TO_ASSERTIONS |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 108 | catch (...) |
| 109 | { |
| 110 | if (cbs.error_handler) |
| 111 | { |
| 112 | cbs.error_handler(); |
| 113 | } |
| 114 | return false; |
| 115 | } |
Panagiotis Christopoulos Charitos | 7f69f93 | 2016-12-15 20:46:10 +0100 | [diff] [blame] | 116 | #endif |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 117 | } |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 118 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 119 | void end() |
| 120 | { |
| 121 | ended_state = true; |
| 122 | } |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 123 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 124 | uint32_t next_uint() |
| 125 | { |
| 126 | if (!argc) |
| 127 | { |
Panagiotis Christopoulos Charitos | 7f69f93 | 2016-12-15 20:46:10 +0100 | [diff] [blame] | 128 | THROW("Tried to parse uint, but nothing left in arguments"); |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 129 | } |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 130 | |
Hans-Kristian Arntzen | 3a9b045 | 2018-06-03 12:00:22 +0200 | [diff] [blame] | 131 | uint64_t val = stoul(*argv); |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 132 | if (val > numeric_limits<uint32_t>::max()) |
| 133 | { |
Panagiotis Christopoulos Charitos | 7f69f93 | 2016-12-15 20:46:10 +0100 | [diff] [blame] | 134 | THROW("next_uint() out of range"); |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 135 | } |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 136 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 137 | argc--; |
| 138 | argv++; |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 139 | |
Hans-Kristian Arntzen | 3a9b045 | 2018-06-03 12:00:22 +0200 | [diff] [blame] | 140 | return uint32_t(val); |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 141 | } |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 142 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 143 | double next_double() |
| 144 | { |
| 145 | if (!argc) |
| 146 | { |
Panagiotis Christopoulos Charitos | 7f69f93 | 2016-12-15 20:46:10 +0100 | [diff] [blame] | 147 | THROW("Tried to parse double, but nothing left in arguments"); |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 148 | } |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 149 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 150 | double val = stod(*argv); |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 151 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 152 | argc--; |
| 153 | argv++; |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 154 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 155 | return val; |
| 156 | } |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 157 | |
Brad Davis | 709d3c6 | 2018-06-03 11:16:37 -0700 | [diff] [blame] | 158 | // 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] | 159 | const char *next_value_string(const char *default_value) |
Brad Davis | 709d3c6 | 2018-06-03 11:16:37 -0700 | [diff] [blame] | 160 | { |
| 161 | if (!argc) |
| 162 | { |
Brad Davis | 7620400 | 2018-06-20 10:25:38 -0700 | [diff] [blame] | 163 | return default_value; |
Brad Davis | 709d3c6 | 2018-06-03 11:16:37 -0700 | [diff] [blame] | 164 | } |
| 165 | |
| 166 | if (0 == strncmp("--", *argv, 2)) |
| 167 | { |
Brad Davis | 7620400 | 2018-06-20 10:25:38 -0700 | [diff] [blame] | 168 | return default_value; |
Brad Davis | 709d3c6 | 2018-06-03 11:16:37 -0700 | [diff] [blame] | 169 | } |
| 170 | |
| 171 | return next_string(); |
| 172 | } |
| 173 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 174 | const char *next_string() |
| 175 | { |
| 176 | if (!argc) |
| 177 | { |
Panagiotis Christopoulos Charitos | 7f69f93 | 2016-12-15 20:46:10 +0100 | [diff] [blame] | 178 | THROW("Tried to parse string, but nothing left in arguments"); |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 179 | } |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 180 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 181 | const char *ret = *argv; |
| 182 | argc--; |
| 183 | argv++; |
| 184 | return ret; |
| 185 | } |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 186 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 187 | CLICallbacks cbs; |
| 188 | int argc; |
| 189 | char **argv; |
| 190 | bool ended_state = false; |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 191 | }; |
| 192 | |
Hans-Kristian Arntzen | 3fe57d3 | 2019-04-09 12:46:23 +0200 | [diff] [blame] | 193 | static vector<uint32_t> read_spirv_file(const char *path) |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 194 | { |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 195 | FILE *file = fopen(path, "rb"); |
| 196 | if (!file) |
| 197 | { |
Hans-Kristian Arntzen | 5bcf02f | 2018-10-05 11:30:57 +0200 | [diff] [blame] | 198 | fprintf(stderr, "Failed to open SPIR-V file: %s\n", path); |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 199 | return {}; |
| 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 | fseek(file, 0, SEEK_END); |
| 203 | long len = ftell(file) / sizeof(uint32_t); |
| 204 | rewind(file); |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 205 | |
Hans-Kristian Arntzen | 3fe57d3 | 2019-04-09 12:46:23 +0200 | [diff] [blame] | 206 | vector<uint32_t> spirv(len); |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 207 | if (fread(spirv.data(), sizeof(uint32_t), len, file) != size_t(len)) |
| 208 | spirv.clear(); |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 209 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 210 | fclose(file); |
| 211 | return spirv; |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 212 | } |
| 213 | |
| 214 | static bool write_string_to_file(const char *path, const char *string) |
| 215 | { |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 216 | FILE *file = fopen(path, "w"); |
| 217 | if (!file) |
| 218 | { |
hesiod | ba38158 | 2017-05-30 17:17:51 +0300 | [diff] [blame] | 219 | fprintf(stderr, "Failed to write file: %s\n", path); |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 220 | return false; |
| 221 | } |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 222 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 223 | fprintf(file, "%s", string); |
| 224 | fclose(file); |
| 225 | return true; |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 226 | } |
| 227 | |
Hans-Kristian Arntzen | a489ba7 | 2019-04-02 11:19:03 +0200 | [diff] [blame] | 228 | 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] | 229 | { |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 230 | fprintf(stderr, "%s\n", tag); |
| 231 | fprintf(stderr, "=============\n\n"); |
Hans-Kristian Arntzen | ec45c9e | 2017-04-19 17:33:14 +0200 | [diff] [blame] | 232 | bool print_ssbo = !strcmp(tag, "ssbos"); |
| 233 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 234 | for (auto &res : resources) |
| 235 | { |
| 236 | auto &type = compiler.get_type(res.type_id); |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 237 | |
Hans-Kristian Arntzen | ec45c9e | 2017-04-19 17:33:14 +0200 | [diff] [blame] | 238 | if (print_ssbo && compiler.buffer_is_hlsl_counter_buffer(res.id)) |
| 239 | continue; |
| 240 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 241 | // If we don't have a name, use the fallback for the type instead of the variable |
| 242 | // for SSBOs and UBOs since those are the only meaningful names to use externally. |
| 243 | // Push constant blocks are still accessed by name and not block name, even though they are technically Blocks. |
| 244 | bool is_push_constant = compiler.get_storage_class(res.id) == StorageClassPushConstant; |
Hans-Kristian Arntzen | e8e5884 | 2018-03-12 13:09:25 +0100 | [diff] [blame] | 245 | bool is_block = compiler.get_decoration_bitset(type.self).get(DecorationBlock) || |
| 246 | compiler.get_decoration_bitset(type.self).get(DecorationBufferBlock); |
Hans-Kristian Arntzen | b9600aa | 2016-11-29 09:04:28 +0100 | [diff] [blame] | 247 | bool is_sized_block = is_block && (compiler.get_storage_class(res.id) == StorageClassUniform || |
| 248 | compiler.get_storage_class(res.id) == StorageClassUniformConstant); |
Hans-Kristian Arntzen | 333980a | 2019-09-05 12:43:40 +0200 | [diff] [blame] | 249 | 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] | 250 | |
Hans-Kristian Arntzen | 2d79d36 | 2016-11-28 15:01:36 +0100 | [diff] [blame] | 251 | uint32_t block_size = 0; |
Hans-Kristian Arntzen | e86018f | 2018-09-10 11:08:47 +0200 | [diff] [blame] | 252 | uint32_t runtime_array_stride = 0; |
Hans-Kristian Arntzen | b9600aa | 2016-11-29 09:04:28 +0100 | [diff] [blame] | 253 | if (is_sized_block) |
Hans-Kristian Arntzen | e86018f | 2018-09-10 11:08:47 +0200 | [diff] [blame] | 254 | { |
| 255 | auto &base_type = compiler.get_type(res.base_type_id); |
| 256 | block_size = uint32_t(compiler.get_declared_struct_size(base_type)); |
| 257 | runtime_array_stride = uint32_t(compiler.get_declared_struct_size_runtime_array(base_type, 1) - |
| 258 | compiler.get_declared_struct_size_runtime_array(base_type, 0)); |
| 259 | } |
Hans-Kristian Arntzen | 2d79d36 | 2016-11-28 15:01:36 +0100 | [diff] [blame] | 260 | |
Hans-Kristian Arntzen | 3a9b045 | 2018-06-03 12:00:22 +0200 | [diff] [blame] | 261 | Bitset mask; |
| 262 | if (print_ssbo) |
| 263 | mask = compiler.get_buffer_block_flags(res.id); |
| 264 | else |
| 265 | mask = compiler.get_decoration_bitset(res.id); |
| 266 | |
Hans-Kristian Arntzen | 5c24d99 | 2016-07-12 21:20:18 +0200 | [diff] [blame] | 267 | string array; |
| 268 | for (auto arr : type.array) |
| 269 | array = join("[", arr ? convert_to_string(arr) : "", "]") + array; |
| 270 | |
Hans-Kristian Arntzen | 333980a | 2019-09-05 12:43:40 +0200 | [diff] [blame] | 271 | fprintf(stderr, " ID %03u : %s%s", uint32_t(res.id), |
Hans-Kristian Arntzen | 5c24d99 | 2016-07-12 21:20:18 +0200 | [diff] [blame] | 272 | !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] | 273 | |
Hans-Kristian Arntzen | e8e5884 | 2018-03-12 13:09:25 +0100 | [diff] [blame] | 274 | if (mask.get(DecorationLocation)) |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 275 | fprintf(stderr, " (Location : %u)", compiler.get_decoration(res.id, DecorationLocation)); |
Hans-Kristian Arntzen | e8e5884 | 2018-03-12 13:09:25 +0100 | [diff] [blame] | 276 | if (mask.get(DecorationDescriptorSet)) |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 277 | fprintf(stderr, " (Set : %u)", compiler.get_decoration(res.id, DecorationDescriptorSet)); |
Hans-Kristian Arntzen | e8e5884 | 2018-03-12 13:09:25 +0100 | [diff] [blame] | 278 | if (mask.get(DecorationBinding)) |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 279 | fprintf(stderr, " (Binding : %u)", compiler.get_decoration(res.id, DecorationBinding)); |
Hans-Kristian Arntzen | e8e5884 | 2018-03-12 13:09:25 +0100 | [diff] [blame] | 280 | if (mask.get(DecorationInputAttachmentIndex)) |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 281 | fprintf(stderr, " (Attachment : %u)", compiler.get_decoration(res.id, DecorationInputAttachmentIndex)); |
Hans-Kristian Arntzen | e8e5884 | 2018-03-12 13:09:25 +0100 | [diff] [blame] | 282 | if (mask.get(DecorationNonReadable)) |
Hans-Kristian Arntzen | 97f7ab8 | 2017-01-05 18:16:33 +0100 | [diff] [blame] | 283 | fprintf(stderr, " writeonly"); |
Hans-Kristian Arntzen | e8e5884 | 2018-03-12 13:09:25 +0100 | [diff] [blame] | 284 | if (mask.get(DecorationNonWritable)) |
Hans-Kristian Arntzen | 97f7ab8 | 2017-01-05 18:16:33 +0100 | [diff] [blame] | 285 | fprintf(stderr, " readonly"); |
Hans-Kristian Arntzen | b9600aa | 2016-11-29 09:04:28 +0100 | [diff] [blame] | 286 | if (is_sized_block) |
Hans-Kristian Arntzen | e86018f | 2018-09-10 11:08:47 +0200 | [diff] [blame] | 287 | { |
Hans-Kristian Arntzen | 2d79d36 | 2016-11-28 15:01:36 +0100 | [diff] [blame] | 288 | fprintf(stderr, " (BlockSize : %u bytes)", block_size); |
Hans-Kristian Arntzen | e86018f | 2018-09-10 11:08:47 +0200 | [diff] [blame] | 289 | if (runtime_array_stride) |
| 290 | fprintf(stderr, " (Unsized array stride: %u bytes)", runtime_array_stride); |
| 291 | } |
Hans-Kristian Arntzen | ec45c9e | 2017-04-19 17:33:14 +0200 | [diff] [blame] | 292 | |
| 293 | uint32_t counter_id = 0; |
| 294 | if (print_ssbo && compiler.buffer_get_hlsl_counter_buffer(res.id, counter_id)) |
| 295 | fprintf(stderr, " (HLSL counter buffer ID: %u)", counter_id); |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 296 | fprintf(stderr, "\n"); |
| 297 | } |
| 298 | fprintf(stderr, "=============\n\n"); |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 299 | } |
| 300 | |
Hans-Kristian Arntzen | 042475e | 2016-07-28 11:16:02 +0200 | [diff] [blame] | 301 | static const char *execution_model_to_str(spv::ExecutionModel model) |
| 302 | { |
| 303 | switch (model) |
| 304 | { |
| 305 | case spv::ExecutionModelVertex: |
| 306 | return "vertex"; |
| 307 | case spv::ExecutionModelTessellationControl: |
| 308 | return "tessellation control"; |
| 309 | case ExecutionModelTessellationEvaluation: |
| 310 | return "tessellation evaluation"; |
| 311 | case ExecutionModelGeometry: |
| 312 | return "geometry"; |
| 313 | case ExecutionModelFragment: |
| 314 | return "fragment"; |
| 315 | case ExecutionModelGLCompute: |
| 316 | return "compute"; |
Hans-Kristian Arntzen | 88ce958 | 2019-03-27 10:21:30 +0100 | [diff] [blame] | 317 | case ExecutionModelRayGenerationNV: |
| 318 | return "raygenNV"; |
| 319 | case ExecutionModelIntersectionNV: |
| 320 | return "intersectionNV"; |
| 321 | case ExecutionModelCallableNV: |
| 322 | return "callableNV"; |
| 323 | case ExecutionModelAnyHitNV: |
| 324 | return "anyhitNV"; |
| 325 | case ExecutionModelClosestHitNV: |
| 326 | return "closesthitNV"; |
| 327 | case ExecutionModelMissNV: |
| 328 | return "missNV"; |
Hans-Kristian Arntzen | 042475e | 2016-07-28 11:16:02 +0200 | [diff] [blame] | 329 | default: |
| 330 | return "???"; |
| 331 | } |
| 332 | } |
| 333 | |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 334 | static void print_resources(const Compiler &compiler, const ShaderResources &res) |
| 335 | { |
Hans-Kristian Arntzen | e8e5884 | 2018-03-12 13:09:25 +0100 | [diff] [blame] | 336 | auto &modes = compiler.get_execution_mode_bitset(); |
Hans-Kristian Arntzen | 3c285a1 | 2016-07-04 13:30:05 +0200 | [diff] [blame] | 337 | |
Hans-Kristian Arntzen | 042475e | 2016-07-28 11:16:02 +0200 | [diff] [blame] | 338 | fprintf(stderr, "Entry points:\n"); |
Hans-Kristian Arntzen | eecbeaa | 2018-03-01 14:00:04 +0100 | [diff] [blame] | 339 | auto entry_points = compiler.get_entry_points_and_stages(); |
Hans-Kristian Arntzen | 042475e | 2016-07-28 11:16:02 +0200 | [diff] [blame] | 340 | for (auto &e : entry_points) |
Hans-Kristian Arntzen | eecbeaa | 2018-03-01 14:00:04 +0100 | [diff] [blame] | 341 | 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] | 342 | fprintf(stderr, "\n"); |
| 343 | |
Hans-Kristian Arntzen | 3c285a1 | 2016-07-04 13:30:05 +0200 | [diff] [blame] | 344 | fprintf(stderr, "Execution modes:\n"); |
Hans-Kristian Arntzen | e8e5884 | 2018-03-12 13:09:25 +0100 | [diff] [blame] | 345 | modes.for_each_bit([&](uint32_t i) { |
Hans-Kristian Arntzen | 3c285a1 | 2016-07-04 13:30:05 +0200 | [diff] [blame] | 346 | auto mode = static_cast<ExecutionMode>(i); |
| 347 | uint32_t arg0 = compiler.get_execution_mode_argument(mode, 0); |
| 348 | uint32_t arg1 = compiler.get_execution_mode_argument(mode, 1); |
| 349 | uint32_t arg2 = compiler.get_execution_mode_argument(mode, 2); |
| 350 | |
| 351 | switch (static_cast<ExecutionMode>(i)) |
| 352 | { |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 353 | case ExecutionModeInvocations: |
| 354 | fprintf(stderr, " Invocations: %u\n", arg0); |
| 355 | break; |
Hans-Kristian Arntzen | 3c285a1 | 2016-07-04 13:30:05 +0200 | [diff] [blame] | 356 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 357 | case ExecutionModeLocalSize: |
| 358 | fprintf(stderr, " LocalSize: (%u, %u, %u)\n", arg0, arg1, arg2); |
| 359 | break; |
Hans-Kristian Arntzen | 3c285a1 | 2016-07-04 13:30:05 +0200 | [diff] [blame] | 360 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 361 | case ExecutionModeOutputVertices: |
| 362 | fprintf(stderr, " OutputVertices: %u\n", arg0); |
| 363 | break; |
Hans-Kristian Arntzen | 3c285a1 | 2016-07-04 13:30:05 +0200 | [diff] [blame] | 364 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 365 | #define CHECK_MODE(m) \ |
| 366 | case ExecutionMode##m: \ |
| 367 | fprintf(stderr, " %s\n", #m); \ |
| 368 | break |
| 369 | CHECK_MODE(SpacingEqual); |
| 370 | CHECK_MODE(SpacingFractionalEven); |
| 371 | CHECK_MODE(SpacingFractionalOdd); |
| 372 | CHECK_MODE(VertexOrderCw); |
| 373 | CHECK_MODE(VertexOrderCcw); |
| 374 | CHECK_MODE(PixelCenterInteger); |
| 375 | CHECK_MODE(OriginUpperLeft); |
| 376 | CHECK_MODE(OriginLowerLeft); |
| 377 | CHECK_MODE(EarlyFragmentTests); |
| 378 | CHECK_MODE(PointMode); |
| 379 | CHECK_MODE(Xfb); |
| 380 | CHECK_MODE(DepthReplacing); |
| 381 | CHECK_MODE(DepthGreater); |
| 382 | CHECK_MODE(DepthLess); |
| 383 | CHECK_MODE(DepthUnchanged); |
| 384 | CHECK_MODE(LocalSizeHint); |
| 385 | CHECK_MODE(InputPoints); |
| 386 | CHECK_MODE(InputLines); |
| 387 | CHECK_MODE(InputLinesAdjacency); |
| 388 | CHECK_MODE(Triangles); |
| 389 | CHECK_MODE(InputTrianglesAdjacency); |
| 390 | CHECK_MODE(Quads); |
| 391 | CHECK_MODE(Isolines); |
| 392 | CHECK_MODE(OutputPoints); |
| 393 | CHECK_MODE(OutputLineStrip); |
| 394 | CHECK_MODE(OutputTriangleStrip); |
| 395 | CHECK_MODE(VecTypeHint); |
| 396 | CHECK_MODE(ContractionOff); |
Hans-Kristian Arntzen | 3c285a1 | 2016-07-04 13:30:05 +0200 | [diff] [blame] | 397 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 398 | default: |
| 399 | break; |
Hans-Kristian Arntzen | 3c285a1 | 2016-07-04 13:30:05 +0200 | [diff] [blame] | 400 | } |
Hans-Kristian Arntzen | e8e5884 | 2018-03-12 13:09:25 +0100 | [diff] [blame] | 401 | }); |
Hans-Kristian Arntzen | 3c285a1 | 2016-07-04 13:30:05 +0200 | [diff] [blame] | 402 | fprintf(stderr, "\n"); |
| 403 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 404 | print_resources(compiler, "subpass inputs", res.subpass_inputs); |
| 405 | print_resources(compiler, "inputs", res.stage_inputs); |
| 406 | print_resources(compiler, "outputs", res.stage_outputs); |
| 407 | print_resources(compiler, "textures", res.sampled_images); |
Hans-Kristian Arntzen | 378fbe8 | 2016-09-11 13:47:06 +0200 | [diff] [blame] | 408 | print_resources(compiler, "separate images", res.separate_images); |
Hans-Kristian Arntzen | e920208 | 2016-09-10 13:05:35 +0200 | [diff] [blame] | 409 | print_resources(compiler, "separate samplers", res.separate_samplers); |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 410 | print_resources(compiler, "images", res.storage_images); |
| 411 | print_resources(compiler, "ssbos", res.storage_buffers); |
| 412 | print_resources(compiler, "ubos", res.uniform_buffers); |
| 413 | print_resources(compiler, "push", res.push_constant_buffers); |
| 414 | print_resources(compiler, "counters", res.atomic_counters); |
Hans-Kristian Arntzen | 88ce958 | 2019-03-27 10:21:30 +0100 | [diff] [blame] | 415 | print_resources(compiler, "acceleration structures", res.acceleration_structures); |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 416 | } |
| 417 | |
Hans-Kristian Arntzen | a489ba7 | 2019-04-02 11:19:03 +0200 | [diff] [blame] | 418 | 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] | 419 | { |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 420 | for (auto &block : res) |
| 421 | { |
| 422 | auto ranges = compiler.get_active_buffer_ranges(block.id); |
| 423 | fprintf(stderr, "Active members in buffer: %s\n", |
| 424 | !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] | 425 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 426 | fprintf(stderr, "==================\n\n"); |
| 427 | for (auto &range : ranges) |
| 428 | { |
Hans-Kristian Arntzen | 5c24d99 | 2016-07-12 21:20:18 +0200 | [diff] [blame] | 429 | 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] | 430 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 431 | fprintf(stderr, "Member #%3u (%s): Offset: %4u, Range: %4u\n", range.index, |
| 432 | !name.empty() ? name.c_str() : compiler.get_fallback_member_name(range.index).c_str(), |
| 433 | unsigned(range.offset), unsigned(range.range)); |
| 434 | } |
| 435 | fprintf(stderr, "==================\n\n"); |
| 436 | } |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 437 | } |
| 438 | |
Hans-Kristian Arntzen | 6bd545b | 2016-09-17 15:16:07 +0200 | [diff] [blame] | 439 | static void print_spec_constants(const Compiler &compiler) |
| 440 | { |
| 441 | auto spec_constants = compiler.get_specialization_constants(); |
| 442 | fprintf(stderr, "Specialization constants\n"); |
| 443 | fprintf(stderr, "==================\n\n"); |
| 444 | for (auto &c : spec_constants) |
Hans-Kristian Arntzen | 333980a | 2019-09-05 12:43:40 +0200 | [diff] [blame] | 445 | 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] | 446 | fprintf(stderr, "==================\n\n"); |
| 447 | } |
| 448 | |
Hans-Kristian Arntzen | 8d7a909 | 2017-08-15 15:27:53 +0200 | [diff] [blame] | 449 | static void print_capabilities_and_extensions(const Compiler &compiler) |
| 450 | { |
| 451 | fprintf(stderr, "Capabilities\n"); |
| 452 | fprintf(stderr, "============\n"); |
| 453 | for (auto &capability : compiler.get_declared_capabilities()) |
| 454 | fprintf(stderr, "Capability: %u\n", static_cast<unsigned>(capability)); |
| 455 | fprintf(stderr, "============\n\n"); |
| 456 | |
| 457 | fprintf(stderr, "Extensions\n"); |
| 458 | fprintf(stderr, "============\n"); |
| 459 | for (auto &ext : compiler.get_declared_extensions()) |
| 460 | fprintf(stderr, "Extension: %s\n", ext.c_str()); |
| 461 | fprintf(stderr, "============\n\n"); |
| 462 | } |
| 463 | |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 464 | struct PLSArg |
| 465 | { |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 466 | PlsFormat format; |
| 467 | string name; |
| 468 | }; |
| 469 | |
| 470 | struct Remap |
| 471 | { |
| 472 | string src_name; |
| 473 | string dst_name; |
| 474 | unsigned components; |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 475 | }; |
| 476 | |
Panagiotis Christopoulos Charitos | 66e76d9 | 2016-09-20 10:17:41 +0200 | [diff] [blame] | 477 | struct VariableTypeRemap |
| 478 | { |
| 479 | string variable_name; |
| 480 | string new_variable_type; |
| 481 | }; |
| 482 | |
Hans-Kristian Arntzen | d89d0e0 | 2017-07-24 09:29:20 +0200 | [diff] [blame] | 483 | struct InterfaceVariableRename |
| 484 | { |
| 485 | StorageClass storageClass; |
| 486 | uint32_t location; |
| 487 | string variable_name; |
Jason Chan | 3281e82 | 2017-06-25 15:16:09 +0200 | [diff] [blame] | 488 | }; |
| 489 | |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 490 | struct CLIArguments |
| 491 | { |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 492 | const char *input = nullptr; |
| 493 | const char *output = nullptr; |
| 494 | const char *cpp_interface_name = nullptr; |
| 495 | uint32_t version = 0; |
Hans-Kristian Arntzen | 2e3c6ec | 2017-02-16 11:17:12 +0100 | [diff] [blame] | 496 | uint32_t shader_model = 0; |
Bill Hollings | bac657d | 2017-11-07 15:38:13 -0500 | [diff] [blame] | 497 | uint32_t msl_version = 0; |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 498 | bool es = false; |
| 499 | bool set_version = false; |
Hans-Kristian Arntzen | 2e3c6ec | 2017-02-16 11:17:12 +0100 | [diff] [blame] | 500 | bool set_shader_model = false; |
Bill Hollings | bac657d | 2017-11-07 15:38:13 -0500 | [diff] [blame] | 501 | bool set_msl_version = false; |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 502 | bool set_es = false; |
| 503 | bool dump_resources = false; |
| 504 | bool force_temporary = false; |
| 505 | bool flatten_ubo = false; |
| 506 | bool fixup = false; |
Hans-Kristian Arntzen | bdfa97a | 2017-08-03 13:02:59 +0200 | [diff] [blame] | 507 | bool yflip = false; |
Hans-Kristian Arntzen | 36650c8 | 2017-05-22 15:30:43 +0200 | [diff] [blame] | 508 | bool sso = false; |
Hans-Kristian Arntzen | b29629f | 2018-06-22 10:01:38 +0200 | [diff] [blame] | 509 | bool support_nonzero_baseinstance = true; |
Chip Davis | c51e5b7 | 2019-01-08 16:33:32 -0600 | [diff] [blame] | 510 | bool msl_capture_output_to_buffer = false; |
Chip Davis | 2583321 | 2018-09-19 20:36:33 -0500 | [diff] [blame] | 511 | bool msl_swizzle_texture_samples = false; |
Chip Davis | 3a9af96 | 2018-09-26 20:06:05 -0500 | [diff] [blame] | 512 | bool msl_ios = false; |
Hans-Kristian Arntzen | b8033d7 | 2019-01-14 14:53:47 +0100 | [diff] [blame] | 513 | bool msl_pad_fragment_output = false; |
Chip Davis | 41d9424 | 2019-02-05 23:47:50 -0600 | [diff] [blame] | 514 | bool msl_domain_lower_left = false; |
Hans-Kristian Arntzen | e47a77d | 2019-03-14 10:29:34 +0100 | [diff] [blame] | 515 | bool msl_argument_buffers = false; |
Hans-Kristian Arntzen | fc4f39b | 2019-04-23 12:17:21 +0200 | [diff] [blame] | 516 | bool msl_texture_buffer_native = false; |
Lukas Hermanns | f3a6d28 | 2019-09-27 15:49:54 -0400 | [diff] [blame] | 517 | bool msl_framebuffer_fetch = false; |
Lukas Hermanns | ffbd801 | 2019-10-09 11:22:25 -0400 | [diff] [blame] | 518 | bool msl_invariant_float_math = false; |
Lukas Hermanns | f3a6d28 | 2019-09-27 15:49:54 -0400 | [diff] [blame] | 519 | bool msl_emulate_cube_array = false; |
Chip Davis | 7eecf5a | 2019-05-31 12:06:20 -0500 | [diff] [blame] | 520 | bool msl_multiview = false; |
Chip Davis | 6a58554 | 2019-07-12 21:50:50 -0500 | [diff] [blame] | 521 | bool msl_view_index_from_device_index = false; |
Chip Davis | fb5ee4c | 2019-07-22 13:08:04 -0500 | [diff] [blame] | 522 | bool msl_dispatch_base = false; |
Akio Gaule | 1280df6 | 2019-11-27 01:02:46 -0800 | [diff] [blame] | 523 | bool msl_decoration_binding = false; |
Hans-Kristian Arntzen | c3bd136 | 2020-01-16 11:07:30 +0100 | [diff] [blame] | 524 | bool msl_force_active_argument_buffer_resources = false; |
Hans-Kristian Arntzen | c9d4f9c | 2020-02-24 12:47:14 +0100 | [diff] [blame] | 525 | bool msl_force_native_arrays = false; |
Hans-Kristian Arntzen | 0474848 | 2019-03-19 10:58:37 +0100 | [diff] [blame] | 526 | bool glsl_emit_push_constant_as_ubo = false; |
Laszlo Agocs | 7bc3149 | 2019-05-11 16:30:33 +0200 | [diff] [blame] | 527 | bool glsl_emit_ubo_as_plain_uniforms = false; |
Hans-Kristian Arntzen | 12ca9d1 | 2019-07-25 11:07:14 +0200 | [diff] [blame] | 528 | bool vulkan_glsl_disable_ext_samplerless_texture_functions = false; |
Hans-Kristian Arntzen | 65af09d | 2019-05-28 13:41:46 +0200 | [diff] [blame] | 529 | bool emit_line_directives = false; |
Hans-Kristian Arntzen | a489ba7 | 2019-04-02 11:19:03 +0200 | [diff] [blame] | 530 | SmallVector<uint32_t> msl_discrete_descriptor_sets; |
Hans-Kristian Arntzen | 4bb673a | 2019-10-14 12:51:48 +0200 | [diff] [blame] | 531 | SmallVector<uint32_t> msl_device_argument_buffers; |
Chip Davis | cb35934 | 2019-09-05 23:14:12 -0500 | [diff] [blame] | 532 | SmallVector<pair<uint32_t, uint32_t>> msl_dynamic_buffers; |
Chip Davis | fedbc35 | 2019-12-16 22:58:16 -0600 | [diff] [blame] | 533 | SmallVector<pair<uint32_t, uint32_t>> msl_inline_uniform_blocks; |
Hans-Kristian Arntzen | a489ba7 | 2019-04-02 11:19:03 +0200 | [diff] [blame] | 534 | SmallVector<PLSArg> pls_in; |
| 535 | SmallVector<PLSArg> pls_out; |
| 536 | SmallVector<Remap> remaps; |
| 537 | SmallVector<string> extensions; |
| 538 | SmallVector<VariableTypeRemap> variable_type_remaps; |
| 539 | SmallVector<InterfaceVariableRename> interface_variable_renames; |
| 540 | SmallVector<HLSLVertexAttributeRemap> hlsl_attr_remap; |
Hans-Kristian Arntzen | 042475e | 2016-07-28 11:16:02 +0200 | [diff] [blame] | 541 | string entry; |
Hans-Kristian Arntzen | eecbeaa | 2018-03-01 14:00:04 +0100 | [diff] [blame] | 542 | string entry_stage; |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 543 | |
Hans-Kristian Arntzen | eecbeaa | 2018-03-01 14:00:04 +0100 | [diff] [blame] | 544 | struct Rename |
| 545 | { |
| 546 | string old_name; |
| 547 | string new_name; |
| 548 | ExecutionModel execution_model; |
| 549 | }; |
Hans-Kristian Arntzen | a489ba7 | 2019-04-02 11:19:03 +0200 | [diff] [blame] | 550 | SmallVector<Rename> entry_point_rename; |
Hans-Kristian Arntzen | 4427cb9 | 2017-11-13 13:49:11 +0100 | [diff] [blame] | 551 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 552 | uint32_t iterations = 1; |
| 553 | bool cpp = false; |
Brad Davis | 709d3c6 | 2018-06-03 11:16:37 -0700 | [diff] [blame] | 554 | string reflect; |
Bill Hollings | 5ad73f3 | 2017-03-19 21:06:21 -0400 | [diff] [blame] | 555 | bool msl = false; |
Robert Konrad | 216a681 | 2017-01-25 17:30:52 +0100 | [diff] [blame] | 556 | bool hlsl = false; |
Hans-Kristian Arntzen | 17d88ca | 2017-05-04 10:10:30 +0200 | [diff] [blame] | 557 | bool hlsl_compat = false; |
Hans-Kristian Arntzen | a2a44d9 | 2019-01-11 10:32:14 +0100 | [diff] [blame] | 558 | bool hlsl_support_nonzero_base = false; |
Hans-Kristian Arntzen | c27e1ef | 2020-03-04 16:32:52 +0100 | [diff] [blame^] | 559 | bool hlsl_force_storage_buffer_as_uav = false; |
Hans-Kristian Arntzen | e38cbb9 | 2019-11-12 10:49:01 +0100 | [diff] [blame] | 560 | HLSLBindingFlags hlsl_binding_flags = 0; |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 561 | bool vulkan_semantics = false; |
Hans-Kristian Arntzen | 470ae7a | 2017-05-22 17:40:00 +0200 | [diff] [blame] | 562 | bool flatten_multidimensional_arrays = false; |
Hans-Kristian Arntzen | 6599a41 | 2017-09-08 09:56:06 +0200 | [diff] [blame] | 563 | bool use_420pack_extension = true; |
Hans-Kristian Arntzen | f61a5d1 | 2016-08-26 12:58:50 +0200 | [diff] [blame] | 564 | bool remove_unused = false; |
Hans-Kristian Arntzen | ba15dae | 2018-05-23 20:34:26 +0100 | [diff] [blame] | 565 | bool combined_samplers_inherit_bindings = false; |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 566 | }; |
| 567 | |
Hans-Kristian Arntzen | 0b9a884 | 2019-05-24 15:23:29 +0200 | [diff] [blame] | 568 | static void print_version() |
| 569 | { |
| 570 | #ifdef HAVE_SPIRV_CROSS_GIT_VERSION |
| 571 | fprintf(stderr, "%s\n", SPIRV_CROSS_GIT_REVISION); |
| 572 | #else |
| 573 | fprintf(stderr, "Git revision unknown. Build with CMake to create timestamp and revision info.\n"); |
| 574 | #endif |
| 575 | } |
| 576 | |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 577 | static void print_help() |
| 578 | { |
Hans-Kristian Arntzen | 0b9a884 | 2019-05-24 15:23:29 +0200 | [diff] [blame] | 579 | print_version(); |
| 580 | |
Hans-Kristian Arntzen | e30a942 | 2018-04-18 16:19:55 +0200 | [diff] [blame] | 581 | fprintf(stderr, "Usage: spirv-cross\n" |
| 582 | "\t[--output <output path>]\n" |
| 583 | "\t[SPIR-V file]\n" |
| 584 | "\t[--es]\n" |
| 585 | "\t[--no-es]\n" |
| 586 | "\t[--version <GLSL version>]\n" |
| 587 | "\t[--dump-resources]\n" |
| 588 | "\t[--help]\n" |
Hans-Kristian Arntzen | 0b9a884 | 2019-05-24 15:23:29 +0200 | [diff] [blame] | 589 | "\t[--revision]\n" |
Hans-Kristian Arntzen | e30a942 | 2018-04-18 16:19:55 +0200 | [diff] [blame] | 590 | "\t[--force-temporary]\n" |
Hans-Kristian Arntzen | 3f2de0d | 2020-03-02 11:55:57 +0100 | [diff] [blame] | 591 | "\t[--vulkan-semantics] or [-V]\n" |
Hans-Kristian Arntzen | e30a942 | 2018-04-18 16:19:55 +0200 | [diff] [blame] | 592 | "\t[--flatten-ubo]\n" |
| 593 | "\t[--fixup-clipspace]\n" |
| 594 | "\t[--flip-vert-y]\n" |
| 595 | "\t[--iterations iter]\n" |
| 596 | "\t[--cpp]\n" |
| 597 | "\t[--cpp-interface-name <name>]\n" |
Hans-Kristian Arntzen | 0474848 | 2019-03-19 10:58:37 +0100 | [diff] [blame] | 598 | "\t[--glsl-emit-push-constant-as-ubo]\n" |
Laszlo Agocs | 7bc3149 | 2019-05-11 16:30:33 +0200 | [diff] [blame] | 599 | "\t[--glsl-emit-ubo-as-plain-uniforms]\n" |
Hans-Kristian Arntzen | 12ca9d1 | 2019-07-25 11:07:14 +0200 | [diff] [blame] | 600 | "\t[--vulkan-glsl-disable-ext-samplerless-texture-functions]\n" |
Hans-Kristian Arntzen | e30a942 | 2018-04-18 16:19:55 +0200 | [diff] [blame] | 601 | "\t[--msl]\n" |
| 602 | "\t[--msl-version <MMmmpp>]\n" |
Chip Davis | c51e5b7 | 2019-01-08 16:33:32 -0600 | [diff] [blame] | 603 | "\t[--msl-capture-output]\n" |
Chip Davis | 3a9af96 | 2018-09-26 20:06:05 -0500 | [diff] [blame] | 604 | "\t[--msl-swizzle-texture-samples]\n" |
| 605 | "\t[--msl-ios]\n" |
Hans-Kristian Arntzen | b8033d7 | 2019-01-14 14:53:47 +0100 | [diff] [blame] | 606 | "\t[--msl-pad-fragment-output]\n" |
Chip Davis | 41d9424 | 2019-02-05 23:47:50 -0600 | [diff] [blame] | 607 | "\t[--msl-domain-lower-left]\n" |
Hans-Kristian Arntzen | e47a77d | 2019-03-14 10:29:34 +0100 | [diff] [blame] | 608 | "\t[--msl-argument-buffers]\n" |
Hans-Kristian Arntzen | fc4f39b | 2019-04-23 12:17:21 +0200 | [diff] [blame] | 609 | "\t[--msl-texture-buffer-native]\n" |
Hans-Kristian Arntzen | 8ad9584 | 2019-10-24 10:56:36 +0200 | [diff] [blame] | 610 | "\t[--msl-framebuffer-fetch]\n" |
| 611 | "\t[--msl-emulate-cube-array]\n" |
Hans-Kristian Arntzen | e2aadf8 | 2019-03-15 21:53:21 +0100 | [diff] [blame] | 612 | "\t[--msl-discrete-descriptor-set <index>]\n" |
Hans-Kristian Arntzen | 4bb673a | 2019-10-14 12:51:48 +0200 | [diff] [blame] | 613 | "\t[--msl-device-argument-buffer <index>]\n" |
Chip Davis | 7eecf5a | 2019-05-31 12:06:20 -0500 | [diff] [blame] | 614 | "\t[--msl-multiview]\n" |
Chip Davis | 6a58554 | 2019-07-12 21:50:50 -0500 | [diff] [blame] | 615 | "\t[--msl-view-index-from-device-index]\n" |
Chip Davis | fb5ee4c | 2019-07-22 13:08:04 -0500 | [diff] [blame] | 616 | "\t[--msl-dispatch-base]\n" |
Chip Davis | cb35934 | 2019-09-05 23:14:12 -0500 | [diff] [blame] | 617 | "\t[--msl-dynamic-buffer <set index> <binding>]\n" |
Chip Davis | fedbc35 | 2019-12-16 22:58:16 -0600 | [diff] [blame] | 618 | "\t[--msl-inline-uniform-block <set index> <binding>]\n" |
Akio Gaule | 1280df6 | 2019-11-27 01:02:46 -0800 | [diff] [blame] | 619 | "\t[--msl-decoration-binding]\n" |
Hans-Kristian Arntzen | c3bd136 | 2020-01-16 11:07:30 +0100 | [diff] [blame] | 620 | "\t[--msl-force-active-argument-buffer-resources]\n" |
Hans-Kristian Arntzen | c9d4f9c | 2020-02-24 12:47:14 +0100 | [diff] [blame] | 621 | "\t[--msl-force-native-arrays]\n" |
Hans-Kristian Arntzen | e30a942 | 2018-04-18 16:19:55 +0200 | [diff] [blame] | 622 | "\t[--hlsl]\n" |
Hans-Kristian Arntzen | b29629f | 2018-06-22 10:01:38 +0200 | [diff] [blame] | 623 | "\t[--reflect]\n" |
Hans-Kristian Arntzen | e30a942 | 2018-04-18 16:19:55 +0200 | [diff] [blame] | 624 | "\t[--shader-model]\n" |
| 625 | "\t[--hlsl-enable-compat]\n" |
Hans-Kristian Arntzen | a2a44d9 | 2019-01-11 10:32:14 +0100 | [diff] [blame] | 626 | "\t[--hlsl-support-nonzero-basevertex-baseinstance]\n" |
Hans-Kristian Arntzen | e38cbb9 | 2019-11-12 10:49:01 +0100 | [diff] [blame] | 627 | "\t[--hlsl-auto-binding (push, cbv, srv, uav, sampler, all)]\n" |
Hans-Kristian Arntzen | c27e1ef | 2020-03-04 16:32:52 +0100 | [diff] [blame^] | 628 | "\t[--hlsl-force-storage-buffer-as-uav]\n" |
Hans-Kristian Arntzen | e30a942 | 2018-04-18 16:19:55 +0200 | [diff] [blame] | 629 | "\t[--separate-shader-objects]\n" |
| 630 | "\t[--pls-in format input-name]\n" |
| 631 | "\t[--pls-out format output-name]\n" |
| 632 | "\t[--remap source_name target_name components]\n" |
| 633 | "\t[--extension ext]\n" |
| 634 | "\t[--entry name]\n" |
| 635 | "\t[--stage <stage (vert, frag, geom, tesc, tese comp)>]\n" |
| 636 | "\t[--remove-unused-variables]\n" |
| 637 | "\t[--flatten-multidimensional-arrays]\n" |
| 638 | "\t[--no-420pack-extension]\n" |
| 639 | "\t[--remap-variable-type <variable_name> <new_variable_type>]\n" |
| 640 | "\t[--rename-interface-variable <in|out> <location> <new_variable_name>]\n" |
| 641 | "\t[--set-hlsl-vertex-input-semantic <location> <semantic>]\n" |
| 642 | "\t[--rename-entry-point <old> <new> <stage>]\n" |
Hans-Kristian Arntzen | b29629f | 2018-06-22 10:01:38 +0200 | [diff] [blame] | 643 | "\t[--combined-samplers-inherit-bindings]\n" |
| 644 | "\t[--no-support-nonzero-baseinstance]\n" |
Hans-Kristian Arntzen | 65af09d | 2019-05-28 13:41:46 +0200 | [diff] [blame] | 645 | "\t[--emit-line-directives]\n" |
Hans-Kristian Arntzen | d89d0e0 | 2017-07-24 09:29:20 +0200 | [diff] [blame] | 646 | "\n"); |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 647 | } |
| 648 | |
Hans-Kristian Arntzen | a489ba7 | 2019-04-02 11:19:03 +0200 | [diff] [blame] | 649 | 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] | 650 | { |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 651 | auto itr = |
| 652 | 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] | 653 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 654 | if (itr != end(resources)) |
| 655 | { |
| 656 | compiler.set_remapped_variable_state(itr->id, true); |
| 657 | compiler.set_name(itr->id, remap.dst_name); |
| 658 | compiler.set_subpass_input_remapped_components(itr->id, remap.components); |
| 659 | return true; |
| 660 | } |
| 661 | else |
| 662 | return false; |
| 663 | } |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 664 | |
Hans-Kristian Arntzen | 3fe57d3 | 2019-04-09 12:46:23 +0200 | [diff] [blame] | 665 | static vector<PlsRemap> remap_pls(const SmallVector<PLSArg> &pls_variables, const SmallVector<Resource> &resources, |
| 666 | const SmallVector<Resource> *secondary_resources) |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 667 | { |
Hans-Kristian Arntzen | 3fe57d3 | 2019-04-09 12:46:23 +0200 | [diff] [blame] | 668 | vector<PlsRemap> ret; |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 669 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 670 | for (auto &pls : pls_variables) |
| 671 | { |
| 672 | bool found = false; |
| 673 | for (auto &res : resources) |
| 674 | { |
| 675 | if (res.name == pls.name) |
| 676 | { |
| 677 | ret.push_back({ res.id, pls.format }); |
| 678 | found = true; |
| 679 | break; |
| 680 | } |
| 681 | } |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 682 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 683 | if (!found && secondary_resources) |
| 684 | { |
| 685 | for (auto &res : *secondary_resources) |
| 686 | { |
| 687 | if (res.name == pls.name) |
| 688 | { |
| 689 | ret.push_back({ res.id, pls.format }); |
| 690 | found = true; |
| 691 | break; |
| 692 | } |
| 693 | } |
| 694 | } |
| 695 | |
| 696 | if (!found) |
| 697 | fprintf(stderr, "Did not find stage input/output/target with name \"%s\".\n", pls.name.c_str()); |
| 698 | } |
| 699 | |
| 700 | return ret; |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 701 | } |
| 702 | |
| 703 | static PlsFormat pls_format(const char *str) |
| 704 | { |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 705 | if (!strcmp(str, "r11f_g11f_b10f")) |
| 706 | return PlsR11FG11FB10F; |
| 707 | else if (!strcmp(str, "r32f")) |
| 708 | return PlsR32F; |
| 709 | else if (!strcmp(str, "rg16f")) |
| 710 | return PlsRG16F; |
| 711 | else if (!strcmp(str, "rg16")) |
| 712 | return PlsRG16; |
| 713 | else if (!strcmp(str, "rgb10_a2")) |
| 714 | return PlsRGB10A2; |
| 715 | else if (!strcmp(str, "rgba8")) |
| 716 | return PlsRGBA8; |
| 717 | else if (!strcmp(str, "rgba8i")) |
| 718 | return PlsRGBA8I; |
| 719 | else if (!strcmp(str, "rgba8ui")) |
| 720 | return PlsRGBA8UI; |
| 721 | else if (!strcmp(str, "rg16i")) |
| 722 | return PlsRG16I; |
| 723 | else if (!strcmp(str, "rgb10_a2ui")) |
| 724 | return PlsRGB10A2UI; |
| 725 | else if (!strcmp(str, "rg16ui")) |
| 726 | return PlsRG16UI; |
| 727 | else if (!strcmp(str, "r32ui")) |
| 728 | return PlsR32UI; |
| 729 | else |
| 730 | return PlsNone; |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 731 | } |
| 732 | |
Hans-Kristian Arntzen | eecbeaa | 2018-03-01 14:00:04 +0100 | [diff] [blame] | 733 | static ExecutionModel stage_to_execution_model(const std::string &stage) |
| 734 | { |
| 735 | if (stage == "vert") |
| 736 | return ExecutionModelVertex; |
| 737 | else if (stage == "frag") |
| 738 | return ExecutionModelFragment; |
| 739 | else if (stage == "comp") |
| 740 | return ExecutionModelGLCompute; |
| 741 | else if (stage == "tesc") |
| 742 | return ExecutionModelTessellationControl; |
| 743 | else if (stage == "tese") |
| 744 | return ExecutionModelTessellationEvaluation; |
| 745 | else if (stage == "geom") |
| 746 | return ExecutionModelGeometry; |
| 747 | else |
| 748 | SPIRV_CROSS_THROW("Invalid stage."); |
| 749 | } |
| 750 | |
Hans-Kristian Arntzen | e38cbb9 | 2019-11-12 10:49:01 +0100 | [diff] [blame] | 751 | static HLSLBindingFlags hlsl_resource_type_to_flag(const std::string &arg) |
| 752 | { |
| 753 | if (arg == "push") |
| 754 | return HLSL_BINDING_AUTO_PUSH_CONSTANT_BIT; |
| 755 | else if (arg == "cbv") |
| 756 | return HLSL_BINDING_AUTO_CBV_BIT; |
| 757 | else if (arg == "srv") |
| 758 | return HLSL_BINDING_AUTO_SRV_BIT; |
| 759 | else if (arg == "uav") |
| 760 | return HLSL_BINDING_AUTO_UAV_BIT; |
| 761 | else if (arg == "sampler") |
| 762 | return HLSL_BINDING_AUTO_SAMPLER_BIT; |
| 763 | else if (arg == "all") |
| 764 | return HLSL_BINDING_AUTO_ALL; |
| 765 | else |
| 766 | { |
| 767 | fprintf(stderr, "Invalid resource type for --hlsl-auto-binding: %s\n", arg.c_str()); |
| 768 | return 0; |
| 769 | } |
| 770 | } |
| 771 | |
Hans-Kristian Arntzen | 3fe57d3 | 2019-04-09 12:46:23 +0200 | [diff] [blame] | 772 | 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] | 773 | { |
| 774 | Parser spirv_parser(move(spirv_file)); |
| 775 | spirv_parser.parse(); |
| 776 | |
| 777 | unique_ptr<CompilerGLSL> compiler; |
| 778 | bool combined_image_samplers = false; |
| 779 | bool build_dummy_sampler = false; |
| 780 | |
| 781 | if (args.cpp) |
| 782 | { |
| 783 | compiler.reset(new CompilerCPP(move(spirv_parser.get_parsed_ir()))); |
| 784 | if (args.cpp_interface_name) |
| 785 | static_cast<CompilerCPP *>(compiler.get())->set_interface_name(args.cpp_interface_name); |
| 786 | } |
| 787 | else if (args.msl) |
| 788 | { |
| 789 | compiler.reset(new CompilerMSL(move(spirv_parser.get_parsed_ir()))); |
| 790 | |
| 791 | auto *msl_comp = static_cast<CompilerMSL *>(compiler.get()); |
| 792 | auto msl_opts = msl_comp->get_msl_options(); |
| 793 | if (args.set_msl_version) |
| 794 | msl_opts.msl_version = args.msl_version; |
| 795 | msl_opts.capture_output_to_buffer = args.msl_capture_output_to_buffer; |
| 796 | msl_opts.swizzle_texture_samples = args.msl_swizzle_texture_samples; |
Lukas Hermanns | ffbd801 | 2019-10-09 11:22:25 -0400 | [diff] [blame] | 797 | msl_opts.invariant_float_math = args.msl_invariant_float_math; |
Hans-Kristian Arntzen | c60b9a1 | 2019-04-08 11:53:13 +0200 | [diff] [blame] | 798 | if (args.msl_ios) |
Lukas Hermanns | f3a6d28 | 2019-09-27 15:49:54 -0400 | [diff] [blame] | 799 | { |
Hans-Kristian Arntzen | c60b9a1 | 2019-04-08 11:53:13 +0200 | [diff] [blame] | 800 | msl_opts.platform = CompilerMSL::Options::iOS; |
Lukas Hermanns | f3a6d28 | 2019-09-27 15:49:54 -0400 | [diff] [blame] | 801 | msl_opts.ios_use_framebuffer_fetch_subpasses = args.msl_framebuffer_fetch; |
| 802 | msl_opts.emulate_cube_array = args.msl_emulate_cube_array; |
| 803 | } |
Hans-Kristian Arntzen | c60b9a1 | 2019-04-08 11:53:13 +0200 | [diff] [blame] | 804 | msl_opts.pad_fragment_output_components = args.msl_pad_fragment_output; |
| 805 | msl_opts.tess_domain_origin_lower_left = args.msl_domain_lower_left; |
| 806 | msl_opts.argument_buffers = args.msl_argument_buffers; |
Hans-Kristian Arntzen | fc4f39b | 2019-04-23 12:17:21 +0200 | [diff] [blame] | 807 | msl_opts.texture_buffer_native = args.msl_texture_buffer_native; |
Chip Davis | 7eecf5a | 2019-05-31 12:06:20 -0500 | [diff] [blame] | 808 | msl_opts.multiview = args.msl_multiview; |
Chip Davis | 6a58554 | 2019-07-12 21:50:50 -0500 | [diff] [blame] | 809 | 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] | 810 | msl_opts.dispatch_base = args.msl_dispatch_base; |
Akio Gaule | 1280df6 | 2019-11-27 01:02:46 -0800 | [diff] [blame] | 811 | msl_opts.enable_decoration_binding = args.msl_decoration_binding; |
Hans-Kristian Arntzen | c3bd136 | 2020-01-16 11:07:30 +0100 | [diff] [blame] | 812 | 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] | 813 | msl_opts.force_native_arrays = args.msl_force_native_arrays; |
Hans-Kristian Arntzen | c60b9a1 | 2019-04-08 11:53:13 +0200 | [diff] [blame] | 814 | msl_comp->set_msl_options(msl_opts); |
| 815 | for (auto &v : args.msl_discrete_descriptor_sets) |
| 816 | msl_comp->add_discrete_descriptor_set(v); |
Hans-Kristian Arntzen | 4bb673a | 2019-10-14 12:51:48 +0200 | [diff] [blame] | 817 | for (auto &v : args.msl_device_argument_buffers) |
| 818 | msl_comp->set_argument_buffer_device_address_space(v, true); |
Chip Davis | cb35934 | 2019-09-05 23:14:12 -0500 | [diff] [blame] | 819 | uint32_t i = 0; |
| 820 | for (auto &v : args.msl_dynamic_buffers) |
| 821 | msl_comp->add_dynamic_buffer(v.first, v.second, i++); |
Chip Davis | fedbc35 | 2019-12-16 22:58:16 -0600 | [diff] [blame] | 822 | for (auto &v : args.msl_inline_uniform_blocks) |
| 823 | msl_comp->add_inline_uniform_block(v.first, v.second); |
Hans-Kristian Arntzen | c60b9a1 | 2019-04-08 11:53:13 +0200 | [diff] [blame] | 824 | } |
| 825 | else if (args.hlsl) |
| 826 | compiler.reset(new CompilerHLSL(move(spirv_parser.get_parsed_ir()))); |
| 827 | else |
| 828 | { |
| 829 | combined_image_samplers = !args.vulkan_semantics; |
Hans-Kristian Arntzen | 12ca9d1 | 2019-07-25 11:07:14 +0200 | [diff] [blame] | 830 | 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] | 831 | build_dummy_sampler = true; |
| 832 | compiler.reset(new CompilerGLSL(move(spirv_parser.get_parsed_ir()))); |
| 833 | } |
| 834 | |
| 835 | if (!args.variable_type_remaps.empty()) |
| 836 | { |
| 837 | auto remap_cb = [&](const SPIRType &, const string &name, string &out) -> void { |
| 838 | for (const VariableTypeRemap &remap : args.variable_type_remaps) |
| 839 | if (name == remap.variable_name) |
| 840 | out = remap.new_variable_type; |
| 841 | }; |
| 842 | |
| 843 | compiler->set_variable_type_remap_callback(move(remap_cb)); |
| 844 | } |
| 845 | |
| 846 | for (auto &rename : args.entry_point_rename) |
| 847 | compiler->rename_entry_point(rename.old_name, rename.new_name, rename.execution_model); |
| 848 | |
| 849 | auto entry_points = compiler->get_entry_points_and_stages(); |
| 850 | auto entry_point = args.entry; |
| 851 | ExecutionModel model = ExecutionModelMax; |
| 852 | |
| 853 | if (!args.entry_stage.empty()) |
| 854 | { |
| 855 | model = stage_to_execution_model(args.entry_stage); |
| 856 | if (entry_point.empty()) |
| 857 | { |
| 858 | // Just use the first entry point with this stage. |
| 859 | for (auto &e : entry_points) |
| 860 | { |
| 861 | if (e.execution_model == model) |
| 862 | { |
| 863 | entry_point = e.name; |
| 864 | break; |
| 865 | } |
| 866 | } |
| 867 | |
| 868 | if (entry_point.empty()) |
| 869 | { |
| 870 | fprintf(stderr, "Could not find an entry point with stage: %s\n", args.entry_stage.c_str()); |
| 871 | exit(EXIT_FAILURE); |
| 872 | } |
| 873 | } |
| 874 | else |
| 875 | { |
| 876 | // Make sure both stage and name exists. |
| 877 | bool exists = false; |
| 878 | for (auto &e : entry_points) |
| 879 | { |
| 880 | if (e.execution_model == model && e.name == entry_point) |
| 881 | { |
| 882 | exists = true; |
| 883 | break; |
| 884 | } |
| 885 | } |
| 886 | |
| 887 | if (!exists) |
| 888 | { |
| 889 | fprintf(stderr, "Could not find an entry point %s with stage: %s\n", entry_point.c_str(), |
| 890 | args.entry_stage.c_str()); |
| 891 | exit(EXIT_FAILURE); |
| 892 | } |
| 893 | } |
| 894 | } |
| 895 | else if (!entry_point.empty()) |
| 896 | { |
| 897 | // Make sure there is just one entry point with this name, or the stage |
| 898 | // is ambiguous. |
| 899 | uint32_t stage_count = 0; |
| 900 | for (auto &e : entry_points) |
| 901 | { |
| 902 | if (e.name == entry_point) |
| 903 | { |
| 904 | stage_count++; |
| 905 | model = e.execution_model; |
| 906 | } |
| 907 | } |
| 908 | |
| 909 | if (stage_count == 0) |
| 910 | { |
| 911 | fprintf(stderr, "There is no entry point with name: %s\n", entry_point.c_str()); |
| 912 | exit(EXIT_FAILURE); |
| 913 | } |
| 914 | else if (stage_count > 1) |
| 915 | { |
| 916 | fprintf(stderr, "There is more than one entry point with name: %s. Use --stage.\n", entry_point.c_str()); |
| 917 | exit(EXIT_FAILURE); |
| 918 | } |
| 919 | } |
| 920 | |
| 921 | if (!entry_point.empty()) |
| 922 | compiler->set_entry_point(entry_point, model); |
| 923 | |
| 924 | if (!args.set_version && !compiler->get_common_options().version) |
| 925 | { |
| 926 | fprintf(stderr, "Didn't specify GLSL version and SPIR-V did not specify language.\n"); |
| 927 | print_help(); |
| 928 | exit(EXIT_FAILURE); |
| 929 | } |
| 930 | |
| 931 | CompilerGLSL::Options opts = compiler->get_common_options(); |
| 932 | if (args.set_version) |
| 933 | opts.version = args.version; |
| 934 | if (args.set_es) |
| 935 | opts.es = args.es; |
| 936 | opts.force_temporary = args.force_temporary; |
| 937 | opts.separate_shader_objects = args.sso; |
| 938 | opts.flatten_multidimensional_arrays = args.flatten_multidimensional_arrays; |
| 939 | opts.enable_420pack_extension = args.use_420pack_extension; |
| 940 | opts.vulkan_semantics = args.vulkan_semantics; |
| 941 | opts.vertex.fixup_clipspace = args.fixup; |
| 942 | opts.vertex.flip_vert_y = args.yflip; |
| 943 | opts.vertex.support_nonzero_base_instance = args.support_nonzero_baseinstance; |
| 944 | 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] | 945 | opts.emit_uniform_buffer_as_plain_uniforms = args.glsl_emit_ubo_as_plain_uniforms; |
Hans-Kristian Arntzen | 65af09d | 2019-05-28 13:41:46 +0200 | [diff] [blame] | 946 | opts.emit_line_directives = args.emit_line_directives; |
Hans-Kristian Arntzen | c60b9a1 | 2019-04-08 11:53:13 +0200 | [diff] [blame] | 947 | compiler->set_common_options(opts); |
| 948 | |
| 949 | // Set HLSL specific options. |
| 950 | if (args.hlsl) |
| 951 | { |
| 952 | auto *hlsl = static_cast<CompilerHLSL *>(compiler.get()); |
| 953 | auto hlsl_opts = hlsl->get_hlsl_options(); |
| 954 | if (args.set_shader_model) |
| 955 | { |
| 956 | if (args.shader_model < 30) |
| 957 | { |
| 958 | fprintf(stderr, "Shader model earlier than 30 (3.0) not supported.\n"); |
| 959 | exit(EXIT_FAILURE); |
| 960 | } |
| 961 | |
| 962 | hlsl_opts.shader_model = args.shader_model; |
| 963 | } |
| 964 | |
| 965 | if (args.hlsl_compat) |
| 966 | { |
| 967 | // Enable all compat options. |
| 968 | hlsl_opts.point_size_compat = true; |
| 969 | hlsl_opts.point_coord_compat = true; |
| 970 | } |
| 971 | |
| 972 | if (hlsl_opts.shader_model <= 30) |
| 973 | { |
| 974 | combined_image_samplers = true; |
| 975 | build_dummy_sampler = true; |
| 976 | } |
| 977 | |
| 978 | 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^] | 979 | hlsl_opts.force_storage_buffer_as_uav = args.hlsl_force_storage_buffer_as_uav; |
Hans-Kristian Arntzen | c60b9a1 | 2019-04-08 11:53:13 +0200 | [diff] [blame] | 980 | hlsl->set_hlsl_options(hlsl_opts); |
Hans-Kristian Arntzen | e38cbb9 | 2019-11-12 10:49:01 +0100 | [diff] [blame] | 981 | hlsl->set_resource_binding_flags(args.hlsl_binding_flags); |
Hans-Kristian Arntzen | c60b9a1 | 2019-04-08 11:53:13 +0200 | [diff] [blame] | 982 | } |
| 983 | |
| 984 | if (build_dummy_sampler) |
| 985 | { |
| 986 | uint32_t sampler = compiler->build_dummy_sampler_for_combined_images(); |
| 987 | if (sampler != 0) |
| 988 | { |
| 989 | // Set some defaults to make validation happy. |
| 990 | compiler->set_decoration(sampler, DecorationDescriptorSet, 0); |
| 991 | compiler->set_decoration(sampler, DecorationBinding, 0); |
| 992 | } |
| 993 | } |
| 994 | |
| 995 | ShaderResources res; |
| 996 | if (args.remove_unused) |
| 997 | { |
| 998 | auto active = compiler->get_active_interface_variables(); |
| 999 | res = compiler->get_shader_resources(active); |
| 1000 | compiler->set_enabled_interface_variables(move(active)); |
| 1001 | } |
| 1002 | else |
| 1003 | res = compiler->get_shader_resources(); |
| 1004 | |
| 1005 | if (args.flatten_ubo) |
| 1006 | { |
| 1007 | for (auto &ubo : res.uniform_buffers) |
| 1008 | compiler->flatten_buffer_block(ubo.id); |
| 1009 | for (auto &ubo : res.push_constant_buffers) |
| 1010 | compiler->flatten_buffer_block(ubo.id); |
| 1011 | } |
| 1012 | |
| 1013 | auto pls_inputs = remap_pls(args.pls_in, res.stage_inputs, &res.subpass_inputs); |
| 1014 | auto pls_outputs = remap_pls(args.pls_out, res.stage_outputs, nullptr); |
| 1015 | compiler->remap_pixel_local_storage(move(pls_inputs), move(pls_outputs)); |
| 1016 | |
| 1017 | for (auto &ext : args.extensions) |
| 1018 | compiler->require_extension(ext); |
| 1019 | |
| 1020 | for (auto &remap : args.remaps) |
| 1021 | { |
| 1022 | if (remap_generic(*compiler, res.stage_inputs, remap)) |
| 1023 | continue; |
| 1024 | if (remap_generic(*compiler, res.stage_outputs, remap)) |
| 1025 | continue; |
| 1026 | if (remap_generic(*compiler, res.subpass_inputs, remap)) |
| 1027 | continue; |
| 1028 | } |
| 1029 | |
| 1030 | for (auto &rename : args.interface_variable_renames) |
| 1031 | { |
| 1032 | if (rename.storageClass == StorageClassInput) |
| 1033 | spirv_cross_util::rename_interface_variable(*compiler, res.stage_inputs, rename.location, |
| 1034 | rename.variable_name); |
| 1035 | else if (rename.storageClass == StorageClassOutput) |
| 1036 | spirv_cross_util::rename_interface_variable(*compiler, res.stage_outputs, rename.location, |
| 1037 | rename.variable_name); |
| 1038 | else |
| 1039 | { |
| 1040 | fprintf(stderr, "error at --rename-interface-variable <in|out> ...\n"); |
| 1041 | exit(EXIT_FAILURE); |
| 1042 | } |
| 1043 | } |
| 1044 | |
| 1045 | if (args.dump_resources) |
| 1046 | { |
| 1047 | print_resources(*compiler, res); |
| 1048 | print_push_constant_resources(*compiler, res.push_constant_buffers); |
| 1049 | print_spec_constants(*compiler); |
| 1050 | print_capabilities_and_extensions(*compiler); |
| 1051 | } |
| 1052 | |
| 1053 | if (combined_image_samplers) |
| 1054 | { |
| 1055 | compiler->build_combined_image_samplers(); |
| 1056 | if (args.combined_samplers_inherit_bindings) |
| 1057 | spirv_cross_util::inherit_combined_sampler_bindings(*compiler); |
| 1058 | |
| 1059 | // Give the remapped combined samplers new names. |
| 1060 | for (auto &remap : compiler->get_combined_image_samplers()) |
| 1061 | { |
| 1062 | compiler->set_name(remap.combined_id, join("SPIRV_Cross_Combined", compiler->get_name(remap.image_id), |
| 1063 | compiler->get_name(remap.sampler_id))); |
| 1064 | } |
| 1065 | } |
| 1066 | |
| 1067 | if (args.hlsl) |
| 1068 | { |
| 1069 | auto *hlsl_compiler = static_cast<CompilerHLSL *>(compiler.get()); |
| 1070 | uint32_t new_builtin = hlsl_compiler->remap_num_workgroups_builtin(); |
| 1071 | if (new_builtin) |
| 1072 | { |
| 1073 | hlsl_compiler->set_decoration(new_builtin, DecorationDescriptorSet, 0); |
| 1074 | hlsl_compiler->set_decoration(new_builtin, DecorationBinding, 0); |
| 1075 | } |
| 1076 | } |
| 1077 | |
| 1078 | if (args.hlsl) |
| 1079 | { |
| 1080 | for (auto &remap : args.hlsl_attr_remap) |
| 1081 | static_cast<CompilerHLSL *>(compiler.get())->add_vertex_attribute_remap(remap); |
| 1082 | } |
| 1083 | |
| 1084 | return compiler->compile(); |
| 1085 | } |
| 1086 | |
Hans-Kristian Arntzen | d9cbc03 | 2017-09-08 09:33:34 +0200 | [diff] [blame] | 1087 | static int main_inner(int argc, char *argv[]) |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 1088 | { |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 1089 | CLIArguments args; |
| 1090 | CLICallbacks cbs; |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 1091 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 1092 | cbs.add("--help", [](CLIParser &parser) { |
| 1093 | print_help(); |
| 1094 | parser.end(); |
| 1095 | }); |
Hans-Kristian Arntzen | 0b9a884 | 2019-05-24 15:23:29 +0200 | [diff] [blame] | 1096 | cbs.add("--revision", [](CLIParser &parser) { |
| 1097 | print_version(); |
| 1098 | parser.end(); |
| 1099 | }); |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 1100 | cbs.add("--output", [&args](CLIParser &parser) { args.output = parser.next_string(); }); |
| 1101 | cbs.add("--es", [&args](CLIParser &) { |
| 1102 | args.es = true; |
| 1103 | args.set_es = true; |
| 1104 | }); |
| 1105 | cbs.add("--no-es", [&args](CLIParser &) { |
| 1106 | args.es = false; |
| 1107 | args.set_es = true; |
| 1108 | }); |
| 1109 | cbs.add("--version", [&args](CLIParser &parser) { |
| 1110 | args.version = parser.next_uint(); |
| 1111 | args.set_version = true; |
| 1112 | }); |
| 1113 | cbs.add("--dump-resources", [&args](CLIParser &) { args.dump_resources = true; }); |
| 1114 | cbs.add("--force-temporary", [&args](CLIParser &) { args.force_temporary = true; }); |
| 1115 | cbs.add("--flatten-ubo", [&args](CLIParser &) { args.flatten_ubo = true; }); |
| 1116 | cbs.add("--fixup-clipspace", [&args](CLIParser &) { args.fixup = true; }); |
Hans-Kristian Arntzen | bdfa97a | 2017-08-03 13:02:59 +0200 | [diff] [blame] | 1117 | cbs.add("--flip-vert-y", [&args](CLIParser &) { args.yflip = true; }); |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 1118 | cbs.add("--iterations", [&args](CLIParser &parser) { args.iterations = parser.next_uint(); }); |
| 1119 | cbs.add("--cpp", [&args](CLIParser &) { args.cpp = true; }); |
Brad Davis | 0ad0f94 | 2018-06-21 07:43:52 -0700 | [diff] [blame] | 1120 | 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] | 1121 | 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] | 1122 | cbs.add("--metal", [&args](CLIParser &) { args.msl = true; }); // Legacy compatibility |
Hans-Kristian Arntzen | 0474848 | 2019-03-19 10:58:37 +0100 | [diff] [blame] | 1123 | 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] | 1124 | cbs.add("--glsl-emit-ubo-as-plain-uniforms", [&args](CLIParser &) { args.glsl_emit_ubo_as_plain_uniforms = true; }); |
Hans-Kristian Arntzen | b97e9b0 | 2019-08-01 09:51:44 +0200 | [diff] [blame] | 1125 | cbs.add("--vulkan-glsl-disable-ext-samplerless-texture-functions", |
| 1126 | [&args](CLIParser &) { args.vulkan_glsl_disable_ext_samplerless_texture_functions = true; }); |
Bill Hollings | 5ad73f3 | 2017-03-19 21:06:21 -0400 | [diff] [blame] | 1127 | cbs.add("--msl", [&args](CLIParser &) { args.msl = true; }); |
Robert Konrad | 216a681 | 2017-01-25 17:30:52 +0100 | [diff] [blame] | 1128 | cbs.add("--hlsl", [&args](CLIParser &) { args.hlsl = true; }); |
Hans-Kristian Arntzen | 17d88ca | 2017-05-04 10:10:30 +0200 | [diff] [blame] | 1129 | cbs.add("--hlsl-enable-compat", [&args](CLIParser &) { args.hlsl_compat = true; }); |
Hans-Kristian Arntzen | 6e1c3cc | 2019-01-11 12:56:00 +0100 | [diff] [blame] | 1130 | cbs.add("--hlsl-support-nonzero-basevertex-baseinstance", |
| 1131 | [&args](CLIParser &) { args.hlsl_support_nonzero_base = true; }); |
Hans-Kristian Arntzen | e38cbb9 | 2019-11-12 10:49:01 +0100 | [diff] [blame] | 1132 | cbs.add("--hlsl-auto-binding", [&args](CLIParser &parser) { |
| 1133 | args.hlsl_binding_flags |= hlsl_resource_type_to_flag(parser.next_string()); |
| 1134 | }); |
Hans-Kristian Arntzen | c27e1ef | 2020-03-04 16:32:52 +0100 | [diff] [blame^] | 1135 | cbs.add("--hlsl-force-storage-buffer-as-uav", [&args](CLIParser &) { |
| 1136 | args.hlsl_force_storage_buffer_as_uav = true; |
| 1137 | }); |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 1138 | cbs.add("--vulkan-semantics", [&args](CLIParser &) { args.vulkan_semantics = true; }); |
Hans-Kristian Arntzen | 3f2de0d | 2020-03-02 11:55:57 +0100 | [diff] [blame] | 1139 | cbs.add("-V", [&args](CLIParser &) { args.vulkan_semantics = true; }); |
Hans-Kristian Arntzen | 470ae7a | 2017-05-22 17:40:00 +0200 | [diff] [blame] | 1140 | 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] | 1141 | cbs.add("--no-420pack-extension", [&args](CLIParser &) { args.use_420pack_extension = false; }); |
Chip Davis | c51e5b7 | 2019-01-08 16:33:32 -0600 | [diff] [blame] | 1142 | 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] | 1143 | 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] | 1144 | cbs.add("--msl-ios", [&args](CLIParser &) { args.msl_ios = true; }); |
Hans-Kristian Arntzen | b8033d7 | 2019-01-14 14:53:47 +0100 | [diff] [blame] | 1145 | 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] | 1146 | 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] | 1147 | 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] | 1148 | cbs.add("--msl-discrete-descriptor-set", |
| 1149 | [&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] | 1150 | cbs.add("--msl-device-argument-buffer", |
| 1151 | [&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] | 1152 | 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] | 1153 | cbs.add("--msl-framebuffer-fetch", [&args](CLIParser &) { args.msl_framebuffer_fetch = true; }); |
Lukas Hermanns | ffbd801 | 2019-10-09 11:22:25 -0400 | [diff] [blame] | 1154 | 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] | 1155 | 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] | 1156 | cbs.add("--msl-multiview", [&args](CLIParser &) { args.msl_multiview = true; }); |
Chip Davis | 6a58554 | 2019-07-12 21:50:50 -0500 | [diff] [blame] | 1157 | cbs.add("--msl-view-index-from-device-index", |
| 1158 | [&args](CLIParser &) { args.msl_view_index_from_device_index = true; }); |
Chip Davis | fb5ee4c | 2019-07-22 13:08:04 -0500 | [diff] [blame] | 1159 | cbs.add("--msl-dispatch-base", [&args](CLIParser &) { args.msl_dispatch_base = true; }); |
Chip Davis | cb35934 | 2019-09-05 23:14:12 -0500 | [diff] [blame] | 1160 | cbs.add("--msl-dynamic-buffer", [&args](CLIParser &parser) { |
| 1161 | args.msl_argument_buffers = true; |
Hans-Kristian Arntzen | afa5480 | 2019-09-06 10:17:31 +0200 | [diff] [blame] | 1162 | // Make sure next_uint() is called in-order. |
Hans-Kristian Arntzen | 1935f1a | 2019-09-06 10:11:18 +0200 | [diff] [blame] | 1163 | uint32_t desc_set = parser.next_uint(); |
| 1164 | uint32_t binding = parser.next_uint(); |
| 1165 | args.msl_dynamic_buffers.push_back(make_pair(desc_set, binding)); |
Chip Davis | cb35934 | 2019-09-05 23:14:12 -0500 | [diff] [blame] | 1166 | }); |
Akio Gaule | 1280df6 | 2019-11-27 01:02:46 -0800 | [diff] [blame] | 1167 | 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] | 1168 | cbs.add("--msl-force-active-argument-buffer-resources", |
| 1169 | [&args](CLIParser &) { args.msl_force_active_argument_buffer_resources = true; }); |
Chip Davis | fedbc35 | 2019-12-16 22:58:16 -0600 | [diff] [blame] | 1170 | cbs.add("--msl-inline-uniform-block", [&args](CLIParser &parser) { |
| 1171 | args.msl_argument_buffers = true; |
| 1172 | // Make sure next_uint() is called in-order. |
| 1173 | uint32_t desc_set = parser.next_uint(); |
| 1174 | uint32_t binding = parser.next_uint(); |
| 1175 | args.msl_inline_uniform_blocks.push_back(make_pair(desc_set, binding)); |
| 1176 | }); |
Hans-Kristian Arntzen | c9d4f9c | 2020-02-24 12:47:14 +0100 | [diff] [blame] | 1177 | cbs.add("--msl-force-native-arrays", [&args](CLIParser &) { |
| 1178 | args.msl_force_native_arrays = true; |
| 1179 | }); |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 1180 | 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] | 1181 | cbs.add("--rename-entry-point", [&args](CLIParser &parser) { |
| 1182 | auto old_name = parser.next_string(); |
| 1183 | auto new_name = parser.next_string(); |
Hans-Kristian Arntzen | eecbeaa | 2018-03-01 14:00:04 +0100 | [diff] [blame] | 1184 | auto model = stage_to_execution_model(parser.next_string()); |
| 1185 | 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] | 1186 | }); |
Hans-Kristian Arntzen | 042475e | 2016-07-28 11:16:02 +0200 | [diff] [blame] | 1187 | cbs.add("--entry", [&args](CLIParser &parser) { args.entry = parser.next_string(); }); |
Hans-Kristian Arntzen | eecbeaa | 2018-03-01 14:00:04 +0100 | [diff] [blame] | 1188 | 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] | 1189 | cbs.add("--separate-shader-objects", [&args](CLIParser &) { args.sso = true; }); |
Hans-Kristian Arntzen | 4f88f97 | 2017-11-13 09:46:45 +0100 | [diff] [blame] | 1190 | cbs.add("--set-hlsl-vertex-input-semantic", [&args](CLIParser &parser) { |
| 1191 | HLSLVertexAttributeRemap remap; |
| 1192 | remap.location = parser.next_uint(); |
| 1193 | remap.semantic = parser.next_string(); |
| 1194 | args.hlsl_attr_remap.push_back(move(remap)); |
| 1195 | }); |
| 1196 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 1197 | cbs.add("--remap", [&args](CLIParser &parser) { |
Hans-Kristian Arntzen | f486142 | 2017-11-13 09:52:35 +0100 | [diff] [blame] | 1198 | string src = parser.next_string(); |
| 1199 | string dst = parser.next_string(); |
| 1200 | uint32_t components = parser.next_uint(); |
| 1201 | args.remaps.push_back({ move(src), move(dst), components }); |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 1202 | }); |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 1203 | |
Panagiotis Christopoulos Charitos | 66e76d9 | 2016-09-20 10:17:41 +0200 | [diff] [blame] | 1204 | cbs.add("--remap-variable-type", [&args](CLIParser &parser) { |
| 1205 | string var_name = parser.next_string(); |
| 1206 | string new_type = parser.next_string(); |
| 1207 | args.variable_type_remaps.push_back({ move(var_name), move(new_type) }); |
| 1208 | }); |
| 1209 | |
Jason Chan | 9f1eb5a | 2017-06-23 22:20:42 +0200 | [diff] [blame] | 1210 | cbs.add("--rename-interface-variable", [&args](CLIParser &parser) { |
Jason Chan | 3281e82 | 2017-06-25 15:16:09 +0200 | [diff] [blame] | 1211 | StorageClass cls = StorageClassMax; |
| 1212 | string clsStr = parser.next_string(); |
| 1213 | if (clsStr == "in") |
| 1214 | cls = StorageClassInput; |
| 1215 | else if (clsStr == "out") |
| 1216 | cls = StorageClassOutput; |
| 1217 | |
Jason Chan | 9f1eb5a | 2017-06-23 22:20:42 +0200 | [diff] [blame] | 1218 | uint32_t loc = parser.next_uint(); |
| 1219 | string var_name = parser.next_string(); |
Jason Chan | 3281e82 | 2017-06-25 15:16:09 +0200 | [diff] [blame] | 1220 | args.interface_variable_renames.push_back({ cls, loc, move(var_name) }); |
Jason Chan | 9f1eb5a | 2017-06-23 22:20:42 +0200 | [diff] [blame] | 1221 | }); |
| 1222 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 1223 | cbs.add("--pls-in", [&args](CLIParser &parser) { |
| 1224 | auto fmt = pls_format(parser.next_string()); |
| 1225 | auto name = parser.next_string(); |
| 1226 | args.pls_in.push_back({ move(fmt), move(name) }); |
| 1227 | }); |
| 1228 | cbs.add("--pls-out", [&args](CLIParser &parser) { |
| 1229 | auto fmt = pls_format(parser.next_string()); |
| 1230 | auto name = parser.next_string(); |
| 1231 | args.pls_out.push_back({ move(fmt), move(name) }); |
| 1232 | }); |
Hans-Kristian Arntzen | 2e3c6ec | 2017-02-16 11:17:12 +0100 | [diff] [blame] | 1233 | cbs.add("--shader-model", [&args](CLIParser &parser) { |
| 1234 | args.shader_model = parser.next_uint(); |
| 1235 | args.set_shader_model = true; |
| 1236 | }); |
Bill Hollings | bac657d | 2017-11-07 15:38:13 -0500 | [diff] [blame] | 1237 | cbs.add("--msl-version", [&args](CLIParser &parser) { |
| 1238 | args.msl_version = parser.next_uint(); |
| 1239 | args.set_msl_version = true; |
| 1240 | }); |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 1241 | |
Hans-Kristian Arntzen | f61a5d1 | 2016-08-26 12:58:50 +0200 | [diff] [blame] | 1242 | cbs.add("--remove-unused-variables", [&args](CLIParser &) { args.remove_unused = true; }); |
Hans-Kristian Arntzen | a1b3964 | 2018-05-25 10:14:13 +0200 | [diff] [blame] | 1243 | cbs.add("--combined-samplers-inherit-bindings", |
| 1244 | [&args](CLIParser &) { args.combined_samplers_inherit_bindings = true; }); |
Hans-Kristian Arntzen | f61a5d1 | 2016-08-26 12:58:50 +0200 | [diff] [blame] | 1245 | |
Hans-Kristian Arntzen | b29629f | 2018-06-22 10:01:38 +0200 | [diff] [blame] | 1246 | 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] | 1247 | 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] | 1248 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 1249 | cbs.default_handler = [&args](const char *value) { args.input = value; }; |
| 1250 | cbs.error_handler = [] { print_help(); }; |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 1251 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 1252 | CLIParser parser{ move(cbs), argc - 1, argv + 1 }; |
| 1253 | if (!parser.parse()) |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 1254 | return EXIT_FAILURE; |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 1255 | else if (parser.ended_state) |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 1256 | return EXIT_SUCCESS; |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 1257 | |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 1258 | if (!args.input) |
| 1259 | { |
| 1260 | fprintf(stderr, "Didn't specify input file.\n"); |
| 1261 | print_help(); |
| 1262 | return EXIT_FAILURE; |
| 1263 | } |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 1264 | |
Hans-Kristian Arntzen | 5bcf02f | 2018-10-05 11:30:57 +0200 | [diff] [blame] | 1265 | auto spirv_file = read_spirv_file(args.input); |
| 1266 | if (spirv_file.empty()) |
| 1267 | return EXIT_FAILURE; |
Hans-Kristian Arntzen | 5bcf02f | 2018-10-05 11:30:57 +0200 | [diff] [blame] | 1268 | |
Brad Davis | 6c88b00 | 2018-06-18 09:30:16 -0700 | [diff] [blame] | 1269 | // Special case reflection because it has little to do with the path followed by code-outputting compilers |
| 1270 | if (!args.reflect.empty()) |
| 1271 | { |
Hans-Kristian Arntzen | c60b9a1 | 2019-04-08 11:53:13 +0200 | [diff] [blame] | 1272 | Parser spirv_parser(move(spirv_file)); |
| 1273 | spirv_parser.parse(); |
| 1274 | |
Hans-Kristian Arntzen | 5bcf02f | 2018-10-05 11:30:57 +0200 | [diff] [blame] | 1275 | CompilerReflection compiler(move(spirv_parser.get_parsed_ir())); |
Brad Davis | 6c88b00 | 2018-06-18 09:30:16 -0700 | [diff] [blame] | 1276 | compiler.set_format(args.reflect); |
| 1277 | auto json = compiler.compile(); |
| 1278 | if (args.output) |
| 1279 | write_string_to_file(args.output, json.c_str()); |
| 1280 | else |
| 1281 | printf("%s", json.c_str()); |
| 1282 | return EXIT_SUCCESS; |
| 1283 | } |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 1284 | |
Hans-Kristian Arntzen | c60b9a1 | 2019-04-08 11:53:13 +0200 | [diff] [blame] | 1285 | string compiled_output; |
Hans-Kristian Arntzen | bcb5560 | 2016-09-10 13:56:36 +0200 | [diff] [blame] | 1286 | |
Hans-Kristian Arntzen | c60b9a1 | 2019-04-08 11:53:13 +0200 | [diff] [blame] | 1287 | if (args.iterations == 1) |
| 1288 | compiled_output = compile_iteration(args, move(spirv_file)); |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 1289 | else |
Hans-Kristian Arntzen | bcb5560 | 2016-09-10 13:56:36 +0200 | [diff] [blame] | 1290 | { |
Hans-Kristian Arntzen | c60b9a1 | 2019-04-08 11:53:13 +0200 | [diff] [blame] | 1291 | for (unsigned i = 0; i < args.iterations; i++) |
| 1292 | compiled_output = compile_iteration(args, spirv_file); |
Hans-Kristian Arntzen | 4f88f97 | 2017-11-13 09:46:45 +0100 | [diff] [blame] | 1293 | } |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 1294 | |
| 1295 | if (args.output) |
Hans-Kristian Arntzen | c60b9a1 | 2019-04-08 11:53:13 +0200 | [diff] [blame] | 1296 | write_string_to_file(args.output, compiled_output.c_str()); |
Hans-Kristian Arntzen | 078eec5 | 2016-07-06 11:04:06 +0200 | [diff] [blame] | 1297 | else |
Hans-Kristian Arntzen | c60b9a1 | 2019-04-08 11:53:13 +0200 | [diff] [blame] | 1298 | printf("%s", compiled_output.c_str()); |
Hans-Kristian Arntzen | d9cbc03 | 2017-09-08 09:33:34 +0200 | [diff] [blame] | 1299 | |
| 1300 | return EXIT_SUCCESS; |
| 1301 | } |
| 1302 | |
| 1303 | int main(int argc, char *argv[]) |
| 1304 | { |
| 1305 | #ifdef SPIRV_CROSS_EXCEPTIONS_TO_ASSERTIONS |
| 1306 | return main_inner(argc, argv); |
| 1307 | #else |
| 1308 | // Make sure we catch the exception or it just disappears into the aether on Windows. |
| 1309 | try |
| 1310 | { |
| 1311 | return main_inner(argc, argv); |
| 1312 | } |
| 1313 | catch (const std::exception &e) |
| 1314 | { |
| 1315 | fprintf(stderr, "SPIRV-Cross threw an exception: %s\n", e.what()); |
| 1316 | return EXIT_FAILURE; |
| 1317 | } |
| 1318 | #endif |
Hans-Kristian Arntzen | 75471fb | 2016-03-02 18:09:16 +0100 | [diff] [blame] | 1319 | } |