Emulator's host translator EGL implementation.

This is the EGL implementation for the host EGL/GLES translator.

EglImp.cpp - includes the EGL entry points implementation.
ThreadInfo.cpp - defines the per-thread info which is shared to EGL and GLES
EglOsApi.h - platform dependant interface functions.
EglLinuxApi.cpp - implements the GLX platform of EglOsApi
EglWindowsApi.cpp - implenents the Windows platform of EglOsApi - This has not been compiled yet!!!

Change-Id: I30a8cf457858ef04febf67005787d8d18e5e7a70
diff --git a/tools/emulator/opengl/host/libs/Translator/EGL/Android.mk b/tools/emulator/opengl/host/libs/Translator/EGL/Android.mk
new file mode 100644
index 0000000..9d6321d
--- /dev/null
+++ b/tools/emulator/opengl/host/libs/Translator/EGL/Android.mk
@@ -0,0 +1,48 @@
+LOCAL_PATH := $(call my-dir)
+
+### EGL host implementation ########################
+include $(CLEAR_VARS)
+
+translator_path := $(LOCAL_PATH)/..
+
+OS_SRCS:=
+
+
+ifeq ($(HOST_OS),linux)
+    OS_SRCS = EglX11Api.cpp
+    LOCAL_LDLIBS := -lX11 -lGL -ldl
+endif
+
+ifeq ($(HOST_OS),darwin)
+    OS_SRCS = EglMacApi.cpp
+endif
+
+ifeq ($(HOST_OS),windows)
+    OS_SRCS = EglWindowsApi.cpp
+endif
+
+LOCAL_SRC_FILES :=            \
+     $(OS_SRCS)               \
+     ThreadInfo.cpp           \
+     EglImp.cpp               \
+     EglConfig.cpp            \
+     EglContext.cpp           \
+     EglGlobalInfo.cpp        \
+     EglValidate.cpp          \
+     EglSurface.cpp           \
+     EglWindowSurface.cpp     \
+     EglPbufferSurface.cpp    \
+     EglPixmapSurface.cpp     \
+     EglThreadInfo.cpp        \
+     EglDisplay.cpp
+
+
+LOCAL_C_INCLUDES += \
+                 $(translator_path)/include
+
+LOCAL_CFLAGS := -g -O0
+LOCAL_MODULE_TAGS := debug
+LOCAL_MODULE := libEGL_translator
+LOCAL_STATIC_LIBRARIES := libGLcommon libcutils
+include $(BUILD_HOST_SHARED_LIBRARY)
+
diff --git a/tools/emulator/opengl/host/libs/Translator/EGL/EglConfig.cpp b/tools/emulator/opengl/host/libs/Translator/EGL/EglConfig.cpp
new file mode 100644
index 0000000..609e231
--- /dev/null
+++ b/tools/emulator/opengl/host/libs/Translator/EGL/EglConfig.cpp
@@ -0,0 +1,284 @@
+/*
+* 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.
+*/
+#include "EglConfig.h"
+
+EglConfig::EglConfig(EGLint     red_size,
+                     EGLint     green_size,
+                     EGLint     blue_size,
+                     EGLint     alpha_size,
+                     EGLenum    caveat,
+                     EGLint     config_id,
+                     EGLint     depth_size,
+                     EGLint     frame_buffer_level,
+                     EGLint     max_pbuffer_width,
+                     EGLint     max_pbuffer_height,
+                     EGLint     max_pbuffer_size,
+                     EGLBoolean native_renderable,
+                     EGLint     native_visual_id,
+                     EGLint     native_visual_type,
+                     EGLint     samples_per_pixel,
+                     EGLint     stencil_size,
+                     EGLint     surface_type,
+                     EGLenum    transparent_type,
+                     EGLint     trans_red_val,
+                     EGLint     trans_green_val,
+                     EGLint     trans_blue_val,
+                     EGLNativePixelFormatType frmt):
+
+                     m_buffer_size(red_size + green_size + blue_size + alpha_size),
+                     m_red_size(red_size),
+                     m_green_size(green_size),
+                     m_blue_size(blue_size),
+                     m_alpha_size(alpha_size),
+                     m_bind_to_tex_rgb(EGL_FALSE), //not supported for now
+                     m_bind_to_tex_rgba(EGL_FALSE), //not supported for now
+                     m_caveat(caveat),
+                     m_config_id(config_id),
+                     m_frame_buffer_level(frame_buffer_level),
+                     m_depth_size(depth_size),
+                     m_max_pbuffer_width(max_pbuffer_width),
+                     m_max_pbuffer_height(max_pbuffer_height),
+                     m_max_pbuffer_size(max_pbuffer_size),
+                     m_max_swap_interval(MAX_SWAP_INTERVAL),
+                     m_min_swap_interval(MIN_SWAP_INTERVAL),
+                     m_native_renderable(native_renderable),
+                     m_native_visual_id(native_visual_id),
+                     m_native_visual_type(native_visual_type),
+                     m_sample_buffers_num(samples_per_pixel > 0 ?1:0),
+                     m_samples_per_pixel(samples_per_pixel),
+                     m_stencil_size(stencil_size),
+                     m_surface_type(surface_type),
+                     m_transparent_type(transparent_type),
+                     m_trans_red_val(trans_red_val),
+                     m_trans_green_val(trans_green_val),
+                     m_trans_blue_val(trans_blue_val),
+                     m_nativeFormat(frmt){};
+
+
+    EglConfig::EglConfig(const EglConfig& conf):m_buffer_size(conf.m_buffer_size),
+                                                m_red_size(conf.m_red_size),
+                                                m_green_size(conf.m_green_size),
+                                                m_blue_size(conf.m_blue_size),
+                                                m_alpha_size(conf.m_alpha_size),
+                                                m_bind_to_tex_rgb(conf.m_bind_to_tex_rgb),
+                                                m_bind_to_tex_rgba(conf.m_bind_to_tex_rgba),
+                                                m_caveat(conf.m_caveat),
+                                                m_config_id(conf.m_config_id),
+                                                m_frame_buffer_level(conf.m_frame_buffer_level),
+                                                m_depth_size(conf.m_depth_size),
+                                                m_max_pbuffer_width(conf.m_max_pbuffer_width),
+                                                m_max_pbuffer_height(conf.m_max_pbuffer_height),
+                                                m_max_pbuffer_size(conf.m_max_pbuffer_size),
+                                                m_max_swap_interval(conf.m_max_swap_interval),
+                                                m_min_swap_interval(conf.m_min_swap_interval),
+                                                m_native_renderable(conf.m_native_renderable),
+                                                m_native_visual_id(conf.m_native_visual_id),
+                                                m_native_visual_type(conf.m_native_visual_type),
+                                                m_sample_buffers_num(conf.m_sample_buffers_num),
+                                                m_samples_per_pixel(conf.m_samples_per_pixel),
+                                                m_stencil_size(conf.m_stencil_size),
+                                                m_surface_type(conf.m_surface_type),
+                                                m_transparent_type(conf.m_transparent_type),
+                                                m_trans_red_val(conf.m_trans_red_val),
+                                                m_trans_green_val(conf.m_trans_green_val),
+                                                m_trans_blue_val(conf.m_trans_blue_val),
+                                                m_nativeFormat(conf.m_nativeFormat){};
+
+
+
+bool EglConfig::getConfAttrib(EGLint attrib,EGLint* val) const {
+    switch(attrib) {
+    case EGL_BUFFER_SIZE:
+        *val = m_buffer_size;
+        break;
+    case EGL_RED_SIZE:
+        *val = m_red_size;
+        break;
+    case EGL_GREEN_SIZE:
+        *val = m_green_size;
+        break;
+    case EGL_BLUE_SIZE:
+        *val = m_blue_size;
+        break;
+    case EGL_ALPHA_SIZE:
+        *val = m_alpha_size;
+        break;
+    case EGL_BIND_TO_TEXTURE_RGB:
+        *val = m_bind_to_tex_rgb;
+        break;
+    case EGL_BIND_TO_TEXTURE_RGBA:
+        *val = m_bind_to_tex_rgba;
+        break;
+    case EGL_CONFIG_CAVEAT:
+        *val = m_caveat;
+        break;
+    case EGL_CONFIG_ID:
+        *val = m_config_id;
+        break;
+    case EGL_DEPTH_SIZE:
+        *val = m_depth_size;
+        break;
+    case EGL_LEVEL:
+        *val = m_frame_buffer_level;
+        break;
+    case EGL_MAX_PBUFFER_WIDTH:
+        *val = m_max_pbuffer_width;
+        break;
+    case EGL_MAX_PBUFFER_HEIGHT:
+        *val = m_max_pbuffer_height;
+        break;
+    case EGL_MAX_PBUFFER_PIXELS:
+        *val = m_max_pbuffer_size;
+        break;
+    case EGL_MAX_SWAP_INTERVAL:
+        *val = m_max_swap_interval;
+        break;
+    case EGL_MIN_SWAP_INTERVAL:
+        *val = m_min_swap_interval;
+        break;
+    case EGL_NATIVE_RENDERABLE:
+        *val = m_native_renderable;
+        break;
+    case EGL_NATIVE_VISUAL_ID:
+        *val = m_native_visual_id;
+        break;
+    case EGL_NATIVE_VISUAL_TYPE:
+        *val = m_native_visual_type;
+        break;
+    case EGL_SAMPLE_BUFFERS:
+        *val = m_sample_buffers_num;
+        break;
+    case EGL_SAMPLES:
+        *val = m_samples_per_pixel;
+        break;
+    case EGL_STENCIL_SIZE:
+        *val = m_stencil_size;
+        break;
+    case EGL_SURFACE_TYPE:
+        *val = m_surface_type;
+        break;
+    case EGL_TRANSPARENT_TYPE:
+        *val =m_transparent_type;
+        break;
+    case EGL_TRANSPARENT_RED_VALUE:
+        *val = m_trans_red_val;
+        break;
+    case EGL_TRANSPARENT_GREEN_VALUE:
+        *val = m_trans_green_val;
+        break;
+    case EGL_TRANSPARENT_BLUE_VALUE:
+        *val = m_trans_blue_val;
+        break;
+    default:
+        return false;
+    }
+    return true;
+}
+
+// checking compitabilty between *this configuration and another configuration
+// the compitability is checked againsed red,green,blue,buffer stencil and depth sizes
+bool EglConfig::compitableWith(const EglConfig& conf) const {
+
+    if(m_buffer_size != conf.m_buffer_size) return false;
+    if(m_red_size != conf.m_red_size) return false;
+    if(m_green_size != conf.m_green_size) return false;
+    if(m_blue_size != conf.m_blue_size) return false;
+    if(m_depth_size != conf.m_depth_size) return false;
+    if(m_stencil_size != conf.m_stencil_size) return false;
+
+    return true;
+}
+
+//following the sorting EGLconfig as in spec
+bool EglConfig::operator<(const EglConfig& conf) const {
+    //1
+    if(m_caveat != conf.m_caveat) {
+       return m_caveat < conf.m_caveat; // EGL_NONE < EGL_SLOW_CONFIG < EGL_NON_CONFORMANT_CONFIG
+    }
+    //2 TODO:
+
+    //3
+    if(m_buffer_size != conf.m_buffer_size) {
+       return m_buffer_size < conf.m_buffer_size;
+    }
+    //4
+    if(m_sample_buffers_num != conf.m_sample_buffers_num) {
+       return m_sample_buffers_num < conf.m_sample_buffers_num;
+    }
+    //5
+    if(m_samples_per_pixel != conf.m_samples_per_pixel) {
+       return m_samples_per_pixel < conf.m_samples_per_pixel;
+    }
+    //6
+    if(m_depth_size != conf.m_depth_size) {
+       return m_depth_size < conf.m_depth_size;
+    }
+    //7
+    if(m_stencil_size != conf.m_stencil_size) {
+       return m_stencil_size < conf.m_stencil_size;
+    }
+    //8 implementation defined
+    if(m_native_visual_type != conf.m_native_visual_type) {
+       return m_native_visual_type < conf.m_native_visual_type;
+    }
+    //9
+    return m_config_id < conf.m_config_id;
+}
+
+bool EglConfig::operator>=(const EglConfig& conf) const {
+    return  !((*this) < conf);
+}
+#define CHECK_PROP(dummy,prop_name,op) \
+                  if((dummy.prop_name != EGL_DONT_CARE) && (dummy.prop_name op prop_name)) return false;
+#define CHECK_PROP_CAST(dummy,prop_name,op) \
+                  if((((EGLint)dummy.prop_name) != EGL_DONT_CARE) && (dummy.prop_name op prop_name)) return false;
+//checking if config stands for all the selection crateria of dummy as defined by EGL spec
+bool EglConfig::choosen(const EglConfig& dummy) {
+
+   //atleast
+   CHECK_PROP(dummy,m_buffer_size,>);
+   CHECK_PROP(dummy,m_red_size,>);
+   CHECK_PROP(dummy,m_green_size,>);
+   CHECK_PROP(dummy,m_blue_size,>);
+   CHECK_PROP(dummy,m_alpha_size,>);
+   CHECK_PROP(dummy,m_depth_size,>);
+   CHECK_PROP(dummy,m_stencil_size,>);
+   CHECK_PROP(dummy,m_sample_buffers_num,>);
+   CHECK_PROP(dummy,m_samples_per_pixel,>);
+
+   //exact
+   CHECK_PROP(dummy,m_frame_buffer_level,!=);
+   CHECK_PROP(dummy,m_config_id,!=);
+   CHECK_PROP(dummy,m_native_visual_type,!=);
+   CHECK_PROP(dummy,m_max_swap_interval ,!=);
+   CHECK_PROP(dummy,m_min_swap_interval ,!=);
+   CHECK_PROP(dummy,m_trans_red_val    ,!=);
+   CHECK_PROP(dummy,m_trans_green_val ,!=);
+   CHECK_PROP(dummy,m_trans_blue_val  ,!=);
+   //exact - when cast to EGLint is needed when comparing to EGL_DONT_CARE
+   CHECK_PROP_CAST(dummy,m_bind_to_tex_rgb ,!=);
+   CHECK_PROP_CAST(dummy,m_bind_to_tex_rgba,!=);
+   CHECK_PROP_CAST(dummy,m_caveat,!=);
+   CHECK_PROP_CAST(dummy,m_native_renderable ,!=);
+   CHECK_PROP_CAST(dummy,m_transparent_type   ,!=);
+
+   //mask
+   if(dummy.m_surface_type != EGL_DONT_CARE &&
+    ((dummy.m_surface_type & m_surface_type) != dummy.m_surface_type)) return false;
+
+   //passed all checks
+   return true;
+}
diff --git a/tools/emulator/opengl/host/libs/Translator/EGL/EglConfig.h b/tools/emulator/opengl/host/libs/Translator/EGL/EglConfig.h
new file mode 100644
index 0000000..b47be12
--- /dev/null
+++ b/tools/emulator/opengl/host/libs/Translator/EGL/EglConfig.h
@@ -0,0 +1,95 @@
+/*
+* 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_CONFIG_H
+#define EGL_CONFIG_H
+
+#include<EGL/egl.h>
+
+#define MIN_SWAP_INTERVAL 1
+#define MAX_SWAP_INTERVAL 10
+
+
+class EglConfig {
+public:
+    bool getConfAttrib(EGLint attrib,EGLint* val) const;
+    bool operator<(const EglConfig& conf)   const;
+    bool operator>=(const EglConfig& conf)  const;
+    bool compitableWith(const EglConfig& conf)  const; //compitability
+    bool choosen(const EglConfig& dummy);
+    EGLint surfaceType(){ return m_surface_type;};
+    EGLint id(){return m_config_id;};
+    EGLNativePixelFormatType nativeConfig(){ return m_nativeFormat;}
+
+    EglConfig(EGLint red_size,
+              EGLint green_size,
+              EGLint blue_size,
+              EGLint alpha_size,
+              EGLenum  caveat,
+              EGLint config_id,
+              EGLint depth_size,
+              EGLint frame_buffer_level,
+              EGLint max_pbuffer_width,
+              EGLint max_pbuffer_height,
+              EGLint max_pbuffer_size,
+              EGLBoolean native_renderable,
+              EGLint native_visual_id,
+              EGLint native_visual_type,
+              EGLint samples_per_pixel,
+              EGLint stencil_size,
+              EGLint surface_type,
+              EGLenum transparent_type,
+              EGLint trans_red_val,
+              EGLint trans_green_val,
+              EGLint trans_blue_val,
+              EGLNativePixelFormatType frmt = 0);
+
+    EglConfig(const EglConfig& conf);
+    
+
+private:
+
+    const EGLint                    m_buffer_size;
+    const EGLint                    m_red_size;
+    const EGLint                    m_green_size;
+    const EGLint                    m_blue_size;
+    const EGLint                    m_alpha_size;
+    const EGLBoolean                m_bind_to_tex_rgb;
+    const EGLBoolean                m_bind_to_tex_rgba;
+    const EGLenum                   m_caveat;
+    const EGLint                    m_config_id;
+    const EGLint                    m_frame_buffer_level;
+    const EGLint                    m_depth_size;
+    const EGLint                    m_max_pbuffer_width;
+    const EGLint                    m_max_pbuffer_height;
+    const EGLint                    m_max_pbuffer_size;
+    const EGLint                    m_max_swap_interval;
+    const EGLint                    m_min_swap_interval;
+    const EGLBoolean                m_native_renderable;
+    const EGLint                    m_native_visual_id;
+    const EGLint                    m_native_visual_type;
+    const EGLint                    m_sample_buffers_num;
+    const EGLint                    m_samples_per_pixel;
+    const EGLint                    m_stencil_size;
+    const EGLint                    m_surface_type;
+    const EGLenum                   m_transparent_type;
+    const EGLint                    m_trans_red_val;
+    const EGLint                    m_trans_green_val;
+    const EGLint                    m_trans_blue_val;
+
+    const EGLNativePixelFormatType  m_nativeFormat;
+};
+
+#endif
diff --git a/tools/emulator/opengl/host/libs/Translator/EGL/EglContext.cpp b/tools/emulator/opengl/host/libs/Translator/EGL/EglContext.cpp
new file mode 100644
index 0000000..0190fdf
--- /dev/null
+++ b/tools/emulator/opengl/host/libs/Translator/EGL/EglContext.cpp
@@ -0,0 +1,55 @@
+/*
+* 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.
+*/
+#include "EglContext.h"
+
+unsigned int EglContext::s_nextContextHndl = 0;
+
+bool EglContext::usingSurface(SurfacePtr surface) {
+  return surface.Ptr() == m_read.Ptr() || surface.Ptr() == m_draw.Ptr();
+}
+
+EglContext::EglContext(EGLNativeContextType context,ContextPtr shared_context,
+            EglConfig* config,GLEScontext* glesCtx,GLESVersion ver,ObjectNameManager* mngr):
+m_native(context),
+m_config(config),
+m_glesContext(glesCtx),
+m_read(NULL),
+m_draw(NULL),
+m_destroy(false),
+m_version(ver)
+{
+    m_shareGroup = shared_context.Ptr()? 
+                   mngr->attachShareGroup(context,shared_context.Ptr()->getShareGroup().Ptr()):
+                   mngr->createShareGroup(context);
+    m_hndl = ++s_nextContextHndl;
+}
+
+void EglContext::setSurfaces(SurfacePtr read,SurfacePtr draw)
+{
+    m_read = read;
+    m_draw = draw;
+}
+
+bool EglContext::getAttrib(EGLint attrib,EGLint* value) {
+    switch(attrib) {
+    case EGL_CONFIG_ID:
+        *value = m_config->id();
+        break;
+    default:
+        return false;
+    }
+    return true;
+}
diff --git a/tools/emulator/opengl/host/libs/Translator/EGL/EglContext.h b/tools/emulator/opengl/host/libs/Translator/EGL/EglContext.h
new file mode 100644
index 0000000..f9445a1
--- /dev/null
+++ b/tools/emulator/opengl/host/libs/Translator/EGL/EglContext.h
@@ -0,0 +1,71 @@
+/*
+* 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_CONTEXT_H
+#define EGL_CONTEXT_H
+
+#include <map>
+#include <EGL/egl.h>
+#include <GLcommon/SmartPtr.h>
+#include <GLcommon/TranslatorIfaces.h>
+#include <GLcommon/objectNameManager.h>
+
+
+#include "EglConfig.h"
+#include "EglSurface.h"
+
+
+typedef enum{
+             GLES_1_1 = 0,
+             GLES_2_0 = 1,
+             MAX_GLES_VERSION //Must be last
+            }GLESVersion;
+
+class EglContext;
+typedef  SmartPtr<EglContext> ContextPtr;
+
+class EglContext {
+
+public:
+
+    EglContext(EGLNativeContextType context,ContextPtr shared_context,EglConfig* config,GLEScontext* glesCtx,GLESVersion ver,ObjectNameManager* mngr);
+    bool usingSurface(SurfacePtr surface);
+    EGLNativeContextType nativeType(){return m_native;};
+    void markForDestruction(){m_destroy = true;}
+    bool destroy(){ return m_destroy;}
+    bool getAttrib(EGLint attrib,EGLint* value);
+    SurfacePtr read(){ return m_read;};
+    SurfacePtr draw(){ return m_draw;};
+    ShareGroupPtr getShareGroup(){return m_shareGroup;}
+    EglConfig* getConfig(){ return m_config;};
+    GLESVersion version(){return m_version;};
+    GLEScontext* getGlesContext(){return m_glesContext;}
+    void setSurfaces(SurfacePtr read,SurfacePtr draw);
+    unsigned int getHndl(){return m_hndl;}
+
+private:
+    static unsigned int  s_nextContextHndl;
+    EGLNativeContextType m_native;
+    EglConfig*           m_config;
+    GLEScontext*         m_glesContext;
+    ShareGroupPtr        m_shareGroup;
+    SurfacePtr           m_read;
+    SurfacePtr           m_draw;
+    bool                 m_destroy;
+    GLESVersion          m_version;
+    unsigned int         m_hndl;
+};
+
+#endif
diff --git a/tools/emulator/opengl/host/libs/Translator/EGL/EglDisplay.cpp b/tools/emulator/opengl/host/libs/Translator/EGL/EglDisplay.cpp
new file mode 100644
index 0000000..9e17493
--- /dev/null
+++ b/tools/emulator/opengl/host/libs/Translator/EGL/EglDisplay.cpp
@@ -0,0 +1,208 @@
+/*
+* 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.
+*/
+#include "EglDisplay.h"
+#include "EglOsApi.h"
+#include <GLcommon/GLutils.h>
+#include <utils/threads.h>
+
+EglDisplay::EglDisplay(EGLNativeDisplayType dpy,bool isDefault):m_dpy(dpy),m_initialized(false),m_configInitialized(false),m_isDefault(isDefault){};
+
+EglDisplay::~EglDisplay() {
+    android::Mutex::Autolock mutex(m_lock);
+    if(m_isDefault) {
+        EglOS::releaseDisplay(m_dpy);
+    }
+
+
+    for(ConfigsList::iterator it = m_configs.begin(); it != m_configs.end(); it++) {
+        EglConfig* pConfig = *it;
+        if(pConfig) delete pConfig;
+    }
+}
+
+EGLNativeDisplayType EglDisplay::nativeType(){return m_dpy;}
+
+void EglDisplay::initialize() {
+    android::Mutex::Autolock mutex(m_lock);
+    m_initialized = true;
+    initConfigurations();
+    m_configInitialized = true;
+}
+
+bool EglDisplay::isInitialize() { return m_initialized;}
+
+void EglDisplay::terminate(){
+    android::Mutex::Autolock mutex(m_lock);
+     m_contexts.clear();
+     m_surfaces.clear();
+     m_initialized = false;
+}
+
+static bool compareEglConfigsPtrs(EglConfig* first,EglConfig* second) {
+    return *first < *second ;
+}
+
+void EglDisplay::initConfigurations() {
+    if(m_configInitialized) return;
+    EglOS::queryConfigs(m_dpy,m_configs);
+    m_configs.sort(compareEglConfigsPtrs);
+}
+
+EglConfig* EglDisplay::getConfig(EGLConfig conf) {
+    android::Mutex::Autolock mutex(m_lock);
+
+    for(ConfigsList::iterator it = m_configs.begin(); it != m_configs.end() ;it++) {
+        if(static_cast<EGLConfig>(*it) == conf) {
+            return (*it);
+
+        }
+    }
+    return NULL;
+}
+
+SurfacePtr EglDisplay::getSurface(EGLSurface surface) {
+    android::Mutex::Autolock mutex(m_lock);
+
+    SurfacesHndlMap::iterator it = m_surfaces.find(reinterpret_cast<unsigned int>(surface));
+    return it != m_surfaces.end() ?
+                                  (*it).second :
+                                   SurfacePtr(NULL);
+}
+
+ContextPtr EglDisplay::getContext(EGLContext ctx) {
+    android::Mutex::Autolock mutex(m_lock);
+
+    ContextsHndlMap::iterator it = m_contexts.find(reinterpret_cast<unsigned int>(ctx));
+    return it != m_contexts.end() ?
+                                  (*it).second :
+                                   ContextPtr(NULL);
+}
+
+bool EglDisplay::removeSurface(EGLSurface s) {
+    android::Mutex::Autolock mutex(m_lock);
+
+    SurfacesHndlMap::iterator it = m_surfaces.find(reinterpret_cast<unsigned int>(s));
+    if(it != m_surfaces.end()) {
+        m_surfaces.erase(it);
+        return true;
+    }
+    return false;
+}
+
+bool EglDisplay::removeSurface(SurfacePtr s) {
+    android::Mutex::Autolock mutex(m_lock);
+
+    SurfacesHndlMap::iterator it;
+    for(it = m_surfaces.begin(); it!= m_surfaces.end();it++)
+    {
+        if((*it).second == s.Ptr()) {
+            break;
+        }
+    }
+    if(it != m_surfaces.end()) {
+        m_surfaces.erase(it);
+        return true;
+    }
+    return false;
+}
+
+bool EglDisplay::removeContext(EGLContext ctx) {
+    android::Mutex::Autolock mutex(m_lock);
+
+    ContextsHndlMap::iterator it = m_contexts.find(reinterpret_cast<unsigned int>(ctx));
+    if(it != m_contexts.end()) {
+        m_contexts.erase(it);
+        return true;
+    }
+    return false;
+}
+
+bool EglDisplay::removeContext(ContextPtr ctx) {
+    android::Mutex::Autolock mutex(m_lock);
+
+    ContextsHndlMap::iterator it;
+    for(it = m_contexts.begin(); it != m_contexts.end();it++) {
+        if((*it).second == ctx.Ptr()){
+            break;
+        }
+    }
+    if(it != m_contexts.end()) {
+        m_contexts.erase(it);
+        return true;
+    }
+    return false;
+}
+
+EglConfig* EglDisplay::getConfig(EGLint id) {
+    android::Mutex::Autolock mutex(m_lock);
+
+    for(ConfigsList::iterator it = m_configs.begin(); it != m_configs.end() ;it++) {
+        if((*it)->id() == id) {
+            return (*it);
+
+        }
+    }
+    return NULL;
+}
+
+int EglDisplay::getConfigs(EGLConfig* configs,int config_size) {
+    android::Mutex::Autolock mutex(m_lock);
+    int i = 0;
+    for(ConfigsList::iterator it = m_configs.begin(); it != m_configs.end() && i < config_size ;i++,it++) {
+        configs[i] = static_cast<EGLConfig>(*it);
+    }
+    return i;
+}
+
+int EglDisplay::chooseConfigs(const EglConfig& dummy,EGLConfig* configs,int config_size) {
+    android::Mutex::Autolock mutex(m_lock);
+    int added = 0;
+    for(ConfigsList::iterator it = m_configs.begin(); it != m_configs.end() && added < config_size;it++) {
+
+       if( (*it)->choosen(dummy)){
+           configs[added++] = static_cast<EGLConfig>(*it);
+       }
+    }
+    //no need to sort since the configurations are saved already in sorted maner
+    return added;
+}
+
+EGLSurface EglDisplay::addSurface(SurfacePtr s ) {
+    android::Mutex::Autolock mutex(m_lock);
+   unsigned int hndl = s.Ptr()->getHndl();
+   EGLSurface ret =reinterpret_cast<EGLSurface> (hndl);
+
+   if(m_surfaces.find(hndl) != m_surfaces.end()) {
+       return ret;
+   }
+
+   m_surfaces[hndl] = s;
+   return ret;
+}
+
+EGLContext EglDisplay::addContext(ContextPtr ctx ) {
+    android::Mutex::Autolock mutex(m_lock);
+
+   unsigned int hndl = ctx.Ptr()->getHndl();
+   EGLContext ret    = reinterpret_cast<EGLContext> (hndl);
+
+   if(m_contexts.find(hndl) != m_contexts.end()) {
+       return ret;
+   }
+
+   m_contexts[hndl] = ctx;
+   return ret;
+}
diff --git a/tools/emulator/opengl/host/libs/Translator/EGL/EglDisplay.h b/tools/emulator/opengl/host/libs/Translator/EGL/EglDisplay.h
new file mode 100644
index 0000000..9c04cf9
--- /dev/null
+++ b/tools/emulator/opengl/host/libs/Translator/EGL/EglDisplay.h
@@ -0,0 +1,79 @@
+/*
+* 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_DISPLAY_H
+#define EGL_DISPLAY_H
+
+#include <list>
+#include <map>
+#include <EGL/egl.h>
+#include <utils/threads.h>
+#include <GLcommon/SmartPtr.h>
+
+#include "EglConfig.h"
+#include "EglContext.h"
+#include "EglSurface.h"
+#include "EglWindowSurface.h"
+
+
+
+typedef  std::list<EglConfig*>  ConfigsList;
+typedef  std::map< unsigned int,ContextPtr > ContextsHndlMap;
+typedef  std::map< unsigned int,SurfacePtr > SurfacesHndlMap;
+
+class EglDisplay {
+public:
+
+
+    EglDisplay(EGLNativeDisplayType dpy,bool isDefault = true);
+    EGLNativeDisplayType nativeType();
+    int nConfigs(){ return m_configs.size();}
+    int getConfigs(EGLConfig* configs,int config_size);
+    int chooseConfigs(const EglConfig& dummy,EGLConfig* configs,int config_size);
+    EglConfig* getConfig(EGLConfig conf);
+    EglConfig* getConfig(EGLint id );
+
+    EGLSurface addSurface(SurfacePtr s );
+    SurfacePtr getSurface(EGLSurface surface);
+    bool removeSurface(EGLSurface s);
+    bool removeSurface(SurfacePtr s);
+
+    EGLContext addContext(ContextPtr ctx );
+    ContextPtr getContext(EGLContext ctx);
+    bool removeContext(EGLContext ctx);
+    bool removeContext(ContextPtr ctx);
+    ObjectNameManager* getManager(GLESVersion ver){ return &m_manager[ver];}
+
+    ~EglDisplay();
+    void initialize();
+    void terminate();
+    bool isInitialize();
+private:
+   void initConfigurations();
+
+   EGLNativeDisplayType   m_dpy;
+   bool                   m_initialized;
+   bool                   m_configInitialized;
+   bool                   m_isDefault;
+   ConfigsList            m_configs;
+   ContextsHndlMap        m_contexts;
+   SurfacesHndlMap        m_surfaces;
+   ObjectNameManager      m_manager[MAX_GLES_VERSION];
+   android::Mutex m_lock;
+};
+
+#endif
+
+
diff --git a/tools/emulator/opengl/host/libs/Translator/EGL/EglGlobalInfo.cpp b/tools/emulator/opengl/host/libs/Translator/EGL/EglGlobalInfo.cpp
new file mode 100644
index 0000000..23cf52a
--- /dev/null
+++ b/tools/emulator/opengl/host/libs/Translator/EGL/EglGlobalInfo.cpp
@@ -0,0 +1,89 @@
+/*
+* 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.
+*/
+#include "EglGlobalInfo.h"
+#include "EglOsApi.h"
+#include <string.h>
+
+int EglGlobalInfo::m_refCount = 0;
+EglGlobalInfo* EglGlobalInfo::m_singleton = NULL;
+
+
+EglGlobalInfo::EglGlobalInfo(){
+    m_default = EglOS::getDefaultDisplay();
+    memset(m_gles_ifaces,0,sizeof(m_gles_ifaces));
+}
+
+EglGlobalInfo* EglGlobalInfo::getInstance() {
+    if(!m_singleton) {
+        m_singleton = new EglGlobalInfo();
+        m_refCount = 0;
+    }
+    m_refCount++;
+    return m_singleton;
+}
+
+void EglGlobalInfo::delInstance() {
+    m_refCount--;
+    if(m_refCount <= 0 && m_singleton) {
+        delete m_singleton;
+        m_singleton = NULL;
+    }
+
+}
+
+EglDisplay* EglGlobalInfo::addDisplay(EGLNativeDisplayType dpy) {
+    //search if it is not already exists
+    android::Mutex::Autolock mutex(m_lock);
+    for(DisplaysList::iterator it = m_displays.begin(); it != m_displays.end() ;it++) {
+        if((*it)->nativeType() == dpy) return (*it);
+    }
+
+    EglDisplay* p_dpy = new EglDisplay(dpy);
+    if(p_dpy) {
+        m_displays.push_front(p_dpy);
+        return p_dpy;
+    }
+    return NULL;
+}
+
+bool  EglGlobalInfo::removeDisplay(EGLDisplay dpy) {
+
+    android::Mutex::Autolock mutex(m_lock);
+    for(DisplaysList::iterator it = m_displays.begin(); it != m_displays.end() ;it++) {
+        if(static_cast<EGLDisplay>(*it) == dpy) {
+            delete (*it);
+            m_displays.remove(*it);
+            return true;
+        }
+    }
+    return false;
+}
+
+EglDisplay* EglGlobalInfo::getDisplay(EGLNativeDisplayType dpy) {
+    android::Mutex::Autolock mutex(m_lock);
+    for(DisplaysList::iterator it = m_displays.begin(); it != m_displays.end() ;it++) {
+        if((*it)->nativeType() == dpy) return (*it);
+    }
+    return NULL;
+}
+
+EglDisplay* EglGlobalInfo::getDisplay(EGLDisplay dpy) {
+    android::Mutex::Autolock mutex(m_lock);
+    for(DisplaysList::iterator it = m_displays.begin(); it != m_displays.end() ;it++) {
+        if(static_cast<EGLDisplay>(*it) == dpy) return (*it);
+    }
+    return NULL;
+}
diff --git a/tools/emulator/opengl/host/libs/Translator/EGL/EglGlobalInfo.h b/tools/emulator/opengl/host/libs/Translator/EGL/EglGlobalInfo.h
new file mode 100644
index 0000000..5e03e72
--- /dev/null
+++ b/tools/emulator/opengl/host/libs/Translator/EGL/EglGlobalInfo.h
@@ -0,0 +1,61 @@
+/*
+* 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_GLOBAL_INFO
+#define EGL_GLOBAL_INFO
+
+#include <list>
+#include <EGL/egl.h>
+#include <utils/threads.h>
+#include <GLcommon/TranslatorIfaces.h>
+#include "EglDisplay.h"
+#include "EglConfig.h"
+#include "EglContext.h"
+
+typedef std::list<EglDisplay*> DisplaysList;
+
+
+class EglGlobalInfo {
+
+public:
+    EglDisplay* addDisplay(EGLNativeDisplayType dpy);
+    EglDisplay* getDisplay(EGLNativeDisplayType dpy);
+    EglDisplay* getDisplay(EGLDisplay dpy);
+    bool removeDisplay(EGLDisplay dpy);
+    EGLNativeDisplayType getDefaultNativeDisplay(){ return m_default;};
+
+    void setIface(GLESiface* iface,GLESVersion ver) { m_gles_ifaces[ver] = iface;};
+    GLESiface* getIface(GLESVersion ver){ return m_gles_ifaces[ver];}
+
+
+    int  nDisplays() const { return m_displays.size();};
+
+    static EglGlobalInfo* getInstance();
+    static void delInstance();
+
+private:
+    EglGlobalInfo();
+    ~EglGlobalInfo(){};
+
+    static EglGlobalInfo*   m_singleton;
+    static int              m_refCount;
+
+    DisplaysList            m_displays;
+    EGLNativeDisplayType    m_default;
+    GLESiface*              m_gles_ifaces[MAX_GLES_VERSION];
+   android::Mutex m_lock;
+};
+
+#endif
diff --git a/tools/emulator/opengl/host/libs/Translator/EGL/EglImp.cpp b/tools/emulator/opengl/host/libs/Translator/EGL/EglImp.cpp
new file mode 100644
index 0000000..8931811
--- /dev/null
+++ b/tools/emulator/opengl/host/libs/Translator/EGL/EglImp.cpp
@@ -0,0 +1,916 @@
+/*
+* 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.
+*/
+#include <EGL/egl.h>
+#include <dlfcn.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <GLcommon/ThreadInfo.h>
+#include <GLcommon/TranslatorIfaces.h>
+
+#include "EglWindowSurface.h"
+#include "EglPbufferSurface.h"
+#include "EglPixmapSurface.h"
+#include "EglGlobalInfo.h"
+#include "EglThreadInfo.h"
+#include "EglValidate.h"
+#include "EglDisplay.h"
+#include "EglContext.h"
+#include "EglConfig.h"
+#include "EglOsApi.h"
+
+#define MINOR          1
+#define MAJOR          4
+
+EglGlobalInfo* g_eglInfo = EglGlobalInfo::getInstance();
+
+__thread EglThreadInfo*    tls_thread  = NULL;
+static EGLiface            s_eglIface = {
+    getThreadInfo: getThreadInfo      // implemented in ThreadInfo.cpp
+};
+
+//extentions
+typedef struct {
+  const char*                              name;
+  __eglMustCastToProperFunctionPointerType address;
+} EglExtentionDescriptor;
+
+#define EGL_EXTENTIONS 0
+//supported extentions;
+static EglExtentionDescriptor s_extentions[] = {};
+
+//macros for accessing global egl info & tls objects
+
+#define CURRENT_THREAD()                                     \
+        if(!tls_thread) {                                    \
+            tls_thread = new EglThreadInfo();                \
+        }
+
+#define RETURN_ERROR(ret,err)                                \
+        CURRENT_THREAD()                                     \
+        if(tls_thread->getError() == EGL_SUCCESS) {          \
+          tls_thread->setError(err);                         \
+        }                                                    \
+        return ret;
+
+#define VALIDATE_DISPLAY_RETURN(EGLDisplay,ret)              \
+        EglDisplay* dpy = g_eglInfo->getDisplay(EGLDisplay); \
+        if(!dpy){                                            \
+            RETURN_ERROR(ret,EGL_BAD_DISPLAY);               \
+        }                                                    \
+        if(!dpy->isInitialize()) {                           \
+            RETURN_ERROR(ret,EGL_NOT_INITIALIZED);           \
+        }
+
+#define VALIDATE_CONFIG_RETURN(EGLConfig,ret)                \
+        EglConfig* cfg = dpy->getConfig(EGLConfig);          \
+        if(!cfg) {                                           \
+            RETURN_ERROR(ret,EGL_BAD_CONFIG);                \
+        }
+
+#define VALIDATE_SURFACE_RETURN(EGLSurface,ret,varName)      \
+        SurfacePtr varName = dpy->getSurface(EGLSurface);    \
+        if(!varName.Ptr()) {                                 \
+            RETURN_ERROR(ret,EGL_BAD_SURFACE);               \
+        }
+
+#define VALIDATE_CONTEXT_RETURN(EGLContext,ret)              \
+        ContextPtr ctx = dpy->getContext(EGLContext);        \
+        if(!ctx.Ptr()) {                                     \
+            RETURN_ERROR(ret,EGL_BAD_CONTEXT);               \
+        }
+
+#define VALIDATE_DISPLAY(EGLDisplay) \
+        VALIDATE_DISPLAY_RETURN(EGLDisplay,EGL_FALSE)
+
+#define VALIDATE_CONFIG(EGLConfig)   \
+        VALIDATE_CONFIG_RETURN(EGLConfig,EGL_FALSE)
+
+#define VALIDATE_SURFACE(EGLSurface,varName) \
+        VALIDATE_SURFACE_RETURN(EGLSurface,EGL_FALSE,varName)
+
+#define VALIDATE_CONTEXT(EGLContext) \
+        VALIDATE_CONTEXT_RETURN(EGLContext,EGL_FALSE)
+
+EGLAPI EGLint EGLAPIENTRY eglGetError(void) {
+    CURRENT_THREAD();
+    EGLint err = tls_thread->getError();
+    tls_thread->setError(EGL_SUCCESS);
+    return err;
+}
+
+EGLAPI EGLDisplay EGLAPIENTRY eglGetDisplay(EGLNativeDisplayType display_id) {
+    EglDisplay* dpy = NULL;
+
+    if( display_id == EGL_DEFAULT_DISPLAY) {
+        display_id = g_eglInfo->getDefaultNativeDisplay();
+    }
+
+    if ((dpy = g_eglInfo->getDisplay(display_id))) {
+        return dpy;
+    } else {
+        dpy = g_eglInfo->addDisplay(display_id);
+        if(dpy) return dpy;
+        return EGL_NO_DISPLAY;
+    }
+}
+
+
+static __translator_getGLESIfaceFunc loadIfaces(const char* libName){
+    void* libGLES = dlopen(libName, RTLD_NOW);
+    if(!libGLES) return NULL;
+    __translator_getGLESIfaceFunc func =  (__translator_getGLESIfaceFunc)dlsym(libGLES,"__translator_getIfaces");
+    if(!func) return NULL;
+    return func;
+}
+
+EGLAPI EGLBoolean EGLAPIENTRY eglInitialize(EGLDisplay display, EGLint *major, EGLint *minor) {
+    EglDisplay* dpy = g_eglInfo->getDisplay(display);
+    if(!dpy) {
+         RETURN_ERROR(EGL_FALSE,EGL_BAD_DISPLAY);
+    }
+
+    if(major) *major = MAJOR;
+    if(minor) *minor = MINOR;
+
+     if(!g_eglInfo->getIface(GLES_1_1)) {
+        __translator_getGLESIfaceFunc func  = loadIfaces("libGLES_CM_translator.so");
+        if(func){
+            g_eglInfo->setIface(func(&s_eglIface),GLES_1_1);
+        } else {
+           return EGL_FALSE;
+        }
+    }
+    dpy->initialize();
+    return EGL_TRUE;
+}
+
+//TODO check this func definitions later on
+EGLAPI EGLBoolean EGLAPIENTRY eglTerminate(EGLDisplay display) {
+    VALIDATE_DISPLAY(display);
+    dpy->terminate();
+    return EGL_TRUE;
+}
+
+EGLAPI const char * EGLAPIENTRY eglQueryString(EGLDisplay display, EGLint name) {
+    VALIDATE_DISPLAY(display);
+    static const char* vendor     = "Google";
+    static const char* version    = "1.4";
+    static const char* extensions = "EGL_KHR_image_base EGL_KHR_gl_texture_2d_image";  //XXX: Not implemented yet
+    if(!EglValidate::stringName(name)) {
+        RETURN_ERROR(NULL,EGL_BAD_PARAMETER);
+    }
+    switch(name) {
+    case EGL_VENDOR:
+        return vendor;
+    case EGL_VERSION:
+        return version;
+    case EGL_EXTENSIONS:
+        return extensions;
+    }
+    return NULL;
+}
+
+EGLAPI EGLBoolean EGLAPIENTRY eglGetConfigs(EGLDisplay display, EGLConfig *configs,
+             EGLint config_size, EGLint *num_config) {
+    VALIDATE_DISPLAY(display);
+    if(!num_config) {
+        RETURN_ERROR(EGL_FALSE,EGL_BAD_PARAMETER);
+    }
+
+    if(configs == NULL) {
+        *num_config = dpy->nConfigs();
+    } else {
+        *num_config = dpy->getConfigs(configs,config_size);
+    }
+
+    return EGL_TRUE;
+}
+
+EGLAPI EGLBoolean EGLAPIENTRY eglChooseConfig(EGLDisplay display, const EGLint *attrib_list,
+               EGLConfig *configs, EGLint config_size,
+               EGLint *num_config) {
+    VALIDATE_DISPLAY(display);
+    if(!num_config) {
+         RETURN_ERROR(EGL_FALSE,EGL_BAD_PARAMETER);
+    }
+
+        //selection defaults
+        EGLint      surface_type       = EGL_WINDOW_BIT;
+        EGLBoolean  bind_to_tex_rgb    = EGL_DONT_CARE;
+        EGLBoolean  bind_to_tex_rgba   = EGL_DONT_CARE;
+        EGLenum     caveat             = EGL_DONT_CARE;
+        EGLint      config_id          = EGL_DONT_CARE;
+        EGLBoolean  native_renderable  = EGL_DONT_CARE;
+        EGLint      native_visual_type = EGL_DONT_CARE;
+        EGLint      max_swap_interval  = EGL_DONT_CARE;
+        EGLint      min_swap_interval  = EGL_DONT_CARE;
+        EGLint      trans_red_val      = EGL_DONT_CARE;
+        EGLint      trans_green_val    = EGL_DONT_CARE;
+        EGLint      trans_blue_val     = EGL_DONT_CARE;
+        EGLenum     transparent_type   = EGL_NONE;
+        EGLint      buffer_size        = 0;
+        EGLint      red_size           = 0;
+        EGLint      green_size         = 0;
+        EGLint      blue_size          = 0;
+        EGLint      alpha_size         = 0;
+        EGLint      depth_size         = 0;
+        EGLint      frame_buffer_level = 0;
+        EGLint      sample_buffers_num = 0;
+        EGLint      samples_per_pixel  = 0;
+        EGLint      stencil_size       = 0;
+
+    if(!EglValidate::noAttribs(attrib_list)) { //there are attribs
+        int i = 0 ;
+        bool hasConfigId = false;
+        while(attrib_list[i] != EGL_NONE && !hasConfigId) {
+            switch(attrib_list[i]) {
+            case EGL_MAX_PBUFFER_WIDTH:
+            case EGL_MAX_PBUFFER_HEIGHT:
+            case EGL_MAX_PBUFFER_PIXELS:
+            case EGL_NATIVE_VISUAL_ID:
+                continue; //we dont care from those selection crateria
+            case EGL_LEVEL:
+                if(attrib_list[i+1] == EGL_DONT_CARE) {
+                    RETURN_ERROR(EGL_FALSE,EGL_BAD_ATTRIBUTE);
+                }
+                frame_buffer_level = attrib_list[i+1];
+                break;
+            case EGL_BUFFER_SIZE:
+                if(attrib_list[i+1] < 0) {
+                    RETURN_ERROR(EGL_FALSE,EGL_BAD_ATTRIBUTE);
+                }
+                buffer_size = attrib_list[i+1];
+                break;
+            case EGL_RED_SIZE:
+                if(attrib_list[i+1] < 0) {
+                     RETURN_ERROR(EGL_FALSE,EGL_BAD_ATTRIBUTE);
+                }
+                red_size = attrib_list[i+1];
+                break;
+            case EGL_GREEN_SIZE:
+                if(attrib_list[i+1] < 0) {
+                    RETURN_ERROR(EGL_FALSE,EGL_BAD_ATTRIBUTE);
+                }
+                green_size = attrib_list[i+1];
+                break;
+            case EGL_BLUE_SIZE:
+                if(attrib_list[i+1] < 0) {
+                    RETURN_ERROR(EGL_FALSE,EGL_BAD_ATTRIBUTE);
+                }
+                blue_size = attrib_list[i+1];
+                break;
+            case EGL_ALPHA_SIZE:
+                if(attrib_list[i+1] < 0) {
+                    RETURN_ERROR(EGL_FALSE,EGL_BAD_ATTRIBUTE);
+                }
+                alpha_size = attrib_list[i+1];
+                break;
+            case EGL_BIND_TO_TEXTURE_RGB:
+                bind_to_tex_rgb = attrib_list[i+1];
+                break;
+            case EGL_BIND_TO_TEXTURE_RGBA:
+                bind_to_tex_rgba = attrib_list[i+1];
+                break;
+            case EGL_CONFIG_CAVEAT:
+                if(attrib_list[i+1] != EGL_NONE && attrib_list[i+1] != EGL_SLOW_CONFIG && attrib_list[i+1] != EGL_NON_CONFORMANT_CONFIG) {
+                    RETURN_ERROR(EGL_FALSE,EGL_BAD_ATTRIBUTE);
+                }
+                caveat = attrib_list[i+1];
+                break;
+            case EGL_CONFIG_ID:
+                if(attrib_list[i+1] < 0) {
+                    RETURN_ERROR(EGL_FALSE,EGL_BAD_ATTRIBUTE);
+                }
+                config_id = attrib_list[i+1];
+                hasConfigId = true;
+                break;
+            case EGL_DEPTH_SIZE:
+                if(attrib_list[i+1] < 0) {
+                    RETURN_ERROR(EGL_FALSE,EGL_BAD_ATTRIBUTE);
+                }
+                depth_size = attrib_list[i+1];
+                break;
+            case EGL_MAX_SWAP_INTERVAL:
+                if(attrib_list[i+1] < 0) {
+                    RETURN_ERROR(EGL_FALSE,EGL_BAD_ATTRIBUTE);
+                }
+                max_swap_interval = attrib_list[i+1];
+                break;
+            case EGL_MIN_SWAP_INTERVAL:
+                if(attrib_list[i+1] < 0) {
+                    RETURN_ERROR(EGL_FALSE,EGL_BAD_ATTRIBUTE);
+                }
+                min_swap_interval = attrib_list[i+1];
+                break;
+            case EGL_NATIVE_RENDERABLE:
+                native_renderable = attrib_list[i+1];
+                break;
+            case EGL_NATIVE_VISUAL_TYPE:
+                native_visual_type = attrib_list[i+1];
+                break;
+                if(attrib_list[i+1] < 0 || attrib_list[i+1] > 1 ) {
+                    RETURN_ERROR(EGL_FALSE,EGL_BAD_ATTRIBUTE);
+                }
+            case EGL_SAMPLE_BUFFERS:
+                sample_buffers_num = attrib_list[i+1];
+                break;
+                if(attrib_list[i+1] < 0) {
+                    RETURN_ERROR(EGL_FALSE,EGL_BAD_ATTRIBUTE);
+                }
+            case EGL_SAMPLES:
+                if(attrib_list[i+1] < 0) {
+                    RETURN_ERROR(EGL_FALSE,EGL_BAD_ATTRIBUTE);
+                }
+                samples_per_pixel = attrib_list[i+1];
+                break;
+            case EGL_STENCIL_SIZE:
+                if(attrib_list[i+1] < 0) {
+                    RETURN_ERROR(EGL_FALSE,EGL_BAD_ATTRIBUTE);
+                }
+                stencil_size = attrib_list[i+1];
+                break;
+            case EGL_SURFACE_TYPE:
+                surface_type = attrib_list[i+1];
+                break;
+            case EGL_TRANSPARENT_TYPE:
+                if(attrib_list[i+1] != EGL_NONE && attrib_list[i+1] != EGL_TRANSPARENT_RGB ) {
+                    RETURN_ERROR(EGL_FALSE,EGL_BAD_ATTRIBUTE);
+                }
+                transparent_type = attrib_list[i+1];
+                break;
+            case EGL_TRANSPARENT_RED_VALUE:
+                trans_red_val = attrib_list[i+1];
+                break;
+            case EGL_TRANSPARENT_GREEN_VALUE:
+                trans_green_val = attrib_list[i+1];
+                break;
+            case EGL_TRANSPARENT_BLUE_VALUE:
+                trans_blue_val = attrib_list[i+1];
+                break;
+            default:
+                RETURN_ERROR(EGL_FALSE,EGL_BAD_ATTRIBUTE);
+            }
+            i+=2;
+        }
+        if(hasConfigId) {
+           EglConfig* pConfig = dpy->getConfig(config_id);
+           if(pConfig) {
+               configs[0]  = static_cast<EGLConfig>(pConfig);
+               *num_config = 0;
+               return EGL_TRUE;
+           } else {
+                RETURN_ERROR(EGL_FALSE,EGL_BAD_ATTRIBUTE);
+           }
+        }
+    }
+    EglConfig dummy(red_size,green_size,blue_size,alpha_size,caveat,config_id,depth_size,
+                    frame_buffer_level,0,0,0,native_renderable,0,native_visual_type,
+                    samples_per_pixel,stencil_size,surface_type,transparent_type,
+                    trans_red_val,trans_green_val,trans_blue_val);
+    *num_config = dpy->chooseConfigs(dummy,configs,config_size);
+
+
+    return EGL_TRUE;
+}
+
+EGLAPI EGLBoolean EGLAPIENTRY eglGetConfigAttrib(EGLDisplay display, EGLConfig config,
+                  EGLint attribute, EGLint *value) {
+    VALIDATE_DISPLAY(display);
+    VALIDATE_CONFIG(config);
+    if(!EglValidate::confAttrib(attribute)){
+         RETURN_ERROR(EGL_FALSE,EGL_BAD_ATTRIBUTE);
+    }
+    return cfg->getConfAttrib(attribute,value)? EGL_TRUE:EGL_FALSE;
+}
+
+EGLAPI EGLSurface EGLAPIENTRY eglCreateWindowSurface(EGLDisplay display, EGLConfig config,
+                  EGLNativeWindowType win,
+                  const EGLint *attrib_list) {
+    VALIDATE_DISPLAY_RETURN(display,EGL_NO_SURFACE);
+    VALIDATE_CONFIG_RETURN(config,EGL_NO_SURFACE);
+
+    if(!(cfg->surfaceType() & EGL_WINDOW_BIT)) {
+        RETURN_ERROR(EGL_NO_SURFACE,EGL_BAD_MATCH);
+    }
+    if(!EglOS::validNativeWin(win)) {
+        RETURN_ERROR(EGL_NO_SURFACE,EGL_BAD_NATIVE_WINDOW);
+    }
+    if(!EglValidate::noAttribs(attrib_list)) {
+        RETURN_ERROR(EGL_NO_SURFACE,EGL_BAD_ATTRIBUTE);
+    }
+    if(EglWindowSurface::alreadyAssociatedWithConfig(win)) {
+        RETURN_ERROR(EGL_NO_SURFACE,EGL_BAD_ALLOC);
+    }
+
+    unsigned int width,height;
+    if(!EglOS::checkWindowPixelFormatMatch(dpy->nativeType(),win,cfg,&width,&height)) {
+        RETURN_ERROR(EGL_NO_SURFACE,EGL_BAD_ALLOC);
+    }
+    SurfacePtr wSurface(new EglWindowSurface(win,cfg,width,height));
+    if(!wSurface.Ptr()) {
+        RETURN_ERROR(EGL_NO_SURFACE,EGL_BAD_ALLOC);
+    }
+    return dpy->addSurface(wSurface);
+}
+
+EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferSurface(EGLDisplay display, EGLConfig config,
+                   const EGLint *attrib_list) {
+    VALIDATE_DISPLAY_RETURN(display,EGL_NO_SURFACE);
+    VALIDATE_CONFIG_RETURN(config,EGL_NO_SURFACE);
+    if(!(cfg->surfaceType() & EGL_PBUFFER_BIT)) {
+        RETURN_ERROR(EGL_NO_SURFACE,EGL_BAD_MATCH);
+    }
+
+
+    SurfacePtr pbSurface(new EglPbufferSurface(cfg));
+    if(!pbSurface.Ptr()) {
+        RETURN_ERROR(EGL_NO_SURFACE,EGL_BAD_ALLOC);
+    }
+
+    if(!EglValidate::noAttribs(attrib_list)) { //there are attribs
+        int i = 0 ;
+        while(attrib_list[i] != EGL_NONE) {
+            if(!pbSurface.Ptr()->setAttrib(attrib_list[i],attrib_list[i+1])) {
+                RETURN_ERROR(EGL_NO_SURFACE,EGL_BAD_ATTRIBUTE);
+            }
+            i+=2;
+        }
+    }
+
+    EGLint width,height,largest,texTarget,texFormat;
+    EglPbufferSurface* tmpPbSurfacePtr = static_cast<EglPbufferSurface*>(pbSurface.Ptr());
+    tmpPbSurfacePtr->getDim(&width,&height,&largest);
+    tmpPbSurfacePtr->getTexInfo(&texTarget,&texFormat);
+
+    if(!EglValidate::pbufferAttribs(width,height,texFormat == EGL_NO_TEXTURE,texTarget == EGL_NO_TEXTURE)) {
+        //TODO: RETURN_ERROR(EGL_NO_SURFACE,EGL_BAD_VALUE); dont have bad_value
+        RETURN_ERROR(EGL_NO_SURFACE,EGL_BAD_ATTRIBUTE);
+    }
+
+    EGLNativePbufferType pb = EglOS::createPbuffer(dpy->nativeType(),cfg,tmpPbSurfacePtr);
+    if(!pb) {
+        //TODO: RETURN_ERROR(EGL_NO_SURFACE,EGL_BAD_VALUE); dont have bad value
+        RETURN_ERROR(EGL_NO_SURFACE,EGL_BAD_ATTRIBUTE);
+    }
+
+    tmpPbSurfacePtr->setNativePbuffer(pb);
+    return dpy->addSurface(pbSurface);
+}
+
+EGLAPI EGLSurface EGLAPIENTRY eglCreatePixmapSurface(EGLDisplay display, EGLConfig config,
+                  EGLNativePixmapType pixmap,
+                  const EGLint *attrib_list) {
+    VALIDATE_DISPLAY_RETURN(display,EGL_NO_SURFACE);
+    VALIDATE_CONFIG_RETURN(config,EGL_NO_SURFACE);
+    if(!(cfg->surfaceType() & EGL_PIXMAP_BIT)) {
+        RETURN_ERROR(EGL_NO_SURFACE,EGL_BAD_MATCH);
+    }
+    if(!EglValidate::noAttribs(attrib_list)) {
+        RETURN_ERROR(EGL_NO_SURFACE,EGL_BAD_ATTRIBUTE);
+    }
+    if(EglPixmapSurface::alreadyAssociatedWithConfig(pixmap)) {
+        RETURN_ERROR(EGL_NO_SURFACE,EGL_BAD_ALLOC);
+    }
+
+    unsigned int width,height;
+    if(!EglOS::checkPixmapPixelFormatMatch(dpy->nativeType(),pixmap,cfg,&width,&height)) {
+        RETURN_ERROR(EGL_NO_SURFACE,EGL_BAD_ALLOC);
+    }
+    SurfacePtr pixSurface(new EglPixmapSurface(pixmap,cfg));
+    if(!pixSurface.Ptr()) {
+        RETURN_ERROR(EGL_NO_SURFACE,EGL_BAD_ALLOC);
+    }
+
+    return dpy->addSurface(pixSurface);
+}
+
+static bool destroySurfaceIfNotCurrent(EglDisplay* dpy,SurfacePtr surface) {
+
+    ThreadInfo* thread  = getThreadInfo();
+    EglContext* currCtx = static_cast<EglContext*>(thread->eglContext);
+    if(currCtx && !currCtx->usingSurface(surface)){
+        if(surface.Ptr()->type() == EglSurface::PBUFFER) {
+            EglOS::releasePbuffer(dpy->nativeType(),reinterpret_cast<EGLNativePbufferType>(surface.Ptr()->native()));
+            return true;
+        }
+    }
+    return false;
+}
+EGLAPI EGLBoolean EGLAPIENTRY eglDestroySurface(EGLDisplay display, EGLSurface surface) {
+    VALIDATE_DISPLAY(display);
+    SurfacePtr srfc = dpy->getSurface(surface);
+    if(!srfc.Ptr()) {
+        RETURN_ERROR(EGL_FALSE,EGL_BAD_SURFACE);
+    }
+
+    srfc.Ptr()->destroy(); //mark surface for destruction
+    if(destroySurfaceIfNotCurrent(dpy,srfc)) { //removes surface from the list if not current
+        dpy->removeSurface(surface);
+    }
+    return EGL_TRUE;
+}
+
+EGLAPI EGLBoolean EGLAPIENTRY eglQuerySurface(EGLDisplay display, EGLSurface surface,
+               EGLint attribute, EGLint *value) {
+   VALIDATE_DISPLAY(display);
+   VALIDATE_SURFACE(surface,srfc);
+
+   if(!srfc.Ptr()->getAttrib(attribute,value)) {
+       RETURN_ERROR(EGL_FALSE,EGL_BAD_ATTRIBUTE);
+   }
+   return EGL_TRUE;
+}
+
+EGLAPI EGLBoolean EGLAPIENTRY eglSurfaceAttrib(EGLDisplay display, EGLSurface surface,
+                EGLint attribute, EGLint value) {
+   VALIDATE_DISPLAY(display);
+   VALIDATE_SURFACE(surface,srfc);
+   if(!srfc.Ptr()->setAttrib(attribute,value)) {
+       RETURN_ERROR(EGL_FALSE,EGL_BAD_ATTRIBUTE);
+   }
+   return EGL_TRUE;
+}
+
+EGLAPI EGLContext EGLAPIENTRY eglCreateContext(EGLDisplay display, EGLConfig config,
+                EGLContext share_context,
+                const EGLint *attrib_list) {
+    VALIDATE_DISPLAY_RETURN(display,EGL_NO_CONTEXT);
+    VALIDATE_CONFIG_RETURN(config,EGL_NO_CONTEXT);
+
+    GLESVersion version = GLES_1_1;
+    if(!EglValidate::noAttribs(attrib_list)) {
+        int i = 0;
+        while(attrib_list[i] != EGL_NONE) {
+            switch(attrib_list[i]) {
+            case EGL_CONTEXT_CLIENT_VERSION:
+                if(attrib_list[i+1] == 2) {
+                    version = GLES_2_0;
+                } else {
+                    version = GLES_1_1;
+                }
+                break;
+            default:
+                RETURN_ERROR(EGL_NO_CONTEXT,EGL_BAD_ATTRIBUTE);
+            }
+            i+=2;
+        }
+    }
+    GLESiface* iface = g_eglInfo->getIface(version);
+    GLEScontext* glesCtx = NULL;
+    if(iface) {
+        glesCtx = iface->createGLESContext();
+    } else { // there is no interface for this gles version
+                RETURN_ERROR(EGL_NO_CONTEXT,EGL_BAD_ATTRIBUTE);
+    }
+
+    ContextPtr sharedCtxPtr;
+    EGLNativeContextType nativeShared = NULL;
+    if(share_context != EGL_NO_CONTEXT) {
+        sharedCtxPtr = dpy->getContext(share_context);
+        if(!sharedCtxPtr.Ptr()) {
+            RETURN_ERROR(EGL_NO_CONTEXT,EGL_BAD_CONTEXT);
+        }
+        nativeShared = sharedCtxPtr->nativeType();
+    }
+
+    EGLNativeContextType nativeContext = EglOS::createContext(dpy->nativeType(),cfg,nativeShared);
+    if(nativeContext) {
+        ContextPtr ctx(new EglContext(nativeContext,sharedCtxPtr,cfg,glesCtx,version,dpy->getManager(version)));
+        return dpy->addContext(ctx);
+    } else {
+        iface->deleteGLESContext(glesCtx);
+    }
+ 
+
+return EGL_NO_CONTEXT;
+}
+
+static bool destroyContextIfNotCurrent(EglDisplay* dpy,ContextPtr ctx ) {
+    ThreadInfo* thread  = getThreadInfo();
+    EglContext* currCtx = static_cast<EglContext*>(thread->eglContext);
+  if(ctx.Ptr() != currCtx ){
+      EglOS::destroyContext(dpy->nativeType(),ctx.Ptr()->nativeType());
+      return true;
+  }
+  return false;
+}
+
+EGLAPI EGLBoolean EGLAPIENTRY eglDestroyContext(EGLDisplay display, EGLContext context) {
+    VALIDATE_DISPLAY(display);
+    VALIDATE_CONTEXT(context);
+
+    ctx.Ptr()->destroy(); //mark for destruction
+    if(destroyContextIfNotCurrent(dpy,ctx)){ //removes the context from the list if it is not current
+        g_eglInfo->getIface(ctx.Ptr()->version())->deleteGLESContext(ctx.Ptr()->getGlesContext());
+        dpy->removeContext(context);
+    }
+    return EGL_TRUE;
+}
+
+EGLAPI EGLBoolean EGLAPIENTRY eglMakeCurrent(EGLDisplay display, EGLSurface draw,
+              EGLSurface read, EGLContext context) {
+    VALIDATE_DISPLAY(display);
+
+    bool releaseContext = EglValidate::releaseContext(context,read,draw);
+    if(!releaseContext && EglValidate::badContextMatch(context,read,draw)) {
+        RETURN_ERROR(EGL_FALSE,EGL_BAD_MATCH);
+    }
+
+    VALIDATE_CONTEXT(context);
+    VALIDATE_SURFACE(draw,newDrawSrfc);
+    VALIDATE_SURFACE(read,newReadSrfc);
+
+    EglSurface* newDrawPtr = newDrawSrfc.Ptr();
+    EglSurface* newReadPtr = newReadSrfc.Ptr();
+    EglContext* newCtx     = ctx.Ptr();
+    ThreadInfo* thread     = getThreadInfo();
+    EglContext* prevCtx    = static_cast<EglContext*>(thread->eglContext);
+
+    if(releaseContext) { //releasing current context
+       if(prevCtx) {
+           g_eglInfo->getIface(prevCtx->version())->flush();
+           if(!EglOS::makeCurrent(dpy->nativeType(),NULL,NULL,NULL)) {
+               RETURN_ERROR(EGL_FALSE,EGL_BAD_ACCESS);
+           }
+           thread->updateInfo(newCtx,dpy,NULL,newCtx->getShareGroup(),dpy->getManager(newCtx->version()));
+           ctx.Ptr()->setSurfaces(SurfacePtr(NULL),SurfacePtr(NULL));
+       }
+    } else { //assining new context
+        //surfaces compitability check
+        if(!((*ctx->getConfig()).compitableWith((*newDrawPtr->getConfig()))) ||
+           !((*ctx->getConfig()).compitableWith((*newReadPtr->getConfig())))) {
+            RETURN_ERROR(EGL_FALSE,EGL_BAD_MATCH);
+        }
+
+        //checking native window validity
+        if(newReadPtr->type() == EglSurface::WINDOW && !EglOS::validNativeWin(reinterpret_cast<EGLNativeWindowType>(newReadPtr->native()))) {
+            RETURN_ERROR(EGL_FALSE,EGL_BAD_NATIVE_WINDOW);
+        }
+        if(newDrawPtr->type() == EglSurface::WINDOW && !EglOS::validNativeWin(reinterpret_cast<EGLNativeWindowType>(newDrawPtr->native()))) {
+            RETURN_ERROR(EGL_FALSE,EGL_BAD_NATIVE_WINDOW);
+        }
+
+        //checking native pixmap validity
+        if(newReadPtr->type() == EglSurface::PIXMAP && !EglOS::validNativePixmap(reinterpret_cast<EGLNativePixmapType>(newReadPtr->native()))) {
+            RETURN_ERROR(EGL_FALSE,EGL_BAD_NATIVE_PIXMAP);
+        }
+        if(newDrawPtr->type() == EglSurface::PIXMAP && !EglOS::validNativePixmap(reinterpret_cast<EGLNativePixmapType>(newDrawPtr->native()))) {
+            RETURN_ERROR(EGL_FALSE,EGL_BAD_NATIVE_PIXMAP);
+        }
+        if(prevCtx) {
+            g_eglInfo->getIface(prevCtx->version())->flush();
+        }
+        if(!EglOS::makeCurrent(dpy->nativeType(),newReadPtr,newDrawPtr,newCtx->nativeType())) {
+               RETURN_ERROR(EGL_FALSE,EGL_BAD_ACCESS);
+        }
+        //TODO: handle the following errors
+        // EGL_BAD_CURRENT_SURFACE , EGL_CONTEXT_LOST  , EGL_BAD_ACCESS
+
+        thread->updateInfo(newCtx,dpy,newCtx->getGlesContext(),newCtx->getShareGroup(),dpy->getManager(newCtx->version()));
+        newCtx->setSurfaces(newReadSrfc,newDrawSrfc);
+        g_eglInfo->getIface(newCtx->version())->initContext(newCtx->getGlesContext());
+    }
+
+    SurfacePtr  prevRead;
+    SurfacePtr  prevDraw;
+    //removing terminated surfaces & context
+    if(prevCtx) {
+        prevRead = prevCtx->read();
+        if(prevRead.Ptr()->destroy()){
+            if(destroySurfaceIfNotCurrent(dpy,prevRead)) { //removes surface from the list if not current
+                dpy->removeSurface(prevRead);
+            }
+        }
+        prevDraw = prevCtx->draw();
+        if(prevDraw.Ptr()->destroy()){
+            if(destroySurfaceIfNotCurrent(dpy,prevDraw)) { //removes surface from the list if not current
+                dpy->removeSurface(prevDraw);
+            }
+        }
+
+        if(prevCtx->destroy()) {
+           ContextPtr prevCtxPtr = ContextPtr(prevCtx);
+           if(destroyContextIfNotCurrent(dpy,prevCtxPtr)){ //removes the context from the list if it is not current
+                g_eglInfo->getIface(prevCtx->version())->deleteGLESContext(prevCtx->getGlesContext());
+                dpy->removeContext(prevCtxPtr);
+           }
+        }
+    }
+    return EGL_TRUE;
+}
+
+EGLAPI EGLBoolean EGLAPIENTRY eglQueryContext(EGLDisplay display, EGLContext context,
+               EGLint attribute, EGLint *value) {
+    VALIDATE_DISPLAY(display);
+    VALIDATE_CONTEXT(context);
+
+    if(!ctx->getAttrib(attribute,value)){
+        RETURN_ERROR(EGL_FALSE,EGL_BAD_ATTRIBUTE);
+    }
+    return EGL_TRUE;
+}
+
+EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffers(EGLDisplay display, EGLSurface surface) {
+    VALIDATE_DISPLAY(display);
+    VALIDATE_SURFACE(surface,Srfc);
+    ThreadInfo* thread        = getThreadInfo();
+    EglContext* currentCtx    = static_cast<EglContext*>(thread->eglContext);
+
+
+    //if surface not window return
+    if(Srfc.Ptr()->type() != EglSurface::WINDOW){
+        RETURN_ERROR(EGL_TRUE,EGL_SUCCESS);
+    }
+
+    if(!currentCtx || !currentCtx->usingSurface(Srfc) || !EglOS::validNativeWin(reinterpret_cast<EGLNativeWindowType>(Srfc.Ptr()->native()))) {
+        RETURN_ERROR(EGL_FALSE,EGL_BAD_SURFACE);
+    }
+
+    EglOS::swapBuffers(dpy->nativeType(),reinterpret_cast<EGLNativeWindowType>(Srfc.Ptr()->native()));
+    return EGL_TRUE;
+}
+
+EGLAPI EGLBoolean EGLAPIENTRY eglSwapInterval(EGLDisplay display, EGLint interval) {
+    VALIDATE_DISPLAY(display);
+    ThreadInfo* thread  = getThreadInfo();
+    EglContext* currCtx = static_cast<EglContext*>(thread->eglContext);
+    if(currCtx) {
+        if(!currCtx->read().Ptr() || !currCtx->draw().Ptr() || currCtx->draw().Ptr()->type()!=EglSurface::WINDOW) {
+            RETURN_ERROR(EGL_FALSE,EGL_BAD_CURRENT_SURFACE);
+        }
+        EglOS::swapInterval(dpy->nativeType(),reinterpret_cast<EGLNativeWindowType>(currCtx->draw().Ptr()->native()),interval);
+    } else {
+            RETURN_ERROR(EGL_FALSE,EGL_BAD_SURFACE);
+    }
+    return EGL_TRUE;
+}
+
+
+EGLAPI EGLContext EGLAPIENTRY eglGetCurrentContext(void) {
+    ThreadInfo* thread = getThreadInfo();
+    EglDisplay* dpy    = static_cast<EglDisplay*>(thread->eglDisplay);
+    EglContext* ctx    = static_cast<EglContext*>(thread->eglContext);
+    if(dpy && ctx){
+        return dpy->getContext(ContextPtr(ctx));
+    }
+    return EGL_NO_CONTEXT;
+}
+
+EGLAPI EGLSurface EGLAPIENTRY eglGetCurrentSurface(EGLint readdraw) {
+    if(!EglValidate::surfaceTarget(readdraw)) return EGL_NO_SURFACE;
+
+    ThreadInfo* thread = getThreadInfo();
+    EglDisplay* dpy    = static_cast<EglDisplay*>(thread->eglDisplay);
+    EglContext* ctx    = static_cast<EglContext*>(thread->eglContext);
+
+    if(dpy && ctx) {
+        SurfacePtr surface = readdraw == EGL_READ ? ctx->read() : ctx->draw();
+        return dpy->getSurface(surface);
+    }
+    return EGL_NO_SURFACE;
+}
+
+EGLAPI EGLDisplay EGLAPIENTRY eglGetCurrentDisplay(void) {
+    ThreadInfo* thread     = getThreadInfo();
+    return (thread->eglContext) ? thread->eglDisplay : EGL_NO_DISPLAY;
+}
+
+EGLAPI EGLBoolean EGLAPIENTRY eglWaitGL(void) {
+    EGLenum api = eglQueryAPI();
+    eglBindAPI(EGL_OPENGL_ES_API);
+    return eglWaitClient();
+}
+
+EGLAPI EGLBoolean EGLAPIENTRY eglWaitNative(EGLint engine) {
+    if(!EglValidate::engine(engine)) {
+        RETURN_ERROR(EGL_FALSE,EGL_BAD_PARAMETER);
+    }
+    ThreadInfo* thread  = getThreadInfo();
+    EglContext* currCtx = static_cast<EglContext*>(thread->eglContext);
+    if(currCtx) {
+        EglSurface* read = currCtx->read().Ptr();
+        EglSurface* draw = currCtx->read().Ptr();
+
+        if(read) {
+            if(read->type() == EglSurface::WINDOW &&
+               !EglOS::validNativeWin(reinterpret_cast<EGLNativeWindowType>(read->native()))) {
+                RETURN_ERROR(EGL_FALSE,EGL_BAD_SURFACE);
+            }
+            if(read->type() == EglSurface::PIXMAP &&
+               !EglOS::validNativePixmap(reinterpret_cast<EGLNativePixmapType>(read->native()))) {
+                RETURN_ERROR(EGL_FALSE,EGL_BAD_SURFACE);
+            }
+        }
+        if(draw) {
+            if(draw->type() == EglSurface::WINDOW &&
+               !EglOS::validNativeWin(reinterpret_cast<EGLNativeWindowType>(draw->native()))) {
+                RETURN_ERROR(EGL_FALSE,EGL_BAD_SURFACE);
+            }
+            if(draw->type() == EglSurface::PIXMAP &&
+               !EglOS::validNativePixmap(reinterpret_cast<EGLNativePixmapType>(draw->native()))) {
+                RETURN_ERROR(EGL_FALSE,EGL_BAD_SURFACE);
+            }
+        }
+    }
+    EglOS::waitNative();
+    return EGL_TRUE;
+}
+
+EGLAPI EGLBoolean EGLAPIENTRY eglBindAPI(EGLenum api) {
+    if(!EglValidate::supportedApi(api)) {
+        RETURN_ERROR(EGL_FALSE,EGL_BAD_PARAMETER);
+    }
+    CURRENT_THREAD();
+    tls_thread->setApi(api);
+    return EGL_TRUE;
+}
+
+EGLAPI EGLenum EGLAPIENTRY eglQueryAPI(void) {
+    CURRENT_THREAD();
+    return tls_thread->getApi();
+}
+
+EGLAPI EGLBoolean EGLAPIENTRY eglWaitClient(void) {
+    ThreadInfo* thread  = getThreadInfo();
+    EglContext* currCtx = static_cast<EglContext*>(thread->eglContext);
+    if(currCtx) {
+        if(!currCtx->read().Ptr() || !currCtx->draw().Ptr()) {
+            RETURN_ERROR(EGL_FALSE,EGL_BAD_CURRENT_SURFACE);
+        }
+        g_eglInfo->getIface(currCtx->version())->finish();
+    }
+    return EGL_TRUE;
+}
+
+EGLAPI EGLBoolean EGLAPIENTRY eglReleaseThread(void) {
+    ThreadInfo* thread  = getThreadInfo();
+    EglDisplay* dpy     = static_cast<EglDisplay*>(thread->eglDisplay);
+    return eglMakeCurrent(dpy,EGL_NO_SURFACE,EGL_NO_SURFACE,EGL_NO_CONTEXT);
+}
+
+EGLAPI __eglMustCastToProperFunctionPointerType EGLAPIENTRY
+       eglGetProcAddress(const char *procname){
+    if(!strncmp(procname,"egl",3)) { //EGL proc
+        for(int i=0;i < EGL_EXTENSIONS;i++){
+            if(strcmp(procname,s_extentions[i].name) == 0){
+                return s_extentions[i].address;
+            }
+        }
+    } else if (!strncmp(procname,"gl",2)){ //GL proc
+        //TODO:call glGetProcAdress
+    }
+    return NULL;
+}
+//not supported for now
+/************************* NOT SUPPORTED FOR NOW ***********************/
+EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferFromClientBuffer(
+          EGLDisplay display, EGLenum buftype, EGLClientBuffer buffer,
+          EGLConfig config, const EGLint *attrib_list) {
+    VALIDATE_DISPLAY(display);
+    VALIDATE_CONFIG(config);
+    //we do not support for now openVG, and the only client API resources which may be bound in this fashion are OpenVG
+    RETURN_ERROR(EGL_NO_SURFACE,EGL_BAD_PARAMETER);
+}
+
+EGLAPI EGLBoolean EGLAPIENTRY eglCopyBuffers(EGLDisplay display, EGLSurface surface,
+              EGLNativePixmapType target) {
+    VALIDATE_DISPLAY(display);
+    VALIDATE_SURFACE(surface,srfc);
+    if(!EglOS::validNativePixmap(target)) {
+        RETURN_ERROR(EGL_FALSE,EGL_BAD_NATIVE_PIXMAP);
+    }
+
+    //we do not need to support this for android , since we are not gonna use pixmaps
+    RETURN_ERROR(EGL_FALSE,EGL_BAD_NATIVE_PIXMAP);
+}
+
+/***********************************************************************/
+
+
+//do last ( only if needed)
+/*********************************************************************************************************/
+EGLAPI EGLBoolean EGLAPIENTRY eglBindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer) {
+//TODO:
+return 0;
+}
+
+EGLAPI EGLBoolean EGLAPIENTRY eglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer) {
+//TODO:
+return 0;
+}
+/*********************************************************************************************************/
+
+
diff --git a/tools/emulator/opengl/host/libs/Translator/EGL/EglMacApi.cpp b/tools/emulator/opengl/host/libs/Translator/EGL/EglMacApi.cpp
new file mode 100644
index 0000000..e7f92ba
--- /dev/null
+++ b/tools/emulator/opengl/host/libs/Translator/EGL/EglMacApi.cpp
@@ -0,0 +1,79 @@
+
+/*
+* 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.
+*/
+#include "EglOsApi.h"
+
+
+//TODO: implementation for mac for all funcs
+namespace EglOS {
+
+EGLNativeDisplayType getDefaultDisplay() {return NULL}
+
+bool releaseDisplay(EGLNativeDisplayType dpy) {
+    return false;
+}
+
+EglConfig* pixelFormatToConfig(EGLNativeDisplayType dpy,EGLNativePixelFormatType* frmt){
+    return NULL;
+}
+
+void queryConfigs(EGLNativeDisplayType dpy,ConfigsList& listOut) {
+}
+
+bool validNativeWin(EGLNativeWindowType win) {
+   return true;
+}
+
+bool validNativePixmap(EGLNativePixmapType pix) {
+   return true;
+}
+
+bool checkWindowPixelFormatMatch(EGLNativeDisplayType dpy,EGLNativeWindowType win,EglConfig* cfg,unsigned int* width,unsigned int* height) {
+    return false;
+}
+
+bool checkPixmapPixelFormatMatch(EGLNativeDisplayType dpy,EGLNativePixmapType pix,EglConfig* cfg,unsigned int* width,unsigned int* height) {
+    return false;
+}
+
+EGLNativePbufferType createPbuffer(EGLNativeDisplayType dpy,EglConfig* cfg,EglPbufferSurface* srfc){
+    return NULL;
+}
+
+EGLNativeContextType createContext(EGLNativeDisplayType dpy,EglConfig* cfg,EGLNativeContextType sharedContext) {
+ return NULL;
+}
+
+bool destroyContext(EGLNativeDisplayType dpy,EGLNativeContextType ctx) {
+    return false;
+}
+
+
+
+bool makeCurrent(EGLNativeDisplayType dpy,EglSurface* read,EglSurface* draw,EGLNativeContextType ctx){
+    return false;
+}
+
+void swapBuffers(EGLNativeDisplayType dpy,EGLNativeWindowType win) {
+}
+
+void waitNative() {
+}
+
+void swapInterval(EGLNativeDisplayType dpy,EGLNativeWindowType win,int interval){
+}
+
+};
diff --git a/tools/emulator/opengl/host/libs/Translator/EGL/EglOsApi.h b/tools/emulator/opengl/host/libs/Translator/EGL/EglOsApi.h
new file mode 100644
index 0000000..6bd2b76
--- /dev/null
+++ b/tools/emulator/opengl/host/libs/Translator/EGL/EglOsApi.h
@@ -0,0 +1,49 @@
+/*
+* 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_OS_API_H
+#define EGL_OS_API_H
+
+#include <EGL/egl.h>
+#include <GL/gl.h>
+#include "EglConfig.h"
+#include "EglDisplay.h"
+#include "EglPbufferSurface.h"
+
+#define PBUFFER_MAX_WIDTH  32767
+#define PBUFFER_MAX_HEIGHT 32767
+#define PBUFFER_MAX_PIXELS 32767*32767
+
+namespace EglOS{
+
+    void queryConfigs(EGLNativeDisplayType dpy,ConfigsList& listOut);
+    bool releasePbuffer(EGLNativeDisplayType dis,EGLNativePbufferType pb);
+    bool destroyContext(EGLNativeDisplayType dpy,EGLNativeContextType ctx);
+    bool releaseDisplay(EGLNativeDisplayType dpy);
+    bool validNativeWin(EGLNativeWindowType win);
+    bool validNativePixmap(EGLNativePixmapType pix);
+    bool checkWindowPixelFormatMatch(EGLNativeDisplayType dpy,EGLNativeWindowType win,EglConfig* cfg,unsigned int* width,unsigned int* height);
+    bool checkPixmapPixelFormatMatch(EGLNativeDisplayType dpy,EGLNativePixmapType pix,EglConfig* cfg,unsigned int* width,unsigned int* height);
+    bool makeCurrent(EGLNativeDisplayType dpy,EglSurface* read,EglSurface* draw,EGLNativeContextType);
+    void swapBuffers(EGLNativeDisplayType dpy,EGLNativeWindowType win);
+    void swapInterval(EGLNativeDisplayType dpy,EGLNativeWindowType win,int interval);
+    void waitNative();
+
+    EGLNativeDisplayType getDefaultDisplay();
+    EGLNativePbufferType createPbuffer(EGLNativeDisplayType dpy,EglConfig* cfg,EglPbufferSurface* pb);
+    EGLNativeContextType createContext(EGLNativeDisplayType dpy,EglConfig* cfg,EGLNativeContextType sharedContext);
+};
+
+#endif
diff --git a/tools/emulator/opengl/host/libs/Translator/EGL/EglPbufferSurface.cpp b/tools/emulator/opengl/host/libs/Translator/EGL/EglPbufferSurface.cpp
new file mode 100644
index 0000000..8bcb31a
--- /dev/null
+++ b/tools/emulator/opengl/host/libs/Translator/EGL/EglPbufferSurface.cpp
@@ -0,0 +1,75 @@
+/*
+* 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.
+*/
+#include "EglPbufferSurface.h"
+
+bool EglPbufferSurface::setAttrib(EGLint attrib,EGLint val) {
+    switch(attrib) {
+    case EGL_WIDTH:
+        if(val < 0) return false;
+        m_width = val;
+        break;
+    case EGL_HEIGHT:
+        if(val < 0) return false;
+        m_height = val;
+        break;
+    case EGL_LARGEST_PBUFFER:
+        m_largest = val;
+        break;
+    case EGL_TEXTURE_FORMAT:
+        if(val != EGL_NO_TEXTURE && val != EGL_TEXTURE_RGB && val != EGL_TEXTURE_RGBA) return false;
+        m_texFormat = val;
+        break;
+    case EGL_TEXTURE_TARGET:
+        if(val != EGL_NO_TEXTURE && val != EGL_TEXTURE_2D) return false;
+        m_texTarget = val;
+        break;
+    case EGL_MIPMAP_TEXTURE:
+        m_texMipmap = val;
+        break;
+    default:
+        return false;
+    }
+    return true;
+}
+
+bool EglPbufferSurface::getAttrib(EGLint attrib,EGLint* val) {
+    switch(attrib) {
+    case EGL_CONFIG_ID:
+        *val = m_config->id();
+        break;
+    case EGL_WIDTH:
+        *val = m_width;
+        break;
+    case EGL_HEIGHT:
+        *val = m_height;
+        break;
+    case EGL_LARGEST_PBUFFER:
+        *val = m_largest;
+        break;
+    case EGL_TEXTURE_FORMAT:
+        *val = m_texFormat;
+        break;
+    case EGL_TEXTURE_TARGET:
+        *val = m_texTarget;
+        break;
+    case EGL_MIPMAP_TEXTURE:
+        *val = m_texMipmap;
+        break;
+    default:
+        return false;
+    }
+    return true;
+}
diff --git a/tools/emulator/opengl/host/libs/Translator/EGL/EglPbufferSurface.h b/tools/emulator/opengl/host/libs/Translator/EGL/EglPbufferSurface.h
new file mode 100644
index 0000000..9706714
--- /dev/null
+++ b/tools/emulator/opengl/host/libs/Translator/EGL/EglPbufferSurface.h
@@ -0,0 +1,49 @@
+/*
+* 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_PBUFFER_SURFACE_H
+#define EGL_PBUFFER_SURFACE_H
+
+#include "EglSurface.h"
+
+class EglPbufferSurface:public EglSurface {
+public:
+    EglPbufferSurface(EglConfig* config):EglSurface(PBUFFER,config,0,0),
+                                         m_texFormat(EGL_NO_TEXTURE),
+                                         m_texTarget(EGL_NO_TEXTURE),
+                                         m_texMipmap(EGL_FALSE),
+                                         m_largest(EGL_FALSE),
+                                         m_nativePbuffer(0){};
+
+    void* native(){ return (void*)m_nativePbuffer;};
+    void  setNativePbuffer(EGLNativePbufferType pb){ m_nativePbuffer = pb;};
+    bool  setAttrib(EGLint attrib,EGLint val);
+    bool  getAttrib(EGLint attrib,EGLint* val);
+    void  getDim(EGLint* width,EGLint* height,EGLint* largest){
+                                                              *width = m_width;
+                                                              *height = m_height;
+                                                              *largest = m_largest;
+                                                             };
+
+    void getTexInfo(EGLint* format,EGLint* target){ *format = m_texFormat; *target = m_texTarget;}
+
+private:
+    EGLint               m_texFormat;
+    EGLint               m_texTarget;
+    EGLint               m_texMipmap;
+    EGLint               m_largest;
+    EGLNativePbufferType m_nativePbuffer;
+};
+#endif
diff --git a/tools/emulator/opengl/host/libs/Translator/EGL/EglPixmapSurface.cpp b/tools/emulator/opengl/host/libs/Translator/EGL/EglPixmapSurface.cpp
new file mode 100644
index 0000000..37fdc12
--- /dev/null
+++ b/tools/emulator/opengl/host/libs/Translator/EGL/EglPixmapSurface.cpp
@@ -0,0 +1,53 @@
+/*
+* 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.
+*/
+#include "EglPixmapSurface.h"
+
+std::set<EGLNativePixmapType> EglPixmapSurface::s_associatedPixmaps;
+
+bool EglPixmapSurface::alreadyAssociatedWithConfig(EGLNativePixmapType pix) {
+    return s_associatedPixmaps.find(pix) != s_associatedPixmaps.end();
+
+}
+
+EglPixmapSurface::EglPixmapSurface(EGLNativePixmapType pix,EglConfig* config):EglSurface(PIXMAP,config,0,0),m_pixmap(pix) {
+    s_associatedPixmaps.insert(pix);
+}
+
+EglPixmapSurface::~EglPixmapSurface() {
+    s_associatedPixmaps.erase(m_pixmap);
+}
+
+bool EglPixmapSurface::getAttrib(EGLint attrib,EGLint* val) {
+    switch(attrib) {
+    case EGL_CONFIG_ID:
+        *val = m_config->id();
+        break;
+    case EGL_WIDTH:
+        *val = m_width;
+        break;
+    case EGL_HEIGHT:
+        *val = m_height;
+        break;
+    case EGL_LARGEST_PBUFFER:
+    case EGL_TEXTURE_FORMAT:
+    case EGL_TEXTURE_TARGET:
+    case EGL_MIPMAP_TEXTURE:
+        break;
+    default:
+        return false;
+    }
+    return true;
+}
diff --git a/tools/emulator/opengl/host/libs/Translator/EGL/EglPixmapSurface.h b/tools/emulator/opengl/host/libs/Translator/EGL/EglPixmapSurface.h
new file mode 100644
index 0000000..4a07327
--- /dev/null
+++ b/tools/emulator/opengl/host/libs/Translator/EGL/EglPixmapSurface.h
@@ -0,0 +1,36 @@
+/*
+* 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_PIXMAP_SURFACE_H
+#define EGL_PIXMAP_SURFACE_H
+
+#include <set>
+#include <EGL/egl.h>
+#include "EglSurface.h"
+
+class EglPixmapSurface: public EglSurface {
+public:
+    EglPixmapSurface(EGLNativePixmapType pix,EglConfig* config);
+    ~EglPixmapSurface();
+
+    void* native(){ return (void*)m_pixmap;};
+    bool getAttrib(EGLint attrib,EGLint* val);
+
+    static bool alreadyAssociatedWithConfig(EGLNativePixmapType pix);
+private:
+   EGLNativePixmapType m_pixmap;
+   static std::set<EGLNativeWindowType> s_associatedPixmaps;
+};
+#endif
diff --git a/tools/emulator/opengl/host/libs/Translator/EGL/EglSurface.cpp b/tools/emulator/opengl/host/libs/Translator/EGL/EglSurface.cpp
new file mode 100644
index 0000000..2de2432
--- /dev/null
+++ b/tools/emulator/opengl/host/libs/Translator/EGL/EglSurface.cpp
@@ -0,0 +1,33 @@
+/*
+* 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.
+*/
+#include "EglSurface.h"
+
+unsigned int EglSurface::s_nextSurfaceHndl = 0;
+
+bool  EglSurface::setAttrib(EGLint attrib,EGLint val) {
+    switch(attrib) {
+    case EGL_WIDTH:
+    case EGL_HEIGHT:
+    case EGL_LARGEST_PBUFFER:
+    case EGL_TEXTURE_FORMAT:
+    case EGL_TEXTURE_TARGET:
+    case EGL_MIPMAP_TEXTURE:
+        break;
+    default:
+        return false;
+    }
+    return true;
+}
diff --git a/tools/emulator/opengl/host/libs/Translator/EGL/EglSurface.h b/tools/emulator/opengl/host/libs/Translator/EGL/EglSurface.h
new file mode 100644
index 0000000..204bbc6
--- /dev/null
+++ b/tools/emulator/opengl/host/libs/Translator/EGL/EglSurface.h
@@ -0,0 +1,62 @@
+/*
+* 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_SURFACE_H
+#define EGL_SURFACE_H
+
+#include <EGL/egl.h>
+#include <map>
+#include <GLcommon/SmartPtr.h>
+
+#include "EglConfig.h"
+
+class EglSurface;
+
+typedef  SmartPtr<EglSurface> SurfacePtr;
+
+class EglSurface {
+public:
+    typedef enum {
+                  WINDOW  = 0,
+                  PBUFFER = 1,
+                  PIXMAP  = 3
+                 } ESurfaceType;
+  ESurfaceType  type(){ return m_type;};
+  virtual void* native() = 0;
+  virtual bool  setAttrib(EGLint attrib,EGLint val);
+  virtual bool  getAttrib(EGLint attrib,EGLint* val) = 0;
+  void          setDim(int width,int height){ m_width = width; m_height = height;};
+  void          markForDestruction(){m_destroy = true;};
+  bool          destroy(){return m_destroy;};
+  EglConfig*    getConfig(){return m_config;};
+  unsigned int  getHndl(){return m_hndl;};
+
+private:
+    static unsigned int   s_nextSurfaceHndl;
+    ESurfaceType          m_type;
+    bool                  m_destroy;
+    unsigned int          m_hndl;
+
+protected:
+    EglSurface(ESurfaceType type,EglConfig* config,EGLint width,EGLint height):m_type(type),
+                                                                               m_destroy(false),
+                                                                               m_config(config),
+                                                                               m_width(width),
+                                                                               m_height(height){ m_hndl = ++s_nextSurfaceHndl;};
+    EglConfig*   m_config;
+    EGLint       m_width;
+    EGLint       m_height;
+};
+#endif
diff --git a/tools/emulator/opengl/host/libs/Translator/EGL/EglThreadInfo.cpp b/tools/emulator/opengl/host/libs/Translator/EGL/EglThreadInfo.cpp
new file mode 100644
index 0000000..a9bfc56
--- /dev/null
+++ b/tools/emulator/opengl/host/libs/Translator/EGL/EglThreadInfo.cpp
@@ -0,0 +1,19 @@
+/*
+* 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.
+*/
+#include "EglThreadInfo.h"
+#include "EglOsApi.h"
+
+EglThreadInfo::EglThreadInfo():m_err(EGL_SUCCESS),m_api(EGL_OPENGL_ES_API) {}
diff --git a/tools/emulator/opengl/host/libs/Translator/EGL/EglThreadInfo.h b/tools/emulator/opengl/host/libs/Translator/EGL/EglThreadInfo.h
new file mode 100644
index 0000000..c811508
--- /dev/null
+++ b/tools/emulator/opengl/host/libs/Translator/EGL/EglThreadInfo.h
@@ -0,0 +1,41 @@
+/*
+* 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_THREAD_INFO_H
+#define EGL_THREAD_INFO_H
+
+#include <EGL/egl.h>
+#include "EglDisplay.h"
+#include "EglContext.h"
+#include "EglSurface.h"
+#include "EglPbufferSurface.h"
+
+class EglThreadInfo {
+public:
+
+    EglThreadInfo();
+    void       setError(EGLint err) { m_err = err;}
+    EGLint     getError(){ return m_err;}
+    void       destroyContextIfNotCurrent(ContextPtr context );
+    void       setApi(EGLenum api){m_api = api;}
+    EGLenum    getApi(){return m_api;}
+
+private:
+    EglDisplay*     m_currentDisplay;
+    EGLint          m_err;
+    EGLenum         m_api;
+};
+
+#endif
diff --git a/tools/emulator/opengl/host/libs/Translator/EGL/EglValidate.cpp b/tools/emulator/opengl/host/libs/Translator/EGL/EglValidate.cpp
new file mode 100644
index 0000000..8734e5c
--- /dev/null
+++ b/tools/emulator/opengl/host/libs/Translator/EGL/EglValidate.cpp
@@ -0,0 +1,91 @@
+/*
+* 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.
+*/
+#include "EglValidate.h"
+#include <GLcommon/GLutils.h>
+
+bool EglValidate::confAttrib(EGLint attrib) {
+    switch(attrib) {
+    case EGL_BUFFER_SIZE:
+    case EGL_RED_SIZE:
+    case EGL_GREEN_SIZE:
+    case EGL_BLUE_SIZE:
+    case EGL_ALPHA_SIZE:
+    case EGL_BIND_TO_TEXTURE_RGB:
+    case EGL_BIND_TO_TEXTURE_RGBA:
+    case EGL_CONFIG_CAVEAT:
+    case EGL_CONFIG_ID:
+    case EGL_DEPTH_SIZE:
+    case EGL_LEVEL:
+    case EGL_MAX_PBUFFER_WIDTH:
+    case EGL_MAX_PBUFFER_HEIGHT:
+    case EGL_MAX_PBUFFER_PIXELS:
+    case EGL_MAX_SWAP_INTERVAL:
+    case EGL_MIN_SWAP_INTERVAL:
+    case EGL_NATIVE_RENDERABLE:
+    case EGL_NATIVE_VISUAL_ID:
+    case EGL_NATIVE_VISUAL_TYPE:
+    case EGL_SAMPLE_BUFFERS:
+    case EGL_SAMPLES:
+    case EGL_STENCIL_SIZE:
+    case EGL_SURFACE_TYPE:
+    case EGL_TRANSPARENT_TYPE:
+    case EGL_TRANSPARENT_RED_VALUE:
+    case EGL_TRANSPARENT_GREEN_VALUE:
+    case EGL_TRANSPARENT_BLUE_VALUE:
+        return true;
+    }
+    return false;
+}
+
+bool EglValidate::noAttribs(const EGLint* attrib) {
+    return !attrib || attrib[0] == EGL_NONE ;
+}
+
+bool EglValidate::pbufferAttribs(EGLint width,EGLint height,bool isTexFormatNoTex,bool isTexTargetNoTex) {
+    if(!isTexFormatNoTex) {
+      if (!(isPowerOf2(width) && isPowerOf2(height))) return false;
+    }
+    return isTexFormatNoTex == isTexTargetNoTex ;
+}
+
+bool EglValidate::releaseContext(EGLContext ctx,EGLSurface s1,EGLSurface s2) {
+    return (ctx == EGL_NO_CONTEXT) &&
+           (s1 == EGL_NO_SURFACE)  &&
+           (s2 == EGL_NO_SURFACE);
+}
+
+bool EglValidate::badContextMatch(EGLContext ctx,EGLSurface s1,EGLSurface s2) {
+    return ctx != EGL_NO_CONTEXT ? (s1 == EGL_NO_SURFACE || s2 == EGL_NO_SURFACE):
+                                   (s1 != EGL_NO_SURFACE || s2 != EGL_NO_SURFACE);
+}
+
+bool EglValidate::surfaceTarget(EGLint target) {
+    return target == EGL_READ || target == EGL_DRAW;
+}
+
+bool EglValidate::engine(EGLint engine) {
+    return engine == EGL_CORE_NATIVE_ENGINE;
+}
+
+bool EglValidate::stringName(EGLint name) {
+    return name == EGL_VENDOR  ||
+           name == EGL_VERSION ||
+           name == EGL_EXTENSIONS;
+}
+
+bool EglValidate::supportedApi(EGLenum api) {
+    return api == EGL_OPENGL_ES_API;
+}
diff --git a/tools/emulator/opengl/host/libs/Translator/EGL/EglValidate.h b/tools/emulator/opengl/host/libs/Translator/EGL/EglValidate.h
new file mode 100644
index 0000000..532584f
--- /dev/null
+++ b/tools/emulator/opengl/host/libs/Translator/EGL/EglValidate.h
@@ -0,0 +1,33 @@
+/*
+* 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_VALIDATE_H
+#define EGL_VALIDATE_H
+
+#include <EGL/egl.h>
+
+class EglValidate {
+public:
+    static bool confAttrib(EGLint attrib);
+    static bool noAttribs(const EGLint* attrib);
+    static bool pbufferAttribs(EGLint width,EGLint height,bool texFormatIsNoTex,bool texTargetIsNoTex);
+    static bool releaseContext(EGLContext ctx,EGLSurface s1,EGLSurface s2);
+    static bool badContextMatch(EGLContext ctx,EGLSurface s1,EGLSurface s2);
+    static bool surfaceTarget(EGLint target);
+    static bool engine(EGLint engine);
+    static bool stringName(EGLint name);
+    static bool supportedApi(EGLenum api);
+};
+#endif
diff --git a/tools/emulator/opengl/host/libs/Translator/EGL/EglWindowSurface.cpp b/tools/emulator/opengl/host/libs/Translator/EGL/EglWindowSurface.cpp
new file mode 100644
index 0000000..0e07522
--- /dev/null
+++ b/tools/emulator/opengl/host/libs/Translator/EGL/EglWindowSurface.cpp
@@ -0,0 +1,53 @@
+/*
+* 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.
+*/
+#include "EglWindowSurface.h"
+
+std::set<EGLNativeWindowType> EglWindowSurface::s_associatedWins;
+
+bool EglWindowSurface::alreadyAssociatedWithConfig(EGLNativeWindowType win) {
+    return s_associatedWins.find(win) != s_associatedWins.end();
+
+}
+
+EglWindowSurface::EglWindowSurface(EGLNativeWindowType win,EglConfig* config,unsigned int width,unsigned int height):EglSurface(WINDOW,config,width,height),m_win(win){
+    s_associatedWins.insert(win);
+}
+
+EglWindowSurface:: ~EglWindowSurface() {
+    s_associatedWins.erase(m_win);
+}
+
+bool  EglWindowSurface::getAttrib(EGLint attrib,EGLint* val) {
+    switch(attrib) {
+    case EGL_CONFIG_ID:
+        *val = m_config->id();
+        break;
+    case EGL_WIDTH:
+        *val = m_width;
+        break;
+    case EGL_HEIGHT:
+        *val = m_height;
+        break;
+    case EGL_LARGEST_PBUFFER:
+    case EGL_TEXTURE_FORMAT:
+    case EGL_TEXTURE_TARGET:
+    case EGL_MIPMAP_TEXTURE:
+        break;
+    default:
+        return false;
+    }
+    return true;
+}
diff --git a/tools/emulator/opengl/host/libs/Translator/EGL/EglWindowSurface.h b/tools/emulator/opengl/host/libs/Translator/EGL/EglWindowSurface.h
new file mode 100644
index 0000000..1752241
--- /dev/null
+++ b/tools/emulator/opengl/host/libs/Translator/EGL/EglWindowSurface.h
@@ -0,0 +1,36 @@
+/*
+* 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_WINDOW_SURFACE_H
+#define EGL_WINDOW_SURFACE_H
+
+#include <set>
+#include <EGL/egl.h>
+#include "EglSurface.h"
+#include "EglConfig.h"
+
+class EglWindowSurface: public EglSurface {
+public:
+    EglWindowSurface(EGLNativeWindowType win,EglConfig* config,unsigned width,unsigned int height);
+    ~EglWindowSurface();
+    bool  getAttrib(EGLint attrib,EGLint* val);
+    void* native(){ return (void *)m_win;};
+
+    static bool alreadyAssociatedWithConfig(EGLNativeWindowType win);
+private:
+    EGLNativeWindowType m_win;
+    static std::set<EGLNativeWindowType> s_associatedWins;
+};
+#endif
diff --git a/tools/emulator/opengl/host/libs/Translator/EGL/EglWindowsApi.cpp b/tools/emulator/opengl/host/libs/Translator/EGL/EglWindowsApi.cpp
new file mode 100644
index 0000000..bd642b5
--- /dev/null
+++ b/tools/emulator/opengl/host/libs/Translator/EGL/EglWindowsApi.cpp
@@ -0,0 +1,278 @@
+/*
+* 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.
+*/
+#include "EglOsApi.h"
+#include <windows.h>
+#include <GL/wglext.h>
+
+#define IS_TRUE(a) \
+        if(a != true) return false;
+
+namespace EglOS{
+bool WGLExtensionSupported(const char *extension_name)
+{
+    // this is pointer to function which returns pointer to string with list of all wgl extensions
+    PFNWGLGETEXTENSIONSSTRINGEXTPROC _wglGetExtensionsStringEXT = NULL;
+
+    // determine pointer to wglGetExtensionsStringEXT function
+    _wglGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC) wglGetProcAddress("wglGetExtensionsStringEXT");
+
+    if (strstr(_wglGetExtensionsString(), extension_name) == NULL)
+    {
+        // string was not found
+        return false;
+    }
+
+    // extension is supported
+    return true;
+}
+
+EGLNativeDisplayType getDefaultDisplay() {
+    return GetDC();
+}
+
+bool releaseDisplay(EGLNativeDisplay dpy) {
+    return DeleteDC(dpy);
+}
+
+
+
+EglConfig* pixelFormatToConfig(EGLNativeDisplayType dpy,EGLNativePixelFormatType* frmt,int index){
+
+    int  supportedSurfaces,visualType,visualId;
+    int  caveat,transparentType,samples;
+    int  tRed,tGreen,tBlue;
+    int  pMaxWidth,pMaxHeight,pMaxPixels;
+    int  configId,level,renderable;
+    bool window,bitmap,pbuffer,transparent;
+
+    if(frmt->iPixelType != PFD_TYPE_RGBA) return NULL; // other formats are not supported yet
+
+    supportedSurfaces = 0;
+    IS_TRUE(wglGetPixelFormatAttribivARB(dpy,index,0,1,WGL_DRAW_TO_WINDOW_ARB,&window));
+    IS_TRUE(wglGetPixelFormatAttribivARB(dpy,index,0,1,WGL_DRAW_TO_BITMAP_ARB,&bitmap));
+    IS_TRUE(wglGetPixelFormatAttribivARB(dpy,index,0,1,WGL_DRAW_TO_PBUFFER_ARB,&pbuffer));
+    if(window)  supportedSurfaces |= EGL_WINDOW_BIT;
+    if(bitmap)  supportedSurfaces |= EGL_PIXMAP_BIT;
+    if(pbuffer) supportedSurfaces |= EGL_PBUFFER_BIT;
+
+    //default values
+    visualId   = 0;
+    visualType = EGL_NONE;
+    caveat     = EGL_NONE;
+    pMaxWidth  = PBUFFER_MAX_WIDTH;
+    pMaxHeight = PBUFFER_MAX_HEIGHT;
+    pMaxPixels = PBUFFER_MAX_PIXELS;
+    samples    = 0 ;
+    level      = 0 ;
+    renderable = EGL_FALSE;
+
+    IS_TRUE(wglGetPixelFormatAttribivARB(dpy,index,0,1,WGL_TRANSPARENT_ARB,&transparent));
+    if(transparent) {
+        transparentType = EGL_TRANSPARENT_RGB;
+        IS_TRUE(wglGetPixelFormatAttribivARB(dpy,index,0,1,WGL_TRANSPARENT_RED_VALUE_ARB,&tRed));
+        IS_TRUE(wglGetPixelFormatAttribivARB(dpy,index,0,1,WGL_TRANSPARENT_GREEN_VALUE_ARB,&tGreen));
+        IS_TRUE(wglGetPixelFormatAttribivARB(dpy,index,0,1,WGL_TRANSPARENT_BLUE_VALUE_ARB,&tBlue));
+    } else {
+        transparentType = EGL_NONE;
+    }
+
+    return new EglConfig(frmt->cRedBits,frmt->cGreenBits,frmt->cBlueBits,frmt->cAlphaBits,caveat,
+                              index,frmt->cDepthBits,level,pMaxWidth,pMaxHeight,pMaxPixels,renderable,
+                              visualId,visualType,samples,frmt->cStencilBits,supportedSurfaces,transparentType,tRed,tGreen,tBlue,frmt);
+}
+
+void queryConfigs(EGLNativeDisplayType dpy,ConfigList& listOut) {
+    PIXELFORMATDESCRIPTOR  pfd;
+    int  iPixelFormat = 1;
+
+    //quering num of formats
+    nFormats = DescribePixelFormat(dpy, iPixelFormat,sizeof(PIXELFORMATDESCRIPTOR), &pfd);
+    EglConfig* p = pixelFormatToConfig(dpy,&pfd,iPixelFormat);
+    //inserting first format
+    if(p) listOut.push_front(p);
+
+    //inserting rest of formats
+    for(iPixelFormat++;iPixelFormat < nFormats; iPixelFormat++) {
+         DescribePixelFormat(dpy, iPixelFormat,sizeof(PIXELFORMATDESCRIPTOR), &pfd);
+         EglConfig* pConfig = pixelFormatToConfig(dpy,&pfd,iPixelFormat);
+         if(pConfig) listOut.push_front(pConfig);
+    }
+
+}
+
+
+bool validNativeWin(EGLNativeWindowType win) {
+    return IsWindow(win);
+}
+
+bool validNativePixmap(EGLNativePixmapType pix) {
+    BITMAP bm;
+    return GetObject(pix, sizeof(BITMAP), (LPSTR)&bm);
+}
+
+static bool setPixelFormat(EGLNativeDisplayType dpy,EglConfig* cfg) {
+   int iPixelFormat = ChoosePixelFormat(dpy,cfg->nativeConfig());
+   if(!iPixelFormat) return false;
+   if(!SetPixelFormat(dpy,iPixelFormat,cfg->nativeConfig())) return false;
+   return true;
+}
+
+bool checkWindowPixelFormatMatch(EGLNativeDisplayType dpy,EGLNativeWindowType win,EglConfig* cfg,unsigned int* width,unsigned int* height) {
+   RECT r;
+   if(!GetClientRect(win,&r)) return false;
+   *width  = r.right  - r.left;
+   *height = r.bottom - r.top;
+
+   return setPixelFormat(dpy,cfg);
+}
+
+bool checkPixmapPixelFormatMatch(EGLNativeDisplayType dpy,EGLNativePixmapType pix,EglConfig* cfg) {
+
+    BITMAP bm;
+    if(!GetObject(pix, sizeof(BITMAP), (LPSTR)&bm)) return false;
+
+    *width  = bm.bmWidth;
+    *height = bm.bmHeight;
+
+   return setPixelFormat(dpy,cfg);
+}
+
+EGLNativePbufferType createPbuffer(EGLNativeDisplayType dpy,EglConfig* cfg,EglPbSurface* pbSurface) {
+
+  //converting configuration into WGL pixel Format
+   EGLint red,green,blue,alpha,depth,stencil;
+   bool   gotAttribs = getConfAttrib(EGL_RED_SIZE,&red)     &&
+                       getConfAttrib(EGL_GREEN_SIZE,&green) &&
+                       getConfAttrib(EGL_BLUE_SIZE,&blue)   &&
+                       getConfAttrib(EGL_ALPHA_SIZE,&alpha) &&
+                       getConfAttrib(EGL_DEPTH_SIZE,&depth) &&
+                       getConfAttrib(EGL_STENCIL_SIZE,&stencil) ;
+
+ if(!gotAttribs) return false;
+ int wglPixelFormatAttribs[] = {
+                                WGL_SUPPORT_OPENGL_ARB       ,TRUE,
+                                WGL_DRAW_TO_BUFFER_ARB       ,TRUE,
+                                WGL_BIND_TO_TEXTURE_RGBA_ARB ,TRUE,
+                                WGL_COLOR_BITS_ARB           ,red+green+blue,
+                                WGL_RED_BITS_ARB             ,red,
+                                WGL_GREEN_BITS_ARB           ,green,
+                                WGL_BLUE_BITS_ARB            ,blue,
+                                WGL_ALPHA_BITS_ARB           ,alpha,
+                                WGL_STENCIL_BITS_ARB         ,stencil,
+                                WGL_DEPTH_BITS_ARB           ,depth,
+                                WGL_DOUBLE_BUFFER_ARB        ,TRUE,
+                                0
+                               };
+
+    int pixfmt;
+    unsigned int numpf;
+    if(!wglChoosePixelFormatARB(dpy,wglPixelFormatAttribs, NULL, 1, &pixfmt, &numpf)) {
+        DWORD err = GetLastError();
+        return NULL;
+    }
+
+    EGLint width,height,largest,texTarget,texFormat;
+    pbSurface->getDim(&width,&height,&largest);
+    pbSurface->getTexInfo(&texTarget,&texFormat);
+
+    int wglTexFormat = WGL_NO_TEXTURE_ARB;
+    int wglTexTarget = (texTarget == EGL_TEXTURE_2D)? WGL_TEXTURE_2D_ARB:
+                                                      WGL_NO_TEXTURE_ARB;
+
+    switch(texFormat) {
+    case EGL_TEXTURE_RGB:
+        wglTexFormat = WGL_TEXTURE_RGB_ARB;
+        break;
+    case EGL_TEXTURE_RGBA:
+        wglTexFormat = WGL_TEXTURE_RGB_ARBA;
+        break;
+    }
+
+    int pbAttribs[] = {
+                       WGL_TEXTURE_TARGET_ARB   ,wglTexTarget,
+                       WGL_TEXTURE_FORMAT_ARB   ,wglTexFormat,
+                       WGL_TEXTURE_LARGEST_ARB  ,largest,
+                       0
+                      };
+    EGLNativePbufferType pb = wglCreatePbufferARB(dpy,pixfmt,width,height,pbAttribs);
+    if(!pb) {
+        DWORD err = GetLastError();
+        return NULL;
+    }
+    return pb;
+}
+
+bool releasePbuffer(EGLNativeDisplayType dis,EGLNativePbufferType pb) {
+    if(wglReleasePbufferDCARB(pb,dis) || wglDestroyPbufferArb(pb)){
+        DWORD err = GetLastError();
+        return false;
+    }
+    return true;
+}
+
+EGLNativeContextType createContext(EGLNativeDisplayType dpy,EglConfig* cfg,EGLNativeContextType sharedContext) {
+
+    EGLNativeContextType ctx = NULL;
+
+    if(!setPixelFormat(dpy,cfg)) return NULL;
+    ctx = wglCreateContext(dpy);
+    if(ctx && sharedContext) {
+        if(!wglShareLists(sharedContext,ctx)) {
+            wglDeleteContext(ctx);
+            return NULL;
+        }
+    }
+    return ctx;
+}
+
+bool destroyContext(EGLNativeDisplayType dpy,EGLNativeContextType ctx) {
+    if(!wglDeleteContext(ctx)) {
+        DWORD err = GetLastError();
+        return false;
+    }
+    return true;
+}
+
+bool makeCurrent(EGLNativeDisplayType dpy,EglSurface* read,EglSurface* draw,EGLNativeContextType ctx) {
+    return ctx ? :wglMakeCurrent(dpy,NULL): wglMakeContextCurrentARB(dpy,draw->native(),read->native());
+
+
+}
+
+void swapBuffers(EGLNativeDisplayType dpy,EGLNativeWindowType win) {
+    if(!SwapBuffers(dpy)) {
+        DWORD err = GetLastError();
+    }
+
+}
+
+
+void waitNative(){}
+
+void swapInterval(EGLNativeDisplayType dpy,EGLNativeWindowType win,int interval) {
+
+    PFNWGLSWAPINTERVALEXTPROC       wglSwapIntervalEXT = NULL;
+
+    if (WGLExtensionSupported("WGL_EXT_swap_control"))
+    {
+        // Extension is supported, init pointers.
+        wglSwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC) LogGetProcAddress("wglSwapIntervalEXT");
+
+    }
+    wglSwapIntervalEXT(interval);
+}
+
+};
diff --git a/tools/emulator/opengl/host/libs/Translator/EGL/EglX11Api.cpp b/tools/emulator/opengl/host/libs/Translator/EGL/EglX11Api.cpp
new file mode 100644
index 0000000..2f57f3a
--- /dev/null
+++ b/tools/emulator/opengl/host/libs/Translator/EGL/EglX11Api.cpp
@@ -0,0 +1,216 @@
+/*
+* 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.
+*/
+#include "EglOsApi.h"
+#include <string.h>
+#include <GL/glx.h>
+
+
+#define IS_SUCCESS(a) \
+        if(a != Success) return false;
+
+namespace EglOS {
+
+EGLNativeDisplayType getDefaultDisplay() {return XOpenDisplay(0);}
+
+bool releaseDisplay(EGLNativeDisplayType dpy) {
+    return XCloseDisplay(dpy);
+}
+
+EglConfig* pixelFormatToConfig(EGLNativeDisplayType dpy,EGLNativePixelFormatType* frmt){
+
+    int  bSize,red,green,blue,alpha,depth,stencil;
+    int  supportedSurfaces,visualType,visualId;
+    int  caveat,transparentType,samples;
+    int  tRed,tGreen,tBlue;
+    int  pMaxWidth,pMaxHeight,pMaxPixels;
+    int  tmp;
+    int  configId,level,renderable;
+
+    IS_SUCCESS(glXGetFBConfigAttrib(dpy,*frmt,GLX_TRANSPARENT_TYPE,&tmp));
+    if(tmp == GLX_TRANSPARENT_INDEX) {
+        return NULL; // not supporting transparent index
+    } else if( tmp == GLX_NONE) {
+        transparentType = EGL_NONE;
+    } else {
+        transparentType = EGL_TRANSPARENT_RGB;
+
+        IS_SUCCESS(glXGetFBConfigAttrib(dpy,*frmt,GLX_TRANSPARENT_RED_VALUE,&tRed));
+        IS_SUCCESS(glXGetFBConfigAttrib(dpy,*frmt,GLX_TRANSPARENT_GREEN_VALUE,&tGreen));
+        IS_SUCCESS(glXGetFBConfigAttrib(dpy,*frmt,GLX_TRANSPARENT_BLUE_VALUE,&tBlue));
+    }
+
+
+    IS_SUCCESS(glXGetFBConfigAttrib(dpy,*frmt,GLX_BUFFER_SIZE,&bSize));
+    IS_SUCCESS(glXGetFBConfigAttrib(dpy,*frmt,GLX_RED_SIZE,&red));
+    IS_SUCCESS(glXGetFBConfigAttrib(dpy,*frmt,GLX_GREEN_SIZE,&green));
+    IS_SUCCESS(glXGetFBConfigAttrib(dpy,*frmt,GLX_BLUE_SIZE,&blue));
+    IS_SUCCESS(glXGetFBConfigAttrib(dpy,*frmt,GLX_ALPHA_SIZE,&alpha));
+    IS_SUCCESS(glXGetFBConfigAttrib(dpy,*frmt,GLX_DEPTH_SIZE,&depth));
+    IS_SUCCESS(glXGetFBConfigAttrib(dpy,*frmt,GLX_STENCIL_SIZE,&stencil));
+
+
+    IS_SUCCESS(glXGetFBConfigAttrib(dpy,*frmt,GLX_X_RENDERABLE,&renderable));
+
+    IS_SUCCESS(glXGetFBConfigAttrib(dpy,*frmt,GLX_X_VISUAL_TYPE,&visualType));
+    IS_SUCCESS(glXGetFBConfigAttrib(dpy,*frmt,GLX_VISUAL_ID,&visualId));
+
+    //supported surfaces types
+    IS_SUCCESS(glXGetFBConfigAttrib(dpy,*frmt,GLX_DRAWABLE_TYPE,&tmp));
+    supportedSurfaces = 0;
+    if(tmp & GLX_WINDOW_BIT) {
+        supportedSurfaces |= EGL_WINDOW_BIT;
+    } else {
+        visualId = 0;
+        visualType = EGL_NONE;
+    }
+    if(tmp & GLX_PIXMAP_BIT)  supportedSurfaces |= EGL_PIXMAP_BIT;
+    if(tmp & GLX_PBUFFER_BIT) supportedSurfaces |= EGL_PBUFFER_BIT;
+
+    caveat = 0;
+    IS_SUCCESS(glXGetFBConfigAttrib(dpy,*frmt,GLX_CONFIG_CAVEAT,&tmp));
+    if     (tmp == GLX_NONE) caveat = EGL_NONE;
+    else if(tmp == GLX_SLOW_CONFIG) caveat = EGL_SLOW_CONFIG;
+    else if(tmp == GLX_NON_CONFORMANT_CONFIG) caveat = EGL_NON_CONFORMANT_CONFIG;
+    IS_SUCCESS(glXGetFBConfigAttrib(dpy,*frmt,GLX_MAX_PBUFFER_WIDTH,&pMaxWidth));
+    IS_SUCCESS(glXGetFBConfigAttrib(dpy,*frmt,GLX_MAX_PBUFFER_HEIGHT,&pMaxHeight));
+    IS_SUCCESS(glXGetFBConfigAttrib(dpy,*frmt,GLX_MAX_PBUFFER_HEIGHT,&pMaxPixels));
+
+    IS_SUCCESS(glXGetFBConfigAttrib(dpy,*frmt,GLX_LEVEL,&level));
+    IS_SUCCESS(glXGetFBConfigAttrib(dpy,*frmt,GLX_FBCONFIG_ID,&configId));
+    IS_SUCCESS(glXGetFBConfigAttrib(dpy,*frmt,GLX_SAMPLES,&samples));
+
+
+    return new EglConfig(red,green,blue,alpha,caveat,configId,depth,level,pMaxWidth,pMaxHeight,
+                              pMaxPixels,renderable,visualId,visualType,samples,stencil,
+                              supportedSurfaces,transparentType,tRed,tGreen,tBlue,*frmt);
+}
+
+void queryConfigs(EGLNativeDisplayType dpy,ConfigsList& listOut) {
+    int n;
+    EGLNativePixelFormatType*  frmtList =  glXGetFBConfigs(dpy,0,&n);
+    for(int i =0 ;i < n ; i++) {
+        EglConfig* conf = pixelFormatToConfig(dpy,&frmtList[i]);
+        if(conf) listOut.push_back(conf);
+    }
+    listOut.sort();
+    XFree(frmtList);
+}
+
+bool validNativeWin(EGLNativeWindowType win) {
+  //TODO: use XGetgeometry to check validity
+   return true;
+}
+
+bool validNativePixmap(EGLNativePixmapType pix) {
+  //TODO: use XGetgeometry to check validity
+   return true;
+}
+
+bool checkWindowPixelFormatMatch(EGLNativeDisplayType dpy,EGLNativeWindowType win,EglConfig* cfg,unsigned int* width,unsigned int* height) {
+//TODO: to check what does ATI & NVIDIA enforce on win pixelformat
+   unsigned int depth,configDepth,border;
+   int r,g,b,x,y;
+   IS_SUCCESS(glXGetFBConfigAttrib(dpy,cfg->nativeConfig(),GLX_RED_SIZE,&r));
+   IS_SUCCESS(glXGetFBConfigAttrib(dpy,cfg->nativeConfig(),GLX_GREEN_SIZE,&g));
+   IS_SUCCESS(glXGetFBConfigAttrib(dpy,cfg->nativeConfig(),GLX_BLUE_SIZE,&b));
+   configDepth = r + g + b;
+   Window root;
+   if(!XGetGeometry(dpy,win,&root,&x,&y,width,height,&border,&depth)) return false;
+   return depth >= configDepth;
+}
+
+bool checkPixmapPixelFormatMatch(EGLNativeDisplayType dpy,EGLNativePixmapType pix,EglConfig* cfg,unsigned int* width,unsigned int* height) {
+   unsigned int depth,configDepth,border;
+   int r,g,b,x,y;
+   IS_SUCCESS(glXGetFBConfigAttrib(dpy,cfg->nativeConfig(),GLX_RED_SIZE,&r));
+   IS_SUCCESS(glXGetFBConfigAttrib(dpy,cfg->nativeConfig(),GLX_GREEN_SIZE,&g));
+   IS_SUCCESS(glXGetFBConfigAttrib(dpy,cfg->nativeConfig(),GLX_BLUE_SIZE,&b));
+   configDepth = r + g + b;
+   Window root;
+   if(!XGetGeometry(dpy,pix,&root,&x,&y,width,height,&border,&depth)) return false;
+   return depth >= configDepth;
+}
+
+EGLNativePbufferType createPbuffer(EGLNativeDisplayType dpy,EglConfig* cfg,EglPbufferSurface* srfc){
+    EGLint width,height,largest;
+    srfc->getDim(&width,&height,&largest);
+
+    int attribs[] = {
+                     GLX_PBUFFER_WIDTH           ,width,
+                     GLX_PBUFFER_HEIGHT          ,height,
+                     GLX_LARGEST_PBUFFER         ,largest,
+                     None
+                    };
+    return glXCreatePbuffer(dpy,cfg->nativeConfig(),attribs);
+}
+
+bool releasePbuffer(EGLNativeDisplayType dis,EGLNativePbufferType pb) {
+    glXDestroyPbuffer(dis,pb);
+
+    return true;
+}
+
+EGLNativeContextType createContext(EGLNativeDisplayType dpy,EglConfig* cfg,EGLNativeContextType sharedContext) {
+ return glXCreateNewContext(dpy,cfg->nativeConfig(),GLX_RGBA_TYPE,sharedContext,true);
+}
+
+bool destroyContext(EGLNativeDisplayType dpy,EGLNativeContextType ctx) {
+    glXDestroyContext(dpy,ctx);
+    return true;
+}
+
+GLXDrawable convertSurface(EglSurface* srfc) {
+    if(!srfc) return None;
+    switch(srfc->type()){
+    case EglSurface::PIXMAP:
+        return (GLXPixmap)srfc->native();
+    case EglSurface::PBUFFER:
+        return (GLXPbuffer)srfc->native();
+    case EglSurface::WINDOW:
+    default:
+        return (GLXWindow)srfc->native();
+    }
+}
+
+
+bool makeCurrent(EGLNativeDisplayType dpy,EglSurface* read,EglSurface* draw,EGLNativeContextType ctx){
+
+
+return glXMakeContextCurrent(dpy,convertSurface(draw),convertSurface(read),ctx);
+}
+
+void swapBuffers(EGLNativeDisplayType dpy,EGLNativeWindowType win) {
+    glXSwapBuffers(dpy,win);
+}
+
+void waitNative() {
+    glXWaitX();
+}
+
+void swapInterval(EGLNativeDisplayType dpy,EGLNativeWindowType win,int interval){
+    const char* extensions = glXQueryExtensionsString(dpy,DefaultScreen(dpy));
+    typedef void (*GLXSWAPINTERVALEXT)(Display*,GLXDrawable,int);
+    GLXSWAPINTERVALEXT glXSwapIntervalEXT = NULL;
+
+    if(strstr(extensions,"EXT_swap_control")) {
+        glXSwapIntervalEXT = (GLXSWAPINTERVALEXT)glXGetProcAddress((const GLubyte*)"glXSwapIntervalEXT");
+    }
+    if(glXSwapIntervalEXT) {
+        glXSwapIntervalEXT(dpy,win,interval);
+    }
+}
+
+};
diff --git a/tools/emulator/opengl/host/libs/Translator/EGL/ThreadInfo.cpp b/tools/emulator/opengl/host/libs/Translator/EGL/ThreadInfo.cpp
new file mode 100644
index 0000000..ed2880f
--- /dev/null
+++ b/tools/emulator/opengl/host/libs/Translator/EGL/ThreadInfo.cpp
@@ -0,0 +1,58 @@
+/*
+* 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.
+*/
+
+#include <GLcommon/ThreadInfo.h>
+
+__thread ThreadInfo* thread  = NULL;
+
+void ThreadInfo::updateInfo(void* eglCtx,void* dpy,void* glesCtx,ShareGroupPtr share,ObjectNameManager* manager) {
+    eglContext  = eglCtx;
+    eglDisplay  = dpy;
+    glesContext = glesCtx;
+    shareGroup  = share;
+    objManager  = manager;
+}
+
+#ifdef __linux__
+ThreadInfo* getThreadInfo(){
+    if(!thread) {
+        thread = new ThreadInfo();
+    }
+    return thread;
+}
+
+#else
+#include <cutils/threads.h>
+static thread_store_t s_tls = THREAD_STORE_INITIALIZER;
+
+static void tlsDestruct(void *ptr)
+{
+    if (ptr) {
+        ThreadInfo *ti = (ThreadInfo *)ptr;
+        delete ti;
+    }
+}
+
+RenderThreadInfo *getRenderThreadInfo()
+{
+    ThreadInfo *ti = (ThreadInfo *)thread_store_get(&s_tls);
+    if (!ti) {
+        ti = new RenderThreadInfo();
+        thread_store_set(&s_tls, ti, tlsDestruct);
+    }
+    return ti;
+}
+#endif
diff --git a/tools/emulator/opengl/host/libs/Translator/include/EGL/egl.h b/tools/emulator/opengl/host/libs/Translator/include/EGL/egl.h
new file mode 100644
index 0000000..99ea342
--- /dev/null
+++ b/tools/emulator/opengl/host/libs/Translator/include/EGL/egl.h
@@ -0,0 +1,329 @@
+/* -*- mode: c; tab-width: 8; -*- */
+/* vi: set sw=4 ts=8: */
+/* Reference version of egl.h for EGL 1.4.
+ * $Revision: 9356 $ on $Date: 2009-10-21 02:52:25 -0700 (Wed, 21 Oct 2009) $
+ */
+
+/*
+** Copyright (c) 2007-2009 The Khronos Group Inc.
+**
+** Permission is hereby granted, free of charge, to any person obtaining a
+** copy of this software and/or associated documentation files (the
+** "Materials"), to deal in the Materials without restriction, including
+** without limitation the rights to use, copy, modify, merge, publish,
+** distribute, sublicense, and/or sell copies of the Materials, and to
+** permit persons to whom the Materials are furnished to do so, subject to
+** the following conditions:
+**
+** The above copyright notice and this permission notice shall be included
+** in all copies or substantial portions of the Materials.
+**
+** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+*/
+
+#ifndef __egl_h_
+#define __egl_h_
+
+/* All platform-dependent types and macro boilerplate (such as EGLAPI
+ * and EGLAPIENTRY) should go in eglplatform.h.
+ */
+#include <EGL/eglplatform.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* EGL Types */
+/* EGLint is defined in eglplatform.h */
+typedef unsigned int EGLBoolean;
+typedef unsigned int EGLenum;
+typedef void *EGLConfig;
+typedef void *EGLContext;
+typedef void *EGLDisplay;
+typedef void *EGLSurface;
+typedef void *EGLClientBuffer;
+
+/* EGL Versioning */
+#define EGL_VERSION_1_0			1
+#define EGL_VERSION_1_1			1
+#define EGL_VERSION_1_2			1
+#define EGL_VERSION_1_3			1
+#define EGL_VERSION_1_4			1
+
+/* EGL Enumerants. Bitmasks and other exceptional cases aside, most
+ * enums are assigned unique values starting at 0x3000.
+ */
+
+/* EGL aliases */
+#define EGL_FALSE			0
+#define EGL_TRUE			1
+
+/* Out-of-band handle values */
+#define EGL_DEFAULT_DISPLAY		((EGLNativeDisplayType)0)
+#define EGL_NO_CONTEXT			((EGLContext)0)
+#define EGL_NO_DISPLAY			((EGLDisplay)0)
+#define EGL_NO_SURFACE			((EGLSurface)0)
+
+/* Out-of-band attribute value */
+#define EGL_DONT_CARE			((EGLint)-1)
+
+/* Errors / GetError return values */
+#define EGL_SUCCESS			0x3000
+#define EGL_NOT_INITIALIZED		0x3001
+#define EGL_BAD_ACCESS			0x3002
+#define EGL_BAD_ALLOC			0x3003
+#define EGL_BAD_ATTRIBUTE		0x3004
+#define EGL_BAD_CONFIG			0x3005
+#define EGL_BAD_CONTEXT			0x3006
+#define EGL_BAD_CURRENT_SURFACE		0x3007
+#define EGL_BAD_DISPLAY			0x3008
+#define EGL_BAD_MATCH			0x3009
+#define EGL_BAD_NATIVE_PIXMAP		0x300A
+#define EGL_BAD_NATIVE_WINDOW		0x300B
+#define EGL_BAD_PARAMETER		0x300C
+#define EGL_BAD_SURFACE			0x300D
+#define EGL_CONTEXT_LOST		0x300E	/* EGL 1.1 - IMG_power_management */
+
+/* Reserved 0x300F-0x301F for additional errors */
+
+/* Config attributes */
+#define EGL_BUFFER_SIZE			0x3020
+#define EGL_ALPHA_SIZE			0x3021
+#define EGL_BLUE_SIZE			0x3022
+#define EGL_GREEN_SIZE			0x3023
+#define EGL_RED_SIZE			0x3024
+#define EGL_DEPTH_SIZE			0x3025
+#define EGL_STENCIL_SIZE		0x3026
+#define EGL_CONFIG_CAVEAT		0x3027
+#define EGL_CONFIG_ID			0x3028
+#define EGL_LEVEL			0x3029
+#define EGL_MAX_PBUFFER_HEIGHT		0x302A
+#define EGL_MAX_PBUFFER_PIXELS		0x302B
+#define EGL_MAX_PBUFFER_WIDTH		0x302C
+#define EGL_NATIVE_RENDERABLE		0x302D
+#define EGL_NATIVE_VISUAL_ID		0x302E
+#define EGL_NATIVE_VISUAL_TYPE		0x302F
+#define EGL_SAMPLES			0x3031
+#define EGL_SAMPLE_BUFFERS		0x3032
+#define EGL_SURFACE_TYPE		0x3033
+#define EGL_TRANSPARENT_TYPE		0x3034
+#define EGL_TRANSPARENT_BLUE_VALUE	0x3035
+#define EGL_TRANSPARENT_GREEN_VALUE	0x3036
+#define EGL_TRANSPARENT_RED_VALUE	0x3037
+#define EGL_NONE			0x3038	/* Attrib list terminator */
+#define EGL_BIND_TO_TEXTURE_RGB		0x3039
+#define EGL_BIND_TO_TEXTURE_RGBA	0x303A
+#define EGL_MIN_SWAP_INTERVAL		0x303B
+#define EGL_MAX_SWAP_INTERVAL		0x303C
+#define EGL_LUMINANCE_SIZE		0x303D
+#define EGL_ALPHA_MASK_SIZE		0x303E
+#define EGL_COLOR_BUFFER_TYPE		0x303F
+#define EGL_RENDERABLE_TYPE		0x3040
+#define EGL_MATCH_NATIVE_PIXMAP		0x3041	/* Pseudo-attribute (not queryable) */
+#define EGL_CONFORMANT			0x3042
+
+/* Reserved 0x3041-0x304F for additional config attributes */
+
+/* Config attribute values */
+#define EGL_SLOW_CONFIG			0x3050	/* EGL_CONFIG_CAVEAT value */
+#define EGL_NON_CONFORMANT_CONFIG	0x3051	/* EGL_CONFIG_CAVEAT value */
+#define EGL_TRANSPARENT_RGB		0x3052	/* EGL_TRANSPARENT_TYPE value */
+#define EGL_RGB_BUFFER			0x308E	/* EGL_COLOR_BUFFER_TYPE value */
+#define EGL_LUMINANCE_BUFFER		0x308F	/* EGL_COLOR_BUFFER_TYPE value */
+
+/* More config attribute values, for EGL_TEXTURE_FORMAT */
+#define EGL_NO_TEXTURE			0x305C
+#define EGL_TEXTURE_RGB			0x305D
+#define EGL_TEXTURE_RGBA		0x305E
+#define EGL_TEXTURE_2D			0x305F
+
+/* Config attribute mask bits */
+#define EGL_PBUFFER_BIT			0x0001	/* EGL_SURFACE_TYPE mask bits */
+#define EGL_PIXMAP_BIT			0x0002	/* EGL_SURFACE_TYPE mask bits */
+#define EGL_WINDOW_BIT			0x0004	/* EGL_SURFACE_TYPE mask bits */
+#define EGL_VG_COLORSPACE_LINEAR_BIT	0x0020	/* EGL_SURFACE_TYPE mask bits */
+#define EGL_VG_ALPHA_FORMAT_PRE_BIT	0x0040	/* EGL_SURFACE_TYPE mask bits */
+#define EGL_MULTISAMPLE_RESOLVE_BOX_BIT 0x0200	/* EGL_SURFACE_TYPE mask bits */
+#define EGL_SWAP_BEHAVIOR_PRESERVED_BIT 0x0400	/* EGL_SURFACE_TYPE mask bits */
+
+#define EGL_OPENGL_ES_BIT		0x0001	/* EGL_RENDERABLE_TYPE mask bits */
+#define EGL_OPENVG_BIT			0x0002	/* EGL_RENDERABLE_TYPE mask bits */
+#define EGL_OPENGL_ES2_BIT		0x0004	/* EGL_RENDERABLE_TYPE mask bits */
+#define EGL_OPENGL_BIT			0x0008	/* EGL_RENDERABLE_TYPE mask bits */
+
+/* QueryString targets */
+#define EGL_VENDOR			0x3053
+#define EGL_VERSION			0x3054
+#define EGL_EXTENSIONS			0x3055
+#define EGL_CLIENT_APIS			0x308D
+
+/* QuerySurface / SurfaceAttrib / CreatePbufferSurface targets */
+#define EGL_HEIGHT			0x3056
+#define EGL_WIDTH			0x3057
+#define EGL_LARGEST_PBUFFER		0x3058
+#define EGL_TEXTURE_FORMAT		0x3080
+#define EGL_TEXTURE_TARGET		0x3081
+#define EGL_MIPMAP_TEXTURE		0x3082
+#define EGL_MIPMAP_LEVEL		0x3083
+#define EGL_RENDER_BUFFER		0x3086
+#define EGL_VG_COLORSPACE		0x3087
+#define EGL_VG_ALPHA_FORMAT		0x3088
+#define EGL_HORIZONTAL_RESOLUTION	0x3090
+#define EGL_VERTICAL_RESOLUTION		0x3091
+#define EGL_PIXEL_ASPECT_RATIO		0x3092
+#define EGL_SWAP_BEHAVIOR		0x3093
+#define EGL_MULTISAMPLE_RESOLVE		0x3099
+
+/* EGL_RENDER_BUFFER values / BindTexImage / ReleaseTexImage buffer targets */
+#define EGL_BACK_BUFFER			0x3084
+#define EGL_SINGLE_BUFFER		0x3085
+
+/* OpenVG color spaces */
+#define EGL_VG_COLORSPACE_sRGB		0x3089	/* EGL_VG_COLORSPACE value */
+#define EGL_VG_COLORSPACE_LINEAR	0x308A	/* EGL_VG_COLORSPACE value */
+
+/* OpenVG alpha formats */
+#define EGL_VG_ALPHA_FORMAT_NONPRE	0x308B	/* EGL_ALPHA_FORMAT value */
+#define EGL_VG_ALPHA_FORMAT_PRE		0x308C	/* EGL_ALPHA_FORMAT value */
+
+/* Constant scale factor by which fractional display resolutions &
+ * aspect ratio are scaled when queried as integer values.
+ */
+#define EGL_DISPLAY_SCALING		10000
+
+/* Unknown display resolution/aspect ratio */
+#define EGL_UNKNOWN			((EGLint)-1)
+
+/* Back buffer swap behaviors */
+#define EGL_BUFFER_PRESERVED		0x3094	/* EGL_SWAP_BEHAVIOR value */
+#define EGL_BUFFER_DESTROYED		0x3095	/* EGL_SWAP_BEHAVIOR value */
+
+/* CreatePbufferFromClientBuffer buffer types */
+#define EGL_OPENVG_IMAGE		0x3096
+
+/* QueryContext targets */
+#define EGL_CONTEXT_CLIENT_TYPE		0x3097
+
+/* CreateContext attributes */
+#define EGL_CONTEXT_CLIENT_VERSION	0x3098
+
+/* Multisample resolution behaviors */
+#define EGL_MULTISAMPLE_RESOLVE_DEFAULT 0x309A	/* EGL_MULTISAMPLE_RESOLVE value */
+#define EGL_MULTISAMPLE_RESOLVE_BOX	0x309B	/* EGL_MULTISAMPLE_RESOLVE value */
+
+/* BindAPI/QueryAPI targets */
+#define EGL_OPENGL_ES_API		0x30A0
+#define EGL_OPENVG_API			0x30A1
+#define EGL_OPENGL_API			0x30A2
+
+/* GetCurrentSurface targets */
+#define EGL_DRAW			0x3059
+#define EGL_READ			0x305A
+
+/* WaitNative engines */
+#define EGL_CORE_NATIVE_ENGINE		0x305B
+
+/* EGL 1.2 tokens renamed for consistency in EGL 1.3 */
+#define EGL_COLORSPACE			EGL_VG_COLORSPACE
+#define EGL_ALPHA_FORMAT		EGL_VG_ALPHA_FORMAT
+#define EGL_COLORSPACE_sRGB		EGL_VG_COLORSPACE_sRGB
+#define EGL_COLORSPACE_LINEAR		EGL_VG_COLORSPACE_LINEAR
+#define EGL_ALPHA_FORMAT_NONPRE		EGL_VG_ALPHA_FORMAT_NONPRE
+#define EGL_ALPHA_FORMAT_PRE		EGL_VG_ALPHA_FORMAT_PRE
+
+/* EGL extensions must request enum blocks from the Khronos
+ * API Registrar, who maintains the enumerant registry. Submit
+ * a bug in Khronos Bugzilla against task "Registry".
+ */
+
+
+
+/* EGL Functions */
+
+EGLAPI EGLint EGLAPIENTRY eglGetError(void);
+
+EGLAPI EGLDisplay EGLAPIENTRY eglGetDisplay(EGLNativeDisplayType display_id);
+EGLAPI EGLBoolean EGLAPIENTRY eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor);
+EGLAPI EGLBoolean EGLAPIENTRY eglTerminate(EGLDisplay dpy);
+
+EGLAPI const char * EGLAPIENTRY eglQueryString(EGLDisplay dpy, EGLint name);
+
+EGLAPI EGLBoolean EGLAPIENTRY eglGetConfigs(EGLDisplay dpy, EGLConfig *configs,
+			 EGLint config_size, EGLint *num_config);
+EGLAPI EGLBoolean EGLAPIENTRY eglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list,
+			   EGLConfig *configs, EGLint config_size,
+			   EGLint *num_config);
+EGLAPI EGLBoolean EGLAPIENTRY eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config,
+			      EGLint attribute, EGLint *value);
+
+EGLAPI EGLSurface EGLAPIENTRY eglCreateWindowSurface(EGLDisplay dpy, EGLConfig config,
+				  EGLNativeWindowType win,
+				  const EGLint *attrib_list);
+EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config,
+				   const EGLint *attrib_list);
+EGLAPI EGLSurface EGLAPIENTRY eglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config,
+				  EGLNativePixmapType pixmap,
+				  const EGLint *attrib_list);
+EGLAPI EGLBoolean EGLAPIENTRY eglDestroySurface(EGLDisplay dpy, EGLSurface surface);
+EGLAPI EGLBoolean EGLAPIENTRY eglQuerySurface(EGLDisplay dpy, EGLSurface surface,
+			   EGLint attribute, EGLint *value);
+
+EGLAPI EGLBoolean EGLAPIENTRY eglBindAPI(EGLenum api);
+EGLAPI EGLenum EGLAPIENTRY eglQueryAPI(void);
+
+EGLAPI EGLBoolean EGLAPIENTRY eglWaitClient(void);
+
+EGLAPI EGLBoolean EGLAPIENTRY eglReleaseThread(void);
+
+EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferFromClientBuffer(
+	      EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer,
+	      EGLConfig config, const EGLint *attrib_list);
+
+EGLAPI EGLBoolean EGLAPIENTRY eglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface,
+			    EGLint attribute, EGLint value);
+EGLAPI EGLBoolean EGLAPIENTRY eglBindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer);
+EGLAPI EGLBoolean EGLAPIENTRY eglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer);
+
+
+EGLAPI EGLBoolean EGLAPIENTRY eglSwapInterval(EGLDisplay dpy, EGLint interval);
+
+
+EGLAPI EGLContext EGLAPIENTRY eglCreateContext(EGLDisplay dpy, EGLConfig config,
+			    EGLContext share_context,
+			    const EGLint *attrib_list);
+EGLAPI EGLBoolean EGLAPIENTRY eglDestroyContext(EGLDisplay dpy, EGLContext ctx);
+EGLAPI EGLBoolean EGLAPIENTRY eglMakeCurrent(EGLDisplay dpy, EGLSurface draw,
+			  EGLSurface read, EGLContext ctx);
+
+EGLAPI EGLContext EGLAPIENTRY eglGetCurrentContext(void);
+EGLAPI EGLSurface EGLAPIENTRY eglGetCurrentSurface(EGLint readdraw);
+EGLAPI EGLDisplay EGLAPIENTRY eglGetCurrentDisplay(void);
+EGLAPI EGLBoolean EGLAPIENTRY eglQueryContext(EGLDisplay dpy, EGLContext ctx,
+			   EGLint attribute, EGLint *value);
+
+EGLAPI EGLBoolean EGLAPIENTRY eglWaitGL(void);
+EGLAPI EGLBoolean EGLAPIENTRY eglWaitNative(EGLint engine);
+EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffers(EGLDisplay dpy, EGLSurface surface);
+EGLAPI EGLBoolean EGLAPIENTRY eglCopyBuffers(EGLDisplay dpy, EGLSurface surface,
+			  EGLNativePixmapType target);
+
+/* This is a generic function pointer type, whose name indicates it must
+ * be cast to the proper type *and calling convention* before use.
+ */
+typedef void (*__eglMustCastToProperFunctionPointerType)(void);
+
+/* Now, define eglGetProcAddress using the generic function ptr. type */
+EGLAPI __eglMustCastToProperFunctionPointerType EGLAPIENTRY
+       eglGetProcAddress(const char *procname);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __egl_h_ */
diff --git a/tools/emulator/opengl/host/libs/Translator/include/EGL/eglext.h b/tools/emulator/opengl/host/libs/Translator/include/EGL/eglext.h
new file mode 100644
index 0000000..1ffcd56
--- /dev/null
+++ b/tools/emulator/opengl/host/libs/Translator/include/EGL/eglext.h
@@ -0,0 +1,244 @@
+#ifndef __eglext_h_
+#define __eglext_h_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+** Copyright (c) 2007-2010 The Khronos Group Inc.
+**
+** Permission is hereby granted, free of charge, to any person obtaining a
+** copy of this software and/or associated documentation files (the
+** "Materials"), to deal in the Materials without restriction, including
+** without limitation the rights to use, copy, modify, merge, publish,
+** distribute, sublicense, and/or sell copies of the Materials, and to
+** permit persons to whom the Materials are furnished to do so, subject to
+** the following conditions:
+**
+** The above copyright notice and this permission notice shall be included
+** in all copies or substantial portions of the Materials.
+**
+** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+*/
+
+#include <EGL/eglplatform.h>
+
+/*************************************************************/
+
+/* Header file version number */
+/* Current version at http://www.khronos.org/registry/egl/ */
+/* $Revision: 11249 $ on $Date: 2010-05-05 09:54:28 -0700 (Wed, 05 May 2010) $ */
+#define EGL_EGLEXT_VERSION 5
+
+#ifndef EGL_KHR_config_attribs
+#define EGL_KHR_config_attribs 1
+#define EGL_CONFORMANT_KHR			0x3042	/* EGLConfig attribute */
+#define EGL_VG_COLORSPACE_LINEAR_BIT_KHR	0x0020	/* EGL_SURFACE_TYPE bitfield */
+#define EGL_VG_ALPHA_FORMAT_PRE_BIT_KHR		0x0040	/* EGL_SURFACE_TYPE bitfield */
+#endif
+
+#ifndef EGL_KHR_lock_surface
+#define EGL_KHR_lock_surface 1
+#define EGL_READ_SURFACE_BIT_KHR		0x0001	/* EGL_LOCK_USAGE_HINT_KHR bitfield */
+#define EGL_WRITE_SURFACE_BIT_KHR		0x0002	/* EGL_LOCK_USAGE_HINT_KHR bitfield */
+#define EGL_LOCK_SURFACE_BIT_KHR		0x0080	/* EGL_SURFACE_TYPE bitfield */
+#define EGL_OPTIMAL_FORMAT_BIT_KHR		0x0100	/* EGL_SURFACE_TYPE bitfield */
+#define EGL_MATCH_FORMAT_KHR			0x3043	/* EGLConfig attribute */
+#define EGL_FORMAT_RGB_565_EXACT_KHR		0x30C0	/* EGL_MATCH_FORMAT_KHR value */
+#define EGL_FORMAT_RGB_565_KHR			0x30C1	/* EGL_MATCH_FORMAT_KHR value */
+#define EGL_FORMAT_RGBA_8888_EXACT_KHR		0x30C2	/* EGL_MATCH_FORMAT_KHR value */
+#define EGL_FORMAT_RGBA_8888_KHR		0x30C3	/* EGL_MATCH_FORMAT_KHR value */
+#define EGL_MAP_PRESERVE_PIXELS_KHR		0x30C4	/* eglLockSurfaceKHR attribute */
+#define EGL_LOCK_USAGE_HINT_KHR			0x30C5	/* eglLockSurfaceKHR attribute */
+#define EGL_BITMAP_POINTER_KHR			0x30C6	/* eglQuerySurface attribute */
+#define EGL_BITMAP_PITCH_KHR			0x30C7	/* eglQuerySurface attribute */
+#define EGL_BITMAP_ORIGIN_KHR			0x30C8	/* eglQuerySurface attribute */
+#define EGL_BITMAP_PIXEL_RED_OFFSET_KHR		0x30C9	/* eglQuerySurface attribute */
+#define EGL_BITMAP_PIXEL_GREEN_OFFSET_KHR	0x30CA	/* eglQuerySurface attribute */
+#define EGL_BITMAP_PIXEL_BLUE_OFFSET_KHR	0x30CB	/* eglQuerySurface attribute */
+#define EGL_BITMAP_PIXEL_ALPHA_OFFSET_KHR	0x30CC	/* eglQuerySurface attribute */
+#define EGL_BITMAP_PIXEL_LUMINANCE_OFFSET_KHR	0x30CD	/* eglQuerySurface attribute */
+#define EGL_LOWER_LEFT_KHR			0x30CE	/* EGL_BITMAP_ORIGIN_KHR value */
+#define EGL_UPPER_LEFT_KHR			0x30CF	/* EGL_BITMAP_ORIGIN_KHR value */
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglLockSurfaceKHR (EGLDisplay display, EGLSurface surface, const EGLint *attrib_list);
+EGLAPI EGLBoolean EGLAPIENTRY eglUnlockSurfaceKHR (EGLDisplay display, EGLSurface surface);
+#endif /* EGL_EGLEXT_PROTOTYPES */
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLLOCKSURFACEKHRPROC) (EGLDisplay display, EGLSurface surface, const EGLint *attrib_list);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLUNLOCKSURFACEKHRPROC) (EGLDisplay display, EGLSurface surface);
+#endif
+
+#ifndef EGL_KHR_image
+#define EGL_KHR_image 1
+#define EGL_NATIVE_PIXMAP_KHR			0x30B0	/* eglCreateImageKHR target */
+typedef void *EGLImageKHR;
+#define EGL_NO_IMAGE_KHR			((EGLImageKHR)0)
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLImageKHR EGLAPIENTRY eglCreateImageKHR (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list);
+EGLAPI EGLBoolean EGLAPIENTRY eglDestroyImageKHR (EGLDisplay dpy, EGLImageKHR image);
+#endif /* EGL_EGLEXT_PROTOTYPES */
+typedef EGLImageKHR (EGLAPIENTRYP PFNEGLCREATEIMAGEKHRPROC) (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYIMAGEKHRPROC) (EGLDisplay dpy, EGLImageKHR image);
+#endif
+
+#ifndef EGL_KHR_vg_parent_image
+#define EGL_KHR_vg_parent_image 1
+#define EGL_VG_PARENT_IMAGE_KHR			0x30BA	/* eglCreateImageKHR target */
+#endif
+
+#ifndef EGL_KHR_gl_texture_2D_image
+#define EGL_KHR_gl_texture_2D_image 1
+#define EGL_GL_TEXTURE_2D_KHR			0x30B1	/* eglCreateImageKHR target */
+#define EGL_GL_TEXTURE_LEVEL_KHR		0x30BC	/* eglCreateImageKHR attribute */
+#endif
+
+#ifndef EGL_KHR_gl_texture_cubemap_image
+#define EGL_KHR_gl_texture_cubemap_image 1
+#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR	0x30B3	/* eglCreateImageKHR target */
+#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR	0x30B4	/* eglCreateImageKHR target */
+#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR	0x30B5	/* eglCreateImageKHR target */
+#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR	0x30B6	/* eglCreateImageKHR target */
+#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR	0x30B7	/* eglCreateImageKHR target */
+#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR	0x30B8	/* eglCreateImageKHR target */
+#endif
+
+#ifndef EGL_KHR_gl_texture_3D_image
+#define EGL_KHR_gl_texture_3D_image 1
+#define EGL_GL_TEXTURE_3D_KHR			0x30B2	/* eglCreateImageKHR target */
+#define EGL_GL_TEXTURE_ZOFFSET_KHR		0x30BD	/* eglCreateImageKHR attribute */
+#endif
+
+#ifndef EGL_KHR_gl_renderbuffer_image
+#define EGL_KHR_gl_renderbuffer_image 1
+#define EGL_GL_RENDERBUFFER_KHR			0x30B9	/* eglCreateImageKHR target */
+#endif
+
+#ifndef EGL_KHR_reusable_sync
+#define EGL_KHR_reusable_sync 1
+
+typedef void* EGLSyncKHR;
+typedef khronos_utime_nanoseconds_t EGLTimeKHR;
+
+#define EGL_SYNC_STATUS_KHR			0x30F1
+#define EGL_SIGNALED_KHR			0x30F2
+#define EGL_UNSIGNALED_KHR			0x30F3
+#define EGL_TIMEOUT_EXPIRED_KHR			0x30F5
+#define EGL_CONDITION_SATISFIED_KHR		0x30F6
+#define EGL_SYNC_TYPE_KHR			0x30F7
+#define EGL_SYNC_REUSABLE_KHR			0x30FA
+#define EGL_SYNC_FLUSH_COMMANDS_BIT_KHR		0x0001	/* eglClientWaitSyncKHR <flags> bitfield */
+#define EGL_FOREVER_KHR				0xFFFFFFFFFFFFFFFFull
+#define EGL_NO_SYNC_KHR				((EGLSyncKHR)0)
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLSyncKHR EGLAPIENTRY eglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list);
+EGLAPI EGLBoolean EGLAPIENTRY eglDestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync);
+EGLAPI EGLint EGLAPIENTRY eglClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout);
+EGLAPI EGLBoolean EGLAPIENTRY eglSignalSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode);
+EGLAPI EGLBoolean EGLAPIENTRY eglGetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value);
+#endif /* EGL_EGLEXT_PROTOTYPES */
+typedef EGLSyncKHR (EGLAPIENTRYP PFNEGLCREATESYNCKHRPROC) (EGLDisplay dpy, EGLenum type, const EGLint *attrib_list);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync);
+typedef EGLint (EGLAPIENTRYP PFNEGLCLIENTWAITSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSIGNALSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETSYNCATTRIBKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value);
+#endif
+
+#ifndef EGL_KHR_image_base
+#define EGL_KHR_image_base 1
+/* Most interfaces defined by EGL_KHR_image_pixmap above */
+#define EGL_IMAGE_PRESERVED_KHR			0x30D2	/* eglCreateImageKHR attribute */
+#endif
+
+#ifndef EGL_KHR_image_pixmap
+#define EGL_KHR_image_pixmap 1
+/* Interfaces defined by EGL_KHR_image above */
+#endif
+
+#ifndef EGL_IMG_context_priority
+#define EGL_IMG_context_priority 1
+#define EGL_CONTEXT_PRIORITY_LEVEL_IMG		0x3100
+#define EGL_CONTEXT_PRIORITY_HIGH_IMG		0x3101
+#define EGL_CONTEXT_PRIORITY_MEDIUM_IMG		0x3102
+#define EGL_CONTEXT_PRIORITY_LOW_IMG		0x3103
+#endif
+
+#ifndef EGL_NV_coverage_sample
+#define EGL_NV_coverage_sample 1
+#define EGL_COVERAGE_BUFFERS_NV 0x30E0
+#define EGL_COVERAGE_SAMPLES_NV 0x30E1
+#endif
+
+#ifndef EGL_NV_depth_nonlinear
+#define EGL_NV_depth_nonlinear 1
+#define EGL_DEPTH_ENCODING_NV 0x30E2
+#define EGL_DEPTH_ENCODING_NONE_NV 0
+#define EGL_DEPTH_ENCODING_NONLINEAR_NV 0x30E3
+#endif
+
+#ifndef EGL_NV_sync
+#define EGL_NV_sync 1
+#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE_NV	0x30E6
+#define EGL_SYNC_STATUS_NV			0x30E7
+#define EGL_SIGNALED_NV				0x30E8
+#define EGL_UNSIGNALED_NV			0x30E9
+#define EGL_SYNC_FLUSH_COMMANDS_BIT_NV		0x0001
+#define EGL_FOREVER_NV				0xFFFFFFFFFFFFFFFFull
+#define EGL_ALREADY_SIGNALED_NV			0x30EA
+#define EGL_TIMEOUT_EXPIRED_NV			0x30EB
+#define EGL_CONDITION_SATISFIED_NV		0x30EC
+#define EGL_SYNC_TYPE_NV			0x30ED
+#define EGL_SYNC_CONDITION_NV			0x30EE
+#define EGL_SYNC_FENCE_NV			0x30EF
+#define EGL_NO_SYNC_NV				((EGLSyncNV)0)
+typedef void* EGLSyncNV;
+typedef unsigned long long EGLTimeNV;
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLSyncNV eglCreateFenceSyncNV (EGLDisplay dpy, EGLenum condition, const EGLint *attrib_list);
+EGLBoolean eglDestroySyncNV (EGLSyncNV sync);
+EGLBoolean eglFenceNV (EGLSyncNV sync);
+EGLint eglClientWaitSyncNV (EGLSyncNV sync, EGLint flags, EGLTimeNV timeout);
+EGLBoolean eglSignalSyncNV (EGLSyncNV sync, EGLenum mode);
+EGLBoolean eglGetSyncAttribNV (EGLSyncNV sync, EGLint attribute, EGLint *value);
+#endif /* EGL_EGLEXT_PROTOTYPES */
+typedef EGLSyncNV (EGLAPIENTRYP PFNEGLCREATEFENCESYNCNVPROC) (EGLDisplay dpy, EGLenum condition, const EGLint *attrib_list);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSYNCNVPROC) (EGLSyncNV sync);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLFENCENVPROC) (EGLSyncNV sync);
+typedef EGLint (EGLAPIENTRYP PFNEGLCLIENTWAITSYNCNVPROC) (EGLSyncNV sync, EGLint flags, EGLTimeNV timeout);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSIGNALSYNCNVPROC) (EGLSyncNV sync, EGLenum mode);
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETSYNCATTRIBNVPROC) (EGLSyncNV sync, EGLint attribute, EGLint *value);
+#endif
+
+#ifndef EGL_KHR_fence_sync
+#define EGL_KHR_fence_sync 1
+/* Reuses most tokens and entry points from EGL_KHR_reusable_sync */
+#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR	0x30F0
+#define EGL_SYNC_CONDITION_KHR			0x30F8
+#define EGL_SYNC_FENCE_KHR			0x30F9
+#endif
+
+#ifndef EGL_ANDROID_image_native_buffer
+#define EGL_ANDROID_image_native_buffer 1
+struct android_native_buffer_t;
+#define EGL_NATIVE_BUFFER_ANDROID       0x3140  /* eglCreateImageKHR target */
+#endif
+
+#ifndef EGL_ANDROID_swap_rectangle
+#define EGL_ANDROID_swap_rectangle 1
+#ifdef EGL_EGLEXT_PROTOTYPES
+EGLAPI EGLBoolean EGLAPIENTRY eglSetSwapRectangleANDROID (EGLDisplay dpy, EGLSurface draw, EGLint left, EGLint top, EGLint width, EGLint height);
+#endif /* EGL_EGLEXT_PROTOTYPES */
+typedef EGLBoolean (EGLAPIENTRYP PFNEGLSETSWAPRECTANGLEANDROIDPROC) (EGLDisplay dpy, EGLSurface draw, EGLint left, EGLint top, EGLint width, EGLint height);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/tools/emulator/opengl/host/libs/Translator/include/EGL/eglplatform.h b/tools/emulator/opengl/host/libs/Translator/include/EGL/eglplatform.h
new file mode 100644
index 0000000..8ee5634
--- /dev/null
+++ b/tools/emulator/opengl/host/libs/Translator/include/EGL/eglplatform.h
@@ -0,0 +1,109 @@
+#ifndef __eglplatform_h_
+#define __eglplatform_h_
+/*
+** Copyright (c) 2007-2009 The Khronos Group Inc.
+**
+** Permission is hereby granted, free of charge, to any person obtaining a
+** copy of this software and/or associated documentation files (the
+** "Materials"), to deal in the Materials without restriction, including
+** without limitation the rights to use, copy, modify, merge, publish,
+** distribute, sublicense, and/or sell copies of the Materials, and to
+** permit persons to whom the Materials are furnished to do so, subject to
+** the following conditions:
+**
+** The above copyright notice and this permission notice shall be included
+** in all copies or substantial portions of the Materials.
+**
+** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+*/
+
+/* Platform-specific types and definitions for egl.h
+ * $Revision: 9724 $ on $Date: 2009-12-02 02:05:33 -0800 (Wed, 02 Dec 2009) $
+ *
+ * Adopters may modify khrplatform.h and this file to suit their platform.
+ * You are encouraged to submit all modifications to the Khronos group so that
+ * they can be included in future versions of this file.  Please submit changes
+ * by sending them to the public Khronos Bugzilla (http://khronos.org/bugzilla)
+ * by filing a bug against product "EGL" component "Registry".
+ */
+#include <KHR/khrplatform.h>
+
+/* Macros used in EGL function prototype declarations.
+ *
+ * EGL functions should be prototyped as:
+ *
+ * EGLAPI return-type EGLAPIENTRY eglFunction(arguments);
+ * typedef return-type (EXPAPIENTRYP PFNEGLFUNCTIONPROC) (arguments);
+ *
+ * KHRONOS_APICALL and KHRONOS_APIENTRY are defined in KHR/khrplatform.h
+ */
+
+#ifndef EGLAPI
+#define EGLAPI KHRONOS_APICALL
+#endif
+
+#ifndef EGLAPIENTRY
+#define EGLAPIENTRY  KHRONOS_APIENTRY
+#endif
+#define EGLAPIENTRYP EGLAPIENTRY*
+
+/* The types NativeDisplayType, NativeWindowType, and NativePixmapType
+ * are aliases of window-system-dependent types, such as X Display * or
+ * Windows Device Context. They must be defined in platform-specific
+ * code below. The EGL-prefixed versions of Native*Type are the same
+ * types, renamed in EGL 1.3 so all types in the API start with "EGL".
+ */
+
+#if defined(_WIN32) || defined(__VC32__) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) /* Win32 and WinCE */
+#ifndef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN 1
+#endif
+#include <windows.h>
+
+typedef PIXELFORMATDESCRIPTOR EGLNativePixelFormatType;
+typedef HGLRC                 EGLNativeContextType;
+typedef HPBUFFERARB           EGLNativePbufferType;
+typedef HDC                   EGLNativeDisplayType;
+typedef HBITMAP               EGLNativePixmapType;
+typedef HWND                  EGLNativeWindowType;
+
+#elif defined(__unix__)
+
+/* X11 (tentative)  */
+#include <GL/glx.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+
+typedef GLXFBConfig         EGLNativePixelFormatType;
+typedef GLXContext          EGLNativeContextType;
+typedef GLXPbuffer          EGLNativePbufferType;
+typedef Display *           EGLNativeDisplayType;
+typedef Pixmap              EGLNativePixmapType;
+typedef Window              EGLNativeWindowType;
+
+#else
+#error "Platform not recognized"
+#endif
+
+/* EGL 1.2 types, renamed for consistency in EGL 1.3 */
+typedef EGLNativeDisplayType NativeDisplayType;
+typedef EGLNativePixmapType  NativePixmapType;
+typedef EGLNativeWindowType  NativeWindowType;
+
+
+/* Define EGLint. This must be a signed integral type large enough to contain
+ * all legal attribute names and values passed into and out of EGL, whether
+ * their type is boolean, bitmask, enumerant (symbolic constant), integer,
+ * handle, or other.  While in general a 32-bit integer will suffice, if
+ * handles are 64 bit types, then EGLint should be defined as a signed 64-bit
+ * integer type.
+ */
+typedef khronos_int32_t EGLint;
+
+#endif /* __eglplatform_h */