| #!/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/d3d/d3d11/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()) |