/* * Assorted Vulkan helper functions * * Copyright (C) 2016 by Sascha Willems - www.saschawillems.de * * This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT) */ #pragma once #include "vulkan/vulkan.h" #include "VulkanInitializers.hpp" #include #include #include #include #include #include #include #include #include #include #if defined(_WIN32) #include #include #include #elif defined(__ANDROID__) #include "vulkanandroid.h" #include #endif // Custom define for better code readability #define VK_FLAGS_NONE 0 // Default fence timeout in nanoseconds #define DEFAULT_FENCE_TIMEOUT 100000000000 // Macro to check and display Vulkan return results #if defined(__ANDROID__) #define VK_CHECK_RESULT(f) \ { \ VkResult res = (f); \ if (res != VK_SUCCESS) \ { \ LOGE("Fatal : VkResult is \" %s \" in %s at line %d", vkTools::errorString(res).c_str(), __FILE__, __LINE__); \ assert(res == VK_SUCCESS); \ } \ } #else #define VK_CHECK_RESULT(f) \ { \ VkResult res = (f); \ if (res != VK_SUCCESS) \ { \ std::cout << "Fatal : VkResult is \"" << vkTools::errorString(res) << "\" in " << __FILE__ << " at line " << __LINE__ << std::endl; \ assert(res == VK_SUCCESS); \ } \ } #endif namespace vkTools { // Return string representation of a vulkan error string std::string errorString(VkResult errorCode); // Selected a suitable supported depth format starting with 32 bit down to 16 bit // Returns false if none of the depth formats in the list is supported by the device VkBool32 getSupportedDepthFormat(VkPhysicalDevice physicalDevice, VkFormat *depthFormat); // Put an image memory barrier for setting an image layout on the sub resource into the given command buffer void setImageLayout( VkCommandBuffer cmdbuffer, VkImage image, VkImageAspectFlags aspectMask, VkImageLayout oldImageLayout, VkImageLayout newImageLayout, VkImageSubresourceRange subresourceRange, VkPipelineStageFlags srcStageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT); // Uses a fixed sub resource layout with first mip level and layer void setImageLayout( VkCommandBuffer cmdbuffer, VkImage image, VkImageAspectFlags aspectMask, VkImageLayout oldImageLayout, VkImageLayout newImageLayout, VkPipelineStageFlags srcStageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT); // Display error message and exit on fatal error void exitFatal(std::string message, std::string caption); // Load a SPIR-V shader (binary) #if defined(__ANDROID__) VkShaderModule loadShader(AAssetManager* assetManager, const char *fileName, VkDevice device, VkShaderStageFlagBits stage); #else VkShaderModule loadShader(const char *fileName, VkDevice device, VkShaderStageFlagBits stage); #endif // Load a GLSL shader (text) // Note: GLSL support requires vendor-specific extensions to be enabled and is not a core-feature of Vulkan VkShaderModule loadShaderGLSL(const char *fileName, VkDevice device, VkShaderStageFlagBits stage); }