| 192 | } |
| 193 | |
| 194 | VKAPI_ATTR VkResult VKAPI_CALL CreateInstance(const VkInstanceCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, |
| 195 | VkInstance* pInstance) { |
| 196 | VkLayerInstanceCreateInfo* chain_info = GetChainInfo(pCreateInfo, VK_LAYER_LINK_INFO); |
| 197 | std::lock_guard<std::mutex> lock(global_lock); |
| 198 | |
| 199 | assert(chain_info->u.pLayerInfo); |
| 200 | PFN_vkGetInstanceProcAddr fp_get_instance_proc_addr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr; |
| 201 | PFN_vkCreateInstance fp_create_instance = (PFN_vkCreateInstance)fp_get_instance_proc_addr(NULL, "vkCreateInstance"); |
| 202 | if (fp_create_instance == NULL) return VK_ERROR_INITIALIZATION_FAILED; |
| 203 | |
| 204 | // Advance the link info for the next element on the chain |
| 205 | chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext; |
| 206 | |
| 207 | VkResult result = fp_create_instance(pCreateInfo, pAllocator, pInstance); |
| 208 | if (result != VK_SUCCESS) return result; |
| 209 | |
| 210 | layer_data* instance_data = GetLayerDataPtr(*pInstance, device_profile_api_dev_data_map); |
| 211 | instance_data->instance = *pInstance; |
| 212 | layer_init_instance_dispatch_table(*pInstance, &instance_data->dispatch_table, fp_get_instance_proc_addr); |
| 213 | instance_data->dispatch_table.GetPhysicalDeviceProcAddr = |
| 214 | (PFN_GetPhysicalDeviceProcAddr)fp_get_instance_proc_addr(*pInstance, "vk_layerGetPhysicalDeviceProcAddr"); |
| 215 | |
| 216 | uint32_t physical_device_count = 0; |
| 217 | instance_data->dispatch_table.EnumeratePhysicalDevices(*pInstance, &physical_device_count, NULL); |
| 218 | |
| 219 | std::vector<VkPhysicalDevice> physical_devices(physical_device_count); |
| 220 | result = instance_data->dispatch_table.EnumeratePhysicalDevices(*pInstance, &physical_device_count, physical_devices.data()); |
| 221 | if (result != VK_SUCCESS) return result; |
| 222 | |
| 223 | for (VkPhysicalDevice physical_device : physical_devices) { |
| 224 | layer_data* phy_dev_data = GetLayerDataPtr(physical_device, device_profile_api_dev_data_map); |
| 225 | instance_data->dispatch_table.GetPhysicalDeviceProperties(physical_device, &phy_dev_data->phy_device_props); |
| 226 | instance_data->dispatch_table.GetPhysicalDeviceFeatures(physical_device, &phy_dev_data->phy_device_features); |
| 227 | phy_dev_data->instance = *pInstance; |
| 228 | } |
| 229 | return result; |
| 230 | } |
| 231 | |
| 232 | VKAPI_ATTR void VKAPI_CALL DestroyInstance(VkInstance instance, const VkAllocationCallbacks* pAllocator) { |
| 233 | layer_data* instance_data = GetLayerDataPtr(instance, device_profile_api_dev_data_map); |
nothing calls this directly
no test coverage detected