layers: Codegen unique-objects extension whitelists

These lists are now generated from vk.xml.

Change-Id: Id7571d8b18b272c7d7ead905d53e5ff778afcb6e
diff --git a/scripts/unique_objects_generator.py b/scripts/unique_objects_generator.py
index bba7cfd..fdf4c38 100644
--- a/scripts/unique_objects_generator.py
+++ b/scripts/unique_objects_generator.py
@@ -121,8 +121,9 @@
                  diagFile = sys.stdout):
         OutputGenerator.__init__(self, errFile, warnFile, diagFile)
         self.INDENT_SPACES = 4
-        # Commands to ignore
         self.intercepts = []
+        self.instance_extensions = []
+        self.device_extensions = []
         # Commands which are not autogenerated but still intercepted
         self.no_autogen_list = [
             'vkGetDeviceProcAddr',
@@ -197,7 +198,23 @@
         write('namespace unique_objects {', file = self.outFile)
     #
     def endFile(self):
+        # Write out device extension white list
         self.newline()
+        write('// Layer Device Extension Whitelist', file=self.outFile)
+        write('static const char *kUniqueObjectsSupportedDeviceExtensions =', file=self.outFile)
+        for line in self.device_extensions:
+            write('%s' % line, file=self.outFile)
+        write(';\n', file=self.outFile)
+
+        # Write out instance extension white list
+        self.newline()
+        write('// Layer Instance Extension Whitelist', file=self.outFile)
+        write('static const char *kUniqueObjectsSupportedInstanceExtensions =', file=self.outFile)
+        for line in self.instance_extensions:
+            write('%s' % line, file=self.outFile)
+        write(';\n', file=self.outFile)
+        self.newline()
+
         # Record intercepted procedures
         write('// intercepts', file=self.outFile)
         write('struct { const char* name; PFN_vkVoidFunction pFunc;} procmap[] = {', file=self.outFile)
@@ -222,6 +239,18 @@
         self.flags = set()
         self.StructMemberData = namedtuple('StructMemberData', ['name', 'members'])
         self.CmdMemberData = namedtuple('CmdMemberData', ['name', 'members'])
+        if self.featureName != 'VK_VERSION_1_0':
+            white_list_entry = []
+            if (self.featureExtraProtect != None):
+                white_list_entry += [ '#ifdef %s' % self.featureExtraProtect ]
+            white_list_entry += [ '"%s"' % self.featureName ]
+            if (self.featureExtraProtect != None):
+                white_list_entry += [ '#endif' ]
+            featureType = interface.get('type')
+            if featureType == 'instance':
+                self.instance_extensions += white_list_entry
+            elif featureType == 'device':
+                self.device_extensions += white_list_entry
     #
     def endFeature(self):
         # Actually write the interface to the output file.