MayaFlux 0.1.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
108private:
109 vk::PhysicalDevice m_physical_device; ///< Selected physical device (GPU)
110 vk::Device m_logical_device; ///< Logical device handle
111
112 vk::Queue m_graphics_queue; ///< Graphics queue handle
113 vk::Queue m_compute_queue; ///< Compute queue handle
114 vk::Queue m_transfer_queue; ///< Transfer queue handle
115
116 QueueFamilyIndices m_queue_families; ///< Indices of required queue families
117
118 /**
119 * @brief Pick a suitable physical device (GPU)
120 * @param instance Vulkan instance
121 * @param temp_surface Temporary surface for presentation support checks
122 * @return true if a suitable device was found
123 */
124 bool pick_physical_device(vk::Instance instance, vk::SurfaceKHR temp_surface);
125
126 /**
127 * @brief Find queue families on the given physical device
128 * @param device Physical device to query
129 * @param surface Optional surface to check for presentation support
130 * @return QueueFamilyIndices with found queue family indices
131 */
132 QueueFamilyIndices find_queue_families(vk::PhysicalDevice device, vk::SurfaceKHR surface = nullptr);
133
134 /**
135 * @brief Create the logical device and retrieve queue handles
136 * @param instance Vulkan instance
137 * @param backend_info Graphics backend configuration
138
139 * @return true if logical device creation succeeded
140 */
141 bool create_logical_device(vk::Instance instance, const GraphicsBackendInfo& backend_info);
142
144
145 // Add more members and methods as needed for device management
146};
147}
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:189
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
VKDevice & operator=(const VKDevice &)=delete
VKDevice(const VKDevice &)=delete
vk::PhysicalDevice m_physical_device
Selected physical device (GPU)
Definition VKDevice.hpp:109
vk::Queue m_compute_queue
Compute queue handle.
Definition VKDevice.hpp:113
bool create_logical_device(vk::Instance instance, const GraphicsBackendInfo &backend_info)
Create the logical device and retrieve queue handles.
Definition VKDevice.cpp:200
vk::Queue m_transfer_queue
Transfer queue handle.
Definition VKDevice.hpp:114
vk::Device m_logical_device
Logical device handle.
Definition VKDevice.hpp:110
QueueFamilyIndices find_queue_families(vk::PhysicalDevice device, vk::SurfaceKHR surface=nullptr)
Find queue families on the given physical device.
Definition VKDevice.cpp:103
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:146
vk::Queue m_graphics_queue
Graphics queue handle.
Definition VKDevice.hpp:112
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
QueueFamilyIndices m_queue_families
Indices of required queue families.
Definition VKDevice.hpp:116
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