vk.xml是vulkan封装库生成的依据,但是很多c#库都把Enum的field生成错了。主要问题出在Extension。

Extension是vulkan修改之后增加的字段或定义。首先是,它有可能会重复定义,因此要检查是否重复。

第二,关于ExtNumber,表示Enum的值的时候,局部会覆盖全局。如这个例子:

<extension name="VK_EXT_debug_report" number="12" type="instance" author="GOOGLE" contact="Courtney Goeltzenleuchter @courtney-g" supported="vulkan" deprecatedby="VK_EXT_debug_utils">
<require>
<enum value="9" name="VK_EXT_DEBUG_REPORT_SPEC_VERSION"/>
<enum value="&quot;VK_EXT_debug_report&quot;" name="VK_EXT_DEBUG_REPORT_EXTENSION_NAME"/>
<enum offset="0" extends="VkStructureType" name="VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT"/>
<enum alias="VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT" extends="VkStructureType" name="VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT" comment="Backwards-compatible alias containing a typo"/>
<enum offset="1" extends="VkResult" dir="-" name="VK_ERROR_VALIDATION_FAILED_EXT"/>
<enum offset="0" extends="VkObjectType" name="VK_OBJECT_TYPE_DEBUG_REPORT_CALLBACK_EXT" comment="VkDebugReportCallbackEXT"/>
<type name="VkDebugReportObjectTypeEXT"/>
<type name="VkDebugReportCallbackCreateInfoEXT"/>
<command name="vkCreateDebugReportCallbackEXT"/>
<command name="vkDestroyDebugReportCallbackEXT"/>
<command name="vkDebugReportMessageEXT"/>
</require>
<require feature="VK_VERSION_1_1">
<comment>This duplicates definitions in other extensions, below</comment>
<enum extends="VkDebugReportObjectTypeEXT" extnumber="157" offset="0" name="VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION_EXT"/>
<enum extends="VkDebugReportObjectTypeEXT" extnumber="86" offset="0" name="VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_EXT"/>
</require>
</extension>

如果<enum extends="xxx">出现后,定义了extnumber,则enum field的值是extnumber,如果未定义,则enum的值是包含它的<extension name=“xxx" number="yyy”>里面的number。

enum field的求值规则: enum field的value等于 10_0000_0000+extnumber*1000+offset