Common.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664
  1. // Copyright (C) 2009-2023, 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. #include <AnKi/Gr/Vulkan/GrManagerImpl.h>
  7. #define VOLK_IMPLEMENTATION
  8. #include <Volk/volk.h>
  9. namespace anki {
  10. GrManagerImpl& getGrManagerImpl()
  11. {
  12. return static_cast<GrManagerImpl&>(GrManager::getSingleton());
  13. }
  14. VkDevice getVkDevice()
  15. {
  16. return getGrManagerImpl().getDevice();
  17. }
  18. VkCompareOp convertCompareOp(CompareOperation ak)
  19. {
  20. VkCompareOp out = VK_COMPARE_OP_NEVER;
  21. switch(ak)
  22. {
  23. case CompareOperation::kAlways:
  24. out = VK_COMPARE_OP_ALWAYS;
  25. break;
  26. case CompareOperation::kLess:
  27. out = VK_COMPARE_OP_LESS;
  28. break;
  29. case CompareOperation::kEqual:
  30. out = VK_COMPARE_OP_EQUAL;
  31. break;
  32. case CompareOperation::kLessEqual:
  33. out = VK_COMPARE_OP_LESS_OR_EQUAL;
  34. break;
  35. case CompareOperation::kGreater:
  36. out = VK_COMPARE_OP_GREATER;
  37. break;
  38. case CompareOperation::kGreaterEqual:
  39. out = VK_COMPARE_OP_GREATER_OR_EQUAL;
  40. break;
  41. case CompareOperation::kNotEqual:
  42. out = VK_COMPARE_OP_NOT_EQUAL;
  43. break;
  44. case CompareOperation::kNever:
  45. out = VK_COMPARE_OP_NEVER;
  46. break;
  47. default:
  48. ANKI_ASSERT(0);
  49. }
  50. return out;
  51. }
  52. VkPrimitiveTopology convertTopology(PrimitiveTopology ak)
  53. {
  54. VkPrimitiveTopology out = VK_PRIMITIVE_TOPOLOGY_MAX_ENUM;
  55. switch(ak)
  56. {
  57. case PrimitiveTopology::kPoints:
  58. out = VK_PRIMITIVE_TOPOLOGY_POINT_LIST;
  59. break;
  60. case PrimitiveTopology::kLines:
  61. out = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
  62. break;
  63. case PrimitiveTopology::kLineStip:
  64. out = VK_PRIMITIVE_TOPOLOGY_LINE_STRIP;
  65. break;
  66. case PrimitiveTopology::kTriangles:
  67. out = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
  68. break;
  69. case PrimitiveTopology::kTriangleStrip:
  70. out = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
  71. break;
  72. case PrimitiveTopology::kPatchs:
  73. out = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
  74. break;
  75. default:
  76. ANKI_ASSERT(0);
  77. }
  78. return out;
  79. }
  80. VkPolygonMode convertFillMode(FillMode ak)
  81. {
  82. VkPolygonMode out = VK_POLYGON_MODE_FILL;
  83. switch(ak)
  84. {
  85. case FillMode::kPoints:
  86. out = VK_POLYGON_MODE_POINT;
  87. break;
  88. case FillMode::kWireframe:
  89. out = VK_POLYGON_MODE_LINE;
  90. break;
  91. case FillMode::kSolid:
  92. out = VK_POLYGON_MODE_FILL;
  93. break;
  94. default:
  95. ANKI_ASSERT(0);
  96. }
  97. return out;
  98. }
  99. VkCullModeFlags convertCullMode(FaceSelectionBit ak)
  100. {
  101. VkCullModeFlags out = 0;
  102. switch(ak)
  103. {
  104. case FaceSelectionBit::kNone:
  105. out = VK_CULL_MODE_NONE;
  106. break;
  107. case FaceSelectionBit::kFront:
  108. out = VK_CULL_MODE_FRONT_BIT;
  109. break;
  110. case FaceSelectionBit::kBack:
  111. out = VK_CULL_MODE_BACK_BIT;
  112. break;
  113. case FaceSelectionBit::kFrontAndBack:
  114. out = VK_CULL_MODE_FRONT_BIT | VK_CULL_MODE_BACK_BIT;
  115. break;
  116. default:
  117. ANKI_ASSERT(0);
  118. }
  119. return out;
  120. }
  121. VkBlendFactor convertBlendFactor(BlendFactor ak)
  122. {
  123. VkBlendFactor out = VK_BLEND_FACTOR_MAX_ENUM;
  124. switch(ak)
  125. {
  126. case BlendFactor::kZero:
  127. out = VK_BLEND_FACTOR_ZERO;
  128. break;
  129. case BlendFactor::kOne:
  130. out = VK_BLEND_FACTOR_ONE;
  131. break;
  132. case BlendFactor::kSrcColor:
  133. out = VK_BLEND_FACTOR_SRC_COLOR;
  134. break;
  135. case BlendFactor::kOneMinusSrcColor:
  136. out = VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR;
  137. break;
  138. case BlendFactor::kDstColor:
  139. out = VK_BLEND_FACTOR_DST_COLOR;
  140. break;
  141. case BlendFactor::kOneMinusDstColor:
  142. out = VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR;
  143. break;
  144. case BlendFactor::kSrcAlpha:
  145. out = VK_BLEND_FACTOR_SRC_ALPHA;
  146. break;
  147. case BlendFactor::kOneMinusSrcAlpha:
  148. out = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
  149. break;
  150. case BlendFactor::kDstAlpha:
  151. out = VK_BLEND_FACTOR_DST_ALPHA;
  152. break;
  153. case BlendFactor::kOneMinusDstAlpha:
  154. out = VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA;
  155. break;
  156. case BlendFactor::kConstantColor:
  157. out = VK_BLEND_FACTOR_CONSTANT_COLOR;
  158. break;
  159. case BlendFactor::kOneMinusConstantColor:
  160. out = VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR;
  161. break;
  162. case BlendFactor::kConstantAlpha:
  163. out = VK_BLEND_FACTOR_CONSTANT_ALPHA;
  164. break;
  165. case BlendFactor::kOneMinusConstantAlpha:
  166. out = VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA;
  167. break;
  168. case BlendFactor::kSrcAlphaSaturate:
  169. out = VK_BLEND_FACTOR_SRC_ALPHA_SATURATE;
  170. break;
  171. case BlendFactor::kSrc1Color:
  172. out = VK_BLEND_FACTOR_SRC1_COLOR;
  173. break;
  174. case BlendFactor::kOneMinusSrc1Color:
  175. out = VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR;
  176. break;
  177. case BlendFactor::kSrc1Alpha:
  178. out = VK_BLEND_FACTOR_SRC1_ALPHA;
  179. break;
  180. case BlendFactor::kOneMinusSrc1Alpha:
  181. out = VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA;
  182. break;
  183. default:
  184. ANKI_ASSERT(0);
  185. }
  186. return out;
  187. }
  188. VkBlendOp convertBlendOperation(BlendOperation ak)
  189. {
  190. VkBlendOp out = VK_BLEND_OP_MAX_ENUM;
  191. switch(ak)
  192. {
  193. case BlendOperation::kAdd:
  194. out = VK_BLEND_OP_ADD;
  195. break;
  196. case BlendOperation::kSubtract:
  197. out = VK_BLEND_OP_SUBTRACT;
  198. break;
  199. case BlendOperation::kReverseSubtract:
  200. out = VK_BLEND_OP_REVERSE_SUBTRACT;
  201. break;
  202. case BlendOperation::kMin:
  203. out = VK_BLEND_OP_MIN;
  204. break;
  205. case BlendOperation::kMax:
  206. out = VK_BLEND_OP_MAX;
  207. break;
  208. default:
  209. ANKI_ASSERT(0);
  210. }
  211. return out;
  212. }
  213. VkAttachmentLoadOp convertLoadOp(AttachmentLoadOperation ak)
  214. {
  215. VkAttachmentLoadOp out = VK_ATTACHMENT_LOAD_OP_MAX_ENUM;
  216. switch(ak)
  217. {
  218. case AttachmentLoadOperation::kLoad:
  219. out = VK_ATTACHMENT_LOAD_OP_LOAD;
  220. break;
  221. case AttachmentLoadOperation::kClear:
  222. out = VK_ATTACHMENT_LOAD_OP_CLEAR;
  223. break;
  224. case AttachmentLoadOperation::kDontCare:
  225. out = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
  226. break;
  227. default:
  228. ANKI_ASSERT(0);
  229. }
  230. return out;
  231. }
  232. VkAttachmentStoreOp convertStoreOp(AttachmentStoreOperation ak)
  233. {
  234. VkAttachmentStoreOp out = VK_ATTACHMENT_STORE_OP_MAX_ENUM;
  235. switch(ak)
  236. {
  237. case AttachmentStoreOperation::kStore:
  238. out = VK_ATTACHMENT_STORE_OP_STORE;
  239. break;
  240. case AttachmentStoreOperation::kDontCare:
  241. out = VK_ATTACHMENT_STORE_OP_DONT_CARE;
  242. break;
  243. default:
  244. ANKI_ASSERT(0);
  245. }
  246. return out;
  247. }
  248. VkBufferUsageFlags convertBufferUsageBit(BufferUsageBit usageMask)
  249. {
  250. VkBufferUsageFlags out = 0;
  251. if(!!(usageMask & BufferUsageBit::kAllUniform))
  252. {
  253. out |= VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
  254. }
  255. if(!!(usageMask & BufferUsageBit::kAllStorage))
  256. {
  257. out |= VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
  258. }
  259. if(!!(usageMask & BufferUsageBit::kIndex))
  260. {
  261. out |= VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
  262. }
  263. if(!!(usageMask & BufferUsageBit::kVertex))
  264. {
  265. out |= VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
  266. }
  267. if(!!(usageMask & BufferUsageBit::kAllIndirect))
  268. {
  269. out |= VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
  270. }
  271. if(!!(usageMask & BufferUsageBit::kTransferDestination))
  272. {
  273. out |= VK_BUFFER_USAGE_TRANSFER_DST_BIT;
  274. }
  275. if(!!(usageMask & BufferUsageBit::kTransferSource))
  276. {
  277. out |= VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
  278. }
  279. if(!!(usageMask & (BufferUsageBit::kAllTexture & BufferUsageBit::kAllRead)))
  280. {
  281. out |= VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
  282. }
  283. if(!!(usageMask & (BufferUsageBit::kAllTexture & BufferUsageBit::kAllWrite)))
  284. {
  285. out |= VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
  286. }
  287. if(!!(usageMask & BufferUsageBit::kAccelerationStructureBuild))
  288. {
  289. out |= VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR;
  290. }
  291. if(!!(usageMask & BufferUsageBit::kAccelerationStructureBuildScratch))
  292. {
  293. out |= VK_BUFFER_USAGE_STORAGE_BUFFER_BIT; // Spec says that this will be enough
  294. }
  295. if(!!(usageMask & PrivateBufferUsageBit::kAccelerationStructure))
  296. {
  297. out |= VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR | VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR;
  298. }
  299. if(!!(usageMask & BufferUsageBit::kShaderBindingTable))
  300. {
  301. out |= VK_BUFFER_USAGE_SHADER_BINDING_TABLE_BIT_KHR;
  302. }
  303. ANKI_ASSERT(out);
  304. return out;
  305. }
  306. VkImageType convertTextureType(TextureType ak)
  307. {
  308. VkImageType out = VK_IMAGE_TYPE_MAX_ENUM;
  309. switch(ak)
  310. {
  311. case TextureType::kCube:
  312. case TextureType::kCubeArray:
  313. case TextureType::k2D:
  314. case TextureType::k2DArray:
  315. out = VK_IMAGE_TYPE_2D;
  316. break;
  317. case TextureType::k3D:
  318. out = VK_IMAGE_TYPE_3D;
  319. break;
  320. case TextureType::k1D:
  321. out = VK_IMAGE_TYPE_1D;
  322. break;
  323. default:
  324. ANKI_ASSERT(0);
  325. }
  326. return out;
  327. }
  328. VkImageViewType convertTextureViewType(TextureType ak)
  329. {
  330. VkImageViewType out = VK_IMAGE_VIEW_TYPE_MAX_ENUM;
  331. switch(ak)
  332. {
  333. case TextureType::k1D:
  334. out = VK_IMAGE_VIEW_TYPE_1D;
  335. break;
  336. case TextureType::k2D:
  337. out = VK_IMAGE_VIEW_TYPE_2D;
  338. break;
  339. case TextureType::k2DArray:
  340. out = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
  341. break;
  342. case TextureType::k3D:
  343. out = VK_IMAGE_VIEW_TYPE_3D;
  344. break;
  345. case TextureType::kCube:
  346. out = VK_IMAGE_VIEW_TYPE_CUBE;
  347. break;
  348. case TextureType::kCubeArray:
  349. out = VK_IMAGE_VIEW_TYPE_CUBE_ARRAY;
  350. break;
  351. default:
  352. ANKI_ASSERT(0);
  353. }
  354. return out;
  355. }
  356. VkImageUsageFlags convertTextureUsage(const TextureUsageBit ak, const Format format)
  357. {
  358. VkImageUsageFlags out = 0;
  359. if(!!(ak & TextureUsageBit::kAllSampled))
  360. {
  361. out |= VK_IMAGE_USAGE_SAMPLED_BIT;
  362. }
  363. if(!!(ak & TextureUsageBit::kAllImage))
  364. {
  365. out |= VK_IMAGE_USAGE_STORAGE_BIT;
  366. }
  367. if(!!(ak & (TextureUsageBit::kFramebufferRead | TextureUsageBit::kFramebufferWrite)))
  368. {
  369. if(getFormatInfo(format).isDepthStencil())
  370. {
  371. out |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
  372. }
  373. else
  374. {
  375. out |= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
  376. }
  377. }
  378. if(!!(ak & TextureUsageBit::kFramebufferShadingRate))
  379. {
  380. out |= VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR;
  381. }
  382. if(!!(ak & TextureUsageBit::kTransferDestination))
  383. {
  384. out |= VK_IMAGE_USAGE_TRANSFER_DST_BIT;
  385. }
  386. if(!!(ak & TextureUsageBit::kGenerateMipmaps))
  387. {
  388. out |= VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
  389. }
  390. ANKI_ASSERT(out);
  391. return out;
  392. }
  393. VkStencilOp convertStencilOp(StencilOperation ak)
  394. {
  395. VkStencilOp out = VK_STENCIL_OP_MAX_ENUM;
  396. switch(ak)
  397. {
  398. case StencilOperation::kKeep:
  399. out = VK_STENCIL_OP_KEEP;
  400. break;
  401. case StencilOperation::kZero:
  402. out = VK_STENCIL_OP_ZERO;
  403. break;
  404. case StencilOperation::kReplace:
  405. out = VK_STENCIL_OP_REPLACE;
  406. break;
  407. case StencilOperation::kIncrementAndClamp:
  408. out = VK_STENCIL_OP_INCREMENT_AND_CLAMP;
  409. break;
  410. case StencilOperation::kDecrementAndClamp:
  411. out = VK_STENCIL_OP_DECREMENT_AND_CLAMP;
  412. break;
  413. case StencilOperation::kInvert:
  414. out = VK_STENCIL_OP_INVERT;
  415. break;
  416. case StencilOperation::kIncrementAndWrap:
  417. out = VK_STENCIL_OP_INCREMENT_AND_WRAP;
  418. break;
  419. case StencilOperation::kDecrementAndWrap:
  420. out = VK_STENCIL_OP_DECREMENT_AND_WRAP;
  421. break;
  422. default:
  423. ANKI_ASSERT(0);
  424. }
  425. return out;
  426. }
  427. VkShaderStageFlags convertShaderTypeBit(ShaderTypeBit bit)
  428. {
  429. ANKI_ASSERT(bit != ShaderTypeBit::kNone);
  430. VkShaderStageFlags out = 0;
  431. if(!!(bit & ShaderTypeBit::kVertex))
  432. {
  433. out |= VK_SHADER_STAGE_VERTEX_BIT;
  434. }
  435. if(!!(bit & ShaderTypeBit::kTessellationControl))
  436. {
  437. out |= VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
  438. }
  439. if(!!(bit & ShaderTypeBit::kTessellationEvaluation))
  440. {
  441. out |= VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
  442. }
  443. if(!!(bit & ShaderTypeBit::kGeometry))
  444. {
  445. out |= VK_SHADER_STAGE_GEOMETRY_BIT;
  446. }
  447. if(!!(bit & ShaderTypeBit::kTask))
  448. {
  449. out |= VK_SHADER_STAGE_TASK_BIT_EXT;
  450. }
  451. if(!!(bit & ShaderTypeBit::kMesh))
  452. {
  453. out |= VK_SHADER_STAGE_MESH_BIT_EXT;
  454. }
  455. if(!!(bit & ShaderTypeBit::kFragment))
  456. {
  457. out |= VK_SHADER_STAGE_FRAGMENT_BIT;
  458. }
  459. if(!!(bit & ShaderTypeBit::kCompute))
  460. {
  461. out |= VK_SHADER_STAGE_COMPUTE_BIT;
  462. }
  463. if(!!(bit & ShaderTypeBit::kRayGen))
  464. {
  465. out |= VK_SHADER_STAGE_RAYGEN_BIT_KHR;
  466. }
  467. if(!!(bit & ShaderTypeBit::kAnyHit))
  468. {
  469. out |= VK_SHADER_STAGE_ANY_HIT_BIT_KHR;
  470. }
  471. if(!!(bit & ShaderTypeBit::kClosestHit))
  472. {
  473. out |= VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR;
  474. }
  475. if(!!(bit & ShaderTypeBit::kMiss))
  476. {
  477. out |= VK_SHADER_STAGE_MISS_BIT_KHR;
  478. }
  479. if(!!(bit & ShaderTypeBit::kIntersection))
  480. {
  481. out |= VK_SHADER_STAGE_INTERSECTION_BIT_KHR;
  482. }
  483. if(!!(bit & ShaderTypeBit::kCallable))
  484. {
  485. out |= VK_SHADER_STAGE_CALLABLE_BIT_KHR;
  486. }
  487. ANKI_ASSERT(out != 0);
  488. ANKI_ASSERT(__builtin_popcount(U32(bit)) == __builtin_popcount(out));
  489. return out;
  490. }
  491. const char* vkResultToString(VkResult res)
  492. {
  493. const char* out;
  494. switch(res)
  495. {
  496. case VK_SUCCESS:
  497. out = "VK_SUCCESS";
  498. break;
  499. case VK_NOT_READY:
  500. out = "VK_NOT_READY";
  501. break;
  502. case VK_TIMEOUT:
  503. out = "VK_TIMEOUT";
  504. break;
  505. case VK_EVENT_SET:
  506. out = "VK_EVENT_SET";
  507. break;
  508. case VK_EVENT_RESET:
  509. out = "VK_EVENT_RESET";
  510. break;
  511. case VK_INCOMPLETE:
  512. out = "VK_INCOMPLETE";
  513. break;
  514. case VK_ERROR_OUT_OF_HOST_MEMORY:
  515. out = "VK_ERROR_OUT_OF_HOST_MEMORY";
  516. break;
  517. case VK_ERROR_OUT_OF_DEVICE_MEMORY:
  518. out = "VK_ERROR_OUT_OF_DEVICE_MEMORY";
  519. break;
  520. case VK_ERROR_INITIALIZATION_FAILED:
  521. out = "VK_ERROR_INITIALIZATION_FAILED";
  522. break;
  523. case VK_ERROR_DEVICE_LOST:
  524. out = "VK_ERROR_DEVICE_LOST";
  525. break;
  526. case VK_ERROR_MEMORY_MAP_FAILED:
  527. out = "VK_ERROR_MEMORY_MAP_FAILED";
  528. break;
  529. case VK_ERROR_LAYER_NOT_PRESENT:
  530. out = "VK_ERROR_LAYER_NOT_PRESENT";
  531. break;
  532. case VK_ERROR_EXTENSION_NOT_PRESENT:
  533. out = "VK_ERROR_EXTENSION_NOT_PRESENT";
  534. break;
  535. case VK_ERROR_FEATURE_NOT_PRESENT:
  536. out = "VK_ERROR_FEATURE_NOT_PRESENT";
  537. break;
  538. case VK_ERROR_INCOMPATIBLE_DRIVER:
  539. out = "VK_ERROR_INCOMPATIBLE_DRIVER";
  540. break;
  541. case VK_ERROR_TOO_MANY_OBJECTS:
  542. out = "VK_ERROR_TOO_MANY_OBJECTS";
  543. break;
  544. case VK_ERROR_FORMAT_NOT_SUPPORTED:
  545. out = "VK_ERROR_FORMAT_NOT_SUPPORTED";
  546. break;
  547. case VK_ERROR_FRAGMENTED_POOL:
  548. out = "VK_ERROR_FRAGMENTED_POOL";
  549. break;
  550. case VK_ERROR_OUT_OF_POOL_MEMORY:
  551. out = "VK_ERROR_OUT_OF_POOL_MEMORY";
  552. break;
  553. case VK_ERROR_INVALID_EXTERNAL_HANDLE:
  554. out = "VK_ERROR_INVALID_EXTERNAL_HANDLE";
  555. break;
  556. case VK_ERROR_SURFACE_LOST_KHR:
  557. out = "VK_ERROR_SURFACE_LOST_KHR";
  558. break;
  559. case VK_ERROR_NATIVE_WINDOW_IN_USE_KHR:
  560. out = "VK_ERROR_NATIVE_WINDOW_IN_USE_KHR";
  561. break;
  562. case VK_SUBOPTIMAL_KHR:
  563. out = "VK_SUBOPTIMAL_KHR";
  564. break;
  565. case VK_ERROR_OUT_OF_DATE_KHR:
  566. out = "VK_ERROR_OUT_OF_DATE_KHR";
  567. break;
  568. case VK_ERROR_INCOMPATIBLE_DISPLAY_KHR:
  569. out = "VK_ERROR_INCOMPATIBLE_DISPLAY_KHR";
  570. break;
  571. case VK_ERROR_VALIDATION_FAILED_EXT:
  572. out = "VK_ERROR_VALIDATION_FAILED_EXT";
  573. break;
  574. case VK_ERROR_INVALID_SHADER_NV:
  575. out = "VK_ERROR_INVALID_SHADER_NV";
  576. break;
  577. case VK_ERROR_FRAGMENTATION_EXT:
  578. out = "VK_ERROR_FRAGMENTATION_EXT";
  579. break;
  580. case VK_ERROR_NOT_PERMITTED_EXT:
  581. out = "VK_ERROR_NOT_PERMITTED_EXT";
  582. break;
  583. default:
  584. out = "Unknown VkResult";
  585. break;
  586. }
  587. return out;
  588. }
  589. } // end namespace anki