Common.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638
  1. // Copyright (C) 2009-2021, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #include <AnKi/Gr/Vulkan/Common.h>
  6. #define VOLK_IMPLEMENTATION
  7. #include <Volk/volk.h>
  8. namespace anki {
  9. VkCompareOp convertCompareOp(CompareOperation ak)
  10. {
  11. VkCompareOp out = VK_COMPARE_OP_NEVER;
  12. switch(ak)
  13. {
  14. case CompareOperation::ALWAYS:
  15. out = VK_COMPARE_OP_ALWAYS;
  16. break;
  17. case CompareOperation::LESS:
  18. out = VK_COMPARE_OP_LESS;
  19. break;
  20. case CompareOperation::EQUAL:
  21. out = VK_COMPARE_OP_EQUAL;
  22. break;
  23. case CompareOperation::LESS_EQUAL:
  24. out = VK_COMPARE_OP_LESS_OR_EQUAL;
  25. break;
  26. case CompareOperation::GREATER:
  27. out = VK_COMPARE_OP_GREATER;
  28. break;
  29. case CompareOperation::GREATER_EQUAL:
  30. out = VK_COMPARE_OP_GREATER_OR_EQUAL;
  31. break;
  32. case CompareOperation::NOT_EQUAL:
  33. out = VK_COMPARE_OP_NOT_EQUAL;
  34. break;
  35. case CompareOperation::NEVER:
  36. out = VK_COMPARE_OP_NEVER;
  37. break;
  38. default:
  39. ANKI_ASSERT(0);
  40. }
  41. return out;
  42. }
  43. VkPrimitiveTopology convertTopology(PrimitiveTopology ak)
  44. {
  45. VkPrimitiveTopology out = VK_PRIMITIVE_TOPOLOGY_MAX_ENUM;
  46. switch(ak)
  47. {
  48. case PrimitiveTopology::POINTS:
  49. out = VK_PRIMITIVE_TOPOLOGY_POINT_LIST;
  50. break;
  51. case PrimitiveTopology::LINES:
  52. out = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
  53. break;
  54. case PrimitiveTopology::LINE_STRIP:
  55. out = VK_PRIMITIVE_TOPOLOGY_LINE_STRIP;
  56. break;
  57. case PrimitiveTopology::TRIANGLES:
  58. out = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
  59. break;
  60. case PrimitiveTopology::TRIANGLE_STRIP:
  61. out = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
  62. break;
  63. case PrimitiveTopology::PATCHES:
  64. out = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
  65. break;
  66. default:
  67. ANKI_ASSERT(0);
  68. }
  69. return out;
  70. }
  71. VkPolygonMode convertFillMode(FillMode ak)
  72. {
  73. VkPolygonMode out = VK_POLYGON_MODE_FILL;
  74. switch(ak)
  75. {
  76. case FillMode::POINTS:
  77. out = VK_POLYGON_MODE_POINT;
  78. break;
  79. case FillMode::WIREFRAME:
  80. out = VK_POLYGON_MODE_LINE;
  81. break;
  82. case FillMode::SOLID:
  83. out = VK_POLYGON_MODE_FILL;
  84. break;
  85. default:
  86. ANKI_ASSERT(0);
  87. }
  88. return out;
  89. }
  90. VkCullModeFlags convertCullMode(FaceSelectionBit ak)
  91. {
  92. VkCullModeFlags out = 0;
  93. switch(ak)
  94. {
  95. case FaceSelectionBit::NONE:
  96. out = VK_CULL_MODE_NONE;
  97. break;
  98. case FaceSelectionBit::FRONT:
  99. out = VK_CULL_MODE_FRONT_BIT;
  100. break;
  101. case FaceSelectionBit::BACK:
  102. out = VK_CULL_MODE_BACK_BIT;
  103. break;
  104. case FaceSelectionBit::FRONT_AND_BACK:
  105. out = VK_CULL_MODE_FRONT_BIT | VK_CULL_MODE_BACK_BIT;
  106. break;
  107. default:
  108. ANKI_ASSERT(0);
  109. }
  110. return out;
  111. }
  112. VkBlendFactor convertBlendFactor(BlendFactor ak)
  113. {
  114. VkBlendFactor out = VK_BLEND_FACTOR_MAX_ENUM;
  115. switch(ak)
  116. {
  117. case BlendFactor::ZERO:
  118. out = VK_BLEND_FACTOR_ZERO;
  119. break;
  120. case BlendFactor::ONE:
  121. out = VK_BLEND_FACTOR_ONE;
  122. break;
  123. case BlendFactor::SRC_COLOR:
  124. out = VK_BLEND_FACTOR_SRC_COLOR;
  125. break;
  126. case BlendFactor::ONE_MINUS_SRC_COLOR:
  127. out = VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR;
  128. break;
  129. case BlendFactor::DST_COLOR:
  130. out = VK_BLEND_FACTOR_DST_COLOR;
  131. break;
  132. case BlendFactor::ONE_MINUS_DST_COLOR:
  133. out = VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR;
  134. break;
  135. case BlendFactor::SRC_ALPHA:
  136. out = VK_BLEND_FACTOR_SRC_ALPHA;
  137. break;
  138. case BlendFactor::ONE_MINUS_SRC_ALPHA:
  139. out = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
  140. break;
  141. case BlendFactor::DST_ALPHA:
  142. out = VK_BLEND_FACTOR_DST_ALPHA;
  143. break;
  144. case BlendFactor::ONE_MINUS_DST_ALPHA:
  145. out = VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA;
  146. break;
  147. case BlendFactor::CONSTANT_COLOR:
  148. out = VK_BLEND_FACTOR_CONSTANT_COLOR;
  149. break;
  150. case BlendFactor::ONE_MINUS_CONSTANT_COLOR:
  151. out = VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR;
  152. break;
  153. case BlendFactor::CONSTANT_ALPHA:
  154. out = VK_BLEND_FACTOR_CONSTANT_ALPHA;
  155. break;
  156. case BlendFactor::ONE_MINUS_CONSTANT_ALPHA:
  157. out = VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA;
  158. break;
  159. case BlendFactor::SRC_ALPHA_SATURATE:
  160. out = VK_BLEND_FACTOR_SRC_ALPHA_SATURATE;
  161. break;
  162. case BlendFactor::SRC1_COLOR:
  163. out = VK_BLEND_FACTOR_SRC1_COLOR;
  164. break;
  165. case BlendFactor::ONE_MINUS_SRC1_COLOR:
  166. out = VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR;
  167. break;
  168. case BlendFactor::SRC1_ALPHA:
  169. out = VK_BLEND_FACTOR_SRC1_ALPHA;
  170. break;
  171. case BlendFactor::ONE_MINUS_SRC1_ALPHA:
  172. out = VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA;
  173. break;
  174. default:
  175. ANKI_ASSERT(0);
  176. }
  177. return out;
  178. }
  179. VkBlendOp convertBlendOperation(BlendOperation ak)
  180. {
  181. VkBlendOp out = VK_BLEND_OP_MAX_ENUM;
  182. switch(ak)
  183. {
  184. case BlendOperation::ADD:
  185. out = VK_BLEND_OP_ADD;
  186. break;
  187. case BlendOperation::SUBTRACT:
  188. out = VK_BLEND_OP_SUBTRACT;
  189. break;
  190. case BlendOperation::REVERSE_SUBTRACT:
  191. out = VK_BLEND_OP_REVERSE_SUBTRACT;
  192. break;
  193. case BlendOperation::MIN:
  194. out = VK_BLEND_OP_MIN;
  195. break;
  196. case BlendOperation::MAX:
  197. out = VK_BLEND_OP_MAX;
  198. break;
  199. default:
  200. ANKI_ASSERT(0);
  201. }
  202. return out;
  203. }
  204. VkAttachmentLoadOp convertLoadOp(AttachmentLoadOperation ak)
  205. {
  206. VkAttachmentLoadOp out = VK_ATTACHMENT_LOAD_OP_MAX_ENUM;
  207. switch(ak)
  208. {
  209. case AttachmentLoadOperation::LOAD:
  210. out = VK_ATTACHMENT_LOAD_OP_LOAD;
  211. break;
  212. case AttachmentLoadOperation::CLEAR:
  213. out = VK_ATTACHMENT_LOAD_OP_CLEAR;
  214. break;
  215. case AttachmentLoadOperation::DONT_CARE:
  216. out = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
  217. break;
  218. default:
  219. ANKI_ASSERT(0);
  220. }
  221. return out;
  222. }
  223. VkAttachmentStoreOp convertStoreOp(AttachmentStoreOperation ak)
  224. {
  225. VkAttachmentStoreOp out = VK_ATTACHMENT_STORE_OP_MAX_ENUM;
  226. switch(ak)
  227. {
  228. case AttachmentStoreOperation::STORE:
  229. out = VK_ATTACHMENT_STORE_OP_STORE;
  230. break;
  231. case AttachmentStoreOperation::DONT_CARE:
  232. out = VK_ATTACHMENT_STORE_OP_DONT_CARE;
  233. break;
  234. default:
  235. ANKI_ASSERT(0);
  236. }
  237. return out;
  238. }
  239. VkBufferUsageFlags convertBufferUsageBit(BufferUsageBit usageMask)
  240. {
  241. VkBufferUsageFlags out = 0;
  242. if(!!(usageMask & BufferUsageBit::ALL_UNIFORM))
  243. {
  244. out |= VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
  245. }
  246. if(!!(usageMask & BufferUsageBit::ALL_STORAGE))
  247. {
  248. out |= VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
  249. }
  250. if(!!(usageMask & BufferUsageBit::INDEX))
  251. {
  252. out |= VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
  253. }
  254. if(!!(usageMask & BufferUsageBit::VERTEX))
  255. {
  256. out |= VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
  257. }
  258. if(!!(usageMask & BufferUsageBit::ALL_INDIRECT))
  259. {
  260. out |= VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
  261. }
  262. if(!!(usageMask & BufferUsageBit::TRANSFER_DESTINATION))
  263. {
  264. out |= VK_BUFFER_USAGE_TRANSFER_DST_BIT;
  265. }
  266. if(!!(usageMask & BufferUsageBit::TRANSFER_SOURCE))
  267. {
  268. out |= VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
  269. }
  270. if(!!(usageMask & (BufferUsageBit::ALL_TEXTURE & BufferUsageBit::ALL_WRITE)))
  271. {
  272. out |= VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
  273. }
  274. if(!!(usageMask & (BufferUsageBit::ALL_TEXTURE & BufferUsageBit::ALL_READ)))
  275. {
  276. out |= VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
  277. }
  278. if(!!(usageMask & BufferUsageBit::ACCELERATION_STRUCTURE_BUILD))
  279. {
  280. out |= VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR;
  281. }
  282. if(!!(usageMask & PrivateBufferUsageBit::ACCELERATION_STRUCTURE_BUILD_SCRATCH))
  283. {
  284. out |= VK_BUFFER_USAGE_STORAGE_BUFFER_BIT; // Spec says that this will be enough
  285. }
  286. if(!!(usageMask & PrivateBufferUsageBit::ACCELERATION_STRUCTURE))
  287. {
  288. out |= VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR;
  289. }
  290. if(!!(usageMask & BufferUsageBit::SBT))
  291. {
  292. out |= VK_BUFFER_USAGE_SHADER_BINDING_TABLE_BIT_KHR;
  293. }
  294. ANKI_ASSERT(out);
  295. return out;
  296. }
  297. VkImageType convertTextureType(TextureType ak)
  298. {
  299. VkImageType out = VK_IMAGE_TYPE_MAX_ENUM;
  300. switch(ak)
  301. {
  302. case TextureType::CUBE:
  303. case TextureType::CUBE_ARRAY:
  304. case TextureType::_2D:
  305. case TextureType::_2D_ARRAY:
  306. out = VK_IMAGE_TYPE_2D;
  307. break;
  308. case TextureType::_3D:
  309. out = VK_IMAGE_TYPE_3D;
  310. break;
  311. case TextureType::_1D:
  312. out = VK_IMAGE_TYPE_1D;
  313. break;
  314. default:
  315. ANKI_ASSERT(0);
  316. }
  317. return out;
  318. }
  319. VkImageViewType convertTextureViewType(TextureType ak)
  320. {
  321. VkImageViewType out = VK_IMAGE_VIEW_TYPE_MAX_ENUM;
  322. switch(ak)
  323. {
  324. case TextureType::_1D:
  325. out = VK_IMAGE_VIEW_TYPE_1D;
  326. break;
  327. case TextureType::_2D:
  328. out = VK_IMAGE_VIEW_TYPE_2D;
  329. break;
  330. case TextureType::_2D_ARRAY:
  331. out = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
  332. break;
  333. case TextureType::_3D:
  334. out = VK_IMAGE_VIEW_TYPE_3D;
  335. break;
  336. case TextureType::CUBE:
  337. out = VK_IMAGE_VIEW_TYPE_CUBE;
  338. break;
  339. case TextureType::CUBE_ARRAY:
  340. out = VK_IMAGE_VIEW_TYPE_CUBE_ARRAY;
  341. break;
  342. default:
  343. ANKI_ASSERT(0);
  344. }
  345. return out;
  346. }
  347. VkImageUsageFlags convertTextureUsage(const TextureUsageBit ak, const Format format)
  348. {
  349. VkImageUsageFlags out = 0;
  350. if(!!(ak & TextureUsageBit::ALL_SAMPLED))
  351. {
  352. out |= VK_IMAGE_USAGE_SAMPLED_BIT;
  353. }
  354. if(!!(ak & TextureUsageBit::ALL_IMAGE))
  355. {
  356. out |= VK_IMAGE_USAGE_STORAGE_BIT;
  357. }
  358. if(!!(ak & (TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ | TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE)))
  359. {
  360. if(formatIsDepthStencil(format))
  361. {
  362. out |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
  363. }
  364. else
  365. {
  366. out |= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
  367. }
  368. }
  369. if(!!(ak & TextureUsageBit::TRANSFER_DESTINATION))
  370. {
  371. out |= VK_IMAGE_USAGE_TRANSFER_DST_BIT;
  372. }
  373. if(!!(ak & TextureUsageBit::GENERATE_MIPMAPS))
  374. {
  375. out |= VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
  376. }
  377. ANKI_ASSERT(out);
  378. return out;
  379. }
  380. VkStencilOp convertStencilOp(StencilOperation ak)
  381. {
  382. VkStencilOp out = VK_STENCIL_OP_MAX_ENUM;
  383. switch(ak)
  384. {
  385. case StencilOperation::KEEP:
  386. out = VK_STENCIL_OP_KEEP;
  387. break;
  388. case StencilOperation::ZERO:
  389. out = VK_STENCIL_OP_ZERO;
  390. break;
  391. case StencilOperation::REPLACE:
  392. out = VK_STENCIL_OP_REPLACE;
  393. break;
  394. case StencilOperation::INCREMENT_AND_CLAMP:
  395. out = VK_STENCIL_OP_INCREMENT_AND_CLAMP;
  396. break;
  397. case StencilOperation::DECREMENT_AND_CLAMP:
  398. out = VK_STENCIL_OP_DECREMENT_AND_CLAMP;
  399. break;
  400. case StencilOperation::INVERT:
  401. out = VK_STENCIL_OP_INVERT;
  402. break;
  403. case StencilOperation::INCREMENT_AND_WRAP:
  404. out = VK_STENCIL_OP_INCREMENT_AND_WRAP;
  405. break;
  406. case StencilOperation::DECREMENT_AND_WRAP:
  407. out = VK_STENCIL_OP_DECREMENT_AND_WRAP;
  408. break;
  409. default:
  410. ANKI_ASSERT(0);
  411. }
  412. return out;
  413. }
  414. VkShaderStageFlags convertShaderTypeBit(ShaderTypeBit bit)
  415. {
  416. ANKI_ASSERT(bit != ShaderTypeBit::NONE);
  417. VkShaderStageFlags out = 0;
  418. if(!!(bit & ShaderTypeBit::VERTEX))
  419. {
  420. out |= VK_SHADER_STAGE_VERTEX_BIT;
  421. }
  422. if(!!(bit & ShaderTypeBit::TESSELLATION_CONTROL))
  423. {
  424. out |= VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
  425. }
  426. if(!!(bit & ShaderTypeBit::TESSELLATION_EVALUATION))
  427. {
  428. out |= VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
  429. }
  430. if(!!(bit & ShaderTypeBit::GEOMETRY))
  431. {
  432. out |= VK_SHADER_STAGE_GEOMETRY_BIT;
  433. }
  434. if(!!(bit & ShaderTypeBit::FRAGMENT))
  435. {
  436. out |= VK_SHADER_STAGE_FRAGMENT_BIT;
  437. }
  438. if(!!(bit & ShaderTypeBit::COMPUTE))
  439. {
  440. out |= VK_SHADER_STAGE_COMPUTE_BIT;
  441. }
  442. if(!!(bit & ShaderTypeBit::RAY_GEN))
  443. {
  444. out |= VK_SHADER_STAGE_RAYGEN_BIT_KHR;
  445. }
  446. if(!!(bit & ShaderTypeBit::ANY_HIT))
  447. {
  448. out |= VK_SHADER_STAGE_ANY_HIT_BIT_KHR;
  449. }
  450. if(!!(bit & ShaderTypeBit::CLOSEST_HIT))
  451. {
  452. out |= VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR;
  453. }
  454. if(!!(bit & ShaderTypeBit::MISS))
  455. {
  456. out |= VK_SHADER_STAGE_MISS_BIT_KHR;
  457. }
  458. if(!!(bit & ShaderTypeBit::INTERSECTION))
  459. {
  460. out |= VK_SHADER_STAGE_INTERSECTION_BIT_KHR;
  461. }
  462. if(!!(bit & ShaderTypeBit::CALLABLE))
  463. {
  464. out |= VK_SHADER_STAGE_CALLABLE_BIT_KHR;
  465. }
  466. ANKI_ASSERT(out != 0);
  467. ANKI_ASSERT(__builtin_popcount(U32(bit)) == __builtin_popcount(out));
  468. return out;
  469. }
  470. const char* vkResultToString(VkResult res)
  471. {
  472. const char* out;
  473. switch(res)
  474. {
  475. case VK_SUCCESS:
  476. out = "VK_SUCCESS";
  477. break;
  478. case VK_NOT_READY:
  479. out = "VK_NOT_READY";
  480. break;
  481. case VK_TIMEOUT:
  482. out = "VK_TIMEOUT";
  483. break;
  484. case VK_EVENT_SET:
  485. out = "VK_EVENT_SET";
  486. break;
  487. case VK_EVENT_RESET:
  488. out = "VK_EVENT_RESET";
  489. break;
  490. case VK_INCOMPLETE:
  491. out = "VK_INCOMPLETE";
  492. break;
  493. case VK_ERROR_OUT_OF_HOST_MEMORY:
  494. out = "VK_ERROR_OUT_OF_HOST_MEMORY";
  495. break;
  496. case VK_ERROR_OUT_OF_DEVICE_MEMORY:
  497. out = "VK_ERROR_OUT_OF_DEVICE_MEMORY";
  498. break;
  499. case VK_ERROR_INITIALIZATION_FAILED:
  500. out = "VK_ERROR_INITIALIZATION_FAILED";
  501. break;
  502. case VK_ERROR_DEVICE_LOST:
  503. out = "VK_ERROR_DEVICE_LOST";
  504. break;
  505. case VK_ERROR_MEMORY_MAP_FAILED:
  506. out = "VK_ERROR_MEMORY_MAP_FAILED";
  507. break;
  508. case VK_ERROR_LAYER_NOT_PRESENT:
  509. out = "VK_ERROR_LAYER_NOT_PRESENT";
  510. break;
  511. case VK_ERROR_EXTENSION_NOT_PRESENT:
  512. out = "VK_ERROR_EXTENSION_NOT_PRESENT";
  513. break;
  514. case VK_ERROR_FEATURE_NOT_PRESENT:
  515. out = "VK_ERROR_FEATURE_NOT_PRESENT";
  516. break;
  517. case VK_ERROR_INCOMPATIBLE_DRIVER:
  518. out = "VK_ERROR_INCOMPATIBLE_DRIVER";
  519. break;
  520. case VK_ERROR_TOO_MANY_OBJECTS:
  521. out = "VK_ERROR_TOO_MANY_OBJECTS";
  522. break;
  523. case VK_ERROR_FORMAT_NOT_SUPPORTED:
  524. out = "VK_ERROR_FORMAT_NOT_SUPPORTED";
  525. break;
  526. case VK_ERROR_FRAGMENTED_POOL:
  527. out = "VK_ERROR_FRAGMENTED_POOL";
  528. break;
  529. case VK_ERROR_OUT_OF_POOL_MEMORY:
  530. out = "VK_ERROR_OUT_OF_POOL_MEMORY";
  531. break;
  532. case VK_ERROR_INVALID_EXTERNAL_HANDLE:
  533. out = "VK_ERROR_INVALID_EXTERNAL_HANDLE";
  534. break;
  535. case VK_ERROR_SURFACE_LOST_KHR:
  536. out = "VK_ERROR_SURFACE_LOST_KHR";
  537. break;
  538. case VK_ERROR_NATIVE_WINDOW_IN_USE_KHR:
  539. out = "VK_ERROR_NATIVE_WINDOW_IN_USE_KHR";
  540. break;
  541. case VK_SUBOPTIMAL_KHR:
  542. out = "VK_SUBOPTIMAL_KHR";
  543. break;
  544. case VK_ERROR_OUT_OF_DATE_KHR:
  545. out = "VK_ERROR_OUT_OF_DATE_KHR";
  546. break;
  547. case VK_ERROR_INCOMPATIBLE_DISPLAY_KHR:
  548. out = "VK_ERROR_INCOMPATIBLE_DISPLAY_KHR";
  549. break;
  550. case VK_ERROR_VALIDATION_FAILED_EXT:
  551. out = "VK_ERROR_VALIDATION_FAILED_EXT";
  552. break;
  553. case VK_ERROR_INVALID_SHADER_NV:
  554. out = "VK_ERROR_INVALID_SHADER_NV";
  555. break;
  556. case VK_ERROR_FRAGMENTATION_EXT:
  557. out = "VK_ERROR_FRAGMENTATION_EXT";
  558. break;
  559. case VK_ERROR_NOT_PERMITTED_EXT:
  560. out = "VK_ERROR_NOT_PERMITTED_EXT";
  561. break;
  562. default:
  563. out = "Unknown VkResult";
  564. break;
  565. }
  566. return out;
  567. }
  568. } // end namespace anki