5#ifndef DODO_VULKANCONTEXT_HPP
6#define DODO_VULKANCONTEXT_HPP
14#include <vulkan/vulkan_raii.hpp>
37 template<
typename... Features>
40 vk::StructureChain<Features...>
featureChain = vk::StructureChain<vk::PhysicalDeviceFeatures2>{};
54 static VKAPI_ATTR vk::Bool32 VKAPI_CALL
defaultDebugCallback(vk::DebugUtilsMessageSeverityFlagBitsEXT severity,
55 vk::DebugUtilsMessageTypeFlagsEXT type,
56 const vk::DebugUtilsMessengerCallbackDataEXT *pCallbackData,
62 template<
typename... Features>
73 static bool isDeviceSuitable(
const vk::raii::PhysicalDevice &physicalDevice);
75 template<
typename FirstFeature,
typename... OtherFeatures>
76 static FirstFeature &
getFirstFeature(vk::StructureChain<FirstFeature, OtherFeatures...> featureChain);
81template<
typename... Features>
83-> std::expected<VulkanContext, std::string> {
87 if (
auto result = checkRequiredLayers(vulkanContext, debugInfo.
validationLayers); !result)
88 return std::unexpected(result.error());
92 uint32_t glfwExtensionCount = 0;
94 if (
auto result = checkRequiredExtensions(vulkanContext, std::span(glfwExtensions, glfwExtensionCount)); !result)
95 return std::unexpected(result.error());
97 const vk::InstanceCreateInfo createInfo{
98 .pApplicationInfo = &ctxInfo.vkInfo,
99 .enabledLayerCount =
static_cast<uint32_t
>(debugInfo.
validationLayers.size()),
101 .enabledExtensionCount = glfwExtensionCount,
102 .ppEnabledExtensionNames = glfwExtensions,
105 vulkanContext.
_instance = vk::raii::Instance(vulkanContext.
_context, createInfo);
106 return vulkanContext;
Definition DodoContext.hpp:15
Definition VulkanContext.hpp:22
VulkanContext(const VulkanContext &other)=delete
static auto pickPhysicalDevice(VulkanContext &vulkanContext) -> std::expected< bool, std::string >
Definition VulkanContext.cpp:83
static auto checkRequiredExtensions(const VulkanContext &vulkanContext, std::span< const char *const > glfwExtensions) -> std::expected< bool, std::string >
Definition VulkanContext.cpp:41
static auto checkRequiredLayers(const VulkanContext &vulkanContext, std::span< const char *const > validationLayers) -> std::expected< bool, std::string >
Definition VulkanContext.cpp:27
static void setupDebugMessenger(VulkanContext &vulkanContext, DebugCallback debugCallback)
Definition VulkanContext.cpp:61
vk::raii::DebugUtilsMessengerEXT _debugMessenger
Definition VulkanContext.hpp:27
vk::raii::PhysicalDevice _physicalDevice
Definition VulkanContext.hpp:26
vk::raii::Context _context
Definition VulkanContext.hpp:24
vk::PFN_DebugUtilsMessengerCallbackEXT DebugCallback
Definition VulkanContext.hpp:29
static bool isDeviceSuitable(const vk::raii::PhysicalDevice &physicalDevice)
Definition VulkanContext.cpp:111
VulkanContext & operator=(const VulkanContext &other)=delete
vk::raii::Instance _instance
Definition VulkanContext.hpp:25
static VKAPI_ATTR vk::Bool32 VKAPI_CALL defaultDebugCallback(vk::DebugUtilsMessageSeverityFlagBitsEXT severity, vk::DebugUtilsMessageTypeFlagsEXT type, const vk::DebugUtilsMessengerCallbackDataEXT *pCallbackData, void *)
Definition VulkanContext.cpp:73
static FirstFeature & getFirstFeature(vk::StructureChain< FirstFeature, OtherFeatures... > featureChain)
Definition VulkanContext.cpp:119
static auto createContext(const VulkanContextInfo< Features... > &ctxInfo) -> std::expected< VulkanContext, std::string >
Definition VulkanContext.hpp:82
The header of the GLFW 3 API.
GLFWAPI const char ** glfwGetRequiredInstanceExtensions(uint32_t *count)
Returns the Vulkan instance extensions required by GLFW.
const std::vector< char const * > validationLayers
Definition main.cpp:28
Definition VulkanContext.hpp:38
VulkanDebug debugInfo
Definition VulkanContext.hpp:41
vk::ApplicationInfo vkInfo
Definition VulkanContext.hpp:39
vk::StructureChain< Features... > featureChain
Definition VulkanContext.hpp:40
Definition VulkanContext.hpp:31
DebugCallback debugCallback
Definition VulkanContext.hpp:34
bool debugEnabled
Definition VulkanContext.hpp:32
std::span< const char *const > validationLayers
Definition VulkanContext.hpp:33