From b7f3c87b41941e2529a0be3bc647fae3e077a36a Mon Sep 17 00:00:00 2001 From: Mark Young Date: Thu, 27 Oct 2016 15:32:08 -0600 Subject: loader: gh1093 - Fix multiple EnumPhysDev calls The loader was freeing a previously allocated struct of physical devices every vkEnumeratePhysicalDevice call. This caused pointers to become stale. This change doesn't fix every scenario, but it does return the loader to the behavior it had before. Future work will re-evaluate the list every time and add/remove items as necessary. Change-Id: I32b27df1fab521826e6cd15c534d3ab4b2ea0688 --- loader/loader.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'loader') diff --git a/loader/loader.c b/loader/loader.c index 184809b2..e607eced 100644 --- a/loader/loader.c +++ b/loader/loader.c @@ -4442,6 +4442,9 @@ terminator_EnumeratePhysicalDevices(VkInstance instance, phys_devs[i].this_icd = icd; icd = icd->next; } + if (inst->total_gpu_count == 0) { + return VK_ERROR_INITIALIZATION_FAILED; + } uint32_t copy_count = inst->total_gpu_count; @@ -4456,22 +4459,19 @@ terminator_EnumeratePhysicalDevices(VkInstance instance, copy_count = *pPhysicalDeviceCount; } - if (inst->phys_devs_term) { - loader_instance_heap_free(inst, inst->phys_devs_term); - inst->phys_devs_term = NULL; - } - - if (inst->total_gpu_count > 0) { + if (NULL == inst->phys_devs_term) { inst->phys_devs_term = loader_instance_heap_alloc( inst, sizeof(struct loader_physical_device) * inst->total_gpu_count, VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE); - if (!inst->phys_devs_term) { + if (NULL == inst->phys_devs_term) { return VK_ERROR_OUT_OF_HOST_MEMORY; } } - for (i = 0; idx < inst->total_gpu_count && i < inst->total_icd_count; i++) { - for (j = 0; j < phys_devs[i].count && idx < inst->total_gpu_count; j++) { + for (i = 0; idx < inst->total_gpu_count && i < inst->total_icd_count; + i++) { + for (j = 0; j < phys_devs[i].count && idx < inst->total_gpu_count; + j++) { loader_set_dispatch((void *)&inst->phys_devs_term[idx], inst->disp); inst->phys_devs_term[idx].this_icd = phys_devs[i].this_icd; -- cgit v1.2.3