#pragma once #include "Defines.h" #include "Logging.h" #include "vulkan/vulkan.h" #if GP_PLATFORM_WINDOWS # define VK_USE_PLATFORM_WIN32_KHR #elif GP_PLATFORM_LINUX # define VK_USE_PLATFORM_XLIB_KHR #elif GP_PLATFORM_MACOS # define VK_USE_PLATFORM_MACOS_MVK #elif GP_PLATFORM_IOS # define VK_USE_PLATFORM_IOS_MVK #elif GP_PLATFORM_ANDROID # define VK_USE_PLATFORM_ANDROID_KHR #else # error Unsupported renderer platform #endif namespace gameplay { const std::vector vulkan_validation_layers = { "VK_LAYER_LUNARG_standard_validation" }; std::string to_vulkan_error_string(VkResult result); static void check_vulkan_result(VkResult res) { if (res != VK_SUCCESS) { GP_LOG_ERROR("Fatal: VkResult is: %s, file: %s, line: %s", to_vulkan_error_string(res), __FILE__, __LINE__); GP_ASSERT(res == VK_SUCCESS); if (res < 0) abort(); } } #define VK_CHECK_RESULT(f) \ { \ VkResult res = (f); \ if (res != VK_SUCCESS) \ { \ GP_LOG_ERROR("Fatal: VkResult is: %s, file: %s, line: %s", to_vulkan_error_string(res), __FILE__, __LINE__); \ GP_ASSERT(res == VK_SUCCESS); \ if (res < 0) \ abort(); \ } \ } VkBool32 log_vulkan_validation_debug_report(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject, size_t location, int32_t msgCode, const char* layerPrefix, const char* msg, void* userPtr) { std::string prefix(""); if (flags & VK_DEBUG_REPORT_ERROR_BIT_EXT) prefix += "ERROR:"; if (flags & VK_DEBUG_REPORT_WARNING_BIT_EXT) prefix += "WARNING:"; if (flags & VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT) prefix += "PERFORMANCE:"; if (flags & VK_DEBUG_REPORT_INFORMATION_BIT_EXT) prefix += "INFO:"; if (flags & VK_DEBUG_REPORT_DEBUG_BIT_EXT) prefix += "DEBUG:"; GP_LOG_DEBUG("%s [%s] Code: %d:%s", prefix.c_str(), layerPrefix, msgCode, msg); return VK_FALSE; } #if GP_PLATFORM_ANDROID #include #include PFN_vkCreateInstance vkCreateInstance; PFN_vkGetDeviceProcAddr vkGetDeviceProcAddr; PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr; PFN_vkCreateDevice vkCreateDevice; PFN_vkEnumeratePhysicalDevices vkEnumeratePhysicalDevices; PFN_vkGetPhysicalDeviceProperties vkGetPhysicalDeviceProperties; PFN_vkEnumerateDeviceExtensionProperties vkEnumerateDeviceExtensionProperties; PFN_vkEnumerateDeviceLayerProperties vkEnumerateDeviceLayerProperties; PFN_vkGetPhysicalDeviceFormatProperties vkGetPhysicalDeviceFormatProperties; PFN_vkGetPhysicalDeviceFeatures vkGetPhysicalDeviceFeatures; PFN_vkGetPhysicalDeviceQueueFamilyProperties vkGetPhysicalDeviceQueueFamilyProperties; PFN_vkGetPhysicalDeviceMemoryProperties vkGetPhysicalDeviceMemoryProperties; PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties; PFN_vkEnumerateInstanceLayerProperties vkEnumerateInstanceLayerProperties; PFN_vkCmdPipelineBarrier vkCmdPipelineBarrier; PFN_vkCreateShaderModule vkCreateShaderModule; PFN_vkCreateBuffer vkCreateBuffer; PFN_vkGetBufferMemoryRequirements vkGetBufferMemoryRequirements; PFN_vkMapMemory vkMapMemory; PFN_vkUnmapMemory vkUnmapMemory; PFN_vkFlushMappedMemoryRanges vkFlushMappedMemoryRanges; PFN_vkInvalidateMappedMemoryRanges vkInvalidateMappedMemoryRanges; PFN_vkBindBufferMemory vkBindBufferMemory; PFN_vkDestroyBuffer vkDestroyBuffer; PFN_vkAllocateMemory vkAllocateMemory; PFN_vkBindImageMemory vkBindImageMemory; PFN_vkGetImageSubresourceLayout vkGetImageSubresourceLayout; PFN_vkCmdCopyBuffer vkCmdCopyBuffer; PFN_vkCmdCopyBufferToImage vkCmdCopyBufferToImage; PFN_vkCmdCopyImage vkCmdCopyImage; PFN_vkCmdBlitImage vkCmdBlitImage; PFN_vkCmdClearAttachments vkCmdClearAttachments; PFN_vkCreateSampler vkCreateSampler; PFN_vkDestroySampler vkDestroySampler; PFN_vkDestroyImage vkDestroyImage; PFN_vkFreeMemory vkFreeMemory; PFN_vkCreateRenderPass vkCreateRenderPass; PFN_vkCmdBeginRenderPass vkCmdBeginRenderPass; PFN_vkCmdEndRenderPass vkCmdEndRenderPass; PFN_vkCmdExecuteCommands vkCmdExecuteCommands; PFN_vkCreateImage vkCreateImage; PFN_vkGetImageMemoryRequirements vkGetImageMemoryRequirements; PFN_vkCreateImageView vkCreateImageView; PFN_vkDestroyImageView vkDestroyImageView; PFN_vkCreateSemaphore vkCreateSemaphore; PFN_vkDestroySemaphore vkDestroySemaphore; PFN_vkCreateFence vkCreateFence; PFN_vkDestroyFence vkDestroyFence; PFN_vkWaitForFences vkWaitForFences; PFN_vkResetFences vkResetFences; PFN_vkCreateCommandPool vkCreateCommandPool; PFN_vkDestroyCommandPool vkDestroyCommandPool; PFN_vkAllocateCommandBuffers vkAllocateCommandBuffers; PFN_vkBeginCommandBuffer vkBeginCommandBuffer; PFN_vkEndCommandBuffer vkEndCommandBuffer; PFN_vkGetDeviceQueue vkGetDeviceQueue; PFN_vkQueueSubmit vkQueueSubmit; PFN_vkQueueWaitIdle vkQueueWaitIdle; PFN_vkDeviceWaitIdle vkDeviceWaitIdle; PFN_vkCreateFramebuffer vkCreateFramebuffer; PFN_vkCreatePipelineCache vkCreatePipelineCache; PFN_vkCreatePipelineLayout vkCreatePipelineLayout; PFN_vkCreateGraphicsPipelines vkCreateGraphicsPipelines; PFN_vkCreateComputePipelines vkCreateComputePipelines; PFN_vkCreateDescriptorPool vkCreateDescriptorPool; PFN_vkCreateDescriptorSetLayout vkCreateDescriptorSetLayout; PFN_vkAllocateDescriptorSets vkAllocateDescriptorSets; PFN_vkUpdateDescriptorSets vkUpdateDescriptorSets; PFN_vkCmdBindDescriptorSets vkCmdBindDescriptorSets; PFN_vkCmdBindPipeline vkCmdBindPipeline; PFN_vkCmdBindVertexBuffers vkCmdBindVertexBuffers; PFN_vkCmdBindIndexBuffer vkCmdBindIndexBuffer; PFN_vkCmdSetViewport vkCmdSetViewport; PFN_vkCmdSetScissor vkCmdSetScissor; PFN_vkCmdSetLineWidth vkCmdSetLineWidth; PFN_vkCmdSetDepthBias vkCmdSetDepthBias; PFN_vkCmdPushConstants vkCmdPushConstants; PFN_vkCmdDrawIndexed vkCmdDrawIndexed; PFN_vkCmdDraw vkCmdDraw; PFN_vkCmdDrawIndexedIndirect vkCmdDrawIndexedIndirect; PFN_vkCmdDrawIndirect vkCmdDrawIndirect; PFN_vkCmdDispatch vkCmdDispatch; PFN_vkDestroyPipeline vkDestroyPipeline; PFN_vkDestroyPipelineLayout vkDestroyPipelineLayout; PFN_vkDestroyDescriptorSetLayout vkDestroyDescriptorSetLayout; PFN_vkDestroyDevice vkDestroyDevice; PFN_vkDestroyInstance vkDestroyInstance; PFN_vkDestroyDescriptorPool vkDestroyDescriptorPool; PFN_vkFreeCommandBuffers vkFreeCommandBuffers; PFN_vkDestroyRenderPass vkDestroyRenderPass; PFN_vkDestroyFramebuffer vkDestroyFramebuffer; PFN_vkDestroyShaderModule vkDestroyShaderModule; PFN_vkDestroyPipelineCache vkDestroyPipelineCache; PFN_vkCreateQueryPool vkCreateQueryPool; PFN_vkDestroyQueryPool vkDestroyQueryPool; PFN_vkGetQueryPoolResults vkGetQueryPoolResults; PFN_vkCmdBeginQuery vkCmdBeginQuery; PFN_vkCmdEndQuery vkCmdEndQuery; PFN_vkCmdResetQueryPool vkCmdResetQueryPool; PFN_vkCmdCopyQueryPoolResults vkCmdCopyQueryPoolResults; PFN_vkCreateAndroidSurfaceKHR vkCreateAndroidSurfaceKHR; PFN_vkDestroySurfaceKHR vkDestroySurfaceKHR; void* libVulkan; #endif static void load_vulkan_library() { #if GP_PLATFORM_ANDROID __android_log_print(ANDROID_LOG_INFO, "vulkanandroid", "Loading libvulkan.so...\n"); // Load the vulkan library libVulkan = dlopen("libvulkan.so", RTLD_NOW | RTLD_LOCAL); if (!libVulkan) { __android_log_print(ANDROID_LOG_INFO, "vulkanandroid", "Could not load vulkan library : %s!\n", dlerror()); return false; } // Load base function pointers vkEnumerateInstanceExtensionProperties = reinterpret_cast(dlsym(libVulkan, "vkEnumerateInstanceExtensionProperties")); vkEnumerateInstanceLayerProperties = reinterpret_cast(dlsym(libVulkan, "vkEnumerateInstanceLayerProperties")); vkCreateInstance = reinterpret_cast(dlsym(libVulkan, "vkCreateInstance")); vkGetInstanceProcAddr = reinterpret_cast(dlsym(libVulkan, "vkGetInstanceProcAddr")); vkGetDeviceProcAddr = reinterpret_cast(dlsym(libVulkan, "vkGetDeviceProcAddr")); #elif GP_PLATFORM_LINUX //initxcbConnection(); #endif } static void unload_vulkan_library() { #if GP_PLATFORM_ANDROID dlclose(libVulkan); #endif } static void load_vulkan_functions() { #if GP_PLATFORM_ANDROID __android_log_print(ANDROID_LOG_INFO, "vulkanandroid", "Loading instance based function pointers...\n"); vkEnumeratePhysicalDevices = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkEnumeratePhysicalDevices")); vkGetPhysicalDeviceProperties = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceProperties")); vkEnumerateDeviceLayerProperties = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkEnumerateDeviceLayerProperties")); vkEnumerateDeviceExtensionProperties = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkEnumerateDeviceExtensionProperties")); vkGetPhysicalDeviceQueueFamilyProperties = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceQueueFamilyProperties")); vkGetPhysicalDeviceFeatures = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceFeatures")); vkCreateDevice = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCreateDevice")); vkGetPhysicalDeviceFormatProperties = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceFormatProperties")); vkGetPhysicalDeviceMemoryProperties = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkGetPhysicalDeviceMemoryProperties")); vkCmdPipelineBarrier = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCmdPipelineBarrier")); vkCreateShaderModule = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCreateShaderModule")); vkCreateBuffer = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCreateBuffer")); vkGetBufferMemoryRequirements = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkGetBufferMemoryRequirements")); vkMapMemory = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkMapMemory")); vkUnmapMemory = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkUnmapMemory")); vkFlushMappedMemoryRanges = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkFlushMappedMemoryRanges")); vkInvalidateMappedMemoryRanges = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkInvalidateMappedMemoryRanges")); vkBindBufferMemory = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkBindBufferMemory")); vkDestroyBuffer = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkDestroyBuffer")); vkAllocateMemory = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkAllocateMemory")); vkFreeMemory = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkFreeMemory")); vkCreateRenderPass = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCreateRenderPass")); vkCmdBeginRenderPass = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCmdBeginRenderPass")); vkCmdEndRenderPass = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCmdEndRenderPass")); vkCmdExecuteCommands = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCmdExecuteCommands")); vkCreateImage = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCreateImage")); vkGetImageMemoryRequirements = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkGetImageMemoryRequirements")); vkCreateImageView = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCreateImageView")); vkDestroyImageView = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkDestroyImageView")); vkBindImageMemory = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkBindImageMemory")); vkGetImageSubresourceLayout = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkGetImageSubresourceLayout")); vkCmdCopyImage = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCmdCopyImage")); vkCmdBlitImage = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCmdBlitImage")); vkDestroyImage = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkDestroyImage")); vkCmdClearAttachments = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCmdClearAttachments")); vkCmdCopyBuffer = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCmdCopyBuffer")); vkCmdCopyBufferToImage = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCmdCopyBufferToImage")); vkCreateSampler = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCreateSampler")); vkDestroySampler = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkDestroySampler"));; vkCreateSemaphore = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCreateSemaphore")); vkDestroySemaphore = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkDestroySemaphore")); vkCreateFence = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCreateFence")); vkDestroyFence = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkDestroyFence")); vkWaitForFences = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkWaitForFences")); vkResetFences = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkResetFences"));; vkCreateCommandPool = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCreateCommandPool")); vkDestroyCommandPool = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkDestroyCommandPool"));; vkAllocateCommandBuffers = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkAllocateCommandBuffers")); vkBeginCommandBuffer = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkBeginCommandBuffer")); vkEndCommandBuffer = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkEndCommandBuffer")); vkGetDeviceQueue = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkGetDeviceQueue")); vkQueueSubmit = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkQueueSubmit")); vkQueueWaitIdle = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkQueueWaitIdle")); vkDeviceWaitIdle = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkDeviceWaitIdle")); vkCreateFramebuffer = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCreateFramebuffer")); vkCreatePipelineCache = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCreatePipelineCache")); vkCreatePipelineLayout = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCreatePipelineLayout")); vkCreateGraphicsPipelines = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCreateGraphicsPipelines")); vkCreateComputePipelines = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCreateComputePipelines")); vkCreateDescriptorPool = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCreateDescriptorPool")); vkCreateDescriptorSetLayout = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCreateDescriptorSetLayout")); vkAllocateDescriptorSets = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkAllocateDescriptorSets")); vkUpdateDescriptorSets = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkUpdateDescriptorSets")); vkCmdBindDescriptorSets = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCmdBindDescriptorSets")); vkCmdBindPipeline = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCmdBindPipeline")); vkCmdBindVertexBuffers = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCmdBindVertexBuffers")); vkCmdBindIndexBuffer = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCmdBindIndexBuffer")); vkCmdSetViewport = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCmdSetViewport")); vkCmdSetScissor = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCmdSetScissor")); vkCmdSetLineWidth = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCmdSetLineWidth")); vkCmdSetDepthBias = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCmdSetDepthBias")); vkCmdPushConstants = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCmdPushConstants"));; vkCmdDrawIndexed = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCmdDrawIndexed")); vkCmdDraw = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCmdDraw")); vkCmdDrawIndexedIndirect = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCmdDrawIndexedIndirect")); vkCmdDrawIndirect = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCmdDrawIndirect")); vkCmdDispatch = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCmdDispatch")); vkDestroyPipeline = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkDestroyPipeline")); vkDestroyPipelineLayout = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkDestroyPipelineLayout"));; vkDestroyDescriptorSetLayout = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkDestroyDescriptorSetLayout")); vkDestroyDevice = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkDestroyDevice")); vkDestroyInstance = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkDestroyInstance")); vkDestroyDescriptorPool = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkDestroyDescriptorPool")); vkFreeCommandBuffers = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkFreeCommandBuffers")); vkDestroyRenderPass = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkDestroyRenderPass")); vkDestroyFramebuffer = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkDestroyFramebuffer")); vkDestroyShaderModule = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkDestroyShaderModule")); vkDestroyPipelineCache = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkDestroyPipelineCache")); vkCreateQueryPool = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCreateQueryPool")); vkDestroyQueryPool = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkDestroyQueryPool")); vkGetQueryPoolResults = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkGetQueryPoolResults")); vkCmdBeginQuery = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCmdBeginQuery")); vkCmdEndQuery = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCmdEndQuery")); vkCmdResetQueryPool = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCmdResetQueryPool")); vkCmdCopyQueryPoolResults = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCmdCopyQueryPoolResults")); vkCreateAndroidSurfaceKHR = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCreateAndroidSurfaceKHR")); vkDestroySurfaceKHR = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkDestroySurfaceKHR")); #endif } PFN_vkCreateDebugReportCallbackEXT vkCreateDebugReportCallbackEXT; PFN_vkDestroyDebugReportCallbackEXT vkDestroyDebugReportCallbackEXT; PFN_vkDebugReportMessageEXT vkDebugReportMessageEXT; PFN_vkGetPhysicalDeviceSurfaceSupportKHR vkGetPhysicalDeviceSurfaceSupportKHR; PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR vkGetPhysicalDeviceSurfaceCapabilitiesKHR; PFN_vkGetPhysicalDeviceSurfaceFormatsKHR vkGetPhysicalDeviceSurfaceFormatsKHR; PFN_vkGetPhysicalDeviceSurfacePresentModesKHR vkGetPhysicalDeviceSurfacePresentModesKHR; PFN_vkCreateSwapchainKHR vkCreateSwapchainKHR; PFN_vkDestroySwapchainKHR vkDestroySwapchainKHR; PFN_vkGetSwapchainImagesKHR vkGetSwapchainImagesKHR; PFN_vkAcquireNextImageKHR vkAcquireNextImageKHR; PFN_vkQueuePresentKHR vkQueuePresentKHR; std::string to_vulkan_error_string(VkResult result) { switch (result) { #define STR(r) case VK_ ##r: return #r STR(NOT_READY); STR(TIMEOUT); STR(EVENT_SET); STR(EVENT_RESET); STR(INCOMPLETE); STR(ERROR_OUT_OF_HOST_MEMORY); STR(ERROR_OUT_OF_DEVICE_MEMORY); STR(ERROR_INITIALIZATION_FAILED); STR(ERROR_DEVICE_LOST); STR(ERROR_MEMORY_MAP_FAILED); STR(ERROR_LAYER_NOT_PRESENT); STR(ERROR_EXTENSION_NOT_PRESENT); STR(ERROR_FEATURE_NOT_PRESENT); STR(ERROR_INCOMPATIBLE_DRIVER); STR(ERROR_TOO_MANY_OBJECTS); STR(ERROR_FORMAT_NOT_SUPPORTED); STR(ERROR_SURFACE_LOST_KHR); STR(ERROR_NATIVE_WINDOW_IN_USE_KHR); STR(SUBOPTIMAL_KHR); STR(ERROR_OUT_OF_DATE_KHR); STR(ERROR_INCOMPATIBLE_DISPLAY_KHR); STR(ERROR_VALIDATION_FAILED_EXT); STR(ERROR_INVALID_SHADER_NV); #undef STR default: return "UNKNOWN_ERROR"; } } }