123c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos# -*- coding: utf-8 -*- 223c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 3846cc3ce8e721a972ef38c44e24da49ea96110caPyry Haulos#------------------------------------------------------------------------- 4846cc3ce8e721a972ef38c44e24da49ea96110caPyry Haulos# Vulkan CTS 5846cc3ce8e721a972ef38c44e24da49ea96110caPyry Haulos# ---------- 6846cc3ce8e721a972ef38c44e24da49ea96110caPyry Haulos# 7846cc3ce8e721a972ef38c44e24da49ea96110caPyry Haulos# Copyright (c) 2015 Google Inc. 8846cc3ce8e721a972ef38c44e24da49ea96110caPyry Haulos# 9978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos# Licensed under the Apache License, Version 2.0 (the "License"); 10978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos# you may not use this file except in compliance with the License. 11978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos# You may obtain a copy of the License at 12846cc3ce8e721a972ef38c44e24da49ea96110caPyry Haulos# 13978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos# http://www.apache.org/licenses/LICENSE-2.0 14846cc3ce8e721a972ef38c44e24da49ea96110caPyry Haulos# 15978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos# Unless required by applicable law or agreed to in writing, software 16978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos# distributed under the License is distributed on an "AS IS" BASIS, 17978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos# See the License for the specific language governing permissions and 19978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos# limitations under the License. 20846cc3ce8e721a972ef38c44e24da49ea96110caPyry Haulos# 21846cc3ce8e721a972ef38c44e24da49ea96110caPyry Haulos#------------------------------------------------------------------------- 22846cc3ce8e721a972ef38c44e24da49ea96110caPyry Haulos 2323c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulosimport os 2423c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulosimport re 2523c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulosimport sys 26aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazinimport copy 27aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazinfrom itertools import chain 28aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazinfrom collections import OrderedDict 2923c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 309332afe3a4efcdaede5088cd1d14504d111cec6dPyry Haulossys.path.append(os.path.join(os.path.dirname(__file__), "..", "..", "..", "scripts")) 31846cc3ce8e721a972ef38c44e24da49ea96110caPyry Haulos 32846cc3ce8e721a972ef38c44e24da49ea96110caPyry Haulosfrom build.common import DEQP_DIR 3323c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulosfrom khr_util.format import indentLines, writeInlFile 3423c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 356c5512cd33ac75f480bd9eff89db10e2fa3dd9f7Pyry HaulosVULKAN_H = os.path.join(os.path.dirname(__file__), "src", "vulkan.h.in") 366c5512cd33ac75f480bd9eff89db10e2fa3dd9f7Pyry HaulosVULKAN_DIR = os.path.join(os.path.dirname(__file__), "..", "framework", "vulkan") 3723c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 3823c1f9fbfacc654ff2115e74466bb781a058bb9fPyry HaulosINL_HEADER = """\ 3923c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos/* WARNING: This is auto-generated file. Do not modify, since changes will 4023c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos * be lost! Modify the generating script instead. 4123c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos */\ 4223c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos""" 4323c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 4423c1f9fbfacc654ff2115e74466bb781a058bb9fPyry HaulosDEFINITIONS = [ 45f104cff20e57843aa2c88f1cd1a683d6acadd27fAlexander Galazin ("VK_API_VERSION_1_0", "deUint32"), 46aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin ("VK_API_VERSION_1_1", "deUint32"), 476cbd34be72b2b732fe4f8d60c850d52fb16f68bcPyry Haulos ("VK_MAX_PHYSICAL_DEVICE_NAME_SIZE", "size_t"), 486cbd34be72b2b732fe4f8d60c850d52fb16f68bcPyry Haulos ("VK_MAX_EXTENSION_NAME_SIZE", "size_t"), 496cbd34be72b2b732fe4f8d60c850d52fb16f68bcPyry Haulos ("VK_UUID_SIZE", "size_t"), 50aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin ("VK_LUID_SIZE", "size_t"), 516cbd34be72b2b732fe4f8d60c850d52fb16f68bcPyry Haulos ("VK_MAX_MEMORY_TYPES", "size_t"), 526cbd34be72b2b732fe4f8d60c850d52fb16f68bcPyry Haulos ("VK_MAX_MEMORY_HEAPS", "size_t"), 536cbd34be72b2b732fe4f8d60c850d52fb16f68bcPyry Haulos ("VK_MAX_DESCRIPTION_SIZE", "size_t"), 54aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin ("VK_MAX_DEVICE_GROUP_SIZE", "size_t"), 556cbd34be72b2b732fe4f8d60c850d52fb16f68bcPyry Haulos ("VK_ATTACHMENT_UNUSED", "deUint32"), 566cbd34be72b2b732fe4f8d60c850d52fb16f68bcPyry Haulos ("VK_SUBPASS_EXTERNAL", "deUint32"), 576cbd34be72b2b732fe4f8d60c850d52fb16f68bcPyry Haulos ("VK_QUEUE_FAMILY_IGNORED", "deUint32"), 58aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin ("VK_QUEUE_FAMILY_EXTERNAL", "deUint32"), 595f247ec91a80d8d55d29243d770b29222ad8103eMaciej Jesionowski ("VK_REMAINING_MIP_LEVELS", "deUint32"), 605f247ec91a80d8d55d29243d770b29222ad8103eMaciej Jesionowski ("VK_REMAINING_ARRAY_LAYERS", "deUint32"), 616cbd34be72b2b732fe4f8d60c850d52fb16f68bcPyry Haulos ("VK_WHOLE_SIZE", "vk::VkDeviceSize"), 626cbd34be72b2b732fe4f8d60c850d52fb16f68bcPyry Haulos ("VK_TRUE", "vk::VkBool32"), 636cbd34be72b2b732fe4f8d60c850d52fb16f68bcPyry Haulos ("VK_FALSE", "vk::VkBool32"), 6423c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos] 6523c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 6612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry HaulosPLATFORM_TYPES = [ 6712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos # VK_KHR_xlib_surface 68aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin (["Display","*"], ["XlibDisplayPtr"], "void*"), 69aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin (["Window"], ["XlibWindow"], "deUintptr",), 70aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin (["VisualID"], ["XlibVisualID"], "deUint32"), 7112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos 7212021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos # VK_KHR_xcb_surface 73aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin (["xcb_connection_t", "*"], ["XcbConnectionPtr"], "void*"), 74aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin (["xcb_window_t"], ["XcbWindow"], "deUintptr"), 75aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin (["xcb_visualid_t"], ["XcbVisualid"], "deUint32"), 7612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos 7712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos # VK_KHR_wayland_surface 78aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin (["struct", "wl_display","*"], ["WaylandDisplayPtr"], "void*"), 79aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin (["struct", "wl_surface", "*"], ["WaylandSurfacePtr"], "void*"), 8012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos 8112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos # VK_KHR_mir_surface 82aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin (["MirConnection", "*"], ["MirConnectionPtr"], "void*"), 83aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin (["MirSurface", "*"], ["MirSurfacePtr"], "void*"), 8412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos 8512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos # VK_KHR_android_surface 86aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin (["ANativeWindow", "*"], ["AndroidNativeWindowPtr"], "void*"), 8712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos 8812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos # VK_KHR_win32_surface 89aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin (["HINSTANCE"], ["Win32InstanceHandle"], "void*"), 90aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin (["HWND"], ["Win32WindowHandle"], "void*"), 91aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin (["HANDLE"], ["Win32Handle"], "void*"), 92aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin (["const", "SECURITY_ATTRIBUTES", "*"], ["Win32SecurityAttributesPtr"], "const void*"), 93aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin (["AHardwareBuffer", "*"], ["AndroidHardwareBufferPtr"], "void*"), 94f104cff20e57843aa2c88f1cd1a683d6acadd27fAlexander Galazin 95f104cff20e57843aa2c88f1cd1a683d6acadd27fAlexander Galazin # VK_EXT_acquire_xlib_display 96aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin (["RROutput"], ["RROutput"], "void*") 9712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos] 98aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 9912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry HaulosPLATFORM_TYPE_NAMESPACE = "pt" 100aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 1015e2d5b22247f074b52674f15d6cf64e477bac0d8Pyry HaulosTYPE_SUBSTITUTIONS = [ 1025e2d5b22247f074b52674f15d6cf64e477bac0d8Pyry Haulos ("uint8_t", "deUint8"), 1035e2d5b22247f074b52674f15d6cf64e477bac0d8Pyry Haulos ("uint16_t", "deUint16"), 1045e2d5b22247f074b52674f15d6cf64e477bac0d8Pyry Haulos ("uint32_t", "deUint32"), 1055e2d5b22247f074b52674f15d6cf64e477bac0d8Pyry Haulos ("uint64_t", "deUint64"), 1065e2d5b22247f074b52674f15d6cf64e477bac0d8Pyry Haulos ("int8_t", "deInt8"), 1075e2d5b22247f074b52674f15d6cf64e477bac0d8Pyry Haulos ("int16_t", "deInt16"), 1085e2d5b22247f074b52674f15d6cf64e477bac0d8Pyry Haulos ("int32_t", "deInt32"), 1095e2d5b22247f074b52674f15d6cf64e477bac0d8Pyry Haulos ("int64_t", "deInt64"), 1105e2d5b22247f074b52674f15d6cf64e477bac0d8Pyry Haulos ("bool32_t", "deUint32"), 1115e2d5b22247f074b52674f15d6cf64e477bac0d8Pyry Haulos ("size_t", "deUintptr"), 1125e2d5b22247f074b52674f15d6cf64e477bac0d8Pyry Haulos 1135e2d5b22247f074b52674f15d6cf64e477bac0d8Pyry Haulos # Platform-specific 1145e2d5b22247f074b52674f15d6cf64e477bac0d8Pyry Haulos ("DWORD", "deUint32"), 11508b8e2b72dd89548f9877a8ed5bba7c04c1d9732Pyry Haulos ("HANDLE*", PLATFORM_TYPE_NAMESPACE + "::" + "Win32Handle*"), 11608b8e2b72dd89548f9877a8ed5bba7c04c1d9732Pyry Haulos ("LPCWSTR", "char*"), 1175e2d5b22247f074b52674f15d6cf64e477bac0d8Pyry Haulos] 1185e2d5b22247f074b52674f15d6cf64e477bac0d8Pyry Haulos 119aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander GalazinEXTENSION_POSTFIXES = ["KHR", "EXT", "NV", "NVX", "KHX", "NN", "MVK"] 120aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander GalazinEXTENSION_POSTFIXES_STANDARD = ["KHR"] 12112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos 122aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazindef prefixName (prefix, name): 123e5cf8de067694afde10873b6fdbd7907486e5611Pyry Haulos name = re.sub(r'([a-z0-9])([A-Z])', r'\1_\2', name[2:]) 124e5cf8de067694afde10873b6fdbd7907486e5611Pyry Haulos name = re.sub(r'([a-zA-Z])([0-9])', r'\1_\2', name) 125e5cf8de067694afde10873b6fdbd7907486e5611Pyry Haulos name = name.upper() 126e5cf8de067694afde10873b6fdbd7907486e5611Pyry Haulos 127e5cf8de067694afde10873b6fdbd7907486e5611Pyry Haulos name = name.replace("YCB_CR_", "YCBCR_") 128e5cf8de067694afde10873b6fdbd7907486e5611Pyry Haulos name = name.replace("WIN_32_", "WIN32_") 129e5cf8de067694afde10873b6fdbd7907486e5611Pyry Haulos name = name.replace("16_BIT_", "16BIT_") 130e5cf8de067694afde10873b6fdbd7907486e5611Pyry Haulos name = name.replace("D_3_D_12_", "D3D12_") 131aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin name = name.replace("IOSSURFACE_", "IOS_SURFACE_") 132aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin name = name.replace("MAC_OS", "MACOS_") 133aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin name = name.replace("TEXTURE_LOD", "TEXTURE_LOD_") 134aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin name = name.replace("VIEWPORT_W", "VIEWPORT_W_") 135aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin name = name.replace("_IDPROPERTIES", "_ID_PROPERTIES") 136aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 137aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return prefix + name 138aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 139aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazinclass Version: 140aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin def __init__ (self, versionTuple): 141aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin self.major = versionTuple[0] 142aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin self.minor = versionTuple[1] 143aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin self.patch = versionTuple[2] 144aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 145aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin def getInHex (self): 146aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if self.major == 1 and self.minor == 0 and self.patch == 0: 147aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return "VK_API_VERSION_1_0" 148aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin elif self.major == 1 and self.minor == 1 and self.patch == 0: 149aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return "VK_API_VERSION_1_1" 150aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin else: 151aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin hex = (self.major << 22) | (self.minor << 12) | self.patch 152aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return '0x%Xu' % (hex) 153aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 154aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin def isStandardVersion (self): 155aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if self.patch != 0: 156aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return False 157aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if self.major != 1: 158aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return False 159aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if self.minor != 1 and self.minor != 0: 160aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return False 161aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return True 162aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 163aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin def getBestRepresentation (self): 164aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if self.isStandardVersion(): 165aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return self.getInHex() 166aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return self.getDefineName() 167aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 168aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin def getDefineName (self): 169aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return 'VERSION_%d_%d_%d' % (self.major, self.minor, self.patch) 170aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 171aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin def __hash__ (self): 172aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return (self.major << 22) | (self.minor << 12) | self.patch 173aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 174aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin def __eq__ (self, other): 175aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return self.major == other.major and self.minor == other.minor and self.patch == other.patch 176aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 177aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin def __str__ (self): 178aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return self.getBestRepresentation() 179e5cf8de067694afde10873b6fdbd7907486e5611Pyry Haulos 180e5cf8de067694afde10873b6fdbd7907486e5611Pyry Haulos 18123c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulosclass Handle: 182b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos TYPE_DISP = 0 183b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos TYPE_NONDISP = 1 18423c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 185b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos def __init__ (self, type, name): 186aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin self.type = type 187aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin self.name = name 188aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin self.alias = None 189aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin self.isAlias = False 190aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 191aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin def getHandleType (self): 192aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return prefixName("HANDLE_TYPE_", self.name) 193aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 194aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin def checkAliasValidity (self): 195aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin pass 196aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 197aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin def __repr__ (self): 198aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return '%s (%s, %s)' % (self.name, self.alias, self.isAlias) 199aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 200aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazinclass Definition: 201aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin def __init__ (self, type, name, value): 20223c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos self.type = type 20323c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos self.name = name 204aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin self.value = value 205aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin self.alias = None 206aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin self.isAlias = False 20723c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 208aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin def __repr__ (self): 209aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return '%s = %s (%s)' % (self.name, self.value, self.type) 21023c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 21123c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulosclass Enum: 21223c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos def __init__ (self, name, values): 213aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin self.name = name 214aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin self.values = values 215aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin self.alias = None 216aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin self.isAlias = False 217aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 218aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin def checkAliasValidity (self): 219aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if self.alias != None: 220aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if len(self.values) != len(self.alias.values): 221aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin raise Exception("%s has different number of flags than its alias %s." % (self.name, self.alias.name)) 222aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for index, value in enumerate(self.values): 223aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin aliasVal = self.alias.values[index] 224aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if value[1] != aliasVal[1] or not (value[0].startswith(aliasVal[0]) or aliasVal[0].startswith(value[0])): 225aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin raise Exception("Flag %s of %s has different value than %s of %s." % (self.alias.values[index], self.alias.name, value, self.name)) 226aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 227aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin def __repr__ (self): 228aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return '%s (%s) %s' % (self.name, self.alias, self.values) 22923c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 23023c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulosclass Bitfield: 23123c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos def __init__ (self, name, values): 232aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin self.name = name 233aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin self.values = values 234aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin self.alias = None 235aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin self.isAlias = False 236aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 237aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin def checkAliasValidity (self): 238aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if self.alias != None: 239aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if len(self.values) != len(self.alias.values): 240aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin raise Exception("%s has different number of flags than its alias %s." % (self.name, self.alias.name)) 241aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for index, value in enumerate(self.values): 242aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin aliasVal = self.alias.values[index] 243aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if value[1] != aliasVal[1] or not (value[0].startswith(aliasVal[0]) or aliasVal[0].startswith(value[0])): 244aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin raise Exception("Flag %s of %s has different value than %s of %s." % (self.alias.values[index], self.alias.name, value, self.name)) 245aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 246aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin def __repr__ (self): 247aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return '%s (%s)' % (self.name, self.alias) 24823c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 24923c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulosclass Variable: 250aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin def __init__ (self, type, name, arraySize): 251aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin type = type.replace('*',' *').replace('&',' &') 252aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for src, dst in TYPE_SUBSTITUTIONS: 253aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin type = type.replace(src, dst) 254aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin self.type = type.split(' ') 255aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for platformType, substitute, compat in PLATFORM_TYPES: 256aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin range = self.contains(self.type, platformType) 257aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if range != None: 258aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin self.type = self.type[:range[0]]+[PLATFORM_TYPE_NAMESPACE + '::' + substitute[0]] + substitute[1:] + self.type[range[1]:] 259aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin break 2607d1dee5794581c63c2e742f138920e7566cf765bscygan self.name = name 2617d1dee5794581c63c2e742f138920e7566cf765bscygan self.arraySize = arraySize 26223c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 263aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin def contains(self, big, small): 264aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for i in xrange(len(big)-len(small)+1): 265aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for j in xrange(len(small)): 266aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if big[i+j] != small[j]: 267aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin break 268aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin else: 269aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return i, i+len(small) 270aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return None 271aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 272aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin def getType (self): 273aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return ' '.join(self.type).replace(' *','*').replace(' &','&') 274aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 275aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin def getAsString (self, separator): 276aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return '%s%s%s%s' % (self.getType(), separator, self.name, self.arraySize) 277aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 278aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin def __repr__ (self): 279aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return '<%s> <%s> <%s>' % (self.type, self.name, self.arraySize) 280aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 281aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin def __eq__ (self, other): 282aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if len(self.type) != len(other.type): 283aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return False 284aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for index, type in enumerate(self.type): 285aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if "*" == type or "&" == type or "const" == type or "volatile" == type: 286aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if type != other.type[index]: 287aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return False 288aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin elif type != other.type[index] and \ 289aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin type not in map(lambda ext: other.type[index] + ext, EXTENSION_POSTFIXES_STANDARD) and \ 290aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin other.type[index] not in map(lambda ext: type + ext, EXTENSION_POSTFIXES_STANDARD): 291aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return False 292aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return self.arraySize == other.arraySize 293aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 294aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin def __ne__ (self, other): 295aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return not self == other 296aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 297b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulosclass CompositeType: 298b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos CLASS_STRUCT = 0 299b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos CLASS_UNION = 1 300b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos 301b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos def __init__ (self, typeClass, name, members): 302b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos self.typeClass = typeClass 30323c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos self.name = name 30423c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos self.members = members 305aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin self.alias = None 306aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin self.isAlias = False 30723c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 308b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos def getClassName (self): 309b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos names = {CompositeType.CLASS_STRUCT: 'struct', CompositeType.CLASS_UNION: 'union'} 310b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos return names[self.typeClass] 311b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos 312aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin def checkAliasValidity (self): 313aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if self.alias != None: 314aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if len(self.members) != len(self.alias.members): 315aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin raise Exception("%s has different number of members than its alias %s." % (self.name, self.alias.name)) 316aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for index, member in enumerate(self.members ): 317aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin break 318aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin #if member != self.alias.members[index]: 319aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin #raise Exception("Member %s of %s is different than core member %s in %s." % (self.alias.members[index], self.alias.name, member, self.name)) 320aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin #raise Exception("Member ",str(self.alias.members[index])," of ", str(self.alias.name)," is different than core member ", str(member)," in ", str(self.name),".") 321aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin def __repr__ (self): 322aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return '%s (%s)' % (self.name, self.alias) 323aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 32423c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulosclass Function: 325b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos TYPE_PLATFORM = 0 # Not bound to anything 326b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos TYPE_INSTANCE = 1 # Bound to VkInstance 327b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos TYPE_DEVICE = 2 # Bound to VkDevice 32823c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 32999e10f05ce9109da239bceb611bcff85fb193165Alexander Galazin def __init__ (self, name, returnType, arguments, apiVersion = None): 33023c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos self.name = name 33123c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos self.returnType = returnType 33223c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos self.arguments = arguments 333aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin self.alias = None 334aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin self.isAlias = False 33599e10f05ce9109da239bceb611bcff85fb193165Alexander Galazin self.apiVersion = apiVersion 33623c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 33723c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos def getType (self): 3382f442619367e349e42f041ca094bbdc6b9699bcaPyry Haulos # Special functions 3392f442619367e349e42f041ca094bbdc6b9699bcaPyry Haulos if self.name == "vkGetInstanceProcAddr": 34023c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos return Function.TYPE_PLATFORM 3412f442619367e349e42f041ca094bbdc6b9699bcaPyry Haulos elif self.name == "vkGetDeviceProcAddr": 342b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos return Function.TYPE_INSTANCE 3432f442619367e349e42f041ca094bbdc6b9699bcaPyry Haulos assert len(self.arguments) > 0 344aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin firstArgType = self.arguments[0].getType() 3452f442619367e349e42f041ca094bbdc6b9699bcaPyry Haulos if firstArgType in ["VkInstance", "VkPhysicalDevice"]: 3462f442619367e349e42f041ca094bbdc6b9699bcaPyry Haulos return Function.TYPE_INSTANCE 3472f442619367e349e42f041ca094bbdc6b9699bcaPyry Haulos elif firstArgType in ["VkDevice", "VkCommandBuffer", "VkQueue"]: 34823c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos return Function.TYPE_DEVICE 3492f442619367e349e42f041ca094bbdc6b9699bcaPyry Haulos else: 3502f442619367e349e42f041ca094bbdc6b9699bcaPyry Haulos return Function.TYPE_PLATFORM 35123c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 352aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin def checkAliasValidity (self): 353aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if self.alias != None: 354aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if len(self.arguments) != len(self.alias.arguments): 355aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin raise Exception("%s has different number of arguments than its alias %s." % (self.name, self.alias.name)) 356aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if self.returnType != self.alias.returnType or not (self.returnType.startswith(self.alias.returnType) or self.alias.returnType.startswith(self.returnType)): 357aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin raise Exception("%s has different return value's type than its alias %s." % (self.name, self.alias.name)) 358aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for index, argument in enumerate(self.arguments): 359aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if argument != self.alias.arguments[index]: 360aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin raise Exception("argument %s: \"%s\" of %s is different than \"%s\" of %s." % (index, self.alias.arguments[index].getAsString(' '), self.alias.name, argument.getAsString(' '), self.name)) 361aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 362aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin def __repr__ (self): 363aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return '%s (%s)' % (self.name, self.alias) 364aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 365aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazinclass Extension: 366aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin def __init__ (self, name, handles, enums, bitfields, compositeTypes, functions, definitions, additionalDefinitions, versionInCore): 367aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin self.name = name 36823c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos self.definitions = definitions 369aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin self.additionalDefs = additionalDefinitions 37023c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos self.handles = handles 37123c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos self.enums = enums 37223c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos self.bitfields = bitfields 373b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos self.compositeTypes = compositeTypes 37423c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos self.functions = functions 375aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin self.versionInCore = versionInCore 376aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 377aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin def __repr__ (self): 378aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return 'EXT:\n%s ->\nENUMS:\n%s\nCOMPOS:\n%s\nFUNCS:\n%s\nBITF:\n%s\nHAND:\n%s\nDEFS:\n%s\n' % (self.name, self.enums, self.compositeTypes, self.functions, self.bitfields, self.handles, self.definitions, self.versionInCore) 379aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 380aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazinclass API: 381aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin def __init__ (self, definitions, handles, enums, bitfields, compositeTypes, functions, extensions): 382aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin self.definitions = definitions 383aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin self.handles = handles 384aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin self.enums = enums 385aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin self.bitfields = bitfields 386aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin self.compositeTypes = compositeTypes 387aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin self.functions = functions # \note contains extension functions as well 388aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin self.extensions = extensions 38923c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 39023c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulosdef readFile (filename): 39123c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos with open(filename, 'rb') as f: 39223c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos return f.read() 39323c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 39423c1f9fbfacc654ff2115e74466bb781a058bb9fPyry HaulosIDENT_PTRN = r'[a-zA-Z_][a-zA-Z0-9_]*' 395aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander GalazinTYPE_PTRN = r'[a-zA-Z_][a-zA-Z0-9_ \t*&]*' 39623c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 39723c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulosdef fixupEnumValues (values): 39823c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos fixed = [] 39923c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos for name, value in values: 4006cbd34be72b2b732fe4f8d60c850d52fb16f68bcPyry Haulos if "_BEGIN_RANGE" in name or "_END_RANGE" in name: 40123c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos continue 40223c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos fixed.append((name, value)) 40323c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos return fixed 40423c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 40523c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulosdef getInterfaceName (function): 40623c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos assert function.name[:2] == "vk" 40723c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos return function.name[2].lower() + function.name[3:] 40823c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 40923c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulosdef getFunctionTypeName (function): 41023c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos assert function.name[:2] == "vk" 41123c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos return function.name[2:] + "Func" 41223c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 413931d1df9bc5ac16200e2e63dfce17dcbbbb35d36Pyry Haulosdef endsWith (str, postfix): 414931d1df9bc5ac16200e2e63dfce17dcbbbb35d36Pyry Haulos return str[-len(postfix):] == postfix 415931d1df9bc5ac16200e2e63dfce17dcbbbb35d36Pyry Haulos 416931d1df9bc5ac16200e2e63dfce17dcbbbb35d36Pyry Haulosdef splitNameExtPostfix (name): 4175e2d5b22247f074b52674f15d6cf64e477bac0d8Pyry Haulos knownExtPostfixes = EXTENSION_POSTFIXES 418931d1df9bc5ac16200e2e63dfce17dcbbbb35d36Pyry Haulos for postfix in knownExtPostfixes: 419931d1df9bc5ac16200e2e63dfce17dcbbbb35d36Pyry Haulos if endsWith(name, postfix): 420931d1df9bc5ac16200e2e63dfce17dcbbbb35d36Pyry Haulos return (name[:-len(postfix)], postfix) 421931d1df9bc5ac16200e2e63dfce17dcbbbb35d36Pyry Haulos return (name, "") 422931d1df9bc5ac16200e2e63dfce17dcbbbb35d36Pyry Haulos 42323c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulosdef getBitEnumNameForBitfield (bitfieldName): 424931d1df9bc5ac16200e2e63dfce17dcbbbb35d36Pyry Haulos bitfieldName, postfix = splitNameExtPostfix(bitfieldName) 42523c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos assert bitfieldName[-1] == "s" 42668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos return bitfieldName[:-1] + "Bits" + postfix 42723c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 42823c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulosdef getBitfieldNameForBitEnum (bitEnumName): 429931d1df9bc5ac16200e2e63dfce17dcbbbb35d36Pyry Haulos bitEnumName, postfix = splitNameExtPostfix(bitEnumName) 43023c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos assert bitEnumName[-4:] == "Bits" 43168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos return bitEnumName[:-4] + "s" + postfix 43223c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 43323c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulosdef parsePreprocDefinedValue (src, name): 434aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin value = parsePreprocDefinedValueOptional(src, name) 435aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if value is None: 436aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 437aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin raise Exception("No such definition: %s" % name) 438aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return value 439aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 440aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazindef parsePreprocDefinedValueOptional (src, name): 4419a3438e5e92e2f96ffb1bb5873eb165e13d9664eJarkko Pöyry definition = re.search(r'#\s*define\s+' + name + r'\s+([^\n]+)\n', src) 4429a3438e5e92e2f96ffb1bb5873eb165e13d9664eJarkko Pöyry if definition is None: 443aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return None 4448d4b5b76f1a9dc919363c341e63ccccb21dd9f6cMika Isojärvi value = definition.group(1).strip() 4458d4b5b76f1a9dc919363c341e63ccccb21dd9f6cMika Isojärvi if value == "UINT32_MAX": 4468d4b5b76f1a9dc919363c341e63ccccb21dd9f6cMika Isojärvi value = "(~0u)" 4478d4b5b76f1a9dc919363c341e63ccccb21dd9f6cMika Isojärvi return value 44823c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 44923c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulosdef parseEnum (name, src): 45023c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos keyValuePtrn = '(' + IDENT_PTRN + r')\s*=\s*([^\s,}]+)\s*[,}]' 45123c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos matches = re.findall(keyValuePtrn, src) 45223c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 45323c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos return Enum(name, fixupEnumValues(matches)) 45423c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 45523c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos# \note Parses raw enums, some are mapped to bitfields later 45623c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulosdef parseEnums (src): 45768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos matches = re.findall(r'typedef enum(\s*' + IDENT_PTRN + r')?\s*{([^}]*)}\s*(' + IDENT_PTRN + r')\s*;', src) 45823c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos enums = [] 45968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos for enumname, contents, typename in matches: 46068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos enums.append(parseEnum(typename, contents)) 46123c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos return enums 46223c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 463aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 464aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 465b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulosdef parseCompositeType (type, name, src): 466aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin typeNamePtrn = r'(' + TYPE_PTRN + r')(\s+' + IDENT_PTRN + r')((\[[^\]]+\])*)\s*;' 46723c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos matches = re.findall(typeNamePtrn, src) 468aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin members = [Variable(t.strip(), n.strip(), a.strip()) for t, n, a, _ in matches] 469b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos return CompositeType(type, name, members) 47023c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 471b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulosdef parseCompositeTypes (src): 472b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos typeMap = { 'struct': CompositeType.CLASS_STRUCT, 'union': CompositeType.CLASS_UNION } 47368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos matches = re.findall(r'typedef (struct|union)(\s*' + IDENT_PTRN + r')?\s*{([^}]*)}\s*(' + IDENT_PTRN + r')\s*;', src) 474b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos types = [] 47568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos for type, structname, contents, typename in matches: 47668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos types.append(parseCompositeType(typeMap[type], typename, contents)) 477b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos return types 47823c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 47923c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulosdef parseHandles (src): 48068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos matches = re.findall(r'VK_DEFINE(_NON_DISPATCHABLE|)_HANDLE\((' + IDENT_PTRN + r')\)[ \t]*[\n\r]', src) 48123c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos handles = [] 48268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos typeMap = {'': Handle.TYPE_DISP, '_NON_DISPATCHABLE': Handle.TYPE_NONDISP} 483b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos for type, name in matches: 484b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos handle = Handle(typeMap[type], name) 48523c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos handles.append(handle) 48623c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos return handles 48723c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 48823c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulosdef parseArgList (src): 489aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin typeNamePtrn = r'(' + TYPE_PTRN + r')(\s+' + IDENT_PTRN + r')((\[[^\]]+\])*)\s*' 49023c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos args = [] 49123c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos for rawArg in src.split(','): 49223c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos m = re.search(typeNamePtrn, rawArg) 4937d1dee5794581c63c2e742f138920e7566cf765bscygan args.append(Variable(m.group(1).strip(), m.group(2).strip(), m.group(3))) 49423c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos return args 49523c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 496aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazindef removeTypeExtPostfix (name): 497aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for extPostfix in EXTENSION_POSTFIXES_STANDARD: 498aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if endsWith(name, extPostfix): 499aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return name[0:-len(extPostfix)] 500aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return None 501aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 502aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazindef populateAliases (objects): 503aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin objectsByName = {} 504aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for object in objects: 505aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin objectsByName[object.name] = object 506aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for object in objects: 507aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin withoutPostfix = removeTypeExtPostfix(object.name) 508aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if withoutPostfix != None and withoutPostfix in objectsByName: 509aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin objectsByName[withoutPostfix].alias = object 510aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin object.isAlias = True 511aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for object in objects: 512aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin object.checkAliasValidity() 513aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 514aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazindef populateAliasesWithTypedefs (objects, src): 515aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin objectsByName = {} 516aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for object in objects: 517aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin objectsByName[object.name] = object 518aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin ptrn = r'\s*typedef\s+' + object.name + r'\s+([^;]+)' 519aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin stash = re.findall(ptrn, src) 520aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if len(stash) == 1: 521aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin objExt = copy.deepcopy(object) 522aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin objExt.name = stash[0] 523aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin object.alias = objExt 524aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin objExt.isAlias = True 525aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin objects.append(objExt) 526aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 527aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 528aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazindef removeAliasedValues (enum): 529aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin valueByName = {} 530aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for name, value in enum.values: 531aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin valueByName[name] = value 532aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 533aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin def removeDefExtPostfix (name): 534aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for extPostfix in EXTENSION_POSTFIXES: 535aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if endsWith(name, "_" + extPostfix): 536aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return name[0:-(len(extPostfix)+1)] 537aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return None 538aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 539aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin newValues = [] 540aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for name, value in enum.values: 541aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin withoutPostfix = removeDefExtPostfix(name) 542aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if withoutPostfix != None and withoutPostfix in valueByName and valueByName[withoutPostfix] == value: 543aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin continue 544aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin newValues.append((name, value)) 545aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin enum.values = newValues 546aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 54723c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulosdef parseFunctions (src): 548aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin ptrn = r'VKAPI_ATTR\s+(' + TYPE_PTRN + ')\s+VKAPI_CALL\s+(' + IDENT_PTRN + r')\s*\(([^)]*)\)\s*;' 54923c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos matches = re.findall(ptrn, src) 55023c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos functions = [] 55123c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos for returnType, name, argList in matches: 55223c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos functions.append(Function(name.strip(), returnType.strip(), parseArgList(argList))) 553aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return functions 554aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 55599e10f05ce9109da239bceb611bcff85fb193165Alexander Galazindef parseFunctionsByVersion (src): 55699e10f05ce9109da239bceb611bcff85fb193165Alexander Galazin ptrnVer10 = 'VK_VERSION_1_0 1' 55799e10f05ce9109da239bceb611bcff85fb193165Alexander Galazin ptrnVer11 = 'VK_VERSION_1_1 1' 55899e10f05ce9109da239bceb611bcff85fb193165Alexander Galazin matchVer10 = re.search(ptrnVer10, src) 55999e10f05ce9109da239bceb611bcff85fb193165Alexander Galazin matchVer11 = re.search(ptrnVer11, src) 56099e10f05ce9109da239bceb611bcff85fb193165Alexander Galazin ptrn = r'VKAPI_ATTR\s+(' + TYPE_PTRN + ')\s+VKAPI_CALL\s+(' + IDENT_PTRN + r')\s*\(([^)]*)\)\s*;' 56199e10f05ce9109da239bceb611bcff85fb193165Alexander Galazin regPtrn = re.compile(ptrn) 56299e10f05ce9109da239bceb611bcff85fb193165Alexander Galazin matches = regPtrn.findall(src, matchVer10.start(), matchVer11.start()) 56399e10f05ce9109da239bceb611bcff85fb193165Alexander Galazin functions = [] 56499e10f05ce9109da239bceb611bcff85fb193165Alexander Galazin for returnType, name, argList in matches: 56599e10f05ce9109da239bceb611bcff85fb193165Alexander Galazin functions.append(Function(name.strip(), returnType.strip(), parseArgList(argList), 'VK_VERSION_1_0')) 56699e10f05ce9109da239bceb611bcff85fb193165Alexander Galazin matches = regPtrn.findall(src, matchVer11.start()) 56799e10f05ce9109da239bceb611bcff85fb193165Alexander Galazin for returnType, name, argList in matches: 56899e10f05ce9109da239bceb611bcff85fb193165Alexander Galazin functions.append(Function(name.strip(), returnType.strip(), parseArgList(argList), 'VK_VERSION_1_1')) 56999e10f05ce9109da239bceb611bcff85fb193165Alexander Galazin return functions 57099e10f05ce9109da239bceb611bcff85fb193165Alexander Galazin 571aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazindef splitByExtension (src): 572aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin ptrn = r'#define\s+[A-Z0-9_]+_EXTENSION_NAME\s+"([^"]+)"' 573aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin match = "#define\s+(" 574aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for part in re.finditer(ptrn, src): 575aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin match += part.group(1)+"|" 576aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin match = match[:-1] + ")\s+1" 577aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin parts = re.split(match, src) 578aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin # First part is core 579aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin byExtension = [(None, parts[0])] 580aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for ndx in range(1, len(parts), 2): 581aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin byExtension.append((parts[ndx], parts[ndx+1])) 582aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return byExtension 583aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 584aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazindef parseDefinitions (extensionName, src): 585aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 586aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin def skipDefinition (extensionName, definition): 587aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if extensionName == None: 588aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return True 589aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if definition[0].startswith(extensionName.upper()): 590aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return True 591aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if definition[1].isdigit(): 592aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return True 593aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return False 594aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 595aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin ptrn = r'#define\s+([^\s]+)\s+([^\r\n]+)' 596aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin matches = re.findall(ptrn, src) 59723c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 598aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return [Definition(None, match[0], match[1]) for match in matches if not skipDefinition(extensionName, match)] 599aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 600aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazindef parseExtensions (src, allFunctions, allCompositeTypes, allEnums, allBitfields, allHandles, allDefinitions): 601aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 602aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin def getCoreVersion (extensionTuple): 603aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if not extensionTuple[0]: 604aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return None 605aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin ptrn = r'\/\/\s*' + extensionTuple[0] + r'\s+(DEVICE|INSTANCE)\s+([0-9_]+)' 606aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin coreVersion = re.search(ptrn, extensionTuple[1], re.I) 607aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if coreVersion != None: 608aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return [coreVersion.group(1)] + [int(number) for number in coreVersion.group(2).split('_')[:3]] 609aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return None 610aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 611aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin splitSrc = splitByExtension(src) 612aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin extensions = [] 613aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin functionsByName = {function.name: function for function in allFunctions} 614aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin compositeTypesByName = {compType.name: compType for compType in allCompositeTypes} 615aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin enumsByName = {enum.name: enum for enum in allEnums} 616aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin bitfieldsByName = {bitfield.name: bitfield for bitfield in allBitfields} 617aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin handlesByName = {handle.name: handle for handle in allHandles} 618aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin definitionsByName = {definition.name: definition for definition in allDefinitions} 619aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 620aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for extensionName, extensionSrc in splitSrc: 621aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin definitions = [Definition(type, name, parsePreprocDefinedValueOptional(extensionSrc, name)) for name, type in DEFINITIONS] 622aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin definitions = [definition for definition in definitions if definition.value != None] 623aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin additionalDefinitions = parseDefinitions(extensionName, extensionSrc) 624aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin handles = parseHandles(extensionSrc) 625aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin functions = parseFunctions(extensionSrc) 626aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin compositeTypes = parseCompositeTypes(extensionSrc) 627aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin rawEnums = parseEnums(extensionSrc) 628aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin bitfieldNames = parseBitfieldNames(extensionSrc) 629aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin enumBitfieldNames = [getBitEnumNameForBitfield(name) for name in bitfieldNames] 630aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin enums = [enum for enum in rawEnums if enum.name not in enumBitfieldNames] 631aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 632aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin extCoreVersion = getCoreVersion((extensionName, extensionSrc)) 633aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin extFunctions = [functionsByName[function.name] for function in functions] 634aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin extCompositeTypes = [compositeTypesByName[compositeType.name] for compositeType in compositeTypes] 635aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin extEnums = [enumsByName[enum.name] for enum in enums] 636aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin extBitfields = [bitfieldsByName[bitfieldName] for bitfieldName in bitfieldNames] 637aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin extHandles = [handlesByName[handle.name] for handle in handles] 638aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin extDefinitions = [definitionsByName[definition.name] for definition in definitions] 639aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 640aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin extensions.append(Extension(extensionName, extHandles, extEnums, extBitfields, extCompositeTypes, extFunctions, extDefinitions, additionalDefinitions, extCoreVersion)) 641aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return extensions 64223c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 64323c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulosdef parseBitfieldNames (src): 64423c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos ptrn = r'typedef\s+VkFlags\s(' + IDENT_PTRN + r')\s*;' 64523c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos matches = re.findall(ptrn, src) 64623c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 64723c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos return matches 64823c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 64923c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulosdef parseAPI (src): 650aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin definitions = [Definition(type, name, parsePreprocDefinedValue(src, name)) for name, type in DEFINITIONS] 651aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin handles = parseHandles(src) 65223c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos rawEnums = parseEnums(src) 65323c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos bitfieldNames = parseBitfieldNames(src) 65423c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos enums = [] 65523c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos bitfields = [] 656aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin bitfieldEnums = set([getBitEnumNameForBitfield(n) for n in bitfieldNames if getBitEnumNameForBitfield(n) in [enum.name for enum in rawEnums]]) 657aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin compositeTypes = parseCompositeTypes(src) 65899e10f05ce9109da239bceb611bcff85fb193165Alexander Galazin allFunctions = parseFunctionsByVersion(src) 65923c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 66023c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos for enum in rawEnums: 66123c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos if enum.name in bitfieldEnums: 66223c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos bitfields.append(Bitfield(getBitfieldNameForBitEnum(enum.name), enum.values)) 66323c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos else: 66423c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos enums.append(enum) 66523c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 66668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos for bitfieldName in bitfieldNames: 66768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos if not bitfieldName in [bitfield.name for bitfield in bitfields]: 66868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos # Add empty bitfield 66968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos bitfields.append(Bitfield(bitfieldName, [])) 67068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 671aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin # Populate alias fields 672aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin populateAliasesWithTypedefs(compositeTypes, src) 673aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin populateAliasesWithTypedefs(enums, src) 674aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin populateAliasesWithTypedefs(bitfields, src) 675aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin populateAliases(allFunctions) 676aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin populateAliases(handles) 677aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin populateAliases(enums) 678aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin populateAliases(bitfields) 679aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin populateAliases(compositeTypes) 680aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 681aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 682aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for enum in enums: 683aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin removeAliasedValues(enum) 684aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 685aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin extensions = parseExtensions(src, allFunctions, compositeTypes, enums, bitfields, handles, definitions) 686aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 68723c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos return API( 688b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos definitions = definitions, 689aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin handles = handles, 690b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos enums = enums, 691b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos bitfields = bitfields, 692aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin compositeTypes = compositeTypes, 693aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin functions = allFunctions, 694aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin extensions = extensions) 695aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 696aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazindef splitUniqueAndDuplicatedEntries (handles): 697aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin listOfUniqueHandles = [] 698aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin duplicates = OrderedDict() 699aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for handle in handles: 700aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if handle.alias != None: 701aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin duplicates[handle.alias] = handle 702aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if not handle.isAlias: 703aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin listOfUniqueHandles.append(handle) 704aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return listOfUniqueHandles, duplicates 705b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos 706b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulosdef writeHandleType (api, filename): 707aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin uniqeHandles, duplicatedHandles = splitUniqueAndDuplicatedEntries(api.handles) 708aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 709aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin def genHandles (): 710aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin yield "\t%s\t= 0," % uniqeHandles[0].getHandleType() 711aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for handle in uniqeHandles[1:]: 712aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin yield "\t%s," % handle.getHandleType() 713aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for duplicate in duplicatedHandles: 714aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin yield "\t%s\t= %s," % (duplicate.getHandleType(), duplicatedHandles[duplicate].getHandleType()) 715aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin yield "\tHANDLE_TYPE_LAST\t= %s + 1" % (uniqeHandles[-1].getHandleType()) 716aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 717aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin def genHandlesBlock (): 718b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos yield "enum HandleType" 719b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos yield "{" 720aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 721aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for line in indentLines(genHandles()): 722aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin yield line 723aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 724b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos yield "};" 725b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos yield "" 726b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos 727aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin writeInlFile(filename, INL_HEADER, genHandlesBlock()) 72823c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 7294ffa33a4e5c875244f721cd5c07be5d6346a482ePyry Haulosdef getEnumValuePrefix (enum): 7304ffa33a4e5c875244f721cd5c07be5d6346a482ePyry Haulos prefix = enum.name[0] 7314ffa33a4e5c875244f721cd5c07be5d6346a482ePyry Haulos for i in range(1, len(enum.name)): 732867246e525603a3242a91ce52cada18406bd1a05Pyry Haulos if enum.name[i].isupper() and not enum.name[i-1].isupper(): 7334ffa33a4e5c875244f721cd5c07be5d6346a482ePyry Haulos prefix += "_" 7344ffa33a4e5c875244f721cd5c07be5d6346a482ePyry Haulos prefix += enum.name[i].upper() 7354ffa33a4e5c875244f721cd5c07be5d6346a482ePyry Haulos return prefix 7364ffa33a4e5c875244f721cd5c07be5d6346a482ePyry Haulos 73768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulosdef parseInt (value): 73868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos if value[:2] == "0x": 73968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos return int(value, 16) 74068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos else: 74168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos return int(value, 10) 74268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 7434ffa33a4e5c875244f721cd5c07be5d6346a482ePyry Haulosdef areEnumValuesLinear (enum): 7444ffa33a4e5c875244f721cd5c07be5d6346a482ePyry Haulos curIndex = 0 7454ffa33a4e5c875244f721cd5c07be5d6346a482ePyry Haulos for name, value in enum.values: 74668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos if parseInt(value) != curIndex: 7474ffa33a4e5c875244f721cd5c07be5d6346a482ePyry Haulos return False 7484ffa33a4e5c875244f721cd5c07be5d6346a482ePyry Haulos curIndex += 1 7494ffa33a4e5c875244f721cd5c07be5d6346a482ePyry Haulos return True 7504ffa33a4e5c875244f721cd5c07be5d6346a482ePyry Haulos 75123c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulosdef genEnumSrc (enum): 75223c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos yield "enum %s" % enum.name 75323c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos yield "{" 7544ffa33a4e5c875244f721cd5c07be5d6346a482ePyry Haulos 75523c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos for line in indentLines(["\t%s\t= %s," % v for v in enum.values]): 75623c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos yield line 7574ffa33a4e5c875244f721cd5c07be5d6346a482ePyry Haulos 7584ffa33a4e5c875244f721cd5c07be5d6346a482ePyry Haulos if areEnumValuesLinear(enum): 7594ffa33a4e5c875244f721cd5c07be5d6346a482ePyry Haulos yield "" 7604ffa33a4e5c875244f721cd5c07be5d6346a482ePyry Haulos yield "\t%s_LAST" % getEnumValuePrefix(enum) 7614ffa33a4e5c875244f721cd5c07be5d6346a482ePyry Haulos 76223c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos yield "};" 76323c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 76423c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulosdef genBitfieldSrc (bitfield): 76568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos if len(bitfield.values) > 0: 76668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos yield "enum %s" % getBitEnumNameForBitfield(bitfield.name) 76768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos yield "{" 76868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos for line in indentLines(["\t%s\t= %s," % v for v in bitfield.values]): 76968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos yield line 77068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos yield "};" 77123c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos yield "typedef deUint32 %s;" % bitfield.name 77223c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 773b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulosdef genCompositeTypeSrc (type): 774b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos yield "%s %s" % (type.getClassName(), type.name) 77523c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos yield "{" 776aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for line in indentLines(['\t'+m.getAsString('\t')+';' for m in type.members]): 77723c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos yield line 77823c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos yield "};" 77923c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 78023c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulosdef genHandlesSrc (handles): 781aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin uniqeHandles, duplicatedHandles = splitUniqueAndDuplicatedEntries(handles) 782aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 78323c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos def genLines (handles): 784aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for handle in uniqeHandles: 785b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos if handle.type == Handle.TYPE_DISP: 786b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos yield "VK_DEFINE_HANDLE\t(%s,\t%s);" % (handle.name, handle.getHandleType()) 78723c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos elif handle.type == Handle.TYPE_NONDISP: 78868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos yield "VK_DEFINE_NON_DISPATCHABLE_HANDLE\t(%s,\t%s);" % (handle.name, handle.getHandleType()) 78923c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 790aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for duplicate in duplicatedHandles: 791aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if duplicate.type == Handle.TYPE_DISP: 792aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin yield "VK_DEFINE_HANDLE\t(%s,\t%s);" % (duplicate.name, duplicatedHandles[duplicate].getHandleType()) 793aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin elif duplicate.type == Handle.TYPE_NONDISP: 794aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin yield "VK_DEFINE_NON_DISPATCHABLE_HANDLE\t(%s,\t%s);" % (duplicate.name, duplicatedHandles[duplicate].getHandleType()) 795aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 79623c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos for line in indentLines(genLines(handles)): 79723c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos yield line 79823c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 799aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazindef genDefinitionsSrc (definitions): 800aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for line in ["#define %s\t(static_cast<%s>\t(%s))" % (definition.name, definition.type, definition.value) for definition in definitions]: 801aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin yield line 802aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 803aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazindef genDefinitionsAliasSrc (definitions): 804aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for line in ["#define %s\t%s" % (definition.name, definitions[definition].name) for definition in definitions]: 805aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if definition.value != definitions[definition].value and definition.value != definitions[definition].name: 806aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin raise Exception("Value of %s (%s) is different than core definition value %s (%s)." % (definition.name, definition.value, definitions[definition].name, definitions[definition].value)) 807aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin yield line 808aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 80923c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulosdef writeBasicTypes (api, filename): 810aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 81123c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos def gen (): 812aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin definitionsCore, definitionDuplicates = splitUniqueAndDuplicatedEntries(api.definitions) 813aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 814aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for line in indentLines(chain(genDefinitionsSrc(definitionsCore), genDefinitionsAliasSrc(definitionDuplicates))): 81523c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos yield line 81623c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos yield "" 817aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 81823c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos for line in genHandlesSrc(api.handles): 81923c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos yield line 82023c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos yield "" 821aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 82223c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos for enum in api.enums: 823aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if not enum.isAlias: 824aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for line in genEnumSrc(enum): 825aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin yield line 82623c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos yield "" 827aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 82823c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos for bitfield in api.bitfields: 829aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if not bitfield.isAlias: 830aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for line in genBitfieldSrc(bitfield): 831aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin yield line 83223c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos yield "" 833aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for line in indentLines(["VK_DEFINE_PLATFORM_TYPE(%s,\t%s);" % (s[0], c) for n, s, c in PLATFORM_TYPES]): 83412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos yield line 83523c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 836aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for ext in api.extensions: 837aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if ext.additionalDefs != None: 838aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for definition in ext.additionalDefs: 839aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin yield "#define " + definition.name + " " + definition.value 84023c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos writeInlFile(filename, INL_HEADER, gen()) 84123c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 842b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulosdef writeCompositeTypes (api, filename): 84323c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos def gen (): 844b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos for type in api.compositeTypes: 845aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin type.checkAliasValidity() 846aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 847aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if not type.isAlias: 848aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for line in genCompositeTypeSrc(type): 849aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin yield line 85023c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos yield "" 85123c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 85223c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos writeInlFile(filename, INL_HEADER, gen()) 85323c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 85423c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulosdef argListToStr (args): 855aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return ", ".join(v.getAsString(' ') for v in args) 85623c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 85723c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulosdef writeInterfaceDecl (api, filename, functionTypes, concrete): 85823c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos def genProtos (): 85923c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos postfix = "" if concrete else " = 0" 86023c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos for function in api.functions: 861aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if not function.getType() in functionTypes: 862aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin continue 86333b5a8a9652e2ad55029dccd970f0e7a39af917fAlexander Galazin if not function.isAlias: 86433b5a8a9652e2ad55029dccd970f0e7a39af917fAlexander Galazin yield "virtual %s\t%s\t(%s) const%s;" % (function.returnType, getInterfaceName(function), argListToStr(function.arguments), postfix) 86523c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 86623c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos writeInlFile(filename, INL_HEADER, indentLines(genProtos())) 86723c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 86823c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulosdef writeFunctionPtrTypes (api, filename): 86923c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos def genTypes (): 87023c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos for function in api.functions: 87168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos yield "typedef VKAPI_ATTR %s\t(VKAPI_CALL* %s)\t(%s);" % (function.returnType, getFunctionTypeName(function), argListToStr(function.arguments)) 87223c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 87323c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos writeInlFile(filename, INL_HEADER, indentLines(genTypes())) 87423c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 87523c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulosdef writeFunctionPointers (api, filename, functionTypes): 876b68af198a76622bebeb81d0ae0fe007c6527d35eMarcin Rogucki def FunctionsYielder (): 877b68af198a76622bebeb81d0ae0fe007c6527d35eMarcin Rogucki for function in api.functions: 878b68af198a76622bebeb81d0ae0fe007c6527d35eMarcin Rogucki if function.getType() in functionTypes: 879b68af198a76622bebeb81d0ae0fe007c6527d35eMarcin Rogucki if function.isAlias: 880b68af198a76622bebeb81d0ae0fe007c6527d35eMarcin Rogucki if function.getType() == Function.TYPE_INSTANCE and function.arguments[0].getType() == "VkPhysicalDevice": 881b68af198a76622bebeb81d0ae0fe007c6527d35eMarcin Rogucki yield "%s\t%s;" % (getFunctionTypeName(function), getInterfaceName(function)) 882b68af198a76622bebeb81d0ae0fe007c6527d35eMarcin Rogucki else: 883b68af198a76622bebeb81d0ae0fe007c6527d35eMarcin Rogucki yield "%s\t%s;" % (getFunctionTypeName(function), getInterfaceName(function)) 884b68af198a76622bebeb81d0ae0fe007c6527d35eMarcin Rogucki 885b68af198a76622bebeb81d0ae0fe007c6527d35eMarcin Rogucki writeInlFile(filename, INL_HEADER, indentLines(FunctionsYielder())) 88623c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 887bbd3dce44fafaa4b1952b63564022f19b3a65ca3Pyry Haulosdef writeInitFunctionPointers (api, filename, functionTypes, cond = None): 88823c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos def makeInitFunctionPointers (): 88923c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos for function in api.functions: 890b68af198a76622bebeb81d0ae0fe007c6527d35eMarcin Rogucki if function.getType() in functionTypes and (cond == None or cond(function)): 891b68af198a76622bebeb81d0ae0fe007c6527d35eMarcin Rogucki interfaceName = getInterfaceName(function) 892b68af198a76622bebeb81d0ae0fe007c6527d35eMarcin Rogucki if function.isAlias: 893b68af198a76622bebeb81d0ae0fe007c6527d35eMarcin Rogucki if function.getType() == Function.TYPE_INSTANCE and function.arguments[0].getType() == "VkPhysicalDevice": 894b68af198a76622bebeb81d0ae0fe007c6527d35eMarcin Rogucki yield "m_vk.%s\t= (%s)\tGET_PROC_ADDR(\"%s\");" % (getInterfaceName(function), getFunctionTypeName(function), function.name) 895b68af198a76622bebeb81d0ae0fe007c6527d35eMarcin Rogucki else: 896b68af198a76622bebeb81d0ae0fe007c6527d35eMarcin Rogucki yield "m_vk.%s\t= (%s)\tGET_PROC_ADDR(\"%s\");" % (getInterfaceName(function), getFunctionTypeName(function), function.name) 897b68af198a76622bebeb81d0ae0fe007c6527d35eMarcin Rogucki if function.alias != None: 898b68af198a76622bebeb81d0ae0fe007c6527d35eMarcin Rogucki yield "if (!m_vk.%s)" % (getInterfaceName(function)) 899b68af198a76622bebeb81d0ae0fe007c6527d35eMarcin Rogucki yield " m_vk.%s\t= (%s)\tGET_PROC_ADDR(\"%s\");" % (getInterfaceName(function), getFunctionTypeName(function), function.alias.name) 900aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin lines = [line.replace(' ', '\t') for line in indentLines(makeInitFunctionPointers())] 901aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin writeInlFile(filename, INL_HEADER, lines) 90223c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 90323c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulosdef writeFuncPtrInterfaceImpl (api, filename, functionTypes, className): 90423c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos def makeFuncPtrInterfaceImpl (): 90523c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos for function in api.functions: 90633b5a8a9652e2ad55029dccd970f0e7a39af917fAlexander Galazin if function.getType() in functionTypes and not function.isAlias: 90723c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos yield "" 90823c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos yield "%s %s::%s (%s) const" % (function.returnType, className, getInterfaceName(function), argListToStr(function.arguments)) 90923c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos yield "{" 910aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if function.name == "vkEnumerateInstanceVersion": 911aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin yield " if (m_vk.enumerateInstanceVersion)" 912aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin yield " return m_vk.enumerateInstanceVersion(pApiVersion);" 913aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin yield "" 914aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin yield " *pApiVersion = VK_API_VERSION_1_0;" 915aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin yield " return VK_SUCCESS;" 916b68af198a76622bebeb81d0ae0fe007c6527d35eMarcin Rogucki elif function.getType() == Function.TYPE_INSTANCE and function.arguments[0].getType() == "VkPhysicalDevice" and function.alias != None: 917b68af198a76622bebeb81d0ae0fe007c6527d35eMarcin Rogucki yield " vk::VkPhysicalDeviceProperties props;" 918b68af198a76622bebeb81d0ae0fe007c6527d35eMarcin Rogucki yield " m_vk.getPhysicalDeviceProperties(physicalDevice, &props);" 919b68af198a76622bebeb81d0ae0fe007c6527d35eMarcin Rogucki yield " if (props.apiVersion >= VK_API_VERSION_1_1)" 920b68af198a76622bebeb81d0ae0fe007c6527d35eMarcin Rogucki yield " %sm_vk.%s(%s);" % ("return " if function.returnType != "void" else "", getInterfaceName(function), ", ".join(a.name for a in function.arguments)) 921b68af198a76622bebeb81d0ae0fe007c6527d35eMarcin Rogucki yield " else" 922b68af198a76622bebeb81d0ae0fe007c6527d35eMarcin Rogucki yield " %sm_vk.%s(%s);" % ("return " if function.returnType != "void" else "", getInterfaceName(function.alias), ", ".join(a.name for a in function.arguments)) 923aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin else: 92433b5a8a9652e2ad55029dccd970f0e7a39af917fAlexander Galazin yield " %sm_vk.%s(%s);" % ("return " if function.returnType != "void" else "", getInterfaceName(function), ", ".join(a.name for a in function.arguments)) 92523c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos yield "}" 92623c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 92723c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos writeInlFile(filename, INL_HEADER, makeFuncPtrInterfaceImpl()) 92823c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 92923c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulosdef writeStrUtilProto (api, filename): 93023c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos def makeStrUtilProto (): 931aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for line in indentLines(["const char*\tget%sName\t(%s value);" % (enum.name[2:], enum.name) for enum in api.enums if not enum.isAlias]): 93223c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos yield line 93323c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos yield "" 934aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for line in indentLines(["inline tcu::Format::Enum<%s>\tget%sStr\t(%s value)\t{ return tcu::Format::Enum<%s>(get%sName, value);\t}" % (e.name, e.name[2:], e.name, e.name, e.name[2:]) for e in api.enums if not e.isAlias]): 93523c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos yield line 93623c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos yield "" 937aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for line in indentLines(["inline std::ostream&\toperator<<\t(std::ostream& s, %s value)\t{ return s << get%sStr(value);\t}" % (e.name, e.name[2:]) for e in api.enums if not e.isAlias]): 93823c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos yield line 93923c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos yield "" 940aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for line in indentLines(["tcu::Format::Bitfield<32>\tget%sStr\t(%s value);" % (bitfield.name[2:], bitfield.name) for bitfield in api.bitfields if not bitfield.isAlias]): 94123c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos yield line 9428f511d33a5f34280d6e6eefdbbb5086706f26cddPyry Haulos yield "" 943aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for line in indentLines(["std::ostream&\toperator<<\t(std::ostream& s, const %s& value);" % (s.name) for s in api.compositeTypes if not s.isAlias]): 9448f511d33a5f34280d6e6eefdbbb5086706f26cddPyry Haulos yield line 94523c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 94623c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos writeInlFile(filename, INL_HEADER, makeStrUtilProto()) 94723c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 94823c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulosdef writeStrUtilImpl (api, filename): 94923c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos def makeStrUtilImpl (): 950aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for line in indentLines(["template<> const char*\tgetTypeName<%s>\t(void) { return \"%s\";\t}" % (handle.name, handle.name) for handle in api.handles if not handle.isAlias]): 95123c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos yield line 95223c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 95312021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos yield "" 95412021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos yield "namespace %s" % PLATFORM_TYPE_NAMESPACE 95512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos yield "{" 95612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos 957aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for line in indentLines("std::ostream& operator<< (std::ostream& s, %s\tv) { return s << tcu::toHex(v.internal); }" % ''.join(s) for n, s, c in PLATFORM_TYPES): 95812021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos yield line 95912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos 96012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos yield "}" 96112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos 96223c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos for enum in api.enums: 96333b5a8a9652e2ad55029dccd970f0e7a39af917fAlexander Galazin if enum.isAlias: 96433b5a8a9652e2ad55029dccd970f0e7a39af917fAlexander Galazin continue 96523c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos yield "" 96623c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos yield "const char* get%sName (%s value)" % (enum.name[2:], enum.name) 96723c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos yield "{" 96823c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos yield "\tswitch (value)" 96923c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos yield "\t{" 97023c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos for line in indentLines(["\t\tcase %s:\treturn \"%s\";" % (n, n) for n, v in enum.values] + ["\t\tdefault:\treturn DE_NULL;"]): 97123c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos yield line 97223c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos yield "\t}" 97323c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos yield "}" 97423c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 97523c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos for bitfield in api.bitfields: 97633b5a8a9652e2ad55029dccd970f0e7a39af917fAlexander Galazin if bitfield.isAlias: 97733b5a8a9652e2ad55029dccd970f0e7a39af917fAlexander Galazin continue 97823c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos yield "" 97923c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos yield "tcu::Format::Bitfield<32> get%sStr (%s value)" % (bitfield.name[2:], bitfield.name) 98023c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos yield "{" 98168e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 98268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos if len(bitfield.values) > 0: 98368e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos yield "\tstatic const tcu::Format::BitDesc s_desc[] =" 98468e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos yield "\t{" 98568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos for line in indentLines(["\t\ttcu::Format::BitDesc(%s,\t\"%s\")," % (n, n) for n, v in bitfield.values]): 98668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos yield line 98768e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos yield "\t};" 98868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos yield "\treturn tcu::Format::Bitfield<32>(value, DE_ARRAY_BEGIN(s_desc), DE_ARRAY_END(s_desc));" 98968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos else: 99068e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos yield "\treturn tcu::Format::Bitfield<32>(value, DE_NULL, DE_NULL);" 99123c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos yield "}" 99223c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 9938f511d33a5f34280d6e6eefdbbb5086706f26cddPyry Haulos bitfieldTypeNames = set([bitfield.name for bitfield in api.bitfields]) 9948f511d33a5f34280d6e6eefdbbb5086706f26cddPyry Haulos 995b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos for type in api.compositeTypes: 996aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if not type.isAlias: 997aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin yield "" 998aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin yield "std::ostream& operator<< (std::ostream& s, const %s& value)" % type.name 999aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin yield "{" 1000aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin yield "\ts << \"%s = {\\n\";" % type.name 1001aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for member in type.members: 1002aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin memberName = member.name 1003aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin valFmt = None 1004aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin newLine = "" 1005aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if member.getType() in bitfieldTypeNames: 1006aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin valFmt = "get%sStr(value.%s)" % (member.getType()[2:], member.name) 1007aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin elif member.getType() == "const char*" or member.getType() == "char*": 1008aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin valFmt = "getCharPtrStr(value.%s)" % member.name 1009aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin elif member.arraySize != '': 1010aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if member.name in ["extensionName", "deviceName", "layerName", "description"]: 1011aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin valFmt = "(const char*)value.%s" % member.name 1012aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin elif member.getType() == 'char' or member.getType() == 'deUint8': 1013aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin newLine = "'\\n' << " 1014aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin valFmt = "tcu::formatArray(tcu::Format::HexIterator<%s>(DE_ARRAY_BEGIN(value.%s)), tcu::Format::HexIterator<%s>(DE_ARRAY_END(value.%s)))" % (member.getType(), member.name, member.getType(), member.name) 1015cdf80ba37ef186bb2d8fc5a3a97dd633e6a67d85Pyry Haulos else: 1016aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if member.name == "memoryTypes" or member.name == "memoryHeaps": 1017aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin endIter = "DE_ARRAY_BEGIN(value.%s) + value.%sCount" % (member.name, member.name[:-1]) 1018aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin else: 1019aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin endIter = "DE_ARRAY_END(value.%s)" % member.name 1020aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin newLine = "'\\n' << " 1021aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin valFmt = "tcu::formatArray(DE_ARRAY_BEGIN(value.%s), %s)" % (member.name, endIter) 1022aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin memberName = member.name 1023aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin else: 1024aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin valFmt = "value.%s" % member.name 1025aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin yield ("\ts << \"\\t%s = \" << " % memberName) + newLine + valFmt + " << '\\n';" 1026aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin yield "\ts << '}';" 1027aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin yield "\treturn s;" 1028aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin yield "}" 102923c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos writeInlFile(filename, INL_HEADER, makeStrUtilImpl()) 103023c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 103123c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulosclass ConstructorFunction: 1032b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos def __init__ (self, type, name, objectType, iface, arguments): 1033b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos self.type = type 103423c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos self.name = name 103523c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos self.objectType = objectType 103623c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos self.iface = iface 103723c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos self.arguments = arguments 103823c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 103923c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulosdef getConstructorFunctions (api): 104023c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos funcs = [] 104123c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos for function in api.functions: 104233b5a8a9652e2ad55029dccd970f0e7a39af917fAlexander Galazin if function.isAlias: 104333b5a8a9652e2ad55029dccd970f0e7a39af917fAlexander Galazin continue 1044410737b8f9ce5c7ade022d52e1bb4fec6a5e9e8ePyry Haulos if (function.name[:8] == "vkCreate" or function.name == "vkAllocateMemory") and not "createInfoCount" in [a.name for a in function.arguments]: 104512021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos if function.name == "vkCreateDisplayModeKHR": 104612021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos continue # No way to delete display modes (bug?) 104712021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos 104823c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos # \todo [pyry] Rather hacky 104923c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos iface = None 105023c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos if function.getType() == Function.TYPE_PLATFORM: 1051aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin iface = Variable("const PlatformInterface&", "vk", "") 1052b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos elif function.getType() == Function.TYPE_INSTANCE: 1053aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin iface = Variable("const InstanceInterface&", "vk", "") 105423c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos else: 1055aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin iface = Variable("const DeviceInterface&", "vk", "") 105668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1057aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin assert (function.arguments[-2].type == ["const", "VkAllocationCallbacks", "*"]) 105868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 1059aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin objectType = function.arguments[-1].type[0] #not getType() but type[0] on purpose 1060955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos arguments = function.arguments[:-1] 1061b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos funcs.append(ConstructorFunction(function.getType(), getInterfaceName(function), objectType, iface, arguments)) 106223c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos return funcs 106323c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 1064aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazindef addVersionDefines(versionSpectrum): 1065aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin output = ["#define " + ver.getDefineName() + " " + ver.getInHex() for ver in versionSpectrum if not ver.isStandardVersion()] 1066aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return output 1067aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 1068aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazindef removeVersionDefines(versionSpectrum): 1069aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin output = ["#undef " + ver.getDefineName() for ver in versionSpectrum if not ver.isStandardVersion()] 1070aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return output 1071aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 107223c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulosdef writeRefUtilProto (api, filename): 1073aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin functions = getConstructorFunctions(api) 107423c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 107523c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos def makeRefUtilProto (): 107623c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos unindented = [] 1077955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos for line in indentLines(["Move<%s>\t%s\t(%s = DE_NULL);" % (function.objectType, function.name, argListToStr([function.iface] + function.arguments)) for function in functions]): 107823c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos yield line 107923c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 108023c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos writeInlFile(filename, INL_HEADER, makeRefUtilProto()) 108123c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 108223c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulosdef writeRefUtilImpl (api, filename): 108323c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos functions = getConstructorFunctions(api) 108423c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 108523c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos def makeRefUtilImpl (): 1086b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos yield "namespace refdetails" 1087b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos yield "{" 1088b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos yield "" 1089b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos 1090b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos for function in api.functions: 1091b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos if function.getType() == Function.TYPE_DEVICE \ 1092aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin and (function.name[:9] == "vkDestroy" or function.name == "vkFreeMemory") \ 1093aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin and not function.name == "vkDestroyDevice" \ 1094aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin and not function.isAlias: 1095aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin objectType = function.arguments[-2].getType() 1096b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos yield "template<>" 1097b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos yield "void Deleter<%s>::operator() (%s obj) const" % (objectType, objectType) 1098b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos yield "{" 1099955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos yield "\tm_deviceIface->%s(m_device, obj, m_allocator);" % (getInterfaceName(function)) 1100b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos yield "}" 1101b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos yield "" 1102b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos 1103b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos yield "} // refdetails" 1104b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos yield "" 1105b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos 110623c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos for function in functions: 1107931d1df9bc5ac16200e2e63dfce17dcbbbb35d36Pyry Haulos if function.type == Function.TYPE_DEVICE: 1108931d1df9bc5ac16200e2e63dfce17dcbbbb35d36Pyry Haulos dtorObj = "device" 1109931d1df9bc5ac16200e2e63dfce17dcbbbb35d36Pyry Haulos elif function.type == Function.TYPE_INSTANCE: 1110931d1df9bc5ac16200e2e63dfce17dcbbbb35d36Pyry Haulos if function.name == "createDevice": 1111931d1df9bc5ac16200e2e63dfce17dcbbbb35d36Pyry Haulos dtorObj = "object" 1112931d1df9bc5ac16200e2e63dfce17dcbbbb35d36Pyry Haulos else: 1113931d1df9bc5ac16200e2e63dfce17dcbbbb35d36Pyry Haulos dtorObj = "instance" 1114931d1df9bc5ac16200e2e63dfce17dcbbbb35d36Pyry Haulos else: 1115931d1df9bc5ac16200e2e63dfce17dcbbbb35d36Pyry Haulos dtorObj = "object" 111623c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 1117b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos yield "Move<%s> %s (%s)" % (function.objectType, function.name, argListToStr([function.iface] + function.arguments)) 111823c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos yield "{" 111923c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos yield "\t%s object = 0;" % function.objectType 1120955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos yield "\tVK_CHECK(vk.%s(%s));" % (function.name, ", ".join([a.name for a in function.arguments] + ["&object"])) 1121955de51cf0206b4a34f8442294c45225074286f4Pyry Haulos yield "\treturn Move<%s>(check<%s>(object), Deleter<%s>(%s));" % (function.objectType, function.objectType, function.objectType, ", ".join(["vk", dtorObj, function.arguments[-1].name])) 112223c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos yield "}" 112323c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos yield "" 112423c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 112523c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos writeInlFile(filename, INL_HEADER, makeRefUtilImpl()) 112623c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 1127e5cf8de067694afde10873b6fdbd7907486e5611Pyry Haulosdef writeStructTraitsImpl (api, filename): 1128e5cf8de067694afde10873b6fdbd7907486e5611Pyry Haulos def gen (): 1129e5cf8de067694afde10873b6fdbd7907486e5611Pyry Haulos for type in api.compositeTypes: 1130aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if type.getClassName() == "struct" and type.members[0].name == "sType" and not type.isAlias: 1131e5cf8de067694afde10873b6fdbd7907486e5611Pyry Haulos yield "template<> VkStructureType getStructureType<%s> (void)" % type.name 1132e5cf8de067694afde10873b6fdbd7907486e5611Pyry Haulos yield "{" 1133aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin yield "\treturn %s;" % prefixName("VK_STRUCTURE_TYPE_", type.name) 1134e5cf8de067694afde10873b6fdbd7907486e5611Pyry Haulos yield "}" 1135e5cf8de067694afde10873b6fdbd7907486e5611Pyry Haulos yield "" 1136e5cf8de067694afde10873b6fdbd7907486e5611Pyry Haulos 1137e5cf8de067694afde10873b6fdbd7907486e5611Pyry Haulos writeInlFile(filename, INL_HEADER, gen()) 1138e5cf8de067694afde10873b6fdbd7907486e5611Pyry Haulos 1139e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulosdef writeNullDriverImpl (api, filename): 1140e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos def genNullDriverImpl (): 1141e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos specialFuncNames = [ 1142e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos "vkCreateGraphicsPipelines", 1143e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos "vkCreateComputePipelines", 1144e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos "vkGetInstanceProcAddr", 1145e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos "vkGetDeviceProcAddr", 1146e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos "vkEnumeratePhysicalDevices", 1147e5cf8de067694afde10873b6fdbd7907486e5611Pyry Haulos "vkEnumerateInstanceExtensionProperties", 1148e5cf8de067694afde10873b6fdbd7907486e5611Pyry Haulos "vkEnumerateDeviceExtensionProperties", 1149efce6d8d6e037ecf0cdcb695f55bd425bc49465aPyry Haulos "vkGetPhysicalDeviceFeatures", 1150e5cf8de067694afde10873b6fdbd7907486e5611Pyry Haulos "vkGetPhysicalDeviceFeatures2KHR", 1151e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos "vkGetPhysicalDeviceProperties", 1152e5cf8de067694afde10873b6fdbd7907486e5611Pyry Haulos "vkGetPhysicalDeviceProperties2KHR", 11533d2071b82061ee418aa87064333069281133eddaPyry Haulos "vkGetPhysicalDeviceQueueFamilyProperties", 1154e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos "vkGetPhysicalDeviceMemoryProperties", 115510342d15539ed935ddd0cb3cce5484d1636683a2Pyry Haulos "vkGetPhysicalDeviceFormatProperties", 1156efce6d8d6e037ecf0cdcb695f55bd425bc49465aPyry Haulos "vkGetPhysicalDeviceImageFormatProperties", 1157efce6d8d6e037ecf0cdcb695f55bd425bc49465aPyry Haulos "vkGetDeviceQueue", 1158e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos "vkGetBufferMemoryRequirements", 1159e5cf8de067694afde10873b6fdbd7907486e5611Pyry Haulos "vkGetBufferMemoryRequirements2KHR", 1160e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos "vkGetImageMemoryRequirements", 1161e5cf8de067694afde10873b6fdbd7907486e5611Pyry Haulos "vkGetImageMemoryRequirements2KHR", 11625f3c59fc0500dc4b0c779624019ffd61c6b44532Jesse Hall "vkAllocateMemory", 11634ed019637dbe432fbf61210cf98a15e719e2c894Jarkko Pöyry "vkMapMemory", 11645f3c59fc0500dc4b0c779624019ffd61c6b44532Jesse Hall "vkUnmapMemory", 116568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos "vkAllocateDescriptorSets", 11664ed019637dbe432fbf61210cf98a15e719e2c894Jarkko Pöyry "vkFreeDescriptorSets", 1167b18ad66a6d666bcd3eed8d4ada025f2eeb8c65e5Pyry Haulos "vkResetDescriptorPool", 116868e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos "vkAllocateCommandBuffers", 116912021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos "vkFreeCommandBuffers", 117012021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos "vkCreateDisplayModeKHR", 117112021ac26c6d6f8923f526bd7635dcf68e0c4061Pyry Haulos "vkCreateSharedSwapchainsKHR", 11725f3c59fc0500dc4b0c779624019ffd61c6b44532Jesse Hall "vkGetPhysicalDeviceExternalBufferPropertiesKHR", 11735f3c59fc0500dc4b0c779624019ffd61c6b44532Jesse Hall "vkGetPhysicalDeviceImageFormatProperties2KHR", 11745f3c59fc0500dc4b0c779624019ffd61c6b44532Jesse Hall "vkGetMemoryAndroidHardwareBufferANDROID", 1175e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos ] 1176aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 1177aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin coreFunctions = [f for f in api.functions if not f.isAlias] 1178aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin specialFuncs = [f for f in coreFunctions if f.name in specialFuncNames] 1179aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin createFuncs = [f for f in coreFunctions if (f.name[:8] == "vkCreate" or f.name == "vkAllocateMemory") and not f in specialFuncs] 1180aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin destroyFuncs = [f for f in coreFunctions if (f.name[:9] == "vkDestroy" or f.name == "vkFreeMemory") and not f in specialFuncs] 1181aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin dummyFuncs = [f for f in coreFunctions if f not in specialFuncs + createFuncs + destroyFuncs] 1182e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos 1183e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos def getHandle (name): 1184e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos for handle in api.handles: 1185aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if handle.name == name[0]: 1186e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos return handle 1187e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos raise Exception("No such handle: %s" % name) 1188e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos 1189e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos for function in createFuncs: 1190aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin objectType = function.arguments[-1].type[:-1] 1191ef958b3ba358291384f2556ff9f57355f4f6e96dPyry Haulos argsStr = ", ".join([a.name for a in function.arguments[:-1]]) 1192e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos 11937b6f280d7044edce796a9a0dd1d5143b1e7ecd55Pyry Haulos yield "VKAPI_ATTR %s VKAPI_CALL %s (%s)" % (function.returnType, getInterfaceName(function), argListToStr(function.arguments)) 1194e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos yield "{" 119568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos yield "\tDE_UNREF(%s);" % function.arguments[-2].name 1196e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos 1197e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos if getHandle(objectType).type == Handle.TYPE_NONDISP: 1198aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin yield "\tVK_NULL_RETURN((*%s = allocateNonDispHandle<%s, %s>(%s)));" % (function.arguments[-1].name, objectType[0][2:], objectType[0], argsStr) 1199e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos else: 1200aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin yield "\tVK_NULL_RETURN((*%s = allocateHandle<%s, %s>(%s)));" % (function.arguments[-1].name, objectType[0][2:], objectType[0], argsStr) 1201e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos yield "}" 1202e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos yield "" 1203e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos 1204e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos for function in destroyFuncs: 120568e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos objectArg = function.arguments[-2] 120668e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos 12077b6f280d7044edce796a9a0dd1d5143b1e7ecd55Pyry Haulos yield "VKAPI_ATTR %s VKAPI_CALL %s (%s)" % (function.returnType, getInterfaceName(function), argListToStr(function.arguments)) 1208e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos yield "{" 120968e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos for arg in function.arguments[:-2]: 1210e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos yield "\tDE_UNREF(%s);" % arg.name 1211e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos 121268e7282426d639b54d15c4710d97ba97e72c76efPyry Haulos if getHandle(objectArg.type).type == Handle.TYPE_NONDISP: 1213aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin yield "\tfreeNonDispHandle<%s, %s>(%s, %s);" % (objectArg.getType()[2:], objectArg.getType(), objectArg.name, function.arguments[-1].name) 1214e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos else: 1215aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin yield "\tfreeHandle<%s, %s>(%s, %s);" % (objectArg.getType()[2:], objectArg.getType(), objectArg.name, function.arguments[-1].name) 1216e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos 1217e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos yield "}" 1218e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos yield "" 1219e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos 1220e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos for function in dummyFuncs: 12217b6f280d7044edce796a9a0dd1d5143b1e7ecd55Pyry Haulos yield "VKAPI_ATTR %s VKAPI_CALL %s (%s)" % (function.returnType, getInterfaceName(function), argListToStr(function.arguments)) 1222e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos yield "{" 1223e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos for arg in function.arguments: 1224e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos yield "\tDE_UNREF(%s);" % arg.name 1225e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos if function.returnType != "void": 1226e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos yield "\treturn VK_SUCCESS;" 1227e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos yield "}" 1228e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos yield "" 1229e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos 1230e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos def genFuncEntryTable (type, name): 1231e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos funcs = [f for f in api.functions if f.getType() == type] 1232aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin refFuncs = {} 1233aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for f in api.functions: 1234aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if f.alias != None: 1235aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin refFuncs[f.alias] = f 1236e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos 1237e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos yield "static const tcu::StaticFunctionLibrary::Entry %s[] =" % name 1238e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos yield "{" 1239aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for line in indentLines(["\tVK_NULL_FUNC_ENTRY(%s,\t%s)," % (function.name, getInterfaceName(function if not function.isAlias else refFuncs[function])) for function in funcs]): 1240e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos yield line 1241e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos yield "};" 1242e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos yield "" 1243e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos 1244e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos # Func tables 1245e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos for line in genFuncEntryTable(Function.TYPE_PLATFORM, "s_platformFunctions"): 1246e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos yield line 1247e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos 1248e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos for line in genFuncEntryTable(Function.TYPE_INSTANCE, "s_instanceFunctions"): 1249e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos yield line 1250e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos 1251e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos for line in genFuncEntryTable(Function.TYPE_DEVICE, "s_deviceFunctions"): 1252e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos yield line 1253e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos 1254e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos writeInlFile(filename, INL_HEADER, genNullDriverImpl()) 1255e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos 12560ae6069583c8d178964c87b1e321d8e9448bd197Pyry Haulosdef writeTypeUtil (api, filename): 12570ae6069583c8d178964c87b1e321d8e9448bd197Pyry Haulos # Structs filled by API queries are not often used in test code 12580ae6069583c8d178964c87b1e321d8e9448bd197Pyry Haulos QUERY_RESULT_TYPES = set([ 12590ae6069583c8d178964c87b1e321d8e9448bd197Pyry Haulos "VkPhysicalDeviceFeatures", 12600ae6069583c8d178964c87b1e321d8e9448bd197Pyry Haulos "VkPhysicalDeviceLimits", 12610ae6069583c8d178964c87b1e321d8e9448bd197Pyry Haulos "VkFormatProperties", 12620ae6069583c8d178964c87b1e321d8e9448bd197Pyry Haulos "VkImageFormatProperties", 12630ae6069583c8d178964c87b1e321d8e9448bd197Pyry Haulos "VkPhysicalDeviceSparseProperties", 12640ae6069583c8d178964c87b1e321d8e9448bd197Pyry Haulos "VkQueueFamilyProperties", 12650ae6069583c8d178964c87b1e321d8e9448bd197Pyry Haulos "VkMemoryType", 12660ae6069583c8d178964c87b1e321d8e9448bd197Pyry Haulos "VkMemoryHeap", 12670ae6069583c8d178964c87b1e321d8e9448bd197Pyry Haulos ]) 1268aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin COMPOSITE_TYPES = set([t.name for t in api.compositeTypes if not t.isAlias]) 12690ae6069583c8d178964c87b1e321d8e9448bd197Pyry Haulos 12700ae6069583c8d178964c87b1e321d8e9448bd197Pyry Haulos def isSimpleStruct (type): 12710ae6069583c8d178964c87b1e321d8e9448bd197Pyry Haulos def hasArrayMember (type): 12720ae6069583c8d178964c87b1e321d8e9448bd197Pyry Haulos for member in type.members: 1273aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if member.arraySize != '': 12740ae6069583c8d178964c87b1e321d8e9448bd197Pyry Haulos return True 12750ae6069583c8d178964c87b1e321d8e9448bd197Pyry Haulos return False 12760ae6069583c8d178964c87b1e321d8e9448bd197Pyry Haulos 12770ae6069583c8d178964c87b1e321d8e9448bd197Pyry Haulos def hasCompositeMember (type): 12780ae6069583c8d178964c87b1e321d8e9448bd197Pyry Haulos for member in type.members: 1279aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if member.getType() in COMPOSITE_TYPES: 12800ae6069583c8d178964c87b1e321d8e9448bd197Pyry Haulos return True 12810ae6069583c8d178964c87b1e321d8e9448bd197Pyry Haulos return False 12820ae6069583c8d178964c87b1e321d8e9448bd197Pyry Haulos 12830ae6069583c8d178964c87b1e321d8e9448bd197Pyry Haulos return type.typeClass == CompositeType.CLASS_STRUCT and \ 1284aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin type.members[0].getType() != "VkStructureType" and \ 1285aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin not type.name in QUERY_RESULT_TYPES and \ 1286aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin not hasArrayMember(type) and \ 1287aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin not hasCompositeMember(type) 12880ae6069583c8d178964c87b1e321d8e9448bd197Pyry Haulos 12890ae6069583c8d178964c87b1e321d8e9448bd197Pyry Haulos def gen (): 12900ae6069583c8d178964c87b1e321d8e9448bd197Pyry Haulos for type in api.compositeTypes: 129133b5a8a9652e2ad55029dccd970f0e7a39af917fAlexander Galazin if not isSimpleStruct(type) or type.isAlias: 12920ae6069583c8d178964c87b1e321d8e9448bd197Pyry Haulos continue 12930ae6069583c8d178964c87b1e321d8e9448bd197Pyry Haulos 12940ae6069583c8d178964c87b1e321d8e9448bd197Pyry Haulos yield "" 12950ae6069583c8d178964c87b1e321d8e9448bd197Pyry Haulos yield "inline %s make%s (%s)" % (type.name, type.name[2:], argListToStr(type.members)) 12960ae6069583c8d178964c87b1e321d8e9448bd197Pyry Haulos yield "{" 12970ae6069583c8d178964c87b1e321d8e9448bd197Pyry Haulos yield "\t%s res;" % type.name 12980ae6069583c8d178964c87b1e321d8e9448bd197Pyry Haulos for line in indentLines(["\tres.%s\t= %s;" % (m.name, m.name) for m in type.members]): 12990ae6069583c8d178964c87b1e321d8e9448bd197Pyry Haulos yield line 13000ae6069583c8d178964c87b1e321d8e9448bd197Pyry Haulos yield "\treturn res;" 13010ae6069583c8d178964c87b1e321d8e9448bd197Pyry Haulos yield "}" 13020ae6069583c8d178964c87b1e321d8e9448bd197Pyry Haulos 13030ae6069583c8d178964c87b1e321d8e9448bd197Pyry Haulos writeInlFile(filename, INL_HEADER, gen()) 13040ae6069583c8d178964c87b1e321d8e9448bd197Pyry Haulos 1305aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazindef writeSupportedExtenions(api, filename): 1306aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 1307aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin def writeExtensionsForVersions(map): 1308aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin result = [] 1309aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for version in map: 1310aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin result.append(" if (coreVersion >= " + str(version) + ")") 1311aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin result.append(" {") 1312aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for extension in map[version]: 1313aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin result.append(' dst.push_back("' + extension.name + '");') 1314aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin result.append(" }") 1315aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 1316aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin return result 1317aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 1318aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin instanceMap = {} 1319aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin deviceMap = {} 1320aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin versionSet = set() 1321aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 1322aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for ext in api.extensions: 1323aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if ext.versionInCore != None: 1324aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin if ext.versionInCore[0] == 'INSTANCE': 1325aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin list = instanceMap.get(Version(ext.versionInCore[1:])) 1326aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin instanceMap[Version(ext.versionInCore[1:])] = list + [ext] if list else [ext] 1327aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin else: 1328aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin list = deviceMap.get(Version(ext.versionInCore[1:])) 1329aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin deviceMap[Version(ext.versionInCore[1:])] = list + [ext] if list else [ext] 1330aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin versionSet.add(Version(ext.versionInCore[1:])) 1331aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 1332aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin lines = addVersionDefines(versionSet) + [ 1333aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin "", 1334aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin "void getCoreDeviceExtensionsImpl (deUint32 coreVersion, ::std::vector<const char*>&%s)" % (" dst" if len(deviceMap) != 0 else ""), 1335aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin "{"] + writeExtensionsForVersions(deviceMap) + [ 1336aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin "}", 1337aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin "", 1338aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin "void getCoreInstanceExtensionsImpl (deUint32 coreVersion, ::std::vector<const char*>&%s)" % (" dst" if len(instanceMap) != 0 else ""), 1339aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin "{"] + writeExtensionsForVersions(instanceMap) + [ 1340aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin "}", 1341aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin ""] + removeVersionDefines(versionSet) 1342aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin writeInlFile(filename, INL_HEADER, lines) 1343aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 1344aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazindef writeCoreFunctionalities(api, filename): 1345aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin functionOriginValues = ["FUNCTIONORIGIN_PLATFORM", "FUNCTIONORIGIN_INSTANCE", "FUNCTIONORIGIN_DEVICE"] 1346aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 1347aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin lines = addVersionDefines([Version((1, 0, 0)), Version((1, 1, 0))]) + [ 1348aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin "", 1349aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 'enum FunctionOrigin', '{'] + [line for line in indentLines([ 1350aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin '\t' + functionOriginValues[0] + '\t= 0,', 1351aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin '\t' + functionOriginValues[1] + ',', 1352aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin '\t' + functionOriginValues[2]])] + [ 1353aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin "};", 1354aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin "", 1355aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin "typedef ::std::pair<const char*, FunctionOrigin> FunctionInfo;", 1356aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin "typedef ::std::vector<FunctionInfo> FunctionInfosList;", 1357aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin "typedef ::std::map<deUint32, FunctionInfosList> ApisMap;", 1358aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin "", 1359aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin "void initApisMap (ApisMap& apis)", 1360aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin "{", 1361aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin " apis.clear();", 1362aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin " apis.insert(::std::pair<deUint32, FunctionInfosList>(" + str(Version((1, 0, 0))) + ", FunctionInfosList()));", 1363aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin " apis.insert(::std::pair<deUint32, FunctionInfosList>(" + str(Version((1, 1, 0))) + ", FunctionInfosList()));", 1364aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin ""] 1365aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 136699e10f05ce9109da239bceb611bcff85fb193165Alexander Galazin def list10Funcs (): 136799e10f05ce9109da239bceb611bcff85fb193165Alexander Galazin for fun in api.functions: 136899e10f05ce9109da239bceb611bcff85fb193165Alexander Galazin if fun.apiVersion == 'VK_VERSION_1_0': 1369aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin insert = ' apis[' + str(Version((1, 0, 0))) + '].push_back(FunctionInfo("' + fun.name + '",\t' + functionOriginValues[fun.getType()] + '));' 1370aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin yield insert 1371aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 1372aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin def listAllFuncs (): 1373aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin for fun in api.extensions[0].functions: 1374aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin insert = ' apis[' + str(Version((1, 1, 0))) + '].push_back(FunctionInfo("' + fun.name + '",\t' + functionOriginValues[fun.getType()] + '));' 1375aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin yield insert 1376aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 137799e10f05ce9109da239bceb611bcff85fb193165Alexander Galazin lines = lines + [line for line in indentLines(list10Funcs())] 1378aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin lines.append("") 1379aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin lines = lines + [line for line in indentLines(listAllFuncs())] 1380aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 1381aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin lines.append("}") 1382aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin lines.append("") 1383aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin lines = lines + removeVersionDefines([Version((1, 0, 0)), Version((1, 1, 0))]) 1384aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 1385aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin writeInlFile(filename, INL_HEADER, lines) 1386aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 138723c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulosif __name__ == "__main__": 13886c5512cd33ac75f480bd9eff89db10e2fa3dd9f7Pyry Haulos src = readFile(VULKAN_H) 138923c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos api = parseAPI(src) 1390aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin 1391aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin platformFuncs = [Function.TYPE_PLATFORM] 1392aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin instanceFuncs = [Function.TYPE_INSTANCE] 1393aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin deviceFuncs = [Function.TYPE_DEVICE] 139423c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos 1395b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos writeHandleType (api, os.path.join(VULKAN_DIR, "vkHandleType.inl")) 139623c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos writeBasicTypes (api, os.path.join(VULKAN_DIR, "vkBasicTypes.inl")) 1397b1a7d2198497be32dfc22386f99945656ff4080ePyry Haulos writeCompositeTypes (api, os.path.join(VULKAN_DIR, "vkStructTypes.inl")) 1398aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin writeInterfaceDecl (api, os.path.join(VULKAN_DIR, "vkVirtualPlatformInterface.inl"), platformFuncs, False) 1399aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin writeInterfaceDecl (api, os.path.join(VULKAN_DIR, "vkVirtualInstanceInterface.inl"), instanceFuncs, False) 1400aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin writeInterfaceDecl (api, os.path.join(VULKAN_DIR, "vkVirtualDeviceInterface.inl"), deviceFuncs, False) 1401aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin writeInterfaceDecl (api, os.path.join(VULKAN_DIR, "vkConcretePlatformInterface.inl"), platformFuncs, True) 1402aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin writeInterfaceDecl (api, os.path.join(VULKAN_DIR, "vkConcreteInstanceInterface.inl"), instanceFuncs, True) 1403aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin writeInterfaceDecl (api, os.path.join(VULKAN_DIR, "vkConcreteDeviceInterface.inl"), deviceFuncs, True) 140423c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos writeFunctionPtrTypes (api, os.path.join(VULKAN_DIR, "vkFunctionPointerTypes.inl")) 1405aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin writeFunctionPointers (api, os.path.join(VULKAN_DIR, "vkPlatformFunctionPointers.inl"), platformFuncs) 1406aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin writeFunctionPointers (api, os.path.join(VULKAN_DIR, "vkInstanceFunctionPointers.inl"), instanceFuncs) 1407aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin writeFunctionPointers (api, os.path.join(VULKAN_DIR, "vkDeviceFunctionPointers.inl"), deviceFuncs) 1408aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin writeInitFunctionPointers (api, os.path.join(VULKAN_DIR, "vkInitPlatformFunctionPointers.inl"), platformFuncs, lambda f: f.name != "vkGetInstanceProcAddr") 1409aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin writeInitFunctionPointers (api, os.path.join(VULKAN_DIR, "vkInitInstanceFunctionPointers.inl"), instanceFuncs) 1410aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin writeInitFunctionPointers (api, os.path.join(VULKAN_DIR, "vkInitDeviceFunctionPointers.inl"), deviceFuncs) 1411aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin writeFuncPtrInterfaceImpl (api, os.path.join(VULKAN_DIR, "vkPlatformDriverImpl.inl"), platformFuncs, "PlatformDriver") 1412aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin writeFuncPtrInterfaceImpl (api, os.path.join(VULKAN_DIR, "vkInstanceDriverImpl.inl"), instanceFuncs, "InstanceDriver") 1413aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin writeFuncPtrInterfaceImpl (api, os.path.join(VULKAN_DIR, "vkDeviceDriverImpl.inl"), deviceFuncs, "DeviceDriver") 141423c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos writeStrUtilProto (api, os.path.join(VULKAN_DIR, "vkStrUtil.inl")) 141523c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos writeStrUtilImpl (api, os.path.join(VULKAN_DIR, "vkStrUtilImpl.inl")) 141623c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos writeRefUtilProto (api, os.path.join(VULKAN_DIR, "vkRefUtil.inl")) 141723c1f9fbfacc654ff2115e74466bb781a058bb9fPyry Haulos writeRefUtilImpl (api, os.path.join(VULKAN_DIR, "vkRefUtilImpl.inl")) 1418e5cf8de067694afde10873b6fdbd7907486e5611Pyry Haulos writeStructTraitsImpl (api, os.path.join(VULKAN_DIR, "vkGetStructureTypeImpl.inl")) 1419e79abd48bed070344eebd06e22cbaf9db18cf3daPyry Haulos writeNullDriverImpl (api, os.path.join(VULKAN_DIR, "vkNullDriverImpl.inl")) 14200ae6069583c8d178964c87b1e321d8e9448bd197Pyry Haulos writeTypeUtil (api, os.path.join(VULKAN_DIR, "vkTypeUtil.inl")) 1421aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin writeSupportedExtenions (api, os.path.join(VULKAN_DIR, "vkSupportedExtensions.inl")) 1422aae4252b14d3f5fc1594706fecc567b84c64f1adAlexander Galazin writeCoreFunctionalities (api, os.path.join(VULKAN_DIR, "vkCoreFunctionalities.inl")) 1423