Common.h 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  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. #pragma once
  6. #include <AnKi/Gr/Common.h>
  7. #if ANKI_OS_LINUX
  8. # define VK_USE_PLATFORM_XCB_KHR 1
  9. # define VK_USE_PLATFORM_XLIB_KHR 1
  10. #elif ANKI_OS_WINDOWS
  11. # define VK_USE_PLATFORM_WIN32_KHR 1
  12. #elif ANKI_OS_ANDROID
  13. # define VK_USE_PLATFORM_ANDROID_KHR 1
  14. #else
  15. # error Not implemented
  16. #endif
  17. #include <Volk/volk.h>
  18. // Cleanup global namespace from these dirty libaries
  19. #if ANKI_OS_LINUX
  20. # undef Bool
  21. #elif ANKI_OS_WINDOWS
  22. # include <AnKi/Util/CleanupWindows.h>
  23. #endif
  24. namespace anki
  25. {
  26. // Forward
  27. class GrManagerImpl;
  28. /// @addtogroup vulkan
  29. /// @{
  30. #define ANKI_VK_LOGI(...) ANKI_LOG("VK ", NORMAL, __VA_ARGS__)
  31. #define ANKI_VK_LOGE(...) ANKI_LOG("VK ", ERROR, __VA_ARGS__)
  32. #define ANKI_VK_LOGW(...) ANKI_LOG("VK ", WARNING, __VA_ARGS__)
  33. #define ANKI_VK_LOGF(...) ANKI_LOG("VK ", FATAL, __VA_ARGS__)
  34. #define ANKI_VK_SELF(class_) class_& self = *static_cast<class_*>(this)
  35. #define ANKI_VK_SELF_CONST(class_) const class_& self = *static_cast<const class_*>(this)
  36. enum class DescriptorType : U8
  37. {
  38. COMBINED_TEXTURE_SAMPLER,
  39. TEXTURE,
  40. SAMPLER,
  41. UNIFORM_BUFFER,
  42. STORAGE_BUFFER,
  43. IMAGE,
  44. TEXTURE_BUFFER,
  45. ACCELERATION_STRUCTURE,
  46. COUNT
  47. };
  48. enum class VulkanExtensions : U32
  49. {
  50. NONE = 0,
  51. KHR_XCB_SURFACE = 1 << 1,
  52. KHR_XLIB_SURFACE = 1 << 2,
  53. KHR_WIN32_SURFACE = 1 << 3,
  54. KHR_ANDROID_SURFACE = 1 << 4,
  55. KHR_SWAPCHAIN = 1 << 5,
  56. KHR_SURFACE = 1 << 6,
  57. EXT_DEBUG_MARKER = 1 << 7,
  58. EXT_DEBUG_REPORT = 1 << 8,
  59. AMD_SHADER_INFO = 1 << 9,
  60. AMD_RASTERIZATION_ORDER = 1 << 10,
  61. KHR_RAY_TRACING = 1 << 11,
  62. KHR_PIPELINE_EXECUTABLE_PROPERTIES = 1 << 12,
  63. EXT_DESCRIPTOR_INDEXING = 1 << 13,
  64. KHR_BUFFER_DEVICE_ADDRESS = 1 << 14,
  65. EXT_SCALAR_BLOCK_LAYOUT = 1 << 15,
  66. KHR_TIMELINE_SEMAPHORE = 1 << 16,
  67. KHR_SHADER_FLOAT16_INT8 = 1 << 17,
  68. KHR_SHADER_ATOMIC_INT64 = 1 << 18,
  69. KHR_SPIRV_1_4 = 1 << 19,
  70. KHR_SHADER_FLOAT_CONTROLS = 1 << 20,
  71. EXT_SAMPLER_FILTER_MIN_MAX = 1 << 21,
  72. };
  73. ANKI_ENUM_ALLOW_NUMERIC_OPERATIONS(VulkanExtensions)
  74. enum class VulkanQueueType : U8
  75. {
  76. GENERAL,
  77. COMPUTE,
  78. COUNT,
  79. FIRST = 0
  80. };
  81. ANKI_ENUM_ALLOW_NUMERIC_OPERATIONS(VulkanQueueType)
  82. using VulkanQueueFamilies = Array<U32, U32(VulkanQueueType::COUNT)>;
  83. /// @name Constants
  84. /// @{
  85. constexpr U DESCRIPTOR_POOL_INITIAL_SIZE = 64;
  86. constexpr F32 DESCRIPTOR_POOL_SIZE_SCALE = 2.0f;
  87. constexpr U DESCRIPTOR_FRAME_BUFFERING = 60 * 5; ///< How many frames worth of descriptors to buffer.
  88. /// There is no need to ask for a fence or a semaphore to be waited for more than 10 seconds. The GPU will timeout
  89. /// anyway.
  90. constexpr Second MAX_FENCE_OR_SEMAPHORE_WAIT_TIME = 10.0;
  91. /// @}
  92. /// Some internal buffer usage flags.
  93. class PrivateBufferUsageBit
  94. {
  95. public:
  96. static constexpr BufferUsageBit ACCELERATION_STRUCTURE_BUILD_SCRATCH = BufferUsageBit(1ull << 29ull);
  97. static constexpr BufferUsageBit ACCELERATION_STRUCTURE = static_cast<BufferUsageBit>(1ull << 30ull);
  98. static constexpr BufferUsageBit ALL_PRIVATE = ACCELERATION_STRUCTURE_BUILD_SCRATCH | ACCELERATION_STRUCTURE;
  99. };
  100. static_assert(!(BufferUsageBit::ALL & PrivateBufferUsageBit::ALL_PRIVATE), "Update the bits in PrivateBufferUsageBit");
  101. /// Check if a vulkan function failed. It will abort on failure.
  102. #define ANKI_VK_CHECKF(x) \
  103. do \
  104. { \
  105. VkResult rez; \
  106. if(ANKI_UNLIKELY((rez = (x)) < 0)) \
  107. { \
  108. ANKI_VK_LOGF("Vulkan function failed (VkResult: %s): %s", vkResultToString(rez), #x); \
  109. } \
  110. } while(0)
  111. /// Check if a vulkan function failed.
  112. #define ANKI_VK_CHECK(x) \
  113. do \
  114. { \
  115. VkResult rez; \
  116. if(ANKI_UNLIKELY((rez = (x)) < 0)) \
  117. { \
  118. ANKI_VK_LOGE("Vulkan function failed (VkResult: %s): %s", vkResultToString(rez), #x); \
  119. return Error::FUNCTION_FAILED; \
  120. } \
  121. } while(0)
  122. /// Convert compare op.
  123. ANKI_USE_RESULT VkCompareOp convertCompareOp(CompareOperation ak);
  124. /// Convert format.
  125. ANKI_USE_RESULT inline VkFormat convertFormat(const Format ak)
  126. {
  127. ANKI_ASSERT(ak != Format::NONE);
  128. const VkFormat out = static_cast<VkFormat>(ak);
  129. return out;
  130. }
  131. /// Get format aspect mask.
  132. ANKI_USE_RESULT inline DepthStencilAspectBit getImageAspectFromFormat(const Format ak)
  133. {
  134. DepthStencilAspectBit out = DepthStencilAspectBit::NONE;
  135. if(formatIsStencil(ak))
  136. {
  137. out = DepthStencilAspectBit::STENCIL;
  138. }
  139. if(formatIsDepth(ak))
  140. {
  141. out |= DepthStencilAspectBit::DEPTH;
  142. }
  143. return out;
  144. }
  145. /// Convert image aspect.
  146. ANKI_USE_RESULT inline VkImageAspectFlags convertImageAspect(const DepthStencilAspectBit ak)
  147. {
  148. VkImageAspectFlags out = 0;
  149. if(!!(ak & DepthStencilAspectBit::DEPTH))
  150. {
  151. out |= VK_IMAGE_ASPECT_DEPTH_BIT;
  152. }
  153. if(!!(ak & DepthStencilAspectBit::STENCIL))
  154. {
  155. out |= VK_IMAGE_ASPECT_STENCIL_BIT;
  156. }
  157. if(!out)
  158. {
  159. out = VK_IMAGE_ASPECT_COLOR_BIT;
  160. }
  161. return out;
  162. }
  163. /// Convert topology.
  164. ANKI_USE_RESULT VkPrimitiveTopology convertTopology(PrimitiveTopology ak);
  165. /// Convert fill mode.
  166. ANKI_USE_RESULT VkPolygonMode convertFillMode(FillMode ak);
  167. /// Convert cull mode.
  168. ANKI_USE_RESULT VkCullModeFlags convertCullMode(FaceSelectionBit ak);
  169. /// Convert blend method.
  170. ANKI_USE_RESULT VkBlendFactor convertBlendFactor(BlendFactor ak);
  171. /// Convert blend function.
  172. ANKI_USE_RESULT VkBlendOp convertBlendOperation(BlendOperation ak);
  173. /// Convert color write mask.
  174. inline ANKI_USE_RESULT VkColorComponentFlags convertColorWriteMask(ColorBit ak)
  175. {
  176. return static_cast<VkColorComponentFlags>(ak);
  177. }
  178. /// Convert load op.
  179. ANKI_USE_RESULT VkAttachmentLoadOp convertLoadOp(AttachmentLoadOperation ak);
  180. /// Convert store op.
  181. ANKI_USE_RESULT VkAttachmentStoreOp convertStoreOp(AttachmentStoreOperation ak);
  182. /// Convert buffer usage bitmask.
  183. ANKI_USE_RESULT VkBufferUsageFlags convertBufferUsageBit(BufferUsageBit usageMask);
  184. ANKI_USE_RESULT VkImageType convertTextureType(TextureType ak);
  185. ANKI_USE_RESULT VkImageViewType convertTextureViewType(TextureType ak);
  186. ANKI_USE_RESULT VkImageUsageFlags convertTextureUsage(const TextureUsageBit ak, const Format format);
  187. ANKI_USE_RESULT VkStencilOp convertStencilOp(StencilOperation ak);
  188. ANKI_USE_RESULT VkShaderStageFlags convertShaderTypeBit(ShaderTypeBit bit);
  189. ANKI_USE_RESULT inline VkVertexInputRate convertVertexStepRate(VertexStepRate ak)
  190. {
  191. VkVertexInputRate out;
  192. switch(ak)
  193. {
  194. case VertexStepRate::VERTEX:
  195. out = VK_VERTEX_INPUT_RATE_VERTEX;
  196. break;
  197. case VertexStepRate::INSTANCE:
  198. out = VK_VERTEX_INPUT_RATE_INSTANCE;
  199. break;
  200. default:
  201. ANKI_ASSERT(0);
  202. out = VK_VERTEX_INPUT_RATE_INSTANCE;
  203. }
  204. return out;
  205. }
  206. ANKI_USE_RESULT inline VkDescriptorType convertDescriptorType(DescriptorType ak)
  207. {
  208. VkDescriptorType out;
  209. switch(ak)
  210. {
  211. case DescriptorType::COMBINED_TEXTURE_SAMPLER:
  212. out = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
  213. break;
  214. case DescriptorType::TEXTURE:
  215. out = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
  216. break;
  217. case DescriptorType::SAMPLER:
  218. out = VK_DESCRIPTOR_TYPE_SAMPLER;
  219. break;
  220. case DescriptorType::UNIFORM_BUFFER:
  221. out = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
  222. break;
  223. case DescriptorType::STORAGE_BUFFER:
  224. out = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC;
  225. break;
  226. case DescriptorType::IMAGE:
  227. out = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
  228. break;
  229. case DescriptorType::ACCELERATION_STRUCTURE:
  230. out = VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR;
  231. break;
  232. default:
  233. out = VK_DESCRIPTOR_TYPE_MAX_ENUM;
  234. ANKI_ASSERT(0);
  235. }
  236. return out;
  237. }
  238. ANKI_USE_RESULT inline VkIndexType convertIndexType(IndexType ak)
  239. {
  240. VkIndexType out;
  241. switch(ak)
  242. {
  243. case IndexType::U16:
  244. out = VK_INDEX_TYPE_UINT16;
  245. break;
  246. case IndexType::U32:
  247. out = VK_INDEX_TYPE_UINT32;
  248. break;
  249. default:
  250. ANKI_ASSERT(0);
  251. out = VK_INDEX_TYPE_MAX_ENUM;
  252. }
  253. return out;
  254. }
  255. ANKI_USE_RESULT inline VkRasterizationOrderAMD convertRasterizationOrder(RasterizationOrder ak)
  256. {
  257. VkRasterizationOrderAMD out;
  258. switch(ak)
  259. {
  260. case RasterizationOrder::ORDERED:
  261. out = VK_RASTERIZATION_ORDER_STRICT_AMD;
  262. break;
  263. case RasterizationOrder::RELAXED:
  264. out = VK_RASTERIZATION_ORDER_RELAXED_AMD;
  265. break;
  266. default:
  267. ANKI_ASSERT(0);
  268. out = VK_RASTERIZATION_ORDER_STRICT_AMD;
  269. }
  270. return out;
  271. }
  272. ANKI_USE_RESULT inline VkAccelerationStructureTypeKHR convertAccelerationStructureType(AccelerationStructureType ak)
  273. {
  274. VkAccelerationStructureTypeKHR out;
  275. switch(ak)
  276. {
  277. case AccelerationStructureType::BOTTOM_LEVEL:
  278. out = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR;
  279. break;
  280. case AccelerationStructureType::TOP_LEVEL:
  281. out = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR;
  282. break;
  283. default:
  284. ANKI_ASSERT(0);
  285. out = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR;
  286. }
  287. return out;
  288. }
  289. ANKI_USE_RESULT const char* vkResultToString(VkResult res);
  290. /// @}
  291. } // end namespace anki