diff options
| author | Jon Ashburn <jon@lunarg.com> | 2016-02-11 18:59:43 -0700 |
|---|---|---|
| committer | Jon Ashburn <jon@lunarg.com> | 2016-02-14 09:24:16 -0700 |
| commit | 696fc84da25c5458bf188fc9b30b8a9e42f2b1b2 (patch) | |
| tree | ff15aa06523133c4755e74e13bee19d03ac6a9e8 /loader | |
| parent | abc45636e7d078ea0825bc5c60f12e7b5aa6454d (diff) | |
| download | usermoji-696fc84da25c5458bf188fc9b30b8a9e42f2b1b2.tar.xz | |
loader: add support for standard_validation layer enabled from env var
Also fix memory corruption issue with the original std_validation patch.
Diffstat (limited to 'loader')
| -rw-r--r-- | loader/loader.c | 89 | ||||
| -rw-r--r-- | loader/loader.h | 8 | ||||
| -rw-r--r-- | loader/trampoline.c | 19 |
3 files changed, 86 insertions, 30 deletions
diff --git a/loader/loader.c b/loader/loader.c index 106c88f3..39e5ab00 100644 --- a/loader/loader.c +++ b/loader/loader.c @@ -1671,11 +1671,18 @@ void loader_expand_layer_names( uint32_t expand_count, const char expand_names[][VK_MAX_EXTENSION_NAME_SIZE], uint32_t *layer_count, char ***ppp_layer_names) { - char **pp_layer_names = *ppp_layer_names; + char **pp_layer_names, **pp_src_layers = *ppp_layer_names; + if (!loader_find_layer_name(key_name, *layer_count, - (const char **)pp_layer_names)) + (const char **)pp_src_layers)) return; // didn't find the key_name in the list + // since the total number of layers may expand, allocate new memory for the + // array of pointers + pp_layer_names = + loader_heap_alloc(inst, (expand_count + *layer_count) * sizeof(char *), + VK_SYSTEM_ALLOCATION_SCOPE_COMMAND); + loader_log(inst, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, 0, "Found meta layer %s, replacing with actual layer group", key_name); @@ -1684,22 +1691,23 @@ void loader_expand_layer_names( // Also remove the key_name uint32_t src_idx, dst_idx, cnt = *layer_count; for (src_idx = 0; src_idx < *layer_count; src_idx++) { - if (loader_find_layer_name_array(pp_layer_names[src_idx], expand_count, + if (loader_find_layer_name_array(pp_src_layers[src_idx], expand_count, expand_names)) { - pp_layer_names[src_idx] = NULL; + pp_src_layers[src_idx] = NULL; cnt--; - } else if (!strcmp(pp_layer_names[src_idx], key_name)) { - pp_layer_names[src_idx] = NULL; + } else if (!strcmp(pp_src_layers[src_idx], key_name)) { + pp_src_layers[src_idx] = NULL; cnt--; } + pp_layer_names[src_idx] = pp_src_layers[src_idx]; } for (dst_idx = 0; dst_idx < cnt; dst_idx++) { if (pp_layer_names[dst_idx] == NULL) { src_idx = dst_idx + 1; - while (src_idx < *layer_count && pp_layer_names[src_idx] == NULL) + while (src_idx < *layer_count && pp_src_layers[src_idx] == NULL) src_idx++; - if (src_idx < *layer_count && pp_layer_names[src_idx] != NULL) - pp_layer_names[dst_idx] = pp_layer_names[src_idx]; + if (src_idx < *layer_count && pp_src_layers[src_idx] != NULL) + pp_layer_names[dst_idx] = pp_src_layers[src_idx]; } } @@ -1709,6 +1717,7 @@ void loader_expand_layer_names( pp_layer_names[dst_idx] = (char *)&expand_names[src_idx++][0]; } *layer_count = expand_count + cnt; + *ppp_layer_names = pp_layer_names; return; } @@ -1720,22 +1729,34 @@ void loader_expand_layer_names( * @param layer_names * @param pCreateInfo */ -void loader_unexpand_dev_layer_names(uint32_t layer_count, char **layer_names, +void loader_unexpand_dev_layer_names(const struct loader_instance *inst, + uint32_t layer_count, char **layer_names, + char **layer_ptr, const VkDeviceCreateInfo *pCreateInfo) { uint32_t *p_cnt = (uint32_t *)&pCreateInfo->enabledLayerCount; *p_cnt = layer_count; + char ***p_ptr = (char ***)&pCreateInfo->ppEnabledLayerNames; + if ((char **)pCreateInfo->ppEnabledLayerNames != layer_ptr) + loader_heap_free(inst, (void *)pCreateInfo->ppEnabledLayerNames); + *p_ptr = layer_ptr; for (uint32_t i = 0; i < layer_count; i++) { char **pp_str = (char **)&pCreateInfo->ppEnabledLayerNames[i]; *pp_str = layer_names[i]; } } -void loader_unexpand_inst_layer_names(uint32_t layer_count, char **layer_names, +void loader_unexpand_inst_layer_names(const struct loader_instance *inst, + uint32_t layer_count, char **layer_names, + char **layer_ptr, const VkInstanceCreateInfo *pCreateInfo) { uint32_t *p_cnt = (uint32_t *)&pCreateInfo->enabledLayerCount; *p_cnt = layer_count; + char ***p_ptr = (char ***)&pCreateInfo->ppEnabledLayerNames; + if ((char **)pCreateInfo->ppEnabledLayerNames != layer_ptr) + loader_heap_free(inst, (void *)pCreateInfo->ppEnabledLayerNames); + *p_ptr = layer_ptr; for (uint32_t i = 0; i < layer_count; i++) { char **pp_str = (char **)&pCreateInfo->ppEnabledLayerNames[i]; *pp_str = layer_names[i]; @@ -2982,8 +3003,24 @@ static void loader_add_layer_env(const struct loader_instance *inst, while (name && *name) { next = loader_get_next_path(name); - loader_find_layer_name_add_list(inst, name, type, search_list, - layer_list); + if (!strcmp(std_validation_str, name)) { + /* add meta list of layers + don't attempt to remove duplicate layers already added by app or + env var + */ + loader_log(inst, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, 0, + "Expanding meta layer %s found in environment variable", + std_validation_str); + for (uint32_t i = 0; i < sizeof(std_validation_names) / + sizeof(std_validation_names[0]); + i++) { + loader_find_layer_name_add_list(inst, std_validation_names[i], + type, search_list, layer_list); + } + } else { + loader_find_layer_name_add_list(inst, name, type, search_list, + layer_list); + } name = next; } @@ -3966,11 +4003,14 @@ loader_CreateDevice(VkPhysicalDevice physicalDevice, /* convert any meta layers to the actual layers makes a copy of layer name*/ uint32_t saved_layer_count = pCreateInfo->enabledLayerCount; - char **saved_layer_names; - saved_layer_names = loader_stack_alloc(sizeof(char*) * pCreateInfo->enabledLayerCount); + char **saved_layer_names; + char **saved_layer_ptr; + saved_layer_names = + loader_stack_alloc(sizeof(char *) * pCreateInfo->enabledLayerCount); for (uint32_t i = 0; i < saved_layer_count; i++) { saved_layer_names[i] = (char *)pCreateInfo->ppEnabledLayerNames[i]; } + saved_layer_ptr = (char **)pCreateInfo->ppEnabledLayerNames; loader_expand_layer_names( inst, std_validation_str, @@ -3982,7 +4022,8 @@ loader_CreateDevice(VkPhysicalDevice physicalDevice, res = loader_enable_device_layers(inst, icd, &activated_layer_list, pCreateInfo, &inst->device_layer_list); if (res != VK_SUCCESS) { - loader_unexpand_dev_layer_names(saved_layer_count, saved_layer_names, + loader_unexpand_dev_layer_names(inst, saved_layer_count, + saved_layer_names, saved_layer_ptr, pCreateInfo); return res; } @@ -3991,7 +4032,8 @@ loader_CreateDevice(VkPhysicalDevice physicalDevice, res = loader_validate_device_extensions(phys_dev, &activated_layer_list, pCreateInfo); if (res != VK_SUCCESS) { - loader_unexpand_dev_layer_names(saved_layer_count, saved_layer_names, + loader_unexpand_dev_layer_names(inst, saved_layer_count, + saved_layer_names, saved_layer_ptr, pCreateInfo); loader_destroy_generic_list( inst, (struct loader_generic_list *)&activated_layer_list); @@ -4000,7 +4042,8 @@ loader_CreateDevice(VkPhysicalDevice physicalDevice, dev = loader_add_logical_device(inst, &icd->logical_device_list); if (dev == NULL) { - loader_unexpand_dev_layer_names(saved_layer_count, saved_layer_names, + loader_unexpand_dev_layer_names(inst, saved_layer_count, + saved_layer_names, saved_layer_ptr, pCreateInfo); loader_destroy_generic_list( inst, (struct loader_generic_list *)&activated_layer_list); @@ -4018,7 +4061,8 @@ loader_CreateDevice(VkPhysicalDevice physicalDevice, res = loader_enable_device_layers(inst, icd, &dev->activated_layer_list, pCreateInfo, &inst->device_layer_list); if (res != VK_SUCCESS) { - loader_unexpand_dev_layer_names(saved_layer_count, saved_layer_names, + loader_unexpand_dev_layer_names(inst, saved_layer_count, + saved_layer_names, saved_layer_ptr, pCreateInfo); loader_remove_logical_device(inst, icd, dev); return res; @@ -4027,7 +4071,8 @@ loader_CreateDevice(VkPhysicalDevice physicalDevice, res = loader_create_device_chain(physicalDevice, pCreateInfo, pAllocator, inst, icd, dev); if (res != VK_SUCCESS) { - loader_unexpand_dev_layer_names(saved_layer_count, saved_layer_names, + loader_unexpand_dev_layer_names(inst, saved_layer_count, + saved_layer_names, saved_layer_ptr, pCreateInfo); loader_remove_logical_device(inst, icd, dev); return res; @@ -4045,8 +4090,8 @@ loader_CreateDevice(VkPhysicalDevice physicalDevice, &dev->loader_dispatch, dev->loader_dispatch.core_dispatch.GetDeviceProcAddr, *pDevice); - loader_unexpand_dev_layer_names(saved_layer_count, saved_layer_names, - pCreateInfo); + loader_unexpand_dev_layer_names(inst, saved_layer_count, saved_layer_names, + saved_layer_ptr, pCreateInfo); return res; } diff --git a/loader/loader.h b/loader/loader.h index d40952e3..800f774d 100644 --- a/loader/loader.h +++ b/loader/loader.h @@ -489,9 +489,13 @@ void loader_expand_layer_names( uint32_t expand_count, const char expand_names[][VK_MAX_EXTENSION_NAME_SIZE], uint32_t *layer_count, char ***ppp_layer_names); -void loader_unexpand_dev_layer_names(uint32_t layer_count, char **layer_names, +void loader_unexpand_dev_layer_names(const struct loader_instance *inst, + uint32_t layer_count, char **layer_names, + char **layer_ptr, const VkDeviceCreateInfo *pCreateInfo); -void loader_unexpand_inst_layer_names(uint32_t layer_count, char **layer_names, +void loader_unexpand_inst_layer_names(const struct loader_instance *inst, + uint32_t layer_count, char **layer_names, + char **layer_ptr, const VkInstanceCreateInfo *pCreateInfo); void loader_add_to_layer_list(const struct loader_instance *inst, struct loader_layer_list *list, diff --git a/loader/trampoline.c b/loader/trampoline.c index 473daa62..dfd2c000 100644 --- a/loader/trampoline.c +++ b/loader/trampoline.c @@ -121,11 +121,14 @@ vkCreateInstance(const VkInstanceCreateInfo *pCreateInfo, /* convert any meta layers to the actual layers makes a copy of layer name*/ uint32_t saved_layer_count = pCreateInfo->enabledLayerCount; - char **saved_layer_names; - saved_layer_names = loader_stack_alloc(sizeof(char*) * pCreateInfo->enabledLayerCount); + char **saved_layer_names; + char **saved_layer_ptr; + saved_layer_names = + loader_stack_alloc(sizeof(char *) * pCreateInfo->enabledLayerCount); for (uint32_t i = 0; i < saved_layer_count; i++) { saved_layer_names[i] = (char *)pCreateInfo->ppEnabledLayerNames[i]; } + saved_layer_ptr = (char **)pCreateInfo->ppEnabledLayerNames; loader_expand_layer_names( ptr_instance, std_validation_str, @@ -144,7 +147,8 @@ vkCreateInstance(const VkInstanceCreateInfo *pCreateInfo, ptr_instance, &ptr_instance->ext_list, &ptr_instance->instance_layer_list, pCreateInfo); if (res != VK_SUCCESS) { - loader_unexpand_inst_layer_names(saved_layer_count, saved_layer_names, + loader_unexpand_inst_layer_names(ptr_instance, saved_layer_count, + saved_layer_names, saved_layer_ptr, pCreateInfo); loader_delete_layer_properties(ptr_instance, &ptr_instance->device_layer_list); @@ -164,7 +168,8 @@ vkCreateInstance(const VkInstanceCreateInfo *pCreateInfo, loader_heap_alloc(ptr_instance, sizeof(VkLayerInstanceDispatchTable), VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE); if (ptr_instance->disp == NULL) { - loader_unexpand_inst_layer_names(saved_layer_count, saved_layer_names, + loader_unexpand_inst_layer_names(ptr_instance, saved_layer_count, + saved_layer_names, saved_layer_ptr, pCreateInfo); loader_delete_layer_properties(ptr_instance, &ptr_instance->device_layer_list); @@ -187,7 +192,8 @@ vkCreateInstance(const VkInstanceCreateInfo *pCreateInfo, res = loader_enable_instance_layers(ptr_instance, pCreateInfo, &ptr_instance->instance_layer_list); if (res != VK_SUCCESS) { - loader_unexpand_inst_layer_names(saved_layer_count, saved_layer_names, + loader_unexpand_inst_layer_names(ptr_instance, saved_layer_count, + saved_layer_names, saved_layer_ptr, pCreateInfo); loader_delete_layer_properties(ptr_instance, &ptr_instance->device_layer_list); @@ -228,7 +234,8 @@ vkCreateInstance(const VkInstanceCreateInfo *pCreateInfo, /* Remove temporary debug_report callback */ util_DestroyDebugReportCallback(ptr_instance, instance_callback, NULL); - loader_unexpand_inst_layer_names(saved_layer_count, saved_layer_names, + loader_unexpand_inst_layer_names(ptr_instance, saved_layer_count, + saved_layer_names, saved_layer_ptr, pCreateInfo); loader_platform_thread_unlock_mutex(&loader_lock); return res; |
