BsVulkanUtility.cpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsVulkanUtility.h"
  4. #include "BsException.h"
  5. namespace BansheeEngine
  6. {
  7. VkFormat VulkanUtility::getPixelFormat(PixelFormat format, bool sRGB)
  8. {
  9. switch (format)
  10. {
  11. case PF_R8:
  12. if(sRGB)
  13. return VK_FORMAT_R8_SRGB;
  14. return VK_FORMAT_R8_UNORM;
  15. case PF_R8G8:
  16. if (sRGB)
  17. return VK_FORMAT_R8G8_SRGB;
  18. return VK_FORMAT_R8G8_UNORM;
  19. case PF_R8G8B8:
  20. if (sRGB)
  21. return VK_FORMAT_R8G8B8_SRGB;
  22. return VK_FORMAT_R8G8B8_UNORM;
  23. case PF_R8G8B8A8:
  24. if (sRGB)
  25. return VK_FORMAT_R8G8B8A8_SRGB;
  26. return VK_FORMAT_R8G8B8A8_UNORM;
  27. case PF_B8G8R8A8:
  28. case PF_B8G8R8X8:
  29. if (sRGB)
  30. return VK_FORMAT_B8G8R8A8_SRGB;
  31. return VK_FORMAT_B8G8R8A8_UNORM;
  32. case PF_FLOAT16_R:
  33. return VK_FORMAT_R16_SFLOAT;
  34. case PF_FLOAT16_RG:
  35. return VK_FORMAT_R16G16_SFLOAT;
  36. case PF_FLOAT16_RGB:
  37. return VK_FORMAT_R16G16B16_SFLOAT;
  38. case PF_FLOAT16_RGBA:
  39. return VK_FORMAT_R16G16B16A16_SFLOAT;
  40. case PF_FLOAT32_R:
  41. return VK_FORMAT_R32_SFLOAT;
  42. case PF_FLOAT32_RG:
  43. return VK_FORMAT_R32G32_SFLOAT;
  44. case PF_FLOAT32_RGB:
  45. return VK_FORMAT_R32G32B32_SFLOAT;
  46. case PF_FLOAT32_RGBA:
  47. return VK_FORMAT_R32G32B32A32_SFLOAT;
  48. case PF_BC1:
  49. if (sRGB)
  50. return VK_FORMAT_BC1_RGB_SRGB_BLOCK;
  51. return VK_FORMAT_BC1_RGB_UNORM_BLOCK;
  52. case PF_BC1a:
  53. if (sRGB)
  54. return VK_FORMAT_BC1_RGBA_SRGB_BLOCK;
  55. return VK_FORMAT_BC1_RGBA_UNORM_BLOCK;
  56. case PF_BC2:
  57. if (sRGB)
  58. return VK_FORMAT_BC2_SRGB_BLOCK;
  59. return VK_FORMAT_BC2_UNORM_BLOCK;
  60. case PF_BC3:
  61. if (sRGB)
  62. return VK_FORMAT_BC3_SRGB_BLOCK;
  63. return VK_FORMAT_BC3_UNORM_BLOCK;
  64. case PF_BC4:
  65. return VK_FORMAT_BC4_SNORM_BLOCK;
  66. case PF_BC5:
  67. return VK_FORMAT_BC5_UNORM_BLOCK;
  68. case PF_BC6H:
  69. return VK_FORMAT_BC6H_SFLOAT_BLOCK;
  70. case PF_BC7:
  71. if (sRGB)
  72. return VK_FORMAT_BC7_SRGB_BLOCK;
  73. return VK_FORMAT_BC7_UNORM_BLOCK;
  74. case PF_D32_S8X24:
  75. return VK_FORMAT_D32_SFLOAT_S8_UINT;
  76. case PF_D24S8:
  77. return VK_FORMAT_D24_UNORM_S8_UINT;
  78. case PF_D32:
  79. return VK_FORMAT_D32_SFLOAT;
  80. case PF_D16:
  81. return VK_FORMAT_D16_UNORM;
  82. case PF_FLOAT_R11G11B10:
  83. return VK_FORMAT_B10G11R11_UFLOAT_PACK32;
  84. case PF_UNORM_R10G10B10A2:
  85. return VK_FORMAT_A2B10G10R10_UNORM_PACK32;
  86. case PF_A8R8G8B8:
  87. case PF_A8B8G8R8:
  88. case PF_X8R8G8B8:
  89. case PF_X8B8G8R8:
  90. case PF_UNKNOWN:
  91. default:
  92. return VK_FORMAT_UNDEFINED;
  93. }
  94. }
  95. VkFormat VulkanUtility::getBufferFormat(GpuBufferFormat format)
  96. {
  97. static bool lookupInitialized = false;
  98. static VkFormat lookup[BF_COUNT];
  99. if (!lookupInitialized)
  100. {
  101. lookup[BF_16X1F] = VK_FORMAT_R16_SFLOAT;
  102. lookup[BF_16X2F] = VK_FORMAT_R16G16_SFLOAT;
  103. lookup[BF_16X4F] = VK_FORMAT_R16G16B16A16_SFLOAT;
  104. lookup[BF_32X1F] = VK_FORMAT_R32_SFLOAT;
  105. lookup[BF_32X2F] = VK_FORMAT_R32G32_SFLOAT;
  106. lookup[BF_32X3F] = VK_FORMAT_R32G32B32_SFLOAT;
  107. lookup[BF_32X4F] = VK_FORMAT_R32G32B32A32_SFLOAT;
  108. lookup[BF_8X1] = VK_FORMAT_R8_UNORM;
  109. lookup[BF_8X2] = VK_FORMAT_R8G8_UNORM;
  110. lookup[BF_8X4] = VK_FORMAT_R8G8B8A8_UNORM;
  111. lookup[BF_16X1] = VK_FORMAT_R16_UNORM;
  112. lookup[BF_16X2] = VK_FORMAT_R16G16_UNORM;
  113. lookup[BF_16X4] = VK_FORMAT_R16G16B16A16_UNORM;
  114. lookup[BF_8X1S] = VK_FORMAT_R8_SINT;
  115. lookup[BF_8X2S] = VK_FORMAT_R8G8_SINT;
  116. lookup[BF_8X4S] = VK_FORMAT_R8G8B8A8_SINT;
  117. lookup[BF_16X1S] = VK_FORMAT_R16_SINT;
  118. lookup[BF_16X2S] = VK_FORMAT_R16G16_SINT;
  119. lookup[BF_16X4S] = VK_FORMAT_R16G16B16A16_SINT;
  120. lookup[BF_32X1S] = VK_FORMAT_R32_SINT;
  121. lookup[BF_32X2S] = VK_FORMAT_R32G32_SINT;
  122. lookup[BF_32X3S] = VK_FORMAT_R32G32B32_SINT;
  123. lookup[BF_32X4S] = VK_FORMAT_R32G32B32A32_SINT;
  124. lookup[BF_8X1U] = VK_FORMAT_R8_UINT;
  125. lookup[BF_8X2U] = VK_FORMAT_R8G8_UINT;
  126. lookup[BF_8X4U] = VK_FORMAT_R8G8B8A8_UINT;
  127. lookup[BF_16X1U] = VK_FORMAT_R16_UINT;
  128. lookup[BF_16X2U] = VK_FORMAT_R16G16_UINT;
  129. lookup[BF_16X4U] = VK_FORMAT_R16G16B16A16_UINT;
  130. lookup[BF_32X1U] = VK_FORMAT_R32_UINT;
  131. lookup[BF_32X2U] = VK_FORMAT_R32G32_UINT;
  132. lookup[BF_32X3U] = VK_FORMAT_R32G32B32_UINT;
  133. lookup[BF_32X4U] = VK_FORMAT_R32G32B32A32_UINT;
  134. lookupInitialized = true;
  135. }
  136. if (format >= BF_COUNT)
  137. return VK_FORMAT_UNDEFINED;
  138. return lookup[(UINT32)format];
  139. }
  140. VkFormat VulkanUtility::getVertexType(VertexElementType type)
  141. {
  142. static bool lookupInitialized = false;
  143. static VkFormat lookup[VET_COUNT];
  144. if (!lookupInitialized)
  145. {
  146. lookup[VET_COLOR] = VK_FORMAT_R8G8B8A8_UNORM;
  147. lookup[VET_COLOR_ABGR] = VK_FORMAT_R8G8B8A8_UNORM;
  148. lookup[VET_COLOR_ARGB] = VK_FORMAT_R8G8B8A8_UNORM;
  149. lookup[VET_UBYTE4_NORM] = VK_FORMAT_R8G8B8A8_UNORM;
  150. lookup[VET_FLOAT1] = VK_FORMAT_R32_SFLOAT;
  151. lookup[VET_FLOAT2] = VK_FORMAT_R32G32_SFLOAT;
  152. lookup[VET_FLOAT3] = VK_FORMAT_R32G32B32_SFLOAT;
  153. lookup[VET_FLOAT4] = VK_FORMAT_R32G32B32A32_SFLOAT;
  154. lookup[VET_USHORT1] = VK_FORMAT_R16_UINT;
  155. lookup[VET_USHORT2] = VK_FORMAT_R16G16_UINT;
  156. lookup[VET_USHORT4] = VK_FORMAT_R16G16B16A16_UINT;
  157. lookup[VET_SHORT1] = VK_FORMAT_R16_SINT;
  158. lookup[VET_SHORT2] = VK_FORMAT_R16G16_SINT;
  159. lookup[VET_SHORT4] = VK_FORMAT_R16G16B16A16_SINT;
  160. lookup[VET_UINT1] = VK_FORMAT_R32_UINT;
  161. lookup[VET_UINT2] = VK_FORMAT_R32G32_UINT;
  162. lookup[VET_UINT3] = VK_FORMAT_R32G32B32_UINT;
  163. lookup[VET_UINT4] = VK_FORMAT_R32G32B32A32_UINT;
  164. lookup[VET_INT1] = VK_FORMAT_R32_SINT;
  165. lookup[VET_INT2] = VK_FORMAT_R32G32_SINT;
  166. lookup[VET_INT3] = VK_FORMAT_R32G32B32_SINT;
  167. lookup[VET_INT4] = VK_FORMAT_R32G32B32A32_SINT;
  168. lookup[VET_UBYTE4] = VK_FORMAT_R8G8B8A8_UINT;
  169. lookupInitialized = true;
  170. }
  171. if (type >= VET_COUNT)
  172. return VK_FORMAT_UNDEFINED;
  173. return lookup[(UINT32)type];
  174. }
  175. VkSampleCountFlagBits VulkanUtility::getSampleFlags(UINT32 numSamples)
  176. {
  177. switch(numSamples)
  178. {
  179. case 1:
  180. return VK_SAMPLE_COUNT_1_BIT;
  181. case 2:
  182. return VK_SAMPLE_COUNT_2_BIT;
  183. case 4:
  184. return VK_SAMPLE_COUNT_4_BIT;
  185. case 8:
  186. return VK_SAMPLE_COUNT_8_BIT;
  187. case 16:
  188. return VK_SAMPLE_COUNT_16_BIT;
  189. case 32:
  190. return VK_SAMPLE_COUNT_32_BIT;
  191. case 64:
  192. return VK_SAMPLE_COUNT_64_BIT;
  193. }
  194. BS_EXCEPT(RenderingAPIException, "Unsupported sample count: " + toString(numSamples));
  195. return VK_SAMPLE_COUNT_1_BIT;
  196. }
  197. VkSamplerAddressMode VulkanUtility::getAddressingMode(TextureAddressingMode mode)
  198. {
  199. switch (mode)
  200. {
  201. case TAM_WRAP:
  202. return VK_SAMPLER_ADDRESS_MODE_REPEAT;
  203. case TAM_MIRROR:
  204. return VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT;
  205. case TAM_CLAMP:
  206. return VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
  207. case TAM_BORDER:
  208. return VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER;
  209. }
  210. return VK_SAMPLER_ADDRESS_MODE_REPEAT;
  211. }
  212. VkBlendFactor VulkanUtility::getBlendFactor(BlendFactor factor)
  213. {
  214. switch (factor)
  215. {
  216. case BF_ONE:
  217. return VK_BLEND_FACTOR_ONE;
  218. case BF_ZERO:
  219. return VK_BLEND_FACTOR_ZERO;
  220. case BF_DEST_COLOR:
  221. return VK_BLEND_FACTOR_DST_COLOR;
  222. case BF_SOURCE_COLOR:
  223. return VK_BLEND_FACTOR_SRC_COLOR;
  224. case BF_INV_DEST_COLOR:
  225. return VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR;
  226. case BF_INV_SOURCE_COLOR:
  227. return VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR;
  228. case BF_DEST_ALPHA:
  229. return VK_BLEND_FACTOR_DST_ALPHA;
  230. case BF_SOURCE_ALPHA:
  231. return VK_BLEND_FACTOR_SRC_ALPHA;
  232. case BF_INV_DEST_ALPHA:
  233. return VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA;
  234. case BF_INV_SOURCE_ALPHA:
  235. return VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
  236. }
  237. // Unsupported type
  238. return VK_BLEND_FACTOR_ZERO;
  239. }
  240. VkBlendOp VulkanUtility::getBlendOp(BlendOperation op)
  241. {
  242. switch (op)
  243. {
  244. case BO_ADD:
  245. return VK_BLEND_OP_ADD;
  246. case BO_SUBTRACT:
  247. return VK_BLEND_OP_SUBTRACT;
  248. case BO_REVERSE_SUBTRACT:
  249. return VK_BLEND_OP_REVERSE_SUBTRACT;
  250. case BO_MIN:
  251. return VK_BLEND_OP_MIN;
  252. case BO_MAX:
  253. return VK_BLEND_OP_MAX;
  254. }
  255. // Unsupported type
  256. return VK_BLEND_OP_ADD;
  257. }
  258. VkCompareOp VulkanUtility::getCompareOp(CompareFunction op)
  259. {
  260. switch (op)
  261. {
  262. case CMPF_ALWAYS_FAIL:
  263. return VK_COMPARE_OP_NEVER;
  264. case CMPF_ALWAYS_PASS:
  265. return VK_COMPARE_OP_ALWAYS;
  266. case CMPF_LESS:
  267. return VK_COMPARE_OP_LESS;
  268. case CMPF_LESS_EQUAL:
  269. return VK_COMPARE_OP_LESS_OR_EQUAL;
  270. case CMPF_EQUAL:
  271. return VK_COMPARE_OP_EQUAL;
  272. case CMPF_NOT_EQUAL:
  273. return VK_COMPARE_OP_NOT_EQUAL;
  274. case CMPF_GREATER_EQUAL:
  275. return VK_COMPARE_OP_GREATER_OR_EQUAL;
  276. case CMPF_GREATER:
  277. return VK_COMPARE_OP_GREATER;
  278. };
  279. // Unsupported type
  280. return VK_COMPARE_OP_ALWAYS;
  281. }
  282. VkCullModeFlagBits VulkanUtility::getCullMode(CullingMode mode)
  283. {
  284. switch (mode)
  285. {
  286. case CULL_NONE:
  287. return VK_CULL_MODE_NONE;
  288. case CULL_CLOCKWISE:
  289. return VK_CULL_MODE_BACK_BIT;
  290. case CULL_COUNTERCLOCKWISE:
  291. return VK_CULL_MODE_FRONT_BIT;
  292. }
  293. // Unsupported type
  294. return VK_CULL_MODE_NONE;
  295. }
  296. VkPolygonMode VulkanUtility::getPolygonMode(PolygonMode mode)
  297. {
  298. switch (mode)
  299. {
  300. case PM_WIREFRAME:
  301. return VK_POLYGON_MODE_LINE;
  302. case PM_SOLID:
  303. return VK_POLYGON_MODE_FILL;
  304. }
  305. return VK_POLYGON_MODE_FILL;
  306. }
  307. VkStencilOp VulkanUtility::getStencilOp(StencilOperation op)
  308. {
  309. switch (op)
  310. {
  311. case SOP_KEEP:
  312. return VK_STENCIL_OP_KEEP;
  313. case SOP_ZERO:
  314. return VK_STENCIL_OP_ZERO;
  315. case SOP_REPLACE:
  316. return VK_STENCIL_OP_REPLACE;
  317. case SOP_INCREMENT:
  318. return VK_STENCIL_OP_INCREMENT_AND_CLAMP;
  319. case SOP_DECREMENT:
  320. return VK_STENCIL_OP_DECREMENT_AND_CLAMP;
  321. case SOP_INCREMENT_WRAP:
  322. return VK_STENCIL_OP_INCREMENT_AND_WRAP;
  323. case SOP_DECREMENT_WRAP:
  324. return VK_STENCIL_OP_DECREMENT_AND_WRAP;
  325. case SOP_INVERT:
  326. return VK_STENCIL_OP_INVERT;
  327. }
  328. // Unsupported type
  329. return VK_STENCIL_OP_KEEP;
  330. }
  331. VkIndexType VulkanUtility::getIndexType(IndexType op)
  332. {
  333. switch(op)
  334. {
  335. case IT_16BIT:
  336. return VK_INDEX_TYPE_UINT16;
  337. case IT_32BIT:
  338. return VK_INDEX_TYPE_UINT32;
  339. }
  340. // Unsupported type
  341. return VK_INDEX_TYPE_UINT32;
  342. }
  343. VkPrimitiveTopology VulkanUtility::getDrawOp(DrawOperationType op)
  344. {
  345. switch (op)
  346. {
  347. case DOT_POINT_LIST:
  348. return VK_PRIMITIVE_TOPOLOGY_POINT_LIST;
  349. case DOT_LINE_LIST:
  350. return VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
  351. case DOT_LINE_STRIP:
  352. return VK_PRIMITIVE_TOPOLOGY_LINE_STRIP;
  353. case DOT_TRIANGLE_LIST:
  354. return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
  355. case DOT_TRIANGLE_STRIP:
  356. return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
  357. case DOT_TRIANGLE_FAN:
  358. return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN;
  359. }
  360. // Unsupported type
  361. return VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
  362. }
  363. }