loader: gl167 - Remove unknown inst extensions
authorLenny Komow <lenny@lunarg.com>
Thu, 29 Dec 2016 23:27:28 +0000 (16:27 -0700)
committerLenny Komow <lenny@lunarg.com>
Thu, 5 Jan 2017 23:20:51 +0000 (16:20 -0700)
Change-Id: I24aecbdab452a04514fd42a9a9ae7f3bcf1cd2ca

loader/loader.c

index 0a446cf..e3cbf45 100644 (file)
@@ -164,6 +164,34 @@ const VkLayerInstanceDispatchTable instance_disp = {
         terminator_GetPhysicalDeviceGeneratedCommandsPropertiesNVX,
 };
 
+// A null-terminated list of all of the instance extensions supported by the
+// loader
+static const char *const LOADER_INSTANCE_EXTENSIONS[] = {
+    VK_KHR_SURFACE_EXTENSION_NAME,
+    VK_KHR_DISPLAY_EXTENSION_NAME,
+#ifdef VK_USE_PLATFORM_XLIB_KHR
+    VK_KHR_XLIB_SURFACE_EXTENSION_NAME,
+#endif
+#ifdef VK_USE_PLATFORM_XCB_KHR
+    VK_KHR_XCB_SURFACE_EXTENSION_NAME,
+#endif
+#ifdef VK_USE_PLATFORM_WAYLAND_KHR
+    VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME,
+#endif
+#ifdef VK_USE_PLATFORM_MIR_KHR
+    VK_KHR_MIR_SURFACE_EXTENSION_NAME,
+#endif
+#ifdef VK_USE_PLATFORM_ANDROID_KHR
+    VK_KHR_ANDROID_SURFACE_EXTENSION_NAME,
+#endif
+#ifdef VK_USE_PLATFORM_WIN32_KHR
+    VK_KHR_WIN32_SURFACE_EXTENSION_NAME,
+#endif
+    VK_EXT_DEBUG_REPORT_EXTENSION_NAME,
+    VK_NV_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME,
+    VK_EXT_VALIDATION_FLAGS_EXTENSION_NAME,
+    NULL};
+
 LOADER_PLATFORM_THREAD_ONCE_DECLARATION(once_init);
 
 void *loader_instance_heap_alloc(const struct loader_instance *instance,
@@ -1237,6 +1265,30 @@ VkResult loader_get_icd_loader_instance_extensions(
                       .EnumerateInstanceExtensionProperties,
             icd_tramp_list->scanned_list[i].lib_name, &icd_exts);
         if (VK_SUCCESS == res) {
+            // Remove any extensions not recognized by the loader
+            for (int32_t j = 0; j < (int32_t)icd_exts.count; j++) {
+
+                // See if the extension is in the list of supported extensions
+                bool found = false;
+                for (uint32_t k = 0; LOADER_INSTANCE_EXTENSIONS[k] != NULL;
+                     k++) {
+                    if (strcmp(icd_exts.list[j].extensionName,
+                               LOADER_INSTANCE_EXTENSIONS[k]) == 0) {
+                        found = true;
+                        break;
+                    }
+                }
+
+                // If it isn't in the list, remove it
+                if (!found) {
+                    for (uint32_t k = j + 1; k < icd_exts.count; k++) {
+                        icd_exts.list[k - 1] = icd_exts.list[k];
+                    }
+                    --icd_exts.count;
+                    --j;
+                }
+            }
+
             res = loader_add_to_ext_list(inst, inst_exts, icd_exts.count,
                                          icd_exts.list);
         }
@@ -4040,6 +4092,21 @@ VkResult loader_validate_instance_extensions(
             return VK_ERROR_EXTENSION_NOT_PRESENT;
         }
 
+        // See if the extension is in the list of supported extensions
+        bool found = false;
+        for (uint32_t j = 0; LOADER_INSTANCE_EXTENSIONS[j] != NULL; j++) {
+            if (strcmp(pCreateInfo->ppEnabledExtensionNames[i],
+                       LOADER_INSTANCE_EXTENSIONS[j]) == 0) {
+                found = true;
+                break;
+            }
+        }
+
+        // If it isn't in the list, return an error
+        if (!found) {
+            return VK_ERROR_EXTENSION_NOT_PRESENT;
+        }
+
         extension_prop = get_extension_property(
             pCreateInfo->ppEnabledExtensionNames[i], icd_exts);