diff options
| author | Jon Ashburn <jon@lunarg.com> | 2015-08-14 12:51:47 -0600 |
|---|---|---|
| committer | Jon Ashburn <jon@lunarg.com> | 2015-08-24 09:17:44 -0600 |
| commit | fa6801657f1f2c9e01699d16b3a6e6e64fb42a42 (patch) | |
| tree | fd912d2a5bca64a2512197999c350bf2295ac298 /loader | |
| parent | fa494f6c296ae26c7abf40dfdb4be0e99503e354 (diff) | |
| download | usermoji-fa6801657f1f2c9e01699d16b3a6e6e64fb42a42.tar.xz | |
loader: Make the global/instance ext list once for each instance
Also fix some bugs in the heap_alloc/heap_free.
Also fix some memory leaks.
Diffstat (limited to 'loader')
| -rw-r--r-- | loader/loader.c | 5 | ||||
| -rw-r--r-- | loader/loader.h | 2 | ||||
| -rw-r--r-- | loader/trampoline.c | 29 |
3 files changed, 21 insertions, 15 deletions
diff --git a/loader/loader.c b/loader/loader.c index 1dc69a4d..c70d3775 100644 --- a/loader/loader.c +++ b/loader/loader.c @@ -125,7 +125,7 @@ void* loader_aligned_heap_alloc( size_t alignment, VkSystemAllocType alloc_type) { - if (!instance && instance->alloc_callbacks.pfnAlloc) { + if (instance && instance->alloc_callbacks.pfnAlloc) { return instance->alloc_callbacks.pfnAlloc(instance->alloc_callbacks.pUserData, size, alignment, alloc_type); } #if defined(_WIN32) @@ -139,7 +139,7 @@ void loader_heap_free( struct loader_instance *instance, void *pMem) { - if (!instance && instance->alloc_callbacks.pfnFree) { + if (instance && instance->alloc_callbacks.pfnFree) { instance->alloc_callbacks.pfnFree(instance->alloc_callbacks.pUserData, pMem); return; } @@ -2450,6 +2450,7 @@ VkResult VKAPI loader_DestroyInstance( } + loader_destroy_ext_list(&ptr_instance->ext_list); return VK_SUCCESS; } diff --git a/loader/loader.h b/loader/loader.h index 15b78f57..5b662666 100644 --- a/loader/loader.h +++ b/loader/loader.h @@ -161,7 +161,7 @@ struct loader_instance { uint32_t total_icd_count; struct loader_icd *icds; struct loader_instance *next; - + struct loader_extension_list ext_list; /* TODO: Should keep track of application provided allocation functions */ struct loader_msg_callback_map_entry *icd_msg_callback_map; diff --git a/loader/trampoline.c b/loader/trampoline.c index bfc0f121..3c779c77 100644 --- a/loader/trampoline.c +++ b/loader/trampoline.c @@ -42,7 +42,6 @@ LOADER_EXPORT VkResult VKAPI vkCreateInstance( VkInstance* pInstance) { struct loader_instance *ptr_instance = NULL; - struct loader_extension_list icd_extensions; VkResult res = VK_ERROR_INITIALIZATION_FAILED; struct loader_layer_list instance_layer_list; @@ -66,14 +65,6 @@ LOADER_EXPORT VkResult VKAPI vkCreateInstance( } } - /* get extensions from all ICD's, merge so no duplicates, then validate */ - memset(&icd_extensions, 0, sizeof(icd_extensions)); - loader_get_icd_loader_instance_extensions(&icd_extensions); - res = loader_validate_instance_extensions(&icd_extensions, &instance_layer_list, pCreateInfo); - if (res != VK_SUCCESS) { - return res; - } - if (pCreateInfo->pAllocCb && pCreateInfo->pAllocCb->pfnAlloc && pCreateInfo->pAllocCb->pfnFree) { @@ -100,12 +91,24 @@ LOADER_EXPORT VkResult VKAPI vkCreateInstance( ptr_instance->alloc_callbacks.pfnFree = pCreateInfo->pAllocCb->pfnFree; } + /* get extensions from all ICD's, merge so no duplicates, then validate */ + loader_get_icd_loader_instance_extensions(&ptr_instance->ext_list); + res = loader_validate_instance_extensions(&ptr_instance->ext_list, &instance_layer_list, pCreateInfo); + if (res != VK_SUCCESS) { + loader_destroy_ext_list(&ptr_instance->ext_list); + loader_platform_thread_unlock_mutex(&loader_lock); + loader_heap_free(ptr_instance, ptr_instance); + return res; + } + ptr_instance->disp = loader_heap_alloc( ptr_instance, sizeof(VkLayerInstanceDispatchTable), VK_SYSTEM_ALLOC_TYPE_INTERNAL); if (ptr_instance->disp == NULL) { + loader_destroy_ext_list(&ptr_instance->ext_list); loader_platform_thread_unlock_mutex(&loader_lock); + loader_heap_free(ptr_instance, ptr_instance); return VK_ERROR_OUT_OF_HOST_MEMORY; } memcpy(ptr_instance->disp, &instance_disp, sizeof(instance_disp)); @@ -115,9 +118,11 @@ LOADER_EXPORT VkResult VKAPI vkCreateInstance( /* activate any layers on instance chain */ res = loader_enable_instance_layers(ptr_instance, pCreateInfo, &instance_layer_list); if (res != VK_SUCCESS) { + loader_destroy_ext_list(&ptr_instance->ext_list); + loader.instances = ptr_instance->next; + loader_platform_thread_unlock_mutex(&loader_lock); loader_heap_free(ptr_instance, ptr_instance->disp); loader_heap_free(ptr_instance, ptr_instance); - loader_platform_thread_unlock_mutex(&loader_lock); return res; } loader_activate_instance_layers(ptr_instance); @@ -155,8 +160,8 @@ LOADER_EXPORT VkResult VKAPI vkDestroyInstance( struct loader_instance *ptr_instance = loader_instance(instance); loader_deactivate_instance_layers(ptr_instance); - - free(ptr_instance); + loader_heap_free(ptr_instance, ptr_instance->disp); + loader_heap_free(ptr_instance, ptr_instance); loader_platform_thread_unlock_mutex(&loader_lock); |
