2 #include <ThirdParty/EASTL-master/include/EASTL/vector.h> 7 #include <ThirdParty/glfw-3.2.1/x64/include/GLFW/glfw3.h> 8 #include <ThirdParty/glfw-3.2.1/x64/include/GLFW/glfw3native.h> 10 #include <ThirdParty/glfw-3.2.1/x86/include/GLFW/glfw3.h> 11 #include <ThirdParty/glfw-3.2.1/x86/include/GLFW/glfw3native.h> 16 #include <ThirdParty/EASTL-master/include/EASTL/string.h> 19 static VkResult CreateDebugReportCallbackEXT(VkInstance instance,
const VkDebugReportCallbackCreateInfoEXT* pCreateInfo,
const VkAllocationCallbacks* pAllocator, VkDebugReportCallbackEXT* pCallback) {
20 auto func = (PFN_vkCreateDebugReportCallbackEXT)vkGetInstanceProcAddr(instance,
"vkCreateDebugReportCallbackEXT");
21 if (func !=
nullptr) {
22 return func(instance, pCreateInfo, pAllocator, pCallback);
25 return VK_ERROR_EXTENSION_NOT_PRESENT;
28 static void DestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT callback,
const VkAllocationCallbacks* pAllocator) {
29 auto func = (PFN_vkDestroyDebugReportCallbackEXT)vkGetInstanceProcAddr(instance,
"vkDestroyDebugReportCallbackEXT");
30 if (func !=
nullptr) {
31 func(instance, callback, pAllocator);
35 static VKAPI_ATTR VkBool32 VKAPI_CALL defaultDebugCallback(
36 VkDebugReportFlagsEXT flags,
37 VkDebugReportObjectTypeEXT objType,
41 const char* layerPrefix,
46 case VK_DEBUG_REPORT_INFORMATION_BIT_EXT:
49 case VK_DEBUG_REPORT_WARNING_BIT_EXT:
50 stream +=
"[WARNING] ";
52 case VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT:
53 stream +=
"[PERFORMANCE] ";
55 case VK_DEBUG_REPORT_ERROR_BIT_EXT:
58 case VK_DEBUG_REPORT_DEBUG_BIT_EXT:
63 stream += layerPrefix;
70 stream +=
"] [LOCATION:";
71 stream += char(location);
75 std::cout << stream.c_str() << std::endl;
81 VulkanInstance::VulkanInstance(
bool debugEnabled, DebugLevel debugLevel, VulkanAppData engineData, VulkanAppData appData, PFN_vkDebugReportCallbackEXT debugCallback)
83 VkApplicationInfo appInfo = {};
84 appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
85 appInfo.pEngineName = engineData.appName;
86 appInfo.engineVersion = VK_MAKE_VERSION(engineData.versionMajor, engineData.versionMinor, engineData.versionPatch);
87 appInfo.pApplicationName = appData.appName;
88 appInfo.applicationVersion = VK_MAKE_VERSION(appData.versionMajor, appData.versionMinor, appData.versionPatch);
89 appInfo.apiVersion = VK_API_VERSION_1_0;
91 VkInstanceCreateInfo createInfo = {};
92 createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
93 createInfo.pApplicationInfo = &appInfo;
95 unsigned int glfwExtensionsCount = 0;
96 const char** glfwExtensionsConst;
97 char** glfwExtensions;
98 glfwExtensionsConst = glfwGetRequiredInstanceExtensions(&glfwExtensionsCount);
99 glfwExtensions = (
char**)glfwExtensionsConst;
101 eastl::vector<const char*> extensions;
102 for (
unsigned int i = 0; i < glfwExtensionsCount; i++) {
103 extensions.push_back(glfwExtensions[i]);
106 extensions.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
109 createInfo.enabledExtensionCount =
static_cast<uint32_t
>(extensions.size());
110 createInfo.ppEnabledExtensionNames = extensions.data();
112 eastl::vector<const char*> layers;
114 layers.push_back(
"VK_LAYER_LUNARG_standard_validation");
118 createInfo.enabledLayerCount =
static_cast<uint32_t
>(layers.size());
119 createInfo.ppEnabledLayerNames = layers.data();
121 VkResult res = vkCreateInstance(&createInfo,
nullptr, &instance);
122 if (res != VK_SUCCESS) {
123 eastl::string s = eastl::string(
"[ERROR] [CODE:") + std::to_string(res).c_str() +
"] Creating vulkan instance failed";
124 std::cout << s.c_str() << std::endl;
127 this->debugEnabled = (debugLevel == DebugLevel::LEVEL_NONE) ?
false : debugEnabled;
129 if (this->debugEnabled) {
130 VkDebugReportCallbackCreateInfoEXT debugCreateInfo = {};
131 debugCreateInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT;
132 debugCreateInfo.flags =
static_cast<uint32_t
>(debugLevel);
133 debugCreateInfo.pfnCallback = (debugCallback ==
nullptr) ? defaultDebugCallback : debugCallback;
135 VkResult res = CreateDebugReportCallbackEXT(instance, &debugCreateInfo,
nullptr, &debugReportCallback);
139 VulkanInstance::~VulkanInstance()
142 DestroyDebugReportCallbackEXT(instance, debugReportCallback,
nullptr);
143 vkDestroyInstance(instance,
nullptr);
146 VkInstance VulkanInstance::GetInstance() const noexcept
152 #endif // USING_VULKAN