MayaFlux 0.3.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
VKDevice.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "VKInstance.hpp"
4
5namespace MayaFlux::Core {
6
7struct GraphicsBackendInfo;
8
9/**
10 * @struct QueueFamilyIndices
11 * @brief Stores indices of queue families we need
12 */
14 std::optional<uint32_t> graphics_family;
15 std::optional<uint32_t> compute_family;
16 std::optional<uint32_t> transfer_family;
17 std::optional<uint32_t> present_family;
18
19 [[nodiscard]] bool is_complete() const
20 {
21 return graphics_family.has_value();
22 }
23};
24
25/**
26 * @class VKDevice
27 * @brief Manages Vulkan physical device selection and logical device creation
28 *
29 * Handles GPU selection and creates the logical device interface
30 * for executing commands.
31 */
32class VKDevice {
33public:
34 VKDevice() = default;
35 ~VKDevice();
36
37 VKDevice(const VKDevice&) = delete;
38 VKDevice& operator=(const VKDevice&) = delete;
39 VKDevice(VKDevice&&) noexcept;
40 VKDevice& operator=(VKDevice&&) noexcept;
41
42 /**
43 * @brief Initialize device (pick physical device and create logical device)
44 * @param instance Vulkan instance
45 * @param backend_info Graphics surface configuration
46 * @param temp_surface Temporary surface for presentation support checks (real surface created with windows and swapchain later)
47 * @return true if initialization succeeded
48 */
49 bool initialize(vk::Instance instance, vk::SurfaceKHR temp_surface, const GraphicsBackendInfo& backend_info);
50
51 /**
52 * @brief Cleanup device resources
53 */
54 void cleanup();
55
56 /**
57 * @brief Get physical device handle
58 */
59 [[nodiscard]] vk::PhysicalDevice get_physical_device() const { return m_physical_device; }
60
61 /**
62 * @brief Get logical device handle
63 */
64 [[nodiscard]] vk::Device get_device() const { return m_logical_device; }
65
66 /**
67 * @brief Get graphics queue
68 */
69 [[nodiscard]] vk::Queue get_graphics_queue() const { return m_graphics_queue; }
70
71 /**
72 * @brief Get compute queue (may be same as graphics)
73 */
74 [[nodiscard]] vk::Queue get_compute_queue() const { return m_compute_queue; }
75
76 /**
77 * @brief Get transfer queue (may be same as graphics)
78 */
79 [[nodiscard]] vk::Queue get_transfer_queue() const { return m_transfer_queue; }
80
81 /**
82 * @brief Get queue family indices
83 */
84 [[nodiscard]] const QueueFamilyIndices& get_queue_families() const { return m_queue_families; }
85
86 /**
87 * @brief Update presentation queue family for a specific surface
88 * @param surface Surface to check presentation support for
89 * @return true if presentation support found
90 */
91 bool update_presentation_queue(vk::SurfaceKHR surface);
92
93 /**
94 * @brief Wait for the device to become idle
95 */
96 void wait_idle() const
97 {
98 if (m_logical_device) {
99 m_logical_device.waitIdle();
100 }
101 }
102
103 /**
104 * @brief Query and log supported device extensions
105 */
107
108 /**
109 * @brief Check if the device supports mesh shaders
110 * @return true if mesh shaders are supported
111 */
112 [[nodiscard]] bool supports_mesh_shaders() const { return m_supports_mesh_shaders; }
113
114private:
115 vk::PhysicalDevice m_physical_device; ///< Selected physical device (GPU)
116 vk::Device m_logical_device; ///< Logical device handle
117
118 vk::Queue m_graphics_queue; ///< Graphics queue handle
119 vk::Queue m_compute_queue; ///< Compute queue handle
120 vk::Queue m_transfer_queue; ///< Transfer queue handle
121
122 QueueFamilyIndices m_queue_families; ///< Indices of required queue families
123
124 /**
125 * @brief Pick a suitable physical device (GPU)
126 * @param instance Vulkan instance
127 * @param temp_surface Temporary surface for presentation support checks
128 * @return true if a suitable device was found
129 */
130 bool pick_physical_device(vk::Instance instance, vk::SurfaceKHR temp_surface);
131
132 /**
133 * @brief Find queue families on the given physical device
134 * @param device Physical device to query
135 * @param surface Optional surface to check for presentation support
136 * @return QueueFamilyIndices with found queue family indices
137 */
138 QueueFamilyIndices find_queue_families(vk::PhysicalDevice device, vk::SurfaceKHR surface = nullptr);
139
140 /**
141 * @brief Create the logical device and retrieve queue handles
142 * @param instance Vulkan instance
143 * @param backend_info Graphics backend configuration
144
145 * @return true if logical device creation succeeded
146 */
147 bool create_logical_device(vk::Instance instance, const GraphicsBackendInfo& backend_info);
148
149 bool m_presentation_initialized {}; ///< Whether presentation support has been initialized
150
151 bool m_supports_mesh_shaders {}; ///< Whether the device supports mesh shaders
152};
153}
vk::PhysicalDevice get_physical_device() const
Get physical device handle.
Definition VKDevice.hpp:59
void query_supported_extensions()
Query and log supported device extensions.
Definition VKDevice.cpp:229
const QueueFamilyIndices & get_queue_families() const
Get queue family indices.
Definition VKDevice.hpp:84
bool pick_physical_device(vk::Instance instance, vk::SurfaceKHR temp_surface)
Pick a suitable physical device (GPU)
Definition VKDevice.cpp:72
void cleanup()
Cleanup device resources.
Definition VKDevice.cpp:58
bool m_supports_mesh_shaders
Whether the device supports mesh shaders.
Definition VKDevice.hpp:151
VKDevice & operator=(const VKDevice &)=delete
VKDevice(const VKDevice &)=delete
vk::PhysicalDevice m_physical_device
Selected physical device (GPU)
Definition VKDevice.hpp:115
vk::Queue m_compute_queue
Compute queue handle.
Definition VKDevice.hpp:119
bool create_logical_device(vk::Instance instance, const GraphicsBackendInfo &backend_info)
Create the logical device and retrieve queue handles.
Definition VKDevice.cpp:240
vk::Queue m_transfer_queue
Transfer queue handle.
Definition VKDevice.hpp:120
vk::Device m_logical_device
Logical device handle.
Definition VKDevice.hpp:116
QueueFamilyIndices find_queue_families(vk::PhysicalDevice device, vk::SurfaceKHR surface=nullptr)
Find queue families on the given physical device.
Definition VKDevice.cpp:143
vk::Device get_device() const
Get logical device handle.
Definition VKDevice.hpp:64
bool update_presentation_queue(vk::SurfaceKHR surface)
Update presentation queue family for a specific surface.
Definition VKDevice.cpp:186
bool m_presentation_initialized
Whether presentation support has been initialized.
Definition VKDevice.hpp:149
vk::Queue m_graphics_queue
Graphics queue handle.
Definition VKDevice.hpp:118
vk::Queue get_graphics_queue() const
Get graphics queue.
Definition VKDevice.hpp:69
vk::Queue get_compute_queue() const
Get compute queue (may be same as graphics)
Definition VKDevice.hpp:74
vk::Queue get_transfer_queue() const
Get transfer queue (may be same as graphics)
Definition VKDevice.hpp:79
bool supports_mesh_shaders() const
Check if the device supports mesh shaders.
Definition VKDevice.hpp:112
QueueFamilyIndices m_queue_families
Indices of required queue families.
Definition VKDevice.hpp:122
void wait_idle() const
Wait for the device to become idle.
Definition VKDevice.hpp:96
Manages Vulkan physical device selection and logical device creation.
Definition VKDevice.hpp:32
void initialize()
Definition main.cpp:11
Configuration for graphics API backend (Vulkan/OpenGL/etc.)
std::optional< uint32_t > transfer_family
Definition VKDevice.hpp:16
std::optional< uint32_t > graphics_family
Definition VKDevice.hpp:14
std::optional< uint32_t > present_family
Definition VKDevice.hpp:17
std::optional< uint32_t > compute_family
Definition VKDevice.hpp:15
Stores indices of queue families we need.
Definition VKDevice.hpp:13