Edit

kc3-lang/angle/scripts/gen_interpreter_utils.py

Branch :

  • Show log

    Commit

  • Author : Jamie Madill
    Date : 2022-10-10 21:00:16
    Hash : dc62b3ee
    Message : Capture/Replay: Add trace interpreter. Also adds a self-test using the retrace script. Bug: angleproject:7752 Change-Id: I1985b47250bef99726d2ca2d90bef859208e357e Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3965128 Reviewed-by: Cody Northrop <cnorthrop@google.com> Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: Yuxin Hu <yuxinhu@google.com>

  • scripts/gen_interpreter_utils.py
  • #!/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.khronos_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])))