layers: Change pNext validation error to warning
Change the severity level of the parameter_validation layer's pNext
parameter validation messages from error to warning. Also add an
explanation that the warning is derived from the Valid Usage
language from version X of the Vulkan spec/header, which may be out
of date:
This warning is based on the Valid Usage documentation for version %d
of the Vulkan header. It is possible that you are using a struct
from a private extension or an extension that was added to a later
version of the Vulkan header, in which case your use of pNext is
perfectly valid but is not guaranteed to work correctly with
validation enabled
Issues-Addressed: LunarXchange 560
Change-Id: I97f55cba7538506d246e45ef603a86db9ad1adcb
diff --git a/layers/parameter_validation_utils.h b/layers/parameter_validation_utils.h
index c49ce47..2d42f85 100644
--- a/layers/parameter_validation_utils.h
+++ b/layers/parameter_validation_utils.h
@@ -442,44 +442,55 @@
* verify that pNext is null.
*
* @param report_data debug_report_data object for routing validation messages.
- * @param apiName Name of API call being validated.
- * @param parameterName Name of parameter being validated.
- * @param allowedStructNames Names of allowed structs.
+ * @param api_name Name of API call being validated.
+ * @param parameter_name Name of parameter being validated.
+ * @param allowed_struct_names Names of allowed structs.
* @param next Pointer to validate.
- * @param allowedTypeCount total number of allowed structure types.
- * @param allowedTypes array of strcuture types allowed for pNext.
+ * @param allowed_type_count Total number of allowed structure types.
+ * @param allowed_types Array of strcuture types allowed for pNext.
+ * @param header_version Version of header defining the pNext validation rules.
* @return Boolean value indicating that the call should be skipped.
*/
-static bool validate_struct_pnext(debug_report_data *report_data, const char *apiName, const char *parameterName,
- const char *allowedStructNames, const void *next, size_t allowedTypeCount,
- const VkStructureType *allowedTypes) {
- bool skipCall = false;
+static bool validate_struct_pnext(debug_report_data *report_data, const char *api_name, const char *parameter_name,
+ const char *allowed_struct_names, const void *next, size_t allowed_type_count,
+ const VkStructureType *allowed_types, uint32_t header_version) {
+ bool skip_call = false;
+ const char disclaimer[] = "This warning is based on the Valid Usage documentation for version %d of the Vulkan header. It "
+ "is possible that you are using a struct from a private extension or an extension that was added "
+ "to a later version of the Vulkan header, in which case your use of %s is perfectly valid but "
+ "is not guaranteed to work correctly with validation enabled";
if (next != NULL) {
- if (allowedTypeCount == 0) {
- skipCall |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
- INVALID_STRUCT_PNEXT, LayerName, "%s: value of %s must be NULL", apiName, parameterName);
+ if (allowed_type_count == 0) {
+ std::string message = "%s: value of %s must be NULL. ";
+ message += disclaimer;
+ skip_call |=
+ log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
+ INVALID_STRUCT_PNEXT, LayerName, message.c_str(), api_name, parameter_name, header_version, parameter_name);
} else {
- const VkStructureType *start = allowedTypes;
- const VkStructureType *end = allowedTypes + allowedTypeCount;
+ const VkStructureType *start = allowed_types;
+ const VkStructureType *end = allowed_types + allowed_type_count;
const GenericHeader *current = reinterpret_cast<const GenericHeader *>(next);
while (current != NULL) {
if (std::find(start, end, current->sType) == end) {
- std::string typeName = string_VkStructureType(current->sType);
+ std::string type_name = string_VkStructureType(current->sType);
- if (typeName == UnsupportedStructureTypeString) {
- skipCall |= log_msg(
- report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
- INVALID_STRUCT_PNEXT, LayerName,
- "%s: %s chain includes a structure with unexpected VkStructureType (%d); Allowed structures are [%s]",
- apiName, parameterName, current->sType, allowedStructNames);
+ if (type_name == UnsupportedStructureTypeString) {
+ std::string message = "%s: %s chain includes a structure with unexpected VkStructureType (%d); Allowed "
+ "structures are [%s]. ";
+ message += disclaimer;
+ skip_call |= log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT,
+ 0, __LINE__, INVALID_STRUCT_PNEXT, LayerName, message.c_str(), api_name,
+ parameter_name, current->sType, allowed_struct_names, header_version, parameter_name);
} else {
- skipCall |= log_msg(
- report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
- INVALID_STRUCT_PNEXT, LayerName,
- "%s: %s chain includes a structure with unexpected VkStructureType %s; Allowed structures are [%s]",
- apiName, parameterName, typeName.c_str(), allowedStructNames);
+ std::string message =
+ "%s: %s chain includes a structure with unexpected VkStructureType %s; Allowed structures are [%s]. ";
+ message += disclaimer;
+ skip_call |=
+ log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0,
+ __LINE__, INVALID_STRUCT_PNEXT, LayerName, message.c_str(), api_name, parameter_name,
+ type_name.c_str(), allowed_struct_names, header_version, parameter_name);
}
}
@@ -488,7 +499,7 @@
}
}
- return skipCall;
+ return skip_call;
}
/**