| 925 | } |
| 926 | |
| 927 | void VulkanCapsViewer::getGPUinfo(VulkanDeviceInfo *GPU, uint32_t id, VkPhysicalDevice device) |
| 928 | { |
| 929 | VkResult vkRes; |
| 930 | |
| 931 | GPU->id = id; |
| 932 | GPU->device = device; |
| 933 | GPU->readExtensions(); |
| 934 | GPU->readPhysicalProperties(); |
| 935 | GPU->readLayers(); |
| 936 | GPU->readQueueFamilies(); |
| 937 | GPU->readPhysicalFeatures(); |
| 938 | GPU->readPhysicalLimits(); |
| 939 | GPU->readPhysicalMemoryProperties(); |
| 940 | GPU->readSurfaceInfo(); |
| 941 | GPU->readPlatformDetails(); |
| 942 | GPU->readProfiles(); |
| 943 | // Request all available queues |
| 944 | std::vector<VkDeviceQueueCreateInfo> queueCreateInfos; |
| 945 | for (uint32_t i = 0; i < GPU->queueFamilies.size(); ++i) |
| 946 | { |
| 947 | float queuePriorities[1] = { 0.0f }; |
| 948 | VkDeviceQueueCreateInfo queueCreateInfo = {}; |
| 949 | queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; |
| 950 | queueCreateInfo.queueFamilyIndex = i; |
| 951 | queueCreateInfo.queueCount = 1; |
| 952 | queueCreateInfo.pQueuePriorities = queuePriorities; |
| 953 | queueCreateInfos.push_back(queueCreateInfo); |
| 954 | } |
| 955 | |
| 956 | std::vector<const char*> enabledExtensions; |
| 957 | #if defined(__APPLE__) && (VK_HEADER_VERSION >= 216) |
| 958 | // Enable the portability extension at the device level, but only if the device uses it |
| 959 | // For example, MoltenVK does, while lavapipe and KosmicKrisp do not. |
| 960 | |
| 961 | // Get the list of device extensions |
| 962 | uint32_t extensionCount = 0; |
| 963 | vkEnumerateDeviceExtensionProperties(device, nullptr, &extensionCount,nullptr); |
| 964 | std::vector<VkExtensionProperties> availableExtensions(extensionCount); |
| 965 | |
| 966 | vkEnumerateDeviceExtensionProperties( |
| 967 | device, nullptr, &extensionCount, availableExtensions.data()); |
| 968 | |
| 969 | // Loop through the extensions and enable any portability devices |
| 970 | for(int i = 0; i < extensionCount; i++) |
| 971 | if(strcmp(availableExtensions[i].extensionName, VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME) == 0) |
| 972 | enabledExtensions.push_back(VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME); |
| 973 | #endif |
| 974 | |
| 975 | // Init device |
| 976 | |
| 977 | VkDeviceCreateInfo info = {}; |
| 978 | info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; |
| 979 | info.pQueueCreateInfos = queueCreateInfos.data(); |
| 980 | info.queueCreateInfoCount = (uint32_t)queueCreateInfos.size(); |
| 981 | info.enabledLayerCount = 0; |
| 982 | if (enabledExtensions.size() > 0) { |
| 983 | info.enabledExtensionCount = static_cast<uint32_t>(enabledExtensions.size()); |
| 984 | info.ppEnabledExtensionNames = enabledExtensions.data(); |
nothing calls this directly
no test coverage detected