blob: 3a8766d7bb5a94058f34dd993e8a4791300a6276 [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
Dejan Mircevski27030392016-05-11 09:48:52 -040015#include <cassert>
16#include <cstring>
Lei Zhang6fa3f8a2016-03-31 17:26:31 -040017
18#include "spirv-tools/libspirv.h"
19#include "spirv_constant.h"
20
21const char* spvTargetEnvDescription(spv_target_env env) {
22 switch (env) {
23 case SPV_ENV_UNIVERSAL_1_0:
24 return "SPIR-V 1.0";
Lei Zhang6fa3f8a2016-03-31 17:26:31 -040025 case SPV_ENV_VULKAN_1_0:
26 return "SPIR-V 1.0 (under Vulkan 1.0 semantics)";
Dejan Mircevskicb3c49e2016-04-07 14:41:34 -040027 case SPV_ENV_UNIVERSAL_1_1:
28 return "SPIR-V 1.1";
Pierre Moreau12447d82017-11-30 00:49:23 +010029 case SPV_ENV_OPENCL_1_2:
30 return "SPIR-V 1.0 (under OpenCL 1.2 Full Profile semantics)";
31 case SPV_ENV_OPENCL_EMBEDDED_1_2:
32 return "SPIR-V 1.0 (under OpenCL 1.2 Embedded Profile semantics)";
33 case SPV_ENV_OPENCL_2_0:
34 return "SPIR-V 1.0 (under OpenCL 2.0 Full Profile semantics)";
35 case SPV_ENV_OPENCL_EMBEDDED_2_0:
36 return "SPIR-V 1.0 (under OpenCL 2.0 Embedded Profile semantics)";
David Netoc2967012016-08-05 18:19:30 -040037 case SPV_ENV_OPENCL_2_1:
Pierre Moreau12447d82017-11-30 00:49:23 +010038 return "SPIR-V 1.0 (under OpenCL 2.1 Full Profile semantics)";
39 case SPV_ENV_OPENCL_EMBEDDED_2_1:
40 return "SPIR-V 1.0 (under OpenCL 2.1 Embedded Profile semantics)";
David Netoc2967012016-08-05 18:19:30 -040041 case SPV_ENV_OPENCL_2_2:
Andrey Tuganov95843d72018-03-27 12:01:21 -040042 return "SPIR-V 1.2 (under OpenCL 2.2 Full Profile semantics)";
Pierre Moreau12447d82017-11-30 00:49:23 +010043 case SPV_ENV_OPENCL_EMBEDDED_2_2:
Andrey Tuganov95843d72018-03-27 12:01:21 -040044 return "SPIR-V 1.2 (under OpenCL 2.2 Embedded Profile semantics)";
David Netoc2967012016-08-05 18:19:30 -040045 case SPV_ENV_OPENGL_4_0:
Alan Baker42840d12018-04-06 14:15:27 -040046 return "SPIR-V 1.0 (under OpenGL 4.0 semantics)";
David Netoc2967012016-08-05 18:19:30 -040047 case SPV_ENV_OPENGL_4_1:
Alan Baker42840d12018-04-06 14:15:27 -040048 return "SPIR-V 1.0 (under OpenGL 4.1 semantics)";
David Netoc2967012016-08-05 18:19:30 -040049 case SPV_ENV_OPENGL_4_2:
Alan Baker42840d12018-04-06 14:15:27 -040050 return "SPIR-V 1.0 (under OpenGL 4.2 semantics)";
David Netoc2967012016-08-05 18:19:30 -040051 case SPV_ENV_OPENGL_4_3:
Alan Baker42840d12018-04-06 14:15:27 -040052 return "SPIR-V 1.0 (under OpenGL 4.3 semantics)";
David Netoc2967012016-08-05 18:19:30 -040053 case SPV_ENV_OPENGL_4_5:
Alan Baker42840d12018-04-06 14:15:27 -040054 return "SPIR-V 1.0 (under OpenGL 4.5 semantics)";
David Netodbc20492017-03-14 12:43:41 -040055 case SPV_ENV_UNIVERSAL_1_2:
56 return "SPIR-V 1.2";
David Neto00fa3932018-02-09 14:29:02 -050057 case SPV_ENV_UNIVERSAL_1_3:
58 return "SPIR-V 1.3";
59 case SPV_ENV_VULKAN_1_1:
60 return "SPIR-V 1.3 (under Vulkan 1.1 semantics)";
Corentin Wallezba602c92018-06-20 13:29:38 -040061 case SPV_ENV_WEBGPU_0:
62 return "SPIR-V 1.3 (under WIP WebGPU semantics)";
Lei Zhang6fa3f8a2016-03-31 17:26:31 -040063 }
64 assert(0 && "Unhandled SPIR-V target environment");
65 return "";
66}
67
68uint32_t spvVersionForTargetEnv(spv_target_env env) {
69 switch (env) {
70 case SPV_ENV_UNIVERSAL_1_0:
Lei Zhang6fa3f8a2016-03-31 17:26:31 -040071 case SPV_ENV_VULKAN_1_0:
Pierre Moreau12447d82017-11-30 00:49:23 +010072 case SPV_ENV_OPENCL_1_2:
73 case SPV_ENV_OPENCL_EMBEDDED_1_2:
74 case SPV_ENV_OPENCL_2_0:
75 case SPV_ENV_OPENCL_EMBEDDED_2_0:
David Netoc2967012016-08-05 18:19:30 -040076 case SPV_ENV_OPENCL_2_1:
Pierre Moreau12447d82017-11-30 00:49:23 +010077 case SPV_ENV_OPENCL_EMBEDDED_2_1:
David Netoc2967012016-08-05 18:19:30 -040078 case SPV_ENV_OPENGL_4_0:
79 case SPV_ENV_OPENGL_4_1:
80 case SPV_ENV_OPENGL_4_2:
81 case SPV_ENV_OPENGL_4_3:
82 case SPV_ENV_OPENGL_4_5:
Lei Zhang6fa3f8a2016-03-31 17:26:31 -040083 return SPV_SPIRV_VERSION_WORD(1, 0);
Dejan Mircevskicb3c49e2016-04-07 14:41:34 -040084 case SPV_ENV_UNIVERSAL_1_1:
85 return SPV_SPIRV_VERSION_WORD(1, 1);
David Netodbc20492017-03-14 12:43:41 -040086 case SPV_ENV_UNIVERSAL_1_2:
87 case SPV_ENV_OPENCL_2_2:
Pierre Moreau12447d82017-11-30 00:49:23 +010088 case SPV_ENV_OPENCL_EMBEDDED_2_2:
David Netodbc20492017-03-14 12:43:41 -040089 return SPV_SPIRV_VERSION_WORD(1, 2);
David Neto00fa3932018-02-09 14:29:02 -050090 case SPV_ENV_UNIVERSAL_1_3:
91 case SPV_ENV_VULKAN_1_1:
Corentin Wallezba602c92018-06-20 13:29:38 -040092 case SPV_ENV_WEBGPU_0:
David Neto00fa3932018-02-09 14:29:02 -050093 return SPV_SPIRV_VERSION_WORD(1, 3);
Lei Zhang6fa3f8a2016-03-31 17:26:31 -040094 }
95 assert(0 && "Unhandled SPIR-V target environment");
96 return SPV_SPIRV_VERSION_WORD(0, 0);
97}
Dejan Mircevski27030392016-05-11 09:48:52 -040098
99bool spvParseTargetEnv(const char* s, spv_target_env* env) {
David Netoc2967012016-08-05 18:19:30 -0400100 auto match = [s](const char* b) {
101 return s && (0 == strncmp(s, b, strlen(b)));
102 };
103 if (match("vulkan1.0")) {
Dejan Mircevski27030392016-05-11 09:48:52 -0400104 if (env) *env = SPV_ENV_VULKAN_1_0;
105 return true;
David Neto00fa3932018-02-09 14:29:02 -0500106 } else if (match("vulkan1.1")) {
107 if (env) *env = SPV_ENV_VULKAN_1_1;
108 return true;
David Netoc2967012016-08-05 18:19:30 -0400109 } else if (match("spv1.0")) {
Dejan Mircevski27030392016-05-11 09:48:52 -0400110 if (env) *env = SPV_ENV_UNIVERSAL_1_0;
111 return true;
David Netoc2967012016-08-05 18:19:30 -0400112 } else if (match("spv1.1")) {
Dejan Mircevski27030392016-05-11 09:48:52 -0400113 if (env) *env = SPV_ENV_UNIVERSAL_1_1;
114 return true;
David Netodbc20492017-03-14 12:43:41 -0400115 } else if (match("spv1.2")) {
116 if (env) *env = SPV_ENV_UNIVERSAL_1_2;
117 return true;
David Neto00fa3932018-02-09 14:29:02 -0500118 } else if (match("spv1.3")) {
119 if (env) *env = SPV_ENV_UNIVERSAL_1_3;
120 return true;
Pierre Moreau12447d82017-11-30 00:49:23 +0100121 } else if (match("opencl1.2embedded")) {
122 if (env) *env = SPV_ENV_OPENCL_EMBEDDED_1_2;
123 return true;
124 } else if (match("opencl1.2")) {
125 if (env) *env = SPV_ENV_OPENCL_1_2;
126 return true;
127 } else if (match("opencl2.0embedded")) {
128 if (env) *env = SPV_ENV_OPENCL_EMBEDDED_2_0;
129 return true;
130 } else if (match("opencl2.0")) {
131 if (env) *env = SPV_ENV_OPENCL_2_0;
132 return true;
133 } else if (match("opencl2.1embedded")) {
134 if (env) *env = SPV_ENV_OPENCL_EMBEDDED_2_1;
135 return true;
David Netoc2967012016-08-05 18:19:30 -0400136 } else if (match("opencl2.1")) {
137 if (env) *env = SPV_ENV_OPENCL_2_1;
138 return true;
Pierre Moreau12447d82017-11-30 00:49:23 +0100139 } else if (match("opencl2.2embedded")) {
140 if (env) *env = SPV_ENV_OPENCL_EMBEDDED_2_2;
141 return true;
David Netoc2967012016-08-05 18:19:30 -0400142 } else if (match("opencl2.2")) {
143 if (env) *env = SPV_ENV_OPENCL_2_2;
144 return true;
145 } else if (match("opengl4.0")) {
146 if (env) *env = SPV_ENV_OPENGL_4_0;
147 return true;
148 } else if (match("opengl4.1")) {
149 if (env) *env = SPV_ENV_OPENGL_4_1;
150 return true;
151 } else if (match("opengl4.2")) {
152 if (env) *env = SPV_ENV_OPENGL_4_2;
153 return true;
154 } else if (match("opengl4.3")) {
155 if (env) *env = SPV_ENV_OPENGL_4_3;
156 return true;
157 } else if (match("opengl4.5")) {
158 if (env) *env = SPV_ENV_OPENGL_4_5;
159 return true;
Corentin Wallezba602c92018-06-20 13:29:38 -0400160 } else if (match("webgpu0")) {
161 if (env) *env = SPV_ENV_WEBGPU_0;
162 return true;
Dejan Mircevski27030392016-05-11 09:48:52 -0400163 } else {
164 if (env) *env = SPV_ENV_UNIVERSAL_1_0;
165 return false;
166 }
167}
Andrey Tuganovbdc78372018-01-23 15:02:27 -0500168
169bool spvIsVulkanEnv(spv_target_env env) {
170 switch (env) {
171 case SPV_ENV_UNIVERSAL_1_0:
172 case SPV_ENV_OPENCL_1_2:
173 case SPV_ENV_OPENCL_EMBEDDED_1_2:
174 case SPV_ENV_OPENCL_2_0:
175 case SPV_ENV_OPENCL_EMBEDDED_2_0:
176 case SPV_ENV_OPENCL_2_1:
177 case SPV_ENV_OPENCL_EMBEDDED_2_1:
178 case SPV_ENV_OPENGL_4_0:
179 case SPV_ENV_OPENGL_4_1:
180 case SPV_ENV_OPENGL_4_2:
181 case SPV_ENV_OPENGL_4_3:
182 case SPV_ENV_OPENGL_4_5:
183 case SPV_ENV_UNIVERSAL_1_1:
184 case SPV_ENV_UNIVERSAL_1_2:
185 case SPV_ENV_OPENCL_2_2:
186 case SPV_ENV_OPENCL_EMBEDDED_2_2:
David Neto00fa3932018-02-09 14:29:02 -0500187 case SPV_ENV_UNIVERSAL_1_3:
Corentin Wallezba602c92018-06-20 13:29:38 -0400188 case SPV_ENV_WEBGPU_0:
Andrey Tuganovbdc78372018-01-23 15:02:27 -0500189 return false;
190 case SPV_ENV_VULKAN_1_0:
David Neto00fa3932018-02-09 14:29:02 -0500191 case SPV_ENV_VULKAN_1_1:
Andrey Tuganovbdc78372018-01-23 15:02:27 -0500192 return true;
193 }
194 return false;
195}