diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/ThirdParty/ANGLE/src/libANGLE/renderer/gen_load_functions_table.py | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/ThirdParty/ANGLE/src/libANGLE/renderer/gen_load_functions_table.py')
-rw-r--r-- | Source/ThirdParty/ANGLE/src/libANGLE/renderer/gen_load_functions_table.py | 191 |
1 files changed, 191 insertions, 0 deletions
diff --git a/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gen_load_functions_table.py b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gen_load_functions_table.py new file mode 100644 index 000000000..eb3e4c5bf --- /dev/null +++ b/Source/ThirdParty/ANGLE/src/libANGLE/renderer/gen_load_functions_table.py @@ -0,0 +1,191 @@ +#!/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_load_functions_table.py: +# Code generation for the load function tables used for texture formats +# + +import json, sys +from datetime import date + +sys.path.append('../..') +import angle_format + +template = """// GENERATED FILE - DO NOT EDIT. +// Generated by gen_load_functions_table.py using data from load_functions_data.json +// +// 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. +// +// load_functions_table: +// Contains the GetLoadFunctionsMap for texture_format_util.h +// + +#include "libANGLE/renderer/load_functions_table.h" + +#include "image_util/copyimage.h" +#include "image_util/generatemip.h" +#include "image_util/loadimage.h" + +using namespace rx; + +namespace angle +{{ + +namespace +{{ + +// ES3 image loading functions vary based on: +// - the GL internal format (supplied to glTex*Image*D) +// - the GL data type given (supplied to glTex*Image*D) +// - the target DXGI_FORMAT that the image will be loaded into (which is chosen based on the D3D +// device's capabilities) +// This map type determines which loading function to use, based on these three parameters. +// Source formats and types are taken from Tables 3.2 and 3.3 of the ES 3 spec. +void UnimplementedLoadFunction(size_t width, + size_t height, + size_t depth, + const uint8_t *input, + size_t inputRowPitch, + size_t inputDepthPitch, + uint8_t *output, + size_t outputRowPitch, + size_t outputDepthPitch) +{{ + UNIMPLEMENTED(); +}} + +void UnreachableLoadFunction(size_t width, + size_t height, + size_t depth, + const uint8_t *input, + size_t inputRowPitch, + size_t inputDepthPitch, + uint8_t *output, + size_t outputRowPitch, + size_t outputDepthPitch) +{{ + UNREACHABLE(); +}} + +{load_functions_data}}} // namespace + +LoadFunctionMap GetLoadFunctionsMap(GLenum {internal_format}, Format::ID {angle_format}) +{{ + // clang-format off + switch ({internal_format}) + {{ +{switch_data} + default: + {{ + static LoadFunctionMap emptyLoadFunctionsMap; + return emptyLoadFunctionsMap; + }} + }} + // clang-format on + +}} // GetLoadFunctionsMap + +}} // namespace angle +""" + +internal_format_param = 'internalFormat' +angle_format_param = 'angleFormat' +angle_format_unknown = 'NONE' + +def load_functions_name(internal_format, angle_format): + return internal_format[3:] + "_to_" + angle_format + +def unknown_func_name(internal_format): + return load_functions_name(internal_format, "default") + +def get_load_func(func_name, type_functions): + snippet = "LoadImageFunctionInfo " + func_name + "(GLenum type)\n" + snippet += "{\n" + snippet += " switch (type)\n" + snippet += " {\n" + for gl_type, load_function in sorted(type_functions.iteritems()): + snippet += " case " + gl_type + ":\n" + requiresConversion = str('LoadToNative<' not in load_function).lower() + snippet += " return LoadImageFunctionInfo(" + load_function + ", " + requiresConversion + ");\n" + snippet += " default:\n" + snippet += " UNREACHABLE();\n" + snippet += " return LoadImageFunctionInfo(UnreachableLoadFunction, true);\n" + snippet += " }\n" + snippet += "}\n" + snippet += "\n" + + return snippet + +def get_unknown_load_func(angle_to_type_map, internal_format): + assert angle_format_unknown in angle_to_type_map + return get_load_func(unknown_func_name(internal_format), angle_to_type_map[angle_format_unknown]) + +def parse_json(json_data): + table_data = '' + load_functions_data = '' + for internal_format, angle_to_type_map in sorted(json_data.iteritems()): + + s = ' ' + + table_data += s + 'case ' + internal_format + ':\n' + + do_switch = len(angle_to_type_map) > 1 or angle_to_type_map.keys()[0] != angle_format_unknown + + if do_switch: + table_data += s + '{\n' + s += ' ' + table_data += s + 'switch (' + angle_format_param + ')\n' + table_data += s + '{\n' + s += ' ' + + for angle_format, type_functions in sorted(angle_to_type_map.iteritems()): + + if angle_format == angle_format_unknown: + continue + + func_name = load_functions_name(internal_format, angle_format) + + # Main case statements + table_data += s + 'case Format::ID::' + angle_format + ':\n' + table_data += s + ' return ' + func_name + ';\n' + + if angle_format_unknown in angle_to_type_map: + for gl_type, load_function in angle_to_type_map[angle_format_unknown].iteritems(): + if gl_type not in type_functions: + type_functions[gl_type] = load_function + + load_functions_data += get_load_func(func_name, type_functions) + + if do_switch: + table_data += s + 'default:\n' + + if angle_format_unknown in angle_to_type_map: + table_data += s + ' return ' + unknown_func_name(internal_format) + ';\n' + load_functions_data += get_unknown_load_func(angle_to_type_map, internal_format) + else: + table_data += s + ' break;\n' + + if do_switch: + s = s[4:] + table_data += s + '}\n' + s = s[4:] + table_data += s + '}\n' + + return table_data, load_functions_data + +json_data = angle_format.load_json('load_functions_data.json') + +switch_data, load_functions_data = parse_json(json_data) +output = template.format(internal_format = internal_format_param, + angle_format = angle_format_param, + switch_data = switch_data, + load_functions_data = load_functions_data, + copyright_year = date.today().year) + +with open('load_functions_table_autogen.cpp', 'wt') as out_file: + out_file.write(output) + out_file.close() |