layers: Support INCOMPLETE return codes in chassis
For some APIs, VK_INCOMPLETE is a valid return code. Ensure post-calls
are still made in these cases.
Special-cased APIs are:
vkEnumeratePhysicalDevices
vkEnumeratePhysicalDeviceGroupsKHR
vkGetValidationCacheDataEXT
vkGetPipelineCacheData
vkGetShaderInfoAMD
vkGetPhysicalDeviceDisplayPropertiesKHR
vkGetPhysicalDeviceDisplayProperties2KHR
vkGetPhysicalDeviceDisplayPlanePropertiesKHR
vkGetDisplayPlaneSupportedDisplaysKHR
vkGetDisplayModePropertiesKHR
vkGetDisplayModeProperties2KHR
vkGetPhysicalDeviceSurfaceFormatsKHR
vkGetPhysicalDeviceSurfacePresentModesKHR
vkGetPhysicalDevicePresentRectanglesKHR
vkGetPastPresentationTimingGOOGLE
vkGetSwapchainImagesKHR
vkEnumerateInstanceLayerProperties
vkEnumerateDeviceLayerProperties
vkEnumerateInstanceExtensionProperties
vkEnumerateDeviceExtensionProperties
vkGetPhysicalDeviceCalibrateableTimeDomainsEXT
diff --git a/scripts/layer_chassis_generator.py b/scripts/layer_chassis_generator.py
index c2b6e28..57f3201 100644
--- a/scripts/layer_chassis_generator.py
+++ b/scripts/layer_chassis_generator.py
@@ -805,10 +805,37 @@
self.appendSection('command', ' ' + assignresult + API + '(' + paramstext + ');')
# Generate post-call object processing source code
+ alt_ret_codes = [
+ # Include functions here which must tolerate VK_INCOMPLETE as a return code
+ 'vkEnumeratePhysicalDevices',
+ 'vkEnumeratePhysicalDeviceGroupsKHR',
+ 'vkGetValidationCacheDataEXT',
+ 'vkGetPipelineCacheData',
+ 'vkGetShaderInfoAMD',
+ 'vkGetPhysicalDeviceDisplayPropertiesKHR',
+ 'vkGetPhysicalDeviceDisplayProperties2KHR',
+ 'vkGetPhysicalDeviceDisplayPlanePropertiesKHR',
+ 'vkGetDisplayPlaneSupportedDisplaysKHR',
+ 'vkGetDisplayModePropertiesKHR',
+ 'vkGetDisplayModeProperties2KHR',
+ 'vkGetPhysicalDeviceSurfaceFormatsKHR',
+ 'vkGetPhysicalDeviceSurfacePresentModesKHR',
+ 'vkGetPhysicalDevicePresentRectanglesKHR',
+ 'vkGetPastPresentationTimingGOOGLE',
+ 'vkGetSwapchainImagesKHR',
+ 'vkEnumerateInstanceLayerProperties',
+ 'vkEnumerateDeviceLayerProperties',
+ 'vkEnumerateInstanceExtensionProperties',
+ 'vkEnumerateDeviceExtensionProperties',
+ 'vkGetPhysicalDeviceCalibrateableTimeDomainsEXT',
+ ]
return_type_indent = ''
if (resulttype.text == 'VkResult'):
return_type_indent = ' '
- self.appendSection('command', ' if (VK_SUCCESS == result) {')
+ if name in alt_ret_codes:
+ self.appendSection('command', ' if ((VK_SUCCESS == result) || (VK_INCOMPLETE == result)) {')
+ else:
+ self.appendSection('command', ' if (VK_SUCCESS == result) {')
self.appendSection('command', '%s for (auto intercept : global_interceptor_list) {' % return_type_indent)
self.appendSection('command', '%s std::lock_guard<std::mutex> lock(intercept->layer_mutex);' % return_type_indent)
self.appendSection('command', '%s intercept->PostCallRecord%s(%s);' % (return_type_indent,api_function_name[2:], paramstext))