Commit 5ad52994 by Jamie Madill Committed by Commit Bot

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/768209Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Reviewed-by: 's avatarAntoine Labour <piman@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
parent e8afa902
...@@ -116,6 +116,15 @@ generators = { ...@@ -116,6 +116,15 @@ generators = {
], ],
'script': 'src/libANGLE/gen_packed_gl_enums.py', 'script': 'src/libANGLE/gen_packed_gl_enums.py',
}, },
'proc table': {
'inputs': [
'src/libGLESv2/proc_table_data.json',
],
'outputs': [
'src/libGLESv2/proc_table_autogen.cpp',
],
'script': 'src/libGLESv2/gen_proc_table.py',
},
'Vulkan format': { 'Vulkan format': {
'inputs': [ 'inputs': [
'src/libANGLE/renderer/angle_format.py', 'src/libANGLE/renderer/angle_format.py',
...@@ -144,7 +153,7 @@ for name, info in sorted(generators.iteritems()): ...@@ -144,7 +153,7 @@ for name, info in sorted(generators.iteritems()):
input_mtime = os.path.getmtime(finput) input_mtime = os.path.getmtime(finput)
for foutput in info['outputs']: for foutput in info['outputs']:
if not os.path.exists(foutput): if not os.path.exists(foutput):
print('Output' + foutput + ' not found for ' + name + ' table') print('Output ' + foutput + ' not found for ' + name + ' table')
dirty = True dirty = True
else: else:
output_mtime = os.path.getmtime(foutput) output_mtime = os.path.getmtime(foutput)
......
// GENERATED FILE - DO NOT EDIT. // GENERATED FILE - DO NOT EDIT.
// Generated by src/libANGLE/gen_packed_gl_enums.py using data from packed_gl_enums.json. // Generated by gen_packed_gl_enums.py using data from packed_gl_enums.json.
// //
// Copyright 2017 The ANGLE Project Authors. All rights reserved. // Copyright 2017 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
......
// GENERATED FILE - DO NOT EDIT. // GENERATED FILE - DO NOT EDIT.
// Generated by src/libANGLE/gen_packed_gl_enums.py using data from packed_gl_enums.json. // Generated by gen_packed_gl_enums.py using data from packed_gl_enums.json.
// //
// Copyright 2017 The ANGLE Project Authors. All rights reserved. // Copyright 2017 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
......
...@@ -831,6 +831,8 @@ ...@@ -831,6 +831,8 @@
'libGLESv2/libGLESv2.cpp', 'libGLESv2/libGLESv2.cpp',
'libGLESv2/libGLESv2.def', 'libGLESv2/libGLESv2.def',
'libGLESv2/libGLESv2.rc', 'libGLESv2/libGLESv2.rc',
'libGLESv2/proc_table.h',
'libGLESv2/proc_table_autogen.cpp',
'libGLESv2/resource.h', 'libGLESv2/resource.h',
], ],
'libegl_sources': 'libegl_sources':
......
#!/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()
//
// 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.
//
// getProcAddress loader table:
// Mapping from a string entry point name to function address.
//
#ifndef LIBGLESV2_PROC_TABLE_H_
#define LIBGLESV2_PROC_TABLE_H_
#include <EGL/egl.h>
#include <utility>
namespace egl
{
using ProcEntry = std::pair<const char *, __eglMustCastToProperFunctionPointerType>;
extern ProcEntry g_procTable[];
extern size_t g_numProcs;
} // namespace egl
#endif // LIBGLESV2_PROC_TABLE_H_
...@@ -28,3 +28,10 @@ TEST(EGLSanityCheckTest, HasGetPlatformDisplayEXT) ...@@ -28,3 +28,10 @@ TEST(EGLSanityCheckTest, HasGetPlatformDisplayEXT)
ASSERT_NE(eglGetPlatformDisplayEXT, nullptr); ASSERT_NE(eglGetPlatformDisplayEXT, nullptr);
} }
// Checks that calling GetProcAddress for a non-existant function fails.
TEST(EGLSanityCheckTest, GetProcAddressNegativeTest)
{
auto check = eglGetProcAddress("WigglyWombats");
EXPECT_EQ(nullptr, check);
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment