layers: Convert CV to use layer chassis

Change-Id: I990db304e096f832eee9a7cc8fb810490afdcb04
diff --git a/scripts/layer_chassis_generator.py b/scripts/layer_chassis_generator.py
index 89c84de..87c1a1f 100644
--- a/scripts/layer_chassis_generator.py
+++ b/scripts/layer_chassis_generator.py
@@ -236,10 +236,12 @@
 
 // Layer object type identifiers
 enum LayerObjectTypeId {
-    LayerObjectTypeThreading,
-    LayerObjectTypeParameterValidation,
-    LayerObjectTypeObjectTracker,
-    LayerObjectTypeCoreValidation,
+    LayerObjectTypeInstance,                    // Container for an instance dispatch object
+    LayerObjectTypeDevice,                      // Container for a device dispatch object
+    LayerObjectTypeThreading,                   // Instance or device threading layer object
+    LayerObjectTypeParameterValidation,         // Instance or device parameter validation layer object
+    LayerObjectTypeObjectTracker,               // Instance or device object tracker layer object
+    LayerObjectTypeCoreValidation,              // Instance or device core validation layer object
 };
 
 struct TEMPLATE_STATE {
@@ -327,6 +329,8 @@
         std::vector<ValidationObject*> object_dispatch;
         LayerObjectTypeId container_type;
 
+        std::string layer_name = "CHASSIS";
+
         // Constructor
         ValidationObject(){};
         // Destructor
@@ -346,8 +350,6 @@
             return nullptr;
         };
 
-        std::string layer_name = "CHASSIS";
-
         // Handle Wrapping Data
         // Reverse map display handles
         std::unordered_map<VkDisplayKHR, uint64_t> display_id_reverse_mapping;
@@ -461,6 +463,7 @@
 #include "stateless_validation.h"
 #define OBJECT_LAYER_NAME "VK_LAYER_LUNARG_parameter_validation"
 #elif BUILD_CORE_VALIDATION
+#include "core_validation.h"
 #define OBJECT_LAYER_NAME "VK_LAYER_LUNARG_core_validation"
 #else
 #define OBJECT_LAYER_NAME "VK_LAYER_GOOGLE_unique_objects"
@@ -641,9 +644,13 @@
     local_object_dispatch.emplace_back(parameter_validation);
     parameter_validation->container_type = LayerObjectTypeParameterValidation;
     parameter_validation->api_version = api_version;
+#elif BUILD_CORE_VALIDATION
+    auto core_checks = new CoreChecks;
+    local_object_dispatch.emplace_back(core_checks);
+    core_checks->container_type = LayerObjectTypeCoreValidation;
+    core_checks->api_version = api_version;
 #endif
 
-
     // Init dispatch array and call registration functions
     for (auto intercept : local_object_dispatch) {
         intercept->PreCallValidateCreateInstance(pCreateInfo, pAllocator, pInstance);
@@ -658,6 +665,7 @@
     auto framework = GetLayerDataPtr(get_dispatch_key(*pInstance), layer_data_map);
 
     framework->object_dispatch = local_object_dispatch;
+    framework->container_type = LayerObjectTypeInstance;
 
     framework->instance = *pInstance;
     layer_init_instance_dispatch_table(*pInstance, &framework->instance_dispatch_table, fpGetInstanceProcAddr);
@@ -685,6 +693,14 @@
 #elif BUILD_PARAMETER_VALIDATION
     layer_debug_messenger_actions(framework->report_data, framework->logging_messenger, pAllocator, "lunarg_parameter_validation");
     parameter_validation->report_data = framework->report_data;
+#elif BUILD_CORE_VALIDATION
+    layer_debug_messenger_actions(framework->report_data, framework->logging_messenger, pAllocator, "lunarg_core_validation");
+    core_checks->report_data = framework->report_data;
+    core_checks->instance_dispatch_table = framework->instance_dispatch_table;
+    core_checks->instance = *pInstance;
+    core_checks->enabled = framework->enabled;
+    core_checks->disabled = framework->disabled;
+    core_checks->instance_state = core_checks;
 #else
     layer_debug_messenger_actions(framework->report_data, framework->logging_messenger, pAllocator, "lunarg_unique_objects");
 #endif
@@ -782,6 +798,7 @@
     }
 
     auto device_interceptor = GetLayerDataPtr(get_dispatch_key(*pDevice), layer_data_map);
+    device_interceptor->container_type = LayerObjectTypeDevice;
 
     // Save local info in device object
     device_interceptor->phys_dev_properties.properties = device_properties;
@@ -827,6 +844,22 @@
     stateless_validation->device_dispatch_table = device_interceptor->device_dispatch_table;
     stateless_validation->api_version = device_interceptor->api_version;
     device_interceptor->object_dispatch.emplace_back(stateless_validation);
+#elif BUILD_CORE_VALIDATION
+    auto core_checks = new CoreChecks;
+    // TODO:  Initialize child objects with parent info thru constuctor taking a parent object
+    core_checks->container_type = LayerObjectTypeCoreValidation;
+    core_checks->physical_device = gpu;
+    core_checks->instance = instance_interceptor->instance;
+    core_checks->report_data = device_interceptor->report_data;
+    core_checks->device_dispatch_table = device_interceptor->device_dispatch_table;
+    core_checks->instance_dispatch_table = instance_interceptor->instance_dispatch_table;
+    core_checks->api_version = device_interceptor->api_version;
+    core_checks->instance_extensions = instance_interceptor->instance_extensions;
+    core_checks->device_extensions = device_interceptor->device_extensions;
+    core_checks->instance_state = reinterpret_cast<CoreChecks *>(
+        core_checks->GetValidationObject(instance_interceptor->object_dispatch, LayerObjectTypeCoreValidation));
+    core_checks->device = *pDevice;
+    device_interceptor->object_dispatch.emplace_back(core_checks);
 #endif
 
     for (auto intercept : instance_interceptor->object_dispatch) {