blob: 7a11630c72466eb562b22eff41da4c49483f0a2a [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
Dejan Mircevski27030392016-05-11 09:48:52 -040017#include <cassert>
18#include <cstring>
Lei Zhang6fa3f8a2016-03-31 17:26:31 -040019
dan sinclaireda2cfb2018-08-03 15:06:09 -040020#include "source/spirv_constant.h"
Lei Zhang6fa3f8a2016-03-31 17:26:31 -040021#include "spirv-tools/libspirv.h"
Lei Zhang6fa3f8a2016-03-31 17:26:31 -040022
23const char* spvTargetEnvDescription(spv_target_env env) {
24 switch (env) {
25 case SPV_ENV_UNIVERSAL_1_0:
26 return "SPIR-V 1.0";
Lei Zhang6fa3f8a2016-03-31 17:26:31 -040027 case SPV_ENV_VULKAN_1_0:
28 return "SPIR-V 1.0 (under Vulkan 1.0 semantics)";
Dejan Mircevskicb3c49e2016-04-07 14:41:34 -040029 case SPV_ENV_UNIVERSAL_1_1:
30 return "SPIR-V 1.1";
Pierre Moreau12447d82017-11-30 00:49:23 +010031 case SPV_ENV_OPENCL_1_2:
32 return "SPIR-V 1.0 (under OpenCL 1.2 Full Profile semantics)";
33 case SPV_ENV_OPENCL_EMBEDDED_1_2:
34 return "SPIR-V 1.0 (under OpenCL 1.2 Embedded Profile semantics)";
35 case SPV_ENV_OPENCL_2_0:
36 return "SPIR-V 1.0 (under OpenCL 2.0 Full Profile semantics)";
37 case SPV_ENV_OPENCL_EMBEDDED_2_0:
38 return "SPIR-V 1.0 (under OpenCL 2.0 Embedded Profile semantics)";
David Netoc2967012016-08-05 18:19:30 -040039 case SPV_ENV_OPENCL_2_1:
Pierre Moreau12447d82017-11-30 00:49:23 +010040 return "SPIR-V 1.0 (under OpenCL 2.1 Full Profile semantics)";
41 case SPV_ENV_OPENCL_EMBEDDED_2_1:
42 return "SPIR-V 1.0 (under OpenCL 2.1 Embedded Profile semantics)";
David Netoc2967012016-08-05 18:19:30 -040043 case SPV_ENV_OPENCL_2_2:
Andrey Tuganov95843d72018-03-27 12:01:21 -040044 return "SPIR-V 1.2 (under OpenCL 2.2 Full Profile semantics)";
Pierre Moreau12447d82017-11-30 00:49:23 +010045 case SPV_ENV_OPENCL_EMBEDDED_2_2:
Andrey Tuganov95843d72018-03-27 12:01:21 -040046 return "SPIR-V 1.2 (under OpenCL 2.2 Embedded Profile semantics)";
David Netoc2967012016-08-05 18:19:30 -040047 case SPV_ENV_OPENGL_4_0:
Alan Baker42840d12018-04-06 14:15:27 -040048 return "SPIR-V 1.0 (under OpenGL 4.0 semantics)";
David Netoc2967012016-08-05 18:19:30 -040049 case SPV_ENV_OPENGL_4_1:
Alan Baker42840d12018-04-06 14:15:27 -040050 return "SPIR-V 1.0 (under OpenGL 4.1 semantics)";
David Netoc2967012016-08-05 18:19:30 -040051 case SPV_ENV_OPENGL_4_2:
Alan Baker42840d12018-04-06 14:15:27 -040052 return "SPIR-V 1.0 (under OpenGL 4.2 semantics)";
David Netoc2967012016-08-05 18:19:30 -040053 case SPV_ENV_OPENGL_4_3:
Alan Baker42840d12018-04-06 14:15:27 -040054 return "SPIR-V 1.0 (under OpenGL 4.3 semantics)";
David Netoc2967012016-08-05 18:19:30 -040055 case SPV_ENV_OPENGL_4_5:
Alan Baker42840d12018-04-06 14:15:27 -040056 return "SPIR-V 1.0 (under OpenGL 4.5 semantics)";
David Netodbc20492017-03-14 12:43:41 -040057 case SPV_ENV_UNIVERSAL_1_2:
58 return "SPIR-V 1.2";
David Neto00fa3932018-02-09 14:29:02 -050059 case SPV_ENV_UNIVERSAL_1_3:
60 return "SPIR-V 1.3";
61 case SPV_ENV_VULKAN_1_1:
62 return "SPIR-V 1.3 (under Vulkan 1.1 semantics)";
Corentin Wallezba602c92018-06-20 13:29:38 -040063 case SPV_ENV_WEBGPU_0:
64 return "SPIR-V 1.3 (under WIP WebGPU semantics)";
Lei Zhang6fa3f8a2016-03-31 17:26:31 -040065 }
66 assert(0 && "Unhandled SPIR-V target environment");
67 return "";
68}
69
70uint32_t spvVersionForTargetEnv(spv_target_env env) {
71 switch (env) {
72 case SPV_ENV_UNIVERSAL_1_0:
Lei Zhang6fa3f8a2016-03-31 17:26:31 -040073 case SPV_ENV_VULKAN_1_0:
Pierre Moreau12447d82017-11-30 00:49:23 +010074 case SPV_ENV_OPENCL_1_2:
75 case SPV_ENV_OPENCL_EMBEDDED_1_2:
76 case SPV_ENV_OPENCL_2_0:
77 case SPV_ENV_OPENCL_EMBEDDED_2_0:
David Netoc2967012016-08-05 18:19:30 -040078 case SPV_ENV_OPENCL_2_1:
Pierre Moreau12447d82017-11-30 00:49:23 +010079 case SPV_ENV_OPENCL_EMBEDDED_2_1:
David Netoc2967012016-08-05 18:19:30 -040080 case SPV_ENV_OPENGL_4_0:
81 case SPV_ENV_OPENGL_4_1:
82 case SPV_ENV_OPENGL_4_2:
83 case SPV_ENV_OPENGL_4_3:
84 case SPV_ENV_OPENGL_4_5:
Lei Zhang6fa3f8a2016-03-31 17:26:31 -040085 return SPV_SPIRV_VERSION_WORD(1, 0);
Dejan Mircevskicb3c49e2016-04-07 14:41:34 -040086 case SPV_ENV_UNIVERSAL_1_1:
87 return SPV_SPIRV_VERSION_WORD(1, 1);
David Netodbc20492017-03-14 12:43:41 -040088 case SPV_ENV_UNIVERSAL_1_2:
89 case SPV_ENV_OPENCL_2_2:
Pierre Moreau12447d82017-11-30 00:49:23 +010090 case SPV_ENV_OPENCL_EMBEDDED_2_2:
David Netodbc20492017-03-14 12:43:41 -040091 return SPV_SPIRV_VERSION_WORD(1, 2);
David Neto00fa3932018-02-09 14:29:02 -050092 case SPV_ENV_UNIVERSAL_1_3:
93 case SPV_ENV_VULKAN_1_1:
Corentin Wallezba602c92018-06-20 13:29:38 -040094 case SPV_ENV_WEBGPU_0:
David Neto00fa3932018-02-09 14:29:02 -050095 return SPV_SPIRV_VERSION_WORD(1, 3);
Lei Zhang6fa3f8a2016-03-31 17:26:31 -040096 }
97 assert(0 && "Unhandled SPIR-V target environment");
98 return SPV_SPIRV_VERSION_WORD(0, 0);
99}
Dejan Mircevski27030392016-05-11 09:48:52 -0400100
101bool spvParseTargetEnv(const char* s, spv_target_env* env) {
David Netoc2967012016-08-05 18:19:30 -0400102 auto match = [s](const char* b) {
103 return s && (0 == strncmp(s, b, strlen(b)));
104 };
105 if (match("vulkan1.0")) {
Dejan Mircevski27030392016-05-11 09:48:52 -0400106 if (env) *env = SPV_ENV_VULKAN_1_0;
107 return true;
David Neto00fa3932018-02-09 14:29:02 -0500108 } else if (match("vulkan1.1")) {
109 if (env) *env = SPV_ENV_VULKAN_1_1;
110 return true;
David Netoc2967012016-08-05 18:19:30 -0400111 } else if (match("spv1.0")) {
Dejan Mircevski27030392016-05-11 09:48:52 -0400112 if (env) *env = SPV_ENV_UNIVERSAL_1_0;
113 return true;
David Netoc2967012016-08-05 18:19:30 -0400114 } else if (match("spv1.1")) {
Dejan Mircevski27030392016-05-11 09:48:52 -0400115 if (env) *env = SPV_ENV_UNIVERSAL_1_1;
116 return true;
David Netodbc20492017-03-14 12:43:41 -0400117 } else if (match("spv1.2")) {
118 if (env) *env = SPV_ENV_UNIVERSAL_1_2;
119 return true;
David Neto00fa3932018-02-09 14:29:02 -0500120 } else if (match("spv1.3")) {
121 if (env) *env = SPV_ENV_UNIVERSAL_1_3;
122 return true;
Pierre Moreau12447d82017-11-30 00:49:23 +0100123 } else if (match("opencl1.2embedded")) {
124 if (env) *env = SPV_ENV_OPENCL_EMBEDDED_1_2;
125 return true;
126 } else if (match("opencl1.2")) {
127 if (env) *env = SPV_ENV_OPENCL_1_2;
128 return true;
129 } else if (match("opencl2.0embedded")) {
130 if (env) *env = SPV_ENV_OPENCL_EMBEDDED_2_0;
131 return true;
132 } else if (match("opencl2.0")) {
133 if (env) *env = SPV_ENV_OPENCL_2_0;
134 return true;
135 } else if (match("opencl2.1embedded")) {
136 if (env) *env = SPV_ENV_OPENCL_EMBEDDED_2_1;
137 return true;
David Netoc2967012016-08-05 18:19:30 -0400138 } else if (match("opencl2.1")) {
139 if (env) *env = SPV_ENV_OPENCL_2_1;
140 return true;
Pierre Moreau12447d82017-11-30 00:49:23 +0100141 } else if (match("opencl2.2embedded")) {
142 if (env) *env = SPV_ENV_OPENCL_EMBEDDED_2_2;
143 return true;
David Netoc2967012016-08-05 18:19:30 -0400144 } else if (match("opencl2.2")) {
145 if (env) *env = SPV_ENV_OPENCL_2_2;
146 return true;
147 } else if (match("opengl4.0")) {
148 if (env) *env = SPV_ENV_OPENGL_4_0;
149 return true;
150 } else if (match("opengl4.1")) {
151 if (env) *env = SPV_ENV_OPENGL_4_1;
152 return true;
153 } else if (match("opengl4.2")) {
154 if (env) *env = SPV_ENV_OPENGL_4_2;
155 return true;
156 } else if (match("opengl4.3")) {
157 if (env) *env = SPV_ENV_OPENGL_4_3;
158 return true;
159 } else if (match("opengl4.5")) {
160 if (env) *env = SPV_ENV_OPENGL_4_5;
161 return true;
Corentin Wallezba602c92018-06-20 13:29:38 -0400162 } else if (match("webgpu0")) {
163 if (env) *env = SPV_ENV_WEBGPU_0;
164 return true;
Dejan Mircevski27030392016-05-11 09:48:52 -0400165 } else {
166 if (env) *env = SPV_ENV_UNIVERSAL_1_0;
167 return false;
168 }
169}
Andrey Tuganovbdc78372018-01-23 15:02:27 -0500170
171bool spvIsVulkanEnv(spv_target_env env) {
172 switch (env) {
173 case SPV_ENV_UNIVERSAL_1_0:
174 case SPV_ENV_OPENCL_1_2:
175 case SPV_ENV_OPENCL_EMBEDDED_1_2:
176 case SPV_ENV_OPENCL_2_0:
177 case SPV_ENV_OPENCL_EMBEDDED_2_0:
178 case SPV_ENV_OPENCL_2_1:
179 case SPV_ENV_OPENCL_EMBEDDED_2_1:
180 case SPV_ENV_OPENGL_4_0:
181 case SPV_ENV_OPENGL_4_1:
182 case SPV_ENV_OPENGL_4_2:
183 case SPV_ENV_OPENGL_4_3:
184 case SPV_ENV_OPENGL_4_5:
185 case SPV_ENV_UNIVERSAL_1_1:
186 case SPV_ENV_UNIVERSAL_1_2:
187 case SPV_ENV_OPENCL_2_2:
188 case SPV_ENV_OPENCL_EMBEDDED_2_2:
David Neto00fa3932018-02-09 14:29:02 -0500189 case SPV_ENV_UNIVERSAL_1_3:
Corentin Wallezba602c92018-06-20 13:29:38 -0400190 case SPV_ENV_WEBGPU_0:
Andrey Tuganovbdc78372018-01-23 15:02:27 -0500191 return false;
192 case SPV_ENV_VULKAN_1_0:
David Neto00fa3932018-02-09 14:29:02 -0500193 case SPV_ENV_VULKAN_1_1:
Andrey Tuganovbdc78372018-01-23 15:02:27 -0500194 return true;
195 }
196 return false;
197}