spirv_target_env.cpp 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. // Copyright (c) 2015-2016 The Khronos Group Inc.
  2. //
  3. // 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
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // 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.
  14. #include "source/spirv_target_env.h"
  15. #include <cstring>
  16. #include <string>
  17. #include "source/spirv_constant.h"
  18. #include "spirv-tools/libspirv.h"
  19. const char* spvTargetEnvDescription(spv_target_env env) {
  20. switch (env) {
  21. case SPV_ENV_UNIVERSAL_1_0:
  22. return "SPIR-V 1.0";
  23. case SPV_ENV_VULKAN_1_0:
  24. return "SPIR-V 1.0 (under Vulkan 1.0 semantics)";
  25. case SPV_ENV_UNIVERSAL_1_1:
  26. return "SPIR-V 1.1";
  27. case SPV_ENV_OPENCL_1_2:
  28. return "SPIR-V 1.0 (under OpenCL 1.2 Full Profile semantics)";
  29. case SPV_ENV_OPENCL_EMBEDDED_1_2:
  30. return "SPIR-V 1.0 (under OpenCL 1.2 Embedded Profile semantics)";
  31. case SPV_ENV_OPENCL_2_0:
  32. return "SPIR-V 1.0 (under OpenCL 2.0 Full Profile semantics)";
  33. case SPV_ENV_OPENCL_EMBEDDED_2_0:
  34. return "SPIR-V 1.0 (under OpenCL 2.0 Embedded Profile semantics)";
  35. case SPV_ENV_OPENCL_2_1:
  36. return "SPIR-V 1.0 (under OpenCL 2.1 Full Profile semantics)";
  37. case SPV_ENV_OPENCL_EMBEDDED_2_1:
  38. return "SPIR-V 1.0 (under OpenCL 2.1 Embedded Profile semantics)";
  39. case SPV_ENV_OPENCL_2_2:
  40. return "SPIR-V 1.2 (under OpenCL 2.2 Full Profile semantics)";
  41. case SPV_ENV_OPENCL_EMBEDDED_2_2:
  42. return "SPIR-V 1.2 (under OpenCL 2.2 Embedded Profile semantics)";
  43. case SPV_ENV_OPENGL_4_0:
  44. return "SPIR-V 1.0 (under OpenGL 4.0 semantics)";
  45. case SPV_ENV_OPENGL_4_1:
  46. return "SPIR-V 1.0 (under OpenGL 4.1 semantics)";
  47. case SPV_ENV_OPENGL_4_2:
  48. return "SPIR-V 1.0 (under OpenGL 4.2 semantics)";
  49. case SPV_ENV_OPENGL_4_3:
  50. return "SPIR-V 1.0 (under OpenGL 4.3 semantics)";
  51. case SPV_ENV_OPENGL_4_5:
  52. return "SPIR-V 1.0 (under OpenGL 4.5 semantics)";
  53. case SPV_ENV_UNIVERSAL_1_2:
  54. return "SPIR-V 1.2";
  55. case SPV_ENV_UNIVERSAL_1_3:
  56. return "SPIR-V 1.3";
  57. case SPV_ENV_VULKAN_1_1:
  58. return "SPIR-V 1.3 (under Vulkan 1.1 semantics)";
  59. case SPV_ENV_WEBGPU_0:
  60. return "SPIR-V 1.3 (under WIP WebGPU semantics)";
  61. case SPV_ENV_UNIVERSAL_1_4:
  62. return "SPIR-V 1.4";
  63. case SPV_ENV_VULKAN_1_1_SPIRV_1_4:
  64. return "SPIR-V 1.4 (under Vulkan 1.1 semantics)";
  65. }
  66. return "";
  67. }
  68. uint32_t spvVersionForTargetEnv(spv_target_env env) {
  69. switch (env) {
  70. case SPV_ENV_UNIVERSAL_1_0:
  71. case SPV_ENV_VULKAN_1_0:
  72. 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:
  76. case SPV_ENV_OPENCL_2_1:
  77. case SPV_ENV_OPENCL_EMBEDDED_2_1:
  78. 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:
  83. return SPV_SPIRV_VERSION_WORD(1, 0);
  84. case SPV_ENV_UNIVERSAL_1_1:
  85. return SPV_SPIRV_VERSION_WORD(1, 1);
  86. case SPV_ENV_UNIVERSAL_1_2:
  87. case SPV_ENV_OPENCL_2_2:
  88. case SPV_ENV_OPENCL_EMBEDDED_2_2:
  89. return SPV_SPIRV_VERSION_WORD(1, 2);
  90. case SPV_ENV_UNIVERSAL_1_3:
  91. case SPV_ENV_VULKAN_1_1:
  92. case SPV_ENV_WEBGPU_0:
  93. return SPV_SPIRV_VERSION_WORD(1, 3);
  94. case SPV_ENV_UNIVERSAL_1_4:
  95. case SPV_ENV_VULKAN_1_1_SPIRV_1_4:
  96. return SPV_SPIRV_VERSION_WORD(1, 4);
  97. }
  98. return SPV_SPIRV_VERSION_WORD(0, 0);
  99. }
  100. bool spvParseTargetEnv(const char* s, spv_target_env* env) {
  101. auto match = [s](const char* b) {
  102. return s && (0 == strncmp(s, b, strlen(b)));
  103. };
  104. if (match("vulkan1.1spv1.4")) {
  105. if (env) *env = SPV_ENV_VULKAN_1_1_SPIRV_1_4;
  106. return true;
  107. } else if (match("vulkan1.0")) {
  108. if (env) *env = SPV_ENV_VULKAN_1_0;
  109. return true;
  110. } else if (match("vulkan1.1")) {
  111. if (env) *env = SPV_ENV_VULKAN_1_1;
  112. return true;
  113. } else if (match("spv1.0")) {
  114. if (env) *env = SPV_ENV_UNIVERSAL_1_0;
  115. return true;
  116. } else if (match("spv1.1")) {
  117. if (env) *env = SPV_ENV_UNIVERSAL_1_1;
  118. return true;
  119. } else if (match("spv1.2")) {
  120. if (env) *env = SPV_ENV_UNIVERSAL_1_2;
  121. return true;
  122. } else if (match("spv1.3")) {
  123. if (env) *env = SPV_ENV_UNIVERSAL_1_3;
  124. return true;
  125. } else if (match("spv1.4")) {
  126. if (env) *env = SPV_ENV_UNIVERSAL_1_4;
  127. return true;
  128. } else if (match("opencl1.2embedded")) {
  129. if (env) *env = SPV_ENV_OPENCL_EMBEDDED_1_2;
  130. return true;
  131. } else if (match("opencl1.2")) {
  132. if (env) *env = SPV_ENV_OPENCL_1_2;
  133. return true;
  134. } else if (match("opencl2.0embedded")) {
  135. if (env) *env = SPV_ENV_OPENCL_EMBEDDED_2_0;
  136. return true;
  137. } else if (match("opencl2.0")) {
  138. if (env) *env = SPV_ENV_OPENCL_2_0;
  139. return true;
  140. } else if (match("opencl2.1embedded")) {
  141. if (env) *env = SPV_ENV_OPENCL_EMBEDDED_2_1;
  142. return true;
  143. } else if (match("opencl2.1")) {
  144. if (env) *env = SPV_ENV_OPENCL_2_1;
  145. return true;
  146. } else if (match("opencl2.2embedded")) {
  147. if (env) *env = SPV_ENV_OPENCL_EMBEDDED_2_2;
  148. return true;
  149. } else if (match("opencl2.2")) {
  150. if (env) *env = SPV_ENV_OPENCL_2_2;
  151. return true;
  152. } else if (match("opengl4.0")) {
  153. if (env) *env = SPV_ENV_OPENGL_4_0;
  154. return true;
  155. } else if (match("opengl4.1")) {
  156. if (env) *env = SPV_ENV_OPENGL_4_1;
  157. return true;
  158. } else if (match("opengl4.2")) {
  159. if (env) *env = SPV_ENV_OPENGL_4_2;
  160. return true;
  161. } else if (match("opengl4.3")) {
  162. if (env) *env = SPV_ENV_OPENGL_4_3;
  163. return true;
  164. } else if (match("opengl4.5")) {
  165. if (env) *env = SPV_ENV_OPENGL_4_5;
  166. return true;
  167. } else if (match("webgpu0")) {
  168. if (env) *env = SPV_ENV_WEBGPU_0;
  169. return true;
  170. } else {
  171. if (env) *env = SPV_ENV_UNIVERSAL_1_0;
  172. return false;
  173. }
  174. }
  175. bool spvIsVulkanEnv(spv_target_env env) {
  176. switch (env) {
  177. case SPV_ENV_UNIVERSAL_1_0:
  178. case SPV_ENV_OPENCL_1_2:
  179. case SPV_ENV_OPENCL_EMBEDDED_1_2:
  180. case SPV_ENV_OPENCL_2_0:
  181. case SPV_ENV_OPENCL_EMBEDDED_2_0:
  182. case SPV_ENV_OPENCL_2_1:
  183. case SPV_ENV_OPENCL_EMBEDDED_2_1:
  184. case SPV_ENV_OPENGL_4_0:
  185. case SPV_ENV_OPENGL_4_1:
  186. case SPV_ENV_OPENGL_4_2:
  187. case SPV_ENV_OPENGL_4_3:
  188. case SPV_ENV_OPENGL_4_5:
  189. case SPV_ENV_UNIVERSAL_1_1:
  190. case SPV_ENV_UNIVERSAL_1_2:
  191. case SPV_ENV_OPENCL_2_2:
  192. case SPV_ENV_OPENCL_EMBEDDED_2_2:
  193. case SPV_ENV_UNIVERSAL_1_3:
  194. case SPV_ENV_WEBGPU_0:
  195. case SPV_ENV_UNIVERSAL_1_4:
  196. return false;
  197. case SPV_ENV_VULKAN_1_0:
  198. case SPV_ENV_VULKAN_1_1:
  199. case SPV_ENV_VULKAN_1_1_SPIRV_1_4:
  200. return true;
  201. }
  202. return false;
  203. }
  204. bool spvIsOpenCLEnv(spv_target_env env) {
  205. switch (env) {
  206. case SPV_ENV_UNIVERSAL_1_0:
  207. case SPV_ENV_VULKAN_1_0:
  208. case SPV_ENV_UNIVERSAL_1_1:
  209. case SPV_ENV_OPENGL_4_0:
  210. case SPV_ENV_OPENGL_4_1:
  211. case SPV_ENV_OPENGL_4_2:
  212. case SPV_ENV_OPENGL_4_3:
  213. case SPV_ENV_OPENGL_4_5:
  214. case SPV_ENV_UNIVERSAL_1_2:
  215. case SPV_ENV_UNIVERSAL_1_3:
  216. case SPV_ENV_VULKAN_1_1:
  217. case SPV_ENV_WEBGPU_0:
  218. case SPV_ENV_UNIVERSAL_1_4:
  219. case SPV_ENV_VULKAN_1_1_SPIRV_1_4:
  220. return false;
  221. case SPV_ENV_OPENCL_1_2:
  222. case SPV_ENV_OPENCL_EMBEDDED_1_2:
  223. case SPV_ENV_OPENCL_2_0:
  224. case SPV_ENV_OPENCL_EMBEDDED_2_0:
  225. case SPV_ENV_OPENCL_EMBEDDED_2_1:
  226. case SPV_ENV_OPENCL_EMBEDDED_2_2:
  227. case SPV_ENV_OPENCL_2_1:
  228. case SPV_ENV_OPENCL_2_2:
  229. return true;
  230. }
  231. return false;
  232. }
  233. bool spvIsWebGPUEnv(spv_target_env env) {
  234. switch (env) {
  235. case SPV_ENV_UNIVERSAL_1_0:
  236. case SPV_ENV_VULKAN_1_0:
  237. case SPV_ENV_UNIVERSAL_1_1:
  238. case SPV_ENV_OPENGL_4_0:
  239. case SPV_ENV_OPENGL_4_1:
  240. case SPV_ENV_OPENGL_4_2:
  241. case SPV_ENV_OPENGL_4_3:
  242. case SPV_ENV_OPENGL_4_5:
  243. case SPV_ENV_UNIVERSAL_1_2:
  244. case SPV_ENV_UNIVERSAL_1_3:
  245. case SPV_ENV_VULKAN_1_1:
  246. case SPV_ENV_OPENCL_1_2:
  247. case SPV_ENV_OPENCL_EMBEDDED_1_2:
  248. case SPV_ENV_OPENCL_2_0:
  249. case SPV_ENV_OPENCL_EMBEDDED_2_0:
  250. case SPV_ENV_OPENCL_EMBEDDED_2_1:
  251. case SPV_ENV_OPENCL_EMBEDDED_2_2:
  252. case SPV_ENV_OPENCL_2_1:
  253. case SPV_ENV_OPENCL_2_2:
  254. case SPV_ENV_UNIVERSAL_1_4:
  255. case SPV_ENV_VULKAN_1_1_SPIRV_1_4:
  256. return false;
  257. case SPV_ENV_WEBGPU_0:
  258. return true;
  259. }
  260. return false;
  261. }
  262. bool spvIsVulkanOrWebGPUEnv(spv_target_env env) {
  263. return spvIsVulkanEnv(env) || spvIsWebGPUEnv(env);
  264. }
  265. std::string spvLogStringForEnv(spv_target_env env) {
  266. switch (env) {
  267. case SPV_ENV_OPENCL_1_2:
  268. case SPV_ENV_OPENCL_2_0:
  269. case SPV_ENV_OPENCL_2_1:
  270. case SPV_ENV_OPENCL_2_2:
  271. case SPV_ENV_OPENCL_EMBEDDED_1_2:
  272. case SPV_ENV_OPENCL_EMBEDDED_2_0:
  273. case SPV_ENV_OPENCL_EMBEDDED_2_1:
  274. case SPV_ENV_OPENCL_EMBEDDED_2_2: {
  275. return "OpenCL";
  276. }
  277. case SPV_ENV_OPENGL_4_0:
  278. case SPV_ENV_OPENGL_4_1:
  279. case SPV_ENV_OPENGL_4_2:
  280. case SPV_ENV_OPENGL_4_3:
  281. case SPV_ENV_OPENGL_4_5: {
  282. return "OpenGL";
  283. }
  284. case SPV_ENV_VULKAN_1_0:
  285. case SPV_ENV_VULKAN_1_1:
  286. case SPV_ENV_VULKAN_1_1_SPIRV_1_4: {
  287. return "Vulkan";
  288. }
  289. case SPV_ENV_WEBGPU_0: {
  290. return "WebGPU";
  291. }
  292. case SPV_ENV_UNIVERSAL_1_0:
  293. case SPV_ENV_UNIVERSAL_1_1:
  294. case SPV_ENV_UNIVERSAL_1_2:
  295. case SPV_ENV_UNIVERSAL_1_3:
  296. case SPV_ENV_UNIVERSAL_1_4: {
  297. return "Universal";
  298. }
  299. }
  300. return "Unknown";
  301. }