HoviTron Video Pipeline
Public Member Functions | Data Fields
VulkanContext Class Reference

class that manages tasks related to Vulkan context (Vulkan Instance, Vulkan Physical device, Vulkan Logical device) More...

#include <VulkanContext.h>

Public Member Functions

 VulkanContext (WindowAbstract *window)
 
void initVulkan ()
 
void cleanUp ()
 
bool isInitialized ()
 
QueueFamilyIndices findQueueFamilies (vk::PhysicalDevice device)
 
vk::Format findSupportedFormat (const std::vector< vk::Format > &candidates, vk::ImageTiling tiling, vk::FormatFeatureFlags features)
 
vk::Format findDepthFormat ()
 
bool hasStencilComponent (vk::Format format)
 
bool isIndepFromWindowDimension ()
 
WindowAbstractget_window ()
 

Data Fields

vk::Instance instance
 
vk::PhysicalDevice physicalDevice
 
vk::Device device
 
vk::Queue graphicsQueue
 
vk::Queue presentQueue
 
vk::Queue transferQueue
 
uint32_t queueFamilyIndex =0
 
uint32_t transferQueueFamilyIndex = 0
 

Detailed Description

class that manages tasks related to Vulkan context (Vulkan Instance, Vulkan Physical device, Vulkan Logical device)

Manage Vulkan Instance, Vulkan Physical device, Vulkan Logical device, queues families This class also has the task to pick the correct gpu exept if openxr already chose it.

Definition at line 59 of file VulkanContext.h.

Constructor & Destructor Documentation

◆ VulkanContext()

VulkanContext::VulkanContext ( WindowAbstract window)

Constructor

Definition at line 615 of file VulkanContext.cpp.

616{
617 this->window = window;
618}

Member Function Documentation

◆ cleanUp()

void VulkanContext::cleanUp ( )

Clean up Vulkan objects

Definition at line 622 of file VulkanContext.cpp.

623{
624 // destroy
625
626 window->cleanUpSurface();
627 device.destroy();
628#ifdef __ANDROID__
629 if (window->isValidationLayersEnabled()) {
630 VkInstance vkInstance = static_cast<VkInstance>(instance);
631 auto messenger = static_cast<VkDebugUtilsMessengerEXT>(debugMessenger);
632 pfnDestroyDebugUtilsMessengerEXT(vkInstance,messenger,nullptr);
633 }
634#else
635 if (window->isValidationLayersEnabled()) {
636 instance.destroyDebugUtilsMessengerEXT(debugMessenger);
637 }
638#endif
639 instance.destroy();
640}
vk::Instance instance
Definition: VulkanContext.h:83
vk::Device device
Definition: VulkanContext.h:87
virtual void cleanUpSurface()=0
const bool isValidationLayersEnabled()

◆ findDepthFormat()

vk::Format VulkanContext::findDepthFormat ( )

find the depth format

Definition at line 541 of file VulkanContext.cpp.

542{
543 return findSupportedFormat(
544 { vk::Format::eD32Sfloat, vk::Format::eD32SfloatS8Uint, vk::Format::eD24UnormS8Uint },
545 vk::ImageTiling::eOptimal,
546 vk::FormatFeatureFlagBits::eDepthStencilAttachment
547 );
548}
vk::Format findSupportedFormat(const std::vector< vk::Format > &candidates, vk::ImageTiling tiling, vk::FormatFeatureFlags features)

◆ findQueueFamilies()

QueueFamilyIndices VulkanContext::findQueueFamilies ( vk::PhysicalDevice  device)

return the queue family for presentation and graphics

Definition at line 493 of file VulkanContext.cpp.

494{
495 QueueFamilyIndices indices;
496 auto queueFamilies = device.getQueueFamilyProperties();
497
498 int i = 0;
499 for (const auto& queueFamily : queueFamilies) {
500 if (queueFamily.queueFlags & vk::QueueFlagBits::eGraphics) {
501 indices.graphicsFamily = i;
502 } else if(queueFamily.queueFlags & vk::QueueFlagBits::eCompute) {
503 //Compute only
504 } else if(queueFamily.queueFlags & vk::QueueFlagBits::eTransfer) {
505 // Transfer only queue
506 indices.transferFamily = i;
507 }
508 if (window->isDeviceSupportingSufaceKHR(static_cast<VkPhysicalDevice>(device),i)) {
509 indices.presentFamily = i;
510 }
511 if (indices.isComplete()) {
512 break;
513 }
514
515 i++;
516 }
517
518 if (!indices.presentFamily.has_value() && window->useOpenXR() ) {
519 //In some case there is no surface to test for present support for the queue
520 //In this corner case --> default to graphism queue for present queue
521 indices.presentFamily = indices.graphicsFamily.value();
522 }
523
524 return indices;
525}
virtual const bool useOpenXR()
virtual VkBool32 isDeviceSupportingSufaceKHR(VkPhysicalDevice device, int i)=0
Struct to encapsulate the indice of the queues families.
Definition: VulkanContext.h:38
std::optional< uint32_t > transferFamily
Definition: VulkanContext.h:44
std::optional< uint32_t > graphicsFamily
Definition: VulkanContext.h:40
std::optional< uint32_t > presentFamily
Definition: VulkanContext.h:42

◆ findSupportedFormat()

vk::Format VulkanContext::findSupportedFormat ( const std::vector< vk::Format > &  candidates,
vk::ImageTiling  tiling,
vk::FormatFeatureFlags  features 
)

find the supported depth format

Definition at line 527 of file VulkanContext.cpp.

528{
529 for (vk::Format format : candidates) {
530 vk::FormatProperties props = physicalDevice.getFormatProperties(format);
531 if (tiling == vk::ImageTiling::eLinear && (props.linearTilingFeatures & features) == features) {
532 return format;
533 }
534 else if (tiling == vk::ImageTiling::eOptimal && (props.optimalTilingFeatures & features) == features) {
535 return format;
536 }
537 }
538 throw std::runtime_error("failed to find supported format!");
539}
vk::PhysicalDevice physicalDevice
Definition: VulkanContext.h:85

◆ get_window()

WindowAbstract * VulkanContext::get_window ( )
inline

Return a pointer to WindowAbstract class

Definition at line 108 of file VulkanContext.h.

108{return window;};

◆ hasStencilComponent()

bool VulkanContext::hasStencilComponent ( vk::Format  format)

return true if the format have a stencil component

Definition at line 284 of file VulkanContext.cpp.

285{
286 return format == vk::Format::eD32SfloatS8Uint || format == vk::Format::eD24UnormS8Uint;
287}

◆ initVulkan()

void VulkanContext::initVulkan ( )

Initialize the Vulkan instance, pick the physical device, logical device

Definition at line 152 of file VulkanContext.cpp.

153{
154 try
155 {
156
157PRINT("Before instance creation;");
158
159 createInstance();
160
161 PRINT("setupDebug");
162
163
164 //LOGI("I'm a test c");
165 setupDebugMessenger();
166
167
168 window->createSurface();
169
170 PRINT("Physical device");
171
172#ifdef USE_OPENXR
173 if (window->useOpenXR()) {
174 static_cast<WindowOpenXR*>(window)->getVulkanPhysicalDevice(reinterpret_cast<VkInstance&>(instance),
175 reinterpret_cast<VkPhysicalDevice*>(&physicalDevice));
176 }
177 else
178#endif
179 {
180 pickPhysicalDevice();
181 }
182
183 createLogicalDevice();
184 initialized = true;
185 }
186 catch (vk::SystemError& err)
187 {
188 std::cout << "vk::SystemError: " << err.what() << std::endl;
189 exit(-1);
190 }
191 catch (std::exception& err)
192 {
193 std::cout << "std::exception: " << err.what() << std::endl;
194 exit(-1);
195 }
196 catch (std::runtime_error& err)
197 {
198 std::cout << "std::runtime error: " << err.what() << std::endl;
199 exit(-1);
200 }
201 catch (...)
202 {
203 std::cout << "unknown error\n";
204 exit(-1);
205 }
206}
virtual void createSurface()=0
Class that take care of the tasks linked to OpenXR (input and display), is used when HMD support is r...
Definition: WindowOpenXR.h:52

◆ isIndepFromWindowDimension()

bool VulkanContext::isIndepFromWindowDimension ( )

return true if rendering must be independent of screen dimension

Definition at line 289 of file VulkanContext.cpp.

290{
291 return window->isIndepFromWindowDimension();
292}
bool isIndepFromWindowDimension()

◆ isInitialized()

bool VulkanContext::isInitialized ( )

return true if initialized

Definition at line 642 of file VulkanContext.cpp.

642 {
643 return initialized;
644}

Field Documentation

◆ device

vk::Device VulkanContext::device

Vulkan device

Definition at line 87 of file VulkanContext.h.

◆ graphicsQueue

vk::Queue VulkanContext::graphicsQueue

Queue selected for graphics operation

Definition at line 89 of file VulkanContext.h.

◆ instance

vk::Instance VulkanContext::instance

Vulkan Instance

Definition at line 83 of file VulkanContext.h.

◆ physicalDevice

vk::PhysicalDevice VulkanContext::physicalDevice

Vulkan PhysicalDevice (aka the GPU selected)

Definition at line 85 of file VulkanContext.h.

◆ presentQueue

vk::Queue VulkanContext::presentQueue

Queue select�ed for presentation operation, can be the same as graphicsQueue

Definition at line 91 of file VulkanContext.h.

◆ queueFamilyIndex

uint32_t VulkanContext::queueFamilyIndex =0

Queue Family Index

Definition at line 95 of file VulkanContext.h.

◆ transferQueue

vk::Queue VulkanContext::transferQueue

Queue select�ed for transfer operation

Definition at line 93 of file VulkanContext.h.

◆ transferQueueFamilyIndex

uint32_t VulkanContext::transferQueueFamilyIndex = 0

Transfer family index

Definition at line 98 of file VulkanContext.h.


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