blob: 1f3fd8e6ba217e69b6d842470c11caedf9629bc7 [file] [log] [blame]
Adithya Srinivasan01364142019-07-02 15:52:49 -07001#!/usr/bin/env python3
2#
3# Copyright 2019 The Android Open Source Project
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
Yiwei Zhang6ca5d0c2019-10-11 17:15:02 -070016
17"""Generates the driver_gen.h and driver_gen.cpp.
18"""
Adithya Srinivasan01364142019-07-02 15:52:49 -070019
Adithya Srinivasan01364142019-07-02 15:52:49 -070020import os
Yiwei Zhang1ca59c12019-10-10 12:54:42 -070021import generator_common as gencom
Adithya Srinivasan01364142019-07-02 15:52:49 -070022
Yiwei Zhang6ca5d0c2019-10-11 17:15:02 -070023# Extensions intercepted at vulkan::driver level.
Yiwei Zhang1ca59c12019-10-10 12:54:42 -070024_INTERCEPTED_EXTENSIONS = [
25 'VK_ANDROID_native_buffer',
26 'VK_EXT_debug_report',
27 'VK_EXT_hdr_metadata',
28 'VK_EXT_swapchain_colorspace',
29 'VK_GOOGLE_display_timing',
30 'VK_KHR_android_surface',
31 'VK_KHR_get_surface_capabilities2',
32 'VK_KHR_incremental_present',
33 'VK_KHR_shared_presentable_image',
34 'VK_KHR_surface',
35 'VK_KHR_swapchain',
Adithya Srinivasan01364142019-07-02 15:52:49 -070036]
37
Yiwei Zhang6ca5d0c2019-10-11 17:15:02 -070038# Extensions known to vulkan::driver level.
Yiwei Zhang1ca59c12019-10-10 12:54:42 -070039_KNOWN_EXTENSIONS = _INTERCEPTED_EXTENSIONS + [
40 'VK_ANDROID_external_memory_android_hardware_buffer',
41 'VK_KHR_bind_memory2',
42 'VK_KHR_get_physical_device_properties2',
Adithya Srinivasan01364142019-07-02 15:52:49 -070043]
44
Yiwei Zhang6ca5d0c2019-10-11 17:15:02 -070045# Functions needed at vulkan::driver level.
Yiwei Zhang1ca59c12019-10-10 12:54:42 -070046_NEEDED_COMMANDS = [
47 # Create functions of dispatchable objects
48 'vkCreateDevice',
49 'vkGetDeviceQueue',
50 'vkGetDeviceQueue2',
51 'vkAllocateCommandBuffers',
52
53 # Destroy functions of dispatchable objects
54 'vkDestroyInstance',
55 'vkDestroyDevice',
56
57 # Enumeration of extensions
58 'vkEnumerateDeviceExtensionProperties',
59
60 # We cache physical devices in loader.cpp
61 'vkEnumeratePhysicalDevices',
62 'vkEnumeratePhysicalDeviceGroups',
63
64 'vkGetInstanceProcAddr',
65 'vkGetDeviceProcAddr',
66
67 'vkQueueSubmit',
68
69 # VK_KHR_swapchain->VK_ANDROID_native_buffer translation
70 'vkCreateImage',
71 'vkDestroyImage',
72
73 'vkGetPhysicalDeviceProperties',
74 'vkGetPhysicalDeviceProperties2',
75 'vkGetPhysicalDeviceProperties2KHR',
76
77 # VK_KHR_swapchain v69 requirement
78 'vkBindImageMemory2',
79 'vkBindImageMemory2KHR',
80]
81
Yiwei Zhang6ca5d0c2019-10-11 17:15:02 -070082# Functions intercepted at vulkan::driver level.
Yiwei Zhang1ca59c12019-10-10 12:54:42 -070083_INTERCEPTED_COMMANDS = [
84 # Create functions of dispatchable objects
85 'vkCreateInstance',
86 'vkCreateDevice',
87 'vkEnumeratePhysicalDevices',
88 'vkEnumeratePhysicalDeviceGroups',
89 'vkGetDeviceQueue',
90 'vkGetDeviceQueue2',
91 'vkAllocateCommandBuffers',
92
93 # Destroy functions of dispatchable objects
94 'vkDestroyInstance',
95 'vkDestroyDevice',
96
97 # Enumeration of extensions
98 'vkEnumerateInstanceExtensionProperties',
99 'vkEnumerateDeviceExtensionProperties',
100
101 'vkGetInstanceProcAddr',
102 'vkGetDeviceProcAddr',
103
104 'vkQueueSubmit',
105
106 # VK_KHR_swapchain v69 requirement
107 'vkBindImageMemory2',
108 'vkBindImageMemory2KHR',
109]
110
111
112def _is_driver_table_entry(cmd):
Yiwei Zhang6ca5d0c2019-10-11 17:15:02 -0700113 """Returns true if a function is needed by vulkan::driver.
114
115 Args:
116 cmd: Vulkan function name.
117 """
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700118 if gencom.is_function_supported(cmd):
119 if cmd in _NEEDED_COMMANDS:
120 return True
121 if cmd in gencom.extension_dict:
122 if (gencom.extension_dict[cmd] == 'VK_ANDROID_native_buffer' or
123 gencom.extension_dict[cmd] == 'VK_EXT_debug_report'):
124 return True
125 return False
126
127
128def _is_instance_driver_table_entry(cmd):
Yiwei Zhang6ca5d0c2019-10-11 17:15:02 -0700129 """Returns true if a instance-dispatched function is needed by vulkan::driver.
130
131 Args:
132 cmd: Vulkan function name.
133 """
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700134 return (_is_driver_table_entry(cmd) and
135 gencom.is_instance_dispatched(cmd))
136
137
138def _is_device_driver_table_entry(cmd):
Yiwei Zhang6ca5d0c2019-10-11 17:15:02 -0700139 """Returns true if a device-dispatched function is needed by vulkan::driver.
140
141 Args:
142 cmd: Vulkan function name.
143 """
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700144 return (_is_driver_table_entry(cmd) and
145 gencom.is_device_dispatched(cmd))
146
147
148def gen_h():
Yiwei Zhang6ca5d0c2019-10-11 17:15:02 -0700149 """Generates the driver_gen.h file.
150 """
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700151 genfile = os.path.join(os.path.dirname(__file__),
152 '..', 'libvulkan', 'driver_gen.h')
153
154 with open(genfile, 'w') as f:
155 f.write(gencom.copyright_and_warning(2016))
156
157 f.write("""\
158#ifndef LIBVULKAN_DRIVER_GEN_H
159#define LIBVULKAN_DRIVER_GEN_H
160
161#include <vulkan/vk_android_native_buffer.h>
162#include <vulkan/vulkan.h>
163
164#include <bitset>
165
166namespace vulkan {
167namespace driver {
168
169struct ProcHook {
Adithya Srinivasan01364142019-07-02 15:52:49 -0700170 enum Type {
171 GLOBAL,
172 INSTANCE,
173 DEVICE,
174 };
175 enum Extension {\n""")
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700176
177 for exts in _KNOWN_EXTENSIONS:
178 f.write(gencom.indent(2) + exts[3:] + ',\n')
179
180 f.write("""
181 EXTENSION_CORE, // valid bit
Adithya Srinivasan01364142019-07-02 15:52:49 -0700182 EXTENSION_COUNT,
183 EXTENSION_UNKNOWN,
184 };
185
186 const char* name;
187 Type type;
188 Extension extension;
189
190 PFN_vkVoidFunction proc;
191 PFN_vkVoidFunction checked_proc; // always nullptr for non-device hooks
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700192};
Adithya Srinivasan01364142019-07-02 15:52:49 -0700193
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700194struct InstanceDriverTable {
195 // clang-format off\n""")
Adithya Srinivasan01364142019-07-02 15:52:49 -0700196
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700197 for cmd in gencom.command_list:
198 if _is_instance_driver_table_entry(cmd):
199 f.write(gencom.indent(1) + 'PFN_' + cmd + ' ' +
200 gencom.base_name(cmd) + ';\n')
Adithya Srinivasan01364142019-07-02 15:52:49 -0700201
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700202 f.write("""\
203 // clang-format on
204};
Adithya Srinivasan01364142019-07-02 15:52:49 -0700205
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700206struct DeviceDriverTable {
207 // clang-format off\n""")
Adithya Srinivasan01364142019-07-02 15:52:49 -0700208
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700209 for cmd in gencom.command_list:
210 if _is_device_driver_table_entry(cmd):
211 f.write(gencom.indent(1) + 'PFN_' + cmd + ' ' +
212 gencom.base_name(cmd) + ';\n')
Adithya Srinivasan01364142019-07-02 15:52:49 -0700213
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700214 f.write("""\
215 // clang-format on
216};
Adithya Srinivasan01364142019-07-02 15:52:49 -0700217
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700218const ProcHook* GetProcHook(const char* name);
Adithya Srinivasan01364142019-07-02 15:52:49 -0700219ProcHook::Extension GetProcHookExtension(const char* name);
220
221bool InitDriverTable(VkInstance instance,
222 PFN_vkGetInstanceProcAddr get_proc,
223 const std::bitset<ProcHook::EXTENSION_COUNT>& extensions);
224bool InitDriverTable(VkDevice dev,
225 PFN_vkGetDeviceProcAddr get_proc,
226 const std::bitset<ProcHook::EXTENSION_COUNT>& extensions);
227
228} // namespace driver
229} // namespace vulkan
230
231#endif // LIBVULKAN_DRIVER_TABLE_H\n""")
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700232
Adithya Srinivasan8dce9d72019-07-11 14:26:04 -0700233 f.close()
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700234 gencom.run_clang_format(genfile)
Adithya Srinivasan01364142019-07-02 15:52:49 -0700235
Adithya Srinivasan01364142019-07-02 15:52:49 -0700236
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700237def _is_intercepted(cmd):
Yiwei Zhang6ca5d0c2019-10-11 17:15:02 -0700238 """Returns true if a function is intercepted by vulkan::driver.
239
240 Args:
241 cmd: Vulkan function name.
242 """
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700243 if gencom.is_function_supported(cmd):
244 if cmd in _INTERCEPTED_COMMANDS:
245 return True
Adithya Srinivasan01364142019-07-02 15:52:49 -0700246
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700247 if cmd in gencom.extension_dict:
248 return gencom.extension_dict[cmd] in _INTERCEPTED_EXTENSIONS
Adithya Srinivasan01364142019-07-02 15:52:49 -0700249 return False
250
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700251
252def _need_proc_hook_stub(cmd):
Yiwei Zhang6ca5d0c2019-10-11 17:15:02 -0700253 """Returns true if a function needs a ProcHook stub.
254
255 Args:
256 cmd: Vulkan function name.
257 """
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700258 if _is_intercepted(cmd) and gencom.is_device_dispatched(cmd):
259 if cmd in gencom.extension_dict:
260 if not gencom.is_extension_internal(gencom.extension_dict[cmd]):
Adithya Srinivasan01364142019-07-02 15:52:49 -0700261 return True
262 return False
263
Adithya Srinivasan01364142019-07-02 15:52:49 -0700264
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700265def _define_proc_hook_stub(cmd, f):
Yiwei Zhang6ca5d0c2019-10-11 17:15:02 -0700266 """Emits a stub for ProcHook::checked_proc.
267
268 Args:
269 cmd: Vulkan function name.
270 f: Output file handle.
271 """
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700272 if _need_proc_hook_stub(cmd):
273 return_type = gencom.return_type_dict[cmd]
274 ext_name = gencom.extension_dict[cmd]
Adithya Srinivasan01364142019-07-02 15:52:49 -0700275 ext_hook = 'ProcHook::' + ext_name[3:]
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700276 handle = gencom.param_dict[cmd][0][1]
277 param_types = ', '.join([''.join(i) for i in gencom.param_dict[cmd]])
278 param_names = ', '.join([''.join(i[1]) for i in gencom.param_dict[cmd]])
Adithya Srinivasan01364142019-07-02 15:52:49 -0700279
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700280 f.write('VKAPI_ATTR ' + return_type + ' checked' + gencom.base_name(cmd) +
281 '(' + param_types + ') {\n')
282 f.write(gencom.indent(1) + 'if (GetData(' + handle + ').hook_extensions[' +
283 ext_hook + ']) {\n')
Adithya Srinivasan01364142019-07-02 15:52:49 -0700284
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700285 f.write(gencom.indent(2))
286 if gencom.return_type_dict[cmd] != 'void':
287 f.write('return ')
288 f.write(gencom.base_name(cmd) + '(' + param_names + ');\n')
289
290 f.write(gencom.indent(1) + '} else {\n')
291 f.write(gencom.indent(2) + 'Logger(' + handle + ').Err(' + handle + ', \"' +
292 ext_name + ' not enabled. ' + cmd + ' not executed.\");\n')
293 if gencom.return_type_dict[cmd] != 'void':
294 f.write(gencom.indent(2) + 'return VK_SUCCESS;\n')
295 f.write(gencom.indent(1) + '}\n}\n\n')
296
297
298def _define_global_proc_hook(cmd, f):
Yiwei Zhang6ca5d0c2019-10-11 17:15:02 -0700299 """Emits definition of a global ProcHook.
300
301 Args:
302 cmd: Vulkan function name.
303 f: Output file handle.
304 """
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700305 assert cmd not in gencom.extension_dict
306
307 f.write(gencom.indent(1) + '{\n')
308 f.write(gencom.indent(2) + '\"' + cmd + '\",\n')
309 f.write("""\
310 ProcHook::GLOBAL,
Adithya Srinivasan01364142019-07-02 15:52:49 -0700311 ProcHook::EXTENSION_CORE,
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700312 reinterpret_cast<PFN_vkVoidFunction>(""" + gencom.base_name(cmd) + """),
Adithya Srinivasan01364142019-07-02 15:52:49 -0700313 nullptr,
314 },\n""")
315
Adithya Srinivasan01364142019-07-02 15:52:49 -0700316
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700317def _define_instance_proc_hook(cmd, f):
Yiwei Zhang6ca5d0c2019-10-11 17:15:02 -0700318 """Emits definition of a instance ProcHook.
319
320 Args:
321 cmd: Vulkan function name.
322 f: Output file handle.
323 """
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700324 f.write(gencom.indent(1) + '{\n')
325 f.write(gencom.indent(2) + '\"' + cmd + '\",\n')
326 f.write(gencom.indent(2) + 'ProcHook::INSTANCE,\n')
327
328 if cmd in gencom.extension_dict:
329 ext_name = gencom.extension_dict[cmd]
330 f.write(gencom.indent(2) + 'ProcHook::' + ext_name[3:] + ',\n')
331
332 if gencom.is_extension_internal(ext_name):
333 f.write("""\
334 nullptr,
335 nullptr,\n""")
Adithya Srinivasan01364142019-07-02 15:52:49 -0700336 else:
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700337 f.write("""\
338 reinterpret_cast<PFN_vkVoidFunction>(""" + gencom.base_name(cmd) + """),
339 nullptr,\n""")
Adithya Srinivasan01364142019-07-02 15:52:49 -0700340 else:
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700341 f.write("""\
342 ProcHook::EXTENSION_CORE,
343 reinterpret_cast<PFN_vkVoidFunction>(""" + gencom.base_name(cmd) + """),
Adithya Srinivasan01364142019-07-02 15:52:49 -0700344 nullptr,\n""")
345
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700346 f.write(gencom.indent(1) + '},\n')
Adithya Srinivasan01364142019-07-02 15:52:49 -0700347
Adithya Srinivasan01364142019-07-02 15:52:49 -0700348
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700349def _define_device_proc_hook(cmd, f):
Yiwei Zhang6ca5d0c2019-10-11 17:15:02 -0700350 """Emits definition of a device ProcHook.
351
352 Args:
353 cmd: Vulkan function name.
354 f: Output file handle.
355 """
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700356 f.write(gencom.indent(1) + '{\n')
357 f.write(gencom.indent(2) + '\"' + cmd + '\",\n')
358 f.write(gencom.indent(2) + 'ProcHook::DEVICE,\n')
359
360 if cmd in gencom.extension_dict:
361 ext_name = gencom.extension_dict[cmd]
362 f.write(gencom.indent(2) + 'ProcHook::' + ext_name[3:] + ',\n')
363
364 if gencom.is_extension_internal(ext_name):
365 f.write("""\
366 nullptr,
367 nullptr,\n""")
Adithya Srinivasan01364142019-07-02 15:52:49 -0700368 else:
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700369 f.write("""\
370 reinterpret_cast<PFN_vkVoidFunction>(""" + gencom.base_name(cmd) + """),
371 reinterpret_cast<PFN_vkVoidFunction>(checked""" +
372 gencom.base_name(cmd) + '),\n')
Adithya Srinivasan01364142019-07-02 15:52:49 -0700373
374 else:
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700375 f.write("""\
376 ProcHook::EXTENSION_CORE,
377 reinterpret_cast<PFN_vkVoidFunction>(""" + gencom.base_name(cmd) + """),
Adithya Srinivasan01364142019-07-02 15:52:49 -0700378 nullptr,\n""")
379
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700380 f.write(gencom.indent(1) + '},\n')
Adithya Srinivasan01364142019-07-02 15:52:49 -0700381
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700382
383def gen_cpp():
Yiwei Zhang6ca5d0c2019-10-11 17:15:02 -0700384 """Generates the driver_gen.cpp file.
385 """
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700386 genfile = os.path.join(os.path.dirname(__file__),
387 '..', 'libvulkan', 'driver_gen.cpp')
388
389 with open(genfile, 'w') as f:
390 f.write(gencom.copyright_and_warning(2016))
391 f.write("""\
392#include <log/log.h>
Adithya Srinivasan01364142019-07-02 15:52:49 -0700393#include <string.h>
394
395#include <algorithm>
396
397#include "driver.h"
398
399namespace vulkan {
400namespace driver {
401
402namespace {
403
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700404// clang-format off\n\n""")
Adithya Srinivasan01364142019-07-02 15:52:49 -0700405
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700406 for cmd in gencom.command_list:
407 _define_proc_hook_stub(cmd, f)
Adithya Srinivasan01364142019-07-02 15:52:49 -0700408
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700409 f.write("""\
410// clang-format on
Adithya Srinivasan01364142019-07-02 15:52:49 -0700411
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700412const ProcHook g_proc_hooks[] = {
413 // clang-format off\n""")
Adithya Srinivasan01364142019-07-02 15:52:49 -0700414
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700415 sorted_command_list = sorted(gencom.command_list)
416 for cmd in sorted_command_list:
417 if _is_intercepted(cmd):
418 if gencom.is_globally_dispatched(cmd):
419 _define_global_proc_hook(cmd, f)
420 elif gencom.is_instance_dispatched(cmd):
421 _define_instance_proc_hook(cmd, f)
422 elif gencom.is_device_dispatched(cmd):
423 _define_device_proc_hook(cmd, f)
Adithya Srinivasan01364142019-07-02 15:52:49 -0700424
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700425 f.write("""\
426 // clang-format on
427};
428
429} // namespace
430
431const ProcHook* GetProcHook(const char* name) {
Adithya Srinivasan01364142019-07-02 15:52:49 -0700432 const auto& begin = g_proc_hooks;
433 const auto& end =
434 g_proc_hooks + sizeof(g_proc_hooks) / sizeof(g_proc_hooks[0]);
435 const auto hook = std::lower_bound(
436 begin, end, name,
437 [](const ProcHook& e, const char* n) { return strcmp(e.name, n) < 0; });
438 return (hook < end && strcmp(hook->name, name) == 0) ? hook : nullptr;
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700439}
Adithya Srinivasan01364142019-07-02 15:52:49 -0700440
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700441ProcHook::Extension GetProcHookExtension(const char* name) {
442 // clang-format off\n""")
Adithya Srinivasan01364142019-07-02 15:52:49 -0700443
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700444 for exts in _KNOWN_EXTENSIONS:
445 f.write(gencom.indent(1) + 'if (strcmp(name, \"' + exts +
446 '\") == 0) return ProcHook::' + exts[3:] + ';\n')
Adithya Srinivasan01364142019-07-02 15:52:49 -0700447
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700448 f.write("""\
449 // clang-format on
450 return ProcHook::EXTENSION_UNKNOWN;
451}
452
453#define UNLIKELY(expr) __builtin_expect((expr), 0)
454
455#define INIT_PROC(required, obj, proc) \\
456 do { \\
457 data.driver.proc = \\
458 reinterpret_cast<PFN_vk##proc>(get_proc(obj, "vk" #proc)); \\
459 if (UNLIKELY(required && !data.driver.proc)) { \\
460 ALOGE("missing " #obj " proc: vk" #proc); \\
461 success = false; \\
462 } \\
463 } while (0)
464
465#define INIT_PROC_EXT(ext, required, obj, proc) \\
466 do { \\
467 if (extensions[ProcHook::ext]) \\
468 INIT_PROC(required, obj, proc); \\
469 } while (0)
470
471bool InitDriverTable(VkInstance instance,
Adithya Srinivasan01364142019-07-02 15:52:49 -0700472 PFN_vkGetInstanceProcAddr get_proc,
473 const std::bitset<ProcHook::EXTENSION_COUNT>& extensions) {
474 auto& data = GetData(instance);
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700475 bool success = true;
Adithya Srinivasan01364142019-07-02 15:52:49 -0700476
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700477 // clang-format off\n""")
478
479 for cmd in gencom.command_list:
480 if _is_instance_driver_table_entry(cmd):
481 gencom.init_proc(cmd, f)
482
483 f.write("""\
484 // clang-format on
485
486 return success;
487}
488
489bool InitDriverTable(VkDevice dev,
Adithya Srinivasan01364142019-07-02 15:52:49 -0700490 PFN_vkGetDeviceProcAddr get_proc,
491 const std::bitset<ProcHook::EXTENSION_COUNT>& extensions) {
492 auto& data = GetData(dev);
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700493 bool success = true;
494
495 // clang-format off\n""")
496
497 for cmd in gencom.command_list:
498 if _is_device_driver_table_entry(cmd):
499 gencom.init_proc(cmd, f)
500
501 f.write("""\
502 // clang-format on
503
504 return success;
505}
506
507} // namespace driver
508} // namespace vulkan\n""")
509
Adithya Srinivasan8dce9d72019-07-11 14:26:04 -0700510 f.close()
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700511 gencom.run_clang_format(genfile)