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

#include <vulkan_context.hpp>

Collaboration diagram for vulkan_display_detail::VulkanContext:
Collaboration graph

Public Member Functions

 VulkanContext ()=default
 
uint32_t acquire_next_swapchain_image (vk::Semaphore acquire_semaphore) const
 
void create_framebuffers (vk::RenderPass render_pass)
 
void destroy ()
 
vk::Device get_device ()
 
vk::Framebuffer get_framebuffer (uint32_t framebuffer_id)
 
vk::PhysicalDevice get_gpu ()
 
vk::Queue get_queue ()
 
uint32_t get_queue_family_index ()
 
vk::Extent2D get_render_area_size ()
 
vk::SwapchainKHR get_swapchain ()
 
size_t get_swapchain_image_count ()
 
vk::Format get_swapchain_image_format ()
 
uint32_t get_vulkan_version () const
 
vulkan_display::WindowParameters get_window_parameters () const
 
void init (vulkan_display::VulkanInstance &&instance, vk::SurfaceKHR surface, vulkan_display::WindowParameters window_parameters, uint32_t gpu_index, vk::PresentModeKHR preferred_mode)
 
bool is_yCbCr_supported () const
 
void recreate_swapchain (vulkan_display::WindowParameters parameters, vk::RenderPass render_pass)
 

Private Member Functions

void create_logical_device ()
 
void create_swap_chain (vk::SwapchainKHR &&old_swap_chain=vk::SwapchainKHR{})
 
void destroy_framebuffers ()
 
void destroy_swapchain_views ()
 

Private Attributes

vk::Device device
 
std::unique_ptr< vk::DispatchLoaderDynamic > dynamic_dispatcher {}
 
vk::PhysicalDevice gpu
 
vk::Instance instance
 
vk::DebugUtilsMessengerEXT messenger
 
vk::PresentModeKHR preferred_present_mode {}
 
vk::Queue queue
 
uint32_t queue_family_index = no_queue_index_found
 
vk::SurfaceKHR surface
 
vk::SwapchainKHR swapchain
 
struct { 
 
   vk::SurfaceCapabilitiesKHR   capabilities 
 
   vk::SurfaceFormatKHR   format 
 
   vk::Extent2D   image_size 
 
   vk::PresentModeKHR   mode = vk::PresentModeKHR::eFifo 
 
} swapchain_atributes 
 
std::vector< SwapchainImage > swapchain_images {}
 
uint32_t vulkan_version {}
 
vulkan_display::WindowParameters window_parameters
 
bool yCbCr_supported = false
 

Detailed Description

Definition at line 131 of file vulkan_context.hpp.

Constructor & Destructor Documentation

◆ VulkanContext()

vulkan_display_detail::VulkanContext::VulkanContext ( )
default

Member Function Documentation

◆ acquire_next_swapchain_image()

uint32_t vulkan_display_detail::VulkanContext::acquire_next_swapchain_image ( vk::Semaphore acquire_semaphore) const

Definition at line 545 of file vulkan_context.cpp.

545 {
546 constexpr uint64_t timeout = 1'000'000'000; // 1s = 1 000 000 000 nanoseconds
547 uint32_t image_index;
548 auto acquired = device.acquireNextImageKHR(swapchain, timeout, acquire_semaphore, nullptr, &image_index);
549 switch (acquired) {
550 case vk::Result::eSuccess:
551 break;
552 case vk::Result::eSuboptimalKHR: [[fallthrough]];
553 case vk::Result::eErrorOutOfDateKHR:
554 image_index = swapchain_image_out_of_date;
555 break;
556 case vk::Result::eTimeout:
557 image_index = swapchain_image_timeout;
558 break;
559 default:
560 throw VulkanError{"Next swapchain image cannot be acquired."s + vk::to_string(acquired)};
561 }
562 return image_index;
563}
constexpr uint32_t swapchain_image_out_of_date
constexpr uint32_t swapchain_image_timeout

References device, swapchain, vulkan_display_detail::swapchain_image_out_of_date, and vulkan_display_detail::swapchain_image_timeout.

Referenced by vulkan_display::VulkanDisplay::display_queued_image().

◆ create_framebuffers()

void vulkan_display_detail::VulkanContext::create_framebuffers ( vk::RenderPass render_pass)

Definition at line 516 of file vulkan_context.cpp.

516 {
517 vk::FramebufferCreateInfo framebuffer_info;
518 framebuffer_info
519 .setRenderPass(render_pass)
520 .setWidth(swapchain_atributes.image_size.width)
521 .setHeight(swapchain_atributes.image_size.height)
522 .setLayers(1);
523
524 for(auto& swapchain_image : swapchain_images){
525 framebuffer_info
526 .setAttachmentCount(1)
527 .setPAttachments(&swapchain_image.view);
528 swapchain_image.framebuffer = device.createFramebuffer(framebuffer_info);
529 }
530}
struct vulkan_display_detail::VulkanContext::@94 swapchain_atributes
std::vector< SwapchainImage > swapchain_images

References device, swapchain_atributes, and swapchain_images.

Referenced by vulkan_display::VulkanDisplay::init(), and recreate_swapchain().

◆ create_logical_device()

void vulkan_display_detail::VulkanContext::create_logical_device ( )
private

Definition at line 378 of file vulkan_context.cpp.

378 {
379 assert(gpu);
381
382 constexpr std::array priorities = { 1.0f };
383 vk::DeviceQueueCreateInfo queue_info{};
384 queue_info
385 .setQueueFamilyIndex(queue_family_index)
386 .setPQueuePriorities(priorities.data())
387 .setQueueCount(1);
388
389 vk::DeviceCreateInfo device_info{};
391 .setPNext(nullptr)
392 .setQueueCreateInfoCount(1)
393 .setPQueueCreateInfos(&queue_info)
394 .setEnabledExtensionCount(static_cast<uint32_t>(required_gpu_extensions.size()))
395 .setPpEnabledExtensionNames(required_gpu_extensions.data());
396
397 vk::PhysicalDeviceFeatures2 features2{};
398 vk::PhysicalDeviceSamplerYcbcrConversionFeatures yCbCr_feature{};
399 if (vulkan_version == VK_API_VERSION_1_1) {
400 features2.setPNext(&yCbCr_feature);
401 gpu.getFeatures2(&features2);
402 if (yCbCr_feature.samplerYcbcrConversion) {
403 yCbCr_supported = true;
404 device_info.setPNext(&features2);
405 vulkan_log_msg(LogLevel::info, "yCbCr feature supported.");
406 }
407 }
408
409 //reset features
410 features2 = vk::PhysicalDeviceFeatures2{};
411 features2.setPNext(&yCbCr_feature);
412
413 device = gpu.createDevice(device_info);
414}
std::function< void(vulkan_display::LogLevel, std::string_view)> vulkan_log_msg
constexpr uint32_t no_queue_index_found

References device, gpu, vulkan_display_detail::no_queue_index_found, queue_family_index, vulkan_display_detail::vulkan_log_msg, vulkan_version, and yCbCr_supported.

Referenced by init().

◆ create_swap_chain()

void vulkan_display_detail::VulkanContext::create_swap_chain ( vk::SwapchainKHR && old_swap_chain = vk::SwapchainKHR{})
private

Definition at line 416 of file vulkan_context.cpp.

416 {
417 constexpr int initialization_attempts = 3;
418 for (int attempt = 0; attempt < initialization_attempts; attempt++) {
419 auto& capabilities = swapchain_atributes.capabilities;
420 capabilities = gpu.getSurfaceCapabilitiesKHR(surface);
421
422 swapchain_atributes.format = get_surface_format(gpu, surface);
423 swapchain_atributes.mode = get_present_mode(gpu, surface, preferred_present_mode);
424
425 vk::Extent2D swapchain_image_size;
426 swapchain_image_size.width = std::clamp(window_parameters.width,
427 capabilities.minImageExtent.width,
428 capabilities.maxImageExtent.width);
429 swapchain_image_size.height = std::clamp(window_parameters.height,
430 capabilities.minImageExtent.height,
431 capabilities.maxImageExtent.height);
432 swapchain_atributes.image_size = swapchain_image_size;
433
434 uint32_t image_count = std::max(uint32_t{2}, capabilities.minImageCount);
435 if (capabilities.maxImageCount != 0) {
436 image_count = std::min(image_count, capabilities.maxImageCount);
437 }
438
439 auto msg = concat(64, std::array{
440 "Recreating swapchain, size: "s,
441 std::to_string(swapchain_image_size.width),
442 "x"s,
443 std::to_string(swapchain_image_size.height),
444 ", format: "s,
445 vk::to_string(swapchain_atributes.format.format)
446 });
447 vulkan_log_msg(LogLevel::info, msg);
448
449 //assert(capabilities.supportedUsageFlags & vk::ImageUsageFlagBits::eTransferDst);
450 vk::SwapchainCreateInfoKHR swapchain_info{};
451 swapchain_info
452 .setSurface(surface)
453 .setImageFormat(swapchain_atributes.format.format)
454 .setImageColorSpace(swapchain_atributes.format.colorSpace)
455 .setPresentMode(swapchain_atributes.mode)
456 .setMinImageCount(image_count)
457 .setImageExtent(swapchain_image_size)
458 .setImageArrayLayers(1)
459 .setImageUsage(vk::ImageUsageFlagBits::eColorAttachment)
460 .setImageSharingMode(vk::SharingMode::eExclusive)
461 .setPreTransform(swapchain_atributes.capabilities.currentTransform)
462 .setCompositeAlpha(get_composite_alpha(swapchain_atributes.capabilities.supportedCompositeAlpha))
463 .setClipped(true)
464 .setOldSwapchain(old_swapchain);
465 try{
466 swapchain = device.createSwapchainKHR(swapchain_info);
467 device.destroy(old_swapchain);
468 old_swapchain = nullptr;
469 return;
470 }
471 catch(std::exception& err){
472 vulkan_log_msg(LogLevel::info, "Recreation unsuccesful: "s + err.what());
473 device.destroy(old_swapchain);
474 old_swapchain = nullptr;
475 if(attempt + 1 == initialization_attempts){
476 throw err;
477 }
478 }
479 }
480 assert(false);
481}
vulkan_display::WindowParameters window_parameters
vk::SurfaceCapabilitiesKHR capabilities
std::string concat(size_t expected_result_size, std::array< std::string, count > const &strings)

References capabilities, vulkan_display_detail::concat(), device, gpu, vulkan_display::WindowParameters::height, preferred_present_mode, surface, swapchain, swapchain_atributes, vulkan_display_detail::vulkan_log_msg, vulkan_display::WindowParameters::width, and window_parameters.

Referenced by init(), and recreate_swapchain().

Here is the call graph for this function:

◆ destroy()

void vulkan_display_detail::VulkanContext::destroy ( )

Definition at line 565 of file vulkan_context.cpp.

565 {
566 if (device) {
567 // static_cast to silence nodiscard warning
568 device.waitIdle();
571 device.destroy(swapchain);
572 device.destroy();
573 }
574 if (instance) {
575 instance.destroy(surface);
576 if (messenger) {
577 instance.destroy(messenger, nullptr, *dynamic_dispatcher);
578 }
579 instance.destroy();
580 }
581 dynamic_dispatcher = nullptr;
582}
vk::DebugUtilsMessengerEXT messenger
std::unique_ptr< vk::DispatchLoaderDynamic > dynamic_dispatcher

References destroy_framebuffers(), destroy_swapchain_views(), device, dynamic_dispatcher, instance, messenger, surface, and swapchain.

Referenced by vulkan_display::VulkanDisplay::destroy().

Here is the call graph for this function:

◆ destroy_framebuffers()

void vulkan_display_detail::VulkanContext::destroy_framebuffers ( )
inlineprivate

Definition at line 181 of file vulkan_context.hpp.

181 {
182 for (auto& image : swapchain_images) {
183 device.destroy(image.framebuffer);
184 image.framebuffer = nullptr;
185 }
186 }

References device, and swapchain_images.

Referenced by destroy(), and recreate_swapchain().

◆ destroy_swapchain_views()

void vulkan_display_detail::VulkanContext::destroy_swapchain_views ( )
inlineprivate

Definition at line 174 of file vulkan_context.hpp.

174 {
175 for (auto& image : swapchain_images) {
176 device.destroy(image.view);
177 image.view = nullptr;
178 }
179 }

References device, and swapchain_images.

Referenced by destroy(), and recreate_swapchain().

◆ get_device()

vk::Device vulkan_display_detail::VulkanContext::get_device ( )
inline

◆ get_framebuffer()

vk::Framebuffer vulkan_display_detail::VulkanContext::get_framebuffer ( uint32_t framebuffer_id)
inline

Definition at line 200 of file vulkan_context.hpp.

200 {
201 return swapchain_images[framebuffer_id].framebuffer;
202 }

References swapchain_images.

Referenced by vulkan_display::VulkanDisplay::record_graphics_commands().

◆ get_gpu()

vk::PhysicalDevice vulkan_display_detail::VulkanContext::get_gpu ( )
inline

◆ get_queue()

vk::Queue vulkan_display_detail::VulkanContext::get_queue ( )
inline

◆ get_queue_family_index()

uint32_t vulkan_display_detail::VulkanContext::get_queue_family_index ( )
inline

Definition at line 163 of file vulkan_context.hpp.

163{ return queue_family_index; }

References queue_family_index.

Referenced by vulkan_display::VulkanDisplay::init().

◆ get_render_area_size()

vk::Extent2D vulkan_display_detail::VulkanContext::get_render_area_size ( )
inline

◆ get_swapchain()

vk::SwapchainKHR vulkan_display_detail::VulkanContext::get_swapchain ( )
inline

Definition at line 165 of file vulkan_context.hpp.

165{ return swapchain; }

References swapchain.

Referenced by vulkan_display::VulkanDisplay::display_queued_image().

◆ get_swapchain_image_count()

size_t vulkan_display_detail::VulkanContext::get_swapchain_image_count ( )
inline

Definition at line 167 of file vulkan_context.hpp.

167{ return swapchain_images.size(); }

References swapchain_images.

◆ get_swapchain_image_format()

vk::Format vulkan_display_detail::VulkanContext::get_swapchain_image_format ( )
inline

Definition at line 166 of file vulkan_context.hpp.

166{ return swapchain_atributes.format.format; };

References swapchain_atributes.

Referenced by vulkan_display_detail::RenderPipeline::create().

◆ get_vulkan_version()

uint32_t vulkan_display_detail::VulkanContext::get_vulkan_version ( ) const
inline

Definition at line 159 of file vulkan_context.hpp.

159{ return vulkan_version; }

References vulkan_version.

Referenced by vulkan_display::VulkanDisplay::get_vulkan_version().

◆ get_window_parameters()

vulkan_display::WindowParameters vulkan_display_detail::VulkanContext::get_window_parameters ( ) const
inline

Definition at line 204 of file vulkan_context.hpp.

204 {
205 return window_parameters;
206 }

References window_parameters.

Referenced by vulkan_display::VulkanDisplay::window_parameters_changed().

◆ init()

void vulkan_display_detail::VulkanContext::init ( vulkan_display::VulkanInstance && instance,
vk::SurfaceKHR surface,
vulkan_display::WindowParameters window_parameters,
uint32_t gpu_index,
vk::PresentModeKHR preferred_mode )

Definition at line 483 of file vulkan_context.cpp.

485{
486 assert(!this->instance);
487 this->instance = instance.instance;
488 this->dynamic_dispatcher = std::move(instance.dynamic_dispatcher);
489 this->messenger = instance.messenger;
490 this->vulkan_version = instance.vulkan_version;
491 instance.instance = nullptr;
492 instance.messenger = nullptr;
493
494 this->surface = surface;
495 this->preferred_present_mode = preferredMode;
496 window_parameters = parameters;
497
498 gpu = create_physical_device(this->instance, surface, gpu_index);
499
500 queue_family_index = choose_queue_family_index(gpu, surface);
502
504 auto properties = gpu.getProperties();
505 if (properties.apiVersion < VK_API_VERSION_1_1) {
506 vulkan_version = VK_API_VERSION_1_0;
507 }
508
509 log_gpu_info(properties, vulkan_version);
510
511 queue = device.getQueue(queue_family_index, 0);
513 create_swapchain_views(device, swapchain, swapchain_atributes.format.format, swapchain_images);
514}
vk::DebugUtilsMessengerEXT messenger
void create_swap_chain(vk::SwapchainKHR &&old_swap_chain=vk::SwapchainKHR{})

References create_logical_device(), create_swap_chain(), device, dynamic_dispatcher, gpu, instance, messenger, vulkan_display_detail::no_queue_index_found, queue_family_index, surface, swapchain, swapchain_atributes, swapchain_images, vulkan_version, and window_parameters.

Referenced by vulkan_display::VulkanDisplay::init().

Here is the call graph for this function:

◆ is_yCbCr_supported()

bool vulkan_display_detail::VulkanContext::is_yCbCr_supported ( ) const
inline

◆ recreate_swapchain()

void vulkan_display_detail::VulkanContext::recreate_swapchain ( vulkan_display::WindowParameters parameters,
vk::RenderPass render_pass )

Definition at line 532 of file vulkan_context.cpp.

532 {
533 window_parameters = parameters;
534
535 device.waitIdle();
536
539 vk::SwapchainKHR old_swap_chain = swapchain;
540 create_swap_chain(std::move(old_swap_chain));
541 create_swapchain_views(device, swapchain, swapchain_atributes.format.format, swapchain_images);
542 create_framebuffers(render_pass);
543}
void create_framebuffers(vk::RenderPass render_pass)

References create_framebuffers(), create_swap_chain(), destroy_framebuffers(), destroy_swapchain_views(), device, swapchain, swapchain_atributes, swapchain_images, and window_parameters.

Referenced by vulkan_display::VulkanDisplay::display_queued_image(), and vulkan_display::VulkanDisplay::window_parameters_changed().

Here is the call graph for this function:

Member Data Documentation

◆ capabilities

vk::SurfaceCapabilitiesKHR vulkan_display_detail::VulkanContext::capabilities

Definition at line 147 of file vulkan_context.hpp.

Referenced by create_swap_chain().

◆ device

◆ dynamic_dispatcher

std::unique_ptr<vk::DispatchLoaderDynamic> vulkan_display_detail::VulkanContext::dynamic_dispatcher {}
private

Definition at line 133 of file vulkan_context.hpp.

133{};

Referenced by destroy(), and init().

◆ format

vk::SurfaceFormatKHR vulkan_display_detail::VulkanContext::format

Definition at line 148 of file vulkan_context.hpp.

◆ gpu

vk::PhysicalDevice vulkan_display_detail::VulkanContext::gpu
private

Definition at line 137 of file vulkan_context.hpp.

Referenced by create_logical_device(), create_swap_chain(), get_gpu(), and init().

◆ image_size

vk::Extent2D vulkan_display_detail::VulkanContext::image_size

Definition at line 150 of file vulkan_context.hpp.

◆ instance

vk::Instance vulkan_display_detail::VulkanContext::instance
private

Definition at line 132 of file vulkan_context.hpp.

Referenced by destroy(), and init().

◆ messenger

vk::DebugUtilsMessengerEXT vulkan_display_detail::VulkanContext::messenger
private

Definition at line 134 of file vulkan_context.hpp.

Referenced by destroy(), and init().

◆ mode

vk::PresentModeKHR vulkan_display_detail::VulkanContext::mode = vk::PresentModeKHR::eFifo

Definition at line 149 of file vulkan_context.hpp.

◆ preferred_present_mode

vk::PresentModeKHR vulkan_display_detail::VulkanContext::preferred_present_mode {}
private

Definition at line 154 of file vulkan_context.hpp.

154{};

Referenced by create_swap_chain().

◆ queue

vk::Queue vulkan_display_detail::VulkanContext::queue
private

Definition at line 142 of file vulkan_context.hpp.

Referenced by get_queue().

◆ queue_family_index

uint32_t vulkan_display_detail::VulkanContext::queue_family_index = no_queue_index_found
private

Definition at line 141 of file vulkan_context.hpp.

Referenced by create_logical_device(), get_queue_family_index(), and init().

◆ surface

vk::SurfaceKHR vulkan_display_detail::VulkanContext::surface
private

Definition at line 144 of file vulkan_context.hpp.

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

◆ swapchain

vk::SwapchainKHR vulkan_display_detail::VulkanContext::swapchain
private

◆ [struct]

struct { ... } vulkan_display_detail::VulkanContext::swapchain_atributes

◆ swapchain_images

std::vector<SwapchainImage> vulkan_display_detail::VulkanContext::swapchain_images {}
private

◆ vulkan_version

uint32_t vulkan_display_detail::VulkanContext::vulkan_version {}
private

Definition at line 135 of file vulkan_context.hpp.

135{};

Referenced by create_logical_device(), get_vulkan_version(), and init().

◆ window_parameters

vulkan_display::WindowParameters vulkan_display_detail::VulkanContext::window_parameters
private

◆ yCbCr_supported

bool vulkan_display_detail::VulkanContext::yCbCr_supported = false
private

Definition at line 139 of file vulkan_context.hpp.

Referenced by create_logical_device(), and is_yCbCr_supported().


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