blob: cd25dd817cc84bd0a77595439ae874214d330553 [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',
Ian Elliott1ce053f2022-03-16 09:49:53 -060030 'VK_GOOGLE_surfaceless_query',
Yiwei Zhang1ca59c12019-10-10 12:54:42 -070031 'VK_KHR_android_surface',
32 'VK_KHR_get_surface_capabilities2',
33 'VK_KHR_incremental_present',
34 'VK_KHR_shared_presentable_image',
35 'VK_KHR_surface',
36 'VK_KHR_swapchain',
Adithya Srinivasan01364142019-07-02 15:52:49 -070037]
38
Yiwei Zhang6ca5d0c2019-10-11 17:15:02 -070039# Extensions known to vulkan::driver level.
Yiwei Zhang1ca59c12019-10-10 12:54:42 -070040_KNOWN_EXTENSIONS = _INTERCEPTED_EXTENSIONS + [
41 'VK_ANDROID_external_memory_android_hardware_buffer',
42 'VK_KHR_bind_memory2',
43 'VK_KHR_get_physical_device_properties2',
Yiwei Zhange4f64172020-07-05 15:17:32 -070044 'VK_KHR_device_group_creation',
Yiwei Zhange1f35012020-07-05 22:52:04 -070045 'VK_KHR_external_memory_capabilities',
46 'VK_KHR_external_semaphore_capabilities',
47 'VK_KHR_external_fence_capabilities',
Adithya Srinivasan01364142019-07-02 15:52:49 -070048]
49
Yiwei Zhang6ca5d0c2019-10-11 17:15:02 -070050# Functions needed at vulkan::driver level.
Yiwei Zhang1ca59c12019-10-10 12:54:42 -070051_NEEDED_COMMANDS = [
52 # Create functions of dispatchable objects
53 'vkCreateDevice',
54 'vkGetDeviceQueue',
55 'vkGetDeviceQueue2',
56 'vkAllocateCommandBuffers',
57
58 # Destroy functions of dispatchable objects
59 'vkDestroyInstance',
60 'vkDestroyDevice',
61
62 # Enumeration of extensions
63 'vkEnumerateDeviceExtensionProperties',
64
65 # We cache physical devices in loader.cpp
66 'vkEnumeratePhysicalDevices',
67 'vkEnumeratePhysicalDeviceGroups',
68
69 'vkGetInstanceProcAddr',
70 'vkGetDeviceProcAddr',
71
72 'vkQueueSubmit',
73
74 # VK_KHR_swapchain->VK_ANDROID_native_buffer translation
75 'vkCreateImage',
76 'vkDestroyImage',
77
78 'vkGetPhysicalDeviceProperties',
Yiwei Zhang1ca59c12019-10-10 12:54:42 -070079
80 # VK_KHR_swapchain v69 requirement
81 'vkBindImageMemory2',
82 'vkBindImageMemory2KHR',
Yiwei Zhange4f64172020-07-05 15:17:32 -070083
84 # For promoted VK_KHR_device_group_creation
85 'vkEnumeratePhysicalDeviceGroupsKHR',
Yiwei Zhanga55624b2020-07-05 16:05:26 -070086
87 # For promoted VK_KHR_get_physical_device_properties2
88 'vkGetPhysicalDeviceFeatures2',
89 'vkGetPhysicalDeviceFeatures2KHR',
90 'vkGetPhysicalDeviceProperties2',
91 'vkGetPhysicalDeviceProperties2KHR',
92 'vkGetPhysicalDeviceFormatProperties2',
93 'vkGetPhysicalDeviceFormatProperties2KHR',
94 'vkGetPhysicalDeviceImageFormatProperties2',
95 'vkGetPhysicalDeviceImageFormatProperties2KHR',
96 'vkGetPhysicalDeviceQueueFamilyProperties2',
97 'vkGetPhysicalDeviceQueueFamilyProperties2KHR',
98 'vkGetPhysicalDeviceMemoryProperties2',
99 'vkGetPhysicalDeviceMemoryProperties2KHR',
100 'vkGetPhysicalDeviceSparseImageFormatProperties2',
101 'vkGetPhysicalDeviceSparseImageFormatProperties2KHR',
Yiwei Zhange1f35012020-07-05 22:52:04 -0700102
103 # For promoted VK_KHR_external_memory_capabilities
104 'vkGetPhysicalDeviceExternalBufferProperties',
105 'vkGetPhysicalDeviceExternalBufferPropertiesKHR',
106
107 # For promoted VK_KHR_external_semaphore_capabilities
108 'vkGetPhysicalDeviceExternalSemaphoreProperties',
109 'vkGetPhysicalDeviceExternalSemaphorePropertiesKHR',
110
111 # For promoted VK_KHR_external_fence_capabilities
112 'vkGetPhysicalDeviceExternalFenceProperties',
113 'vkGetPhysicalDeviceExternalFencePropertiesKHR',
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700114]
115
Yiwei Zhang6ca5d0c2019-10-11 17:15:02 -0700116# Functions intercepted at vulkan::driver level.
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700117_INTERCEPTED_COMMANDS = [
118 # Create functions of dispatchable objects
119 'vkCreateInstance',
120 'vkCreateDevice',
121 'vkEnumeratePhysicalDevices',
122 'vkEnumeratePhysicalDeviceGroups',
123 'vkGetDeviceQueue',
124 'vkGetDeviceQueue2',
125 'vkAllocateCommandBuffers',
126
127 # Destroy functions of dispatchable objects
128 'vkDestroyInstance',
129 'vkDestroyDevice',
130
131 # Enumeration of extensions
132 'vkEnumerateInstanceExtensionProperties',
133 'vkEnumerateDeviceExtensionProperties',
134
135 'vkGetInstanceProcAddr',
136 'vkGetDeviceProcAddr',
137
138 'vkQueueSubmit',
139
140 # VK_KHR_swapchain v69 requirement
141 'vkBindImageMemory2',
142 'vkBindImageMemory2KHR',
Yiwei Zhanga55624b2020-07-05 16:05:26 -0700143
144 # For promoted VK_KHR_get_physical_device_properties2
145 'vkGetPhysicalDeviceFeatures2',
146 'vkGetPhysicalDeviceProperties2',
147 'vkGetPhysicalDeviceFormatProperties2',
148 'vkGetPhysicalDeviceImageFormatProperties2',
149 'vkGetPhysicalDeviceQueueFamilyProperties2',
150 'vkGetPhysicalDeviceMemoryProperties2',
151 'vkGetPhysicalDeviceSparseImageFormatProperties2',
Yiwei Zhange1f35012020-07-05 22:52:04 -0700152
153 # For promoted VK_KHR_external_memory_capabilities
154 'vkGetPhysicalDeviceExternalBufferProperties',
155
156 # For promoted VK_KHR_external_semaphore_capabilities
157 'vkGetPhysicalDeviceExternalSemaphoreProperties',
158
159 # For promoted VK_KHR_external_fence_capabilities
160 'vkGetPhysicalDeviceExternalFenceProperties',
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700161]
162
163
164def _is_driver_table_entry(cmd):
Yiwei Zhang6ca5d0c2019-10-11 17:15:02 -0700165 """Returns true if a function is needed by vulkan::driver.
166
167 Args:
168 cmd: Vulkan function name.
169 """
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700170 if gencom.is_function_supported(cmd):
171 if cmd in _NEEDED_COMMANDS:
172 return True
173 if cmd in gencom.extension_dict:
174 if (gencom.extension_dict[cmd] == 'VK_ANDROID_native_buffer' or
175 gencom.extension_dict[cmd] == 'VK_EXT_debug_report'):
176 return True
177 return False
178
179
180def _is_instance_driver_table_entry(cmd):
Yiwei Zhang6ca5d0c2019-10-11 17:15:02 -0700181 """Returns true if a instance-dispatched function is needed by vulkan::driver.
182
183 Args:
184 cmd: Vulkan function name.
185 """
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700186 return (_is_driver_table_entry(cmd) and
187 gencom.is_instance_dispatched(cmd))
188
189
190def _is_device_driver_table_entry(cmd):
Yiwei Zhang6ca5d0c2019-10-11 17:15:02 -0700191 """Returns true if a device-dispatched function is needed by vulkan::driver.
192
193 Args:
194 cmd: Vulkan function name.
195 """
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700196 return (_is_driver_table_entry(cmd) and
197 gencom.is_device_dispatched(cmd))
198
199
200def gen_h():
Yiwei Zhang6ca5d0c2019-10-11 17:15:02 -0700201 """Generates the driver_gen.h file.
202 """
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700203 genfile = os.path.join(os.path.dirname(__file__),
204 '..', 'libvulkan', 'driver_gen.h')
205
206 with open(genfile, 'w') as f:
207 f.write(gencom.copyright_and_warning(2016))
208
209 f.write("""\
210#ifndef LIBVULKAN_DRIVER_GEN_H
211#define LIBVULKAN_DRIVER_GEN_H
212
213#include <vulkan/vk_android_native_buffer.h>
214#include <vulkan/vulkan.h>
215
216#include <bitset>
Yiwei Zhang7c0c07c2020-07-04 23:49:47 -0700217#include <optional>
218#include <vector>
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700219
220namespace vulkan {
221namespace driver {
222
223struct ProcHook {
Adithya Srinivasan01364142019-07-02 15:52:49 -0700224 enum Type {
225 GLOBAL,
226 INSTANCE,
227 DEVICE,
228 };
229 enum Extension {\n""")
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700230
Yiwei Zhang5365a7b2019-10-11 17:26:44 -0700231 for ext in _KNOWN_EXTENSIONS:
232 f.write(gencom.indent(2) + gencom.base_ext_name(ext) + ',\n')
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700233
Yiwei Zhang7cc36a52019-10-11 19:02:09 -0700234 f.write('\n')
235 for version in gencom.version_code_list:
236 f.write(gencom.indent(2) + 'EXTENSION_CORE_' + version + ',\n')
237
238 # EXTENSION_COUNT must be the next enum after the highest API version.
239 f.write("""\
Adithya Srinivasan01364142019-07-02 15:52:49 -0700240 EXTENSION_COUNT,
241 EXTENSION_UNKNOWN,
242 };
243
244 const char* name;
245 Type type;
246 Extension extension;
247
248 PFN_vkVoidFunction proc;
249 PFN_vkVoidFunction checked_proc; // always nullptr for non-device hooks
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700250};
Adithya Srinivasan01364142019-07-02 15:52:49 -0700251
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700252struct InstanceDriverTable {
253 // clang-format off\n""")
Adithya Srinivasan01364142019-07-02 15:52:49 -0700254
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700255 for cmd in gencom.command_list:
256 if _is_instance_driver_table_entry(cmd):
257 f.write(gencom.indent(1) + 'PFN_' + cmd + ' ' +
258 gencom.base_name(cmd) + ';\n')
Adithya Srinivasan01364142019-07-02 15:52:49 -0700259
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700260 f.write("""\
261 // clang-format on
262};
Adithya Srinivasan01364142019-07-02 15:52:49 -0700263
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700264struct DeviceDriverTable {
265 // clang-format off\n""")
Adithya Srinivasan01364142019-07-02 15:52:49 -0700266
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700267 for cmd in gencom.command_list:
268 if _is_device_driver_table_entry(cmd):
269 f.write(gencom.indent(1) + 'PFN_' + cmd + ' ' +
270 gencom.base_name(cmd) + ';\n')
Adithya Srinivasan01364142019-07-02 15:52:49 -0700271
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700272 f.write("""\
273 // clang-format on
274};
Adithya Srinivasan01364142019-07-02 15:52:49 -0700275
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700276const ProcHook* GetProcHook(const char* name);
Adithya Srinivasan01364142019-07-02 15:52:49 -0700277ProcHook::Extension GetProcHookExtension(const char* name);
278
279bool InitDriverTable(VkInstance instance,
280 PFN_vkGetInstanceProcAddr get_proc,
281 const std::bitset<ProcHook::EXTENSION_COUNT>& extensions);
282bool InitDriverTable(VkDevice dev,
283 PFN_vkGetDeviceProcAddr get_proc,
284 const std::bitset<ProcHook::EXTENSION_COUNT>& extensions);
285
Yiwei Zhang7c0c07c2020-07-04 23:49:47 -0700286std::optional<uint32_t> GetInstanceExtensionPromotedVersion(const char* name);
287uint32_t CountPromotedInstanceExtensions(uint32_t begin_version,
288 uint32_t end_version);
289std::vector<const char*> GetPromotedInstanceExtensions(uint32_t begin_version,
290 uint32_t end_version);
291
Adithya Srinivasan01364142019-07-02 15:52:49 -0700292} // namespace driver
293} // namespace vulkan
294
295#endif // LIBVULKAN_DRIVER_TABLE_H\n""")
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700296
Adithya Srinivasan8dce9d72019-07-11 14:26:04 -0700297 f.close()
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700298 gencom.run_clang_format(genfile)
Adithya Srinivasan01364142019-07-02 15:52:49 -0700299
Adithya Srinivasan01364142019-07-02 15:52:49 -0700300
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700301def _is_intercepted(cmd):
Yiwei Zhang6ca5d0c2019-10-11 17:15:02 -0700302 """Returns true if a function is intercepted by vulkan::driver.
303
304 Args:
305 cmd: Vulkan function name.
306 """
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700307 if gencom.is_function_supported(cmd):
308 if cmd in _INTERCEPTED_COMMANDS:
309 return True
Adithya Srinivasan01364142019-07-02 15:52:49 -0700310
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700311 if cmd in gencom.extension_dict:
312 return gencom.extension_dict[cmd] in _INTERCEPTED_EXTENSIONS
Adithya Srinivasan01364142019-07-02 15:52:49 -0700313 return False
314
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700315
Yiwei Zhang7cc36a52019-10-11 19:02:09 -0700316def _get_proc_hook_enum(cmd):
317 """Returns the ProcHook enumeration for the corresponding core function.
318
319 Args:
320 cmd: Vulkan function name.
321 """
322 assert cmd in gencom.version_dict
323 for version in gencom.version_code_list:
324 if gencom.version_dict[cmd] == 'VK_VERSION_' + version:
325 return 'ProcHook::EXTENSION_CORE_' + version
326
327
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700328def _need_proc_hook_stub(cmd):
Yiwei Zhang6ca5d0c2019-10-11 17:15:02 -0700329 """Returns true if a function needs a ProcHook stub.
330
331 Args:
332 cmd: Vulkan function name.
333 """
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700334 if _is_intercepted(cmd) and gencom.is_device_dispatched(cmd):
335 if cmd in gencom.extension_dict:
336 if not gencom.is_extension_internal(gencom.extension_dict[cmd]):
Adithya Srinivasan01364142019-07-02 15:52:49 -0700337 return True
Yiwei Zhang7cc36a52019-10-11 19:02:09 -0700338 elif gencom.version_dict[cmd] != 'VK_VERSION_1_0':
339 return True
Adithya Srinivasan01364142019-07-02 15:52:49 -0700340 return False
341
Adithya Srinivasan01364142019-07-02 15:52:49 -0700342
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700343def _define_proc_hook_stub(cmd, f):
Yiwei Zhang6ca5d0c2019-10-11 17:15:02 -0700344 """Emits a stub for ProcHook::checked_proc.
345
346 Args:
347 cmd: Vulkan function name.
348 f: Output file handle.
349 """
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700350 if _need_proc_hook_stub(cmd):
351 return_type = gencom.return_type_dict[cmd]
Yiwei Zhang7cc36a52019-10-11 19:02:09 -0700352
353 ext_name = ''
354 ext_hook = ''
355 if cmd in gencom.extension_dict:
356 ext_name = gencom.extension_dict[cmd]
357 ext_hook = 'ProcHook::' + gencom.base_ext_name(ext_name)
358 else:
359 ext_name = gencom.version_dict[cmd]
360 ext_hook = _get_proc_hook_enum(cmd)
361
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700362 handle = gencom.param_dict[cmd][0][1]
363 param_types = ', '.join([''.join(i) for i in gencom.param_dict[cmd]])
364 param_names = ', '.join([''.join(i[1]) for i in gencom.param_dict[cmd]])
Adithya Srinivasan01364142019-07-02 15:52:49 -0700365
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700366 f.write('VKAPI_ATTR ' + return_type + ' checked' + gencom.base_name(cmd) +
367 '(' + param_types + ') {\n')
368 f.write(gencom.indent(1) + 'if (GetData(' + handle + ').hook_extensions[' +
369 ext_hook + ']) {\n')
Adithya Srinivasan01364142019-07-02 15:52:49 -0700370
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700371 f.write(gencom.indent(2))
372 if gencom.return_type_dict[cmd] != 'void':
373 f.write('return ')
374 f.write(gencom.base_name(cmd) + '(' + param_names + ');\n')
375
376 f.write(gencom.indent(1) + '} else {\n')
377 f.write(gencom.indent(2) + 'Logger(' + handle + ').Err(' + handle + ', \"' +
378 ext_name + ' not enabled. ' + cmd + ' not executed.\");\n')
379 if gencom.return_type_dict[cmd] != 'void':
380 f.write(gencom.indent(2) + 'return VK_SUCCESS;\n')
381 f.write(gencom.indent(1) + '}\n}\n\n')
382
383
384def _define_global_proc_hook(cmd, f):
Yiwei Zhang6ca5d0c2019-10-11 17:15:02 -0700385 """Emits definition of a global ProcHook.
386
387 Args:
388 cmd: Vulkan function name.
389 f: Output file handle.
390 """
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700391 assert cmd not in gencom.extension_dict
392
393 f.write(gencom.indent(1) + '{\n')
394 f.write(gencom.indent(2) + '\"' + cmd + '\",\n')
Yiwei Zhang7cc36a52019-10-11 19:02:09 -0700395 f.write(gencom.indent(2) + 'ProcHook::GLOBAL,\n')
396 f.write(gencom.indent(2) + _get_proc_hook_enum(cmd) + ',\n')
397 f.write(gencom.indent(2) + 'reinterpret_cast<PFN_vkVoidFunction>(' +
398 gencom.base_name(cmd) + '),\n')
399 f.write(gencom.indent(2) + 'nullptr,\n')
400 f.write(gencom.indent(1) + '},\n')
Adithya Srinivasan01364142019-07-02 15:52:49 -0700401
Adithya Srinivasan01364142019-07-02 15:52:49 -0700402
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700403def _define_instance_proc_hook(cmd, f):
Yiwei Zhang6ca5d0c2019-10-11 17:15:02 -0700404 """Emits definition of a instance ProcHook.
405
406 Args:
407 cmd: Vulkan function name.
408 f: Output file handle.
409 """
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700410 f.write(gencom.indent(1) + '{\n')
411 f.write(gencom.indent(2) + '\"' + cmd + '\",\n')
412 f.write(gencom.indent(2) + 'ProcHook::INSTANCE,\n')
413
414 if cmd in gencom.extension_dict:
415 ext_name = gencom.extension_dict[cmd]
Yiwei Zhangaeaa8672019-10-16 18:59:41 -0700416 f.write(gencom.indent(2) + 'ProcHook::' +
417 gencom.base_ext_name(ext_name) + ',\n')
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700418
419 if gencom.is_extension_internal(ext_name):
420 f.write("""\
421 nullptr,
422 nullptr,\n""")
Adithya Srinivasan01364142019-07-02 15:52:49 -0700423 else:
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700424 f.write("""\
425 reinterpret_cast<PFN_vkVoidFunction>(""" + gencom.base_name(cmd) + """),
426 nullptr,\n""")
Adithya Srinivasan01364142019-07-02 15:52:49 -0700427 else:
Yiwei Zhang7cc36a52019-10-11 19:02:09 -0700428 f.write(gencom.indent(2) + _get_proc_hook_enum(cmd) + ',\n')
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700429 f.write("""\
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700430 reinterpret_cast<PFN_vkVoidFunction>(""" + gencom.base_name(cmd) + """),
Adithya Srinivasan01364142019-07-02 15:52:49 -0700431 nullptr,\n""")
432
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700433 f.write(gencom.indent(1) + '},\n')
Adithya Srinivasan01364142019-07-02 15:52:49 -0700434
Adithya Srinivasan01364142019-07-02 15:52:49 -0700435
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700436def _define_device_proc_hook(cmd, f):
Yiwei Zhang6ca5d0c2019-10-11 17:15:02 -0700437 """Emits definition of a device ProcHook.
438
439 Args:
440 cmd: Vulkan function name.
441 f: Output file handle.
442 """
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700443 f.write(gencom.indent(1) + '{\n')
444 f.write(gencom.indent(2) + '\"' + cmd + '\",\n')
445 f.write(gencom.indent(2) + 'ProcHook::DEVICE,\n')
446
Yiwei Zhang7cc36a52019-10-11 19:02:09 -0700447 if (cmd in gencom.extension_dict or
448 gencom.version_dict[cmd] != 'VK_VERSION_1_0'):
449 ext_name = ''
450 ext_hook = ''
451 if cmd in gencom.extension_dict:
452 ext_name = gencom.extension_dict[cmd]
453 ext_hook = 'ProcHook::' + gencom.base_ext_name(ext_name)
454 else:
455 ext_name = gencom.version_dict[cmd]
456 ext_hook = _get_proc_hook_enum(cmd)
457 f.write(gencom.indent(2) + ext_hook + ',\n')
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700458
459 if gencom.is_extension_internal(ext_name):
460 f.write("""\
461 nullptr,
462 nullptr,\n""")
Adithya Srinivasan01364142019-07-02 15:52:49 -0700463 else:
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700464 f.write("""\
465 reinterpret_cast<PFN_vkVoidFunction>(""" + gencom.base_name(cmd) + """),
466 reinterpret_cast<PFN_vkVoidFunction>(checked""" +
467 gencom.base_name(cmd) + '),\n')
Adithya Srinivasan01364142019-07-02 15:52:49 -0700468
469 else:
Yiwei Zhang7cc36a52019-10-11 19:02:09 -0700470 f.write(gencom.indent(2) + _get_proc_hook_enum(cmd) + ',\n')
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700471 f.write("""\
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700472 reinterpret_cast<PFN_vkVoidFunction>(""" + gencom.base_name(cmd) + """),
Adithya Srinivasan01364142019-07-02 15:52:49 -0700473 nullptr,\n""")
474
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700475 f.write(gencom.indent(1) + '},\n')
Adithya Srinivasan01364142019-07-02 15:52:49 -0700476
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700477
478def gen_cpp():
Yiwei Zhang6ca5d0c2019-10-11 17:15:02 -0700479 """Generates the driver_gen.cpp file.
480 """
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700481 genfile = os.path.join(os.path.dirname(__file__),
482 '..', 'libvulkan', 'driver_gen.cpp')
483
484 with open(genfile, 'w') as f:
485 f.write(gencom.copyright_and_warning(2016))
486 f.write("""\
487#include <log/log.h>
Adithya Srinivasan01364142019-07-02 15:52:49 -0700488#include <string.h>
489
490#include <algorithm>
491
492#include "driver.h"
493
494namespace vulkan {
495namespace driver {
496
497namespace {
498
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700499// clang-format off\n\n""")
Adithya Srinivasan01364142019-07-02 15:52:49 -0700500
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700501 for cmd in gencom.command_list:
502 _define_proc_hook_stub(cmd, f)
Adithya Srinivasan01364142019-07-02 15:52:49 -0700503
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700504 f.write("""\
505// clang-format on
Adithya Srinivasan01364142019-07-02 15:52:49 -0700506
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700507const ProcHook g_proc_hooks[] = {
508 // clang-format off\n""")
Adithya Srinivasan01364142019-07-02 15:52:49 -0700509
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700510 sorted_command_list = sorted(gencom.command_list)
511 for cmd in sorted_command_list:
512 if _is_intercepted(cmd):
513 if gencom.is_globally_dispatched(cmd):
514 _define_global_proc_hook(cmd, f)
515 elif gencom.is_instance_dispatched(cmd):
516 _define_instance_proc_hook(cmd, f)
517 elif gencom.is_device_dispatched(cmd):
518 _define_device_proc_hook(cmd, f)
Adithya Srinivasan01364142019-07-02 15:52:49 -0700519
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700520 f.write("""\
521 // clang-format on
522};
523
524} // namespace
525
526const ProcHook* GetProcHook(const char* name) {
Yiwei Zhang93b521c2020-07-11 16:32:09 -0700527 auto begin = std::cbegin(g_proc_hooks);
528 auto end = std::cend(g_proc_hooks);
529 auto hook = std::lower_bound(
Adithya Srinivasan01364142019-07-02 15:52:49 -0700530 begin, end, name,
531 [](const ProcHook& e, const char* n) { return strcmp(e.name, n) < 0; });
532 return (hook < end && strcmp(hook->name, name) == 0) ? hook : nullptr;
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700533}
Adithya Srinivasan01364142019-07-02 15:52:49 -0700534
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700535ProcHook::Extension GetProcHookExtension(const char* name) {
536 // clang-format off\n""")
Adithya Srinivasan01364142019-07-02 15:52:49 -0700537
Yiwei Zhang5365a7b2019-10-11 17:26:44 -0700538 for ext in _KNOWN_EXTENSIONS:
539 f.write(gencom.indent(1) + 'if (strcmp(name, \"' + ext +
540 '\") == 0) return ProcHook::' + gencom.base_ext_name(ext) + ';\n')
Adithya Srinivasan01364142019-07-02 15:52:49 -0700541
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700542 f.write("""\
543 // clang-format on
544 return ProcHook::EXTENSION_UNKNOWN;
545}
546
547#define UNLIKELY(expr) __builtin_expect((expr), 0)
548
549#define INIT_PROC(required, obj, proc) \\
550 do { \\
551 data.driver.proc = \\
552 reinterpret_cast<PFN_vk##proc>(get_proc(obj, "vk" #proc)); \\
553 if (UNLIKELY(required && !data.driver.proc)) { \\
554 ALOGE("missing " #obj " proc: vk" #proc); \\
555 success = false; \\
556 } \\
557 } while (0)
558
559#define INIT_PROC_EXT(ext, required, obj, proc) \\
560 do { \\
561 if (extensions[ProcHook::ext]) \\
562 INIT_PROC(required, obj, proc); \\
563 } while (0)
564
565bool InitDriverTable(VkInstance instance,
Adithya Srinivasan01364142019-07-02 15:52:49 -0700566 PFN_vkGetInstanceProcAddr get_proc,
567 const std::bitset<ProcHook::EXTENSION_COUNT>& extensions) {
568 auto& data = GetData(instance);
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700569 bool success = true;
Adithya Srinivasan01364142019-07-02 15:52:49 -0700570
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700571 // clang-format off\n""")
572
573 for cmd in gencom.command_list:
574 if _is_instance_driver_table_entry(cmd):
575 gencom.init_proc(cmd, f)
576
577 f.write("""\
578 // clang-format on
579
580 return success;
581}
582
583bool InitDriverTable(VkDevice dev,
Adithya Srinivasan01364142019-07-02 15:52:49 -0700584 PFN_vkGetDeviceProcAddr get_proc,
585 const std::bitset<ProcHook::EXTENSION_COUNT>& extensions) {
586 auto& data = GetData(dev);
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700587 bool success = true;
588
589 // clang-format off\n""")
590
591 for cmd in gencom.command_list:
592 if _is_device_driver_table_entry(cmd):
593 gencom.init_proc(cmd, f)
594
595 f.write("""\
596 // clang-format on
597
598 return success;
599}
600
Yiwei Zhang7c0c07c2020-07-04 23:49:47 -0700601const std::pair<const char*, uint32_t> g_promoted_instance_extensions[] = {
602 // clang-format off\n""")
603
604 for key, value in sorted(gencom.promoted_inst_ext_dict.items()):
605 f.write(gencom.indent(1) + 'std::make_pair("' + key + '", ' + value + '),\n')
606
607 f.write("""\
608 // clang-format on
609};
610
611std::optional<uint32_t> GetInstanceExtensionPromotedVersion(const char* name) {
612 auto begin = std::cbegin(g_promoted_instance_extensions);
613 auto end = std::cend(g_promoted_instance_extensions);
614 auto iter =
615 std::lower_bound(begin, end, name,
616 [](const std::pair<const char*, uint32_t>& e,
617 const char* n) { return strcmp(e.first, n) < 0; });
618 return (iter < end && strcmp(iter->first, name) == 0)
619 ? std::optional<uint32_t>(iter->second)
620 : std::nullopt;
621}
622
623uint32_t CountPromotedInstanceExtensions(uint32_t begin_version,
624 uint32_t end_version) {
625 auto begin = std::cbegin(g_promoted_instance_extensions);
626 auto end = std::cend(g_promoted_instance_extensions);
627 uint32_t count = 0;
628
629 for (auto iter = begin; iter != end; iter++)
630 if (iter->second > begin_version && iter->second <= end_version)
631 count++;
632
633 return count;
634}
635
636std::vector<const char*> GetPromotedInstanceExtensions(uint32_t begin_version,
637 uint32_t end_version) {
638 auto begin = std::cbegin(g_promoted_instance_extensions);
639 auto end = std::cend(g_promoted_instance_extensions);
640 std::vector<const char*> extensions;
641
642 for (auto iter = begin; iter != end; iter++)
643 if (iter->second > begin_version && iter->second <= end_version)
644 extensions.emplace_back(iter->first);
645
646 return extensions;
647}
648
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700649} // namespace driver
650} // namespace vulkan\n""")
651
Adithya Srinivasan8dce9d72019-07-11 14:26:04 -0700652 f.close()
Yiwei Zhang1ca59c12019-10-10 12:54:42 -0700653 gencom.run_clang_format(genfile)