blob: cf1b6cfaba8c975e52e3b546074cde2da3b061ee [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',
Yiwei Zhange4f64172020-07-05 15:17:32 -070043 'VK_KHR_device_group_creation',
Adithya Srinivasan01364142019-07-02 15:52:49 -070044]
45
Yiwei Zhang6ca5d0c2019-10-11 17:15:02 -070046# Functions needed at vulkan::driver level.
Yiwei Zhang1ca59c12019-10-10 12:54:42 -070047_NEEDED_COMMANDS = [
48 # Create functions of dispatchable objects
49 'vkCreateDevice',
50 'vkGetDeviceQueue',
51 'vkGetDeviceQueue2',
52 'vkAllocateCommandBuffers',
53
54 # Destroy functions of dispatchable objects
55 'vkDestroyInstance',
56 'vkDestroyDevice',
57
58 # Enumeration of extensions
59 'vkEnumerateDeviceExtensionProperties',
60
61 # We cache physical devices in loader.cpp
62 'vkEnumeratePhysicalDevices',
63 'vkEnumeratePhysicalDeviceGroups',
64
65 'vkGetInstanceProcAddr',
66 'vkGetDeviceProcAddr',
67
68 'vkQueueSubmit',
69
70 # VK_KHR_swapchain->VK_ANDROID_native_buffer translation
71 'vkCreateImage',
72 'vkDestroyImage',
73
74 'vkGetPhysicalDeviceProperties',
Yiwei Zhang1ca59c12019-10-10 12:54:42 -070075
76 # VK_KHR_swapchain v69 requirement
77 'vkBindImageMemory2',
78 'vkBindImageMemory2KHR',
Yiwei Zhange4f64172020-07-05 15:17:32 -070079
80 # For promoted VK_KHR_device_group_creation
81 'vkEnumeratePhysicalDeviceGroupsKHR',
Yiwei Zhanga55624b2020-07-05 16:05:26 -070082
83 # For promoted VK_KHR_get_physical_device_properties2
84 'vkGetPhysicalDeviceFeatures2',
85 'vkGetPhysicalDeviceFeatures2KHR',
86 'vkGetPhysicalDeviceProperties2',
87 'vkGetPhysicalDeviceProperties2KHR',
88 'vkGetPhysicalDeviceFormatProperties2',
89 'vkGetPhysicalDeviceFormatProperties2KHR',
90 'vkGetPhysicalDeviceImageFormatProperties2',
91 'vkGetPhysicalDeviceImageFormatProperties2KHR',
92 'vkGetPhysicalDeviceQueueFamilyProperties2',
93 'vkGetPhysicalDeviceQueueFamilyProperties2KHR',
94 'vkGetPhysicalDeviceMemoryProperties2',
95 'vkGetPhysicalDeviceMemoryProperties2KHR',
96 'vkGetPhysicalDeviceSparseImageFormatProperties2',
97 'vkGetPhysicalDeviceSparseImageFormatProperties2KHR',
Yiwei Zhang1ca59c12019-10-10 12:54:42 -070098]
99
Yiwei Zhang6ca5d0c2019-10-11 17:15:02 -0700100# Functions intercepted at vulkan::driver level.
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700101_INTERCEPTED_COMMANDS = [
102 # Create functions of dispatchable objects
103 'vkCreateInstance',
104 'vkCreateDevice',
105 'vkEnumeratePhysicalDevices',
106 'vkEnumeratePhysicalDeviceGroups',
107 'vkGetDeviceQueue',
108 'vkGetDeviceQueue2',
109 'vkAllocateCommandBuffers',
110
111 # Destroy functions of dispatchable objects
112 'vkDestroyInstance',
113 'vkDestroyDevice',
114
115 # Enumeration of extensions
116 'vkEnumerateInstanceExtensionProperties',
117 'vkEnumerateDeviceExtensionProperties',
118
119 'vkGetInstanceProcAddr',
120 'vkGetDeviceProcAddr',
121
122 'vkQueueSubmit',
123
124 # VK_KHR_swapchain v69 requirement
125 'vkBindImageMemory2',
126 'vkBindImageMemory2KHR',
Yiwei Zhanga55624b2020-07-05 16:05:26 -0700127
128 # For promoted VK_KHR_get_physical_device_properties2
129 'vkGetPhysicalDeviceFeatures2',
130 'vkGetPhysicalDeviceProperties2',
131 'vkGetPhysicalDeviceFormatProperties2',
132 'vkGetPhysicalDeviceImageFormatProperties2',
133 'vkGetPhysicalDeviceQueueFamilyProperties2',
134 'vkGetPhysicalDeviceMemoryProperties2',
135 'vkGetPhysicalDeviceSparseImageFormatProperties2',
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700136]
137
138
139def _is_driver_table_entry(cmd):
Yiwei Zhang6ca5d0c2019-10-11 17:15:02 -0700140 """Returns true if a function is needed by vulkan::driver.
141
142 Args:
143 cmd: Vulkan function name.
144 """
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700145 if gencom.is_function_supported(cmd):
146 if cmd in _NEEDED_COMMANDS:
147 return True
148 if cmd in gencom.extension_dict:
149 if (gencom.extension_dict[cmd] == 'VK_ANDROID_native_buffer' or
150 gencom.extension_dict[cmd] == 'VK_EXT_debug_report'):
151 return True
152 return False
153
154
155def _is_instance_driver_table_entry(cmd):
Yiwei Zhang6ca5d0c2019-10-11 17:15:02 -0700156 """Returns true if a instance-dispatched function is needed by vulkan::driver.
157
158 Args:
159 cmd: Vulkan function name.
160 """
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700161 return (_is_driver_table_entry(cmd) and
162 gencom.is_instance_dispatched(cmd))
163
164
165def _is_device_driver_table_entry(cmd):
Yiwei Zhang6ca5d0c2019-10-11 17:15:02 -0700166 """Returns true if a device-dispatched function is needed by vulkan::driver.
167
168 Args:
169 cmd: Vulkan function name.
170 """
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700171 return (_is_driver_table_entry(cmd) and
172 gencom.is_device_dispatched(cmd))
173
174
175def gen_h():
Yiwei Zhang6ca5d0c2019-10-11 17:15:02 -0700176 """Generates the driver_gen.h file.
177 """
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700178 genfile = os.path.join(os.path.dirname(__file__),
179 '..', 'libvulkan', 'driver_gen.h')
180
181 with open(genfile, 'w') as f:
182 f.write(gencom.copyright_and_warning(2016))
183
184 f.write("""\
185#ifndef LIBVULKAN_DRIVER_GEN_H
186#define LIBVULKAN_DRIVER_GEN_H
187
188#include <vulkan/vk_android_native_buffer.h>
189#include <vulkan/vulkan.h>
190
191#include <bitset>
Yiwei Zhang7c0c07c2020-07-04 23:49:47 -0700192#include <optional>
193#include <vector>
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700194
195namespace vulkan {
196namespace driver {
197
198struct ProcHook {
Adithya Srinivasan01364142019-07-02 15:52:49 -0700199 enum Type {
200 GLOBAL,
201 INSTANCE,
202 DEVICE,
203 };
204 enum Extension {\n""")
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700205
Yiwei Zhang5365a7b2019-10-11 17:26:44 -0700206 for ext in _KNOWN_EXTENSIONS:
207 f.write(gencom.indent(2) + gencom.base_ext_name(ext) + ',\n')
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700208
Yiwei Zhang7cc36a52019-10-11 19:02:09 -0700209 f.write('\n')
210 for version in gencom.version_code_list:
211 f.write(gencom.indent(2) + 'EXTENSION_CORE_' + version + ',\n')
212
213 # EXTENSION_COUNT must be the next enum after the highest API version.
214 f.write("""\
Adithya Srinivasan01364142019-07-02 15:52:49 -0700215 EXTENSION_COUNT,
216 EXTENSION_UNKNOWN,
217 };
218
219 const char* name;
220 Type type;
221 Extension extension;
222
223 PFN_vkVoidFunction proc;
224 PFN_vkVoidFunction checked_proc; // always nullptr for non-device hooks
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700225};
Adithya Srinivasan01364142019-07-02 15:52:49 -0700226
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700227struct InstanceDriverTable {
228 // clang-format off\n""")
Adithya Srinivasan01364142019-07-02 15:52:49 -0700229
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700230 for cmd in gencom.command_list:
231 if _is_instance_driver_table_entry(cmd):
232 f.write(gencom.indent(1) + 'PFN_' + cmd + ' ' +
233 gencom.base_name(cmd) + ';\n')
Adithya Srinivasan01364142019-07-02 15:52:49 -0700234
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700235 f.write("""\
236 // clang-format on
237};
Adithya Srinivasan01364142019-07-02 15:52:49 -0700238
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700239struct DeviceDriverTable {
240 // clang-format off\n""")
Adithya Srinivasan01364142019-07-02 15:52:49 -0700241
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700242 for cmd in gencom.command_list:
243 if _is_device_driver_table_entry(cmd):
244 f.write(gencom.indent(1) + 'PFN_' + cmd + ' ' +
245 gencom.base_name(cmd) + ';\n')
Adithya Srinivasan01364142019-07-02 15:52:49 -0700246
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700247 f.write("""\
248 // clang-format on
249};
Adithya Srinivasan01364142019-07-02 15:52:49 -0700250
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700251const ProcHook* GetProcHook(const char* name);
Adithya Srinivasan01364142019-07-02 15:52:49 -0700252ProcHook::Extension GetProcHookExtension(const char* name);
253
254bool InitDriverTable(VkInstance instance,
255 PFN_vkGetInstanceProcAddr get_proc,
256 const std::bitset<ProcHook::EXTENSION_COUNT>& extensions);
257bool InitDriverTable(VkDevice dev,
258 PFN_vkGetDeviceProcAddr get_proc,
259 const std::bitset<ProcHook::EXTENSION_COUNT>& extensions);
260
Yiwei Zhang7c0c07c2020-07-04 23:49:47 -0700261std::optional<uint32_t> GetInstanceExtensionPromotedVersion(const char* name);
262uint32_t CountPromotedInstanceExtensions(uint32_t begin_version,
263 uint32_t end_version);
264std::vector<const char*> GetPromotedInstanceExtensions(uint32_t begin_version,
265 uint32_t end_version);
266
Adithya Srinivasan01364142019-07-02 15:52:49 -0700267} // namespace driver
268} // namespace vulkan
269
270#endif // LIBVULKAN_DRIVER_TABLE_H\n""")
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700271
Adithya Srinivasan8dce9d72019-07-11 14:26:04 -0700272 f.close()
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700273 gencom.run_clang_format(genfile)
Adithya Srinivasan01364142019-07-02 15:52:49 -0700274
Adithya Srinivasan01364142019-07-02 15:52:49 -0700275
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700276def _is_intercepted(cmd):
Yiwei Zhang6ca5d0c2019-10-11 17:15:02 -0700277 """Returns true if a function is intercepted by vulkan::driver.
278
279 Args:
280 cmd: Vulkan function name.
281 """
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700282 if gencom.is_function_supported(cmd):
283 if cmd in _INTERCEPTED_COMMANDS:
284 return True
Adithya Srinivasan01364142019-07-02 15:52:49 -0700285
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700286 if cmd in gencom.extension_dict:
287 return gencom.extension_dict[cmd] in _INTERCEPTED_EXTENSIONS
Adithya Srinivasan01364142019-07-02 15:52:49 -0700288 return False
289
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700290
Yiwei Zhang7cc36a52019-10-11 19:02:09 -0700291def _get_proc_hook_enum(cmd):
292 """Returns the ProcHook enumeration for the corresponding core function.
293
294 Args:
295 cmd: Vulkan function name.
296 """
297 assert cmd in gencom.version_dict
298 for version in gencom.version_code_list:
299 if gencom.version_dict[cmd] == 'VK_VERSION_' + version:
300 return 'ProcHook::EXTENSION_CORE_' + version
301
302
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700303def _need_proc_hook_stub(cmd):
Yiwei Zhang6ca5d0c2019-10-11 17:15:02 -0700304 """Returns true if a function needs a ProcHook stub.
305
306 Args:
307 cmd: Vulkan function name.
308 """
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700309 if _is_intercepted(cmd) and gencom.is_device_dispatched(cmd):
310 if cmd in gencom.extension_dict:
311 if not gencom.is_extension_internal(gencom.extension_dict[cmd]):
Adithya Srinivasan01364142019-07-02 15:52:49 -0700312 return True
Yiwei Zhang7cc36a52019-10-11 19:02:09 -0700313 elif gencom.version_dict[cmd] != 'VK_VERSION_1_0':
314 return True
Adithya Srinivasan01364142019-07-02 15:52:49 -0700315 return False
316
Adithya Srinivasan01364142019-07-02 15:52:49 -0700317
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700318def _define_proc_hook_stub(cmd, f):
Yiwei Zhang6ca5d0c2019-10-11 17:15:02 -0700319 """Emits a stub for ProcHook::checked_proc.
320
321 Args:
322 cmd: Vulkan function name.
323 f: Output file handle.
324 """
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700325 if _need_proc_hook_stub(cmd):
326 return_type = gencom.return_type_dict[cmd]
Yiwei Zhang7cc36a52019-10-11 19:02:09 -0700327
328 ext_name = ''
329 ext_hook = ''
330 if cmd in gencom.extension_dict:
331 ext_name = gencom.extension_dict[cmd]
332 ext_hook = 'ProcHook::' + gencom.base_ext_name(ext_name)
333 else:
334 ext_name = gencom.version_dict[cmd]
335 ext_hook = _get_proc_hook_enum(cmd)
336
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700337 handle = gencom.param_dict[cmd][0][1]
338 param_types = ', '.join([''.join(i) for i in gencom.param_dict[cmd]])
339 param_names = ', '.join([''.join(i[1]) for i in gencom.param_dict[cmd]])
Adithya Srinivasan01364142019-07-02 15:52:49 -0700340
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700341 f.write('VKAPI_ATTR ' + return_type + ' checked' + gencom.base_name(cmd) +
342 '(' + param_types + ') {\n')
343 f.write(gencom.indent(1) + 'if (GetData(' + handle + ').hook_extensions[' +
344 ext_hook + ']) {\n')
Adithya Srinivasan01364142019-07-02 15:52:49 -0700345
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700346 f.write(gencom.indent(2))
347 if gencom.return_type_dict[cmd] != 'void':
348 f.write('return ')
349 f.write(gencom.base_name(cmd) + '(' + param_names + ');\n')
350
351 f.write(gencom.indent(1) + '} else {\n')
352 f.write(gencom.indent(2) + 'Logger(' + handle + ').Err(' + handle + ', \"' +
353 ext_name + ' not enabled. ' + cmd + ' not executed.\");\n')
354 if gencom.return_type_dict[cmd] != 'void':
355 f.write(gencom.indent(2) + 'return VK_SUCCESS;\n')
356 f.write(gencom.indent(1) + '}\n}\n\n')
357
358
359def _define_global_proc_hook(cmd, f):
Yiwei Zhang6ca5d0c2019-10-11 17:15:02 -0700360 """Emits definition of a global ProcHook.
361
362 Args:
363 cmd: Vulkan function name.
364 f: Output file handle.
365 """
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700366 assert cmd not in gencom.extension_dict
367
368 f.write(gencom.indent(1) + '{\n')
369 f.write(gencom.indent(2) + '\"' + cmd + '\",\n')
Yiwei Zhang7cc36a52019-10-11 19:02:09 -0700370 f.write(gencom.indent(2) + 'ProcHook::GLOBAL,\n')
371 f.write(gencom.indent(2) + _get_proc_hook_enum(cmd) + ',\n')
372 f.write(gencom.indent(2) + 'reinterpret_cast<PFN_vkVoidFunction>(' +
373 gencom.base_name(cmd) + '),\n')
374 f.write(gencom.indent(2) + 'nullptr,\n')
375 f.write(gencom.indent(1) + '},\n')
Adithya Srinivasan01364142019-07-02 15:52:49 -0700376
Adithya Srinivasan01364142019-07-02 15:52:49 -0700377
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700378def _define_instance_proc_hook(cmd, f):
Yiwei Zhang6ca5d0c2019-10-11 17:15:02 -0700379 """Emits definition of a instance ProcHook.
380
381 Args:
382 cmd: Vulkan function name.
383 f: Output file handle.
384 """
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700385 f.write(gencom.indent(1) + '{\n')
386 f.write(gencom.indent(2) + '\"' + cmd + '\",\n')
387 f.write(gencom.indent(2) + 'ProcHook::INSTANCE,\n')
388
389 if cmd in gencom.extension_dict:
390 ext_name = gencom.extension_dict[cmd]
Yiwei Zhangaeaa8672019-10-16 18:59:41 -0700391 f.write(gencom.indent(2) + 'ProcHook::' +
392 gencom.base_ext_name(ext_name) + ',\n')
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700393
394 if gencom.is_extension_internal(ext_name):
395 f.write("""\
396 nullptr,
397 nullptr,\n""")
Adithya Srinivasan01364142019-07-02 15:52:49 -0700398 else:
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700399 f.write("""\
400 reinterpret_cast<PFN_vkVoidFunction>(""" + gencom.base_name(cmd) + """),
401 nullptr,\n""")
Adithya Srinivasan01364142019-07-02 15:52:49 -0700402 else:
Yiwei Zhang7cc36a52019-10-11 19:02:09 -0700403 f.write(gencom.indent(2) + _get_proc_hook_enum(cmd) + ',\n')
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700404 f.write("""\
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700405 reinterpret_cast<PFN_vkVoidFunction>(""" + gencom.base_name(cmd) + """),
Adithya Srinivasan01364142019-07-02 15:52:49 -0700406 nullptr,\n""")
407
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700408 f.write(gencom.indent(1) + '},\n')
Adithya Srinivasan01364142019-07-02 15:52:49 -0700409
Adithya Srinivasan01364142019-07-02 15:52:49 -0700410
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700411def _define_device_proc_hook(cmd, f):
Yiwei Zhang6ca5d0c2019-10-11 17:15:02 -0700412 """Emits definition of a device ProcHook.
413
414 Args:
415 cmd: Vulkan function name.
416 f: Output file handle.
417 """
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700418 f.write(gencom.indent(1) + '{\n')
419 f.write(gencom.indent(2) + '\"' + cmd + '\",\n')
420 f.write(gencom.indent(2) + 'ProcHook::DEVICE,\n')
421
Yiwei Zhang7cc36a52019-10-11 19:02:09 -0700422 if (cmd in gencom.extension_dict or
423 gencom.version_dict[cmd] != 'VK_VERSION_1_0'):
424 ext_name = ''
425 ext_hook = ''
426 if cmd in gencom.extension_dict:
427 ext_name = gencom.extension_dict[cmd]
428 ext_hook = 'ProcHook::' + gencom.base_ext_name(ext_name)
429 else:
430 ext_name = gencom.version_dict[cmd]
431 ext_hook = _get_proc_hook_enum(cmd)
432 f.write(gencom.indent(2) + ext_hook + ',\n')
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700433
434 if gencom.is_extension_internal(ext_name):
435 f.write("""\
436 nullptr,
437 nullptr,\n""")
Adithya Srinivasan01364142019-07-02 15:52:49 -0700438 else:
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700439 f.write("""\
440 reinterpret_cast<PFN_vkVoidFunction>(""" + gencom.base_name(cmd) + """),
441 reinterpret_cast<PFN_vkVoidFunction>(checked""" +
442 gencom.base_name(cmd) + '),\n')
Adithya Srinivasan01364142019-07-02 15:52:49 -0700443
444 else:
Yiwei Zhang7cc36a52019-10-11 19:02:09 -0700445 f.write(gencom.indent(2) + _get_proc_hook_enum(cmd) + ',\n')
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700446 f.write("""\
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700447 reinterpret_cast<PFN_vkVoidFunction>(""" + gencom.base_name(cmd) + """),
Adithya Srinivasan01364142019-07-02 15:52:49 -0700448 nullptr,\n""")
449
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700450 f.write(gencom.indent(1) + '},\n')
Adithya Srinivasan01364142019-07-02 15:52:49 -0700451
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700452
453def gen_cpp():
Yiwei Zhang6ca5d0c2019-10-11 17:15:02 -0700454 """Generates the driver_gen.cpp file.
455 """
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700456 genfile = os.path.join(os.path.dirname(__file__),
457 '..', 'libvulkan', 'driver_gen.cpp')
458
459 with open(genfile, 'w') as f:
460 f.write(gencom.copyright_and_warning(2016))
461 f.write("""\
462#include <log/log.h>
Adithya Srinivasan01364142019-07-02 15:52:49 -0700463#include <string.h>
464
465#include <algorithm>
466
467#include "driver.h"
468
469namespace vulkan {
470namespace driver {
471
472namespace {
473
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700474// clang-format off\n\n""")
Adithya Srinivasan01364142019-07-02 15:52:49 -0700475
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700476 for cmd in gencom.command_list:
477 _define_proc_hook_stub(cmd, f)
Adithya Srinivasan01364142019-07-02 15:52:49 -0700478
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700479 f.write("""\
480// clang-format on
Adithya Srinivasan01364142019-07-02 15:52:49 -0700481
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700482const ProcHook g_proc_hooks[] = {
483 // clang-format off\n""")
Adithya Srinivasan01364142019-07-02 15:52:49 -0700484
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700485 sorted_command_list = sorted(gencom.command_list)
486 for cmd in sorted_command_list:
487 if _is_intercepted(cmd):
488 if gencom.is_globally_dispatched(cmd):
489 _define_global_proc_hook(cmd, f)
490 elif gencom.is_instance_dispatched(cmd):
491 _define_instance_proc_hook(cmd, f)
492 elif gencom.is_device_dispatched(cmd):
493 _define_device_proc_hook(cmd, f)
Adithya Srinivasan01364142019-07-02 15:52:49 -0700494
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700495 f.write("""\
496 // clang-format on
497};
498
499} // namespace
500
501const ProcHook* GetProcHook(const char* name) {
Adithya Srinivasan01364142019-07-02 15:52:49 -0700502 const auto& begin = g_proc_hooks;
503 const auto& end =
504 g_proc_hooks + sizeof(g_proc_hooks) / sizeof(g_proc_hooks[0]);
505 const auto hook = std::lower_bound(
506 begin, end, name,
507 [](const ProcHook& e, const char* n) { return strcmp(e.name, n) < 0; });
508 return (hook < end && strcmp(hook->name, name) == 0) ? hook : nullptr;
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700509}
Adithya Srinivasan01364142019-07-02 15:52:49 -0700510
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700511ProcHook::Extension GetProcHookExtension(const char* name) {
512 // clang-format off\n""")
Adithya Srinivasan01364142019-07-02 15:52:49 -0700513
Yiwei Zhang5365a7b2019-10-11 17:26:44 -0700514 for ext in _KNOWN_EXTENSIONS:
515 f.write(gencom.indent(1) + 'if (strcmp(name, \"' + ext +
516 '\") == 0) return ProcHook::' + gencom.base_ext_name(ext) + ';\n')
Adithya Srinivasan01364142019-07-02 15:52:49 -0700517
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700518 f.write("""\
519 // clang-format on
520 return ProcHook::EXTENSION_UNKNOWN;
521}
522
523#define UNLIKELY(expr) __builtin_expect((expr), 0)
524
525#define INIT_PROC(required, obj, proc) \\
526 do { \\
527 data.driver.proc = \\
528 reinterpret_cast<PFN_vk##proc>(get_proc(obj, "vk" #proc)); \\
529 if (UNLIKELY(required && !data.driver.proc)) { \\
530 ALOGE("missing " #obj " proc: vk" #proc); \\
531 success = false; \\
532 } \\
533 } while (0)
534
535#define INIT_PROC_EXT(ext, required, obj, proc) \\
536 do { \\
537 if (extensions[ProcHook::ext]) \\
538 INIT_PROC(required, obj, proc); \\
539 } while (0)
540
541bool InitDriverTable(VkInstance instance,
Adithya Srinivasan01364142019-07-02 15:52:49 -0700542 PFN_vkGetInstanceProcAddr get_proc,
543 const std::bitset<ProcHook::EXTENSION_COUNT>& extensions) {
544 auto& data = GetData(instance);
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700545 bool success = true;
Adithya Srinivasan01364142019-07-02 15:52:49 -0700546
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700547 // clang-format off\n""")
548
549 for cmd in gencom.command_list:
550 if _is_instance_driver_table_entry(cmd):
551 gencom.init_proc(cmd, f)
552
553 f.write("""\
554 // clang-format on
555
556 return success;
557}
558
559bool InitDriverTable(VkDevice dev,
Adithya Srinivasan01364142019-07-02 15:52:49 -0700560 PFN_vkGetDeviceProcAddr get_proc,
561 const std::bitset<ProcHook::EXTENSION_COUNT>& extensions) {
562 auto& data = GetData(dev);
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700563 bool success = true;
564
565 // clang-format off\n""")
566
567 for cmd in gencom.command_list:
568 if _is_device_driver_table_entry(cmd):
569 gencom.init_proc(cmd, f)
570
571 f.write("""\
572 // clang-format on
573
574 return success;
575}
576
Yiwei Zhang7c0c07c2020-07-04 23:49:47 -0700577const std::pair<const char*, uint32_t> g_promoted_instance_extensions[] = {
578 // clang-format off\n""")
579
580 for key, value in sorted(gencom.promoted_inst_ext_dict.items()):
581 f.write(gencom.indent(1) + 'std::make_pair("' + key + '", ' + value + '),\n')
582
583 f.write("""\
584 // clang-format on
585};
586
587std::optional<uint32_t> GetInstanceExtensionPromotedVersion(const char* name) {
588 auto begin = std::cbegin(g_promoted_instance_extensions);
589 auto end = std::cend(g_promoted_instance_extensions);
590 auto iter =
591 std::lower_bound(begin, end, name,
592 [](const std::pair<const char*, uint32_t>& e,
593 const char* n) { return strcmp(e.first, n) < 0; });
594 return (iter < end && strcmp(iter->first, name) == 0)
595 ? std::optional<uint32_t>(iter->second)
596 : std::nullopt;
597}
598
599uint32_t CountPromotedInstanceExtensions(uint32_t begin_version,
600 uint32_t end_version) {
601 auto begin = std::cbegin(g_promoted_instance_extensions);
602 auto end = std::cend(g_promoted_instance_extensions);
603 uint32_t count = 0;
604
605 for (auto iter = begin; iter != end; iter++)
606 if (iter->second > begin_version && iter->second <= end_version)
607 count++;
608
609 return count;
610}
611
612std::vector<const char*> GetPromotedInstanceExtensions(uint32_t begin_version,
613 uint32_t end_version) {
614 auto begin = std::cbegin(g_promoted_instance_extensions);
615 auto end = std::cend(g_promoted_instance_extensions);
616 std::vector<const char*> extensions;
617
618 for (auto iter = begin; iter != end; iter++)
619 if (iter->second > begin_version && iter->second <= end_version)
620 extensions.emplace_back(iter->first);
621
622 return extensions;
623}
624
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700625} // namespace driver
626} // namespace vulkan\n""")
627
Adithya Srinivasan8dce9d72019-07-11 14:26:04 -0700628 f.close()
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700629 gencom.run_clang_format(genfile)