12f18b292ff155af7df35930474857b507dbf18feTony Barbour#!/usr/bin/env python3
22f18b292ff155af7df35930474857b507dbf18feTony Barbour#
32f18b292ff155af7df35930474857b507dbf18feTony Barbour# Copyright (C) 2016 Google, Inc.
42f18b292ff155af7df35930474857b507dbf18feTony Barbour#
52f18b292ff155af7df35930474857b507dbf18feTony Barbour# Permission is hereby granted, free of charge, to any person obtaining a
62f18b292ff155af7df35930474857b507dbf18feTony Barbour# copy of this software and associated documentation files (the "Software"),
72f18b292ff155af7df35930474857b507dbf18feTony Barbour# to deal in the Software without restriction, including without limitation
82f18b292ff155af7df35930474857b507dbf18feTony Barbour# the rights to use, copy, modify, merge, publish, distribute, sublicense,
92f18b292ff155af7df35930474857b507dbf18feTony Barbour# and/or sell copies of the Software, and to permit persons to whom the
102f18b292ff155af7df35930474857b507dbf18feTony Barbour# Software is furnished to do so, subject to the following conditions:
112f18b292ff155af7df35930474857b507dbf18feTony Barbour#
122f18b292ff155af7df35930474857b507dbf18feTony Barbour# The above copyright notice and this permission notice shall be included
132f18b292ff155af7df35930474857b507dbf18feTony Barbour# in all copies or substantial portions of the Software.
142f18b292ff155af7df35930474857b507dbf18feTony Barbour#
152f18b292ff155af7df35930474857b507dbf18feTony Barbour# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
162f18b292ff155af7df35930474857b507dbf18feTony Barbour# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
172f18b292ff155af7df35930474857b507dbf18feTony Barbour# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
182f18b292ff155af7df35930474857b507dbf18feTony Barbour# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
192f18b292ff155af7df35930474857b507dbf18feTony Barbour# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
202f18b292ff155af7df35930474857b507dbf18feTony Barbour# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
212f18b292ff155af7df35930474857b507dbf18feTony Barbour# DEALINGS IN THE SOFTWARE.
222f18b292ff155af7df35930474857b507dbf18feTony Barbour
232f18b292ff155af7df35930474857b507dbf18feTony Barbour"""Generate Vulkan dispatch table.
242f18b292ff155af7df35930474857b507dbf18feTony Barbour"""
252f18b292ff155af7df35930474857b507dbf18feTony Barbour
262f18b292ff155af7df35930474857b507dbf18feTony Barbourimport os
272f18b292ff155af7df35930474857b507dbf18feTony Barbourimport sys
282f18b292ff155af7df35930474857b507dbf18feTony Barbour
292f18b292ff155af7df35930474857b507dbf18feTony Barbourclass Command(object):
302f18b292ff155af7df35930474857b507dbf18feTony Barbour    PLATFORM = 0
312f18b292ff155af7df35930474857b507dbf18feTony Barbour    LOADER = 1
322f18b292ff155af7df35930474857b507dbf18feTony Barbour    INSTANCE = 2
332f18b292ff155af7df35930474857b507dbf18feTony Barbour    DEVICE = 3
342f18b292ff155af7df35930474857b507dbf18feTony Barbour
352f18b292ff155af7df35930474857b507dbf18feTony Barbour    def __init__(self, name, dispatch):
362f18b292ff155af7df35930474857b507dbf18feTony Barbour        self.name = name
372f18b292ff155af7df35930474857b507dbf18feTony Barbour        self.dispatch = dispatch
382f18b292ff155af7df35930474857b507dbf18feTony Barbour        self.ty = self._get_type()
392f18b292ff155af7df35930474857b507dbf18feTony Barbour
402f18b292ff155af7df35930474857b507dbf18feTony Barbour    @staticmethod
412f18b292ff155af7df35930474857b507dbf18feTony Barbour    def valid_c_typedef(c):
422f18b292ff155af7df35930474857b507dbf18feTony Barbour        return (c.startswith("typedef") and
432f18b292ff155af7df35930474857b507dbf18feTony Barbour                c.endswith(");") and
442f18b292ff155af7df35930474857b507dbf18feTony Barbour                "*PFN_vkVoidFunction" not in c)
452f18b292ff155af7df35930474857b507dbf18feTony Barbour
462f18b292ff155af7df35930474857b507dbf18feTony Barbour    @classmethod
472f18b292ff155af7df35930474857b507dbf18feTony Barbour    def from_c_typedef(cls, c):
482f18b292ff155af7df35930474857b507dbf18feTony Barbour        name_begin = c.find("*PFN_vk") + 7
492f18b292ff155af7df35930474857b507dbf18feTony Barbour        name_end = c.find(")(", name_begin)
502f18b292ff155af7df35930474857b507dbf18feTony Barbour        name = c[name_begin:name_end]
512f18b292ff155af7df35930474857b507dbf18feTony Barbour
522f18b292ff155af7df35930474857b507dbf18feTony Barbour        dispatch_begin = name_end + 2
532f18b292ff155af7df35930474857b507dbf18feTony Barbour        dispatch_end = c.find(" ", dispatch_begin)
542f18b292ff155af7df35930474857b507dbf18feTony Barbour        dispatch = c[dispatch_begin:dispatch_end]
552f18b292ff155af7df35930474857b507dbf18feTony Barbour        if not dispatch.startswith("Vk"):
562f18b292ff155af7df35930474857b507dbf18feTony Barbour            dispatch = None
572f18b292ff155af7df35930474857b507dbf18feTony Barbour
582f18b292ff155af7df35930474857b507dbf18feTony Barbour        return cls(name, dispatch)
592f18b292ff155af7df35930474857b507dbf18feTony Barbour
602f18b292ff155af7df35930474857b507dbf18feTony Barbour    def _get_type(self):
612f18b292ff155af7df35930474857b507dbf18feTony Barbour        if self.dispatch:
622f18b292ff155af7df35930474857b507dbf18feTony Barbour            if self.dispatch in ["VkDevice", "VkQueue", "VkCommandBuffer"]:
632f18b292ff155af7df35930474857b507dbf18feTony Barbour                return self.DEVICE
642f18b292ff155af7df35930474857b507dbf18feTony Barbour            else:
652f18b292ff155af7df35930474857b507dbf18feTony Barbour                return self.INSTANCE
662f18b292ff155af7df35930474857b507dbf18feTony Barbour        else:
672f18b292ff155af7df35930474857b507dbf18feTony Barbour            if self.name in ["GetInstanceProcAddr"]:
682f18b292ff155af7df35930474857b507dbf18feTony Barbour                return self.PLATFORM
692f18b292ff155af7df35930474857b507dbf18feTony Barbour            else:
702f18b292ff155af7df35930474857b507dbf18feTony Barbour                return self.LOADER
712f18b292ff155af7df35930474857b507dbf18feTony Barbour
722f18b292ff155af7df35930474857b507dbf18feTony Barbour    def __repr__(self):
732f18b292ff155af7df35930474857b507dbf18feTony Barbour        return "Command(name=%s, dispatch=%s)" % \
742f18b292ff155af7df35930474857b507dbf18feTony Barbour                (repr(self.name), repr(self.dispatch))
752f18b292ff155af7df35930474857b507dbf18feTony Barbour
762f18b292ff155af7df35930474857b507dbf18feTony Barbourclass Extension(object):
772f18b292ff155af7df35930474857b507dbf18feTony Barbour    def __init__(self, name, version, guard=None, commands=[]):
782f18b292ff155af7df35930474857b507dbf18feTony Barbour        self.name = name
792f18b292ff155af7df35930474857b507dbf18feTony Barbour        self.version = version
802f18b292ff155af7df35930474857b507dbf18feTony Barbour        self.guard = guard
812f18b292ff155af7df35930474857b507dbf18feTony Barbour        self.commands = commands[:]
822f18b292ff155af7df35930474857b507dbf18feTony Barbour
832f18b292ff155af7df35930474857b507dbf18feTony Barbour    def add_command(self, cmd):
842f18b292ff155af7df35930474857b507dbf18feTony Barbour        self.commands.append(cmd)
852f18b292ff155af7df35930474857b507dbf18feTony Barbour
862f18b292ff155af7df35930474857b507dbf18feTony Barbour    def __repr__(self):
872f18b292ff155af7df35930474857b507dbf18feTony Barbour        lines = []
882f18b292ff155af7df35930474857b507dbf18feTony Barbour        lines.append("Extension(name=%s, version=%s, guard=%s, commands=[" %
892f18b292ff155af7df35930474857b507dbf18feTony Barbour                (repr(self.name), repr(self.version), repr(self.guard)))
902f18b292ff155af7df35930474857b507dbf18feTony Barbour
912f18b292ff155af7df35930474857b507dbf18feTony Barbour        for cmd in self.commands:
922f18b292ff155af7df35930474857b507dbf18feTony Barbour            lines.append("    %s," % repr(cmd))
932f18b292ff155af7df35930474857b507dbf18feTony Barbour
942f18b292ff155af7df35930474857b507dbf18feTony Barbour        lines.append("])")
952f18b292ff155af7df35930474857b507dbf18feTony Barbour
962f18b292ff155af7df35930474857b507dbf18feTony Barbour        return "\n".join(lines)
972f18b292ff155af7df35930474857b507dbf18feTony Barbour
982f18b292ff155af7df35930474857b507dbf18feTony Barbour# generated by "generate-dispatch-table parse vulkan.h"
992f18b292ff155af7df35930474857b507dbf18feTony Barbourvk_core = Extension(name='VK_core', version=0, guard=None, commands=[
1002f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CreateInstance', dispatch=None),
1012f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='DestroyInstance', dispatch='VkInstance'),
1022f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='EnumeratePhysicalDevices', dispatch='VkInstance'),
1032f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='GetPhysicalDeviceFeatures', dispatch='VkPhysicalDevice'),
1042f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='GetPhysicalDeviceFormatProperties', dispatch='VkPhysicalDevice'),
1052f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='GetPhysicalDeviceImageFormatProperties', dispatch='VkPhysicalDevice'),
1062f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='GetPhysicalDeviceProperties', dispatch='VkPhysicalDevice'),
1072f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='GetPhysicalDeviceQueueFamilyProperties', dispatch='VkPhysicalDevice'),
1082f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='GetPhysicalDeviceMemoryProperties', dispatch='VkPhysicalDevice'),
1092f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='GetInstanceProcAddr', dispatch='VkInstance'),
1102f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='GetDeviceProcAddr', dispatch='VkDevice'),
1112f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CreateDevice', dispatch='VkPhysicalDevice'),
1122f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='DestroyDevice', dispatch='VkDevice'),
1132f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='EnumerateInstanceExtensionProperties', dispatch=None),
1142f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='EnumerateDeviceExtensionProperties', dispatch='VkPhysicalDevice'),
1152f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='EnumerateInstanceLayerProperties', dispatch=None),
1162f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='EnumerateDeviceLayerProperties', dispatch='VkPhysicalDevice'),
1172f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='GetDeviceQueue', dispatch='VkDevice'),
1182f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='QueueSubmit', dispatch='VkQueue'),
1192f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='QueueWaitIdle', dispatch='VkQueue'),
1202f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='DeviceWaitIdle', dispatch='VkDevice'),
1212f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='AllocateMemory', dispatch='VkDevice'),
1222f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='FreeMemory', dispatch='VkDevice'),
1232f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='MapMemory', dispatch='VkDevice'),
1242f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='UnmapMemory', dispatch='VkDevice'),
1252f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='FlushMappedMemoryRanges', dispatch='VkDevice'),
1262f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='InvalidateMappedMemoryRanges', dispatch='VkDevice'),
1272f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='GetDeviceMemoryCommitment', dispatch='VkDevice'),
1282f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='BindBufferMemory', dispatch='VkDevice'),
1292f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='BindImageMemory', dispatch='VkDevice'),
1302f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='GetBufferMemoryRequirements', dispatch='VkDevice'),
1312f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='GetImageMemoryRequirements', dispatch='VkDevice'),
1322f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='GetImageSparseMemoryRequirements', dispatch='VkDevice'),
1332f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='GetPhysicalDeviceSparseImageFormatProperties', dispatch='VkPhysicalDevice'),
1342f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='QueueBindSparse', dispatch='VkQueue'),
1352f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CreateFence', dispatch='VkDevice'),
1362f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='DestroyFence', dispatch='VkDevice'),
1372f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='ResetFences', dispatch='VkDevice'),
1382f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='GetFenceStatus', dispatch='VkDevice'),
1392f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='WaitForFences', dispatch='VkDevice'),
1402f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CreateSemaphore', dispatch='VkDevice'),
1412f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='DestroySemaphore', dispatch='VkDevice'),
1422f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CreateEvent', dispatch='VkDevice'),
1432f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='DestroyEvent', dispatch='VkDevice'),
1442f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='GetEventStatus', dispatch='VkDevice'),
1452f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='SetEvent', dispatch='VkDevice'),
1462f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='ResetEvent', dispatch='VkDevice'),
1472f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CreateQueryPool', dispatch='VkDevice'),
1482f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='DestroyQueryPool', dispatch='VkDevice'),
1492f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='GetQueryPoolResults', dispatch='VkDevice'),
1502f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CreateBuffer', dispatch='VkDevice'),
1512f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='DestroyBuffer', dispatch='VkDevice'),
1522f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CreateBufferView', dispatch='VkDevice'),
1532f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='DestroyBufferView', dispatch='VkDevice'),
1542f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CreateImage', dispatch='VkDevice'),
1552f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='DestroyImage', dispatch='VkDevice'),
1562f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='GetImageSubresourceLayout', dispatch='VkDevice'),
1572f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CreateImageView', dispatch='VkDevice'),
1582f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='DestroyImageView', dispatch='VkDevice'),
1592f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CreateShaderModule', dispatch='VkDevice'),
1602f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='DestroyShaderModule', dispatch='VkDevice'),
1612f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CreatePipelineCache', dispatch='VkDevice'),
1622f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='DestroyPipelineCache', dispatch='VkDevice'),
1632f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='GetPipelineCacheData', dispatch='VkDevice'),
1642f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='MergePipelineCaches', dispatch='VkDevice'),
1652f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CreateGraphicsPipelines', dispatch='VkDevice'),
1662f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CreateComputePipelines', dispatch='VkDevice'),
1672f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='DestroyPipeline', dispatch='VkDevice'),
1682f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CreatePipelineLayout', dispatch='VkDevice'),
1692f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='DestroyPipelineLayout', dispatch='VkDevice'),
1702f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CreateSampler', dispatch='VkDevice'),
1712f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='DestroySampler', dispatch='VkDevice'),
1722f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CreateDescriptorSetLayout', dispatch='VkDevice'),
1732f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='DestroyDescriptorSetLayout', dispatch='VkDevice'),
1742f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CreateDescriptorPool', dispatch='VkDevice'),
1752f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='DestroyDescriptorPool', dispatch='VkDevice'),
1762f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='ResetDescriptorPool', dispatch='VkDevice'),
1772f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='AllocateDescriptorSets', dispatch='VkDevice'),
1782f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='FreeDescriptorSets', dispatch='VkDevice'),
1792f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='UpdateDescriptorSets', dispatch='VkDevice'),
1802f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CreateFramebuffer', dispatch='VkDevice'),
1812f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='DestroyFramebuffer', dispatch='VkDevice'),
1822f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CreateRenderPass', dispatch='VkDevice'),
1832f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='DestroyRenderPass', dispatch='VkDevice'),
1842f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='GetRenderAreaGranularity', dispatch='VkDevice'),
1852f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CreateCommandPool', dispatch='VkDevice'),
1862f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='DestroyCommandPool', dispatch='VkDevice'),
1872f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='ResetCommandPool', dispatch='VkDevice'),
1882f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='AllocateCommandBuffers', dispatch='VkDevice'),
1892f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='FreeCommandBuffers', dispatch='VkDevice'),
1902f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='BeginCommandBuffer', dispatch='VkCommandBuffer'),
1912f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='EndCommandBuffer', dispatch='VkCommandBuffer'),
1922f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='ResetCommandBuffer', dispatch='VkCommandBuffer'),
1932f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CmdBindPipeline', dispatch='VkCommandBuffer'),
1942f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CmdSetViewport', dispatch='VkCommandBuffer'),
1952f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CmdSetScissor', dispatch='VkCommandBuffer'),
1962f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CmdSetLineWidth', dispatch='VkCommandBuffer'),
1972f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CmdSetDepthBias', dispatch='VkCommandBuffer'),
1982f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CmdSetBlendConstants', dispatch='VkCommandBuffer'),
1992f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CmdSetDepthBounds', dispatch='VkCommandBuffer'),
2002f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CmdSetStencilCompareMask', dispatch='VkCommandBuffer'),
2012f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CmdSetStencilWriteMask', dispatch='VkCommandBuffer'),
2022f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CmdSetStencilReference', dispatch='VkCommandBuffer'),
2032f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CmdBindDescriptorSets', dispatch='VkCommandBuffer'),
2042f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CmdBindIndexBuffer', dispatch='VkCommandBuffer'),
2052f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CmdBindVertexBuffers', dispatch='VkCommandBuffer'),
2062f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CmdDraw', dispatch='VkCommandBuffer'),
2072f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CmdDrawIndexed', dispatch='VkCommandBuffer'),
2082f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CmdDrawIndirect', dispatch='VkCommandBuffer'),
2092f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CmdDrawIndexedIndirect', dispatch='VkCommandBuffer'),
2102f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CmdDispatch', dispatch='VkCommandBuffer'),
2112f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CmdDispatchIndirect', dispatch='VkCommandBuffer'),
2122f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CmdCopyBuffer', dispatch='VkCommandBuffer'),
2132f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CmdCopyImage', dispatch='VkCommandBuffer'),
2142f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CmdBlitImage', dispatch='VkCommandBuffer'),
2152f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CmdCopyBufferToImage', dispatch='VkCommandBuffer'),
2162f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CmdCopyImageToBuffer', dispatch='VkCommandBuffer'),
2172f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CmdUpdateBuffer', dispatch='VkCommandBuffer'),
2182f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CmdFillBuffer', dispatch='VkCommandBuffer'),
2192f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CmdClearColorImage', dispatch='VkCommandBuffer'),
2202f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CmdClearDepthStencilImage', dispatch='VkCommandBuffer'),
2212f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CmdClearAttachments', dispatch='VkCommandBuffer'),
2222f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CmdResolveImage', dispatch='VkCommandBuffer'),
2232f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CmdSetEvent', dispatch='VkCommandBuffer'),
2242f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CmdResetEvent', dispatch='VkCommandBuffer'),
2252f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CmdWaitEvents', dispatch='VkCommandBuffer'),
2262f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CmdPipelineBarrier', dispatch='VkCommandBuffer'),
2272f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CmdBeginQuery', dispatch='VkCommandBuffer'),
2282f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CmdEndQuery', dispatch='VkCommandBuffer'),
2292f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CmdResetQueryPool', dispatch='VkCommandBuffer'),
2302f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CmdWriteTimestamp', dispatch='VkCommandBuffer'),
2312f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CmdCopyQueryPoolResults', dispatch='VkCommandBuffer'),
2322f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CmdPushConstants', dispatch='VkCommandBuffer'),
2332f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CmdBeginRenderPass', dispatch='VkCommandBuffer'),
2342f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CmdNextSubpass', dispatch='VkCommandBuffer'),
2352f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CmdEndRenderPass', dispatch='VkCommandBuffer'),
2362f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CmdExecuteCommands', dispatch='VkCommandBuffer'),
2372f18b292ff155af7df35930474857b507dbf18feTony Barbour])
2382f18b292ff155af7df35930474857b507dbf18feTony Barbour
2392f18b292ff155af7df35930474857b507dbf18feTony Barbourvk_khr_surface = Extension(name='VK_KHR_surface', version=25, guard=None, commands=[
2402f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='DestroySurfaceKHR', dispatch='VkInstance'),
2412f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='GetPhysicalDeviceSurfaceSupportKHR', dispatch='VkPhysicalDevice'),
2422f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='GetPhysicalDeviceSurfaceCapabilitiesKHR', dispatch='VkPhysicalDevice'),
2432f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='GetPhysicalDeviceSurfaceFormatsKHR', dispatch='VkPhysicalDevice'),
2442f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='GetPhysicalDeviceSurfacePresentModesKHR', dispatch='VkPhysicalDevice'),
2452f18b292ff155af7df35930474857b507dbf18feTony Barbour])
2462f18b292ff155af7df35930474857b507dbf18feTony Barbour
2472f18b292ff155af7df35930474857b507dbf18feTony Barbourvk_khr_swapchain = Extension(name='VK_KHR_swapchain', version=67, guard=None, commands=[
2482f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CreateSwapchainKHR', dispatch='VkDevice'),
2492f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='DestroySwapchainKHR', dispatch='VkDevice'),
2502f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='GetSwapchainImagesKHR', dispatch='VkDevice'),
2512f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='AcquireNextImageKHR', dispatch='VkDevice'),
2522f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='QueuePresentKHR', dispatch='VkQueue'),
2532f18b292ff155af7df35930474857b507dbf18feTony Barbour])
2542f18b292ff155af7df35930474857b507dbf18feTony Barbour
2552f18b292ff155af7df35930474857b507dbf18feTony Barbourvk_khr_display = Extension(name='VK_KHR_display', version=21, guard=None, commands=[
2562f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='GetPhysicalDeviceDisplayPropertiesKHR', dispatch='VkPhysicalDevice'),
2572f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='GetPhysicalDeviceDisplayPlanePropertiesKHR', dispatch='VkPhysicalDevice'),
2582f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='GetDisplayPlaneSupportedDisplaysKHR', dispatch='VkPhysicalDevice'),
2592f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='GetDisplayModePropertiesKHR', dispatch='VkPhysicalDevice'),
2602f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CreateDisplayModeKHR', dispatch='VkPhysicalDevice'),
2612f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='GetDisplayPlaneCapabilitiesKHR', dispatch='VkPhysicalDevice'),
2622f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CreateDisplayPlaneSurfaceKHR', dispatch='VkInstance'),
2632f18b292ff155af7df35930474857b507dbf18feTony Barbour])
2642f18b292ff155af7df35930474857b507dbf18feTony Barbour
2652f18b292ff155af7df35930474857b507dbf18feTony Barbourvk_khr_display_swapchain = Extension(name='VK_KHR_display_swapchain', version=9, guard=None, commands=[
2662f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CreateSharedSwapchainsKHR', dispatch='VkDevice'),
2672f18b292ff155af7df35930474857b507dbf18feTony Barbour])
2682f18b292ff155af7df35930474857b507dbf18feTony Barbour
2692f18b292ff155af7df35930474857b507dbf18feTony Barbourvk_khr_xlib_surface = Extension(name='VK_KHR_xlib_surface', version=6, guard='VK_USE_PLATFORM_XLIB_KHR', commands=[
2702f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CreateXlibSurfaceKHR', dispatch='VkInstance'),
2712f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='GetPhysicalDeviceXlibPresentationSupportKHR', dispatch='VkPhysicalDevice'),
2722f18b292ff155af7df35930474857b507dbf18feTony Barbour])
2732f18b292ff155af7df35930474857b507dbf18feTony Barbour
2742f18b292ff155af7df35930474857b507dbf18feTony Barbourvk_khr_xcb_surface = Extension(name='VK_KHR_xcb_surface', version=6, guard='VK_USE_PLATFORM_XCB_KHR', commands=[
2752f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CreateXcbSurfaceKHR', dispatch='VkInstance'),
2762f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='GetPhysicalDeviceXcbPresentationSupportKHR', dispatch='VkPhysicalDevice'),
2772f18b292ff155af7df35930474857b507dbf18feTony Barbour])
2782f18b292ff155af7df35930474857b507dbf18feTony Barbour
2792f18b292ff155af7df35930474857b507dbf18feTony Barbourvk_khr_wayland_surface = Extension(name='VK_KHR_wayland_surface', version=5, guard='VK_USE_PLATFORM_WAYLAND_KHR', commands=[
2802f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CreateWaylandSurfaceKHR', dispatch='VkInstance'),
2812f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='GetPhysicalDeviceWaylandPresentationSupportKHR', dispatch='VkPhysicalDevice'),
2822f18b292ff155af7df35930474857b507dbf18feTony Barbour])
2832f18b292ff155af7df35930474857b507dbf18feTony Barbour
2842f18b292ff155af7df35930474857b507dbf18feTony Barbourvk_khr_mir_surface = Extension(name='VK_KHR_mir_surface', version=4, guard='VK_USE_PLATFORM_MIR_KHR', commands=[
2852f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CreateMirSurfaceKHR', dispatch='VkInstance'),
2862f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='GetPhysicalDeviceMirPresentationSupportKHR', dispatch='VkPhysicalDevice'),
2872f18b292ff155af7df35930474857b507dbf18feTony Barbour])
2882f18b292ff155af7df35930474857b507dbf18feTony Barbour
2892f18b292ff155af7df35930474857b507dbf18feTony Barbourvk_khr_android_surface = Extension(name='VK_KHR_android_surface', version=6, guard='VK_USE_PLATFORM_ANDROID_KHR', commands=[
2902f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CreateAndroidSurfaceKHR', dispatch='VkInstance'),
2912f18b292ff155af7df35930474857b507dbf18feTony Barbour])
2922f18b292ff155af7df35930474857b507dbf18feTony Barbour
2932f18b292ff155af7df35930474857b507dbf18feTony Barbourvk_khr_win32_surface = Extension(name='VK_KHR_win32_surface', version=5, guard='VK_USE_PLATFORM_WIN32_KHR', commands=[
2942f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CreateWin32SurfaceKHR', dispatch='VkInstance'),
2952f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='GetPhysicalDeviceWin32PresentationSupportKHR', dispatch='VkPhysicalDevice'),
2962f18b292ff155af7df35930474857b507dbf18feTony Barbour])
2972f18b292ff155af7df35930474857b507dbf18feTony Barbour
2982f18b292ff155af7df35930474857b507dbf18feTony Barbourvk_ext_debug_report = Extension(name='VK_EXT_debug_report', version=1, guard=None, commands=[
2992f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='CreateDebugReportCallbackEXT', dispatch='VkInstance'),
3002f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='DestroyDebugReportCallbackEXT', dispatch='VkInstance'),
3012f18b292ff155af7df35930474857b507dbf18feTony Barbour    Command(name='DebugReportMessageEXT', dispatch='VkInstance'),
3022f18b292ff155af7df35930474857b507dbf18feTony Barbour])
3032f18b292ff155af7df35930474857b507dbf18feTony Barbour
3042f18b292ff155af7df35930474857b507dbf18feTony Barbourextensions = [
3052f18b292ff155af7df35930474857b507dbf18feTony Barbour    vk_core,
3062f18b292ff155af7df35930474857b507dbf18feTony Barbour    vk_khr_surface,
3072f18b292ff155af7df35930474857b507dbf18feTony Barbour    vk_khr_swapchain,
3082f18b292ff155af7df35930474857b507dbf18feTony Barbour    vk_khr_display,
3092f18b292ff155af7df35930474857b507dbf18feTony Barbour    vk_khr_display_swapchain,
3102f18b292ff155af7df35930474857b507dbf18feTony Barbour    vk_khr_xlib_surface,
3112f18b292ff155af7df35930474857b507dbf18feTony Barbour    vk_khr_xcb_surface,
3122f18b292ff155af7df35930474857b507dbf18feTony Barbour    vk_khr_wayland_surface,
3132f18b292ff155af7df35930474857b507dbf18feTony Barbour    vk_khr_mir_surface,
3142f18b292ff155af7df35930474857b507dbf18feTony Barbour    vk_khr_android_surface,
3152f18b292ff155af7df35930474857b507dbf18feTony Barbour    vk_khr_win32_surface,
3162f18b292ff155af7df35930474857b507dbf18feTony Barbour    vk_ext_debug_report,
3172f18b292ff155af7df35930474857b507dbf18feTony Barbour]
3182f18b292ff155af7df35930474857b507dbf18feTony Barbour
3192f18b292ff155af7df35930474857b507dbf18feTony Barbourdef generate_header(guard):
3202f18b292ff155af7df35930474857b507dbf18feTony Barbour    lines = []
3212f18b292ff155af7df35930474857b507dbf18feTony Barbour    lines.append("// This file is generated.")
3222f18b292ff155af7df35930474857b507dbf18feTony Barbour    lines.append("#ifndef %s" % guard)
3232f18b292ff155af7df35930474857b507dbf18feTony Barbour    lines.append("#define %s" % guard)
3242f18b292ff155af7df35930474857b507dbf18feTony Barbour    lines.append("")
3252f18b292ff155af7df35930474857b507dbf18feTony Barbour    lines.append("#include <vulkan/vulkan.h>")
3262f18b292ff155af7df35930474857b507dbf18feTony Barbour    lines.append("")
3272f18b292ff155af7df35930474857b507dbf18feTony Barbour    lines.append("namespace vk {")
3282f18b292ff155af7df35930474857b507dbf18feTony Barbour    lines.append("")
3292f18b292ff155af7df35930474857b507dbf18feTony Barbour
3302f18b292ff155af7df35930474857b507dbf18feTony Barbour    for ext in extensions:
3312f18b292ff155af7df35930474857b507dbf18feTony Barbour        if ext.guard:
3322f18b292ff155af7df35930474857b507dbf18feTony Barbour            lines.append("#ifdef %s" % ext.guard)
3332f18b292ff155af7df35930474857b507dbf18feTony Barbour
3342f18b292ff155af7df35930474857b507dbf18feTony Barbour        lines.append("// %s" % ext.name)
3352f18b292ff155af7df35930474857b507dbf18feTony Barbour        for cmd in ext.commands:
3362f18b292ff155af7df35930474857b507dbf18feTony Barbour            lines.append("extern PFN_vk%s %s;" % (cmd.name, cmd.name))
3372f18b292ff155af7df35930474857b507dbf18feTony Barbour
3382f18b292ff155af7df35930474857b507dbf18feTony Barbour        if ext.guard:
3392f18b292ff155af7df35930474857b507dbf18feTony Barbour            lines.append("#endif")
3402f18b292ff155af7df35930474857b507dbf18feTony Barbour        lines.append("")
3412f18b292ff155af7df35930474857b507dbf18feTony Barbour
3422f18b292ff155af7df35930474857b507dbf18feTony Barbour    lines.append("void init_dispatch_table_top(PFN_vkGetInstanceProcAddr get_instance_proc_addr);")
3432f18b292ff155af7df35930474857b507dbf18feTony Barbour    lines.append("void init_dispatch_table_middle(VkInstance instance, bool include_bottom);")
3442f18b292ff155af7df35930474857b507dbf18feTony Barbour    lines.append("void init_dispatch_table_bottom(VkInstance instance, VkDevice dev);")
3452f18b292ff155af7df35930474857b507dbf18feTony Barbour    lines.append("")
3462f18b292ff155af7df35930474857b507dbf18feTony Barbour    lines.append("} // namespace vk")
3472f18b292ff155af7df35930474857b507dbf18feTony Barbour    lines.append("")
3482f18b292ff155af7df35930474857b507dbf18feTony Barbour    lines.append("#endif // %s" % guard)
3492f18b292ff155af7df35930474857b507dbf18feTony Barbour
3502f18b292ff155af7df35930474857b507dbf18feTony Barbour    return "\n".join(lines)
3512f18b292ff155af7df35930474857b507dbf18feTony Barbour
3522f18b292ff155af7df35930474857b507dbf18feTony Barbourdef get_proc_addr(dispatchable, cmd, guard=None):
3532f18b292ff155af7df35930474857b507dbf18feTony Barbour    if dispatchable == "dev":
3542f18b292ff155af7df35930474857b507dbf18feTony Barbour        func = "GetDeviceProcAddr"
3552f18b292ff155af7df35930474857b507dbf18feTony Barbour    else:
3562f18b292ff155af7df35930474857b507dbf18feTony Barbour        func = "GetInstanceProcAddr"
3572f18b292ff155af7df35930474857b507dbf18feTony Barbour
3582f18b292ff155af7df35930474857b507dbf18feTony Barbour    c = "    %s = reinterpret_cast<PFN_vk%s>(%s(%s, \"vk%s\"));" % \
3592f18b292ff155af7df35930474857b507dbf18feTony Barbour            (cmd.name, cmd.name, func, dispatchable, cmd.name)
3602f18b292ff155af7df35930474857b507dbf18feTony Barbour
3612f18b292ff155af7df35930474857b507dbf18feTony Barbour    if guard:
3622f18b292ff155af7df35930474857b507dbf18feTony Barbour        c = ("#ifdef %s\n" % guard) + c + "\n#endif"
3632f18b292ff155af7df35930474857b507dbf18feTony Barbour
3642f18b292ff155af7df35930474857b507dbf18feTony Barbour    return c
3652f18b292ff155af7df35930474857b507dbf18feTony Barbour
3662f18b292ff155af7df35930474857b507dbf18feTony Barbourdef generate_source(header):
3672f18b292ff155af7df35930474857b507dbf18feTony Barbour    lines = []
3682f18b292ff155af7df35930474857b507dbf18feTony Barbour    lines.append("// This file is generated.")
3692f18b292ff155af7df35930474857b507dbf18feTony Barbour    lines.append("#include \"%s\"" % header)
3702f18b292ff155af7df35930474857b507dbf18feTony Barbour    lines.append("")
3712f18b292ff155af7df35930474857b507dbf18feTony Barbour    lines.append("namespace vk {")
3722f18b292ff155af7df35930474857b507dbf18feTony Barbour    lines.append("")
3732f18b292ff155af7df35930474857b507dbf18feTony Barbour
3742f18b292ff155af7df35930474857b507dbf18feTony Barbour    commands_by_types = {}
3752f18b292ff155af7df35930474857b507dbf18feTony Barbour    get_instance_proc_addr = None
3762f18b292ff155af7df35930474857b507dbf18feTony Barbour    get_device_proc_addr = None
3772f18b292ff155af7df35930474857b507dbf18feTony Barbour    for ext in extensions:
3782f18b292ff155af7df35930474857b507dbf18feTony Barbour        if ext.guard:
3792f18b292ff155af7df35930474857b507dbf18feTony Barbour            lines.append("#ifdef %s" % ext.guard)
3802f18b292ff155af7df35930474857b507dbf18feTony Barbour
3812f18b292ff155af7df35930474857b507dbf18feTony Barbour        for cmd in ext.commands:
3822f18b292ff155af7df35930474857b507dbf18feTony Barbour            lines.append("PFN_vk%s %s;" % (cmd.name, cmd.name))
3832f18b292ff155af7df35930474857b507dbf18feTony Barbour
3842f18b292ff155af7df35930474857b507dbf18feTony Barbour            if cmd.ty not in commands_by_types:
3852f18b292ff155af7df35930474857b507dbf18feTony Barbour                commands_by_types[cmd.ty] = []
3862f18b292ff155af7df35930474857b507dbf18feTony Barbour            commands_by_types[cmd.ty].append([cmd, ext.guard])
3872f18b292ff155af7df35930474857b507dbf18feTony Barbour
3882f18b292ff155af7df35930474857b507dbf18feTony Barbour            if cmd.name == "GetInstanceProcAddr":
3892f18b292ff155af7df35930474857b507dbf18feTony Barbour                get_instance_proc_addr = cmd
3902f18b292ff155af7df35930474857b507dbf18feTony Barbour            elif cmd.name == "GetDeviceProcAddr":
3912f18b292ff155af7df35930474857b507dbf18feTony Barbour                get_device_proc_addr = cmd
3922f18b292ff155af7df35930474857b507dbf18feTony Barbour
3932f18b292ff155af7df35930474857b507dbf18feTony Barbour        if ext.guard:
3942f18b292ff155af7df35930474857b507dbf18feTony Barbour            lines.append("#endif")
3952f18b292ff155af7df35930474857b507dbf18feTony Barbour    lines.append("")
3962f18b292ff155af7df35930474857b507dbf18feTony Barbour
3972f18b292ff155af7df35930474857b507dbf18feTony Barbour    lines.append("void init_dispatch_table_top(PFN_vkGetInstanceProcAddr get_instance_proc_addr)")
3982f18b292ff155af7df35930474857b507dbf18feTony Barbour    lines.append("{")
3992f18b292ff155af7df35930474857b507dbf18feTony Barbour    lines.append("    GetInstanceProcAddr = get_instance_proc_addr;")
4002f18b292ff155af7df35930474857b507dbf18feTony Barbour    lines.append("")
4012f18b292ff155af7df35930474857b507dbf18feTony Barbour    for cmd, guard in commands_by_types[Command.LOADER]:
4022f18b292ff155af7df35930474857b507dbf18feTony Barbour        lines.append(get_proc_addr("VK_NULL_HANDLE", cmd, guard))
4032f18b292ff155af7df35930474857b507dbf18feTony Barbour    lines.append("}")
4042f18b292ff155af7df35930474857b507dbf18feTony Barbour    lines.append("")
4052f18b292ff155af7df35930474857b507dbf18feTony Barbour
4062f18b292ff155af7df35930474857b507dbf18feTony Barbour    lines.append("void init_dispatch_table_middle(VkInstance instance, bool include_bottom)")
4072f18b292ff155af7df35930474857b507dbf18feTony Barbour    lines.append("{")
4082f18b292ff155af7df35930474857b507dbf18feTony Barbour    lines.append(get_proc_addr("instance", get_instance_proc_addr))
4092f18b292ff155af7df35930474857b507dbf18feTony Barbour    lines.append("")
4102f18b292ff155af7df35930474857b507dbf18feTony Barbour    for cmd, guard in commands_by_types[Command.INSTANCE]:
4112f18b292ff155af7df35930474857b507dbf18feTony Barbour        if cmd == get_instance_proc_addr:
4122f18b292ff155af7df35930474857b507dbf18feTony Barbour            continue
4132f18b292ff155af7df35930474857b507dbf18feTony Barbour        lines.append(get_proc_addr("instance", cmd, guard))
4142f18b292ff155af7df35930474857b507dbf18feTony Barbour    lines.append("")
4152f18b292ff155af7df35930474857b507dbf18feTony Barbour    lines.append("    if (!include_bottom)")
4162f18b292ff155af7df35930474857b507dbf18feTony Barbour    lines.append("        return;")
4172f18b292ff155af7df35930474857b507dbf18feTony Barbour    lines.append("")
4182f18b292ff155af7df35930474857b507dbf18feTony Barbour    for cmd, guard in commands_by_types[Command.DEVICE]:
4192f18b292ff155af7df35930474857b507dbf18feTony Barbour        lines.append(get_proc_addr("instance", cmd, guard))
4202f18b292ff155af7df35930474857b507dbf18feTony Barbour    lines.append("}")
4212f18b292ff155af7df35930474857b507dbf18feTony Barbour    lines.append("")
4222f18b292ff155af7df35930474857b507dbf18feTony Barbour
4232f18b292ff155af7df35930474857b507dbf18feTony Barbour    lines.append("void init_dispatch_table_bottom(VkInstance instance, VkDevice dev)")
4242f18b292ff155af7df35930474857b507dbf18feTony Barbour    lines.append("{")
4252f18b292ff155af7df35930474857b507dbf18feTony Barbour    lines.append(get_proc_addr("instance", get_device_proc_addr))
4262f18b292ff155af7df35930474857b507dbf18feTony Barbour    lines.append(get_proc_addr("dev", get_device_proc_addr))
4272f18b292ff155af7df35930474857b507dbf18feTony Barbour    lines.append("")
4282f18b292ff155af7df35930474857b507dbf18feTony Barbour    for cmd, guard in commands_by_types[Command.DEVICE]:
4292f18b292ff155af7df35930474857b507dbf18feTony Barbour        if cmd == get_device_proc_addr:
4302f18b292ff155af7df35930474857b507dbf18feTony Barbour            continue
4312f18b292ff155af7df35930474857b507dbf18feTony Barbour        lines.append(get_proc_addr("dev", cmd, guard))
4322f18b292ff155af7df35930474857b507dbf18feTony Barbour    lines.append("}")
4332f18b292ff155af7df35930474857b507dbf18feTony Barbour
4342f18b292ff155af7df35930474857b507dbf18feTony Barbour    lines.append("")
4352f18b292ff155af7df35930474857b507dbf18feTony Barbour    lines.append("} // namespace vk")
4362f18b292ff155af7df35930474857b507dbf18feTony Barbour
4372f18b292ff155af7df35930474857b507dbf18feTony Barbour    return "\n".join(lines)
4382f18b292ff155af7df35930474857b507dbf18feTony Barbour
4392f18b292ff155af7df35930474857b507dbf18feTony Barbourdef parse_vulkan_h(filename):
4402f18b292ff155af7df35930474857b507dbf18feTony Barbour    extensions = []
4412f18b292ff155af7df35930474857b507dbf18feTony Barbour
4422f18b292ff155af7df35930474857b507dbf18feTony Barbour    with open(filename, "r") as f:
4432f18b292ff155af7df35930474857b507dbf18feTony Barbour        current_ext = None
4442f18b292ff155af7df35930474857b507dbf18feTony Barbour        ext_guard = None
4452f18b292ff155af7df35930474857b507dbf18feTony Barbour        spec_version = None
4462f18b292ff155af7df35930474857b507dbf18feTony Barbour
4472f18b292ff155af7df35930474857b507dbf18feTony Barbour        for line in f:
4482f18b292ff155af7df35930474857b507dbf18feTony Barbour            line = line.strip();
4492f18b292ff155af7df35930474857b507dbf18feTony Barbour
4502f18b292ff155af7df35930474857b507dbf18feTony Barbour            if line.startswith("#define VK_API_VERSION"):
4512f18b292ff155af7df35930474857b507dbf18feTony Barbour                minor_end = line.rfind(",")
4522f18b292ff155af7df35930474857b507dbf18feTony Barbour                minor_begin = line.rfind(",", 0, minor_end) + 1
4532f18b292ff155af7df35930474857b507dbf18feTony Barbour                spec_version = int(line[minor_begin:minor_end])
4542f18b292ff155af7df35930474857b507dbf18feTony Barbour                # add core
4552f18b292ff155af7df35930474857b507dbf18feTony Barbour                current_ext = Extension("VK_core", spec_version)
4562f18b292ff155af7df35930474857b507dbf18feTony Barbour                extensions.append(current_ext)
4572f18b292ff155af7df35930474857b507dbf18feTony Barbour            elif Command.valid_c_typedef(line):
4582f18b292ff155af7df35930474857b507dbf18feTony Barbour                current_ext.add_command(Command.from_c_typedef(line))
4592f18b292ff155af7df35930474857b507dbf18feTony Barbour            elif line.startswith("#ifdef VK_USE_PLATFORM"):
4602f18b292ff155af7df35930474857b507dbf18feTony Barbour                guard_begin = line.find(" ") + 1
4612f18b292ff155af7df35930474857b507dbf18feTony Barbour                ext_guard = line[guard_begin:]
4622f18b292ff155af7df35930474857b507dbf18feTony Barbour            elif line.startswith("#define") and "SPEC_VERSION " in line:
4632f18b292ff155af7df35930474857b507dbf18feTony Barbour                version_begin = line.rfind(" ") + 1
4642f18b292ff155af7df35930474857b507dbf18feTony Barbour                spec_version = int(line[version_begin:])
4652f18b292ff155af7df35930474857b507dbf18feTony Barbour            elif line.startswith("#define") and "EXTENSION_NAME " in line:
4662f18b292ff155af7df35930474857b507dbf18feTony Barbour                name_end = line.rfind("\"")
4672f18b292ff155af7df35930474857b507dbf18feTony Barbour                name_begin = line.rfind("\"", 0, name_end) + 1
4682f18b292ff155af7df35930474857b507dbf18feTony Barbour                name = line[name_begin:name_end]
4692f18b292ff155af7df35930474857b507dbf18feTony Barbour                # add extension
4702f18b292ff155af7df35930474857b507dbf18feTony Barbour                current_ext = Extension(name, spec_version, ext_guard)
4712f18b292ff155af7df35930474857b507dbf18feTony Barbour                extensions.append(current_ext)
4722f18b292ff155af7df35930474857b507dbf18feTony Barbour            elif ext_guard and line.startswith("#endif") and ext_guard in line:
4732f18b292ff155af7df35930474857b507dbf18feTony Barbour                ext_guard = None
4742f18b292ff155af7df35930474857b507dbf18feTony Barbour
4752f18b292ff155af7df35930474857b507dbf18feTony Barbour    for ext in extensions:
4762f18b292ff155af7df35930474857b507dbf18feTony Barbour        print("%s = %s" % (ext.name.lower(), repr(ext)))
4772f18b292ff155af7df35930474857b507dbf18feTony Barbour        print("")
4782f18b292ff155af7df35930474857b507dbf18feTony Barbour
4792f18b292ff155af7df35930474857b507dbf18feTony Barbour    print("extensions = [")
4802f18b292ff155af7df35930474857b507dbf18feTony Barbour    for ext in extensions:
4812f18b292ff155af7df35930474857b507dbf18feTony Barbour        print("    %s," % ext.name.lower())
4822f18b292ff155af7df35930474857b507dbf18feTony Barbour    print("]")
4832f18b292ff155af7df35930474857b507dbf18feTony Barbour
4842f18b292ff155af7df35930474857b507dbf18feTony Barbourif __name__ == "__main__":
4852f18b292ff155af7df35930474857b507dbf18feTony Barbour    if sys.argv[1] == "parse":
4862f18b292ff155af7df35930474857b507dbf18feTony Barbour        parse_vulkan_h(sys.argv[2])
4872f18b292ff155af7df35930474857b507dbf18feTony Barbour    else:
4882f18b292ff155af7df35930474857b507dbf18feTony Barbour        filename = sys.argv[1]
4892f18b292ff155af7df35930474857b507dbf18feTony Barbour        base = os.path.basename(filename)
4902f18b292ff155af7df35930474857b507dbf18feTony Barbour        contents = []
4912f18b292ff155af7df35930474857b507dbf18feTony Barbour
4922f18b292ff155af7df35930474857b507dbf18feTony Barbour        if base.endswith(".h"):
4932f18b292ff155af7df35930474857b507dbf18feTony Barbour            contents = generate_header(base.replace(".", "_").upper())
4942f18b292ff155af7df35930474857b507dbf18feTony Barbour        elif base.endswith(".cpp"):
4952f18b292ff155af7df35930474857b507dbf18feTony Barbour            contents = generate_source(base.replace(".cpp", ".h"))
4962f18b292ff155af7df35930474857b507dbf18feTony Barbour
4972f18b292ff155af7df35930474857b507dbf18feTony Barbour        with open(filename, "w") as f:
4982f18b292ff155af7df35930474857b507dbf18feTony Barbour            print(contents, file=f)
499