2
3
4
5
9#include "Debugger/Perf/NsightPerfGPUProfilerHUD.h"
27
28
29 if (!SelectPhysicalDevice(vulkanState.m_Instance, vulkanState.m_Surface, vulkanState.m_Windows))
31 SPICES_CORE_ERROR(
"failed select physical device!")
35
36
37 std::unordered_map<uint32_t, std::unordered_map<uint32_t, std::vector<VkQueue>>> queueFamilies;
39 queueFamilies[m_QueueHelper.graphicqueuefamily .value()][0] = std::vector<VkQueue>(1 + NThreadQueue, VK_NULL_HANDLE);
40 queueFamilies[m_QueueHelper.presentqueuefamily .value()][1] = std::vector<VkQueue>(1, VK_NULL_HANDLE);
41 queueFamilies[m_QueueHelper.computequeuefamily .value()][2] = std::vector<VkQueue>(1 + NThreadQueue, VK_NULL_HANDLE);
42 queueFamilies[m_QueueHelper.transferqueuefamily.value()][3] = std::vector<VkQueue>(1, VK_NULL_HANDLE);
45
46
47 std::vector<VkDeviceQueueCreateInfo> queueCreateInfos;
48 std::vector<std::shared_ptr<std::vector<
float>>> QueuePriorities;
49 for (
auto& [family, idItems] : queueFamilies)
52 for (
auto& [id, queues] : idItems)
54 count += queues.size();
57 std::shared_ptr<std::vector<
float>> queuePriority = std::make_shared<std::vector<
float>>(count, 1.0f);
60
61
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();
68 QueuePriorities.push_back(queuePriority);
69 queueCreateInfos.push_back(queueCreateInfo);
73
74
75 VkPhysicalDeviceRobustness2FeaturesEXT robustness2{};
76 robustness2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT;
77 robustness2.pNext =
nullptr;
79 VkPhysicalDeviceHostImageCopyFeaturesEXT hostImageCopyFeature{};
80 hostImageCopyFeature.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_FEATURES_EXT;
81 hostImageCopyFeature.pNext = &robustness2;
83 VkPhysicalDeviceTimelineSemaphoreFeatures timelineSemaphore{};
84 timelineSemaphore.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES;
85 timelineSemaphore.pNext = &hostImageCopyFeature;
87 VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR fragShaderBarycentric{};
88 fragShaderBarycentric.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_KHR;
89 fragShaderBarycentric.pNext = &timelineSemaphore;
91 VkPhysicalDeviceDiagnosticsConfigFeaturesNV diagnosticsConfig{};
92 diagnosticsConfig.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV;
93 diagnosticsConfig.pNext = &fragShaderBarycentric;
95 VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV dgcFeatures{};
96 dgcFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV;
97 dgcFeatures.pNext = &diagnosticsConfig;
99 VkPhysicalDeviceVulkan13Features vk13Frature{};
100 vk13Frature.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES;
101 vk13Frature.pNext = &dgcFeatures;
103 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fragShadingRateFeature {};
104 fragShadingRateFeature.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR;
105 fragShadingRateFeature.pNext = &vk13Frature;
107 VkPhysicalDeviceMultiviewFeatures multiviewFeatures {};
108 multiviewFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES;
109 multiviewFeatures.pNext = &fragShadingRateFeature;
111 VkPhysicalDeviceMeshShaderFeaturesEXT meshShaderFeatures {};
112 meshShaderFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_EXT;
113 meshShaderFeatures.pNext = &multiviewFeatures;
115 VkPhysicalDeviceShaderClockFeaturesKHR shaderClockFeatures {};
116 shaderClockFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR;
117 shaderClockFeatures.pNext = &meshShaderFeatures;
119 VkPhysicalDeviceScalarBlockLayoutFeatures layoutFeatures {};
120 layoutFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES;
121 layoutFeatures.pNext = &shaderClockFeatures;
123 VkPhysicalDeviceHostQueryResetFeatures hostQueryResetFeatures {};
124 hostQueryResetFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES;
125 hostQueryResetFeatures.pNext = &layoutFeatures;
127 VkPhysicalDeviceRayQueryFeaturesKHR rayQueryFeatures {};
128 rayQueryFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR;
129 rayQueryFeatures.pNext = &hostQueryResetFeatures;
131 VkPhysicalDeviceRayTracingPipelineFeaturesKHR rayTracingFeatures {};
132 rayTracingFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR;
133 rayTracingFeatures.pNext = &rayQueryFeatures;
135 VkPhysicalDeviceAccelerationStructureFeaturesKHR accelerationStructureFeatures {};
136 accelerationStructureFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR;
137 accelerationStructureFeatures.pNext = &rayTracingFeatures;
139 VkPhysicalDeviceDescriptorIndexingFeatures descriptorIndexingFeatures {};
140 descriptorIndexingFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES;
141 descriptorIndexingFeatures.pNext = &accelerationStructureFeatures;
143 VkPhysicalDeviceBufferDeviceAddressFeatures bufferDeviceAddressFeatures {};
144 bufferDeviceAddressFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES;
145 bufferDeviceAddressFeatures.pNext = &descriptorIndexingFeatures;
148
149
150 VkPhysicalDeviceFeatures2 deviceFeatures{};
151 deviceFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
152 deviceFeatures.pNext = &bufferDeviceAddressFeatures;
155
156
157 vkGetPhysicalDeviceFeatures2(m_VulkanState.m_PhysicalDevice, &deviceFeatures);
160
161
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;
171
172
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;
178 createInfo.enabledExtensionCount =
static_cast<uint32_t>(m_ExtensionProperties.size());
179 createInfo.ppEnabledExtensionNames = m_ExtensionProperties.data();
180 createInfo.enabledLayerCount = 0;
181 createInfo.pNext = &aftermathInfo;
184
185
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)
190
191
193 for (
auto& [ family, idItems ] : queueFamilies)
196 for (
auto& [id, items] : idItems)
198 for (size_t i = 0; i < items.size(); i++)
200 vkGetDeviceQueue(vulkanState.m_Device, family, index, &items[i]);
208 vulkanState.m_GraphicQueue = queueFamilies[m_QueueHelper.graphicqueuefamily.value()][0];
209 vulkanState.m_PresentQueue = queueFamilies[m_QueueHelper.graphicqueuefamily.value()][0];
210 vulkanState.m_ComputeQueue = queueFamilies[m_QueueHelper.graphicqueuefamily.value()][0];
211 vulkanState.m_TransferQueue = queueFamilies[m_QueueHelper.graphicqueuefamily.value()][0];
215 vulkanState.m_GraphicQueue = queueFamilies[m_QueueHelper.graphicqueuefamily .value()][0][0];
216 vulkanState.m_PresentQueue = queueFamilies[m_QueueHelper.presentqueuefamily .value()][0][0];
217 vulkanState.m_ComputeQueue = queueFamilies[m_QueueHelper.computequeuefamily .value()][2][0];
218 vulkanState.m_TransferQueue = queueFamilies[m_QueueHelper.transferqueuefamily.value()][3][0];
223
224
225 for (
int i = 0; i < NThreadQueue; i++)
227 VulkanThreadQueue::CreateGraphic(vulkanState, queueFamilies[m_QueueHelper.graphicqueuefamily.value()][0][i + 1]);
228 VulkanThreadQueue::CreateCompute(vulkanState, queueFamilies[m_QueueHelper.computequeuefamily.value()][2][i + 1]);
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" )
250
251
252
262 m_SwapChainSupportDetails =
263 QuerySwapChainSupport(
264 m_VulkanState.m_PhysicalDevice,
265 m_VulkanState.m_Surface, m_VulkanState.m_Windows
274
275
276 VkPhysicalDeviceProperties physicalDeviceProperties;
277 vkGetPhysicalDeviceProperties(m_VulkanState.m_PhysicalDevice, &physicalDeviceProperties);
279 const VkSampleCountFlags counts =
280 physicalDeviceProperties.limits.framebufferColorSampleCounts &
281 physicalDeviceProperties.limits.framebufferDepthSampleCounts;
284
285
286 if (counts & VK_SAMPLE_COUNT_64_BIT) {
return VK_SAMPLE_COUNT_64_BIT; }
287 if (counts & VK_SAMPLE_COUNT_32_BIT) {
return VK_SAMPLE_COUNT_32_BIT; }
288 if (counts & VK_SAMPLE_COUNT_16_BIT) {
return VK_SAMPLE_COUNT_16_BIT; }
289 if (counts & VK_SAMPLE_COUNT_8_BIT) {
return VK_SAMPLE_COUNT_8_BIT; }
290 if (counts & VK_SAMPLE_COUNT_4_BIT) {
return VK_SAMPLE_COUNT_4_BIT; }
291 if (counts & VK_SAMPLE_COUNT_2_BIT) {
return VK_SAMPLE_COUNT_2_BIT; }
293 return VK_SAMPLE_COUNT_1_BIT;
301
302
303 uint32_t deviceCount = 0;
304 vkEnumeratePhysicalDevices(instance, &deviceCount,
nullptr);
307
308
309 if (deviceCount == 0)
311 SPICES_CORE_WARN(
"Failed to find GPUs with Vulkan support!")
316
317
318 std::vector<VkPhysicalDevice> PhysicalDevices(deviceCount);
319 vkEnumeratePhysicalDevices(instance, &deviceCount, PhysicalDevices.data());
322
323
324 for (
const auto& physicalDevice : PhysicalDevices)
327
328
329 if (IsExtensionMeetDemand(physicalDevice) &&
330 IsPropertyMeetDemand(physicalDevice) &&
331 IsFeatureMeetDemand(physicalDevice) &&
332 IsQueueMeetDemand(physicalDevice, surface)
336
337
338 m_VulkanState.m_PhysicalDevice = physicalDevice;
341
342
343 m_SwapChainSupportDetails = QuerySwapChainSupport(physicalDevice, surface, window);
345 SPICES_CORE_INFO(
"VkPhysicalDevice Selected!!!")
358
359
360 m_DGCProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV;
361 m_DGCProperties.pNext =
nullptr;
363 m_RayTracingProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR;
364 m_RayTracingProperties.pNext = &m_DGCProperties;
366 VkPhysicalDeviceMeshShaderPropertiesEXT meshShaderProperties{};
367 meshShaderProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_EXT;
368 meshShaderProperties.pNext = &m_RayTracingProperties;
370 VkPhysicalDeviceSubgroupProperties subGroupProperties{};
371 subGroupProperties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES;
372 subGroupProperties.pNext = &meshShaderProperties;
374 VkPhysicalDeviceProperties2 prop2 {};
375 prop2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
376 prop2.pNext = &subGroupProperties;
377 vkGetPhysicalDeviceProperties2(device, &prop2);
378 m_DeviceProperties = prop2.properties;
381 std::stringstream ss;
382 ss <<
"Limits : maxFragmentOutputAttachments = " << m_DeviceProperties.limits.maxFragmentOutputAttachments;
383 SPICES_CORE_INFO(ss.str())
387 std::stringstream ss;
388 ss <<
"MeshShader : maxMeshOutputVertices = " << meshShaderProperties.maxMeshOutputVertices;
389 SPICES_CORE_INFO(ss.str())
393 std::stringstream ss;
394 ss <<
"MeshShader : maxMeshOutputPrimitives = " << meshShaderProperties.maxMeshOutputPrimitives;
395 SPICES_CORE_INFO(ss.str())
399 std::stringstream ss;
400 ss <<
"SubGroup : subgroupSize = " << subGroupProperties.subgroupSize;
401 SPICES_CORE_INFO(ss.str())
402 assert(subGroupProperties.supportedStages & VK_SHADER_STAGE_TASK_BIT_EXT);
403 assert(subGroupProperties.supportedStages & VK_SHADER_STAGE_MESH_BIT_EXT);
414
415
416 VkPhysicalDeviceRobustness2FeaturesEXT robustness2{};
417 robustness2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT;
418 robustness2.pNext =
nullptr;
420 VkPhysicalDeviceHostImageCopyFeaturesEXT hostImageCopyFeature{};
421 hostImageCopyFeature.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_FEATURES_EXT;
422 hostImageCopyFeature.pNext = &robustness2;
424 VkPhysicalDeviceTimelineSemaphoreFeatures timelineSemaphore{};
425 timelineSemaphore.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES;
426 timelineSemaphore.pNext = &hostImageCopyFeature;
428 VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR fragShaderBarycentric{};
429 fragShaderBarycentric.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_KHR;
430 fragShaderBarycentric.pNext = &timelineSemaphore;
432 VkPhysicalDeviceDiagnosticsConfigFeaturesNV diagnosticsConfig{};
433 diagnosticsConfig.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV;
434 diagnosticsConfig.pNext = &fragShaderBarycentric;
436 VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV dgcFeatures{};
437 dgcFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV;
438 dgcFeatures.pNext = &diagnosticsConfig;
440 VkPhysicalDeviceVulkan13Features vk13Frature{};
441 vk13Frature.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES;
442 vk13Frature.pNext = &dgcFeatures;
444 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fragShadingRateFeature {};
445 fragShadingRateFeature.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR;
446 fragShadingRateFeature.pNext = &vk13Frature;
448 VkPhysicalDeviceMultiviewFeatures multiviewFeatures {};
449 multiviewFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES;
450 multiviewFeatures.pNext = &fragShadingRateFeature;
452 VkPhysicalDeviceMeshShaderFeaturesEXT meshShaderFeatures {};
453 meshShaderFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_EXT;
454 meshShaderFeatures.pNext = &multiviewFeatures;
456 VkPhysicalDeviceShaderClockFeaturesKHR shaderClockFeatures{};
457 shaderClockFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR;
458 shaderClockFeatures.pNext = &meshShaderFeatures;
460 VkPhysicalDeviceScalarBlockLayoutFeatures layoutFeatures {};
461 layoutFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES;
462 layoutFeatures.pNext = &shaderClockFeatures;
464 VkPhysicalDeviceHostQueryResetFeatures hostQueryResetFeatures {};
465 hostQueryResetFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES;
466 hostQueryResetFeatures.pNext = &layoutFeatures;
468 VkPhysicalDeviceRayQueryFeaturesKHR rayQueryFeatures {};
469 rayQueryFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR;
470 rayQueryFeatures.pNext = &hostQueryResetFeatures;
472 VkPhysicalDeviceRayTracingPipelineFeaturesKHR rayTracingFeatures {};
473 rayTracingFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR;
474 rayTracingFeatures.pNext = &rayQueryFeatures;
476 VkPhysicalDeviceAccelerationStructureFeaturesKHR accelerationStructureFeatures {};
477 accelerationStructureFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR;
478 accelerationStructureFeatures.pNext = &rayTracingFeatures;
480 VkPhysicalDeviceDescriptorIndexingFeatures descriptorIndexingFeatures {};
481 descriptorIndexingFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES;
482 descriptorIndexingFeatures.pNext = &accelerationStructureFeatures;
484 VkPhysicalDeviceBufferDeviceAddressFeatures bufferDeviceAddressFeatures {};
485 bufferDeviceAddressFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES;
486 bufferDeviceAddressFeatures.pNext = &descriptorIndexingFeatures;
489
490
491 VkPhysicalDeviceFeatures2 deviceFeatures {};
492 deviceFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
493 deviceFeatures.pNext = &bufferDeviceAddressFeatures;
496
497
498 vkGetPhysicalDeviceFeatures2(device, &deviceFeatures);
499 m_DeviceFeatures = deviceFeatures.features;
502
503
504
505 ASSERT(deviceFeatures.features.samplerAnisotropy)
506 ASSERT(deviceFeatures.features.sampleRateShading)
507 ASSERT(deviceFeatures.features.independentBlend)
508 ASSERT(deviceFeatures.features.geometryShader)
509 ASSERT(bufferDeviceAddressFeatures.bufferDeviceAddress)
510 ASSERT(bufferDeviceAddressFeatures.bufferDeviceAddressCaptureReplay)
511 ASSERT(accelerationStructureFeatures.accelerationStructure)
512 ASSERT(rayTracingFeatures.rayTracingPipeline)
513 ASSERT(rayQueryFeatures.rayQuery)
514 ASSERT(hostQueryResetFeatures.hostQueryReset)
515 ASSERT(layoutFeatures.scalarBlockLayout)
517 ASSERT(descriptorIndexingFeatures.shaderSampledImageArrayNonUniformIndexing)
518 ASSERT(descriptorIndexingFeatures.descriptorBindingSampledImageUpdateAfterBind)
519 ASSERT(descriptorIndexingFeatures.shaderUniformBufferArrayNonUniformIndexing)
520 ASSERT(descriptorIndexingFeatures.descriptorBindingUniformBufferUpdateAfterBind)
521 ASSERT(descriptorIndexingFeatures.shaderStorageBufferArrayNonUniformIndexing)
522 ASSERT(descriptorIndexingFeatures.descriptorBindingStorageBufferUpdateAfterBind)
523 ASSERT(descriptorIndexingFeatures.descriptorBindingPartiallyBound)
524 ASSERT(descriptorIndexingFeatures.runtimeDescriptorArray)
526 ASSERT(shaderClockFeatures.shaderSubgroupClock)
528 ASSERT(meshShaderFeatures.meshShader)
529 ASSERT(meshShaderFeatures.taskShader)
531 ASSERT(multiviewFeatures.multiview)
532 ASSERT(fragShadingRateFeature.pipelineFragmentShadingRate)
533 ASSERT(vk13Frature.maintenance4)
535 ASSERT(dgcFeatures.deviceGeneratedCommands)
537 ASSERT(diagnosticsConfig.diagnosticsConfig)
539 ASSERT(fragShaderBarycentric.fragmentShaderBarycentric)
541 ASSERT(timelineSemaphore.timelineSemaphore)
543 ASSERT(hostImageCopyFeature.hostImageCopy)
545 ASSERT(robustness2.nullDescriptor)
554 m_ExtensionProperties.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
555 m_ExtensionProperties.push_back(VK_KHR_MAINTENANCE_1_EXTENSION_NAME);
556 m_ExtensionProperties.push_back(VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME);
557 m_ExtensionProperties.push_back(VK_KHR_RAY_TRACING_PIPELINE_EXTENSION_NAME);
558 m_ExtensionProperties.push_back(VK_KHR_RAY_QUERY_EXTENSION_NAME);
559 m_ExtensionProperties.push_back(VK_KHR_DEFERRED_HOST_OPERATIONS_EXTENSION_NAME);
560 m_ExtensionProperties.push_back(VK_KHR_SHADER_CLOCK_EXTENSION_NAME);
561 m_ExtensionProperties.push_back(VK_KHR_SHADER_NON_SEMANTIC_INFO_EXTENSION_NAME);
562 m_ExtensionProperties.push_back(VK_KHR_SPIRV_1_4_EXTENSION_NAME);
563 m_ExtensionProperties.push_back(VK_EXT_MESH_SHADER_EXTENSION_NAME);
564 m_ExtensionProperties.push_back(VK_KHR_SHADER_FLOAT_CONTROLS_EXTENSION_NAME);
565 m_ExtensionProperties.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
566 m_ExtensionProperties.push_back(VK_EXT_NESTED_COMMAND_BUFFER_EXTENSION_NAME);
567 m_ExtensionProperties.push_back(VK_NV_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME);
568 m_ExtensionProperties.push_back(VK_NV_DEVICE_DIAGNOSTIC_CHECKPOINTS_EXTENSION_NAME);
569 m_ExtensionProperties.push_back(VK_NV_DEVICE_DIAGNOSTICS_CONFIG_EXTENSION_NAME);
570 m_ExtensionProperties.push_back(VK_KHR_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME);
571 m_ExtensionProperties.push_back(VK_EXT_MEMORY_BUDGET_EXTENSION_NAME);
572 m_ExtensionProperties.push_back(VK_EXT_CALIBRATED_TIMESTAMPS_EXTENSION_NAME);
573 m_ExtensionProperties.push_back(VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME);
574 m_ExtensionProperties.push_back(VK_EXT_HOST_IMAGE_COPY_EXTENSION_NAME);
575 m_ExtensionProperties.push_back(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME);
578
579
580
581
589
590
591 uint32_t extensionCount;
592 vkEnumerateDeviceExtensionProperties(device,
nullptr, &extensionCount,
nullptr);
595
596
597 std::vector<VkExtensionProperties> availableExtensions(extensionCount);
598 vkEnumerateDeviceExtensionProperties(device,
nullptr, &extensionCount, availableExtensions.data());
601
602
606
607
608 std::set<std::string> requiredExtensions(m_ExtensionProperties.begin(), m_ExtensionProperties.end());
611
612
613 std::vector<
const char*> nvperfDeviceExtensions;
616 for (
auto& e : nvperfDeviceExtensions)
618 requiredExtensions.insert(e);
621 for (
const auto& extension : availableExtensions)
623 requiredExtensions.erase(extension.extensionName);
626 if (requiredExtensions.empty())
629
630
631 m_ExtensionProperties.insert(m_ExtensionProperties.end(), nvperfDeviceExtensions.begin(), nvperfDeviceExtensions.end());
637 for (
auto& set : requiredExtensions)
639 VkPhysicalDeviceProperties deviceProperties;
640 vkGetPhysicalDeviceProperties(device, &deviceProperties);
642 std::stringstream ss;
643 ss <<
"Device Extension Required: " << set <<
", Which is not satisfied with device: " << deviceProperties.deviceName;
644 SPICES_CORE_WARN(ss.str())
656
657
658 uint32_t queueFamilyCount = 0;
659 vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount,
nullptr);
662
663
664 std::vector<VkQueueFamilyProperties> queueFamilies(queueFamilyCount);
665 vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, queueFamilies.data());
668
669
670 for (uint32_t i = 0; i < queueFamilies.size(); i++) {
671 const auto& queueFamily = queueFamilies[i];
674
675
676 if (queueFamily.queueFlags & VK_QUEUE_GRAPHICS_BIT)
678 m_QueueHelper.graphicqueuefamily = i;
679 m_VulkanState.m_GraphicQueueFamily = i;
681 VkBool32 presentSupport =
false;
682 vkGetPhysicalDeviceSurfaceSupportKHR(device, i, surface, &presentSupport);
685
686
689 m_QueueHelper.presentqueuefamily = i;
695
696
697 if (queueFamily.queueFlags & VK_QUEUE_COMPUTE_BIT)
699 m_QueueHelper.computequeuefamily = i;
700 m_VulkanState.m_ComputeQueueFamily = i;
704
705
706 if (queueFamily.queueFlags & VK_QUEUE_TRANSFER_BIT)
708 m_QueueHelper.transferqueuefamily = i;
712 if (m_QueueHelper.isComplete())
return true;
719 const VkPhysicalDevice& device ,
720 const VkSurfaceKHR& surface ,
727
728
730 vkGetPhysicalDeviceSurfaceCapabilitiesKHR(device, surface, &swapChainSupportDetails.capabilities);
733
734
735 if (swapChainSupportDetails.capabilities.currentExtent.width != std::numeric_limits<uint32_t>::max())
737 swapChainSupportDetails.surfaceSize = swapChainSupportDetails.capabilities.currentExtent;
742 glfwGetFramebufferSize(window, &width, &height);
744 VkExtent2D actualExtent =
746 static_cast<uint32_t>(width),
747 static_cast<uint32_t>(height)
751
752
753 actualExtent.width = std::clamp(actualExtent.width,
754 swapChainSupportDetails.capabilities.minImageExtent.width,
755 swapChainSupportDetails.capabilities.maxImageExtent.width);
757 actualExtent.height = std::clamp(actualExtent.height,
758 swapChainSupportDetails.capabilities.minImageExtent.height,
759 swapChainSupportDetails.capabilities.maxImageExtent.height);
761 swapChainSupportDetails.surfaceSize = actualExtent;
765
766
767 uint32_t formatCount;
768 vkGetPhysicalDeviceSurfaceFormatsKHR(device, surface, &formatCount,
nullptr);
770 if (formatCount != 0)
773
774
775 swapChainSupportDetails.formats.resize(formatCount);
776 vkGetPhysicalDeviceSurfaceFormatsKHR(device, surface, &formatCount, swapChainSupportDetails.formats.data());
779
780
781
782 swapChainSupportDetails.format = swapChainSupportDetails.formats[0];
784 for (
const auto& availableFormat : swapChainSupportDetails.formats)
786 if (availableFormat.format == VK_FORMAT_A2B10G10R10_UNORM_PACK32 &&
787 availableFormat.colorSpace == VK_COLOR_SPACE_SRGB_NONLINEAR_KHR)
789 swapChainSupportDetails.format = availableFormat;
796
797
798 uint32_t presentModeCount;
799 vkGetPhysicalDeviceSurfacePresentModesKHR(device, surface, &presentModeCount,
nullptr);
801 if (presentModeCount != 0)
804
805
806 swapChainSupportDetails.presentModes.resize(presentModeCount);
807 vkGetPhysicalDeviceSurfacePresentModesKHR(device, surface, &presentModeCount, swapChainSupportDetails.presentModes.data());
810
811
812 swapChainSupportDetails.presentMode = swapChainSupportDetails.presentModes[0];
814 for (
const auto& availablePresentMode : swapChainSupportDetails.presentModes)
816 if (availablePresentMode == VK_PRESENT_MODE_MAILBOX_KHR)
818 swapChainSupportDetails.presentMode = availablePresentMode;
824 return swapChainSupportDetails;
#define ASSERT(expr)
Assert macro.
#define NSIGHTPERF_GPUPROFILERHUD_QUERYDEVICEEXTENSION(...)
#define SPICES_PROFILE_ZONE
#define VK_CHECK(expr)
Vulkan Check macro. Verify Vulkan API Effectiveness.
VkSampleCountFlagBits GetMaxUsableSampleCount() const
Get device's max usable sample count.
bool IsQueueMeetDemand(const VkPhysicalDevice &device, const VkSurfaceKHR &surface)
Check all Queue we need meet;.
static VkPhysicalDeviceFeatures m_DeviceFeatures
Selected Physical Device Features.
virtual ~VulkanDevice() override
Destructor Function.
static VkPhysicalDeviceRayTracingPipelinePropertiesKHR m_RayTracingProperties
Device RayTracing Properties.
bool IsPropertyMeetDemand(const VkPhysicalDevice &device)
Check all Property we need meet.
bool IsFeatureMeetDemand(const VkPhysicalDevice &device)
Check all Feature we need meet.
void GetExtensionRequirements()
Get all physical device extension requirements our engine needed. Source 1 : user Setting.
static VkPhysicalDeviceProperties m_DeviceProperties
Selected Physical Device Properties.
static VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV m_DGCProperties
Device DGC Properties.
VulkanDevice(VulkanState &vulkanState)
Constructor Function. Create vkDevice.
bool SelectPhysicalDevice(const VkInstance &instance, const VkSurfaceKHR &surface, GLFWwindow *window)
select a suitable physical device.
bool IsExtensionMeetDemand(const VkPhysicalDevice &device)
Check all Extension we need meet;.
void RequerySwapChainSupport()
Requery device's SwapChainSupportDetails. Mainly VkExtent2D.
VulkanInstance Class. This class defines the VulkanDevice behave. This class is just a wrapper of vkd...
VulkanState & m_VulkanState
The global VulkanState Referenced from VulkanRenderBackend.
VulkanObject(VulkanState &vulkanState)
Constructor Function. Init member variables.
VulkanObject Class. This class defines the basic behaves of VulkanObject. When we create an new Vulka...
static void Destroy()
Destroy all ThreadQueue.
VulkanThreadQueue Class. This class is a wrapper of Thread VkQueue.
SwapChain Utils. Queried from device.
This struct contains all Vulkan object in used global.