UltraGrid
UltraGrid Low-Latency High-Resolution Transmission System
Loading...
Searching...
No Matches
vulkan_display::VulkanInstance Class Reference

#include <vulkan_context.hpp>

Collaboration diagram for vulkan_display::VulkanInstance:
Collaboration graph

Public Member Functions

 VulkanInstance ()=default
 
 VulkanInstance (const VulkanInstance &other)=delete
 
 VulkanInstance (VulkanInstance &&other)=delete
 
 ~VulkanInstance ()
 
void destroy ()
 
void get_available_gpus (std::vector< std::pair< std::string, bool > > &gpus)
 returns all available grafhics cards first parameter is gpu name, second parameter is true only if the gpu is suitable for vulkan_display
 
vk::Instance & get_instance ()
 
void init (std::vector< const char * > &required_extensions, bool enable_validation, std::function< void(LogLevel, std::string_view)> logging_function=cout_msg)
 
VulkanInstance & operator= (const VulkanInstance &other)=delete
 
VulkanInstance & operator= (VulkanInstance &&other)=delete
 

Private Member Functions

void init_validation_layers_error_messenger ()
 

Private Attributes

std::unique_ptr< vk::DispatchLoaderDynamic > dynamic_dispatcher = nullptr
 
vk::Instance instance {}
 
vk::DebugUtilsMessengerEXT messenger {}
 
uint32_t vulkan_version = VK_API_VERSION_1_1
 

Friends

void vulkan_display_detail::VulkanContext::init (VulkanInstance &&, vk::SurfaceKHR, vulkan_display::WindowParameters, uint32_t, vk::PresentModeKHR)
 

Detailed Description

Definition at line 222 of file vulkan_context.hpp.

Constructor & Destructor Documentation

◆ VulkanInstance() [1/3]

vulkan_display::VulkanInstance::VulkanInstance ( )
default

◆ VulkanInstance() [2/3]

vulkan_display::VulkanInstance::VulkanInstance ( const VulkanInstance & other)
delete

◆ VulkanInstance() [3/3]

vulkan_display::VulkanInstance::VulkanInstance ( VulkanInstance && other)
delete

◆ ~VulkanInstance()

vulkan_display::VulkanInstance::~VulkanInstance ( )
inline

Definition at line 239 of file vulkan_context.hpp.

239 {
240 destroy();
241 }

References destroy().

Here is the call graph for this function:

Member Function Documentation

◆ destroy()

void vulkan_display::VulkanInstance::destroy ( )

Definition at line 361 of file vulkan_context.cpp.

361 {
362 if (instance) {
363 instance.destroy();
364 if (messenger) {
365 instance.destroy(messenger, nullptr, *dynamic_dispatcher);
366 }
367 dynamic_dispatcher = nullptr;
368 instance = nullptr;
369 }
370}
vk::DebugUtilsMessengerEXT messenger
std::unique_ptr< vk::DispatchLoaderDynamic > dynamic_dispatcher

References dynamic_dispatcher, instance, and messenger.

Referenced by ~VulkanInstance().

◆ get_available_gpus()

void vulkan_display::VulkanInstance::get_available_gpus ( std::vector< std::pair< std::string, bool > > & gpus)

returns all available grafhics cards first parameter is gpu name, second parameter is true only if the gpu is suitable for vulkan_display

Definition at line 348 of file vulkan_context.cpp.

348 {
349 assert(instance);
350
351 std::vector<vk::PhysicalDevice> physical_devices = instance.enumeratePhysicalDevices();
352 gpus.clear();
353 gpus.reserve(physical_devices.size());
354 for (const auto& gpu : physical_devices) {
355 auto properties = gpu.getProperties();
356 gpus.emplace_back(properties.deviceName, true);
357 }
358 std::sort(gpus.begin(), gpus.end());
359}

References instance.

◆ get_instance()

vk::Instance & vulkan_display::VulkanInstance::get_instance ( )
inline

Definition at line 257 of file vulkan_context.hpp.

257 {
258 return instance;
259 }

References instance.

◆ init()

void vulkan_display::VulkanInstance::init ( std::vector< const char * > & required_extensions,
bool enable_validation,
std::function< void(LogLevel, std::string_view)> logging_function = cout_msg )
Parameters
required_extensionsVulkan instance extensions requested by aplication, usually needed for creating vulkan surface
enable_validationEnable vulkan validation layers, they should be disabled in release build.

Definition at line 289 of file vulkan_context.cpp.

289 {
290 vulkan_log_msg = std::move(logging_function);
291 std::vector<const char*> validation_layers{};
292 if (enable_validation) {
293 validation_layers.push_back("VK_LAYER_KHRONOS_validation");
294 check_validation_layers(validation_layers);
295
296 const char* debug_extension = VK_EXT_DEBUG_UTILS_EXTENSION_NAME;
297 required_extensions.push_back(debug_extension);
298 }
299
300 check_instance_extensions(required_extensions);
301
302 vk::ApplicationInfo app_info{};
303 app_info.setApiVersion(VK_API_VERSION_1_1);
304 vulkan_version = VK_API_VERSION_1_1;
305
306 vk::InstanceCreateInfo instance_info{};
307 instance_info
308 .setPApplicationInfo(&app_info)
309 .setEnabledLayerCount(static_cast<uint32_t>(validation_layers.size()))
310 .setPpEnabledLayerNames(validation_layers.data())
311 .setEnabledExtensionCount(static_cast<uint32_t>(required_extensions.size()))
312 .setPpEnabledExtensionNames(required_extensions.data());
313 auto result = vk::createInstance(&instance_info, nullptr, &instance);
314
315 switch (result) {
316 case vk::Result::eSuccess:
317 break;
318 case vk::Result::eErrorIncompatibleDriver:
319 app_info.apiVersion = VK_API_VERSION_1_0;
320 vulkan_version = VK_API_VERSION_1_0;
321 result = vk::createInstance(&instance_info, nullptr, &instance);
322 if(result != vk::Result::eSuccess){
323 throw VulkanError{"Vulkan instance cannot be created: "s + vk::to_string(result)};
324 }
325 break;
326 default:
327 throw VulkanError{"Vulkan instance cannot be created: "s + vk::to_string(result)};
328 }
329
330 if (enable_validation) {
331 dynamic_dispatcher = std::make_unique<vk::DispatchLoaderDynamic>((VkInstance) instance, vkGetInstanceProcAddr);
333 }
334}
std::function< void(vulkan_display::LogLevel, std::string_view)> vulkan_log_msg

References dynamic_dispatcher, init_validation_layers_error_messenger(), instance, vulkan_display_detail::vulkan_log_msg, and vulkan_version.

Here is the call graph for this function:

◆ init_validation_layers_error_messenger()

void vulkan_display::VulkanInstance::init_validation_layers_error_messenger ( )
private

Definition at line 336 of file vulkan_context.cpp.

336 {
337 vk::DebugUtilsMessengerCreateInfoEXT messenger_info{};
338 using Severity = vk::DebugUtilsMessageSeverityFlagBitsEXT;
339 using Type = vk::DebugUtilsMessageTypeFlagBitsEXT;
340 messenger_info
341 .setMessageSeverity(Severity::eError | Severity::eInfo | Severity::eWarning) // severity::eInfo |
342 .setMessageType(Type::eGeneral | Type::ePerformance | Type::eValidation)
343 .setPfnUserCallback(debug_callback)
344 .setPUserData(nullptr);
345 messenger = instance.createDebugUtilsMessengerEXT(messenger_info, nullptr, *dynamic_dispatcher);
346}

References dynamic_dispatcher, instance, and messenger.

Referenced by init().

◆ operator=() [1/2]

VulkanInstance & vulkan_display::VulkanInstance::operator= ( const VulkanInstance & other)
delete

◆ operator=() [2/2]

VulkanInstance & vulkan_display::VulkanInstance::operator= ( VulkanInstance && other)
delete

Friends And Related Symbol Documentation

◆ vulkan_display_detail::VulkanContext::init

void vulkan_display_detail::VulkanContext::init ( VulkanInstance && ,
vk::SurfaceKHR ,
vulkan_display::WindowParameters ,
uint32_t ,
vk::PresentModeKHR  )
friend

Member Data Documentation

◆ dynamic_dispatcher

std::unique_ptr<vk::DispatchLoaderDynamic> vulkan_display::VulkanInstance::dynamic_dispatcher = nullptr
private

Definition at line 224 of file vulkan_context.hpp.

Referenced by destroy(), init(), and init_validation_layers_error_messenger().

◆ instance

vk::Instance vulkan_display::VulkanInstance::instance {}
private

◆ messenger

vk::DebugUtilsMessengerEXT vulkan_display::VulkanInstance::messenger {}
private

Definition at line 225 of file vulkan_context.hpp.

225{};

Referenced by destroy(), and init_validation_layers_error_messenger().

◆ vulkan_version

uint32_t vulkan_display::VulkanInstance::vulkan_version = VK_API_VERSION_1_1
private

Definition at line 226 of file vulkan_context.hpp.

Referenced by init().


The documentation for this class was generated from the following files: