2
3
4
5
9#include "Core/Library/StringLibrary.h"
10#include "Debugger/Perf/NsightPerfGPUProfilerHUD.h"
16 const std::string& name ,
17 const std::string& engineName
24
25
26 VkApplicationInfo appInfo {};
27 appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
28 appInfo.pApplicationName = name.c_str();
29 appInfo.applicationVersion = VK_MAKE_VERSION(1, 0, 0);
30 appInfo.pEngineName = engineName.c_str();
31 appInfo.engineVersion = VK_MAKE_VERSION(1, 0, 0);
32 appInfo.apiVersion = VK_API_VERSION_1_3;
35
36
37 VkInstanceCreateInfo createInfo {};
38 createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
39 createInfo.pApplicationInfo = &appInfo;
42
43
47
48
52 ss <<
"Instance Extension not Satisfied";
54 SPICES_CORE_ERROR(ss.str());
58
59
60 createInfo.enabledExtensionCount =
static_cast<uint32_t>(m_ExtensionProperties.size());
61 createInfo.ppEnabledExtensionNames = m_ExtensionProperties.data();
64
65
69
70
74
75
76 createInfo.enabledLayerCount =
static_cast<uint32_t>(m_LayerProperties.size());
77 createInfo.ppEnabledLayerNames = m_LayerProperties.data();
80
81
85
86
87
88 std::vector<VkValidationFeatureEnableEXT> validationFeatureEnable;
92 validationFeatureEnable.push_back(VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT);
96 VkValidationFeaturesEXT validationFeatures{};
97 validationFeatures.sType = VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT;
98 validationFeatures.enabledValidationFeatureCount =
static_cast<uint32_t>(validationFeatureEnable.size());
99 validationFeatures.pEnabledValidationFeatures = validationFeatureEnable.data();
103 m_DebugMessengerCreateInfo.pNext = &validationFeatures;
107 createInfo.pNext = &m_DebugMessengerCreateInfo;
110
111
112 VK_CHECK(vkCreateInstance(&createInfo,
nullptr, &vulkanState.m_Instance))
115
116
117 vulkanState.m_VkFunc.Init(vulkanState.m_Instance);
120
121
125
126
135
136
141
142
143
147
148
149 m_VulkanState.m_VkFunc.vkDestroyDebugUtilsMessengerEXT(m_VulkanState.m_Instance, m_DebugMessenger,
nullptr);
154
155
164 m_ExtensionProperties.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
165 m_ExtensionProperties.push_back(VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME);
168
169
170 uint32_t glfwExtensionCount = 0;
171 const char** glfwExtensions = glfwGetRequiredInstanceExtensions(&glfwExtensionCount);
174
175
176 for (uint32_t i = 0; i < glfwExtensionCount; i++)
178 m_ExtensionProperties.push_back(*glfwExtensions);
183
184
185
189
190
191 m_ExtensionProperties.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
196
197
207
208
209 uint32_t extensionCount = 0;
210 vkEnumerateInstanceExtensionProperties(
nullptr, &extensionCount,
nullptr);
213
214
215 std::vector<VkExtensionProperties> availableExtensions(extensionCount);
216 vkEnumerateInstanceExtensionProperties(
nullptr, &extensionCount, availableExtensions.data());
219
220
221 std::set<std::string> requiredExtensions(m_ExtensionProperties.begin(), m_ExtensionProperties.end());
223 for (
const auto& extension : availableExtensions)
225 requiredExtensions.erase(extension.extensionName);
228 if (!requiredExtensions.empty())
230 for (
auto& set : requiredExtensions)
232 std::stringstream ss;
233 ss <<
"Instance Extension Required: " << set <<
", Which is not satisfied";
235 SPICES_CORE_WARN(ss.str())
239 return requiredExtensions.empty();
249
250
251 m_LayerProperties.push_back(
"VK_LAYER_KHRONOS_validation");
262
263
265 vkEnumerateInstanceLayerProperties(&layerCount,
nullptr);
268
269
270 std::vector<VkLayerProperties> availableLayers(layerCount);
271 vkEnumerateInstanceLayerProperties(&layerCount, availableLayers.data());
274
275
276 std::set<std::string> requiredLayers(m_LayerProperties.begin(), m_LayerProperties.end());
278 for (
const auto& layer : availableLayers)
280 requiredLayers.erase(layer.layerName);
283 if (!requiredLayers.empty())
285 for (
auto& set : requiredLayers)
287 std::stringstream ss;
288 ss <<
"Instance Layer Required: " << set <<
", Which is not satisfied";
290 SPICES_CORE_WARN(ss.str())
294 return requiredLayers.empty();
304
305
306 m_VulkanState.m_VkFunc.vkCreateDebugUtilsMessengerEXT(m_VulkanState.m_Instance, &m_DebugMessengerCreateInfo,
nullptr, &m_DebugMessenger);
317
318
319
333
334
338 "validation layer:\n " <<
339 "MessageIdNumber: " <<
341 "\n MessageIdName: " <<
346 ss <<
"\n CmdLabelName: " <<
357
358
364
365
371
372
378
379
399
400
#define NSIGHTPERF_GPUPROFILERHUD_QUERYINSTANCEEXTENSION(...)
#define SPICES_PROFILE_ZONE
#define VK_CHECK(expr)
Vulkan Check macro. Verify Vulkan API Effectiveness.
void SetVulkanDebugCallbackFuncPointer()
Set Vulkan's debug message callback function pointer. Working with DEBUG mode.
virtual ~VulkanInstance() override
Destructor Function.
void CreateVulkanSurface() const
Create a Surface Object.
VulkanInstance(VulkanState &vulkanState, const std::string &name, const std::string &engineName)
Constructor Function. Create vkInstance and vkSurface.
bool CheckExtensionRequirementsSatisfied()
Iter all our extensions, check whether all satisfied or not.
void FillDebugMessengerCreateInfo()
Set m_DebugMessengerCreateInfo variable.
void GetExtensionRequirements()
Get all instance extension requirements our engine needed. Source 1 : glfw requirements....
bool ChecklayerRequirementsSatisfied()
Iter all our layers, check whether all satisfied or not.
void GetLayerRequirements()
Get all instance layer requirements our engine needed. Source 1 : user Setting.
VulkanInstance Class. This class defines the VulkanInstance behaves. This class is just a wrapper of ...
VulkanState & m_VulkanState
The global VulkanState Referenced from VulkanRenderBackend.
VulkanObject(VulkanState &vulkanState)
Constructor Function. Init member variables.
VulkanObject Class. This class defines the basic behaves of VulkanObject. When we create an new Vulka...
This struct contains all Vulkan object in used global.