GLESv2 Translator: fix glGet*

Override glGet* for parameters that request information that have local namespace
convert global names to local names before returning the value

Change-Id: Ie334419b6a5ffe4904d8efe0827a30beaf8b2f6c
diff --git a/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLEScmImp.cpp b/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLEScmImp.cpp
index 33a9b93..876ba0f 100644
--- a/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLEScmImp.cpp
+++ b/tools/emulator/opengl/host/libs/Translator/GLES_CM/GLEScmImp.cpp
@@ -687,18 +687,14 @@
 
     switch(pname)
     {
-    case GL_IMPLEMENTATION_COLOR_READ_TYPE_OES:
-    case GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES:
-    case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
-        glGetIntegerv(pname, &i);
-        *params = (i != 0) ? GL_TRUE : GL_FALSE;
-        break;
-
-    case GL_COMPRESSED_TEXTURE_FORMATS:
-        glGetIntegerv(GL_NUM_COMPRESSED_TEXTURE_FORMATS, &i);
-        *params = (i != 0) ? GL_TRUE : GL_FALSE;
-        break;
-
+    case GL_FRAMEBUFFER_BINDING_OES:
+    case GL_RENDERBUFFER_BINDING_OES:
+        {
+            GLint name;
+            glGetIntegerv(pname,&name);
+            *params = name!=0 ? GL_TRUE: GL_FALSE;
+        }
+    break;
     case GL_TEXTURE_GEN_STR_OES:
         {
             GLboolean state_s = GL_FALSE;
@@ -709,8 +705,7 @@
             ctx->dispatcher().glGetBooleanv(GL_TEXTURE_GEN_R,&state_r);
             *params = state_s && state_t && state_r ? GL_TRUE: GL_FALSE;
         }
-        break;
-
+    break;
     default:
         ctx->dispatcher().glGetBooleanv(pname,params);
     }
@@ -766,33 +761,11 @@
 
     switch(pname)
     {
-    case GL_IMPLEMENTATION_COLOR_READ_TYPE_OES:
-    case GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES:
-    case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
-        glGetIntegerv(pname, &i);
-        *params = I2X(i);
-        nParams = 0;
-        break;
-
-    case GL_COMPRESSED_TEXTURE_FORMATS:
-        glGetIntegerv(GL_NUM_COMPRESSED_TEXTURE_FORMATS, &i);
-        if(i > 0)
-        {
-            GLint* iParams = new GLint[i];
-            glGetIntegerv(GL_COMPRESSED_TEXTURE_FORMATS, iParams);
-            while(i >= 0)
-            {
-                params[i] = I2X(iParams[i]);
-                i--;
-            }
-            delete [] iParams;
-        }
-        break;
-
+    case GL_FRAMEBUFFER_BINDING_OES:
+    case GL_RENDERBUFFER_BINDING_OES:
     case GL_TEXTURE_GEN_STR_OES:
-        ctx->dispatcher().glGetFloatv(GL_TEXTURE_GEN_S,&fParams[0]);
+        glGetFloatv(pname,&fParams[0]);
         break;
-
     default:
         ctx->dispatcher().glGetFloatv(pname,fParams);
     }
@@ -815,34 +788,13 @@
 
     GLint i;
 
-    switch(pname)
-    {
-    case GL_IMPLEMENTATION_COLOR_READ_TYPE_OES:
-    case GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES:
-    case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
-        glGetIntegerv(pname, &i);
+    switch (pname) {
+    case GL_FRAMEBUFFER_BINDING_OES:
+    case GL_RENDERBUFFER_BINDING_OES:
+    case GL_TEXTURE_GEN_STR_OES:
+        glGetIntegerv(pname,&i);
         *params = (GLfloat)i;
         break;
-
-    case GL_COMPRESSED_TEXTURE_FORMATS:
-        glGetIntegerv(GL_NUM_COMPRESSED_TEXTURE_FORMATS, &i);
-        if(i > 0)
-        {
-            GLint* iParams = new GLint[i];
-            glGetIntegerv(GL_COMPRESSED_TEXTURE_FORMATS, iParams);
-            while(i >= 0)
-            {
-                params[i] = (GLfloat)iParams[i];
-                i--;
-            }
-            delete [] iParams;
-        }
-        break;
-
-    case GL_TEXTURE_GEN_STR_OES:
-        ctx->dispatcher().glGetFloatv(GL_TEXTURE_GEN_S,&params[0]);
-        break;
-
     default:
         ctx->dispatcher().glGetFloatv(pname,params);
     }
@@ -855,29 +807,26 @@
     {
         return;
     }
+    
+    GLint i;
 
     switch(pname)
     {
-    case GL_IMPLEMENTATION_COLOR_READ_TYPE_OES:
-        *params = GL_UNSIGNED_BYTE;
-        break;
-
-    case GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES:
-        *params = GL_RGBA;
-        break;
-
     case GL_TEXTURE_GEN_STR_OES:
         ctx->dispatcher().glGetIntegerv(GL_TEXTURE_GEN_S,&params[0]);
         break;
-
-    case GL_COMPRESSED_TEXTURE_FORMATS:
-        getCompressedFormats(params);
+    case GL_FRAMEBUFFER_BINDING_OES:
+        if (thrd->shareGroup.Ptr()) {
+            ctx->dispatcher().glGetIntegerv(pname,&i);
+            *params = thrd->shareGroup->getLocalName(FRAMEBUFFER,i);
+        }
         break;
-
-    case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
-        *params = getCompressedFormats(NULL);
+    case GL_RENDERBUFFER_BINDING_OES:
+        if (thrd->shareGroup.Ptr()) {
+            ctx->dispatcher().glGetIntegerv(pname,&i);
+            *params = thrd->shareGroup->getLocalName(RENDERBUFFER,i);
+        }
         break;
-
     default:
         ctx->dispatcher().glGetIntegerv(pname,params);
     }
diff --git a/tools/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp b/tools/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp
index 652a769..57c1052 100644
--- a/tools/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp
+++ b/tools/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp
@@ -638,7 +638,9 @@
 
 GL_APICALL void  GL_APIENTRY glGetBooleanv(GLenum pname, GLboolean* params){
     GET_CTX();
-    ctx->dispatcher().glGetBooleanv(pname,params);
+    if (!ctx->glGetBooleanv(pname,params)) {
+        ctx->dispatcher().glGetBooleanv(pname,params);
+    }
 }
 
 GL_APICALL void  GL_APIENTRY glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params){
@@ -669,12 +671,55 @@
 
 GL_APICALL void  GL_APIENTRY glGetFloatv(GLenum pname, GLfloat* params){
     GET_CTX();
-    ctx->dispatcher().glGetFloatv(pname,params);
+    if (ctx->glGetFloatv(pname,params)) {
+        return;
+    }
+    GLint i;
+    switch (pname) {
+    case GL_CURRENT_PROGRAM:
+    case GL_FRAMEBUFFER_BINDING:
+    case GL_RENDERBUFFER_BINDING:
+        glGetIntegerv(pname,&i);
+        *params = (GLfloat)i;
+        break;
+
+    default:
+        ctx->dispatcher().glGetFloatv(pname,params);
+    }
 }
 
 GL_APICALL void  GL_APIENTRY glGetIntegerv(GLenum pname, GLint* params){
     GET_CTX();
-    ctx->dispatcher().glGetIntegerv(pname,params);
+
+    if (ctx->glGetIntegerv(pname,params))
+    {
+        return;
+    }
+  
+    GLint i;
+
+    switch (pname) {
+    case GL_CURRENT_PROGRAM:
+        if (thrd->shareGroup.Ptr()) {
+            ctx->dispatcher().glGetIntegerv(pname,&i);
+            *params = thrd->shareGroup->getLocalName(SHADER,i);
+        }
+        break;
+    case GL_FRAMEBUFFER_BINDING:
+        if (thrd->shareGroup.Ptr()) {
+            ctx->dispatcher().glGetIntegerv(pname,&i);
+            *params = thrd->shareGroup->getLocalName(FRAMEBUFFER,i);
+        }
+        break;
+    case GL_RENDERBUFFER_BINDING:
+        if (thrd->shareGroup.Ptr()) {
+            ctx->dispatcher().glGetIntegerv(pname,&i);
+            *params = thrd->shareGroup->getLocalName(RENDERBUFFER,i);
+        }
+        break;
+    default:
+        ctx->dispatcher().glGetIntegerv(pname,params);
+    }
 }
 
 GL_APICALL void  GL_APIENTRY glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params){
diff --git a/tools/emulator/opengl/host/libs/Translator/GLcommon/GLEScontext.cpp b/tools/emulator/opengl/host/libs/Translator/GLcommon/GLEScontext.cpp
index 358a94c..51d4bcf 100644
--- a/tools/emulator/opengl/host/libs/Translator/GLcommon/GLEScontext.cpp
+++ b/tools/emulator/opengl/host/libs/Translator/GLcommon/GLEScontext.cpp
@@ -538,29 +538,59 @@
 
 bool GLEScontext::glGetFixedv(GLenum pname, GLfixed *params)
 {
-    GLint iParam;
+    bool result = false;
+    GLint numParams = 1;
 
-    if(glGetIntegerv(pname, &iParam))
+    switch(pname)
     {
-        *params = I2X(iParam);
-        return true;
+    case GL_COMPRESSED_TEXTURE_FORMATS:
+        glGetIntegerv(GL_NUM_COMPRESSED_TEXTURE_FORMATS, &numParams);
+        break;
+    default:
+        numParams=1;
     }
 
-    return false;
+    GLint* iParams = new GLint[numParams];
+    if (numParams>0 && glGetIntegerv(pname,iParams)) {
+        while(numParams >= 0)
+        {
+            params[numParams] = I2X(iParams[numParams]);
+            numParams--;
+        }
+        result = true;
+    }
+    delete [] iParams;
+
+    return result;
 }
 
 bool GLEScontext::glGetFloatv(GLenum pname, GLfloat *params)
 {
-    GLint iParam;
+    bool result = false;
+    GLint numParams = 1;
 
-    if(glGetIntegerv(pname, &iParam))
+    switch(pname)
     {
-        *params = (GLfloat)iParam;
-        return true;
+    case GL_COMPRESSED_TEXTURE_FORMATS:
+        glGetIntegerv(GL_NUM_COMPRESSED_TEXTURE_FORMATS, &numParams);
+        break;
+    default:
+        numParams=1;
     }
 
-    return false;
-}
+    GLint* iParams = new GLint[numParams];
+    if (numParams>0 && glGetIntegerv(pname,iParams)) {
+        while(numParams >= 0)
+        {
+            params[numParams] = (GLfloat)iParams[numParams];
+            numParams--;
+        }
+        result = true;
+    }
+    delete [] iParams;
+
+    return result;
+}        
 
 bool GLEScontext::glGetIntegerv(GLenum pname, GLint *params)
 {
@@ -574,10 +604,31 @@
             *params = m_elementBuffer;
             break;
 
+        case GL_TEXTURE_BINDING_CUBE_MAP:
         case GL_TEXTURE_BINDING_2D:
             *params = m_tex2DBind[m_activeTexture].texture;
             break;
 
+        case GL_ACTIVE_TEXTURE:
+            *params = m_activeTexture+GL_TEXTURE0;
+            break;
+
+        case GL_COMPRESSED_TEXTURE_FORMATS:
+            getCompressedFormats(params);
+            break;
+        
+        case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
+            *params = getCompressedFormats(NULL);
+            break;
+        
+        case GL_IMPLEMENTATION_COLOR_READ_TYPE_OES:
+            *params = GL_UNSIGNED_BYTE;
+            break;
+
+        case GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES:
+            *params = GL_RGBA;
+            break;
+
         default:
             return false;
     }