Add generator for EGL proc table.
This should improve ANGLE startup time by avoiding creating a large
std::map filled with the entry points.
BUG=chromium:781460
Change-Id: I20cfdb10b99844d0f60759dda73b729991dc60fe
Reviewed-on: https://chromium-review.googlesource.com/768209
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Antoine Labour <piman@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libGLESv2/gen_proc_table.py b/src/libGLESv2/gen_proc_table.py
new file mode 100644
index 0000000..52c6852
--- /dev/null
+++ b/src/libGLESv2/gen_proc_table.py
@@ -0,0 +1,77 @@
+#!/usr/bin/python
+# Copyright 2017 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_proc_table.py:
+# Code generation for entry point loading tables.
+
+# TODO(jmadill): Should be part of entry point generation.
+
+import sys
+from datetime import date
+
+data_source_name = "proc_table_data.json"
+out_file_name = "proc_table_autogen.cpp"
+
+template_cpp = """// GENERATED FILE - DO NOT EDIT.
+// Generated by {script_name} using data from {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.
+//
+// getProcAddress loader table:
+// Mapping from a string entry point name to function address.
+//
+
+#include "libGLESv2/proc_table.h"
+
+#include "libGLESv2/entry_points_egl.h"
+#include "libGLESv2/entry_points_egl_ext.h"
+#include "libGLESv2/entry_points_gles_2_0_autogen.h"
+#include "libGLESv2/entry_points_gles_2_0_ext.h"
+#include "libGLESv2/entry_points_gles_3_0_autogen.h"
+#include "libGLESv2/entry_points_gles_3_1.h"
+#include "platform/Platform.h"
+
+#define P(FUNC) reinterpret_cast<__eglMustCastToProperFunctionPointerType>(FUNC)
+
+namespace egl
+{{
+ProcEntry g_procTable[] = {{
+{proc_data}
+}};
+
+size_t g_numProcs = {num_procs};
+}} // namespace egl
+"""
+
+sys.path.append('../libANGLE/renderer')
+import angle_format
+
+json_data = angle_format.load_json(data_source_name)
+
+all_functions = {}
+
+for description, functions in json_data.iteritems():
+ for function in functions:
+ if function.startswith("gl"):
+ all_functions[function] = "gl::" + function[2:]
+ elif function.startswith("egl"):
+ all_functions[function] = "egl::" + function[3:]
+ else:
+ all_functions[function] = function
+
+proc_data = [(' {"%s", P(%s)}' % (func, angle_func)) for func, angle_func in sorted(all_functions.iteritems())]
+
+with open(out_file_name, 'wt') as out_file:
+ output_cpp = template_cpp.format(
+ script_name = sys.argv[0],
+ data_source_name = data_source_name,
+ copyright_year = date.today().year,
+ proc_data = ",\n".join(proc_data),
+ num_procs = len(proc_data))
+ out_file.write(output_cpp)
+ out_file.close()
+