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