| 122 | } |
| 123 | |
| 124 | void Loader::CreateInstance() { |
| 125 | // General app info |
| 126 | VkApplicationInfo applicationInfo{}; |
| 127 | applicationInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; |
| 128 | applicationInfo.apiVersion = VK_API_VERSION_1_2; |
| 129 | applicationInfo.pApplicationName = "GPUOpen GRS"; |
| 130 | applicationInfo.pEngineName = "GPUOpen GRS"; |
| 131 | |
| 132 | // Pass down the environment |
| 133 | VkGPUOpenGPUReshapeCreateInfo gpuOpenInfo{}; |
| 134 | gpuOpenInfo.sType = VK_STRUCTURE_TYPE_GPUOPEN_GPURESHAPE_CREATE_INFO; |
| 135 | gpuOpenInfo.registry = environment.GetRegistry(); |
| 136 | |
| 137 | // Instance info |
| 138 | VkInstanceCreateInfo instanceCreateInfo{}; |
| 139 | instanceCreateInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; |
| 140 | instanceCreateInfo.pNext = &gpuOpenInfo; |
| 141 | instanceCreateInfo.pApplicationInfo = &applicationInfo; |
| 142 | instanceCreateInfo.enabledExtensionCount = static_cast<uint32_t>(enabledInstanceExtensions.size()); |
| 143 | instanceCreateInfo.ppEnabledExtensionNames = enabledInstanceExtensions.data(); |
| 144 | instanceCreateInfo.enabledLayerCount = static_cast<uint32_t>(enabledInstanceLayers.size()); |
| 145 | instanceCreateInfo.ppEnabledLayerNames = enabledInstanceLayers.data(); |
| 146 | REQUIRE(vkCreateInstance(&instanceCreateInfo, nullptr, &instance) == VK_SUCCESS); |
| 147 | |
| 148 | // Get the number of physical devices |
| 149 | uint32_t physicalDeviceCount; |
| 150 | REQUIRE(vkEnumeratePhysicalDevices(instance, &physicalDeviceCount, nullptr) == VK_SUCCESS); |
| 151 | |
| 152 | // Must have at least one device |
| 153 | REQUIRE(physicalDeviceCount > 0); |
| 154 | |
| 155 | // Get all physical devices |
| 156 | std::vector<VkPhysicalDevice> physicalDevices(physicalDeviceCount); |
| 157 | REQUIRE(vkEnumeratePhysicalDevices(instance, &physicalDeviceCount, physicalDevices.data()) == VK_SUCCESS); |
| 158 | |
| 159 | // TODO: Make sure it's at least dedicated |
| 160 | physicalDevice = physicalDevices.at(0); |
| 161 | |
| 162 | // Get number of device extensions |
| 163 | uint32_t deviceExtensionCount; |
| 164 | REQUIRE(vkEnumerateDeviceExtensionProperties(physicalDevice, nullptr, &deviceExtensionCount, nullptr) == VK_SUCCESS); |
| 165 | |
| 166 | // Enumerate device extensions |
| 167 | deviceExtensions.resize(deviceExtensionCount); |
| 168 | REQUIRE(vkEnumerateDeviceExtensionProperties(physicalDevice, nullptr, &deviceExtensionCount, deviceExtensions.data()) == VK_SUCCESS); |
| 169 | |
| 170 | if (enableValidation) { |
| 171 | // Validation create info |
| 172 | VkDebugUtilsMessengerCreateInfoEXT createInfo{}; |
| 173 | createInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT; |
| 174 | createInfo.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT; |
| 175 | createInfo.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT; |
| 176 | createInfo.pfnUserCallback = DebugCallback; |
| 177 | createInfo.pUserData = nullptr; |
| 178 | |
| 179 | // Validation proc |
| 180 | auto next_vkCreateDebugUtilsMessengerEXT = (PFN_vkCreateDebugUtilsMessengerEXT) vkGetInstanceProcAddr(instance, "vkCreateDebugUtilsMessengerEXT"); |
| 181 | REQUIRE(next_vkCreateDebugUtilsMessengerEXT); |
no test coverage detected