layers: PV code gen for FlagBits enum parameters
Extend validate_flags to work in instances where a single Vk*FlagBits
enum value is valid instead of a bitmask with multiple values.
Change-Id: Ib8d34551923f7ecb2549500dfde674fa1094ac8b
diff --git a/layers/parameter_validation_utils.h b/layers/parameter_validation_utils.h
index a284cf9..d5497cb 100644
--- a/layers/parameter_validation_utils.h
+++ b/layers/parameter_validation_utils.h
@@ -24,6 +24,7 @@
#include <algorithm>
#include <cstdlib>
#include <string>
+#include <bitset>
#include "vulkan/vulkan.h"
#include "vk_enum_string_helper.h"
@@ -692,10 +693,11 @@
* @param all_flags A bit mask combining all valid flag bits for the VkFlags type being validated.
* @param value VkFlags value to validate.
* @param flags_required The 'value' parameter may not be 0 when true.
+* @param singleFlag The 'value' parameter may not contain more than one bit from all_flags.
* @return Boolean value indicating that the call should be skipped.
*/
static bool validate_flags(debug_report_data *report_data, const char *api_name, const ParameterName ¶meter_name,
- const char *flag_bits_name, VkFlags all_flags, VkFlags value, bool flags_required) {
+ const char *flag_bits_name, VkFlags all_flags, VkFlags value, bool flags_required, bool singleFlag) {
bool skip_call = false;
if (value == 0) {
@@ -709,6 +711,11 @@
log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
UNRECOGNIZED_VALUE, LayerName, "%s: value of %s contains flag bits that are not recognized members of %s",
api_name, parameter_name.get_name().c_str(), flag_bits_name);
+ } else if (singleFlag && (std::bitset<sizeof(VkFlags) * 8>(value).count() > 1)) {
+ skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__,
+ UNRECOGNIZED_VALUE, LayerName,
+ "%s: value of %s contains multiple members of %s when only a single value is allowed", api_name,
+ parameter_name.get_name().c_str(), flag_bits_name);
}
return skip_call;