blob: 0f3d760d5fe40f7cf6eb8f89ff5d0b22851d8dfb [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
Yiwei Zhang5365a7b2019-10-11 17:26:44 -0700177 for ext in _KNOWN_EXTENSIONS:
178 f.write(gencom.indent(2) + gencom.base_ext_name(ext) + ',\n')
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700179
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]
Yiwei Zhangaeaa8672019-10-16 18:59:41 -0700275 ext_hook = 'ProcHook::' + gencom.base_ext_name(ext_name)
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]
Yiwei Zhangaeaa8672019-10-16 18:59:41 -0700330 f.write(gencom.indent(2) + 'ProcHook::' +
331 gencom.base_ext_name(ext_name) + ',\n')
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700332
333 if gencom.is_extension_internal(ext_name):
334 f.write("""\
335 nullptr,
336 nullptr,\n""")
Adithya Srinivasan01364142019-07-02 15:52:49 -0700337 else:
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700338 f.write("""\
339 reinterpret_cast<PFN_vkVoidFunction>(""" + gencom.base_name(cmd) + """),
340 nullptr,\n""")
Adithya Srinivasan01364142019-07-02 15:52:49 -0700341 else:
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700342 f.write("""\
343 ProcHook::EXTENSION_CORE,
344 reinterpret_cast<PFN_vkVoidFunction>(""" + gencom.base_name(cmd) + """),
Adithya Srinivasan01364142019-07-02 15:52:49 -0700345 nullptr,\n""")
346
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700347 f.write(gencom.indent(1) + '},\n')
Adithya Srinivasan01364142019-07-02 15:52:49 -0700348
Adithya Srinivasan01364142019-07-02 15:52:49 -0700349
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700350def _define_device_proc_hook(cmd, f):
Yiwei Zhang6ca5d0c2019-10-11 17:15:02 -0700351 """Emits definition of a device ProcHook.
352
353 Args:
354 cmd: Vulkan function name.
355 f: Output file handle.
356 """
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700357 f.write(gencom.indent(1) + '{\n')
358 f.write(gencom.indent(2) + '\"' + cmd + '\",\n')
359 f.write(gencom.indent(2) + 'ProcHook::DEVICE,\n')
360
361 if cmd in gencom.extension_dict:
362 ext_name = gencom.extension_dict[cmd]
Yiwei Zhangaeaa8672019-10-16 18:59:41 -0700363 f.write(gencom.indent(2) + 'ProcHook::' +
364 gencom.base_ext_name(ext_name) + ',\n')
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700365
366 if gencom.is_extension_internal(ext_name):
367 f.write("""\
368 nullptr,
369 nullptr,\n""")
Adithya Srinivasan01364142019-07-02 15:52:49 -0700370 else:
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700371 f.write("""\
372 reinterpret_cast<PFN_vkVoidFunction>(""" + gencom.base_name(cmd) + """),
373 reinterpret_cast<PFN_vkVoidFunction>(checked""" +
374 gencom.base_name(cmd) + '),\n')
Adithya Srinivasan01364142019-07-02 15:52:49 -0700375
376 else:
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700377 f.write("""\
378 ProcHook::EXTENSION_CORE,
379 reinterpret_cast<PFN_vkVoidFunction>(""" + gencom.base_name(cmd) + """),
Adithya Srinivasan01364142019-07-02 15:52:49 -0700380 nullptr,\n""")
381
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700382 f.write(gencom.indent(1) + '},\n')
Adithya Srinivasan01364142019-07-02 15:52:49 -0700383
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700384
385def gen_cpp():
Yiwei Zhang6ca5d0c2019-10-11 17:15:02 -0700386 """Generates the driver_gen.cpp file.
387 """
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700388 genfile = os.path.join(os.path.dirname(__file__),
389 '..', 'libvulkan', 'driver_gen.cpp')
390
391 with open(genfile, 'w') as f:
392 f.write(gencom.copyright_and_warning(2016))
393 f.write("""\
394#include <log/log.h>
Adithya Srinivasan01364142019-07-02 15:52:49 -0700395#include <string.h>
396
397#include <algorithm>
398
399#include "driver.h"
400
401namespace vulkan {
402namespace driver {
403
404namespace {
405
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700406// clang-format off\n\n""")
Adithya Srinivasan01364142019-07-02 15:52:49 -0700407
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700408 for cmd in gencom.command_list:
409 _define_proc_hook_stub(cmd, f)
Adithya Srinivasan01364142019-07-02 15:52:49 -0700410
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700411 f.write("""\
412// clang-format on
Adithya Srinivasan01364142019-07-02 15:52:49 -0700413
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700414const ProcHook g_proc_hooks[] = {
415 // clang-format off\n""")
Adithya Srinivasan01364142019-07-02 15:52:49 -0700416
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700417 sorted_command_list = sorted(gencom.command_list)
418 for cmd in sorted_command_list:
419 if _is_intercepted(cmd):
420 if gencom.is_globally_dispatched(cmd):
421 _define_global_proc_hook(cmd, f)
422 elif gencom.is_instance_dispatched(cmd):
423 _define_instance_proc_hook(cmd, f)
424 elif gencom.is_device_dispatched(cmd):
425 _define_device_proc_hook(cmd, f)
Adithya Srinivasan01364142019-07-02 15:52:49 -0700426
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700427 f.write("""\
428 // clang-format on
429};
430
431} // namespace
432
433const ProcHook* GetProcHook(const char* name) {
Adithya Srinivasan01364142019-07-02 15:52:49 -0700434 const auto& begin = g_proc_hooks;
435 const auto& end =
436 g_proc_hooks + sizeof(g_proc_hooks) / sizeof(g_proc_hooks[0]);
437 const auto hook = std::lower_bound(
438 begin, end, name,
439 [](const ProcHook& e, const char* n) { return strcmp(e.name, n) < 0; });
440 return (hook < end && strcmp(hook->name, name) == 0) ? hook : nullptr;
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700441}
Adithya Srinivasan01364142019-07-02 15:52:49 -0700442
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700443ProcHook::Extension GetProcHookExtension(const char* name) {
444 // clang-format off\n""")
Adithya Srinivasan01364142019-07-02 15:52:49 -0700445
Yiwei Zhang5365a7b2019-10-11 17:26:44 -0700446 for ext in _KNOWN_EXTENSIONS:
447 f.write(gencom.indent(1) + 'if (strcmp(name, \"' + ext +
448 '\") == 0) return ProcHook::' + gencom.base_ext_name(ext) + ';\n')
Adithya Srinivasan01364142019-07-02 15:52:49 -0700449
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700450 f.write("""\
451 // clang-format on
452 return ProcHook::EXTENSION_UNKNOWN;
453}
454
455#define UNLIKELY(expr) __builtin_expect((expr), 0)
456
457#define INIT_PROC(required, obj, proc) \\
458 do { \\
459 data.driver.proc = \\
460 reinterpret_cast<PFN_vk##proc>(get_proc(obj, "vk" #proc)); \\
461 if (UNLIKELY(required && !data.driver.proc)) { \\
462 ALOGE("missing " #obj " proc: vk" #proc); \\
463 success = false; \\
464 } \\
465 } while (0)
466
467#define INIT_PROC_EXT(ext, required, obj, proc) \\
468 do { \\
469 if (extensions[ProcHook::ext]) \\
470 INIT_PROC(required, obj, proc); \\
471 } while (0)
472
473bool InitDriverTable(VkInstance instance,
Adithya Srinivasan01364142019-07-02 15:52:49 -0700474 PFN_vkGetInstanceProcAddr get_proc,
475 const std::bitset<ProcHook::EXTENSION_COUNT>& extensions) {
476 auto& data = GetData(instance);
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700477 bool success = true;
Adithya Srinivasan01364142019-07-02 15:52:49 -0700478
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700479 // clang-format off\n""")
480
481 for cmd in gencom.command_list:
482 if _is_instance_driver_table_entry(cmd):
483 gencom.init_proc(cmd, f)
484
485 f.write("""\
486 // clang-format on
487
488 return success;
489}
490
491bool InitDriverTable(VkDevice dev,
Adithya Srinivasan01364142019-07-02 15:52:49 -0700492 PFN_vkGetDeviceProcAddr get_proc,
493 const std::bitset<ProcHook::EXTENSION_COUNT>& extensions) {
494 auto& data = GetData(dev);
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700495 bool success = true;
496
497 // clang-format off\n""")
498
499 for cmd in gencom.command_list:
500 if _is_device_driver_table_entry(cmd):
501 gencom.init_proc(cmd, f)
502
503 f.write("""\
504 // clang-format on
505
506 return success;
507}
508
509} // namespace driver
510} // namespace vulkan\n""")
511
Adithya Srinivasan8dce9d72019-07-11 14:26:04 -0700512 f.close()
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700513 gencom.run_clang_format(genfile)