| COPYRIGHT=u""" |
| /* Copyright © 2021 Intel Corporation |
| * Copyright © 2024 Valve Corporation |
| * |
| * SPDX-License-Identifier: MIT |
| */ |
| """ |
| |
| import argparse |
| import os |
| import sys |
| import xml.etree.ElementTree as et |
| |
| import mako |
| from mako.template import Template |
| |
| sys.path.append(os.path.join(sys.path[0], '../../../vulkan/util/')) |
| |
| from vk_entrypoints import get_entrypoints_from_xml |
| |
| EXCLUDED_COMMANDS = [ |
| 'CmdBeginRenderPass', |
| 'CmdEndRenderPass', |
| 'CmdDispatch', |
| ] |
| |
| TEMPLATE = Template(COPYRIGHT + """ |
| /* This file generated from ${filename}, don't edit directly. */ |
| |
| #include "radv_cmd_buffer.h" |
| #include "radv_entrypoints.h" |
| |
| #define ANNOTATE(command, ...) \ |
| struct radv_cmd_buffer *cmd_buffer = radv_cmd_buffer_from_handle(commandBuffer); \ |
| struct radv_device *device = radv_cmd_buffer_device(cmd_buffer); \ |
| radv_cmd_buffer_annotate(cmd_buffer, #command); \ |
| device->layer_dispatch.annotate.command(__VA_ARGS__) |
| |
| % for c in commands: |
| % if c.guard is not None: |
| #ifdef ${c.guard} |
| % endif |
| VKAPI_ATTR ${c.return_type} VKAPI_CALL |
| annotate_${c.name}(${c.decl_params()}) |
| { |
| ANNOTATE(${c.name}, ${c.call_params()}); |
| } |
| |
| % if c.guard is not None: |
| #endif // ${c.guard} |
| % endif |
| % endfor |
| """) |
| |
| # str.removesuffix requires python 3.9+ so implement our own to not break build |
| # on older versions |
| def removesuffix(s, suffix): |
| l = len(suffix) |
| if l == 0: |
| return s |
| idx = s.find(suffix) |
| if idx == len(s) - l: |
| return s[:-l] |
| return s |
| |
| |
| def main(): |
| parser = argparse.ArgumentParser() |
| parser.add_argument("--out-c", required=True, help="Output C file.") |
| parser.add_argument("--beta", required=True, help="Enable beta extensions.") |
| parser.add_argument("--xml", |
| help="Vulkan API XML file.", |
| required=True, action="append", dest="xml_files") |
| args = parser.parse_args() |
| |
| commands = [] |
| commands_names = [] |
| for e in get_entrypoints_from_xml(args.xml_files, args.beta): |
| if not e.name.startswith('Cmd') or e.alias or e.return_type != "void": |
| continue |
| |
| stripped_name = removesuffix(removesuffix(removesuffix(e.name, 'EXT'), 'KHR'), '2') |
| if stripped_name in commands_names or stripped_name in EXCLUDED_COMMANDS: |
| continue |
| |
| commands.append(e) |
| commands_names.append(stripped_name) |
| |
| environment = { |
| "filename": os.path.basename(__file__), |
| "commands": commands, |
| } |
| |
| try: |
| with open(args.out_c, "w", encoding='utf-8') as f: |
| f.write(TEMPLATE.render(**environment)) |
| except Exception: |
| # In the event there"s an error, this uses some helpers from mako |
| # to print a useful stack trace and prints it, then exits with |
| # status 1, if python is run with debug; otherwise it just raises |
| # the exception |
| print(mako.exceptions.text_error_template().render(), file=sys.stderr) |
| sys.exit(1) |
| |
| if __name__ == "__main__": |
| main() |