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,¶ms[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,¶ms[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;
}