layers: Add bailout for CreateDevice validation
CreateDevice validation errors were ignored. Also moved some
CreateDevice state to be available before the down-chain call
for validation purposes.
Change-Id: I9985a452c6b16b723e2defa6a575cf4e8539148d
diff --git a/scripts/layer_chassis_generator.py b/scripts/layer_chassis_generator.py
index 4e35dd7..d1744dc 100644
--- a/scripts/layer_chassis_generator.py
+++ b/scripts/layer_chassis_generator.py
@@ -614,11 +614,25 @@
}
chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
+ // Get physical device limits for device
+ VkPhysicalDeviceProperties device_properties = {};
+ instance_interceptor->instance_dispatch_table.GetPhysicalDeviceProperties(gpu, &device_properties);
+
+ // Setup the validation tables based on the application API version from the instance and the capabilities of the device driver
+ uint32_t effective_api_version = std::min(device_properties.apiVersion, instance_interceptor->api_version);
+
+ DeviceExtensions device_extensions = {};
+ device_extensions.InitFromDeviceCreateInfo(&instance_interceptor->instance_extensions, effective_api_version, pCreateInfo);
+ for (auto item : instance_interceptor->object_dispatch) {
+ item->device_extensions = device_extensions;
+ }
+
+ bool skip = false;
for (auto intercept : instance_interceptor->object_dispatch) {
intercept->write_lock();
- intercept->PreCallValidateCreateDevice(gpu, pCreateInfo, pAllocator, pDevice);
+ skip |= intercept->PreCallValidateCreateDevice(gpu, pCreateInfo, pAllocator, pDevice);
intercept->write_unlock();
-
+ if (skip) return VK_ERROR_VALIDATION_FAILED_EXT;
}
for (auto intercept : instance_interceptor->object_dispatch) {
intercept->write_lock();
@@ -633,14 +647,11 @@
auto device_interceptor = GetLayerDataPtr(get_dispatch_key(*pDevice), layer_data_map);
- // Get physical device limits for device
- instance_interceptor->instance_dispatch_table.GetPhysicalDeviceProperties(
- gpu, &(device_interceptor->phys_dev_properties.properties));
-
- // Setup the validation tables based on the application API version from the instance and the capabilities of the device driver
- uint32_t effective_api_version = std::min(device_interceptor->api_version, instance_interceptor->api_version);
+ // Save local info in device object
+ device_interceptor->phys_dev_properties.properties = device_properties;
device_interceptor->api_version = device_interceptor->device_extensions.InitFromDeviceCreateInfo(
&instance_interceptor->instance_extensions, effective_api_version, pCreateInfo);
+ device_interceptor->device_extensions = device_extensions;
layer_init_device_dispatch_table(*pDevice, &device_interceptor->device_dispatch_table, fpGetDeviceProcAddr);