summaryrefslogtreecommitdiffstats
path: root/gfx/angle/src/libANGLE/gen_format_map.py
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/angle/src/libANGLE/gen_format_map.py')
-rw-r--r--gfx/angle/src/libANGLE/gen_format_map.py187
1 files changed, 187 insertions, 0 deletions
diff --git a/gfx/angle/src/libANGLE/gen_format_map.py b/gfx/angle/src/libANGLE/gen_format_map.py
new file mode 100644
index 000000000..b67f42784
--- /dev/null
+++ b/gfx/angle/src/libANGLE/gen_format_map.py
@@ -0,0 +1,187 @@
+#!/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)
+ out_file.close()