|  | #!/usr/bin/env python3 | 
|  | # | 
|  | # Copyright 2019 The Android Open Source Project | 
|  | # | 
|  | # Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | # you may not use this file except in compliance with the License. | 
|  | # You may obtain a copy of the License at | 
|  | # | 
|  | #      http://www.apache.org/licenses/LICENSE-2.0 | 
|  | # | 
|  | # Unless required by applicable law or agreed to in writing, software | 
|  | # distributed under the License is distributed on an "AS IS" BASIS, | 
|  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | # See the License for the specific language governing permissions and | 
|  | # limitations under the License. | 
|  |  | 
|  | """Generates the null_driver_gen.h and null_driver_gen.cpp. | 
|  | """ | 
|  |  | 
|  | import os | 
|  | import generator_common as gencom | 
|  |  | 
|  | # Extensions implemented by the driver. | 
|  | _DRIVER_EXTENSION_DICT = { | 
|  | 'VK_ANDROID_native_buffer', | 
|  | 'VK_EXT_debug_report', | 
|  | 'VK_KHR_get_physical_device_properties2' | 
|  | } | 
|  |  | 
|  |  | 
|  | def _is_driver_function(cmd): | 
|  | """Returns true if the function is implemented by the driver. | 
|  |  | 
|  | Args: | 
|  | cmd: Vulkan function name. | 
|  | """ | 
|  | if cmd in gencom.extension_dict: | 
|  | return gencom.extension_dict[cmd] in _DRIVER_EXTENSION_DICT | 
|  | return True | 
|  |  | 
|  |  | 
|  | def gen_h(): | 
|  | """Generates the null_driver_gen.h file. | 
|  | """ | 
|  | genfile = os.path.join(os.path.dirname(__file__), | 
|  | '..', 'nulldrv', 'null_driver_gen.h') | 
|  |  | 
|  | with open(genfile, 'w') as f: | 
|  | f.write(gencom.copyright_and_warning(2015)) | 
|  |  | 
|  | f.write("""\ | 
|  | #ifndef NULLDRV_NULL_DRIVER_H | 
|  | #define NULLDRV_NULL_DRIVER_H 1 | 
|  |  | 
|  | #include <vulkan/vk_android_native_buffer.h> | 
|  | #include <vulkan/vulkan.h> | 
|  |  | 
|  | namespace null_driver { | 
|  |  | 
|  | PFN_vkVoidFunction GetGlobalProcAddr(const char* name); | 
|  | PFN_vkVoidFunction GetInstanceProcAddr(const char* name); | 
|  |  | 
|  | // clang-format off\n""") | 
|  |  | 
|  | for cmd in gencom.command_list: | 
|  | if _is_driver_function(cmd): | 
|  | param_list = [''.join(i) for i in gencom.param_dict[cmd]] | 
|  | f.write('VKAPI_ATTR ' + gencom.return_type_dict[cmd] + ' ' + | 
|  | gencom.base_name(cmd) + '(' + ', '.join(param_list) + ');\n') | 
|  |  | 
|  | f.write("""\ | 
|  | // clang-format on | 
|  |  | 
|  | }  // namespace null_driver | 
|  |  | 
|  | #endif  // NULLDRV_NULL_DRIVER_H\n""") | 
|  |  | 
|  | f.close() | 
|  | gencom.run_clang_format(genfile) | 
|  |  | 
|  |  | 
|  | def gen_cpp(): | 
|  | """Generates the null_driver_gen.cpp file. | 
|  | """ | 
|  | genfile = os.path.join(os.path.dirname(__file__), | 
|  | '..', 'nulldrv', 'null_driver_gen.cpp') | 
|  |  | 
|  | with open(genfile, 'w') as f: | 
|  | f.write(gencom.copyright_and_warning(2015)) | 
|  |  | 
|  | f.write("""\ | 
|  | #include <algorithm> | 
|  |  | 
|  | #include "null_driver_gen.h" | 
|  |  | 
|  | using namespace null_driver; | 
|  |  | 
|  | namespace { | 
|  |  | 
|  | struct NameProc { | 
|  | const char* name; | 
|  | PFN_vkVoidFunction proc; | 
|  | }; | 
|  |  | 
|  | PFN_vkVoidFunction Lookup(const char* name, | 
|  | const NameProc* begin, | 
|  | const NameProc* end) { | 
|  | const auto& entry = std::lower_bound( | 
|  | begin, end, name, | 
|  | [](const NameProc& e, const char* n) { return strcmp(e.name, n) < 0; }); | 
|  | if (entry == end || strcmp(entry->name, name) != 0) | 
|  | return nullptr; | 
|  | return entry->proc; | 
|  | } | 
|  |  | 
|  | template <size_t N> | 
|  | PFN_vkVoidFunction Lookup(const char* name, const NameProc (&procs)[N]) { | 
|  | return Lookup(name, procs, procs + N); | 
|  | } | 
|  |  | 
|  | const NameProc kGlobalProcs[] = { | 
|  | // clang-format off\n""") | 
|  |  | 
|  | sorted_command_list = sorted(gencom.command_list) | 
|  | for cmd in sorted_command_list: | 
|  | if (_is_driver_function(cmd) and | 
|  | gencom.get_dispatch_table_type(cmd) == 'Global'): | 
|  | f.write(gencom.indent(1) + '{\"' + cmd + | 
|  | '\", reinterpret_cast<PFN_vkVoidFunction>(static_cast<PFN_' + | 
|  | cmd + '>(' + gencom.base_name(cmd) + '))},\n') | 
|  |  | 
|  | f.write("""\ | 
|  | // clang-format on | 
|  | }; | 
|  |  | 
|  | const NameProc kInstanceProcs[] = { | 
|  | // clang-format off\n""") | 
|  |  | 
|  | for cmd in sorted_command_list: | 
|  | if _is_driver_function(cmd): | 
|  | f.write(gencom.indent(1) + '{\"' + cmd + | 
|  | '\", reinterpret_cast<PFN_vkVoidFunction>(static_cast<PFN_' + | 
|  | cmd + '>(' + gencom.base_name(cmd) + '))},\n') | 
|  |  | 
|  | f.write("""\ | 
|  | // clang-format on | 
|  | }; | 
|  |  | 
|  | }  // namespace | 
|  |  | 
|  | namespace null_driver { | 
|  |  | 
|  | PFN_vkVoidFunction GetGlobalProcAddr(const char* name) { | 
|  | return Lookup(name, kGlobalProcs); | 
|  | } | 
|  |  | 
|  | PFN_vkVoidFunction GetInstanceProcAddr(const char* name) { | 
|  | return Lookup(name, kInstanceProcs); | 
|  | } | 
|  |  | 
|  | }  // namespace null_driver\n""") | 
|  |  | 
|  | f.close() | 
|  | gencom.run_clang_format(genfile) |