Engine
Frameworkcreatedbymeusableforthecreationofsimplegames.CurrentlysupportsOpenGL(Verysimple)andVulkan.
VulkanInstance.cpp
Go to the documentation of this file.
2 #include <ThirdParty/EASTL-master/include/EASTL/vector.h>
3 
4 #ifdef USING_VULKAN
5 
6 #if _WIN64
7 #include <ThirdParty/glfw-3.2.1/x64/include/GLFW/glfw3.h>
8 #include <ThirdParty/glfw-3.2.1/x64/include/GLFW/glfw3native.h>
9 #else
10 #include <ThirdParty/glfw-3.2.1/x86/include/GLFW/glfw3.h>
11 #include <ThirdParty/glfw-3.2.1/x86/include/GLFW/glfw3native.h>
12 #endif
13 
14 #include <iostream>
15 #include <sstream>
16 #include <ThirdParty/EASTL-master/include/EASTL/string.h>
17 
18 
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);
23  }
24  else {
25  return VK_ERROR_EXTENSION_NOT_PRESENT;
26  }
27 }
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);
32  }
33 }
34 
35 static VKAPI_ATTR VkBool32 VKAPI_CALL defaultDebugCallback(
36  VkDebugReportFlagsEXT flags,
37  VkDebugReportObjectTypeEXT objType,
38  uint64_t obj,
39  size_t location,
40  int32_t code,
41  const char* layerPrefix,
42  const char* msg,
43  void* userData) {
44  eastl::string stream;
45  switch (flags) {
46  case VK_DEBUG_REPORT_INFORMATION_BIT_EXT:
47  stream += "[INFO] ";
48  break;
49  case VK_DEBUG_REPORT_WARNING_BIT_EXT:
50  stream += "[WARNING] ";
51  break;
52  case VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT:
53  stream += "[PERFORMANCE] ";
54  break;
55  case VK_DEBUG_REPORT_ERROR_BIT_EXT:
56  stream += "[ERROR] ";
57  break;
58  case VK_DEBUG_REPORT_DEBUG_BIT_EXT:
59  stream += "[DEBUG] ";
60  break;
61  }
62  stream += "[LAYER:";
63  stream += layerPrefix;
64  stream += "] ";
65  stream += "[CODE:";
66  stream += code;
67  stream += "] ";
68  stream += " [OBJ:";
69  stream += char(obj);
70  stream += "] [LOCATION:";
71  stream += char(location);
72  stream += "] ";
73  stream += msg;
74  //hex::CLogger::CLog(stream.str().c_str(), hex::ELogChannel::LogChannel_Graphics, importance);
75  std::cout << stream.c_str() << std::endl;
76  return VK_FALSE;
77 }
78 
79 namespace Engine {
80 
81  VulkanInstance::VulkanInstance(bool debugEnabled, DebugLevel debugLevel, VulkanAppData engineData, VulkanAppData appData, PFN_vkDebugReportCallbackEXT debugCallback)
82  {
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;
90 
91  VkInstanceCreateInfo createInfo = {};
92  createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
93  createInfo.pApplicationInfo = &appInfo;
94 
95  unsigned int glfwExtensionsCount = 0;
96  const char** glfwExtensionsConst;
97  char** glfwExtensions;
98  glfwExtensionsConst = glfwGetRequiredInstanceExtensions(&glfwExtensionsCount);
99  glfwExtensions = (char**)glfwExtensionsConst;
100 
101  eastl::vector<const char*> extensions;
102  for (unsigned int i = 0; i < glfwExtensionsCount; i++) {
103  extensions.push_back(glfwExtensions[i]);
104  }
105  if (debugEnabled) {
106  extensions.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
107  }
108 
109  createInfo.enabledExtensionCount = static_cast<uint32_t>(extensions.size());
110  createInfo.ppEnabledExtensionNames = extensions.data();
111 
112  eastl::vector<const char*> layers;
113  if (debugEnabled) {
114  layers.push_back("VK_LAYER_LUNARG_standard_validation");
115  //layers.push_back("VK_LAYER_LUNARG_monitor");
116  }
117 
118  createInfo.enabledLayerCount = static_cast<uint32_t>(layers.size());
119  createInfo.ppEnabledLayerNames = layers.data();
120 
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;
125  }
126 
127  this->debugEnabled = (debugLevel == DebugLevel::LEVEL_NONE) ? false : debugEnabled;
128 
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;
134 
135  VkResult res = CreateDebugReportCallbackEXT(instance, &debugCreateInfo, nullptr, &debugReportCallback);
136  }
137  }
138 
139  VulkanInstance::~VulkanInstance()
140  {
141  if (debugEnabled)
142  DestroyDebugReportCallbackEXT(instance, debugReportCallback, nullptr);
143  vkDestroyInstance(instance, nullptr);
144  }
145 
146  VkInstance VulkanInstance::GetInstance() const noexcept
147  {
148  return instance;
149  }
150 }
151 
152 #endif // USING_VULKAN