diff options
| author | Dustin Graves <dustin@lunarg.com> | 2016-04-28 17:58:59 -0600 |
|---|---|---|
| committer | Dustin Graves <dustin@lunarg.com> | 2016-04-28 18:10:08 -0600 |
| commit | 69d0d7f5fcfca65fc27a185e6376d7b925afcb85 (patch) | |
| tree | 36d126b94950e33d377377a528b3c6daef38af5d /layers/parameter_validation_utils.h | |
| parent | d33465e2c8a578a4e1bbd15e76d5e0f674aa7364 (diff) | |
| download | usermoji-69d0d7f5fcfca65fc27a185e6376d7b925afcb85.tar.xz | |
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
Diffstat (limited to 'layers/parameter_validation_utils.h')
| -rw-r--r-- | layers/parameter_validation_utils.h | 71 |
1 files changed, 37 insertions, 34 deletions
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 <algorithm> #include <cstdlib> #include <string> -#include <type_traits> #include "vulkan/vulkan.h" #include "vk_enum_string_helper.h" @@ -64,31 +63,6 @@ template <> bool is_extension_added_token(VkSamplerAddressMode value) { } /** -* 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 <typename T> -bool validate_reserved(debug_report_data *report_data, const char *api_name, const char *parameter_name, T value) { - static_assert(std::is_integral<T>::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. * * Verify that a required pointer is not NULL. @@ -567,6 +541,30 @@ static bool validate_ranged_enum_array(debug_report_data *report_data, const cha } /** +* 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. * * Generate a warning if a value with a VkFlags derived type does not contain valid flag bits @@ -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 <typename T> -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 <typename T> -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", |
