angle/scripts/gen_interpreter_utils.py

115 строки
3.0 KiB
Python
Исходник Обычный вид История

#!/usr/bin/python3
#
# Copyright 2022 The ANGLE Project Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# gen_interpreter_utils.py:
# Code generator for the GLC interpreter.
# NOTE: don't run this script directly. Run scripts/run_code_generation.py.
import sys
import os
import registry_xml
EXIT_SUCCESS = 0
EXIT_FAILURE = 1
BASE_PATH = '../util/capture/trace_interpreter_autogen'
CPP_TEMPLATE = """\
// GENERATED FILE - DO NOT EDIT.
// Generated by {script_name} using data from {data_source_name}.
//
// Copyright 2022 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// {file_name}.cpp:
// Helper code for trace interpreter.
#include "angle_trace_gl.h"
#include "trace_fixture.h"
#include "trace_interpreter.h"
namespace angle
{{
CallCapture ParseCallCapture(const Token &nameToken, size_t numParamTokens, const Token *paramTokens, const TraceShaderMap &shaders)
{{
{cases}
ASSERT(numParamTokens == 0);
return CallCapture(nameToken, ParamBuffer());
}}
}} // namespace angle
"""
CASE = """\
if (strcmp(nameToken, "{ep}") == 0)
{{
ParamBuffer params = ParseParameters<{pfn}>(paramTokens, shaders);
return CallCapture({call}, std::move(params));
}}
"""
FIXTURE_H = '../util/capture/trace_fixture.h'
def GetFunctionsFromFixture():
funcs = []
pattern = 'void '
with open(FIXTURE_H) as f:
lines = f.read().split('\n')
for line in lines:
if line.startswith(pattern):
funcs.append(line[len(pattern):line.find('(')])
f.close()
return sorted(funcs)
def main(cpp_output_path):
gles = registry_xml.GetGLES()
egl = registry_xml.GetEGL()
def fn(ep):
return 'std::remove_pointer<PFN%sPROC>::type' % ep.upper()
eps_and_enums = sorted(list(set(gles.GetEnums() + egl.GetEnums())))
cases = [
CASE.format(ep=ep, pfn=fn(ep), call='EntryPoint::%s' % enum)
for (enum, ep) in eps_and_enums
]
cases += [
CASE.format(ep=func, pfn='decltype(%s)' % func, call='"%s"' % func)
for func in GetFunctionsFromFixture()
]
format_args = {
'script_name': os.path.basename(sys.argv[0]),
'data_source_name': 'gl.xml and gl_angle_ext.xml',
'file_name': os.path.basename(BASE_PATH),
'cases': ''.join(cases),
}
cpp_content = CPP_TEMPLATE.format(**format_args)
cpp_output_path = registry_xml.script_relative(cpp_output_path)
with open(cpp_output_path, 'w') as f:
f.write(cpp_content)
return EXIT_SUCCESS
if __name__ == '__main__':
inputs = registry_xml.xml_inputs + [FIXTURE_H]
outputs = [
'%s.cpp' % BASE_PATH,
]
if len(sys.argv) > 1:
if sys.argv[1] == 'inputs':
print(','.join(inputs))
elif sys.argv[1] == 'outputs':
print(','.join(outputs))
else:
sys.exit(main(registry_xml.script_relative(outputs[0])))