Edit

kc3-lang/angle/src/libANGLE/gen_format_map.py

Branch :

  • Show log

    Commit

  • Author : Corentin Wallez
    Date : 2017-09-18 17:05:22
    Hash : 2e568cfb
    Message : Add generator for packed GL enums. For testing this also converts two unimportant GLenums, gl::BufferUsage and gl::CullModeFace. BUG=angleproject:2169 Change-Id: If1e86a97d0fed3fd567303aca6506ec579503076 Reviewed-on: https://chromium-review.googlesource.com/688000 Commit-Queue: Corentin Wallez <cwallez@chromium.org> Reviewed-by: Jamie Madill <jmadill@chromium.org>

  • src/libANGLE/gen_format_map.py
  • #!/usr/bin/python
    # Copyright 2016 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_format_map.py:
    #  Code generation for GL format map. The format map matches between
    #  {format,type} and internal format.
    
    from datetime import date
    import sys
    
    sys.path.append('renderer')
    import angle_format
    
    template_cpp = """// GENERATED FILE - DO NOT EDIT.
    // Generated by {script_name} using data from {data_source_name}.
    // ES3 format info from {es3_data_source_name}.
    //
    // Copyright {copyright_year} 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.
    //
    // format_map:
    //   Determining the sized internal format from a (format,type) pair.
    //   Also check es3 format combinations for validity.
    
    #include "angle_gl.h"
    #include "common/debug.h"
    
    namespace gl
    {{
    
    GLenum GetSizedFormatInternal(GLenum format, GLenum type)
    {{
        switch (format)
        {{
    {format_cases}        case GL_NONE:
                return GL_NONE;
    
            default:
                break;
        }}
    
        return GL_NONE;
    }}
    
    bool ValidES3Format(GLenum format)
    {{
        switch (format)
        {{
    {es3_format_cases}            return true;
    
            default:
                return false;
        }}
    }}
    
    bool ValidES3Type(GLenum type)
    {{
        switch (type)
        {{
    {es3_type_cases}            return true;
    
            default:
                return false;
        }}
    }}
    
    bool ValidES3FormatCombination(GLenum format, GLenum type, GLenum internalFormat)
    {{
        ASSERT(ValidES3Format(format) && ValidES3Type(type));
    
        switch (format)
        {{
    {es3_combo_cases}        default:
                UNREACHABLE();
                break;
        }}
    
        return false;
    }}
    
    }}  // namespace gl
    """
    
    template_format_case = """        case {format}:
                switch (type)
                {{
    {type_cases}                default:
                        break;
                }}
                break;
    
    """
    
    template_simple_case = """                case {key}:
                        return {result};
    """
    
    template_es3_combo_type_case = """                case {type}:
                    {{
                        switch (internalFormat)
                        {{
    {internal_format_cases}                            return true;
                            default:
                                break;
                        }}
                        break;
                    }}
    """
    
    def parse_type_case(type, result):
        return template_simple_case.format(
            key = type, result = result)
    
    def parse_format_case(format, type_map):
        type_cases = ""
        for type, internal_format in sorted(type_map.iteritems()):
            type_cases += parse_type_case(type, internal_format)
        return template_format_case.format(
            format = format, type_cases = type_cases)
    
    input_script = 'format_map_data.json'
    
    format_map = angle_format.load_json(input_script)
    
    format_cases = ""
    
    for format, type_map in sorted(format_map.iteritems()):
        format_cases += parse_format_case(format, type_map)
    
    combo_data_file = 'es3_format_type_combinations.json'
    es3_combo_data = angle_format.load_json(combo_data_file)
    combo_data = [combo for sublist in es3_combo_data.values() for combo in sublist]
    
    types = set()
    formats = set()
    combos = {}
    
    for internal_format, format, type in combo_data:
        types.update([type])
        formats.update([format])
        if format not in combos:
            combos[format] = {}
        if type not in combos[format]:
            combos[format][type] = [internal_format]
        else:
            combos[format][type] += [internal_format]
    
    es3_format_cases = ""
    
    for format in sorted(formats):
        es3_format_cases += "        case " + format + ":\n"
    
    es3_type_cases = ""
    
    for type in sorted(types):
        es3_type_cases += "        case " + type + ":\n"
    
    es3_combo_cases = ""
    
    for format, type_combos in combos.iteritems():
        this_type_cases = ""
        for type, combos in type_combos.iteritems():
            internal_format_cases = ""
            for internal_format in combos:
                internal_format_cases += "                        case " + internal_format + ":\n"
    
            this_type_cases += template_es3_combo_type_case.format(
                type = type, internal_format_cases = internal_format_cases)
    
        es3_combo_cases += template_format_case.format(
            format = format, type_cases = this_type_cases)
    
    with open('format_map_autogen.cpp', 'wt') as out_file:
        output_cpp = template_cpp.format(
            script_name = sys.argv[0],
            data_source_name = input_script,
            es3_data_source_name = combo_data_file,
            copyright_year = date.today().year,
            format_cases = format_cases,
            es3_format_cases = es3_format_cases,
            es3_type_cases = es3_type_cases,
            es3_combo_cases = es3_combo_cases)
        out_file.write(output_cpp)