integrating objectNameManger into GLES implementation

Change-Id: Icda250f9e9d3af15a2d7c214136b777833d5596d
diff --git a/tools/emulator/opengl/host/libs/Translator/EGL/EglImp.cpp b/tools/emulator/opengl/host/libs/Translator/EGL/EglImp.cpp
index 8931811..94e3cec 100644
--- a/tools/emulator/opengl/host/libs/Translator/EGL/EglImp.cpp
+++ b/tools/emulator/opengl/host/libs/Translator/EGL/EglImp.cpp
@@ -443,7 +443,7 @@
     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])) {
+            if(!pbSurface->setAttrib(attrib_list[i],attrib_list[i+1])) {
                 RETURN_ERROR(EGL_NO_SURFACE,EGL_BAD_ATTRIBUTE);
             }
             i+=2;
@@ -502,8 +502,8 @@
     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()));
+        if(surface->type() == EglSurface::PBUFFER) {
+            EglOS::releasePbuffer(dpy->nativeType(),reinterpret_cast<EGLNativePbufferType>(surface->native()));
             return true;
         }
     }
@@ -516,7 +516,7 @@
         RETURN_ERROR(EGL_FALSE,EGL_BAD_SURFACE);
     }
 
-    srfc.Ptr()->destroy(); //mark surface for destruction
+    srfc->destroy(); //mark surface for destruction
     if(destroySurfaceIfNotCurrent(dpy,srfc)) { //removes surface from the list if not current
         dpy->removeSurface(surface);
     }
@@ -528,7 +528,7 @@
    VALIDATE_DISPLAY(display);
    VALIDATE_SURFACE(surface,srfc);
 
-   if(!srfc.Ptr()->getAttrib(attribute,value)) {
+   if(!srfc->getAttrib(attribute,value)) {
        RETURN_ERROR(EGL_FALSE,EGL_BAD_ATTRIBUTE);
    }
    return EGL_TRUE;
@@ -538,7 +538,7 @@
                 EGLint attribute, EGLint value) {
    VALIDATE_DISPLAY(display);
    VALIDATE_SURFACE(surface,srfc);
-   if(!srfc.Ptr()->setAttrib(attribute,value)) {
+   if(!srfc->setAttrib(attribute,value)) {
        RETURN_ERROR(EGL_FALSE,EGL_BAD_ATTRIBUTE);
    }
    return EGL_TRUE;
@@ -586,7 +586,7 @@
         nativeShared = sharedCtxPtr->nativeType();
     }
 
-    EGLNativeContextType nativeContext = EglOS::createContext(dpy->nativeType(),cfg,nativeShared);
+    EGLNativeContextType nativeContext = EglOS::createContext(dpy->nativeType(),cfg,static_cast<EGLNativeContextType>(dpy->getManager(version)->getGlobalContext()));
     if(nativeContext) {
         ContextPtr ctx(new EglContext(nativeContext,sharedCtxPtr,cfg,glesCtx,version,dpy->getManager(version)));
         return dpy->addContext(ctx);
@@ -602,7 +602,7 @@
     ThreadInfo* thread  = getThreadInfo();
     EglContext* currCtx = static_cast<EglContext*>(thread->eglContext);
   if(ctx.Ptr() != currCtx ){
-      EglOS::destroyContext(dpy->nativeType(),ctx.Ptr()->nativeType());
+      EglOS::destroyContext(dpy->nativeType(),ctx->nativeType());
       return true;
   }
   return false;
@@ -612,9 +612,9 @@
     VALIDATE_DISPLAY(display);
     VALIDATE_CONTEXT(context);
 
-    ctx.Ptr()->destroy(); //mark for destruction
+    ctx->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());
+        g_eglInfo->getIface(ctx->version())->deleteGLESContext(ctx->getGlesContext());
         dpy->removeContext(context);
     }
     return EGL_TRUE;
@@ -646,7 +646,8 @@
                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));
+           g_eglInfo->getIface(prevCtx->version())->setShareGroup(newCtx->getGlesContext(),ShareGroupPtr(NULL));
+           ctx->setSurfaces(SurfacePtr(NULL),SurfacePtr(NULL));
        }
     } else { //assining new context
         //surfaces compitability check
@@ -682,6 +683,7 @@
         thread->updateInfo(newCtx,dpy,newCtx->getGlesContext(),newCtx->getShareGroup(),dpy->getManager(newCtx->version()));
         newCtx->setSurfaces(newReadSrfc,newDrawSrfc);
         g_eglInfo->getIface(newCtx->version())->initContext(newCtx->getGlesContext());
+        g_eglInfo->getIface(newCtx->version())->setShareGroup(newCtx->getGlesContext(),newCtx->getShareGroup());
     }
 
     SurfacePtr  prevRead;
@@ -689,13 +691,13 @@
     //removing terminated surfaces & context
     if(prevCtx) {
         prevRead = prevCtx->read();
-        if(prevRead.Ptr()->destroy()){
+        if(prevRead->destroy()){
             if(destroySurfaceIfNotCurrent(dpy,prevRead)) { //removes surface from the list if not current
                 dpy->removeSurface(prevRead);
             }
         }
         prevDraw = prevCtx->draw();
-        if(prevDraw.Ptr()->destroy()){
+        if(prevDraw->destroy()){
             if(destroySurfaceIfNotCurrent(dpy,prevDraw)) { //removes surface from the list if not current
                 dpy->removeSurface(prevDraw);
             }
@@ -731,7 +733,7 @@
 
 
     //if surface not window return
-    if(Srfc.Ptr()->type() != EglSurface::WINDOW){
+    if(Srfc->type() != EglSurface::WINDOW){
         RETURN_ERROR(EGL_TRUE,EGL_SUCCESS);
     }
 
@@ -739,7 +741,7 @@
         RETURN_ERROR(EGL_FALSE,EGL_BAD_SURFACE);
     }
 
-    EglOS::swapBuffers(dpy->nativeType(),reinterpret_cast<EGLNativeWindowType>(Srfc.Ptr()->native()));
+    EglOS::swapBuffers(dpy->nativeType(),reinterpret_cast<EGLNativeWindowType>(Srfc->native()));
     return EGL_TRUE;
 }
 
@@ -748,10 +750,10 @@
     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) {
+        if(!currCtx->read().Ptr() || !currCtx->draw().Ptr() || currCtx->draw()->type()!=EglSurface::WINDOW) {
             RETURN_ERROR(EGL_FALSE,EGL_BAD_CURRENT_SURFACE);
         }
-        EglOS::swapInterval(dpy->nativeType(),reinterpret_cast<EGLNativeWindowType>(currCtx->draw().Ptr()->native()),interval);
+        EglOS::swapInterval(dpy->nativeType(),reinterpret_cast<EGLNativeWindowType>(currCtx->draw()->native()),interval);
     } else {
             RETURN_ERROR(EGL_FALSE,EGL_BAD_SURFACE);
     }
diff --git a/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLESbuffer.h b/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLESbuffer.h
index e1326fc..5c4ce78 100644
--- a/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLESbuffer.h
+++ b/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLESbuffer.h
@@ -18,11 +18,12 @@
 
 #include <stdio.h>
 #include <GLES/gl.h>
+#include <GLcommon/objectNameManager.h>
 #include "RangeManip.h"
 
-class GLESbuffer {
+class GLESbuffer: public ObjectData {
 public:
-   GLESbuffer():m_size(0),m_usage(GL_STATIC_DRAW),m_data(NULL){}
+   GLESbuffer():m_size(0),m_usage(GL_STATIC_DRAW),m_data(NULL),m_wasBound(false){}
    GLuint getSize(){return m_size;};
    GLuint getUsage(){return m_usage;};
    GLvoid* getData(){ return m_data;}
@@ -30,6 +31,8 @@
    bool  setSubBuffer(GLint offset,GLuint size,const GLvoid* data);
    void  getConversions(const RangeList& rIn,RangeList& rOut);
    bool  fullyConverted(){return m_conversionManager.size() == 0;};
+   void  setBinded(){m_wasBound = true;};
+   bool  wasBinded(){return m_wasBound;};
    ~GLESbuffer();
 
 private:
@@ -37,6 +40,8 @@
     GLuint         m_usage;
     unsigned char* m_data;
     RangeList      m_conversionManager;
+    bool           m_wasBound;
 };
 
+typedef SmartPtr<GLESbuffer> GLESbufferPtr;
 #endif
diff --git a/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLEScontext.cpp b/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLEScontext.cpp
index 1f9a1e5..ad56ba3 100644
--- a/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLEScontext.cpp
+++ b/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLEScontext.cpp
@@ -65,7 +65,7 @@
     m_initialized = true;
 }
 
-GLEScontext::GLEScontext():m_glError(GL_NO_ERROR),m_activeTexture(0),m_arrayBuffer(0),m_elementBuffer(0),m_minAvailableBuffer(1),m_pointsIndex(-1),m_initialized(false) {
+GLEScontext::GLEScontext():m_glError(GL_NO_ERROR),m_activeTexture(0),m_arrayBuffer(0),m_elementBuffer(0),m_pointsIndex(-1),m_initialized(false) {
 
     s_glDispatch.dispatchFuncs();
 
@@ -96,8 +96,9 @@
     GLuint bufferName = m_arrayBuffer;
     if(bufferName) {
         unsigned int offset = reinterpret_cast<unsigned int>(data);
-        m_map[arrType]->setBuffer(size,type,stride,m_vbos[bufferName],offset);
-        return  static_cast<const unsigned char*>(m_vbos[bufferName]->getData()) +  offset;
+        GLESbuffer* vbo = static_cast<GLESbuffer*>(m_shareGroup->getObjectData(VERTEXBUFFER,bufferName).Ptr());
+        m_map[arrType]->setBuffer(size,type,stride,vbo,offset);
+        return  static_cast<const unsigned char*>(vbo->getData()) +  offset;
     }
     m_map[arrType]->setArray(size,type,stride,data);
     return data;
@@ -444,45 +445,12 @@
     drawPointsData(arrs,0,count,type,indices_in,true);
 }
 
-void GLEScontext:: genBuffers(GLsizei n,GLuint* buffers)
-{
-    int i = 0;
-    while(i < n) {
-        if(m_vbos.find(m_minAvailableBuffer) == m_vbos.end()) {
-           buffers[i++] = m_minAvailableBuffer;;
-           m_vbos[m_minAvailableBuffer] = new GLESbuffer();
-        }
-        m_minAvailableBuffer++;
-    }
-}
-
-void GLEScontext::deleteBuffers(GLsizei n,const GLuint* buffers) {
-    for(int i = 0; i < n ;i++) {
-       if(m_vbos.find(buffers[i]) != m_vbos.end()) {
-           if(m_vbos[buffers[i]]) delete m_vbos[buffers[i]];
-           if(buffers[i] < m_minAvailableBuffer) m_minAvailableBuffer = buffers[i];
-           m_vbos.erase(buffers[i]);
-       }
-    }
-}
-
 void GLEScontext::bindBuffer(GLenum target,GLuint buffer) {
     if(target == GL_ARRAY_BUFFER) {
         m_arrayBuffer = buffer;
     } else {
        m_elementBuffer = buffer;
     }
-    if(m_vbos.find(buffer) == m_vbos.end()) { // buffer name wasn't generated before
-        m_vbos[buffer] = new GLESbuffer();
-    }
-}
-
-//checks if there is buffer named "buffer" and if this buffer is binded
-bool GLEScontext::isBuffer(GLuint buffer) {
-    if(m_vbos.find(buffer) != m_vbos.end()) {
-       if(m_elementBuffer == buffer || m_arrayBuffer == buffer) return true;
-    }
-    return false;
 }
 
 //checks if any buffer is binded to target
@@ -501,28 +469,34 @@
 GLvoid* GLEScontext::getBindedBuffer(GLenum target) {
     GLuint bufferName = getBuffer(target);
     if(!bufferName) return NULL;
-    return m_vbos[bufferName]->getData();
+    
+    GLESbuffer* vbo = static_cast<GLESbuffer*>(m_shareGroup->getObjectData(VERTEXBUFFER,bufferName).Ptr());
+    return vbo->getData();
 }
 
 void GLEScontext::getBufferSize(GLenum target,GLint* param) {
     GLuint bufferName = getBuffer(target);
-    *param = m_vbos[bufferName]->getSize();
+    GLESbuffer* vbo = static_cast<GLESbuffer*>(m_shareGroup->getObjectData(VERTEXBUFFER,bufferName).Ptr());
+    *param = vbo->getSize();
 }
 
 void GLEScontext::getBufferUsage(GLenum target,GLint* param) {
     GLuint bufferName = getBuffer(target);
-    *param = m_vbos[bufferName]->getUsage();
+    GLESbuffer* vbo = static_cast<GLESbuffer*>(m_shareGroup->getObjectData(VERTEXBUFFER,bufferName).Ptr());
+    *param = vbo->getUsage();
 }
 
 bool GLEScontext::setBufferData(GLenum target,GLsizeiptr size,const GLvoid* data,GLenum usage) {
     GLuint bufferName = getBuffer(target);
     if(!bufferName) return false;
-    return m_vbos[bufferName]->setBuffer(size,usage,data);
+    GLESbuffer* vbo = static_cast<GLESbuffer*>(m_shareGroup->getObjectData(VERTEXBUFFER,bufferName).Ptr());
+    return vbo->setBuffer(size,usage,data);
 }
 
 bool GLEScontext::setBufferSubData(GLenum target,GLintptr offset,GLsizeiptr size,const GLvoid* data) {
 
     GLuint bufferName = getBuffer(target);
     if(!bufferName) return false;
-    return m_vbos[bufferName]->setSubBuffer(offset,size,data);
+    GLESbuffer* vbo = static_cast<GLESbuffer*>(m_shareGroup->getObjectData(VERTEXBUFFER,bufferName).Ptr());
+    return vbo->setSubBuffer(offset,size,data);
 }
diff --git a/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLEScontext.h b/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLEScontext.h
index 7322609..89add7d 100644
--- a/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLEScontext.h
+++ b/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLEScontext.h
@@ -26,7 +26,6 @@
 #define MAX_TEX_UNITS 8
 
 typedef std::map<GLenum,GLESpointer*>  ArraysMap;
-typedef std::map<GLuint,GLESbuffer*>   BuffersMap;
 typedef std::map<GLfloat,std::vector<int> > PointSizeIndices;
 
 struct GLESFloatArrays
@@ -63,8 +62,6 @@
     void drawPointsArrs(GLESFloatArrays& arrs,GLint first,GLsizei count);
     void drawPointsElems(GLESFloatArrays& arrs,GLsizei count,GLenum type,const GLvoid* indices);
 
-    void genBuffers(GLsizei n,GLuint* buffers);
-    void deleteBuffers(GLsizei n,const GLuint* buffers);
     void bindBuffer(GLenum target,GLuint buffer);
     bool isBuffer(GLuint buffer);
     bool isBindedBuffer(GLenum target);
@@ -73,6 +70,7 @@
     void getBufferUsage(GLenum target,GLint* param);
     bool setBufferData(GLenum target,GLsizeiptr size,const GLvoid* data,GLenum usage);
     bool setBufferSubData(GLenum target,GLintptr offset,GLsizeiptr size,const GLvoid* data);
+    void setShareGroup(ShareGroupPtr grp){m_shareGroup = grp;};
 
     static GLDispatch& dispatcher();
     static int getMaxLights(){return s_glSupport.maxLights;}
@@ -104,12 +102,9 @@
     unsigned int          m_activeTexture;
     unsigned int          m_arrayBuffer;
     unsigned int          m_elementBuffer;
-
-    unsigned int          m_minAvailableBuffer;
-    BuffersMap            m_vbos;
-
     int                   m_pointsIndex;
     bool                  m_initialized;
+    ShareGroupPtr         m_shareGroup;
 };
 
 #endif
diff --git a/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLESimp.cpp b/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLESimp.cpp
index ab10a04..ba52c17 100644
--- a/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLESimp.cpp
+++ b/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLESimp.cpp
@@ -33,6 +33,7 @@
 static void initContext(GLEScontext* ctx);
 static GLEScontext* createGLESContext();
 static void deleteGLESContext(GLEScontext* ctx);
+static void setShareGroup(GLEScontext* ctx,ShareGroupPtr grp);
 
 }
 
@@ -42,7 +43,8 @@
     initContext      :initContext,
     deleteGLESContext:deleteGLESContext,
     flush            :glFlush,
-    finish           :glFinish
+    finish           :glFinish,
+    setShareGroup    :setShareGroup
 };
 
 extern "C" {
@@ -59,6 +61,12 @@
     if(ctx) delete ctx;
 }
 
+static void setShareGroup(GLEScontext* ctx,ShareGroupPtr grp) {
+    if(ctx) {
+        ctx->setShareGroup(grp);
+    }
+}
+
 GLESiface* __translator_getIfaces(EGLiface* eglIface){
     s_eglIface = eglIface;
     return & s_glesIface;
@@ -73,7 +81,7 @@
             } else {                                                         \
                 fprintf(stderr,"Context wasn't initialized yet \n");         \
             }
- 
+
 
 #define GET_CTX()                                                            \
             GET_THREAD();                                                    \
@@ -100,7 +108,11 @@
 
 GL_API GLboolean GL_APIENTRY glIsBuffer(GLuint buffer) {
     GET_CTX_RET(GL_FALSE)
-    return ctx->isBuffer(buffer);
+    if(buffer && thrd->shareGroup.Ptr()) {
+       ObjectDataPtr objData = thrd->shareGroup->getObjectData(VERTEXBUFFER,buffer);
+       return objData.Ptr() ? ((GLESbuffer*)objData.Ptr())->wasBinded():GL_FALSE;
+    }
+    return GL_FALSE;
 }
 
 GL_API GLboolean GL_APIENTRY  glIsEnabled( GLenum cap) {
@@ -113,6 +125,9 @@
 
 GL_API GLboolean GL_APIENTRY  glIsTexture( GLuint texture) {
     GET_CTX_RET(GL_FALSE)
+    if(texture && thrd->shareGroup.Ptr()){
+        return thrd->shareGroup->isObject(TEXTURE,texture) ? GL_TRUE :GL_FALSE;
+    }
     return ctx->dispatcher().glIsTexture(texture);
 }
 
@@ -172,13 +187,32 @@
 GL_API void GL_APIENTRY  glBindBuffer( GLenum target, GLuint buffer) {
     GET_CTX()
     SET_ERROR_IF(!GLESvalidate::bufferTarget(target),GL_INVALID_ENUM);
+
+    //if buffer wasn't generated before,generate one
+    if(thrd->shareGroup.Ptr() && !thrd->shareGroup->isObject(VERTEXBUFFER,buffer)){
+        thrd->shareGroup->genName(VERTEXBUFFER,buffer);
+        thrd->shareGroup->setObjectData(VERTEXBUFFER,buffer,ObjectDataPtr(new GLESbuffer()));
+    }
     ctx->bindBuffer(target,buffer);
+    GLESbuffer* vbo = (GLESbuffer*)thrd->shareGroup->getObjectData(VERTEXBUFFER,buffer).Ptr();
+    vbo->wasBinded();
 }
 
+
 GL_API void GL_APIENTRY  glBindTexture( GLenum target, GLuint texture) {
     GET_CTX()
     SET_ERROR_IF(!GLESvalidate::textureTarget(target),GL_INVALID_ENUM)
-    ctx->dispatcher().glBindTexture(target,texture);
+
+    GLuint globalTextureName = texture;
+    if(texture && thrd->shareGroup.Ptr()){
+        globalTextureName = thrd->shareGroup->getGlobalName(TEXTURE,texture);
+        //if texture wasn't generated before,generate one
+        if(!globalTextureName){
+            thrd->shareGroup->genName(TEXTURE,texture);
+            globalTextureName = thrd->shareGroup->getGlobalName(TEXTURE,texture);
+        }
+    }
+    ctx->dispatcher().glBindTexture(target,globalTextureName);
 }
 
 GL_API void GL_APIENTRY  glBlendFunc( GLenum sfactor, GLenum dfactor) {
@@ -340,12 +374,22 @@
 GL_API void GL_APIENTRY  glDeleteBuffers( GLsizei n, const GLuint *buffers) {
     GET_CTX()
     SET_ERROR_IF(n<0,GL_INVALID_VALUE);
-    ctx->deleteBuffers(n,buffers);
+    if(thrd->shareGroup.Ptr()) {
+        for(int i=0; i < n; i++){
+           thrd->shareGroup->deleteName(VERTEXBUFFER,buffers[i]);
+        }
+    }
 }
 
 GL_API void GL_APIENTRY  glDeleteTextures( GLsizei n, const GLuint *textures) {
     GET_CTX()
-    ctx->dispatcher().glDeleteTextures(n,textures);
+    if(thrd->shareGroup.Ptr()) {
+        for(int i=0; i < n; i++){
+           thrd->shareGroup->deleteName(TEXTURE,textures[i]);
+           const GLuint globalTextureName = thrd->shareGroup->getGlobalName(TEXTURE,textures[i]);
+           ctx->dispatcher().glDeleteTextures(1,&globalTextureName);
+        }
+    }
 }
 
 GL_API void GL_APIENTRY  glDepthFunc( GLenum func) {
@@ -490,12 +534,22 @@
 GL_API void GL_APIENTRY  glGenBuffers( GLsizei n, GLuint *buffers) {
     GET_CTX()
     SET_ERROR_IF(n<0,GL_INVALID_VALUE);
-    ctx->genBuffers(n,buffers);
+    if(thrd->shareGroup.Ptr()) {
+        for(int i=0; i<n ;i++) {
+            buffers[i] = thrd->shareGroup->genName(VERTEXBUFFER);
+            //generating vbo object related to this buffer name
+            thrd->shareGroup->setObjectData(VERTEXBUFFER,buffers[i],ObjectDataPtr(new GLESbuffer()));
+        }
+    }
 }
 
 GL_API void GL_APIENTRY  glGenTextures( GLsizei n, GLuint *textures) {
-    GET_CTX()
-    ctx->dispatcher().glGenTextures(n,textures);
+    GET_CTX();
+    if(thrd->shareGroup.Ptr()) {
+        for(int i=0; i<n ;i++) {
+            textures[i] = thrd->shareGroup->genName(TEXTURE);
+        }
+    }
 }
 
 GL_API void GL_APIENTRY  glGetBooleanv( GLenum pname, GLboolean *params) {
diff --git a/tools/emulator/opengl/host/libs/Translator/include/GLcommon/TranslatorIfaces.h b/tools/emulator/opengl/host/libs/Translator/include/GLcommon/TranslatorIfaces.h
index dbf1eb9..a887f9f 100644
--- a/tools/emulator/opengl/host/libs/Translator/include/GLcommon/TranslatorIfaces.h
+++ b/tools/emulator/opengl/host/libs/Translator/include/GLcommon/TranslatorIfaces.h
@@ -27,6 +27,7 @@
     void         (*deleteGLESContext)(GLEScontext*);
     void         (*flush)();
     void         (*finish)();
+    void         (*setShareGroup)(GLEScontext*,ShareGroupPtr);
 }GLESiface;