layers: Ready chassis for multi-VO layers

For the Khronos layer, all four validation objects will need to be
used together. Modified preprocessor directives to allow using
multiple VO definitions in a single layer.

Change-Id: Ia2a4e646f880d65f4296013f283b1873dbd1215d
diff --git a/scripts/layer_chassis_generator.py b/scripts/layer_chassis_generator.py
index 5b406ae..5967cad 100644
--- a/scripts/layer_chassis_generator.py
+++ b/scripts/layer_chassis_generator.py
@@ -451,21 +451,39 @@
 const bool wrap_handles = false;
 #endif
 
-// Include child object (layer) definitions
-#if BUILD_OBJECT_TRACKER
-#include "object_lifetime_validation.h"
+// Set layer name -- Khronos layer name overrides any other defined names
+#if BUILD_KNRONOS_VALIDATION
+#define OBJECT_LAYER_NAME "VK_LAYER_KHRONOS_validation"
+#define OBJECT_LAYER_DESCRIPTION "khronos_validation"
+#elif BUILD_OBJECT_TRACKER
 #define OBJECT_LAYER_NAME "VK_LAYER_LUNARG_object_tracker"
+#define OBJECT_LAYER_DESCRIPTION "lunarg_object_tracker"
 #elif BUILD_THREAD_SAFETY
-#include "thread_safety.h"
 #define OBJECT_LAYER_NAME "VK_LAYER_GOOGLE_threading"
+#define OBJECT_LAYER_DESCRIPTION "google_thread_checker"
 #elif BUILD_PARAMETER_VALIDATION
-#include "stateless_validation.h"
 #define OBJECT_LAYER_NAME "VK_LAYER_LUNARG_parameter_validation"
+#define OBJECT_LAYER_DESCRIPTION "lunarg_parameter_validation"
 #elif BUILD_CORE_VALIDATION
-#include "core_validation.h"
 #define OBJECT_LAYER_NAME "VK_LAYER_LUNARG_core_validation"
+#define OBJECT_LAYER_DESCRIPTION "lunarg_core_validation"
 #else
 #define OBJECT_LAYER_NAME "VK_LAYER_GOOGLE_unique_objects"
+#define OBJECT_LAYER_DESCRIPTION "lunarg_unique_objects"
+#endif
+
+// Include layer validation object definitions
+#if BUILD_OBJECT_TRACKER
+#include "object_lifetime_validation.h"
+#endif
+#if BUILD_THREAD_SAFETY
+#include "thread_safety.h"
+#endif
+#if BUILD_PARAMETER_VALIDATION
+#include "stateless_validation.h"
+#endif
+#if BUILD_CORE_VALIDATION
+#include "core_validation.h"
 #endif
 
 namespace vulkan_layer_chassis {
@@ -628,22 +646,26 @@
 
     // Create temporary dispatch vector for pre-calls until instance is created
     std::vector<ValidationObject*> local_object_dispatch;
+    // Add VOs to dispatch vector. Order here will be the validation dispatch order!
+#if BUILD_THREAD_SAFETY
+    auto thread_checker = new ThreadSafety;
+    local_object_dispatch.emplace_back(thread_checker);
+    thread_checker->container_type = LayerObjectTypeThreading;
+    thread_checker->api_version = api_version;
+#endif
+#if BUILD_PARAMETER_VALIDATION
+    auto parameter_validation = new StatelessValidation;
+    local_object_dispatch.emplace_back(parameter_validation);
+    parameter_validation->container_type = LayerObjectTypeParameterValidation;
+    parameter_validation->api_version = api_version;
+#endif
 #if BUILD_OBJECT_TRACKER
     auto object_tracker = new ObjectLifetimes;
     local_object_dispatch.emplace_back(object_tracker);
     object_tracker->container_type = LayerObjectTypeObjectTracker;
     object_tracker->api_version = api_version;
-#elif BUILD_THREAD_SAFETY
-    auto thread_checker = new ThreadSafety;
-    local_object_dispatch.emplace_back(thread_checker);
-    thread_checker->container_type = LayerObjectTypeThreading;
-    thread_checker->api_version = api_version;
-#elif BUILD_PARAMETER_VALIDATION
-    auto parameter_validation = new StatelessValidation;
-    local_object_dispatch.emplace_back(parameter_validation);
-    parameter_validation->container_type = LayerObjectTypeParameterValidation;
-    parameter_validation->api_version = api_version;
-#elif BUILD_CORE_VALIDATION
+#endif
+#if BUILD_CORE_VALIDATION
     auto core_checks = new CoreChecks;
     local_object_dispatch.emplace_back(core_checks);
     core_checks->container_type = LayerObjectTypeCoreValidation;
@@ -683,25 +705,33 @@
         SetValidationFeatures(framework, validation_features_ext);
     }
 
+    layer_debug_messenger_actions(framework->report_data, framework->logging_messenger, pAllocator, OBJECT_LAYER_DESCRIPTION);
+
 #if BUILD_OBJECT_TRACKER
-    layer_debug_messenger_actions(framework->report_data, framework->logging_messenger, pAllocator, "lunarg_object_tracker");
     object_tracker->report_data = framework->report_data;
-#elif BUILD_THREAD_SAFETY
-    layer_debug_messenger_actions(framework->report_data, framework->logging_messenger, pAllocator, "google_thread_checker");
+    object_tracker->instance_dispatch_table = framework->instance_dispatch_table;
+    object_tracker->enabled = framework->enabled;
+    object_tracker->disabled = framework->disabled;
+#endif
+#if BUILD_THREAD_SAFETY
     thread_checker->report_data = framework->report_data;
-#elif BUILD_PARAMETER_VALIDATION
-    layer_debug_messenger_actions(framework->report_data, framework->logging_messenger, pAllocator, "lunarg_parameter_validation");
+    thread_checker->instance_dispatch_table = framework->instance_dispatch_table;
+    thread_checker->enabled = framework->enabled;
+    thread_checker->disabled = framework->disabled;
+#endif
+#if BUILD_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");
+    parameter_validation->instance_dispatch_table = framework->instance_dispatch_table;
+    parameter_validation->enabled = framework->enabled;
+    parameter_validation->disabled = framework->disabled;
+#endif
+#if BUILD_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
 
     for (auto intercept : framework->object_dispatch) {
@@ -812,6 +842,29 @@
     device_interceptor->instance = instance_interceptor->instance;
     device_interceptor->report_data = layer_debug_utils_create_device(instance_interceptor->report_data, *pDevice);
 
+    // Note that this defines the order in which the layer validation objects are called
+#if BUILD_THREAD_SAFETY
+    auto thread_safety = new ThreadSafety;
+    // TODO:  Initialize child objects with parent info thru constuctor taking a parent object
+    thread_safety->container_type = LayerObjectTypeThreading;
+    thread_safety->physical_device = gpu;
+    thread_safety->instance = instance_interceptor->instance;
+    thread_safety->report_data = device_interceptor->report_data;
+    thread_safety->device_dispatch_table = device_interceptor->device_dispatch_table;
+    thread_safety->api_version = device_interceptor->api_version;
+    device_interceptor->object_dispatch.emplace_back(thread_safety);
+#endif
+#if BUILD_PARAMETER_VALIDATION
+    auto stateless_validation = new StatelessValidation;
+    // TODO:  Initialize child objects with parent info thru constuctor taking a parent object
+    stateless_validation->container_type = LayerObjectTypeParameterValidation;
+    stateless_validation->physical_device = gpu;
+    stateless_validation->instance = instance_interceptor->instance;
+    stateless_validation->report_data = device_interceptor->report_data;
+    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);
+#endif
 #if BUILD_OBJECT_TRACKER
     // Create child layer objects for this key and add to dispatch vector
     auto object_tracker = new ObjectLifetimes;
@@ -823,27 +876,8 @@
     object_tracker->device_dispatch_table = device_interceptor->device_dispatch_table;
     object_tracker->api_version = device_interceptor->api_version;
     device_interceptor->object_dispatch.emplace_back(object_tracker);
-#elif BUILD_THREAD_SAFETY
-    auto thread_safety = new ThreadSafety;
-    // TODO:  Initialize child objects with parent info thru constuctor taking a parent object
-    thread_safety->container_type = LayerObjectTypeThreading;
-    thread_safety->physical_device = gpu;
-    thread_safety->instance = instance_interceptor->instance;
-    thread_safety->report_data = device_interceptor->report_data;
-    thread_safety->device_dispatch_table = device_interceptor->device_dispatch_table;
-    thread_safety->api_version = device_interceptor->api_version;
-    device_interceptor->object_dispatch.emplace_back(thread_safety);
-#elif BUILD_PARAMETER_VALIDATION
-    auto stateless_validation = new StatelessValidation;
-    // TODO:  Initialize child objects with parent info thru constuctor taking a parent object
-    stateless_validation->container_type = LayerObjectTypeParameterValidation;
-    stateless_validation->physical_device = gpu;
-    stateless_validation->instance = instance_interceptor->instance;
-    stateless_validation->report_data = device_interceptor->report_data;
-    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
+#endif
+#if 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;