blob: 7c57b156460c1316ad41d40498bc44851565325a [file] [log] [blame]
Chia-I Wufb2559d2014-08-01 11:19:52 +08001#!/usr/bin/env python3
Chia-I Wu701f3f62014-09-02 08:32:09 +08002#
Karl Schultz8e42f402016-02-02 19:32:33 -07003# Copyright (c) 2015-2016 The Khronos Group Inc.
4# Copyright (c) 2015-2016 Valve Corporation
5# Copyright (c) 2015-2016 LunarG, Inc.
6# Copyright (c) 2015-2016 Google Inc.
Chia-I Wu701f3f62014-09-02 08:32:09 +08007#
Jon Ashburn3ebf1252016-04-19 11:30:31 -06008# Licensed under the Apache License, Version 2.0 (the "License");
9# you may not use this file except in compliance with the License.
10# You may obtain a copy of the License at
Chia-I Wu701f3f62014-09-02 08:32:09 +080011#
Jon Ashburn3ebf1252016-04-19 11:30:31 -060012# http://www.apache.org/licenses/LICENSE-2.0
Chia-I Wu701f3f62014-09-02 08:32:09 +080013#
Jon Ashburn3ebf1252016-04-19 11:30:31 -060014# Unless required by applicable law or agreed to in writing, software
15# distributed under the License is distributed on an "AS IS" BASIS,
16# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17# See the License for the specific language governing permissions and
18# limitations under the License.
Chia-I Wu701f3f62014-09-02 08:32:09 +080019#
Courtney Goeltzenleuchter05559522015-10-30 11:14:30 -060020# Author: Chia-I Wu <olv@lunarg.com>
21# Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
22# Author: Jon Ashburn <jon@lunarg.com>
Mun, Gwan-gyeong82a244a2016-02-22 20:23:59 +090023# Author: Gwan-gyeong Mun <kk.moon@samsung.com>
Mark Lobodzinskicef655d2016-10-27 08:33:09 -060024# Author: Mark Lobodzinski <mark@lunarg.com>
Chia-I Wufb2559d2014-08-01 11:19:52 +080025
26import sys
27
Courtney Goeltzenleuchterf53c3cb2015-04-14 14:55:44 -060028import vulkan
Chia-I Wufb2559d2014-08-01 11:19:52 +080029
Chia-I Wu6cdaedb2015-01-05 12:55:13 +080030def generate_get_proc_addr_check(name):
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060031 return " if (!%s || %s[0] != 'v' || %s[1] != 'k')\n" \
32 " return NULL;" % ((name,) * 3)
Chia-I Wu6cdaedb2015-01-05 12:55:13 +080033
Chia-I Wufb2559d2014-08-01 11:19:52 +080034class Subcommand(object):
35 def __init__(self, argv):
36 self.argv = argv
Courtney Goeltzenleuchterf53c3cb2015-04-14 14:55:44 -060037 self.headers = vulkan.headers
38 self.protos = vulkan.protos
Jamie Madilldbda66b2016-05-10 07:36:20 -070039 self.outfile = None
Chia-I Wufb2559d2014-08-01 11:19:52 +080040
41 def run(self):
Jamie Madilldbda66b2016-05-10 07:36:20 -070042 if self.outfile:
43 with open(self.outfile, "w") as outfile:
44 outfile.write(self.generate())
45 else:
46 print(self.generate())
Chia-I Wufb2559d2014-08-01 11:19:52 +080047
48 def generate(self):
49 copyright = self.generate_copyright()
50 header = self.generate_header()
51 body = self.generate_body()
52 footer = self.generate_footer()
53
54 contents = []
55 if copyright:
56 contents.append(copyright)
57 if header:
58 contents.append(header)
59 if body:
60 contents.append(body)
61 if footer:
62 contents.append(footer)
63
64 return "\n\n".join(contents)
65
66 def generate_copyright(self):
67 return """/* THIS FILE IS GENERATED. DO NOT EDIT. */
68
69/*
Karl Schultz8e42f402016-02-02 19:32:33 -070070 * Copyright (c) 2015-2016 The Khronos Group Inc.
71 * Copyright (c) 2015-2016 Valve Corporation
72 * Copyright (c) 2015-2016 LunarG, Inc.
Chia-I Wufb2559d2014-08-01 11:19:52 +080073 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060074 * Licensed under the Apache License, Version 2.0 (the "License");
75 * you may not use this file except in compliance with the License.
76 * You may obtain a copy of the License at
Chia-I Wufb2559d2014-08-01 11:19:52 +080077 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060078 * http://www.apache.org/licenses/LICENSE-2.0
Chia-I Wufb2559d2014-08-01 11:19:52 +080079 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060080 * Unless required by applicable law or agreed to in writing, software
81 * distributed under the License is distributed on an "AS IS" BASIS,
82 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
83 * See the License for the specific language governing permissions and
84 * limitations under the License.
Courtney Goeltzenleuchter05559522015-10-30 11:14:30 -060085 *
86 * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
Chia-I Wufb2559d2014-08-01 11:19:52 +080087 */"""
88
89 def generate_header(self):
Chia-I Wu6bdf0192014-09-13 13:36:06 +080090 return "\n".join(["#include <" + h + ">" for h in self.headers])
Chia-I Wufb2559d2014-08-01 11:19:52 +080091
92 def generate_body(self):
93 pass
94
95 def generate_footer(self):
96 pass
97
Chia-I Wu29271d72015-01-04 10:19:50 +080098class DispatchTableOpsSubcommand(Subcommand):
Mark Youngaa1aa3a2016-07-05 16:41:50 -060099 def __init__(self, argv):
100 self.argv = argv
101 self.headers = vulkan.headers_all
102 self.protos = vulkan.protos_all
103 self.outfile = None
104
Chia-I Wu29271d72015-01-04 10:19:50 +0800105 def run(self):
Jamie Madilldbda66b2016-05-10 07:36:20 -0700106 if len(self.argv) < 1:
Chia-I Wu29271d72015-01-04 10:19:50 +0800107 print("DispatchTableOpsSubcommand: <prefix> unspecified")
108 return
109
110 self.prefix = self.argv[0]
Jamie Madilldbda66b2016-05-10 07:36:20 -0700111
112 if len(self.argv) > 2:
113 print("DispatchTableOpsSubcommand: <prefix> [outfile]")
114 return
115
116 if len(self.argv) == 2:
117 self.outfile = self.argv[1]
118
Michael Lentine695f2c22015-09-09 12:39:13 -0700119 super(DispatchTableOpsSubcommand, self).run()
Chia-I Wu29271d72015-01-04 10:19:50 +0800120
121 def generate_header(self):
David Pinedo9316d3b2015-11-06 12:54:48 -0700122 return "\n".join(["#include <vulkan/vulkan.h>",
123 "#include <vulkan/vk_layer.h>",
Jon Ashburn1dd0a5c2015-05-04 09:16:41 -0600124 "#include <string.h>"])
Chia-I Wu29271d72015-01-04 10:19:50 +0800125
Jon Ashburn8fd08252015-05-28 16:25:02 -0600126 def _generate_init_dispatch(self, type):
Chia-I Wu29271d72015-01-04 10:19:50 +0800127 stmts = []
Jon Ashburn8c5cbcf2015-05-07 10:27:37 -0600128 func = []
129 if type == "device":
Jon Ashburn8fd08252015-05-28 16:25:02 -0600130 # GPA has to be first one and uses wrapped object
Mark Youngaa1aa3a2016-07-05 16:41:50 -0600131 stmts.append(" memset(table, 0, sizeof(*table));")
132 stmts.append(" // Core device function pointers")
133 stmts.append(" table->GetDeviceProcAddr = (PFN_vkGetDeviceProcAddr) gpa(device, \"vkGetDeviceProcAddr\");")
134
Jon Ashburn8c5cbcf2015-05-07 10:27:37 -0600135 for proto in self.protos:
Mark Youngaa1aa3a2016-07-05 16:41:50 -0600136 if proto.name == "CreateInstance" or proto.name == "EnumerateInstanceExtensionProperties" or \
137 proto.name == "EnumerateInstanceLayerProperties" or proto.params[0].ty == "VkInstance" or \
138 proto.params[0].ty == "VkPhysicalDevice" or proto.name == "GetDeviceProcAddr":
Jon Ashburn95a77ba2015-05-15 15:09:35 -0600139 continue
Mark Lobodzinskicef655d2016-10-27 08:33:09 -0600140 stmts.append(" table->%s = (PFN_vk%s) gpa(device, \"vk%s\");" % (proto.name, proto.name, proto.name))
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -0700141 func.append("static inline void %s_init_device_dispatch_table(VkDevice device,"
Chia-I Wu29271d72015-01-04 10:19:50 +0800142 % self.prefix)
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -0700143 func.append("%s VkLayerDispatchTable *table,"
144 % (" " * len(self.prefix)))
145 func.append("%s PFN_vkGetDeviceProcAddr gpa)"
Jon Ashburn8c5cbcf2015-05-07 10:27:37 -0600146 % (" " * len(self.prefix)))
147 else:
Mark Youngaa1aa3a2016-07-05 16:41:50 -0600148 stmts.append(" memset(table, 0, sizeof(*table));")
149 stmts.append(" // Core instance function pointers")
150 stmts.append(" table->GetInstanceProcAddr = (PFN_vkGetInstanceProcAddr) gpa(instance, \"vkGetInstanceProcAddr\");")
151
Jon Ashburn8c5cbcf2015-05-07 10:27:37 -0600152 for proto in self.protos:
Mark Youngaa1aa3a2016-07-05 16:41:50 -0600153 if proto.params[0].ty != "VkInstance" and proto.params[0].ty != "VkPhysicalDevice" or \
154 proto.name == "CreateDevice" or proto.name == "GetInstanceProcAddr":
Jon Ashburn8c5cbcf2015-05-07 10:27:37 -0600155 continue
Mark Lobodzinski817acda2016-10-26 08:19:24 -0600156 # Protect platform-dependent APIs with #ifdef
Johannes van Waverenaabf1fd2016-07-22 16:10:11 -0500157 if 'KHR' in proto.name and 'Win32' in proto.name:
Mark Lobodzinski817acda2016-10-26 08:19:24 -0600158 stmts.append("#ifdef VK_USE_PLATFORM_WIN32_KHR")
Mark Youngaa1aa3a2016-07-05 16:41:50 -0600159 if 'KHR' in proto.name and 'Xlib' in proto.name:
Mark Lobodzinski817acda2016-10-26 08:19:24 -0600160 stmts.append("#ifdef VK_USE_PLATFORM_XLIB_KHR")
Mark Youngaa1aa3a2016-07-05 16:41:50 -0600161 if 'KHR' in proto.name and 'Xcb' in proto.name:
Mark Lobodzinski817acda2016-10-26 08:19:24 -0600162 stmts.append("#ifdef VK_USE_PLATFORM_XCB_KHR")
Mark Youngaa1aa3a2016-07-05 16:41:50 -0600163 if 'KHR' in proto.name and 'Mir' in proto.name:
Mark Lobodzinski817acda2016-10-26 08:19:24 -0600164 stmts.append("#ifdef VK_USE_PLATFORM_MIR_KHR")
Mark Youngaa1aa3a2016-07-05 16:41:50 -0600165 if 'KHR' in proto.name and 'Wayland' in proto.name:
Mark Lobodzinski817acda2016-10-26 08:19:24 -0600166 stmts.append("#ifdef VK_USE_PLATFORM_WAYLAND_KHR")
Johannes van Waverenaabf1fd2016-07-22 16:10:11 -0500167 if 'KHR' in proto.name and 'Android' in proto.name:
Mark Lobodzinski817acda2016-10-26 08:19:24 -0600168 stmts.append("#ifdef VK_USE_PLATFORM_ANDROID_KHR")
169 # Output dispatch table entry
Mark Youngaa1aa3a2016-07-05 16:41:50 -0600170 stmts.append(" table->%s = (PFN_vk%s) gpa(instance, \"vk%s\");" %
171 (proto.name, proto.name, proto.name))
Mark Lobodzinski817acda2016-10-26 08:19:24 -0600172 # If entry was protected by an #ifdef, close with a #endif
173 if 'KHR' in proto.name and 'Win32' in proto.name:
174 stmts.append("#endif // VK_USE_PLATFORM_WIN32_KHR")
175 if 'KHR' in proto.name and 'Xlib' in proto.name:
176 stmts.append("#endif // VK_USE_PLATFORM_XLIB_KHR")
177 if 'KHR' in proto.name and 'Xcb' in proto.name:
178 stmts.append("#endif // VK_USE_PLATFORM_XCB_KHR")
179 if 'KHR' in proto.name and 'Mir' in proto.name:
180 stmts.append("#endif // VK_USE_PLATFORM_MIR_KHR")
181 if 'KHR' in proto.name and 'Wayland' in proto.name:
182 stmts.append("#endif // VK_USE_PLATFORM_WAYLAND_KHR")
183 if 'KHR' in proto.name and 'Android' in proto.name:
184 stmts.append("#endif // VK_USE_PLATFORM_ANDROID_KHR")
Courtney Goeltzenleuchter00150eb2016-01-08 12:18:43 -0700185 func.append("static inline void %s_init_instance_dispatch_table(" % self.prefix)
186 func.append("%s VkInstance instance," % (" " * len(self.prefix)))
187 func.append("%s VkLayerInstanceDispatchTable *table," % (" " * len(self.prefix)))
188 func.append("%s PFN_vkGetInstanceProcAddr gpa)" % (" " * len(self.prefix)))
Chia-I Wu29271d72015-01-04 10:19:50 +0800189 func.append("{")
Mark Youngaa1aa3a2016-07-05 16:41:50 -0600190 func.append("%s" % "\n".join(stmts))
Chia-I Wu29271d72015-01-04 10:19:50 +0800191 func.append("}")
192
193 return "\n".join(func)
194
Chia-I Wu29271d72015-01-04 10:19:50 +0800195 def generate_body(self):
Jon Ashburn8fd08252015-05-28 16:25:02 -0600196 body = [self._generate_init_dispatch("device"),
197 self._generate_init_dispatch("instance")]
Chia-I Wu29271d72015-01-04 10:19:50 +0800198
199 return "\n\n".join(body)
200
Chia-I Wu0a6644b2015-04-11 10:56:50 +0800201class WinDefFileSubcommand(Subcommand):
202 def run(self):
203 library_exports = {
204 "all": [],
205 "icd": [
Jon Ashburnf5e97542016-01-07 09:46:26 -0700206 "vk_icdGetInstanceProcAddr",
Chia-I Wu0a6644b2015-04-11 10:56:50 +0800207 ],
208 "layer": [
Jon Ashburn2919a012015-08-13 14:15:07 -0700209 "vkGetInstanceProcAddr",
210 "vkGetDeviceProcAddr",
Courtney Goeltzenleuchter35985f62015-09-14 17:22:16 -0600211 "vkEnumerateInstanceLayerProperties",
212 "vkEnumerateInstanceExtensionProperties"
Chia-I Wu0a6644b2015-04-11 10:56:50 +0800213 ],
Mark Lobodzinski0d054fe2015-12-30 08:16:12 -0700214 "layer_multi": [
Jon Ashburn2919a012015-08-13 14:15:07 -0700215 "multi2GetInstanceProcAddr",
216 "multi1GetDeviceProcAddr"
217 ]
Chia-I Wu0a6644b2015-04-11 10:56:50 +0800218 }
219
Jamie Madilldbda66b2016-05-10 07:36:20 -0700220 if len(self.argv) < 2 or len(self.argv) > 3 or self.argv[1] not in library_exports:
221 print("WinDefFileSubcommand: <library-name> {%s} [outfile]" %
Chia-I Wu0a6644b2015-04-11 10:56:50 +0800222 "|".join(library_exports.keys()))
223 return
224
225 self.library = self.argv[0]
Mark Lobodzinski0d054fe2015-12-30 08:16:12 -0700226 if self.library == "VkLayer_multi":
227 self.exports = library_exports["layer_multi"]
Jon Ashburn2919a012015-08-13 14:15:07 -0700228 else:
229 self.exports = library_exports[self.argv[1]]
Chia-I Wu0a6644b2015-04-11 10:56:50 +0800230
Jamie Madilldbda66b2016-05-10 07:36:20 -0700231 if len(self.argv) == 3:
232 self.outfile = self.argv[2]
233
Jamie Madillc0018852016-04-04 11:20:24 -0400234 super(WinDefFileSubcommand, self).run()
Chia-I Wu0a6644b2015-04-11 10:56:50 +0800235
236 def generate_copyright(self):
237 return """; THIS FILE IS GENERATED. DO NOT EDIT.
238
239;;;; Begin Copyright Notice ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600240; Vulkan
Chia-I Wu0a6644b2015-04-11 10:56:50 +0800241;
Karl Schultz8e42f402016-02-02 19:32:33 -0700242; Copyright (c) 2015-2016 The Khronos Group Inc.
243; Copyright (c) 2015-2016 Valve Corporation
244; Copyright (c) 2015-2016 LunarG, Inc.
Chia-I Wu0a6644b2015-04-11 10:56:50 +0800245;
Jon Ashburn3ebf1252016-04-19 11:30:31 -0600246; Licensed under the Apache License, Version 2.0 (the "License");
247; you may not use this file except in compliance with the License.
248; You may obtain a copy of the License at
Chia-I Wu0a6644b2015-04-11 10:56:50 +0800249;
Jon Ashburn3ebf1252016-04-19 11:30:31 -0600250; http://www.apache.org/licenses/LICENSE-2.0
Chia-I Wu0a6644b2015-04-11 10:56:50 +0800251;
Jon Ashburn3ebf1252016-04-19 11:30:31 -0600252; Unless required by applicable law or agreed to in writing, software
253; distributed under the License is distributed on an "AS IS" BASIS,
254; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
255; See the License for the specific language governing permissions and
256; limitations under the License.
Courtney Goeltzenleuchterbdde0b22015-12-16 14:57:27 -0700257;
258; Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
Chia-I Wu0a6644b2015-04-11 10:56:50 +0800259;;;; End Copyright Notice ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"""
260
261 def generate_header(self):
262 return "; The following is required on Windows, for exporting symbols from the DLL"
263
264 def generate_body(self):
265 body = []
266
267 body.append("LIBRARY " + self.library)
268 body.append("EXPORTS")
269
Jon Ashburn2919a012015-08-13 14:15:07 -0700270 for proto in self.exports:
Mark Lobodzinski0d054fe2015-12-30 08:16:12 -0700271 if self.library != "VkLayerSwapchain" or proto != "vkEnumerateInstanceExtensionProperties" and proto != "vkEnumerateInstanceLayerProperties":
Ian Elliott0b4d6242015-09-22 10:51:24 -0600272 body.append( proto)
Chia-I Wu0a6644b2015-04-11 10:56:50 +0800273
274 return "\n".join(body)
275
Chia-I Wufb2559d2014-08-01 11:19:52 +0800276def main():
Mun, Gwan-gyeong82a244a2016-02-22 20:23:59 +0900277 wsi = {
278 "Win32",
279 "Android",
280 "Xcb",
281 "Xlib",
282 "Wayland",
Petros Bantolas2b40be72016-04-15 11:02:59 +0100283 "Mir",
Johannes van Waverenaabf1fd2016-07-22 16:10:11 -0500284 "Display",
Johannes van Waveren05c25362016-10-30 05:47:59 +0100285 "AllPlatforms",
Mun, Gwan-gyeong82a244a2016-02-22 20:23:59 +0900286 }
Chia-I Wufb2559d2014-08-01 11:19:52 +0800287 subcommands = {
Chia-I Wu29271d72015-01-04 10:19:50 +0800288 "dispatch-table-ops": DispatchTableOpsSubcommand,
Chia-I Wu0a6644b2015-04-11 10:56:50 +0800289 "win-def-file": WinDefFileSubcommand,
Chia-I Wufb2559d2014-08-01 11:19:52 +0800290 }
291
Mun, Gwan-gyeong82a244a2016-02-22 20:23:59 +0900292 if len(sys.argv) < 3 or sys.argv[1] not in wsi or sys.argv[2] not in subcommands:
Johannes van Waveren05c25362016-10-30 05:47:59 +0100293 print("Usage: %s <wsi> <subcommand> <option>" % sys.argv[0])
Chia-I Wufb2559d2014-08-01 11:19:52 +0800294 print
Johannes van Waveren05c25362016-10-30 05:47:59 +0100295 print("Available wsi are: %s" % " ".join(wsi))
296 print("Available subcommands are: %s" % " ".join(subcommands))
Chia-I Wufb2559d2014-08-01 11:19:52 +0800297 exit(1)
298
Mun, Gwan-gyeong82a244a2016-02-22 20:23:59 +0900299 subcmd = subcommands[sys.argv[2]](sys.argv[3:])
Chia-I Wufb2559d2014-08-01 11:19:52 +0800300 subcmd.run()
301
302if __name__ == "__main__":
303 main()