spirv_target_env.cpp 8.6 KB

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