blob: 43d1c3ddfb30f7130ca721e404df3bc50effb95b [file] [log] [blame]
Lei Zhang6fa3f8a2016-03-31 17:26:31 -04001// Copyright (c) 2015-2016 The Khronos Group Inc.
2//
David Neto9fc86582016-09-01 15:33:59 -04003// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
Lei Zhang6fa3f8a2016-03-31 17:26:31 -04006//
David Neto9fc86582016-09-01 15:33:59 -04007// http://www.apache.org/licenses/LICENSE-2.0
Lei Zhang6fa3f8a2016-03-31 17:26:31 -04008//
David Neto9fc86582016-09-01 15:33:59 -04009// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
Lei Zhang6fa3f8a2016-03-31 17:26:31 -040014
dan sinclaireda2cfb2018-08-03 15:06:09 -040015#include "source/spirv_target_env.h"
16
Ryan Harrison9150cd42021-01-14 16:45:18 -050017#include <cassert>
Dejan Mircevski27030392016-05-11 09:48:52 -040018#include <cstring>
David Neto63f57d92019-05-07 12:27:18 -040019#include <string>
Lei Zhang6fa3f8a2016-03-31 17:26:31 -040020
dan sinclaireda2cfb2018-08-03 15:06:09 -040021#include "source/spirv_constant.h"
Lei Zhang6fa3f8a2016-03-31 17:26:31 -040022#include "spirv-tools/libspirv.h"
Lei Zhang6fa3f8a2016-03-31 17:26:31 -040023
24const char* spvTargetEnvDescription(spv_target_env env) {
25 switch (env) {
26 case SPV_ENV_UNIVERSAL_1_0:
27 return "SPIR-V 1.0";
Lei Zhang6fa3f8a2016-03-31 17:26:31 -040028 case SPV_ENV_VULKAN_1_0:
29 return "SPIR-V 1.0 (under Vulkan 1.0 semantics)";
Dejan Mircevskicb3c49e2016-04-07 14:41:34 -040030 case SPV_ENV_UNIVERSAL_1_1:
31 return "SPIR-V 1.1";
Pierre Moreau12447d82017-11-30 00:49:23 +010032 case SPV_ENV_OPENCL_1_2:
33 return "SPIR-V 1.0 (under OpenCL 1.2 Full Profile semantics)";
34 case SPV_ENV_OPENCL_EMBEDDED_1_2:
35 return "SPIR-V 1.0 (under OpenCL 1.2 Embedded Profile semantics)";
36 case SPV_ENV_OPENCL_2_0:
37 return "SPIR-V 1.0 (under OpenCL 2.0 Full Profile semantics)";
38 case SPV_ENV_OPENCL_EMBEDDED_2_0:
39 return "SPIR-V 1.0 (under OpenCL 2.0 Embedded Profile semantics)";
David Netoc2967012016-08-05 18:19:30 -040040 case SPV_ENV_OPENCL_2_1:
Pierre Moreau12447d82017-11-30 00:49:23 +010041 return "SPIR-V 1.0 (under OpenCL 2.1 Full Profile semantics)";
42 case SPV_ENV_OPENCL_EMBEDDED_2_1:
43 return "SPIR-V 1.0 (under OpenCL 2.1 Embedded Profile semantics)";
David Netoc2967012016-08-05 18:19:30 -040044 case SPV_ENV_OPENCL_2_2:
Andrey Tuganov95843d72018-03-27 12:01:21 -040045 return "SPIR-V 1.2 (under OpenCL 2.2 Full Profile semantics)";
Pierre Moreau12447d82017-11-30 00:49:23 +010046 case SPV_ENV_OPENCL_EMBEDDED_2_2:
Andrey Tuganov95843d72018-03-27 12:01:21 -040047 return "SPIR-V 1.2 (under OpenCL 2.2 Embedded Profile semantics)";
David Netoc2967012016-08-05 18:19:30 -040048 case SPV_ENV_OPENGL_4_0:
Alan Baker42840d12018-04-06 14:15:27 -040049 return "SPIR-V 1.0 (under OpenGL 4.0 semantics)";
David Netoc2967012016-08-05 18:19:30 -040050 case SPV_ENV_OPENGL_4_1:
Alan Baker42840d12018-04-06 14:15:27 -040051 return "SPIR-V 1.0 (under OpenGL 4.1 semantics)";
David Netoc2967012016-08-05 18:19:30 -040052 case SPV_ENV_OPENGL_4_2:
Alan Baker42840d12018-04-06 14:15:27 -040053 return "SPIR-V 1.0 (under OpenGL 4.2 semantics)";
David Netoc2967012016-08-05 18:19:30 -040054 case SPV_ENV_OPENGL_4_3:
Alan Baker42840d12018-04-06 14:15:27 -040055 return "SPIR-V 1.0 (under OpenGL 4.3 semantics)";
David Netoc2967012016-08-05 18:19:30 -040056 case SPV_ENV_OPENGL_4_5:
Alan Baker42840d12018-04-06 14:15:27 -040057 return "SPIR-V 1.0 (under OpenGL 4.5 semantics)";
David Netodbc20492017-03-14 12:43:41 -040058 case SPV_ENV_UNIVERSAL_1_2:
59 return "SPIR-V 1.2";
David Neto00fa3932018-02-09 14:29:02 -050060 case SPV_ENV_UNIVERSAL_1_3:
61 return "SPIR-V 1.3";
62 case SPV_ENV_VULKAN_1_1:
63 return "SPIR-V 1.3 (under Vulkan 1.1 semantics)";
Corentin Wallezba602c92018-06-20 13:29:38 -040064 case SPV_ENV_WEBGPU_0:
Alastair Donaldson0c4deeb2021-10-06 15:50:12 +010065 assert(false && "Deprecated target environment value.");
Ryan Harrison9150cd42021-01-14 16:45:18 -050066 break;
David Neto63f57d92019-05-07 12:27:18 -040067 case SPV_ENV_UNIVERSAL_1_4:
68 return "SPIR-V 1.4";
69 case SPV_ENV_VULKAN_1_1_SPIRV_1_4:
70 return "SPIR-V 1.4 (under Vulkan 1.1 semantics)";
alan-baker5a48c0d2019-09-13 14:59:02 -040071 case SPV_ENV_UNIVERSAL_1_5:
72 return "SPIR-V 1.5";
David Netod46a1b02019-08-28 18:49:33 -040073 case SPV_ENV_VULKAN_1_2:
74 return "SPIR-V 1.5 (under Vulkan 1.2 semantics)";
alan-baker7d768812021-12-15 14:38:28 -050075 case SPV_ENV_UNIVERSAL_1_6:
76 return "SPIR-V 1.6";
Alastair Donaldson0c4deeb2021-10-06 15:50:12 +010077 case SPV_ENV_MAX:
78 assert(false && "Invalid target environment value.");
79 break;
Lei Zhang6fa3f8a2016-03-31 17:26:31 -040080 }
Lei Zhang6fa3f8a2016-03-31 17:26:31 -040081 return "";
82}
83
84uint32_t spvVersionForTargetEnv(spv_target_env env) {
85 switch (env) {
86 case SPV_ENV_UNIVERSAL_1_0:
Lei Zhang6fa3f8a2016-03-31 17:26:31 -040087 case SPV_ENV_VULKAN_1_0:
Pierre Moreau12447d82017-11-30 00:49:23 +010088 case SPV_ENV_OPENCL_1_2:
89 case SPV_ENV_OPENCL_EMBEDDED_1_2:
90 case SPV_ENV_OPENCL_2_0:
91 case SPV_ENV_OPENCL_EMBEDDED_2_0:
David Netoc2967012016-08-05 18:19:30 -040092 case SPV_ENV_OPENCL_2_1:
Pierre Moreau12447d82017-11-30 00:49:23 +010093 case SPV_ENV_OPENCL_EMBEDDED_2_1:
David Netoc2967012016-08-05 18:19:30 -040094 case SPV_ENV_OPENGL_4_0:
95 case SPV_ENV_OPENGL_4_1:
96 case SPV_ENV_OPENGL_4_2:
97 case SPV_ENV_OPENGL_4_3:
98 case SPV_ENV_OPENGL_4_5:
Lei Zhang6fa3f8a2016-03-31 17:26:31 -040099 return SPV_SPIRV_VERSION_WORD(1, 0);
Dejan Mircevskicb3c49e2016-04-07 14:41:34 -0400100 case SPV_ENV_UNIVERSAL_1_1:
101 return SPV_SPIRV_VERSION_WORD(1, 1);
David Netodbc20492017-03-14 12:43:41 -0400102 case SPV_ENV_UNIVERSAL_1_2:
103 case SPV_ENV_OPENCL_2_2:
Pierre Moreau12447d82017-11-30 00:49:23 +0100104 case SPV_ENV_OPENCL_EMBEDDED_2_2:
David Netodbc20492017-03-14 12:43:41 -0400105 return SPV_SPIRV_VERSION_WORD(1, 2);
David Neto00fa3932018-02-09 14:29:02 -0500106 case SPV_ENV_UNIVERSAL_1_3:
107 case SPV_ENV_VULKAN_1_1:
108 return SPV_SPIRV_VERSION_WORD(1, 3);
Ryan Harrison9150cd42021-01-14 16:45:18 -0500109 case SPV_ENV_WEBGPU_0:
Alastair Donaldson0c4deeb2021-10-06 15:50:12 +0100110 assert(false && "Deprecated target environment value.");
Ryan Harrison9150cd42021-01-14 16:45:18 -0500111 break;
David Neto63f57d92019-05-07 12:27:18 -0400112 case SPV_ENV_UNIVERSAL_1_4:
113 case SPV_ENV_VULKAN_1_1_SPIRV_1_4:
114 return SPV_SPIRV_VERSION_WORD(1, 4);
alan-baker5a48c0d2019-09-13 14:59:02 -0400115 case SPV_ENV_UNIVERSAL_1_5:
David Netod46a1b02019-08-28 18:49:33 -0400116 case SPV_ENV_VULKAN_1_2:
alan-baker5a48c0d2019-09-13 14:59:02 -0400117 return SPV_SPIRV_VERSION_WORD(1, 5);
alan-baker7d768812021-12-15 14:38:28 -0500118 case SPV_ENV_UNIVERSAL_1_6:
119 return SPV_SPIRV_VERSION_WORD(1, 6);
Alastair Donaldson0c4deeb2021-10-06 15:50:12 +0100120 case SPV_ENV_MAX:
121 assert(false && "Invalid target environment value.");
122 break;
Lei Zhang6fa3f8a2016-03-31 17:26:31 -0400123 }
Lei Zhang6fa3f8a2016-03-31 17:26:31 -0400124 return SPV_SPIRV_VERSION_WORD(0, 0);
125}
Dejan Mircevski27030392016-05-11 09:48:52 -0400126
Kévin Petitdf86bb42019-06-21 13:47:27 +0100127static const std::pair<const char*, spv_target_env> spvTargetEnvNameMap[] = {
Kévin Petitbec7e032019-06-20 14:41:28 +0100128 {"vulkan1.1spv1.4", SPV_ENV_VULKAN_1_1_SPIRV_1_4},
129 {"vulkan1.0", SPV_ENV_VULKAN_1_0},
130 {"vulkan1.1", SPV_ENV_VULKAN_1_1},
David Netod46a1b02019-08-28 18:49:33 -0400131 {"vulkan1.2", SPV_ENV_VULKAN_1_2},
Kévin Petitbec7e032019-06-20 14:41:28 +0100132 {"spv1.0", SPV_ENV_UNIVERSAL_1_0},
133 {"spv1.1", SPV_ENV_UNIVERSAL_1_1},
134 {"spv1.2", SPV_ENV_UNIVERSAL_1_2},
135 {"spv1.3", SPV_ENV_UNIVERSAL_1_3},
136 {"spv1.4", SPV_ENV_UNIVERSAL_1_4},
alan-baker5a48c0d2019-09-13 14:59:02 -0400137 {"spv1.5", SPV_ENV_UNIVERSAL_1_5},
alan-baker7d768812021-12-15 14:38:28 -0500138 {"spv1.6", SPV_ENV_UNIVERSAL_1_6},
Kévin Petitbec7e032019-06-20 14:41:28 +0100139 {"opencl1.2embedded", SPV_ENV_OPENCL_EMBEDDED_1_2},
140 {"opencl1.2", SPV_ENV_OPENCL_1_2},
141 {"opencl2.0embedded", SPV_ENV_OPENCL_EMBEDDED_2_0},
142 {"opencl2.0", SPV_ENV_OPENCL_2_0},
143 {"opencl2.1embedded", SPV_ENV_OPENCL_EMBEDDED_2_1},
144 {"opencl2.1", SPV_ENV_OPENCL_2_1},
145 {"opencl2.2embedded", SPV_ENV_OPENCL_EMBEDDED_2_2},
146 {"opencl2.2", SPV_ENV_OPENCL_2_2},
147 {"opengl4.0", SPV_ENV_OPENGL_4_0},
148 {"opengl4.1", SPV_ENV_OPENGL_4_1},
149 {"opengl4.2", SPV_ENV_OPENGL_4_2},
150 {"opengl4.3", SPV_ENV_OPENGL_4_3},
151 {"opengl4.5", SPV_ENV_OPENGL_4_5},
Kévin Petitbec7e032019-06-20 14:41:28 +0100152};
153
Dejan Mircevski27030392016-05-11 09:48:52 -0400154bool spvParseTargetEnv(const char* s, spv_target_env* env) {
Kévin Petitdf86bb42019-06-21 13:47:27 +0100155 auto match = [s](const char* b) {
156 return s && (0 == strncmp(s, b, strlen(b)));
157 };
158 for (auto& name_env : spvTargetEnvNameMap) {
159 if (match(name_env.first)) {
160 if (env) {
161 *env = name_env.second;
162 }
163 return true;
Kévin Petitbec7e032019-06-20 14:41:28 +0100164 }
Kévin Petitbec7e032019-06-20 14:41:28 +0100165 }
166 if (env) *env = SPV_ENV_UNIVERSAL_1_0;
167 return false;
Dejan Mircevski27030392016-05-11 09:48:52 -0400168}
Andrey Tuganovbdc78372018-01-23 15:02:27 -0500169
David Netobb236c32020-01-23 17:20:32 -0500170#define VULKAN_VER(MAJOR, MINOR) ((MAJOR << 22) | (MINOR << 12))
171#define SPIRV_VER(MAJOR, MINOR) ((MAJOR << 16) | (MINOR << 8))
172
173struct VulkanEnv {
174 spv_target_env vulkan_env;
175 uint32_t vulkan_ver;
176 uint32_t spirv_ver;
177};
178// Maps each Vulkan target environment enum to the Vulkan version, and the
179// maximum supported SPIR-V version for that Vulkan environment.
180// Keep this ordered from least capable to most capable.
181static const VulkanEnv ordered_vulkan_envs[] = {
182 {SPV_ENV_VULKAN_1_0, VULKAN_VER(1, 0), SPIRV_VER(1, 0)},
183 {SPV_ENV_VULKAN_1_1, VULKAN_VER(1, 1), SPIRV_VER(1, 3)},
184 {SPV_ENV_VULKAN_1_1_SPIRV_1_4, VULKAN_VER(1, 1), SPIRV_VER(1, 4)},
185 {SPV_ENV_VULKAN_1_2, VULKAN_VER(1, 2), SPIRV_VER(1, 5)}};
186
187bool spvParseVulkanEnv(uint32_t vulkan_ver, uint32_t spirv_ver,
188 spv_target_env* env) {
189 for (auto triple : ordered_vulkan_envs) {
190 if (triple.vulkan_ver >= vulkan_ver && triple.spirv_ver >= spirv_ver) {
191 *env = triple.vulkan_env;
192 return true;
193 }
194 }
195 return false;
196}
197
Andrey Tuganovbdc78372018-01-23 15:02:27 -0500198bool spvIsVulkanEnv(spv_target_env env) {
199 switch (env) {
200 case SPV_ENV_UNIVERSAL_1_0:
201 case SPV_ENV_OPENCL_1_2:
202 case SPV_ENV_OPENCL_EMBEDDED_1_2:
203 case SPV_ENV_OPENCL_2_0:
204 case SPV_ENV_OPENCL_EMBEDDED_2_0:
205 case SPV_ENV_OPENCL_2_1:
206 case SPV_ENV_OPENCL_EMBEDDED_2_1:
207 case SPV_ENV_OPENGL_4_0:
208 case SPV_ENV_OPENGL_4_1:
209 case SPV_ENV_OPENGL_4_2:
210 case SPV_ENV_OPENGL_4_3:
211 case SPV_ENV_OPENGL_4_5:
212 case SPV_ENV_UNIVERSAL_1_1:
213 case SPV_ENV_UNIVERSAL_1_2:
214 case SPV_ENV_OPENCL_2_2:
215 case SPV_ENV_OPENCL_EMBEDDED_2_2:
David Neto00fa3932018-02-09 14:29:02 -0500216 case SPV_ENV_UNIVERSAL_1_3:
David Neto63f57d92019-05-07 12:27:18 -0400217 case SPV_ENV_UNIVERSAL_1_4:
alan-baker5a48c0d2019-09-13 14:59:02 -0400218 case SPV_ENV_UNIVERSAL_1_5:
alan-baker7d768812021-12-15 14:38:28 -0500219 case SPV_ENV_UNIVERSAL_1_6:
Andrey Tuganovbdc78372018-01-23 15:02:27 -0500220 return false;
221 case SPV_ENV_VULKAN_1_0:
David Neto00fa3932018-02-09 14:29:02 -0500222 case SPV_ENV_VULKAN_1_1:
David Neto63f57d92019-05-07 12:27:18 -0400223 case SPV_ENV_VULKAN_1_1_SPIRV_1_4:
David Netod46a1b02019-08-28 18:49:33 -0400224 case SPV_ENV_VULKAN_1_2:
Andrey Tuganovbdc78372018-01-23 15:02:27 -0500225 return true;
Ryan Harrison9150cd42021-01-14 16:45:18 -0500226 case SPV_ENV_WEBGPU_0:
Alastair Donaldson0c4deeb2021-10-06 15:50:12 +0100227 assert(false && "Deprecated target environment value.");
228 break;
229 case SPV_ENV_MAX:
230 assert(false && "Invalid target environment value.");
Ryan Harrison9150cd42021-01-14 16:45:18 -0500231 break;
Andrey Tuganovbdc78372018-01-23 15:02:27 -0500232 }
233 return false;
234}
Ben Ashbaughd3f88b02018-10-09 08:33:01 -0700235
236bool spvIsOpenCLEnv(spv_target_env env) {
237 switch (env) {
238 case SPV_ENV_UNIVERSAL_1_0:
239 case SPV_ENV_VULKAN_1_0:
240 case SPV_ENV_UNIVERSAL_1_1:
241 case SPV_ENV_OPENGL_4_0:
242 case SPV_ENV_OPENGL_4_1:
243 case SPV_ENV_OPENGL_4_2:
244 case SPV_ENV_OPENGL_4_3:
245 case SPV_ENV_OPENGL_4_5:
246 case SPV_ENV_UNIVERSAL_1_2:
247 case SPV_ENV_UNIVERSAL_1_3:
248 case SPV_ENV_VULKAN_1_1:
David Neto63f57d92019-05-07 12:27:18 -0400249 case SPV_ENV_UNIVERSAL_1_4:
250 case SPV_ENV_VULKAN_1_1_SPIRV_1_4:
alan-baker5a48c0d2019-09-13 14:59:02 -0400251 case SPV_ENV_UNIVERSAL_1_5:
David Netod46a1b02019-08-28 18:49:33 -0400252 case SPV_ENV_VULKAN_1_2:
alan-baker7d768812021-12-15 14:38:28 -0500253 case SPV_ENV_UNIVERSAL_1_6:
Ben Ashbaughd3f88b02018-10-09 08:33:01 -0700254 return false;
255 case SPV_ENV_OPENCL_1_2:
256 case SPV_ENV_OPENCL_EMBEDDED_1_2:
257 case SPV_ENV_OPENCL_2_0:
258 case SPV_ENV_OPENCL_EMBEDDED_2_0:
259 case SPV_ENV_OPENCL_EMBEDDED_2_1:
260 case SPV_ENV_OPENCL_EMBEDDED_2_2:
261 case SPV_ENV_OPENCL_2_1:
262 case SPV_ENV_OPENCL_2_2:
263 return true;
Ryan Harrison8cd2a9d2018-11-19 14:32:18 -0500264 case SPV_ENV_WEBGPU_0:
Alastair Donaldson0c4deeb2021-10-06 15:50:12 +0100265 assert(false && "Deprecated target environment value.");
266 break;
267 case SPV_ENV_MAX:
268 assert(false && "Invalid target environment value.");
Ryan Harrison9150cd42021-01-14 16:45:18 -0500269 break;
Ryan Harrison8cd2a9d2018-11-19 14:32:18 -0500270 }
271 return false;
272}
Ryan Harrison3a3ad2e2019-01-22 15:18:14 -0500273
Caio Marcelo de Oliveira Filho9702d472019-07-02 05:11:20 -0700274bool spvIsOpenGLEnv(spv_target_env env) {
275 switch (env) {
276 case SPV_ENV_UNIVERSAL_1_0:
277 case SPV_ENV_VULKAN_1_0:
278 case SPV_ENV_UNIVERSAL_1_1:
279 case SPV_ENV_UNIVERSAL_1_2:
280 case SPV_ENV_UNIVERSAL_1_3:
281 case SPV_ENV_VULKAN_1_1:
282 case SPV_ENV_OPENCL_1_2:
283 case SPV_ENV_OPENCL_EMBEDDED_1_2:
284 case SPV_ENV_OPENCL_2_0:
285 case SPV_ENV_OPENCL_EMBEDDED_2_0:
286 case SPV_ENV_OPENCL_EMBEDDED_2_1:
287 case SPV_ENV_OPENCL_EMBEDDED_2_2:
288 case SPV_ENV_OPENCL_2_1:
289 case SPV_ENV_OPENCL_2_2:
Caio Marcelo de Oliveira Filho9702d472019-07-02 05:11:20 -0700290 case SPV_ENV_UNIVERSAL_1_4:
291 case SPV_ENV_VULKAN_1_1_SPIRV_1_4:
alan-baker5a48c0d2019-09-13 14:59:02 -0400292 case SPV_ENV_UNIVERSAL_1_5:
David Netod46a1b02019-08-28 18:49:33 -0400293 case SPV_ENV_VULKAN_1_2:
alan-baker7d768812021-12-15 14:38:28 -0500294 case SPV_ENV_UNIVERSAL_1_6:
Caio Marcelo de Oliveira Filho9702d472019-07-02 05:11:20 -0700295 return false;
296 case SPV_ENV_OPENGL_4_0:
297 case SPV_ENV_OPENGL_4_1:
298 case SPV_ENV_OPENGL_4_2:
299 case SPV_ENV_OPENGL_4_3:
300 case SPV_ENV_OPENGL_4_5:
301 return true;
Ryan Harrison9150cd42021-01-14 16:45:18 -0500302 case SPV_ENV_WEBGPU_0:
Alastair Donaldson0c4deeb2021-10-06 15:50:12 +0100303 assert(false && "Deprecated target environment value.");
304 break;
305 case SPV_ENV_MAX:
306 assert(false && "Invalid target environment value.");
Ryan Harrison9150cd42021-01-14 16:45:18 -0500307 break;
Caio Marcelo de Oliveira Filho9702d472019-07-02 05:11:20 -0700308 }
309 return false;
310}
311
Ryan Harrison2d123672021-10-04 13:42:12 -0400312bool spvIsValidEnv(spv_target_env env) {
313 switch (env) {
314 case SPV_ENV_UNIVERSAL_1_0:
315 case SPV_ENV_VULKAN_1_0:
316 case SPV_ENV_UNIVERSAL_1_1:
317 case SPV_ENV_UNIVERSAL_1_2:
318 case SPV_ENV_UNIVERSAL_1_3:
319 case SPV_ENV_VULKAN_1_1:
320 case SPV_ENV_OPENCL_1_2:
321 case SPV_ENV_OPENCL_EMBEDDED_1_2:
322 case SPV_ENV_OPENCL_2_0:
323 case SPV_ENV_OPENCL_EMBEDDED_2_0:
324 case SPV_ENV_OPENCL_EMBEDDED_2_1:
325 case SPV_ENV_OPENCL_EMBEDDED_2_2:
326 case SPV_ENV_OPENCL_2_1:
327 case SPV_ENV_OPENCL_2_2:
328 case SPV_ENV_UNIVERSAL_1_4:
329 case SPV_ENV_VULKAN_1_1_SPIRV_1_4:
330 case SPV_ENV_UNIVERSAL_1_5:
331 case SPV_ENV_VULKAN_1_2:
alan-baker7d768812021-12-15 14:38:28 -0500332 case SPV_ENV_UNIVERSAL_1_6:
Ryan Harrison2d123672021-10-04 13:42:12 -0400333 case SPV_ENV_OPENGL_4_0:
334 case SPV_ENV_OPENGL_4_1:
335 case SPV_ENV_OPENGL_4_2:
336 case SPV_ENV_OPENGL_4_3:
337 case SPV_ENV_OPENGL_4_5:
338 return true;
339 case SPV_ENV_WEBGPU_0:
Alastair Donaldson0c4deeb2021-10-06 15:50:12 +0100340 case SPV_ENV_MAX:
Ryan Harrison2d123672021-10-04 13:42:12 -0400341 break;
342 }
343 return false;
344}
345
Ryan Harrison3a3ad2e2019-01-22 15:18:14 -0500346std::string spvLogStringForEnv(spv_target_env env) {
347 switch (env) {
348 case SPV_ENV_OPENCL_1_2:
349 case SPV_ENV_OPENCL_2_0:
350 case SPV_ENV_OPENCL_2_1:
351 case SPV_ENV_OPENCL_2_2:
352 case SPV_ENV_OPENCL_EMBEDDED_1_2:
353 case SPV_ENV_OPENCL_EMBEDDED_2_0:
354 case SPV_ENV_OPENCL_EMBEDDED_2_1:
355 case SPV_ENV_OPENCL_EMBEDDED_2_2: {
356 return "OpenCL";
357 }
358 case SPV_ENV_OPENGL_4_0:
359 case SPV_ENV_OPENGL_4_1:
360 case SPV_ENV_OPENGL_4_2:
361 case SPV_ENV_OPENGL_4_3:
362 case SPV_ENV_OPENGL_4_5: {
363 return "OpenGL";
364 }
365 case SPV_ENV_VULKAN_1_0:
David Neto63f57d92019-05-07 12:27:18 -0400366 case SPV_ENV_VULKAN_1_1:
alan-baker7d768812021-12-15 14:38:28 -0500367 case SPV_ENV_VULKAN_1_1_SPIRV_1_4:
368 case SPV_ENV_VULKAN_1_2: {
369 return "Vulkan";
Ryan Harrison3a3ad2e2019-01-22 15:18:14 -0500370 }
Ryan Harrison3a3ad2e2019-01-22 15:18:14 -0500371 case SPV_ENV_UNIVERSAL_1_0:
372 case SPV_ENV_UNIVERSAL_1_1:
373 case SPV_ENV_UNIVERSAL_1_2:
David Neto63f57d92019-05-07 12:27:18 -0400374 case SPV_ENV_UNIVERSAL_1_3:
alan-baker5a48c0d2019-09-13 14:59:02 -0400375 case SPV_ENV_UNIVERSAL_1_4:
alan-baker7d768812021-12-15 14:38:28 -0500376 case SPV_ENV_UNIVERSAL_1_5:
377 case SPV_ENV_UNIVERSAL_1_6: {
Ryan Harrison3a3ad2e2019-01-22 15:18:14 -0500378 return "Universal";
379 }
Ryan Harrison9150cd42021-01-14 16:45:18 -0500380 case SPV_ENV_WEBGPU_0:
Alastair Donaldson0c4deeb2021-10-06 15:50:12 +0100381 assert(false && "Deprecated target environment value.");
382 break;
383 case SPV_ENV_MAX:
384 assert(false && "Invalid target environment value.");
Ryan Harrison9150cd42021-01-14 16:45:18 -0500385 break;
Ryan Harrison3a3ad2e2019-01-22 15:18:14 -0500386 }
387 return "Unknown";
388}
Kévin Petitbec7e032019-06-20 14:41:28 +0100389
390std::string spvTargetEnvList(const int pad, const int wrap) {
391 std::string ret;
392 size_t max_line_len = wrap - pad; // The first line isn't padded
393 std::string line;
394 std::string sep = "";
395
Kévin Petitdf86bb42019-06-21 13:47:27 +0100396 for (auto& name_env : spvTargetEnvNameMap) {
397 std::string word = sep + name_env.first;
Kévin Petitbec7e032019-06-20 14:41:28 +0100398 if (line.length() + word.length() > max_line_len) {
399 // Adding one word wouldn't fit, commit the line in progress and
400 // start a new one.
401 ret += line + "\n";
402 line.assign(pad, ' ');
403 // The first line is done. The max length now comprises the
404 // padding.
405 max_line_len = wrap;
406 }
407 line += word;
408 sep = "|";
409 }
410
411 ret += line;
412
413 return ret;
414}