layers: Migrate OT layer to use layer chassis

Add changes to support layer chassis-based build of the
object_tracker layer which replaces the legacy object-
tracker build, including cmake and Android updates.

Change-Id: If914cc3094fcf17b0f2e1002842d0b58b876d2b0
diff --git a/scripts/layer_chassis_generator.py b/scripts/layer_chassis_generator.py
index 2ca3891..a27fcd6 100644
--- a/scripts/layer_chassis_generator.py
+++ b/scripts/layer_chassis_generator.py
@@ -155,43 +155,19 @@
 
 #define VALIDATION_ERROR_MAP_IMPL
 
-#include "vk_loader_platform.h"
-#include "vk_dispatch_table_helper.h"
-#include "vk_layer_data.h"
-#include "vk_layer_extension_utils.h"
-#include "vk_layer_logging.h"
-#include "vk_extension_helper.h"
-#include "vk_layer_utils.h"
+#include "chassis.h"
 
 class layer_chassis;
 
 std::vector<layer_chassis *> global_interceptor_list;
 debug_report_data *report_data = VK_NULL_HANDLE;
 
-#include "chassis.h"
+std::unordered_map<void *, layer_data *> layer_data_map;
+std::unordered_map<void *, instance_layer_data *> instance_layer_data_map;
 
-struct instance_layer_data {
-    VkLayerInstanceDispatchTable dispatch_table;
-    VkInstance instance = VK_NULL_HANDLE;
-    debug_report_data *report_data = nullptr;
-    std::vector<VkDebugReportCallbackEXT> logging_callback;
-    std::vector<VkDebugUtilsMessengerEXT> logging_messenger;
-    InstanceExtensions extensions;
-};
-
-struct layer_data {
-    debug_report_data *report_data = nullptr;
-    VkLayerDispatchTable dispatch_table;
-    DeviceExtensions extensions = {};
-    VkDevice device = VK_NULL_HANDLE;
-    VkPhysicalDevice physical_device = VK_NULL_HANDLE;
-    instance_layer_data *instance_data = nullptr;
-};
-
-static std::unordered_map<void *, layer_data *> layer_data_map;
-static std::unordered_map<void *, instance_layer_data *> instance_layer_data_map;
-
+// Create an object_lifetime object and add it to the global_interceptor_list
 #include "interceptor_objects.h"
+ObjectLifetimes object_tracker_object;
 
 using mutex_t = std::mutex;
 using lock_guard_t = std::lock_guard<mutex_t>;
@@ -298,7 +274,7 @@
     instance_data->report_data = debug_utils_create_instance(
         &instance_data->dispatch_table, *pInstance, pCreateInfo->enabledExtensionCount, pCreateInfo->ppEnabledExtensionNames);
     instance_data->extensions.InitFromInstanceCreateInfo((pCreateInfo->pApplicationInfo ? pCreateInfo->pApplicationInfo->apiVersion : VK_API_VERSION_1_0), pCreateInfo);
-    layer_debug_messenger_actions(instance_data->report_data, instance_data->logging_messenger, pAllocator, "lunarg_validation_layer");
+    layer_debug_messenger_actions(instance_data->report_data, instance_data->logging_messenger, pAllocator, "lunarg_object_tracker");
     report_data = instance_data->report_data;
 
     for (auto intercept : global_interceptor_list) {
@@ -551,8 +527,62 @@
             if (genOpts.prefixText):
                 for s in genOpts.prefixText:
                     write(s, file=self.outFile)
+            write('#include <mutex>', file=self.outFile)
+            write('#include <cinttypes>', file=self.outFile)
+            write('#include <stdio.h>', file=self.outFile)
+            write('#include <stdlib.h>', file=self.outFile)
+            write('#include <string.h>', file=self.outFile)
+            write('#include <unordered_map>', file=self.outFile)
+            write('#include <unordered_set>', file=self.outFile)
+
+            write('#include "vk_loader_platform.h"', file=self.outFile)
+            write('#include "vulkan/vulkan.h"', file=self.outFile)
+            write('#include "vk_layer_config.h"', file=self.outFile)
+            write('#include "vk_layer_data.h"', file=self.outFile)
+            write('#include "vk_layer_logging.h"', file=self.outFile)
+            write('#include "vk_object_types.h"', file=self.outFile)
             write('#include "vulkan/vk_layer.h"', file=self.outFile)
-            write('#include <unordered_map>\n', file=self.outFile)
+            write('#include "vk_enum_string_helper.h"', file=self.outFile)
+            write('#include "vk_layer_extension_utils.h"', file=self.outFile)
+            write('#include "vk_layer_utils.h"', file=self.outFile)
+            write('#include "vulkan/vk_layer.h"', file=self.outFile)
+            write('#include "vk_dispatch_table_helper.h"', file=self.outFile)
+            write('#include "vk_validation_error_messages.h"', file=self.outFile)
+            write('#include "vk_extension_helper.h"', file=self.outFile)
+            write('', file=self.outFile)
+
+
+            # TODO: Need some ifdef code here for which layer is being built!
+            write('#include "object_lifetimes.h"', file=self.outFile)
+            write('', file=self.outFile)
+
+            write('struct instance_layer_data {', file=self.outFile)
+            write('    VkLayerInstanceDispatchTable dispatch_table;', file=self.outFile)
+            write('    VkInstance instance = VK_NULL_HANDLE;', file=self.outFile)
+            write('    debug_report_data *report_data = nullptr;', file=self.outFile)
+            write('    std::vector<VkDebugReportCallbackEXT> logging_callback;', file=self.outFile)
+            write('    std::vector<VkDebugUtilsMessengerEXT> logging_messenger;', file=self.outFile)
+            write('    InstanceExtensions extensions;', file=self.outFile)
+            write('', file=self.outFile)
+            # TODO: Need some ifdef code here for which layer is being built!
+            write('    object_lifetime objdata;', file=self.outFile)
+            write('};', file=self.outFile)
+            write('', file=self.outFile)
+            write('struct layer_data {', file=self.outFile)
+            write('    debug_report_data *report_data = nullptr;', file=self.outFile)
+            write('    VkLayerDispatchTable dispatch_table;', file=self.outFile)
+            write('    DeviceExtensions extensions = {};', file=self.outFile)
+            write('    VkDevice device = VK_NULL_HANDLE;', file=self.outFile)
+            write('    VkPhysicalDevice physical_device = VK_NULL_HANDLE;', file=self.outFile)
+            write('    instance_layer_data *instance_data = nullptr;', file=self.outFile)
+            write('', file=self.outFile)
+            # TODO: Need some ifdef code here for which layer is being built!
+            write('    object_lifetime objdata;', file=self.outFile)
+            write('};', file=self.outFile)
+            write('', file=self.outFile)
+            write('extern std::unordered_map<void *, layer_data *> layer_data_map;', file=self.outFile)
+            write('extern std::unordered_map<void *, instance_layer_data *> instance_layer_data_map;', file=self.outFile)
+            write('', file=self.outFile)
             write('class layer_chassis;', file=self.outFile)
             write('extern std::vector<layer_chassis *> global_interceptor_list;', file=self.outFile)
             write('extern debug_report_data *report_data;\n', file=self.outFile)
@@ -619,7 +649,7 @@
                 write('\n'.join(self.sections['command']), end=u'', file=self.outFile)
                 self.newline()
             if (self.featureExtraProtect != None):
-                write('#endif /*', self.featureExtraProtect, '*/', file=self.outFile)
+                write('#endif //', self.featureExtraProtect, file=self.outFile)
         # Finish processing in superclass
         OutputGenerator.endFeature(self)
     #
@@ -662,9 +692,6 @@
         prototype = prototype.replace(")", "", 1)
         prototype = prototype.replace(";", " {};")
 
-        if 'GetPhysicalDeviceMemoryProperties' in prototype:
-            stop = 'here'
-
         # Build up pre/post call virtual function declarations
         pre_call_validate = 'virtual bool PreCallValidate' + prototype
         pre_call_validate = pre_call_validate.replace("{}", " { return false; }")
@@ -776,7 +803,10 @@
         self.appendSection('command', '    ' + assignresult + API + '(' + paramstext + ');')
 
         # Generate post-call object processing source code
-        self.appendSection('command', '    {')
+        return_check = ''
+        if (resulttype.text == 'VkResult'):
+            return_check = 'if (VK_SUCCESS == result) '
+        self.appendSection('command', '    %s{' % return_check)
         self.appendSection('command', '        std::lock_guard<std::mutex> lock(global_lock);')
         self.appendSection('command', '        for (auto intercept : global_interceptor_list) {')
         self.appendSection('command', '            intercept->PostCallRecord%s(%s);' % (api_function_name[2:], paramstext))