-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDevice.cpp
153 lines (126 loc) · 4.74 KB
/
Device.cpp
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#include "Device.hpp"
#include "vulkan/vulkan_beta.h"
#include <string_view>
Device::Device(VulkanInstance& instance, Surface& surface)
: m_PhysicalDevice(instance.Get().enumeratePhysicalDevices().front()),
m_Device(CreateDevice(surface))
{
}
vk::raii::Device Device::CreateDevice(Surface& surface)
{
std::vector<vk::DeviceQueueCreateInfo> deviceQueueCreateInfos =
GetDeviceQueueCreateInfos(surface);
std::vector<const char*> deviceExtensions = GetDeviceExtentionNames();
std::vector<const char*> deviceLayers;
vk::DeviceCreateInfo createInfo(
vk::DeviceCreateFlags(), deviceQueueCreateInfos, deviceLayers,
deviceExtensions);
return m_PhysicalDevice.createDevice(createInfo);
}
std::vector<vk::DeviceQueueCreateInfo>
Device::GetDeviceQueueCreateInfos(Surface& surface)
{
std::vector<vk::QueueFamilyProperties> queueFamilyProperties =
m_PhysicalDevice.getQueueFamilyProperties();
std::vector<vk::DeviceQueueCreateInfo> deviceQueueCreateInfos;
deviceQueueCreateInfos.reserve(queueFamilyProperties.size());
m_DeviceQueues.reserve(queueFamilyProperties.size());
LogDebug("Queues:");
for (uint32_t i = 0; i < queueFamilyProperties.size(); i++)
{
const vk::QueueFamilyProperties& properties =
queueFamilyProperties.at(i);
m_DeviceQueues.emplace_back(
std::vector<float>(properties.queueCount, 1.0f),
m_PhysicalDevice.getSurfaceSupportKHR(i, *surface.Get()));
// TODO: fix queue flags not being able to be print
LogDebug(fmt::format(
"\tQueue Family [{}]: {} {}", i, properties.queueCount,
static_cast<bool>(m_DeviceQueues.at(i).m_PresentationSupported)));
vk::DeviceQueueCreateInfo createInfo(
{}, i, m_DeviceQueues.at(i).m_Priorities);
deviceQueueCreateInfos.push_back(createInfo);
}
return deviceQueueCreateInfos;
}
std::vector<const char*> Device::GetDeviceExtentionNames()
{
VkResult result;
std::vector<const char*> deviceExtensions = {
VK_KHR_SWAPCHAIN_EXTENSION_NAME};
std::vector<vk::ExtensionProperties> deviceSupportedExtensions =
m_PhysicalDevice.enumerateDeviceExtensionProperties();
LogDebug("Physical Device Supported Extensions:");
for (const auto properties : deviceSupportedExtensions)
{
LogDebug(
fmt::format("\t{}", std::string_view(properties.extensionName)));
}
for (const auto& extension : deviceSupportedExtensions)
{
// https://vulkan.lunarg.com/doc/view/1.3.250.1/mac/1.3-extensions/vkspec.html#VUID-VkDeviceCreateInfo-pProperties-04451
if (!strcmp(
extension.extensionName,
VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME))
{
deviceExtensions.push_back(
VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME);
}
}
return deviceExtensions;
}
vk::raii::Device& Device::Get() { return m_Device; }
vk::raii::PhysicalDevice& Device::GetPhysicalDevice()
{
return m_PhysicalDevice;
}
uint32_t Device::FindMemoryType(
vk::MemoryRequirements memoryRequirements,
vk::MemoryPropertyFlags memoryPropertyFlags)
{
vk::PhysicalDeviceMemoryProperties memoryProperties =
m_PhysicalDevice.getMemoryProperties();
uint32_t memoryTypeIndex;
LogDebug(
fmt::format("TypeFilter: {:#b}", memoryRequirements.memoryTypeBits));
LogDebug(fmt::format("Available Memory Types:"));
for (uint32_t i = 0; i < memoryProperties.memoryTypeCount; i++)
{
LogDebug(fmt::format(
"\t{:#b}", static_cast<uint32_t>(
memoryProperties.memoryTypes[i].propertyFlags)));
}
for (uint32_t i = 0; i < memoryProperties.memoryTypeCount; i++)
{
if ((memoryRequirements.memoryTypeBits & (1 << i)) &&
(memoryProperties.memoryTypes[i].propertyFlags &
memoryPropertyFlags) == memoryPropertyFlags)
{
memoryTypeIndex = i;
break;
}
if (i == memoryProperties.memoryTypeCount - 1)
{
LogError("ERROR: failed to find suitable memory type\n");
}
}
return memoryTypeIndex;
}
vk::SurfaceCapabilitiesKHR
Device::GetSurfaceCapabilities(vk::raii::SurfaceKHR& surface)
{
return m_PhysicalDevice.getSurfaceCapabilitiesKHR(*surface);
}
std::vector<vk::SurfaceFormatKHR>
Device::GetCompatableSurfaceFormats(vk::raii::SurfaceKHR& surface)
{
std::vector<vk::SurfaceFormatKHR> surfaceFormats =
m_PhysicalDevice.getSurfaceFormatsKHR(*surface);
LogDebug("Supported Formats:");
for (const auto& surfaceFormat : surfaceFormats)
{
LogDebug(fmt::format(
"\t{}, {}", surfaceFormat.colorSpace, surfaceFormat.format));
}
return surfaceFormats;
}