Edit

kc3-lang/angle/scripts/gen_proc_table.py

Branch :

  • Show log

    Commit

  • Author : Kimmo Kinnunen
    Date : 2022-09-08 14:15:10
    Hash : 6937ea98
    Message : Use base name of the generator script in various generated files Increases compiler cache hits especially in cases where the file is run during build. Bug: angleproject:7642 Change-Id: I769dae2d7cca2cf1e238531f4cb356bad41b06dd Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3880323 Reviewed-by: Kenneth Russell <kbr@chromium.org> Commit-Queue: Kenneth Russell <kbr@chromium.org> Auto-Submit: Kimmo Kinnunen <kkinnunen@apple.com> Reviewed-by: Jamie Madill <jmadill@chromium.org>

  • scripts/gen_proc_table.py
  • #!/usr/bin/python3
    # Copyright 2017 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_proc_table.py:
    #  Code generation for entry point loading tables.
    #  NOTE: don't run this script directly. Run scripts/run_code_generation.py.
    
    import os
    import sys
    import registry_xml
    
    out_file_name_gles = "../src/libGLESv2/proc_table_egl_autogen.cpp"
    out_file_name_wgl = "../src/libGLESv2/proc_table_wgl_autogen.cpp"
    out_file_name_glx = "../src/libGLESv2/proc_table_glx_autogen.cpp"
    out_file_name_cl = "../src/libGLESv2/proc_table_cl_autogen.cpp"
    out_file_name_cl_map = "../src/libOpenCL/libOpenCL_autogen.map"
    
    strip_suffixes = ["ANGLE", "EXT", "KHR", "OES", "CHROMIUM", "OVR"]
    
    template_cpp = """// GENERATED FILE - DO NOT EDIT.
    // Generated by {script_name} using data from {data_source_name}.
    //
    // Copyright 2019 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.
    //
    // getProcAddress loader table:
    //   Mapping from a string entry point name to function address.
    //
    
    {includes}
    #define P(FUNC) reinterpret_cast<{cast}>(FUNC)
    {desktop_only_macro_definition}
    
    namespace {namespace}
    {{
    // clang-format off
    const ProcEntry g_procTable[] = {{
    {proc_data}
    }};
    // clang-format on
    const size_t g_numProcs = {num_procs};
    }}  // namespace {namespace}
    """
    
    desktop_only_macro_definition = """
    #if defined(ANGLE_ENABLE_GL_DESKTOP_FRONTEND)
    #   define DESKTOP_ONLY(func, angleFunc) {func, P(angleFunc)},
    #else
    #   define DESKTOP_ONLY(func, angleFunc)
    #endif
    """
    
    # FOR OPENCL
    template_map_cpp = """// GENERATED FILE - DO NOT EDIT.
    // Generated by {script_name} using data from {data_source_name}.
    //
    // Copyright 2021 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.
    //
    // proc_table:
    //   Mapping from a string entry point name to function address.
    //
    
    {includes}
    #define P(FUNC) reinterpret_cast<{cast}>(FUNC)
    
    namespace {namespace}
    {{
    
    const ProcTable &GetProcTable()
    {{
        static angle::base::NoDestructor<ProcTable> sProcTable(
            {{{proc_data}}});
        return *sProcTable;
    }}
    
    }}  // namespace {namespace}
    """
    
    # FOR OPENCL
    template_map = """/* GENERATED FILE - DO NOT EDIT.
     * Generated by {script_name} using data from {data_source_name}.
     *
     * Copyright 2021 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.
     *
     * symbol version map: Maps versions to entry point names for a shared library.
     */
    {symbol_maps}
    """
    
    includes_gles = """#include "libGLESv2/proc_table_egl.h"
    
    #include "libGLESv2/entry_points_egl_autogen.h"
    #include "libGLESv2/entry_points_egl_ext_autogen.h"
    #include "libGLESv2/entry_points_gles_1_0_autogen.h"
    #include "libGLESv2/entry_points_gles_2_0_autogen.h"
    #include "libGLESv2/entry_points_gles_3_0_autogen.h"
    #include "libGLESv2/entry_points_gles_3_1_autogen.h"
    #include "libGLESv2/entry_points_gles_3_2_autogen.h"
    #include "libGLESv2/entry_points_gles_ext_autogen.h"
    #include "platform/PlatformMethods.h"
    
    #if defined(ANGLE_ENABLE_GL_DESKTOP_FRONTEND)
    #   include "libGLESv2/entry_points_gl_1_autogen.h"
    #   include "libGLESv2/entry_points_gl_2_autogen.h"
    #   include "libGLESv2/entry_points_gl_3_autogen.h"
    #   include "libGLESv2/entry_points_gl_4_autogen.h"
    #endif
    
    #include <iterator>
    """
    
    includes_wgl = """#include "libGLESv2/proc_table_wgl.h"
    
    #include "libGLESv2/entry_points_egl_ext_autogen.h"
    #include "libGLESv2/entry_points_gles_1_0_autogen.h"
    #include "libGLESv2/entry_points_gles_2_0_autogen.h"
    #include "libGLESv2/entry_points_gles_3_0_autogen.h"
    #include "libGLESv2/entry_points_gles_3_1_autogen.h"
    #include "libGLESv2/entry_points_gles_3_2_autogen.h"
    #include "libGLESv2/entry_points_gles_ext_autogen.h"
    #include "platform/PlatformMethods.h"
    #include "libGLESv2/entry_points_gl_1_autogen.h"
    #include "libGLESv2/entry_points_gl_2_autogen.h"
    #include "libGLESv2/entry_points_gl_3_autogen.h"
    #include "libGLESv2/entry_points_gl_4_autogen.h"
    #include "libGLESv2/entry_points_wgl.h"
    
    #include <iterator>
    """
    
    includes_glx = """#include "libGLESv2/proc_table_glx.h"
    
    #include "libGLESv2/entry_points_egl_ext_autogen.h"
    #include "libGLESv2/entry_points_gles_1_0_autogen.h"
    #include "libGLESv2/entry_points_gles_2_0_autogen.h"
    #include "libGLESv2/entry_points_gles_3_0_autogen.h"
    #include "libGLESv2/entry_points_gles_3_1_autogen.h"
    #include "libGLESv2/entry_points_gles_3_2_autogen.h"
    #include "libGLESv2/entry_points_gles_ext_autogen.h"
    #include "platform/PlatformMethods.h"
    #include "libGLESv2/entry_points_gl_1_autogen.h"
    #include "libGLESv2/entry_points_gl_2_autogen.h"
    #include "libGLESv2/entry_points_gl_3_autogen.h"
    #include "libGLESv2/entry_points_gl_4_autogen.h"
    #include "libGLESv2/entry_points_glx.h"
    
    #include <iterator>
    """
    
    includes_cl = """#include "libGLESv2/proc_table_cl.h"
    
    #include "libGLESv2/entry_points_cl_autogen.h"
    
    #include "anglebase/no_destructor.h"
    
    // Using fully qualified entry point identifiers to make sure that missing entry points would not
    // pick up the global declarations of OpenCL
    """
    
    sys.path.append('../src/libANGLE/renderer')
    import angle_format
    
    
    def _get_annotations(versions):
        return ["%d_%d" % version for version in versions]
    
    
    def main():
    
        # auto_script parameters.
        if len(sys.argv) > 1:
            inputs = [source for source in registry_xml.xml_inputs]
            outputs = [
                out_file_name_gles, out_file_name_wgl, out_file_name_glx, out_file_name_cl,
                out_file_name_cl_map
            ]
            if sys.argv[1] == 'inputs':
                print(','.join(inputs))
            elif sys.argv[1] == 'outputs':
                print(','.join(outputs))
            else:
                print('Invalid script parameters')
                return 1
            return 0
    
        glesxml = registry_xml.RegistryXML('gl.xml', 'gl_angle_ext.xml')
    
        for annotation in _get_annotations(registry_xml.GLES_VERSIONS):
            name_prefix = "GL_ES_VERSION_"
            if annotation[0] == '1':
                name_prefix = "GL_VERSION_ES_CM_"
            feature_name = "{}{}".format(name_prefix, annotation)
            glesxml.AddCommands(feature_name, annotation)
    
        glesxml.AddExtensionCommands(registry_xml.supported_extensions, ['gles2', 'gles1'])
    
        # Also don't add GLES extension commands to libGL proc table
        extension_commands = []
        for extension_name, ext_cmd_names in sorted(glesxml.ext_data.items()):
            extension_commands.extend(glesxml.ext_data[extension_name])
        for name in extension_commands:
            name_no_suffix = name
            for suffix in strip_suffixes:
                if name_no_suffix.endswith(suffix):
                    name_no_suffix = name_no_suffix[0:-len(suffix)]
    
        gles_data = glesxml.all_cmd_names.get_all_commands()
        eglxml = registry_xml.RegistryXML('egl.xml', 'egl_angle_ext.xml')
    
        for annotation in _get_annotations(registry_xml.EGL_VERSIONS):
            name_prefix = "EGL_VERSION_"
            feature_name = "{}{}".format(name_prefix, annotation)
            eglxml.AddCommands(feature_name, annotation)
    
        eglxml.AddExtensionCommands(registry_xml.supported_egl_extensions, ['gles2', 'gles1'])
    
        gles_data.extend(eglxml.all_cmd_names.get_all_commands())
    
        gles_data.append("ANGLEGetDisplayPlatform")
        gles_data.append("ANGLEResetDisplayPlatform")
        gles_data = set(gles_data)
    
        glxml = registry_xml.RegistryXML('gl.xml')
        for annotation in _get_annotations(registry_xml.DESKTOP_GL_VERSIONS):
            name_prefix = "GL_VERSION_"
            feature_name = "{}{}".format(name_prefix, annotation)
            glxml.AddCommands(feature_name, annotation)
    
        gl_data = set([cmd for cmd in glxml.all_cmd_names.get_all_commands()])
    
        all_gl_data = list(set(gles_data).union(gl_data))
        all_functions = {}
        for function in all_gl_data:
            if function.startswith("gl"):
                all_functions[function] = "GL_" + function[2:]
            elif function.startswith("egl"):
                all_functions[function] = "EGL_" + function[3:]
            else:
                all_functions[function] = function
    
        proc_data = []
        gl_only_data = gl_data.difference(gles_data)
        for func, angle_func in sorted(all_functions.items()):
            if func in gl_only_data:
                proc_data.append('    DESKTOP_ONLY("%s", %s)' % (func, angle_func))
            else:
                proc_data.append('    {"%s", P(%s)},' % (func, angle_func))
    
        with open(out_file_name_gles, 'w') as out_file:
            output_cpp = template_cpp.format(
                script_name=os.path.basename(sys.argv[0]),
                data_source_name="gl.xml, gl_angle_ext.xml, egl.xml, egl_angle_ext.xml",
                includes=includes_gles,
                cast="__eglMustCastToProperFunctionPointerType",
                namespace="egl",
                proc_data="\n".join(proc_data),
                num_procs="std::size(g_procTable)",
                desktop_only_macro_definition=desktop_only_macro_definition)
            out_file.write(output_cpp)
            out_file.close()
    
        def WriteWindowingProcTable(api_name, out_file_name, includes, cast):
            xml_file_name = '{}.xml'.format(api_name)
            xml = registry_xml.RegistryXML(xml_file_name)
            annotations = _get_annotations(
                getattr(registry_xml, '{}_VERSIONS'.format(api_name.upper())))
            for annotation in annotations:
                name_prefix = "{}_VERSION_".format(api_name.upper())
                feature_name = "{}{}".format(name_prefix, annotation)
                xml.AddCommands(feature_name, annotation)
    
            commands = [
                # Some WGL EP's need to have "wgl" appended to their names
                cmd if api_name != 'wgl' or cmd.startswith(api_name) else api_name + cmd
                for cmd in xml.all_cmd_names.get_all_commands()
            ]
    
            # Start with all of the GLES + Desktop entry points, filtering out the EGL ones
            proc_data = [
                '    {"%s", P(%s)},' % (func, angle_func)
                for func, angle_func in sorted(all_functions.items())
                if not func.startswith('egl')
            ]
            proc_data.extend(['    {"%s", P(%s)},' % (cmd, cmd) for cmd in sorted(commands)])
    
            with open(out_file_name, 'w') as out_file:
                output_cpp = template_cpp.format(
                    script_name=os.path.basename(sys.argv[0]),
                    data_source_name="gl.xml, gl_angle_ext.xml, {}".format(xml_file_name),
                    includes=includes,
                    cast=cast,
                    namespace=api_name,
                    proc_data="\n".join(proc_data),
                    num_procs="std::size(g_procTable)",
                    desktop_only_macro_definition='')
                out_file.write(output_cpp)
                out_file.close()
    
        WriteWindowingProcTable('wgl', out_file_name_wgl, includes_wgl, "PROC")
        WriteWindowingProcTable('glx', out_file_name_glx, includes_glx, "__GLXextFuncPtr")
    
        # libCL proc table
        clxml = registry_xml.RegistryXML('cl.xml')
        symbol_maps = []
        symbol_map_dependency = ""
    
        for major_version, minor_version in registry_xml.CL_VERSIONS:
            name_prefix = "CL_VERSION_"
            annotation = "%d_%d" % (major_version, minor_version)
            feature_name = "%s%s" % (name_prefix, annotation)
            clxml.AddCommands(feature_name, annotation)
            symbol_version = "OPENCL_%d.%d" % (major_version, minor_version)
            symbol_maps += ["\n%s {\n    global:" % symbol_version]
            symbol_maps += ['        %s;' % cmd for cmd in clxml.commands[annotation]]
            if not symbol_map_dependency:
                symbol_maps += ["    local:\n        *;\n};"]
            else:
                symbol_maps += ["} %s;" % symbol_map_dependency]
            symbol_map_dependency = symbol_version
    
        clxml.AddExtensionCommands(registry_xml.supported_cl_extensions, ['cl'])
        cl_commands = clxml.all_cmd_names.get_all_commands()
        proc_data = ['{"%s", P(::cl::%s)}' % (cmd, cmd) for cmd in cl_commands]
    
        with open(out_file_name_cl, 'w') as out_file:
            output_cpp = template_map_cpp.format(
                script_name=os.path.basename(sys.argv[0]),
                data_source_name="cl.xml",
                includes=includes_cl,
                cast="void *",
                namespace="cl",
                proc_data=",\n         ".join(proc_data))
            out_file.write(output_cpp)
            out_file.close()
    
        with open(out_file_name_cl_map, 'w') as out_file:
            output_map = template_map.format(
                script_name=os.path.basename(sys.argv[0]),
                data_source_name="cl.xml",
                symbol_maps="\n".join(symbol_maps))
            out_file.write(output_map)
            out_file.close()
    
        return 0
    
    
    if __name__ == '__main__':
        sys.exit(main())