-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdevice.cppm
More file actions
80 lines (64 loc) · 2.53 KB
/
device.cppm
File metadata and controls
80 lines (64 loc) · 2.53 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
module;
#include <vulkan/vulkan.h>
export module vk:device;
export import :types;
export import :utilities;
export namespace vk {
inline namespace v1 {
/**
* @name device
* @brief represents a vulkan logical device
*/
class device {
struct queue_family {
VkQueue graphics = nullptr;
VkQueue compute = nullptr;
VkQueue transfer = nullptr;
};
public:
device(const VkPhysicalDevice& p_physical, const device_params& p_config) {
VkDeviceQueueCreateInfo device_queue_ci = {
.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
.pNext = nullptr,
.flags = 0,
.queueFamilyIndex = p_config.queue_family_index,
.queueCount =
static_cast<uint32_t>(p_config.queue_priorities.size()),
.pQueuePriorities = p_config.queue_priorities.data(),
};
VkDeviceCreateInfo create_info = {
.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
.pNext = nullptr,
.flags = 0,
.queueCreateInfoCount = 1,
.pQueueCreateInfos = &device_queue_ci,
.enabledLayerCount = 0,
.ppEnabledLayerNames = nullptr,
.enabledExtensionCount =
static_cast<uint32_t>(p_config.extensions.size()),
.ppEnabledExtensionNames = p_config.extensions.data(),
};
VkPhysicalDeviceFeatures features;
vkGetPhysicalDeviceFeatures(p_physical, &features);
features.robustBufferAccess = false;
create_info.pEnabledFeatures = &features;
vk_check(vkCreateDevice(p_physical, &create_info, nullptr, &m_device),
"vkCreateDevice");
}
[[nodiscard]] queue_family family() const { return m_queue_family; }
void destroy() {
if (m_device != nullptr) {
vkDestroyDevice(m_device, nullptr);
}
}
void wait() {
vkDeviceWaitIdle(m_device);
}
operator VkDevice() const { return m_device; }
operator VkDevice() { return m_device; }
private:
VkDevice m_device = nullptr;
queue_family m_queue_family{};
};
};
};