Merge "Strings added to address Issue 82305" into studio-1.3-dev
diff --git a/android/build/definitions.make b/android/build/definitions.make
index 5bb2d60..ddeb06f 100644
--- a/android/build/definitions.make
+++ b/android/build/definitions.make
@@ -217,3 +217,30 @@
 @mkdir -p $(dir $@)
 $(hide) $(PRIVATE_CUSTOM_TOOL)
 endef
+
+# Generate DLL symbol file
+#
+# NOTE: The file is always named foo.def
+#
+define generate-symbol-file
+SRC:=$(1)
+OBJ:=$$(LOCAL_OBJS_DIR)/$$(notdir $$(SRC:%.entries=%.def))
+LOCAL_GENERATED_SYMBOL_FILE:=$$(OBJ)
+$$(OBJ): PRIVATE_SRC := $$(SRC)
+$$(OBJ): PRIVATE_DST := $$(OBJ)
+$$(OBJ): PRIVATE_MODE := $$(GEN_ENTRIES_MODE_$(HOST_OS))
+$$(OBJ): $$(SRC)
+	@mkdir -p $$(dir $$(PRIVATE_DST))
+	@echo "Generate symbol file: $$(notdir $$(PRIVATE_DST))"
+	$(hide) android/scripts/gen-entries.py --mode=$$(PRIVATE_MODE) --output=$$(PRIVATE_DST) $$(PRIVATE_SRC)
+endef
+
+GEN_ENTRIES_MODE_darwin := _symbols
+GEN_ENTRIES_MODE_windows := def
+GEN_ENTRIES_MODE_linux := sym
+
+EXPORTED_SYMBOL_LIST_windows :=
+EXPORTED_SYMBOL_LIST_darwin := -Wl,-exported_symbols_list,
+EXPORTED_SYMBOL_LIST_linux := -Wl,--version-script=
+
+symbol-file-linker-flags = $(EXPORTED_SYMBOL_LIST_$(HOST_OS))$1
diff --git a/android/build/host_shared_library.make b/android/build/host_shared_library.make
index 911be8e..c5716c3 100644
--- a/android/build/host_shared_library.make
+++ b/android/build/host_shared_library.make
@@ -25,6 +25,13 @@
 $(LOCAL_BUILT_MODULE): PRIVATE_LDLIBS  := $(LOCAL_LDLIBS)
 $(LOCAL_BUILT_MODULE): PRIVATE_OBJS    := $(LOCAL_OBJECTS)
 
+LOCAL_SYMBOL_FILE := $(strip $(LOCAL_SYMBOL_FILE))
+ifdef LOCAL_SYMBOL_FILE
+$(eval $(call generate-symbol-file,$(LOCAL_PATH)/$(LOCAL_SYMBOL_FILE)))
+$(LOCAL_BUILT_MODULE): $(LOCAL_GENERATED_SYMBOL_FILE)
+$(LOCAL_BUILT_MODULE): PRIVATE_LDFLAGS += $(call symbol-file-linker-flags,$(LOCAL_GENERATED_SYMBOL_FILE))
+endif
+
 $(LOCAL_BUILT_MODULE): $(LOCAL_OBJECTS) $(LOCAL_LIBRARIES)
 	@ mkdir -p $(dir $@)
 	@ echo "SharedLibrary: $@"
@@ -33,4 +40,3 @@
 EXECUTABLES += $(LOCAL_BUILT_MODULE)
 $(LOCAL_BUILT_MODULE): $(foreach lib,$(LOCAL_STATIC_LIBRARIES),$(call local-library-path,$(lib)))
 $(LOCAL_BUILT_MODULE): $(foreach lib,$(LOCAL_SHARED_LIBRARIES),$(call local-shared-library-path,$(lib)))
-
diff --git a/android/scripts/gen-dll-wrapper.py b/android/scripts/gen-dll-wrapper.py
deleted file mode 100755
index 8f09930..0000000
--- a/android/scripts/gen-dll-wrapper.py
+++ /dev/null
@@ -1,136 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright 2015 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# A small script used to convert an .entries file into a DLL wrapper
-
-import re
-import sys
-
-re_func = re.compile(r"""^(.*[\* ])([A-Za-z_][A-Za-z0-9_]*)\((.*)\);$""")
-re_param = re.compile(r"""^(.*[\* ])([A-Za-z_][A-Za-z0-9_]*)$""")
-
-ENTRY_PREFIX = "__dll_"
-
-class Entry:
-    def __init__(self, func_name, return_type, parameters):
-        self.func_name = func_name
-        self.ptr_name = "%s%s" % (ENTRY_PREFIX, func_name)
-        self.return_type = return_type
-        self.parameters = ""
-        self.call = ""
-        comma = ""
-        for param in parameters:
-            self.parameters += "%s%s %s" % (comma, param[0], param[1])
-            self.call += "%s%s" % (comma, param[1])
-            comma = ", "
-
-def parse_file(filename, lines):
-    entries = []
-    failure = False
-    lineno = 0
-    prefix_name = "unknown"
-    print "// Auto-generated from: %s" % filename
-    print "// With %s" % sys.argv[0]
-    print "// DO NOT EDIT THIS FILE"
-    print ""
-    print "#include <dlfcn.h>"
-    for line in lines:
-        lineno += 1
-        line = line.strip()
-        if len(line) == 0:  # Ignore empty lines
-            continue
-        if line[0] == '#':  # Ignore comments
-            continue
-        if line[0] == '!':  # Prefix name
-            prefix_name = line[1:]
-            continue
-        if line[0] == '%':  # Verbatim line copy
-            print line[1:]
-            continue
-        # Must be a function signature.
-        m = re_func.match(line)
-        if not m:
-            print "ERROR:%s:%d '%s'" % (filename, lineno, line)
-            failure = True
-            break
-
-        return_type, func_name, parameters = m.groups()
-        return_type = return_type.strip()
-        parameters = parameters.strip()
-        params = []
-        failure = False
-        if parameters != "void":
-            for parameter in parameters.split(','):
-                parameter = parameter.strip()
-                m = re_param.match(parameter)
-                if not m:
-                    print "ERROR:%s:%d: parameter '%s'" % (filename, lineno, parameter)
-                    failure = True
-                else:
-                    param_type, param_name = m.groups()
-                    params.append((param_type.strip(), param_name.strip()))
-        if failure:
-            break
-
-        entries.append(Entry(func_name, return_type, params))
-
-    if failure:
-        return None
-
-    print ""
-    print "///"
-    print "///  W R A P P E R   P O I N T E R S"
-    print "///"
-    print ""
-    for entry in entries:
-        print "static %s (*%s)(%s) = 0;" % (entry.return_type, entry.ptr_name, entry.parameters)
-
-    print ""
-    print "///"
-    print "///  W R A P P E R   F U N C T I O N S"
-    print "///"
-    print ""
-
-    for entry in entries:
-        print "%s %s(%s) {" % (entry.return_type, entry.func_name, entry.parameters)
-        if entry.return_type != "void":
-            print "  return %s(%s);" % (entry.ptr_name, entry.call)
-        else:
-            print "  %s(%s);" % (entry.ptr_name, entry.call)
-        print "}\n"
-
-    print ""
-    print "///"
-    print "///  I N I T I A L I Z A T I O N   F U N C T I O N"
-    print "///"
-    print ""
-
-    print "int %s_dynlink_init(void* lib) {" % prefix_name
-    for entry in entries:
-        print "  %s = (%s(*)(%s))dlsym(lib, \"%s\");" % \
-                (entry.ptr_name,
-                 entry.return_type,
-                 entry.parameters,
-                 entry.func_name)
-        print "  if (!%s) return -1;" % entry.ptr_name
-    print "  return 0;"
-    print "}"
-
-if len(sys.argv) == 1:
-    parse_file("<stdin>", sys.stdin)
-else:
-    parse_file(sys.argv[1], open(sys.argv[1]))
-
diff --git a/android/scripts/gen-entries.py b/android/scripts/gen-entries.py
new file mode 100755
index 0000000..523845a
--- /dev/null
+++ b/android/scripts/gen-entries.py
@@ -0,0 +1,293 @@
+#!/usr/bin/env python
+
+# Copyright 2015 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Utility functions used to parse a list of DLL entry points.
+# Expected format:
+#
+#   <empty-line>   -> ignored
+#   #<comment>     -> ignored
+#   %<verbatim>    -> verbatim output for header files.
+#   !<prefix>      -> prefix name for header files.
+#   <return-type> <function-name> <signature>  -> entry point declaration.
+#
+# Anything else is an error.
+
+import re
+import sys
+import argparse
+
+re_func = re.compile(r"""^(.*[\* ])([A-Za-z_][A-Za-z0-9_]*)\((.*)\);$""")
+re_param = re.compile(r"""^(.*[\* ])([A-Za-z_][A-Za-z0-9_]*)$""")
+
+class Entry:
+    """Small class used to model a single DLL entry point."""
+    def __init__(self, func_name, return_type, parameters):
+        """Initialize Entry instance. |func_name| is the function name,
+           |return_type| its return type, and |parameters| is a list of
+           (type,name) tuples from the entry's signature.
+        """
+        self.func_name = func_name
+        self.return_type = return_type
+        self.parameters = ""
+        self.call = ""
+        comma = ""
+        for param in parameters:
+            self.parameters += "%s%s %s" % (comma, param[0], param[1])
+            self.call += "%s%s" % (comma, param[1])
+            comma = ", "
+
+def parse_entries_file(lines):
+    """Parse an .entries file and return a tuple of:
+        entries: list of Entry instances from the file.
+        prefix_name: prefix name from the file, or None.
+        verbatim: list of verbatim lines from the file.
+        errors: list of errors in the file, prefixed by line number.
+    """
+    entries = []
+    verbatim = []
+    errors = []
+    lineno = 0
+    prefix_name = None
+    for line in lines:
+        lineno += 1
+        line = line.strip()
+        if len(line) == 0:  # Ignore empty lines
+            continue
+        if line[0] == '#':  # Ignore comments
+            continue
+        if line[0] == '!':  # Prefix name
+            prefix_name = line[1:]
+            continue
+        if line[0] == '%':  # Verbatim line copy
+            verbatim.append(line[1:])
+            continue
+        # Must be a function signature.
+        m = re_func.match(line)
+        if not m:
+            errors.append("%d: '%s'" % (lineno, line))
+            continue
+
+        return_type, func_name, parameters = m.groups()
+        return_type = return_type.strip()
+        parameters = parameters.strip()
+        params = []
+        failure = False
+        if parameters != "void":
+            for parameter in parameters.split(','):
+                parameter = parameter.strip()
+                m = re_param.match(parameter)
+                if not m:
+                    errors.append("%d: parameter '%s'" % (lineno, parameter))
+                    failure = True
+                    break
+                else:
+                    param_type, param_name = m.groups()
+                    params.append((param_type.strip(), param_name.strip()))
+
+        if not failure:
+            entries.append(Entry(func_name, return_type, params))
+
+    return (entries, prefix_name, verbatim, errors)
+
+
+def gen_functions_header(entries, prefix_name, verbatim, filename):
+    """Generate a C header containing a macro listing all entry points.
+       |entries| is a list of Entry instances.
+       |prefix_name| is a prefix-name, it will be converted to upper-case.
+       |verbatim| is a list of verbatim lines that must appear before the
+       macro declaration. Useful to insert #include <> statements.
+       |filename| is the name of the original file.
+    """
+    prefix_name = prefix_name.upper()
+
+    print "// Auto-generated with: %s" % (' '.join(sys.argv))
+    print "// DO NOT EDIT THIS FILE"
+    print ""
+    print "#ifndef %s_FUNCTIONS_H" % prefix_name
+    print "#define %s_FUNCTIONS_H" % prefix_name
+    print ""
+    for line in verbatim:
+        print line
+
+    print "#define LIST_%s_FUNCTIONS(X) \\" % prefix_name
+    for entry in entries:
+        print "  X(%s, %s, (%s)) \\" % \
+                (entry.return_type, entry.func_name, entry.parameters)
+
+    print ""
+    print ""
+    print "#endif  // %s_FUNCTIONS_H" % prefix_name
+
+
+def gen_dll_wrapper(entries, prefix_name, verbatim, filename):
+    """Generate a C source file that contains functions that act as wrappers
+       for entry points located in another shared library. This allows the
+       code that calls these functions to perform lazy-linking to system
+       libraries.
+       |entries|, |prefix_name|, |verbatim| and |filename| are the same as
+       for gen_functions_header() above.
+    """
+    upper_name = prefix_name.upper()
+
+    ENTRY_PREFIX = "__dll_"
+
+    print "// Auto-generated with: %s" % (' '.join(sys.argv))
+    print "// DO NOT EDIT THIS FILE"
+    print ""
+    print "#include <dlfcn.h>"
+    for line in verbatim:
+        print line
+
+    print ""
+    print "///"
+    print "///  W R A P P E R   P O I N T E R S"
+    print "///"
+    print ""
+    for entry in entries:
+        ptr_name = ENTRY_PREFIX + entry.func_name
+        print "static %s (*%s)(%s) = 0;" % \
+                (entry.return_type, ptr_name, entry.parameters)
+
+    print ""
+    print "///"
+    print "///  W R A P P E R   F U N C T I O N S"
+    print "///"
+    print ""
+
+    for entry in entries:
+        print "%s %s(%s) {" % \
+                (entry.return_type, entry.func_name, entry.parameters)
+        ptr_name = ENTRY_PREFIX + entry.func_name
+        if entry.return_type != "void":
+            print "  return %s(%s);" % (ptr_name, entry.call)
+        else:
+            print "  %s(%s);" % (ptr_name, entry.call)
+        print "}\n"
+
+    print ""
+    print "///"
+    print "///  I N I T I A L I Z A T I O N   F U N C T I O N"
+    print "///"
+    print ""
+
+    print "int %s_dynlink_init(void* lib) {" % prefix_name
+    for entry in entries:
+        ptr_name = ENTRY_PREFIX + entry.func_name
+        print "  %s = (%s(*)(%s))dlsym(lib, \"%s\");" % \
+                (ptr_name,
+                 entry.return_type,
+                 entry.parameters,
+                 entry.func_name)
+        print "  if (!%s) return -1;" % ptr_name
+    print "  return 0;"
+    print "}"
+
+
+def gen_windows_def_file(entries):
+    """Generate a windows DLL .def file. |entries| is a list of Entry instances.
+    """
+    print "EXPORTS"
+    for entry in entries:
+        print "    %s" % entry.func_name
+
+
+def gen_unix_sym_file(entries):
+    """Generate an ELF linker version file. |entries| is a list of Entry
+       instances.
+    """
+    print "VERSION {"
+    print "\tglobal:"
+    for entry in entries:
+        print "\t\t%s;" % entry.func_name
+    print "\tlocal:"
+    print "\t\t*;"
+    print "};"
+
+def gen_symbols(entries, underscore):
+    """Generate a list of symbols from |entries|, a list of Entry instances.
+       |underscore| is a boolean. If True, then prepend an underscore to each
+       symbol name.
+    """
+    prefix = ""
+    if underscore:
+        prefix = "_"
+    for entry in entries:
+        print "%s%s" % (prefix, entry.func_name)
+
+def parse_file(filename, lines, mode):
+    """Generate one of possible outputs from |filename|. |lines| must be a list
+       of text lines from the file, and |mode| is one of the --mode option
+       values.
+    """
+    entries, prefix_name, verbatim, errors = parse_entries_file(lines)
+    if errors:
+        for error in errors:
+            print >> sys.stderr, "ERROR: %s:%s" % (filename, error)
+        sys.exit(1)
+
+    if not prefix_name:
+        prefix_name = "unknown"
+
+    if mode == 'def':
+        gen_windows_def_file(entries)
+    elif mode == 'sym':
+        gen_unix_sym_file(entries)
+    elif mode == 'wrapper':
+        gen_dll_wrapper(entries, prefix_name, verbatim, filename)
+    elif mode == 'symbols':
+        gen_symbols(entries, False)
+    elif mode == '_symbols':
+        gen_symbols(entries, True)
+    elif mode == 'functions':
+        gen_functions_header(entries, prefix_name, verbatim, filename)
+
+
+# List of valid --mode option values.
+mode_list = ['def', 'sym', 'wrapper', 'symbols', '_symbols', 'functions']
+
+# Argument parsing.
+parser = argparse.ArgumentParser(
+    formatter_class=argparse.RawDescriptionHelpFormatter,
+    description="""\
+A script used to parse an .entries input file containing a list of function
+declarations, and generate various output files depending on the value of
+the --mode option, which can be:
+
+  def        Generate a windows DLL .def file.
+  sym        Generate a Unix .so linker script.
+  wrapper    Generate a C source file containing wrapper functions.
+  symbols    Generate a simple list of symbols, one per line.
+  _symbols   Generate a simple list of symbols, prefixed with _.
+  functions  Generate a C header containing a macro listing all functions.
+
+""")
+parser.add_argument("--mode", help="Output mode", choices=mode_list)
+parser.add_argument("--output", help="output file")
+parser.add_argument("file", help=".entries file path")
+
+args = parser.parse_args()
+
+if not args.mode:
+    print >> sys.stderr, "ERROR: Please use --mode=<name>, see --help."
+    sys.exit(1)
+
+if args.output:
+    sys.stdout = open(args.output, "w+")
+
+if args.file == '--':
+    parse_file("<stdin>", sys.stdin, args.mode)
+else:
+    parse_file(args.file, open(args.file), args.mode)
diff --git a/audio/wrappers/alsa.c b/audio/wrappers/alsa.c
index 2b364c2..fae8116 100644
--- a/audio/wrappers/alsa.c
+++ b/audio/wrappers/alsa.c
@@ -1,5 +1,4 @@
-// Auto-generated from: audio/wrappers/alsa.entries
-// With android/scripts/gen-dll-wrapper.py
+// Auto-generated with: android/scripts/gen-entries.py --mode=wrapper audio/wrappers/alsa.entries
 // DO NOT EDIT THIS FILE
 
 #include <dlfcn.h>
diff --git a/audio/wrappers/esound.c b/audio/wrappers/esound.c
index 63e5b6a..4c632f3 100644
--- a/audio/wrappers/esound.c
+++ b/audio/wrappers/esound.c
@@ -1,5 +1,4 @@
-// Auto-generated from: audio/wrappers/esound.entries
-// With android/scripts/gen-dll-wrapper.py
+// Auto-generated with: android/scripts/gen-entries.py --mode=wrapper audio/wrappers/esound.entries
 // DO NOT EDIT THIS FILE
 
 #include <dlfcn.h>
diff --git a/audio/wrappers/pulse-audio.c b/audio/wrappers/pulse-audio.c
index 479f375..99e859a 100644
--- a/audio/wrappers/pulse-audio.c
+++ b/audio/wrappers/pulse-audio.c
@@ -1,5 +1,4 @@
-// Auto-generated from: audio/wrappers/pulse-audio.entries
-// With android/scripts/gen-dll-wrapper.py
+// Auto-generated with: android/scripts/gen-entries.py --mode=wrapper audio/wrappers/pulse-audio.entries
 // DO NOT EDIT THIS FILE
 
 #include <dlfcn.h>
diff --git a/distrib/android-emugl/Android.mk b/distrib/android-emugl/Android.mk
index dbce05e..d6646f2 100644
--- a/distrib/android-emugl/Android.mk
+++ b/distrib/android-emugl/Android.mk
@@ -34,6 +34,14 @@
 EMUGL_COMMON_CFLAGS += -O0 -g -DEMUGL_DEBUG=1
 endif
 
+EMUGL_COMMON_CFLAGS += -DEMUGL_BUILD=1
+ifeq (linux,$(HOST_OS))
+EMUGL_COMMON_CFLAGS += -fvisibility=internal
+endif
+ifeq (darwin,$(HOST_OS))
+EMUGL_COMMON_CFLAGS += -fvisibility=hidden
+endif
+
 # Uncomment the following line if you want to enable debug traces
 # in the GLES emulation libraries.
 # EMUGL_COMMON_CFLAGS += -DEMUGL_DEBUG=1
diff --git a/distrib/android-emugl/host/libs/Translator/EGL/Android.mk b/distrib/android-emugl/host/libs/Translator/EGL/Android.mk
index 9fab441..06e05c5 100644
--- a/distrib/android-emugl/host/libs/Translator/EGL/Android.mk
+++ b/distrib/android-emugl/host/libs/Translator/EGL/Android.mk
@@ -28,6 +28,7 @@
      EglConfig.cpp            \
      EglContext.cpp           \
      EglGlobalInfo.cpp        \
+     EglOsApi_osmesa.cpp      \
      EglValidate.cpp          \
      EglSurface.cpp           \
      EglWindowSurface.cpp     \
diff --git a/distrib/android-emugl/host/libs/Translator/EGL/EglGlobalInfo.cpp b/distrib/android-emugl/host/libs/Translator/EGL/EglGlobalInfo.cpp
index fc6d1c8..25e8bbf 100644
--- a/distrib/android-emugl/host/libs/Translator/EGL/EglGlobalInfo.cpp
+++ b/distrib/android-emugl/host/libs/Translator/EGL/EglGlobalInfo.cpp
@@ -18,9 +18,13 @@
 #include "ClientAPIExts.h"
 #include "EglDisplay.h"
 #include "EglOsApi.h"
+#include "EglOsApi_osmesa.h"
+
+#include "OpenglCodecCommon/ErrorLog.h"
 
 #include "emugl/common/lazy_instance.h"
 
+#include <stdlib.h>
 #include <string.h>
 
 namespace {
@@ -40,8 +44,21 @@
         m_engine(NULL),
         m_display(NULL),
         m_lock() {
-    // TODO(digit): Choose alternate engine based on env. variable?
-    m_engine = EglOS::Engine::getHostInstance();
+    const char* env = ::getenv("ANDROID_EGL_ENGINE");
+    if (env) {
+        if (!strcmp(env, "osmesa")) {
+            m_engine = EglOS::getOSMesaEngineInstance();
+            if (!m_engine) {
+                ERR("%s: Could not load OSMesa library!\n", __FUNCTION__);
+            }
+        } else {
+            ERR("%s: Unknown ANDROID_EGL_ENGINE value '%s' ignored\n",
+                __FUNCTION__, env);
+        }
+    }
+    if (!m_engine) {
+        m_engine = EglOS::Engine::getHostInstance();
+    }
     m_display = m_engine->getDefaultDisplay();
 
     memset(m_gles_ifaces, 0, sizeof(m_gles_ifaces));
diff --git a/distrib/android-emugl/host/libs/Translator/EGL/EglImp.cpp b/distrib/android-emugl/host/libs/Translator/EGL/EglImp.cpp
index 31bb76e..9b98272 100644
--- a/distrib/android-emugl/host/libs/Translator/EGL/EglImp.cpp
+++ b/distrib/android-emugl/host/libs/Translator/EGL/EglImp.cpp
@@ -84,8 +84,10 @@
 #define EGL_EXTENTIONS 2
 
 //decleration
+extern "C" {
 EGLAPI EGLImageKHR EGLAPIENTRY eglCreateImageKHR(EGLDisplay display, EGLContext context, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list);
 EGLAPI EGLBoolean EGLAPIENTRY eglDestroyImageKHR(EGLDisplay display, EGLImageKHR image);
+}  // extern "C"
 
 // extentions descriptors
 static const ExtentionDescriptor s_eglExtentions[] = {
diff --git a/distrib/android-emugl/host/libs/Translator/EGL/EglOsApi_osmesa.cpp b/distrib/android-emugl/host/libs/Translator/EGL/EglOsApi_osmesa.cpp
new file mode 100644
index 0000000..9547bb3
--- /dev/null
+++ b/distrib/android-emugl/host/libs/Translator/EGL/EglOsApi_osmesa.cpp
@@ -0,0 +1,450 @@
+// Copyright (C) 2015 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "EglOsApi_osmesa.h"
+
+#include "OpenglCodecCommon/ErrorLog.h"
+
+#include "emugl/common/lazy_instance.h"
+#include "emugl/common/shared_library.h"
+
+#ifdef __APPLE__
+#include <OpenGL/gl.h>
+#else
+#include <GL/gl.h>
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+// WARNING: THIS IS PROBABLY VERY BROKEN AT THIS POINT
+
+namespace {
+
+using emugl::SharedLibrary;
+
+// OSMesa declarations, these come from <GL/osmesa.h> adapted to lazily
+// load and use the library.
+
+// Passed as |format| values to OSMesaCreateContext() and
+// OSMesaCreateContextExt()
+#define OSMESA_RGBA GL_RGBA
+#define OSMESA_RGB  GL_RGB
+
+#ifdef _WIN32
+#  define OSMESA_APICALL  __declspec(dllimport)
+#  define OSMESA_APIENTRY __stdcall
+#else
+#  define OSMESA_APICALL
+#  define OSMESA_APIENTRY
+#endif
+
+// A context object backed by the OSMesa library.
+typedef struct osmesa_context* OSMesaContext;
+
+// A macro used to list the declarations of all OSMesa functions exported
+// by libosmesa.so that we want to use. |X| is a macro that takes three
+// parameters which are:
+//   - The function return type.
+//   - The function name.
+//   - The function signature.
+#define OSMESA_LIST_FUNCTIONS(X)                                \
+    X(OSMesaContext,OSMesaCreateContextExt,                     \
+            (GLenum format, GLint depthBits, GLint stencilBits, \
+             GLint accumBits,OSMesaContext sharedlist))         \
+    X(void,OSMesaDestroyContext,(OSMesaContext context))        \
+    X(GLboolean,OSMesaMakeCurrent,                              \
+            (OSMesaContext ctx, void* buffer, GLenum type,      \
+             GLsizei width, GLsizei height))                    \
+
+// osmesa_funcs is a structure containing pointers to OSMesa functions.
+#define OSMESA_DEFINE_FUNC_POINTER(rettype,name,signature) \
+    OSMESA_APICALL rettype (OSMESA_APIENTRY *name) signature;
+
+#define OSMESA_LOAD_FUNC_POINTER(rettype,name,signature) \
+    this->name = reinterpret_cast<OSMESA_APICALL rettype(OSMESA_APIENTRY *)signature>(  \
+            mLib->findSymbol(#name));                      \
+    if (!this->name) goto EXIT;
+
+// OSMesaFuncs is a structure that contains pointers to the OSMesa functions
+// exported from libosmesa.so. Call the init() function to initialize it, then
+// use each pointer directly to make function calls into the library.
+class OSMesaFuncs {
+public:
+    OSMesaFuncs() : mOk(false), mLib(NULL) {
+#ifdef _WIN32
+        const char kLibName[] = "osmesa";
+#else
+        const char kLibName[] = "libosmesa";
+#endif
+        mLib = SharedLibrary::open(kLibName);
+        if (mLib) {
+            OSMESA_LIST_FUNCTIONS(OSMESA_LOAD_FUNC_POINTER)
+            mOk = true;
+        EXIT:
+            ;
+        }
+    }
+
+    ~OSMesaFuncs() {
+        delete mLib;
+    }
+
+    bool ok() const { return mOk; }
+
+    // Define function pointers.
+    OSMESA_LIST_FUNCTIONS(OSMESA_DEFINE_FUNC_POINTER)
+
+private:
+    bool mOk;
+    SharedLibrary* mLib;
+};
+
+emugl::LazyInstance<OSMesaFuncs> sOSMesaFuncs = LAZY_INSTANCE_INIT;
+
+const OSMesaFuncs* osmesa() {
+    return sOSMesaFuncs.ptr();
+}
+
+// A small structure used to describe a supported pixel format.
+// |pixelFormat| is the pixel format, using OSMesa constants, i.e.
+// OSMESA_RGB or OSMESA_RGBA.
+// |depthSize| is the depth size in bits. 0 for none.
+// |stencilSize| is the stencil size in bits. 0 for none.
+struct PixelConfig {
+    int pixelFormat;
+    int depthBits;
+    int stencilBits;
+};
+
+// A list of supported pixel configurations.
+static const PixelConfig kPixelConfigs[] = {
+    { OSMESA_RGB, 24, 8 },
+    { OSMESA_RGBA, 24, 8 },
+    { OSMESA_RGB, 0, 0 },
+    { OSMESA_RGBA, 0, 0 },
+};
+
+static const int kPixelConfigsLen =
+        sizeof(kPixelConfigs) / sizeof(kPixelConfigs[0]);
+
+// EglOS::PixelFormat implementation for OSMesa, which simply wraps a
+// PixelConfig pointer.
+class OffscreenMesaPixelFormat : public EglOS::PixelFormat {
+public:
+    explicit OffscreenMesaPixelFormat(const PixelConfig* pixelConfig) :
+            mPixelConfig(pixelConfig) {}
+
+    virtual EglOS::PixelFormat* clone() {
+        return new OffscreenMesaPixelFormat(mPixelConfig);
+    }
+
+    const PixelConfig* pixelConfig() const { return mPixelConfig; }
+
+    static const OffscreenMesaPixelFormat* from(const EglOS::PixelFormat* f) {
+        return reinterpret_cast<const OffscreenMesaPixelFormat*>(f);
+    }
+
+private:
+    OffscreenMesaPixelFormat();
+    OffscreenMesaPixelFormat(const OffscreenMesaPixelFormat&);
+
+    const PixelConfig* mPixelConfig;
+};
+
+void pixelFormatToConfig(int index,
+                         int renderableType,
+                         const PixelConfig* pixelConfig,
+                         EglOS::AddConfigCallback addConfigFunc,
+                         void* addConfigOpaque) {
+    EglOS::ConfigInfo info;
+    memset(&info, 0, sizeof(info));
+
+    // Can't really implement EGL_WINDOW_BIT here!
+    info.surface_type |= EGL_PBUFFER_BIT;
+    info.native_visual_id = 0;
+    info.native_visual_type = EGL_NONE;
+    info.caveat = EGL_NONE;
+    info.renderable_type = renderableType;
+    info.native_renderable = EGL_FALSE;
+    info.max_pbuffer_width = PBUFFER_MAX_WIDTH;
+    info.max_pbuffer_height = PBUFFER_MAX_HEIGHT;
+    info.max_pbuffer_size = PBUFFER_MAX_PIXELS;
+    info.frame_buffer_level = 0;
+    info.trans_red_val = 0;
+    info.trans_green_val = 0;
+    info.trans_blue_val = 0;
+    info.transparent_type = EGL_NONE;
+    info.samples_per_pixel = 0;
+
+    switch (pixelConfig->pixelFormat) {
+    case OSMESA_RGB:
+        info.red_size = 8;
+        info.green_size = 8;
+        info.blue_size = 8;
+        info.alpha_size = 0;
+        break;
+    case OSMESA_RGBA:
+        info.red_size = 8;
+        info.green_size = 8;
+        info.blue_size = 8;
+        info.alpha_size = 8;
+        break;
+    default:
+        return;
+    }
+
+    info.stencil_size = pixelConfig->stencilBits;
+    info.depth_size = pixelConfig->depthBits;
+    info.config_id = (EGLint) index;
+    info.frmt = new OffscreenMesaPixelFormat(pixelConfig);
+
+    (*addConfigFunc)(addConfigOpaque, &info);
+}
+
+// EglOS::Surface based on OSMesa.
+class OffscreenMesaSurface : public EglOS::Surface {
+public:
+    OffscreenMesaSurface(int format, int width, int height) :
+            EglOS::Surface(PBUFFER),
+            mFormat(format),
+            mWidth(width),
+            mHeight(height),
+            mData(NULL) {
+        int pitch = width * 4;
+        mData = static_cast<uint8_t*>(::calloc(pitch, height));
+    }
+
+    ~OffscreenMesaSurface() {
+        free(mData);
+    }
+
+    int format() const { return mFormat; }
+    int width() const { return mWidth; }
+    int height() const { return mHeight; }
+    uint8_t* data() const { return mData; }
+
+    static OffscreenMesaSurface* from(EglOS::Surface* s) {
+        return static_cast<OffscreenMesaSurface*>(s);
+    }
+
+private:
+    int mFormat;
+    int mWidth;
+    int mHeight;
+    uint8_t* mData;
+};
+
+// ElgOS::Context implementation based on OSMesa.
+class OffscreenMesaContext : public EglOS::Context {
+public:
+    OffscreenMesaContext(const PixelConfig* pixelConfig,
+                         OffscreenMesaContext* shareList) {
+        mContext = osmesa()->OSMesaCreateContextExt(
+                pixelConfig->pixelFormat,
+                pixelConfig->depthBits,
+                pixelConfig->stencilBits,
+                0,
+                shareList ? shareList->osmesaContext() : NULL);
+    }
+
+    virtual ~OffscreenMesaContext() {
+        if (mContext) {
+            osmesa()->OSMesaDestroyContext(mContext);
+        }
+    }
+
+    OSMesaContext osmesaContext() const { return mContext; }
+
+    static OffscreenMesaContext* from(EglOS::Context* c) {
+        return reinterpret_cast<OffscreenMesaContext*>(c);
+    }
+
+private:
+    OSMesaContext mContext;
+};
+
+// An implementation of EglOS::Display interface backed by OSMesa.
+class OffscreenMesaDisplay : public EglOS::Display {
+public:
+    virtual bool release() {
+        // TODO(digit)
+        return true;
+    }
+
+    virtual void queryConfigs(int renderableType,
+                              EglOS::AddConfigCallback* addConfigFunc,
+                              void* addConfigOpaque) {
+        for (int n = 0; n < kPixelConfigsLen; ++n) {
+            pixelFormatToConfig(n,
+                                renderableType,
+                                &kPixelConfigs[n],
+                                addConfigFunc,
+                                addConfigOpaque);
+        }
+    }
+
+    virtual bool isValidNativeWin(EglOS::Surface* win) {
+        return win->type() == EglOS::Surface::WINDOW;
+    }
+
+    virtual bool isValidNativeWin(EGLNativeWindowType win) {
+        return false;
+    }
+
+    virtual bool isValidNativePixmap(EglOS::Surface* pix) {
+        return pix->type() == EglOS::Surface::PIXMAP;
+    }
+
+    virtual bool checkWindowPixelFormatMatch(
+            EGLNativeWindowType win,
+            const EglOS::PixelFormat* pixelFormat,
+            unsigned int* width,
+            unsigned int* height) {
+        return false;
+    }
+
+    virtual bool checkPixmapPixelFormatMatch(
+            EGLNativePixmapType pix,
+            const EglOS::PixelFormat* pixelFormat,
+            unsigned int* width,
+            unsigned int* height) {
+        return false;
+    }
+
+    virtual EglOS::Context* createContext(
+            const EglOS::PixelFormat* pixelFormat,
+            EglOS::Context* sharedContext) {
+        if (!pixelFormat) {
+            return NULL;
+        }
+        const PixelConfig* pixelConfig =
+                OffscreenMesaPixelFormat::from(pixelFormat)->pixelConfig();
+
+        OffscreenMesaContext* shared = NULL;
+        if (sharedContext) {
+            shared = OffscreenMesaContext::from(sharedContext);
+        }
+        return new OffscreenMesaContext(pixelConfig, shared);
+    }
+
+    virtual bool destroyContext(EglOS::Context* context) {
+        delete context;
+        return true;
+    }
+
+    virtual EglOS::Surface* createPbufferSurface(
+            const EglOS::PixelFormat* pixelFormat,
+            const EglOS::PbufferInfo* info) {
+        if (!pixelFormat || !info) {
+            return NULL;
+        }
+        // Determine OSMesa format of surface pixels.
+        const PixelConfig* pixelConfig =
+                OffscreenMesaPixelFormat::from(pixelFormat)->pixelConfig();
+
+        return new OffscreenMesaSurface(
+                pixelConfig->pixelFormat,
+                info->width,
+                info->height);
+    }
+
+    virtual bool releasePbuffer(EglOS::Surface* pb) {
+        if (!pb) {
+            return false;
+        }
+        return true;
+    }
+
+    virtual bool makeCurrent(EglOS::Surface* read,
+                             EglOS::Surface* draw,
+                             EglOS::Context* context) {
+        // TODO(digit): Determine what to do here.
+
+        // OSMesa doesn't allow one to unset the current context for now,
+        // so just return.
+        if (!read && !draw && !context) {
+            return true;
+        }
+
+        if (!read || !draw || !context) {
+            return false;
+        }
+
+        // TODO(digit): There is a big issue where OSMesaMakeCurrent()
+        // always assumes that the |read| and |draw| surfaces are the same :-(
+        if (read != draw) {
+            ERR("%s: read (%p) != draw (%p)\n", __FUNCTION__, read, draw);
+            return false;
+        }
+
+        OffscreenMesaSurface* osmesaRead = OffscreenMesaSurface::from(read);
+
+        GLboolean result = osmesa()->OSMesaMakeCurrent(
+                OffscreenMesaContext::from(context)->osmesaContext(),
+                static_cast<void*>(osmesaRead->data()),
+                GL_UNSIGNED_BYTE,
+                osmesaRead->width(),
+                osmesaRead->height());
+
+        return (result == GL_TRUE);
+    }
+
+    virtual void swapBuffers(EglOS::Surface* srfc) {
+        // TODO(digit): Determine what to do here.
+    }
+
+    virtual void swapInterval(EglOS::Surface* win, int interval) {
+        // TODO(digit): Determine what to do here.
+    }
+};
+
+// An implementation of the EglOS::Engine interface backed by OSMesa.
+class OSMesaEngine : public EglOS::Engine {
+public:
+    virtual EglOS::Display* getDefaultDisplay() {
+        return new OffscreenMesaDisplay();
+    }
+
+    virtual EglOS::Display* getInternalDisplay(EGLNativeDisplayType dpy) {
+        // No support for native host display types.
+        return NULL;
+    }
+
+    virtual EglOS::Surface* createWindowSurface(EGLNativeWindowType wnd) {
+        // Always return NULL since OSMesa doesn't support displaying
+        // anything on the host graphics system.
+        return NULL;
+    }
+
+    virtual EglOS::Surface* createPixmapSurface(EGLNativePixmapType pix) {
+        // Always return NULL since OSMesa doesn't support host pixmaps.
+        return NULL;
+    }
+
+    virtual void wait() {}
+};
+
+emugl::LazyInstance<OSMesaEngine> sOSMesaEngine = LAZY_INSTANCE_INIT;
+
+}  // namespace
+
+EglOS::Engine* EglOS::getOSMesaEngineInstance() {
+    // First try to load the offscreen mesa library, if this fail, return.
+    if (!osmesa()->ok()) {
+        return NULL;
+    }
+    return sOSMesaEngine.ptr();
+}
+
diff --git a/distrib/android-emugl/host/libs/Translator/EGL/EglOsApi_osmesa.h b/distrib/android-emugl/host/libs/Translator/EGL/EglOsApi_osmesa.h
new file mode 100644
index 0000000..858ab8d
--- /dev/null
+++ b/distrib/android-emugl/host/libs/Translator/EGL/EglOsApi_osmesa.h
@@ -0,0 +1,32 @@
+// Copyright (C) 2015 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef EGL_OS_API_OSMESA_H
+#define EGL_OS_API_OSMESA_H
+
+#include "EglOsApi.h"
+
+namespace EglOS {
+
+// Retrieve an instance of the EglOS::Engine interface class that is backed
+// by the Offscreen Mesa (OSMesa) library, which is a pure-software renderer
+// that doesn't support displaying native host windows.
+//
+// As such, createWindowSurface() and createPixmapSurface() will always
+// return NULL.
+Engine* getOSMesaEngineInstance();
+
+}  // namespace EglOS
+
+#endif  // EGL_OS_API_OSMESA_H
diff --git a/distrib/android-emugl/host/libs/Translator/GLES_CM/GLEScmImp.cpp b/distrib/android-emugl/host/libs/Translator/GLES_CM/GLEScmImp.cpp
index 7c410e0..2fd82fb 100644
--- a/distrib/android-emugl/host/libs/Translator/GLES_CM/GLEScmImp.cpp
+++ b/distrib/android-emugl/host/libs/Translator/GLES_CM/GLEScmImp.cpp
@@ -171,9 +171,11 @@
     return ret;
 }
 
-GL_API GLESiface* __translator_getIfaces(EGLiface* eglIface){
+GL_APICALL GLESiface* GL_APIENTRY __translator_getIfaces(EGLiface* eglIface);
+
+GLESiface* __translator_getIfaces(EGLiface* eglIface) {
     s_eglIface = eglIface;
-    return & s_glesIface;
+    return &s_glesIface;
 }
 
 }
@@ -1768,7 +1770,7 @@
     return ctx->dispatcher().glIsRenderbufferEXT(renderbuffer);
 }
 
-GL_API void GLAPIENTRY glBindRenderbufferOES(GLenum target, GLuint renderbuffer) {
+GL_API void GL_APIENTRY glBindRenderbufferOES(GLenum target, GLuint renderbuffer) {
     GET_CTX()
     SET_ERROR_IF(!ctx->getCaps()->GL_EXT_FRAMEBUFFER_OBJECT,GL_INVALID_OPERATION);
     SET_ERROR_IF(!GLEScmValidate::renderbufferTarget(target),GL_INVALID_ENUM);
@@ -1788,7 +1790,7 @@
     ctx->setRenderbufferBinding(renderbuffer);
 }
 
-GL_API void GLAPIENTRY glDeleteRenderbuffersOES(GLsizei n, const GLuint *renderbuffers) {
+GL_API void GL_APIENTRY glDeleteRenderbuffersOES(GLsizei n, const GLuint *renderbuffers) {
     GET_CTX()
     SET_ERROR_IF(!ctx->getCaps()->GL_EXT_FRAMEBUFFER_OBJECT,GL_INVALID_OPERATION);
     for (int i=0;i<n;++i) {
@@ -1797,7 +1799,7 @@
     }
 }
 
-GL_API void GLAPIENTRY glGenRenderbuffersOES(GLsizei n, GLuint *renderbuffers) {
+GL_API void GL_APIENTRY glGenRenderbuffersOES(GLsizei n, GLuint *renderbuffers) {
     GET_CTX()
     SET_ERROR_IF(!ctx->getCaps()->GL_EXT_FRAMEBUFFER_OBJECT,GL_INVALID_OPERATION);
     SET_ERROR_IF(n<0,GL_INVALID_VALUE);
@@ -1811,7 +1813,7 @@
     }
 }
 
-GL_API void GLAPIENTRY glRenderbufferStorageOES(GLenum target, GLenum internalformat, GLsizei width, GLsizei height){
+GL_API void GL_APIENTRY glRenderbufferStorageOES(GLenum target, GLenum internalformat, GLsizei width, GLsizei height){
     GET_CTX()
     SET_ERROR_IF(!ctx->getCaps()->GL_EXT_FRAMEBUFFER_OBJECT,GL_INVALID_OPERATION);
     SET_ERROR_IF(!GLEScmValidate::renderbufferTarget(target) || !GLEScmValidate::renderbufferInternalFrmt(ctx,internalformat) ,GL_INVALID_ENUM);
@@ -1841,7 +1843,7 @@
     ctx->dispatcher().glRenderbufferStorageEXT(target,internalformat,width,height);
 }
 
-GL_API void GLAPIENTRY glGetRenderbufferParameterivOES(GLenum target, GLenum pname, GLint* params) {
+GL_API void GL_APIENTRY glGetRenderbufferParameterivOES(GLenum target, GLenum pname, GLint* params) {
     GET_CTX()
     SET_ERROR_IF(!ctx->getCaps()->GL_EXT_FRAMEBUFFER_OBJECT,GL_INVALID_OPERATION);
     SET_ERROR_IF(!GLEScmValidate::renderbufferTarget(target) || !GLEScmValidate::renderbufferParams(pname) ,GL_INVALID_ENUM);
@@ -1903,7 +1905,7 @@
     ctx->dispatcher().glGetRenderbufferParameterivEXT(target,pname,params);
 }
 
-GL_API GLboolean GLAPIENTRY glIsFramebufferOES(GLuint framebuffer) {
+GL_API GLboolean GL_APIENTRY glIsFramebufferOES(GLuint framebuffer) {
     GET_CTX_RET(GL_FALSE)
     RET_AND_SET_ERROR_IF(!ctx->getCaps()->GL_EXT_FRAMEBUFFER_OBJECT,GL_INVALID_OPERATION,GL_FALSE);
     if (framebuffer && ctx->shareGroup().Ptr()) {
@@ -1912,7 +1914,7 @@
     return ctx->dispatcher().glIsFramebufferEXT(framebuffer);
 }
 
-GL_API void GLAPIENTRY glBindFramebufferOES(GLenum target, GLuint framebuffer) {
+GL_API void GL_APIENTRY glBindFramebufferOES(GLenum target, GLuint framebuffer) {
     GET_CTX()
     SET_ERROR_IF(!ctx->getCaps()->GL_EXT_FRAMEBUFFER_OBJECT,GL_INVALID_OPERATION);
     SET_ERROR_IF(!GLEScmValidate::framebufferTarget(target) ,GL_INVALID_ENUM);
@@ -1928,7 +1930,7 @@
     ctx->setFramebufferBinding(framebuffer);
 }
 
-GL_API void GLAPIENTRY glDeleteFramebuffersOES(GLsizei n, const GLuint *framebuffers) {
+GL_API void GL_APIENTRY glDeleteFramebuffersOES(GLsizei n, const GLuint *framebuffers) {
     GET_CTX()
     SET_ERROR_IF(!ctx->getCaps()->GL_EXT_FRAMEBUFFER_OBJECT,GL_INVALID_OPERATION);
     for (int i=0;i<n;++i) {
@@ -1937,7 +1939,7 @@
     }
 }
 
-GL_API void GLAPIENTRY glGenFramebuffersOES(GLsizei n, GLuint *framebuffers) {
+GL_API void GL_APIENTRY glGenFramebuffersOES(GLsizei n, GLuint *framebuffers) {
     GET_CTX()
     SET_ERROR_IF(!ctx->getCaps()->GL_EXT_FRAMEBUFFER_OBJECT,GL_INVALID_OPERATION);
     SET_ERROR_IF(n<0,GL_INVALID_VALUE);
@@ -1950,14 +1952,14 @@
     }
 }
 
-GL_API GLenum GLAPIENTRY glCheckFramebufferStatusOES(GLenum target) {
+GL_API GLenum GL_APIENTRY glCheckFramebufferStatusOES(GLenum target) {
     GET_CTX_RET(0)
     RET_AND_SET_ERROR_IF(!ctx->getCaps()->GL_EXT_FRAMEBUFFER_OBJECT,GL_INVALID_OPERATION,0);
     RET_AND_SET_ERROR_IF(!GLEScmValidate::framebufferTarget(target) ,GL_INVALID_ENUM,0);
     return ctx->dispatcher().glCheckFramebufferStatusEXT(target);
 }
 
-GL_API void GLAPIENTRY glFramebufferTexture2DOES(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) {
+GL_API void GL_APIENTRY glFramebufferTexture2DOES(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) {
     GET_CTX()
     SET_ERROR_IF(!ctx->getCaps()->GL_EXT_FRAMEBUFFER_OBJECT,GL_INVALID_OPERATION);
     SET_ERROR_IF(!GLEScmValidate::framebufferTarget(target) || !GLEScmValidate::framebufferAttachment(attachment) ||
@@ -1985,7 +1987,7 @@
     }
 }
 
-GL_API void GLAPIENTRY glFramebufferRenderbufferOES(GLenum target, GLenum attachment,GLenum renderbuffertarget, GLuint renderbuffer) {
+GL_API void GL_APIENTRY glFramebufferRenderbufferOES(GLenum target, GLenum attachment,GLenum renderbuffertarget, GLuint renderbuffer) {
     GET_CTX()
     SET_ERROR_IF(!ctx->getCaps()->GL_EXT_FRAMEBUFFER_OBJECT,GL_INVALID_OPERATION);
     SET_ERROR_IF(!GLEScmValidate::framebufferTarget(target) || 
@@ -2038,7 +2040,7 @@
     ctx->dispatcher().glFramebufferRenderbufferEXT(target,attachment,renderbuffertarget,globalBufferName);
 }
 
-GL_API void GLAPIENTRY glGetFramebufferAttachmentParameterivOES(GLenum target, GLenum attachment, GLenum pname, GLint *params) {
+GL_API void GL_APIENTRY glGetFramebufferAttachmentParameterivOES(GLenum target, GLenum attachment, GLenum pname, GLint *params) {
     GET_CTX()
     SET_ERROR_IF(!ctx->getCaps()->GL_EXT_FRAMEBUFFER_OBJECT,GL_INVALID_OPERATION);
     SET_ERROR_IF(!GLEScmValidate::framebufferTarget(target) || !GLEScmValidate::framebufferAttachment(attachment) ||
diff --git a/distrib/android-emugl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp b/distrib/android-emugl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp
index a6aac61..fefac09 100644
--- a/distrib/android-emugl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp
+++ b/distrib/android-emugl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp
@@ -117,12 +117,14 @@
     return ret;
 }
 
-GL_APICALL GLESiface* __translator_getIfaces(EGLiface* eglIface){
+GL_APICALL GLESiface* GL_APIENTRY __translator_getIfaces(EGLiface* eglIface);
+
+GLESiface* __translator_getIfaces(EGLiface* eglIface) {
     s_eglIface = eglIface;
     return & s_glesIface;
 }
 
-}
+}  // extern "C"
 
 static void s_attachShader(GLEScontext* ctx, GLuint program, GLuint shader) {
     if (ctx && program && shader && ctx->shareGroup().Ptr()) {
diff --git a/distrib/android-emugl/host/libs/Translator/GLcommon/Android.mk b/distrib/android-emugl/host/libs/Translator/GLcommon/Android.mk
index d1a462d..c547c21 100644
--- a/distrib/android-emugl/host/libs/Translator/GLcommon/Android.mk
+++ b/distrib/android-emugl/host/libs/Translator/GLcommon/Android.mk
@@ -7,7 +7,6 @@
      GLESvalidate.cpp        \
      GLESpointer.cpp         \
      GLESbuffer.cpp          \
-     DummyGLfuncs.cpp        \
      RangeManip.cpp          \
      TextureUtils.cpp        \
      PaletteTexture.cpp      \
diff --git a/distrib/android-emugl/host/libs/Translator/GLcommon/DummyGLfuncs.cpp b/distrib/android-emugl/host/libs/Translator/GLcommon/DummyGLfuncs.cpp
deleted file mode 100644
index cc0e3ec..0000000
--- a/distrib/android-emugl/host/libs/Translator/GLcommon/DummyGLfuncs.cpp
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
-* Copyright 2011 The Android Open Source Project
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-#include "DummyGLfuncs.h"
-
-    void GLAPIENTRY dummy_glActiveTexture ( GLenum texture ){}
-    void GLAPIENTRY dummy_glBindBuffer (GLenum target, GLuint buffer){}
-    void GLAPIENTRY dummy_glBindTexture (GLenum target, GLuint texture){}
-    void GLAPIENTRY dummy_glBlendFunc (GLenum sfactor, GLenum dfactor){}
-    void GLAPIENTRY dummy_glBlendEquation( GLenum mode ){}
-    void GLAPIENTRY dummy_glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha){}
-    void GLAPIENTRY dummy_glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha){}
-    void GLAPIENTRY dummy_glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage){}
-    void GLAPIENTRY dummy_glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data){}
-    void GLAPIENTRY dummy_glClear(GLbitfield mask){}
-    void GLAPIENTRY dummy_glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha){}
-    void GLAPIENTRY dummy_glClearStencil(GLint s){}
-    void GLAPIENTRY dummy_glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha){}
-    void GLAPIENTRY dummy_glCompressedTexImage2D( GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data ){}
-    void GLAPIENTRY dummy_glCompressedTexSubImage2D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data ){}
-    void GLAPIENTRY dummy_glCopyTexImage2D(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border){}
-    void GLAPIENTRY dummy_glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height){}
-    void GLAPIENTRY dummy_glCullFace(GLenum mode){}
-    void GLAPIENTRY dummy_glDeleteBuffers(GLsizei n, const GLuint *buffers){}
-    void GLAPIENTRY dummy_glDeleteTextures(GLsizei n, const GLuint *textures){}
-    void GLAPIENTRY dummy_glDepthFunc(GLenum func){}
-    void GLAPIENTRY dummy_glDepthMask(GLboolean flag){}
-    void GLAPIENTRY dummy_glDepthRange(GLclampd zNear, GLclampd zFar){}
-    void GLAPIENTRY dummy_glDisable(GLenum cap){}
-    void GLAPIENTRY dummy_glDrawArrays(GLenum mode, GLint first, GLsizei count){}
-    void GLAPIENTRY dummy_glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices){}
-    void GLAPIENTRY dummy_glEnable(GLenum cap){}
-    void GLAPIENTRY dummy_glFinish(void){}
-    void GLAPIENTRY dummy_glFlush(void){}
-    void GLAPIENTRY dummy_glFrontFace(GLenum mode){}
-    void GLAPIENTRY dummy_glGenBuffers(GLsizei n, GLuint *buffers){}
-    void GLAPIENTRY dummy_glGenTextures(GLsizei n, GLuint *textures){}
-    void GLAPIENTRY dummy_glGetBooleanv(GLenum pname, GLboolean *params){}
-    void GLAPIENTRY dummy_glGetBufferParameteriv(GLenum, GLenum, GLint *){}
-    GLenum GLAPIENTRY dummy_glGetError(void){ return 0;}
-    void GLAPIENTRY dummy_glGetFloatv(GLenum pname, GLfloat *params){}
-    void GLAPIENTRY dummy_glGetIntegerv(GLenum pname, GLint *params){}
-    const GLubyte * GLAPIENTRY dummy_glGetString(GLenum name){ return 0;}
-    void GLAPIENTRY dummy_glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params){}
-    void GLAPIENTRY dummy_glGetTexParameteriv(GLenum target, GLenum pname, GLint *params){}
-    void GLAPIENTRY dummy_glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params){}
-    void GLAPIENTRY dummy_glHint(GLenum target, GLenum mode){}
-    GLboolean GLAPIENTRY dummy_glIsBuffer(GLuint){ return false;}
-    GLboolean GLAPIENTRY dummy_glIsEnabled(GLenum cap){ return false;}
-    GLboolean GLAPIENTRY dummy_glIsTexture(GLuint texture){return false;}
-    void GLAPIENTRY dummy_glLineWidth(GLfloat width){}
-    void GLAPIENTRY dummy_glPolygonOffset(GLfloat factor, GLfloat units){}
-    void GLAPIENTRY dummy_glPixelStorei(GLenum pname, GLint param){}
-    void GLAPIENTRY dummy_glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels){}
-    void GLAPIENTRY dummy_glSampleCoverage(GLclampf value, GLboolean invert ){}
-    void GLAPIENTRY dummy_glScissor(GLint x, GLint y, GLsizei width, GLsizei height){}
-    void GLAPIENTRY dummy_glStencilFunc(GLenum func, GLint ref, GLuint mask){}
-    void GLAPIENTRY dummy_glStencilMask(GLuint mask){}
-    void GLAPIENTRY dummy_glStencilOp(GLenum fail, GLenum zfail, GLenum zpass){}
-    void GLAPIENTRY dummy_glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels){}
-    void GLAPIENTRY dummy_glTexParameteri(GLenum target, GLenum pname, GLint param){}
-    void GLAPIENTRY dummy_glTexParameteriv(GLenum target, GLenum pname, const GLint *params){}
-    void GLAPIENTRY dummy_glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels){}
-    void GLAPIENTRY dummy_glViewport(GLint x, GLint y, GLsizei width, GLsizei height){}
-    void GLAPIENTRY dummy_glPushAttrib( GLbitfield mask ){}
-    void GLAPIENTRY dummy_glPopAttrib( void ){}
-    void GLAPIENTRY dummy_glPushClientAttrib( GLbitfield mask ){}
-    void GLAPIENTRY dummy_glPopClientAttrib( void ){}
-
-    /* OpenGL functions which are needed ONLY for implementing GLES 1.1*/
-    void GLAPIENTRY dummy_glAlphaFunc(GLenum func, GLclampf ref){}
-    void GLAPIENTRY dummy_glBegin( GLenum mode ){}
-    void GLAPIENTRY dummy_glClearDepth(GLclampd depth){}
-    void GLAPIENTRY dummy_glClientActiveTexture( GLenum texture ){}
-    void GLAPIENTRY dummy_glClipPlane(GLenum plane, const GLdouble *equation){}
-    void GLAPIENTRY dummy_glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha){}
-    void GLAPIENTRY dummy_glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha){}
-    void GLAPIENTRY dummy_glColor4fv( const GLfloat *v ){}
-    void GLAPIENTRY dummy_glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha){}
-    void GLAPIENTRY dummy_glColor4ubv( const GLubyte *v ){}
-    void GLAPIENTRY dummy_glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer){}
-    void GLAPIENTRY dummy_glDisableClientState(GLenum array){}
-    void GLAPIENTRY dummy_glEnableClientState(GLenum array){}
-    void GLAPIENTRY dummy_glEnd(void){}
-    void GLAPIENTRY dummy_glFogf(GLenum pname, GLfloat param){}
-    void GLAPIENTRY dummy_glFogfv(GLenum pname, const GLfloat *params){}
-    void GLAPIENTRY dummy_glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar){}
-    void GLAPIENTRY dummy_glGetClipPlane(GLenum plane, GLdouble *equation){}
-    void GLAPIENTRY dummy_glGetDoublev( GLenum pname, GLdouble *params ){}
-    void GLAPIENTRY dummy_glGetLightfv(GLenum light, GLenum pname, GLfloat *params){}
-    void GLAPIENTRY dummy_glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params){}
-    void GLAPIENTRY dummy_glGetPointerv(GLenum pname, GLvoid* *params){}
-    void GLAPIENTRY dummy_glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params){}
-    void GLAPIENTRY dummy_glGetTexEnviv(GLenum target, GLenum pname, GLint *params){}
-    void GLAPIENTRY dummy_glLightf(GLenum light, GLenum pname, GLfloat param){}
-    void GLAPIENTRY dummy_glLightfv(GLenum light, GLenum pname, const GLfloat *params){}
-    void GLAPIENTRY dummy_glLightModelf(GLenum pname, GLfloat param){}
-    void GLAPIENTRY dummy_glLightModelfv(GLenum pname, const GLfloat *params){}
-    void GLAPIENTRY dummy_glLoadIdentity(void){}
-    void GLAPIENTRY dummy_glLoadMatrixf(const GLfloat *m){}
-    void GLAPIENTRY dummy_glLogicOp(GLenum opcode){}
-    void GLAPIENTRY dummy_glMaterialf(GLenum face, GLenum pname, GLfloat param){}
-    void GLAPIENTRY dummy_glMaterialfv(GLenum face, GLenum pname, const GLfloat *params){}
-    void GLAPIENTRY dummy_glMultiTexCoord2fv( GLenum target, const GLfloat *v ){}
-    void GLAPIENTRY dummy_glMultiTexCoord2sv( GLenum target, const GLshort *v ){}
-    void GLAPIENTRY dummy_glMultiTexCoord3fv( GLenum target, const GLfloat *v ){}
-    void GLAPIENTRY dummy_glMultiTexCoord3sv( GLenum target, const GLshort *v ){}
-    void GLAPIENTRY dummy_glMultiTexCoord4f( GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q ){}
-    void GLAPIENTRY dummy_glMultiTexCoord4fv( GLenum target, const GLfloat *v ){}
-    void GLAPIENTRY dummy_glMultiTexCoord4sv( GLenum target, const GLshort *v ){}
-    void GLAPIENTRY dummy_glMultMatrixf(const GLfloat *m){}
-    void GLAPIENTRY dummy_glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz){}
-    void GLAPIENTRY dummy_glNormal3fv( const GLfloat *v ){}
-    void GLAPIENTRY dummy_glNormal3sv(const GLshort *v ){}
-    void GLAPIENTRY dummy_glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar){}
-    void GLAPIENTRY dummy_glPointParameterf(GLenum, GLfloat){}
-    void GLAPIENTRY dummy_glPointParameterfv(GLenum, const GLfloat *){}
-    void GLAPIENTRY dummy_glPointSize(GLfloat size){}
-    void GLAPIENTRY dummy_glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z){}
-    void GLAPIENTRY dummy_glScalef(GLfloat x, GLfloat y, GLfloat z){}
-    void GLAPIENTRY dummy_glTexEnvf(GLenum target, GLenum pname, GLfloat param){}
-    void GLAPIENTRY dummy_glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params){}
-    void GLAPIENTRY dummy_glTexParameterf(GLenum target, GLenum pname, GLfloat param){}
-    void GLAPIENTRY dummy_glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params){}
-    void GLAPIENTRY dummy_glMatrixMode(GLenum mode){}
-    void GLAPIENTRY dummy_glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer){}
-    void GLAPIENTRY dummy_glPopMatrix(void){}
-    void GLAPIENTRY dummy_glPushMatrix(void){}
-    void GLAPIENTRY dummy_glShadeModel(GLenum mode){}
-    void GLAPIENTRY dummy_glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer){}
-    void GLAPIENTRY dummy_glTexEnvi(GLenum target, GLenum pname, GLint param){}
-    void GLAPIENTRY dummy_glTexEnviv(GLenum target, GLenum pname, const GLint *params){}
-    void GLAPIENTRY dummy_glTranslatef(GLfloat x, GLfloat y, GLfloat z){}
-    void GLAPIENTRY dummy_glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer){}
-
-    /* OpenGL functions which are needed ONLY for implementing GLES 1.1 EXTENSIONS*/
-    GLboolean GLAPIENTRY dummy_glIsRenderbufferEXT(GLuint renderbuffer){ return false;}
-    void GLAPIENTRY dummy_glBindRenderbufferEXT(GLenum target, GLuint renderbuffer){}
-    void GLAPIENTRY dummy_glDeleteRenderbuffersEXT(GLsizei n, const GLuint *renderbuffers){}
-    void GLAPIENTRY dummy_glGenRenderbuffersEXT(GLsizei n, GLuint *renderbuffers){}
-    void GLAPIENTRY dummy_glRenderbufferStorageEXT(GLenum target, GLenum internalformat, GLsizei width, GLsizei height){}
-    void GLAPIENTRY dummy_glGetRenderbufferParameterivEXT(GLenum target, GLenum pname, GLint *params){}
-    GLboolean GLAPIENTRY dummy_glIsFramebufferEXT(GLuint framebuffer){ return false;}
-    void GLAPIENTRY dummy_glBindFramebufferEXT(GLenum target, GLuint framebuffer){}
-    void GLAPIENTRY dummy_glDeleteFramebuffersEXT(GLsizei n, const GLuint *framebuffers){}
-    void GLAPIENTRY dummy_glGenFramebuffersEXT(GLsizei n, GLuint *framebuffers){}
-    GLenum GLAPIENTRY dummy_glCheckFramebufferStatusEXT(GLenum target){ return 0;}
-    void GLAPIENTRY dummy_glFramebufferTexture1DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level){}
-    void GLAPIENTRY dummy_glFramebufferTexture2DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level){}
-    void GLAPIENTRY dummy_glFramebufferTexture3DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset){}
-    void GLAPIENTRY dummy_glFramebufferRenderbufferEXT(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer){}
-    void GLAPIENTRY dummy_glGetFramebufferAttachmentParameterivEXT(GLenum target, GLenum attachment, GLenum pname, GLint *params){}
-    void GLAPIENTRY dummy_glGenerateMipmapEXT(GLenum target){}
-    void GLAPIENTRY dummy_glCurrentPaletteMatrixARB(GLint index){}
-    void GLAPIENTRY dummy_glMatrixIndexuivARB(GLint size, GLuint * indices){}
-    void GLAPIENTRY dummy_glMatrixIndexPointerARB(GLint size, GLenum type, GLsizei stride, const GLvoid* pointer){}
-    void GLAPIENTRY dummy_glWeightPointerARB(GLint size, GLenum type, GLsizei stride, const GLvoid* pointer){}
-    void GLAPIENTRY dummy_glTexGenf(GLenum coord, GLenum pname, GLfloat param ){}
-    void GLAPIENTRY dummy_glTexGeni(GLenum coord, GLenum pname, GLint param ){}
-    void GLAPIENTRY dummy_glTexGenf(GLenum coord, GLenum pname, const GLfloat *params ){}
-    void GLAPIENTRY dummy_glTexGeniv(GLenum coord, GLenum pname, const GLint *params ){}
-    void GLAPIENTRY dummy_glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params ){}
-    void GLAPIENTRY dummy_glGetTexGeniv(GLenum coord, GLenum pname, GLint *params ){}
-
-    /* Loading OpenGL functions which are needed ONLY for implementing GLES 2.0*/
-    void GL_APIENTRY dummy_glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha){}
-    void GL_APIENTRY dummy_glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask){}
-    void GL_APIENTRY dummy_glStencilMaskSeparate(GLenum face, GLuint mask){}
-    void GL_APIENTRY dummy_glGenerateMipmap(GLenum target){}
-    void GL_APIENTRY dummy_glBindFramebuffer(GLenum target, GLuint framebuffer){}
-    void GL_APIENTRY dummy_glBindRenderbuffer(GLenum target, GLuint renderbuffer){}
-    void GL_APIENTRY dummy_glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers){}
-    void GL_APIENTRY dummy_glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers){}
-    GLboolean GL_APIENTRY dummy_glIsProgram(GLuint program){ return false;}
-    GLboolean GL_APIENTRY dummy_glIsShader(GLuint shader){ return false;}
-    void GL_APIENTRY dummy_glVertexAttrib1f(GLuint indx, GLfloat x){}
-    void GL_APIENTRY dummy_glVertexAttrib1fv(GLuint indx, const GLfloat* values){}
-    void GL_APIENTRY dummy_glVertexAttrib2f(GLuint indx, GLfloat x, GLfloat y){}
-    void GL_APIENTRY dummy_glVertexAttrib2fv(GLuint indx, const GLfloat* values){}
-    void GL_APIENTRY dummy_glVertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z){}
-    void GL_APIENTRY dummy_glVertexAttrib3fv(GLuint indx, const GLfloat* values){}
-    void GL_APIENTRY dummy_glVertexAttrib4f(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w){}
-    void GL_APIENTRY dummy_glVertexAttrib4fv(GLuint indx, const GLfloat* values){}
-    void GL_APIENTRY dummy_glVertexAttribPointer(GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr){}
-    void GL_APIENTRY dummy_glDisableVertexAttribArray(GLuint index){}
-    void GL_APIENTRY dummy_glEnableVertexAttribArray(GLuint index){}
-    void GL_APIENTRY dummy_glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params){}
-    void GL_APIENTRY dummy_glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params){}
-    void GL_APIENTRY dummy_glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer){}
-    void GL_APIENTRY dummy_glUniform1f(GLint location, GLfloat x){}
-    void GL_APIENTRY dummy_glUniform1fv(GLint location, GLsizei count, const GLfloat* v){}
-    void GL_APIENTRY dummy_glUniform1i(GLint location, GLint x){}
-    void GL_APIENTRY dummy_glUniform1iv(GLint location, GLsizei count, const GLint* v){}
-    void GL_APIENTRY dummy_glUniform2f(GLint location, GLfloat x, GLfloat y){}
-    void GL_APIENTRY dummy_glUniform2fv(GLint location, GLsizei count, const GLfloat* v){}
-    void GL_APIENTRY dummy_glUniform2i(GLint location, GLint x, GLint y){}
-    void GL_APIENTRY dummy_glUniform2iv(GLint location, GLsizei count, const GLint* v){}
-    void GL_APIENTRY dummy_glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z){}
-    void GL_APIENTRY dummy_glUniform3fv(GLint location, GLsizei count, const GLfloat* v){}
-    void GL_APIENTRY dummy_glUniform3i(GLint location, GLint x, GLint y, GLint z){}
-    void GL_APIENTRY dummy_glUniform3iv(GLint location, GLsizei count, const GLint* v){}
-    void GL_APIENTRY dummy_glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w){}
-    void GL_APIENTRY dummy_glUniform4fv(GLint location, GLsizei count, const GLfloat* v){}
-    void GL_APIENTRY dummy_glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w){}
-    void GL_APIENTRY dummy_glUniform4iv(GLint location, GLsizei count, const GLint* v){}
-    void GL_APIENTRY dummy_glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value){}
-    void GL_APIENTRY dummy_glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value){}
-    void GL_APIENTRY dummy_glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value){}
-    void GL_APIENTRY dummy_glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params){}
-    void GL_APIENTRY dummy_glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params){}
-    GLboolean GL_APIENTRY dummy_glIsFramebuffer(GLuint framebuffer){ return false;}
-    GLboolean GL_APIENTRY dummy_glIsRenderbuffer(GLuint renderbuffer){ return false;}
-    GLenum GL_APIENTRY dummy_glCheckFramebufferStatus(GLenum target){ return 0;}
-    void GL_APIENTRY dummy_glAttachShader(GLuint program, GLuint shader){}
-    void GL_APIENTRY dummy_glBindAttribLocation(GLuint program, GLuint index, const GLchar* name){}
-    void GL_APIENTRY dummy_glCompileShader(GLuint shader){}
-    GLuint GL_APIENTRY dummy_glCreateProgram(void){ return 0;}
-    GLuint GL_APIENTRY dummy_glCreateShader(GLenum type){ return 0;}
-    void GL_APIENTRY dummy_glDeleteProgram(GLuint program){}
-    void GL_APIENTRY dummy_glDeleteShader(GLuint shader){}
-    void GL_APIENTRY dummy_glDetachShader(GLuint program, GLuint shader){}
-    void GL_APIENTRY dummy_glLinkProgram(GLuint program){}
-    void GL_APIENTRY dummy_glUseProgram(GLuint program){}
-    void GL_APIENTRY dummy_glValidateProgram(GLuint program){}
-    void GL_APIENTRY dummy_glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name){}
-    void GL_APIENTRY dummy_glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name){}
-    void GL_APIENTRY dummy_glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders){}
-    int  GL_APIENTRY dummy_glGetAttribLocation(GLuint program, const GLchar* name){ return 0;}
-    void GL_APIENTRY dummy_glGetProgramiv(GLuint program, GLenum pname, GLint* params){}
-    void GL_APIENTRY dummy_glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog){}
-    void GL_APIENTRY dummy_glGetShaderiv(GLuint shader, GLenum pname, GLint* params){}
-    void GL_APIENTRY dummy_glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog){}
-    void GL_APIENTRY dummy_glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision){}
-    void GL_APIENTRY dummy_glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source){}
-    void GL_APIENTRY dummy_glGetUniformfv(GLuint program, GLint location, GLfloat* params){}
-    void GL_APIENTRY dummy_glGetUniformiv(GLuint program, GLint location, GLint* params){}
-    int  GL_APIENTRY dummy_glGetUniformLocation(GLuint program, const GLchar* name){ return 0;}
-    void GL_APIENTRY dummy_glReleaseShaderCompiler(void){}
-    void GL_APIENTRY dummy_glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height){}
-    void GL_APIENTRY dummy_glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length){}
-    void GL_APIENTRY dummy_glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length){}
-    void GL_APIENTRY dummy_glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer){}
-    void GL_APIENTRY dummy_glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level){}
diff --git a/distrib/android-emugl/host/libs/Translator/GLcommon/DummyGLfuncs.h b/distrib/android-emugl/host/libs/Translator/GLcommon/DummyGLfuncs.h
deleted file mode 100644
index dd5379c..0000000
--- a/distrib/android-emugl/host/libs/Translator/GLcommon/DummyGLfuncs.h
+++ /dev/null
@@ -1,265 +0,0 @@
-/*
-* Copyright 2011 The Android Open Source Project
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-#ifndef DUMMY_GL_FUNCS_H
-#define DUMMY_GL_FUNCS_H
-
-#include <GLES/gl.h>
-#include <GLES2/gl2.h>
-
-#include <GLcommon/gldefs.h>
-#define GLAPIENTRY GL_APIENTRY
-
-    void GLAPIENTRY dummy_glActiveTexture ( GLenum texture );
-    void GLAPIENTRY dummy_glBindBuffer (GLenum target, GLuint buffer);
-    void GLAPIENTRY dummy_glBindTexture (GLenum target, GLuint texture);
-    void GLAPIENTRY dummy_glBlendFunc (GLenum sfactor, GLenum dfactor);
-    void GLAPIENTRY dummy_glBlendEquation( GLenum mode );
-    void GLAPIENTRY dummy_glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
-    void GLAPIENTRY dummy_glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
-    void GLAPIENTRY dummy_glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
-    void GLAPIENTRY dummy_glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);
-    void GLAPIENTRY dummy_glClear(GLbitfield mask);
-    void GLAPIENTRY dummy_glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
-    void GLAPIENTRY dummy_glClearStencil(GLint s);
-    void GLAPIENTRY dummy_glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
-    void GLAPIENTRY dummy_glCompressedTexImage2D( GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data );
-    void GLAPIENTRY dummy_glCompressedTexSubImage2D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data );
-    void GLAPIENTRY dummy_glCopyTexImage2D(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
-    void GLAPIENTRY dummy_glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
-    void GLAPIENTRY dummy_glCullFace(GLenum mode);
-    void GLAPIENTRY dummy_glDeleteBuffers(GLsizei n, const GLuint *buffers);
-    void GLAPIENTRY dummy_glDeleteTextures(GLsizei n, const GLuint *textures);
-    void GLAPIENTRY dummy_glDepthFunc(GLenum func);
-    void GLAPIENTRY dummy_glDepthMask(GLboolean flag);
-    void GLAPIENTRY dummy_glDepthRange(GLclampd zNear, GLclampd zFar);
-    void GLAPIENTRY dummy_glDisable(GLenum cap);
-    void GLAPIENTRY dummy_glDrawArrays(GLenum mode, GLint first, GLsizei count);
-    void GLAPIENTRY dummy_glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
-    void GLAPIENTRY dummy_glEnable(GLenum cap);
-    void GLAPIENTRY dummy_glFinish(void);
-    void GLAPIENTRY dummy_glFlush(void);
-    void GLAPIENTRY dummy_glFrontFace(GLenum mode);
-    void GLAPIENTRY dummy_glGenBuffers(GLsizei n, GLuint *buffers);
-    void GLAPIENTRY dummy_glGenTextures(GLsizei n, GLuint *textures);
-    void GLAPIENTRY dummy_glGetBooleanv(GLenum pname, GLboolean *params);
-    void GLAPIENTRY dummy_glGetBufferParameteriv(GLenum, GLenum, GLint *);
-    GLenum GLAPIENTRY dummy_glGetError(void);
-    void GLAPIENTRY dummy_glGetFloatv(GLenum pname, GLfloat *params);
-    void GLAPIENTRY dummy_glGetIntegerv(GLenum pname, GLint *params);
-    const GLubyte * GLAPIENTRY dummy_glGetString(GLenum name);
-    void GLAPIENTRY dummy_glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
-    void GLAPIENTRY dummy_glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
-    void GLAPIENTRY dummy_glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
-    void GLAPIENTRY dummy_glHint(GLenum target, GLenum mode);
-    GLboolean GLAPIENTRY dummy_glIsBuffer(GLuint);
-    GLboolean GLAPIENTRY dummy_glIsEnabled(GLenum cap);
-    GLboolean GLAPIENTRY dummy_glIsTexture(GLuint texture);
-    void GLAPIENTRY dummy_glLineWidth(GLfloat width);
-    void GLAPIENTRY dummy_glPolygonOffset(GLfloat factor, GLfloat units);
-    void GLAPIENTRY dummy_glPixelStorei(GLenum pname, GLint param);
-    void GLAPIENTRY dummy_glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
-    void GLAPIENTRY dummy_glSampleCoverage(GLclampf value, GLboolean invert );
-    void GLAPIENTRY dummy_glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
-    void GLAPIENTRY dummy_glStencilFunc(GLenum func, GLint ref, GLuint mask);
-    void GLAPIENTRY dummy_glStencilMask(GLuint mask);
-    void GLAPIENTRY dummy_glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
-    void GLAPIENTRY dummy_glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
-    void GLAPIENTRY dummy_glTexParameteri(GLenum target, GLenum pname, GLint param);
-    void GLAPIENTRY dummy_glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
-    void GLAPIENTRY dummy_glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
-    void GLAPIENTRY dummy_glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
-    void GLAPIENTRY dummy_glPushAttrib( GLbitfield mask );
-    void GLAPIENTRY dummy_glPopAttrib( void );
-    void GLAPIENTRY dummy_glPushClientAttrib( GLbitfield mask );
-    void GLAPIENTRY dummy_glPopClientAttrib( void );
-
-    /* OpenGL functions which are needed ONLY for implementing GLES 1.1*/
-    void GLAPIENTRY dummy_glAlphaFunc(GLenum func, GLclampf ref);
-    void GLAPIENTRY dummy_glBegin( GLenum mode );
-    void GLAPIENTRY dummy_glClearDepth(GLclampd depth);
-    void GLAPIENTRY dummy_glClientActiveTexture( GLenum texture );
-    void GLAPIENTRY dummy_glClipPlane(GLenum plane, const GLdouble *equation);
-    void GLAPIENTRY dummy_glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
-    void GLAPIENTRY dummy_glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
-    void GLAPIENTRY dummy_glColor4fv( const GLfloat *v );
-    void GLAPIENTRY dummy_glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
-    void GLAPIENTRY dummy_glColor4ubv( const GLubyte *v );
-    void GLAPIENTRY dummy_glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
-    void GLAPIENTRY dummy_glDisableClientState(GLenum array);
-    void GLAPIENTRY dummy_glEnableClientState(GLenum array);
-    void GLAPIENTRY dummy_glEnd(void);
-    void GLAPIENTRY dummy_glFogf(GLenum pname, GLfloat param);
-    void GLAPIENTRY dummy_glFogfv(GLenum pname, const GLfloat *params);
-    void GLAPIENTRY dummy_glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
-    void GLAPIENTRY dummy_glGetClipPlane(GLenum plane, GLdouble *equation);
-    void GLAPIENTRY dummy_glGetDoublev( GLenum pname, GLdouble *params );
-    void GLAPIENTRY dummy_glGetLightfv(GLenum light, GLenum pname, GLfloat *params);
-    void GLAPIENTRY dummy_glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params);
-    void GLAPIENTRY dummy_glGetPointerv(GLenum pname, GLvoid* *params);
-    void GLAPIENTRY dummy_glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params);
-    void GLAPIENTRY dummy_glGetTexEnviv(GLenum target, GLenum pname, GLint *params);
-    void GLAPIENTRY dummy_glLightf(GLenum light, GLenum pname, GLfloat param);
-    void GLAPIENTRY dummy_glLightfv(GLenum light, GLenum pname, const GLfloat *params);
-    void GLAPIENTRY dummy_glLightModelf(GLenum pname, GLfloat param);
-    void GLAPIENTRY dummy_glLightModelfv(GLenum pname, const GLfloat *params);
-    void GLAPIENTRY dummy_glLoadIdentity(void);
-    void GLAPIENTRY dummy_glLoadMatrixf(const GLfloat *m);
-    void GLAPIENTRY dummy_glLogicOp(GLenum opcode);
-    void GLAPIENTRY dummy_glMaterialf(GLenum face, GLenum pname, GLfloat param);
-    void GLAPIENTRY dummy_glMaterialfv(GLenum face, GLenum pname, const GLfloat *params);
-    void GLAPIENTRY dummy_glMultiTexCoord2fv( GLenum target, const GLfloat *v );
-    void GLAPIENTRY dummy_glMultiTexCoord2sv( GLenum target, const GLshort *v );
-    void GLAPIENTRY dummy_glMultiTexCoord3fv( GLenum target, const GLfloat *v );
-    void GLAPIENTRY dummy_glMultiTexCoord3sv( GLenum target, const GLshort *v );
-    void GLAPIENTRY dummy_glMultiTexCoord4f( GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q );
-    void GLAPIENTRY dummy_glMultiTexCoord4fv( GLenum target, const GLfloat *v );
-    void GLAPIENTRY dummy_glMultiTexCoord4sv( GLenum target, const GLshort *v );
-    void GLAPIENTRY dummy_glMultMatrixf(const GLfloat *m);
-    void GLAPIENTRY dummy_glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz);
-    void GLAPIENTRY dummy_glNormal3fv( const GLfloat *v );
-    void GLAPIENTRY dummy_glNormal3sv(const GLshort *v );
-    void GLAPIENTRY dummy_glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
-    void GLAPIENTRY dummy_glPointParameterf(GLenum, GLfloat);
-    void GLAPIENTRY dummy_glPointParameterfv(GLenum, const GLfloat *);
-    void GLAPIENTRY dummy_glPointSize(GLfloat size);
-    void GLAPIENTRY dummy_glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
-    void GLAPIENTRY dummy_glScalef(GLfloat x, GLfloat y, GLfloat z);
-    void GLAPIENTRY dummy_glTexEnvf(GLenum target, GLenum pname, GLfloat param);
-    void GLAPIENTRY dummy_glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params);
-    void GLAPIENTRY dummy_glTexParameterf(GLenum target, GLenum pname, GLfloat param);
-    void GLAPIENTRY dummy_glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
-    void GLAPIENTRY dummy_glMatrixMode(GLenum mode);
-    void GLAPIENTRY dummy_glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
-    void GLAPIENTRY dummy_glPopMatrix(void);
-    void GLAPIENTRY dummy_glPushMatrix(void);
-    void GLAPIENTRY dummy_glShadeModel(GLenum mode);
-    void GLAPIENTRY dummy_glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
-    void GLAPIENTRY dummy_glTexEnvi(GLenum target, GLenum pname, GLint param);
-    void GLAPIENTRY dummy_glTexEnviv(GLenum target, GLenum pname, const GLint *params);
-    void GLAPIENTRY dummy_glTranslatef(GLfloat x, GLfloat y, GLfloat z);
-    void GLAPIENTRY dummy_glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
-
-    /* OpenGL functions which are needed ONLY for implementing GLES 1.1 EXTENSIONS*/
-    GLboolean GLAPIENTRY dummy_glIsRenderbufferEXT(GLuint renderbuffer);
-    void GLAPIENTRY dummy_glBindRenderbufferEXT(GLenum target, GLuint renderbuffer);
-    void GLAPIENTRY dummy_glDeleteRenderbuffersEXT(GLsizei n, const GLuint *renderbuffers);
-    void GLAPIENTRY dummy_glGenRenderbuffersEXT(GLsizei n, GLuint *renderbuffers);
-    void GLAPIENTRY dummy_glRenderbufferStorageEXT(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
-    void GLAPIENTRY dummy_glGetRenderbufferParameterivEXT(GLenum target, GLenum pname, GLint *params);
-    GLboolean GLAPIENTRY dummy_glIsFramebufferEXT(GLuint framebuffer);
-    void GLAPIENTRY dummy_glBindFramebufferEXT(GLenum target, GLuint framebuffer);
-    void GLAPIENTRY dummy_glDeleteFramebuffersEXT(GLsizei n, const GLuint *framebuffers);
-    void GLAPIENTRY dummy_glGenFramebuffersEXT(GLsizei n, GLuint *framebuffers);
-    GLenum GLAPIENTRY dummy_glCheckFramebufferStatusEXT(GLenum target);
-    void GLAPIENTRY dummy_glFramebufferTexture1DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
-    void GLAPIENTRY dummy_glFramebufferTexture2DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
-    void GLAPIENTRY dummy_glFramebufferTexture3DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
-    void GLAPIENTRY dummy_glFramebufferRenderbufferEXT(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
-    void GLAPIENTRY dummy_glGetFramebufferAttachmentParameterivEXT(GLenum target, GLenum attachment, GLenum pname, GLint *params);
-    void GLAPIENTRY dummy_glGenerateMipmapEXT(GLenum target);
-    void GLAPIENTRY dummy_glCurrentPaletteMatrixARB(GLint index);
-    void GLAPIENTRY dummy_glMatrixIndexuivARB(GLint size, GLuint * indices);
-    void GLAPIENTRY dummy_glMatrixIndexPointerARB(GLint size, GLenum type, GLsizei stride, const GLvoid* pointer);
-    void GLAPIENTRY dummy_glWeightPointerARB(GLint size, GLenum type, GLsizei stride, const GLvoid* pointer);
-    void GLAPIENTRY dummy_glTexGenf(GLenum coord, GLenum pname, GLfloat param );
-    void GLAPIENTRY dummy_glTexGeni(GLenum coord, GLenum pname, GLint param );
-    void GLAPIENTRY dummy_glTexGenf(GLenum coord, GLenum pname, const GLfloat *params );
-    void GLAPIENTRY dummy_glTexGeniv(GLenum coord, GLenum pname, const GLint *params );
-    void GLAPIENTRY dummy_glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params );
-    void GLAPIENTRY dummy_glGetTexGeniv(GLenum coord, GLenum pname, GLint *params );
-
-    /* Loading OpenGL functions which are needed ONLY for implementing GLES 2.0*/
-    void GL_APIENTRY dummy_glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
-    void GL_APIENTRY dummy_glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
-    void GL_APIENTRY dummy_glStencilMaskSeparate(GLenum face, GLuint mask);
-    void GL_APIENTRY dummy_glGenerateMipmap(GLenum target);
-    void GL_APIENTRY dummy_glBindFramebuffer(GLenum target, GLuint framebuffer);
-    void GL_APIENTRY dummy_glBindRenderbuffer(GLenum target, GLuint renderbuffer);
-    void GL_APIENTRY dummy_glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers);
-    void GL_APIENTRY dummy_glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers);
-    GLboolean GL_APIENTRY dummy_glIsProgram(GLuint program);
-    GLboolean GL_APIENTRY dummy_glIsShader(GLuint shader);
-    void GL_APIENTRY dummy_glVertexAttrib1f(GLuint indx, GLfloat x);
-    void GL_APIENTRY dummy_glVertexAttrib1fv(GLuint indx, const GLfloat* values);
-    void GL_APIENTRY dummy_glVertexAttrib2f(GLuint indx, GLfloat x, GLfloat y);
-    void GL_APIENTRY dummy_glVertexAttrib2fv(GLuint indx, const GLfloat* values);
-    void GL_APIENTRY dummy_glVertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z);
-    void GL_APIENTRY dummy_glVertexAttrib3fv(GLuint indx, const GLfloat* values);
-    void GL_APIENTRY dummy_glVertexAttrib4f(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
-    void GL_APIENTRY dummy_glVertexAttrib4fv(GLuint indx, const GLfloat* values);
-    void GL_APIENTRY dummy_glVertexAttribPointer(GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr);
-    void GL_APIENTRY dummy_glDisableVertexAttribArray(GLuint index);
-    void GL_APIENTRY dummy_glEnableVertexAttribArray(GLuint index);
-    void GL_APIENTRY dummy_glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params);
-    void GL_APIENTRY dummy_glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params);
-    void GL_APIENTRY dummy_glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer);
-    void GL_APIENTRY dummy_glUniform1f(GLint location, GLfloat x);
-    void GL_APIENTRY dummy_glUniform1fv(GLint location, GLsizei count, const GLfloat* v);
-    void GL_APIENTRY dummy_glUniform1i(GLint location, GLint x);
-    void GL_APIENTRY dummy_glUniform1iv(GLint location, GLsizei count, const GLint* v);
-    void GL_APIENTRY dummy_glUniform2f(GLint location, GLfloat x, GLfloat y);
-    void GL_APIENTRY dummy_glUniform2fv(GLint location, GLsizei count, const GLfloat* v);
-    void GL_APIENTRY dummy_glUniform2i(GLint location, GLint x, GLint y);
-    void GL_APIENTRY dummy_glUniform2iv(GLint location, GLsizei count, const GLint* v);
-    void GL_APIENTRY dummy_glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z);
-    void GL_APIENTRY dummy_glUniform3fv(GLint location, GLsizei count, const GLfloat* v);
-    void GL_APIENTRY dummy_glUniform3i(GLint location, GLint x, GLint y, GLint z);
-    void GL_APIENTRY dummy_glUniform3iv(GLint location, GLsizei count, const GLint* v);
-    void GL_APIENTRY dummy_glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
-    void GL_APIENTRY dummy_glUniform4fv(GLint location, GLsizei count, const GLfloat* v);
-    void GL_APIENTRY dummy_glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w);
-    void GL_APIENTRY dummy_glUniform4iv(GLint location, GLsizei count, const GLint* v);
-    void GL_APIENTRY dummy_glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
-    void GL_APIENTRY dummy_glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
-    void GL_APIENTRY dummy_glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
-    void GL_APIENTRY dummy_glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params);
-    void GL_APIENTRY dummy_glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params);
-    GLboolean GL_APIENTRY dummy_glIsFramebuffer(GLuint framebuffer);
-    GLboolean GL_APIENTRY dummy_glIsRenderbuffer(GLuint renderbuffer);
-    GLenum GL_APIENTRY dummy_glCheckFramebufferStatus(GLenum target);
-    void GL_APIENTRY dummy_glAttachShader(GLuint program, GLuint shader);
-    void GL_APIENTRY dummy_glBindAttribLocation(GLuint program, GLuint index, const GLchar* name);
-    void GL_APIENTRY dummy_glCompileShader(GLuint shader);
-    GLuint GL_APIENTRY dummy_glCreateProgram(void);
-    GLuint GL_APIENTRY dummy_glCreateShader(GLenum type);
-    void GL_APIENTRY dummy_glDeleteProgram(GLuint program);
-    void GL_APIENTRY dummy_glDeleteShader(GLuint shader);
-    void GL_APIENTRY dummy_glDetachShader(GLuint program, GLuint shader);
-    void GL_APIENTRY dummy_glLinkProgram(GLuint program);
-    void GL_APIENTRY dummy_glUseProgram(GLuint program);
-    void GL_APIENTRY dummy_glValidateProgram(GLuint program);
-    void GL_APIENTRY dummy_glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name);
-    void GL_APIENTRY dummy_glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name);
-    void GL_APIENTRY dummy_glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders);
-    int  GL_APIENTRY dummy_glGetAttribLocation(GLuint program, const GLchar* name);
-    void GL_APIENTRY dummy_glGetProgramiv(GLuint program, GLenum pname, GLint* params);
-    void GL_APIENTRY dummy_glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog);
-    void GL_APIENTRY dummy_glGetShaderiv(GLuint shader, GLenum pname, GLint* params);
-    void GL_APIENTRY dummy_glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog);
-    void GL_APIENTRY dummy_glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision);
-    void GL_APIENTRY dummy_glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source);
-    void GL_APIENTRY dummy_glGetUniformfv(GLuint program, GLint location, GLfloat* params);
-    void GL_APIENTRY dummy_glGetUniformiv(GLuint program, GLint location, GLint* params);
-    int  GL_APIENTRY dummy_glGetUniformLocation(GLuint program, const GLchar* name);
-    void GL_APIENTRY dummy_glReleaseShaderCompiler(void);
-    void GL_APIENTRY dummy_glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
-    void GL_APIENTRY dummy_glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length);
-    void GL_APIENTRY dummy_glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length);
-    void GL_APIENTRY dummy_glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
-    void GL_APIENTRY dummy_glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
-
-#endif
diff --git a/distrib/android-emugl/host/libs/Translator/GLcommon/GLDispatch.cpp b/distrib/android-emugl/host/libs/Translator/GLcommon/GLDispatch.cpp
index 3f091d1..a5dbb0e 100644
--- a/distrib/android-emugl/host/libs/Translator/GLcommon/GLDispatch.cpp
+++ b/distrib/android-emugl/host/libs/Translator/GLcommon/GLDispatch.cpp
@@ -15,7 +15,7 @@
 */
 
 #include <GLcommon/GLDispatch.h>
-#include <stdio.h>
+
 #include "emugl/common/shared_library.h"
 
 #ifdef __linux__
@@ -24,515 +24,153 @@
 #include <windows.h>
 #endif
 
-#include "DummyGLfuncs.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
 
+// Generic function type.
 typedef void (*GL_FUNC_PTR)();
 
+// GL symbol resolver function type.
+typedef GL_FUNC_PTR (Resolver)(const char* funcName);
+
 static GL_FUNC_PTR getGLFuncAddress(const char *funcName) {
     GL_FUNC_PTR ret = NULL;
-#ifdef __linux__
-    static emugl::SharedLibrary* libGL = emugl::SharedLibrary::open("libGL");
-    ret = (GL_FUNC_PTR)glXGetProcAddress((const GLubyte*)funcName);
-#elif defined(WIN32)
-    static emugl::SharedLibrary* libGL = emugl::SharedLibrary::open("opengl32");
-    ret = (GL_FUNC_PTR)wglGetProcAddress(funcName);
-#elif defined(__APPLE__)
-    static emugl::SharedLibrary* libGL = emugl::SharedLibrary::open("/System/Library/Frameworks/OpenGL.framework/OpenGL");
+    static emugl::SharedLibrary* s_libGL = NULL;
+    static Resolver* s_resolver = NULL;
+
+    if (!s_libGL) {
+#if defined(__APPLE__)
+        static const char kLibName[] =
+                "/System/Library/Frameworks/OpenGL.framework/OpenGL";
+        static const char* const kResolverName = NULL;
+#elif defined(_WIN32)
+        static const char kLibName[] = "opengl32";
+        static const char kResolverName[] = "wglGetProcAddress";
+#elif defined(__linux__)
+        static const char kLibName[] = "libGL";
+        static const char kResolverName[] = "glXGetProcAddress";
+#else
+#error "Unsupported platform"
 #endif
-    if(!ret && libGL){
-        ret = libGL->findSymbol(funcName);
+        const char* libName = kLibName;
+        const char* resolverName = kResolverName;
+        const char* env = ::getenv("ANDROID_EGL_ENGINE");
+        if (env) {
+            if (!strcmp(env, "osmesa")) {
+                libName = "libosmesa";
+                resolverName = "OSMesaGetProcAddress";
+            } else {
+                fprintf(stderr,
+                        "Ignoring invalid ANDROID_EGL_ENGINE value '%s'\n",
+                        env);
+            }
+        }
+        s_libGL = emugl::SharedLibrary::open(libName);
+        if (!s_libGL) {
+            fprintf(stderr, "Could not load desktop GL library: %s\n",
+                    libName);
+            return NULL;
+        }
+        if (resolverName) {
+            s_resolver = reinterpret_cast<Resolver*>(
+                    s_libGL->findSymbol(resolverName));
+            if (!s_resolver) {
+                fprintf(
+                    stderr,
+                    "Could not find desktop GL symbol resolver '%s' in '%s'\n",
+                    resolverName, libName);
+            }
+        }
+    }
+
+#if defined(__linux__)
+    // HACK ATTACK: Using the resolver loaded through dlsym() doesn't work
+    // on Linux with some native system libraries, for reasons to obscure to
+    // understand here. We must thus call glXGetProcAddress() directly instead
+    // or the functions returned by the resolver will _not_ work correctly and
+    // simply return NULL.
+    ret = glXGetProcAddress((const GLubyte*)funcName);
+#else
+    if (s_resolver) {
+        ret = (*s_resolver)(funcName);
+    }
+#endif
+    if (!ret && s_libGL) {
+        ret = s_libGL->findSymbol(funcName);
     }
     return ret;
 }
 
-#define LOAD_GL_FUNC(name)  do { \
-        if (!name) { \
-            void* funcAddress = (void *)getGLFuncAddress(#name); \
-            if (funcAddress) { \
-                name = (__typeof__(name))(funcAddress); \
-            } else { \
-                fprintf(stderr, "Could not load func %s\n", #name); \
-                name = (__typeof__(name))(dummy_##name); \
+#define LOAD_GL_FUNC(return_type, func_name, signature)  do { \
+        void* address = (void *)getGLFuncAddress(#func_name); \
+        if (address) { \
+            func_name = (__typeof__(func_name))(address); \
+        } else { \
+            fprintf(stderr, "Could not load func %s\n", #func_name); \
+        } \
+    } while (0);
+
+#define LOAD_GLEXT_FUNC(return_type, func_name, signature) do { \
+        if (!func_name) { \
+            void* address = (void *)getGLFuncAddress(#func_name); \
+            if (address) { \
+                func_name = (__typeof__(func_name))(address); \
             } \
         } \
-    } while (0)
-
-#define LOAD_GLEXT_FUNC(name) do { \
-        if (!name) { \
-            void* funcAddress = (void *)getGLFuncAddress(#name); \
-            if (funcAddress) { \
-                name = (__typeof__(name))(funcAddress); \
-            } \
-        } \
-    } while (0)
-
-/* initializing static GLDispatch members*/
-
-emugl::Mutex GLDispatch::s_lock;
-void (GLAPIENTRY *GLDispatch::glActiveTexture)(GLenum) = NULL;
-void (GLAPIENTRY *GLDispatch::glBindBuffer)(GLenum,GLuint) = NULL;
-void (GLAPIENTRY *GLDispatch::glBindTexture)(GLenum, GLuint) = NULL;
-void (GLAPIENTRY *GLDispatch::glBlendFunc)(GLenum,GLenum) = NULL;
-void (GLAPIENTRY *GLDispatch::glBlendEquation)(GLenum) = NULL;
-void (GLAPIENTRY *GLDispatch::glBlendEquationSeparate)(GLenum,GLenum) = NULL;
-void (GLAPIENTRY *GLDispatch::glBlendFuncSeparate)(GLenum,GLenum,GLenum,GLenum) = NULL;
-void (GLAPIENTRY *GLDispatch::glBufferData)(GLenum,GLsizeiptr,const GLvoid *,GLenum) = NULL;
-void (GLAPIENTRY *GLDispatch::glBufferSubData)(GLenum,GLintptr,GLsizeiptr,const GLvoid *) = NULL;
-void (GLAPIENTRY *GLDispatch::glClear)(GLbitfield) = NULL;
-void (GLAPIENTRY *GLDispatch::glClearColor)(GLclampf,GLclampf,GLclampf,GLclampf) = NULL;
-void (GLAPIENTRY *GLDispatch::glClearStencil)(GLint) = NULL;
-void (GLAPIENTRY *GLDispatch::glColorMask)(GLboolean,GLboolean,GLboolean,GLboolean) = NULL;
-void (GLAPIENTRY *GLDispatch::glCompressedTexImage2D)(GLenum,GLint,GLenum,GLsizei,GLsizei,GLint,GLsizei, const GLvoid *) = NULL;
-void (GLAPIENTRY *GLDispatch::glCompressedTexSubImage2D)(GLenum,GLint,GLint,GLint,GLsizei,GLsizei,GLenum,GLsizei,const GLvoid *) = NULL;
-void (GLAPIENTRY *GLDispatch::glCopyTexImage2D)(GLenum,GLint,GLenum,GLint,GLint,GLsizei,GLsizei,GLint) = NULL;
-void (GLAPIENTRY *GLDispatch::glCopyTexSubImage2D)(GLenum,GLint,GLint,GLint,GLint,GLint,GLsizei,GLsizei) = NULL;
-void (GLAPIENTRY *GLDispatch::glCullFace)(GLenum) = NULL;
-void (GLAPIENTRY *GLDispatch::glDeleteBuffers)(GLsizei,const GLuint *) = NULL;
-void (GLAPIENTRY *GLDispatch::glDeleteTextures)(GLsizei,const GLuint *) = NULL;
-void (GLAPIENTRY *GLDispatch::glDepthFunc)(GLenum) = NULL;
-void (GLAPIENTRY *GLDispatch::glDepthMask)(GLboolean) = NULL;
-void (GLAPIENTRY *GLDispatch::glDepthRange)(GLclampd,GLclampd) = NULL;
-void (GLAPIENTRY *GLDispatch::glDisable)(GLenum) = NULL;
-void (GLAPIENTRY *GLDispatch::glDrawArrays)(GLenum,GLint,GLsizei) = NULL;
-void (GLAPIENTRY *GLDispatch::glDrawElements)(GLenum,GLsizei,GLenum,const GLvoid *) = NULL;
-void (GLAPIENTRY *GLDispatch::glEnable)(GLenum) = NULL;
-void (GLAPIENTRY *GLDispatch::glFinish)() = NULL;
-void (GLAPIENTRY *GLDispatch::glFlush)() = NULL;
-void (GLAPIENTRY *GLDispatch::glFrontFace)(GLenum) = NULL;
-void (GLAPIENTRY *GLDispatch::glGenBuffers)(GLsizei,GLuint *) = NULL;
-void (GLAPIENTRY *GLDispatch::glGenTextures)(GLsizei,GLuint *) = NULL;
-void (GLAPIENTRY *GLDispatch::glGetBooleanv)(GLenum,GLboolean *) = NULL;
-void (GLAPIENTRY *GLDispatch::glGetBufferParameteriv)(GLenum, GLenum, GLint *) = NULL;
-GLenum (GLAPIENTRY *GLDispatch::glGetError)() = NULL;
-void (GLAPIENTRY *GLDispatch::glGetFloatv)(GLenum,GLfloat *) = NULL;
-void (GLAPIENTRY *GLDispatch::glGetIntegerv)(GLenum,GLint *) = NULL;
-const GLubyte * (GLAPIENTRY *GLDispatch::glGetString) (GLenum) = NULL;
-void (GLAPIENTRY *GLDispatch::glGetTexParameterfv)(GLenum,GLenum,GLfloat *) = NULL;
-void (GLAPIENTRY *GLDispatch::glGetTexParameteriv)(GLenum,GLenum,GLint *) = NULL;
-void (GLAPIENTRY *GLDispatch::glGetTexLevelParameteriv) (GLenum target, GLint level, GLenum pname, GLint *params) = NULL;
-void (GLAPIENTRY *GLDispatch::glHint)(GLenum,GLenum) = NULL;
-GLboolean (GLAPIENTRY *GLDispatch::glIsBuffer)(GLuint) = NULL;
-GLboolean (GLAPIENTRY *GLDispatch::glIsEnabled)(GLenum) = NULL;
-GLboolean (GLAPIENTRY *GLDispatch::glIsTexture)(GLuint) = NULL;
-void (GLAPIENTRY *GLDispatch::glLineWidth)(GLfloat) = NULL;
-void (GLAPIENTRY *GLDispatch::glPolygonOffset)(GLfloat, GLfloat) = NULL;
-void (GLAPIENTRY *GLDispatch::glPixelStorei)(GLenum,GLint) = NULL;
-void (GLAPIENTRY *GLDispatch::glReadPixels)(GLint,GLint,GLsizei,GLsizei,GLenum,GLenum,GLvoid *) = NULL;
-void (GLAPIENTRY *GLDispatch::glSampleCoverage)(GLclampf,GLboolean) = NULL;
-void (GLAPIENTRY *GLDispatch::glScissor)(GLint,GLint,GLsizei,GLsizei) = NULL;
-void (GLAPIENTRY *GLDispatch::glStencilFunc)(GLenum,GLint,GLuint) = NULL;
-void (GLAPIENTRY *GLDispatch::glStencilMask)(GLuint) = NULL;
-void (GLAPIENTRY *GLDispatch::glStencilOp)(GLenum, GLenum,GLenum);
-void (GLAPIENTRY *GLDispatch::glTexImage2D)(GLenum,GLint,GLint,GLsizei,GLsizei,GLint,GLenum,GLenum,const GLvoid *) = NULL;
-void (GLAPIENTRY *GLDispatch::glTexParameterf)(GLenum,GLenum, GLfloat) = NULL;
-void (GLAPIENTRY *GLDispatch::glTexParameterfv)(GLenum,GLenum,const GLfloat *) = NULL;
-void (GLAPIENTRY *GLDispatch::glTexParameteri)(GLenum,GLenum,GLint) = NULL;
-void (GLAPIENTRY *GLDispatch::glTexParameteriv)(GLenum,GLenum,const GLint *) = NULL;
-void (GLAPIENTRY *GLDispatch::glTexSubImage2D)(GLenum,GLint,GLint,GLint,GLsizei,GLsizei,GLenum,GLenum,const GLvoid *) = NULL;
-void (GLAPIENTRY *GLDispatch::glViewport)(GLint,GLint,GLsizei,GLsizei) = NULL;
-void (GLAPIENTRY *GLDispatch::glPushAttrib) ( GLbitfield mask ) = NULL;
-void (GLAPIENTRY *GLDispatch::glPopAttrib) ( void ) = NULL;
-void (GLAPIENTRY *GLDispatch::glPushClientAttrib) ( GLbitfield mask ) = NULL;
-void (GLAPIENTRY *GLDispatch::glPopClientAttrib) ( void ) = NULL;
-
-/*GLES 1.1*/
-void (GLAPIENTRY *GLDispatch::glAlphaFunc)(GLenum,GLclampf) = NULL;
-void (GLAPIENTRY *GLDispatch::glBegin)(GLenum) = NULL;
-void (GLAPIENTRY *GLDispatch::glClearDepth)(GLclampd) = NULL;
-void (GLAPIENTRY *GLDispatch::glClientActiveTexture)(GLenum) = NULL;
-void (GLAPIENTRY *GLDispatch::glClipPlane)(GLenum,const GLdouble *) = NULL;
-void (GLAPIENTRY *GLDispatch::glColor4d)(GLdouble,GLdouble,GLdouble,GLdouble) = NULL;
-void (GLAPIENTRY *GLDispatch::glColor4f)(GLfloat,GLfloat,GLfloat,GLfloat) = NULL;
-void (GLAPIENTRY *GLDispatch::glColor4fv)(const GLfloat *) = NULL;
-void (GLAPIENTRY *GLDispatch::glColor4ub)(GLubyte,GLubyte,GLubyte,GLubyte) = NULL;
-void (GLAPIENTRY *GLDispatch::glColor4ubv)(const GLubyte *) = NULL;
-void (GLAPIENTRY *GLDispatch::glColorPointer)(GLint,GLenum,GLsizei,const GLvoid *) = NULL;
-void (GLAPIENTRY *GLDispatch::glDisableClientState)(GLenum) = NULL;
-void (GLAPIENTRY *GLDispatch::glEnableClientState)(GLenum) = NULL;
-void (GLAPIENTRY *GLDispatch::glEnd)() = NULL;
-void (GLAPIENTRY *GLDispatch::glFogf)(GLenum, GLfloat) = NULL;
-void (GLAPIENTRY *GLDispatch::glFogfv)(GLenum,const GLfloat *);
-void (GLAPIENTRY *GLDispatch::glFrustum)(GLdouble,GLdouble,GLdouble,GLdouble,GLdouble,GLdouble) = NULL;
-void (GLAPIENTRY *GLDispatch::glGetClipPlane)(GLenum,GLdouble *) = NULL;
-void (GLAPIENTRY *GLDispatch::glGetDoublev)(GLenum,GLdouble *) = NULL;
-void (GLAPIENTRY *GLDispatch::glGetLightfv)(GLenum,GLenum,GLfloat *) = NULL;
-void (GLAPIENTRY *GLDispatch::glGetMaterialfv)(GLenum,GLenum,GLfloat *) = NULL;
-void (GLAPIENTRY *GLDispatch::glGetPointerv)(GLenum,GLvoid**) = NULL;
-void (GLAPIENTRY *GLDispatch::glGetTexEnvfv)(GLenum,GLenum,GLfloat *) = NULL;
-void (GLAPIENTRY *GLDispatch::glGetTexEnviv)(GLenum,GLenum,GLint *)= NULL;
-void (GLAPIENTRY *GLDispatch::glLightf)(GLenum,GLenum,GLfloat) = NULL;
-void (GLAPIENTRY *GLDispatch::glLightfv)(GLenum,GLenum,const GLfloat *) = NULL;
-void (GLAPIENTRY *GLDispatch::glLightModelf)(GLenum,GLfloat) = NULL;
-void (GLAPIENTRY *GLDispatch::glLightModelfv)(GLenum,const GLfloat *) = NULL;
-void (GLAPIENTRY *GLDispatch::glLoadIdentity)() = NULL;
-void (GLAPIENTRY *GLDispatch::glLoadMatrixf)(const GLfloat *) = NULL;
-void (GLAPIENTRY *GLDispatch::glLogicOp)(GLenum) = NULL;
-void (GLAPIENTRY *GLDispatch::glMaterialf)(GLenum,GLenum,GLfloat) = NULL;
-void (GLAPIENTRY *GLDispatch::glMaterialfv)(GLenum,GLenum,const GLfloat *);
-void (GLAPIENTRY *GLDispatch::glMultiTexCoord2fv)(GLenum, const GLfloat *) = NULL;
-void (GLAPIENTRY *GLDispatch::glMultiTexCoord2sv)(GLenum, const GLshort *) = NULL;
-void (GLAPIENTRY *GLDispatch::glMultiTexCoord3fv)(GLenum, const GLfloat *) = NULL;
-void (GLAPIENTRY *GLDispatch::glMultiTexCoord3sv)(GLenum,const GLshort *) = NULL;
-void (GLAPIENTRY *GLDispatch::glMultiTexCoord4f)(GLenum,GLfloat,GLfloat,GLfloat,GLfloat) = NULL;
-void (GLAPIENTRY *GLDispatch::glMultiTexCoord4fv)(GLenum,const GLfloat *) = NULL;
-void (GLAPIENTRY *GLDispatch::glMultiTexCoord4sv)(GLenum,const GLshort *) = NULL;
-void (GLAPIENTRY *GLDispatch::glMultMatrixf)(const GLfloat *) = NULL;
-void (GLAPIENTRY *GLDispatch::glNormal3f)(GLfloat,GLfloat,GLfloat) = NULL;
-void (GLAPIENTRY *GLDispatch::glNormal3fv)(const GLfloat *) = NULL;
-void (GLAPIENTRY *GLDispatch::glNormal3sv)(const GLshort *) = NULL;
-void (GLAPIENTRY *GLDispatch::glOrtho)(GLdouble,GLdouble,GLdouble,GLdouble,GLdouble,GLdouble) = NULL;
-void (GLAPIENTRY *GLDispatch::glPointParameterf)(GLenum, GLfloat) = NULL;
-void (GLAPIENTRY *GLDispatch::glPointParameterfv)(GLenum, const GLfloat *) = NULL;
-void (GLAPIENTRY *GLDispatch::glPointSize)(GLfloat) = NULL;
-void (GLAPIENTRY *GLDispatch::glRotatef)(GLfloat,GLfloat,GLfloat,GLfloat) = NULL;
-void (GLAPIENTRY *GLDispatch::glScalef)(GLfloat,GLfloat,GLfloat) = NULL;
-void (GLAPIENTRY *GLDispatch::glTexEnvf)(GLenum,GLenum,GLfloat) = NULL;
-void (GLAPIENTRY *GLDispatch::glTexEnvfv)(GLenum,GLenum,const GLfloat *) = NULL;
-void (GLAPIENTRY *GLDispatch::glMatrixMode)(GLenum) = NULL;
-void (GLAPIENTRY *GLDispatch::glNormalPointer)(GLenum,GLsizei,const GLvoid *) = NULL;
-void (GLAPIENTRY *GLDispatch::glPopMatrix)() = NULL;
-void (GLAPIENTRY *GLDispatch::glPushMatrix)() = NULL;
-void (GLAPIENTRY *GLDispatch::glShadeModel)(GLenum) = NULL;
-void (GLAPIENTRY *GLDispatch::glTexCoordPointer)(GLint,GLenum, GLsizei, const GLvoid*) = NULL;
-void (GLAPIENTRY *GLDispatch::glTexEnvi)(GLenum ,GLenum,GLint) = NULL;
-void (GLAPIENTRY *GLDispatch::glTexEnviv)(GLenum, GLenum, const GLint *) = NULL;
-void (GLAPIENTRY *GLDispatch::glTranslatef)(GLfloat,GLfloat, GLfloat) = NULL;
-void (GLAPIENTRY *GLDispatch::glVertexPointer)(GLint,GLenum,GLsizei, const GLvoid *) = NULL;
-
-/* GLES 1.1 EXTENSIONS*/
-GLboolean (GLAPIENTRY *GLDispatch::glIsRenderbufferEXT) (GLuint renderbuffer) = NULL;
-void (GLAPIENTRY *GLDispatch::glBindRenderbufferEXT) (GLenum target, GLuint renderbuffer) = NULL;
-void (GLAPIENTRY *GLDispatch::glDeleteRenderbuffersEXT) (GLsizei n, const GLuint *renderbuffers) = NULL;
-void (GLAPIENTRY *GLDispatch::glGenRenderbuffersEXT) (GLsizei n, GLuint *renderbuffers) = NULL;
-void (GLAPIENTRY *GLDispatch::glRenderbufferStorageEXT) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height) = NULL;
-void (GLAPIENTRY *GLDispatch::glGetRenderbufferParameterivEXT) (GLenum target, GLenum pname, GLint *params) = NULL;
-GLboolean (GLAPIENTRY *GLDispatch::glIsFramebufferEXT) (GLuint framebuffer) = NULL;
-void (GLAPIENTRY *GLDispatch::glBindFramebufferEXT) (GLenum target, GLuint framebuffer) = NULL;
-void (GLAPIENTRY *GLDispatch::glDeleteFramebuffersEXT) (GLsizei n, const GLuint *framebuffers) = NULL;
-void (GLAPIENTRY *GLDispatch::glGenFramebuffersEXT) (GLsizei n, GLuint *framebuffers) = NULL;
-GLenum (GLAPIENTRY *GLDispatch::glCheckFramebufferStatusEXT) (GLenum target) = NULL;
-void (GLAPIENTRY *GLDispatch::glFramebufferTexture1DEXT) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) = NULL;
-void (GLAPIENTRY *GLDispatch::glFramebufferTexture2DEXT) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) = NULL;
-void (GLAPIENTRY *GLDispatch::glFramebufferTexture3DEXT) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset) = NULL;
-void (GLAPIENTRY *GLDispatch::glFramebufferRenderbufferEXT) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) = NULL;
-void (GLAPIENTRY *GLDispatch::glGetFramebufferAttachmentParameterivEXT) (GLenum target, GLenum attachment, GLenum pname, GLint *params) = NULL;
-void (GLAPIENTRY *GLDispatch::glGenerateMipmapEXT) (GLenum target) = NULL;
-void (GLAPIENTRY *GLDispatch::glCurrentPaletteMatrixARB) (GLint index) = NULL;
-void (GLAPIENTRY *GLDispatch::glMatrixIndexuivARB) (GLint size, GLuint * indices) = NULL;
-void (GLAPIENTRY *GLDispatch::glMatrixIndexPointerARB) (GLint size, GLenum type, GLsizei stride, const GLvoid* pointer) = NULL;
-void (GLAPIENTRY *GLDispatch::glWeightPointerARB) (GLint size, GLenum type, GLsizei stride, const GLvoid* pointer) = NULL;
-void (GLAPIENTRY *GLDispatch::glTexGenf) (GLenum coord, GLenum pname, GLfloat param ) = NULL;
-void (GLAPIENTRY *GLDispatch::glTexGeni) (GLenum coord, GLenum pname, GLint param ) = NULL;
-void (GLAPIENTRY *GLDispatch::glTexGenfv) (GLenum coord, GLenum pname, const GLfloat *params ) = NULL;
-void (GLAPIENTRY *GLDispatch::glTexGeniv) (GLenum coord, GLenum pname, const GLint *params ) = NULL;
-void (GLAPIENTRY *GLDispatch::glGetTexGenfv) (GLenum coord, GLenum pname, GLfloat *params ) = NULL;
-void (GLAPIENTRY *GLDispatch::glGetTexGeniv) (GLenum coord, GLenum pname, GLint *params ) = NULL;
-
-/* GLES 2.0*/
-void (GL_APIENTRY *GLDispatch::glBlendColor)(GLclampf,GLclampf,GLclampf,GLclampf) = NULL;
-void (GL_APIENTRY *GLDispatch::glStencilFuncSeparate)(GLenum,GLenum,GLint,GLuint) = NULL;
-void (GL_APIENTRY *GLDispatch::glStencilMaskSeparate)(GLenum,GLuint) = NULL;
-GLboolean (GL_APIENTRY *GLDispatch::glIsProgram)(GLuint program) = NULL;
-GLboolean (GL_APIENTRY *GLDispatch::glIsShader)(GLuint shader) = NULL;
-void (GL_APIENTRY *GLDispatch::glVertexAttrib1f)(GLuint,GLfloat) = NULL;
-void (GL_APIENTRY *GLDispatch::glVertexAttrib1fv)(GLuint,const GLfloat*) = NULL;
-void (GL_APIENTRY *GLDispatch::glVertexAttrib2f)(GLuint,GLfloat, GLfloat) = NULL;
-void (GL_APIENTRY *GLDispatch::glVertexAttrib2fv)(GLuint,const GLfloat*) = NULL;
-void (GL_APIENTRY *GLDispatch::glVertexAttrib3f)(GLuint,GLfloat, GLfloat,GLfloat) = NULL;
-void (GL_APIENTRY *GLDispatch::glVertexAttrib3fv)(GLuint,const GLfloat*) = NULL;
-void (GL_APIENTRY *GLDispatch::glVertexAttrib4f)(GLuint,GLfloat,GLfloat,GLfloat,GLfloat ) = NULL;
-void (GL_APIENTRY *GLDispatch::glVertexAttrib4fv)(GLuint,const GLfloat*) = NULL;
-void (GL_APIENTRY *GLDispatch::glVertexAttribPointer)(GLuint,GLint,GLenum,GLboolean,GLsizei,const GLvoid*) = NULL;
-void (GL_APIENTRY *GLDispatch::glDisableVertexAttribArray)(GLuint) = NULL;
-void (GL_APIENTRY *GLDispatch::glEnableVertexAttribArray)(GLuint) = NULL;
-void (GL_APIENTRY *GLDispatch::glGetVertexAttribfv)(GLuint,GLenum,GLfloat*) = NULL;
-void (GL_APIENTRY *GLDispatch::glGetVertexAttribiv)(GLuint,GLenum,GLint*) = NULL;
-void (GL_APIENTRY *GLDispatch::glGetVertexAttribPointerv)(GLuint,GLenum,GLvoid**) = NULL;
-void (GL_APIENTRY *GLDispatch::glUniform1f)(GLint,GLfloat) = NULL;
-void (GL_APIENTRY *GLDispatch::glUniform1fv)(GLint,GLsizei,const GLfloat*) = NULL;
-void (GL_APIENTRY *GLDispatch::glUniform1i)(GLint,GLint) = NULL;
-void (GL_APIENTRY *GLDispatch::glUniform1iv)(GLint,GLsizei,const GLint*) = NULL;
-void (GL_APIENTRY *GLDispatch::glUniform2f)(GLint,GLfloat,GLfloat) = NULL;
-void (GL_APIENTRY *GLDispatch::glUniform2fv)(GLint,GLsizei,const GLfloat*) = NULL;
-void (GL_APIENTRY *GLDispatch::glUniform2i)(GLint,GLint,GLint) = NULL;
-void (GL_APIENTRY *GLDispatch::glUniform2iv)(GLint ,GLsizei,const GLint*) = NULL;
-void (GL_APIENTRY *GLDispatch::glUniform3f)(GLint,GLfloat,GLfloat,GLfloat) = NULL;
-void (GL_APIENTRY *GLDispatch::glUniform3fv)(GLint,GLsizei,const GLfloat*) = NULL;
-void (GL_APIENTRY *GLDispatch::glUniform3i)(GLint,GLint,GLint,GLint) = NULL;
-void (GL_APIENTRY *GLDispatch::glUniform3iv)(GLint,GLsizei,const GLint*) = NULL;
-void (GL_APIENTRY *GLDispatch::glUniform4f)(GLint,GLfloat,GLfloat,GLfloat,GLfloat) = NULL;
-void (GL_APIENTRY *GLDispatch::glUniform4fv)(GLint,GLsizei,const GLfloat*) = NULL;
-void (GL_APIENTRY *GLDispatch::glUniform4i)(GLint,GLint,GLint,GLint,GLint) = NULL;
-void (GL_APIENTRY *GLDispatch::glUniform4iv)(GLint,GLsizei,const GLint*) = NULL;
-void (GL_APIENTRY *GLDispatch::glUniformMatrix2fv)(GLint,GLsizei,GLboolean,const GLfloat*) = NULL;
-void (GL_APIENTRY *GLDispatch::glUniformMatrix3fv)(GLint,GLsizei,GLboolean,const GLfloat*) = NULL;
-void (GL_APIENTRY *GLDispatch::glUniformMatrix4fv)(GLint,GLsizei,GLboolean,const GLfloat*) = NULL;
-void (GL_APIENTRY *GLDispatch::glAttachShader)(GLuint,GLuint) = NULL;
-void (GL_APIENTRY *GLDispatch::glBindAttribLocation)(GLuint,GLuint,const GLchar*) = NULL;
-void (GL_APIENTRY *GLDispatch::glCompileShader)(GLuint) = NULL;
-GLuint (GL_APIENTRY *GLDispatch::glCreateProgram)() = NULL;
-GLuint (GL_APIENTRY *GLDispatch::glCreateShader)(GLenum) = NULL;
-void (GL_APIENTRY *GLDispatch::glDeleteProgram)(GLuint) = NULL;
-void (GL_APIENTRY *GLDispatch::glDeleteShader)(GLuint) = NULL;
-void (GL_APIENTRY *GLDispatch::glDetachShader)(GLuint,GLuint) = NULL;
-void (GL_APIENTRY *GLDispatch::glLinkProgram)(GLuint) = NULL;
-void (GL_APIENTRY *GLDispatch::glUseProgram)(GLuint) = NULL;
-void (GL_APIENTRY *GLDispatch::glValidateProgram)(GLuint) = NULL;
-void (GL_APIENTRY *GLDispatch::glGetActiveAttrib)(GLuint,GLuint,GLsizei,GLsizei*,GLint*,GLenum*,GLchar*) = NULL;
-void (GL_APIENTRY *GLDispatch::glGetActiveUniform)(GLuint,GLuint,GLsizei,GLsizei*,GLint*,GLenum*,GLchar*) = NULL;
-void (GL_APIENTRY *GLDispatch::glGetAttachedShaders)(GLuint,GLsizei,GLsizei*,GLuint*) = NULL;
-int  (GL_APIENTRY *GLDispatch::glGetAttribLocation)(GLuint,const GLchar*) = NULL;
-void (GL_APIENTRY *GLDispatch::glGetProgramiv)(GLuint,GLenum,GLint*) = NULL;
-void (GL_APIENTRY *GLDispatch::glGetProgramInfoLog)(GLuint,GLsizei,GLsizei*,GLchar*) = NULL;
-void (GL_APIENTRY *GLDispatch::glGetShaderiv)(GLuint,GLenum,GLint*) = NULL;
-void (GL_APIENTRY *GLDispatch::glGetShaderInfoLog)(GLuint,GLsizei,GLsizei*,GLchar*) = NULL;
-void (GL_APIENTRY *GLDispatch::glGetShaderPrecisionFormat)(GLenum,GLenum,GLint*,GLint*) = NULL;
-void (GL_APIENTRY *GLDispatch::glGetShaderSource)(GLuint,GLsizei,GLsizei*,GLchar*) = NULL;
-void (GL_APIENTRY *GLDispatch::glGetUniformfv)(GLuint,GLint,GLfloat*) = NULL;
-void (GL_APIENTRY *GLDispatch::glGetUniformiv)(GLuint,GLint,GLint*) = NULL;
-int  (GL_APIENTRY *GLDispatch::glGetUniformLocation)(GLuint,const GLchar*) = NULL;
-void (GL_APIENTRY *GLDispatch::glReleaseShaderCompiler)() = NULL;
-void (GL_APIENTRY *GLDispatch::glShaderBinary)(GLsizei,const GLuint*,GLenum,const GLvoid*,GLsizei) = NULL;
-void (GL_APIENTRY *GLDispatch::glShaderSource)(GLuint,GLsizei,const GLchar* const*,const GLint*) = NULL;
-
-GLDispatch::GLDispatch():m_isLoaded(false){};
+    } while (0);
 
 
-void GLDispatch::dispatchFuncs(GLESVersion version){
-    emugl::Mutex::AutoLock mutex(s_lock);
-    if(m_isLoaded)
+// Define dummy functions, only for non-extensions.
+
+#define RETURN_void return
+#define RETURN_GLboolean return GL_FALSE
+#define RETURN_GLint return 0
+#define RETURN_GLuint return 0U
+#define RETURN_GLenum return 0
+#define RETURN_int return 0
+#define RETURN_GLconstubyteptr return NULL
+
+#define RETURN_(x)  RETURN_ ## x
+
+#define DEFINE_DUMMY_FUNCTION(return_type, func_name, signature) \
+static return_type GL_APIENTRY dummy_##func_name signature { \
+    RETURN_(return_type); \
+}
+
+#define DEFINE_DUMMY_EXTENSION_FUNCTION(return_type, func_name, signature) \
+  // nothing here
+
+LIST_GLES_FUNCTIONS(DEFINE_DUMMY_FUNCTION, DEFINE_DUMMY_EXTENSION_FUNCTION)
+
+// Constructor
+#define INIT_POINTER(return_type, function_name, signature) \
+    function_name(& dummy_ ## function_name),
+
+#define INIT_EXTENSION_POINTER(return_type, function_name, signature) \
+    function_name(NULL),
+
+GLDispatch::GLDispatch() :
+    LIST_GLES_FUNCTIONS(INIT_POINTER, INIT_EXTENSION_POINTER)
+    m_isLoaded(false) {}
+
+// Initialization fo dispatch table.
+void GLDispatch::dispatchFuncs(GLESVersion version) {
+    if (m_isLoaded) {
         return;
+    }
 
     /* Loading OpenGL functions which are needed for implementing BOTH GLES 1.1 & GLES 2.0*/
-    LOAD_GL_FUNC(glActiveTexture);
-    LOAD_GL_FUNC(glBindBuffer);
-    LOAD_GL_FUNC(glBindTexture);
-    LOAD_GL_FUNC(glBlendFunc);
-    LOAD_GL_FUNC(glBlendEquation);
-    LOAD_GL_FUNC(glBlendEquationSeparate);
-    LOAD_GL_FUNC(glBlendFuncSeparate);
-    LOAD_GL_FUNC(glBufferData);
-    LOAD_GL_FUNC(glBufferSubData);
-    LOAD_GL_FUNC(glClear);
-    LOAD_GL_FUNC(glClearColor);
-    LOAD_GL_FUNC(glClearDepth);
-    LOAD_GL_FUNC(glClearStencil);
-    LOAD_GL_FUNC(glColorMask);
-    LOAD_GL_FUNC(glCompressedTexImage2D);
-    LOAD_GL_FUNC(glCompressedTexSubImage2D);
-    LOAD_GL_FUNC(glCopyTexImage2D);
-    LOAD_GL_FUNC(glCopyTexSubImage2D);
-    LOAD_GL_FUNC(glCullFace);
-    LOAD_GL_FUNC(glDeleteBuffers);
-    LOAD_GL_FUNC(glDeleteTextures);
-    LOAD_GL_FUNC(glDepthFunc);
-    LOAD_GL_FUNC(glDepthMask);
-    LOAD_GL_FUNC(glDepthRange);
-    LOAD_GL_FUNC(glDisable);
-    LOAD_GL_FUNC(glDrawArrays);
-    LOAD_GL_FUNC(glDrawElements);
-    LOAD_GL_FUNC(glEnable);
-    LOAD_GL_FUNC(glFinish);
-    LOAD_GL_FUNC(glFlush);
-    LOAD_GL_FUNC(glFrontFace);
-    LOAD_GL_FUNC(glGenBuffers);
-    LOAD_GL_FUNC(glGenTextures);
-    LOAD_GL_FUNC(glGetBooleanv);
-    LOAD_GL_FUNC(glGetBufferParameteriv);
-    LOAD_GL_FUNC(glGetError);
-    LOAD_GL_FUNC(glGetFloatv);
-    LOAD_GL_FUNC(glGetIntegerv);
-    LOAD_GL_FUNC(glGetString);
-    LOAD_GL_FUNC(glTexParameterf);
-    LOAD_GL_FUNC(glTexParameterfv);
-    LOAD_GL_FUNC(glGetTexParameterfv);
-    LOAD_GL_FUNC(glGetTexParameteriv);
-    LOAD_GL_FUNC(glGetTexLevelParameteriv);
-    LOAD_GL_FUNC(glHint);
-    LOAD_GL_FUNC(glIsBuffer);
-    LOAD_GL_FUNC(glIsEnabled);
-    LOAD_GL_FUNC(glIsTexture);
-    LOAD_GL_FUNC(glLineWidth);
-    LOAD_GL_FUNC(glPolygonOffset);
-    LOAD_GL_FUNC(glPixelStorei);
-    LOAD_GL_FUNC(glReadPixels);
-    LOAD_GL_FUNC(glSampleCoverage);
-    LOAD_GL_FUNC(glScissor);
-    LOAD_GL_FUNC(glStencilFunc);
-    LOAD_GL_FUNC(glStencilMask);
-    LOAD_GL_FUNC(glStencilOp);
-    LOAD_GL_FUNC(glTexImage2D);
-    LOAD_GL_FUNC(glTexParameteri);
-    LOAD_GL_FUNC(glTexParameteriv);
-    LOAD_GL_FUNC(glTexSubImage2D);
-    LOAD_GL_FUNC(glViewport);
-    LOAD_GL_FUNC(glPushAttrib);
-    LOAD_GL_FUNC(glPushClientAttrib);
-    LOAD_GL_FUNC(glPopAttrib);
-    LOAD_GL_FUNC(glPopClientAttrib);
-    LOAD_GLEXT_FUNC(glIsRenderbufferEXT);
-    LOAD_GLEXT_FUNC(glBindRenderbufferEXT);
-    LOAD_GLEXT_FUNC(glDeleteRenderbuffersEXT);
-    LOAD_GLEXT_FUNC(glGenRenderbuffersEXT);
-    LOAD_GLEXT_FUNC(glRenderbufferStorageEXT);
-    LOAD_GLEXT_FUNC(glGetRenderbufferParameterivEXT);
-    LOAD_GLEXT_FUNC(glIsFramebufferEXT);
-    LOAD_GLEXT_FUNC(glBindFramebufferEXT);
-    LOAD_GLEXT_FUNC(glDeleteFramebuffersEXT);
-    LOAD_GLEXT_FUNC(glGenFramebuffersEXT);
-    LOAD_GLEXT_FUNC(glCheckFramebufferStatusEXT);
-    LOAD_GLEXT_FUNC(glFramebufferTexture1DEXT);
-    LOAD_GLEXT_FUNC(glFramebufferTexture2DEXT);
-    LOAD_GLEXT_FUNC(glFramebufferTexture3DEXT);
-    LOAD_GLEXT_FUNC(glFramebufferRenderbufferEXT);
-    LOAD_GLEXT_FUNC(glGetFramebufferAttachmentParameterivEXT);
-    LOAD_GLEXT_FUNC(glGenerateMipmapEXT);
+    LIST_GLES_COMMON_FUNCTIONS(LOAD_GL_FUNC)
+    LIST_GLES_EXTENSIONS_FUNCTIONS(LOAD_GLEXT_FUNC)
 
     /* Loading OpenGL functions which are needed ONLY for implementing GLES 1.1*/
     if(version == GLES_1_1){
-        LOAD_GL_FUNC(glAlphaFunc);
-        LOAD_GL_FUNC(glBegin);
-        LOAD_GL_FUNC(glClientActiveTexture);
-        LOAD_GL_FUNC(glClipPlane);
-        LOAD_GL_FUNC(glColor4d);
-        LOAD_GL_FUNC(glColor4f);
-        LOAD_GL_FUNC(glColor4fv);
-        LOAD_GL_FUNC(glColor4ub);
-        LOAD_GL_FUNC(glColor4ubv);
-        LOAD_GL_FUNC(glColorPointer);
-        LOAD_GL_FUNC(glDisableClientState);
-        LOAD_GL_FUNC(glEnableClientState);
-        LOAD_GL_FUNC(glEnd);
-        LOAD_GL_FUNC(glFogf);
-        LOAD_GL_FUNC(glFogfv);
-        LOAD_GL_FUNC(glFrustum);
-        LOAD_GL_FUNC(glGetClipPlane);
-        LOAD_GL_FUNC(glGetDoublev);
-        LOAD_GL_FUNC(glGetLightfv);
-        LOAD_GL_FUNC(glGetMaterialfv);
-        LOAD_GL_FUNC(glGetPointerv);
-        LOAD_GL_FUNC(glGetTexEnvfv);
-        LOAD_GL_FUNC(glGetTexEnviv);
-        LOAD_GL_FUNC(glLightf);
-        LOAD_GL_FUNC(glLightfv);
-        LOAD_GL_FUNC(glLightModelf);
-        LOAD_GL_FUNC(glLightModelfv);
-        LOAD_GL_FUNC(glLoadIdentity);
-        LOAD_GL_FUNC(glLoadMatrixf);
-        LOAD_GL_FUNC(glLogicOp);
-        LOAD_GL_FUNC(glMaterialf);
-        LOAD_GL_FUNC(glMaterialfv);
-        LOAD_GL_FUNC(glMultiTexCoord2fv);
-        LOAD_GL_FUNC(glMultiTexCoord2sv);
-        LOAD_GL_FUNC(glMultiTexCoord3fv);
-        LOAD_GL_FUNC(glMultiTexCoord3sv);
-        LOAD_GL_FUNC(glMultiTexCoord4fv);
-        LOAD_GL_FUNC(glMultiTexCoord4sv);
-        LOAD_GL_FUNC(glMultiTexCoord4f);
-        LOAD_GL_FUNC(glMultMatrixf);
-        LOAD_GL_FUNC(glNormal3f);
-        LOAD_GL_FUNC(glNormal3fv);
-        LOAD_GL_FUNC(glNormal3sv);
-        LOAD_GL_FUNC(glOrtho);
-        LOAD_GL_FUNC(glPointParameterf);
-        LOAD_GL_FUNC(glPointParameterfv);
-        LOAD_GL_FUNC(glPointSize);
-        LOAD_GL_FUNC(glRotatef);
-        LOAD_GL_FUNC(glScalef);
-        LOAD_GL_FUNC(glTexEnvf);
-        LOAD_GL_FUNC(glTexEnvfv);
-        LOAD_GL_FUNC(glMatrixMode);
-        LOAD_GL_FUNC(glNormalPointer);
-        LOAD_GL_FUNC(glPopMatrix);
-        LOAD_GL_FUNC(glPushMatrix);
-        LOAD_GL_FUNC(glShadeModel);
-        LOAD_GL_FUNC(glTexCoordPointer);
-        LOAD_GL_FUNC(glTexEnvi);
-        LOAD_GL_FUNC(glTexEnviv);
-        LOAD_GL_FUNC(glTranslatef);
-        LOAD_GL_FUNC(glVertexPointer);
-
-        LOAD_GLEXT_FUNC(glCurrentPaletteMatrixARB);
-        LOAD_GLEXT_FUNC(glMatrixIndexuivARB);
-        LOAD_GLEXT_FUNC(glMatrixIndexPointerARB);
-        LOAD_GLEXT_FUNC(glWeightPointerARB);
-        LOAD_GLEXT_FUNC(glTexGenf);
-        LOAD_GLEXT_FUNC(glTexGeni);
-        LOAD_GLEXT_FUNC(glTexGenfv);
-        LOAD_GLEXT_FUNC(glTexGeniv);
-        LOAD_GLEXT_FUNC(glGetTexGenfv);
-        LOAD_GLEXT_FUNC(glGetTexGeniv);
-
+        LIST_GLES1_ONLY_FUNCTIONS(LOAD_GL_FUNC)
+        LIST_GLES1_EXTENSIONS_FUNCTIONS(LOAD_GLEXT_FUNC)
     } else if (version == GLES_2_0){
-
-    /* Loading OpenGL functions which are needed ONLY for implementing GLES 2.0*/
-
-        LOAD_GL_FUNC(glBlendColor);
-        LOAD_GL_FUNC(glBlendFuncSeparate);
-        LOAD_GL_FUNC(glStencilFuncSeparate);
-        LOAD_GL_FUNC(glIsProgram);
-        LOAD_GL_FUNC(glIsShader);
-        LOAD_GL_FUNC(glVertexAttrib1f);
-        LOAD_GL_FUNC(glVertexAttrib1fv);
-        LOAD_GL_FUNC(glVertexAttrib2f);
-        LOAD_GL_FUNC(glVertexAttrib2fv);
-        LOAD_GL_FUNC(glVertexAttrib3f);
-        LOAD_GL_FUNC(glVertexAttrib3fv);
-        LOAD_GL_FUNC(glVertexAttrib4f);
-        LOAD_GL_FUNC(glVertexAttrib4fv);
-        LOAD_GL_FUNC(glVertexAttribPointer);
-        LOAD_GL_FUNC(glDisableVertexAttribArray);
-        LOAD_GL_FUNC(glEnableVertexAttribArray);
-        LOAD_GL_FUNC(glGetVertexAttribfv);
-        LOAD_GL_FUNC(glGetVertexAttribiv);
-        LOAD_GL_FUNC(glGetVertexAttribPointerv);
-        LOAD_GL_FUNC(glUniform1f);
-        LOAD_GL_FUNC(glUniform1fv);
-        LOAD_GL_FUNC(glUniform1i);
-        LOAD_GL_FUNC(glUniform1iv);
-        LOAD_GL_FUNC(glUniform2f);
-        LOAD_GL_FUNC(glUniform2fv);
-        LOAD_GL_FUNC(glUniform2i);
-        LOAD_GL_FUNC(glUniform2iv);
-        LOAD_GL_FUNC(glUniform3f);
-        LOAD_GL_FUNC(glUniform3fv);
-        LOAD_GL_FUNC(glUniform3i);
-        LOAD_GL_FUNC(glUniform3iv);
-        LOAD_GL_FUNC(glUniform4f);
-        LOAD_GL_FUNC(glUniform4fv);
-        LOAD_GL_FUNC(glUniform4i);
-        LOAD_GL_FUNC(glUniform4iv);
-        LOAD_GL_FUNC(glUniformMatrix2fv);
-        LOAD_GL_FUNC(glUniformMatrix3fv);
-        LOAD_GL_FUNC(glUniformMatrix4fv);
-        LOAD_GL_FUNC(glAttachShader);
-        LOAD_GL_FUNC(glBindAttribLocation);
-        LOAD_GL_FUNC(glCompileShader);
-        LOAD_GL_FUNC(glCreateProgram);
-        LOAD_GL_FUNC(glCreateShader);
-        LOAD_GL_FUNC(glDeleteProgram);
-        LOAD_GL_FUNC(glDeleteShader);
-        LOAD_GL_FUNC(glDetachShader);
-        LOAD_GL_FUNC(glLinkProgram);
-        LOAD_GL_FUNC(glUseProgram);
-        LOAD_GL_FUNC(glValidateProgram);
-        LOAD_GL_FUNC(glGetActiveAttrib);
-        LOAD_GL_FUNC(glGetActiveUniform);
-        LOAD_GL_FUNC(glGetAttachedShaders);
-        LOAD_GL_FUNC(glGetAttribLocation);
-        LOAD_GL_FUNC(glGetProgramiv);
-        LOAD_GL_FUNC(glGetProgramInfoLog);
-        LOAD_GL_FUNC(glGetShaderiv);
-        LOAD_GL_FUNC(glGetShaderInfoLog);
-        LOAD_GLEXT_FUNC(glGetShaderPrecisionFormat);
-        LOAD_GL_FUNC(glGetShaderSource);
-        LOAD_GL_FUNC(glGetUniformfv);
-        LOAD_GL_FUNC(glGetUniformiv);
-        LOAD_GL_FUNC(glGetUniformLocation);
-        LOAD_GLEXT_FUNC(glReleaseShaderCompiler);
-        LOAD_GLEXT_FUNC(glShaderBinary);
-        LOAD_GL_FUNC(glShaderSource);
-        LOAD_GL_FUNC(glStencilMaskSeparate);
+        LIST_GLES2_ONLY_FUNCTIONS(LOAD_GL_FUNC)
+        LIST_GLES2_EXTENSIONS_FUNCTIONS(LOAD_GLEXT_FUNC)
     }
     m_isLoaded = true;
 }
diff --git a/distrib/android-emugl/host/libs/Translator/GLcommon/TextureUtils.cpp b/distrib/android-emugl/host/libs/Translator/GLcommon/TextureUtils.cpp
index 81152f6..fa86303 100644
--- a/distrib/android-emugl/host/libs/Translator/GLcommon/TextureUtils.cpp
+++ b/distrib/android-emugl/host/libs/Translator/GLcommon/TextureUtils.cpp
@@ -46,7 +46,7 @@
 {
     /* XXX: This is just a hack to fix the resolve of glTexImage2D problem
        It will be removed when we'll no longer link against ligGL */
-    typedef void (GLAPIENTRY *glTexImage2DPtr_t ) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+    typedef void (GL_APIENTRY *glTexImage2DPtr_t ) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
     glTexImage2DPtr_t glTexImage2DPtr;
     glTexImage2DPtr =  (glTexImage2DPtr_t)funcPtr; 
 
diff --git a/distrib/android-emugl/host/libs/Translator/GLcommon/gles1_extensions.entries b/distrib/android-emugl/host/libs/Translator/GLcommon/gles1_extensions.entries
new file mode 100644
index 0000000..1e7f2f1
--- /dev/null
+++ b/distrib/android-emugl/host/libs/Translator/GLcommon/gles1_extensions.entries
@@ -0,0 +1,13 @@
+!gles1_extensions
+
+# OpenGL functions which are needed ONLY for implementing GLES 1.1 EXTENSIONS
+void glCurrentPaletteMatrixARB(GLint index);
+void glMatrixIndexuivARB(GLint size, GLuint * indices);
+void glMatrixIndexPointerARB(GLint size, GLenum type, GLsizei stride, const GLvoid* pointer);
+void glWeightPointerARB(GLint size, GLenum type, GLsizei stride, const GLvoid* pointer);
+void glTexGenf(GLenum coord, GLenum pname, GLfloat param );
+void glTexGeni(GLenum coord, GLenum pname, GLint param );
+void glTexGenfv(GLenum coord, GLenum pname, const GLfloat *params );
+void glTexGeniv(GLenum coord, GLenum pname, const GLint *params );
+void glGetTexGenfv(GLenum coord, GLenum pname, GLfloat *params );
+void glGetTexGeniv(GLenum coord, GLenum pname, GLint *params );
diff --git a/distrib/android-emugl/host/libs/Translator/GLcommon/gles1_only.entries b/distrib/android-emugl/host/libs/Translator/GLcommon/gles1_only.entries
new file mode 100644
index 0000000..41155d3
--- /dev/null
+++ b/distrib/android-emugl/host/libs/Translator/GLcommon/gles1_only.entries
@@ -0,0 +1,68 @@
+!gles1_only
+
+# OpenGL functions which are needed ONLY for implementing GLES 1.1
+
+void glAlphaFunc(GLenum func, GLclampf ref);
+void glBegin( GLenum mode );
+void glClearDepth(GLclampd depth);
+void glClientActiveTexture( GLenum texture );
+void glClipPlane(GLenum plane, const GLdouble *equation);
+void glColor4d(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
+void glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
+void glColor4fv( const GLfloat *v );
+void glColor4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
+void glColor4ubv( const GLubyte *v );
+void glColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+void glDisableClientState(GLenum array);
+void glEnableClientState(GLenum array);
+void glEnd(void);
+void glFogf(GLenum pname, GLfloat param);
+void glFogfv(GLenum pname, const GLfloat *params);
+void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+void glGetClipPlane(GLenum plane, GLdouble *equation);
+void glGetDoublev( GLenum pname, GLdouble *params );
+void glGetLightfv(GLenum light, GLenum pname, GLfloat *params);
+void glGetMaterialfv(GLenum face, GLenum pname, GLfloat *params);
+void glGetPointerv(GLenum pname, GLvoid* *params);
+void glGetTexEnvfv(GLenum target, GLenum pname, GLfloat *params);
+void glGetTexEnviv(GLenum target, GLenum pname, GLint *params);
+void glLightf(GLenum light, GLenum pname, GLfloat param);
+void glLightfv(GLenum light, GLenum pname, const GLfloat *params);
+void glLightModelf(GLenum pname, GLfloat param);
+void glLightModelfv(GLenum pname, const GLfloat *params);
+void glLoadIdentity(void);
+void glLoadMatrixf(const GLfloat *m);
+void glLogicOp(GLenum opcode);
+void glMaterialf(GLenum face, GLenum pname, GLfloat param);
+void glMaterialfv(GLenum face, GLenum pname, const GLfloat *params);
+void glMultiTexCoord2fv( GLenum target, const GLfloat *v );
+void glMultiTexCoord2sv( GLenum target, const GLshort *v );
+void glMultiTexCoord3fv( GLenum target, const GLfloat *v );
+void glMultiTexCoord3sv( GLenum target, const GLshort *v );
+void glMultiTexCoord4f( GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q );
+void glMultiTexCoord4fv( GLenum target, const GLfloat *v );
+void glMultiTexCoord4sv( GLenum target, const GLshort *v );
+void glMultMatrixf(const GLfloat *m);
+void glNormal3f(GLfloat nx, GLfloat ny, GLfloat nz);
+void glNormal3fv( const GLfloat *v );
+void glNormal3sv( const GLshort *v );
+void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
+void glPointParameterf(GLenum param, GLfloat value);
+void glPointParameterfv(GLenum param, const GLfloat *values);
+void glPointSize(GLfloat size);
+void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
+void glScalef(GLfloat x, GLfloat y, GLfloat z);
+void glTexEnvf(GLenum target, GLenum pname, GLfloat param);
+void glTexEnvfv(GLenum target, GLenum pname, const GLfloat *params);
+void glTexParameterf(GLenum target, GLenum pname, GLfloat param);
+void glTexParameterfv(GLenum target, GLenum pname, const GLfloat *params);
+void glMatrixMode(GLenum mode);
+void glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
+void glPopMatrix(void);
+void glPushMatrix(void);
+void glShadeModel(GLenum mode);
+void glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
+void glTexEnvi(GLenum target, GLenum pname, GLint param);
+void glTexEnviv(GLenum target, GLenum pname, const GLint *params);
+void glTranslatef(GLfloat x, GLfloat y, GLfloat z);
+void glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
diff --git a/distrib/android-emugl/host/libs/Translator/GLcommon/gles2_extensions.entries b/distrib/android-emugl/host/libs/Translator/GLcommon/gles2_extensions.entries
new file mode 100644
index 0000000..06ee78f
--- /dev/null
+++ b/distrib/android-emugl/host/libs/Translator/GLcommon/gles2_extensions.entries
@@ -0,0 +1,6 @@
+!gles2_extensions
+
+# GLES 2.0 extensions
+void glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision);
+void glReleaseShaderCompiler(void);
+void glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length);
diff --git a/distrib/android-emugl/host/libs/Translator/GLcommon/gles2_only.entries b/distrib/android-emugl/host/libs/Translator/GLcommon/gles2_only.entries
new file mode 100644
index 0000000..6ce877f
--- /dev/null
+++ b/distrib/android-emugl/host/libs/Translator/GLcommon/gles2_only.entries
@@ -0,0 +1,65 @@
+!gles2_only
+
+# OpenGL functions which are needed ONLY for implementing GLES 2.0
+void glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
+void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
+void glStencilMaskSeparate(GLenum face, GLuint mask);
+GLboolean glIsProgram(GLuint program);
+GLboolean glIsShader(GLuint shader);
+void glVertexAttrib1f(GLuint indx, GLfloat x);
+void glVertexAttrib1fv(GLuint indx, const GLfloat* values);
+void glVertexAttrib2f(GLuint indx, GLfloat x, GLfloat y);
+void glVertexAttrib2fv(GLuint indx, const GLfloat* values);
+void glVertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z);
+void glVertexAttrib3fv(GLuint indx, const GLfloat* values);
+void glVertexAttrib4f(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+void glVertexAttrib4fv(GLuint indx, const GLfloat* values);
+void glVertexAttribPointer(GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr);
+void glDisableVertexAttribArray(GLuint index);
+void glEnableVertexAttribArray(GLuint index);
+void glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params);
+void glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params);
+void glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer);
+void glUniform1f(GLint location, GLfloat x);
+void glUniform1fv(GLint location, GLsizei count, const GLfloat* v);
+void glUniform1i(GLint location, GLint x);
+void glUniform1iv(GLint location, GLsizei count, const GLint* v);
+void glUniform2f(GLint location, GLfloat x, GLfloat y);
+void glUniform2fv(GLint location, GLsizei count, const GLfloat* v);
+void glUniform2i(GLint location, GLint x, GLint y);
+void glUniform2iv(GLint location, GLsizei count, const GLint* v);
+void glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z);
+void glUniform3fv(GLint location, GLsizei count, const GLfloat* v);
+void glUniform3i(GLint location, GLint x, GLint y, GLint z);
+void glUniform3iv(GLint location, GLsizei count, const GLint* v);
+void glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+void glUniform4fv(GLint location, GLsizei count, const GLfloat* v);
+void glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w);
+void glUniform4iv(GLint location, GLsizei count, const GLint* v);
+void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+void glAttachShader(GLuint program, GLuint shader);
+void glBindAttribLocation(GLuint program, GLuint index, const GLchar* name);
+void glCompileShader(GLuint shader);
+GLuint glCreateProgram(void);
+GLuint glCreateShader(GLenum type);
+void glDeleteProgram(GLuint program);
+void glDeleteShader(GLuint shader);
+void glDetachShader(GLuint program, GLuint shader);
+void glLinkProgram(GLuint program);
+void glUseProgram(GLuint program);
+void glValidateProgram(GLuint program);
+void glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name);
+void glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name);
+void glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders);
+int  glGetAttribLocation(GLuint program, const GLchar* name);
+void glGetProgramiv(GLuint program, GLenum pname, GLint* params);
+void glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog);
+void glGetShaderiv(GLuint shader, GLenum pname, GLint* params);
+void glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog);
+void glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source);
+void glGetUniformfv(GLuint program, GLint location, GLfloat* params);
+void glGetUniformiv(GLuint program, GLint location, GLint* params);
+int  glGetUniformLocation(GLuint program, const GLchar* name);
+void glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length);
diff --git a/distrib/android-emugl/host/libs/Translator/GLcommon/gles_common.entries b/distrib/android-emugl/host/libs/Translator/GLcommon/gles_common.entries
new file mode 100644
index 0000000..d46dc7e
--- /dev/null
+++ b/distrib/android-emugl/host/libs/Translator/GLcommon/gles_common.entries
@@ -0,0 +1,71 @@
+!gles_common
+
+# Functions common to both GLES 1.x and 2.0
+
+%#include <GLES/gl.h>
+%// Return types must be single words, see GLDispatch.cpp
+%typedef const GLubyte* GLconstubyteptr;
+
+void glActiveTexture( GLenum texture );
+void glBindBuffer(GLenum target, GLuint buffer);
+void glBindTexture(GLenum target, GLuint texture);
+void glBlendFunc(GLenum sfactor, GLenum dfactor);
+void glBlendEquation( GLenum mode );
+void glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
+void glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+void glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
+void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);
+void glClear(GLbitfield mask);
+void glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
+void glClearStencil(GLint s);
+void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+void glCompressedTexImage2D( GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data );
+void glCompressedTexSubImage2D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data );
+void glCopyTexImage2D(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+void glCullFace(GLenum mode);
+void glDeleteBuffers(GLsizei n, const GLuint *buffers);
+void glDeleteTextures(GLsizei n, const GLuint *textures);
+void glDepthFunc(GLenum func);
+void glDepthMask(GLboolean flag);
+void glDepthRange(GLclampd zNear, GLclampd zFar);
+void glDisable(GLenum cap);
+void glDrawArrays(GLenum mode, GLint first, GLsizei count);
+void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
+void glEnable(GLenum cap);
+void glFinish(void);
+void glFlush(void);
+void glFrontFace(GLenum mode);
+void glGenBuffers(GLsizei n, GLuint *buffers);
+void glGenTextures(GLsizei n, GLuint *textures);
+void glGetBooleanv(GLenum pname, GLboolean *params);
+void glGetBufferParameteriv(GLenum buffer, GLenum parameter, GLint *value);
+GLenum glGetError(void);
+void glGetFloatv(GLenum pname, GLfloat *params);
+void glGetIntegerv(GLenum pname, GLint *params);
+GLconstubyteptr glGetString(GLenum name);
+void glGetTexParameterfv(GLenum target, GLenum pname, GLfloat *params);
+void glGetTexParameteriv(GLenum target, GLenum pname, GLint *params);
+void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params);
+void glHint(GLenum target, GLenum mode);
+GLboolean glIsBuffer(GLuint buffer);
+GLboolean glIsEnabled(GLenum cap);
+GLboolean glIsTexture(GLuint texture);
+void glLineWidth(GLfloat width);
+void glPolygonOffset(GLfloat factor, GLfloat units);
+void glPixelStorei(GLenum pname, GLint param);
+void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
+void glSampleCoverage( GLclampf value, GLboolean invert );
+void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);
+void glStencilFunc(GLenum func, GLint ref, GLuint mask);
+void glStencilMask(GLuint mask);
+void glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
+void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+void glTexParameteri(GLenum target, GLenum pname, GLint param);
+void glTexParameteriv(GLenum target, GLenum pname, const GLint *params);
+void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
+void glPushAttrib( GLbitfield mask );
+void glPopAttrib( void );
+void glPushClientAttrib( GLbitfield mask );
+void glPopClientAttrib( void );
diff --git a/distrib/android-emugl/host/libs/Translator/GLcommon/gles_extensions.entries b/distrib/android-emugl/host/libs/Translator/GLcommon/gles_extensions.entries
new file mode 100644
index 0000000..14d4a98
--- /dev/null
+++ b/distrib/android-emugl/host/libs/Translator/GLcommon/gles_extensions.entries
@@ -0,0 +1,20 @@
+!gles_extensions
+
+# Common GLES 1.x / 2.0 extension functions
+GLboolean glIsRenderbufferEXT(GLuint renderbuffer);
+void glBindRenderbufferEXT(GLenum target, GLuint renderbuffer);
+void glDeleteRenderbuffersEXT(GLsizei n, const GLuint *renderbuffers);
+void glGenRenderbuffersEXT(GLsizei n, GLuint *renderbuffers);
+void glRenderbufferStorageEXT(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+void glGetRenderbufferParameterivEXT(GLenum target, GLenum pname, GLint *params);
+GLboolean glIsFramebufferEXT(GLuint framebuffer);
+void glBindFramebufferEXT(GLenum target, GLuint framebuffer);
+void glDeleteFramebuffersEXT(GLsizei n, const GLuint *framebuffers);
+void glGenFramebuffersEXT(GLsizei n, GLuint *framebuffers);
+GLenum glCheckFramebufferStatusEXT(GLenum target);
+void glFramebufferTexture1DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+void glFramebufferTexture2DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+void glFramebufferTexture3DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
+void glFramebufferRenderbufferEXT(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+void glGetFramebufferAttachmentParameterivEXT(GLenum target, GLenum attachment, GLenum pname, GLint *params);
+void glGenerateMipmapEXT(GLenum target);
diff --git a/distrib/android-emugl/host/libs/Translator/include/GLcommon/GLDispatch.h b/distrib/android-emugl/host/libs/Translator/include/GLcommon/GLDispatch.h
index 6eda55b..b9c1f0b 100644
--- a/distrib/android-emugl/host/libs/Translator/include/GLcommon/GLDispatch.h
+++ b/distrib/android-emugl/host/libs/Translator/include/GLcommon/GLDispatch.h
@@ -13,255 +13,34 @@
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
-#ifndef GLDISPATCHH
-#define GLDISPATCHH
+#ifndef GL_DISPATCHH
+#define GL_DISPATCHH
 
 #include <GLES/gl.h>
 #include <GLES2/gl2.h>
-#include "emugl/common/mutex.h"
+
 #include "gldefs.h"
+#include "gles_functions.h"
 #include "GLutils.h"
 
-#define GLAPIENTRY GL_APIENTRY
+#include "emugl/common/mutex.h"
+
 typedef void(*FUNCPTR)();
 
-class GLDispatch
-{
-public:
+#define GLES_DECLARE_METHOD(return_type, function_name, signature) \
+    return_type (GL_APIENTRY *function_name) signature;
 
+class GLDispatch {
+public:
+    // Constructor.
     GLDispatch();
+
     void dispatchFuncs(GLESVersion version);
 
-    /* OpenGL functions which are needed for implementing BOTH GLES 1.1 & GLES 2.0*/
-    static void (GLAPIENTRY *glActiveTexture) ( GLenum texture );
-    static void (GLAPIENTRY *glBindBuffer) (GLenum target, GLuint buffer);
-    static void (GLAPIENTRY *glBindTexture) (GLenum target, GLuint texture);
-    static void (GLAPIENTRY *glBlendFunc) (GLenum sfactor, GLenum dfactor);
-    static void (GLAPIENTRY *glBlendEquation)( GLenum mode );
-    static void (GLAPIENTRY *glBlendEquationSeparate)(GLenum modeRGB, GLenum modeAlpha);
-    static void (GLAPIENTRY *glBlendFuncSeparate)(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
-    static void (GLAPIENTRY *glBufferData) (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage);
-    static void (GLAPIENTRY *glBufferSubData) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data);
-    static void (GLAPIENTRY *glClear) (GLbitfield mask);
-    static void (GLAPIENTRY *glClearColor) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
-    static void (GLAPIENTRY *glClearStencil) (GLint s);
-    static void (GLAPIENTRY *glColorMask) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
-    static void (GLAPIENTRY *glCompressedTexImage2D) ( GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data );
-    static void (GLAPIENTRY *glCompressedTexSubImage2D) ( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data );
-    static void (GLAPIENTRY *glCopyTexImage2D) (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
-    static void (GLAPIENTRY *glCopyTexSubImage2D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
-    static void (GLAPIENTRY *glCullFace) (GLenum mode);
-    static void (GLAPIENTRY *glDeleteBuffers) (GLsizei n, const GLuint *buffers);
-    static void (GLAPIENTRY *glDeleteTextures) (GLsizei n, const GLuint *textures);
-    static void (GLAPIENTRY *glDepthFunc) (GLenum func);
-    static void (GLAPIENTRY *glDepthMask) (GLboolean flag);
-    static void (GLAPIENTRY *glDepthRange) (GLclampd zNear, GLclampd zFar);
-    static void (GLAPIENTRY *glDisable) (GLenum cap);
-    static void (GLAPIENTRY *glDrawArrays) (GLenum mode, GLint first, GLsizei count);
-    static void (GLAPIENTRY *glDrawElements) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
-    static void (GLAPIENTRY *glEnable) (GLenum cap);
-    static void (GLAPIENTRY *glFinish) (void);
-    static void (GLAPIENTRY *glFlush) (void);
-    static void (GLAPIENTRY *glFrontFace) (GLenum mode);
-    static void (GLAPIENTRY *glGenBuffers) (GLsizei n, GLuint *buffers);
-    static void (GLAPIENTRY *glGenTextures) (GLsizei n, GLuint *textures);
-    static void (GLAPIENTRY *glGetBooleanv) (GLenum pname, GLboolean *params);
-    static void (GLAPIENTRY *glGetBufferParameteriv) (GLenum, GLenum, GLint *);
-    static GLenum (GLAPIENTRY *glGetError) (void);
-    static void (GLAPIENTRY *glGetFloatv) (GLenum pname, GLfloat *params);
-    static void (GLAPIENTRY *glGetIntegerv) (GLenum pname, GLint *params);
-    static const GLubyte * (GLAPIENTRY *glGetString) (GLenum name);
-    static void (GLAPIENTRY *glGetTexParameterfv) (GLenum target, GLenum pname, GLfloat *params);
-    static void (GLAPIENTRY *glGetTexParameteriv) (GLenum target, GLenum pname, GLint *params);
-    static void (GLAPIENTRY *glGetTexLevelParameteriv) (GLenum target, GLint level, GLenum pname, GLint *params);
-    static void (GLAPIENTRY *glHint) (GLenum target, GLenum mode);
-    static GLboolean (GLAPIENTRY *glIsBuffer) (GLuint);
-    static GLboolean (GLAPIENTRY *glIsEnabled) (GLenum cap);
-    static GLboolean (GLAPIENTRY *glIsTexture) (GLuint texture);
-    static void (GLAPIENTRY *glLineWidth) (GLfloat width);
-    static void (GLAPIENTRY *glPolygonOffset) (GLfloat factor, GLfloat units);
-    static void (GLAPIENTRY *glPixelStorei) (GLenum pname, GLint param);
-    static void (GLAPIENTRY *glReadPixels) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
-    static void (GLAPIENTRY *glSampleCoverage) ( GLclampf value, GLboolean invert );
-    static void (GLAPIENTRY *glScissor) (GLint x, GLint y, GLsizei width, GLsizei height);
-    static void (GLAPIENTRY *glStencilFunc) (GLenum func, GLint ref, GLuint mask);
-    static void (GLAPIENTRY *glStencilMask) (GLuint mask);
-    static void (GLAPIENTRY *glStencilOp) (GLenum fail, GLenum zfail, GLenum zpass);
-    static void (GLAPIENTRY *glTexImage2D) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
-    static void (GLAPIENTRY *glTexParameteri) (GLenum target, GLenum pname, GLint param);
-    static void (GLAPIENTRY *glTexParameteriv) (GLenum target, GLenum pname, const GLint *params);
-    static void (GLAPIENTRY *glTexSubImage2D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
-    static void (GLAPIENTRY *glViewport) (GLint x, GLint y, GLsizei width, GLsizei height);
-    static void (GLAPIENTRY *glPushAttrib) ( GLbitfield mask );
-    static void (GLAPIENTRY *glPopAttrib) ( void );
-    static void (GLAPIENTRY *glPushClientAttrib) ( GLbitfield mask );
-    static void (GLAPIENTRY *glPopClientAttrib) ( void );
-    static GLboolean (GLAPIENTRY *glIsRenderbufferEXT) (GLuint renderbuffer);
-    static void (GLAPIENTRY *glBindRenderbufferEXT) (GLenum target, GLuint renderbuffer);
-    static void (GLAPIENTRY *glDeleteRenderbuffersEXT) (GLsizei n, const GLuint *renderbuffers);
-    static void (GLAPIENTRY *glGenRenderbuffersEXT) (GLsizei n, GLuint *renderbuffers);
-    static void (GLAPIENTRY *glRenderbufferStorageEXT) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
-    static void (GLAPIENTRY *glGetRenderbufferParameterivEXT) (GLenum target, GLenum pname, GLint *params);
-    static GLboolean (GLAPIENTRY *glIsFramebufferEXT) (GLuint framebuffer);
-    static void (GLAPIENTRY *glBindFramebufferEXT) (GLenum target, GLuint framebuffer);
-    static void (GLAPIENTRY *glDeleteFramebuffersEXT) (GLsizei n, const GLuint *framebuffers);
-    static void (GLAPIENTRY *glGenFramebuffersEXT) (GLsizei n, GLuint *framebuffers);
-    static GLenum (GLAPIENTRY *glCheckFramebufferStatusEXT) (GLenum target);
-    static void (GLAPIENTRY *glFramebufferTexture1DEXT) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
-    static void (GLAPIENTRY *glFramebufferTexture2DEXT) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
-    static void (GLAPIENTRY *glFramebufferTexture3DEXT) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
-    static void (GLAPIENTRY *glFramebufferRenderbufferEXT) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
-    static void (GLAPIENTRY *glGetFramebufferAttachmentParameterivEXT) (GLenum target, GLenum attachment, GLenum pname, GLint *params);
-    static void (GLAPIENTRY *glGenerateMipmapEXT) (GLenum target);
-
-    /* OpenGL functions which are needed ONLY for implementing GLES 1.1*/
-    static void (GLAPIENTRY *glAlphaFunc) (GLenum func, GLclampf ref);
-    static void (GLAPIENTRY *glBegin)( GLenum mode );
-    static void (GLAPIENTRY *glClearDepth) (GLclampd depth);
-    static void (GLAPIENTRY *glClientActiveTexture) ( GLenum texture );
-    static void (GLAPIENTRY *glClipPlane) (GLenum plane, const GLdouble *equation);
-    static void (GLAPIENTRY *glColor4d) (GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
-    static void (GLAPIENTRY *glColor4f) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
-    static void (GLAPIENTRY *glColor4fv) ( const GLfloat *v );
-    static void (GLAPIENTRY *glColor4ub) (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
-    static void (GLAPIENTRY *glColor4ubv) ( const GLubyte *v );
-    static void (GLAPIENTRY *glColorPointer) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
-    static void (GLAPIENTRY *glDisableClientState) (GLenum array);
-    static void (GLAPIENTRY *glEnableClientState) (GLenum array);
-    static void (GLAPIENTRY *glEnd) (void);
-    static void (GLAPIENTRY *glFogf) (GLenum pname, GLfloat param);
-    static void (GLAPIENTRY *glFogfv) (GLenum pname, const GLfloat *params);
-    static void (GLAPIENTRY *glFrustum) (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
-    static void (GLAPIENTRY *glGetClipPlane) (GLenum plane, GLdouble *equation);
-    static void (GLAPIENTRY *glGetDoublev) ( GLenum pname, GLdouble *params );
-    static void (GLAPIENTRY *glGetLightfv) (GLenum light, GLenum pname, GLfloat *params);
-    static void (GLAPIENTRY *glGetMaterialfv) (GLenum face, GLenum pname, GLfloat *params);
-    static void (GLAPIENTRY *glGetPointerv) (GLenum pname, GLvoid* *params);
-    static void (GLAPIENTRY *glGetTexEnvfv) (GLenum target, GLenum pname, GLfloat *params);
-    static void (GLAPIENTRY *glGetTexEnviv) (GLenum target, GLenum pname, GLint *params);
-    static void (GLAPIENTRY *glLightf) (GLenum light, GLenum pname, GLfloat param);
-    static void (GLAPIENTRY *glLightfv) (GLenum light, GLenum pname, const GLfloat *params);
-    static void (GLAPIENTRY *glLightModelf) (GLenum pname, GLfloat param);
-    static void (GLAPIENTRY *glLightModelfv) (GLenum pname, const GLfloat *params);
-    static void (GLAPIENTRY *glLoadIdentity) (void);
-    static void (GLAPIENTRY *glLoadMatrixf) (const GLfloat *m);
-    static void (GLAPIENTRY *glLogicOp) (GLenum opcode);
-    static void (GLAPIENTRY *glMaterialf) (GLenum face, GLenum pname, GLfloat param);
-    static void (GLAPIENTRY *glMaterialfv) (GLenum face, GLenum pname, const GLfloat *params);
-    static void (GLAPIENTRY *glMultiTexCoord2fv) ( GLenum target, const GLfloat *v );
-    static void (GLAPIENTRY *glMultiTexCoord2sv) ( GLenum target, const GLshort *v );
-    static void (GLAPIENTRY *glMultiTexCoord3fv) ( GLenum target, const GLfloat *v );
-    static void (GLAPIENTRY *glMultiTexCoord3sv) ( GLenum target, const GLshort *v );
-    static void (GLAPIENTRY *glMultiTexCoord4f) ( GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q );
-    static void (GLAPIENTRY *glMultiTexCoord4fv) ( GLenum target, const GLfloat *v );
-    static void (GLAPIENTRY *glMultiTexCoord4sv) ( GLenum target, const GLshort *v );
-    static void (GLAPIENTRY *glMultMatrixf) (const GLfloat *m);
-    static void (GLAPIENTRY *glNormal3f) (GLfloat nx, GLfloat ny, GLfloat nz);
-    static void (GLAPIENTRY *glNormal3fv) ( const GLfloat *v );
-    static void (GLAPIENTRY *glNormal3sv) ( const GLshort *v );
-    static void (GLAPIENTRY *glOrtho) (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar);
-    static void (GLAPIENTRY *glPointParameterf) (GLenum, GLfloat);
-    static void (GLAPIENTRY *glPointParameterfv) (GLenum, const GLfloat *);
-    static void (GLAPIENTRY *glPointSize) (GLfloat size);
-    static void (GLAPIENTRY *glRotatef) (GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
-    static void (GLAPIENTRY *glScalef) (GLfloat x, GLfloat y, GLfloat z);
-    static void (GLAPIENTRY *glTexEnvf) (GLenum target, GLenum pname, GLfloat param);
-    static void (GLAPIENTRY *glTexEnvfv) (GLenum target, GLenum pname, const GLfloat *params);
-    static void (GLAPIENTRY *glTexParameterf) (GLenum target, GLenum pname, GLfloat param);
-    static void (GLAPIENTRY *glTexParameterfv) (GLenum target, GLenum pname, const GLfloat *params);
-    static void (GLAPIENTRY *glMatrixMode) (GLenum mode);
-    static void (GLAPIENTRY *glNormalPointer) (GLenum type, GLsizei stride, const GLvoid *pointer);
-    static void (GLAPIENTRY *glPopMatrix) (void);
-    static void (GLAPIENTRY *glPushMatrix) (void);
-    static void (GLAPIENTRY *glShadeModel) (GLenum mode);
-    static void (GLAPIENTRY *glTexCoordPointer) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
-    static void (GLAPIENTRY *glTexEnvi) (GLenum target, GLenum pname, GLint param);
-    static void (GLAPIENTRY *glTexEnviv) (GLenum target, GLenum pname, const GLint *params);
-    static void (GLAPIENTRY *glTranslatef) (GLfloat x, GLfloat y, GLfloat z);
-    static void (GLAPIENTRY *glVertexPointer) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
-
-    /* OpenGL functions which are needed ONLY for implementing GLES 1.1 EXTENSIONS*/
-    static void (GLAPIENTRY *glCurrentPaletteMatrixARB) (GLint index);
-    static void (GLAPIENTRY *glMatrixIndexuivARB) (GLint size, GLuint * indices);
-    static void (GLAPIENTRY *glMatrixIndexPointerARB) (GLint size, GLenum type, GLsizei stride, const GLvoid* pointer);
-    static void (GLAPIENTRY *glWeightPointerARB) (GLint size, GLenum type, GLsizei stride, const GLvoid* pointer);
-    static void (GLAPIENTRY *glTexGenf) (GLenum coord, GLenum pname, GLfloat param );
-    static void (GLAPIENTRY *glTexGeni) (GLenum coord, GLenum pname, GLint param );
-    static void (GLAPIENTRY *glTexGenfv) (GLenum coord, GLenum pname, const GLfloat *params );
-    static void (GLAPIENTRY *glTexGeniv) (GLenum coord, GLenum pname, const GLint *params );
-    static void (GLAPIENTRY *glGetTexGenfv) (GLenum coord, GLenum pname, GLfloat *params );
-    static void (GLAPIENTRY *glGetTexGeniv) (GLenum coord, GLenum pname, GLint *params );
-
-    /* Loading OpenGL functions which are needed ONLY for implementing GLES 2.0*/
-    static void (GL_APIENTRY *glBlendColor) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
-    static void (GL_APIENTRY *glStencilFuncSeparate)(GLenum face, GLenum func, GLint ref, GLuint mask);
-    static void (GL_APIENTRY *glStencilMaskSeparate)(GLenum face, GLuint mask);
-    static GLboolean (GL_APIENTRY *glIsProgram)(GLuint program);
-    static GLboolean (GL_APIENTRY *glIsShader)(GLuint shader);
-    static void (GL_APIENTRY *glVertexAttrib1f)(GLuint indx, GLfloat x);
-    static void (GL_APIENTRY *glVertexAttrib1fv)(GLuint indx, const GLfloat* values);
-    static void (GL_APIENTRY *glVertexAttrib2f)(GLuint indx, GLfloat x, GLfloat y);
-    static void (GL_APIENTRY *glVertexAttrib2fv)(GLuint indx, const GLfloat* values);
-    static void (GL_APIENTRY *glVertexAttrib3f)(GLuint indx, GLfloat x, GLfloat y, GLfloat z);
-    static void (GL_APIENTRY *glVertexAttrib3fv)(GLuint indx, const GLfloat* values);
-    static void (GL_APIENTRY *glVertexAttrib4f)(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
-    static void (GL_APIENTRY *glVertexAttrib4fv)(GLuint indx, const GLfloat* values);
-    static void (GL_APIENTRY *glVertexAttribPointer)(GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr);
-    static void (GL_APIENTRY *glDisableVertexAttribArray)(GLuint index);
-    static void (GL_APIENTRY *glEnableVertexAttribArray)(GLuint index);
-    static void (GL_APIENTRY *glGetVertexAttribfv)(GLuint index, GLenum pname, GLfloat* params);
-    static void (GL_APIENTRY *glGetVertexAttribiv)(GLuint index, GLenum pname, GLint* params);
-    static void (GL_APIENTRY *glGetVertexAttribPointerv)(GLuint index, GLenum pname, GLvoid** pointer);
-    static void (GL_APIENTRY *glUniform1f)(GLint location, GLfloat x);
-    static void (GL_APIENTRY *glUniform1fv)(GLint location, GLsizei count, const GLfloat* v);
-    static void (GL_APIENTRY *glUniform1i)(GLint location, GLint x);
-    static void (GL_APIENTRY *glUniform1iv)(GLint location, GLsizei count, const GLint* v);
-    static void (GL_APIENTRY *glUniform2f)(GLint location, GLfloat x, GLfloat y);
-    static void (GL_APIENTRY *glUniform2fv)(GLint location, GLsizei count, const GLfloat* v);
-    static void (GL_APIENTRY *glUniform2i)(GLint location, GLint x, GLint y);
-    static void (GL_APIENTRY *glUniform2iv)(GLint location, GLsizei count, const GLint* v);
-    static void (GL_APIENTRY *glUniform3f)(GLint location, GLfloat x, GLfloat y, GLfloat z);
-    static void (GL_APIENTRY *glUniform3fv)(GLint location, GLsizei count, const GLfloat* v);
-    static void (GL_APIENTRY *glUniform3i)(GLint location, GLint x, GLint y, GLint z);
-    static void (GL_APIENTRY *glUniform3iv)(GLint location, GLsizei count, const GLint* v);
-    static void (GL_APIENTRY *glUniform4f)(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
-    static void (GL_APIENTRY *glUniform4fv)(GLint location, GLsizei count, const GLfloat* v);
-    static void (GL_APIENTRY *glUniform4i)(GLint location, GLint x, GLint y, GLint z, GLint w);
-    static void (GL_APIENTRY *glUniform4iv)(GLint location, GLsizei count, const GLint* v);
-    static void (GL_APIENTRY *glUniformMatrix2fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
-    static void (GL_APIENTRY *glUniformMatrix3fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
-    static void (GL_APIENTRY *glUniformMatrix4fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
-    static void (GL_APIENTRY *glAttachShader)(GLuint program, GLuint shader);
-    static void (GL_APIENTRY *glBindAttribLocation)(GLuint program, GLuint index, const GLchar* name);
-    static void (GL_APIENTRY *glCompileShader)(GLuint shader);
-    static GLuint (GL_APIENTRY *glCreateProgram)(void);
-    static GLuint (GL_APIENTRY *glCreateShader)(GLenum type);
-    static void (GL_APIENTRY *glDeleteProgram)(GLuint program);
-    static void (GL_APIENTRY *glDeleteShader)(GLuint shader);
-    static void (GL_APIENTRY *glDetachShader)(GLuint program, GLuint shader);
-    static void (GL_APIENTRY *glLinkProgram)(GLuint program);
-    static void (GL_APIENTRY *glUseProgram)(GLuint program);
-    static void (GL_APIENTRY *glValidateProgram)(GLuint program);
-    static void (GL_APIENTRY *glGetActiveAttrib)(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name);
-    static void (GL_APIENTRY *glGetActiveUniform)(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name);
-    static void (GL_APIENTRY *glGetAttachedShaders)(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders);
-    static int  (GL_APIENTRY *glGetAttribLocation)(GLuint program, const GLchar* name);
-    static void (GL_APIENTRY *glGetProgramiv)(GLuint program, GLenum pname, GLint* params);
-    static void (GL_APIENTRY *glGetProgramInfoLog)(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog);
-    static void (GL_APIENTRY *glGetShaderiv)(GLuint shader, GLenum pname, GLint* params);
-    static void (GL_APIENTRY *glGetShaderInfoLog)(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog);
-    static void (GL_APIENTRY *glGetShaderPrecisionFormat)(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision);
-    static void (GL_APIENTRY *glGetShaderSource)(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source);
-    static void (GL_APIENTRY *glGetUniformfv)(GLuint program, GLint location, GLfloat* params);
-    static void (GL_APIENTRY *glGetUniformiv)(GLuint program, GLint location, GLint* params);
-    static int  (GL_APIENTRY *glGetUniformLocation)(GLuint program, const GLchar* name);
-    static void (GL_APIENTRY *glReleaseShaderCompiler)(void);
-    static void (GL_APIENTRY *glShaderBinary)(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length);
-    static void (GL_APIENTRY *glShaderSource)(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length);
+    LIST_GLES_FUNCTIONS(GLES_DECLARE_METHOD, GLES_DECLARE_METHOD)
 
 private:
-    bool                  m_isLoaded;
-    static emugl::Mutex   s_lock;
+    bool m_isLoaded;
 };
 
-#endif
+#endif  // GL_DISPATCH_H
diff --git a/distrib/android-emugl/host/libs/Translator/include/GLcommon/gles1_extensions_functions.h b/distrib/android-emugl/host/libs/Translator/include/GLcommon/gles1_extensions_functions.h
new file mode 100644
index 0000000..ae75f23
--- /dev/null
+++ b/distrib/android-emugl/host/libs/Translator/include/GLcommon/gles1_extensions_functions.h
@@ -0,0 +1,20 @@
+// Auto-generated with: android/scripts/gen-entries.py --mode=functions distrib/android-emugl/host/libs/Translator/GLcommon/gles1_extensions.entries --output=distrib/android-emugl/host/libs/Translator/include/GLcommon/gles1_extensions_functions.h
+// DO NOT EDIT THIS FILE
+
+#ifndef GLES1_EXTENSIONS_FUNCTIONS_H
+#define GLES1_EXTENSIONS_FUNCTIONS_H
+
+#define LIST_GLES1_EXTENSIONS_FUNCTIONS(X) \
+  X(void, glCurrentPaletteMatrixARB, (GLint index)) \
+  X(void, glMatrixIndexuivARB, (GLint size, GLuint * indices)) \
+  X(void, glMatrixIndexPointerARB, (GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)) \
+  X(void, glWeightPointerARB, (GLint size, GLenum type, GLsizei stride, const GLvoid* pointer)) \
+  X(void, glTexGenf, (GLenum coord, GLenum pname, GLfloat param)) \
+  X(void, glTexGeni, (GLenum coord, GLenum pname, GLint param)) \
+  X(void, glTexGenfv, (GLenum coord, GLenum pname, const GLfloat * params)) \
+  X(void, glTexGeniv, (GLenum coord, GLenum pname, const GLint * params)) \
+  X(void, glGetTexGenfv, (GLenum coord, GLenum pname, GLfloat * params)) \
+  X(void, glGetTexGeniv, (GLenum coord, GLenum pname, GLint * params)) \
+
+
+#endif  // GLES1_EXTENSIONS_FUNCTIONS_H
diff --git a/distrib/android-emugl/host/libs/Translator/include/GLcommon/gles1_only_functions.h b/distrib/android-emugl/host/libs/Translator/include/GLcommon/gles1_only_functions.h
new file mode 100644
index 0000000..27eb7f0
--- /dev/null
+++ b/distrib/android-emugl/host/libs/Translator/include/GLcommon/gles1_only_functions.h
@@ -0,0 +1,74 @@
+// Auto-generated with: android/scripts/gen-entries.py --mode=functions distrib/android-emugl/host/libs/Translator/GLcommon/gles1_only.entries --output=distrib/android-emugl/host/libs/Translator/include/GLcommon/gles1_only_functions.h
+// DO NOT EDIT THIS FILE
+
+#ifndef GLES1_ONLY_FUNCTIONS_H
+#define GLES1_ONLY_FUNCTIONS_H
+
+#define LIST_GLES1_ONLY_FUNCTIONS(X) \
+  X(void, glAlphaFunc, (GLenum func, GLclampf ref)) \
+  X(void, glBegin, (GLenum mode)) \
+  X(void, glClearDepth, (GLclampd depth)) \
+  X(void, glClientActiveTexture, (GLenum texture)) \
+  X(void, glClipPlane, (GLenum plane, const GLdouble * equation)) \
+  X(void, glColor4d, (GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha)) \
+  X(void, glColor4f, (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)) \
+  X(void, glColor4fv, (const GLfloat * v)) \
+  X(void, glColor4ub, (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)) \
+  X(void, glColor4ubv, (const GLubyte * v)) \
+  X(void, glColorPointer, (GLint size, GLenum type, GLsizei stride, const GLvoid * pointer)) \
+  X(void, glDisableClientState, (GLenum array)) \
+  X(void, glEnableClientState, (GLenum array)) \
+  X(void, glEnd, ()) \
+  X(void, glFogf, (GLenum pname, GLfloat param)) \
+  X(void, glFogfv, (GLenum pname, const GLfloat * params)) \
+  X(void, glFrustum, (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)) \
+  X(void, glGetClipPlane, (GLenum plane, GLdouble * equation)) \
+  X(void, glGetDoublev, (GLenum pname, GLdouble * params)) \
+  X(void, glGetLightfv, (GLenum light, GLenum pname, GLfloat * params)) \
+  X(void, glGetMaterialfv, (GLenum face, GLenum pname, GLfloat * params)) \
+  X(void, glGetPointerv, (GLenum pname, GLvoid* * params)) \
+  X(void, glGetTexEnvfv, (GLenum target, GLenum pname, GLfloat * params)) \
+  X(void, glGetTexEnviv, (GLenum target, GLenum pname, GLint * params)) \
+  X(void, glLightf, (GLenum light, GLenum pname, GLfloat param)) \
+  X(void, glLightfv, (GLenum light, GLenum pname, const GLfloat * params)) \
+  X(void, glLightModelf, (GLenum pname, GLfloat param)) \
+  X(void, glLightModelfv, (GLenum pname, const GLfloat * params)) \
+  X(void, glLoadIdentity, ()) \
+  X(void, glLoadMatrixf, (const GLfloat * m)) \
+  X(void, glLogicOp, (GLenum opcode)) \
+  X(void, glMaterialf, (GLenum face, GLenum pname, GLfloat param)) \
+  X(void, glMaterialfv, (GLenum face, GLenum pname, const GLfloat * params)) \
+  X(void, glMultiTexCoord2fv, (GLenum target, const GLfloat * v)) \
+  X(void, glMultiTexCoord2sv, (GLenum target, const GLshort * v)) \
+  X(void, glMultiTexCoord3fv, (GLenum target, const GLfloat * v)) \
+  X(void, glMultiTexCoord3sv, (GLenum target, const GLshort * v)) \
+  X(void, glMultiTexCoord4f, (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)) \
+  X(void, glMultiTexCoord4fv, (GLenum target, const GLfloat * v)) \
+  X(void, glMultiTexCoord4sv, (GLenum target, const GLshort * v)) \
+  X(void, glMultMatrixf, (const GLfloat * m)) \
+  X(void, glNormal3f, (GLfloat nx, GLfloat ny, GLfloat nz)) \
+  X(void, glNormal3fv, (const GLfloat * v)) \
+  X(void, glNormal3sv, (const GLshort * v)) \
+  X(void, glOrtho, (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)) \
+  X(void, glPointParameterf, (GLenum param, GLfloat value)) \
+  X(void, glPointParameterfv, (GLenum param, const GLfloat * values)) \
+  X(void, glPointSize, (GLfloat size)) \
+  X(void, glRotatef, (GLfloat angle, GLfloat x, GLfloat y, GLfloat z)) \
+  X(void, glScalef, (GLfloat x, GLfloat y, GLfloat z)) \
+  X(void, glTexEnvf, (GLenum target, GLenum pname, GLfloat param)) \
+  X(void, glTexEnvfv, (GLenum target, GLenum pname, const GLfloat * params)) \
+  X(void, glTexParameterf, (GLenum target, GLenum pname, GLfloat param)) \
+  X(void, glTexParameterfv, (GLenum target, GLenum pname, const GLfloat * params)) \
+  X(void, glMatrixMode, (GLenum mode)) \
+  X(void, glNormalPointer, (GLenum type, GLsizei stride, const GLvoid * pointer)) \
+  X(void, glPopMatrix, ()) \
+  X(void, glPushMatrix, ()) \
+  X(void, glShadeModel, (GLenum mode)) \
+  X(void, glTexCoordPointer, (GLint size, GLenum type, GLsizei stride, const GLvoid * pointer)) \
+  X(void, glTexEnvi, (GLenum target, GLenum pname, GLint param)) \
+  X(void, glTexEnviv, (GLenum target, GLenum pname, const GLint * params)) \
+  X(void, glTranslatef, (GLfloat x, GLfloat y, GLfloat z)) \
+  X(void, glVertexPointer, (GLint size, GLenum type, GLsizei stride, const GLvoid * pointer)) \
+
+
+#endif  // GLES1_ONLY_FUNCTIONS_H
diff --git a/distrib/android-emugl/host/libs/Translator/include/GLcommon/gles2_extensions_functions.h b/distrib/android-emugl/host/libs/Translator/include/GLcommon/gles2_extensions_functions.h
new file mode 100644
index 0000000..02449d3
--- /dev/null
+++ b/distrib/android-emugl/host/libs/Translator/include/GLcommon/gles2_extensions_functions.h
@@ -0,0 +1,13 @@
+// Auto-generated with: android/scripts/gen-entries.py --mode=functions distrib/android-emugl/host/libs/Translator/GLcommon/gles2_extensions.entries --output=distrib/android-emugl/host/libs/Translator/include/GLcommon/gles2_extensions_functions.h
+// DO NOT EDIT THIS FILE
+
+#ifndef GLES2_EXTENSIONS_FUNCTIONS_H
+#define GLES2_EXTENSIONS_FUNCTIONS_H
+
+#define LIST_GLES2_EXTENSIONS_FUNCTIONS(X) \
+  X(void, glGetShaderPrecisionFormat, (GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision)) \
+  X(void, glReleaseShaderCompiler, ()) \
+  X(void, glShaderBinary, (GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length)) \
+
+
+#endif  // GLES2_EXTENSIONS_FUNCTIONS_H
diff --git a/distrib/android-emugl/host/libs/Translator/include/GLcommon/gles2_only_functions.h b/distrib/android-emugl/host/libs/Translator/include/GLcommon/gles2_only_functions.h
new file mode 100644
index 0000000..3ecfd02
--- /dev/null
+++ b/distrib/android-emugl/host/libs/Translator/include/GLcommon/gles2_only_functions.h
@@ -0,0 +1,72 @@
+// Auto-generated with: android/scripts/gen-entries.py --mode=functions distrib/android-emugl/host/libs/Translator/GLcommon/gles2_only.entries --output=distrib/android-emugl/host/libs/Translator/include/GLcommon/gles2_only_functions.h
+// DO NOT EDIT THIS FILE
+
+#ifndef GLES2_ONLY_FUNCTIONS_H
+#define GLES2_ONLY_FUNCTIONS_H
+
+#define LIST_GLES2_ONLY_FUNCTIONS(X) \
+  X(void, glBlendColor, (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)) \
+  X(void, glStencilFuncSeparate, (GLenum face, GLenum func, GLint ref, GLuint mask)) \
+  X(void, glStencilMaskSeparate, (GLenum face, GLuint mask)) \
+  X(GLboolean, glIsProgram, (GLuint program)) \
+  X(GLboolean, glIsShader, (GLuint shader)) \
+  X(void, glVertexAttrib1f, (GLuint indx, GLfloat x)) \
+  X(void, glVertexAttrib1fv, (GLuint indx, const GLfloat* values)) \
+  X(void, glVertexAttrib2f, (GLuint indx, GLfloat x, GLfloat y)) \
+  X(void, glVertexAttrib2fv, (GLuint indx, const GLfloat* values)) \
+  X(void, glVertexAttrib3f, (GLuint indx, GLfloat x, GLfloat y, GLfloat z)) \
+  X(void, glVertexAttrib3fv, (GLuint indx, const GLfloat* values)) \
+  X(void, glVertexAttrib4f, (GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w)) \
+  X(void, glVertexAttrib4fv, (GLuint indx, const GLfloat* values)) \
+  X(void, glVertexAttribPointer, (GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)) \
+  X(void, glDisableVertexAttribArray, (GLuint index)) \
+  X(void, glEnableVertexAttribArray, (GLuint index)) \
+  X(void, glGetVertexAttribfv, (GLuint index, GLenum pname, GLfloat* params)) \
+  X(void, glGetVertexAttribiv, (GLuint index, GLenum pname, GLint* params)) \
+  X(void, glGetVertexAttribPointerv, (GLuint index, GLenum pname, GLvoid** pointer)) \
+  X(void, glUniform1f, (GLint location, GLfloat x)) \
+  X(void, glUniform1fv, (GLint location, GLsizei count, const GLfloat* v)) \
+  X(void, glUniform1i, (GLint location, GLint x)) \
+  X(void, glUniform1iv, (GLint location, GLsizei count, const GLint* v)) \
+  X(void, glUniform2f, (GLint location, GLfloat x, GLfloat y)) \
+  X(void, glUniform2fv, (GLint location, GLsizei count, const GLfloat* v)) \
+  X(void, glUniform2i, (GLint location, GLint x, GLint y)) \
+  X(void, glUniform2iv, (GLint location, GLsizei count, const GLint* v)) \
+  X(void, glUniform3f, (GLint location, GLfloat x, GLfloat y, GLfloat z)) \
+  X(void, glUniform3fv, (GLint location, GLsizei count, const GLfloat* v)) \
+  X(void, glUniform3i, (GLint location, GLint x, GLint y, GLint z)) \
+  X(void, glUniform3iv, (GLint location, GLsizei count, const GLint* v)) \
+  X(void, glUniform4f, (GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)) \
+  X(void, glUniform4fv, (GLint location, GLsizei count, const GLfloat* v)) \
+  X(void, glUniform4i, (GLint location, GLint x, GLint y, GLint z, GLint w)) \
+  X(void, glUniform4iv, (GLint location, GLsizei count, const GLint* v)) \
+  X(void, glUniformMatrix2fv, (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)) \
+  X(void, glUniformMatrix3fv, (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)) \
+  X(void, glUniformMatrix4fv, (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)) \
+  X(void, glAttachShader, (GLuint program, GLuint shader)) \
+  X(void, glBindAttribLocation, (GLuint program, GLuint index, const GLchar* name)) \
+  X(void, glCompileShader, (GLuint shader)) \
+  X(GLuint, glCreateProgram, ()) \
+  X(GLuint, glCreateShader, (GLenum type)) \
+  X(void, glDeleteProgram, (GLuint program)) \
+  X(void, glDeleteShader, (GLuint shader)) \
+  X(void, glDetachShader, (GLuint program, GLuint shader)) \
+  X(void, glLinkProgram, (GLuint program)) \
+  X(void, glUseProgram, (GLuint program)) \
+  X(void, glValidateProgram, (GLuint program)) \
+  X(void, glGetActiveAttrib, (GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)) \
+  X(void, glGetActiveUniform, (GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name)) \
+  X(void, glGetAttachedShaders, (GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders)) \
+  X(int, glGetAttribLocation, (GLuint program, const GLchar* name)) \
+  X(void, glGetProgramiv, (GLuint program, GLenum pname, GLint* params)) \
+  X(void, glGetProgramInfoLog, (GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog)) \
+  X(void, glGetShaderiv, (GLuint shader, GLenum pname, GLint* params)) \
+  X(void, glGetShaderInfoLog, (GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog)) \
+  X(void, glGetShaderSource, (GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source)) \
+  X(void, glGetUniformfv, (GLuint program, GLint location, GLfloat* params)) \
+  X(void, glGetUniformiv, (GLuint program, GLint location, GLint* params)) \
+  X(int, glGetUniformLocation, (GLuint program, const GLchar* name)) \
+  X(void, glShaderSource, (GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)) \
+
+
+#endif  // GLES2_ONLY_FUNCTIONS_H
diff --git a/distrib/android-emugl/host/libs/Translator/include/GLcommon/gles_common_functions.h b/distrib/android-emugl/host/libs/Translator/include/GLcommon/gles_common_functions.h
new file mode 100644
index 0000000..d97a82a
--- /dev/null
+++ b/distrib/android-emugl/host/libs/Translator/include/GLcommon/gles_common_functions.h
@@ -0,0 +1,76 @@
+// Auto-generated with: android/scripts/gen-entries.py --mode=functions distrib/android-emugl/host/libs/Translator/GLcommon/gles_common.entries --output=distrib/android-emugl/host/libs/Translator/include/GLcommon/gles_common_functions.h
+// DO NOT EDIT THIS FILE
+
+#ifndef GLES_COMMON_FUNCTIONS_H
+#define GLES_COMMON_FUNCTIONS_H
+
+#include <GLES/gl.h>
+// Return types must be single words, see GLDispatch.cpp
+typedef const GLubyte* GLconstubyteptr;
+#define LIST_GLES_COMMON_FUNCTIONS(X) \
+  X(void, glActiveTexture, (GLenum texture)) \
+  X(void, glBindBuffer, (GLenum target, GLuint buffer)) \
+  X(void, glBindTexture, (GLenum target, GLuint texture)) \
+  X(void, glBlendFunc, (GLenum sfactor, GLenum dfactor)) \
+  X(void, glBlendEquation, (GLenum mode)) \
+  X(void, glBlendEquationSeparate, (GLenum modeRGB, GLenum modeAlpha)) \
+  X(void, glBlendFuncSeparate, (GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha)) \
+  X(void, glBufferData, (GLenum target, GLsizeiptr size, const GLvoid * data, GLenum usage)) \
+  X(void, glBufferSubData, (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid * data)) \
+  X(void, glClear, (GLbitfield mask)) \
+  X(void, glClearColor, (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)) \
+  X(void, glClearStencil, (GLint s)) \
+  X(void, glColorMask, (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)) \
+  X(void, glCompressedTexImage2D, (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid * data)) \
+  X(void, glCompressedTexSubImage2D, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid * data)) \
+  X(void, glCopyTexImage2D, (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)) \
+  X(void, glCopyTexSubImage2D, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)) \
+  X(void, glCullFace, (GLenum mode)) \
+  X(void, glDeleteBuffers, (GLsizei n, const GLuint * buffers)) \
+  X(void, glDeleteTextures, (GLsizei n, const GLuint * textures)) \
+  X(void, glDepthFunc, (GLenum func)) \
+  X(void, glDepthMask, (GLboolean flag)) \
+  X(void, glDepthRange, (GLclampd zNear, GLclampd zFar)) \
+  X(void, glDisable, (GLenum cap)) \
+  X(void, glDrawArrays, (GLenum mode, GLint first, GLsizei count)) \
+  X(void, glDrawElements, (GLenum mode, GLsizei count, GLenum type, const GLvoid * indices)) \
+  X(void, glEnable, (GLenum cap)) \
+  X(void, glFinish, ()) \
+  X(void, glFlush, ()) \
+  X(void, glFrontFace, (GLenum mode)) \
+  X(void, glGenBuffers, (GLsizei n, GLuint * buffers)) \
+  X(void, glGenTextures, (GLsizei n, GLuint * textures)) \
+  X(void, glGetBooleanv, (GLenum pname, GLboolean * params)) \
+  X(void, glGetBufferParameteriv, (GLenum buffer, GLenum parameter, GLint * value)) \
+  X(GLenum, glGetError, ()) \
+  X(void, glGetFloatv, (GLenum pname, GLfloat * params)) \
+  X(void, glGetIntegerv, (GLenum pname, GLint * params)) \
+  X(GLconstubyteptr, glGetString, (GLenum name)) \
+  X(void, glGetTexParameterfv, (GLenum target, GLenum pname, GLfloat * params)) \
+  X(void, glGetTexParameteriv, (GLenum target, GLenum pname, GLint * params)) \
+  X(void, glGetTexLevelParameteriv, (GLenum target, GLint level, GLenum pname, GLint * params)) \
+  X(void, glHint, (GLenum target, GLenum mode)) \
+  X(GLboolean, glIsBuffer, (GLuint buffer)) \
+  X(GLboolean, glIsEnabled, (GLenum cap)) \
+  X(GLboolean, glIsTexture, (GLuint texture)) \
+  X(void, glLineWidth, (GLfloat width)) \
+  X(void, glPolygonOffset, (GLfloat factor, GLfloat units)) \
+  X(void, glPixelStorei, (GLenum pname, GLint param)) \
+  X(void, glReadPixels, (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid * pixels)) \
+  X(void, glSampleCoverage, (GLclampf value, GLboolean invert)) \
+  X(void, glScissor, (GLint x, GLint y, GLsizei width, GLsizei height)) \
+  X(void, glStencilFunc, (GLenum func, GLint ref, GLuint mask)) \
+  X(void, glStencilMask, (GLuint mask)) \
+  X(void, glStencilOp, (GLenum fail, GLenum zfail, GLenum zpass)) \
+  X(void, glTexImage2D, (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid * pixels)) \
+  X(void, glTexParameteri, (GLenum target, GLenum pname, GLint param)) \
+  X(void, glTexParameteriv, (GLenum target, GLenum pname, const GLint * params)) \
+  X(void, glTexSubImage2D, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * pixels)) \
+  X(void, glViewport, (GLint x, GLint y, GLsizei width, GLsizei height)) \
+  X(void, glPushAttrib, (GLbitfield mask)) \
+  X(void, glPopAttrib, ()) \
+  X(void, glPushClientAttrib, (GLbitfield mask)) \
+  X(void, glPopClientAttrib, ()) \
+
+
+#endif  // GLES_COMMON_FUNCTIONS_H
diff --git a/distrib/android-emugl/host/libs/Translator/include/GLcommon/gles_extensions_functions.h b/distrib/android-emugl/host/libs/Translator/include/GLcommon/gles_extensions_functions.h
new file mode 100644
index 0000000..1c2e9d9
--- /dev/null
+++ b/distrib/android-emugl/host/libs/Translator/include/GLcommon/gles_extensions_functions.h
@@ -0,0 +1,27 @@
+// Auto-generated with: android/scripts/gen-entries.py --mode=functions distrib/android-emugl/host/libs/Translator/GLcommon/gles_extensions.entries --output=distrib/android-emugl/host/libs/Translator/include/GLcommon/gles_extensions_functions.h
+// DO NOT EDIT THIS FILE
+
+#ifndef GLES_EXTENSIONS_FUNCTIONS_H
+#define GLES_EXTENSIONS_FUNCTIONS_H
+
+#define LIST_GLES_EXTENSIONS_FUNCTIONS(X) \
+  X(GLboolean, glIsRenderbufferEXT, (GLuint renderbuffer)) \
+  X(void, glBindRenderbufferEXT, (GLenum target, GLuint renderbuffer)) \
+  X(void, glDeleteRenderbuffersEXT, (GLsizei n, const GLuint * renderbuffers)) \
+  X(void, glGenRenderbuffersEXT, (GLsizei n, GLuint * renderbuffers)) \
+  X(void, glRenderbufferStorageEXT, (GLenum target, GLenum internalformat, GLsizei width, GLsizei height)) \
+  X(void, glGetRenderbufferParameterivEXT, (GLenum target, GLenum pname, GLint * params)) \
+  X(GLboolean, glIsFramebufferEXT, (GLuint framebuffer)) \
+  X(void, glBindFramebufferEXT, (GLenum target, GLuint framebuffer)) \
+  X(void, glDeleteFramebuffersEXT, (GLsizei n, const GLuint * framebuffers)) \
+  X(void, glGenFramebuffersEXT, (GLsizei n, GLuint * framebuffers)) \
+  X(GLenum, glCheckFramebufferStatusEXT, (GLenum target)) \
+  X(void, glFramebufferTexture1DEXT, (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)) \
+  X(void, glFramebufferTexture2DEXT, (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)) \
+  X(void, glFramebufferTexture3DEXT, (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)) \
+  X(void, glFramebufferRenderbufferEXT, (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)) \
+  X(void, glGetFramebufferAttachmentParameterivEXT, (GLenum target, GLenum attachment, GLenum pname, GLint * params)) \
+  X(void, glGenerateMipmapEXT, (GLenum target)) \
+
+
+#endif  // GLES_EXTENSIONS_FUNCTIONS_H
diff --git a/distrib/android-emugl/host/libs/Translator/include/GLcommon/gles_functions.h b/distrib/android-emugl/host/libs/Translator/include/GLcommon/gles_functions.h
new file mode 100644
index 0000000..f7eef23
--- /dev/null
+++ b/distrib/android-emugl/host/libs/Translator/include/GLcommon/gles_functions.h
@@ -0,0 +1,18 @@
+#ifndef GLES_FUNCTIONS_H
+
+#include "gles_common_functions.h"
+#include "gles_extensions_functions.h"
+#include "gles1_only_functions.h"
+#include "gles1_extensions_functions.h"
+#include "gles2_only_functions.h"
+#include "gles2_extensions_functions.h"
+
+#define LIST_GLES_FUNCTIONS(X,Y) \
+    LIST_GLES_COMMON_FUNCTIONS(X) \
+    LIST_GLES_EXTENSIONS_FUNCTIONS(Y) \
+    LIST_GLES1_ONLY_FUNCTIONS(X) \
+    LIST_GLES1_EXTENSIONS_FUNCTIONS(Y) \
+    LIST_GLES2_ONLY_FUNCTIONS(X) \
+    LIST_GLES2_EXTENSIONS_FUNCTIONS(Y)
+
+#endif  // GLES_FUNCTIONS_H
diff --git a/distrib/android-emugl/host/libs/Translator/include/KHR/khrplatform.h b/distrib/android-emugl/host/libs/Translator/include/KHR/khrplatform.h
index c9e6f17..a58a6fd 100644
--- a/distrib/android-emugl/host/libs/Translator/include/KHR/khrplatform.h
+++ b/distrib/android-emugl/host/libs/Translator/include/KHR/khrplatform.h
@@ -98,9 +98,15 @@
  * This precedes the return type of the function in the function prototype.
  */
 #if defined(_WIN32) && !defined(__SCITECH_SNAP__)
-#   define KHRONOS_APICALL __declspec(dllimport)
+#  if defined(EMUGL_BUILD)
+#    define KHRONOS_APICALL __declspec(dllexport)
+#  else
+#    define KHRONOS_APICALL __declspec(dllimport)
+#  endif
 #elif defined (__SYMBIAN32__)
 #   define KHRONOS_APICALL IMPORT_C
+#elif defined (EMUGL_BUILD)
+#  define KHRONOS_APICALL __attribute__((visibility("default")))
 #else
 #   define KHRONOS_APICALL
 #endif
diff --git a/distrib/android-emugl/host/libs/libOpenglRender/Android.mk b/distrib/android-emugl/host/libs/libOpenglRender/Android.mk
index 60b1819..5d60437 100644
--- a/distrib/android-emugl/host/libs/libOpenglRender/Android.mk
+++ b/distrib/android-emugl/host/libs/libOpenglRender/Android.mk
@@ -58,6 +58,8 @@
 
 LOCAL_STATIC_LIBRARIES += libemugl_common
 
+LOCAL_SYMBOL_FILE := render_api.entries
+
 $(call emugl-export,CFLAGS,$(host_common_CFLAGS))
 
 $(call emugl-end-module)
diff --git a/distrib/android-emugl/host/libs/libOpenglRender/EGLDispatch.cpp b/distrib/android-emugl/host/libs/libOpenglRender/EGLDispatch.cpp
index 7d514e8..55fb1bc 100644
--- a/distrib/android-emugl/host/libs/libOpenglRender/EGLDispatch.cpp
+++ b/distrib/android-emugl/host/libs/libOpenglRender/EGLDispatch.cpp
@@ -14,15 +14,25 @@
 * limitations under the License.
 */
 #include "EGLDispatch.h"
-#include <stdio.h>
-#include <stdlib.h>
 
 #include "emugl/common/shared_library.h"
 
+#include <stdio.h>
+#include <stdlib.h>
+
 EGLDispatch s_egl;
 
 #define DEFAULT_EGL_LIB EMUGL_LIBNAME("EGL_translator")
 
+#define RENDER_EGL_LOAD_FIELD(return_type, function_name, signature) \
+    s_egl. function_name = (function_name ## _t) lib->findSymbol(#function_name);
+
+#define RENDER_EGL_LOAD_OPTIONAL_FIELD(return_type, function_name, signature) \
+    if (s_egl.eglGetProcAddress) s_egl. function_name = \
+            (function_name ## _t) s_egl.eglGetProcAddress(#function_name); \
+    if (!s_egl.function_name || !s_egl.eglGetProcAddress) \
+            RENDER_EGL_LOAD_FIELD(return_type, function_name, signature)
+
 bool init_egl_dispatch()
 {
 
@@ -34,55 +44,8 @@
         printf("Failed to open %s\n", libName);
         return NULL;
     }
-    s_egl.eglGetError = (eglGetError_t) lib->findSymbol("eglGetError");
-    s_egl.eglGetDisplay = (eglGetDisplay_t) lib->findSymbol("eglGetDisplay");
-    s_egl.eglInitialize = (eglInitialize_t) lib->findSymbol("eglInitialize");
-    s_egl.eglTerminate = (eglTerminate_t) lib->findSymbol("eglTerminate");
-    s_egl.eglQueryString = (eglQueryString_t) lib->findSymbol("eglQueryString");
-    s_egl.eglGetConfigs = (eglGetConfigs_t) lib->findSymbol("eglGetConfigs");
-    s_egl.eglChooseConfig = (eglChooseConfig_t) lib->findSymbol("eglChooseConfig");
-    s_egl.eglGetConfigAttrib = (eglGetConfigAttrib_t) lib->findSymbol("eglGetConfigAttrib");
-    s_egl.eglCreateWindowSurface = (eglCreateWindowSurface_t) lib->findSymbol("eglCreateWindowSurface");
-    s_egl.eglCreatePbufferSurface = (eglCreatePbufferSurface_t) lib->findSymbol("eglCreatePbufferSurface");
-    s_egl.eglCreatePixmapSurface = (eglCreatePixmapSurface_t) lib->findSymbol("eglCreatePixmapSurface");
-    s_egl.eglDestroySurface = (eglDestroySurface_t) lib->findSymbol("eglDestroySurface");
-    s_egl.eglQuerySurface = (eglQuerySurface_t) lib->findSymbol("eglQuerySurface");
-    s_egl.eglBindAPI = (eglBindAPI_t) lib->findSymbol("eglBindAPI");
-    s_egl.eglQueryAPI = (eglQueryAPI_t) lib->findSymbol("eglQueryAPI");
-    s_egl.eglWaitClient = (eglWaitClient_t) lib->findSymbol("eglWaitClient");
-    s_egl.eglReleaseThread = (eglReleaseThread_t) lib->findSymbol("eglReleaseThread");
-    s_egl.eglCreatePbufferFromClientBuffer = (eglCreatePbufferFromClientBuffer_t) lib->findSymbol("eglCreatePbufferFromClientBuffer");
-    s_egl.eglSurfaceAttrib = (eglSurfaceAttrib_t) lib->findSymbol("eglSurfaceAttrib");
-    s_egl.eglBindTexImage = (eglBindTexImage_t) lib->findSymbol("eglBindTexImage");
-    s_egl.eglReleaseTexImage = (eglReleaseTexImage_t) lib->findSymbol("eglReleaseTexImage");
-    s_egl.eglSwapInterval = (eglSwapInterval_t) lib->findSymbol("eglSwapInterval");
-    s_egl.eglCreateContext = (eglCreateContext_t) lib->findSymbol("eglCreateContext");
-    s_egl.eglDestroyContext = (eglDestroyContext_t) lib->findSymbol("eglDestroyContext");
-    s_egl.eglMakeCurrent = (eglMakeCurrent_t) lib->findSymbol("eglMakeCurrent");
-    s_egl.eglGetCurrentContext = (eglGetCurrentContext_t) lib->findSymbol("eglGetCurrentContext");
-    s_egl.eglGetCurrentSurface = (eglGetCurrentSurface_t) lib->findSymbol("eglGetCurrentSurface");
-    s_egl.eglGetCurrentDisplay = (eglGetCurrentDisplay_t) lib->findSymbol("eglGetCurrentDisplay");
-    s_egl.eglQueryContext = (eglQueryContext_t) lib->findSymbol("eglQueryContext");
-    s_egl.eglWaitGL = (eglWaitGL_t) lib->findSymbol("eglWaitGL");
-    s_egl.eglWaitNative = (eglWaitNative_t) lib->findSymbol("eglWaitNative");
-    s_egl.eglSwapBuffers = (eglSwapBuffers_t) lib->findSymbol("eglSwapBuffers");
-    s_egl.eglCopyBuffers = (eglCopyBuffers_t) lib->findSymbol("eglCopyBuffers");
-    s_egl.eglGetProcAddress = (eglGetProcAddress_t) lib->findSymbol("eglGetProcAddress");
-
-#define INIT_EGL_EXT_FUNC(name) \
-    if (s_egl.eglGetProcAddress) s_egl.name = (name ## _t) s_egl.eglGetProcAddress(#name); \
-    if (!s_egl.name || !s_egl.eglGetProcAddress) s_egl.name = (name ## _t) lib->findSymbol(#name)
-
-    INIT_EGL_EXT_FUNC(eglLockSurfaceKHR);
-    INIT_EGL_EXT_FUNC(eglUnlockSurfaceKHR);
-    INIT_EGL_EXT_FUNC(eglCreateImageKHR);
-    INIT_EGL_EXT_FUNC(eglDestroyImageKHR);
-    INIT_EGL_EXT_FUNC(eglCreateSyncKHR);
-    INIT_EGL_EXT_FUNC(eglDestroySyncKHR);
-    INIT_EGL_EXT_FUNC(eglClientWaitSyncKHR);
-    INIT_EGL_EXT_FUNC(eglSignalSyncKHR);
-    INIT_EGL_EXT_FUNC(eglGetSyncAttribKHR);
-    INIT_EGL_EXT_FUNC(eglSetSwapRectangleANDROID);
+    LIST_RENDER_EGL_FUNCTIONS(RENDER_EGL_LOAD_FIELD)
+    LIST_RENDER_EGL_EXTENSIONS_FUNCTIONS(RENDER_EGL_LOAD_OPTIONAL_FIELD)
 
     return true;
 }
diff --git a/distrib/android-emugl/host/libs/libOpenglRender/EGLDispatch.h b/distrib/android-emugl/host/libs/libOpenglRender/EGLDispatch.h
index f74acba..c641d5e 100644
--- a/distrib/android-emugl/host/libs/libOpenglRender/EGLDispatch.h
+++ b/distrib/android-emugl/host/libs/libOpenglRender/EGLDispatch.h
@@ -13,60 +13,44 @@
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
-#ifndef _EGL_DISPATCH_H
-#define _EGL_DISPATCH_H
+#ifndef RENDER_EGL_DISPATCH_H
+#define RENDER_EGL_DISPATCH_H
 
-#include "egl_proc.h"
+#include "RenderEGL_functions.h"
+#include "RenderEGL_extensions_functions.h"
 
+// This header is used to define the EGLDispatch structure that contains
+// pointers to the EGL shared library used by libOpenglRender. Normally,
+// this will be our own libEGL_translator, but one could imagine a
+// vendor-specific being used instead.
+
+// There is a single global instance of this structure, named |s_egl|,
+// which must be initialized by calling init_egl_dispatch() before use.
+
+// Note that our code requires the implementation of misc EGL extensions
+// including eglSetSwapRectangleANDROID(), see RenderEGL_extensions_functions.h
+// for a full list.
+
+#define RENDER_EGL_DEFINE_TYPE(return_type, function_name, signature) \
+    typedef return_type (EGLAPIENTRY *function_name ## _t) signature;
+
+#define RENDER_EGL_DECLARE_MEMBER(return_type, function_name, signature) \
+    function_name ## _t function_name;
+
+// Define function typedefs.
+LIST_RENDER_EGL_FUNCTIONS(RENDER_EGL_DEFINE_TYPE)
+LIST_RENDER_EGL_EXTENSIONS_FUNCTIONS(RENDER_EGL_DEFINE_TYPE)
+
+// Define EGLDispatch structure.
 struct EGLDispatch {
-    eglGetError_t eglGetError;
-    eglGetDisplay_t eglGetDisplay;
-    eglInitialize_t eglInitialize;
-    eglTerminate_t eglTerminate;
-    eglQueryString_t eglQueryString;
-    eglGetConfigs_t eglGetConfigs;
-    eglChooseConfig_t eglChooseConfig;
-    eglGetConfigAttrib_t eglGetConfigAttrib;
-    eglCreateWindowSurface_t eglCreateWindowSurface;
-    eglCreatePbufferSurface_t eglCreatePbufferSurface;
-    eglCreatePixmapSurface_t eglCreatePixmapSurface;
-    eglDestroySurface_t eglDestroySurface;
-    eglQuerySurface_t eglQuerySurface;
-    eglBindAPI_t eglBindAPI;
-    eglQueryAPI_t eglQueryAPI;
-    eglWaitClient_t eglWaitClient;
-    eglReleaseThread_t eglReleaseThread;
-    eglCreatePbufferFromClientBuffer_t eglCreatePbufferFromClientBuffer;
-    eglSurfaceAttrib_t eglSurfaceAttrib;
-    eglBindTexImage_t eglBindTexImage;
-    eglReleaseTexImage_t eglReleaseTexImage;
-    eglSwapInterval_t eglSwapInterval;
-    eglCreateContext_t eglCreateContext;
-    eglDestroyContext_t eglDestroyContext;
-    eglMakeCurrent_t eglMakeCurrent;
-    eglGetCurrentContext_t eglGetCurrentContext;
-    eglGetCurrentSurface_t eglGetCurrentSurface;
-    eglGetCurrentDisplay_t eglGetCurrentDisplay;
-    eglQueryContext_t eglQueryContext;
-    eglWaitGL_t eglWaitGL;
-    eglWaitNative_t eglWaitNative;
-    eglSwapBuffers_t eglSwapBuffers;
-    eglCopyBuffers_t eglCopyBuffers;
-    eglGetProcAddress_t eglGetProcAddress;
-    eglLockSurfaceKHR_t eglLockSurfaceKHR;
-    eglUnlockSurfaceKHR_t eglUnlockSurfaceKHR;
-    eglCreateImageKHR_t eglCreateImageKHR;
-    eglDestroyImageKHR_t eglDestroyImageKHR;
-    eglCreateSyncKHR_t eglCreateSyncKHR;
-    eglDestroySyncKHR_t eglDestroySyncKHR;
-    eglClientWaitSyncKHR_t eglClientWaitSyncKHR;
-    eglSignalSyncKHR_t eglSignalSyncKHR;
-    eglGetSyncAttribKHR_t eglGetSyncAttribKHR;
-    eglSetSwapRectangleANDROID_t eglSetSwapRectangleANDROID;
+    LIST_RENDER_EGL_FUNCTIONS(RENDER_EGL_DECLARE_MEMBER)
+    LIST_RENDER_EGL_EXTENSIONS_FUNCTIONS(RENDER_EGL_DECLARE_MEMBER)
 };
 
+// Initialize EGLDispatch function. Return true on success, false on failure.
 bool init_egl_dispatch();
 
+// Global EGLDispatch instance. Call init_egl_dispatch() before using it.
 extern EGLDispatch s_egl;
 
-#endif
+#endif  // RENDER_EGL_DISPATCH_H
diff --git a/distrib/android-emugl/host/libs/libOpenglRender/RenderEGL_extensions_functions.h b/distrib/android-emugl/host/libs/libOpenglRender/RenderEGL_extensions_functions.h
new file mode 100644
index 0000000..55a0eef
--- /dev/null
+++ b/distrib/android-emugl/host/libs/libOpenglRender/RenderEGL_extensions_functions.h
@@ -0,0 +1,23 @@
+// Auto-generated with: android/scripts/gen-entries.py --mode=functions distrib/android-emugl/host/libs/libOpenglRender/render_egl_extensions.entries
+// DO NOT EDIT THIS FILE
+
+#ifndef RENDER_EGL_EXTENSIONS_FUNCTIONS_H
+#define RENDER_EGL_EXTENSIONS_FUNCTIONS_H
+
+#include <EGL/egl.h>
+#define EGL_EGLEXT_PROTOTYPES
+#include <EGL/eglext.h>
+#define LIST_RENDER_EGL_EXTENSIONS_FUNCTIONS(X) \
+  X(EGLBoolean, eglLockSurfaceKHR, (EGLDisplay display, EGLSurface surface, const EGLint* attrib_list)) \
+  X(EGLBoolean, eglUnlockSurfaceKHR, (EGLDisplay display, EGLSurface surface)) \
+  X(EGLImageKHR, eglCreateImageKHR, (EGLDisplay display, EGLContext context, EGLenum target, EGLClientBuffer buffer, const EGLint* attrib_list)) \
+  X(EGLBoolean, eglDestroyImageKHR, (EGLDisplay display, EGLImageKHR image)) \
+  X(EGLSyncKHR, eglCreateSyncKHR, (EGLDisplay display, EGLenum type, const EGLint* attrib_list)) \
+  X(EGLBoolean, eglDestroySyncKHR, (EGLDisplay display, EGLSyncKHR sync)) \
+  X(EGLint, eglClientWaitSyncKHR, (EGLDisplay display, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout)) \
+  X(EGLBoolean, eglSignalSyncKHR, (EGLDisplay display, EGLSyncKHR sync, EGLenum mode)) \
+  X(EGLBoolean, eglGetSyncAttribKHR, (EGLDisplay display, EGLSyncKHR sync, EGLint attribute, EGLint* value)) \
+  X(EGLBoolean, eglSetSwapRectangleANDROID, (EGLDisplay display, EGLSurface surface, EGLint left, EGLint top, EGLint width, EGLint height)) \
+
+
+#endif  // RENDER_EGL_EXTENSIONS_FUNCTIONS_H
diff --git a/distrib/android-emugl/host/libs/libOpenglRender/RenderEGL_functions.h b/distrib/android-emugl/host/libs/libOpenglRender/RenderEGL_functions.h
new file mode 100644
index 0000000..9c7fd4b
--- /dev/null
+++ b/distrib/android-emugl/host/libs/libOpenglRender/RenderEGL_functions.h
@@ -0,0 +1,45 @@
+// Auto-generated with: android/scripts/gen-entries.py --mode=functions distrib/android-emugl/host/libs/libOpenglRender/render_egl.entries
+// DO NOT EDIT THIS FILE
+
+#ifndef RENDER_EGL_FUNCTIONS_H
+#define RENDER_EGL_FUNCTIONS_H
+
+#include <EGL/egl.h>
+#define LIST_RENDER_EGL_FUNCTIONS(X) \
+  X(EGLint, eglGetError, ()) \
+  X(EGLDisplay, eglGetDisplay, (EGLNativeDisplayType dpy)) \
+  X(EGLBoolean, eglInitialize, (EGLDisplay dpy, EGLint* major, EGLint* minor)) \
+  X(EGLBoolean, eglTerminate, (EGLDisplay dpy)) \
+  X(char*, eglQueryString, (EGLDisplay dpy, EGLint id)) \
+  X(EGLBoolean, eglGetConfigs, (EGLDisplay display, EGLConfig* configs, EGLint config_size, EGLint* num_config)) \
+  X(EGLBoolean, eglChooseConfig, (EGLDisplay display, const EGLint* attribs, EGLConfig* configs, EGLint config_size, EGLint* num_config)) \
+  X(EGLBoolean, eglGetConfigAttrib, (EGLDisplay display, EGLConfig config, EGLint attribute, EGLint* value)) \
+  X(EGLSurface, eglCreateWindowSurface, (EGLDisplay display, EGLConfig config, EGLNativeWindowType native_window, const EGLint* attrib_list)) \
+  X(EGLSurface, eglCreatePbufferSurface, (EGLDisplay display, EGLConfig config, const EGLint* attrib_list)) \
+  X(EGLSurface, eglCreatePixmapSurface, (EGLDisplay display, EGLConfig config, EGLNativePixmapType native_pixmap, const EGLint* attrib_list)) \
+  X(EGLBoolean, eglDestroySurface, (EGLDisplay display, EGLSurface surface)) \
+  X(EGLBoolean, eglQuerySurface, (EGLDisplay display, EGLSurface surface, EGLint attribute, EGLint* value)) \
+  X(EGLBoolean, eglBindAPI, (EGLenum api)) \
+  X(EGLenum, eglQueryAPI, ()) \
+  X(EGLBoolean, eglWaitClient, ()) \
+  X(EGLBoolean, eglReleaseThread, ()) \
+  X(EGLSurface, eglCreatePbufferFromClientBuffer, (EGLDisplay display, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint* attrib_list)) \
+  X(EGLBoolean, eglSurfaceAttrib, (EGLDisplay display, EGLSurface surface, EGLint attribute, EGLint value)) \
+  X(EGLBoolean, eglBindTexImage, (EGLDisplay display, EGLSurface surface, EGLint buffer)) \
+  X(EGLBoolean, eglReleaseTexImage, (EGLDisplay display, EGLSurface surface, EGLint buffer)) \
+  X(EGLBoolean, eglSwapInterval, (EGLDisplay display, EGLint interval)) \
+  X(EGLContext, eglCreateContext, (EGLDisplay display, EGLConfig config, EGLContext share_context, const EGLint* attrib_list)) \
+  X(EGLBoolean, eglDestroyContext, (EGLDisplay display, EGLContext context)) \
+  X(EGLBoolean, eglMakeCurrent, (EGLDisplay display, EGLSurface draw, EGLSurface read, EGLContext context)) \
+  X(EGLContext, eglGetCurrentContext, ()) \
+  X(EGLSurface, eglGetCurrentSurface, (EGLint readdraw)) \
+  X(EGLDisplay, eglGetCurrentDisplay, ()) \
+  X(EGLBoolean, eglQueryContext, (EGLDisplay display, EGLContext context, EGLint attribute, EGLint* value)) \
+  X(EGLBoolean, eglWaitGL, ()) \
+  X(EGLBoolean, eglWaitNative, (EGLint engine)) \
+  X(EGLBoolean, eglSwapBuffers, (EGLDisplay display, EGLSurface surface)) \
+  X(EGLBoolean, eglCopyBuffers, (EGLDisplay display, EGLSurface surface, EGLNativePixmapType native_pixmap)) \
+  X(void*, eglGetProcAddress, (const char* function_name)) \
+
+
+#endif  // RENDER_EGL_FUNCTIONS_H
diff --git a/distrib/android-emugl/host/libs/libOpenglRender/egl_proc.h b/distrib/android-emugl/host/libs/libOpenglRender/egl_proc.h
deleted file mode 100644
index 01dc4ae..0000000
--- a/distrib/android-emugl/host/libs/libOpenglRender/egl_proc.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
-* Copyright (C) 2011 The Android Open Source Project
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-#ifndef _EGL_PROC_H
-#define _EGL_PROC_H
-
-#include <EGL/egl.h>
-#define EGL_EGLEXT_PROTOTYPES
-#include <EGL/eglext.h>
-
-typedef EGLint (EGLAPIENTRY *eglGetError_t) ();
-typedef EGLDisplay (EGLAPIENTRY *eglGetDisplay_t) (EGLNativeDisplayType);
-typedef EGLBoolean (EGLAPIENTRY *eglInitialize_t) (EGLDisplay, EGLint*, EGLint*);
-typedef EGLBoolean (EGLAPIENTRY *eglTerminate_t) (EGLDisplay);
-typedef char* (EGLAPIENTRY *eglQueryString_t) (EGLDisplay, EGLint);
-typedef EGLBoolean (EGLAPIENTRY *eglGetConfigs_t) (EGLDisplay, EGLConfig*, EGLint, EGLint*);
-typedef EGLBoolean (EGLAPIENTRY *eglChooseConfig_t) (EGLDisplay, const EGLint*, EGLConfig*, EGLint, EGLint*);
-typedef EGLBoolean (EGLAPIENTRY *eglGetConfigAttrib_t) (EGLDisplay, EGLConfig, EGLint, EGLint*);
-typedef EGLSurface (EGLAPIENTRY *eglCreateWindowSurface_t) (EGLDisplay, EGLConfig, EGLNativeWindowType, const EGLint*);
-typedef EGLSurface (EGLAPIENTRY *eglCreatePbufferSurface_t) (EGLDisplay, EGLConfig, const EGLint*);
-typedef EGLSurface (EGLAPIENTRY *eglCreatePixmapSurface_t) (EGLDisplay, EGLConfig, EGLNativePixmapType, const EGLint*);
-typedef EGLBoolean (EGLAPIENTRY *eglDestroySurface_t) (EGLDisplay, EGLSurface);
-typedef EGLBoolean (EGLAPIENTRY *eglQuerySurface_t) (EGLDisplay, EGLSurface, EGLint, EGLint*);
-typedef EGLBoolean (EGLAPIENTRY *eglBindAPI_t) (EGLenum);
-typedef EGLenum (* eglQueryAPI_t) ();
-typedef EGLBoolean (EGLAPIENTRY *eglWaitClient_t) ();
-typedef EGLBoolean (EGLAPIENTRY *eglReleaseThread_t) ();
-typedef EGLSurface (EGLAPIENTRY *eglCreatePbufferFromClientBuffer_t) (EGLDisplay, EGLenum, EGLClientBuffer, EGLConfig, const EGLint*);
-typedef EGLBoolean (EGLAPIENTRY *eglSurfaceAttrib_t) (EGLDisplay, EGLSurface, EGLint, EGLint);
-typedef EGLBoolean (EGLAPIENTRY *eglBindTexImage_t) (EGLDisplay, EGLSurface, EGLint);
-typedef EGLBoolean (EGLAPIENTRY *eglReleaseTexImage_t) (EGLDisplay, EGLSurface, EGLint);
-typedef EGLBoolean (EGLAPIENTRY *eglSwapInterval_t) (EGLDisplay, EGLint);
-typedef EGLContext (EGLAPIENTRY *eglCreateContext_t) (EGLDisplay, EGLConfig, EGLContext, const EGLint*);
-typedef EGLBoolean (EGLAPIENTRY *eglDestroyContext_t) (EGLDisplay, EGLContext);
-typedef EGLBoolean (EGLAPIENTRY *eglMakeCurrent_t) (EGLDisplay, EGLSurface, EGLSurface, EGLContext);
-typedef EGLContext (EGLAPIENTRY *eglGetCurrentContext_t) ();
-typedef EGLSurface (EGLAPIENTRY *eglGetCurrentSurface_t) (EGLint);
-typedef EGLDisplay (EGLAPIENTRY *eglGetCurrentDisplay_t) ();
-typedef EGLBoolean (EGLAPIENTRY *eglQueryContext_t) (EGLDisplay, EGLContext, EGLint, EGLint*);
-typedef EGLBoolean (EGLAPIENTRY *eglWaitGL_t) ();
-typedef EGLBoolean (EGLAPIENTRY *eglWaitNative_t) (EGLint);
-typedef EGLBoolean (EGLAPIENTRY *eglSwapBuffers_t) (EGLDisplay, EGLSurface);
-typedef EGLBoolean (EGLAPIENTRY *eglCopyBuffers_t) (EGLDisplay, EGLSurface, EGLNativePixmapType);
-typedef __eglMustCastToProperFunctionPointerType (EGLAPIENTRY *eglGetProcAddress_t) (const char*);
-typedef EGLBoolean (EGLAPIENTRY *eglLockSurfaceKHR_t) (EGLDisplay, EGLSurface, const EGLint*);
-typedef EGLBoolean (EGLAPIENTRY *eglUnlockSurfaceKHR_t) (EGLDisplay, EGLSurface);
-typedef EGLImageKHR (EGLAPIENTRY *eglCreateImageKHR_t) (EGLDisplay, EGLContext, EGLenum, EGLClientBuffer, const EGLint*);
-typedef EGLBoolean (EGLAPIENTRY *eglDestroyImageKHR_t) (EGLDisplay, EGLImageKHR image);
-typedef EGLSyncKHR (EGLAPIENTRY *eglCreateSyncKHR_t) (EGLDisplay, EGLenum, const EGLint*);
-typedef EGLBoolean (EGLAPIENTRY *eglDestroySyncKHR_t) (EGLDisplay, EGLSyncKHR sync);
-typedef EGLint (EGLAPIENTRY *eglClientWaitSyncKHR_t) (EGLDisplay, EGLSyncKHR, EGLint, EGLTimeKHR timeout);
-typedef EGLBoolean (EGLAPIENTRY *eglSignalSyncKHR_t) (EGLDisplay, EGLSyncKHR, EGLenum);
-typedef EGLBoolean (EGLAPIENTRY *eglGetSyncAttribKHR_t) (EGLDisplay, EGLSyncKHR, EGLint, EGLint*);
-typedef EGLBoolean (EGLAPIENTRY *eglSetSwapRectangleANDROID_t) (EGLDisplay, EGLSurface, EGLint, EGLint, EGLint, EGLint);
-
-#endif // of  _EGL_PROC_H
diff --git a/distrib/android-emugl/host/libs/libOpenglRender/gl_proc.h b/distrib/android-emugl/host/libs/libOpenglRender/gl_proc.h
deleted file mode 100644
index 465a10d..0000000
--- a/distrib/android-emugl/host/libs/libOpenglRender/gl_proc.h
+++ /dev/null
@@ -1,296 +0,0 @@
-/*
-* Copyright (C) 2011 The Android Open Source Project
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-#ifndef _GLES_PROC_H
-#define _GLES_PROC_H
-
-#include <GLES/gl.h>
-#define GL_GLEXT_PROTOTYPES
-#include <GLES/glext.h>
-
-typedef void (GL_APIENTRY *glAlphaFunc_t) (GLenum, GLclampf);
-typedef void (GL_APIENTRY *glClearColor_t) (GLclampf, GLclampf, GLclampf, GLclampf);
-typedef void (GL_APIENTRY *glClearDepthf_t) (GLclampf);
-typedef void (GL_APIENTRY *glClipPlanef_t) (GLenum, const GLfloat*);
-typedef void (GL_APIENTRY *glColor4f_t) (GLfloat, GLfloat, GLfloat, GLfloat);
-typedef void (GL_APIENTRY *glDepthRangef_t) (GLclampf, GLclampf);
-typedef void (GL_APIENTRY *glFogf_t) (GLenum, GLfloat);
-typedef void (GL_APIENTRY *glFogfv_t) (GLenum, const GLfloat*);
-typedef void (GL_APIENTRY *glFrustumf_t) (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat);
-typedef void (GL_APIENTRY *glGetClipPlanef_t) (GLenum, GLfloat);
-typedef void (GL_APIENTRY *glGetFloatv_t) (GLenum, GLfloat*);
-typedef void (GL_APIENTRY *glGetLightfv_t) (GLenum, GLenum, GLfloat*);
-typedef void (GL_APIENTRY *glGetMaterialfv_t) (GLenum, GLenum, GLfloat*);
-typedef void (GL_APIENTRY *glGetTexEnvfv_t) (GLenum, GLenum, GLfloat*);
-typedef void (GL_APIENTRY *glGetTexParameterfv_t) (GLenum, GLenum, GLfloat*);
-typedef void (GL_APIENTRY *glLightModelf_t) (GLenum, GLfloat);
-typedef void (GL_APIENTRY *glLightModelfv_t) (GLenum, const GLfloat*);
-typedef void (GL_APIENTRY *glLightf_t) (GLenum, GLenum, GLfloat);
-typedef void (GL_APIENTRY *glLightfv_t) (GLenum, GLenum, const GLfloat*);
-typedef void (GL_APIENTRY *glLineWidth_t) (GLfloat);
-typedef void (GL_APIENTRY *glLoadMatrixf_t) (const GLfloat*);
-typedef void (GL_APIENTRY *glMaterialf_t) (GLenum, GLenum, GLfloat);
-typedef void (GL_APIENTRY *glMaterialfv_t) (GLenum, GLenum, const GLfloat*);
-typedef void (GL_APIENTRY *glMultMatrixf_t) (const GLfloat*);
-typedef void (GL_APIENTRY *glMultiTexCoord4f_t) (GLenum, GLfloat, GLfloat, GLfloat, GLfloat);
-typedef void (GL_APIENTRY *glNormal3f_t) (GLfloat, GLfloat, GLfloat);
-typedef void (GL_APIENTRY *glOrthof_t) (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat);
-typedef void (GL_APIENTRY *glPointParameterf_t) (GLenum, GLfloat);
-typedef void (GL_APIENTRY *glPointParameterfv_t) (GLenum, const GLfloat*);
-typedef void (GL_APIENTRY *glPointSize_t) (GLfloat);
-typedef void (GL_APIENTRY *glPolygonOffset_t) (GLfloat, GLfloat);
-typedef void (GL_APIENTRY *glRotatef_t) (GLfloat, GLfloat, GLfloat, GLfloat);
-typedef void (GL_APIENTRY *glScalef_t) (GLfloat, GLfloat, GLfloat);
-typedef void (GL_APIENTRY *glTexEnvf_t) (GLenum, GLenum, GLfloat);
-typedef void (GL_APIENTRY *glTexEnvfv_t) (GLenum, GLenum, const GLfloat*);
-typedef void (GL_APIENTRY *glTexParameterf_t) (GLenum, GLenum, GLfloat);
-typedef void (GL_APIENTRY *glTexParameterfv_t) (GLenum, GLenum, const GLfloat*);
-typedef void (GL_APIENTRY *glTranslatef_t) (GLfloat, GLfloat, GLfloat);
-typedef void (GL_APIENTRY *glActiveTexture_t) (GLenum);
-typedef void (GL_APIENTRY *glAlphaFuncx_t) (GLenum, GLclampx);
-typedef void (GL_APIENTRY *glBindBuffer_t) (GLenum, GLuint);
-typedef void (GL_APIENTRY *glBindTexture_t) (GLenum, GLuint);
-typedef void (GL_APIENTRY *glBlendFunc_t) (GLenum, GLenum);
-typedef void (GL_APIENTRY *glBufferData_t) (GLenum, GLsizeiptr, const GLvoid*, GLenum);
-typedef void (GL_APIENTRY *glBufferSubData_t) (GLenum, GLintptr, GLsizeiptr, const GLvoid*);
-typedef void (GL_APIENTRY *glClear_t) (GLbitfield);
-typedef void (GL_APIENTRY *glClearColorx_t) (GLclampx, GLclampx, GLclampx, GLclampx);
-typedef void (GL_APIENTRY *glClearDepthx_t) (GLclampx);
-typedef void (GL_APIENTRY *glClearStencil_t) (GLint);
-typedef void (GL_APIENTRY *glClientActiveTexture_t) (GLenum);
-typedef void (GL_APIENTRY *glClipPlanex_t) (GLenum, const GLfixed*);
-typedef void (GL_APIENTRY *glColor4ub_t) (GLubyte, GLubyte, GLubyte, GLubyte);
-typedef void (GL_APIENTRY *glColor4x_t) (GLfixed, GLfixed, GLfixed, GLfixed);
-typedef void (GL_APIENTRY *glColorMask_t) (GLboolean, GLboolean, GLboolean, GLboolean);
-typedef void (GL_APIENTRY *glColorPointer_t) (GLint, GLenum, GLsizei, const GLvoid*);
-typedef void (GL_APIENTRY *glCompressedTexImage2D_t) (GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid*);
-typedef void (GL_APIENTRY *glCompressedTexSubImage2D_t) (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid*);
-typedef void (GL_APIENTRY *glCopyTexImage2D_t) (GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint);
-typedef void (GL_APIENTRY *glCopyTexSubImage2D_t) (GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei);
-typedef void (GL_APIENTRY *glCullFace_t) (GLenum);
-typedef void (GL_APIENTRY *glDeleteBuffers_t) (GLsizei, const GLuint*);
-typedef void (GL_APIENTRY *glDeleteTextures_t) (GLsizei, const GLuint*);
-typedef void (GL_APIENTRY *glDepthFunc_t) (GLenum);
-typedef void (GL_APIENTRY *glDepthMask_t) (GLboolean);
-typedef void (GL_APIENTRY *glDepthRangex_t) (GLclampx, GLclampx);
-typedef void (GL_APIENTRY *glDisable_t) (GLenum);
-typedef void (GL_APIENTRY *glDisableClientState_t) (GLenum);
-typedef void (GL_APIENTRY *glDrawArrays_t) (GLenum, GLint, GLsizei);
-typedef void (GL_APIENTRY *glDrawElements_t) (GLenum, GLsizei, GLenum, const GLvoid*);
-typedef void (GL_APIENTRY *glEnable_t) (GLenum);
-typedef void (GL_APIENTRY *glEnableClientState_t) (GLenum);
-typedef void (GL_APIENTRY *glFinish_t) ();
-typedef void (GL_APIENTRY *glFlush_t) ();
-typedef void (GL_APIENTRY *glFogx_t) (GLenum, GLfixed);
-typedef void (GL_APIENTRY *glFogxv_t) (GLenum, const GLfixed*);
-typedef void (GL_APIENTRY *glFrontFace_t) (GLenum);
-typedef void (GL_APIENTRY *glFrustumx_t) (GLfixed, GLfixed, GLfixed, GLfixed, GLfixed, GLfixed);
-typedef void (GL_APIENTRY *glGetBooleanv_t) (GLenum, GLboolean*);
-typedef void (GL_APIENTRY *glGetBufferParameteriv_t) (GLenum, GLenum, GLint*);
-typedef void (GL_APIENTRY *glGetClipPlanex_t) (GLenum, GLfixed);
-typedef void (GL_APIENTRY *glGenBuffers_t) (GLsizei, GLuint*);
-typedef void (GL_APIENTRY *glGenTextures_t) (GLsizei, GLuint*);
-typedef GLenum (GL_APIENTRY *glGetError_t) ();
-typedef void (GL_APIENTRY *glGetFixedv_t) (GLenum, GLfixed*);
-typedef void (GL_APIENTRY *glGetIntegerv_t) (GLenum, GLint*);
-typedef void (GL_APIENTRY *glGetLightxv_t) (GLenum, GLenum, GLfixed*);
-typedef void (GL_APIENTRY *glGetMaterialxv_t) (GLenum, GLenum, GLfixed*);
-typedef void (GL_APIENTRY *glGetPointerv_t) (GLenum, GLvoid*);
-typedef const GLubyte* (GL_APIENTRY *glGetString_t) (GLenum);
-typedef void (GL_APIENTRY *glGetTexEnviv_t) (GLenum, GLenum, GLint*);
-typedef void (GL_APIENTRY *glGetTexEnvxv_t) (GLenum, GLenum, GLfixed*);
-typedef void (GL_APIENTRY *glGetTexParameteriv_t) (GLenum, GLenum, GLint*);
-typedef void (GL_APIENTRY *glGetTexParameterxv_t) (GLenum, GLenum, GLfixed*);
-typedef void (GL_APIENTRY *glHint_t) (GLenum, GLenum);
-typedef GLboolean (GL_APIENTRY *glIsBuffer_t) (GLuint);
-typedef GLboolean (GL_APIENTRY *glIsEnabled_t) (GLenum);
-typedef GLboolean (GL_APIENTRY *glIsTexture_t) (GLuint);
-typedef void (GL_APIENTRY *glLightModelx_t) (GLenum, GLfixed);
-typedef void (GL_APIENTRY *glLightModelxv_t) (GLenum, const GLfixed*);
-typedef void (GL_APIENTRY *glLightx_t) (GLenum, GLenum, GLfixed);
-typedef void (GL_APIENTRY *glLightxv_t) (GLenum, GLenum, const GLfixed*);
-typedef void (GL_APIENTRY *glLineWidthx_t) (GLfixed);
-typedef void (GL_APIENTRY *glLoadIdentity_t) ();
-typedef void (GL_APIENTRY *glLoadMatrixx_t) (const GLfixed*);
-typedef void (GL_APIENTRY *glLogicOp_t) (GLenum);
-typedef void (GL_APIENTRY *glMaterialx_t) (GLenum, GLenum, GLfixed);
-typedef void (GL_APIENTRY *glMaterialxv_t) (GLenum, GLenum, const GLfixed*);
-typedef void (GL_APIENTRY *glMatrixMode_t) (GLenum);
-typedef void (GL_APIENTRY *glMultMatrixx_t) (const GLfixed*);
-typedef void (GL_APIENTRY *glMultiTexCoord4x_t) (GLenum, GLfixed, GLfixed, GLfixed, GLfixed);
-typedef void (GL_APIENTRY *glNormal3x_t) (GLfixed, GLfixed, GLfixed);
-typedef void (GL_APIENTRY *glNormalPointer_t) (GLenum, GLsizei, const GLvoid*);
-typedef void (GL_APIENTRY *glOrthox_t) (GLfixed, GLfixed, GLfixed, GLfixed, GLfixed, GLfixed);
-typedef void (GL_APIENTRY *glPixelStorei_t) (GLenum, GLint);
-typedef void (GL_APIENTRY *glPointParameterx_t) (GLenum, GLfixed);
-typedef void (GL_APIENTRY *glPointParameterxv_t) (GLenum, const GLfixed*);
-typedef void (GL_APIENTRY *glPointSizex_t) (GLfixed);
-typedef void (GL_APIENTRY *glPolygonOffsetx_t) (GLfixed, GLfixed);
-typedef void (GL_APIENTRY *glPopMatrix_t) ();
-typedef void (GL_APIENTRY *glPushMatrix_t) ();
-typedef void (GL_APIENTRY *glReadPixels_t) (GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, GLvoid*);
-typedef void (GL_APIENTRY *glRotatex_t) (GLfixed, GLfixed, GLfixed, GLfixed);
-typedef void (GL_APIENTRY *glSampleCoverage_t) (GLclampf, GLboolean);
-typedef void (GL_APIENTRY *glSampleCoveragex_t) (GLclampx, GLboolean);
-typedef void (GL_APIENTRY *glScalex_t) (GLfixed, GLfixed, GLfixed);
-typedef void (GL_APIENTRY *glScissor_t) (GLint, GLint, GLsizei, GLsizei);
-typedef void (GL_APIENTRY *glShadeModel_t) (GLenum);
-typedef void (GL_APIENTRY *glStencilFunc_t) (GLenum, GLint, GLuint);
-typedef void (GL_APIENTRY *glStencilMask_t) (GLuint);
-typedef void (GL_APIENTRY *glStencilOp_t) (GLenum, GLenum, GLenum);
-typedef void (GL_APIENTRY *glTexCoordPointer_t) (GLint, GLenum, GLsizei, const GLvoid*);
-typedef void (GL_APIENTRY *glTexEnvi_t) (GLenum, GLenum, GLint);
-typedef void (GL_APIENTRY *glTexEnvx_t) (GLenum, GLenum, GLfixed);
-typedef void (GL_APIENTRY *glTexEnviv_t) (GLenum, GLenum, const GLint*);
-typedef void (GL_APIENTRY *glTexEnvxv_t) (GLenum, GLenum, const GLfixed*);
-typedef void (GL_APIENTRY *glTexImage2D_t) (GLenum, GLint, GLint, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid*);
-typedef void (GL_APIENTRY *glTexParameteri_t) (GLenum, GLenum, GLint);
-typedef void (GL_APIENTRY *glTexParameterx_t) (GLenum, GLenum, GLfixed);
-typedef void (GL_APIENTRY *glTexParameteriv_t) (GLenum, GLenum, const GLint*);
-typedef void (GL_APIENTRY *glTexParameterxv_t) (GLenum, GLenum, const GLfixed*);
-typedef void (GL_APIENTRY *glTexSubImage2D_t) (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const GLvoid*);
-typedef void (GL_APIENTRY *glTranslatex_t) (GLfixed, GLfixed, GLfixed);
-typedef void (GL_APIENTRY *glVertexPointer_t) (GLint, GLenum, GLsizei, const GLvoid*);
-typedef void (GL_APIENTRY *glViewport_t) (GLint, GLint, GLsizei, GLsizei);
-typedef void (GL_APIENTRY *glPointSizePointerOES_t) (GLenum, GLsizei, const GLvoid*);
-typedef void (GL_APIENTRY *glBlendEquationSeparateOES_t) (GLenum, GLenum);
-typedef void (GL_APIENTRY *glBlendFuncSeparateOES_t) (GLenum, GLenum, GLenum, GLenum);
-typedef void (GL_APIENTRY *glBlendEquationOES_t) (GLenum);
-typedef void (GL_APIENTRY *glDrawTexsOES_t) (GLshort, GLshort, GLshort, GLshort, GLshort);
-typedef void (GL_APIENTRY *glDrawTexiOES_t) (GLint, GLint, GLint, GLint, GLint);
-typedef void (GL_APIENTRY *glDrawTexxOES_t) (GLfixed, GLfixed, GLfixed, GLfixed, GLfixed);
-typedef void (GL_APIENTRY *glDrawTexsvOES_t) (const GLshort*);
-typedef void (GL_APIENTRY *glDrawTexivOES_t) (const GLint*);
-typedef void (GL_APIENTRY *glDrawTexxvOES_t) (const GLfixed*);
-typedef void (GL_APIENTRY *glDrawTexfOES_t) (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat);
-typedef void (GL_APIENTRY *glDrawTexfvOES_t) (const GLfloat*);
-typedef void (GL_APIENTRY *glEGLImageTargetTexture2DOES_t) (GLenum, GLeglImageOES);
-typedef void (GL_APIENTRY *glEGLImageTargetRenderbufferStorageOES_t) (GLenum, GLeglImageOES);
-typedef void (GL_APIENTRY *glAlphaFuncxOES_t) (GLenum, GLclampx);
-typedef void (GL_APIENTRY *glClearColorxOES_t) (GLclampx, GLclampx, GLclampx, GLclampx);
-typedef void (GL_APIENTRY *glClearDepthxOES_t) (GLclampx);
-typedef void (GL_APIENTRY *glClipPlanexOES_t) (GLenum, const GLfixed*);
-typedef void (GL_APIENTRY *glColor4xOES_t) (GLfixed, GLfixed, GLfixed, GLfixed);
-typedef void (GL_APIENTRY *glDepthRangexOES_t) (GLclampx, GLclampx);
-typedef void (GL_APIENTRY *glFogxOES_t) (GLenum, GLfixed);
-typedef void (GL_APIENTRY *glFogxvOES_t) (GLenum, const GLfixed*);
-typedef void (GL_APIENTRY *glFrustumxOES_t) (GLfixed, GLfixed, GLfixed, GLfixed, GLfixed, GLfixed);
-typedef void (GL_APIENTRY *glGetClipPlanexOES_t) (GLenum, GLfixed);
-typedef void (GL_APIENTRY *glGetFixedvOES_t) (GLenum, GLfixed*);
-typedef void (GL_APIENTRY *glGetLightxvOES_t) (GLenum, GLenum, GLfixed*);
-typedef void (GL_APIENTRY *glGetMaterialxvOES_t) (GLenum, GLenum, GLfixed*);
-typedef void (GL_APIENTRY *glGetTexEnvxvOES_t) (GLenum, GLenum, GLfixed*);
-typedef void (GL_APIENTRY *glGetTexParameterxvOES_t) (GLenum, GLenum, GLfixed*);
-typedef void (GL_APIENTRY *glLightModelxOES_t) (GLenum, GLfixed);
-typedef void (GL_APIENTRY *glLightModelxvOES_t) (GLenum, const GLfixed*);
-typedef void (GL_APIENTRY *glLightxOES_t) (GLenum, GLenum, GLfixed);
-typedef void (GL_APIENTRY *glLightxvOES_t) (GLenum, GLenum, const GLfixed*);
-typedef void (GL_APIENTRY *glLineWidthxOES_t) (GLfixed);
-typedef void (GL_APIENTRY *glLoadMatrixxOES_t) (const GLfixed*);
-typedef void (GL_APIENTRY *glMaterialxOES_t) (GLenum, GLenum, GLfixed);
-typedef void (GL_APIENTRY *glMaterialxvOES_t) (GLenum, GLenum, const GLfixed*);
-typedef void (GL_APIENTRY *glMultMatrixxOES_t) (const GLfixed*);
-typedef void (GL_APIENTRY *glMultiTexCoord4xOES_t) (GLenum, GLfixed, GLfixed, GLfixed, GLfixed);
-typedef void (GL_APIENTRY *glNormal3xOES_t) (GLfixed, GLfixed, GLfixed);
-typedef void (GL_APIENTRY *glOrthoxOES_t) (GLfixed, GLfixed, GLfixed, GLfixed, GLfixed, GLfixed);
-typedef void (GL_APIENTRY *glPointParameterxOES_t) (GLenum, GLfixed);
-typedef void (GL_APIENTRY *glPointParameterxvOES_t) (GLenum, const GLfixed*);
-typedef void (GL_APIENTRY *glPointSizexOES_t) (GLfixed);
-typedef void (GL_APIENTRY *glPolygonOffsetxOES_t) (GLfixed, GLfixed);
-typedef void (GL_APIENTRY *glRotatexOES_t) (GLfixed, GLfixed, GLfixed, GLfixed);
-typedef void (GL_APIENTRY *glSampleCoveragexOES_t) (GLclampx, GLboolean);
-typedef void (GL_APIENTRY *glScalexOES_t) (GLfixed, GLfixed, GLfixed);
-typedef void (GL_APIENTRY *glTexEnvxOES_t) (GLenum, GLenum, GLfixed);
-typedef void (GL_APIENTRY *glTexEnvxvOES_t) (GLenum, GLenum, const GLfixed*);
-typedef void (GL_APIENTRY *glTexParameterxOES_t) (GLenum, GLenum, GLfixed);
-typedef void (GL_APIENTRY *glTexParameterxvOES_t) (GLenum, GLenum, const GLfixed*);
-typedef void (GL_APIENTRY *glTranslatexOES_t) (GLfixed, GLfixed, GLfixed);
-typedef GLboolean (GL_APIENTRY *glIsRenderbufferOES_t) (GLuint);
-typedef void (GL_APIENTRY *glBindRenderbufferOES_t) (GLenum, GLuint);
-typedef void (GL_APIENTRY *glDeleteRenderbuffersOES_t) (GLsizei, const GLuint*);
-typedef void (GL_APIENTRY *glGenRenderbuffersOES_t) (GLsizei, GLuint*);
-typedef void (GL_APIENTRY *glRenderbufferStorageOES_t) (GLenum, GLenum, GLsizei, GLsizei);
-typedef void (GL_APIENTRY *glGetRenderbufferParameterivOES_t) (GLenum, GLenum, GLint*);
-typedef GLboolean (GL_APIENTRY *glIsFramebufferOES_t) (GLuint);
-typedef void (GL_APIENTRY *glBindFramebufferOES_t) (GLenum, GLuint);
-typedef void (GL_APIENTRY *glDeleteFramebuffersOES_t) (GLsizei, const GLuint*);
-typedef void (GL_APIENTRY *glGenFramebuffersOES_t) (GLsizei, GLuint*);
-typedef GLenum (GL_APIENTRY *glCheckFramebufferStatusOES_t) (GLenum);
-typedef void (GL_APIENTRY *glFramebufferRenderbufferOES_t) (GLenum, GLenum, GLenum, GLuint);
-typedef void (GL_APIENTRY *glFramebufferTexture2DOES_t) (GLenum, GLenum, GLenum, GLuint, GLint);
-typedef void (GL_APIENTRY *glGetFramebufferAttachmentParameterivOES_t) (GLenum, GLenum, GLenum, GLint*);
-typedef void (GL_APIENTRY *glGenerateMipmapOES_t) (GLenum);
-typedef void* (GL_APIENTRY *glMapBufferOES_t) (GLenum, GLenum);
-typedef GLboolean (GL_APIENTRY *glUnmapBufferOES_t) (GLenum);
-typedef void (GL_APIENTRY *glGetBufferPointervOES_t) (GLenum, GLenum, GLvoid*);
-typedef void (GL_APIENTRY *glCurrentPaletteMatrixOES_t) (GLuint);
-typedef void (GL_APIENTRY *glLoadPaletteFromModelViewMatrixOES_t) ();
-typedef void (GL_APIENTRY *glMatrixIndexPointerOES_t) (GLint, GLenum, GLsizei, const GLvoid*);
-typedef void (GL_APIENTRY *glWeightPointerOES_t) (GLint, GLenum, GLsizei, const GLvoid*);
-typedef GLbitfield (GL_APIENTRY *glQueryMatrixxOES_t) (GLfixed, GLint);
-typedef void (GL_APIENTRY *glDepthRangefOES_t) (GLclampf, GLclampf);
-typedef void (GL_APIENTRY *glFrustumfOES_t) (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat);
-typedef void (GL_APIENTRY *glOrthofOES_t) (GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat);
-typedef void (GL_APIENTRY *glClipPlanefOES_t) (GLenum, const GLfloat*);
-typedef void (GL_APIENTRY *glGetClipPlanefOES_t) (GLenum, GLfloat);
-typedef void (GL_APIENTRY *glClearDepthfOES_t) (GLclampf);
-typedef void (GL_APIENTRY *glTexGenfOES_t) (GLenum, GLenum, GLfloat);
-typedef void (GL_APIENTRY *glTexGenfvOES_t) (GLenum, GLenum, const GLfloat*);
-typedef void (GL_APIENTRY *glTexGeniOES_t) (GLenum, GLenum, GLint);
-typedef void (GL_APIENTRY *glTexGenivOES_t) (GLenum, GLenum, const GLint*);
-typedef void (GL_APIENTRY *glTexGenxOES_t) (GLenum, GLenum, GLfixed);
-typedef void (GL_APIENTRY *glTexGenxvOES_t) (GLenum, GLenum, const GLfixed*);
-typedef void (GL_APIENTRY *glGetTexGenfvOES_t) (GLenum, GLenum, GLfloat*);
-typedef void (GL_APIENTRY *glGetTexGenivOES_t) (GLenum, GLenum, GLint*);
-typedef void (GL_APIENTRY *glGetTexGenxvOES_t) (GLenum, GLenum, GLfixed*);
-typedef void (GL_APIENTRY *glBindVertexArrayOES_t) (GLuint);
-typedef void (GL_APIENTRY *glDeleteVertexArraysOES_t) (GLsizei, const GLuint*);
-typedef void (GL_APIENTRY *glGenVertexArraysOES_t) (GLsizei, GLuint*);
-typedef GLboolean (GL_APIENTRY *glIsVertexArrayOES_t) (GLuint);
-typedef void (GL_APIENTRY *glDiscardFramebufferEXT_t) (GLenum, GLsizei, const GLenum*);
-typedef void (GL_APIENTRY *glMultiDrawArraysEXT_t) (GLenum, GLint*, GLsizei*, GLsizei);
-typedef void (GL_APIENTRY *glMultiDrawElementsEXT_t) (GLenum, const GLsizei*, GLenum, const GLvoid**, GLsizei);
-typedef void (GL_APIENTRY *glClipPlanefIMG_t) (GLenum, const GLfloat*);
-typedef void (GL_APIENTRY *glClipPlanexIMG_t) (GLenum, const GLfixed*);
-typedef void (GL_APIENTRY *glRenderbufferStorageMultisampleIMG_t) (GLenum, GLsizei, GLenum, GLsizei, GLsizei);
-typedef void (GL_APIENTRY *glFramebufferTexture2DMultisampleIMG_t) (GLenum, GLenum, GLenum, GLuint, GLint, GLsizei);
-typedef void (GL_APIENTRY *glDeleteFencesNV_t) (GLsizei, const GLuint*);
-typedef void (GL_APIENTRY *glGenFencesNV_t) (GLsizei, GLuint*);
-typedef GLboolean (GL_APIENTRY *glIsFenceNV_t) (GLuint);
-typedef GLboolean (GL_APIENTRY *glTestFenceNV_t) (GLuint);
-typedef void (GL_APIENTRY *glGetFenceivNV_t) (GLuint, GLenum, GLint*);
-typedef void (GL_APIENTRY *glFinishFenceNV_t) (GLuint);
-typedef void (GL_APIENTRY *glSetFenceNV_t) (GLuint, GLenum);
-typedef void (GL_APIENTRY *glGetDriverControlsQCOM_t) (GLint*, GLsizei, GLuint*);
-typedef void (GL_APIENTRY *glGetDriverControlStringQCOM_t) (GLuint, GLsizei, GLsizei*, GLchar*);
-typedef void (GL_APIENTRY *glEnableDriverControlQCOM_t) (GLuint);
-typedef void (GL_APIENTRY *glDisableDriverControlQCOM_t) (GLuint);
-typedef void (GL_APIENTRY *glExtGetTexturesQCOM_t) (GLuint*, GLint, GLint*);
-typedef void (GL_APIENTRY *glExtGetBuffersQCOM_t) (GLuint*, GLint, GLint*);
-typedef void (GL_APIENTRY *glExtGetRenderbuffersQCOM_t) (GLuint*, GLint, GLint*);
-typedef void (GL_APIENTRY *glExtGetFramebuffersQCOM_t) (GLuint*, GLint, GLint*);
-typedef void (GL_APIENTRY *glExtGetTexLevelParameterivQCOM_t) (GLuint, GLenum, GLint, GLenum, GLint*);
-typedef void (GL_APIENTRY *glExtTexObjectStateOverrideiQCOM_t) (GLenum, GLenum, GLint);
-typedef void (GL_APIENTRY *glExtGetTexSubImageQCOM_t) (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, GLvoid*);
-typedef void (GL_APIENTRY *glExtGetBufferPointervQCOM_t) (GLenum, GLvoid*);
-typedef void (GL_APIENTRY *glExtGetShadersQCOM_t) (GLuint*, GLint, GLint*);
-typedef void (GL_APIENTRY *glExtGetProgramsQCOM_t) (GLuint*, GLint, GLint*);
-typedef GLboolean (GL_APIENTRY *glExtIsProgramBinaryQCOM_t) (GLuint);
-typedef void (GL_APIENTRY *glExtGetProgramBinarySourceQCOM_t) (GLuint, GLenum, GLchar*, GLint*);
-typedef void (GL_APIENTRY *glStartTilingQCOM_t) (GLuint, GLuint, GLuint, GLuint, GLbitfield);
-typedef void (GL_APIENTRY *glEndTilingQCOM_t) (GLbitfield);
-
-
-#endif
diff --git a/distrib/android-emugl/host/libs/libOpenglRender/render_api.cpp b/distrib/android-emugl/host/libs/libOpenglRender/render_api.cpp
index 4774a35..7a9b266 100644
--- a/distrib/android-emugl/host/libs/libOpenglRender/render_api.cpp
+++ b/distrib/android-emugl/host/libs/libOpenglRender/render_api.cpp
@@ -41,7 +41,7 @@
 static IOStream *createRenderThread(int p_stream_buffer_size,
                                     unsigned int clientFlags);
 
-int initLibrary(void)
+RENDER_APICALL int RENDER_APIENTRY initLibrary(void)
 {
     //
     // Load EGL Plugin
@@ -70,8 +70,8 @@
     return true;
 }
 
-int initOpenGLRenderer(int width, int height, char* addr, size_t addrLen)
-{
+RENDER_APICALL int RENDER_APIENTRY initOpenGLRenderer(
+        int width, int height, char* addr, size_t addrLen) {
     //
     // Fail if renderer is already initialized
     //
@@ -126,8 +126,8 @@
     return true;
 }
 
-void setPostCallback(OnPostFn onPost, void* onPostContext)
-{
+RENDER_APICALL void RENDER_APIENTRY setPostCallback(
+        OnPostFn onPost, void* onPostContext) {
     if (s_renderWindow) {
         s_renderWindow->setPostCallback(onPost, onPostContext);
     } else {
@@ -135,9 +135,10 @@
     }
 }
 
-void getHardwareStrings(const char** vendor,
-                        const char** renderer,
-                        const char** version) {
+RENDER_APICALL void RENDER_APIENTRY getHardwareStrings(
+        const char** vendor,
+        const char** renderer,
+        const char** version) {
     if (s_renderWindow &&
         s_renderWindow->getHardwareStrings(vendor, renderer, version)) {
         return;
@@ -145,7 +146,7 @@
     *vendor = *renderer = *version = NULL;
 }
 
-int stopOpenGLRenderer(void)
+RENDER_APICALL int RENDER_APIENTRY stopOpenGLRenderer(void)
 {
     bool ret = false;
 
@@ -171,12 +172,13 @@
     return ret;
 }
 
-bool createOpenGLSubwindow(FBNativeWindowType window_id,
-                           int x,
-                           int y,
-                           int width,
-                           int height,
-                           float zRot)
+RENDER_APICALL bool RENDER_APIENTRY createOpenGLSubwindow(
+        FBNativeWindowType window_id,
+        int x,
+        int y,
+        int width,
+        int height,
+        float zRot)
 {
     RenderWindow* window = s_renderWindow;
 
@@ -190,7 +192,7 @@
     return false;
 }
 
-bool destroyOpenGLSubwindow(void)
+RENDER_APICALL bool RENDER_APIENTRY destroyOpenGLSubwindow(void)
 {
     RenderWindow* window = s_renderWindow;
 
@@ -205,7 +207,7 @@
     return false;
 }
 
-void setOpenGLDisplayRotation(float zRot)
+RENDER_APICALL void RENDER_APIENTRY setOpenGLDisplayRotation(float zRot)
 {
     RenderWindow* window = s_renderWindow;
 
@@ -219,7 +221,7 @@
             __FUNCTION__);
 }
 
-void repaintOpenGLDisplay(void)
+RENDER_APICALL void RENDER_APIENTRY repaintOpenGLDisplay(void)
 {
     RenderWindow* window = s_renderWindow;
 
@@ -276,8 +278,7 @@
     return stream;
 }
 
-int
-setStreamMode(int mode)
+RENDER_APICALL int RENDER_APIENTRY setStreamMode(int mode)
 {
     switch (mode) {
         case STREAM_MODE_DEFAULT:
diff --git a/distrib/android-emugl/host/libs/libOpenglRender/render_api.entries b/distrib/android-emugl/host/libs/libOpenglRender/render_api.entries
new file mode 100644
index 0000000..35ef923
--- /dev/null
+++ b/distrib/android-emugl/host/libs/libOpenglRender/render_api.entries
@@ -0,0 +1,106 @@
+!render_api
+
+%#include "render_api_platform_types.h"
+%#include <stdbool.h>
+%#include <stddef.h>
+%#include <stdint.h>
+
+%typedef void (*OnPostFn)(void* context, int width, int height, int ydir,
+%                         int format, int type, unsigned char* pixels);
+
+# Initialize the library and tries to load the corresponding EGL/GLES
+# translation libraries. Must be called before anything else to ensure that
+# everything works. Returns 0 on success, error code otherwise.
+# If it returns an error, you cannot use the library at all.
+int initLibrary(void);
+
+# Change the stream mode. This must be called before initOpenGLRenderer()
+# |mode| is one of STREAM_DEFAULT, STREAM_UNIX, STREAM_TCP or STREAM_PIPE.
+int setStreamMode(int mode);
+
+
+# initOpenGLRenderer - initialize the OpenGL renderer process.
+#
+# width and height are the framebuffer dimensions that will be reported to the
+# guest display driver.
+#
+# addr is a buffer of addrLen bytes that will receive the address that clients
+# should connect to. The interpretation depends on the transport:
+#   - TCP: The buffer contains the port number as a string. The server is
+#     listening only on the loopback address.
+#   - Win32 and UNIX named pipes: The buffer contains the full path clients
+#     should connect to.
+#
+# This function is *NOT* thread safe and should be called first
+# to initialize the renderer after initLibrary().
+int initOpenGLRenderer(int width, int height, char* addr, size_t addrLen);
+
+# getHardwareStrings - describe the GPU hardware and driver.
+# The underlying GL's vendor/renderer/version strings are returned to the
+# caller. The pointers become invalid after a call to stopOpenGLRenderer().
+void getHardwareStrings(const char** vendor, const char** renderer, const char** version);
+
+# A per-frame callback can be registered with setPostCallback(); to remove it
+# pass NULL for both parameters. While a callback is registered, the renderer
+# will call it just before each new frame is displayed, providing a copy of
+# the framebuffer contents.
+#
+# The callback will be called from one of the renderer's threads, so will
+# probably need synchronization on any data structures it modifies. The
+# pixels buffer may be overwritten as soon as the callback returns; if it
+# needs the pixels afterwards it must copy them.
+#
+# The pixels buffer is intentionally not const: the callback may modify the
+# data without copying to another buffer if it wants, e.g. in-place RGBA to
+# RGB conversion, or in-place y-inversion.
+#
+# Parameters are:
+#   context        The pointer optionally provided when the callback was
+#                  registered. The client can use this to pass whatever
+#                  information it wants to the callback.
+#   width, height  Dimensions of the image, in pixels. Rows are tightly
+#                  packed; there is no inter-row padding.
+#   ydir           Indicates row order: 1 means top-to-bottom order, -1 means
+#                  bottom-to-top order.
+#   format, type   Format and type GL enums, as used in glTexImage2D() or
+#                  glReadPixels(), describing the pixel format.
+#   pixels         The framebuffer image.
+#
+# In the first implementation, ydir is always -1 (bottom to top), format and
+# type are always GL_RGBA and GL_UNSIGNED_BYTE, and the width and height will
+# always be the same as the ones passed to initOpenGLRenderer().
+void setPostCallback(OnPostFn onPost, void* onPostContext);
+
+# createOpenGLSubwindow -
+#     Create a native subwindow which is a child of 'window'
+#     to be used for framebuffer display.
+#     x,y,width,height are the dimensions of the rendering subwindow.
+#     zRot is the rotation to apply on the framebuffer display image.
+#
+#     Return true on success, false on failure, which can happen when using
+#     a software-only renderer like OSMesa. In this case, the client should
+#     call setPostCallback to get the content of each new frame when it is
+#     posted, and will be responsible for displaying it.
+bool createOpenGLSubwindow(FBNativeWindowType window, int x, int y, int width, int height, float zRot);
+
+# destroyOpenGLSubwindow -
+#   destroys the created native subwindow. Once destroyed,
+#   Framebuffer content will not be visible until a new
+#   subwindow will be created.
+#   Return true on success, false otherwise.
+bool destroyOpenGLSubwindow(void);
+
+# setOpenGLDisplayRotation -
+#    set the framebuffer display image rotation in units
+#    of degrees around the z axis
+void setOpenGLDisplayRotation(float zRot);
+
+# repaintOpenGLDisplay -
+#    causes the OpenGL subwindow to get repainted with the
+#    latest framebuffer content.
+void repaintOpenGLDisplay(void);
+
+# stopOpenGLRenderer - stops the OpenGL renderer process.
+#     This functions is#NOT* thread safe and should be called
+#     only if previous initOpenGLRenderer has returned true.
+int stopOpenGLRenderer(void);
diff --git a/distrib/android-emugl/host/libs/libOpenglRender/render_api.h b/distrib/android-emugl/host/libs/libOpenglRender/render_api.h
index 930258a..bf54df6 100644
--- a/distrib/android-emugl/host/libs/libOpenglRender/render_api.h
+++ b/distrib/android-emugl/host/libs/libOpenglRender/render_api.h
@@ -30,25 +30,14 @@
 extern "C" {
 #endif
 
-#include <stdlib.h>
-#include "render_api_platform_types.h"
+#include "render_api_functions.h"
 
-#if defined(RENDER_API_NO_PROTOTYPES)
-#define DECL(ret, name, args) \
-	typedef ret (* name##Fn) args
-#else
-#define DECL(ret, name, args) \
-	typedef ret (* name##Fn) args ; \
-	ret name args
-#endif
+#include <KHR/khrplatform.h>
 
-/* initLibrary - initialize the library and tries to load the corresponding
- *     GLES translator libraries. This function must be called before anything
- *     else to ensure that everything works. If it returns an error, then
- *     you cannot use the library at all (this can happen under certain
- *     environments where the desktop GL libraries are not available)
- */
-DECL(int, initLibrary, (void));
+// Use KHRONOS_APICALL to control visibility, but do not use KHRONOS_APIENTRY
+// because we don't need the functions to be __stdcall on Win32.
+#define RENDER_APICALL  KHRONOS_APICALL
+#define RENDER_APIENTRY
 
 /* list of constants to be passed to setStreamMode */
 #define STREAM_MODE_DEFAULT   0
@@ -56,106 +45,12 @@
 #define STREAM_MODE_UNIX      2
 #define STREAM_MODE_PIPE      3
 
-/* Change the stream mode. This must be called before initOpenGLRenderer */
-DECL(int, setStreamMode, (int mode));
 
-/* initOpenGLRenderer - initialize the OpenGL renderer process.
- *
- * width and height are the framebuffer dimensions that will be reported to the
- * guest display driver.
- *
- * addr is a buffer of addrLen bytes that will receive the address that clients
- * should connect to. The interpretation depends on the transport:
- *   - TCP: The buffer contains the port number as a string. The server is
- *     listening only on the loopback address.
- *   - Win32 and UNIX named pipes: The buffer contains the full path clients
- *     should connect to.
- *
- * This function is *NOT* thread safe and should be called first
- * to initialize the renderer after initLibrary().
- */
-DECL(int, initOpenGLRenderer, (int width, int height, char* addr, size_t addrLen));
+#define RENDER_API_DECLARE(return_type, func_name, signature) \
+    typedef return_type (RENDER_APIENTRY *func_name ## Fn) signature; \
+    RENDER_APICALL return_type RENDER_APIENTRY func_name signature;
 
-/* getHardwareStrings - describe the GPU hardware and driver.
- *    The underlying GL's vendor/renderer/version strings are returned to the
- *    caller. The pointers become invalid after a call to stopOpenGLRenderer().
- */
-DECL(void, getHardwareStrings, (const char** vendor, const char** renderer,
-		const char** version));
-
-/* A per-frame callback can be registered with setPostCallback(); to remove it
- * pass NULL for both parameters. While a callback is registered, the renderer
- * will call it just before each new frame is displayed, providing a copy of
- * the framebuffer contents.
- *
- * The callback will be called from one of the renderer's threads, so will
- * probably need synchronization on any data structures it modifies. The
- * pixels buffer may be overwritten as soon as the callback returns; if it
- * needs the pixels afterwards it must copy them.
- *
- * The pixels buffer is intentionally not const: the callback may modify the
- * data without copying to another buffer if it wants, e.g. in-place RGBA to
- * RGB conversion, or in-place y-inversion.
- *
- * Parameters are:
- *   context        The pointer optionally provided when the callback was
- *                  registered. The client can use this to pass whatever
- *                  information it wants to the callback.
- *   width, height  Dimensions of the image, in pixels. Rows are tightly
- *                  packed; there is no inter-row padding.
- *   ydir           Indicates row order: 1 means top-to-bottom order, -1 means
- *                  bottom-to-top order.
- *   format, type   Format and type GL enums, as used in glTexImage2D() or
- *                  glReadPixels(), describing the pixel format.
- *   pixels         The framebuffer image.
- *
- * In the first implementation, ydir is always -1 (bottom to top), format and
- * type are always GL_RGBA and GL_UNSIGNED_BYTE, and the width and height will
- * always be the same as the ones passed to initOpenGLRenderer().
- */
-typedef void (*OnPostFn)(void* context, int width, int height, int ydir,
-                         int format, int type, unsigned char* pixels);
-DECL(void, setPostCallback, (OnPostFn onPost, void* onPostContext));
-
-/* createOpenGLSubwindow -
- *     Create a native subwindow which is a child of 'window'
- *     to be used for framebuffer display.
- *     x,y,width,height are the dimensions of the rendering subwindow.
- *     zRot is the rotation to apply on the framebuffer display image.
- *
- *     Return true on success, false on failure, which can happen when using
- *     a software-only renderer like OSMesa. In this case, the client should
- *     call setPostCallback to get the content of each new frame when it is
- *     posted, and will be responsible for displaying it.
- */
-DECL(bool, createOpenGLSubwindow, (FBNativeWindowType window,
-		int x, int y, int width, int height, float zRot));
-
-/* destroyOpenGLSubwindow -
- *   destroys the created native subwindow. Once destroyed,
- *   Framebuffer content will not be visible until a new
- *   subwindow will be created.
- *   Return true on success, false otherwise.
- */
-DECL(bool, destroyOpenGLSubwindow, (void));
-
-/* setOpenGLDisplayRotation -
- *    set the framebuffer display image rotation in units
- *    of degrees around the z axis
- */
-DECL(void, setOpenGLDisplayRotation, (float zRot));
-
-/* repaintOpenGLDisplay -
- *    causes the OpenGL subwindow to get repainted with the
- *    latest framebuffer content.
- */
-DECL(void, repaintOpenGLDisplay, (void));
-
-/* stopOpenGLRenderer - stops the OpenGL renderer process.
- *     This functions is *NOT* thread safe and should be called
- *     only if previous initOpenGLRenderer has returned true.
- */
-DECL(int, stopOpenGLRenderer, (void));
+LIST_RENDER_API_FUNCTIONS(RENDER_API_DECLARE)
 
 #ifdef __cplusplus
 }
diff --git a/distrib/android-emugl/host/libs/libOpenglRender/render_api_functions.h b/distrib/android-emugl/host/libs/libOpenglRender/render_api_functions.h
new file mode 100644
index 0000000..2a1f396
--- /dev/null
+++ b/distrib/android-emugl/host/libs/libOpenglRender/render_api_functions.h
@@ -0,0 +1,26 @@
+// Auto-generated with: android/scripts/gen-entries.py --mode=functions distrib/android-emugl/host/libs/libOpenglRender/render_api.entries
+// DO NOT EDIT THIS FILE
+
+#ifndef RENDER_API_FUNCTIONS_H
+#define RENDER_API_FUNCTIONS_H
+
+#include "render_api_platform_types.h"
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdint.h>
+typedef void (*OnPostFn)(void* context, int width, int height, int ydir,
+                         int format, int type, unsigned char* pixels);
+#define LIST_RENDER_API_FUNCTIONS(X) \
+  X(int, initLibrary, (void)) \
+  X(int, setStreamMode, (int mode)) \
+  X(int, initOpenGLRenderer, (int width, int height, char* addr, size_t addrLen)) \
+  X(void, getHardwareStrings, (const char** vendor, const char** renderer, const char** version)) \
+  X(void, setPostCallback, (OnPostFn onPost, void* onPostContext)) \
+  X(bool, createOpenGLSubwindow, (FBNativeWindowType window, int x, int y, int width, int height, float zRot)) \
+  X(bool, destroyOpenGLSubwindow, ()) \
+  X(void, setOpenGLDisplayRotation, (float zRot)) \
+  X(void, repaintOpenGLDisplay, ()) \
+  X(int, stopOpenGLRenderer, ()) \
+
+
+#endif  // RENDER_API_FUNCTIONS_H
diff --git a/distrib/android-emugl/host/libs/libOpenglRender/render_egl.entries b/distrib/android-emugl/host/libs/libOpenglRender/render_egl.entries
new file mode 100644
index 0000000..7579c3b3
--- /dev/null
+++ b/distrib/android-emugl/host/libs/libOpenglRender/render_egl.entries
@@ -0,0 +1,40 @@
+# The list of EGL functions used by libOpenglRender, without extensions.
+# This is only a subset of the full EGL API.
+
+!Render_EGL
+%#include <EGL/egl.h>
+
+EGLint eglGetError(void);
+EGLDisplay eglGetDisplay(EGLNativeDisplayType dpy);
+EGLBoolean eglInitialize(EGLDisplay dpy, EGLint* major, EGLint* minor);
+EGLBoolean eglTerminate(EGLDisplay dpy);
+char* eglQueryString(EGLDisplay dpy, EGLint id);
+EGLBoolean eglGetConfigs(EGLDisplay display, EGLConfig* configs, EGLint config_size, EGLint* num_config);
+EGLBoolean eglChooseConfig(EGLDisplay display, const EGLint* attribs, EGLConfig* configs, EGLint config_size, EGLint* num_config);
+EGLBoolean eglGetConfigAttrib(EGLDisplay display, EGLConfig config, EGLint attribute, EGLint* value);
+EGLSurface eglCreateWindowSurface(EGLDisplay display, EGLConfig config, EGLNativeWindowType native_window, const EGLint* attrib_list);
+EGLSurface eglCreatePbufferSurface(EGLDisplay display, EGLConfig config, const EGLint* attrib_list);
+EGLSurface eglCreatePixmapSurface(EGLDisplay display, EGLConfig config, EGLNativePixmapType native_pixmap, const EGLint* attrib_list);
+EGLBoolean eglDestroySurface(EGLDisplay display, EGLSurface surface);
+EGLBoolean eglQuerySurface(EGLDisplay display, EGLSurface surface, EGLint attribute, EGLint* value);
+EGLBoolean eglBindAPI(EGLenum api);
+EGLenum eglQueryAPI(void);
+EGLBoolean eglWaitClient(void);
+EGLBoolean eglReleaseThread(void);
+EGLSurface eglCreatePbufferFromClientBuffer(EGLDisplay display, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint* attrib_list);
+EGLBoolean eglSurfaceAttrib(EGLDisplay display, EGLSurface surface, EGLint attribute, EGLint value);
+EGLBoolean eglBindTexImage(EGLDisplay display, EGLSurface surface, EGLint buffer);
+EGLBoolean eglReleaseTexImage(EGLDisplay display, EGLSurface surface, EGLint buffer);
+EGLBoolean eglSwapInterval(EGLDisplay display, EGLint interval);
+EGLContext eglCreateContext(EGLDisplay display, EGLConfig config, EGLContext share_context, const EGLint* attrib_list);
+EGLBoolean eglDestroyContext(EGLDisplay display, EGLContext context);
+EGLBoolean eglMakeCurrent(EGLDisplay display, EGLSurface draw, EGLSurface read, EGLContext context);
+EGLContext eglGetCurrentContext(void);
+EGLSurface eglGetCurrentSurface(EGLint readdraw);
+EGLDisplay eglGetCurrentDisplay(void);
+EGLBoolean eglQueryContext(EGLDisplay display, EGLContext context, EGLint attribute, EGLint* value);
+EGLBoolean eglWaitGL(void);
+EGLBoolean eglWaitNative(EGLint engine);
+EGLBoolean eglSwapBuffers(EGLDisplay display, EGLSurface surface);
+EGLBoolean eglCopyBuffers(EGLDisplay display, EGLSurface surface, EGLNativePixmapType native_pixmap);
+void* eglGetProcAddress(const char* function_name);
diff --git a/distrib/android-emugl/host/libs/libOpenglRender/render_egl_extensions.entries b/distrib/android-emugl/host/libs/libOpenglRender/render_egl_extensions.entries
new file mode 100644
index 0000000..af5c4e9
--- /dev/null
+++ b/distrib/android-emugl/host/libs/libOpenglRender/render_egl_extensions.entries
@@ -0,0 +1,19 @@
+# The list of EGL extension functions used by libOpenglRender.
+# This is only a subset of the full EGL API.
+
+!Render_EGL_extensions
+
+%#include <EGL/egl.h>
+%#define EGL_EGLEXT_PROTOTYPES
+%#include <EGL/eglext.h>
+
+EGLBoolean eglLockSurfaceKHR(EGLDisplay display, EGLSurface surface, const EGLint* attrib_list);
+EGLBoolean eglUnlockSurfaceKHR(EGLDisplay display, EGLSurface surface);
+EGLImageKHR eglCreateImageKHR(EGLDisplay display, EGLContext context, EGLenum target, EGLClientBuffer buffer, const EGLint* attrib_list);
+EGLBoolean eglDestroyImageKHR(EGLDisplay display, EGLImageKHR image);
+EGLSyncKHR eglCreateSyncKHR(EGLDisplay display, EGLenum type, const EGLint* attrib_list);
+EGLBoolean eglDestroySyncKHR(EGLDisplay display, EGLSyncKHR sync);
+EGLint eglClientWaitSyncKHR(EGLDisplay display, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout);
+EGLBoolean eglSignalSyncKHR(EGLDisplay display, EGLSyncKHR sync, EGLenum mode);
+EGLBoolean eglGetSyncAttribKHR(EGLDisplay display, EGLSyncKHR sync, EGLint attribute, EGLint* value);
+EGLBoolean eglSetSwapRectangleANDROID(EGLDisplay display, EGLSurface surface, EGLint left, EGLint top, EGLint width, EGLint height);
diff --git a/distrib/android-emugl/scripts/gen-headers.sh b/distrib/android-emugl/scripts/gen-headers.sh
new file mode 100755
index 0000000..8fd03c9
--- /dev/null
+++ b/distrib/android-emugl/scripts/gen-headers.sh
@@ -0,0 +1,45 @@
+#!/bin/sh
+
+set -e
+export LANG=C
+export LC_ALL=C
+
+panic () {
+    echo "ERROR: $@"
+    exit 1
+}
+
+PROGDIR=$(dirname "$0")
+
+QEMU_TOP_DIR=$(cd $PROGDIR/../../.. && pwd -P)
+SCRIPT_DIR=android/scripts
+if [ ! -d "$QEMU_TOP_DIR/$SCRIPT_DIR" ]; then
+    panic "Missing scripts directory: $QEMU_TOP_DIR/$SCRIPT_DIR"
+fi
+
+cd $QEMU_TOP_DIR
+GEN_ENTRIES=$SCRIPT_DIR/gen-entries.py
+if [ ! -f "$GEN_ENTRIES" ]; then
+    panic "Missing script: $GEN_ENTRIES"
+fi
+
+GLCOMMON_SRC_DIR=distrib/android-emugl/host/libs/Translator
+GLCOMMON_ENTRIES="gles_common gles_extensions gles1_only gles1_extensions gles2_only \
+gles2_extensions"
+
+FAILURES=
+for ENTRY in $GLCOMMON_ENTRIES; do
+    SRC_FILE=$GLCOMMON_SRC_DIR/GLcommon/${ENTRY}.entries
+    DST_FILE=$GLCOMMON_SRC_DIR/include/GLcommon/${ENTRY}_functions.h
+    if [ ! -f "$SRC_FILE" ]; then
+        echo "ERROR: Missing source file: $SRC_FILE"
+        FAILURES=true
+    else
+        echo "Generating $DST_FILE"
+        $GEN_ENTRIES --mode=functions $SRC_FILE --output=$DST_FILE
+    fi
+done
+
+if [ "$FAILURES" ]; then
+    exit 1
+fi
diff --git a/distrib/android-emugl/shared/emugl/common/Android.mk b/distrib/android-emugl/shared/emugl/common/Android.mk
index 3078e95..8f6e0b4 100644
--- a/distrib/android-emugl/shared/emugl/common/Android.mk
+++ b/distrib/android-emugl/shared/emugl/common/Android.mk
@@ -72,8 +72,10 @@
 
 $(call emugl-begin-host-shared-library,libemugl_test_shared_library)
 LOCAL_SRC_FILES := testing/test_shared_library.cpp
+LOCAL_CFLAGS := -fvisibility=default
 $(call emugl-end-module)
 
 $(call emugl-begin-host64-shared-library,lib64emugl_test_shared_library)
 LOCAL_SRC_FILES := testing/test_shared_library.cpp
+LOCAL_CFLAGS := -fvisibility=default
 $(call emugl-end-module)