RendererVK.h 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369
  1. #pragma once
  2. #include "Defines.h"
  3. #include "Logging.h"
  4. #include "vulkan/vulkan.h"
  5. #if GP_PLATFORM_WINDOWS
  6. # define VK_USE_PLATFORM_WIN32_KHR
  7. #elif GP_PLATFORM_LINUX
  8. # define VK_USE_PLATFORM_XLIB_KHR
  9. #elif GP_PLATFORM_MACOS
  10. # define VK_USE_PLATFORM_MACOS_MVK
  11. #elif GP_PLATFORM_IOS
  12. # define VK_USE_PLATFORM_IOS_MVK
  13. #elif GP_PLATFORM_ANDROID
  14. # define VK_USE_PLATFORM_ANDROID_KHR
  15. #else
  16. # error Unsupported renderer platform
  17. #endif
  18. namespace gameplay
  19. {
  20. const std::vector<const char*> vulkan_validation_layers = { "VK_LAYER_LUNARG_standard_validation" };
  21. std::string to_vulkan_error_string(VkResult result);
  22. static void check_vulkan_result(VkResult res)
  23. {
  24. if (res != VK_SUCCESS)
  25. {
  26. GP_LOG_ERROR("Fatal: VkResult is: %s, file: %s, line: %s", to_vulkan_error_string(res), __FILE__, __LINE__);
  27. GP_ASSERT(res == VK_SUCCESS);
  28. if (res < 0)
  29. abort();
  30. }
  31. }
  32. #define VK_CHECK_RESULT(f) \
  33. { \
  34. VkResult res = (f); \
  35. if (res != VK_SUCCESS) \
  36. { \
  37. GP_LOG_ERROR("Fatal: VkResult is: %s, file: %s, line: %s", to_vulkan_error_string(res), __FILE__, __LINE__); \
  38. GP_ASSERT(res == VK_SUCCESS); \
  39. if (res < 0) \
  40. abort(); \
  41. } \
  42. }
  43. VkBool32 log_vulkan_validation_debug_report(VkDebugReportFlagsEXT flags,
  44. VkDebugReportObjectTypeEXT objType,
  45. uint64_t srcObject,
  46. size_t location,
  47. int32_t msgCode,
  48. const char* layerPrefix,
  49. const char* msg,
  50. void* userPtr)
  51. {
  52. std::string prefix("");
  53. if (flags & VK_DEBUG_REPORT_ERROR_BIT_EXT)
  54. prefix += "ERROR:";
  55. if (flags & VK_DEBUG_REPORT_WARNING_BIT_EXT)
  56. prefix += "WARNING:";
  57. if (flags & VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT)
  58. prefix += "PERFORMANCE:";
  59. if (flags & VK_DEBUG_REPORT_INFORMATION_BIT_EXT)
  60. prefix += "INFO:";
  61. if (flags & VK_DEBUG_REPORT_DEBUG_BIT_EXT)
  62. prefix += "DEBUG:";
  63. GP_LOG_DEBUG("%s [%s] Code: %d:%s", prefix.c_str(), layerPrefix, msgCode, msg);
  64. return VK_FALSE;
  65. }
  66. #if GP_PLATFORM_ANDROID
  67. #include <android/log.h>
  68. #include <dlfcn.h>
  69. PFN_vkCreateInstance vkCreateInstance;
  70. PFN_vkGetDeviceProcAddr vkGetDeviceProcAddr;
  71. PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr;
  72. PFN_vkCreateDevice vkCreateDevice;
  73. PFN_vkEnumeratePhysicalDevices vkEnumeratePhysicalDevices;
  74. PFN_vkGetPhysicalDeviceProperties vkGetPhysicalDeviceProperties;
  75. PFN_vkEnumerateDeviceExtensionProperties vkEnumerateDeviceExtensionProperties;
  76. PFN_vkEnumerateDeviceLayerProperties vkEnumerateDeviceLayerProperties;
  77. PFN_vkGetPhysicalDeviceFormatProperties vkGetPhysicalDeviceFormatProperties;
  78. PFN_vkGetPhysicalDeviceFeatures vkGetPhysicalDeviceFeatures;
  79. PFN_vkGetPhysicalDeviceQueueFamilyProperties vkGetPhysicalDeviceQueueFamilyProperties;
  80. PFN_vkGetPhysicalDeviceMemoryProperties vkGetPhysicalDeviceMemoryProperties;
  81. PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties;
  82. PFN_vkEnumerateInstanceLayerProperties vkEnumerateInstanceLayerProperties;
  83. PFN_vkCmdPipelineBarrier vkCmdPipelineBarrier;
  84. PFN_vkCreateShaderModule vkCreateShaderModule;
  85. PFN_vkCreateBuffer vkCreateBuffer;
  86. PFN_vkGetBufferMemoryRequirements vkGetBufferMemoryRequirements;
  87. PFN_vkMapMemory vkMapMemory;
  88. PFN_vkUnmapMemory vkUnmapMemory;
  89. PFN_vkFlushMappedMemoryRanges vkFlushMappedMemoryRanges;
  90. PFN_vkInvalidateMappedMemoryRanges vkInvalidateMappedMemoryRanges;
  91. PFN_vkBindBufferMemory vkBindBufferMemory;
  92. PFN_vkDestroyBuffer vkDestroyBuffer;
  93. PFN_vkAllocateMemory vkAllocateMemory;
  94. PFN_vkBindImageMemory vkBindImageMemory;
  95. PFN_vkGetImageSubresourceLayout vkGetImageSubresourceLayout;
  96. PFN_vkCmdCopyBuffer vkCmdCopyBuffer;
  97. PFN_vkCmdCopyBufferToImage vkCmdCopyBufferToImage;
  98. PFN_vkCmdCopyImage vkCmdCopyImage;
  99. PFN_vkCmdBlitImage vkCmdBlitImage;
  100. PFN_vkCmdClearAttachments vkCmdClearAttachments;
  101. PFN_vkCreateSampler vkCreateSampler;
  102. PFN_vkDestroySampler vkDestroySampler;
  103. PFN_vkDestroyImage vkDestroyImage;
  104. PFN_vkFreeMemory vkFreeMemory;
  105. PFN_vkCreateRenderPass vkCreateRenderPass;
  106. PFN_vkCmdBeginRenderPass vkCmdBeginRenderPass;
  107. PFN_vkCmdEndRenderPass vkCmdEndRenderPass;
  108. PFN_vkCmdExecuteCommands vkCmdExecuteCommands;
  109. PFN_vkCreateImage vkCreateImage;
  110. PFN_vkGetImageMemoryRequirements vkGetImageMemoryRequirements;
  111. PFN_vkCreateImageView vkCreateImageView;
  112. PFN_vkDestroyImageView vkDestroyImageView;
  113. PFN_vkCreateSemaphore vkCreateSemaphore;
  114. PFN_vkDestroySemaphore vkDestroySemaphore;
  115. PFN_vkCreateFence vkCreateFence;
  116. PFN_vkDestroyFence vkDestroyFence;
  117. PFN_vkWaitForFences vkWaitForFences;
  118. PFN_vkResetFences vkResetFences;
  119. PFN_vkCreateCommandPool vkCreateCommandPool;
  120. PFN_vkDestroyCommandPool vkDestroyCommandPool;
  121. PFN_vkAllocateCommandBuffers vkAllocateCommandBuffers;
  122. PFN_vkBeginCommandBuffer vkBeginCommandBuffer;
  123. PFN_vkEndCommandBuffer vkEndCommandBuffer;
  124. PFN_vkGetDeviceQueue vkGetDeviceQueue;
  125. PFN_vkQueueSubmit vkQueueSubmit;
  126. PFN_vkQueueWaitIdle vkQueueWaitIdle;
  127. PFN_vkDeviceWaitIdle vkDeviceWaitIdle;
  128. PFN_vkCreateFramebuffer vkCreateFramebuffer;
  129. PFN_vkCreatePipelineCache vkCreatePipelineCache;
  130. PFN_vkCreatePipelineLayout vkCreatePipelineLayout;
  131. PFN_vkCreateGraphicsPipelines vkCreateGraphicsPipelines;
  132. PFN_vkCreateComputePipelines vkCreateComputePipelines;
  133. PFN_vkCreateDescriptorPool vkCreateDescriptorPool;
  134. PFN_vkCreateDescriptorSetLayout vkCreateDescriptorSetLayout;
  135. PFN_vkAllocateDescriptorSets vkAllocateDescriptorSets;
  136. PFN_vkUpdateDescriptorSets vkUpdateDescriptorSets;
  137. PFN_vkCmdBindDescriptorSets vkCmdBindDescriptorSets;
  138. PFN_vkCmdBindPipeline vkCmdBindPipeline;
  139. PFN_vkCmdBindVertexBuffers vkCmdBindVertexBuffers;
  140. PFN_vkCmdBindIndexBuffer vkCmdBindIndexBuffer;
  141. PFN_vkCmdSetViewport vkCmdSetViewport;
  142. PFN_vkCmdSetScissor vkCmdSetScissor;
  143. PFN_vkCmdSetLineWidth vkCmdSetLineWidth;
  144. PFN_vkCmdSetDepthBias vkCmdSetDepthBias;
  145. PFN_vkCmdPushConstants vkCmdPushConstants;
  146. PFN_vkCmdDrawIndexed vkCmdDrawIndexed;
  147. PFN_vkCmdDraw vkCmdDraw;
  148. PFN_vkCmdDrawIndexedIndirect vkCmdDrawIndexedIndirect;
  149. PFN_vkCmdDrawIndirect vkCmdDrawIndirect;
  150. PFN_vkCmdDispatch vkCmdDispatch;
  151. PFN_vkDestroyPipeline vkDestroyPipeline;
  152. PFN_vkDestroyPipelineLayout vkDestroyPipelineLayout;
  153. PFN_vkDestroyDescriptorSetLayout vkDestroyDescriptorSetLayout;
  154. PFN_vkDestroyDevice vkDestroyDevice;
  155. PFN_vkDestroyInstance vkDestroyInstance;
  156. PFN_vkDestroyDescriptorPool vkDestroyDescriptorPool;
  157. PFN_vkFreeCommandBuffers vkFreeCommandBuffers;
  158. PFN_vkDestroyRenderPass vkDestroyRenderPass;
  159. PFN_vkDestroyFramebuffer vkDestroyFramebuffer;
  160. PFN_vkDestroyShaderModule vkDestroyShaderModule;
  161. PFN_vkDestroyPipelineCache vkDestroyPipelineCache;
  162. PFN_vkCreateQueryPool vkCreateQueryPool;
  163. PFN_vkDestroyQueryPool vkDestroyQueryPool;
  164. PFN_vkGetQueryPoolResults vkGetQueryPoolResults;
  165. PFN_vkCmdBeginQuery vkCmdBeginQuery;
  166. PFN_vkCmdEndQuery vkCmdEndQuery;
  167. PFN_vkCmdResetQueryPool vkCmdResetQueryPool;
  168. PFN_vkCmdCopyQueryPoolResults vkCmdCopyQueryPoolResults;
  169. PFN_vkCreateAndroidSurfaceKHR vkCreateAndroidSurfaceKHR;
  170. PFN_vkDestroySurfaceKHR vkDestroySurfaceKHR;
  171. void* libVulkan;
  172. #endif
  173. static void load_vulkan_library()
  174. {
  175. #if GP_PLATFORM_ANDROID
  176. __android_log_print(ANDROID_LOG_INFO, "vulkanandroid", "Loading libvulkan.so...\n");
  177. // Load the vulkan library
  178. libVulkan = dlopen("libvulkan.so", RTLD_NOW | RTLD_LOCAL);
  179. if (!libVulkan)
  180. {
  181. __android_log_print(ANDROID_LOG_INFO, "vulkanandroid", "Could not load vulkan library : %s!\n", dlerror());
  182. return false;
  183. }
  184. // Load base function pointers
  185. vkEnumerateInstanceExtensionProperties = reinterpret_cast<PFN_vkEnumerateInstanceExtensionProperties>(dlsym(libVulkan, "vkEnumerateInstanceExtensionProperties"));
  186. vkEnumerateInstanceLayerProperties = reinterpret_cast<PFN_vkEnumerateInstanceLayerProperties>(dlsym(libVulkan, "vkEnumerateInstanceLayerProperties"));
  187. vkCreateInstance = reinterpret_cast<PFN_vkCreateInstance>(dlsym(libVulkan, "vkCreateInstance"));
  188. vkGetInstanceProcAddr = reinterpret_cast<PFN_vkGetInstanceProcAddr>(dlsym(libVulkan, "vkGetInstanceProcAddr"));
  189. vkGetDeviceProcAddr = reinterpret_cast<PFN_vkGetDeviceProcAddr>(dlsym(libVulkan, "vkGetDeviceProcAddr"));
  190. #elif GP_PLATFORM_LINUX
  191. //initxcbConnection();
  192. #endif
  193. }
  194. static void unload_vulkan_library()
  195. {
  196. #if GP_PLATFORM_ANDROID
  197. dlclose(libVulkan);
  198. #endif
  199. }
  200. static void load_vulkan_functions()
  201. {
  202. #if GP_PLATFORM_ANDROID
  203. __android_log_print(ANDROID_LOG_INFO, "vulkanandroid", "Loading instance based function pointers...\n");
  204. vkEnumeratePhysicalDevices = reinterpret_cast<PFN_vkEnumeratePhysicalDevices>(vkGetInstanceProcAddr(instance, "vkEnumeratePhysicalDevices"));
  205. vkGetPhysicalDeviceProperties = reinterpret_cast<PFN_vkGetPhysicalDeviceProperties>(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceProperties"));
  206. vkEnumerateDeviceLayerProperties = reinterpret_cast<PFN_vkEnumerateDeviceLayerProperties>(vkGetInstanceProcAddr(instance, "vkEnumerateDeviceLayerProperties"));
  207. vkEnumerateDeviceExtensionProperties = reinterpret_cast<PFN_vkEnumerateDeviceExtensionProperties>(vkGetInstanceProcAddr(instance, "vkEnumerateDeviceExtensionProperties"));
  208. vkGetPhysicalDeviceQueueFamilyProperties = reinterpret_cast<PFN_vkGetPhysicalDeviceQueueFamilyProperties>(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceQueueFamilyProperties"));
  209. vkGetPhysicalDeviceFeatures = reinterpret_cast<PFN_vkGetPhysicalDeviceFeatures>(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceFeatures"));
  210. vkCreateDevice = reinterpret_cast<PFN_vkCreateDevice>(vkGetInstanceProcAddr(instance, "vkCreateDevice"));
  211. vkGetPhysicalDeviceFormatProperties = reinterpret_cast<PFN_vkGetPhysicalDeviceFormatProperties>(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceFormatProperties"));
  212. vkGetPhysicalDeviceMemoryProperties = reinterpret_cast<PFN_vkGetPhysicalDeviceMemoryProperties>(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceMemoryProperties"));
  213. vkCmdPipelineBarrier = reinterpret_cast<PFN_vkCmdPipelineBarrier>(vkGetInstanceProcAddr(instance, "vkCmdPipelineBarrier"));
  214. vkCreateShaderModule = reinterpret_cast<PFN_vkCreateShaderModule>(vkGetInstanceProcAddr(instance, "vkCreateShaderModule"));
  215. vkCreateBuffer = reinterpret_cast<PFN_vkCreateBuffer>(vkGetInstanceProcAddr(instance, "vkCreateBuffer"));
  216. vkGetBufferMemoryRequirements = reinterpret_cast<PFN_vkGetBufferMemoryRequirements>(vkGetInstanceProcAddr(instance, "vkGetBufferMemoryRequirements"));
  217. vkMapMemory = reinterpret_cast<PFN_vkMapMemory>(vkGetInstanceProcAddr(instance, "vkMapMemory"));
  218. vkUnmapMemory = reinterpret_cast<PFN_vkUnmapMemory>(vkGetInstanceProcAddr(instance, "vkUnmapMemory"));
  219. vkFlushMappedMemoryRanges = reinterpret_cast<PFN_vkFlushMappedMemoryRanges>(vkGetInstanceProcAddr(instance, "vkFlushMappedMemoryRanges"));
  220. vkInvalidateMappedMemoryRanges = reinterpret_cast<PFN_vkInvalidateMappedMemoryRanges>(vkGetInstanceProcAddr(instance, "vkInvalidateMappedMemoryRanges"));
  221. vkBindBufferMemory = reinterpret_cast<PFN_vkBindBufferMemory>(vkGetInstanceProcAddr(instance, "vkBindBufferMemory"));
  222. vkDestroyBuffer = reinterpret_cast<PFN_vkDestroyBuffer>(vkGetInstanceProcAddr(instance, "vkDestroyBuffer"));
  223. vkAllocateMemory = reinterpret_cast<PFN_vkAllocateMemory>(vkGetInstanceProcAddr(instance, "vkAllocateMemory"));
  224. vkFreeMemory = reinterpret_cast<PFN_vkFreeMemory>(vkGetInstanceProcAddr(instance, "vkFreeMemory"));
  225. vkCreateRenderPass = reinterpret_cast<PFN_vkCreateRenderPass>(vkGetInstanceProcAddr(instance, "vkCreateRenderPass"));
  226. vkCmdBeginRenderPass = reinterpret_cast<PFN_vkCmdBeginRenderPass>(vkGetInstanceProcAddr(instance, "vkCmdBeginRenderPass"));
  227. vkCmdEndRenderPass = reinterpret_cast<PFN_vkCmdEndRenderPass>(vkGetInstanceProcAddr(instance, "vkCmdEndRenderPass"));
  228. vkCmdExecuteCommands = reinterpret_cast<PFN_vkCmdExecuteCommands>(vkGetInstanceProcAddr(instance, "vkCmdExecuteCommands"));
  229. vkCreateImage = reinterpret_cast<PFN_vkCreateImage>(vkGetInstanceProcAddr(instance, "vkCreateImage"));
  230. vkGetImageMemoryRequirements = reinterpret_cast<PFN_vkGetImageMemoryRequirements>(vkGetInstanceProcAddr(instance, "vkGetImageMemoryRequirements"));
  231. vkCreateImageView = reinterpret_cast<PFN_vkCreateImageView>(vkGetInstanceProcAddr(instance, "vkCreateImageView"));
  232. vkDestroyImageView = reinterpret_cast<PFN_vkDestroyImageView>(vkGetInstanceProcAddr(instance, "vkDestroyImageView"));
  233. vkBindImageMemory = reinterpret_cast<PFN_vkBindImageMemory>(vkGetInstanceProcAddr(instance, "vkBindImageMemory"));
  234. vkGetImageSubresourceLayout = reinterpret_cast<PFN_vkGetImageSubresourceLayout>(vkGetInstanceProcAddr(instance, "vkGetImageSubresourceLayout"));
  235. vkCmdCopyImage = reinterpret_cast<PFN_vkCmdCopyImage>(vkGetInstanceProcAddr(instance, "vkCmdCopyImage"));
  236. vkCmdBlitImage = reinterpret_cast<PFN_vkCmdBlitImage>(vkGetInstanceProcAddr(instance, "vkCmdBlitImage"));
  237. vkDestroyImage = reinterpret_cast<PFN_vkDestroyImage>(vkGetInstanceProcAddr(instance, "vkDestroyImage"));
  238. vkCmdClearAttachments = reinterpret_cast<PFN_vkCmdClearAttachments>(vkGetInstanceProcAddr(instance, "vkCmdClearAttachments"));
  239. vkCmdCopyBuffer = reinterpret_cast<PFN_vkCmdCopyBuffer>(vkGetInstanceProcAddr(instance, "vkCmdCopyBuffer"));
  240. vkCmdCopyBufferToImage = reinterpret_cast<PFN_vkCmdCopyBufferToImage>(vkGetInstanceProcAddr(instance, "vkCmdCopyBufferToImage"));
  241. vkCreateSampler = reinterpret_cast<PFN_vkCreateSampler>(vkGetInstanceProcAddr(instance, "vkCreateSampler"));
  242. vkDestroySampler = reinterpret_cast<PFN_vkDestroySampler>(vkGetInstanceProcAddr(instance, "vkDestroySampler"));;
  243. vkCreateSemaphore = reinterpret_cast<PFN_vkCreateSemaphore>(vkGetInstanceProcAddr(instance, "vkCreateSemaphore"));
  244. vkDestroySemaphore = reinterpret_cast<PFN_vkDestroySemaphore>(vkGetInstanceProcAddr(instance, "vkDestroySemaphore"));
  245. vkCreateFence = reinterpret_cast<PFN_vkCreateFence>(vkGetInstanceProcAddr(instance, "vkCreateFence"));
  246. vkDestroyFence = reinterpret_cast<PFN_vkDestroyFence>(vkGetInstanceProcAddr(instance, "vkDestroyFence"));
  247. vkWaitForFences = reinterpret_cast<PFN_vkWaitForFences>(vkGetInstanceProcAddr(instance, "vkWaitForFences"));
  248. vkResetFences = reinterpret_cast<PFN_vkResetFences>(vkGetInstanceProcAddr(instance, "vkResetFences"));;
  249. vkCreateCommandPool = reinterpret_cast<PFN_vkCreateCommandPool>(vkGetInstanceProcAddr(instance, "vkCreateCommandPool"));
  250. vkDestroyCommandPool = reinterpret_cast<PFN_vkDestroyCommandPool>(vkGetInstanceProcAddr(instance, "vkDestroyCommandPool"));;
  251. vkAllocateCommandBuffers = reinterpret_cast<PFN_vkAllocateCommandBuffers>(vkGetInstanceProcAddr(instance, "vkAllocateCommandBuffers"));
  252. vkBeginCommandBuffer = reinterpret_cast<PFN_vkBeginCommandBuffer>(vkGetInstanceProcAddr(instance, "vkBeginCommandBuffer"));
  253. vkEndCommandBuffer = reinterpret_cast<PFN_vkEndCommandBuffer>(vkGetInstanceProcAddr(instance, "vkEndCommandBuffer"));
  254. vkGetDeviceQueue = reinterpret_cast<PFN_vkGetDeviceQueue>(vkGetInstanceProcAddr(instance, "vkGetDeviceQueue"));
  255. vkQueueSubmit = reinterpret_cast<PFN_vkQueueSubmit>(vkGetInstanceProcAddr(instance, "vkQueueSubmit"));
  256. vkQueueWaitIdle = reinterpret_cast<PFN_vkQueueWaitIdle>(vkGetInstanceProcAddr(instance, "vkQueueWaitIdle"));
  257. vkDeviceWaitIdle = reinterpret_cast<PFN_vkDeviceWaitIdle>(vkGetInstanceProcAddr(instance, "vkDeviceWaitIdle"));
  258. vkCreateFramebuffer = reinterpret_cast<PFN_vkCreateFramebuffer>(vkGetInstanceProcAddr(instance, "vkCreateFramebuffer"));
  259. vkCreatePipelineCache = reinterpret_cast<PFN_vkCreatePipelineCache>(vkGetInstanceProcAddr(instance, "vkCreatePipelineCache"));
  260. vkCreatePipelineLayout = reinterpret_cast<PFN_vkCreatePipelineLayout>(vkGetInstanceProcAddr(instance, "vkCreatePipelineLayout"));
  261. vkCreateGraphicsPipelines = reinterpret_cast<PFN_vkCreateGraphicsPipelines>(vkGetInstanceProcAddr(instance, "vkCreateGraphicsPipelines"));
  262. vkCreateComputePipelines = reinterpret_cast<PFN_vkCreateComputePipelines>(vkGetInstanceProcAddr(instance, "vkCreateComputePipelines"));
  263. vkCreateDescriptorPool = reinterpret_cast<PFN_vkCreateDescriptorPool>(vkGetInstanceProcAddr(instance, "vkCreateDescriptorPool"));
  264. vkCreateDescriptorSetLayout = reinterpret_cast<PFN_vkCreateDescriptorSetLayout>(vkGetInstanceProcAddr(instance, "vkCreateDescriptorSetLayout"));
  265. vkAllocateDescriptorSets = reinterpret_cast<PFN_vkAllocateDescriptorSets>(vkGetInstanceProcAddr(instance, "vkAllocateDescriptorSets"));
  266. vkUpdateDescriptorSets = reinterpret_cast<PFN_vkUpdateDescriptorSets>(vkGetInstanceProcAddr(instance, "vkUpdateDescriptorSets"));
  267. vkCmdBindDescriptorSets = reinterpret_cast<PFN_vkCmdBindDescriptorSets>(vkGetInstanceProcAddr(instance, "vkCmdBindDescriptorSets"));
  268. vkCmdBindPipeline = reinterpret_cast<PFN_vkCmdBindPipeline>(vkGetInstanceProcAddr(instance, "vkCmdBindPipeline"));
  269. vkCmdBindVertexBuffers = reinterpret_cast<PFN_vkCmdBindVertexBuffers>(vkGetInstanceProcAddr(instance, "vkCmdBindVertexBuffers"));
  270. vkCmdBindIndexBuffer = reinterpret_cast<PFN_vkCmdBindIndexBuffer>(vkGetInstanceProcAddr(instance, "vkCmdBindIndexBuffer"));
  271. vkCmdSetViewport = reinterpret_cast<PFN_vkCmdSetViewport>(vkGetInstanceProcAddr(instance, "vkCmdSetViewport"));
  272. vkCmdSetScissor = reinterpret_cast<PFN_vkCmdSetScissor>(vkGetInstanceProcAddr(instance, "vkCmdSetScissor"));
  273. vkCmdSetLineWidth = reinterpret_cast<PFN_vkCmdSetLineWidth>(vkGetInstanceProcAddr(instance, "vkCmdSetLineWidth"));
  274. vkCmdSetDepthBias = reinterpret_cast<PFN_vkCmdSetDepthBias>(vkGetInstanceProcAddr(instance, "vkCmdSetDepthBias"));
  275. vkCmdPushConstants = reinterpret_cast<PFN_vkCmdPushConstants>(vkGetInstanceProcAddr(instance, "vkCmdPushConstants"));;
  276. vkCmdDrawIndexed = reinterpret_cast<PFN_vkCmdDrawIndexed>(vkGetInstanceProcAddr(instance, "vkCmdDrawIndexed"));
  277. vkCmdDraw = reinterpret_cast<PFN_vkCmdDraw>(vkGetInstanceProcAddr(instance, "vkCmdDraw"));
  278. vkCmdDrawIndexedIndirect = reinterpret_cast<PFN_vkCmdDrawIndexedIndirect>(vkGetInstanceProcAddr(instance, "vkCmdDrawIndexedIndirect"));
  279. vkCmdDrawIndirect = reinterpret_cast<PFN_vkCmdDrawIndirect>(vkGetInstanceProcAddr(instance, "vkCmdDrawIndirect"));
  280. vkCmdDispatch = reinterpret_cast<PFN_vkCmdDispatch>(vkGetInstanceProcAddr(instance, "vkCmdDispatch"));
  281. vkDestroyPipeline = reinterpret_cast<PFN_vkDestroyPipeline>(vkGetInstanceProcAddr(instance, "vkDestroyPipeline"));
  282. vkDestroyPipelineLayout = reinterpret_cast<PFN_vkDestroyPipelineLayout>(vkGetInstanceProcAddr(instance, "vkDestroyPipelineLayout"));;
  283. vkDestroyDescriptorSetLayout = reinterpret_cast<PFN_vkDestroyDescriptorSetLayout>(vkGetInstanceProcAddr(instance, "vkDestroyDescriptorSetLayout"));
  284. vkDestroyDevice = reinterpret_cast<PFN_vkDestroyDevice>(vkGetInstanceProcAddr(instance, "vkDestroyDevice"));
  285. vkDestroyInstance = reinterpret_cast<PFN_vkDestroyInstance>(vkGetInstanceProcAddr(instance, "vkDestroyInstance"));
  286. vkDestroyDescriptorPool = reinterpret_cast<PFN_vkDestroyDescriptorPool>(vkGetInstanceProcAddr(instance, "vkDestroyDescriptorPool"));
  287. vkFreeCommandBuffers = reinterpret_cast<PFN_vkFreeCommandBuffers>(vkGetInstanceProcAddr(instance, "vkFreeCommandBuffers"));
  288. vkDestroyRenderPass = reinterpret_cast<PFN_vkDestroyRenderPass>(vkGetInstanceProcAddr(instance, "vkDestroyRenderPass"));
  289. vkDestroyFramebuffer = reinterpret_cast<PFN_vkDestroyFramebuffer>(vkGetInstanceProcAddr(instance, "vkDestroyFramebuffer"));
  290. vkDestroyShaderModule = reinterpret_cast<PFN_vkDestroyShaderModule>(vkGetInstanceProcAddr(instance, "vkDestroyShaderModule"));
  291. vkDestroyPipelineCache = reinterpret_cast<PFN_vkDestroyPipelineCache>(vkGetInstanceProcAddr(instance, "vkDestroyPipelineCache"));
  292. vkCreateQueryPool = reinterpret_cast<PFN_vkCreateQueryPool>(vkGetInstanceProcAddr(instance, "vkCreateQueryPool"));
  293. vkDestroyQueryPool = reinterpret_cast<PFN_vkDestroyQueryPool>(vkGetInstanceProcAddr(instance, "vkDestroyQueryPool"));
  294. vkGetQueryPoolResults = reinterpret_cast<PFN_vkGetQueryPoolResults>(vkGetInstanceProcAddr(instance, "vkGetQueryPoolResults"));
  295. vkCmdBeginQuery = reinterpret_cast<PFN_vkCmdBeginQuery>(vkGetInstanceProcAddr(instance, "vkCmdBeginQuery"));
  296. vkCmdEndQuery = reinterpret_cast<PFN_vkCmdEndQuery>(vkGetInstanceProcAddr(instance, "vkCmdEndQuery"));
  297. vkCmdResetQueryPool = reinterpret_cast<PFN_vkCmdResetQueryPool>(vkGetInstanceProcAddr(instance, "vkCmdResetQueryPool"));
  298. vkCmdCopyQueryPoolResults = reinterpret_cast<PFN_vkCmdCopyQueryPoolResults>(vkGetInstanceProcAddr(instance, "vkCmdCopyQueryPoolResults"));
  299. vkCreateAndroidSurfaceKHR = reinterpret_cast<PFN_vkCreateAndroidSurfaceKHR>(vkGetInstanceProcAddr(instance, "vkCreateAndroidSurfaceKHR"));
  300. vkDestroySurfaceKHR = reinterpret_cast<PFN_vkDestroySurfaceKHR>(vkGetInstanceProcAddr(instance, "vkDestroySurfaceKHR"));
  301. #endif
  302. }
  303. PFN_vkCreateDebugReportCallbackEXT vkCreateDebugReportCallbackEXT;
  304. PFN_vkDestroyDebugReportCallbackEXT vkDestroyDebugReportCallbackEXT;
  305. PFN_vkDebugReportMessageEXT vkDebugReportMessageEXT;
  306. PFN_vkGetPhysicalDeviceSurfaceSupportKHR vkGetPhysicalDeviceSurfaceSupportKHR;
  307. PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR vkGetPhysicalDeviceSurfaceCapabilitiesKHR;
  308. PFN_vkGetPhysicalDeviceSurfaceFormatsKHR vkGetPhysicalDeviceSurfaceFormatsKHR;
  309. PFN_vkGetPhysicalDeviceSurfacePresentModesKHR vkGetPhysicalDeviceSurfacePresentModesKHR;
  310. PFN_vkCreateSwapchainKHR vkCreateSwapchainKHR;
  311. PFN_vkDestroySwapchainKHR vkDestroySwapchainKHR;
  312. PFN_vkGetSwapchainImagesKHR vkGetSwapchainImagesKHR;
  313. PFN_vkAcquireNextImageKHR vkAcquireNextImageKHR;
  314. PFN_vkQueuePresentKHR vkQueuePresentKHR;
  315. std::string to_vulkan_error_string(VkResult result)
  316. {
  317. switch (result)
  318. {
  319. #define STR(r) case VK_ ##r: return #r
  320. STR(NOT_READY);
  321. STR(TIMEOUT);
  322. STR(EVENT_SET);
  323. STR(EVENT_RESET);
  324. STR(INCOMPLETE);
  325. STR(ERROR_OUT_OF_HOST_MEMORY);
  326. STR(ERROR_OUT_OF_DEVICE_MEMORY);
  327. STR(ERROR_INITIALIZATION_FAILED);
  328. STR(ERROR_DEVICE_LOST);
  329. STR(ERROR_MEMORY_MAP_FAILED);
  330. STR(ERROR_LAYER_NOT_PRESENT);
  331. STR(ERROR_EXTENSION_NOT_PRESENT);
  332. STR(ERROR_FEATURE_NOT_PRESENT);
  333. STR(ERROR_INCOMPATIBLE_DRIVER);
  334. STR(ERROR_TOO_MANY_OBJECTS);
  335. STR(ERROR_FORMAT_NOT_SUPPORTED);
  336. STR(ERROR_SURFACE_LOST_KHR);
  337. STR(ERROR_NATIVE_WINDOW_IN_USE_KHR);
  338. STR(SUBOPTIMAL_KHR);
  339. STR(ERROR_OUT_OF_DATE_KHR);
  340. STR(ERROR_INCOMPATIBLE_DISPLAY_KHR);
  341. STR(ERROR_VALIDATION_FAILED_EXT);
  342. STR(ERROR_INVALID_SHADER_NV);
  343. #undef STR
  344. default:
  345. return "UNKNOWN_ERROR";
  346. }
  347. }
  348. }