22#include"../WindowAbstract.h"
27 #include "../WindowOpenXR.h"
31VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE;
37const bool PRINT_AVAILABLE_EXTENSION =
false;
39const bool PRINT_AVAILABLE_EXTENSION =
false;
42const bool verboseDebug =
false;
48const std::vector<const char*> validationLayers = {
49 "VK_LAYER_KHRONOS_validation"
54static const char* kTAG =
"androidContext";
56 ((void)__android_log_print(ANDROID_LOG_INFO, kTAG, __VA_ARGS__))
57PFN_vkCreateDebugUtilsMessengerEXT pfnCreateDebugUtilsMessengerEXT;
58PFN_vkDestroyDebugUtilsMessengerEXT pfnDestroyDebugUtilsMessengerEXT;
60PFN_vkCreateDebugUtilsMessengerEXT pfnVkCreateDebugUtilsMessengerEXT;
61PFN_vkDestroyDebugUtilsMessengerEXT pfnVkDestroyDebugUtilsMessengerEXT;
66VKAPI_ATTR VkBool32 VKAPI_CALL debugCallback(
67 VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
68 VkDebugUtilsMessageTypeFlagsEXT messageType,
69 const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData,
72 const char validation[] =
"Validation";
73 const char performance[] =
"Performance";
74 const char error[] =
"ERROR";
75 const char warning[] =
"WARNING";
76 const char unknownType[] =
"UNKNOWN_TYPE";
77 const char unknownSeverity[] =
"UNKNOWN_SEVERITY";
78 const char* typeString = unknownType;
79 const char* severityString = unknownSeverity;
80 const char* messageIdName = pCallbackData->pMessageIdName;
81 int32_t messageIdNumber = pCallbackData->messageIdNumber;
82 const char* message = pCallbackData->pMessage;
83 android_LogPriority priority = ANDROID_LOG_UNKNOWN;
85 if (messageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) {
86 severityString = error;
87 priority = ANDROID_LOG_ERROR;
89 else if (messageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT) {
90 severityString = warning;
91 priority = ANDROID_LOG_WARN;
93 if (messageType & VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT) {
94 typeString = validation;
96 else if (messageType & VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT) {
97 typeString = performance;
100 const int maxSize= 1000;
101 std::string longMessage = message;
103 for(
int i = 0; i <= longMessage.length() / maxSize; i++) {
104 int start = i * maxSize;
105 int end = (i + 1) * maxSize;
106 end = end > longMessage.length() ? longMessage.length() : end;
108 __android_log_print(priority,
110 "%s %s: [%s] Code %i : %s",
115 longMessage.substr(start,end).c_str());
117 LOGI(
"%s",longMessage.substr(start,end).c_str());
121 static VKAPI_ATTR VkBool32 VKAPI_CALL debugCallback(
122 VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
123 VkDebugUtilsMessageTypeFlagsEXT messageType,
124 const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData,
126 if (VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT != messageSeverity || verboseDebug) {
127 std::cerr <<
"Validation layer: " << pCallbackData->pMessage << std::endl;
136VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugUtilsMessengerEXT( VkInstance instance,
137 const VkDebugUtilsMessengerCreateInfoEXT * pCreateInfo,
138 const VkAllocationCallbacks * pAllocator,
139 VkDebugUtilsMessengerEXT * pMessenger )
141 return pfnVkCreateDebugUtilsMessengerEXT( instance, pCreateInfo, pAllocator, pMessenger );
144VKAPI_ATTR
void VKAPI_CALL vkDestroyDebugUtilsMessengerEXT( VkInstance instance,
145 VkDebugUtilsMessengerEXT messenger,
146 VkAllocationCallbacks
const * pAllocator )
148 return pfnVkDestroyDebugUtilsMessengerEXT( instance, messenger, pAllocator );
157PRINT(
"Before instance creation;");
165 setupDebugMessenger();
170 PRINT(
"Physical device");
174 static_cast<WindowOpenXR*
>(window)->getVulkanPhysicalDevice(
reinterpret_cast<VkInstance&
>(
instance),
180 pickPhysicalDevice();
183 createLogicalDevice();
186 catch (vk::SystemError& err)
188 std::cout <<
"vk::SystemError: " << err.what() << std::endl;
191 catch (std::exception& err)
193 std::cout <<
"std::exception: " << err.what() << std::endl;
196 catch (std::runtime_error& err)
198 std::cout <<
"std::runtime error: " << err.what() << std::endl;
203 std::cout <<
"unknown error\n";
208void VulkanContext::createInstance()
210 vk::DynamicLoader dl;
211 auto getProcAddr = dl.getProcAddress<PFN_vkGetInstanceProcAddr>(
"vkGetInstanceProcAddr");
212 VULKAN_HPP_DEFAULT_DISPATCHER.init(getProcAddr);
217 throw std::runtime_error(
"validation layers requested, but not available!");
220 vk::ApplicationInfo applicationInfo(AppName.c_str(), 1.1, EngineName.c_str(), 1, VK_API_VERSION_1_2);
223 vk::InstanceCreateInfo instanceCreateInfo({}, &applicationInfo);
225 instanceCreateInfo.enabledLayerCount =
static_cast<uint32_t
>(validationLayers.size());
226 instanceCreateInfo.ppEnabledLayerNames = validationLayers.data();
231 vk::DebugUtilsMessageSeverityFlagsEXT severityFlags(vk::DebugUtilsMessageSeverityFlagBitsEXT::eWarning |
232 vk::DebugUtilsMessageSeverityFlagBitsEXT::eError);
233 vk::DebugUtilsMessageTypeFlagsEXT messageTypeFlags(vk::DebugUtilsMessageTypeFlagBitsEXT::eGeneral |
234 vk::DebugUtilsMessageTypeFlagBitsEXT::ePerformance |
235 vk::DebugUtilsMessageTypeFlagBitsEXT::eValidation);
236 vk::DebugUtilsMessengerCreateInfoEXT createInfo({}, severityFlags, messageTypeFlags, &debugCallback);
237 instanceCreateInfo.pNext = (VkDebugUtilsMessengerCreateInfoEXT*) &createInfo;
245 instanceCreateInfo.setEnabledExtensionCount(
static_cast<uint32_t
>(extensions.size()));
246 instanceCreateInfo.setPpEnabledExtensionNames(extensions.data());
251 instance = vk::createInstance(instanceCreateInfo);
253 VULKAN_HPP_DEFAULT_DISPATCHER.init(
instance);
257 if (PRINT_AVAILABLE_EXTENSION) {
258 uint32_t inst_ext_count = 0;
259 vkEnumerateInstanceExtensionProperties(
nullptr, &inst_ext_count,
nullptr);
262 VkExtensionProperties inst_exts[inst_ext_count];
263 vkEnumerateInstanceExtensionProperties(
nullptr, &inst_ext_count, inst_exts);
265 for (
const auto& extension : inst_exts) {
266 LOGI(
"%s", extension.extensionName );
270 if (PRINT_AVAILABLE_EXTENSION) {
272 auto extensionsProp = vk::enumerateInstanceExtensionProperties();
273 std::cout <<
"available extensions:\n";
275 for (
const auto& extension : extensionsProp) {
276 std::cout <<
'\t' << extension.extensionName <<
'\n';
286 return format == vk::Format::eD32SfloatS8Uint || format == vk::Format::eD24UnormS8Uint;
294bool VulkanContext::checkValidationLayerSupport()
298 uint32_t instance_layer_present_count = 0;
299 vkEnumerateInstanceLayerProperties(&instance_layer_present_count,
nullptr);
301 VkLayerProperties availableLayers[instance_layer_present_count];
302 vkEnumerateInstanceLayerProperties(&instance_layer_present_count, availableLayers);
304 auto availableLayers = vk::enumerateInstanceLayerProperties();
307 for (
const char* layerName : validationLayers) {
308 bool layerFound =
false;
310 for (
const auto& layerProperties : availableLayers) {
311 if (strcmp(layerName, layerProperties.layerName) == 0) {
324void VulkanContext::setupDebugMessenger()
327#if defined(USE_OPENXR) && defined(__ANDROID__)
336 VkInstance vkInstance =
static_cast<VkInstance
>(
instance);
337 pfnCreateDebugUtilsMessengerEXT =
338 (PFN_vkCreateDebugUtilsMessengerEXT)vkGetInstanceProcAddr(
339 vkInstance,
"vkCreateDebugUtilsMessengerEXT");
340 pfnDestroyDebugUtilsMessengerEXT =
341 (PFN_vkDestroyDebugUtilsMessengerEXT)vkGetInstanceProcAddr(
342 vkInstance,
"vkDestroyDebugUtilsMessengerEXT");
346 if (pfnCreateDebugUtilsMessengerEXT) {
347 VkDebugUtilsMessengerCreateInfoEXT messengerInfo;
348 constexpr VkDebugUtilsMessageSeverityFlagsEXT kSeveritiesToLog =
349 VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT |
350 VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT;
352 constexpr VkDebugUtilsMessageTypeFlagsEXT kMessagesToLog =
353 VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT |
354 VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT |
355 VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT;
357 messengerInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT;
358 messengerInfo.pNext =
nullptr;
359 messengerInfo.flags = 0;
360 messengerInfo.messageSeverity = kSeveritiesToLog;
361 messengerInfo.messageType = kMessagesToLog;
363 messengerInfo.pfnUserCallback = &debugCallback;
364 messengerInfo.pUserData =
nullptr;
366 VkDebugUtilsMessengerEXT messenger;
367 pfnCreateDebugUtilsMessengerEXT(vkInstance, &messengerInfo,
nullptr,
369 debugMessenger =
static_cast<vk::DebugUtilsMessengerEXT
>(messenger);
372 pfnVkCreateDebugUtilsMessengerEXT =
reinterpret_cast<PFN_vkCreateDebugUtilsMessengerEXT
>(
instance.getProcAddr(
"vkCreateDebugUtilsMessengerEXT"));
373 if (!pfnVkCreateDebugUtilsMessengerEXT)
375 throw std::runtime_error(
"GetInstanceProcAddr: Unable to find pfnVkCreateDebugUtilsMessengerEXT function.");
379 pfnVkDestroyDebugUtilsMessengerEXT =
reinterpret_cast<PFN_vkDestroyDebugUtilsMessengerEXT
>(
instance.getProcAddr(
"vkDestroyDebugUtilsMessengerEXT"));
380 if (!pfnVkDestroyDebugUtilsMessengerEXT)
382 throw std::runtime_error(
"GetInstanceProcAddr: Unable to find pfnVkDestroyDebugUtilsMessengerEXT function.");
385 vk::DebugUtilsMessageSeverityFlagsEXT severityFlags(vk::DebugUtilsMessageSeverityFlagBitsEXT::eWarning |
386 vk::DebugUtilsMessageSeverityFlagBitsEXT::eError| vk::DebugUtilsMessageSeverityFlagBitsEXT::eVerbose | vk::DebugUtilsMessageSeverityFlagBitsEXT::eInfo);
387 vk::DebugUtilsMessageTypeFlagsEXT messageTypeFlags(vk::DebugUtilsMessageTypeFlagBitsEXT::eGeneral |
388 vk::DebugUtilsMessageTypeFlagBitsEXT::ePerformance |
389 vk::DebugUtilsMessageTypeFlagBitsEXT::eValidation);
390 vk::DebugUtilsMessengerCreateInfoEXT createInfo({}, severityFlags, messageTypeFlags, &debugCallback);
392 debugMessenger =
instance.createDebugUtilsMessengerEXT(createInfo);
397void VulkanContext::pickPhysicalDevice()
399 auto devices =
instance.enumeratePhysicalDevices();
400 if (devices.size() == 0) {
401 throw std::runtime_error(
"failed to find GPUs with Vulkan support!");
407 std::multimap<int, vk::PhysicalDevice> candidates;
408 for (
const auto&
device : devices) {
409 int score = rateDeviceSuitability(
device);
410 candidates.insert(std::make_pair(score,
device));
413 if (candidates.rbegin()->first > 0) {
417 throw std::runtime_error(
"failed to find a suitable GPU!");
420 std::cout <<
"Physical Device Name " <<
physicalDevice.getProperties().deviceName << std::endl;
423int VulkanContext::rateDeviceSuitability(vk::PhysicalDevice device)
426 auto deviceProperties =
device.getProperties();
427 auto deviceFeatures =
device.getFeatures();
432 auto features2 =
device.getFeatures2 <vk::PhysicalDeviceFeatures2, vk::PhysicalDeviceSamplerYcbcrConversionFeatures>();
436 if (deviceProperties.deviceType == vk::PhysicalDeviceType::eDiscreteGpu) {
441 score += deviceProperties.limits.maxImageDimension2D;
444 if (!deviceFeatures.geometryShader) {
447 if (!deviceFeatures.samplerAnisotropy) {
450 vk::PhysicalDeviceSamplerYcbcrConversionFeatures
const& samplerYcbcrConversionFeatures = features2.get<vk::PhysicalDeviceSamplerYcbcrConversionFeatures>();
451 if (!samplerYcbcrConversionFeatures.samplerYcbcrConversion) {
458 bool extensionsSupported = checkDeviceExtensionSupport(
device);
459 bool swapChainAdequate =
false;
460 if (extensionsSupported) {
463 swapChainAdequate = !swapChainSupport.
formats.empty() && !swapChainSupport.
presentModes.empty();
466 swapChainAdequate =
true;
472 if (!swapChainAdequate) {
479bool VulkanContext::checkDeviceExtensionSupport(vk::PhysicalDevice device)
481 auto availableExtensions =
device.enumerateDeviceExtensionProperties();
484 std::set<std::string> requiredExtensions(deviceExt.begin(),deviceExt.end());
486 for (
const auto& extension : availableExtensions) {
487 std::string name = extension.extensionName;
488 requiredExtensions.erase(name);
490 return requiredExtensions.empty();
496 auto queueFamilies =
device.getQueueFamilyProperties();
499 for (
const auto& queueFamily : queueFamilies) {
500 if (queueFamily.queueFlags & vk::QueueFlagBits::eGraphics) {
502 }
else if(queueFamily.queueFlags & vk::QueueFlagBits::eCompute) {
504 }
else if(queueFamily.queueFlags & vk::QueueFlagBits::eTransfer) {
529 for (vk::Format format : candidates) {
530 vk::FormatProperties props =
physicalDevice.getFormatProperties(format);
531 if (tiling == vk::ImageTiling::eLinear && (props.linearTilingFeatures & features) == features) {
534 else if (tiling == vk::ImageTiling::eOptimal && (props.optimalTilingFeatures & features) == features) {
538 throw std::runtime_error(
"failed to find supported format!");
544 { vk::Format::eD32Sfloat, vk::Format::eD32SfloatS8Uint, vk::Format::eD24UnormS8Uint },
545 vk::ImageTiling::eOptimal,
546 vk::FormatFeatureFlagBits::eDepthStencilAttachment
551void VulkanContext::createLogicalDevice()
553 vk::PhysicalDeviceFeatures deviceFeatures{};
554 deviceFeatures.samplerAnisotropy = VK_TRUE;
555 deviceFeatures.geometryShader = VK_TRUE;
556 deviceFeatures.shaderInt64 = VK_TRUE;
557 vk::PhysicalDeviceFeatures2 deviceFeature2{};
558 vk::PhysicalDeviceVulkan11Features devices11features{};
559 devices11features.samplerYcbcrConversion = VK_TRUE;
560 vk::PhysicalDeviceShaderAtomicInt64Features atomics64feature(VK_TRUE);
561 devices11features.setPNext(&atomics64feature);
562 vk::PhysicalDeviceShaderImageAtomicInt64FeaturesEXT atomic64image(VK_TRUE);
563 atomics64feature.setPNext(&atomic64image);
564 deviceFeature2.setPNext(&devices11features);
565 deviceFeature2.features = deviceFeatures;
572 float queuePriority = 1.0f;
573 std::vector<vk::DeviceQueueCreateInfo> queueCreateInfos;
575 throw std::runtime_error(
"Some queues families requested by the application are not found");
578 for (uint32_t queueFamily : uniqueQueueFamilies) {
579 queueCreateInfos.push_back(vk::DeviceQueueCreateInfo(vk::DeviceQueueCreateFlags(), queueFamily, 1, &queuePriority));
582 deviceExt.push_back(VK_EXT_SHADER_IMAGE_ATOMIC_INT64_EXTENSION_NAME);
584 deviceExt.push_back(VK_KHR_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME);
585 deviceExt.push_back(VK_KHR_EXTERNAL_SEMAPHORE_WIN32_EXTENSION_NAME);
588 deviceExt.push_back(VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME);
589 deviceExt.push_back(VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME);
590 deviceExt.push_back(VK_KHR_EXTERNAL_SEMAPHORE_EXTENSION_NAME);
591 deviceExt.push_back(VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME);
593 vk::DeviceCreateInfo deviceCreateInfo(vk::DeviceCreateFlags(),
594 static_cast<uint32_t
>(queueCreateInfos.size()),
595 queueCreateInfos.data(),
598 static_cast<uint32_t
>(deviceExt.size()),
601 deviceCreateInfo.setPNext(&deviceFeature2);
612 VULKAN_HPP_DEFAULT_DISPATCHER.init(
device);
617 this->window = window;
630 VkInstance vkInstance =
static_cast<VkInstance
>(
instance);
631 auto messenger =
static_cast<VkDebugUtilsMessengerEXT
>(debugMessenger);
632 pfnDestroyDebugUtilsMessengerEXT(vkInstance,messenger,
nullptr);
636 instance.destroyDebugUtilsMessengerEXT(debugMessenger);
650static VKAPI_ATTR VkBool32 VKAPI_CALL debugReportThunk(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType,
651 uint64_t
object,
size_t location, int32_t messageCode,
652 const char* pLayerPrefix,
const char* pMessage,
void* pUserData) {
653 return static_cast<VulkanContext*
>(pUserData)->debugReportFunction(flags, objectType,
object, location, messageCode,
654 pLayerPrefix, pMessage);
657VkBool32 VulkanContext::debugReportFunction(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, uint64_t
object,
size_t ,
658 int32_t ,
const char* pLayerPrefix,
const char* pMessage) {
659 std::string flagNames;
662 android_LogPriority level = ANDROID_LOG_DEBUG;
664 if ((flags & VK_DEBUG_REPORT_DEBUG_BIT_EXT) != 0u) {
665 flagNames +=
"DEBUG:";
667 level = ANDROID_LOG_DEBUG;
669 if ((flags & VK_DEBUG_REPORT_INFORMATION_BIT_EXT) != 0u) {
670 flagNames +=
"INFO:";
672 level = ANDROID_LOG_INFO;
674 if ((flags & VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT) != 0u) {
675 flagNames +=
"PERF:";
677 level = ANDROID_LOG_WARN;
679 if ((flags & VK_DEBUG_REPORT_WARNING_BIT_EXT) != 0u) {
680 flagNames +=
"WARN:";
682 level = ANDROID_LOG_WARN;
684 if ((flags & VK_DEBUG_REPORT_ERROR_BIT_EXT) != 0u) {
685 flagNames +=
"ERROR:";
687 level = ANDROID_LOG_ERROR;
690#define LIST_OBJECT_TYPES(_) \
711 _(DESCRIPTOR_SET_LAYOUT) \
722 switch (objectType) {
724#define MK_OBJECT_TYPE_CASE(name) \
725 case VK_DEBUG_REPORT_OBJECT_TYPE_##name##_EXT: \
728 LIST_OBJECT_TYPES(MK_OBJECT_TYPE_CASE)
730#if VK_HEADER_VERSION >= 46
731 MK_OBJECT_TYPE_CASE(DESCRIPTOR_UPDATE_TEMPLATE_KHR)
733#if VK_HEADER_VERSION >= 70
734 MK_OBJECT_TYPE_CASE(DEBUG_REPORT_CALLBACK_EXT)
738 if ((objectType == VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT) && (strcmp(pLayerPrefix,
"Loader Message") == 0) &&
739 (strncmp(pMessage,
"Device Extension:", 17) == 0)) {
744 __android_log_print(level,flagNames.c_str() ,
"%s (%s 0x%llx) [%s] %s", flagNames.c_str(), objName.c_str(),
object, pLayerPrefix, pMessage);
745 if ((flags & VK_DEBUG_REPORT_ERROR_BIT_EXT) != 0u) {
748 if ((flags & VK_DEBUG_REPORT_WARNING_BIT_EXT) != 0u) {
754void VulkanContext::createDebugReport() {
756 VkInstance vkInstance =
static_cast<VkInstance
>(
instance);
757 vkCreateDebugReportCallbackEXT =
758 (PFN_vkCreateDebugReportCallbackEXT)vkGetInstanceProcAddr(vkInstance,
"vkCreateDebugReportCallbackEXT");
759 vkDestroyDebugReportCallbackEXT =
760 (PFN_vkDestroyDebugReportCallbackEXT)vkGetInstanceProcAddr(vkInstance,
"vkDestroyDebugReportCallbackEXT");
761 VkDebugReportCallbackCreateInfoEXT debugInfo{VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT};
762 debugInfo.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT;
765 VK_DEBUG_REPORT_INFORMATION_BIT_EXT | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT | VK_DEBUG_REPORT_DEBUG_BIT_EXT;
767 debugInfo.pfnCallback = debugReportThunk;
768 debugInfo.pUserData =
this;
769 VkResult res = vkCreateDebugReportCallbackEXT(vkInstance, &debugInfo,
nullptr, &debugReport);
770 if(res != VK_SUCCESS){
771 throw std::runtime_error(
"failed to create debug report");
773 LOGI(
"debug report created");
File that contain the VulkanContext class to manage Vulkan Instance, Physical device,...
class that manages tasks related to Vulkan context (Vulkan Instance, Vulkan Physical device,...
VulkanContext(WindowAbstract *window)
vk::Format findDepthFormat()
bool hasStencilComponent(vk::Format format)
vk::PhysicalDevice physicalDevice
uint32_t queueFamilyIndex
vk::Format findSupportedFormat(const std::vector< vk::Format > &candidates, vk::ImageTiling tiling, vk::FormatFeatureFlags features)
uint32_t transferQueueFamilyIndex
bool isIndepFromWindowDimension()
QueueFamilyIndices findQueueFamilies(vk::PhysicalDevice device)
Abstraction of the way of the result is displayed (screen or HMD).
virtual const bool useOpenXR()
virtual SwapChainSupportDetails querySwapChainSupport(vk::PhysicalDevice device)=0
virtual void cleanUpSurface()=0
virtual VkBool32 isDeviceSupportingSufaceKHR(VkPhysicalDevice device, int i)=0
const bool isValidationLayersEnabled()
virtual std::vector< const char * > getRequiredExtensions()=0
bool isIndepFromWindowDimension()
virtual void createSurface()=0
virtual std::vector< const char * > getRequiredDeviceExtensions()=0
Class that take care of the tasks linked to OpenXR (input and display), is used when HMD support is r...
Struct to encapsulate the indice of the queues families.
std::optional< uint32_t > transferFamily
std::optional< uint32_t > graphicsFamily
std::optional< uint32_t > presentFamily
Struct that contains the capability for the sapchain, the formats and the present mode supported.
std::vector< vk::SurfaceFormatKHR > formats
std::vector< vk::PresentModeKHR > presentModes