Constructor Function. Create vkDevice.
Select one suitable physical device.
Create a queue identifies container.
Fill in VkDeviceQueueCreateInfo.
Instanced a VkDeviceQueueCreateInfo with default value.
Create the feature chain.
Get all Features that supported.
Fetch all features.
aftermath config.
Instanced a VkDeviceCreateInfo with default value.
Create device and set it global.
Get Queues.
Select one suitable physical device.
Create a queue identifies container.
Fill in VkDeviceQueueCreateInfo.
Instanced a VkDeviceQueueCreateInfo with default value.
Create the feature chain.
Get all Features that supported.
Fetch all features.
aftermath config.
Instanced a VkDeviceCreateInfo with default value.
Create device and set it global.
Get Queues.
23 {
25
30 {
31 SPICES_CORE_ERROR("failed select physical device!")
32 }
33
37 std::unordered_map<uint32_t, std::unordered_map<uint32_t, std::vector<VkQueue>>> queueFamilies;
38
43
47 std::vector<VkDeviceQueueCreateInfo> queueCreateInfos;
48 std::vector<std::shared_ptr<std::vector<float>>> QueuePriorities;
49 for (auto& [family, idItems] : queueFamilies)
50 {
52 for (auto& [id, queues] : idItems)
53 {
54 count += queues.size();
55 }
56
57 std::shared_ptr<std::vector<float>> queuePriority = std::make_shared<std::vector<float>>(
count, 1.0f);
58
62 VkDeviceQueueCreateInfo queueCreateInfo{};
63 queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
64 queueCreateInfo.queueFamilyIndex = family;
65 queueCreateInfo.queueCount =
count;
66 queueCreateInfo.pQueuePriorities = queuePriority->data();
67
68 QueuePriorities.push_back(queuePriority);
69 queueCreateInfos.push_back(queueCreateInfo);
70 }
71
75 VkPhysicalDeviceRobustness2FeaturesEXT robustness2{};
76 robustness2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT;
77 robustness2.pNext = nullptr;
78
79 VkPhysicalDeviceHostImageCopyFeaturesEXT hostImageCopyFeature{};
80 hostImageCopyFeature.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_FEATURES_EXT;
81 hostImageCopyFeature.pNext = &robustness2;
82
83 VkPhysicalDeviceTimelineSemaphoreFeatures timelineSemaphore{};
84 timelineSemaphore.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES;
85 timelineSemaphore.pNext = &hostImageCopyFeature;
86
87 VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR fragShaderBarycentric{};
88 fragShaderBarycentric.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_KHR;
89 fragShaderBarycentric.pNext = &timelineSemaphore;
90
91 VkPhysicalDeviceDiagnosticsConfigFeaturesNV diagnosticsConfig{};
92 diagnosticsConfig.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV;
93 diagnosticsConfig.pNext = &fragShaderBarycentric;
94
95 VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV dgcFeatures{};
96 dgcFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV;
97 dgcFeatures.pNext = &diagnosticsConfig;
98
99 VkPhysicalDeviceVulkan13Features vk13Frature{};
100 vk13Frature.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES;
101 vk13Frature.pNext = &dgcFeatures;
102
103 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fragShadingRateFeature {};
104 fragShadingRateFeature.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR;
105 fragShadingRateFeature.pNext = &vk13Frature;
106
107 VkPhysicalDeviceMultiviewFeatures multiviewFeatures {};
108 multiviewFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES;
109 multiviewFeatures.pNext = &fragShadingRateFeature;
110
111 VkPhysicalDeviceMeshShaderFeaturesEXT meshShaderFeatures {};
112 meshShaderFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_EXT;
113 meshShaderFeatures.pNext = &multiviewFeatures;
114
115 VkPhysicalDeviceShaderClockFeaturesKHR shaderClockFeatures {};
116 shaderClockFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR;
117 shaderClockFeatures.pNext = &meshShaderFeatures;
118
119 VkPhysicalDeviceScalarBlockLayoutFeatures layoutFeatures {};
120 layoutFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES;
121 layoutFeatures.pNext = &shaderClockFeatures;
122
123 VkPhysicalDeviceHostQueryResetFeatures hostQueryResetFeatures {};
124 hostQueryResetFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES;
125 hostQueryResetFeatures.pNext = &layoutFeatures;
126
127 VkPhysicalDeviceRayQueryFeaturesKHR rayQueryFeatures {};
128 rayQueryFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR;
129 rayQueryFeatures.pNext = &hostQueryResetFeatures;
130
131 VkPhysicalDeviceRayTracingPipelineFeaturesKHR rayTracingFeatures {};
132 rayTracingFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR;
133 rayTracingFeatures.pNext = &rayQueryFeatures;
134
135 VkPhysicalDeviceAccelerationStructureFeaturesKHR accelerationStructureFeatures {};
136 accelerationStructureFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR;
137 accelerationStructureFeatures.pNext = &rayTracingFeatures;
138
139 VkPhysicalDeviceDescriptorIndexingFeatures descriptorIndexingFeatures {};
140 descriptorIndexingFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES;
141 descriptorIndexingFeatures.pNext = &accelerationStructureFeatures;
142
143 VkPhysicalDeviceBufferDeviceAddressFeatures bufferDeviceAddressFeatures {};
144 bufferDeviceAddressFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES;
145 bufferDeviceAddressFeatures.pNext = &descriptorIndexingFeatures;
146
150 VkPhysicalDeviceFeatures2 deviceFeatures{};
151 deviceFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
152 deviceFeatures.pNext = &bufferDeviceAddressFeatures;
153
158
162 VkDeviceDiagnosticsConfigCreateInfoNV aftermathInfo{};
163 aftermathInfo.sType = VK_STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV;
164 aftermathInfo.flags = VK_DEVICE_DIAGNOSTICS_CONFIG_ENABLE_AUTOMATIC_CHECKPOINTS_BIT_NV |
165 VK_DEVICE_DIAGNOSTICS_CONFIG_ENABLE_RESOURCE_TRACKING_BIT_NV |
166 VK_DEVICE_DIAGNOSTICS_CONFIG_ENABLE_SHADER_DEBUG_INFO_BIT_NV |
167 VK_DEVICE_DIAGNOSTICS_CONFIG_ENABLE_SHADER_ERROR_REPORTING_BIT_NV ;
168 aftermathInfo.pNext = &deviceFeatures;
169
173 VkDeviceCreateInfo createInfo{};
174 createInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
175 createInfo.pQueueCreateInfos = queueCreateInfos.data();
176 createInfo.queueCreateInfoCount = static_cast<uint32_t>(queueCreateInfos.size());
177 createInfo.pEnabledFeatures = VK_NULL_HANDLE;
180 createInfo.enabledLayerCount = 0;
181 createInfo.pNext = &aftermathInfo;
182
186 VK_CHECK(vkCreateDevice(vulkanState.m_PhysicalDevice, &createInfo,
nullptr, &vulkanState.m_Device));
187 DEBUGUTILS_SETOBJECTNAME(VK_OBJECT_TYPE_DEVICE, (uint64_t)vulkanState.m_Device, vulkanState.m_Device,
m_DeviceProperties.deviceName)
188
189
192 {
193 for (auto& [ family, idItems ] : queueFamilies)
194 {
195 int index = 0;
196 for (auto& [id, items] : idItems)
197 {
198 for (size_t i = 0; i < items.size(); i++)
199 {
200 vkGetDeviceQueue(vulkanState.m_Device, family, index, &items[i]);
201 index++;
202 }
203 }
204 }
205
206#if 0
207
212
213#else
214
219
220#endif
221
226 {
229 }
230
231 DEBUGUTILS_SETOBJECTNAME(VK_OBJECT_TYPE_QUEUE, reinterpret_cast<uint64_t>(vulkanState.m_TransferQueue), vulkanState.m_Device, "TransferQueue")
232 DEBUGUTILS_SETOBJECTNAME(VK_OBJECT_TYPE_QUEUE, reinterpret_cast<uint64_t>(vulkanState.m_ComputeQueue) , vulkanState.m_Device, "ComputeQueue" )
233 DEBUGUTILS_SETOBJECTNAME(VK_OBJECT_TYPE_QUEUE, reinterpret_cast<uint64_t>(vulkanState.m_PresentQueue) , vulkanState.m_Device, "PresentQueue" )
234 DEBUGUTILS_SETOBJECTNAME(VK_OBJECT_TYPE_QUEUE, reinterpret_cast<uint64_t>(vulkanState.m_GraphicQueue) , vulkanState.m_Device, "GraphicQueue" )
235 }
236 }
#define SPICES_PROFILE_ZONE
#define VK_CHECK(expr)
Vulkan Check macro. Verify Vulkan API Effectiveness.
QueueHelper m_QueueHelper
QueueHelper.
static VkPhysicalDeviceProperties m_DeviceProperties
Selected Physical Device Properties.
bool SelectPhysicalDevice(const VkInstance &instance, const VkSurfaceKHR &surface, GLFWwindow *window)
select a suitable physical device.
std::vector< const char * > m_ExtensionProperties
Device Extension Properties.
VulkanState & m_VulkanState
The global VulkanState Referenced from VulkanRenderBackend.
VulkanObject(VulkanState &vulkanState)
Constructor Function. Init member variables.
static void CreateGraphic(VulkanState &vulkanState, VkQueue queue)
Create Graphic VulkanThreadQueue.
static void CreateCompute(VulkanState &vulkanState, VkQueue queue)
Create Compute VulkanThreadQueue.
constexpr int count
Calculate count that meets requirement.
static constexpr int NThreadQueue
Thread Queue Count.
std::optional< uint32_t > graphicqueuefamily
The graphic queue's in used identify.
std::optional< uint32_t > presentqueuefamily
The present queue's in used identify.
std::optional< uint32_t > transferqueuefamily
The transfer queue's in used identify.
std::optional< uint32_t > computequeuefamily
The compute queue's in used identify.
VkPhysicalDevice m_PhysicalDevice