blob: d3fe4b423ef36b94f0dacca5607129774e7ac8c2 [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:
Pierre Moreau12447d82017-11-30 00:49:23 +010042 return "SPIR-V 1.1 (under OpenCL 2.2 Full Profile semantics)";
43 case SPV_ENV_OPENCL_EMBEDDED_2_2:
44 return "SPIR-V 1.1 (under OpenCL 2.2 Embedded Profile semantics)";
David Netoc2967012016-08-05 18:19:30 -040045 case SPV_ENV_OPENGL_4_0:
46 return "SPIR-V 1.0 (under OpenCL 4.0 semantics)";
47 case SPV_ENV_OPENGL_4_1:
48 return "SPIR-V 1.0 (under OpenCL 4.1 semantics)";
49 case SPV_ENV_OPENGL_4_2:
50 return "SPIR-V 1.0 (under OpenCL 4.2 semantics)";
51 case SPV_ENV_OPENGL_4_3:
52 return "SPIR-V 1.0 (under OpenCL 4.3 semantics)";
53 case SPV_ENV_OPENGL_4_5:
54 return "SPIR-V 1.0 (under OpenCL 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)";
Lei Zhang6fa3f8a2016-03-31 17:26:31 -040061 }
62 assert(0 && "Unhandled SPIR-V target environment");
63 return "";
64}
65
66uint32_t spvVersionForTargetEnv(spv_target_env env) {
67 switch (env) {
68 case SPV_ENV_UNIVERSAL_1_0:
Lei Zhang6fa3f8a2016-03-31 17:26:31 -040069 case SPV_ENV_VULKAN_1_0:
Pierre Moreau12447d82017-11-30 00:49:23 +010070 case SPV_ENV_OPENCL_1_2:
71 case SPV_ENV_OPENCL_EMBEDDED_1_2:
72 case SPV_ENV_OPENCL_2_0:
73 case SPV_ENV_OPENCL_EMBEDDED_2_0:
David Netoc2967012016-08-05 18:19:30 -040074 case SPV_ENV_OPENCL_2_1:
Pierre Moreau12447d82017-11-30 00:49:23 +010075 case SPV_ENV_OPENCL_EMBEDDED_2_1:
David Netoc2967012016-08-05 18:19:30 -040076 case SPV_ENV_OPENGL_4_0:
77 case SPV_ENV_OPENGL_4_1:
78 case SPV_ENV_OPENGL_4_2:
79 case SPV_ENV_OPENGL_4_3:
80 case SPV_ENV_OPENGL_4_5:
Lei Zhang6fa3f8a2016-03-31 17:26:31 -040081 return SPV_SPIRV_VERSION_WORD(1, 0);
Dejan Mircevskicb3c49e2016-04-07 14:41:34 -040082 case SPV_ENV_UNIVERSAL_1_1:
83 return SPV_SPIRV_VERSION_WORD(1, 1);
David Netodbc20492017-03-14 12:43:41 -040084 case SPV_ENV_UNIVERSAL_1_2:
85 case SPV_ENV_OPENCL_2_2:
Pierre Moreau12447d82017-11-30 00:49:23 +010086 case SPV_ENV_OPENCL_EMBEDDED_2_2:
David Netodbc20492017-03-14 12:43:41 -040087 return SPV_SPIRV_VERSION_WORD(1, 2);
David Neto00fa3932018-02-09 14:29:02 -050088 case SPV_ENV_UNIVERSAL_1_3:
89 case SPV_ENV_VULKAN_1_1:
90 return SPV_SPIRV_VERSION_WORD(1, 3);
Lei Zhang6fa3f8a2016-03-31 17:26:31 -040091 }
92 assert(0 && "Unhandled SPIR-V target environment");
93 return SPV_SPIRV_VERSION_WORD(0, 0);
94}
Dejan Mircevski27030392016-05-11 09:48:52 -040095
96bool spvParseTargetEnv(const char* s, spv_target_env* env) {
David Netoc2967012016-08-05 18:19:30 -040097 auto match = [s](const char* b) {
98 return s && (0 == strncmp(s, b, strlen(b)));
99 };
100 if (match("vulkan1.0")) {
Dejan Mircevski27030392016-05-11 09:48:52 -0400101 if (env) *env = SPV_ENV_VULKAN_1_0;
102 return true;
David Neto00fa3932018-02-09 14:29:02 -0500103 } else if (match("vulkan1.1")) {
104 if (env) *env = SPV_ENV_VULKAN_1_1;
105 return true;
David Netoc2967012016-08-05 18:19:30 -0400106 } else if (match("spv1.0")) {
Dejan Mircevski27030392016-05-11 09:48:52 -0400107 if (env) *env = SPV_ENV_UNIVERSAL_1_0;
108 return true;
David Netoc2967012016-08-05 18:19:30 -0400109 } else if (match("spv1.1")) {
Dejan Mircevski27030392016-05-11 09:48:52 -0400110 if (env) *env = SPV_ENV_UNIVERSAL_1_1;
111 return true;
David Netodbc20492017-03-14 12:43:41 -0400112 } else if (match("spv1.2")) {
113 if (env) *env = SPV_ENV_UNIVERSAL_1_2;
114 return true;
David Neto00fa3932018-02-09 14:29:02 -0500115 } else if (match("spv1.3")) {
116 if (env) *env = SPV_ENV_UNIVERSAL_1_3;
117 return true;
Pierre Moreau12447d82017-11-30 00:49:23 +0100118 } else if (match("opencl1.2embedded")) {
119 if (env) *env = SPV_ENV_OPENCL_EMBEDDED_1_2;
120 return true;
121 } else if (match("opencl1.2")) {
122 if (env) *env = SPV_ENV_OPENCL_1_2;
123 return true;
124 } else if (match("opencl2.0embedded")) {
125 if (env) *env = SPV_ENV_OPENCL_EMBEDDED_2_0;
126 return true;
127 } else if (match("opencl2.0")) {
128 if (env) *env = SPV_ENV_OPENCL_2_0;
129 return true;
130 } else if (match("opencl2.1embedded")) {
131 if (env) *env = SPV_ENV_OPENCL_EMBEDDED_2_1;
132 return true;
David Netoc2967012016-08-05 18:19:30 -0400133 } else if (match("opencl2.1")) {
134 if (env) *env = SPV_ENV_OPENCL_2_1;
135 return true;
Pierre Moreau12447d82017-11-30 00:49:23 +0100136 } else if (match("opencl2.2embedded")) {
137 if (env) *env = SPV_ENV_OPENCL_EMBEDDED_2_2;
138 return true;
David Netoc2967012016-08-05 18:19:30 -0400139 } else if (match("opencl2.2")) {
140 if (env) *env = SPV_ENV_OPENCL_2_2;
141 return true;
142 } else if (match("opengl4.0")) {
143 if (env) *env = SPV_ENV_OPENGL_4_0;
144 return true;
145 } else if (match("opengl4.1")) {
146 if (env) *env = SPV_ENV_OPENGL_4_1;
147 return true;
148 } else if (match("opengl4.2")) {
149 if (env) *env = SPV_ENV_OPENGL_4_2;
150 return true;
151 } else if (match("opengl4.3")) {
152 if (env) *env = SPV_ENV_OPENGL_4_3;
153 return true;
154 } else if (match("opengl4.5")) {
155 if (env) *env = SPV_ENV_OPENGL_4_5;
156 return true;
Dejan Mircevski27030392016-05-11 09:48:52 -0400157 } else {
158 if (env) *env = SPV_ENV_UNIVERSAL_1_0;
159 return false;
160 }
161}
Andrey Tuganovbdc78372018-01-23 15:02:27 -0500162
163bool spvIsVulkanEnv(spv_target_env env) {
164 switch (env) {
165 case SPV_ENV_UNIVERSAL_1_0:
166 case SPV_ENV_OPENCL_1_2:
167 case SPV_ENV_OPENCL_EMBEDDED_1_2:
168 case SPV_ENV_OPENCL_2_0:
169 case SPV_ENV_OPENCL_EMBEDDED_2_0:
170 case SPV_ENV_OPENCL_2_1:
171 case SPV_ENV_OPENCL_EMBEDDED_2_1:
172 case SPV_ENV_OPENGL_4_0:
173 case SPV_ENV_OPENGL_4_1:
174 case SPV_ENV_OPENGL_4_2:
175 case SPV_ENV_OPENGL_4_3:
176 case SPV_ENV_OPENGL_4_5:
177 case SPV_ENV_UNIVERSAL_1_1:
178 case SPV_ENV_UNIVERSAL_1_2:
179 case SPV_ENV_OPENCL_2_2:
180 case SPV_ENV_OPENCL_EMBEDDED_2_2:
David Neto00fa3932018-02-09 14:29:02 -0500181 case SPV_ENV_UNIVERSAL_1_3:
Andrey Tuganovbdc78372018-01-23 15:02:27 -0500182 return false;
183 case SPV_ENV_VULKAN_1_0:
David Neto00fa3932018-02-09 14:29:02 -0500184 case SPV_ENV_VULKAN_1_1:
Andrey Tuganovbdc78372018-01-23 15:02:27 -0500185 return true;
186 }
187 return false;
188}