From 69d0d7f5fcfca65fc27a185e6376d7b925afcb85 Mon Sep 17 00:00:00 2001 From: Dustin Graves Date: Thu, 28 Apr 2016 17:58:59 -0600 Subject: layers: Add 0 check for VkFlags array elements - Add parameter validation for the case where the elements in an array of VkFlags values must not be 0 - Replace the template parameter in the VkFlags validation functions with the VkFlags base type. Change-Id: Ie85d4d048b21e73409ff817425a1db64570e1b2f --- layers/parameter_validation_utils.h | 71 +++++++++++++++++++------------------ 1 file changed, 37 insertions(+), 34 deletions(-) (limited to 'layers/parameter_validation_utils.h') diff --git a/layers/parameter_validation_utils.h b/layers/parameter_validation_utils.h index 5a9ff503..d0b43823 100644 --- a/layers/parameter_validation_utils.h +++ b/layers/parameter_validation_utils.h @@ -24,7 +24,6 @@ #include #include #include -#include #include "vulkan/vulkan.h" #include "vk_enum_string_helper.h" @@ -63,31 +62,6 @@ template <> bool is_extension_added_token(VkSamplerAddressMode value) { return (result || (value == VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE)); } -/** -* Verify that a reserved value is zero. -* -* Verify that the specified value is zero. Primarily intended to check VkFlags values that are reserved for -* future use. -* -* @param report_data debug_report_data object for routing validation messages. -* @param api_name Name of API call being validated. -* @param parameter_name Name of parameter being validated. -* @param value Value to validate. -* @return Boolean value indicating that the call should be skipped. -*/ -template -bool validate_reserved(debug_report_data *report_data, const char *api_name, const char *parameter_name, T value) { - static_assert(std::is_integral::value, "validate_reserved is only designed to process integer types"); - bool skip_call = false; - - if (value != 0) { - skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, - ParameterValidationName, "%s: parameter %s must be 0", api_name, parameter_name); - } - - return skip_call; -} - /** * Validate a required pointer. * @@ -566,6 +540,30 @@ static bool validate_ranged_enum_array(debug_report_data *report_data, const cha return skipCall; } +/** +* Verify that a reserved VkFlags value is zero. +* +* Verify that the specified value is zero, to check VkFlags values that are reserved for +* future use. +* +* @param report_data debug_report_data object for routing validation messages. +* @param api_name Name of API call being validated. +* @param parameter_name Name of parameter being validated. +* @param value Value to validate. +* @return Boolean value indicating that the call should be skipped. +*/ +static bool validate_reserved_flags(debug_report_data *report_data, const char *api_name, const char *parameter_name, + VkFlags value) { + bool skip_call = false; + + if (value != 0) { + skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, + ParameterValidationName, "%s: parameter %s must be 0", api_name, parameter_name); + } + + return skip_call; +} + /** * Validate a Vulkan bitmask value. * @@ -581,9 +579,8 @@ static bool validate_ranged_enum_array(debug_report_data *report_data, const cha * @param flags_required The 'value' parameter may not be 0 when true. * @return Boolean value indicating that the call should be skipped. */ -template -bool validate_flags(debug_report_data *report_data, const char *api_name, const char *parameter_name, const char *flag_bits_name, - T all_flags, T value, bool flags_required) { +static bool validate_flags(debug_report_data *report_data, const char *api_name, const char *parameter_name, + const char *flag_bits_name, VkFlags all_flags, VkFlags value, bool flags_required) { bool skip_call = false; if (value == 0) { @@ -618,10 +615,9 @@ bool validate_flags(debug_report_data *report_data, const char *api_name, const * @param array_required The 'array' parameter may not be NULL when true. * @return Boolean value indicating that the call should be skipped. */ -template -bool validate_flags_array(debug_report_data *report_data, const char *api_name, const char *count_name, const char *array_name, - const char *flag_bits_name, T all_flags, uint32_t count, const T *array, bool count_required, - bool array_required) { +static bool validate_flags_array(debug_report_data *report_data, const char *api_name, const char *count_name, + const char *array_name, const char *flag_bits_name, VkFlags all_flags, uint32_t count, + const VkFlags *array, bool count_required, bool array_required) { bool skip_call = false; if ((count == 0) || (array == NULL)) { @@ -629,7 +625,14 @@ bool validate_flags_array(debug_report_data *report_data, const char *api_name, } else { // Verify that all VkFlags values in the array for (uint32_t i = 0; i < count; ++i) { - if ((array[i] & (~all_flags)) != 0) { + if (array[i] == 0) { + // Current XML registry logic for validity generation uses the array parameter's optional tag to determine if + // elements in the array are allowed be 0 + if (array_required) { + skip_call |= log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, + 1, ParameterValidationName, "%s: value of %s[%d] must not be 0", api_name, array_name, i); + } + } else if ((array[i] & (~all_flags)) != 0) { skip_call |= log_msg(report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, 1, ParameterValidationName, "%s: value of %s[%d] contains flag bits that are not recognized members of %s", -- cgit v1.2.3