layers: Set apiversion before createinstance call
Validation objects could use api_version before it was initialized
after the down-chain call to CreateInstance. Moved setting this
variable before any first use.
Change-Id: I3e61c6cab0d75fe83f36542bb905a59c8b820e20
diff --git a/scripts/layer_chassis_generator.py b/scripts/layer_chassis_generator.py
index 65ad848..b204c0a 100644
--- a/scripts/layer_chassis_generator.py
+++ b/scripts/layer_chassis_generator.py
@@ -508,6 +508,9 @@
PFN_vkCreateInstance fpCreateInstance = (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance");
if (fpCreateInstance == NULL) return VK_ERROR_INITIALIZATION_FAILED;
chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
+ uint32_t specified_version = (pCreateInfo->pApplicationInfo ? pCreateInfo->pApplicationInfo->apiVersion : VK_API_VERSION_1_0);
+ uint32_t api_version = (specified_version < VK_API_VERSION_1_1) ? VK_API_VERSION_1_0 : VK_API_VERSION_1_1;
+
// Create temporary dispatch vector for pre-calls until instance is created
std::vector<ValidationObject*> local_object_dispatch;
@@ -515,14 +518,17 @@
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;
#endif
@@ -545,20 +551,18 @@
layer_init_instance_dispatch_table(*pInstance, &framework->instance_dispatch_table, fpGetInstanceProcAddr);
framework->report_data = debug_utils_create_instance(&framework->instance_dispatch_table, *pInstance, pCreateInfo->enabledExtensionCount,
pCreateInfo->ppEnabledExtensionNames);
- framework->api_version = framework->instance_extensions.InitFromInstanceCreateInfo(
- (pCreateInfo->pApplicationInfo ? pCreateInfo->pApplicationInfo->apiVersion : VK_API_VERSION_1_0), pCreateInfo);
+ framework->api_version = api_version;
+ framework->instance_extensions.InitFromInstanceCreateInfo(specified_version, pCreateInfo);
+
#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;
- object_tracker->api_version = framework->api_version;
#elif BUILD_THREAD_SAFETY
layer_debug_messenger_actions(framework->report_data, framework->logging_messenger, pAllocator, "google_thread_checker");
thread_checker->report_data = framework->report_data;
- thread_checker->api_version = framework->api_version;
#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;
- parameter_validation->api_version = framework->api_version;
#else
layer_debug_messenger_actions(framework->report_data, framework->logging_messenger, pAllocator, "lunarg_unique_objects");
#endif