vulkan: return default string for undefined enum

Instead of a unreachable.

This would avoid an assert on debug builds that uses vkfoo_to_str to
print structure types. This will become more common as some tests will
start to use VK_STRUCTURE_TYPE_MAX_ENUM to mark structures from
unsupported extensions more often.

v2 (Jason):
   * Include enum name on the default message
   * Handle MAX_ENUM as a special case

v3 (Jason):
   * vk_ObjectType_to_ObjectName don't need to use ${enum.name}

Reviewed-by: Jason Ekstrand <jason@jlekstrand.net
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14525>
This commit is contained in:
Alejandro Piñeiro 2022-01-12 23:01:46 +01:00 committed by Marge Bot
parent fbe4d7ccf4
commit 821c66e50c
1 changed files with 15 additions and 2 deletions

View File

@ -77,8 +77,9 @@ C_TEMPLATE = Template(textwrap.dedent(u"""\
case ${v}:
return "${enum.values[v]}";
% endfor
case ${enum.max_enum_name}: return "${enum.max_enum_name}";
default:
unreachable("Undefined enum value.");
return "Unknown ${enum.name} value.";
}
}
@ -115,7 +116,7 @@ C_TEMPLATE = Template(textwrap.dedent(u"""\
return "${object_types[0].enum_to_name[object_type]}";
% endfor
default:
unreachable("Undefined enum value.");
return "Unknown VkObjectType value.";
}
}
"""))
@ -245,12 +246,24 @@ class VkExtension(object):
def CamelCase_to_SHOUT_CASE(s):
return (s[:1] + re.sub(r'(?<![A-Z])([A-Z])', r'_\1', s[1:])).upper()
def compute_max_enum_name(s):
max_enum_name = CamelCase_to_SHOUT_CASE(s)
last_prefix = max_enum_name.rsplit('_', 1)[-1]
# Those special prefixes need to be always at the end
if last_prefix in ['AMD', 'EXT', 'INTEL', 'KHR', 'NV'] :
max_enum_name = "_".join(max_enum_name.split('_')[:-1])
max_enum_name = max_enum_name + "_MAX_ENUM_" + last_prefix
else:
max_enum_name = max_enum_name + "_MAX_ENUM"
return max_enum_name
class VkEnum(object):
"""Simple struct-like class representing a single Vulkan Enum."""
def __init__(self, name, bitwidth=32, values=None):
self.name = name
self.max_enum_name = compute_max_enum_name(name)
self.bitwidth = bitwidth
self.extension = None
# Maps numbers to names