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.
diff --git a/loader/loader.c b/loader/loader.c
index 1dc69a4..c70d377 100644
--- a/loader/loader.c
+++ b/loader/loader.c
@@ -125,7 +125,7 @@
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 @@
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 @@
}
+ loader_destroy_ext_list(&ptr_instance->ext_list);
return VK_SUCCESS;
}
diff --git a/loader/loader.h b/loader/loader.h
index 15b78f5..5b66266 100644
--- a/loader/loader.h
+++ b/loader/loader.h
@@ -161,7 +161,7 @@
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 bfc0f12..3c779c7 100644
--- a/loader/trampoline.c
+++ b/loader/trampoline.c
@@ -42,7 +42,6 @@
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 @@
}
}
- /* 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 @@
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 @@
/* 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 @@
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);