| #!/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) |