Dodo 0.1
Template for CPP projects
Loading...
Searching...
No Matches
VulkanContext.hpp
Go to the documentation of this file.
1//
2// Created by nicol on 21/02/2026.
3//
4
5#ifndef DODO_VULKANCONTEXT_HPP
6#define DODO_VULKANCONTEXT_HPP
7
8#include <expected>
9#include <functional>
10#include <string>
11#include <map>
12#include <iostream>
13#include <utility>
14#include <vulkan/vulkan_raii.hpp>
15
16#include "GLFW/glfw3.h"
17
18namespace dodo::core {
19
20class DodoContext;
21
23private:
24 vk::raii::Context _context;
25 vk::raii::Instance _instance = nullptr;
26 vk::raii::PhysicalDevice _physicalDevice = nullptr;
27 vk::raii::DebugUtilsMessengerEXT _debugMessenger = nullptr;
28public:
29 using DebugCallback = vk::PFN_DebugUtilsMessengerCallbackEXT;
30
31 struct VulkanDebug {
32 bool debugEnabled = false;
33 std::span<const char *const> validationLayers;
35 };
36
37 template<typename... Features>
39 vk::ApplicationInfo vkInfo;
40 vk::StructureChain<Features...> featureChain = vk::StructureChain<vk::PhysicalDeviceFeatures2>{};
42 };
43
44 ~VulkanContext() = default;
45
46 VulkanContext(const VulkanContext &other) = delete;
47
48 VulkanContext &operator=(const VulkanContext &other) = delete;
49
50 VulkanContext(VulkanContext &&other) noexcept;
51
52 VulkanContext &operator=(VulkanContext &&other) noexcept;
53
54 static VKAPI_ATTR vk::Bool32 VKAPI_CALL defaultDebugCallback(vk::DebugUtilsMessageSeverityFlagBitsEXT severity,
55 vk::DebugUtilsMessageTypeFlagsEXT type,
56 const vk::DebugUtilsMessengerCallbackDataEXT *pCallbackData,
57 void *);
58
59private:
60 VulkanContext() = default;
61
62 template<typename... Features>
63 static auto createContext(const VulkanContextInfo<Features...> &ctxInfo) -> std::expected<VulkanContext, std::string>;
64
65 static auto checkRequiredLayers(const VulkanContext &vulkanContext, std::span<const char * const> validationLayers) -> std::expected<bool, std::string>;
66
67 static auto checkRequiredExtensions(const VulkanContext &vulkanContext, std::span<const char * const> glfwExtensions) -> std::expected<bool, std::string>;
68
69 static void setupDebugMessenger(VulkanContext &vulkanContext, DebugCallback debugCallback);
70
71 static auto pickPhysicalDevice(VulkanContext &vulkanContext) -> std::expected<bool, std::string>;
72
73 static bool isDeviceSuitable(const vk::raii::PhysicalDevice &physicalDevice);
74
75 template<typename FirstFeature, typename... OtherFeatures>
76 static FirstFeature &getFirstFeature(vk::StructureChain<FirstFeature, OtherFeatures...> featureChain);
77
78 friend class DodoContext;
79};
80
81template<typename... Features>
83-> std::expected<VulkanContext, std::string> {
84 VulkanContext vulkanContext;
85 VulkanDebug debugInfo = ctxInfo.debugInfo;
86 if (debugInfo.debugEnabled) {
87 if (auto result = checkRequiredLayers(vulkanContext, debugInfo.validationLayers); !result)
88 return std::unexpected(result.error());
89 // setupDebugMessenger(vulkanContext, debugInfo.debugCallback);
90 }
91
92 uint32_t glfwExtensionCount = 0;
93 const auto glfwExtensions = glfwGetRequiredInstanceExtensions(&glfwExtensionCount);
94 if (auto result = checkRequiredExtensions(vulkanContext, std::span(glfwExtensions, glfwExtensionCount)); !result)
95 return std::unexpected(result.error());
96
97 const vk::InstanceCreateInfo createInfo{
98 .pApplicationInfo = &ctxInfo.vkInfo,
99 .enabledLayerCount = static_cast<uint32_t>(debugInfo.validationLayers.size()),
100 .ppEnabledLayerNames = debugInfo.validationLayers.data(),
101 .enabledExtensionCount = glfwExtensionCount,
102 .ppEnabledExtensionNames = glfwExtensions,
103 };
104
105 vulkanContext._instance = vk::raii::Instance(vulkanContext._context, createInfo);
106 return vulkanContext;
107}
108
109}
110
111#endif // DODO_VULKANCONTEXT_HPP
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 App.cpp:7
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