Mesa (main): vulkan: return default string for undefined enum

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Jan 14 10:56:32 UTC 2022


Module: Mesa
Branch: main
Commit: 821c66e50cdaf89ca3e0282967fa17c6fd666308
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=821c66e50cdaf89ca3e0282967fa17c6fd666308

Author: Alejandro Piñeiro <apinheiro at igalia.com>
Date:   Wed Jan 12 23:01:46 2022 +0100

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 at jlekstrand.net
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14525>

---

 src/vulkan/util/gen_enum_to_str.py | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/src/vulkan/util/gen_enum_to_str.py b/src/vulkan/util/gen_enum_to_str.py
index 1f05aa34f93..1c3ae327a71 100644
--- a/src/vulkan/util/gen_enum_to_str.py
+++ b/src/vulkan/util/gen_enum_to_str.py
@@ -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



More information about the mesa-commit mailing list