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()
+