loader: Make the global/instance ext list once for each instance
authorJon Ashburn <jon@lunarg.com>
Fri, 14 Aug 2015 18:51:47 +0000 (12:51 -0600)
committerJon Ashburn <jon@lunarg.com>
Mon, 24 Aug 2015 15:17:44 +0000 (09:17 -0600)
Also fix some bugs in the heap_alloc/heap_free.
Also fix some memory leaks.

loader/loader.c
loader/loader.h
loader/trampoline.c

index 1dc69a4..c70d377 100644 (file)
@@ -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;
 }
 
index 15b78f5..5b66266 100644 (file)
@@ -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;
index bfc0f12..3c779c7 100644 (file)
@@ -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);