aboutsummaryrefslogtreecommitdiff
path: root/loader/loader.c
diff options
context:
space:
mode:
authorCourtney Goeltzenleuchter <courtneygo@google.com>2015-12-21 16:41:47 -0700
committerTony Barbour <tony@LunarG.com>2015-12-22 13:38:27 -0700
commit93040bbb39953f48deb2744018ff946238fbb58a (patch)
tree592dbec418032dea1cda9a1ea0eb49052730a431 /loader/loader.c
parent94bd53d2a92356a5b6dc1d565026f204304be498 (diff)
downloadusermoji-93040bbb39953f48deb2744018ff946238fbb58a.tar.xz
loader: Properly filter ICD extensions
As of NVIDIA driver 355.00.19, the ICD's CreateInstance checks for invalid extension names and it turns out the loader was passing on DEBUG_REPORT when it should have been filtered out. This change re-constructs the ICD's extension list to do that filtering.
Diffstat (limited to 'loader/loader.c')
-rw-r--r--loader/loader.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/loader/loader.c b/loader/loader.c
index d5ff4f98..d2d2d580 100644
--- a/loader/loader.c
+++ b/loader/loader.c
@@ -538,7 +538,7 @@ static void loader_add_instance_extensions(
const char *lib_name,
struct loader_extension_list *ext_list)
{
- uint32_t i, count;
+ uint32_t i, count = 0;
VkExtensionProperties *ext_props;
VkResult res;
@@ -3160,15 +3160,28 @@ VKAPI_ATTR VkResult VKAPI_CALL loader_CreateInstance(
icd = loader_icd_add(ptr_instance, &ptr_instance->icd_libs.list[i]);
if (icd) {
icd_create_info.enabledExtensionNameCount = 0;
+ struct loader_extension_list icd_exts;
+
+ loader_log(ptr_instance, VK_DEBUG_REPORT_DEBUG_BIT_EXT, 0, "Build ICD instance extension list");
+ // traverse scanned icd list adding non-duplicate extensions to the list
+ loader_init_generic_list(ptr_instance, (struct loader_generic_list *) &icd_exts,
+ sizeof(VkExtensionProperties));
+ loader_add_instance_extensions(ptr_instance,
+ icd->this_icd_lib->EnumerateInstanceExtensionProperties,
+ icd->this_icd_lib->lib_name,
+ &icd_exts);
+
for (uint32_t i = 0; i < pCreateInfo->enabledExtensionNameCount; i++) {
prop = get_extension_property(pCreateInfo->ppEnabledExtensionNames[i],
- &ptr_instance->ext_list);
+ &icd_exts);
if (prop) {
filtered_extension_names[icd_create_info.enabledExtensionNameCount] = (char *) pCreateInfo->ppEnabledExtensionNames[i];
icd_create_info.enabledExtensionNameCount++;
}
}
+ loader_destroy_generic_list(ptr_instance, (struct loader_generic_list *) &icd_exts);
+
res = ptr_instance->icd_libs.list[i].CreateInstance(&icd_create_info,
pAllocator,
&(icd->instance));