blob: 7878a9fcda1e56cc1b8b85d8957ad459387ba929 [file] [log] [blame]
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()