Snap for 8952093 from 7b025b07724c0eb736ffe57de4da310d0dfd921d to sdk-release

Change-Id: I1142ab205e674e91a1b5a52cb312d38ab20f4a89
diff --git a/registry/vulkan/scripts/cereal/__init__.py b/registry/vulkan/scripts/cereal/__init__.py
index 861cee3..e4710d2 100644
--- a/registry/vulkan/scripts/cereal/__init__.py
+++ b/registry/vulkan/scripts/cereal/__init__.py
@@ -15,3 +15,4 @@
 from .unbox import *
 from .decodersnapshot import *
 from .subdecode import *
+from .api_log_decoder import *
\ No newline at end of file
diff --git a/registry/vulkan/scripts/cereal/api_log_decoder.py b/registry/vulkan/scripts/cereal/api_log_decoder.py
new file mode 100644
index 0000000..0e6aa64
--- /dev/null
+++ b/registry/vulkan/scripts/cereal/api_log_decoder.py
@@ -0,0 +1,340 @@
+import os
+from typing import List, Set, Dict, Optional
+
+from . import VulkanType, VulkanCompoundType
+from .wrapperdefs import VulkanWrapperGenerator
+
+
+class ApiLogDecoder(VulkanWrapperGenerator):
+    """
+    This class generates decoding logic for the graphics API logs captured by
+    [GfxApiLogger](http://source/play-internal/battlestar/aosp/device/generic/vulkan-cereal/base/GfxApiLogger.h)
+
+    This allows developers to see a pretty-printed version of the API log data when using
+    print_gfx_logs.py
+    """
+
+    # List of Vulkan APIs that we will generate decoding logic for
+    generated_apis = [
+        "vkAcquireImageANDROID",
+        "vkAllocateMemory",
+        "vkBeginCommandBufferAsyncGOOGLE",
+        "vkBindBufferMemory",
+        "vkBindImageMemory",
+        "vkCmdBeginRenderPass",
+        "vkCmdBindDescriptorSets",
+        "vkCmdBindIndexBuffer",
+        "vkCmdBindPipeline",
+        "vkCmdBindVertexBuffers",
+        "vkCmdClearAttachments",
+        "vkCmdClearColorImage",
+        "vkCmdCopyBufferToImage",
+        "vkCmdCopyImageToBuffer",
+        "vkCmdDraw",
+        "vkCmdDrawIndexed",
+        "vkCmdEndRenderPass",
+        "vkCmdPipelineBarrier",
+        "vkCmdSetScissor",
+        "vkCmdSetViewport",
+        "vkCollectDescriptorPoolIdsGOOGLE",
+        "vkCreateBufferWithRequirementsGOOGLE",
+        "vkCreateDescriptorPool",
+        "vkCreateDescriptorSetLayout",
+        "vkCreateFence",
+        "vkCreateFramebuffer",
+        "vkCreateGraphicsPipelines",
+        "vkCreateImageView",
+        "vkCreateImageWithRequirementsGOOGLE",
+        "vkCreatePipelineCache",
+        "vkCreateRenderPass",
+        "vkCreateSampler",
+        "vkCreateSemaphore",
+        "vkCreateShaderModule",
+        "vkDestroyBuffer",
+        "vkDestroyCommandPool",
+        "vkDestroyDescriptorPool",
+        "vkDestroyDescriptorSetLayout",
+        "vkDestroyDevice",
+        "vkDestroyFence",
+        "vkDestroyFramebuffer",
+        "vkDestroyImage",
+        "vkDestroyImageView",
+        "vkDestroyInstance",
+        "vkDestroyPipeline",
+        "vkDestroyPipelineCache",
+        "vkDestroyPipelineLayout",
+        "vkDestroyRenderPass",
+        "vkDestroySemaphore",
+        "vkDestroyShaderModule",
+        "vkEndCommandBufferAsyncGOOGLE",
+        "vkFreeCommandBuffers",
+        "vkFreeMemory",
+        "vkFreeMemorySyncGOOGLE",
+        "vkGetFenceStatus",
+        "vkGetMemoryHostAddressInfoGOOGLE",
+        "vkGetPhysicalDeviceFormatProperties",
+        "vkGetPhysicalDeviceProperties2KHR",
+        "vkGetPipelineCacheData",
+        "vkGetSwapchainGrallocUsageANDROID",
+        "vkQueueCommitDescriptorSetUpdatesGOOGLE",
+        "vkQueueFlushCommandsGOOGLE",
+        "vkQueueSignalReleaseImageANDROIDAsyncGOOGLE",
+        "vkQueueSubmitAsyncGOOGLE",
+        "vkQueueWaitIdle",
+        "vkResetFences",
+        "vkWaitForFences",
+    ]
+
+    def __init__(self, module, typeInfo):
+        VulkanWrapperGenerator.__init__(self, module, typeInfo)
+        self.typeInfo = typeInfo
+
+        # Output file
+        self.out = open(
+            os.path.join(self.repo_root(), "scripts", "print_gfx_logs", "vulkan_printer.py"), "w")
+
+        # Set of Vulkan structs that we need to write decoding logic for
+        self.structs: Set[str] = set()
+
+        # Maps enum group names to the list of enums in the group, for all enum groups in the spec
+        # E.g.:  "VkResult": ["VK_SUCCESS", "VK_NOT_READY", "VK_TIMEOUT", etc...]
+        self.all_enums: Dict[str, List[str]] = {}
+
+        # Set of Vulkan enums that we need to write decoding logic for
+        self.needed_enums: Set[str] = {"VkStructureType"}
+
+    def repo_root(self):
+        """Returns the path to the root of gfxstream's git repo"""
+        return os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', '..', '..'))
+
+    def onBegin(self):
+        self.out.write("""
+#####################################################################################################
+# Pretty-printer functions for Vulkan data structures
+# THIS FILE IS AUTO-GENERATED - DO NOT EDIT
+#
+# To re-generate this file, run generate-vulkan-sources.sh
+#####################################################################################################
+
+""".lstrip())
+
+    def onGenGroup(self, groupinfo, groupName, alias=None):
+        """Called for each enum group in the spec"""
+        for enum in groupinfo.elem.findall("enum"):
+            self.all_enums[groupName] = self.all_enums.get(groupName, []) + [enum.get('name')]
+
+    def onEnd(self):
+        for api_name in sorted(self.generated_apis):
+            self.process_api(api_name)
+        self.process_structs()
+        self.process_enums()
+
+    def process_api(self, api_name):
+        """Main entry point to generate decoding logic for each Vulkan API"""
+        api = self.typeInfo.apis[api_name]
+        self.out.write('def OP_{}(printer, indent: int):\n'.format(api_name))
+
+        # Decode the sequence number. All commands have sequence numbers, except those handled
+        # by VkSubdecoder.cpp. The logic here is a bit of a hack since it's based on the command
+        # name. Ideally, we would detect whether a particular command is part of a subdecode block
+        # in the decoding script.
+        if not api_name.startswith("vkCmd") and api_name != "vkBeginCommandBufferAsyncGOOGLE":
+            self.out.write('    printer.write_int("seqno: ", 4, indent)\n')
+
+        for param in api.parameters:
+            # Add any structs that this API uses to the list of structs to write decoding logic for
+            if self.typeInfo.isCompoundType(param.typeName):
+                self.structs.add(param.typeName)
+
+            # Don't try to print the pData field of vkQueueFlushCommandsGOOGLE, those are the
+            # commands processed as part of the subdecode pass
+            if api.name == "vkQueueFlushCommandsGOOGLE" and param.paramName == "pData":
+                continue
+
+            # Write out decoding logic for that parameter
+            self.process_type(param)
+
+        # Finally, add a return statement. This is needed in case the API has no parameters.
+        self.out.write('    return\n\n')
+
+    def process_structs(self):
+        """Writes decoding logic for all the structs that we use"""
+
+        # self.structs now contains all the structs used directly by the Vulkan APIs we use.
+        # Recursively expand this set to add all the structs used by these structs.
+        copy = self.structs.copy()
+        self.structs.clear()
+        for struct_name in copy:
+            self.expand_needed_structs(struct_name)
+
+        # Now we have the full list of structs that we need to write decoding logic for.
+        # Write a decoder for each of them
+        for struct_name in sorted(self.structs):
+            struct = self.typeInfo.structs[struct_name]
+            self.out.write('def struct_{}(printer, indent: int):\n'.format(struct_name))
+            for member in self.get_members(struct):
+                self.process_type(member)
+            self.out.write('\n')
+
+    def expand_needed_structs(self, struct_name: str):
+        """
+        Recursively adds all the structs used by a given struct to the list of structs to process
+        """
+        if struct_name in self.structs:
+            return
+        self.structs.add(struct_name)
+        struct = self.typeInfo.structs[struct_name]
+        for member in self.get_members(struct):
+            if self.typeInfo.isCompoundType(member.typeName):
+                self.expand_needed_structs(member.typeName)
+
+    def get_members(self, struct: VulkanCompoundType):
+        """
+        Returns the members of a struct/union that we need to process.
+        For structs, returns the list of all members
+        For unions, returns a list with just the first member.
+        """
+        return struct.members[0:1] if struct.isUnion else struct.members
+
+    def process_type(self, type: VulkanType):
+        """
+        Writes decoding logic for a single Vulkan type. This could be the parameter in a Vulkan API,
+        or a struct member.
+        """
+        if type.typeName == "VkStructureType":
+            self.out.write('    printer.write_stype_and_pnext("{}", indent)\n'
+                           .format(type.parent.structEnumExpr))
+            return
+
+        if type.isNextPointer():
+            return
+
+        if type.paramName == "commandBuffer":
+            if type.parent.name != "vkQueueFlushCommandsGOOGLE":
+                return
+
+        # Enums
+        if type.isEnum(self.typeInfo):
+            self.needed_enums.add(type.typeName)
+            self.out.write('    printer.write_enum("{}", {}, indent)\n'.format(
+                type.paramName, type.typeName))
+            return
+
+        # Bitmasks
+        if type.isBitmask(self.typeInfo):
+            enum_type = self.typeInfo.bitmasks.get(type.typeName)
+            if enum_type:
+                self.needed_enums.add(enum_type)
+                self.out.write('    printer.write_flags("{}", {}, indent)\n'.format(
+                    type.paramName, enum_type))
+                return
+            # else, fall through and let the primitive type logic handle it
+
+        # Structs or unions
+        if self.typeInfo.isCompoundType(type.typeName):
+            self.out.write(
+                '    printer.write_struct("{name}", struct_{type}, {optional}, {count}, indent)\n'
+                    .format(name=type.paramName,
+                            type=type.typeName,
+                            optional=type.isOptionalPointer(),
+                            count=self.get_length_expression(type)))
+            return
+
+        # Null-terminated strings
+        if type.isString():
+            self.out.write('    printer.write_string("{}", None, indent)\n'.format(type.paramName))
+            return
+
+        # Arrays of primitive types
+        if type.staticArrExpr and type.primitiveEncodingSize and type.primitiveEncodingSize <= 8:
+            # Array sizes are specified either as a number, or as an enum value
+            array_size = int(type.staticArrExpr) if type.staticArrExpr.isdigit() \
+                else self.typeInfo.enumValues.get(type.staticArrExpr)
+            assert array_size is not None, type.staticArrExpr
+
+            if type.typeName == "char":
+                self.out.write('    printer.write_string("{}", {}, indent)\n'
+                               .format(type.paramName, array_size))
+            elif type.typeName == "float":
+                self.out.write(
+                    '    printer.write_float("{}", indent, count={})\n'
+                        .format(type.paramName, array_size))
+            else:
+                self.out.write(
+                    '    printer.write_int("{name}", {int_size}, indent, signed={signed}, count={array_size})\n'
+                        .format(name=type.paramName,
+                                array_size=array_size,
+                                int_size=type.primitiveEncodingSize,
+                                signed=type.isSigned()))
+            return
+
+        # Pointers
+        if type.pointerIndirectionLevels > 0:
+            # Assume that all uint32* are always serialized directly rather than passed by pointers.
+            # This is probably not always true (e.g. out params) - fix this as needed.
+            size = 4 if type.primitiveEncodingSize == 4 else 8
+            self.out.write(
+                '    {name} = printer.write_int("{name}", {size}, indent, optional={opt}, count={count}, big_endian={big_endian})\n'
+                    .format(name=type.paramName,
+                            size=size,
+                            opt=type.isOptionalPointer(),
+                            count=self.get_length_expression(type),
+                            big_endian=self.using_big_endian(type)))
+            return
+
+        # Primitive types (ints, floats)
+        if type.isSimpleValueType(self.typeInfo) and type.primitiveEncodingSize:
+            if type.typeName == "float":
+                self.out.write(
+                    '    printer.write_float("{name}", indent)\n'.format(name=type.paramName))
+            else:
+                self.out.write(
+                    '    {name} = printer.write_int("{name}", {size}, indent, signed={signed}, big_endian={big_endian})\n'.format(
+                        name=type.paramName,
+                        size=type.primitiveEncodingSize,
+                        signed=type.isSigned(),
+                        big_endian=self.using_big_endian(type))
+                )
+            return
+
+        raise NotImplementedError(
+            "No decoding logic for {} {}".format(type.typeName, type.paramName))
+
+    def using_big_endian(self, type: VulkanType):
+        """For some reason gfxstream serializes some types as big endian"""
+        return type.typeName == "size_t"
+
+    def get_length_expression(self, type: VulkanType) -> Optional[str]:
+        """Returns the length expression for a given type"""
+        if type.lenExpr is None:
+            return None
+
+        if type.lenExpr.isalpha():
+            return type.lenExpr
+
+        # There are a couple of instances in the spec where we use a math expression to express the
+        # length (e.g. VkPipelineMultisampleStateCreateInfo). CodeGen().generalLengthAccess() has
+        # logic o parse these expressions correctly, but for now,we just use a simple lookup table.
+        known_expressions = {
+            r"latexmath:[\lceil{\mathit{rasterizationSamples} \over 32}\rceil]":
+                "int(rasterizationSamples / 32)",
+            r"latexmath:[\textrm{codeSize} \over 4]": "int(codeSize / 4)",
+            r"null-terminated": None
+        }
+        if type.lenExpr in known_expressions:
+            return known_expressions[type.lenExpr]
+
+        raise NotImplementedError("Unknown length expression: " + type.lenExpr)
+
+    def process_enums(self):
+        """
+        For each Vulkan enum that we use, write out a python dictionary mapping the enum values back
+        to the enum name as a string
+        """
+        for enum_name in sorted(self.needed_enums):
+            self.out.write('{} = {{\n'.format(enum_name))
+            for identifier in self.all_enums[enum_name]:
+                value = self.typeInfo.enumValues.get(identifier)
+                if value is not None and isinstance(value, int):
+                    self.out.write('    {}: "{}",\n'.format(value, identifier))
+            self.out.write('}\n\n')
diff --git a/registry/vulkan/scripts/cereal/common/codegen.py b/registry/vulkan/scripts/cereal/common/codegen.py
index b3d8d61..bb39231 100644
--- a/registry/vulkan/scripts/cereal/common/codegen.py
+++ b/registry/vulkan/scripts/cereal/common/codegen.py
@@ -16,6 +16,7 @@
 from .vulkantypes import VulkanType, VulkanTypeInfo, VulkanCompoundType, VulkanAPI
 from collections import OrderedDict
 from copy import copy
+from pathlib import Path, PurePosixPath
 
 import os
 import sys
@@ -53,10 +54,10 @@
     def getCMakeSrcEntry(self):
         if self.customAbsDir:
             return "\n" + self.basename + ".cpp "
-        dirName = self.directory
-        baseName = self.basename
-        joined = os.path.join(dirName, baseName)
-        return "\n    " + joined + ".cpp "
+        dirName = Path(self.directory)
+        baseName = Path(self.basename)
+        joined = PurePosixPath(dirName / baseName)
+        return "\n    " + str(joined) + ".cpp "
 
     def begin(self, globalDir):
         if self.suppress:
@@ -577,7 +578,7 @@
     def generalLengthAccessGuard(self, vulkanType, parentVarName="parent"):
         return self.makeLengthAccess(vulkanType, parentVarName)[1]
 
-    def vkApiCall(self, api, customPrefix="", customParameters=None, retVarDecl=True, retVarAssign=True):
+    def vkApiCall(self, api, customPrefix="", globalStatePrefix="", customParameters=None, checkForDeviceLost=False):
         callLhs = None
 
         retTypeName = api.getRetTypeExpr()
@@ -585,10 +586,8 @@
 
         if retTypeName != "void":
             retVar = api.getRetVarExpr()
-            if retVarDecl:
-                self.stmt("%s %s = (%s)0" % (retTypeName, retVar, retTypeName))
-            if retVarAssign:
-                callLhs = retVar
+            self.stmt("%s %s = (%s)0" % (retTypeName, retVar, retTypeName))
+            callLhs = retVar
 
         if customParameters is None:
             self.funcCall(
@@ -597,6 +596,9 @@
             self.funcCall(
                 callLhs, customPrefix + api.name, customParameters)
 
+        if retTypeName == "VkResult" and checkForDeviceLost:
+            self.stmt("if ((%s) == VK_ERROR_DEVICE_LOST) %sDeviceLost()" % (callLhs, globalStatePrefix))
+
         return (retTypeName, retVar)
 
     def makeCheckVkSuccess(self, expr):
@@ -844,9 +846,9 @@
 # VulkanAPIWrapper objects to make it easier to generate the code.
 class VulkanWrapperGenerator(object):
 
-    def __init__(self, module, typeInfo):
-        self.module = module
-        self.typeInfo = typeInfo
+    def __init__(self, module: Module, typeInfo: VulkanTypeInfo):
+        self.module: Module = module
+        self.typeInfo: VulkanTypeInfo = typeInfo
         self.extensionStructTypes = OrderedDict()
 
     def onBegin(self):
diff --git a/registry/vulkan/scripts/cereal/common/vulkantypes.py b/registry/vulkan/scripts/cereal/common/vulkantypes.py
index ee2a4e0..f91dddb 100644
--- a/registry/vulkan/scripts/cereal/common/vulkantypes.py
+++ b/registry/vulkan/scripts/cereal/common/vulkantypes.py
@@ -12,6 +12,8 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
+from typing import Dict, Optional, List, Set, Union
+from xml.etree.ElementTree import Element
 
 from generator import noneStr
 
@@ -87,6 +89,7 @@
     "VkDeviceMemory",
     "VkDescriptorSet",
     "VkCommandBuffer",
+    "VkRenderPass",
 ]
 
 HANDLE_TYPES = list(sorted(list(set(DISPATCHABLE_HANDLE_TYPES +
@@ -124,6 +127,12 @@
             HANDLE_INFO[h] = \
                 HandleInfo("VkCommandBuffer", "vkAllocateCommandBuffers",
                            "vkFreeCommandBuffers")
+        if h == "VkRenderPass":
+            HANDLE_INFO[h] = \
+                HandleInfo(
+                    "VkRenderPass",
+                    ["vkCreateRenderPass", "vkCreateRenderPass2", "vkCreateRenderPass2KHR"],
+                    "vkDestroyRenderPass")
     else:
         HANDLE_INFO[h] = \
             HandleInfo(h, "vkCreate" + h[2:], "vkDestroy" + h[2:])
@@ -184,16 +193,16 @@
 class VulkanType(object):
 
     def __init__(self):
-        self.parent = None
-        self.typeName = ""
+        self.parent: Optional[VulkanType] = None
+        self.typeName: str = ""
 
         self.isTransformed = False
 
-        self.paramName = None
+        self.paramName: Optional[str] = None
 
-        self.lenExpr = None
-        self.isOptional = False
-        self.optionalStr = None
+        self.lenExpr: Optional[str] = None  # Value of the `len` attribute in the spec
+        self.isOptional: bool = False
+        self.optionalStr: Optional[str] = None  # Value of the `optional` attribute in the spec
 
         self.isConst = False
 
@@ -240,27 +249,34 @@
         # All other annotations
         self.attribs = {}
 
+        self.nonDispatchableHandleCreate = False
+        self.nonDispatchableHandleDestroy = False
+        self.dispatchHandle = False
+        self.dispatchableHandleCreate = False
+        self.dispatchableHandleDestroy = False
+
+
     def __str__(self,):
         return ("(vulkantype %s %s paramName %s len %s optional? %s "
-                "staticArrExpr %s %s)") % (
+                "staticArrExpr %s)") % (
             self.typeName + ("*" * self.pointerIndirectionLevels) +
             ("ptr2constptr" if self.isPointerToConstPointer else ""), "const"
             if self.isConst else "nonconst", self.paramName, self.lenExpr,
-            self.isOptional, self.staticArrExpr, self.staticArrCount)
+            self.isOptional, self.staticArrExpr)
 
-    def isString(self,):
+    def isString(self):
         return self.pointerIndirectionLevels == 1 and (self.typeName == "char")
 
-    def isArrayOfStrings(self,):
+    def isArrayOfStrings(self):
         return self.isPointerToConstPointer and (self.typeName == "char")
 
-    def primEncodingSize(self,):
+    def primEncodingSize(self):
         return self.primitiveEncodingSize
 
     # Utility functions to make codegen life easier.
     # This method derives the correct "count" expression if possible.
     # Otherwise, returns None or "null-terminated" if a string.
-    def getLengthExpression(self,):
+    def getLengthExpression(self):
         if self.staticArrExpr != "":
             return self.staticArrExpr
         if self.lenExpr:
@@ -268,7 +284,7 @@
         return None
 
     # Can we just pass this to functions expecting T*
-    def accessibleAsPointer(self,):
+    def accessibleAsPointer(self):
         if self.staticArrExpr != "":
             return True
         if self.pointerIndirectionLevels > 0:
@@ -322,9 +338,16 @@
         return res
 
     def isNextPointer(self):
-        if self.paramName == "pNext":
-            return True
-        return False
+        return self.paramName == "pNext"
+
+    def isSigned(self):
+        return self.typeName in ["int", "int8_t", "int16_t", "int32_t", "int64_t"]
+
+    def isEnum(self, typeInfo):
+        return typeInfo.categoryOf(self.typeName) == "enum"
+
+    def isBitmask(self, typeInfo):
+        return typeInfo.categoryOf(self.typeName) == "enum"
 
     # Only deals with 'core' handle types here.
     def isDispatchableHandleType(self):
@@ -401,6 +424,11 @@
             return '%d'
 
         return None
+    def isOptionalPointer(self) -> bool:
+        return self.isOptional and \
+               self.pointerIndirectionLevels > 0 and \
+               (not self.isNextPointer())
+
 
 # Is an S-expression w/ the following spec:
 # From https://gist.github.com/pib/240957
@@ -507,7 +535,8 @@
     print("parseLetBodyExpr: parsed %s" % res)
     return res
 
-def makeVulkanTypeFromXMLTag(typeInfo, tag):
+
+def makeVulkanTypeFromXMLTag(typeInfo, tag: Element) -> VulkanType:
     res = VulkanType()
 
     # Process the length expression
@@ -542,7 +571,6 @@
         res.isConst = True
 
     # Calculate type and pointer info
-
     for elem in tag:
         if elem.tag == "name":
             res.paramName = elem.text
@@ -585,8 +613,7 @@
     if res.paramName == "pNext":
         res.isOptional = True
 
-    res.primitiveEncodingSize = \
-        typeInfo.getPrimitiveEncodingSize(res.typeName)
+    res.primitiveEncodingSize = typeInfo.getPrimitiveEncodingSize(res.typeName)
 
     # Annotations: Environment binds
     if tag.attrib.get("binds") is not None:
@@ -598,9 +625,8 @@
     for k in DEVICE_MEMORY_INFO_KEYS:
         if tag.attrib.get(k) is not None:
             res.deviceMemoryAttrib = k
-            res.deviceMemoryVal = \
-                tag.attrib.get(k)
-            break;
+            res.deviceMemoryVal = tag.attrib.get(k)
+            break
 
     # Annotations: Filters
     if tag.attrib.get("filterVar") is not None:
@@ -663,9 +689,7 @@
 
         if a in DEVICE_MEMORY_INFO_KEYS:
             use = True
-            deviceMemoryInfoById[
-                p.deviceMemoryVal] = \
-                    DeviceMemoryInfoParameterIndices(
+            deviceMemoryInfoById[p.deviceMemoryVal] =  DeviceMemoryInfoParameterIndices(
                         None, None, None, None, None)
 
     for (i, p) in enumerate(parameters):
@@ -673,8 +697,7 @@
         if not a:
             continue
 
-        info = \
-            deviceMemoryInfoById[p.deviceMemoryVal]
+        info = deviceMemoryInfoById[p.deviceMemoryVal]
 
         if a == "devicememoryhandle":
             info.handle = i
@@ -695,24 +718,18 @@
 # Classes for describing aggregate types (unions, structs) and API calls.
 class VulkanCompoundType(object):
 
-    def __init__(self, name, members, isUnion=False, structEnumExpr=None, structExtendsExpr=None, feature=None, initialEnv={}, optional=None):
-        self.name = name
-        self.typeName = name
-        self.members = members
+    def __init__(self, name: str, members: List[VulkanType], isUnion=False, structEnumExpr=None, structExtendsExpr=None, feature=None, initialEnv={}, optional=None):
+        self.name: str = name
+        self.typeName: str = name
+        self.members: List[VulkanType] = members
         self.environment = initialEnv
-
         self.isUnion = isUnion
         self.structEnumExpr = structEnumExpr
         self.structExtendsExpr = structExtendsExpr
         self.feature = feature
-
-        self.deviceMemoryInfoParameterIndices = \
-            initDeviceMemoryInfoParameterIndices(self.members)
-
+        self.deviceMemoryInfoParameterIndices = initDeviceMemoryInfoParameterIndices(self.members)
         self.isTransformed = name in TRANSFORMED_TYPES
-
         self.copy = None
-
         self.optionalStr = optional
 
     def initCopies(self):
@@ -721,7 +738,7 @@
         for m in self.members:
             m.parent = self.copy
 
-    def getMember(self, memberName):
+    def getMember(self, memberName) -> Optional[VulkanType]:
         for m in self.members:
             if m.paramName == memberName:
                 return m
@@ -732,14 +749,13 @@
 
 class VulkanAPI(object):
 
-    def __init__(self, name, retType, parameters, origName=None):
-        self.name = name
+    def __init__(self, name: str, retType: VulkanType, parameters: list[VulkanType], origName=None):
+        self.name: str = name
         self.origName = name
-        self.retType = retType
-        self.parameters = parameters
+        self.retType: VulkanType = retType
+        self.parameters: List[VulkanType] = parameters
 
-        self.deviceMemoryInfoParameterIndices = \
-            initDeviceMemoryInfoParameterIndices(self.parameters)
+        self.deviceMemoryInfoParameterIndices = initDeviceMemoryInfoParameterIndices(self.parameters)
 
         self.copy = None
 
@@ -809,22 +825,30 @@
 # Parses everything about Vulkan types into a Python readable format.
 class VulkanTypeInfo(object):
 
-    def __init__(self,):
-        self.categories = set([])
+    def __init__(self, generator):
+        self.generator = generator
+        self.categories: Set[str] = set([])
 
         # Tracks what Vulkan type is part of what category.
-        self.typeCategories = {}
+        self.typeCategories: Dict[str, str] = {}
 
-        # Tracks the primitve encoding size for each type,
-        # if applicable.
-        self.encodingSizes = {}
+        # Tracks the primitive encoding size for each type, if applicable.
+        self.encodingSizes: Dict[str, Optional[int]] = {}
 
-        self.structs = {}
-        self.apis = {}
+        self.structs: Dict[str, VulkanCompoundType] = {}
+        self.apis: Dict[str, VulkanAPI] = {}
+
+        # Maps bitmask types to the enum type used for the flags
+        # E.g. "VkImageAspectFlags" -> "VkImageAspectFlagBits"
+        self.bitmasks: Dict[str, str] = {}
+
+        # Maps all enum names to their values.
+        # For aliases, the value is the name of the canonical enum
+        self.enumValues: Dict[str, Union[int, str]] = {}
 
         self.feature = None
 
-    def initType(self, name, category):
+    def initType(self, name: str, category: str):
         self.categories.add(category)
         self.typeCategories[name] = category
         self.encodingSizes[name] = self.setPrimitiveEncodingSize(name)
@@ -837,30 +861,31 @@
 
     # Queries relating to categories of Vulkan types.
     def isHandleType(self, name):
-        if name in self.typeCategories:
-            return self.typeCategories[name] == "handle"
-        return False
+        return self.typeCategories.get(name) == "handle"
 
-    def isCompoundType(self, name):
-        if name in self.typeCategories:
-            return self.typeCategories[name] in ["struct", "union"]
-        else:
-            return False
+    def isCompoundType(self, name: str):
+        return self.typeCategories.get(name) in ["struct", "union"]
 
     # Gets the best size in bytes
     # for encoding/decoding a particular Vulkan type.
     # If not applicable, returns None.
-    def setPrimitiveEncodingSize(self, name):
+    def setPrimitiveEncodingSize(self, name: str) -> Optional[int]:
         baseEncodingSizes = {
-            "void" : 8,
-            "char" : 1,
-            "float" : 4,
-            "uint8_t" : 1,
-            "uint16_t" : 2,
-            "uint32_t" : 4,
-            "uint64_t" : 8,
-            "size_t" : 8,
-            "ssize_t" : 8,
+            "void": 8,
+            "char": 1,
+            "float": 4,
+            "uint8_t": 1,
+            "uint16_t": 2,
+            "uint32_t": 4,
+            "uint64_t": 8,
+            "int": 4,
+            "int8_t": 1,
+            "int16_t": 2,
+            "int32_t": 4,
+            "int64_t": 8,
+            "size_t": 8,
+            "ssize_t": 8,
+            "VkBool32": 4,
         }
 
         if name in baseEncodingSizes:
@@ -868,19 +893,15 @@
 
         category = self.typeCategories[name]
 
-        if category in [None, "api", "bitmask", "include", "define", "struct", "union"]:
+        if category in [None, "api", "include", "define", "struct", "union"]:
             return None
 
-        # Must be 8---handles are pointers and basetype includes VkDeviceSize
-        # which is 8 bytes
+        # Handles are pointers so they must be 8 bytes. Basetype includes VkDeviceSize which is 8 bytes.
         if category in ["handle", "basetype", "funcpointer"]:
             return 8
 
-        # Most of the time, enums are only 4 bytes, but this is
-        # vague enough to be the source of a future headache, and
-        # it's easy to just stream 8 bytes there anyway.
-        if category in ["enum"]:
-            return 8
+        if category in ["enum", "bitmask"]:
+            return 4
 
     def isNonAbiPortableType(self, typeName):
         if typeName in EXPLICITLY_ABI_PORTABLE_TYPES:
@@ -905,9 +926,12 @@
         if category in ["struct", "union"]:
             self.onGenStruct(typeinfo, name, alias)
 
+        if category == "bitmask":
+            self.bitmasks[name] = typeinfo.elem.get("requires")
+
     def onGenStruct(self, typeinfo, typeName, alias):
         if not alias:
-            members = []
+            members: List[VulkanType] = []
 
             structExtendsExpr = typeinfo.elem.get("structextends")
 
@@ -941,19 +965,18 @@
             for member in typeinfo.elem.findall(".//member"):
                 vulkanType = makeVulkanTypeFromXMLTag(self, member)
                 initialEnv[vulkanType.paramName] = {
-                    "type" : vulkanType.typeName,
-                    "binding" : vulkanType.paramName,
-                    "structmember" : True,
-                    "body" : None,
+                    "type": vulkanType.typeName,
+                    "binding": vulkanType.paramName,
+                    "structmember": True,
+                    "body": None,
                 }
-                vulkanType.paramName
                 members.append(vulkanType)
                 if vulkanType.typeName == "VkStructureType" and \
                    member.get("values"):
                    structEnumExpr = member.get("values")
 
             self.structs[typeName] = \
-                VulkanCompoundType( \
+                VulkanCompoundType(
                     typeName,
                     members,
                     isUnion = self.categoryOf(typeName) == "union",
@@ -964,11 +987,28 @@
                     optional = typeinfo.elem.get("optional", None))
             self.structs[typeName].initCopies()
 
-    def onGenGroup(self, _groupinfo, groupName, _alias=None):
+    def onGenGroup(self, groupinfo, groupName, _alias=None):
         self.initType(groupName, "enum")
+        enums = groupinfo.elem.findall("enum")
+        for enum in enums:
+            intVal, strVal = self.generator.enumToValue(enum, True)
+            self.enumValues[enum.get('name')] = intVal if intVal is not None else strVal
 
-    def onGenEnum(self, _enuminfo, name, _alias):
+
+    def onGenEnum(self, enuminfo, name: str, alias):
         self.initType(name, "enum")
+        value: str = enuminfo.elem.get("value")
+        if value and value.isdigit():
+            self.enumValues[name] = int(value)
+        elif value and value[0] == '"' and value[-1] == '"':
+            self.enumValues[name] = value[1:-1]
+        elif alias is not None:
+            self.enumValues[name] = alias
+        else:
+            # There's about a dozen cases of using the bitwise NOT operator (e.g.: `(~0U)`, `(~0ULL)`)
+            # to concisely represent large values. Just ignore them for now.
+            # In the future, we can add a lookup table to convert these to int
+            return
 
     def onGenCmd(self, cmdinfo, name, _alias):
         self.initType(name, "api")
@@ -984,7 +1024,7 @@
                          params)))
         self.apis[name].initCopies()
 
-    def onEnd(self,):
+    def onEnd(self):
         pass
 
 def hasNullOptionalStringFeature(forEachType):
@@ -992,19 +1032,17 @@
            (hasattr(forEachType, "endCheckWithNullOptionalStringFeature")) and \
            (hasattr(forEachType, "finalCheckWithNullOptionalStringFeature"))
 
+
 # General function to iterate over a vulkan type and call code that processes
 # each of its sub-components, if any.
-def iterateVulkanType(typeInfo, vulkanType, forEachType):
+def iterateVulkanType(typeInfo: VulkanTypeInfo, vulkanType: VulkanType, forEachType):
     if not vulkanType.isArrayOfStrings():
         if vulkanType.isPointerToConstPointer:
             return False
 
     forEachType.registerTypeInfo(typeInfo)
 
-    needCheck = \
-        vulkanType.isOptional and \
-        vulkanType.pointerIndirectionLevels > 0 and \
-        (not vulkanType.isNextPointer())
+    needCheck = vulkanType.isOptionalPointer()
 
     if typeInfo.isCompoundType(vulkanType.typeName) and not vulkanType.isNextPointer():
 
@@ -1017,9 +1055,7 @@
             forEachType.endCheck(vulkanType)
 
     else:
-
         if vulkanType.isString():
-
             if needCheck and hasNullOptionalStringFeature(forEachType):
                 forEachType.onCheckWithNullOptionalStringFeature(vulkanType)
                 forEachType.onString(vulkanType)
@@ -1034,15 +1070,12 @@
                 forEachType.onString(vulkanType)
 
         elif vulkanType.isArrayOfStrings():
-
             forEachType.onStringArray(vulkanType)
 
         elif vulkanType.staticArrExpr:
-
             forEachType.onStaticArr(vulkanType)
 
         elif vulkanType.isNextPointer():
-
             if needCheck:
                 forEachType.onCheck(vulkanType)
             forEachType.onStructExtension(vulkanType)
@@ -1055,8 +1088,8 @@
             forEachType.onPointer(vulkanType)
             if needCheck:
                 forEachType.endCheck(vulkanType)
-        else:
 
+        else:
             forEachType.onValue(vulkanType)
 
     return True
@@ -1086,15 +1119,12 @@
         ]
 
         for c in cases:
-            if (structInfo.name, vulkanType.paramName) == (c["structName"],
-                                                           c["field"]):
+            if (structInfo.name, vulkanType.paramName) == (c["structName"], c["field"]):
                 return c
 
         return None
 
-    specialCaseAccess = \
-        getSpecialCaseVulkanStructFieldLength( \
-            structInfo, vulkanType)
+    specialCaseAccess = getSpecialCaseVulkanStructFieldLength(structInfo, vulkanType)
 
     if specialCaseAccess is not None:
         return specialCaseAccess
@@ -1102,17 +1132,17 @@
     lenExpr = vulkanType.getLengthExpression()
 
     if lenExpr is None:
-        return lenExpr
+        return None
 
     return {
-        "structName" : structInfo.name,
+        "structName": structInfo.name,
         "field": vulkanType.typeName,
         "lenExpr": lenExpr,
-        "postprocess": lambda expr: expr }
+        "postprocess": lambda expr: expr}
+
 
 class VulkanTypeProtobufInfo(object):
     def __init__(self, typeInfo, structInfo, vulkanType):
-
         self.needsMessage = typeInfo.isCompoundType(vulkanType.typeName)
         self.isRepeatedString = vulkanType.isArrayOfStrings()
         self.isString = vulkanType.isString() or (
diff --git a/registry/vulkan/scripts/cereal/counting.py b/registry/vulkan/scripts/cereal/counting.py
index d8df778..0557d32 100644
--- a/registry/vulkan/scripts/cereal/counting.py
+++ b/registry/vulkan/scripts/cereal/counting.py
@@ -195,6 +195,8 @@
                     return "(%s && %s)" % (loop(expr.args[0], lambdaEnv), loop(expr.args[1], lambdaEnv))
                 if "or" == fnamestr:
                     return "(%s || %s)" % (loop(expr.args[0], lambdaEnv), loop(expr.args[1], lambdaEnv))
+                if "bitwise_and" == fnamestr:
+                    return "(%s & %s)" % (loop(expr.args[0], lambdaEnv), loop(expr.args[1], lambdaEnv))
                 if "getfield" == fnamestr:
                     ptrlevels = get_ptrlevels(expr.args[0].val.name)
                     if ptrlevels == 0:
diff --git a/registry/vulkan/scripts/cereal/decoder.py b/registry/vulkan/scripts/cereal/decoder.py
index d7f446d..0a998ad 100644
--- a/registry/vulkan/scripts/cereal/decoder.py
+++ b/registry/vulkan/scripts/cereal/decoder.py
@@ -1,18 +1,17 @@
-from .common.codegen import CodeGen, VulkanWrapperGenerator, VulkanAPIWrapper
-from .common.vulkantypes import \
-        VulkanAPI, makeVulkanTypeSimple, iterateVulkanType, DISPATCHABLE_HANDLE_TYPES, NON_DISPATCHABLE_HANDLE_TYPES
+from .common.codegen import CodeGen, VulkanWrapperGenerator
+from .common.vulkantypes import VulkanAPI, makeVulkanTypeSimple, iterateVulkanType, VulkanTypeInfo,\
+    VulkanType
 
 from .marshaling import VulkanMarshalingCodegen
 from .reservedmarshaling import VulkanReservedMarshalingCodegen
-from .transform import TransformCodegen, genTransformsForVulkanType
+from .transform import TransformCodegen
 
 from .wrapperdefs import API_PREFIX_MARSHAL
-from .wrapperdefs import API_PREFIX_UNMARSHAL, API_PREFIX_RESERVEDUNMARSHAL
+from .wrapperdefs import API_PREFIX_RESERVEDUNMARSHAL
 from .wrapperdefs import VULKAN_STREAM_TYPE
 from .wrapperdefs import ROOT_TYPE_DEFAULT_VALUE
 from .wrapperdefs import RELAXED_APIS
 
-from copy import copy
 
 SKIPPED_DECODER_DELETES = [
     "vkFreeDescriptorSets",
@@ -22,6 +21,8 @@
     "vkDestroyPipelineLayout",
 ]
 
+global_state_prefix = "m_state->on_"
+
 decoder_decl_preamble = """
 
 class IOStream;
@@ -31,7 +32,7 @@
     VkDecoder();
     ~VkDecoder();
     void setForSnapshotLoad(bool forSnapshotLoad);
-    size_t decode(void* buf, size_t bufsize, IOStream* stream, uint32_t* seqnoPtr);
+    size_t decode(void* buf, size_t bufsize, IOStream* stream, uint32_t* seqnoPtr, emugl::GfxApiLogger& gfx_logger);
 private:
     class Impl;
     std::unique_ptr<Impl> mImpl;
@@ -40,6 +41,7 @@
 
 decoder_impl_preamble ="""
 using emugl::vkDispatch;
+using emugl::GfxApiLogger;
 
 using namespace goldfish_vk;
 
@@ -60,7 +62,7 @@
         m_forSnapshotLoad = forSnapshotLoad;
     }
 
-    size_t decode(void* buf, size_t bufsize, IOStream* stream, uint32_t* seqnoPtr);
+    size_t decode(void* buf, size_t bufsize, IOStream* stream, uint32_t* seqnoPtr, GfxApiLogger& gfx_logger);
 
 private:
     bool m_logCalls;
@@ -86,8 +88,8 @@
     mImpl->setForSnapshotLoad(forSnapshotLoad);
 }
 
-size_t VkDecoder::decode(void* buf, size_t bufsize, IOStream* stream, uint32_t* seqnoPtr) {
-    return mImpl->decode(buf, bufsize, stream, seqnoPtr);
+size_t VkDecoder::decode(void* buf, size_t bufsize, IOStream* stream, uint32_t* seqnoPtr, GfxApiLogger& gfx_logger) {
+    return mImpl->decode(buf, bufsize, stream, seqnoPtr, gfx_logger);
 }
 
 // VkDecoder::Impl::decode to follow
@@ -150,45 +152,38 @@
             direction="read",
             dynAlloc=True))
 
-def emit_dispatch_unmarshal(typeInfo, param, cgen, globalWrapped):
-    if globalWrapped:
-        cgen.stmt("// Begin global wrapped dispatchable handle unboxing for %s" % param.paramName)
-        iterateVulkanType(typeInfo, param, VulkanReservedMarshalingCodegen(
-            cgen,
-            READ_STREAM,
-            ROOT_TYPE_DEFAULT_VALUE,
-            param.paramName,
-            "readStreamPtrPtr",
-            API_PREFIX_RESERVEDUNMARSHAL,
-            "",
-            direction="read",
-            dynAlloc=True))
-    else:
-        cgen.stmt("// Begin non wrapped dispatchable handle unboxing for %s" % param.paramName)
-        # cgen.stmt("%s->unsetHandleMapping()" % READ_STREAM)
-        iterateVulkanType(typeInfo, param, VulkanReservedMarshalingCodegen(
-            cgen,
-            READ_STREAM,
-            ROOT_TYPE_DEFAULT_VALUE,
-            param.paramName,
-            "readStreamPtrPtr",
-            API_PREFIX_RESERVEDUNMARSHAL,
-            "",
-            direction="read",
-            dynAlloc=True))
+
+def emit_dispatch_unmarshal(typeInfo: VulkanTypeInfo, param: VulkanType, cgen, globalWrapped):
+    cgen.stmt("// Begin {} wrapped dispatchable handle unboxing for {}".format(
+        "global" if globalWrapped else "non",
+        param.paramName))
+
+    iterateVulkanType(typeInfo, param, VulkanReservedMarshalingCodegen(
+        cgen,
+        READ_STREAM,
+        ROOT_TYPE_DEFAULT_VALUE,
+        param.paramName,
+        "readStreamPtrPtr",
+        API_PREFIX_RESERVEDUNMARSHAL,
+        "",
+        direction="read",
+        dynAlloc=True))
+
+    if not globalWrapped:
         cgen.stmt("auto unboxed_%s = unbox_%s(%s)" %
                   (param.paramName, param.typeName, param.paramName))
         cgen.stmt("auto vk = dispatch_%s(%s)" %
                   (param.typeName, param.paramName))
         cgen.stmt("// End manual dispatchable handle unboxing for %s" % param.paramName)
 
+
 def emit_transform(typeInfo, param, cgen, variant="tohost"):
-    res = \
-        iterateVulkanType(typeInfo, param, TransformCodegen( \
-            cgen, param.paramName, "m_state", "transform_%s_" % variant, variant))
+    res = iterateVulkanType(typeInfo, param, TransformCodegen(
+        cgen, param.paramName, "m_state", "transform_%s_" % variant, variant))
     if not res:
         cgen.stmt("(void)%s" % param.paramName)
 
+
 def emit_marshal(typeInfo, param, cgen, handleMapOverwrites=False):
     iterateVulkanType(typeInfo, param, VulkanMarshalingCodegen(
         cgen,
@@ -199,21 +194,14 @@
         direction="write",
         handleMapOverwrites=handleMapOverwrites))
 
+
 class DecodingParameters(object):
-    def __init__(self, api):
-        self.params = []
-        self.toRead = []
-        self.toWrite = []
+    def __init__(self, api: VulkanAPI):
+        self.params: list[VulkanType] = []
+        self.toRead: list[VulkanType] = []
+        self.toWrite: list[VulkanType] = []
 
-        i = 0
-
-        for param in api.parameters:
-            param.nonDispatchableHandleCreate = False
-            param.nonDispatchableHandleDestroy = False
-            param.dispatchHandle = False
-            param.dispatchableHandleCreate = False
-            param.dispatchableHandleDestroy = False
-
+        for i, param in enumerate(api.parameters):
             if i == 0 and param.isDispatchableHandleType():
                 param.dispatchHandle = True
 
@@ -236,7 +224,6 @@
 
             self.params.append(param)
 
-            i += 1
 
 def emit_call_log(api, cgen):
     decodingParams = DecodingParameters(api)
@@ -252,8 +239,7 @@
     cgen.stmt("fprintf(stderr, \"stream %%p: call %s %s\\n\", ioStream, %s)" % (api.name, paramLogFormat, ", ".join(paramLogArgs)))
     cgen.endIf()
 
-def emit_decode_parameters(typeInfo, api, cgen, globalWrapped=False):
-
+def emit_decode_parameters(typeInfo: VulkanTypeInfo, api: VulkanAPI, cgen, globalWrapped=False):
     decodingParams = DecodingParameters(api)
 
     paramsToRead = decodingParams.toRead
@@ -261,9 +247,8 @@
     for p in paramsToRead:
         emit_param_decl_for_reading(p, cgen)
 
-    i = 0
-    for p in paramsToRead:
-        lenAccess =  cgen.generalLengthAccess(p)
+    for i, p in enumerate(paramsToRead):
+        lenAccess = cgen.generalLengthAccess(p)
 
         if p.dispatchHandle:
             emit_dispatch_unmarshal(typeInfo, p, cgen, globalWrapped)
@@ -284,10 +269,9 @@
                 cgen.stmt("%s->unsetHandleMapping()" % READ_STREAM)
 
             emit_unmarshal(typeInfo, p, cgen, output = p.possiblyOutput(), destroy = destroy, noUnbox = noUnbox)
-        i += 1
 
     for p in paramsToRead:
-        emit_transform(typeInfo, p, cgen, variant="tohost");
+        emit_transform(typeInfo, p, cgen, variant="tohost")
 
     emit_call_log(api, cgen)
 
@@ -299,7 +283,7 @@
 
     delay = api.name in DELAYED_DECODER_DELETES
 
-    for (i, p) in enumerate(api.parameters):
+    for i, p in enumerate(api.parameters):
         customParam = p.paramName
         if decodingParams.params[i].dispatchHandle:
             customParam = "unboxed_%s" % p.paramName
@@ -315,7 +299,8 @@
         else:
             cgen.stmt("m_state->lock()")
 
-    cgen.vkApiCall(api, customPrefix="vk->", customParameters=customParams)
+    cgen.vkApiCall(api, customPrefix="vk->", customParameters=customParams, \
+        globalStatePrefix=global_state_prefix, checkForDeviceLost=True)
 
     if api.name in driver_workarounds_global_lock_apis:
         if not delay:
@@ -326,14 +311,17 @@
     if delay:
         cgen.line("};")
 
-def emit_global_state_wrapped_call(api, cgen):
+def emit_global_state_wrapped_call(api, cgen, logger):
     if api.name in DELAYED_DECODER_DELETES:
         print("Error: Cannot generate a global state wrapped call that is also a delayed delete (yet)");
         raise
 
     customParams = ["&m_pool"] + list(map(lambda p: p.paramName, api.parameters))
-    cgen.vkApiCall(api, customPrefix="m_state->on_", \
-        customParameters=customParams)
+    if logger:
+        customParams += ["gfx_logger"]
+    cgen.vkApiCall(api, customPrefix=global_state_prefix, \
+        customParameters=customParams, globalStatePrefix=global_state_prefix, \
+        checkForDeviceLost=True)
 
 def emit_decode_parameters_writeback(typeInfo, api, cgen, autobox=True):
     decodingParams = DecodingParameters(api)
@@ -463,15 +451,19 @@
     cgen.vkApiCall(apiForSnapshot, customPrefix="m_state->snapshot()->")
     cgen.endIf()
 
-def emit_default_decoding(typeInfo, api, cgen):
+def emit_decoding(typeInfo, api, cgen, globalWrapped=False, logger=False):
     isAcquire = api.name in RELAXED_APIS
-    emit_decode_parameters(typeInfo, api, cgen)
+    emit_decode_parameters(typeInfo, api, cgen, globalWrapped)
 
     if isAcquire:
         emit_seqno_incr(api, cgen)
 
-    emit_dispatch_call(api, cgen)
-    emit_decode_parameters_writeback(typeInfo, api, cgen)
+    if globalWrapped:
+        emit_global_state_wrapped_call(api, cgen, logger)
+    else:
+        emit_dispatch_call(api, cgen)
+
+    emit_decode_parameters_writeback(typeInfo, api, cgen, autobox=not globalWrapped)
     emit_decode_return_writeback(api, cgen)
     emit_decode_finish(api, cgen)
     emit_snapshot(typeInfo, api, cgen)
@@ -481,26 +473,17 @@
     if not isAcquire:
         emit_seqno_incr(api, cgen)
 
+def emit_default_decoding(typeInfo, api, cgen):
+    emit_decoding(typeInfo, api, cgen)
+
 def emit_global_state_wrapped_decoding(typeInfo, api, cgen):
-    isAcquire = api.name in RELAXED_APIS
+    emit_decoding(typeInfo, api, cgen, globalWrapped=True)
 
-    emit_decode_parameters(typeInfo, api, cgen, globalWrapped=True)
-
-    if isAcquire:
-        emit_seqno_incr(api, cgen)
-
-    emit_global_state_wrapped_call(api, cgen)
-    emit_decode_parameters_writeback(typeInfo, api, cgen, autobox=False)
-    emit_decode_return_writeback(api, cgen)
-    emit_decode_finish(api, cgen)
-    emit_snapshot(typeInfo, api, cgen)
-    emit_destroyed_handle_cleanup(api, cgen)
-    emit_pool_free(cgen)
-    if not isAcquire:
-        emit_seqno_incr(api, cgen)
+def emit_global_state_wrapped_decoding_with_logger(typeInfo, api, cgen):
+    emit_decoding(typeInfo, api, cgen, globalWrapped=True, logger=True)
 
 ## Custom decoding definitions##################################################
-def decode_vkFlushMappedMemoryRanges(typeInfo, api, cgen):
+def decode_vkFlushMappedMemoryRanges(typeInfo: VulkanTypeInfo, api, cgen):
     emit_decode_parameters(typeInfo, api, cgen)
 
     cgen.beginIf("!m_state->usingDirectMapping()")
@@ -641,8 +624,8 @@
     "vkCmdExecuteCommands" : emit_global_state_wrapped_decoding,
     "vkQueueSubmit" : emit_global_state_wrapped_decoding,
     "vkQueueWaitIdle" : emit_global_state_wrapped_decoding,
-    "vkBeginCommandBuffer" : emit_global_state_wrapped_decoding,
-    "vkEndCommandBuffer" : emit_global_state_wrapped_decoding,
+    "vkBeginCommandBuffer" : emit_global_state_wrapped_decoding_with_logger,
+    "vkEndCommandBuffer" : emit_global_state_wrapped_decoding_with_logger,
     "vkResetCommandBuffer" : emit_global_state_wrapped_decoding,
     "vkFreeCommandBuffers" : emit_global_state_wrapped_decoding,
     "vkCreateCommandPool" : emit_global_state_wrapped_decoding,
@@ -653,10 +636,15 @@
     "vkCmdBindDescriptorSets" : emit_global_state_wrapped_decoding,
 
     "vkCreateRenderPass" : emit_global_state_wrapped_decoding,
+    "vkCreateRenderPass2" : emit_global_state_wrapped_decoding,
+    "vkCreateRenderPass2KHR" : emit_global_state_wrapped_decoding,
     "vkDestroyRenderPass" : emit_global_state_wrapped_decoding,
     "vkCreateFramebuffer" : emit_global_state_wrapped_decoding,
     "vkDestroyFramebuffer" : emit_global_state_wrapped_decoding,
 
+    "vkCreateSamplerYcbcrConversion": emit_global_state_wrapped_decoding,
+    "vkDestroySamplerYcbcrConversion": emit_global_state_wrapped_decoding,
+
     # VK_ANDROID_native_buffer
     "vkGetSwapchainGrallocUsageANDROID" : emit_global_state_wrapped_decoding,
     "vkGetSwapchainGrallocUsage2ANDROID" : emit_global_state_wrapped_decoding,
@@ -689,8 +677,8 @@
     "vkUpdateDescriptorSetWithTemplateSizedGOOGLE" : emit_global_state_wrapped_decoding,
 
     # VK_GOOGLE_gfxstream
-    "vkBeginCommandBufferAsyncGOOGLE" : emit_global_state_wrapped_decoding,
-    "vkEndCommandBufferAsyncGOOGLE" : emit_global_state_wrapped_decoding,
+    "vkBeginCommandBufferAsyncGOOGLE" : emit_global_state_wrapped_decoding_with_logger,
+    "vkEndCommandBufferAsyncGOOGLE" : emit_global_state_wrapped_decoding_with_logger,
     "vkResetCommandBufferAsyncGOOGLE" : emit_global_state_wrapped_decoding,
     "vkCommandBufferHostSyncGOOGLE" : emit_global_state_wrapped_decoding,
     "vkCreateImageWithRequirementsGOOGLE" : emit_global_state_wrapped_decoding,
@@ -701,7 +689,7 @@
     "vkQueueBindSparseAsyncGOOGLE" : emit_global_state_wrapped_decoding,
     "vkGetLinearImageLayoutGOOGLE" : emit_global_state_wrapped_decoding,
     "vkGetLinearImageLayout2GOOGLE" : emit_global_state_wrapped_decoding,
-    "vkQueueFlushCommandsGOOGLE" : emit_global_state_wrapped_decoding,
+    "vkQueueFlushCommandsGOOGLE" : emit_global_state_wrapped_decoding_with_logger,
     "vkQueueCommitDescriptorSetUpdatesGOOGLE" : emit_global_state_wrapped_decoding,
     "vkCollectDescriptorPoolIdsGOOGLE" : emit_global_state_wrapped_decoding,
     "vkQueueSignalReleaseImageANDROIDAsyncGOOGLE" : emit_global_state_wrapped_decoding,
@@ -714,12 +702,16 @@
 
     # VK_EXT_metal_surface
     "vkCreateMetalSurfaceEXT": decode_unsupported_api,
+
+    # VK_KHR_sampler_ycbcr_conversion
+    "vkCreateSamplerYcbcrConversionKHR": emit_global_state_wrapped_decoding,
+    "vkDestroySamplerYcbcrConversionKHR": emit_global_state_wrapped_decoding,
 }
 
 class VulkanDecoder(VulkanWrapperGenerator):
     def __init__(self, module, typeInfo):
         VulkanWrapperGenerator.__init__(self, module, typeInfo)
-        self.typeInfo = typeInfo
+        self.typeInfo: VulkanTypeInfo = typeInfo
         self.cgen = CodeGen()
 
     def onBegin(self,):
@@ -727,7 +719,7 @@
         self.module.appendImpl(decoder_impl_preamble)
 
         self.module.appendImpl(
-            "size_t VkDecoder::Impl::decode(void* buf, size_t len, IOStream* ioStream, uint32_t* seqnoPtr)\n")
+            "size_t VkDecoder::Impl::decode(void* buf, size_t len, IOStream* ioStream, uint32_t* seqnoPtr, GfxApiLogger& gfx_logger)\n")
 
         self.cgen.beginBlock() # function body
 
@@ -746,6 +738,7 @@
         self.cgen.stmt("uint32_t opcode = *(uint32_t *)ptr")
         self.cgen.stmt("uint32_t packetLen = *(uint32_t *)(ptr + 4)")
         self.cgen.stmt("if (end - ptr < packetLen) return ptr - (unsigned char*)buf")
+        self.cgen.stmt("gfx_logger.record(ptr, std::min(size_t(packetLen + 8), size_t(end - ptr)))")
 
         self.cgen.stmt("stream()->setStream(ioStream)")
         self.cgen.stmt("VulkanStream* %s = stream()" % WRITE_STREAM)
@@ -758,21 +751,27 @@
         if (queueSubmitWithCommandsEnabled && ((opcode >= OP_vkFirst && opcode < OP_vkLast) || (opcode >= OP_vkFirst_old && opcode < OP_vkLast_old))) {
             uint32_t seqno; memcpy(&seqno, *readStreamPtrPtr, sizeof(uint32_t)); *readStreamPtrPtr += sizeof(uint32_t);
             if (seqnoPtr && !m_forSnapshotLoad) {
-                while ((seqno - __atomic_load_n(seqnoPtr, __ATOMIC_SEQ_CST) != 1));
+                while ((seqno - __atomic_load_n(seqnoPtr, __ATOMIC_SEQ_CST) != 1)) {
+                #if (defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64)))
+                _mm_pause();
+                #elif (defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)))
+                __asm__ __volatile__("pause;");
+                #endif
+                }
             }
         }
         """)
         self.cgen.stmt("auto vk = m_vk")
 
         self.cgen.line("switch (opcode)")
-        self.cgen.beginBlock() # switch stmt
+        self.cgen.beginBlock()  # switch stmt
 
         self.module.appendImpl(self.cgen.swapCode())
 
     def onGenCmd(self, cmdinfo, name, alias):
         typeInfo = self.typeInfo
         cgen = self.cgen
-        api = typeInfo.apis[name]
+        api: VulkanAPI = typeInfo.apis[name]
 
         cgen.line("case OP_%s:" % name)
         cgen.beginBlock()
diff --git a/registry/vulkan/scripts/cereal/decodersnapshot.py b/registry/vulkan/scripts/cereal/decodersnapshot.py
index 668efb8..308c1cd 100644
--- a/registry/vulkan/scripts/cereal/decodersnapshot.py
+++ b/registry/vulkan/scripts/cereal/decodersnapshot.py
@@ -25,7 +25,7 @@
     ~VkDecoderSnapshot();
 
     void save(android::base::Stream* stream);
-    void load(android::base::Stream* stream);
+    void load(android::base::Stream* stream, emugl::GfxApiLogger& gfx_logger);
 """
 
 decoder_snapshot_decl_postamble = """
@@ -39,6 +39,7 @@
 decoder_snapshot_impl_preamble ="""
 
 using namespace goldfish_vk;
+using emugl::GfxApiLogger;
 
 class VkDecoderSnapshot::Impl {
 public:
@@ -48,8 +49,8 @@
         mReconstruction.save(stream);
     }
 
-    void load(android::base::Stream* stream) {
-        mReconstruction.load(stream);
+    void load(android::base::Stream* stream, GfxApiLogger& gfx_logger) {
+        mReconstruction.load(stream, gfx_logger);
     }
 
 """
@@ -67,8 +68,8 @@
     mImpl->save(stream);
 }
 
-void VkDecoderSnapshot::load(android::base::Stream* stream) {
-    mImpl->load(stream);
+void VkDecoderSnapshot::load(android::base::Stream* stream, GfxApiLogger& gfx_logger) {
+    mImpl->load(stream, gfx_logger);
 }
 
 VkDecoderSnapshot::~VkDecoderSnapshot() = default;
diff --git a/registry/vulkan/scripts/cereal/encoder.py b/registry/vulkan/scripts/cereal/encoder.py
index 63923ab..4547723 100644
--- a/registry/vulkan/scripts/cereal/encoder.py
+++ b/registry/vulkan/scripts/cereal/encoder.py
@@ -37,8 +37,6 @@
 
 using namespace goldfish_vk;
 
-using android::aligned_buf_alloc;
-using android::aligned_buf_free;
 using android::base::guest::AutoLock;
 using android::base::guest::Lock;
 using android::base::BumpPool;
diff --git a/registry/vulkan/scripts/cereal/marshaling.py b/registry/vulkan/scripts/cereal/marshaling.py
index bdaa992..3427fed 100644
--- a/registry/vulkan/scripts/cereal/marshaling.py
+++ b/registry/vulkan/scripts/cereal/marshaling.py
@@ -267,6 +267,8 @@
                     return "(%s && %s)" % (loop(expr.args[0], lambdaEnv), loop(expr.args[1], lambdaEnv))
                 if "or" == fnamestr:
                     return "(%s || %s)" % (loop(expr.args[0], lambdaEnv), loop(expr.args[1], lambdaEnv))
+                if "bitwise_and" == fnamestr:
+                    return "(%s & %s)" % (loop(expr.args[0], lambdaEnv), loop(expr.args[1], lambdaEnv))
                 if "getfield" == fnamestr:
                     ptrlevels = get_ptrlevels(expr.args[0].val.name)
                     if ptrlevels == 0:
diff --git a/registry/vulkan/scripts/cereal/reservedmarshaling.py b/registry/vulkan/scripts/cereal/reservedmarshaling.py
index 82b30c2..23ace9d 100644
--- a/registry/vulkan/scripts/cereal/reservedmarshaling.py
+++ b/registry/vulkan/scripts/cereal/reservedmarshaling.py
@@ -212,7 +212,7 @@
                 self.genStreamCall(handle64VarType, handle64VarAccess, handle64Bytes)
                 self.cgen.stmt("*%s%s = (%s)%s((%s)(*%s))" % (
                     self.makeCastExpr(vulkanType.getForNonConstAccess()), access,
-                    vulkanType.typeName,mapFunc, vulkanType.typeName, handle64VarAccess))
+                    vulkanType.typeName, mapFunc, vulkanType.typeName, handle64VarAccess))
             else:
                 self.genPtrIncr("8 * %s" % lenAccess)
                 if lenAccessGuard is not None:
@@ -233,8 +233,7 @@
         if self.dynAlloc and self.direction == "read":
             access = self.exprAccessor(vulkanType)
             lenAccess = self.lenAccessor(vulkanType)
-            sizeof = self.cgen.sizeofExpr( \
-                         vulkanType.getForValueAccess())
+            sizeof = self.cgen.sizeofExpr(vulkanType.getForValueAccess())
             if lenAccess:
                 bytesExpr = "%s * %s" % (lenAccess, sizeof)
             else:
@@ -245,7 +244,7 @@
                 if self.stackArrSize != lenAccess:
                     self.cgen.beginIf("%s <= %s" % (lenAccess, self.stackArrSize))
 
-                self.cgen.stmt( \
+                self.cgen.stmt(
                         "%s = %s%s" % (access, self.makeCastExpr(vulkanType.getForNonConstAccess()), self.stackVar))
 
                 if self.stackArrSize != lenAccess:
@@ -253,7 +252,7 @@
                     self.cgen.beginElse()
 
                 if self.stackArrSize != lenAccess:
-                    self.cgen.stmt( \
+                    self.cgen.stmt(
                             "%s->alloc((void**)&%s, %s)" %
                             (self.streamVarName,
                                 access, bytesExpr))
@@ -261,7 +260,7 @@
                 if self.stackArrSize != lenAccess:
                     self.cgen.endIf()
             else:
-                self.cgen.stmt( \
+                self.cgen.stmt(
                         "%s->alloc((void**)&%s, %s)" %
                         (self.streamVarName,
                             access, bytesExpr))
@@ -275,16 +274,12 @@
         return None
 
     def onCheck(self, vulkanType):
-
         if self.forApiOutput:
             return
 
-        featureExpr = self.getOptionalStringFeatureExpr(vulkanType);
-
+        featureExpr = self.getOptionalStringFeatureExpr(vulkanType)
         self.checked = True
-
         access = self.exprAccessor(vulkanType)
-
         needConsistencyCheck = False
 
         self.cgen.line("// WARNING PTR CHECK")
@@ -353,6 +348,8 @@
                     return "(%s && %s)" % (loop(expr.args[0], lambdaEnv), loop(expr.args[1], lambdaEnv))
                 if "or" == fnamestr:
                     return "(%s || %s)" % (loop(expr.args[0], lambdaEnv), loop(expr.args[1], lambdaEnv))
+                if "bitwise_and" == fnamestr:
+                    return "(%s & %s)" % (loop(expr.args[0], lambdaEnv), loop(expr.args[1], lambdaEnv))
                 if "getfield" == fnamestr:
                     ptrlevels = get_ptrlevels(expr.args[0].val.name)
                     if ptrlevels == 0:
diff --git a/registry/vulkan/scripts/cereal/subdecode.py b/registry/vulkan/scripts/cereal/subdecode.py
index 080f4c7..5ca744c 100644
--- a/registry/vulkan/scripts/cereal/subdecode.py
+++ b/registry/vulkan/scripts/cereal/subdecode.py
@@ -1,16 +1,12 @@
-from .common.codegen import CodeGen, VulkanWrapperGenerator, VulkanAPIWrapper
-from .common.vulkantypes import \
-    VulkanAPI, makeVulkanTypeSimple, iterateVulkanType, DISPATCHABLE_HANDLE_TYPES, NON_DISPATCHABLE_HANDLE_TYPES
+from .common.codegen import CodeGen, VulkanWrapperGenerator
+from .common.vulkantypes import VulkanAPI, iterateVulkanType, VulkanType
 
 from .reservedmarshaling import VulkanReservedMarshalingCodegen
-from .transform import TransformCodegen, genTransformsForVulkanType
+from .transform import TransformCodegen
 
-from .wrapperdefs import API_PREFIX_MARSHAL
-from .wrapperdefs import API_PREFIX_UNMARSHAL, API_PREFIX_RESERVEDUNMARSHAL
+from .wrapperdefs import API_PREFIX_RESERVEDUNMARSHAL
 from .wrapperdefs import ROOT_TYPE_DEFAULT_VALUE
-from .wrapperdefs import VULKAN_STREAM_TYPE
 
-from copy import copy
 
 decoder_decl_preamble = """
 """
@@ -18,6 +14,8 @@
 decoder_impl_preamble = """
 """
 
+global_state_prefix = "this->on_"
+
 READ_STREAM = "readStream"
 WRITE_STREAM = "vkStream"
 
@@ -149,20 +147,12 @@
 
 
 class DecodingParameters(object):
-    def __init__(self, api):
-        self.params = []
-        self.toRead = []
-        self.toWrite = []
+    def __init__(self, api: VulkanAPI):
+        self.params: list[VulkanType] = []
+        self.toRead: list[VulkanType] = []
+        self.toWrite: list[VulkanType] = []
 
-        i = 0
-
-        for param in api.parameters[1:]:
-            param.nonDispatchableHandleCreate = False
-            param.nonDispatchableHandleDestroy = False
-            param.dispatchHandle = False
-            param.dispatchableHandleCreate = False
-            param.dispatchableHandleDestroy = False
-
+        for i, param in enumerate(api.parameters[1:]):
             if i == 0 and param.isDispatchableHandleType():
                 param.dispatchHandle = True
 
@@ -185,8 +175,6 @@
 
             self.params.append(param)
 
-            i += 1
-
 
 def emit_call_log(api, cgen):
     decodingParams = DecodingParameters(api)
@@ -265,17 +253,19 @@
         cgen.stmt("lock()")
 
     cgen.vkApiCall(api, customPrefix="vk->", customParameters=customParams,
-                   retVarDecl=False, retVarAssign=False)
+                    checkForDeviceLost=True, globalStatePrefix=global_state_prefix)
 
     if api.name in driver_workarounds_global_lock_apis:
         cgen.stmt("unlock()")
 
 
-def emit_global_state_wrapped_call(api, cgen):
+def emit_global_state_wrapped_call(api, cgen, logger=False):
     customParams = ["pool", "(VkCommandBuffer)(boxed_dispatchHandle)"] + \
         list(map(lambda p: p.paramName, api.parameters[1:]))
-    cgen.vkApiCall(api, customPrefix="this->on_",
-                   customParameters=customParams, retVarDecl=False, retVarAssign=False)
+    if logger:
+        customParams += ["gfx_logger"];
+    cgen.vkApiCall(api, customPrefix=global_state_prefix,
+                   customParameters=customParams, checkForDeviceLost=True, globalStatePrefix=global_state_prefix)
 
 
 def emit_default_decoding(typeInfo, api, cgen):
@@ -287,20 +277,25 @@
     emit_decode_parameters(typeInfo, api, cgen, globalWrapped=True)
     emit_global_state_wrapped_call(api, cgen)
 
+def emit_global_state_wrapped_decoding_with_logger(typeInfo, api, cgen):
+    emit_decode_parameters(typeInfo, api, cgen, globalWrapped=True)
+    emit_global_state_wrapped_call(api, cgen, logger=True)
+
 
 custom_decodes = {
     "vkCmdCopyBufferToImage": emit_global_state_wrapped_decoding,
     "vkCmdCopyImage": emit_global_state_wrapped_decoding,
     "vkCmdCopyImageToBuffer": emit_global_state_wrapped_decoding,
     "vkCmdExecuteCommands": emit_global_state_wrapped_decoding,
-    "vkBeginCommandBuffer": emit_global_state_wrapped_decoding,
-    "vkEndCommandBuffer": emit_global_state_wrapped_decoding,
+    "vkBeginCommandBuffer": emit_global_state_wrapped_decoding_with_logger,
+    "vkEndCommandBuffer": emit_global_state_wrapped_decoding_with_logger,
     "vkResetCommandBuffer": emit_global_state_wrapped_decoding,
     "vkCmdPipelineBarrier": emit_global_state_wrapped_decoding,
     "vkCmdBindPipeline": emit_global_state_wrapped_decoding,
     "vkCmdBindDescriptorSets": emit_global_state_wrapped_decoding,
-    "vkBeginCommandBufferAsyncGOOGLE": emit_global_state_wrapped_decoding,
-    "vkEndCommandBufferAsyncGOOGLE": emit_global_state_wrapped_decoding,
+    "vkCmdCopyQueryPoolResults": emit_global_state_wrapped_decoding,
+    "vkBeginCommandBufferAsyncGOOGLE": emit_global_state_wrapped_decoding_with_logger,
+    "vkEndCommandBufferAsyncGOOGLE": emit_global_state_wrapped_decoding_with_logger,
     "vkResetCommandBufferAsyncGOOGLE": emit_global_state_wrapped_decoding,
     "vkCommandBufferHostSyncGOOGLE": emit_global_state_wrapped_decoding,
 }
@@ -317,7 +312,7 @@
             "#define MAX_STACK_ITEMS %s\n" % MAX_STACK_ITEMS)
 
         self.module.appendImpl(
-            "size_t subDecode(VulkanMemReadingStream* readStream, VulkanDispatch* vk, void* boxed_dispatchHandle, void* dispatchHandle, VkDeviceSize dataSize, const void* pData)\n")
+            "size_t subDecode(VulkanMemReadingStream* readStream, VulkanDispatch* vk, void* boxed_dispatchHandle, void* dispatchHandle, VkDeviceSize dataSize, const void* pData, GfxApiLogger& gfx_logger)\n")
 
         self.cgen.beginBlock()  # function body
 
@@ -335,8 +330,9 @@
 
         self.cgen.stmt("uint32_t opcode = *(uint32_t *)ptr")
         self.cgen.stmt("uint32_t packetLen = *(uint32_t *)(ptr + 4)")
-        self.cgen.stmt(
-            "if (end - ptr < packetLen) return ptr - (unsigned char*)buf")
+        self.cgen.stmt("if (end - ptr < packetLen) return ptr - (unsigned char*)buf")
+        self.cgen.stmt("gfx_logger.record(ptr, std::min(size_t(packetLen + 8), size_t(end - ptr)))")
+
 
         self.cgen.stmt("%s->setBuf((uint8_t*)(ptr + 8))" % READ_STREAM)
         self.cgen.stmt(
diff --git a/registry/vulkan/scripts/cerealgenerator.py b/registry/vulkan/scripts/cerealgenerator.py
index ad2960d..3b43a91 100644
--- a/registry/vulkan/scripts/cerealgenerator.py
+++ b/registry/vulkan/scripts/cerealgenerator.py
@@ -17,6 +17,7 @@
 
 import os, re, sys
 from generator import *
+from pathlib import Path, PurePosixPath
 
 import cereal
 from cereal.wrapperdefs import VULKAN_STREAM_TYPE
@@ -24,6 +25,7 @@
 
 # CerealGenerator - generates set of driver sources
 # while being agnostic to the stream implementation
+from reg import GroupInfo, TypeInfo, EnumInfo
 
 copyrightHeader = """// Copyright (C) 2018 The Android Open Source Project
 // Copyright (C) 2018 Google Inc.
@@ -71,12 +73,12 @@
        Return a string corresponding to the command, with platform-specific
        paths removed."""
 
-    def makeRelative(someArg):
+    def makePosixRelative(someArg):
         if os.path.exists(someArg):
-            return os.path.relpath(someArg)
+            return str(PurePosixPath(Path(os.path.relpath(someArg))))
         return someArg
 
-    return ' '.join(map(makeRelative, argv))
+    return ' '.join(map(makePosixRelative, argv))
 
 suppressEnabled = False
 suppressExceptModule = None
@@ -119,7 +121,7 @@
 
         init_suppress_option()
 
-        self.typeInfo = cereal.VulkanTypeInfo()
+        self.typeInfo = cereal.VulkanTypeInfo(self)
 
         self.modules = {}
         self.protos = {}
@@ -344,6 +346,7 @@
 
         decoderSnapshotHeaderIncludes = """
 #include <memory>
+#include "base/GfxApiLogger.h"
 #include "common/goldfish_vk_private_defs.h"
 """
         decoderSnapshotImplIncludes = f"""
@@ -355,6 +358,8 @@
 """
 
         decoderHeaderIncludes = """
+#include "base/GfxApiLogger.h"
+
 #include <memory>
 
 namespace android {
@@ -485,6 +490,12 @@
                            extraImpl="",
                            useNamespace=False,
                            implOnly=True)
+        self.addHostModule("ApiLogDecoder",
+                           extraHeader="",
+                           extraImpl="",
+                           useNamespace=False,
+                           implOnly=True,
+                           suppress=True)
 
         self.addWrapper(cereal.VulkanEncoder, "VkEncoder")
         self.addWrapper(cereal.VulkanExtensionStructs, "goldfish_vk_extension_structs_guest")
@@ -506,6 +517,7 @@
         self.addWrapper(cereal.VulkanDecoder, "VkDecoder")
         self.addWrapper(cereal.VulkanDecoderSnapshot, "VkDecoderSnapshot")
         self.addWrapper(cereal.VulkanSubDecoder, "VkSubDecoder")
+        self.addWrapper(cereal.ApiLogDecoder, "ApiLogDecoder")
 
         self.guestAndroidMkCppFiles = ""
         self.hostCMakeCppFiles = ""
@@ -524,6 +536,9 @@
         self.forEachModule(addSrcEntry)
 
     def addGuestEncoderModule(self, basename, extraHeader = "", extraImpl = "", useNamespace = True):
+        if not os.path.exists(self.guest_abs_encoder_destination):
+            print("Path [%s] not found (guest encoder path), skipping" % self.guest_abs_encoder_destination)
+            return
         self.addModule(self.guest_encoder_tag,
                        basename,
                        extraHeader = extraHeader,
@@ -532,6 +547,9 @@
                        useNamespace = useNamespace)
 
     def addGuestHalModule(self, basename, extraHeader = "", extraImpl = "", useNamespace = True):
+        if not os.path.exists(self.guest_abs_hal_destination):
+            print("Path [%s] not found (guest encoder path), skipping" % self.guest_abs_encoder_destination)
+            return
         self.addModule(self.guest_hal_tag,
                        basename,
                        extraHeader = extraHeader,
@@ -539,23 +557,29 @@
                        customAbsDir = self.guest_abs_hal_destination,
                        useNamespace = useNamespace)
 
-    def addHostModule(self, basename, extraHeader = "", extraImpl = "", useNamespace = True, implOnly = False):
+    def addHostModule(self, basename, extraHeader = "", extraImpl = "", useNamespace = True,
+                      implOnly = False, suppress = False):
+        if not os.path.exists(self.host_abs_decoder_destination):
+            print("Path [%s] not found (guest encoder path), skipping" % self.guest_abs_encoder_destination)
+            return
         self.addModule(self.host_tag,
                        basename,
                        extraHeader = extraHeader,
                        extraImpl = extraImpl,
                        customAbsDir = self.host_abs_decoder_destination,
                        useNamespace = useNamespace,
-                       implOnly = implOnly)
+                       implOnly = implOnly,
+                       suppress = suppress)
 
     def addModule(self, directory, basename,
                   extraHeader = "", extraImpl = "",
                   customAbsDir = None,
                   useNamespace = True,
-                  implOnly = False):
+                  implOnly = False,
+                  suppress = False):
         self.moduleList.append(basename)
         self.modules[basename] = \
-            cereal.Module(directory, basename, customAbsDir = customAbsDir, implOnly = implOnly)
+            cereal.Module(directory, basename, customAbsDir = customAbsDir, suppress = suppress, implOnly = implOnly)
         self.modules[basename].headerPreamble = copyrightHeader
         self.modules[basename].headerPreamble += \
                 autogeneratedHeaderTemplate % \
@@ -598,8 +622,11 @@
 """ % namespaceEnd
 
     def addWrapper(self, moduleType, moduleName, **kwargs):
-        self.wrappers.append( \
-            moduleType( \
+        if moduleName not in self.modules:
+            print(f'Unknown module: {moduleName}. All known modules are: {", ".join(self.modules)}.')
+            return
+        self.wrappers.append(
+            moduleType(
                 self.modules[moduleName],
                 self.typeInfo, **kwargs))
 
@@ -618,7 +645,7 @@
 
         if suppressEnabled:
             def enableSuppression(m):
-                m.suppress = True;
+                m.suppress = True
             self.forEachModule(enableSuppression)
             self.modules[suppressExceptModule].suppress = False
 
@@ -666,7 +693,7 @@
         self.forEachModule(lambda m: m.appendImpl("#endif\n"))
         self.forEachWrapper(lambda w: w.onEndFeature())
 
-    def genType(self, typeinfo, name, alias):
+    def genType(self, typeinfo: TypeInfo, name, alias):
         OutputGenerator.genType(self, typeinfo, name, alias)
         self.typeInfo.onGenType(typeinfo, name, alias)
         self.forEachWrapper(lambda w: w.onGenType(typeinfo, name, alias))
@@ -676,12 +703,12 @@
         self.typeInfo.onGenStruct(typeinfo, typeName, alias)
         self.forEachWrapper(lambda w: w.onGenStruct(typeinfo, typeName, alias))
 
-    def genGroup(self, groupinfo, groupName, alias = None):
+    def genGroup(self, groupinfo: GroupInfo, groupName, alias = None):
         OutputGenerator.genGroup(self, groupinfo, groupName, alias)
         self.typeInfo.onGenGroup(groupinfo, groupName, alias)
         self.forEachWrapper(lambda w: w.onGenGroup(groupinfo, groupName, alias))
 
-    def genEnum(self, enuminfo, name, alias):
+    def genEnum(self, enuminfo: EnumInfo, name, alias):
         OutputGenerator.genEnum(self, enuminfo, name, alias)
         self.typeInfo.onGenEnum(enuminfo, name, alias)
         self.forEachWrapper(lambda w: w.onGenEnum(enuminfo, name, alias))
diff --git a/registry/vulkan/xml/vk.xml b/registry/vulkan/xml/vk.xml
index 25344df..89d400f 100644
--- a/registry/vulkan/xml/vk.xml
+++ b/registry/vulkan/xml/vk.xml
@@ -1761,7 +1761,10 @@
             <member optional="true"><type>VkFramebufferCreateFlags</type>    <name>flags</name></member>
             <member><type>VkRenderPass</type>                           <name>renderPass</name></member>
             <member optional="true"><type>uint32_t</type>               <name>attachmentCount</name></member>
-            <member len="attachmentCount">const <type>VkImageView</type>*     <name>pAttachments</name></member>
+            <member len="attachmentCount"
+                filterVar="flags"
+                filterFunc="(eq (bitwise_and flags VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT) 0)">
+                const <type>VkImageView</type>*    <name>pAttachments</name></member>
             <member><type>uint32_t</type>               <name>width</name></member>
             <member><type>uint32_t</type>               <name>height</name></member>
             <member><type>uint32_t</type>               <name>layers</name></member>
diff --git a/scripts/print_gfx_logs/comand_printer_test.py b/scripts/print_gfx_logs/comand_printer_test.py
new file mode 100644
index 0000000..70f68e4
--- /dev/null
+++ b/scripts/print_gfx_logs/comand_printer_test.py
@@ -0,0 +1,771 @@
+import io
+
+import unittest
+from typing import Dict
+
+import opcodes
+from scripts.print_gfx_logs import command_printer
+
+reverse_opcodes: Dict[str, int] = {v: k for k, v in opcodes.opcodes.items()}
+
+
+class ComandPrinterOutputTestCase(unittest.TestCase):
+    """
+    Tests individual aspects of the command printer logic.
+    """
+
+    def get_printer(self, hex_data: str):
+        """Helper function to return the command printer"""
+        out = io.StringIO()
+        buf = bytes.fromhex(hex_data)
+        cmd_printer = command_printer.CommandPrinter(0, len(buf), buf, 0, 0, out)
+        return cmd_printer, out
+
+    def test_raises_if_not_all_bytes_decoded(self):
+        # Make a command printer with 5 bytes
+        cmd_printer, output = self.get_printer("01 02 03 04 05")
+        # Decode 4 of them
+        cmd_printer.write_int("foobar", size=4, indent=0)
+        self.assertRaises(BufferError, cmd_printer.check_no_more_bytes)
+
+    def test_decode_int(self):
+        cmd_printer, output = self.get_printer("02 00 00 00")
+        r = cmd_printer.write_int("foobar", size=4, indent=0)
+        cmd_printer.check_no_more_bytes()
+        self.assertEqual(r, 2)
+        self.assertEqual(output.getvalue(), "foobar: 2\n")
+
+    def test_decode_optional_int(self):
+        cmd_printer, output = self.get_printer("00 00 00 00 00 00 00 01 08")
+        r = cmd_printer.write_int("i", size=1, indent=0, optional=True)
+        cmd_printer.check_no_more_bytes()
+        self.assertEqual(r, 8)
+        self.assertEqual(output.getvalue(), "i: 8\n")
+
+    def test_decode_missing_int(self):
+        cmd_printer, output = self.get_printer("00 00 00 00 00 00 00 00")
+        r = cmd_printer.write_int("i", size=1, indent=0, optional=True)
+        cmd_printer.check_no_more_bytes()
+        self.assertEqual(r, None)
+        self.assertEqual(output.getvalue(), "i: (null)\n")
+
+    def test_decode_optional_repeated_int(self):
+        cmd_printer, output = self.get_printer("00 00 00 00 00 00 00 01 02 00 03 00")
+        cmd_printer.write_int("i", size=2, indent=0, optional=True, count=2)
+        cmd_printer.check_no_more_bytes()
+        self.assertEqual(output.getvalue(), "i: [0x2, 0x3]\n")
+
+    def test_decode_float(self):
+        cmd_printer, output = self.get_printer("00 00 00 3f")
+        cmd_printer.write_float("foo", indent=0)
+        cmd_printer.check_no_more_bytes()
+        self.assertEqual(output.getvalue(), "foo: 0.5\n")
+
+    def test_decode_repeated_float(self):
+        cmd_printer, output = self.get_printer("00 00 00 3f  00 00 80 3f")
+        cmd_printer.write_float("foo", indent=0, count=2)
+        cmd_printer.check_no_more_bytes()
+        self.assertEqual(output.getvalue(), "foo: [0.5, 1.0]\n")
+
+    def test_decode_null_terminated_string(self):
+        cmd_printer, output = self.get_printer("77 6f 72 6c 64 00")
+        cmd_printer.write_string("hello", indent=1, size=None)
+        cmd_printer.check_no_more_bytes()
+        self.assertEqual(output.getvalue(), '  hello: "world"\n')
+
+    def test_decode_fixed_size_string(self):
+        cmd_printer, output = self.get_printer("77 6f 72 6c 64 00 00 00")
+        cmd_printer.write_string("hello", indent=1, size=8)
+        cmd_printer.check_no_more_bytes()
+        self.assertEqual(output.getvalue(), '  hello: "world"\n')
+
+    def test_decode_enum(self):
+        enum = {1000156007: "FOOBAR"}
+        cmd_printer, output = self.get_printer("67 2B 9D 3B")
+        cmd_printer.write_enum("foo", enum, indent=0)
+        cmd_printer.check_no_more_bytes()
+        self.assertEqual(output.getvalue(), 'foo: FOOBAR (1000156007)\n')
+
+    def test_decode_unknown_enum(self):
+        cmd_printer, output = self.get_printer("67 2B 9D 3B")
+        cmd_printer.write_enum("foo", {}, indent=0)
+        cmd_printer.check_no_more_bytes()
+        self.assertEqual(output.getvalue(), 'foo:  (1000156007)\n')
+
+    def test_decode_flags(self):
+        enum = {1: "FOO", 2: "BAR", 4: "BAZ"}
+        cmd_printer, output = self.get_printer("03 00 00 00")
+        cmd_printer.write_flags("foo", enum, indent=0)
+        cmd_printer.check_no_more_bytes()
+        self.assertEqual(output.getvalue(), 'foo: FOO | BAR (0x3)\n')
+
+    def test_decode_unknown_flags(self):
+        enum = {1: "FOO", 2: "BAR", 4: "BAZ"}
+        cmd_printer, output = self.get_printer("0A 00 00 00")
+        cmd_printer.write_flags("foo", enum, indent=0)
+        cmd_printer.check_no_more_bytes()
+        self.assertEqual(output.getvalue(), 'foo: 0x8 | BAR (0xa)\n')
+
+    def test_decode_all_flags(self):
+        enum = {1: "FOO", 2: "BAR", 4: "BAZ"}
+        cmd_printer, output = self.get_printer("ff ff ff ff")
+        cmd_printer.write_flags("foo", enum, indent=0)
+        cmd_printer.check_no_more_bytes()
+        self.assertEqual(output.getvalue(), 'foo: (all flags) (0xffffffff)\n')
+
+
+class SuccessfullyDecodesCommandTestCase(unittest.TestCase):
+    """
+    This test suite checks that we're able to successfully decode each command (but doesn't check
+    the exact output.)
+    Each command that we pretty print should have at least one test here (unless the command takes
+    no arguments).
+
+    Please keep the test methods sorted in alphabetical order.
+    """
+
+    def run_test(self, opcode_str: str, cmd_data_hex: str):
+        opcode = reverse_opcodes[opcode_str]
+        cmd_data = bytes.fromhex(cmd_data_hex)
+        cmd_printer = command_printer.CommandPrinter(opcode, len(cmd_data), cmd_data, 0, 0)
+        cmd_printer.print_cmd()
+
+    def test_OP_vkAcquireImageANDROID(self):
+        self.run_test("OP_vkAcquireImageANDROID", """
+        e2 00 00 00 b8 08 00 00 02 00 03 00 e5 08 00 00
+        02 00 06 00 ff ff ff ff f3 08 00 00 02 00 17 00
+        00 00 00 00 00 00 00 00
+        """)
+
+    @unittest.skip("Needs support for struct extensions")
+    def test_OP_vkAllocateMemory(self):
+        self.run_test("OP_vkAllocateMemory", """
+        d7 01 00 00 02 00 00 00 02 00 03 00 05 00 00 00
+        00 00 00 18 e8 a9 a0 3b e8 a9 a0 3b 00 00 00 00
+        0d 00 00 00 00 90 7e 00 00 00 00 00 07 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        """)
+
+    def test_OP_vkBeginCommandBufferAsyncGOOGLE(self):
+        self.run_test("OP_vkBeginCommandBufferAsyncGOOGLE", """
+        2a 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00
+        00 00 00 00
+        """)
+
+    def test_OP_vkBindBufferMemory(self):
+        self.run_test("OP_vkBindBufferMemory", """
+        cc 00 00 00 b8 08 00 00 02 00 03 00 e3 08 00 00
+        03 00 05 00 e4 08 00 00 02 00 07 00 00 00 00 00
+        00 00 00 00
+        """)
+
+    def test_OP_vkBindImageMemory(self):
+        self.run_test("OP_vkBindImageMemory", """
+        de 00 00 00 b8 08 00 00 02 00 03 00 f1 08 00 00
+        02 00 06 00 f2 08 00 00 02 00 07 00 00 00 00 00
+        00 00 00 00
+        """)
+
+    def test_OP_vkCmdBeginRenderPass(self):
+        self.run_test("OP_vkCmdBeginRenderPass", """
+        2b 00 00 00 00 00 00 00 65 0a 00 00 02 00 11 00
+        e7 09 00 00 03 00 12 00 00 00 00 00 00 00 00 00
+        c4 01 00 00 80 00 00 00 02 00 00 00 00 00 79 bd
+        2d fe 70 70 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 80 3f 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00
+        """)
+
+    def test_OP_vkCmdBindDescriptorSets(self):
+        self.run_test("OP_vkCmdBindDescriptorSets", """
+        00 00 00 00 c8 09 00 00 03 00 13 00 01 00 00 00
+        01 00 00 00 41 09 00 00 03 00 0d 00 02 00 00 00
+        00 03 00 00 00 00 00 00
+        """)
+
+    def test_OP_vkCmdBindIndexBuffer(self):
+        self.run_test("OP_vkCmdBindIndexBuffer", """
+        a4 09 00 00 04 00 05 00 00 80 00 00 00 00 00 00
+        00 00 00 00
+        """)
+
+    def test_OP_vkCmdBindPipeline(self):
+        self.run_test("OP_vkCmdBindPipeline", """
+        00 00 00 00 ba 09 00 00 02 00 15 00
+        """)
+
+    def test_OP_vkCmdBindVertexBuffers(self):
+        self.run_test("OP_vkCmdBindVertexBuffers", """
+        00 00 00 00 03 00 00 00 a4 09 00 00 04 00 05 00
+        a4 09 00 00 04 00 05 00 a4 09 00 00 04 00 05 00
+        00 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00
+        0c 00 00 00 00 00 00 00
+        """)
+
+    def test_OP_vkCmdClearAttachments(self):
+        self.run_test("OP_vkCmdClearAttachments", """
+        01 00 00 00 06 00 00 00 00 00 00 00 00 00 80 3f
+        00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00
+        00 00 00 00 00 00 00 00 80 07 00 00 38 04 00 00
+        00 00 00 00 01 00 00 00
+        """)
+
+    def test_OP_vkCmdClearColorImage(self):
+        self.run_test("OP_vkCmdClearColorImage", """
+        e5 08 00 00 02 00 06 00 07 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00
+        01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00
+        01 00 00 00
+        """)
+
+    def test_OP_vkCmdCopyBufferToImage(self):
+        self.run_test("OP_vkCmdCopyBufferToImage", """
+        9f 09 00 00 02 00 05 00 a1 09 00 00 02 00 06 00
+        07 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00
+        40 0b 00 00 00 0a 00 00 01 00 00 00 00 00 00 00
+        00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 40 0b 00 00 00 0a 00 00 01 00 00 00
+        """)
+
+    def test_OP_vkCmdCopyImageToBuffer(self):
+        self.run_test("OP_vkCmdCopyImageToBuffer", """
+        99 09 00 00 09 00 06 00 06 00 00 00 98 09 00 00
+        07 00 05 00 01 00 00 00 00 00 00 00 00 00 00 00
+        20 00 00 00 20 00 00 00 01 00 00 00 00 00 00 00
+        00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 20 00 00 00 20 00 00 00 01 00 00 00
+        """)
+
+    def test_OP_vkCmdDraw(self):
+        self.run_test("OP_vkCmdDraw", """
+        06 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00
+        """)
+
+    def test_OP_vkCmdDrawIndexed(self):
+        self.run_test("OP_vkCmdDrawIndexed", """
+        6c 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00
+        """)
+
+    def test_OP_vkCmdPipelineBarrier(self):
+        self.run_test("OP_vkCmdPipelineBarrier", """
+        01 04 00 00 80 04 00 00 00 00 00 00 01 00 00 00
+        2e 00 00 00 00 00 00 00 00 01 00 00 a0 01 00 00
+        00 00 00 00 03 00 00 00 2d 00 00 00 00 00 00 00
+        00 01 00 00 20 00 00 00 02 00 00 00 05 00 00 00
+        00 00 00 00 00 00 00 00 d2 11 00 00 04 00 06 00
+        01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00
+        01 00 00 00 2d 00 00 00 00 00 00 00 00 01 00 00
+        20 00 00 00 02 00 00 00 05 00 00 00 00 00 00 00
+        00 00 00 00 ac 15 00 00 02 00 06 00 01 00 00 00
+        00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00
+        2d 00 00 00 00 00 00 00 00 01 00 00 20 00 00 00
+        02 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00
+        9d 16 00 00 02 00 06 00 01 00 00 00 00 00 00 00
+        01 00 00 00 00 00 00 00 01 00 00 00
+        """)
+
+    def test_OP_vkCmdSetScissor(self):
+        self.run_test("OP_vkCmdSetScissor", """
+        00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00
+        40 0b 00 00 00 0a 00 00
+        """)
+
+    def test_OP_vkCmdSetViewport(self):
+        self.run_test("OP_vkCmdSetViewport", """
+        00 00 00 00 01 00 00 00 00 00 00 00 00 00 20 45
+        00 00 34 45 00 00 20 c5 00 00 00 00 00 00 80 3f
+        """)
+
+    def test_OP_vkCollectDescriptorPoolIdsGOOGLE(self):
+        self.run_test("OP_vkCollectDescriptorPoolIdsGOOGLE", """
+        c5 00 00 00 b8 08 00 00 02 00 03 00 c1 08 00 00
+        02 00 0c 00 10 00 00 00 00 00 79 bc 3d fd b6 40
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        """)
+
+    def test_OP_vkCreateBufferWithRequirementsGOOGLE(self):
+        self.run_test("OP_vkCreateBufferWithRequirementsGOOGLE", """
+        2b 00 00 00 b8 08 00 00 02 00 03 00 0c 00 00 00
+        00 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00
+        03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00
+        """)
+
+    def test_OP_vkCreateDescriptorPool(self):
+        self.run_test("OP_vkCreateDescriptorPool", """
+        e1 00 00 00 b7 15 00 00 03 00 03 00 21 00 00 00
+        00 00 00 00 00 00 00 00 10 00 00 00 02 00 00 00
+        08 00 00 00 10 00 00 00 08 00 00 00 10 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        """)
+
+    def test_OP_vkCreateDescriptorSetLayout(self):
+        self.run_test("OP_vkCreateDescriptorSetLayout", """
+        c3 00 00 00 b8 08 00 00 02 00 03 00 20 00 00 00
+        00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00
+        08 00 00 00 01 00 00 00 3f 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00
+        """)
+
+    def test_OP_vkCreateFence(self):
+        self.run_test("OP_vkCreateFence", """
+        e3 00 00 00 b8 08 00 00 02 00 03 00 08 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00
+        """)
+
+    def test_OP_vkCreateFramebuffer(self):
+        self.run_test("OP_vkCreateFramebuffer", """
+        83 02 00 00 fb 08 00 00 02 00 03 00 25 00 00 00
+        00 00 00 00 00 00 00 00 65 0a 00 00 02 00 11 00
+        02 00 00 00 e8 09 00 00 03 00 09 00 e9 09 00 00
+        03 00 09 00 c4 01 00 00 80 00 00 00 01 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        """)
+
+    @unittest.skip("Needs support for stream features hasRasterization / hasTessellation")
+    def test_OP_vkCreateGraphicsPipelines(self):
+        self.run_test("OP_vkCreateGraphicsPipelines", """
+        3b 01 00 00 fb 08 00 00 02 00 03 00 02 09 00 00
+        02 00 14 00 01 00 00 00 00 00 00 01 00 00 00 00
+        1c 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00
+        12 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00
+        b7 09 00 00 02 00 0a 00 00 00 00 04 6d 61 69 6e
+        00 00 79 bd 2d fd a3 60 05 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 04 01 00 00 00
+        04 00 00 00 00 00 00 00 00 00 00 04 02 00 00 00
+        08 00 00 00 00 00 00 00 00 00 00 04 03 00 00 00
+        0c 00 00 00 00 00 00 00 00 00 00 04 04 00 00 00
+        10 00 00 00 00 00 00 00 00 00 00 04 00 00 00 00
+        00 00 00 14 00 00 00 00 00 00 00 00 00 00 80 3f
+        00 00 80 3f 00 00 00 00 12 00 00 00 00 00 00 00
+        00 00 00 00 10 00 00 00 b8 09 00 00 02 00 0a 00
+        00 00 00 04 6d 61 69 6e 00 00 79 bd 2d fd a3 f0
+        05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 04 01 00 00 00 04 00 00 00 00 00 00 00
+        00 00 00 04 02 00 00 00 08 00 00 00 00 00 00 00
+        00 00 00 04 03 00 00 00 0c 00 00 00 00 00 00 00
+        00 00 00 04 04 00 00 00 10 00 00 00 00 00 00 00
+        00 00 00 04 00 00 00 00 00 00 00 14 00 00 00 00
+        00 00 00 00 00 00 80 3f 00 00 80 3f 00 00 00 00
+        00 00 79 bd 2d fd a4 78 13 00 00 00 00 00 00 00
+        00 00 00 00 02 00 00 00 00 00 00 00 08 00 00 00
+        00 00 00 00 01 00 00 00 08 00 00 00 00 00 00 00
+        02 00 00 00 00 00 00 00 00 00 00 00 67 00 00 00
+        00 00 00 00 01 00 00 00 01 00 00 00 67 00 00 00
+        00 00 00 00 00 00 79 bd 2d fd a4 e0 14 00 00 00
+        00 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00
+        00 00 79 bd 2d fd a5 00 00 00 79 bd 2d fd a5 18
+        16 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00
+        00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00
+        00 00 00 00 00 00 79 bd 2d fd a5 48 17 00 00 00
+        00 00 00 20 b9 bd 9e 3b b9 bd 9e 3b 00 00 00 18
+        31 aa 9e 3b 31 aa 9e 3b 00 00 00 18 62 37 9b 3b
+        62 37 9b 3b 00 00 00 00 00 00 00 00 00 00 00 00
+        01 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 80 3f 00 00
+        79 bd 2d fd a5 d8 18 00 00 00 00 00 00 00 00 00
+        00 00 01 00 00 00 00 00 00 00 00 00 80 3f 00 00
+        79 bd 2d fd a6 08 ff ff ff ff 00 00 00 00 00 00
+        00 00 00 00 79 bd 2d fd a6 10 19 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 07 00 00 00 ff 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 07 00 00 00 ff 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 79 bd 2d fd
+        a6 78 1a 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 07 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 79 bb ee 02
+        ea 20 1b 00 00 00 00 00 00 00 00 00 00 00 02 00
+        00 00 00 00 00 00 01 00 00 00 6b 09 00 00 02 00
+        13 00 b9 09 00 00 03 00 11 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00
+        """)
+
+    def test_OP_vkCreateImageView(self):
+        self.run_test("OP_vkCreateImageView", """
+        3c 01 00 00 fb 08 00 00 02 00 03 00 0f 00 00 00
+        00 00 00 00 00 00 00 00 06 09 00 00 02 00 06 00
+        01 00 00 00 25 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00
+        01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00
+        """)
+
+    @unittest.skip("Needs support for struct extensions")
+    def test_OP_vkCreateImageWithRequirementsGOOGLE(self):
+        self.run_test("OP_vkCreateImageWithRequirementsGOOGLE", """
+        d0 00 00 00 b8 08 00 00 02 00 03 00 0e 00 00 00
+        00 00 00 38 10 f1 9a 3b 10 f1 9a 3b 00 00 00 00
+        00 00 79 bd 2d fd df e8 0d 00 00 00 80 07 00 00
+        01 00 00 00 33 0b 00 00 06 09 00 00 00 00 00 00
+        66 02 00 00 00 00 00 00 00 00 00 00 01 00 00 00
+        25 00 00 00 80 07 00 00 38 04 00 00 01 00 00 00
+        01 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00
+        97 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00
+        """)
+
+    def test_OP_vkCreatePipelineCache(self):
+        self.run_test("OP_vkCreatePipelineCache", """
+        38 01 00 00 fb 08 00 00 02 00 03 00 11 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        """)
+
+    def test_OP_vkCreateRenderPass(self):
+        self.run_test("OP_vkCreateRenderPass", """
+        3a 01 00 00 fb 08 00 00 02 00 03 00 26 00 00 00
+        00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00
+        25 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 02 00 00 00 02 00 00 00
+        01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        01 00 00 00 00 00 00 00 02 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00
+        """)
+
+    def test_OP_vkCreateSampler(self):
+        self.run_test("OP_vkCreateSampler", """
+        eb 00 00 00 b7 15 00 00 03 00 03 00 1f 00 00 00
+        00 00 00 00 00 00 00 00 01 00 00 00 01 00 00 00
+        00 00 00 00 02 00 00 00 02 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 80 3f 00 00 00 00
+        03 00 00 00 00 00 00 00 00 00 80 3e 01 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00
+        """)
+
+    def test_OP_vkCreateSemaphore(self):
+        self.run_test("OP_vkCreateSemaphore", """
+        d3 00 00 00 b8 08 00 00 02 00 03 00 09 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00
+        """)
+
+    def test_OP_vkDestroyBuffer(self):
+        self.run_test("OP_vkDestroyBuffer", """
+        2a 00 00 00 b8 08 00 00 02 00 03 00 c0 08 00 00
+        02 00 05 00 00 00 00 00 00 00 00 00
+        """)
+
+    def test_OP_vkDestroyCommandPool(self):
+        self.run_test("OP_vkDestroyCommandPool", """
+        fb 05 00 00 b1 0a 00 00 05 00 03 00 a3 0a 00 00
+        06 00 21 00 00 00 00 00 00 00 00 00
+        """)
+
+    def test_OP_vkDestroyDescriptorPool(self):
+        self.run_test("OP_vkDestroyDescriptorPool", """
+        8b 01 00 00 fb 08 00 00 02 00 03 00 44 09 00 00
+        02 00 0c 00 00 00 00 00 00 00 00 00
+        """)
+
+    def test_OP_vkDestroyDescriptorSetLayout(self):
+        self.run_test("OP_vkDestroyDescriptorSetLayout", """
+        a3 01 00 00 fb 08 00 00 02 00 03 00 69 09 00 00
+        02 00 0b 00 00 00 00 00 00 00 00 00
+        """)
+
+    def test_OP_vkDestroyDevice(self):
+        self.run_test("OP_vkDestroyDevice", """
+        00 06 00 00 b1 0a 00 00 05 00 03 00 00 00 00 00
+        00 00 00 00
+        """)
+
+    def test_OP_vkDestroyFence(self):
+        self.run_test("OP_vkDestroyFence", """
+        fc 05 00 00 b1 0a 00 00 05 00 03 00 b2 0a 00 00
+        05 00 16 00 00 00 00 00 00 00 00 00
+        """)
+
+    def test_OP_vkDestroyFramebuffer(self):
+        self.run_test("OP_vkDestroyFramebuffer", """
+        61 01 00 00 fb 08 00 00 02 00 03 00 bc 09 00 00
+        02 00 12 00 00 00 00 00 00 00 00 00
+        """)
+
+    def test_OP_vkDestroyImage(self):
+        self.run_test("OP_vkDestroyImage", """
+        ee 00 00 00 b8 08 00 00 02 00 03 00 f1 08 00 00
+        02 00 06 00 00 00 00 00 00 00 00 00
+        """)
+
+    def test_OP_vkDestroyImageView(self):
+        self.run_test("OP_vkDestroyImageView", """
+        60 01 00 00 fb 08 00 00 02 00 03 00 bb 09 00 00
+        02 00 09 00 00 00 00 00 00 00 00 00
+        """)
+
+    def test_OP_vkDestroyInstance(self):
+        self.run_test("OP_vkDestroyInstance", """
+        01 06 00 00 e7 08 00 00 07 00 01 00 00 00 00 00
+        00 00 00 00
+        """)
+
+    def test_OP_vkDestroyPipeline(self):
+        self.run_test("OP_vkDestroyPipeline", """
+        cd 05 00 00 b1 0a 00 00 05 00 03 00 8a 0a 00 00
+        05 00 15 00 00 00 00 00 00 00 00 00
+        """)
+
+    def test_OP_vkDestroyPipelineCache(self):
+        self.run_test("OP_vkDestroyPipelineCache", """
+        39 01 00 00 fb 08 00 00 02 00 03 00 b9 09 00 00
+        02 00 14 00 00 00 00 00 00 00 00 00
+        """)
+
+    def test_OP_vkDestroyPipelineLayout(self):
+        self.run_test("OP_vkDestroyPipelineLayout", """
+        a2 01 00 00 fb 08 00 00 02 00 03 00 6b 09 00 00
+        02 00 13 00 00 00 00 00 00 00 00 00
+        """)
+
+    def test_OP_vkDestroyRenderPass(self):
+        self.run_test("OP_vkDestroyRenderPass", """
+        9f 01 00 00 fb 08 00 00 02 00 03 00 c2 09 00 00
+        02 00 11 00 00 00 00 00 00 00 00 00
+        """)
+
+    def test_OP_vkDestroySemaphore(self):
+        self.run_test("OP_vkDestroySemaphore", """
+        f3 00 00 00 b8 08 00 00 02 00 03 00 f3 08 00 00
+        02 00 17 00 00 00 00 00 00 00 00 00
+        """)
+
+    def test_OP_vkDestroyShaderModule(self):
+        self.run_test("OP_vkDestroyShaderModule", """
+        7e 01 00 00 fb 08 00 00 02 00 03 00 b7 09 00 00
+        02 00 0a 00 00 00 00 00 00 00 00 00
+        """)
+
+    def test_OP_vkFreeCommandBuffers(self):
+        self.run_test("OP_vkFreeCommandBuffers", """
+        f9 05 00 00 b1 0a 00 00 05 00 03 00 a3 0a 00 00
+        06 00 21 00 01 00 00 00 00 00 79 bb dd fe 4a b0
+        ec 08 00 00 07 00 22 00
+        """)
+
+    def test_OP_vkFreeMemory(self):
+        self.run_test("OP_vkFreeMemory", """
+        ef 00 00 00 b8 08 00 00 02 00 03 00 f2 08 00 00
+        02 00 07 00 00 00 00 00 00 00 00 00
+        """)
+
+    def test_OP_vkFreeMemorySyncGOOGLE(self):
+        self.run_test("OP_vkFreeMemorySyncGOOGLE", """
+        ff 05 00 00 b1 0a 00 00 05 00 03 00 74 0a 00 00
+        06 00 07 00 00 00 00 00 00 00 00 00
+        """)
+
+    def test_OP_vkGetFenceStatus(self):
+        self.run_test("OP_vkGetFenceStatus", """
+        e6 00 00 00 b8 08 00 00 02 00 03 00 f6 08 00 00
+        02 00 16 00
+        """)
+
+    def test_OP_vkGetMemoryHostAddressInfoGOOGLE(self):
+        self.run_test("OP_vkGetMemoryHostAddressInfoGOOGLE", """
+        01 01 00 00 5a 0c 00 00 05 00 03 00 5a 11 00 00
+        02 00 07 00 00 00 00 00 bd d3 07 f0 00 00 00 00
+        00 00 00 00 00 00 00 00 bd d3 07 f8 00 00 00 00
+        00 00 00 00 00 00 00 00 bd d3 08 00 00 00 00 00
+        00 00 00 00
+        """)
+
+    def test_OP_vkGetPhysicalDeviceFormatProperties(self):
+        self.run_test("OP_vkGetPhysicalDeviceFormatProperties", """
+        2f 00 00 00 b7 08 00 00 02 00 02 00 7c 00 00 00
+        00 00 00 00 00 00 00 00 ff ff ff ff
+        """)
+
+    def test_OP_vkGetPhysicalDeviceProperties2KHR(self):
+        self.run_test("OP_vkGetPhysicalDeviceProperties2KHR", """
+        cd 00 00 00 b7 08 00 00 02 00 02 00 79 b0 9b 3b
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00
+        """)
+
+    def test_OP_vkGetSwapchainGrallocUsageANDROID(self):
+        self.run_test("OP_vkGetSwapchainGrallocUsageANDROID", """
+        cf 00 00 00 b8 08 00 00 02 00 03 00 25 00 00 00
+        97 00 00 00 00 00 00 00
+        """)
+
+    def test_OP_vkQueueCommitDescriptorSetUpdatesGOOGLE(self):
+        self.run_test("OP_vkQueueCommitDescriptorSetUpdatesGOOGLE", """
+        bd 02 00 00 04 00 00 00 02 00 04 00 04 00 00 00
+        0b 00 00 00 02 00 0c 00 79 01 00 00 02 00 0c 00
+        de 00 00 00 02 00 0c 00 8a 01 00 00 02 00 0c 00
+        07 00 00 00 0a 00 00 00 05 00 0b 00 31 00 00 00
+        02 00 0b 00 31 00 00 00 02 00 0b 00 44 01 00 00
+        02 00 0b 00 44 01 00 00 02 00 0b 00 44 01 00 00
+        02 00 0b 00 44 01 00 00 02 00 0b 00 1b 00 00 00
+        02 00 0d 00 89 01 00 00 02 00 0d 00 ee 00 00 00
+        02 00 0d 00 9a 01 00 00 02 00 0d 00 98 01 00 00
+        02 00 0d 00 99 01 00 00 02 00 0d 00 97 01 00 00
+        02 00 0d 00 00 00 00 00 01 00 00 00 02 00 00 00
+        03 00 00 00 03 00 00 00 03 00 00 00 03 00 00 00
+        01 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00
+        01 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00
+        01 00 00 00 03 00 00 00 05 00 00 00 06 00 00 00
+        07 00 00 00 08 00 00 00 09 00 00 00 23 00 00 00
+        00 00 00 00 1b 00 00 00 02 00 0d 00 00 00 00 00
+        00 00 00 00 01 00 00 00 08 00 00 00 00 00 00 00
+        00 00 00 00 00 00 74 3c ce b3 aa 50 bd 16 00 00
+        03 00 05 00 00 00 00 00 00 00 00 00 50 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 23 00 00 00
+        00 00 00 00 89 01 00 00 02 00 0d 00 00 00 00 00
+        00 00 00 00 01 00 00 00 08 00 00 00 00 00 00 00
+        00 00 00 00 00 00 74 3c ce b3 aa 68 a8 16 00 00
+        03 00 05 00 00 00 00 00 00 00 00 00 00 01 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 23 00 00 00
+        00 00 00 00 89 01 00 00 02 00 0d 00 01 00 00 00
+        00 00 00 00 01 00 00 00 08 00 00 00 00 00 00 00
+        00 00 00 00 00 00 74 3c ce b3 aa 80 2d 00 00 00
+        03 00 05 00 00 00 00 00 00 00 00 00 10 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 23 00 00 00
+        00 00 00 00 ee 00 00 00 02 00 0d 00 00 00 00 00
+        00 00 00 00 01 00 00 00 08 00 00 00 00 00 00 00
+        00 00 00 00 00 00 74 3c ce b3 aa 98 a8 16 00 00
+        03 00 05 00 00 00 00 00 00 00 00 00 00 01 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 23 00 00 00
+        00 00 00 00 ee 00 00 00 02 00 0d 00 01 00 00 00
+        00 00 00 00 01 00 00 00 08 00 00 00 00 00 00 00
+        00 00 00 00 00 00 74 3c ce b3 aa b0 a8 16 00 00
+        03 00 05 00 00 00 00 00 00 00 00 00 00 01 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 23 00 00 00
+        00 00 00 00 9a 01 00 00 02 00 0d 00 00 00 00 00
+        00 00 00 00 01 00 00 00 01 00 00 00 00 00 74 3c
+        ce b3 aa c8 c1 16 00 00 02 00 0e 00 be 16 00 00
+        02 00 09 00 05 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 23 00 00 00 00 00 00 00
+        98 01 00 00 02 00 0d 00 00 00 00 00 00 00 00 00
+        01 00 00 00 01 00 00 00 00 00 74 3c ce b3 aa e0
+        c1 16 00 00 02 00 0e 00 c9 16 00 00 02 00 09 00
+        05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        00 00 00 00 23 00 00 00 00 00 00 00 99 01 00 00
+        02 00 0d 00 00 00 00 00 00 00 00 00 01 00 00 00
+        01 00 00 00 00 00 74 3c ce b3 aa f8 c8 16 00 00
+        02 00 0e 00 c6 16 00 00 02 00 09 00 05 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+        23 00 00 00 00 00 00 00 97 01 00 00 02 00 0d 00
+        00 00 00 00 00 00 00 00 01 00 00 00 01 00 00 00
+        00 00 74 3c ce b3 ab 10 c1 16 00 00 02 00 0e 00
+        cc 16 00 00 02 00 09 00 05 00 00 00 00 00 00 00
+        00 00 00 00 00 00 00 00 00 00 00 00
+        """)
+
+    def test_OP_vkQueueFlushCommandsGOOGLE(self):
+        self.run_test("OP_vkQueueFlushCommandsGOOGLE", """
+        e4 00 00 00 b9 08 00 00 02 00 04 00 be 08 00 00
+        02 00 22 00 18 01 00 00 00 00 00 00
+        """)
+
+    def test_OP_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE(self):
+        self.run_test("OP_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE", """
+        e7 00 00 00 b9 08 00 00 02 00 04 00 01 00 00 00
+        00 00 79 bd 0d fe c9 20 e8 08 00 00 02 00 17 00
+        e5 08 00 00 02 00 06 00
+        """)
+
+    def test_OP_vkQueueSubmitAsyncGOOGLE(self):
+        self.run_test("OP_vkQueueSubmitAsyncGOOGLE", """
+        c0 02 00 00 04 00 00 00 02 00 04 00 01 00 00 00
+        04 00 00 00 00 00 00 00 03 00 00 00 c0 16 00 00
+        02 00 17 00 cb 16 00 00 02 00 17 00 ce 16 00 00
+        02 00 17 00 00 00 01 00 00 00 01 00 00 00 01 00
+        01 00 00 00 08 00 00 00 02 00 22 00 00 00 00 00
+        d1 16 00 00 02 00 16 00
+        """)
+
+    def test_OP_vkQueueWaitIdle(self):
+        self.run_test("OP_vkQueueWaitIdle", """
+        f3 05 00 00 8f 09 00 00 06 00 04 00
+        """)
+
+    def test_OP_vkResetFences(self):
+        self.run_test("OP_vkResetFences", """
+        4f 01 00 00 fb 08 00 00 02 00 03 00 01 00 00 00
+        c3 09 00 00 02 00 16 00
+        """)
+
+    def test_OP_vkWaitForFences(self):
+        self.run_test("OP_vkWaitForFences", """
+        ed 00 00 00 b8 08 00 00 02 00 03 00 01 00 00 00
+        03 09 00 00 05 00 16 00 01 00 00 00 00 b0 8e f0
+        1b 00 00 00
+        """)
+
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/scripts/print_gfx_logs/command_printer.py b/scripts/print_gfx_logs/command_printer.py
new file mode 100644
index 0000000..4c76cb2
--- /dev/null
+++ b/scripts/print_gfx_logs/command_printer.py
@@ -0,0 +1,219 @@
+import io
+import sys
+import textwrap
+from typing import Dict, Optional
+import vulkan_printer
+import opcodes
+import struct
+
+
+class CommandPrinter:
+    """This class is responsible for printing the commands found in the minidump file to the terminal."""
+
+    def __init__(self, opcode: int, original_size: int, data: bytes, stream_idx: int, cmd_idx: int,
+                 out=sys.stdout):
+        self.opcode = opcode
+        self.original_size = original_size
+        self.data = io.BytesIO(data)
+        self.stream_idx = stream_idx
+        self.cmd_idx = cmd_idx
+        self.out = out
+
+    def print_cmd(self):
+        """
+        Tries to decode and pretty print the command to the terminal.
+        Falls back to printing hex data if the command doesn't have a printer.
+        """
+
+        # Print out the command name
+        print("\n{}.{} - {}: ({} bytes)".format(self.stream_idx, self.cmd_idx, self.cmd_name(),
+                                                self.original_size - 8), file=self.out)
+
+        if len(self.data.getbuffer()) == 0:
+            return
+
+        pretty_printer = getattr(vulkan_printer, self.cmd_name(), None)
+        if not pretty_printer:
+            self.print_raw()
+            return
+
+        try:
+            pretty_printer(self, indent=4)
+            self.check_no_more_bytes()
+        except Exception as ex:
+            print("Error while processing {}: {}".format(self.cmd_name(), repr(ex)), file=self.out)
+            print("Command raw data:", file=self.out)
+            self.print_raw()
+            raise ex
+
+    def check_no_more_bytes(self):
+        """
+        Checks that we processed all the bytes, otherwise there's probably a bug in the decoding
+        logic
+        """
+        if self.data.tell() != len(self.data.getbuffer()):
+            raise BufferError(
+                "Not all data was decoded. Decoded {} bytes but command had {}".format(
+                    self.data.tell(), len(self.data.getbuffer())))
+
+    def cmd_name(self) -> str:
+        """Returns the command name (e.g.: "OP_vkBeginCommandBuffer", or the opcode as a string if unknown"""
+        return opcodes.opcodes.get(self.opcode, str(self.opcode))
+
+    def print_raw(self):
+        """Prints the command data as a hex bytes, as a fallback if we don't know how to decode it"""
+        truncated = self.original_size > len(self.data.getbuffer()) + 8
+        indent = 8
+        hex = ' '.join(["{:02x}".format(x) for x in self.data.getbuffer()])
+        if truncated:
+            hex += " [...]"
+        lines = textwrap.wrap(hex, width=16 * 3 + indent, initial_indent=' ' * indent,
+                              subsequent_indent=' ' * indent)
+        for l in lines:
+            print(l, file=self.out)
+
+    def read_bytes(self, size: int):
+        buf = self.data.read(size)
+        if len(buf) != size:
+            raise EOFError("Unexpectedly reached the end of the buffer")
+        return buf
+
+    def read_int(self, size: int, signed: bool = False, big_endian: bool = False) -> int:
+        assert size in [1, 2, 4, 8], "Invalid size to read: " + str(size)
+        buf = self.read_bytes(size)
+        byte_order = 'big' if big_endian else 'little'
+        return int.from_bytes(buf, byteorder=byte_order, signed=signed)
+
+    def read_float(self) -> float:
+        buf = self.read_bytes(4)
+        return struct.unpack('f', buf)[0]
+
+    def write(self, msg: str, indent: int):
+        """Prints a string at a given indentation level"""
+        assert type(msg) == str
+        assert type(indent) == int and indent >= 0
+        print("  " * indent + msg, end='', file=self.out)
+
+    def write_int(self,
+                  field_name: str,
+                  size: int,
+                  indent: int,
+                  signed: bool = False,
+                  big_endian: bool = False,
+                  optional: bool = False,
+                  count: Optional[int] = None) -> Optional[int]:
+        """
+        Reads and prints integers from the data stream.
+
+        When reading a single int (ie: when count=None), returns the int that was read, otherwise
+        returns None.
+
+        size: size of the integer in bytes
+        indent: indentation level that we should write at
+        signed: whether to treat it as a signed or unsigned int
+        big_endian: whether to treat it as little endian or big endian
+        optional: if True, we will first read an 8 byte boolean value. If that value is false, we
+        will return without further reading.
+        count: how many integers to read, for repeated values.
+        """
+        if optional and self.check_null(field_name, indent):
+            return
+
+        # Write the field name
+        self.write("{name}: ".format(name=field_name), indent)
+
+        if count is not None:
+            values = ["0x{:x}".format(self.read_int(size, signed, big_endian)) for i in
+                      range(0, count)]
+            self.write("[{}]\n".format(", ".join(values)), indent=0)
+        else:
+            value = self.read_int(size, signed, big_endian)
+            # Print small values as decimal only, otherwise hex + decimal
+            format_str = ("{val}\n" if value < 10 else "0x{val:x} ({val})\n")
+            self.write(format_str.format(val=value), indent=0)
+            return value
+
+    def write_float(self, field_name: str, indent: int, count: Optional[int] = None):
+        if count is not None:
+            values = [str(self.read_float()) for i in range(0, count)]
+            self.write("{}: [{}]\n".format(field_name, ", ".join(values)), indent)
+        else:
+            self.write("{}: {}\n".format(field_name, self.read_float()), indent)
+
+    def write_enum(self, field_name: str, enum: Dict[int, str], indent: int) -> int:
+        """Reads the next 32-byte int from the data stream, prints it as an enum, and return it"""
+        value = self.read_int(4)
+        self.write("{}: {} ({})\n".format(field_name, enum.get(value, ""), value), indent)
+        return value
+
+    def write_flags(self, field_name: str, enum: Dict[int, str], indent: int):
+        """Reads and prints Vulkan flags (byte masks)"""
+        remaining_flags = flags = self.read_int(4)
+        flags_list = []
+        if remaining_flags == 0xffffffff:
+            # When the value is set to all flags, don't bother listing them all
+            flags_list.append("(all flags)")
+        else:
+            for (value, flag) in enum.items():
+                if value & remaining_flags:
+                    remaining_flags ^= value
+                    flags_list.append(flag)
+            if remaining_flags != 0:
+                flags_list.insert(0, "0x{:x}".format(remaining_flags))
+        self.write("{}: {} (0x{:x})\n".format(field_name, " | ".join(flags_list), flags), indent)
+
+    def write_stype_and_pnext(self, expected_stype: str, indent: int):
+        """Reads and prints the sType and pNext fields found in many Vulkan structs, while also sanity checking them"""
+        stype = self.write_enum("sType", vulkan_printer.VkStructureType, indent)
+        stype_str = vulkan_printer.VkStructureType.get(stype)
+        if stype_str != expected_stype:
+            raise ValueError("Wrong structure type. Expected: {}, got {} ({}) instead".format(
+                expected_stype, stype, stype_str))
+
+        pnext_size = self.write_int("pNext_size", 4, indent, big_endian=True)
+        if pnext_size != 0:
+            self.write_enum("ext type", vulkan_printer.VkStructureType, indent + 1)
+            raise NotImplementedError("Decoding structs with extensions is not supported")
+
+    def check_null(self, field_name: str, indent) -> bool:
+        is_null = self.read_int(8, big_endian=True) == 0
+        if is_null:
+            self.write("{}: (null)\n".format(field_name), indent)
+        return is_null
+
+    def write_struct(self, field_name: str, struct_fn, optional: bool, count: Optional[int],
+                     indent: int):
+        """
+        Reads and prints a struct, calling `struct_fn` to pretty-print it
+        optional: whether this is an optional structure. In this case, we will read an int64 first
+                  and skip the struct if the result is null.
+        count: how many times this is repeated. Pass None for non-repeated fields.
+        """
+        if optional and self.check_null(field_name, indent):
+            return
+
+        is_repeated = count is not None
+        for i in range(0, count if is_repeated else 1):
+            suffix = " #{}".format(i) if is_repeated else ""
+            self.write("{}{}:\n".format(field_name, suffix), indent)
+            struct_fn(self, indent + 1)
+
+    def write_string(self, field_name: str, size: Optional[int], indent: int):
+        """
+        Reads a null-terminated string from the stream.
+        size: if specified, reads up to this many characters
+        """
+        buf = bytearray()
+        if size is not None:
+            buf = self.read_bytes(size)
+            buf = buf.rstrip(b'\x00')
+        else:
+            # Reads from the string one char at a time, until we find a null
+            # Not the most efficient way of doing this, but whatever
+            while True:
+                c = self.read_int(1)
+                if c == 0:
+                    break
+                buf.append(c)
+
+        self.write("{}: \"{}\"\n".format(field_name, buf.decode('utf-8')), indent)
diff --git a/scripts/print_gfx_logs/opcodes.py b/scripts/print_gfx_logs/opcodes.py
new file mode 100644
index 0000000..6543a63
--- /dev/null
+++ b/scripts/print_gfx_logs/opcodes.py
@@ -0,0 +1,1295 @@
+"""
+gfxstream opcodes
+
+This is a map of all gfxstream opcodes back to their string names.
+
+Currently, this was manually generated from the following files:
+
+Vulkan:        http://source/play-internal/battlestar/aosp/device/generic/vulkan-cereal/stream-servers/vulkan/cereal/common/goldfish_vk_marshaling.h
+RenderControl: http://source/play-internal/battlestar/aosp/device/generic/vulkan-cereal/stream-servers/renderControl_dec/renderControl_opcodes.h
+GLES1:         http://source/android/device/generic/vulkan-cereal/stream-servers/gles1_dec/gles1_opcodes.h
+GLES2:         http://source/android/device/generic/vulkan-cereal/stream-servers/gles2_dec/gles2_opcodes.h
+
+TODO(gregschlom): Consider auto-generating this file in the future.
+"""
+
+opcodes = {
+    ###############################################################################################
+    # Vulkan opcodes
+    # http://source/play-internal/battlestar/aosp/device/generic/vulkan-cereal/stream-servers/vulkan/cereal/common/goldfish_vk_marshaling.h
+    ###############################################################################################
+    20000: "OP_vkCreateInstance",
+    20001: "OP_vkDestroyInstance",
+    20002: "OP_vkEnumeratePhysicalDevices",
+    20003: "OP_vkGetPhysicalDeviceFeatures",
+    20004: "OP_vkGetPhysicalDeviceFormatProperties",
+    20005: "OP_vkGetPhysicalDeviceImageFormatProperties",
+    20006: "OP_vkGetPhysicalDeviceProperties",
+    20007: "OP_vkGetPhysicalDeviceQueueFamilyProperties",
+    20008: "OP_vkGetPhysicalDeviceMemoryProperties",
+    20009: "OP_vkGetInstanceProcAddr",
+    20010: "OP_vkGetDeviceProcAddr",
+    20011: "OP_vkCreateDevice",
+    20012: "OP_vkDestroyDevice",
+    20013: "OP_vkEnumerateInstanceExtensionProperties",
+    20014: "OP_vkEnumerateDeviceExtensionProperties",
+    20015: "OP_vkEnumerateInstanceLayerProperties",
+    20016: "OP_vkEnumerateDeviceLayerProperties",
+    20017: "OP_vkGetDeviceQueue",
+    20018: "OP_vkQueueSubmit",
+    20019: "OP_vkQueueWaitIdle",
+    20020: "OP_vkDeviceWaitIdle",
+    20021: "OP_vkAllocateMemory",
+    20022: "OP_vkFreeMemory",
+    20023: "OP_vkMapMemory",
+    20024: "OP_vkUnmapMemory",
+    20025: "OP_vkFlushMappedMemoryRanges",
+    20026: "OP_vkInvalidateMappedMemoryRanges",
+    20027: "OP_vkGetDeviceMemoryCommitment",
+    20028: "OP_vkBindBufferMemory",
+    20029: "OP_vkBindImageMemory",
+    20030: "OP_vkGetBufferMemoryRequirements",
+    20031: "OP_vkGetImageMemoryRequirements",
+    20032: "OP_vkGetImageSparseMemoryRequirements",
+    20033: "OP_vkGetPhysicalDeviceSparseImageFormatProperties",
+    20034: "OP_vkQueueBindSparse",
+    20035: "OP_vkCreateFence",
+    20036: "OP_vkDestroyFence",
+    20037: "OP_vkResetFences",
+    20038: "OP_vkGetFenceStatus",
+    20039: "OP_vkWaitForFences",
+    20040: "OP_vkCreateSemaphore",
+    20041: "OP_vkDestroySemaphore",
+    20042: "OP_vkCreateEvent",
+    20043: "OP_vkDestroyEvent",
+    20044: "OP_vkGetEventStatus",
+    20045: "OP_vkSetEvent",
+    20046: "OP_vkResetEvent",
+    20047: "OP_vkCreateQueryPool",
+    20048: "OP_vkDestroyQueryPool",
+    20049: "OP_vkGetQueryPoolResults",
+    20050: "OP_vkCreateBuffer",
+    20051: "OP_vkDestroyBuffer",
+    20052: "OP_vkCreateBufferView",
+    20053: "OP_vkDestroyBufferView",
+    20054: "OP_vkCreateImage",
+    20055: "OP_vkDestroyImage",
+    20056: "OP_vkGetImageSubresourceLayout",
+    20057: "OP_vkCreateImageView",
+    20058: "OP_vkDestroyImageView",
+    20059: "OP_vkCreateShaderModule",
+    20060: "OP_vkDestroyShaderModule",
+    20061: "OP_vkCreatePipelineCache",
+    20062: "OP_vkDestroyPipelineCache",
+    20063: "OP_vkGetPipelineCacheData",
+    20064: "OP_vkMergePipelineCaches",
+    20065: "OP_vkCreateGraphicsPipelines",
+    20066: "OP_vkCreateComputePipelines",
+    20067: "OP_vkDestroyPipeline",
+    20068: "OP_vkCreatePipelineLayout",
+    20069: "OP_vkDestroyPipelineLayout",
+    20070: "OP_vkCreateSampler",
+    20071: "OP_vkDestroySampler",
+    20072: "OP_vkCreateDescriptorSetLayout",
+    20073: "OP_vkDestroyDescriptorSetLayout",
+    20074: "OP_vkCreateDescriptorPool",
+    20075: "OP_vkDestroyDescriptorPool",
+    20076: "OP_vkResetDescriptorPool",
+    20077: "OP_vkAllocateDescriptorSets",
+    20078: "OP_vkFreeDescriptorSets",
+    20079: "OP_vkUpdateDescriptorSets",
+    20080: "OP_vkCreateFramebuffer",
+    20081: "OP_vkDestroyFramebuffer",
+    20082: "OP_vkCreateRenderPass",
+    20083: "OP_vkDestroyRenderPass",
+    20084: "OP_vkGetRenderAreaGranularity",
+    20085: "OP_vkCreateCommandPool",
+    20086: "OP_vkDestroyCommandPool",
+    20087: "OP_vkResetCommandPool",
+    20088: "OP_vkAllocateCommandBuffers",
+    20089: "OP_vkFreeCommandBuffers",
+    20090: "OP_vkBeginCommandBuffer",
+    20091: "OP_vkEndCommandBuffer",
+    20092: "OP_vkResetCommandBuffer",
+    20093: "OP_vkCmdBindPipeline",
+    20094: "OP_vkCmdSetViewport",
+    20095: "OP_vkCmdSetScissor",
+    20096: "OP_vkCmdSetLineWidth",
+    20097: "OP_vkCmdSetDepthBias",
+    20098: "OP_vkCmdSetBlendConstants",
+    20099: "OP_vkCmdSetDepthBounds",
+    20100: "OP_vkCmdSetStencilCompareMask",
+    20101: "OP_vkCmdSetStencilWriteMask",
+    20102: "OP_vkCmdSetStencilReference",
+    20103: "OP_vkCmdBindDescriptorSets",
+    20104: "OP_vkCmdBindIndexBuffer",
+    20105: "OP_vkCmdBindVertexBuffers",
+    20106: "OP_vkCmdDraw",
+    20107: "OP_vkCmdDrawIndexed",
+    20108: "OP_vkCmdDrawIndirect",
+    20109: "OP_vkCmdDrawIndexedIndirect",
+    20110: "OP_vkCmdDispatch",
+    20111: "OP_vkCmdDispatchIndirect",
+    20112: "OP_vkCmdCopyBuffer",
+    20113: "OP_vkCmdCopyImage",
+    20114: "OP_vkCmdBlitImage",
+    20115: "OP_vkCmdCopyBufferToImage",
+    20116: "OP_vkCmdCopyImageToBuffer",
+    20117: "OP_vkCmdUpdateBuffer",
+    20118: "OP_vkCmdFillBuffer",
+    20119: "OP_vkCmdClearColorImage",
+    20120: "OP_vkCmdClearDepthStencilImage",
+    20121: "OP_vkCmdClearAttachments",
+    20122: "OP_vkCmdResolveImage",
+    20123: "OP_vkCmdSetEvent",
+    20124: "OP_vkCmdResetEvent",
+    20125: "OP_vkCmdWaitEvents",
+    20126: "OP_vkCmdPipelineBarrier",
+    20127: "OP_vkCmdBeginQuery",
+    20128: "OP_vkCmdEndQuery",
+    20129: "OP_vkCmdResetQueryPool",
+    20130: "OP_vkCmdWriteTimestamp",
+    20131: "OP_vkCmdCopyQueryPoolResults",
+    20132: "OP_vkCmdPushConstants",
+    20133: "OP_vkCmdBeginRenderPass",
+    20134: "OP_vkCmdNextSubpass",
+    20135: "OP_vkCmdEndRenderPass",
+    20136: "OP_vkCmdExecuteCommands",
+    20137: "OP_vkEnumerateInstanceVersion",
+    20138: "OP_vkBindBufferMemory2",
+    20139: "OP_vkBindImageMemory2",
+    20140: "OP_vkGetDeviceGroupPeerMemoryFeatures",
+    20141: "OP_vkCmdSetDeviceMask",
+    20142: "OP_vkCmdDispatchBase",
+    20143: "OP_vkEnumeratePhysicalDeviceGroups",
+    20144: "OP_vkGetImageMemoryRequirements2",
+    20145: "OP_vkGetBufferMemoryRequirements2",
+    20146: "OP_vkGetImageSparseMemoryRequirements2",
+    20147: "OP_vkGetPhysicalDeviceFeatures2",
+    20148: "OP_vkGetPhysicalDeviceProperties2",
+    20149: "OP_vkGetPhysicalDeviceFormatProperties2",
+    20150: "OP_vkGetPhysicalDeviceImageFormatProperties2",
+    20151: "OP_vkGetPhysicalDeviceQueueFamilyProperties2",
+    20152: "OP_vkGetPhysicalDeviceMemoryProperties2",
+    20153: "OP_vkGetPhysicalDeviceSparseImageFormatProperties2",
+    20154: "OP_vkTrimCommandPool",
+    20155: "OP_vkGetDeviceQueue2",
+    20156: "OP_vkCreateSamplerYcbcrConversion",
+    20157: "OP_vkDestroySamplerYcbcrConversion",
+    20158: "OP_vkCreateDescriptorUpdateTemplate",
+    20159: "OP_vkDestroyDescriptorUpdateTemplate",
+    20160: "OP_vkUpdateDescriptorSetWithTemplate",
+    20161: "OP_vkGetPhysicalDeviceExternalBufferProperties",
+    20162: "OP_vkGetPhysicalDeviceExternalFenceProperties",
+    20163: "OP_vkGetPhysicalDeviceExternalSemaphoreProperties",
+    20164: "OP_vkGetDescriptorSetLayoutSupport",
+    282774587: "OP_vkCmdDrawIndirectCount",
+    245204359: "OP_vkCmdDrawIndexedIndirectCount",
+    279590827: "OP_vkCreateRenderPass2",
+    235222847: "OP_vkCmdBeginRenderPass2",
+    244873750: "OP_vkCmdNextSubpass2",
+    221297834: "OP_vkCmdEndRenderPass2",
+    252097672: "OP_vkResetQueryPool",
+    267066974: "OP_vkGetSemaphoreCounterValue",
+    224777382: "OP_vkWaitSemaphores",
+    271024127: "OP_vkSignalSemaphore",
+    222632266: "OP_vkGetBufferDeviceAddress",
+    230188231: "OP_vkGetBufferOpaqueCaptureAddress",
+    260620079: "OP_vkGetDeviceMemoryOpaqueCaptureAddress",
+    20165: "OP_vkDestroySurfaceKHR",
+    20166: "OP_vkGetPhysicalDeviceSurfaceSupportKHR",
+    20167: "OP_vkGetPhysicalDeviceSurfaceCapabilitiesKHR",
+    20168: "OP_vkGetPhysicalDeviceSurfaceFormatsKHR",
+    20169: "OP_vkGetPhysicalDeviceSurfacePresentModesKHR",
+    20170: "OP_vkCreateSwapchainKHR",
+    20171: "OP_vkDestroySwapchainKHR",
+    20172: "OP_vkGetSwapchainImagesKHR",
+    20173: "OP_vkAcquireNextImageKHR",
+    20174: "OP_vkQueuePresentKHR",
+    20175: "OP_vkGetDeviceGroupPresentCapabilitiesKHR",
+    20176: "OP_vkGetDeviceGroupSurfacePresentModesKHR",
+    20177: "OP_vkGetPhysicalDevicePresentRectanglesKHR",
+    20178: "OP_vkAcquireNextImage2KHR",
+    20179: "OP_vkGetPhysicalDeviceDisplayPropertiesKHR",
+    20180: "OP_vkGetPhysicalDeviceDisplayPlanePropertiesKHR",
+    20181: "OP_vkGetDisplayPlaneSupportedDisplaysKHR",
+    20182: "OP_vkGetDisplayModePropertiesKHR",
+    20183: "OP_vkCreateDisplayModeKHR",
+    20184: "OP_vkGetDisplayPlaneCapabilitiesKHR",
+    20185: "OP_vkCreateDisplayPlaneSurfaceKHR",
+    20186: "OP_vkCreateSharedSwapchainsKHR",
+    20187: "OP_vkCreateXlibSurfaceKHR",
+    20188: "OP_vkGetPhysicalDeviceXlibPresentationSupportKHR",
+    20189: "OP_vkCreateXcbSurfaceKHR",
+    20190: "OP_vkGetPhysicalDeviceXcbPresentationSupportKHR",
+    20191: "OP_vkCreateWaylandSurfaceKHR",
+    20192: "OP_vkGetPhysicalDeviceWaylandPresentationSupportKHR",
+    20195: "OP_vkCreateAndroidSurfaceKHR",
+    20196: "OP_vkCreateWin32SurfaceKHR",
+    20197: "OP_vkGetPhysicalDeviceWin32PresentationSupportKHR",
+    20198: "OP_vkGetPhysicalDeviceFeatures2KHR",
+    20199: "OP_vkGetPhysicalDeviceProperties2KHR",
+    20200: "OP_vkGetPhysicalDeviceFormatProperties2KHR",
+    20201: "OP_vkGetPhysicalDeviceImageFormatProperties2KHR",
+    20202: "OP_vkGetPhysicalDeviceQueueFamilyProperties2KHR",
+    20203: "OP_vkGetPhysicalDeviceMemoryProperties2KHR",
+    20204: "OP_vkGetPhysicalDeviceSparseImageFormatProperties2KHR",
+    20205: "OP_vkGetDeviceGroupPeerMemoryFeaturesKHR",
+    20206: "OP_vkCmdSetDeviceMaskKHR",
+    20207: "OP_vkCmdDispatchBaseKHR",
+    20208: "OP_vkTrimCommandPoolKHR",
+    20209: "OP_vkEnumeratePhysicalDeviceGroupsKHR",
+    20210: "OP_vkGetPhysicalDeviceExternalBufferPropertiesKHR",
+    20211: "OP_vkGetMemoryWin32HandleKHR",
+    20212: "OP_vkGetMemoryWin32HandlePropertiesKHR",
+    20213: "OP_vkGetMemoryFdKHR",
+    20214: "OP_vkGetMemoryFdPropertiesKHR",
+    20215: "OP_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR",
+    20216: "OP_vkImportSemaphoreWin32HandleKHR",
+    20217: "OP_vkGetSemaphoreWin32HandleKHR",
+    20218: "OP_vkImportSemaphoreFdKHR",
+    20219: "OP_vkGetSemaphoreFdKHR",
+    20220: "OP_vkCmdPushDescriptorSetKHR",
+    20221: "OP_vkCmdPushDescriptorSetWithTemplateKHR",
+    20222: "OP_vkCreateDescriptorUpdateTemplateKHR",
+    20223: "OP_vkDestroyDescriptorUpdateTemplateKHR",
+    20224: "OP_vkUpdateDescriptorSetWithTemplateKHR",
+    20225: "OP_vkCreateRenderPass2KHR",
+    20226: "OP_vkCmdBeginRenderPass2KHR",
+    20227: "OP_vkCmdNextSubpass2KHR",
+    20228: "OP_vkCmdEndRenderPass2KHR",
+    20229: "OP_vkGetSwapchainStatusKHR",
+    20230: "OP_vkGetPhysicalDeviceExternalFencePropertiesKHR",
+    20231: "OP_vkImportFenceWin32HandleKHR",
+    20232: "OP_vkGetFenceWin32HandleKHR",
+    20233: "OP_vkImportFenceFdKHR",
+    20234: "OP_vkGetFenceFdKHR",
+    299033148: "OP_vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR",
+    282029987: "OP_vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR",
+    238952296: "OP_vkAcquireProfilingLockKHR",
+    223904011: "OP_vkReleaseProfilingLockKHR",
+    20235: "OP_vkGetPhysicalDeviceSurfaceCapabilities2KHR",
+    20236: "OP_vkGetPhysicalDeviceSurfaceFormats2KHR",
+    20237: "OP_vkGetPhysicalDeviceDisplayProperties2KHR",
+    20238: "OP_vkGetPhysicalDeviceDisplayPlaneProperties2KHR",
+    20239: "OP_vkGetDisplayModeProperties2KHR",
+    20240: "OP_vkGetDisplayPlaneCapabilities2KHR",
+    20241: "OP_vkGetImageMemoryRequirements2KHR",
+    20242: "OP_vkGetBufferMemoryRequirements2KHR",
+    20243: "OP_vkGetImageSparseMemoryRequirements2KHR",
+    20244: "OP_vkCreateSamplerYcbcrConversionKHR",
+    20245: "OP_vkDestroySamplerYcbcrConversionKHR",
+    20246: "OP_vkBindBufferMemory2KHR",
+    20247: "OP_vkBindImageMemory2KHR",
+    20248: "OP_vkGetDescriptorSetLayoutSupportKHR",
+    20249: "OP_vkCmdDrawIndirectCountKHR",
+    20250: "OP_vkCmdDrawIndexedIndirectCountKHR",
+    229059496: "OP_vkGetSemaphoreCounterValueKHR",
+    263904357: "OP_vkWaitSemaphoresKHR",
+    269919108: "OP_vkSignalSemaphoreKHR",
+    272978593: "OP_vkGetPhysicalDeviceFragmentShadingRatesKHR",
+    204060280: "OP_vkCmdSetFragmentShadingRateKHR",
+    219261480: "OP_vkGetBufferDeviceAddressKHR",
+    285631711: "OP_vkGetBufferOpaqueCaptureAddressKHR",
+    294671624: "OP_vkGetDeviceMemoryOpaqueCaptureAddressKHR",
+    274342644: "OP_vkCreateDeferredOperationKHR",
+    215419514: "OP_vkDestroyDeferredOperationKHR",
+    203387076: "OP_vkGetDeferredOperationMaxConcurrencyKHR",
+    263822960: "OP_vkGetDeferredOperationResultKHR",
+    218492930: "OP_vkDeferredOperationJoinKHR",
+    269458798: "OP_vkGetPipelineExecutablePropertiesKHR",
+    271191699: "OP_vkGetPipelineExecutableStatisticsKHR",
+    274148497: "OP_vkGetPipelineExecutableInternalRepresentationsKHR",
+    247893766: "OP_vkCmdCopyBuffer2KHR",
+    227008250: "OP_vkCmdCopyImage2KHR",
+    248841963: "OP_vkCmdCopyBufferToImage2KHR",
+    252249060: "OP_vkCmdCopyImageToBuffer2KHR",
+    259838288: "OP_vkCmdBlitImage2KHR",
+    254857232: "OP_vkCmdResolveImage2KHR",
+    20251: "OP_vkGetSwapchainGrallocUsageANDROID",
+    20252: "OP_vkAcquireImageANDROID",
+    20253: "OP_vkQueueSignalReleaseImageANDROID",
+    20254: "OP_vkCreateDebugReportCallbackEXT",
+    20255: "OP_vkDestroyDebugReportCallbackEXT",
+    20256: "OP_vkDebugReportMessageEXT",
+    20257: "OP_vkDebugMarkerSetObjectTagEXT",
+    20258: "OP_vkDebugMarkerSetObjectNameEXT",
+    20259: "OP_vkCmdDebugMarkerBeginEXT",
+    20260: "OP_vkCmdDebugMarkerEndEXT",
+    20261: "OP_vkCmdDebugMarkerInsertEXT",
+    267779978: "OP_vkCmdBindTransformFeedbackBuffersEXT",
+    294396901: "OP_vkCmdBeginTransformFeedbackEXT",
+    272333731: "OP_vkCmdEndTransformFeedbackEXT",
+    275810601: "OP_vkCmdBeginQueryIndexedEXT",
+    279821337: "OP_vkCmdEndQueryIndexedEXT",
+    285235943: "OP_vkCmdDrawIndirectByteCountEXT",
+    204379647: "OP_vkGetImageViewHandleNVX",
+    210668576: "OP_vkGetImageViewAddressNVX",
+    20262: "OP_vkCmdDrawIndirectCountAMD",
+    20263: "OP_vkCmdDrawIndexedIndirectCountAMD",
+    20264: "OP_vkGetShaderInfoAMD",
+    241902685: "OP_vkCreateStreamDescriptorSurfaceGGP",
+    20265: "OP_vkGetPhysicalDeviceExternalImageFormatPropertiesNV",
+    20266: "OP_vkGetMemoryWin32HandleNV",
+    20267: "OP_vkCreateViSurfaceNN",
+    20268: "OP_vkCmdBeginConditionalRenderingEXT",
+    20269: "OP_vkCmdEndConditionalRenderingEXT",
+    20279: "OP_vkCmdSetViewportWScalingNV",
+    20280: "OP_vkReleaseDisplayEXT",
+    20281: "OP_vkAcquireXlibDisplayEXT",
+    20282: "OP_vkGetRandROutputDisplayEXT",
+    20283: "OP_vkGetPhysicalDeviceSurfaceCapabilities2EXT",
+    20284: "OP_vkDisplayPowerControlEXT",
+    20285: "OP_vkRegisterDeviceEventEXT",
+    20286: "OP_vkRegisterDisplayEventEXT",
+    20287: "OP_vkGetSwapchainCounterEXT",
+    20288: "OP_vkGetRefreshCycleDurationGOOGLE",
+    20289: "OP_vkGetPastPresentationTimingGOOGLE",
+    20290: "OP_vkCmdSetDiscardRectangleEXT",
+    20291: "OP_vkSetHdrMetadataEXT",
+    20292: "OP_vkCreateIOSSurfaceMVK",
+    20293: "OP_vkCreateMacOSSurfaceMVK",
+    20334: "OP_vkGetMTLDeviceMVK",
+    20335: "OP_vkSetMTLTextureMVK",
+    20336: "OP_vkGetMTLTextureMVK",
+    20337: "OP_vkGetMTLBufferMVK",
+    20338: "OP_vkUseIOSurfaceMVK",
+    20339: "OP_vkGetIOSurfaceMVK",
+    20294: "OP_vkSetDebugUtilsObjectNameEXT",
+    20295: "OP_vkSetDebugUtilsObjectTagEXT",
+    20296: "OP_vkQueueBeginDebugUtilsLabelEXT",
+    20297: "OP_vkQueueEndDebugUtilsLabelEXT",
+    20298: "OP_vkQueueInsertDebugUtilsLabelEXT",
+    20299: "OP_vkCmdBeginDebugUtilsLabelEXT",
+    20300: "OP_vkCmdEndDebugUtilsLabelEXT",
+    20301: "OP_vkCmdInsertDebugUtilsLabelEXT",
+    20302: "OP_vkCreateDebugUtilsMessengerEXT",
+    20303: "OP_vkDestroyDebugUtilsMessengerEXT",
+    20304: "OP_vkSubmitDebugUtilsMessageEXT",
+    20305: "OP_vkGetAndroidHardwareBufferPropertiesANDROID",
+    20306: "OP_vkGetMemoryAndroidHardwareBufferANDROID",
+    20307: "OP_vkCmdSetSampleLocationsEXT",
+    20308: "OP_vkGetPhysicalDeviceMultisamplePropertiesEXT",
+    251301237: "OP_vkGetImageDrmFormatModifierPropertiesEXT",
+    20309: "OP_vkCreateValidationCacheEXT",
+    20310: "OP_vkDestroyValidationCacheEXT",
+    20311: "OP_vkMergeValidationCachesEXT",
+    20312: "OP_vkGetValidationCacheDataEXT",
+    238618340: "OP_vkCmdBindShadingRateImageNV",
+    215295078: "OP_vkCmdSetViewportShadingRatePaletteNV",
+    236858637: "OP_vkCmdSetCoarseSampleOrderNV",
+    259713020: "OP_vkCreateAccelerationStructureNV",
+    252775746: "OP_vkDestroyAccelerationStructureNV",
+    220234370: "OP_vkGetAccelerationStructureMemoryRequirementsNV",
+    202856743: "OP_vkBindAccelerationStructureMemoryNV",
+    269050897: "OP_vkCmdBuildAccelerationStructureNV",
+    211075498: "OP_vkCmdCopyAccelerationStructureNV",
+    210219912: "OP_vkCmdTraceRaysNV",
+    203653638: "OP_vkCreateRayTracingPipelinesNV",
+    271962641: "OP_vkGetRayTracingShaderGroupHandlesKHR",
+    230045846: "OP_vkGetRayTracingShaderGroupHandlesNV",
+    269898134: "OP_vkGetAccelerationStructureHandleNV",
+    207954431: "OP_vkCmdWriteAccelerationStructuresPropertiesNV",
+    278731610: "OP_vkCompileDeferredNV",
+    20313: "OP_vkGetMemoryHostPointerPropertiesEXT",
+    20314: "OP_vkCmdWriteBufferMarkerAMD",
+    295643221: "OP_vkGetPhysicalDeviceCalibrateableTimeDomainsEXT",
+    203583186: "OP_vkGetCalibratedTimestampsEXT",
+    207334931: "OP_vkCmdDrawMeshTasksNV",
+    274079208: "OP_vkCmdDrawMeshTasksIndirectNV",
+    223801967: "OP_vkCmdDrawMeshTasksIndirectCountNV",
+    225408194: "OP_vkCmdSetExclusiveScissorNV",
+    20315: "OP_vkCmdSetCheckpointNV",
+    20316: "OP_vkGetQueueCheckpointDataNV",
+    203336121: "OP_vkInitializePerformanceApiINTEL",
+    296137321: "OP_vkUninitializePerformanceApiINTEL",
+    270016385: "OP_vkCmdSetPerformanceMarkerINTEL",
+    261519634: "OP_vkCmdSetPerformanceStreamMarkerINTEL",
+    251310287: "OP_vkCmdSetPerformanceOverrideINTEL",
+    245737492: "OP_vkAcquirePerformanceConfigurationINTEL",
+    252877217: "OP_vkReleasePerformanceConfigurationINTEL",
+    294947726: "OP_vkQueueSetPerformanceConfigurationINTEL",
+    213620482: "OP_vkGetPerformanceParameterINTEL",
+    267533472: "OP_vkSetLocalDimmingAMD",
+    261626137: "OP_vkCreateImagePipeSurfaceFUCHSIA",
+    254915953: "OP_vkCreateMetalSurfaceEXT",
+    224361693: "OP_vkGetBufferDeviceAddressEXT",
+    282247593: "OP_vkGetPhysicalDeviceToolPropertiesEXT",
+    287711429: "OP_vkGetPhysicalDeviceCooperativeMatrixPropertiesNV",
+    292032159: "OP_vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV",
+    268126279: "OP_vkGetPhysicalDeviceSurfacePresentModes2EXT",
+    200946668: "OP_vkAcquireFullScreenExclusiveModeEXT",
+    257629142: "OP_vkReleaseFullScreenExclusiveModeEXT",
+    206369543: "OP_vkGetDeviceGroupSurfacePresentModes2EXT",
+    298411290: "OP_vkCreateHeadlessSurfaceEXT",
+    263855692: "OP_vkCmdSetLineStippleEXT",
+    242995959: "OP_vkResetQueryPoolEXT",
+    266285895: "OP_vkCmdSetCullModeEXT",
+    212644406: "OP_vkCmdSetFrontFaceEXT",
+    260783979: "OP_vkCmdSetPrimitiveTopologyEXT",
+    257105245: "OP_vkCmdSetViewportWithCountEXT",
+    204588120: "OP_vkCmdSetScissorWithCountEXT",
+    243419921: "OP_vkCmdBindVertexBuffers2EXT",
+    233771166: "OP_vkCmdSetDepthTestEnableEXT",
+    218663304: "OP_vkCmdSetDepthWriteEnableEXT",
+    247761589: "OP_vkCmdSetDepthCompareOpEXT",
+    223213519: "OP_vkCmdSetDepthBoundsTestEnableEXT",
+    286438749: "OP_vkCmdSetStencilTestEnableEXT",
+    277159578: "OP_vkCmdSetStencilOpEXT",
+    249047049: "OP_vkGetGeneratedCommandsMemoryRequirementsNV",
+    297624330: "OP_vkCmdPreprocessGeneratedCommandsNV",
+    234711184: "OP_vkCmdExecuteGeneratedCommandsNV",
+    270362239: "OP_vkCmdBindPipelineShaderGroupNV",
+    285310710: "OP_vkCreateIndirectCommandsLayoutNV",
+    292584135: "OP_vkDestroyIndirectCommandsLayoutNV",
+    236374049: "OP_vkCreatePrivateDataSlotEXT",
+    208891309: "OP_vkDestroyPrivateDataSlotEXT",
+    225259406: "OP_vkSetPrivateDataEXT",
+    291399427: "OP_vkGetPrivateDataEXT",
+    264649847: "OP_vkCmdSetFragmentShadingRateEnumNV",
+    220792403: "OP_vkCreateDirectFBSurfaceEXT",
+    285441990: "OP_vkGetPhysicalDeviceDirectFBPresentationSupportEXT",
+    20318: "OP_vkRegisterImageColorBufferGOOGLE",
+    20319: "OP_vkRegisterBufferColorBufferGOOGLE",
+    20317: "OP_vkMapMemoryIntoAddressSpaceGOOGLE",
+    20320: "OP_vkUpdateDescriptorSetWithTemplateSizedGOOGLE",
+    20321: "OP_vkBeginCommandBufferAsyncGOOGLE",
+    20322: "OP_vkEndCommandBufferAsyncGOOGLE",
+    20323: "OP_vkResetCommandBufferAsyncGOOGLE",
+    20324: "OP_vkCommandBufferHostSyncGOOGLE",
+    20325: "OP_vkCreateImageWithRequirementsGOOGLE",
+    20326: "OP_vkCreateBufferWithRequirementsGOOGLE",
+    20327: "OP_vkGetMemoryHostAddressInfoGOOGLE",
+    20328: "OP_vkFreeMemorySyncGOOGLE",
+    20329: "OP_vkQueueHostSyncGOOGLE",
+    20330: "OP_vkQueueSubmitAsyncGOOGLE",
+    20331: "OP_vkQueueWaitIdleAsyncGOOGLE",
+    20332: "OP_vkQueueBindSparseAsyncGOOGLE",
+    20333: "OP_vkGetLinearImageLayoutGOOGLE",
+    20340: "OP_vkQueueFlushCommandsGOOGLE",
+    267932433: "OP_vkQueueCommitDescriptorSetUpdatesGOOGLE",
+    213659202: "OP_vkCollectDescriptorPoolIdsGOOGLE",
+    243985229: "OP_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE",
+    259403971: "OP_vkCreateAccelerationStructureKHR",
+    223971120: "OP_vkDestroyAccelerationStructureKHR",
+    272943905: "OP_vkCmdBuildAccelerationStructuresKHR",
+    258066143: "OP_vkCmdBuildAccelerationStructuresIndirectKHR",
+    241919567: "OP_vkBuildAccelerationStructuresKHR",
+    241495016: "OP_vkCopyAccelerationStructureKHR",
+    256139578: "OP_vkCopyAccelerationStructureToMemoryKHR",
+    261558680: "OP_vkCopyMemoryToAccelerationStructureKHR",
+    289745796: "OP_vkWriteAccelerationStructuresPropertiesKHR",
+    279460332: "OP_vkCmdCopyAccelerationStructureKHR",
+    223539733: "OP_vkCmdCopyAccelerationStructureToMemoryKHR",
+    203733963: "OP_vkCmdCopyMemoryToAccelerationStructureKHR",
+    223466148: "OP_vkGetAccelerationStructureDeviceAddressKHR",
+    271696183: "OP_vkCmdWriteAccelerationStructuresPropertiesKHR",
+    266386590: "OP_vkGetDeviceAccelerationStructureCompatibilityKHR",
+    219720024: "OP_vkGetAccelerationStructureBuildSizesKHR",
+    213680716: "OP_vkCmdTraceRaysKHR",
+    247628685: "OP_vkCreateRayTracingPipelinesKHR",
+    221334934: "OP_vkGetRayTracingCaptureReplayShaderGroupHandlesKHR",
+    211788517: "OP_vkCmdTraceRaysIndirectKHR",
+    205271933: "OP_vkGetRayTracingShaderGroupStackSizeKHR",
+    260219604: "OP_vkCmdSetRayTracingPipelineStackSizeKHR",
+
+    ###############################################################################################
+    # Render Control opcodes
+    # http://source/play-internal/battlestar/aosp/device/generic/vulkan-cereal/stream-servers/renderControl_dec/renderControl_opcodes.h
+    ###############################################################################################
+    10000: "OP_rcGetRendererVersion",
+    10001: "OP_rcGetEGLVersion",
+    10002: "OP_rcQueryEGLString",
+    10003: "OP_rcGetGLString",
+    10004: "OP_rcGetNumConfigs",
+    10005: "OP_rcGetConfigs",
+    10006: "OP_rcChooseConfig",
+    10007: "OP_rcGetFBParam",
+    10008: "OP_rcCreateContext",
+    10009: "OP_rcDestroyContext",
+    10010: "OP_rcCreateWindowSurface",
+    10011: "OP_rcDestroyWindowSurface",
+    10012: "OP_rcCreateColorBuffer",
+    10013: "OP_rcOpenColorBuffer",
+    10014: "OP_rcCloseColorBuffer",
+    10015: "OP_rcSetWindowColorBuffer",
+    10016: "OP_rcFlushWindowColorBuffer",
+    10017: "OP_rcMakeCurrent",
+    10018: "OP_rcFBPost",
+    10019: "OP_rcFBSetSwapInterval",
+    10020: "OP_rcBindTexture",
+    10021: "OP_rcBindRenderbuffer",
+    10022: "OP_rcColorBufferCacheFlush",
+    10023: "OP_rcReadColorBuffer",
+    10024: "OP_rcUpdateColorBuffer",
+    10025: "OP_rcOpenColorBuffer2",
+    10026: "OP_rcCreateClientImage",
+    10027: "OP_rcDestroyClientImage",
+    10028: "OP_rcSelectChecksumHelper",
+    10029: "OP_rcCreateSyncKHR",
+    10030: "OP_rcClientWaitSyncKHR",
+    10031: "OP_rcFlushWindowColorBufferAsync",
+    10032: "OP_rcDestroySyncKHR",
+    10033: "OP_rcSetPuid",
+    10034: "OP_rcUpdateColorBufferDMA",
+    10035: "OP_rcCreateColorBufferDMA",
+    10036: "OP_rcWaitSyncKHR",
+    10037: "OP_rcCompose",
+    10038: "OP_rcCreateDisplay",
+    10039: "OP_rcDestroyDisplay",
+    10040: "OP_rcSetDisplayColorBuffer",
+    10041: "OP_rcGetDisplayColorBuffer",
+    10042: "OP_rcGetColorBufferDisplay",
+    10043: "OP_rcGetDisplayPose",
+    10044: "OP_rcSetDisplayPose",
+    10045: "OP_rcSetColorBufferVulkanMode",
+    10046: "OP_rcReadColorBufferYUV",
+    10047: "OP_rcIsSyncSignaled",
+    10048: "OP_rcCreateColorBufferWithHandle",
+    10049: "OP_rcCreateBuffer",
+    10050: "OP_rcCloseBuffer",
+    10051: "OP_rcSetColorBufferVulkanMode2",
+    10052: "OP_rcMapGpaToBufferHandle",
+    10053: "OP_rcCreateBuffer2",
+    10054: "OP_rcMapGpaToBufferHandle2",
+    10055: "OP_rcFlushWindowColorBufferAsyncWithFrameNumber",
+    10056: "OP_rcSetTracingForPuid",
+    10057: "OP_rcMakeCurrentAsync",
+    10058: "OP_rcComposeAsync",
+    10059: "OP_rcDestroySyncKHRAsync",
+    10060: "OP_rcComposeWithoutPost",
+    10061: "OP_rcComposeAsyncWithoutPost",
+    10062: "OP_rcCreateDisplayById",
+    10063: "OP_rcSetDisplayPoseDpi",
+    10064: "OP_rcReadColorBufferDMA",
+
+    ###############################################################################################
+    # GLES1 opcodes
+    # http://source/android/device/generic/vulkan-cereal/stream-servers/gles1_dec/gles1_opcodes.h
+    ###############################################################################################
+    1024: "OP_glAlphaFunc",
+    1025: "OP_glClearColor",
+    1026: "OP_glClearDepthf",
+    1027: "OP_glClipPlanef",
+    1028: "OP_glColor4f",
+    1029: "OP_glDepthRangef",
+    1030: "OP_glFogf",
+    1031: "OP_glFogfv",
+    1032: "OP_glFrustumf",
+    1033: "OP_glGetClipPlanef",
+    1034: "OP_glGetFloatv",
+    1035: "OP_glGetLightfv",
+    1036: "OP_glGetMaterialfv",
+    1037: "OP_glGetTexEnvfv",
+    1038: "OP_glGetTexParameterfv",
+    1039: "OP_glLightModelf",
+    1040: "OP_glLightModelfv",
+    1041: "OP_glLightf",
+    1042: "OP_glLightfv",
+    1043: "OP_glLineWidth",
+    1044: "OP_glLoadMatrixf",
+    1045: "OP_glMaterialf",
+    1046: "OP_glMaterialfv",
+    1047: "OP_glMultMatrixf",
+    1048: "OP_glMultiTexCoord4f",
+    1049: "OP_glNormal3f",
+    1050: "OP_glOrthof",
+    1051: "OP_glPointParameterf",
+    1052: "OP_glPointParameterfv",
+    1053: "OP_glPointSize",
+    1054: "OP_glPolygonOffset",
+    1055: "OP_glRotatef",
+    1056: "OP_glScalef",
+    1057: "OP_glTexEnvf",
+    1058: "OP_glTexEnvfv",
+    1059: "OP_glTexParameterf",
+    1060: "OP_glTexParameterfv",
+    1061: "OP_glTranslatef",
+    1062: "OP_glActiveTexture",
+    1063: "OP_glAlphaFuncx",
+    1064: "OP_glBindBuffer",
+    1065: "OP_glBindTexture",
+    1066: "OP_glBlendFunc",
+    1067: "OP_glBufferData",
+    1068: "OP_glBufferSubData",
+    1069: "OP_glClear",
+    1070: "OP_glClearColorx",
+    1071: "OP_glClearDepthx",
+    1072: "OP_glClearStencil",
+    1073: "OP_glClientActiveTexture",
+    1074: "OP_glColor4ub",
+    1075: "OP_glColor4x",
+    1076: "OP_glColorMask",
+    1077: "OP_glColorPointer",
+    1078: "OP_glCompressedTexImage2D",
+    1079: "OP_glCompressedTexSubImage2D",
+    1080: "OP_glCopyTexImage2D",
+    1081: "OP_glCopyTexSubImage2D",
+    1082: "OP_glCullFace",
+    1083: "OP_glDeleteBuffers",
+    1084: "OP_glDeleteTextures",
+    1085: "OP_glDepthFunc",
+    1086: "OP_glDepthMask",
+    1087: "OP_glDepthRangex",
+    1088: "OP_glDisable",
+    1089: "OP_glDisableClientState",
+    1090: "OP_glDrawArrays",
+    1091: "OP_glDrawElements",
+    1092: "OP_glEnable",
+    1093: "OP_glEnableClientState",
+    1094: "OP_glFinish",
+    1095: "OP_glFlush",
+    1096: "OP_glFogx",
+    1097: "OP_glFogxv",
+    1098: "OP_glFrontFace",
+    1099: "OP_glFrustumx",
+    1100: "OP_glGetBooleanv",
+    1101: "OP_glGetBufferParameteriv",
+    1102: "OP_glClipPlanex",
+    1103: "OP_glGenBuffers",
+    1104: "OP_glGenTextures",
+    1105: "OP_glGetError",
+    1106: "OP_glGetFixedv",
+    1107: "OP_glGetIntegerv",
+    1108: "OP_glGetLightxv",
+    1109: "OP_glGetMaterialxv",
+    1110: "OP_glGetPointerv",
+    1111: "OP_glGetString",
+    1112: "OP_glGetTexEnviv",
+    1113: "OP_glGetTexEnvxv",
+    1114: "OP_glGetTexParameteriv",
+    1115: "OP_glGetTexParameterxv",
+    1116: "OP_glHint",
+    1117: "OP_glIsBuffer",
+    1118: "OP_glIsEnabled",
+    1119: "OP_glIsTexture",
+    1120: "OP_glLightModelx",
+    1121: "OP_glLightModelxv",
+    1122: "OP_glLightx",
+    1123: "OP_glLightxv",
+    1124: "OP_glLineWidthx",
+    1125: "OP_glLoadIdentity",
+    1126: "OP_glLoadMatrixx",
+    1127: "OP_glLogicOp",
+    1128: "OP_glMaterialx",
+    1129: "OP_glMaterialxv",
+    1130: "OP_glMatrixMode",
+    1131: "OP_glMultMatrixx",
+    1132: "OP_glMultiTexCoord4x",
+    1133: "OP_glNormal3x",
+    1134: "OP_glNormalPointer",
+    1135: "OP_glOrthox",
+    1136: "OP_glPixelStorei",
+    1137: "OP_glPointParameterx",
+    1138: "OP_glPointParameterxv",
+    1139: "OP_glPointSizex",
+    1140: "OP_glPolygonOffsetx",
+    1141: "OP_glPopMatrix",
+    1142: "OP_glPushMatrix",
+    1143: "OP_glReadPixels",
+    1144: "OP_glRotatex",
+    1145: "OP_glSampleCoverage",
+    1146: "OP_glSampleCoveragex",
+    1147: "OP_glScalex",
+    1148: "OP_glScissor",
+    1149: "OP_glShadeModel",
+    1150: "OP_glStencilFunc",
+    1151: "OP_glStencilMask",
+    1152: "OP_glStencilOp",
+    1153: "OP_glTexCoordPointer",
+    1154: "OP_glTexEnvi",
+    1155: "OP_glTexEnvx",
+    1156: "OP_glTexEnviv",
+    1157: "OP_glTexEnvxv",
+    1158: "OP_glTexImage2D",
+    1159: "OP_glTexParameteri",
+    1160: "OP_glTexParameterx",
+    1161: "OP_glTexParameteriv",
+    1162: "OP_glTexParameterxv",
+    1163: "OP_glTexSubImage2D",
+    1164: "OP_glTranslatex",
+    1165: "OP_glVertexPointer",
+    1166: "OP_glViewport",
+    1167: "OP_glPointSizePointerOES",
+    1168: "OP_glVertexPointerOffset",
+    1169: "OP_glColorPointerOffset",
+    1170: "OP_glNormalPointerOffset",
+    1171: "OP_glPointSizePointerOffset",
+    1172: "OP_glTexCoordPointerOffset",
+    1173: "OP_glWeightPointerOffset",
+    1174: "OP_glMatrixIndexPointerOffset",
+    1175: "OP_glVertexPointerData",
+    1176: "OP_glColorPointerData",
+    1177: "OP_glNormalPointerData",
+    1178: "OP_glTexCoordPointerData",
+    1179: "OP_glPointSizePointerData",
+    1180: "OP_glWeightPointerData",
+    1181: "OP_glMatrixIndexPointerData",
+    1182: "OP_glDrawElementsOffset",
+    1183: "OP_glDrawElementsData",
+    1184: "OP_glGetCompressedTextureFormats",
+    1185: "OP_glFinishRoundTrip",
+    1186: "OP_glBlendEquationSeparateOES",
+    1187: "OP_glBlendFuncSeparateOES",
+    1188: "OP_glBlendEquationOES",
+    1189: "OP_glDrawTexsOES",
+    1190: "OP_glDrawTexiOES",
+    1191: "OP_glDrawTexxOES",
+    1192: "OP_glDrawTexsvOES",
+    1193: "OP_glDrawTexivOES",
+    1194: "OP_glDrawTexxvOES",
+    1195: "OP_glDrawTexfOES",
+    1196: "OP_glDrawTexfvOES",
+    1197: "OP_glEGLImageTargetTexture2DOES",
+    1198: "OP_glEGLImageTargetRenderbufferStorageOES",
+    1199: "OP_glAlphaFuncxOES",
+    1200: "OP_glClearColorxOES",
+    1201: "OP_glClearDepthxOES",
+    1202: "OP_glClipPlanexOES",
+    1203: "OP_glClipPlanexIMG",
+    1204: "OP_glColor4xOES",
+    1205: "OP_glDepthRangexOES",
+    1206: "OP_glFogxOES",
+    1207: "OP_glFogxvOES",
+    1208: "OP_glFrustumxOES",
+    1209: "OP_glGetClipPlanexOES",
+    1210: "OP_glGetClipPlanex",
+    1211: "OP_glGetFixedvOES",
+    1212: "OP_glGetLightxvOES",
+    1213: "OP_glGetMaterialxvOES",
+    1214: "OP_glGetTexEnvxvOES",
+    1215: "OP_glGetTexParameterxvOES",
+    1216: "OP_glLightModelxOES",
+    1217: "OP_glLightModelxvOES",
+    1218: "OP_glLightxOES",
+    1219: "OP_glLightxvOES",
+    1220: "OP_glLineWidthxOES",
+    1221: "OP_glLoadMatrixxOES",
+    1222: "OP_glMaterialxOES",
+    1223: "OP_glMaterialxvOES",
+    1224: "OP_glMultMatrixxOES",
+    1225: "OP_glMultiTexCoord4xOES",
+    1226: "OP_glNormal3xOES",
+    1227: "OP_glOrthoxOES",
+    1228: "OP_glPointParameterxOES",
+    1229: "OP_glPointParameterxvOES",
+    1230: "OP_glPointSizexOES",
+    1231: "OP_glPolygonOffsetxOES",
+    1232: "OP_glRotatexOES",
+    1233: "OP_glSampleCoveragexOES",
+    1234: "OP_glScalexOES",
+    1235: "OP_glTexEnvxOES",
+    1236: "OP_glTexEnvxvOES",
+    1237: "OP_glTexParameterxOES",
+    1238: "OP_glTexParameterxvOES",
+    1239: "OP_glTranslatexOES",
+    1240: "OP_glIsRenderbufferOES",
+    1241: "OP_glBindRenderbufferOES",
+    1242: "OP_glDeleteRenderbuffersOES",
+    1243: "OP_glGenRenderbuffersOES",
+    1244: "OP_glRenderbufferStorageOES",
+    1245: "OP_glGetRenderbufferParameterivOES",
+    1246: "OP_glIsFramebufferOES",
+    1247: "OP_glBindFramebufferOES",
+    1248: "OP_glDeleteFramebuffersOES",
+    1249: "OP_glGenFramebuffersOES",
+    1250: "OP_glCheckFramebufferStatusOES",
+    1251: "OP_glFramebufferRenderbufferOES",
+    1252: "OP_glFramebufferTexture2DOES",
+    1253: "OP_glGetFramebufferAttachmentParameterivOES",
+    1254: "OP_glGenerateMipmapOES",
+    1255: "OP_glMapBufferOES",
+    1256: "OP_glUnmapBufferOES",
+    1257: "OP_glGetBufferPointervOES",
+    1258: "OP_glCurrentPaletteMatrixOES",
+    1259: "OP_glLoadPaletteFromModelViewMatrixOES",
+    1260: "OP_glMatrixIndexPointerOES",
+    1261: "OP_glWeightPointerOES",
+    1262: "OP_glQueryMatrixxOES",
+    1263: "OP_glDepthRangefOES",
+    1264: "OP_glFrustumfOES",
+    1265: "OP_glOrthofOES",
+    1266: "OP_glClipPlanefOES",
+    1267: "OP_glClipPlanefIMG",
+    1268: "OP_glGetClipPlanefOES",
+    1269: "OP_glClearDepthfOES",
+    1270: "OP_glTexGenfOES",
+    1271: "OP_glTexGenfvOES",
+    1272: "OP_glTexGeniOES",
+    1273: "OP_glTexGenivOES",
+    1274: "OP_glTexGenxOES",
+    1275: "OP_glTexGenxvOES",
+    1276: "OP_glGetTexGenfvOES",
+    1277: "OP_glGetTexGenivOES",
+    1278: "OP_glGetTexGenxvOES",
+    1279: "OP_glBindVertexArrayOES",
+    1280: "OP_glDeleteVertexArraysOES",
+    1281: "OP_glGenVertexArraysOES",
+    1282: "OP_glIsVertexArrayOES",
+    1283: "OP_glDiscardFramebufferEXT",
+    1284: "OP_glMultiDrawArraysEXT",
+    1285: "OP_glMultiDrawElementsEXT",
+    1286: "OP_glMultiDrawArraysSUN",
+    1287: "OP_glMultiDrawElementsSUN",
+    1288: "OP_glRenderbufferStorageMultisampleIMG",
+    1289: "OP_glFramebufferTexture2DMultisampleIMG",
+    1290: "OP_glDeleteFencesNV",
+    1291: "OP_glGenFencesNV",
+    1292: "OP_glIsFenceNV",
+    1293: "OP_glTestFenceNV",
+    1294: "OP_glGetFenceivNV",
+    1295: "OP_glFinishFenceNV",
+    1296: "OP_glSetFenceNV",
+    1297: "OP_glGetDriverControlsQCOM",
+    1298: "OP_glGetDriverControlStringQCOM",
+    1299: "OP_glEnableDriverControlQCOM",
+    1300: "OP_glDisableDriverControlQCOM",
+    1301: "OP_glExtGetTexturesQCOM",
+    1302: "OP_glExtGetBuffersQCOM",
+    1303: "OP_glExtGetRenderbuffersQCOM",
+    1304: "OP_glExtGetFramebuffersQCOM",
+    1305: "OP_glExtGetTexLevelParameterivQCOM",
+    1306: "OP_glExtTexObjectStateOverrideiQCOM",
+    1307: "OP_glExtGetTexSubImageQCOM",
+    1308: "OP_glExtGetBufferPointervQCOM",
+    1309: "OP_glExtGetShadersQCOM",
+    1310: "OP_glExtGetProgramsQCOM",
+    1311: "OP_glExtIsProgramBinaryQCOM",
+    1312: "OP_glExtGetProgramBinarySourceQCOM",
+    1313: "OP_glStartTilingQCOM",
+    1314: "OP_glEndTilingQCOM",
+    1315: "OP_glGetGraphicsResetStatusEXT",
+    1316: "OP_glReadnPixelsEXT",
+
+    ###############################################################################################
+    # GLES2 opcodes
+    # http://source/android/device/generic/vulkan-cereal/stream-servers/gles2_dec/gles2_opcodes.h
+    ###############################################################################################
+    2048: "OP_glActiveTexture",
+    2049: "OP_glAttachShader",
+    2050: "OP_glBindAttribLocation",
+    2051: "OP_glBindBuffer",
+    2052: "OP_glBindFramebuffer",
+    2053: "OP_glBindRenderbuffer",
+    2054: "OP_glBindTexture",
+    2055: "OP_glBlendColor",
+    2056: "OP_glBlendEquation",
+    2057: "OP_glBlendEquationSeparate",
+    2058: "OP_glBlendFunc",
+    2059: "OP_glBlendFuncSeparate",
+    2060: "OP_glBufferData",
+    2061: "OP_glBufferSubData",
+    2062: "OP_glCheckFramebufferStatus",
+    2063: "OP_glClear",
+    2064: "OP_glClearColor",
+    2065: "OP_glClearDepthf",
+    2066: "OP_glClearStencil",
+    2067: "OP_glColorMask",
+    2068: "OP_glCompileShader",
+    2069: "OP_glCompressedTexImage2D",
+    2070: "OP_glCompressedTexSubImage2D",
+    2071: "OP_glCopyTexImage2D",
+    2072: "OP_glCopyTexSubImage2D",
+    2073: "OP_glCreateProgram",
+    2074: "OP_glCreateShader",
+    2075: "OP_glCullFace",
+    2076: "OP_glDeleteBuffers",
+    2077: "OP_glDeleteFramebuffers",
+    2078: "OP_glDeleteProgram",
+    2079: "OP_glDeleteRenderbuffers",
+    2080: "OP_glDeleteShader",
+    2081: "OP_glDeleteTextures",
+    2082: "OP_glDepthFunc",
+    2083: "OP_glDepthMask",
+    2084: "OP_glDepthRangef",
+    2085: "OP_glDetachShader",
+    2086: "OP_glDisable",
+    2087: "OP_glDisableVertexAttribArray",
+    2088: "OP_glDrawArrays",
+    2089: "OP_glDrawElements",
+    2090: "OP_glEnable",
+    2091: "OP_glEnableVertexAttribArray",
+    2092: "OP_glFinish",
+    2093: "OP_glFlush",
+    2094: "OP_glFramebufferRenderbuffer",
+    2095: "OP_glFramebufferTexture2D",
+    2096: "OP_glFrontFace",
+    2097: "OP_glGenBuffers",
+    2098: "OP_glGenerateMipmap",
+    2099: "OP_glGenFramebuffers",
+    2100: "OP_glGenRenderbuffers",
+    2101: "OP_glGenTextures",
+    2102: "OP_glGetActiveAttrib",
+    2103: "OP_glGetActiveUniform",
+    2104: "OP_glGetAttachedShaders",
+    2105: "OP_glGetAttribLocation",
+    2106: "OP_glGetBooleanv",
+    2107: "OP_glGetBufferParameteriv",
+    2108: "OP_glGetError",
+    2109: "OP_glGetFloatv",
+    2110: "OP_glGetFramebufferAttachmentParameteriv",
+    2111: "OP_glGetIntegerv",
+    2112: "OP_glGetProgramiv",
+    2113: "OP_glGetProgramInfoLog",
+    2114: "OP_glGetRenderbufferParameteriv",
+    2115: "OP_glGetShaderiv",
+    2116: "OP_glGetShaderInfoLog",
+    2117: "OP_glGetShaderPrecisionFormat",
+    2118: "OP_glGetShaderSource",
+    2119: "OP_glGetString",
+    2120: "OP_glGetTexParameterfv",
+    2121: "OP_glGetTexParameteriv",
+    2122: "OP_glGetUniformfv",
+    2123: "OP_glGetUniformiv",
+    2124: "OP_glGetUniformLocation",
+    2125: "OP_glGetVertexAttribfv",
+    2126: "OP_glGetVertexAttribiv",
+    2127: "OP_glGetVertexAttribPointerv",
+    2128: "OP_glHint",
+    2129: "OP_glIsBuffer",
+    2130: "OP_glIsEnabled",
+    2131: "OP_glIsFramebuffer",
+    2132: "OP_glIsProgram",
+    2133: "OP_glIsRenderbuffer",
+    2134: "OP_glIsShader",
+    2135: "OP_glIsTexture",
+    2136: "OP_glLineWidth",
+    2137: "OP_glLinkProgram",
+    2138: "OP_glPixelStorei",
+    2139: "OP_glPolygonOffset",
+    2140: "OP_glReadPixels",
+    2141: "OP_glReleaseShaderCompiler",
+    2142: "OP_glRenderbufferStorage",
+    2143: "OP_glSampleCoverage",
+    2144: "OP_glScissor",
+    2145: "OP_glShaderBinary",
+    2146: "OP_glShaderSource",
+    2147: "OP_glStencilFunc",
+    2148: "OP_glStencilFuncSeparate",
+    2149: "OP_glStencilMask",
+    2150: "OP_glStencilMaskSeparate",
+    2151: "OP_glStencilOp",
+    2152: "OP_glStencilOpSeparate",
+    2153: "OP_glTexImage2D",
+    2154: "OP_glTexParameterf",
+    2155: "OP_glTexParameterfv",
+    2156: "OP_glTexParameteri",
+    2157: "OP_glTexParameteriv",
+    2158: "OP_glTexSubImage2D",
+    2159: "OP_glUniform1f",
+    2160: "OP_glUniform1fv",
+    2161: "OP_glUniform1i",
+    2162: "OP_glUniform1iv",
+    2163: "OP_glUniform2f",
+    2164: "OP_glUniform2fv",
+    2165: "OP_glUniform2i",
+    2166: "OP_glUniform2iv",
+    2167: "OP_glUniform3f",
+    2168: "OP_glUniform3fv",
+    2169: "OP_glUniform3i",
+    2170: "OP_glUniform3iv",
+    2171: "OP_glUniform4f",
+    2172: "OP_glUniform4fv",
+    2173: "OP_glUniform4i",
+    2174: "OP_glUniform4iv",
+    2175: "OP_glUniformMatrix2fv",
+    2176: "OP_glUniformMatrix3fv",
+    2177: "OP_glUniformMatrix4fv",
+    2178: "OP_glUseProgram",
+    2179: "OP_glValidateProgram",
+    2180: "OP_glVertexAttrib1f",
+    2181: "OP_glVertexAttrib1fv",
+    2182: "OP_glVertexAttrib2f",
+    2183: "OP_glVertexAttrib2fv",
+    2184: "OP_glVertexAttrib3f",
+    2185: "OP_glVertexAttrib3fv",
+    2186: "OP_glVertexAttrib4f",
+    2187: "OP_glVertexAttrib4fv",
+    2188: "OP_glVertexAttribPointer",
+    2189: "OP_glViewport",
+    2190: "OP_glEGLImageTargetTexture2DOES",
+    2191: "OP_glEGLImageTargetRenderbufferStorageOES",
+    2192: "OP_glGetProgramBinaryOES",
+    2193: "OP_glProgramBinaryOES",
+    2194: "OP_glMapBufferOES",
+    2195: "OP_glUnmapBufferOES",
+    2196: "OP_glTexImage3DOES",
+    2197: "OP_glTexSubImage3DOES",
+    2198: "OP_glCopyTexSubImage3DOES",
+    2199: "OP_glCompressedTexImage3DOES",
+    2200: "OP_glCompressedTexSubImage3DOES",
+    2201: "OP_glFramebufferTexture3DOES",
+    2202: "OP_glBindVertexArrayOES",
+    2203: "OP_glDeleteVertexArraysOES",
+    2204: "OP_glGenVertexArraysOES",
+    2205: "OP_glIsVertexArrayOES",
+    2206: "OP_glDiscardFramebufferEXT",
+    2207: "OP_glMultiDrawArraysEXT",
+    2208: "OP_glMultiDrawElementsEXT",
+    2209: "OP_glGetPerfMonitorGroupsAMD",
+    2210: "OP_glGetPerfMonitorCountersAMD",
+    2211: "OP_glGetPerfMonitorGroupStringAMD",
+    2212: "OP_glGetPerfMonitorCounterStringAMD",
+    2213: "OP_glGetPerfMonitorCounterInfoAMD",
+    2214: "OP_glGenPerfMonitorsAMD",
+    2215: "OP_glDeletePerfMonitorsAMD",
+    2216: "OP_glSelectPerfMonitorCountersAMD",
+    2217: "OP_glBeginPerfMonitorAMD",
+    2218: "OP_glEndPerfMonitorAMD",
+    2219: "OP_glGetPerfMonitorCounterDataAMD",
+    2220: "OP_glRenderbufferStorageMultisampleIMG",
+    2221: "OP_glFramebufferTexture2DMultisampleIMG",
+    2222: "OP_glDeleteFencesNV",
+    2223: "OP_glGenFencesNV",
+    2224: "OP_glIsFenceNV",
+    2225: "OP_glTestFenceNV",
+    2226: "OP_glGetFenceivNV",
+    2227: "OP_glFinishFenceNV",
+    2228: "OP_glSetFenceNV",
+    2229: "OP_glCoverageMaskNV",
+    2230: "OP_glCoverageOperationNV",
+    2231: "OP_glGetDriverControlsQCOM",
+    2232: "OP_glGetDriverControlStringQCOM",
+    2233: "OP_glEnableDriverControlQCOM",
+    2234: "OP_glDisableDriverControlQCOM",
+    2235: "OP_glExtGetTexturesQCOM",
+    2236: "OP_glExtGetBuffersQCOM",
+    2237: "OP_glExtGetRenderbuffersQCOM",
+    2238: "OP_glExtGetFramebuffersQCOM",
+    2239: "OP_glExtGetTexLevelParameterivQCOM",
+    2240: "OP_glExtTexObjectStateOverrideiQCOM",
+    2241: "OP_glExtGetTexSubImageQCOM",
+    2242: "OP_glExtGetBufferPointervQCOM",
+    2243: "OP_glExtGetShadersQCOM",
+    2244: "OP_glExtGetProgramsQCOM",
+    2245: "OP_glExtIsProgramBinaryQCOM",
+    2246: "OP_glExtGetProgramBinarySourceQCOM",
+    2247: "OP_glStartTilingQCOM",
+    2248: "OP_glEndTilingQCOM",
+    2249: "OP_glVertexAttribPointerData",
+    2250: "OP_glVertexAttribPointerOffset",
+    2251: "OP_glDrawElementsOffset",
+    2252: "OP_glDrawElementsData",
+    2253: "OP_glGetCompressedTextureFormats",
+    2254: "OP_glShaderString",
+    2255: "OP_glFinishRoundTrip",
+    2256: "OP_glGenVertexArrays",
+    2257: "OP_glBindVertexArray",
+    2258: "OP_glDeleteVertexArrays",
+    2259: "OP_glIsVertexArray",
+    2260: "OP_glMapBufferRange",
+    2261: "OP_glUnmapBuffer",
+    2262: "OP_glFlushMappedBufferRange",
+    2263: "OP_glMapBufferRangeAEMU",
+    2264: "OP_glUnmapBufferAEMU",
+    2265: "OP_glFlushMappedBufferRangeAEMU",
+    2266: "OP_glReadPixelsOffsetAEMU",
+    2267: "OP_glCompressedTexImage2DOffsetAEMU",
+    2268: "OP_glCompressedTexSubImage2DOffsetAEMU",
+    2269: "OP_glTexImage2DOffsetAEMU",
+    2270: "OP_glTexSubImage2DOffsetAEMU",
+    2271: "OP_glBindBufferRange",
+    2272: "OP_glBindBufferBase",
+    2273: "OP_glCopyBufferSubData",
+    2274: "OP_glClearBufferiv",
+    2275: "OP_glClearBufferuiv",
+    2276: "OP_glClearBufferfv",
+    2277: "OP_glClearBufferfi",
+    2278: "OP_glGetBufferParameteri64v",
+    2279: "OP_glGetBufferPointerv",
+    2280: "OP_glUniformBlockBinding",
+    2281: "OP_glGetUniformBlockIndex",
+    2282: "OP_glGetUniformIndices",
+    2283: "OP_glGetUniformIndicesAEMU",
+    2284: "OP_glGetActiveUniformBlockiv",
+    2285: "OP_glGetActiveUniformBlockName",
+    2286: "OP_glUniform1ui",
+    2287: "OP_glUniform2ui",
+    2288: "OP_glUniform3ui",
+    2289: "OP_glUniform4ui",
+    2290: "OP_glUniform1uiv",
+    2291: "OP_glUniform2uiv",
+    2292: "OP_glUniform3uiv",
+    2293: "OP_glUniform4uiv",
+    2294: "OP_glUniformMatrix2x3fv",
+    2295: "OP_glUniformMatrix3x2fv",
+    2296: "OP_glUniformMatrix2x4fv",
+    2297: "OP_glUniformMatrix4x2fv",
+    2298: "OP_glUniformMatrix3x4fv",
+    2299: "OP_glUniformMatrix4x3fv",
+    2300: "OP_glGetUniformuiv",
+    2301: "OP_glGetActiveUniformsiv",
+    2302: "OP_glVertexAttribI4i",
+    2303: "OP_glVertexAttribI4ui",
+    2304: "OP_glVertexAttribI4iv",
+    2305: "OP_glVertexAttribI4uiv",
+    2306: "OP_glVertexAttribIPointer",
+    2307: "OP_glVertexAttribIPointerOffsetAEMU",
+    2308: "OP_glVertexAttribIPointerDataAEMU",
+    2309: "OP_glGetVertexAttribIiv",
+    2310: "OP_glGetVertexAttribIuiv",
+    2311: "OP_glVertexAttribDivisor",
+    2312: "OP_glDrawArraysInstanced",
+    2313: "OP_glDrawElementsInstanced",
+    2314: "OP_glDrawElementsInstancedDataAEMU",
+    2315: "OP_glDrawElementsInstancedOffsetAEMU",
+    2316: "OP_glDrawRangeElements",
+    2317: "OP_glDrawRangeElementsDataAEMU",
+    2318: "OP_glDrawRangeElementsOffsetAEMU",
+    2319: "OP_glFenceSync",
+    2320: "OP_glClientWaitSync",
+    2321: "OP_glWaitSync",
+    2322: "OP_glDeleteSync",
+    2323: "OP_glIsSync",
+    2324: "OP_glGetSynciv",
+    2325: "OP_glFenceSyncAEMU",
+    2326: "OP_glClientWaitSyncAEMU",
+    2327: "OP_glWaitSyncAEMU",
+    2328: "OP_glDeleteSyncAEMU",
+    2329: "OP_glIsSyncAEMU",
+    2330: "OP_glGetSyncivAEMU",
+    2331: "OP_glDrawBuffers",
+    2332: "OP_glReadBuffer",
+    2333: "OP_glBlitFramebuffer",
+    2334: "OP_glInvalidateFramebuffer",
+    2335: "OP_glInvalidateSubFramebuffer",
+    2336: "OP_glFramebufferTextureLayer",
+    2337: "OP_glRenderbufferStorageMultisample",
+    2338: "OP_glTexStorage2D",
+    2339: "OP_glGetInternalformativ",
+    2340: "OP_glBeginTransformFeedback",
+    2341: "OP_glEndTransformFeedback",
+    2342: "OP_glGenTransformFeedbacks",
+    2343: "OP_glDeleteTransformFeedbacks",
+    2344: "OP_glBindTransformFeedback",
+    2345: "OP_glPauseTransformFeedback",
+    2346: "OP_glResumeTransformFeedback",
+    2347: "OP_glIsTransformFeedback",
+    2348: "OP_glTransformFeedbackVaryings",
+    2349: "OP_glTransformFeedbackVaryingsAEMU",
+    2350: "OP_glGetTransformFeedbackVarying",
+    2351: "OP_glGenSamplers",
+    2352: "OP_glDeleteSamplers",
+    2353: "OP_glBindSampler",
+    2354: "OP_glSamplerParameterf",
+    2355: "OP_glSamplerParameteri",
+    2356: "OP_glSamplerParameterfv",
+    2357: "OP_glSamplerParameteriv",
+    2358: "OP_glGetSamplerParameterfv",
+    2359: "OP_glGetSamplerParameteriv",
+    2360: "OP_glIsSampler",
+    2361: "OP_glGenQueries",
+    2362: "OP_glDeleteQueries",
+    2363: "OP_glBeginQuery",
+    2364: "OP_glEndQuery",
+    2365: "OP_glGetQueryiv",
+    2366: "OP_glGetQueryObjectuiv",
+    2367: "OP_glIsQuery",
+    2368: "OP_glProgramParameteri",
+    2369: "OP_glProgramBinary",
+    2370: "OP_glGetProgramBinary",
+    2371: "OP_glGetFragDataLocation",
+    2372: "OP_glGetInteger64v",
+    2373: "OP_glGetIntegeri_v",
+    2374: "OP_glGetInteger64i_v",
+    2375: "OP_glTexImage3D",
+    2376: "OP_glTexImage3DOffsetAEMU",
+    2377: "OP_glTexStorage3D",
+    2378: "OP_glTexSubImage3D",
+    2379: "OP_glTexSubImage3DOffsetAEMU",
+    2380: "OP_glCompressedTexImage3D",
+    2381: "OP_glCompressedTexImage3DOffsetAEMU",
+    2382: "OP_glCompressedTexSubImage3D",
+    2383: "OP_glCompressedTexSubImage3DOffsetAEMU",
+    2384: "OP_glCopyTexSubImage3D",
+    2385: "OP_glGetStringi",
+    2386: "OP_glGetBooleani_v",
+    2387: "OP_glMemoryBarrier",
+    2388: "OP_glMemoryBarrierByRegion",
+    2389: "OP_glGenProgramPipelines",
+    2390: "OP_glDeleteProgramPipelines",
+    2391: "OP_glBindProgramPipeline",
+    2392: "OP_glGetProgramPipelineiv",
+    2393: "OP_glGetProgramPipelineInfoLog",
+    2394: "OP_glValidateProgramPipeline",
+    2395: "OP_glIsProgramPipeline",
+    2396: "OP_glUseProgramStages",
+    2397: "OP_glActiveShaderProgram",
+    2398: "OP_glCreateShaderProgramv",
+    2399: "OP_glCreateShaderProgramvAEMU",
+    2400: "OP_glProgramUniform1f",
+    2401: "OP_glProgramUniform2f",
+    2402: "OP_glProgramUniform3f",
+    2403: "OP_glProgramUniform4f",
+    2404: "OP_glProgramUniform1i",
+    2405: "OP_glProgramUniform2i",
+    2406: "OP_glProgramUniform3i",
+    2407: "OP_glProgramUniform4i",
+    2408: "OP_glProgramUniform1ui",
+    2409: "OP_glProgramUniform2ui",
+    2410: "OP_glProgramUniform3ui",
+    2411: "OP_glProgramUniform4ui",
+    2412: "OP_glProgramUniform1fv",
+    2413: "OP_glProgramUniform2fv",
+    2414: "OP_glProgramUniform3fv",
+    2415: "OP_glProgramUniform4fv",
+    2416: "OP_glProgramUniform1iv",
+    2417: "OP_glProgramUniform2iv",
+    2418: "OP_glProgramUniform3iv",
+    2419: "OP_glProgramUniform4iv",
+    2420: "OP_glProgramUniform1uiv",
+    2421: "OP_glProgramUniform2uiv",
+    2422: "OP_glProgramUniform3uiv",
+    2423: "OP_glProgramUniform4uiv",
+    2424: "OP_glProgramUniformMatrix2fv",
+    2425: "OP_glProgramUniformMatrix3fv",
+    2426: "OP_glProgramUniformMatrix4fv",
+    2427: "OP_glProgramUniformMatrix2x3fv",
+    2428: "OP_glProgramUniformMatrix3x2fv",
+    2429: "OP_glProgramUniformMatrix2x4fv",
+    2430: "OP_glProgramUniformMatrix4x2fv",
+    2431: "OP_glProgramUniformMatrix3x4fv",
+    2432: "OP_glProgramUniformMatrix4x3fv",
+    2433: "OP_glGetProgramInterfaceiv",
+    2434: "OP_glGetProgramResourceiv",
+    2435: "OP_glGetProgramResourceIndex",
+    2436: "OP_glGetProgramResourceLocation",
+    2437: "OP_glGetProgramResourceName",
+    2438: "OP_glBindImageTexture",
+    2439: "OP_glDispatchCompute",
+    2440: "OP_glDispatchComputeIndirect",
+    2441: "OP_glBindVertexBuffer",
+    2442: "OP_glVertexAttribBinding",
+    2443: "OP_glVertexAttribFormat",
+    2444: "OP_glVertexAttribIFormat",
+    2445: "OP_glVertexBindingDivisor",
+    2446: "OP_glDrawArraysIndirect",
+    2447: "OP_glDrawArraysIndirectDataAEMU",
+    2448: "OP_glDrawArraysIndirectOffsetAEMU",
+    2449: "OP_glDrawElementsIndirect",
+    2450: "OP_glDrawElementsIndirectDataAEMU",
+    2451: "OP_glDrawElementsIndirectOffsetAEMU",
+    2452: "OP_glTexStorage2DMultisample",
+    2453: "OP_glSampleMaski",
+    2454: "OP_glGetMultisamplefv",
+    2455: "OP_glFramebufferParameteri",
+    2456: "OP_glGetFramebufferParameteriv",
+    2457: "OP_glGetTexLevelParameterfv",
+    2458: "OP_glGetTexLevelParameteriv",
+    2459: "OP_glMapBufferRangeDMA",
+    2460: "OP_glUnmapBufferDMA",
+    2461: "OP_glMapBufferRangeDirect",
+    2462: "OP_glUnmapBufferDirect",
+    2463: "OP_glFlushMappedBufferRangeDirect",
+    2464: "OP_glGetGraphicsResetStatusEXT",
+    2465: "OP_glReadnPixelsEXT",
+    2466: "OP_glGetnUniformfvEXT",
+    2467: "OP_glGetnUniformivEXT",
+    2468: "OP_glDrawArraysNullAEMU",
+    2469: "OP_glDrawElementsNullAEMU",
+    2470: "OP_glDrawElementsOffsetNullAEMU",
+    2471: "OP_glDrawElementsDataNullAEMU",
+    2472: "OP_glUnmapBufferAsyncAEMU",
+    2473: "OP_glFlushMappedBufferRangeAEMU2",
+    2474: "OP_glBufferDataSyncAEMU",
+}
diff --git a/scripts/print_gfx_logs/print_gfx_logs.py b/scripts/print_gfx_logs/print_gfx_logs.py
new file mode 100644
index 0000000..76854e6
--- /dev/null
+++ b/scripts/print_gfx_logs/print_gfx_logs.py
@@ -0,0 +1,194 @@
+"""
+Command line tool to process minidump files and print what was logged by GfxApiLogger.
+
+For more details see:
+
+design: go/bstar-gfx-logging
+g3doc:  http://g3doc/play/g3doc/games/battlestar/kiwivm/graphics-tips.md#gfx-logs
+C++:    http://source/play-internal/battlestar/aosp/device/generic/vulkan-cereal/base/GfxApiLogger.h
+
+Usage:
+
+python3 print_gfx_logs.py <path to minidump file>
+"""
+
+import argparse
+import ctypes
+import sys
+from datetime import datetime
+import mmap
+import textwrap
+import command_printer
+from typing import NamedTuple, Optional, List
+import traceback
+
+
+class Header(ctypes.Structure):
+    """The C struct that we use to represent the data in memory
+    Keep in sync with GfxApiLogger.h
+    """
+    _fields_ = [('signature', ctypes.c_char * 10),
+                ('version', ctypes.c_uint16),
+                ('thread_id', ctypes.c_uint32),
+                ('last_written_time', ctypes.c_uint64),
+                ('write_index', ctypes.c_uint32),
+                ('committed_index', ctypes.c_uint32),
+                ('capture_id', ctypes.c_uint64),
+                ('data_size', ctypes.c_uint32)]
+
+
+class Command(NamedTuple):
+    """A single command in the stream"""
+    opcode: int
+    original_size: int
+    data: bytes
+
+
+class Stream(NamedTuple):
+    """Stream of commands received from the guest"""
+    pos_in_file: int  # Location of this stream in the minidump file, useful for debugging
+    timestamp: int  # Unix timestamp of last command received, in milliseconds
+    thread_id: int
+    capture_id: int
+    commands: List[Command]
+    error_message: Optional[str]  # `None` if there were no errors parsing this stream
+
+
+def read_uint32(buf: bytes, pos: int) -> int:
+    """Reads a single uint32 from buf at a given position"""
+    assert pos + 4 <= len(buf)
+    return int.from_bytes(buf[pos:pos + 4], byteorder='little', signed=False)
+
+
+def process_command(buf: bytes) -> Command:
+    opcode = read_uint32(buf, 0)
+    size = read_uint32(buf, 4)
+    return Command(opcode, size, bytes(buf[8:]))
+
+
+def process_stream(file_bytes: mmap, file_pos: int) -> Stream:
+    # Read the header
+    file_bytes.seek(file_pos)
+    header = Header()
+    header_bytes = file_bytes.read(ctypes.sizeof(header))
+    ctypes.memmove(ctypes.addressof(header), header_bytes, ctypes.sizeof(header))
+
+    if header.signature != b'GFXAPILOG':
+        return Stream(file_pos, error_message="Signature doesn't match")
+
+    if header.version != 2:
+        return Stream(file_pos, error_message=("This script can only process version 2 of the graphics API logs, " +
+                                               "but the dump file uses version {} ").format(data.version))
+
+    # Convert Windows' GetSystemTimeAsFileTime to Unix timestamp
+    # https://stackoverflow.com/questions/1695288/getting-the-current-time-in-milliseconds-from-the-system-clock-in-windows
+    timestamp_ms = int(header.last_written_time / 10000 - 11644473600000)
+    if timestamp_ms <= 0: timestamp_ms = 0
+
+    # Sanity check the size
+    if header.data_size > 5_000_000:
+        return Stream(file_pos,
+                      error_message="data size is larger than 5MB. This likely indicates garbage/corrupted data")
+
+    if header.committed_index >= header.data_size:
+        return Stream(file_pos,
+                      error_message="index is larger than buffer size. Likely indicates garbage/corrupted data")
+
+    file_bytes.seek(file_pos + ctypes.sizeof(header))
+    data = file_bytes.read(header.data_size)
+
+    # Reorder the buffer so that we can read it in a single pass from back to front
+    buf = data[header.committed_index:] + data[:header.committed_index]
+
+    commands = []
+    i = len(buf)
+    while i >= 4:
+        i -= 4
+        size = read_uint32(buf, i)
+        if size == 0 or size > i:
+            # We reached the end of the stream
+            break
+        cmd = process_command(buf[i - size:i])
+
+        commands.append(cmd)
+        i -= size
+
+    commands.reverse()  # so that they're sorted from oldest to most recent
+    return Stream(file_pos, timestamp_ms, header.thread_id, header.capture_id, commands, None)
+
+
+def process_minidump(dump_file: str) -> List[Stream]:
+    """
+    Extracts a list of commands streams from a minidump file
+    """
+    streams = []
+    with open(dump_file, "r+b") as f:
+        mm = mmap.mmap(f.fileno(), 0)
+        pos = 0
+        while True:
+            pos = mm.find(b'GFXAPILOG', pos + 1)
+            if pos == -1:
+                break
+            streams.append(process_stream(mm, pos))
+
+    return streams
+
+
+def main():
+    parser = argparse.ArgumentParser(description="""Command line tool to process crash reports and print out the 
+    commands logged by GfxApiLogger""")
+    parser.add_argument('dump_file', help="Path to  minidump file")
+
+    args = parser.parse_args()
+    streams = process_minidump(args.dump_file)
+
+    streams.sort(key=lambda s: s.timestamp)
+
+    total_commands = 0
+    num_errors = 0
+    for stream_idx, stream in enumerate(streams):
+        print(textwrap.dedent("""
+                  ======================================================= 
+                  GfxApiLog command stream #{} at offset {} in dump
+                    - Timestamp: {}
+                    - Thread id: {}
+                    - Capture id: {}""".format(stream_idx, stream.pos_in_file,
+                                               datetime.fromtimestamp(stream.timestamp / 1000.0),
+                                               stream.thread_id,
+                                               stream.capture_id)))
+        if stream.error_message:
+            print("Could not decode stream. Error: ", stream.error_message)
+            continue
+
+        subdecode_size = 0
+        for cmd_idx, cmd in enumerate(stream.commands):
+            total_commands += 1
+            cmd_printer = command_printer.CommandPrinter(cmd.opcode, cmd.original_size, cmd.data, stream_idx, cmd_idx)
+
+            try:
+                cmd_printer.print_cmd()
+            except:
+                num_errors += 1
+                # Print stack trace and continue
+                traceback.print_exc(file=sys.stdout)
+
+            if subdecode_size > 0:
+                subdecode_size -= cmd.original_size
+                assert subdecode_size >= 0
+                if subdecode_size == 0:
+                    print("\n--- end of subdecode ---")
+
+            if cmd_printer.cmd_name() == "OP_vkQueueFlushCommandsGOOGLE":
+                assert subdecode_size == 0
+                subdecode_size = cmd.original_size - 36
+                print("\n--- start of subdecode, size = {} bytes ---".format(subdecode_size))
+    print("\nDone: {} commands, {} errors".format(total_commands, num_errors))
+    if num_errors > 0:
+        print("""
+NOTE: This script uses some simplifying assumptions to decode the commands. All
+decoding errors are almost certainly a bug with this script, NOT a sign of bad
+or corrupted data.""")
+
+
+if __name__ == '__main__':
+    main()
diff --git a/scripts/print_gfx_logs/vulkan_printer.py b/scripts/print_gfx_logs/vulkan_printer.py
new file mode 100644
index 0000000..2873225
--- /dev/null
+++ b/scripts/print_gfx_logs/vulkan_printer.py
@@ -0,0 +1,2390 @@
+#####################################################################################################
+# Pretty-printer functions for Vulkan data structures
+# THIS FILE IS AUTO-GENERATED - DO NOT EDIT
+#
+# To re-generate this file, run generate-vulkan-sources.sh
+#####################################################################################################
+
+def OP_vkAcquireImageANDROID(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    device = printer.write_int("device", 8, indent, signed=False, big_endian=False)
+    image = printer.write_int("image", 8, indent, signed=False, big_endian=False)
+    nativeFenceFd = printer.write_int("nativeFenceFd", 4, indent, signed=True, big_endian=False)
+    semaphore = printer.write_int("semaphore", 8, indent, signed=False, big_endian=False)
+    fence = printer.write_int("fence", 8, indent, signed=False, big_endian=False)
+    return
+
+def OP_vkAllocateMemory(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    device = printer.write_int("device", 8, indent, signed=False, big_endian=False)
+    printer.write_struct("pAllocateInfo", struct_VkMemoryAllocateInfo, False, None, indent)
+    printer.write_struct("pAllocator", struct_VkAllocationCallbacks, True, None, indent)
+    pMemory = printer.write_int("pMemory", 8, indent, optional=False, count=None, big_endian=False)
+    return
+
+def OP_vkBeginCommandBufferAsyncGOOGLE(printer, indent: int):
+    printer.write_struct("pBeginInfo", struct_VkCommandBufferBeginInfo, False, None, indent)
+    return
+
+def OP_vkBindBufferMemory(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    device = printer.write_int("device", 8, indent, signed=False, big_endian=False)
+    buffer = printer.write_int("buffer", 8, indent, signed=False, big_endian=False)
+    memory = printer.write_int("memory", 8, indent, signed=False, big_endian=False)
+    memoryOffset = printer.write_int("memoryOffset", 8, indent, signed=False, big_endian=False)
+    return
+
+def OP_vkBindImageMemory(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    device = printer.write_int("device", 8, indent, signed=False, big_endian=False)
+    image = printer.write_int("image", 8, indent, signed=False, big_endian=False)
+    memory = printer.write_int("memory", 8, indent, signed=False, big_endian=False)
+    memoryOffset = printer.write_int("memoryOffset", 8, indent, signed=False, big_endian=False)
+    return
+
+def OP_vkCmdBeginRenderPass(printer, indent: int):
+    printer.write_struct("pRenderPassBegin", struct_VkRenderPassBeginInfo, False, None, indent)
+    printer.write_enum("contents", VkSubpassContents, indent)
+    return
+
+def OP_vkCmdBindDescriptorSets(printer, indent: int):
+    printer.write_enum("pipelineBindPoint", VkPipelineBindPoint, indent)
+    layout = printer.write_int("layout", 8, indent, signed=False, big_endian=False)
+    firstSet = printer.write_int("firstSet", 4, indent, signed=False, big_endian=False)
+    descriptorSetCount = printer.write_int("descriptorSetCount", 4, indent, signed=False, big_endian=False)
+    pDescriptorSets = printer.write_int("pDescriptorSets", 8, indent, optional=False, count=descriptorSetCount, big_endian=False)
+    dynamicOffsetCount = printer.write_int("dynamicOffsetCount", 4, indent, signed=False, big_endian=False)
+    pDynamicOffsets = printer.write_int("pDynamicOffsets", 4, indent, optional=False, count=dynamicOffsetCount, big_endian=False)
+    return
+
+def OP_vkCmdBindIndexBuffer(printer, indent: int):
+    buffer = printer.write_int("buffer", 8, indent, signed=False, big_endian=False)
+    offset = printer.write_int("offset", 8, indent, signed=False, big_endian=False)
+    printer.write_enum("indexType", VkIndexType, indent)
+    return
+
+def OP_vkCmdBindPipeline(printer, indent: int):
+    printer.write_enum("pipelineBindPoint", VkPipelineBindPoint, indent)
+    pipeline = printer.write_int("pipeline", 8, indent, signed=False, big_endian=False)
+    return
+
+def OP_vkCmdBindVertexBuffers(printer, indent: int):
+    firstBinding = printer.write_int("firstBinding", 4, indent, signed=False, big_endian=False)
+    bindingCount = printer.write_int("bindingCount", 4, indent, signed=False, big_endian=False)
+    pBuffers = printer.write_int("pBuffers", 8, indent, optional=False, count=bindingCount, big_endian=False)
+    pOffsets = printer.write_int("pOffsets", 8, indent, optional=False, count=bindingCount, big_endian=False)
+    return
+
+def OP_vkCmdClearAttachments(printer, indent: int):
+    attachmentCount = printer.write_int("attachmentCount", 4, indent, signed=False, big_endian=False)
+    printer.write_struct("pAttachments", struct_VkClearAttachment, False, attachmentCount, indent)
+    rectCount = printer.write_int("rectCount", 4, indent, signed=False, big_endian=False)
+    printer.write_struct("pRects", struct_VkClearRect, False, rectCount, indent)
+    return
+
+def OP_vkCmdClearColorImage(printer, indent: int):
+    image = printer.write_int("image", 8, indent, signed=False, big_endian=False)
+    printer.write_enum("imageLayout", VkImageLayout, indent)
+    printer.write_struct("pColor", struct_VkClearColorValue, False, None, indent)
+    rangeCount = printer.write_int("rangeCount", 4, indent, signed=False, big_endian=False)
+    printer.write_struct("pRanges", struct_VkImageSubresourceRange, False, rangeCount, indent)
+    return
+
+def OP_vkCmdCopyBufferToImage(printer, indent: int):
+    srcBuffer = printer.write_int("srcBuffer", 8, indent, signed=False, big_endian=False)
+    dstImage = printer.write_int("dstImage", 8, indent, signed=False, big_endian=False)
+    printer.write_enum("dstImageLayout", VkImageLayout, indent)
+    regionCount = printer.write_int("regionCount", 4, indent, signed=False, big_endian=False)
+    printer.write_struct("pRegions", struct_VkBufferImageCopy, False, regionCount, indent)
+    return
+
+def OP_vkCmdCopyImageToBuffer(printer, indent: int):
+    srcImage = printer.write_int("srcImage", 8, indent, signed=False, big_endian=False)
+    printer.write_enum("srcImageLayout", VkImageLayout, indent)
+    dstBuffer = printer.write_int("dstBuffer", 8, indent, signed=False, big_endian=False)
+    regionCount = printer.write_int("regionCount", 4, indent, signed=False, big_endian=False)
+    printer.write_struct("pRegions", struct_VkBufferImageCopy, False, regionCount, indent)
+    return
+
+def OP_vkCmdDraw(printer, indent: int):
+    vertexCount = printer.write_int("vertexCount", 4, indent, signed=False, big_endian=False)
+    instanceCount = printer.write_int("instanceCount", 4, indent, signed=False, big_endian=False)
+    firstVertex = printer.write_int("firstVertex", 4, indent, signed=False, big_endian=False)
+    firstInstance = printer.write_int("firstInstance", 4, indent, signed=False, big_endian=False)
+    return
+
+def OP_vkCmdDrawIndexed(printer, indent: int):
+    indexCount = printer.write_int("indexCount", 4, indent, signed=False, big_endian=False)
+    instanceCount = printer.write_int("instanceCount", 4, indent, signed=False, big_endian=False)
+    firstIndex = printer.write_int("firstIndex", 4, indent, signed=False, big_endian=False)
+    vertexOffset = printer.write_int("vertexOffset", 4, indent, signed=True, big_endian=False)
+    firstInstance = printer.write_int("firstInstance", 4, indent, signed=False, big_endian=False)
+    return
+
+def OP_vkCmdEndRenderPass(printer, indent: int):
+    return
+
+def OP_vkCmdPipelineBarrier(printer, indent: int):
+    srcStageMask = printer.write_int("srcStageMask", 4, indent, signed=False, big_endian=False)
+    dstStageMask = printer.write_int("dstStageMask", 4, indent, signed=False, big_endian=False)
+    dependencyFlags = printer.write_int("dependencyFlags", 4, indent, signed=False, big_endian=False)
+    memoryBarrierCount = printer.write_int("memoryBarrierCount", 4, indent, signed=False, big_endian=False)
+    printer.write_struct("pMemoryBarriers", struct_VkMemoryBarrier, False, memoryBarrierCount, indent)
+    bufferMemoryBarrierCount = printer.write_int("bufferMemoryBarrierCount", 4, indent, signed=False, big_endian=False)
+    printer.write_struct("pBufferMemoryBarriers", struct_VkBufferMemoryBarrier, False, bufferMemoryBarrierCount, indent)
+    imageMemoryBarrierCount = printer.write_int("imageMemoryBarrierCount", 4, indent, signed=False, big_endian=False)
+    printer.write_struct("pImageMemoryBarriers", struct_VkImageMemoryBarrier, False, imageMemoryBarrierCount, indent)
+    return
+
+def OP_vkCmdSetScissor(printer, indent: int):
+    firstScissor = printer.write_int("firstScissor", 4, indent, signed=False, big_endian=False)
+    scissorCount = printer.write_int("scissorCount", 4, indent, signed=False, big_endian=False)
+    printer.write_struct("pScissors", struct_VkRect2D, False, scissorCount, indent)
+    return
+
+def OP_vkCmdSetViewport(printer, indent: int):
+    firstViewport = printer.write_int("firstViewport", 4, indent, signed=False, big_endian=False)
+    viewportCount = printer.write_int("viewportCount", 4, indent, signed=False, big_endian=False)
+    printer.write_struct("pViewports", struct_VkViewport, False, viewportCount, indent)
+    return
+
+def OP_vkCollectDescriptorPoolIdsGOOGLE(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    device = printer.write_int("device", 8, indent, signed=False, big_endian=False)
+    descriptorPool = printer.write_int("descriptorPool", 8, indent, signed=False, big_endian=False)
+    pPoolIdCount = printer.write_int("pPoolIdCount", 4, indent, optional=False, count=None, big_endian=False)
+    pPoolIds = printer.write_int("pPoolIds", 8, indent, optional=True, count=pPoolIdCount, big_endian=False)
+    return
+
+def OP_vkCreateBufferWithRequirementsGOOGLE(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    device = printer.write_int("device", 8, indent, signed=False, big_endian=False)
+    printer.write_struct("pCreateInfo", struct_VkBufferCreateInfo, False, None, indent)
+    printer.write_struct("pAllocator", struct_VkAllocationCallbacks, True, None, indent)
+    pBuffer = printer.write_int("pBuffer", 8, indent, optional=False, count=None, big_endian=False)
+    printer.write_struct("pMemoryRequirements", struct_VkMemoryRequirements, False, None, indent)
+    return
+
+def OP_vkCreateDescriptorPool(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    device = printer.write_int("device", 8, indent, signed=False, big_endian=False)
+    printer.write_struct("pCreateInfo", struct_VkDescriptorPoolCreateInfo, False, None, indent)
+    printer.write_struct("pAllocator", struct_VkAllocationCallbacks, True, None, indent)
+    pDescriptorPool = printer.write_int("pDescriptorPool", 8, indent, optional=False, count=None, big_endian=False)
+    return
+
+def OP_vkCreateDescriptorSetLayout(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    device = printer.write_int("device", 8, indent, signed=False, big_endian=False)
+    printer.write_struct("pCreateInfo", struct_VkDescriptorSetLayoutCreateInfo, False, None, indent)
+    printer.write_struct("pAllocator", struct_VkAllocationCallbacks, True, None, indent)
+    pSetLayout = printer.write_int("pSetLayout", 8, indent, optional=False, count=None, big_endian=False)
+    return
+
+def OP_vkCreateFence(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    device = printer.write_int("device", 8, indent, signed=False, big_endian=False)
+    printer.write_struct("pCreateInfo", struct_VkFenceCreateInfo, False, None, indent)
+    printer.write_struct("pAllocator", struct_VkAllocationCallbacks, True, None, indent)
+    pFence = printer.write_int("pFence", 8, indent, optional=False, count=None, big_endian=False)
+    return
+
+def OP_vkCreateFramebuffer(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    device = printer.write_int("device", 8, indent, signed=False, big_endian=False)
+    printer.write_struct("pCreateInfo", struct_VkFramebufferCreateInfo, False, None, indent)
+    printer.write_struct("pAllocator", struct_VkAllocationCallbacks, True, None, indent)
+    pFramebuffer = printer.write_int("pFramebuffer", 8, indent, optional=False, count=None, big_endian=False)
+    return
+
+def OP_vkCreateGraphicsPipelines(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    device = printer.write_int("device", 8, indent, signed=False, big_endian=False)
+    pipelineCache = printer.write_int("pipelineCache", 8, indent, signed=False, big_endian=False)
+    createInfoCount = printer.write_int("createInfoCount", 4, indent, signed=False, big_endian=False)
+    printer.write_struct("pCreateInfos", struct_VkGraphicsPipelineCreateInfo, False, createInfoCount, indent)
+    printer.write_struct("pAllocator", struct_VkAllocationCallbacks, True, None, indent)
+    pPipelines = printer.write_int("pPipelines", 8, indent, optional=False, count=createInfoCount, big_endian=False)
+    return
+
+def OP_vkCreateImageView(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    device = printer.write_int("device", 8, indent, signed=False, big_endian=False)
+    printer.write_struct("pCreateInfo", struct_VkImageViewCreateInfo, False, None, indent)
+    printer.write_struct("pAllocator", struct_VkAllocationCallbacks, True, None, indent)
+    pView = printer.write_int("pView", 8, indent, optional=False, count=None, big_endian=False)
+    return
+
+def OP_vkCreateImageWithRequirementsGOOGLE(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    device = printer.write_int("device", 8, indent, signed=False, big_endian=False)
+    printer.write_struct("pCreateInfo", struct_VkImageCreateInfo, False, None, indent)
+    printer.write_struct("pAllocator", struct_VkAllocationCallbacks, True, None, indent)
+    pImage = printer.write_int("pImage", 8, indent, optional=False, count=None, big_endian=False)
+    printer.write_struct("pMemoryRequirements", struct_VkMemoryRequirements, False, None, indent)
+    return
+
+def OP_vkCreatePipelineCache(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    device = printer.write_int("device", 8, indent, signed=False, big_endian=False)
+    printer.write_struct("pCreateInfo", struct_VkPipelineCacheCreateInfo, False, None, indent)
+    printer.write_struct("pAllocator", struct_VkAllocationCallbacks, True, None, indent)
+    pPipelineCache = printer.write_int("pPipelineCache", 8, indent, optional=False, count=None, big_endian=False)
+    return
+
+def OP_vkCreateRenderPass(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    device = printer.write_int("device", 8, indent, signed=False, big_endian=False)
+    printer.write_struct("pCreateInfo", struct_VkRenderPassCreateInfo, False, None, indent)
+    printer.write_struct("pAllocator", struct_VkAllocationCallbacks, True, None, indent)
+    pRenderPass = printer.write_int("pRenderPass", 8, indent, optional=False, count=None, big_endian=False)
+    return
+
+def OP_vkCreateSampler(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    device = printer.write_int("device", 8, indent, signed=False, big_endian=False)
+    printer.write_struct("pCreateInfo", struct_VkSamplerCreateInfo, False, None, indent)
+    printer.write_struct("pAllocator", struct_VkAllocationCallbacks, True, None, indent)
+    pSampler = printer.write_int("pSampler", 8, indent, optional=False, count=None, big_endian=False)
+    return
+
+def OP_vkCreateSemaphore(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    device = printer.write_int("device", 8, indent, signed=False, big_endian=False)
+    printer.write_struct("pCreateInfo", struct_VkSemaphoreCreateInfo, False, None, indent)
+    printer.write_struct("pAllocator", struct_VkAllocationCallbacks, True, None, indent)
+    pSemaphore = printer.write_int("pSemaphore", 8, indent, optional=False, count=None, big_endian=False)
+    return
+
+def OP_vkCreateShaderModule(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    device = printer.write_int("device", 8, indent, signed=False, big_endian=False)
+    printer.write_struct("pCreateInfo", struct_VkShaderModuleCreateInfo, False, None, indent)
+    printer.write_struct("pAllocator", struct_VkAllocationCallbacks, True, None, indent)
+    pShaderModule = printer.write_int("pShaderModule", 8, indent, optional=False, count=None, big_endian=False)
+    return
+
+def OP_vkDestroyBuffer(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    device = printer.write_int("device", 8, indent, signed=False, big_endian=False)
+    buffer = printer.write_int("buffer", 8, indent, signed=False, big_endian=False)
+    printer.write_struct("pAllocator", struct_VkAllocationCallbacks, True, None, indent)
+    return
+
+def OP_vkDestroyCommandPool(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    device = printer.write_int("device", 8, indent, signed=False, big_endian=False)
+    commandPool = printer.write_int("commandPool", 8, indent, signed=False, big_endian=False)
+    printer.write_struct("pAllocator", struct_VkAllocationCallbacks, True, None, indent)
+    return
+
+def OP_vkDestroyDescriptorPool(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    device = printer.write_int("device", 8, indent, signed=False, big_endian=False)
+    descriptorPool = printer.write_int("descriptorPool", 8, indent, signed=False, big_endian=False)
+    printer.write_struct("pAllocator", struct_VkAllocationCallbacks, True, None, indent)
+    return
+
+def OP_vkDestroyDescriptorSetLayout(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    device = printer.write_int("device", 8, indent, signed=False, big_endian=False)
+    descriptorSetLayout = printer.write_int("descriptorSetLayout", 8, indent, signed=False, big_endian=False)
+    printer.write_struct("pAllocator", struct_VkAllocationCallbacks, True, None, indent)
+    return
+
+def OP_vkDestroyDevice(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    device = printer.write_int("device", 8, indent, signed=False, big_endian=False)
+    printer.write_struct("pAllocator", struct_VkAllocationCallbacks, True, None, indent)
+    return
+
+def OP_vkDestroyFence(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    device = printer.write_int("device", 8, indent, signed=False, big_endian=False)
+    fence = printer.write_int("fence", 8, indent, signed=False, big_endian=False)
+    printer.write_struct("pAllocator", struct_VkAllocationCallbacks, True, None, indent)
+    return
+
+def OP_vkDestroyFramebuffer(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    device = printer.write_int("device", 8, indent, signed=False, big_endian=False)
+    framebuffer = printer.write_int("framebuffer", 8, indent, signed=False, big_endian=False)
+    printer.write_struct("pAllocator", struct_VkAllocationCallbacks, True, None, indent)
+    return
+
+def OP_vkDestroyImage(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    device = printer.write_int("device", 8, indent, signed=False, big_endian=False)
+    image = printer.write_int("image", 8, indent, signed=False, big_endian=False)
+    printer.write_struct("pAllocator", struct_VkAllocationCallbacks, True, None, indent)
+    return
+
+def OP_vkDestroyImageView(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    device = printer.write_int("device", 8, indent, signed=False, big_endian=False)
+    imageView = printer.write_int("imageView", 8, indent, signed=False, big_endian=False)
+    printer.write_struct("pAllocator", struct_VkAllocationCallbacks, True, None, indent)
+    return
+
+def OP_vkDestroyInstance(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    instance = printer.write_int("instance", 8, indent, signed=False, big_endian=False)
+    printer.write_struct("pAllocator", struct_VkAllocationCallbacks, True, None, indent)
+    return
+
+def OP_vkDestroyPipeline(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    device = printer.write_int("device", 8, indent, signed=False, big_endian=False)
+    pipeline = printer.write_int("pipeline", 8, indent, signed=False, big_endian=False)
+    printer.write_struct("pAllocator", struct_VkAllocationCallbacks, True, None, indent)
+    return
+
+def OP_vkDestroyPipelineCache(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    device = printer.write_int("device", 8, indent, signed=False, big_endian=False)
+    pipelineCache = printer.write_int("pipelineCache", 8, indent, signed=False, big_endian=False)
+    printer.write_struct("pAllocator", struct_VkAllocationCallbacks, True, None, indent)
+    return
+
+def OP_vkDestroyPipelineLayout(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    device = printer.write_int("device", 8, indent, signed=False, big_endian=False)
+    pipelineLayout = printer.write_int("pipelineLayout", 8, indent, signed=False, big_endian=False)
+    printer.write_struct("pAllocator", struct_VkAllocationCallbacks, True, None, indent)
+    return
+
+def OP_vkDestroyRenderPass(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    device = printer.write_int("device", 8, indent, signed=False, big_endian=False)
+    renderPass = printer.write_int("renderPass", 8, indent, signed=False, big_endian=False)
+    printer.write_struct("pAllocator", struct_VkAllocationCallbacks, True, None, indent)
+    return
+
+def OP_vkDestroySemaphore(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    device = printer.write_int("device", 8, indent, signed=False, big_endian=False)
+    semaphore = printer.write_int("semaphore", 8, indent, signed=False, big_endian=False)
+    printer.write_struct("pAllocator", struct_VkAllocationCallbacks, True, None, indent)
+    return
+
+def OP_vkDestroyShaderModule(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    device = printer.write_int("device", 8, indent, signed=False, big_endian=False)
+    shaderModule = printer.write_int("shaderModule", 8, indent, signed=False, big_endian=False)
+    printer.write_struct("pAllocator", struct_VkAllocationCallbacks, True, None, indent)
+    return
+
+def OP_vkEndCommandBufferAsyncGOOGLE(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    return
+
+def OP_vkFreeCommandBuffers(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    device = printer.write_int("device", 8, indent, signed=False, big_endian=False)
+    commandPool = printer.write_int("commandPool", 8, indent, signed=False, big_endian=False)
+    commandBufferCount = printer.write_int("commandBufferCount", 4, indent, signed=False, big_endian=False)
+    pCommandBuffers = printer.write_int("pCommandBuffers", 8, indent, optional=True, count=commandBufferCount, big_endian=False)
+    return
+
+def OP_vkFreeMemory(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    device = printer.write_int("device", 8, indent, signed=False, big_endian=False)
+    memory = printer.write_int("memory", 8, indent, signed=False, big_endian=False)
+    printer.write_struct("pAllocator", struct_VkAllocationCallbacks, True, None, indent)
+    return
+
+def OP_vkFreeMemorySyncGOOGLE(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    device = printer.write_int("device", 8, indent, signed=False, big_endian=False)
+    memory = printer.write_int("memory", 8, indent, signed=False, big_endian=False)
+    printer.write_struct("pAllocator", struct_VkAllocationCallbacks, True, None, indent)
+    return
+
+def OP_vkGetFenceStatus(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    device = printer.write_int("device", 8, indent, signed=False, big_endian=False)
+    fence = printer.write_int("fence", 8, indent, signed=False, big_endian=False)
+    return
+
+def OP_vkGetMemoryHostAddressInfoGOOGLE(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    device = printer.write_int("device", 8, indent, signed=False, big_endian=False)
+    memory = printer.write_int("memory", 8, indent, signed=False, big_endian=False)
+    pAddress = printer.write_int("pAddress", 8, indent, optional=True, count=None, big_endian=False)
+    pSize = printer.write_int("pSize", 8, indent, optional=True, count=None, big_endian=False)
+    pHostmemId = printer.write_int("pHostmemId", 8, indent, optional=True, count=None, big_endian=False)
+    return
+
+def OP_vkGetPhysicalDeviceFormatProperties(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    physicalDevice = printer.write_int("physicalDevice", 8, indent, signed=False, big_endian=False)
+    printer.write_enum("format", VkFormat, indent)
+    printer.write_struct("pFormatProperties", struct_VkFormatProperties, False, None, indent)
+    return
+
+def OP_vkGetPhysicalDeviceProperties2KHR(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    physicalDevice = printer.write_int("physicalDevice", 8, indent, signed=False, big_endian=False)
+    printer.write_struct("pProperties", struct_VkPhysicalDeviceProperties2, False, None, indent)
+    return
+
+def OP_vkGetPipelineCacheData(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    device = printer.write_int("device", 8, indent, signed=False, big_endian=False)
+    pipelineCache = printer.write_int("pipelineCache", 8, indent, signed=False, big_endian=False)
+    pDataSize = printer.write_int("pDataSize", 8, indent, optional=True, count=None, big_endian=True)
+    pData = printer.write_int("pData", 8, indent, optional=True, count=pDataSize, big_endian=False)
+    return
+
+def OP_vkGetSwapchainGrallocUsageANDROID(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    device = printer.write_int("device", 8, indent, signed=False, big_endian=False)
+    printer.write_enum("format", VkFormat, indent)
+    imageUsage = printer.write_int("imageUsage", 4, indent, signed=False, big_endian=False)
+    grallocUsage = printer.write_int("grallocUsage", 4, indent, optional=False, count=None, big_endian=False)
+    return
+
+def OP_vkQueueCommitDescriptorSetUpdatesGOOGLE(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    queue = printer.write_int("queue", 8, indent, signed=False, big_endian=False)
+    descriptorPoolCount = printer.write_int("descriptorPoolCount", 4, indent, signed=False, big_endian=False)
+    pDescriptorPools = printer.write_int("pDescriptorPools", 8, indent, optional=False, count=descriptorPoolCount, big_endian=False)
+    descriptorSetCount = printer.write_int("descriptorSetCount", 4, indent, signed=False, big_endian=False)
+    pSetLayouts = printer.write_int("pSetLayouts", 8, indent, optional=False, count=descriptorSetCount, big_endian=False)
+    pDescriptorSetPoolIds = printer.write_int("pDescriptorSetPoolIds", 8, indent, optional=False, count=descriptorSetCount, big_endian=False)
+    pDescriptorSetWhichPool = printer.write_int("pDescriptorSetWhichPool", 4, indent, optional=False, count=descriptorSetCount, big_endian=False)
+    pDescriptorSetPendingAllocation = printer.write_int("pDescriptorSetPendingAllocation", 4, indent, optional=False, count=descriptorSetCount, big_endian=False)
+    pDescriptorWriteStartingIndices = printer.write_int("pDescriptorWriteStartingIndices", 4, indent, optional=False, count=descriptorSetCount, big_endian=False)
+    pendingDescriptorWriteCount = printer.write_int("pendingDescriptorWriteCount", 4, indent, signed=False, big_endian=False)
+    printer.write_struct("pPendingDescriptorWrites", struct_VkWriteDescriptorSet, False, pendingDescriptorWriteCount, indent)
+    return
+
+def OP_vkQueueFlushCommandsGOOGLE(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    queue = printer.write_int("queue", 8, indent, signed=False, big_endian=False)
+    commandBuffer = printer.write_int("commandBuffer", 8, indent, signed=False, big_endian=False)
+    dataSize = printer.write_int("dataSize", 8, indent, signed=False, big_endian=False)
+    return
+
+def OP_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    queue = printer.write_int("queue", 8, indent, signed=False, big_endian=False)
+    waitSemaphoreCount = printer.write_int("waitSemaphoreCount", 4, indent, signed=False, big_endian=False)
+    pWaitSemaphores = printer.write_int("pWaitSemaphores", 8, indent, optional=True, count=waitSemaphoreCount, big_endian=False)
+    image = printer.write_int("image", 8, indent, signed=False, big_endian=False)
+    return
+
+def OP_vkQueueSubmitAsyncGOOGLE(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    queue = printer.write_int("queue", 8, indent, signed=False, big_endian=False)
+    submitCount = printer.write_int("submitCount", 4, indent, signed=False, big_endian=False)
+    printer.write_struct("pSubmits", struct_VkSubmitInfo, False, submitCount, indent)
+    fence = printer.write_int("fence", 8, indent, signed=False, big_endian=False)
+    return
+
+def OP_vkQueueWaitIdle(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    queue = printer.write_int("queue", 8, indent, signed=False, big_endian=False)
+    return
+
+def OP_vkResetFences(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    device = printer.write_int("device", 8, indent, signed=False, big_endian=False)
+    fenceCount = printer.write_int("fenceCount", 4, indent, signed=False, big_endian=False)
+    pFences = printer.write_int("pFences", 8, indent, optional=False, count=fenceCount, big_endian=False)
+    return
+
+def OP_vkWaitForFences(printer, indent: int):
+    printer.write_int("seqno: ", 4, indent)
+    device = printer.write_int("device", 8, indent, signed=False, big_endian=False)
+    fenceCount = printer.write_int("fenceCount", 4, indent, signed=False, big_endian=False)
+    pFences = printer.write_int("pFences", 8, indent, optional=False, count=fenceCount, big_endian=False)
+    waitAll = printer.write_int("waitAll", 4, indent, signed=False, big_endian=False)
+    timeout = printer.write_int("timeout", 8, indent, signed=False, big_endian=False)
+    return
+
+def struct_VkAllocationCallbacks(printer, indent: int):
+    pUserData = printer.write_int("pUserData", 8, indent, optional=True, count=None, big_endian=False)
+    pfnAllocation = printer.write_int("pfnAllocation", 8, indent, signed=False, big_endian=False)
+    pfnReallocation = printer.write_int("pfnReallocation", 8, indent, signed=False, big_endian=False)
+    pfnFree = printer.write_int("pfnFree", 8, indent, signed=False, big_endian=False)
+    pfnInternalAllocation = printer.write_int("pfnInternalAllocation", 8, indent, signed=False, big_endian=False)
+    pfnInternalFree = printer.write_int("pfnInternalFree", 8, indent, signed=False, big_endian=False)
+
+def struct_VkAttachmentDescription(printer, indent: int):
+    flags = printer.write_int("flags", 4, indent, signed=False, big_endian=False)
+    printer.write_enum("format", VkFormat, indent)
+    printer.write_enum("samples", VkSampleCountFlagBits, indent)
+    printer.write_enum("loadOp", VkAttachmentLoadOp, indent)
+    printer.write_enum("storeOp", VkAttachmentStoreOp, indent)
+    printer.write_enum("stencilLoadOp", VkAttachmentLoadOp, indent)
+    printer.write_enum("stencilStoreOp", VkAttachmentStoreOp, indent)
+    printer.write_enum("initialLayout", VkImageLayout, indent)
+    printer.write_enum("finalLayout", VkImageLayout, indent)
+
+def struct_VkAttachmentReference(printer, indent: int):
+    attachment = printer.write_int("attachment", 4, indent, signed=False, big_endian=False)
+    printer.write_enum("layout", VkImageLayout, indent)
+
+def struct_VkBufferCreateInfo(printer, indent: int):
+    printer.write_stype_and_pnext("VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO", indent)
+    flags = printer.write_int("flags", 4, indent, signed=False, big_endian=False)
+    size = printer.write_int("size", 8, indent, signed=False, big_endian=False)
+    usage = printer.write_int("usage", 4, indent, signed=False, big_endian=False)
+    printer.write_enum("sharingMode", VkSharingMode, indent)
+    queueFamilyIndexCount = printer.write_int("queueFamilyIndexCount", 4, indent, signed=False, big_endian=False)
+    pQueueFamilyIndices = printer.write_int("pQueueFamilyIndices", 4, indent, optional=True, count=queueFamilyIndexCount, big_endian=False)
+
+def struct_VkBufferImageCopy(printer, indent: int):
+    bufferOffset = printer.write_int("bufferOffset", 8, indent, signed=False, big_endian=False)
+    bufferRowLength = printer.write_int("bufferRowLength", 4, indent, signed=False, big_endian=False)
+    bufferImageHeight = printer.write_int("bufferImageHeight", 4, indent, signed=False, big_endian=False)
+    printer.write_struct("imageSubresource", struct_VkImageSubresourceLayers, False, None, indent)
+    printer.write_struct("imageOffset", struct_VkOffset3D, False, None, indent)
+    printer.write_struct("imageExtent", struct_VkExtent3D, False, None, indent)
+
+def struct_VkBufferMemoryBarrier(printer, indent: int):
+    printer.write_stype_and_pnext("VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER", indent)
+    srcAccessMask = printer.write_int("srcAccessMask", 4, indent, signed=False, big_endian=False)
+    dstAccessMask = printer.write_int("dstAccessMask", 4, indent, signed=False, big_endian=False)
+    srcQueueFamilyIndex = printer.write_int("srcQueueFamilyIndex", 4, indent, signed=False, big_endian=False)
+    dstQueueFamilyIndex = printer.write_int("dstQueueFamilyIndex", 4, indent, signed=False, big_endian=False)
+    buffer = printer.write_int("buffer", 8, indent, signed=False, big_endian=False)
+    offset = printer.write_int("offset", 8, indent, signed=False, big_endian=False)
+    size = printer.write_int("size", 8, indent, signed=False, big_endian=False)
+
+def struct_VkClearAttachment(printer, indent: int):
+    aspectMask = printer.write_int("aspectMask", 4, indent, signed=False, big_endian=False)
+    colorAttachment = printer.write_int("colorAttachment", 4, indent, signed=False, big_endian=False)
+    printer.write_struct("clearValue", struct_VkClearValue, False, None, indent)
+
+def struct_VkClearColorValue(printer, indent: int):
+    printer.write_float("float32", indent, count=4)
+
+def struct_VkClearRect(printer, indent: int):
+    printer.write_struct("rect", struct_VkRect2D, False, None, indent)
+    baseArrayLayer = printer.write_int("baseArrayLayer", 4, indent, signed=False, big_endian=False)
+    layerCount = printer.write_int("layerCount", 4, indent, signed=False, big_endian=False)
+
+def struct_VkClearValue(printer, indent: int):
+    printer.write_struct("color", struct_VkClearColorValue, False, None, indent)
+
+def struct_VkCommandBufferBeginInfo(printer, indent: int):
+    printer.write_stype_and_pnext("VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO", indent)
+    flags = printer.write_int("flags", 4, indent, signed=False, big_endian=False)
+    printer.write_struct("pInheritanceInfo", struct_VkCommandBufferInheritanceInfo, True, None, indent)
+
+def struct_VkCommandBufferInheritanceInfo(printer, indent: int):
+    printer.write_stype_and_pnext("VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO", indent)
+    renderPass = printer.write_int("renderPass", 8, indent, signed=False, big_endian=False)
+    subpass = printer.write_int("subpass", 4, indent, signed=False, big_endian=False)
+    framebuffer = printer.write_int("framebuffer", 8, indent, signed=False, big_endian=False)
+    occlusionQueryEnable = printer.write_int("occlusionQueryEnable", 4, indent, signed=False, big_endian=False)
+    queryFlags = printer.write_int("queryFlags", 4, indent, signed=False, big_endian=False)
+    pipelineStatistics = printer.write_int("pipelineStatistics", 4, indent, signed=False, big_endian=False)
+
+def struct_VkComponentMapping(printer, indent: int):
+    printer.write_enum("r", VkComponentSwizzle, indent)
+    printer.write_enum("g", VkComponentSwizzle, indent)
+    printer.write_enum("b", VkComponentSwizzle, indent)
+    printer.write_enum("a", VkComponentSwizzle, indent)
+
+def struct_VkDescriptorBufferInfo(printer, indent: int):
+    buffer = printer.write_int("buffer", 8, indent, signed=False, big_endian=False)
+    offset = printer.write_int("offset", 8, indent, signed=False, big_endian=False)
+    range = printer.write_int("range", 8, indent, signed=False, big_endian=False)
+
+def struct_VkDescriptorImageInfo(printer, indent: int):
+    sampler = printer.write_int("sampler", 8, indent, signed=False, big_endian=False)
+    imageView = printer.write_int("imageView", 8, indent, signed=False, big_endian=False)
+    printer.write_enum("imageLayout", VkImageLayout, indent)
+
+def struct_VkDescriptorPoolCreateInfo(printer, indent: int):
+    printer.write_stype_and_pnext("VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO", indent)
+    flags = printer.write_int("flags", 4, indent, signed=False, big_endian=False)
+    maxSets = printer.write_int("maxSets", 4, indent, signed=False, big_endian=False)
+    poolSizeCount = printer.write_int("poolSizeCount", 4, indent, signed=False, big_endian=False)
+    printer.write_struct("pPoolSizes", struct_VkDescriptorPoolSize, False, poolSizeCount, indent)
+
+def struct_VkDescriptorPoolSize(printer, indent: int):
+    printer.write_enum("type", VkDescriptorType, indent)
+    descriptorCount = printer.write_int("descriptorCount", 4, indent, signed=False, big_endian=False)
+
+def struct_VkDescriptorSetLayoutBinding(printer, indent: int):
+    binding = printer.write_int("binding", 4, indent, signed=False, big_endian=False)
+    printer.write_enum("descriptorType", VkDescriptorType, indent)
+    descriptorCount = printer.write_int("descriptorCount", 4, indent, signed=False, big_endian=False)
+    stageFlags = printer.write_int("stageFlags", 4, indent, signed=False, big_endian=False)
+    pImmutableSamplers = printer.write_int("pImmutableSamplers", 8, indent, optional=True, count=descriptorCount, big_endian=False)
+
+def struct_VkDescriptorSetLayoutCreateInfo(printer, indent: int):
+    printer.write_stype_and_pnext("VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO", indent)
+    flags = printer.write_int("flags", 4, indent, signed=False, big_endian=False)
+    bindingCount = printer.write_int("bindingCount", 4, indent, signed=False, big_endian=False)
+    printer.write_struct("pBindings", struct_VkDescriptorSetLayoutBinding, False, bindingCount, indent)
+
+def struct_VkExtent2D(printer, indent: int):
+    width = printer.write_int("width", 4, indent, signed=False, big_endian=False)
+    height = printer.write_int("height", 4, indent, signed=False, big_endian=False)
+
+def struct_VkExtent3D(printer, indent: int):
+    width = printer.write_int("width", 4, indent, signed=False, big_endian=False)
+    height = printer.write_int("height", 4, indent, signed=False, big_endian=False)
+    depth = printer.write_int("depth", 4, indent, signed=False, big_endian=False)
+
+def struct_VkFenceCreateInfo(printer, indent: int):
+    printer.write_stype_and_pnext("VK_STRUCTURE_TYPE_FENCE_CREATE_INFO", indent)
+    flags = printer.write_int("flags", 4, indent, signed=False, big_endian=False)
+
+def struct_VkFormatProperties(printer, indent: int):
+    linearTilingFeatures = printer.write_int("linearTilingFeatures", 4, indent, signed=False, big_endian=False)
+    optimalTilingFeatures = printer.write_int("optimalTilingFeatures", 4, indent, signed=False, big_endian=False)
+    bufferFeatures = printer.write_int("bufferFeatures", 4, indent, signed=False, big_endian=False)
+
+def struct_VkFramebufferCreateInfo(printer, indent: int):
+    printer.write_stype_and_pnext("VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO", indent)
+    flags = printer.write_int("flags", 4, indent, signed=False, big_endian=False)
+    renderPass = printer.write_int("renderPass", 8, indent, signed=False, big_endian=False)
+    attachmentCount = printer.write_int("attachmentCount", 4, indent, signed=False, big_endian=False)
+    pAttachments = printer.write_int("pAttachments", 8, indent, optional=False, count=attachmentCount, big_endian=False)
+    width = printer.write_int("width", 4, indent, signed=False, big_endian=False)
+    height = printer.write_int("height", 4, indent, signed=False, big_endian=False)
+    layers = printer.write_int("layers", 4, indent, signed=False, big_endian=False)
+
+def struct_VkGraphicsPipelineCreateInfo(printer, indent: int):
+    printer.write_stype_and_pnext("VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO", indent)
+    flags = printer.write_int("flags", 4, indent, signed=False, big_endian=False)
+    stageCount = printer.write_int("stageCount", 4, indent, signed=False, big_endian=False)
+    printer.write_struct("pStages", struct_VkPipelineShaderStageCreateInfo, False, stageCount, indent)
+    printer.write_struct("pVertexInputState", struct_VkPipelineVertexInputStateCreateInfo, True, None, indent)
+    printer.write_struct("pInputAssemblyState", struct_VkPipelineInputAssemblyStateCreateInfo, True, None, indent)
+    printer.write_struct("pTessellationState", struct_VkPipelineTessellationStateCreateInfo, True, None, indent)
+    printer.write_struct("pViewportState", struct_VkPipelineViewportStateCreateInfo, True, None, indent)
+    printer.write_struct("pRasterizationState", struct_VkPipelineRasterizationStateCreateInfo, True, None, indent)
+    printer.write_struct("pMultisampleState", struct_VkPipelineMultisampleStateCreateInfo, True, None, indent)
+    printer.write_struct("pDepthStencilState", struct_VkPipelineDepthStencilStateCreateInfo, True, None, indent)
+    printer.write_struct("pColorBlendState", struct_VkPipelineColorBlendStateCreateInfo, True, None, indent)
+    printer.write_struct("pDynamicState", struct_VkPipelineDynamicStateCreateInfo, True, None, indent)
+    layout = printer.write_int("layout", 8, indent, signed=False, big_endian=False)
+    renderPass = printer.write_int("renderPass", 8, indent, signed=False, big_endian=False)
+    subpass = printer.write_int("subpass", 4, indent, signed=False, big_endian=False)
+    basePipelineHandle = printer.write_int("basePipelineHandle", 8, indent, signed=False, big_endian=False)
+    basePipelineIndex = printer.write_int("basePipelineIndex", 4, indent, signed=True, big_endian=False)
+
+def struct_VkImageCreateInfo(printer, indent: int):
+    printer.write_stype_and_pnext("VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO", indent)
+    flags = printer.write_int("flags", 4, indent, signed=False, big_endian=False)
+    printer.write_enum("imageType", VkImageType, indent)
+    printer.write_enum("format", VkFormat, indent)
+    printer.write_struct("extent", struct_VkExtent3D, False, None, indent)
+    mipLevels = printer.write_int("mipLevels", 4, indent, signed=False, big_endian=False)
+    arrayLayers = printer.write_int("arrayLayers", 4, indent, signed=False, big_endian=False)
+    printer.write_enum("samples", VkSampleCountFlagBits, indent)
+    printer.write_enum("tiling", VkImageTiling, indent)
+    usage = printer.write_int("usage", 4, indent, signed=False, big_endian=False)
+    printer.write_enum("sharingMode", VkSharingMode, indent)
+    queueFamilyIndexCount = printer.write_int("queueFamilyIndexCount", 4, indent, signed=False, big_endian=False)
+    pQueueFamilyIndices = printer.write_int("pQueueFamilyIndices", 4, indent, optional=True, count=queueFamilyIndexCount, big_endian=False)
+    printer.write_enum("initialLayout", VkImageLayout, indent)
+
+def struct_VkImageMemoryBarrier(printer, indent: int):
+    printer.write_stype_and_pnext("VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER", indent)
+    srcAccessMask = printer.write_int("srcAccessMask", 4, indent, signed=False, big_endian=False)
+    dstAccessMask = printer.write_int("dstAccessMask", 4, indent, signed=False, big_endian=False)
+    printer.write_enum("oldLayout", VkImageLayout, indent)
+    printer.write_enum("newLayout", VkImageLayout, indent)
+    srcQueueFamilyIndex = printer.write_int("srcQueueFamilyIndex", 4, indent, signed=False, big_endian=False)
+    dstQueueFamilyIndex = printer.write_int("dstQueueFamilyIndex", 4, indent, signed=False, big_endian=False)
+    image = printer.write_int("image", 8, indent, signed=False, big_endian=False)
+    printer.write_struct("subresourceRange", struct_VkImageSubresourceRange, False, None, indent)
+
+def struct_VkImageSubresourceLayers(printer, indent: int):
+    aspectMask = printer.write_int("aspectMask", 4, indent, signed=False, big_endian=False)
+    mipLevel = printer.write_int("mipLevel", 4, indent, signed=False, big_endian=False)
+    baseArrayLayer = printer.write_int("baseArrayLayer", 4, indent, signed=False, big_endian=False)
+    layerCount = printer.write_int("layerCount", 4, indent, signed=False, big_endian=False)
+
+def struct_VkImageSubresourceRange(printer, indent: int):
+    aspectMask = printer.write_int("aspectMask", 4, indent, signed=False, big_endian=False)
+    baseMipLevel = printer.write_int("baseMipLevel", 4, indent, signed=False, big_endian=False)
+    levelCount = printer.write_int("levelCount", 4, indent, signed=False, big_endian=False)
+    baseArrayLayer = printer.write_int("baseArrayLayer", 4, indent, signed=False, big_endian=False)
+    layerCount = printer.write_int("layerCount", 4, indent, signed=False, big_endian=False)
+
+def struct_VkImageViewCreateInfo(printer, indent: int):
+    printer.write_stype_and_pnext("VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO", indent)
+    flags = printer.write_int("flags", 4, indent, signed=False, big_endian=False)
+    image = printer.write_int("image", 8, indent, signed=False, big_endian=False)
+    printer.write_enum("viewType", VkImageViewType, indent)
+    printer.write_enum("format", VkFormat, indent)
+    printer.write_struct("components", struct_VkComponentMapping, False, None, indent)
+    printer.write_struct("subresourceRange", struct_VkImageSubresourceRange, False, None, indent)
+
+def struct_VkMemoryAllocateInfo(printer, indent: int):
+    printer.write_stype_and_pnext("VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO", indent)
+    allocationSize = printer.write_int("allocationSize", 8, indent, signed=False, big_endian=False)
+    memoryTypeIndex = printer.write_int("memoryTypeIndex", 4, indent, signed=False, big_endian=False)
+
+def struct_VkMemoryBarrier(printer, indent: int):
+    printer.write_stype_and_pnext("VK_STRUCTURE_TYPE_MEMORY_BARRIER", indent)
+    srcAccessMask = printer.write_int("srcAccessMask", 4, indent, signed=False, big_endian=False)
+    dstAccessMask = printer.write_int("dstAccessMask", 4, indent, signed=False, big_endian=False)
+
+def struct_VkMemoryRequirements(printer, indent: int):
+    size = printer.write_int("size", 8, indent, signed=False, big_endian=False)
+    alignment = printer.write_int("alignment", 8, indent, signed=False, big_endian=False)
+    memoryTypeBits = printer.write_int("memoryTypeBits", 4, indent, signed=False, big_endian=False)
+
+def struct_VkOffset2D(printer, indent: int):
+    x = printer.write_int("x", 4, indent, signed=True, big_endian=False)
+    y = printer.write_int("y", 4, indent, signed=True, big_endian=False)
+
+def struct_VkOffset3D(printer, indent: int):
+    x = printer.write_int("x", 4, indent, signed=True, big_endian=False)
+    y = printer.write_int("y", 4, indent, signed=True, big_endian=False)
+    z = printer.write_int("z", 4, indent, signed=True, big_endian=False)
+
+def struct_VkPhysicalDeviceLimits(printer, indent: int):
+    maxImageDimension1D = printer.write_int("maxImageDimension1D", 4, indent, signed=False, big_endian=False)
+    maxImageDimension2D = printer.write_int("maxImageDimension2D", 4, indent, signed=False, big_endian=False)
+    maxImageDimension3D = printer.write_int("maxImageDimension3D", 4, indent, signed=False, big_endian=False)
+    maxImageDimensionCube = printer.write_int("maxImageDimensionCube", 4, indent, signed=False, big_endian=False)
+    maxImageArrayLayers = printer.write_int("maxImageArrayLayers", 4, indent, signed=False, big_endian=False)
+    maxTexelBufferElements = printer.write_int("maxTexelBufferElements", 4, indent, signed=False, big_endian=False)
+    maxUniformBufferRange = printer.write_int("maxUniformBufferRange", 4, indent, signed=False, big_endian=False)
+    maxStorageBufferRange = printer.write_int("maxStorageBufferRange", 4, indent, signed=False, big_endian=False)
+    maxPushConstantsSize = printer.write_int("maxPushConstantsSize", 4, indent, signed=False, big_endian=False)
+    maxMemoryAllocationCount = printer.write_int("maxMemoryAllocationCount", 4, indent, signed=False, big_endian=False)
+    maxSamplerAllocationCount = printer.write_int("maxSamplerAllocationCount", 4, indent, signed=False, big_endian=False)
+    bufferImageGranularity = printer.write_int("bufferImageGranularity", 8, indent, signed=False, big_endian=False)
+    sparseAddressSpaceSize = printer.write_int("sparseAddressSpaceSize", 8, indent, signed=False, big_endian=False)
+    maxBoundDescriptorSets = printer.write_int("maxBoundDescriptorSets", 4, indent, signed=False, big_endian=False)
+    maxPerStageDescriptorSamplers = printer.write_int("maxPerStageDescriptorSamplers", 4, indent, signed=False, big_endian=False)
+    maxPerStageDescriptorUniformBuffers = printer.write_int("maxPerStageDescriptorUniformBuffers", 4, indent, signed=False, big_endian=False)
+    maxPerStageDescriptorStorageBuffers = printer.write_int("maxPerStageDescriptorStorageBuffers", 4, indent, signed=False, big_endian=False)
+    maxPerStageDescriptorSampledImages = printer.write_int("maxPerStageDescriptorSampledImages", 4, indent, signed=False, big_endian=False)
+    maxPerStageDescriptorStorageImages = printer.write_int("maxPerStageDescriptorStorageImages", 4, indent, signed=False, big_endian=False)
+    maxPerStageDescriptorInputAttachments = printer.write_int("maxPerStageDescriptorInputAttachments", 4, indent, signed=False, big_endian=False)
+    maxPerStageResources = printer.write_int("maxPerStageResources", 4, indent, signed=False, big_endian=False)
+    maxDescriptorSetSamplers = printer.write_int("maxDescriptorSetSamplers", 4, indent, signed=False, big_endian=False)
+    maxDescriptorSetUniformBuffers = printer.write_int("maxDescriptorSetUniformBuffers", 4, indent, signed=False, big_endian=False)
+    maxDescriptorSetUniformBuffersDynamic = printer.write_int("maxDescriptorSetUniformBuffersDynamic", 4, indent, signed=False, big_endian=False)
+    maxDescriptorSetStorageBuffers = printer.write_int("maxDescriptorSetStorageBuffers", 4, indent, signed=False, big_endian=False)
+    maxDescriptorSetStorageBuffersDynamic = printer.write_int("maxDescriptorSetStorageBuffersDynamic", 4, indent, signed=False, big_endian=False)
+    maxDescriptorSetSampledImages = printer.write_int("maxDescriptorSetSampledImages", 4, indent, signed=False, big_endian=False)
+    maxDescriptorSetStorageImages = printer.write_int("maxDescriptorSetStorageImages", 4, indent, signed=False, big_endian=False)
+    maxDescriptorSetInputAttachments = printer.write_int("maxDescriptorSetInputAttachments", 4, indent, signed=False, big_endian=False)
+    maxVertexInputAttributes = printer.write_int("maxVertexInputAttributes", 4, indent, signed=False, big_endian=False)
+    maxVertexInputBindings = printer.write_int("maxVertexInputBindings", 4, indent, signed=False, big_endian=False)
+    maxVertexInputAttributeOffset = printer.write_int("maxVertexInputAttributeOffset", 4, indent, signed=False, big_endian=False)
+    maxVertexInputBindingStride = printer.write_int("maxVertexInputBindingStride", 4, indent, signed=False, big_endian=False)
+    maxVertexOutputComponents = printer.write_int("maxVertexOutputComponents", 4, indent, signed=False, big_endian=False)
+    maxTessellationGenerationLevel = printer.write_int("maxTessellationGenerationLevel", 4, indent, signed=False, big_endian=False)
+    maxTessellationPatchSize = printer.write_int("maxTessellationPatchSize", 4, indent, signed=False, big_endian=False)
+    maxTessellationControlPerVertexInputComponents = printer.write_int("maxTessellationControlPerVertexInputComponents", 4, indent, signed=False, big_endian=False)
+    maxTessellationControlPerVertexOutputComponents = printer.write_int("maxTessellationControlPerVertexOutputComponents", 4, indent, signed=False, big_endian=False)
+    maxTessellationControlPerPatchOutputComponents = printer.write_int("maxTessellationControlPerPatchOutputComponents", 4, indent, signed=False, big_endian=False)
+    maxTessellationControlTotalOutputComponents = printer.write_int("maxTessellationControlTotalOutputComponents", 4, indent, signed=False, big_endian=False)
+    maxTessellationEvaluationInputComponents = printer.write_int("maxTessellationEvaluationInputComponents", 4, indent, signed=False, big_endian=False)
+    maxTessellationEvaluationOutputComponents = printer.write_int("maxTessellationEvaluationOutputComponents", 4, indent, signed=False, big_endian=False)
+    maxGeometryShaderInvocations = printer.write_int("maxGeometryShaderInvocations", 4, indent, signed=False, big_endian=False)
+    maxGeometryInputComponents = printer.write_int("maxGeometryInputComponents", 4, indent, signed=False, big_endian=False)
+    maxGeometryOutputComponents = printer.write_int("maxGeometryOutputComponents", 4, indent, signed=False, big_endian=False)
+    maxGeometryOutputVertices = printer.write_int("maxGeometryOutputVertices", 4, indent, signed=False, big_endian=False)
+    maxGeometryTotalOutputComponents = printer.write_int("maxGeometryTotalOutputComponents", 4, indent, signed=False, big_endian=False)
+    maxFragmentInputComponents = printer.write_int("maxFragmentInputComponents", 4, indent, signed=False, big_endian=False)
+    maxFragmentOutputAttachments = printer.write_int("maxFragmentOutputAttachments", 4, indent, signed=False, big_endian=False)
+    maxFragmentDualSrcAttachments = printer.write_int("maxFragmentDualSrcAttachments", 4, indent, signed=False, big_endian=False)
+    maxFragmentCombinedOutputResources = printer.write_int("maxFragmentCombinedOutputResources", 4, indent, signed=False, big_endian=False)
+    maxComputeSharedMemorySize = printer.write_int("maxComputeSharedMemorySize", 4, indent, signed=False, big_endian=False)
+    printer.write_int("maxComputeWorkGroupCount", 4, indent, signed=False, count=3)
+    maxComputeWorkGroupInvocations = printer.write_int("maxComputeWorkGroupInvocations", 4, indent, signed=False, big_endian=False)
+    printer.write_int("maxComputeWorkGroupSize", 4, indent, signed=False, count=3)
+    subPixelPrecisionBits = printer.write_int("subPixelPrecisionBits", 4, indent, signed=False, big_endian=False)
+    subTexelPrecisionBits = printer.write_int("subTexelPrecisionBits", 4, indent, signed=False, big_endian=False)
+    mipmapPrecisionBits = printer.write_int("mipmapPrecisionBits", 4, indent, signed=False, big_endian=False)
+    maxDrawIndexedIndexValue = printer.write_int("maxDrawIndexedIndexValue", 4, indent, signed=False, big_endian=False)
+    maxDrawIndirectCount = printer.write_int("maxDrawIndirectCount", 4, indent, signed=False, big_endian=False)
+    printer.write_float("maxSamplerLodBias", indent)
+    printer.write_float("maxSamplerAnisotropy", indent)
+    maxViewports = printer.write_int("maxViewports", 4, indent, signed=False, big_endian=False)
+    printer.write_int("maxViewportDimensions", 4, indent, signed=False, count=2)
+    printer.write_float("viewportBoundsRange", indent, count=2)
+    viewportSubPixelBits = printer.write_int("viewportSubPixelBits", 4, indent, signed=False, big_endian=False)
+    minMemoryMapAlignment = printer.write_int("minMemoryMapAlignment", 8, indent, signed=False, big_endian=True)
+    minTexelBufferOffsetAlignment = printer.write_int("minTexelBufferOffsetAlignment", 8, indent, signed=False, big_endian=False)
+    minUniformBufferOffsetAlignment = printer.write_int("minUniformBufferOffsetAlignment", 8, indent, signed=False, big_endian=False)
+    minStorageBufferOffsetAlignment = printer.write_int("minStorageBufferOffsetAlignment", 8, indent, signed=False, big_endian=False)
+    minTexelOffset = printer.write_int("minTexelOffset", 4, indent, signed=True, big_endian=False)
+    maxTexelOffset = printer.write_int("maxTexelOffset", 4, indent, signed=False, big_endian=False)
+    minTexelGatherOffset = printer.write_int("minTexelGatherOffset", 4, indent, signed=True, big_endian=False)
+    maxTexelGatherOffset = printer.write_int("maxTexelGatherOffset", 4, indent, signed=False, big_endian=False)
+    printer.write_float("minInterpolationOffset", indent)
+    printer.write_float("maxInterpolationOffset", indent)
+    subPixelInterpolationOffsetBits = printer.write_int("subPixelInterpolationOffsetBits", 4, indent, signed=False, big_endian=False)
+    maxFramebufferWidth = printer.write_int("maxFramebufferWidth", 4, indent, signed=False, big_endian=False)
+    maxFramebufferHeight = printer.write_int("maxFramebufferHeight", 4, indent, signed=False, big_endian=False)
+    maxFramebufferLayers = printer.write_int("maxFramebufferLayers", 4, indent, signed=False, big_endian=False)
+    framebufferColorSampleCounts = printer.write_int("framebufferColorSampleCounts", 4, indent, signed=False, big_endian=False)
+    framebufferDepthSampleCounts = printer.write_int("framebufferDepthSampleCounts", 4, indent, signed=False, big_endian=False)
+    framebufferStencilSampleCounts = printer.write_int("framebufferStencilSampleCounts", 4, indent, signed=False, big_endian=False)
+    framebufferNoAttachmentsSampleCounts = printer.write_int("framebufferNoAttachmentsSampleCounts", 4, indent, signed=False, big_endian=False)
+    maxColorAttachments = printer.write_int("maxColorAttachments", 4, indent, signed=False, big_endian=False)
+    sampledImageColorSampleCounts = printer.write_int("sampledImageColorSampleCounts", 4, indent, signed=False, big_endian=False)
+    sampledImageIntegerSampleCounts = printer.write_int("sampledImageIntegerSampleCounts", 4, indent, signed=False, big_endian=False)
+    sampledImageDepthSampleCounts = printer.write_int("sampledImageDepthSampleCounts", 4, indent, signed=False, big_endian=False)
+    sampledImageStencilSampleCounts = printer.write_int("sampledImageStencilSampleCounts", 4, indent, signed=False, big_endian=False)
+    storageImageSampleCounts = printer.write_int("storageImageSampleCounts", 4, indent, signed=False, big_endian=False)
+    maxSampleMaskWords = printer.write_int("maxSampleMaskWords", 4, indent, signed=False, big_endian=False)
+    timestampComputeAndGraphics = printer.write_int("timestampComputeAndGraphics", 4, indent, signed=False, big_endian=False)
+    printer.write_float("timestampPeriod", indent)
+    maxClipDistances = printer.write_int("maxClipDistances", 4, indent, signed=False, big_endian=False)
+    maxCullDistances = printer.write_int("maxCullDistances", 4, indent, signed=False, big_endian=False)
+    maxCombinedClipAndCullDistances = printer.write_int("maxCombinedClipAndCullDistances", 4, indent, signed=False, big_endian=False)
+    discreteQueuePriorities = printer.write_int("discreteQueuePriorities", 4, indent, signed=False, big_endian=False)
+    printer.write_float("pointSizeRange", indent, count=2)
+    printer.write_float("lineWidthRange", indent, count=2)
+    printer.write_float("pointSizeGranularity", indent)
+    printer.write_float("lineWidthGranularity", indent)
+    strictLines = printer.write_int("strictLines", 4, indent, signed=False, big_endian=False)
+    standardSampleLocations = printer.write_int("standardSampleLocations", 4, indent, signed=False, big_endian=False)
+    optimalBufferCopyOffsetAlignment = printer.write_int("optimalBufferCopyOffsetAlignment", 8, indent, signed=False, big_endian=False)
+    optimalBufferCopyRowPitchAlignment = printer.write_int("optimalBufferCopyRowPitchAlignment", 8, indent, signed=False, big_endian=False)
+    nonCoherentAtomSize = printer.write_int("nonCoherentAtomSize", 8, indent, signed=False, big_endian=False)
+
+def struct_VkPhysicalDeviceProperties(printer, indent: int):
+    apiVersion = printer.write_int("apiVersion", 4, indent, signed=False, big_endian=False)
+    driverVersion = printer.write_int("driverVersion", 4, indent, signed=False, big_endian=False)
+    vendorID = printer.write_int("vendorID", 4, indent, signed=False, big_endian=False)
+    deviceID = printer.write_int("deviceID", 4, indent, signed=False, big_endian=False)
+    printer.write_enum("deviceType", VkPhysicalDeviceType, indent)
+    printer.write_string("deviceName", 256, indent)
+    printer.write_int("pipelineCacheUUID", 1, indent, signed=False, count=16)
+    printer.write_struct("limits", struct_VkPhysicalDeviceLimits, False, None, indent)
+    printer.write_struct("sparseProperties", struct_VkPhysicalDeviceSparseProperties, False, None, indent)
+
+def struct_VkPhysicalDeviceProperties2(printer, indent: int):
+    printer.write_stype_and_pnext("VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2", indent)
+    printer.write_struct("properties", struct_VkPhysicalDeviceProperties, False, None, indent)
+
+def struct_VkPhysicalDeviceSparseProperties(printer, indent: int):
+    residencyStandard2DBlockShape = printer.write_int("residencyStandard2DBlockShape", 4, indent, signed=False, big_endian=False)
+    residencyStandard2DMultisampleBlockShape = printer.write_int("residencyStandard2DMultisampleBlockShape", 4, indent, signed=False, big_endian=False)
+    residencyStandard3DBlockShape = printer.write_int("residencyStandard3DBlockShape", 4, indent, signed=False, big_endian=False)
+    residencyAlignedMipSize = printer.write_int("residencyAlignedMipSize", 4, indent, signed=False, big_endian=False)
+    residencyNonResidentStrict = printer.write_int("residencyNonResidentStrict", 4, indent, signed=False, big_endian=False)
+
+def struct_VkPipelineCacheCreateInfo(printer, indent: int):
+    printer.write_stype_and_pnext("VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO", indent)
+    flags = printer.write_int("flags", 4, indent, signed=False, big_endian=False)
+    initialDataSize = printer.write_int("initialDataSize", 8, indent, signed=False, big_endian=True)
+    pInitialData = printer.write_int("pInitialData", 8, indent, optional=False, count=initialDataSize, big_endian=False)
+
+def struct_VkPipelineColorBlendAttachmentState(printer, indent: int):
+    blendEnable = printer.write_int("blendEnable", 4, indent, signed=False, big_endian=False)
+    printer.write_enum("srcColorBlendFactor", VkBlendFactor, indent)
+    printer.write_enum("dstColorBlendFactor", VkBlendFactor, indent)
+    printer.write_enum("colorBlendOp", VkBlendOp, indent)
+    printer.write_enum("srcAlphaBlendFactor", VkBlendFactor, indent)
+    printer.write_enum("dstAlphaBlendFactor", VkBlendFactor, indent)
+    printer.write_enum("alphaBlendOp", VkBlendOp, indent)
+    colorWriteMask = printer.write_int("colorWriteMask", 4, indent, signed=False, big_endian=False)
+
+def struct_VkPipelineColorBlendStateCreateInfo(printer, indent: int):
+    printer.write_stype_and_pnext("VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO", indent)
+    flags = printer.write_int("flags", 4, indent, signed=False, big_endian=False)
+    logicOpEnable = printer.write_int("logicOpEnable", 4, indent, signed=False, big_endian=False)
+    printer.write_enum("logicOp", VkLogicOp, indent)
+    attachmentCount = printer.write_int("attachmentCount", 4, indent, signed=False, big_endian=False)
+    printer.write_struct("pAttachments", struct_VkPipelineColorBlendAttachmentState, False, attachmentCount, indent)
+    printer.write_float("blendConstants", indent, count=4)
+
+def struct_VkPipelineDepthStencilStateCreateInfo(printer, indent: int):
+    printer.write_stype_and_pnext("VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO", indent)
+    flags = printer.write_int("flags", 4, indent, signed=False, big_endian=False)
+    depthTestEnable = printer.write_int("depthTestEnable", 4, indent, signed=False, big_endian=False)
+    depthWriteEnable = printer.write_int("depthWriteEnable", 4, indent, signed=False, big_endian=False)
+    printer.write_enum("depthCompareOp", VkCompareOp, indent)
+    depthBoundsTestEnable = printer.write_int("depthBoundsTestEnable", 4, indent, signed=False, big_endian=False)
+    stencilTestEnable = printer.write_int("stencilTestEnable", 4, indent, signed=False, big_endian=False)
+    printer.write_struct("front", struct_VkStencilOpState, False, None, indent)
+    printer.write_struct("back", struct_VkStencilOpState, False, None, indent)
+    printer.write_float("minDepthBounds", indent)
+    printer.write_float("maxDepthBounds", indent)
+
+def struct_VkPipelineDynamicStateCreateInfo(printer, indent: int):
+    printer.write_stype_and_pnext("VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO", indent)
+    flags = printer.write_int("flags", 4, indent, signed=False, big_endian=False)
+    dynamicStateCount = printer.write_int("dynamicStateCount", 4, indent, signed=False, big_endian=False)
+    printer.write_enum("pDynamicStates", VkDynamicState, indent)
+
+def struct_VkPipelineInputAssemblyStateCreateInfo(printer, indent: int):
+    printer.write_stype_and_pnext("VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO", indent)
+    flags = printer.write_int("flags", 4, indent, signed=False, big_endian=False)
+    printer.write_enum("topology", VkPrimitiveTopology, indent)
+    primitiveRestartEnable = printer.write_int("primitiveRestartEnable", 4, indent, signed=False, big_endian=False)
+
+def struct_VkPipelineMultisampleStateCreateInfo(printer, indent: int):
+    printer.write_stype_and_pnext("VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO", indent)
+    flags = printer.write_int("flags", 4, indent, signed=False, big_endian=False)
+    printer.write_enum("rasterizationSamples", VkSampleCountFlagBits, indent)
+    sampleShadingEnable = printer.write_int("sampleShadingEnable", 4, indent, signed=False, big_endian=False)
+    printer.write_float("minSampleShading", indent)
+    pSampleMask = printer.write_int("pSampleMask", 8, indent, optional=True, count=int(rasterizationSamples / 32), big_endian=False)
+    alphaToCoverageEnable = printer.write_int("alphaToCoverageEnable", 4, indent, signed=False, big_endian=False)
+    alphaToOneEnable = printer.write_int("alphaToOneEnable", 4, indent, signed=False, big_endian=False)
+
+def struct_VkPipelineRasterizationStateCreateInfo(printer, indent: int):
+    printer.write_stype_and_pnext("VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO", indent)
+    flags = printer.write_int("flags", 4, indent, signed=False, big_endian=False)
+    depthClampEnable = printer.write_int("depthClampEnable", 4, indent, signed=False, big_endian=False)
+    rasterizerDiscardEnable = printer.write_int("rasterizerDiscardEnable", 4, indent, signed=False, big_endian=False)
+    printer.write_enum("polygonMode", VkPolygonMode, indent)
+    cullMode = printer.write_int("cullMode", 4, indent, signed=False, big_endian=False)
+    printer.write_enum("frontFace", VkFrontFace, indent)
+    depthBiasEnable = printer.write_int("depthBiasEnable", 4, indent, signed=False, big_endian=False)
+    printer.write_float("depthBiasConstantFactor", indent)
+    printer.write_float("depthBiasClamp", indent)
+    printer.write_float("depthBiasSlopeFactor", indent)
+    printer.write_float("lineWidth", indent)
+
+def struct_VkPipelineShaderStageCreateInfo(printer, indent: int):
+    printer.write_stype_and_pnext("VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO", indent)
+    flags = printer.write_int("flags", 4, indent, signed=False, big_endian=False)
+    printer.write_enum("stage", VkShaderStageFlagBits, indent)
+    module = printer.write_int("module", 8, indent, signed=False, big_endian=False)
+    printer.write_string("pName", None, indent)
+    printer.write_struct("pSpecializationInfo", struct_VkSpecializationInfo, True, None, indent)
+
+def struct_VkPipelineTessellationStateCreateInfo(printer, indent: int):
+    printer.write_stype_and_pnext("VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO", indent)
+    flags = printer.write_int("flags", 4, indent, signed=False, big_endian=False)
+    patchControlPoints = printer.write_int("patchControlPoints", 4, indent, signed=False, big_endian=False)
+
+def struct_VkPipelineVertexInputStateCreateInfo(printer, indent: int):
+    printer.write_stype_and_pnext("VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO", indent)
+    flags = printer.write_int("flags", 4, indent, signed=False, big_endian=False)
+    vertexBindingDescriptionCount = printer.write_int("vertexBindingDescriptionCount", 4, indent, signed=False, big_endian=False)
+    printer.write_struct("pVertexBindingDescriptions", struct_VkVertexInputBindingDescription, False, vertexBindingDescriptionCount, indent)
+    vertexAttributeDescriptionCount = printer.write_int("vertexAttributeDescriptionCount", 4, indent, signed=False, big_endian=False)
+    printer.write_struct("pVertexAttributeDescriptions", struct_VkVertexInputAttributeDescription, False, vertexAttributeDescriptionCount, indent)
+
+def struct_VkPipelineViewportStateCreateInfo(printer, indent: int):
+    printer.write_stype_and_pnext("VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO", indent)
+    flags = printer.write_int("flags", 4, indent, signed=False, big_endian=False)
+    viewportCount = printer.write_int("viewportCount", 4, indent, signed=False, big_endian=False)
+    printer.write_struct("pViewports", struct_VkViewport, True, viewportCount, indent)
+    scissorCount = printer.write_int("scissorCount", 4, indent, signed=False, big_endian=False)
+    printer.write_struct("pScissors", struct_VkRect2D, True, scissorCount, indent)
+
+def struct_VkRect2D(printer, indent: int):
+    printer.write_struct("offset", struct_VkOffset2D, False, None, indent)
+    printer.write_struct("extent", struct_VkExtent2D, False, None, indent)
+
+def struct_VkRenderPassBeginInfo(printer, indent: int):
+    printer.write_stype_and_pnext("VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO", indent)
+    renderPass = printer.write_int("renderPass", 8, indent, signed=False, big_endian=False)
+    framebuffer = printer.write_int("framebuffer", 8, indent, signed=False, big_endian=False)
+    printer.write_struct("renderArea", struct_VkRect2D, False, None, indent)
+    clearValueCount = printer.write_int("clearValueCount", 4, indent, signed=False, big_endian=False)
+    printer.write_struct("pClearValues", struct_VkClearValue, True, clearValueCount, indent)
+
+def struct_VkRenderPassCreateInfo(printer, indent: int):
+    printer.write_stype_and_pnext("VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO", indent)
+    flags = printer.write_int("flags", 4, indent, signed=False, big_endian=False)
+    attachmentCount = printer.write_int("attachmentCount", 4, indent, signed=False, big_endian=False)
+    printer.write_struct("pAttachments", struct_VkAttachmentDescription, False, attachmentCount, indent)
+    subpassCount = printer.write_int("subpassCount", 4, indent, signed=False, big_endian=False)
+    printer.write_struct("pSubpasses", struct_VkSubpassDescription, False, subpassCount, indent)
+    dependencyCount = printer.write_int("dependencyCount", 4, indent, signed=False, big_endian=False)
+    printer.write_struct("pDependencies", struct_VkSubpassDependency, False, dependencyCount, indent)
+
+def struct_VkSamplerCreateInfo(printer, indent: int):
+    printer.write_stype_and_pnext("VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO", indent)
+    flags = printer.write_int("flags", 4, indent, signed=False, big_endian=False)
+    printer.write_enum("magFilter", VkFilter, indent)
+    printer.write_enum("minFilter", VkFilter, indent)
+    printer.write_enum("mipmapMode", VkSamplerMipmapMode, indent)
+    printer.write_enum("addressModeU", VkSamplerAddressMode, indent)
+    printer.write_enum("addressModeV", VkSamplerAddressMode, indent)
+    printer.write_enum("addressModeW", VkSamplerAddressMode, indent)
+    printer.write_float("mipLodBias", indent)
+    anisotropyEnable = printer.write_int("anisotropyEnable", 4, indent, signed=False, big_endian=False)
+    printer.write_float("maxAnisotropy", indent)
+    compareEnable = printer.write_int("compareEnable", 4, indent, signed=False, big_endian=False)
+    printer.write_enum("compareOp", VkCompareOp, indent)
+    printer.write_float("minLod", indent)
+    printer.write_float("maxLod", indent)
+    printer.write_enum("borderColor", VkBorderColor, indent)
+    unnormalizedCoordinates = printer.write_int("unnormalizedCoordinates", 4, indent, signed=False, big_endian=False)
+
+def struct_VkSemaphoreCreateInfo(printer, indent: int):
+    printer.write_stype_and_pnext("VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO", indent)
+    flags = printer.write_int("flags", 4, indent, signed=False, big_endian=False)
+
+def struct_VkShaderModuleCreateInfo(printer, indent: int):
+    printer.write_stype_and_pnext("VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO", indent)
+    flags = printer.write_int("flags", 4, indent, signed=False, big_endian=False)
+    codeSize = printer.write_int("codeSize", 8, indent, signed=False, big_endian=True)
+    pCode = printer.write_int("pCode", 4, indent, optional=False, count=int(codeSize / 4), big_endian=False)
+
+def struct_VkSpecializationInfo(printer, indent: int):
+    mapEntryCount = printer.write_int("mapEntryCount", 4, indent, signed=False, big_endian=False)
+    printer.write_struct("pMapEntries", struct_VkSpecializationMapEntry, False, mapEntryCount, indent)
+    dataSize = printer.write_int("dataSize", 8, indent, signed=False, big_endian=True)
+    pData = printer.write_int("pData", 8, indent, optional=False, count=dataSize, big_endian=False)
+
+def struct_VkSpecializationMapEntry(printer, indent: int):
+    constantID = printer.write_int("constantID", 4, indent, signed=False, big_endian=False)
+    offset = printer.write_int("offset", 4, indent, signed=False, big_endian=False)
+    size = printer.write_int("size", 8, indent, signed=False, big_endian=True)
+
+def struct_VkStencilOpState(printer, indent: int):
+    printer.write_enum("failOp", VkStencilOp, indent)
+    printer.write_enum("passOp", VkStencilOp, indent)
+    printer.write_enum("depthFailOp", VkStencilOp, indent)
+    printer.write_enum("compareOp", VkCompareOp, indent)
+    compareMask = printer.write_int("compareMask", 4, indent, signed=False, big_endian=False)
+    writeMask = printer.write_int("writeMask", 4, indent, signed=False, big_endian=False)
+    reference = printer.write_int("reference", 4, indent, signed=False, big_endian=False)
+
+def struct_VkSubmitInfo(printer, indent: int):
+    printer.write_stype_and_pnext("VK_STRUCTURE_TYPE_SUBMIT_INFO", indent)
+    waitSemaphoreCount = printer.write_int("waitSemaphoreCount", 4, indent, signed=False, big_endian=False)
+    pWaitSemaphores = printer.write_int("pWaitSemaphores", 8, indent, optional=False, count=waitSemaphoreCount, big_endian=False)
+    pWaitDstStageMask = printer.write_int("pWaitDstStageMask", 4, indent, optional=False, count=waitSemaphoreCount, big_endian=False)
+    commandBufferCount = printer.write_int("commandBufferCount", 4, indent, signed=False, big_endian=False)
+    pCommandBuffers = printer.write_int("pCommandBuffers", 8, indent, optional=False, count=commandBufferCount, big_endian=False)
+    signalSemaphoreCount = printer.write_int("signalSemaphoreCount", 4, indent, signed=False, big_endian=False)
+    pSignalSemaphores = printer.write_int("pSignalSemaphores", 8, indent, optional=False, count=signalSemaphoreCount, big_endian=False)
+
+def struct_VkSubpassDependency(printer, indent: int):
+    srcSubpass = printer.write_int("srcSubpass", 4, indent, signed=False, big_endian=False)
+    dstSubpass = printer.write_int("dstSubpass", 4, indent, signed=False, big_endian=False)
+    srcStageMask = printer.write_int("srcStageMask", 4, indent, signed=False, big_endian=False)
+    dstStageMask = printer.write_int("dstStageMask", 4, indent, signed=False, big_endian=False)
+    srcAccessMask = printer.write_int("srcAccessMask", 4, indent, signed=False, big_endian=False)
+    dstAccessMask = printer.write_int("dstAccessMask", 4, indent, signed=False, big_endian=False)
+    dependencyFlags = printer.write_int("dependencyFlags", 4, indent, signed=False, big_endian=False)
+
+def struct_VkSubpassDescription(printer, indent: int):
+    flags = printer.write_int("flags", 4, indent, signed=False, big_endian=False)
+    printer.write_enum("pipelineBindPoint", VkPipelineBindPoint, indent)
+    inputAttachmentCount = printer.write_int("inputAttachmentCount", 4, indent, signed=False, big_endian=False)
+    printer.write_struct("pInputAttachments", struct_VkAttachmentReference, False, inputAttachmentCount, indent)
+    colorAttachmentCount = printer.write_int("colorAttachmentCount", 4, indent, signed=False, big_endian=False)
+    printer.write_struct("pColorAttachments", struct_VkAttachmentReference, False, colorAttachmentCount, indent)
+    printer.write_struct("pResolveAttachments", struct_VkAttachmentReference, True, colorAttachmentCount, indent)
+    printer.write_struct("pDepthStencilAttachment", struct_VkAttachmentReference, True, None, indent)
+    preserveAttachmentCount = printer.write_int("preserveAttachmentCount", 4, indent, signed=False, big_endian=False)
+    pPreserveAttachments = printer.write_int("pPreserveAttachments", 4, indent, optional=False, count=preserveAttachmentCount, big_endian=False)
+
+def struct_VkVertexInputAttributeDescription(printer, indent: int):
+    location = printer.write_int("location", 4, indent, signed=False, big_endian=False)
+    binding = printer.write_int("binding", 4, indent, signed=False, big_endian=False)
+    printer.write_enum("format", VkFormat, indent)
+    offset = printer.write_int("offset", 4, indent, signed=False, big_endian=False)
+
+def struct_VkVertexInputBindingDescription(printer, indent: int):
+    binding = printer.write_int("binding", 4, indent, signed=False, big_endian=False)
+    stride = printer.write_int("stride", 4, indent, signed=False, big_endian=False)
+    printer.write_enum("inputRate", VkVertexInputRate, indent)
+
+def struct_VkViewport(printer, indent: int):
+    printer.write_float("x", indent)
+    printer.write_float("y", indent)
+    printer.write_float("width", indent)
+    printer.write_float("height", indent)
+    printer.write_float("minDepth", indent)
+    printer.write_float("maxDepth", indent)
+
+def struct_VkWriteDescriptorSet(printer, indent: int):
+    printer.write_stype_and_pnext("VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET", indent)
+    dstSet = printer.write_int("dstSet", 8, indent, signed=False, big_endian=False)
+    dstBinding = printer.write_int("dstBinding", 4, indent, signed=False, big_endian=False)
+    dstArrayElement = printer.write_int("dstArrayElement", 4, indent, signed=False, big_endian=False)
+    descriptorCount = printer.write_int("descriptorCount", 4, indent, signed=False, big_endian=False)
+    printer.write_enum("descriptorType", VkDescriptorType, indent)
+    printer.write_struct("pImageInfo", struct_VkDescriptorImageInfo, True, descriptorCount, indent)
+    printer.write_struct("pBufferInfo", struct_VkDescriptorBufferInfo, True, descriptorCount, indent)
+    pTexelBufferView = printer.write_int("pTexelBufferView", 8, indent, optional=True, count=descriptorCount, big_endian=False)
+
+VkAttachmentLoadOp = {
+    0: "VK_ATTACHMENT_LOAD_OP_LOAD",
+    1: "VK_ATTACHMENT_LOAD_OP_CLEAR",
+    2: "VK_ATTACHMENT_LOAD_OP_DONT_CARE",
+    1000400000: "VK_ATTACHMENT_LOAD_OP_NONE_EXT",
+}
+
+VkAttachmentStoreOp = {
+    0: "VK_ATTACHMENT_STORE_OP_STORE",
+    1: "VK_ATTACHMENT_STORE_OP_DONT_CARE",
+    1000301000: "VK_ATTACHMENT_STORE_OP_NONE_KHR",
+}
+
+VkBlendFactor = {
+    0: "VK_BLEND_FACTOR_ZERO",
+    1: "VK_BLEND_FACTOR_ONE",
+    2: "VK_BLEND_FACTOR_SRC_COLOR",
+    3: "VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR",
+    4: "VK_BLEND_FACTOR_DST_COLOR",
+    5: "VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR",
+    6: "VK_BLEND_FACTOR_SRC_ALPHA",
+    7: "VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA",
+    8: "VK_BLEND_FACTOR_DST_ALPHA",
+    9: "VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA",
+    10: "VK_BLEND_FACTOR_CONSTANT_COLOR",
+    11: "VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR",
+    12: "VK_BLEND_FACTOR_CONSTANT_ALPHA",
+    13: "VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA",
+    14: "VK_BLEND_FACTOR_SRC_ALPHA_SATURATE",
+    15: "VK_BLEND_FACTOR_SRC1_COLOR",
+    16: "VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR",
+    17: "VK_BLEND_FACTOR_SRC1_ALPHA",
+    18: "VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA",
+}
+
+VkBlendOp = {
+    0: "VK_BLEND_OP_ADD",
+    1: "VK_BLEND_OP_SUBTRACT",
+    2: "VK_BLEND_OP_REVERSE_SUBTRACT",
+    3: "VK_BLEND_OP_MIN",
+    4: "VK_BLEND_OP_MAX",
+    1000148000: "VK_BLEND_OP_ZERO_EXT",
+    1000148001: "VK_BLEND_OP_SRC_EXT",
+    1000148002: "VK_BLEND_OP_DST_EXT",
+    1000148003: "VK_BLEND_OP_SRC_OVER_EXT",
+    1000148004: "VK_BLEND_OP_DST_OVER_EXT",
+    1000148005: "VK_BLEND_OP_SRC_IN_EXT",
+    1000148006: "VK_BLEND_OP_DST_IN_EXT",
+    1000148007: "VK_BLEND_OP_SRC_OUT_EXT",
+    1000148008: "VK_BLEND_OP_DST_OUT_EXT",
+    1000148009: "VK_BLEND_OP_SRC_ATOP_EXT",
+    1000148010: "VK_BLEND_OP_DST_ATOP_EXT",
+    1000148011: "VK_BLEND_OP_XOR_EXT",
+    1000148012: "VK_BLEND_OP_MULTIPLY_EXT",
+    1000148013: "VK_BLEND_OP_SCREEN_EXT",
+    1000148014: "VK_BLEND_OP_OVERLAY_EXT",
+    1000148015: "VK_BLEND_OP_DARKEN_EXT",
+    1000148016: "VK_BLEND_OP_LIGHTEN_EXT",
+    1000148017: "VK_BLEND_OP_COLORDODGE_EXT",
+    1000148018: "VK_BLEND_OP_COLORBURN_EXT",
+    1000148019: "VK_BLEND_OP_HARDLIGHT_EXT",
+    1000148020: "VK_BLEND_OP_SOFTLIGHT_EXT",
+    1000148021: "VK_BLEND_OP_DIFFERENCE_EXT",
+    1000148022: "VK_BLEND_OP_EXCLUSION_EXT",
+    1000148023: "VK_BLEND_OP_INVERT_EXT",
+    1000148024: "VK_BLEND_OP_INVERT_RGB_EXT",
+    1000148025: "VK_BLEND_OP_LINEARDODGE_EXT",
+    1000148026: "VK_BLEND_OP_LINEARBURN_EXT",
+    1000148027: "VK_BLEND_OP_VIVIDLIGHT_EXT",
+    1000148028: "VK_BLEND_OP_LINEARLIGHT_EXT",
+    1000148029: "VK_BLEND_OP_PINLIGHT_EXT",
+    1000148030: "VK_BLEND_OP_HARDMIX_EXT",
+    1000148031: "VK_BLEND_OP_HSL_HUE_EXT",
+    1000148032: "VK_BLEND_OP_HSL_SATURATION_EXT",
+    1000148033: "VK_BLEND_OP_HSL_COLOR_EXT",
+    1000148034: "VK_BLEND_OP_HSL_LUMINOSITY_EXT",
+    1000148035: "VK_BLEND_OP_PLUS_EXT",
+    1000148036: "VK_BLEND_OP_PLUS_CLAMPED_EXT",
+    1000148037: "VK_BLEND_OP_PLUS_CLAMPED_ALPHA_EXT",
+    1000148038: "VK_BLEND_OP_PLUS_DARKER_EXT",
+    1000148039: "VK_BLEND_OP_MINUS_EXT",
+    1000148040: "VK_BLEND_OP_MINUS_CLAMPED_EXT",
+    1000148041: "VK_BLEND_OP_CONTRAST_EXT",
+    1000148042: "VK_BLEND_OP_INVERT_OVG_EXT",
+    1000148043: "VK_BLEND_OP_RED_EXT",
+    1000148044: "VK_BLEND_OP_GREEN_EXT",
+    1000148045: "VK_BLEND_OP_BLUE_EXT",
+}
+
+VkBorderColor = {
+    0: "VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK",
+    1: "VK_BORDER_COLOR_INT_TRANSPARENT_BLACK",
+    2: "VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK",
+    3: "VK_BORDER_COLOR_INT_OPAQUE_BLACK",
+    4: "VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE",
+    5: "VK_BORDER_COLOR_INT_OPAQUE_WHITE",
+    1000287003: "VK_BORDER_COLOR_FLOAT_CUSTOM_EXT",
+    1000287004: "VK_BORDER_COLOR_INT_CUSTOM_EXT",
+}
+
+VkCompareOp = {
+    0: "VK_COMPARE_OP_NEVER",
+    1: "VK_COMPARE_OP_LESS",
+    2: "VK_COMPARE_OP_EQUAL",
+    3: "VK_COMPARE_OP_LESS_OR_EQUAL",
+    4: "VK_COMPARE_OP_GREATER",
+    5: "VK_COMPARE_OP_NOT_EQUAL",
+    6: "VK_COMPARE_OP_GREATER_OR_EQUAL",
+    7: "VK_COMPARE_OP_ALWAYS",
+}
+
+VkComponentSwizzle = {
+    0: "VK_COMPONENT_SWIZZLE_IDENTITY",
+    1: "VK_COMPONENT_SWIZZLE_ZERO",
+    2: "VK_COMPONENT_SWIZZLE_ONE",
+    3: "VK_COMPONENT_SWIZZLE_R",
+    4: "VK_COMPONENT_SWIZZLE_G",
+    5: "VK_COMPONENT_SWIZZLE_B",
+    6: "VK_COMPONENT_SWIZZLE_A",
+}
+
+VkDescriptorType = {
+    0: "VK_DESCRIPTOR_TYPE_SAMPLER",
+    1: "VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER",
+    2: "VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE",
+    3: "VK_DESCRIPTOR_TYPE_STORAGE_IMAGE",
+    4: "VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER",
+    5: "VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER",
+    6: "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER",
+    7: "VK_DESCRIPTOR_TYPE_STORAGE_BUFFER",
+    8: "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC",
+    9: "VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC",
+    10: "VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT",
+    1000138000: "VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT",
+    1000150000: "VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR",
+    1000165000: "VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV",
+    1000351000: "VK_DESCRIPTOR_TYPE_MUTABLE_VALVE",
+}
+
+VkDynamicState = {
+    0: "VK_DYNAMIC_STATE_VIEWPORT",
+    1: "VK_DYNAMIC_STATE_SCISSOR",
+    2: "VK_DYNAMIC_STATE_LINE_WIDTH",
+    3: "VK_DYNAMIC_STATE_DEPTH_BIAS",
+    4: "VK_DYNAMIC_STATE_BLEND_CONSTANTS",
+    5: "VK_DYNAMIC_STATE_DEPTH_BOUNDS",
+    6: "VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK",
+    7: "VK_DYNAMIC_STATE_STENCIL_WRITE_MASK",
+    8: "VK_DYNAMIC_STATE_STENCIL_REFERENCE",
+    1000087000: "VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV",
+    1000099000: "VK_DYNAMIC_STATE_DISCARD_RECTANGLE_EXT",
+    1000143000: "VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT",
+    1000347000: "VK_DYNAMIC_STATE_RAY_TRACING_PIPELINE_STACK_SIZE_KHR",
+    1000164004: "VK_DYNAMIC_STATE_VIEWPORT_SHADING_RATE_PALETTE_NV",
+    1000164006: "VK_DYNAMIC_STATE_VIEWPORT_COARSE_SAMPLE_ORDER_NV",
+    1000205001: "VK_DYNAMIC_STATE_EXCLUSIVE_SCISSOR_NV",
+    1000226000: "VK_DYNAMIC_STATE_FRAGMENT_SHADING_RATE_KHR",
+    1000259000: "VK_DYNAMIC_STATE_LINE_STIPPLE_EXT",
+    1000267000: "VK_DYNAMIC_STATE_CULL_MODE_EXT",
+    1000267001: "VK_DYNAMIC_STATE_FRONT_FACE_EXT",
+    1000267002: "VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXT",
+    1000267003: "VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT",
+    1000267004: "VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT",
+    1000267005: "VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT",
+    1000267006: "VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE_EXT",
+    1000267007: "VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE_EXT",
+    1000267008: "VK_DYNAMIC_STATE_DEPTH_COMPARE_OP_EXT",
+    1000267009: "VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE_EXT",
+    1000267010: "VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE_EXT",
+    1000267011: "VK_DYNAMIC_STATE_STENCIL_OP_EXT",
+    1000352000: "VK_DYNAMIC_STATE_VERTEX_INPUT_EXT",
+    1000377000: "VK_DYNAMIC_STATE_PATCH_CONTROL_POINTS_EXT",
+    1000377001: "VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE_EXT",
+    1000377002: "VK_DYNAMIC_STATE_DEPTH_BIAS_ENABLE_EXT",
+    1000377003: "VK_DYNAMIC_STATE_LOGIC_OP_EXT",
+    1000377004: "VK_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE_EXT",
+    1000381000: "VK_DYNAMIC_STATE_COLOR_WRITE_ENABLE_EXT",
+}
+
+VkFilter = {
+    0: "VK_FILTER_NEAREST",
+    1: "VK_FILTER_LINEAR",
+    1000015000: "VK_FILTER_CUBIC_IMG",
+}
+
+VkFormat = {
+    0: "VK_FORMAT_UNDEFINED",
+    1: "VK_FORMAT_R4G4_UNORM_PACK8",
+    2: "VK_FORMAT_R4G4B4A4_UNORM_PACK16",
+    3: "VK_FORMAT_B4G4R4A4_UNORM_PACK16",
+    4: "VK_FORMAT_R5G6B5_UNORM_PACK16",
+    5: "VK_FORMAT_B5G6R5_UNORM_PACK16",
+    6: "VK_FORMAT_R5G5B5A1_UNORM_PACK16",
+    7: "VK_FORMAT_B5G5R5A1_UNORM_PACK16",
+    8: "VK_FORMAT_A1R5G5B5_UNORM_PACK16",
+    9: "VK_FORMAT_R8_UNORM",
+    10: "VK_FORMAT_R8_SNORM",
+    11: "VK_FORMAT_R8_USCALED",
+    12: "VK_FORMAT_R8_SSCALED",
+    13: "VK_FORMAT_R8_UINT",
+    14: "VK_FORMAT_R8_SINT",
+    15: "VK_FORMAT_R8_SRGB",
+    16: "VK_FORMAT_R8G8_UNORM",
+    17: "VK_FORMAT_R8G8_SNORM",
+    18: "VK_FORMAT_R8G8_USCALED",
+    19: "VK_FORMAT_R8G8_SSCALED",
+    20: "VK_FORMAT_R8G8_UINT",
+    21: "VK_FORMAT_R8G8_SINT",
+    22: "VK_FORMAT_R8G8_SRGB",
+    23: "VK_FORMAT_R8G8B8_UNORM",
+    24: "VK_FORMAT_R8G8B8_SNORM",
+    25: "VK_FORMAT_R8G8B8_USCALED",
+    26: "VK_FORMAT_R8G8B8_SSCALED",
+    27: "VK_FORMAT_R8G8B8_UINT",
+    28: "VK_FORMAT_R8G8B8_SINT",
+    29: "VK_FORMAT_R8G8B8_SRGB",
+    30: "VK_FORMAT_B8G8R8_UNORM",
+    31: "VK_FORMAT_B8G8R8_SNORM",
+    32: "VK_FORMAT_B8G8R8_USCALED",
+    33: "VK_FORMAT_B8G8R8_SSCALED",
+    34: "VK_FORMAT_B8G8R8_UINT",
+    35: "VK_FORMAT_B8G8R8_SINT",
+    36: "VK_FORMAT_B8G8R8_SRGB",
+    37: "VK_FORMAT_R8G8B8A8_UNORM",
+    38: "VK_FORMAT_R8G8B8A8_SNORM",
+    39: "VK_FORMAT_R8G8B8A8_USCALED",
+    40: "VK_FORMAT_R8G8B8A8_SSCALED",
+    41: "VK_FORMAT_R8G8B8A8_UINT",
+    42: "VK_FORMAT_R8G8B8A8_SINT",
+    43: "VK_FORMAT_R8G8B8A8_SRGB",
+    44: "VK_FORMAT_B8G8R8A8_UNORM",
+    45: "VK_FORMAT_B8G8R8A8_SNORM",
+    46: "VK_FORMAT_B8G8R8A8_USCALED",
+    47: "VK_FORMAT_B8G8R8A8_SSCALED",
+    48: "VK_FORMAT_B8G8R8A8_UINT",
+    49: "VK_FORMAT_B8G8R8A8_SINT",
+    50: "VK_FORMAT_B8G8R8A8_SRGB",
+    51: "VK_FORMAT_A8B8G8R8_UNORM_PACK32",
+    52: "VK_FORMAT_A8B8G8R8_SNORM_PACK32",
+    53: "VK_FORMAT_A8B8G8R8_USCALED_PACK32",
+    54: "VK_FORMAT_A8B8G8R8_SSCALED_PACK32",
+    55: "VK_FORMAT_A8B8G8R8_UINT_PACK32",
+    56: "VK_FORMAT_A8B8G8R8_SINT_PACK32",
+    57: "VK_FORMAT_A8B8G8R8_SRGB_PACK32",
+    58: "VK_FORMAT_A2R10G10B10_UNORM_PACK32",
+    59: "VK_FORMAT_A2R10G10B10_SNORM_PACK32",
+    60: "VK_FORMAT_A2R10G10B10_USCALED_PACK32",
+    61: "VK_FORMAT_A2R10G10B10_SSCALED_PACK32",
+    62: "VK_FORMAT_A2R10G10B10_UINT_PACK32",
+    63: "VK_FORMAT_A2R10G10B10_SINT_PACK32",
+    64: "VK_FORMAT_A2B10G10R10_UNORM_PACK32",
+    65: "VK_FORMAT_A2B10G10R10_SNORM_PACK32",
+    66: "VK_FORMAT_A2B10G10R10_USCALED_PACK32",
+    67: "VK_FORMAT_A2B10G10R10_SSCALED_PACK32",
+    68: "VK_FORMAT_A2B10G10R10_UINT_PACK32",
+    69: "VK_FORMAT_A2B10G10R10_SINT_PACK32",
+    70: "VK_FORMAT_R16_UNORM",
+    71: "VK_FORMAT_R16_SNORM",
+    72: "VK_FORMAT_R16_USCALED",
+    73: "VK_FORMAT_R16_SSCALED",
+    74: "VK_FORMAT_R16_UINT",
+    75: "VK_FORMAT_R16_SINT",
+    76: "VK_FORMAT_R16_SFLOAT",
+    77: "VK_FORMAT_R16G16_UNORM",
+    78: "VK_FORMAT_R16G16_SNORM",
+    79: "VK_FORMAT_R16G16_USCALED",
+    80: "VK_FORMAT_R16G16_SSCALED",
+    81: "VK_FORMAT_R16G16_UINT",
+    82: "VK_FORMAT_R16G16_SINT",
+    83: "VK_FORMAT_R16G16_SFLOAT",
+    84: "VK_FORMAT_R16G16B16_UNORM",
+    85: "VK_FORMAT_R16G16B16_SNORM",
+    86: "VK_FORMAT_R16G16B16_USCALED",
+    87: "VK_FORMAT_R16G16B16_SSCALED",
+    88: "VK_FORMAT_R16G16B16_UINT",
+    89: "VK_FORMAT_R16G16B16_SINT",
+    90: "VK_FORMAT_R16G16B16_SFLOAT",
+    91: "VK_FORMAT_R16G16B16A16_UNORM",
+    92: "VK_FORMAT_R16G16B16A16_SNORM",
+    93: "VK_FORMAT_R16G16B16A16_USCALED",
+    94: "VK_FORMAT_R16G16B16A16_SSCALED",
+    95: "VK_FORMAT_R16G16B16A16_UINT",
+    96: "VK_FORMAT_R16G16B16A16_SINT",
+    97: "VK_FORMAT_R16G16B16A16_SFLOAT",
+    98: "VK_FORMAT_R32_UINT",
+    99: "VK_FORMAT_R32_SINT",
+    100: "VK_FORMAT_R32_SFLOAT",
+    101: "VK_FORMAT_R32G32_UINT",
+    102: "VK_FORMAT_R32G32_SINT",
+    103: "VK_FORMAT_R32G32_SFLOAT",
+    104: "VK_FORMAT_R32G32B32_UINT",
+    105: "VK_FORMAT_R32G32B32_SINT",
+    106: "VK_FORMAT_R32G32B32_SFLOAT",
+    107: "VK_FORMAT_R32G32B32A32_UINT",
+    108: "VK_FORMAT_R32G32B32A32_SINT",
+    109: "VK_FORMAT_R32G32B32A32_SFLOAT",
+    110: "VK_FORMAT_R64_UINT",
+    111: "VK_FORMAT_R64_SINT",
+    112: "VK_FORMAT_R64_SFLOAT",
+    113: "VK_FORMAT_R64G64_UINT",
+    114: "VK_FORMAT_R64G64_SINT",
+    115: "VK_FORMAT_R64G64_SFLOAT",
+    116: "VK_FORMAT_R64G64B64_UINT",
+    117: "VK_FORMAT_R64G64B64_SINT",
+    118: "VK_FORMAT_R64G64B64_SFLOAT",
+    119: "VK_FORMAT_R64G64B64A64_UINT",
+    120: "VK_FORMAT_R64G64B64A64_SINT",
+    121: "VK_FORMAT_R64G64B64A64_SFLOAT",
+    122: "VK_FORMAT_B10G11R11_UFLOAT_PACK32",
+    123: "VK_FORMAT_E5B9G9R9_UFLOAT_PACK32",
+    124: "VK_FORMAT_D16_UNORM",
+    125: "VK_FORMAT_X8_D24_UNORM_PACK32",
+    126: "VK_FORMAT_D32_SFLOAT",
+    127: "VK_FORMAT_S8_UINT",
+    128: "VK_FORMAT_D16_UNORM_S8_UINT",
+    129: "VK_FORMAT_D24_UNORM_S8_UINT",
+    130: "VK_FORMAT_D32_SFLOAT_S8_UINT",
+    131: "VK_FORMAT_BC1_RGB_UNORM_BLOCK",
+    132: "VK_FORMAT_BC1_RGB_SRGB_BLOCK",
+    133: "VK_FORMAT_BC1_RGBA_UNORM_BLOCK",
+    134: "VK_FORMAT_BC1_RGBA_SRGB_BLOCK",
+    135: "VK_FORMAT_BC2_UNORM_BLOCK",
+    136: "VK_FORMAT_BC2_SRGB_BLOCK",
+    137: "VK_FORMAT_BC3_UNORM_BLOCK",
+    138: "VK_FORMAT_BC3_SRGB_BLOCK",
+    139: "VK_FORMAT_BC4_UNORM_BLOCK",
+    140: "VK_FORMAT_BC4_SNORM_BLOCK",
+    141: "VK_FORMAT_BC5_UNORM_BLOCK",
+    142: "VK_FORMAT_BC5_SNORM_BLOCK",
+    143: "VK_FORMAT_BC6H_UFLOAT_BLOCK",
+    144: "VK_FORMAT_BC6H_SFLOAT_BLOCK",
+    145: "VK_FORMAT_BC7_UNORM_BLOCK",
+    146: "VK_FORMAT_BC7_SRGB_BLOCK",
+    147: "VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK",
+    148: "VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK",
+    149: "VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK",
+    150: "VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK",
+    151: "VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK",
+    152: "VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK",
+    153: "VK_FORMAT_EAC_R11_UNORM_BLOCK",
+    154: "VK_FORMAT_EAC_R11_SNORM_BLOCK",
+    155: "VK_FORMAT_EAC_R11G11_UNORM_BLOCK",
+    156: "VK_FORMAT_EAC_R11G11_SNORM_BLOCK",
+    157: "VK_FORMAT_ASTC_4x4_UNORM_BLOCK",
+    158: "VK_FORMAT_ASTC_4x4_SRGB_BLOCK",
+    159: "VK_FORMAT_ASTC_5x4_UNORM_BLOCK",
+    160: "VK_FORMAT_ASTC_5x4_SRGB_BLOCK",
+    161: "VK_FORMAT_ASTC_5x5_UNORM_BLOCK",
+    162: "VK_FORMAT_ASTC_5x5_SRGB_BLOCK",
+    163: "VK_FORMAT_ASTC_6x5_UNORM_BLOCK",
+    164: "VK_FORMAT_ASTC_6x5_SRGB_BLOCK",
+    165: "VK_FORMAT_ASTC_6x6_UNORM_BLOCK",
+    166: "VK_FORMAT_ASTC_6x6_SRGB_BLOCK",
+    167: "VK_FORMAT_ASTC_8x5_UNORM_BLOCK",
+    168: "VK_FORMAT_ASTC_8x5_SRGB_BLOCK",
+    169: "VK_FORMAT_ASTC_8x6_UNORM_BLOCK",
+    170: "VK_FORMAT_ASTC_8x6_SRGB_BLOCK",
+    171: "VK_FORMAT_ASTC_8x8_UNORM_BLOCK",
+    172: "VK_FORMAT_ASTC_8x8_SRGB_BLOCK",
+    173: "VK_FORMAT_ASTC_10x5_UNORM_BLOCK",
+    174: "VK_FORMAT_ASTC_10x5_SRGB_BLOCK",
+    175: "VK_FORMAT_ASTC_10x6_UNORM_BLOCK",
+    176: "VK_FORMAT_ASTC_10x6_SRGB_BLOCK",
+    177: "VK_FORMAT_ASTC_10x8_UNORM_BLOCK",
+    178: "VK_FORMAT_ASTC_10x8_SRGB_BLOCK",
+    179: "VK_FORMAT_ASTC_10x10_UNORM_BLOCK",
+    180: "VK_FORMAT_ASTC_10x10_SRGB_BLOCK",
+    181: "VK_FORMAT_ASTC_12x10_UNORM_BLOCK",
+    182: "VK_FORMAT_ASTC_12x10_SRGB_BLOCK",
+    183: "VK_FORMAT_ASTC_12x12_UNORM_BLOCK",
+    184: "VK_FORMAT_ASTC_12x12_SRGB_BLOCK",
+    1000156000: "VK_FORMAT_G8B8G8R8_422_UNORM",
+    1000156001: "VK_FORMAT_B8G8R8G8_422_UNORM",
+    1000156002: "VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM",
+    1000156003: "VK_FORMAT_G8_B8R8_2PLANE_420_UNORM",
+    1000156004: "VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM",
+    1000156005: "VK_FORMAT_G8_B8R8_2PLANE_422_UNORM",
+    1000156006: "VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM",
+    1000156007: "VK_FORMAT_R10X6_UNORM_PACK16",
+    1000156008: "VK_FORMAT_R10X6G10X6_UNORM_2PACK16",
+    1000156009: "VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16",
+    1000156010: "VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16",
+    1000156011: "VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16",
+    1000156012: "VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16",
+    1000156013: "VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16",
+    1000156014: "VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16",
+    1000156015: "VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16",
+    1000156016: "VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16",
+    1000156017: "VK_FORMAT_R12X4_UNORM_PACK16",
+    1000156018: "VK_FORMAT_R12X4G12X4_UNORM_2PACK16",
+    1000156019: "VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16",
+    1000156020: "VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16",
+    1000156021: "VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16",
+    1000156022: "VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16",
+    1000156023: "VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16",
+    1000156024: "VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16",
+    1000156025: "VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16",
+    1000156026: "VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16",
+    1000156027: "VK_FORMAT_G16B16G16R16_422_UNORM",
+    1000156028: "VK_FORMAT_B16G16R16G16_422_UNORM",
+    1000156029: "VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM",
+    1000156030: "VK_FORMAT_G16_B16R16_2PLANE_420_UNORM",
+    1000156031: "VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM",
+    1000156032: "VK_FORMAT_G16_B16R16_2PLANE_422_UNORM",
+    1000156033: "VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM",
+    1000054000: "VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG",
+    1000054001: "VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG",
+    1000054002: "VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG",
+    1000054003: "VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG",
+    1000054004: "VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG",
+    1000054005: "VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG",
+    1000054006: "VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG",
+    1000054007: "VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG",
+    1000066000: "VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT",
+    1000066001: "VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT",
+    1000066002: "VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT",
+    1000066003: "VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT",
+    1000066004: "VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT",
+    1000066005: "VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT",
+    1000066006: "VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT",
+    1000066007: "VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT",
+    1000066008: "VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT",
+    1000066009: "VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT",
+    1000066010: "VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT",
+    1000066011: "VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT",
+    1000066012: "VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT",
+    1000066013: "VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT",
+    1000288000: "VK_FORMAT_ASTC_3x3x3_UNORM_BLOCK_EXT",
+    1000288001: "VK_FORMAT_ASTC_3x3x3_SRGB_BLOCK_EXT",
+    1000288002: "VK_FORMAT_ASTC_3x3x3_SFLOAT_BLOCK_EXT",
+    1000288003: "VK_FORMAT_ASTC_4x3x3_UNORM_BLOCK_EXT",
+    1000288004: "VK_FORMAT_ASTC_4x3x3_SRGB_BLOCK_EXT",
+    1000288005: "VK_FORMAT_ASTC_4x3x3_SFLOAT_BLOCK_EXT",
+    1000288006: "VK_FORMAT_ASTC_4x4x3_UNORM_BLOCK_EXT",
+    1000288007: "VK_FORMAT_ASTC_4x4x3_SRGB_BLOCK_EXT",
+    1000288008: "VK_FORMAT_ASTC_4x4x3_SFLOAT_BLOCK_EXT",
+    1000288009: "VK_FORMAT_ASTC_4x4x4_UNORM_BLOCK_EXT",
+    1000288010: "VK_FORMAT_ASTC_4x4x4_SRGB_BLOCK_EXT",
+    1000288011: "VK_FORMAT_ASTC_4x4x4_SFLOAT_BLOCK_EXT",
+    1000288012: "VK_FORMAT_ASTC_5x4x4_UNORM_BLOCK_EXT",
+    1000288013: "VK_FORMAT_ASTC_5x4x4_SRGB_BLOCK_EXT",
+    1000288014: "VK_FORMAT_ASTC_5x4x4_SFLOAT_BLOCK_EXT",
+    1000288015: "VK_FORMAT_ASTC_5x5x4_UNORM_BLOCK_EXT",
+    1000288016: "VK_FORMAT_ASTC_5x5x4_SRGB_BLOCK_EXT",
+    1000288017: "VK_FORMAT_ASTC_5x5x4_SFLOAT_BLOCK_EXT",
+    1000288018: "VK_FORMAT_ASTC_5x5x5_UNORM_BLOCK_EXT",
+    1000288019: "VK_FORMAT_ASTC_5x5x5_SRGB_BLOCK_EXT",
+    1000288020: "VK_FORMAT_ASTC_5x5x5_SFLOAT_BLOCK_EXT",
+    1000288021: "VK_FORMAT_ASTC_6x5x5_UNORM_BLOCK_EXT",
+    1000288022: "VK_FORMAT_ASTC_6x5x5_SRGB_BLOCK_EXT",
+    1000288023: "VK_FORMAT_ASTC_6x5x5_SFLOAT_BLOCK_EXT",
+    1000288024: "VK_FORMAT_ASTC_6x6x5_UNORM_BLOCK_EXT",
+    1000288025: "VK_FORMAT_ASTC_6x6x5_SRGB_BLOCK_EXT",
+    1000288026: "VK_FORMAT_ASTC_6x6x5_SFLOAT_BLOCK_EXT",
+    1000288027: "VK_FORMAT_ASTC_6x6x6_UNORM_BLOCK_EXT",
+    1000288028: "VK_FORMAT_ASTC_6x6x6_SRGB_BLOCK_EXT",
+    1000288029: "VK_FORMAT_ASTC_6x6x6_SFLOAT_BLOCK_EXT",
+    1000330000: "VK_FORMAT_G8_B8R8_2PLANE_444_UNORM_EXT",
+    1000330001: "VK_FORMAT_G10X6_B10X6R10X6_2PLANE_444_UNORM_3PACK16_EXT",
+    1000330002: "VK_FORMAT_G12X4_B12X4R12X4_2PLANE_444_UNORM_3PACK16_EXT",
+    1000330003: "VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT",
+    1000340000: "VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT",
+    1000340001: "VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT",
+}
+
+VkFrontFace = {
+    0: "VK_FRONT_FACE_COUNTER_CLOCKWISE",
+    1: "VK_FRONT_FACE_CLOCKWISE",
+}
+
+VkImageLayout = {
+    0: "VK_IMAGE_LAYOUT_UNDEFINED",
+    1: "VK_IMAGE_LAYOUT_GENERAL",
+    2: "VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL",
+    3: "VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL",
+    4: "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL",
+    5: "VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL",
+    6: "VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL",
+    7: "VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL",
+    8: "VK_IMAGE_LAYOUT_PREINITIALIZED",
+    1000117000: "VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL",
+    1000117001: "VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL",
+    1000241000: "VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL",
+    1000241001: "VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL",
+    1000241002: "VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL",
+    1000241003: "VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL",
+    1000001002: "VK_IMAGE_LAYOUT_PRESENT_SRC_KHR",
+    1000024000: "VK_IMAGE_LAYOUT_VIDEO_DECODE_DST_KHR",
+    1000024001: "VK_IMAGE_LAYOUT_VIDEO_DECODE_SRC_KHR",
+    1000024002: "VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR",
+    1000111000: "VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR",
+    1000218000: "VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT",
+    1000164003: "VK_IMAGE_LAYOUT_FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL_KHR",
+    1000299000: "VK_IMAGE_LAYOUT_VIDEO_ENCODE_DST_KHR",
+    1000299001: "VK_IMAGE_LAYOUT_VIDEO_ENCODE_SRC_KHR",
+    1000299002: "VK_IMAGE_LAYOUT_VIDEO_ENCODE_DPB_KHR",
+    1000314000: "VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL_KHR",
+    1000314001: "VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL_KHR",
+}
+
+VkImageTiling = {
+    0: "VK_IMAGE_TILING_OPTIMAL",
+    1: "VK_IMAGE_TILING_LINEAR",
+    1000158000: "VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT",
+}
+
+VkImageType = {
+    0: "VK_IMAGE_TYPE_1D",
+    1: "VK_IMAGE_TYPE_2D",
+    2: "VK_IMAGE_TYPE_3D",
+}
+
+VkImageViewType = {
+    0: "VK_IMAGE_VIEW_TYPE_1D",
+    1: "VK_IMAGE_VIEW_TYPE_2D",
+    2: "VK_IMAGE_VIEW_TYPE_3D",
+    3: "VK_IMAGE_VIEW_TYPE_CUBE",
+    4: "VK_IMAGE_VIEW_TYPE_1D_ARRAY",
+    5: "VK_IMAGE_VIEW_TYPE_2D_ARRAY",
+    6: "VK_IMAGE_VIEW_TYPE_CUBE_ARRAY",
+}
+
+VkIndexType = {
+    0: "VK_INDEX_TYPE_UINT16",
+    1: "VK_INDEX_TYPE_UINT32",
+    1000165000: "VK_INDEX_TYPE_NONE_KHR",
+    1000265000: "VK_INDEX_TYPE_UINT8_EXT",
+}
+
+VkLogicOp = {
+    0: "VK_LOGIC_OP_CLEAR",
+    1: "VK_LOGIC_OP_AND",
+    2: "VK_LOGIC_OP_AND_REVERSE",
+    3: "VK_LOGIC_OP_COPY",
+    4: "VK_LOGIC_OP_AND_INVERTED",
+    5: "VK_LOGIC_OP_NO_OP",
+    6: "VK_LOGIC_OP_XOR",
+    7: "VK_LOGIC_OP_OR",
+    8: "VK_LOGIC_OP_NOR",
+    9: "VK_LOGIC_OP_EQUIVALENT",
+    10: "VK_LOGIC_OP_INVERT",
+    11: "VK_LOGIC_OP_OR_REVERSE",
+    12: "VK_LOGIC_OP_COPY_INVERTED",
+    13: "VK_LOGIC_OP_OR_INVERTED",
+    14: "VK_LOGIC_OP_NAND",
+    15: "VK_LOGIC_OP_SET",
+}
+
+VkPhysicalDeviceType = {
+    0: "VK_PHYSICAL_DEVICE_TYPE_OTHER",
+    1: "VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU",
+    2: "VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU",
+    3: "VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU",
+    4: "VK_PHYSICAL_DEVICE_TYPE_CPU",
+}
+
+VkPipelineBindPoint = {
+    0: "VK_PIPELINE_BIND_POINT_GRAPHICS",
+    1: "VK_PIPELINE_BIND_POINT_COMPUTE",
+    1000165000: "VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR",
+    1000369003: "VK_PIPELINE_BIND_POINT_SUBPASS_SHADING_HUAWEI",
+}
+
+VkPolygonMode = {
+    0: "VK_POLYGON_MODE_FILL",
+    1: "VK_POLYGON_MODE_LINE",
+    2: "VK_POLYGON_MODE_POINT",
+    1000153000: "VK_POLYGON_MODE_FILL_RECTANGLE_NV",
+}
+
+VkPrimitiveTopology = {
+    0: "VK_PRIMITIVE_TOPOLOGY_POINT_LIST",
+    1: "VK_PRIMITIVE_TOPOLOGY_LINE_LIST",
+    2: "VK_PRIMITIVE_TOPOLOGY_LINE_STRIP",
+    3: "VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST",
+    4: "VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP",
+    5: "VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN",
+    6: "VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY",
+    7: "VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY",
+    8: "VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY",
+    9: "VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY",
+    10: "VK_PRIMITIVE_TOPOLOGY_PATCH_LIST",
+}
+
+VkSampleCountFlagBits = {
+    1: "VK_SAMPLE_COUNT_1_BIT",
+    2: "VK_SAMPLE_COUNT_2_BIT",
+    4: "VK_SAMPLE_COUNT_4_BIT",
+    8: "VK_SAMPLE_COUNT_8_BIT",
+    16: "VK_SAMPLE_COUNT_16_BIT",
+    32: "VK_SAMPLE_COUNT_32_BIT",
+    64: "VK_SAMPLE_COUNT_64_BIT",
+}
+
+VkSamplerAddressMode = {
+    0: "VK_SAMPLER_ADDRESS_MODE_REPEAT",
+    1: "VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT",
+    2: "VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE",
+    3: "VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER",
+    4: "VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE",
+    4: "VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE",
+}
+
+VkSamplerMipmapMode = {
+    0: "VK_SAMPLER_MIPMAP_MODE_NEAREST",
+    1: "VK_SAMPLER_MIPMAP_MODE_LINEAR",
+}
+
+VkShaderStageFlagBits = {
+    1: "VK_SHADER_STAGE_VERTEX_BIT",
+    2: "VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT",
+    4: "VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT",
+    8: "VK_SHADER_STAGE_GEOMETRY_BIT",
+    16: "VK_SHADER_STAGE_FRAGMENT_BIT",
+    32: "VK_SHADER_STAGE_COMPUTE_BIT",
+    31: "VK_SHADER_STAGE_ALL_GRAPHICS",
+    2147483647: "VK_SHADER_STAGE_ALL",
+    256: "VK_SHADER_STAGE_RAYGEN_BIT_KHR",
+    512: "VK_SHADER_STAGE_ANY_HIT_BIT_KHR",
+    1024: "VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR",
+    2048: "VK_SHADER_STAGE_MISS_BIT_KHR",
+    4096: "VK_SHADER_STAGE_INTERSECTION_BIT_KHR",
+    8192: "VK_SHADER_STAGE_CALLABLE_BIT_KHR",
+    64: "VK_SHADER_STAGE_TASK_BIT_NV",
+    128: "VK_SHADER_STAGE_MESH_BIT_NV",
+    16384: "VK_SHADER_STAGE_SUBPASS_SHADING_BIT_HUAWEI",
+}
+
+VkSharingMode = {
+    0: "VK_SHARING_MODE_EXCLUSIVE",
+    1: "VK_SHARING_MODE_CONCURRENT",
+}
+
+VkStencilOp = {
+    0: "VK_STENCIL_OP_KEEP",
+    1: "VK_STENCIL_OP_ZERO",
+    2: "VK_STENCIL_OP_REPLACE",
+    3: "VK_STENCIL_OP_INCREMENT_AND_CLAMP",
+    4: "VK_STENCIL_OP_DECREMENT_AND_CLAMP",
+    5: "VK_STENCIL_OP_INVERT",
+    6: "VK_STENCIL_OP_INCREMENT_AND_WRAP",
+    7: "VK_STENCIL_OP_DECREMENT_AND_WRAP",
+}
+
+VkStructureType = {
+    0: "VK_STRUCTURE_TYPE_APPLICATION_INFO",
+    1: "VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO",
+    2: "VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO",
+    3: "VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO",
+    4: "VK_STRUCTURE_TYPE_SUBMIT_INFO",
+    5: "VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO",
+    6: "VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE",
+    7: "VK_STRUCTURE_TYPE_BIND_SPARSE_INFO",
+    8: "VK_STRUCTURE_TYPE_FENCE_CREATE_INFO",
+    9: "VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO",
+    10: "VK_STRUCTURE_TYPE_EVENT_CREATE_INFO",
+    11: "VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO",
+    12: "VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO",
+    13: "VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO",
+    14: "VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO",
+    15: "VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO",
+    16: "VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO",
+    17: "VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO",
+    18: "VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO",
+    19: "VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO",
+    20: "VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO",
+    21: "VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO",
+    22: "VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO",
+    23: "VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO",
+    24: "VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO",
+    25: "VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO",
+    26: "VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO",
+    27: "VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO",
+    28: "VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO",
+    29: "VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO",
+    30: "VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO",
+    31: "VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO",
+    32: "VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO",
+    33: "VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO",
+    34: "VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO",
+    35: "VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET",
+    36: "VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET",
+    37: "VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO",
+    38: "VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO",
+    39: "VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO",
+    40: "VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO",
+    41: "VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO",
+    42: "VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO",
+    43: "VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO",
+    44: "VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER",
+    45: "VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER",
+    46: "VK_STRUCTURE_TYPE_MEMORY_BARRIER",
+    47: "VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO",
+    48: "VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO",
+    1000094000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES",
+    1000157000: "VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO",
+    1000157001: "VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO",
+    1000083000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES",
+    1000127000: "VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS",
+    1000127001: "VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO",
+    1000060000: "VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO",
+    1000060003: "VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO",
+    1000060004: "VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO",
+    1000060005: "VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO",
+    1000060006: "VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO",
+    1000060013: "VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO",
+    1000060014: "VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO",
+    1000070000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES",
+    1000070001: "VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO",
+    1000146000: "VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2",
+    1000146001: "VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2",
+    1000146002: "VK_STRUCTURE_TYPE_IMAGE_SPARSE_MEMORY_REQUIREMENTS_INFO_2",
+    1000146003: "VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2",
+    1000146004: "VK_STRUCTURE_TYPE_SPARSE_IMAGE_MEMORY_REQUIREMENTS_2",
+    1000059000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2",
+    1000059001: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2",
+    1000059002: "VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2",
+    1000059003: "VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2",
+    1000059004: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2",
+    1000059005: "VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2",
+    1000059006: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2",
+    1000059007: "VK_STRUCTURE_TYPE_SPARSE_IMAGE_FORMAT_PROPERTIES_2",
+    1000059008: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SPARSE_IMAGE_FORMAT_INFO_2",
+    1000117000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES",
+    1000117001: "VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO",
+    1000117002: "VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO",
+    1000117003: "VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO",
+    1000053000: "VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO",
+    1000053001: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES",
+    1000053002: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES",
+    1000120000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES",
+    1000145000: "VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO",
+    1000145001: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES",
+    1000145002: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES",
+    1000145003: "VK_STRUCTURE_TYPE_DEVICE_QUEUE_INFO_2",
+    1000156000: "VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO",
+    1000156001: "VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO",
+    1000156002: "VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO",
+    1000156003: "VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO",
+    1000156004: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES",
+    1000156005: "VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES",
+    1000085000: "VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO",
+    1000071000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO",
+    1000071001: "VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES",
+    1000071002: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO",
+    1000071003: "VK_STRUCTURE_TYPE_EXTERNAL_BUFFER_PROPERTIES",
+    1000071004: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES",
+    1000072000: "VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO",
+    1000072001: "VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO",
+    1000072002: "VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO",
+    1000112000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO",
+    1000112001: "VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES",
+    1000113000: "VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO",
+    1000077000: "VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO",
+    1000076000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO",
+    1000076001: "VK_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_PROPERTIES",
+    1000168000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES",
+    1000168001: "VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_SUPPORT",
+    1000063000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES",
+    49: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES",
+    50: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES",
+    51: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES",
+    52: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES",
+    1000147000: "VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO",
+    1000109000: "VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2",
+    1000109001: "VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2",
+    1000109002: "VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2",
+    1000109003: "VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2",
+    1000109004: "VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2",
+    1000109005: "VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO",
+    1000109006: "VK_STRUCTURE_TYPE_SUBPASS_END_INFO",
+    1000177000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES",
+    1000196000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES",
+    1000180000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES",
+    1000082000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES",
+    1000197000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES",
+    1000161000: "VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO",
+    1000161001: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES",
+    1000161002: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES",
+    1000161003: "VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO",
+    1000161004: "VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT",
+    1000199000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES",
+    1000199001: "VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE",
+    1000221000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES",
+    1000246000: "VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO",
+    1000130000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES",
+    1000130001: "VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO",
+    1000211000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES",
+    1000108000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES",
+    1000108001: "VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO",
+    1000108002: "VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO",
+    1000108003: "VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO",
+    1000253000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES",
+    1000175000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES",
+    1000241000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES",
+    1000241001: "VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT",
+    1000241002: "VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT",
+    1000261000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES",
+    1000207000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES",
+    1000207001: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES",
+    1000207002: "VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO",
+    1000207003: "VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO",
+    1000207004: "VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO",
+    1000207005: "VK_STRUCTURE_TYPE_SEMAPHORE_SIGNAL_INFO",
+    1000257000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES",
+    1000244001: "VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO",
+    1000257002: "VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO",
+    1000257003: "VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO",
+    1000257004: "VK_STRUCTURE_TYPE_DEVICE_MEMORY_OPAQUE_CAPTURE_ADDRESS_INFO",
+    1000001000: "VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR",
+    1000001001: "VK_STRUCTURE_TYPE_PRESENT_INFO_KHR",
+    1000060007: "VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_CAPABILITIES_KHR",
+    1000060008: "VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR",
+    1000060009: "VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR",
+    1000060010: "VK_STRUCTURE_TYPE_ACQUIRE_NEXT_IMAGE_INFO_KHR",
+    1000060011: "VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR",
+    1000060012: "VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR",
+    1000002000: "VK_STRUCTURE_TYPE_DISPLAY_MODE_CREATE_INFO_KHR",
+    1000002001: "VK_STRUCTURE_TYPE_DISPLAY_SURFACE_CREATE_INFO_KHR",
+    1000003000: "VK_STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR",
+    1000004000: "VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR",
+    1000005000: "VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR",
+    1000006000: "VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR",
+    1000008000: "VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR",
+    1000009000: "VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR",
+    1000010000: "VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID",
+    1000011000: "VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT",
+    1000018000: "VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD",
+    1000022000: "VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_NAME_INFO_EXT",
+    1000022001: "VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_TAG_INFO_EXT",
+    1000022002: "VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT",
+    1000023000: "VK_STRUCTURE_TYPE_VIDEO_PROFILE_KHR",
+    1000023001: "VK_STRUCTURE_TYPE_VIDEO_CAPABILITIES_KHR",
+    1000023002: "VK_STRUCTURE_TYPE_VIDEO_PICTURE_RESOURCE_KHR",
+    1000023003: "VK_STRUCTURE_TYPE_VIDEO_GET_MEMORY_PROPERTIES_KHR",
+    1000023004: "VK_STRUCTURE_TYPE_VIDEO_BIND_MEMORY_KHR",
+    1000023005: "VK_STRUCTURE_TYPE_VIDEO_SESSION_CREATE_INFO_KHR",
+    1000023006: "VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_CREATE_INFO_KHR",
+    1000023007: "VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_UPDATE_INFO_KHR",
+    1000023008: "VK_STRUCTURE_TYPE_VIDEO_BEGIN_CODING_INFO_KHR",
+    1000023009: "VK_STRUCTURE_TYPE_VIDEO_END_CODING_INFO_KHR",
+    1000023010: "VK_STRUCTURE_TYPE_VIDEO_CODING_CONTROL_INFO_KHR",
+    1000023011: "VK_STRUCTURE_TYPE_VIDEO_REFERENCE_SLOT_KHR",
+    1000023012: "VK_STRUCTURE_TYPE_VIDEO_QUEUE_FAMILY_PROPERTIES_2_KHR",
+    1000023013: "VK_STRUCTURE_TYPE_VIDEO_PROFILES_KHR",
+    1000023014: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_FORMAT_INFO_KHR",
+    1000023015: "VK_STRUCTURE_TYPE_VIDEO_FORMAT_PROPERTIES_KHR",
+    1000024000: "VK_STRUCTURE_TYPE_VIDEO_DECODE_INFO_KHR",
+    1000026000: "VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV",
+    1000026001: "VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV",
+    1000026002: "VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV",
+    1000028000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT",
+    1000028001: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT",
+    1000028002: "VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT",
+    1000029000: "VK_STRUCTURE_TYPE_CU_MODULE_CREATE_INFO_NVX",
+    1000029001: "VK_STRUCTURE_TYPE_CU_FUNCTION_CREATE_INFO_NVX",
+    1000029002: "VK_STRUCTURE_TYPE_CU_LAUNCH_INFO_NVX",
+    1000030000: "VK_STRUCTURE_TYPE_IMAGE_VIEW_HANDLE_INFO_NVX",
+    1000030001: "VK_STRUCTURE_TYPE_IMAGE_VIEW_ADDRESS_PROPERTIES_NVX",
+    1000038000: "VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_EXT",
+    1000038001: "VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_CREATE_INFO_EXT",
+    1000038002: "VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT",
+    1000038003: "VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT",
+    1000038004: "VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_VCL_FRAME_INFO_EXT",
+    1000038005: "VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_DPB_SLOT_INFO_EXT",
+    1000038006: "VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_NALU_SLICE_EXT",
+    1000038007: "VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_EMIT_PICTURE_PARAMETERS_EXT",
+    1000038008: "VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_EXT",
+    1000039000: "VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_CAPABILITIES_EXT",
+    1000039001: "VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_CREATE_INFO_EXT",
+    1000039002: "VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT",
+    1000039003: "VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT",
+    1000039004: "VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_VCL_FRAME_INFO_EXT",
+    1000039005: "VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_DPB_SLOT_INFO_EXT",
+    1000039006: "VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_NALU_SLICE_EXT",
+    1000039007: "VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_EMIT_PICTURE_PARAMETERS_EXT",
+    1000039008: "VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PROFILE_EXT",
+    1000039009: "VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_REFERENCE_LISTS_EXT",
+    1000040000: "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_EXT",
+    1000040001: "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_CREATE_INFO_EXT",
+    1000040002: "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_EXT",
+    1000040003: "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_MVC_EXT",
+    1000040004: "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_EXT",
+    1000040005: "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT",
+    1000040006: "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT",
+    1000040007: "VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_EXT",
+    1000041000: "VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD",
+    1000044000: "VK_STRUCTURE_TYPE_RENDERING_INFO_KHR",
+    1000044001: "VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO_KHR",
+    1000044002: "VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR",
+    1000044003: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES_KHR",
+    1000044004: "VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDERING_INFO_KHR",
+    1000044006: "VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR",
+    1000044007: "VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_INFO_EXT",
+    1000044008: "VK_STRUCTURE_TYPE_ATTACHMENT_SAMPLE_COUNT_INFO_AMD",
+    1000044009: "VK_STRUCTURE_TYPE_MULTIVIEW_PER_VIEW_ATTRIBUTES_INFO_NVX",
+    1000049000: "VK_STRUCTURE_TYPE_STREAM_DESCRIPTOR_SURFACE_CREATE_INFO_GGP",
+    1000050000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV",
+    1000056000: "VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV",
+    1000056001: "VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV",
+    1000057000: "VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV",
+    1000057001: "VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV",
+    1000058000: "VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV",
+    1000060007: "VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_CAPABILITIES_KHR",
+    1000060008: "VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR",
+    1000060009: "VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR",
+    1000060010: "VK_STRUCTURE_TYPE_ACQUIRE_NEXT_IMAGE_INFO_KHR",
+    1000060011: "VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR",
+    1000060012: "VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR",
+    1000061000: "VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT",
+    1000062000: "VK_STRUCTURE_TYPE_VI_SURFACE_CREATE_INFO_NN",
+    1000066000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT",
+    1000067000: "VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT",
+    1000067001: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT",
+    1000073000: "VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR",
+    1000073001: "VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR",
+    1000073002: "VK_STRUCTURE_TYPE_MEMORY_WIN32_HANDLE_PROPERTIES_KHR",
+    1000073003: "VK_STRUCTURE_TYPE_MEMORY_GET_WIN32_HANDLE_INFO_KHR",
+    1000074000: "VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR",
+    1000074001: "VK_STRUCTURE_TYPE_MEMORY_FD_PROPERTIES_KHR",
+    1000074002: "VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR",
+    1000075000: "VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR",
+    1000078000: "VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR",
+    1000078001: "VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR",
+    1000078002: "VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR",
+    1000078003: "VK_STRUCTURE_TYPE_SEMAPHORE_GET_WIN32_HANDLE_INFO_KHR",
+    1000079000: "VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_FD_INFO_KHR",
+    1000079001: "VK_STRUCTURE_TYPE_SEMAPHORE_GET_FD_INFO_KHR",
+    1000080000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR",
+    1000081000: "VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT",
+    1000081001: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT",
+    1000081002: "VK_STRUCTURE_TYPE_CONDITIONAL_RENDERING_BEGIN_INFO_EXT",
+    1000084000: "VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR",
+    1000087000: "VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV",
+    1000090000: "VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_EXT",
+    1000091000: "VK_STRUCTURE_TYPE_DISPLAY_POWER_INFO_EXT",
+    1000091001: "VK_STRUCTURE_TYPE_DEVICE_EVENT_INFO_EXT",
+    1000091002: "VK_STRUCTURE_TYPE_DISPLAY_EVENT_INFO_EXT",
+    1000091003: "VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT",
+    1000092000: "VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE",
+    1000097000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX",
+    1000098000: "VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV",
+    1000099000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT",
+    1000099001: "VK_STRUCTURE_TYPE_PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT",
+    1000101000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT",
+    1000101001: "VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT",
+    1000102000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT",
+    1000102001: "VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT",
+    1000105000: "VK_STRUCTURE_TYPE_HDR_METADATA_EXT",
+    1000111000: "VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR",
+    1000114000: "VK_STRUCTURE_TYPE_IMPORT_FENCE_WIN32_HANDLE_INFO_KHR",
+    1000114001: "VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR",
+    1000114002: "VK_STRUCTURE_TYPE_FENCE_GET_WIN32_HANDLE_INFO_KHR",
+    1000115000: "VK_STRUCTURE_TYPE_IMPORT_FENCE_FD_INFO_KHR",
+    1000115001: "VK_STRUCTURE_TYPE_FENCE_GET_FD_INFO_KHR",
+    1000116000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR",
+    1000116001: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR",
+    1000116002: "VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR",
+    1000116003: "VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR",
+    1000116004: "VK_STRUCTURE_TYPE_ACQUIRE_PROFILING_LOCK_INFO_KHR",
+    1000116005: "VK_STRUCTURE_TYPE_PERFORMANCE_COUNTER_KHR",
+    1000116006: "VK_STRUCTURE_TYPE_PERFORMANCE_COUNTER_DESCRIPTION_KHR",
+    1000119000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SURFACE_INFO_2_KHR",
+    1000119001: "VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_KHR",
+    1000119002: "VK_STRUCTURE_TYPE_SURFACE_FORMAT_2_KHR",
+    1000121000: "VK_STRUCTURE_TYPE_DISPLAY_PROPERTIES_2_KHR",
+    1000121001: "VK_STRUCTURE_TYPE_DISPLAY_PLANE_PROPERTIES_2_KHR",
+    1000121002: "VK_STRUCTURE_TYPE_DISPLAY_MODE_PROPERTIES_2_KHR",
+    1000121003: "VK_STRUCTURE_TYPE_DISPLAY_PLANE_INFO_2_KHR",
+    1000121004: "VK_STRUCTURE_TYPE_DISPLAY_PLANE_CAPABILITIES_2_KHR",
+    1000122000: "VK_STRUCTURE_TYPE_IOS_SURFACE_CREATE_INFO_MVK",
+    1000123000: "VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK",
+    1000128000: "VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT",
+    1000128001: "VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_TAG_INFO_EXT",
+    1000128002: "VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT",
+    1000128003: "VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXT",
+    1000128004: "VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT",
+    1000129000: "VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID",
+    1000129001: "VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_PROPERTIES_ANDROID",
+    1000129002: "VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID",
+    1000129003: "VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID",
+    1000129004: "VK_STRUCTURE_TYPE_MEMORY_GET_ANDROID_HARDWARE_BUFFER_INFO_ANDROID",
+    1000129005: "VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID",
+    1000129006: "VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_2_ANDROID",
+    1000138000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT",
+    1000138001: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT",
+    1000138002: "VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT",
+    1000138003: "VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO_EXT",
+    1000143000: "VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT",
+    1000143001: "VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT",
+    1000143002: "VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT",
+    1000143003: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT",
+    1000143004: "VK_STRUCTURE_TYPE_MULTISAMPLE_PROPERTIES_EXT",
+    1000148000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT",
+    1000148001: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT",
+    1000148002: "VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT",
+    1000149000: "VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV",
+    1000150007: "VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR",
+    1000150000: "VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_GEOMETRY_INFO_KHR",
+    1000150002: "VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_DEVICE_ADDRESS_INFO_KHR",
+    1000150003: "VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_AABBS_DATA_KHR",
+    1000150004: "VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_INSTANCES_DATA_KHR",
+    1000150005: "VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_TRIANGLES_DATA_KHR",
+    1000150006: "VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_KHR",
+    1000150009: "VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_VERSION_INFO_KHR",
+    1000150010: "VK_STRUCTURE_TYPE_COPY_ACCELERATION_STRUCTURE_INFO_KHR",
+    1000150011: "VK_STRUCTURE_TYPE_COPY_ACCELERATION_STRUCTURE_TO_MEMORY_INFO_KHR",
+    1000150012: "VK_STRUCTURE_TYPE_COPY_MEMORY_TO_ACCELERATION_STRUCTURE_INFO_KHR",
+    1000150013: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR",
+    1000150014: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_PROPERTIES_KHR",
+    1000150017: "VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_KHR",
+    1000150020: "VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_SIZES_INFO_KHR",
+    1000347000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR",
+    1000347001: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR",
+    1000150015: "VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_KHR",
+    1000150016: "VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR",
+    1000150018: "VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_INTERFACE_CREATE_INFO_KHR",
+    1000348013: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR",
+    1000152000: "VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV",
+    1000154000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV",
+    1000154001: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV",
+    1000158000: "VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT",
+    1000158002: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT",
+    1000158003: "VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT",
+    1000158004: "VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT",
+    1000158005: "VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT",
+    1000158006: "VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_2_EXT",
+    1000160000: "VK_STRUCTURE_TYPE_VALIDATION_CACHE_CREATE_INFO_EXT",
+    1000160001: "VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT",
+    1000163000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR",
+    1000163001: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_PROPERTIES_KHR",
+    1000164000: "VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SHADING_RATE_IMAGE_STATE_CREATE_INFO_NV",
+    1000164001: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV",
+    1000164002: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV",
+    1000164005: "VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_COARSE_SAMPLE_ORDER_STATE_CREATE_INFO_NV",
+    1000165000: "VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_NV",
+    1000165001: "VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_NV",
+    1000165003: "VK_STRUCTURE_TYPE_GEOMETRY_NV",
+    1000165004: "VK_STRUCTURE_TYPE_GEOMETRY_TRIANGLES_NV",
+    1000165005: "VK_STRUCTURE_TYPE_GEOMETRY_AABB_NV",
+    1000165006: "VK_STRUCTURE_TYPE_BIND_ACCELERATION_STRUCTURE_MEMORY_INFO_NV",
+    1000165007: "VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_NV",
+    1000165008: "VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_INFO_NV",
+    1000165009: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV",
+    1000165011: "VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_NV",
+    1000165012: "VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_NV",
+    1000166000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV",
+    1000166001: "VK_STRUCTURE_TYPE_PIPELINE_REPRESENTATIVE_FRAGMENT_TEST_STATE_CREATE_INFO_NV",
+    1000170000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT",
+    1000170001: "VK_STRUCTURE_TYPE_FILTER_CUBIC_IMAGE_VIEW_IMAGE_FORMAT_PROPERTIES_EXT",
+    1000174000: "VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT",
+    1000178000: "VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT",
+    1000178001: "VK_STRUCTURE_TYPE_MEMORY_HOST_POINTER_PROPERTIES_EXT",
+    1000178002: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT",
+    1000181000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR",
+    1000183000: "VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD",
+    1000184000: "VK_STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_EXT",
+    1000185000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD",
+    1000187000: "VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_EXT",
+    1000187001: "VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_CREATE_INFO_EXT",
+    1000187002: "VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT",
+    1000187003: "VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT",
+    1000187004: "VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_EXT",
+    1000187005: "VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_EXT",
+    1000187006: "VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_EXT",
+    1000189000: "VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD",
+    1000190000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT",
+    1000190001: "VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT",
+    1000190002: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT",
+    1000191000: "VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP",
+    1000192000: "VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO_EXT",
+    1000201000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV",
+    1000202000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV",
+    1000202001: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV",
+    1000203000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV",
+    1000204000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV",
+    1000205000: "VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_EXCLUSIVE_SCISSOR_STATE_CREATE_INFO_NV",
+    1000205002: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV",
+    1000206000: "VK_STRUCTURE_TYPE_CHECKPOINT_DATA_NV",
+    1000206001: "VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV",
+    1000209000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL",
+    1000210000: "VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL",
+    1000210001: "VK_STRUCTURE_TYPE_INITIALIZE_PERFORMANCE_API_INFO_INTEL",
+    1000210002: "VK_STRUCTURE_TYPE_PERFORMANCE_MARKER_INFO_INTEL",
+    1000210003: "VK_STRUCTURE_TYPE_PERFORMANCE_STREAM_MARKER_INFO_INTEL",
+    1000210004: "VK_STRUCTURE_TYPE_PERFORMANCE_OVERRIDE_INFO_INTEL",
+    1000210005: "VK_STRUCTURE_TYPE_PERFORMANCE_CONFIGURATION_ACQUIRE_INFO_INTEL",
+    1000212000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT",
+    1000213000: "VK_STRUCTURE_TYPE_DISPLAY_NATIVE_HDR_SURFACE_CAPABILITIES_AMD",
+    1000213001: "VK_STRUCTURE_TYPE_SWAPCHAIN_DISPLAY_NATIVE_HDR_CREATE_INFO_AMD",
+    1000214000: "VK_STRUCTURE_TYPE_IMAGEPIPE_SURFACE_CREATE_INFO_FUCHSIA",
+    1000215000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES_KHR",
+    1000217000: "VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT",
+    1000218000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT",
+    1000218001: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT",
+    1000218002: "VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT",
+    1000225000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT",
+    1000225001: "VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT",
+    1000225002: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT",
+    1000226000: "VK_STRUCTURE_TYPE_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR",
+    1000226001: "VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_STATE_CREATE_INFO_KHR",
+    1000226002: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR",
+    1000226003: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR",
+    1000226004: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_KHR",
+    1000227000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD",
+    1000229000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD",
+    1000234000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT",
+    1000237000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT",
+    1000238000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT",
+    1000238001: "VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT",
+    1000239000: "VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR",
+    1000240000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV",
+    1000244000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT",
+    1000244002: "VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT",
+    1000245000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TOOL_PROPERTIES_EXT",
+    1000247000: "VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT",
+    1000248000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR",
+    1000249000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV",
+    1000249001: "VK_STRUCTURE_TYPE_COOPERATIVE_MATRIX_PROPERTIES_NV",
+    1000249002: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV",
+    1000250000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV",
+    1000250001: "VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_REDUCTION_STATE_CREATE_INFO_NV",
+    1000250002: "VK_STRUCTURE_TYPE_FRAMEBUFFER_MIXED_SAMPLES_COMBINATION_NV",
+    1000251000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT",
+    1000252000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT",
+    1000254000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT",
+    1000254001: "VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_PROVOKING_VERTEX_STATE_CREATE_INFO_EXT",
+    1000254002: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_PROPERTIES_EXT",
+    1000255000: "VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_INFO_EXT",
+    1000255002: "VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT",
+    1000255001: "VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_WIN32_INFO_EXT",
+    1000256000: "VK_STRUCTURE_TYPE_HEADLESS_SURFACE_CREATE_INFO_EXT",
+    1000259000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT",
+    1000259001: "VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT",
+    1000259002: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT",
+    1000260000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT",
+    1000265000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT",
+    1000267000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT",
+    1000269000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR",
+    1000269001: "VK_STRUCTURE_TYPE_PIPELINE_INFO_KHR",
+    1000269002: "VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_PROPERTIES_KHR",
+    1000269003: "VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INFO_KHR",
+    1000269004: "VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_STATISTIC_KHR",
+    1000269005: "VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INTERNAL_REPRESENTATION_KHR",
+    1000273000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT",
+    1000276000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT",
+    1000277000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV",
+    1000277001: "VK_STRUCTURE_TYPE_GRAPHICS_SHADER_GROUP_CREATE_INFO_NV",
+    1000277002: "VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_SHADER_GROUPS_CREATE_INFO_NV",
+    1000277003: "VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_TOKEN_NV",
+    1000277004: "VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_CREATE_INFO_NV",
+    1000277005: "VK_STRUCTURE_TYPE_GENERATED_COMMANDS_INFO_NV",
+    1000277006: "VK_STRUCTURE_TYPE_GENERATED_COMMANDS_MEMORY_REQUIREMENTS_INFO_NV",
+    1000277007: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV",
+    1000278000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV",
+    1000278001: "VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_VIEWPORT_SCISSOR_INFO_NV",
+    1000280000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES_KHR",
+    1000280001: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES_KHR",
+    1000281000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT",
+    1000281001: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT",
+    1000282000: "VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDER_PASS_TRANSFORM_INFO_QCOM",
+    1000282001: "VK_STRUCTURE_TYPE_RENDER_PASS_TRANSFORM_BEGIN_INFO_QCOM",
+    1000284000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT",
+    1000284001: "VK_STRUCTURE_TYPE_DEVICE_DEVICE_MEMORY_REPORT_CREATE_INFO_EXT",
+    1000284002: "VK_STRUCTURE_TYPE_DEVICE_MEMORY_REPORT_CALLBACK_DATA_EXT",
+    1000286000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT",
+    1000286001: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT",
+    1000287000: "VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT",
+    1000287001: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT",
+    1000287002: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT",
+    1000290000: "VK_STRUCTURE_TYPE_PIPELINE_LIBRARY_CREATE_INFO_KHR",
+    1000294000: "VK_STRUCTURE_TYPE_PRESENT_ID_KHR",
+    1000294001: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR",
+    1000295000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT",
+    1000295001: "VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT",
+    1000295002: "VK_STRUCTURE_TYPE_PRIVATE_DATA_SLOT_CREATE_INFO_EXT",
+    1000297000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT",
+    1000299000: "VK_STRUCTURE_TYPE_VIDEO_ENCODE_INFO_KHR",
+    1000299001: "VK_STRUCTURE_TYPE_VIDEO_ENCODE_RATE_CONTROL_INFO_KHR",
+    1000300000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV",
+    1000300001: "VK_STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV",
+    1000309000: "VK_STRUCTURE_TYPE_RESERVED_QCOM",
+    1000314000: "VK_STRUCTURE_TYPE_MEMORY_BARRIER_2_KHR",
+    1000314001: "VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2_KHR",
+    1000314002: "VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2_KHR",
+    1000314003: "VK_STRUCTURE_TYPE_DEPENDENCY_INFO_KHR",
+    1000314004: "VK_STRUCTURE_TYPE_SUBMIT_INFO_2_KHR",
+    1000314005: "VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO_KHR",
+    1000314006: "VK_STRUCTURE_TYPE_COMMAND_BUFFER_SUBMIT_INFO_KHR",
+    1000314007: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES_KHR",
+    1000314008: "VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_2_NV",
+    1000314009: "VK_STRUCTURE_TYPE_CHECKPOINT_DATA_2_NV",
+    1000323000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR",
+    1000325000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES_KHR",
+    1000326000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_PROPERTIES_NV",
+    1000326001: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV",
+    1000326002: "VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_ENUM_STATE_CREATE_INFO_NV",
+    1000327000: "VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_MOTION_TRIANGLES_DATA_NV",
+    1000327001: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MOTION_BLUR_FEATURES_NV",
+    1000327002: "VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MOTION_INFO_NV",
+    1000330000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT",
+    1000332000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT",
+    1000332001: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT",
+    1000333000: "VK_STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM",
+    1000335000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT",
+    1000336000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR",
+    1000337000: "VK_STRUCTURE_TYPE_COPY_BUFFER_INFO_2_KHR",
+    1000337001: "VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR",
+    1000337002: "VK_STRUCTURE_TYPE_COPY_BUFFER_TO_IMAGE_INFO_2_KHR",
+    1000337003: "VK_STRUCTURE_TYPE_COPY_IMAGE_TO_BUFFER_INFO_2_KHR",
+    1000337004: "VK_STRUCTURE_TYPE_BLIT_IMAGE_INFO_2_KHR",
+    1000337005: "VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR",
+    1000337006: "VK_STRUCTURE_TYPE_BUFFER_COPY_2_KHR",
+    1000337007: "VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR",
+    1000337008: "VK_STRUCTURE_TYPE_IMAGE_BLIT_2_KHR",
+    1000337009: "VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2_KHR",
+    1000337010: "VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR",
+    1000340000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT",
+    1000344000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RGBA10X6_FORMATS_FEATURES_EXT",
+    1000346000: "VK_STRUCTURE_TYPE_DIRECTFB_SURFACE_CREATE_INFO_EXT",
+    1000351000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE",
+    1000351002: "VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE",
+    1000352000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT",
+    1000352001: "VK_STRUCTURE_TYPE_VERTEX_INPUT_BINDING_DESCRIPTION_2_EXT",
+    1000352002: "VK_STRUCTURE_TYPE_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION_2_EXT",
+    1000353000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRM_PROPERTIES_EXT",
+    1000356000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT",
+    1000360000: "VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR",
+    1000364000: "VK_STRUCTURE_TYPE_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA",
+    1000364001: "VK_STRUCTURE_TYPE_MEMORY_ZIRCON_HANDLE_PROPERTIES_FUCHSIA",
+    1000364002: "VK_STRUCTURE_TYPE_MEMORY_GET_ZIRCON_HANDLE_INFO_FUCHSIA",
+    1000365000: "VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_ZIRCON_HANDLE_INFO_FUCHSIA",
+    1000365001: "VK_STRUCTURE_TYPE_SEMAPHORE_GET_ZIRCON_HANDLE_INFO_FUCHSIA",
+    1000366000: "VK_STRUCTURE_TYPE_BUFFER_COLLECTION_CREATE_INFO_FUCHSIA",
+    1000366001: "VK_STRUCTURE_TYPE_IMPORT_MEMORY_BUFFER_COLLECTION_FUCHSIA",
+    1000366002: "VK_STRUCTURE_TYPE_BUFFER_COLLECTION_IMAGE_CREATE_INFO_FUCHSIA",
+    1000366003: "VK_STRUCTURE_TYPE_BUFFER_COLLECTION_PROPERTIES_FUCHSIA",
+    1000366004: "VK_STRUCTURE_TYPE_BUFFER_CONSTRAINTS_INFO_FUCHSIA",
+    1000366005: "VK_STRUCTURE_TYPE_BUFFER_COLLECTION_BUFFER_CREATE_INFO_FUCHSIA",
+    1000366006: "VK_STRUCTURE_TYPE_IMAGE_CONSTRAINTS_INFO_FUCHSIA",
+    1000366007: "VK_STRUCTURE_TYPE_IMAGE_FORMAT_CONSTRAINTS_INFO_FUCHSIA",
+    1000366008: "VK_STRUCTURE_TYPE_SYSMEM_COLOR_SPACE_FUCHSIA",
+    1000366009: "VK_STRUCTURE_TYPE_BUFFER_COLLECTION_CONSTRAINTS_INFO_FUCHSIA",
+    1000369000: "VK_STRUCTURE_TYPE_SUBPASS_SHADING_PIPELINE_CREATE_INFO_HUAWEI",
+    1000369001: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_FEATURES_HUAWEI",
+    1000369002: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_SHADING_PROPERTIES_HUAWEI",
+    1000370000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI",
+    1000371000: "VK_STRUCTURE_TYPE_MEMORY_GET_REMOTE_ADDRESS_INFO_NV",
+    1000371001: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_RDMA_FEATURES_NV",
+    1000377000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT",
+    1000378000: "VK_STRUCTURE_TYPE_SCREEN_SURFACE_CREATE_INFO_QNX",
+    1000381000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT",
+    1000381001: "VK_STRUCTURE_TYPE_PIPELINE_COLOR_WRITE_CREATE_INFO_EXT",
+    1000388000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_EXT",
+    1000388001: "VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_EXT",
+    1000392000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT",
+    1000392001: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT",
+    1000411000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BORDER_COLOR_SWIZZLE_FEATURES_EXT",
+    1000411001: "VK_STRUCTURE_TYPE_SAMPLER_BORDER_COLOR_COMPONENT_MAPPING_CREATE_INFO_EXT",
+    1000412000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PAGEABLE_DEVICE_LOCAL_MEMORY_FEATURES_EXT",
+    1000413000: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES_KHR",
+    1000413001: "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_PROPERTIES_KHR",
+    1000413002: "VK_STRUCTURE_TYPE_DEVICE_BUFFER_MEMORY_REQUIREMENTS_KHR",
+    1000413003: "VK_STRUCTURE_TYPE_DEVICE_IMAGE_MEMORY_REQUIREMENTS_KHR",
+    1000385000: "VK_STRUCTURE_TYPE_IMPORT_COLOR_BUFFER_GOOGLE",
+    1000385001: "VK_STRUCTURE_TYPE_IMPORT_PHYSICAL_ADDRESS_GOOGLE",
+    1000385002: "VK_STRUCTURE_TYPE_IMPORT_BUFFER_HANDLE_GOOGLE",
+}
+
+VkSubpassContents = {
+    0: "VK_SUBPASS_CONTENTS_INLINE",
+    1: "VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS",
+}
+
+VkVertexInputRate = {
+    0: "VK_VERTEX_INPUT_RATE_VERTEX",
+    1: "VK_VERTEX_INPUT_RATE_INSTANCE",
+}
+