Edit

kc3-lang/angle/src/libANGLE/renderer/gen_dxgi_support_tables.py

Branch :

  • Show log

    Commit

  • Author : Jamie Madill
    Date : 2020-09-11 12:36:05
    Hash : 4d3a0f60
    Message : GN: Componentize D3D format tables. These tables are used by both the GL and D3D11 back-ends. Also moves them to renderer_utils to be in a shared place. Bug: angleproject:3943 Change-Id: I1f5d79842396a87e795547fa03c6855d6f9c5e9a Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2405805 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: Jonah Ryan-Davis <jonahr@google.com> Reviewed-by: Geoff Lang <geofflang@chromium.org>

  • src/libANGLE/renderer/gen_dxgi_support_tables.py
  • #!/usr/bin/python
    # Copyright 2015 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_dxgi_support_tables.py:
    #  Code generation for the DXGI support tables. Determines which formats
    #  are natively support in D3D10+.
    #  NOTE: don't run this script directly. Run scripts/run_code_generation.py.
    #
    #  NOTE: The "never supported" formats should not be combined with the
    #  "supported" and "optional" ones. At the moment, this does not cause
    #  any issues as ANGLE does not internally check for "never supported".
    #
    # MSDN links:
    #  10Level9 9_3: https://msdn.microsoft.com/en-us/library/windows/desktop/mt790740.aspx
    #  10_0: https://msdn.microsoft.com/en-us/library/windows/desktop/cc627090.aspx
    #  10_1: https://msdn.microsoft.com/en-us/library/windows/desktop/cc627091.aspx
    #  11_0: https://msdn.microsoft.com/en-us/library/windows/desktop/ff471325.aspx
    #  11_1: https://msdn.microsoft.com/en-us/library/windows/desktop/hh404483.aspx
    
    import sys
    import json
    
    macro_prefix = 'F_'
    
    template = """// GENERATED FILE - DO NOT EDIT. See dxgi_support_data.json.
    //
    // Copyright 2015 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.
    //
    // dxgi_support_table:
    //   Queries for DXGI support of various texture formats. Depends on DXGI
    //   version, D3D feature level, and is sometimes guaranteed or optional.
    //
    
    #include "libANGLE/renderer/dxgi_support_table.h"
    
    #include "common/debug.h"
    
    namespace rx
    {{
    
    namespace d3d11
    {{
    
    #define {prefix}2D D3D11_FORMAT_SUPPORT_TEXTURE2D
    #define {prefix}3D D3D11_FORMAT_SUPPORT_TEXTURE3D
    #define {prefix}CUBE D3D11_FORMAT_SUPPORT_TEXTURECUBE
    #define {prefix}SAMPLE D3D11_FORMAT_SUPPORT_SHADER_SAMPLE
    #define {prefix}RT D3D11_FORMAT_SUPPORT_RENDER_TARGET
    #define {prefix}MS D3D11_FORMAT_SUPPORT_MULTISAMPLE_RENDERTARGET
    #define {prefix}DS D3D11_FORMAT_SUPPORT_DEPTH_STENCIL
    #define {prefix}MIPGEN D3D11_FORMAT_SUPPORT_MIP_AUTOGEN
    
    namespace
    {{
    
    const DXGISupport &GetDefaultSupport()
    {{
        static UINT AllSupportFlags =
            D3D11_FORMAT_SUPPORT_TEXTURE2D | D3D11_FORMAT_SUPPORT_TEXTURE3D |
            D3D11_FORMAT_SUPPORT_TEXTURECUBE | D3D11_FORMAT_SUPPORT_SHADER_SAMPLE |
            D3D11_FORMAT_SUPPORT_RENDER_TARGET | D3D11_FORMAT_SUPPORT_MULTISAMPLE_RENDERTARGET |
            D3D11_FORMAT_SUPPORT_DEPTH_STENCIL | D3D11_FORMAT_SUPPORT_MIP_AUTOGEN;
        static const DXGISupport defaultSupport(0, 0, AllSupportFlags);
        return defaultSupport;
    }}
    
    const DXGISupport &GetDXGISupport_9_3(DXGI_FORMAT dxgiFormat)
    {{
        // clang-format off
        switch (dxgiFormat)
        {{
    {table_data_9_3}
            default:
                UNREACHABLE();
                return GetDefaultSupport();
        }}
        // clang-format on
    }}
    
    const DXGISupport &GetDXGISupport_10_0(DXGI_FORMAT dxgiFormat)
    {{
        // clang-format off
        switch (dxgiFormat)
        {{
    {table_data_10_0}
            default:
                UNREACHABLE();
                return GetDefaultSupport();
        }}
        // clang-format on
    }}
    
    const DXGISupport &GetDXGISupport_10_1(DXGI_FORMAT dxgiFormat)
    {{
        // clang-format off
        switch (dxgiFormat)
        {{
    {table_data_10_1}
            default:
                UNREACHABLE();
                return GetDefaultSupport();
        }}
        // clang-format on
    }}
    
    const DXGISupport &GetDXGISupport_11_0(DXGI_FORMAT dxgiFormat)
    {{
        // clang-format off
        switch (dxgiFormat)
        {{
    {table_data_11_0}
            default:
                UNREACHABLE();
                return GetDefaultSupport();
        }}
        // clang-format on
    }}
    
    const DXGISupport &GetDXGISupport_11_1(DXGI_FORMAT dxgiFormat)
    {{
        // clang-format off
        switch (dxgiFormat)
        {{
    {table_data_11_1}
            default:
                UNREACHABLE();
                return GetDefaultSupport();
        }}
        // clang-format on
    }}
    
    }}
    
    #undef {prefix}2D
    #undef {prefix}3D
    #undef {prefix}CUBE
    #undef {prefix}SAMPLE
    #undef {prefix}RT
    #undef {prefix}MS
    #undef {prefix}DS
    #undef {prefix}MIPGEN
    
    const DXGISupport &GetDXGISupport(DXGI_FORMAT dxgiFormat, D3D_FEATURE_LEVEL featureLevel)
    {{
        switch (featureLevel)
        {{
            case D3D_FEATURE_LEVEL_9_3:
                return GetDXGISupport_9_3(dxgiFormat);
            case D3D_FEATURE_LEVEL_10_0:
                return GetDXGISupport_10_0(dxgiFormat);
            case D3D_FEATURE_LEVEL_10_1:
                return GetDXGISupport_10_1(dxgiFormat);
            case D3D_FEATURE_LEVEL_11_0:
                return GetDXGISupport_11_0(dxgiFormat);
            case D3D_FEATURE_LEVEL_11_1:
                return GetDXGISupport_11_1(dxgiFormat);
            default:
                return GetDefaultSupport();
        }}
    }}
    
    }} // namespace d3d11
    
    }} // namespace rx
    """
    
    
    def do_format(format_data):
        table_data = {'9_3': '', '10_0': '', '10_1': '', '11_0': '', '11_1': ''}
    
        json_flag_to_d3d = {
            'texture2D': macro_prefix + '2D',
            'texture3D': macro_prefix + '3D',
            'textureCube': macro_prefix + 'CUBE',
            'shaderSample': macro_prefix + 'SAMPLE',
            'renderTarget': macro_prefix + 'RT',
            'multisampleRT': macro_prefix + 'MS',
            'depthStencil': macro_prefix + 'DS',
            'mipAutoGen': macro_prefix + 'MIPGEN'
        }
    
        for format_name, format_support in sorted(format_data.iteritems()):
    
            always_supported = set()
            never_supported = set()
            optionally_supported = set()
            fl_9_3_supported = set()
            fl_9_3_check = set()
            fl_10_0_supported = set()
            fl_10_1_supported = set()
            fl_11_0_supported = set()
            fl_11_0_check = set()
            fl_11_1_supported = set()
            fl_10_0_check_10_1_supported = set()
            fl_10_0_check_11_0_supported = set()
    
            for json_flag, support in format_support.iteritems():
    
                d3d_flag = [json_flag_to_d3d[json_flag]]
    
                if support == 'check':
                    optionally_supported.update(d3d_flag)
                elif support == 'always':
                    always_supported.update(d3d_flag)
                elif support == 'never':
                    never_supported.update(d3d_flag)
                elif support == '10_0':
                    fl_10_0_supported.update(d3d_flag)
                elif support == '10_1':
                    fl_10_1_supported.update(d3d_flag)
                elif support == '11_0':
                    fl_11_0_supported.update(d3d_flag)
                elif support == '11_1':
                    fl_11_1_supported.update(d3d_flag)
                elif support == 'dxgi1_2':
                    # TODO(jmadill): DXGI 1.2 handling.
                    always_supported.update(d3d_flag)
                elif support == '10_0check10_1always':
                    fl_10_0_check_10_1_supported.update(d3d_flag)
                elif support == '10_0check11_0always':
                    fl_10_0_check_11_0_supported.update(d3d_flag)
                elif support == '11_0check':
                    fl_11_0_check.update(d3d_flag)
                elif support == '9_3always_10_0check11_0always':
                    fl_9_3_supported.update(d3d_flag)
                    fl_10_0_check_11_0_supported.update(d3d_flag)
                elif support == '9_3check_10_0always':
                    fl_9_3_check.update(d3d_flag)
                    fl_10_0_supported.update(d3d_flag)
                elif support == '9_3check11_0always':
                    fl_9_3_check.update(d3d_flag)
                    fl_10_0_check_11_0_supported.update(d3d_flag)
                else:
                    print("Data specification error: " + support)
                    sys.exit(1)
    
            for feature_level in ['9_3', '10_0', '10_1', '11_0', '11_1']:
                always_for_fl = always_supported
                optional_for_fl = optionally_supported
                if feature_level == '9_3':
                    always_for_fl = fl_9_3_supported.union(always_for_fl)
                    optional_for_fl = fl_9_3_check.union(optional_for_fl)
                elif feature_level == '10_0':
                    always_for_fl = fl_10_0_supported.union(always_for_fl)
                    optional_for_fl = fl_10_0_check_10_1_supported.union(optional_for_fl)
                    optional_for_fl = fl_10_0_check_11_0_supported.union(optional_for_fl)
                elif feature_level == '10_1':
                    always_for_fl = fl_10_0_supported.union(always_for_fl)
                    always_for_fl = fl_10_1_supported.union(always_for_fl)
                    always_for_fl = fl_10_0_check_10_1_supported.union(always_for_fl)
                    optional_for_fl = fl_10_0_check_11_0_supported.union(optional_for_fl)
                elif feature_level == '11_0':
                    always_for_fl = fl_10_0_supported.union(always_for_fl)
                    always_for_fl = fl_10_0_check_10_1_supported.union(always_for_fl)
                    always_for_fl = fl_10_0_check_11_0_supported.union(always_for_fl)
                    always_for_fl = fl_10_1_supported.union(always_for_fl)
                    always_for_fl = fl_11_0_supported.union(always_for_fl)
                elif feature_level == '11_1':
                    always_for_fl = fl_10_0_supported.union(always_for_fl)
                    always_for_fl = fl_10_0_check_10_1_supported.union(always_for_fl)
                    always_for_fl = fl_10_0_check_11_0_supported.union(always_for_fl)
                    always_for_fl = fl_10_1_supported.union(always_for_fl)
                    always_for_fl = fl_11_0_supported.union(always_for_fl)
                    always_for_fl = fl_11_1_supported.union(always_for_fl)
    
                always = ' | '.join(sorted(always_for_fl))
                never = ' | '.join(sorted(never_supported))
                optional = ' | '.join(sorted(optional_for_fl))
    
                if not always:
                    always = '0'
                if not never:
                    never = '0'
                if not optional:
                    optional = '0'
    
                table_data[feature_level] += '        case ' + format_name + ':\n'
                table_data[feature_level] += '        {\n'
                table_data[
                    feature_level] += '            static const DXGISupport info(' + always + ', ' + never + ', ' + optional + ');\n'
                table_data[feature_level] += '            return info;\n'
                table_data[feature_level] += '        }\n'
    
        return table_data
    
    
    def join_table_data(table_data_1, table_data_2):
        return {
            '9_3': table_data_1['9_3'] + table_data_2['9_3'],
            '10_0': table_data_1['10_0'] + table_data_2['10_0'],
            '10_1': table_data_1['10_1'] + table_data_2['10_1'],
            '11_0': table_data_1['11_0'] + table_data_2['11_0'],
            '11_1': table_data_1['11_1'] + table_data_2['11_1']
        }
    
    
    def main():
    
        # auto_script parameters.
        if len(sys.argv) > 1:
            inputs = ['dxgi_support_data.json']
            outputs = ['dxgi_support_table_autogen.cpp']
    
            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
    
        with open('dxgi_support_data.json') as dxgi_file:
            file_data = dxgi_file.read()
            dxgi_file.close()
            json_data = json.loads(file_data)
    
            table_data = {'9_3': '', '10_0': '', '10_1': '', '11_0': '', '11_1': ''}
    
            for format_data in json_data:
                table_data = join_table_data(table_data, do_format(format_data))
    
            out_data = template.format(
                prefix=macro_prefix,
                table_data_9_3=table_data['9_3'],
                table_data_10_0=table_data['10_0'],
                table_data_10_1=table_data['10_1'],
                table_data_11_0=table_data['11_0'],
                table_data_11_1=table_data['11_1'])
    
            with open('dxgi_support_table_autogen.cpp', 'wt') as out_file:
                out_file.write(out_data)
                out_file.close()
        return 0
    
    
    if __name__ == '__main__':
        sys.exit(main())