GLES2 translator: workaround for nvidia bug with GL_VALIDATE_STAUS
nvidia may return GL_VALIDATE_STATUS = GL_TRUE even when the program does not link
this change checks for GL_LINK_STATUS when GL_VALIDATE_STATUS is queried
Change-Id: Ia9f5da9c71b8666ce929d8cc2a44639bc947eecb
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 685c672..9ebbc18 100644
--- a/tools/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp
+++ b/tools/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp
@@ -935,6 +935,21 @@
params[0] = programData->getLinkStatus();
}
break;
+#ifdef NV_WAR
+ //validate status should not return GL_TRUE if link failed
+ case GL_VALIDATE_STATUS:
+ {
+ ObjectDataPtr objData = thrd->shareGroup->getObjectData(SHADER,program);
+ SET_ERROR_IF(!objData.Ptr() ,GL_INVALID_OPERATION);
+ SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
+ ProgramData* programData = (ProgramData*)objData.Ptr();
+ if (programData->getLinkStatus()==GL_TRUE)
+ ctx->dispatcher().glGetProgramiv(globalProgramName,pname,params);
+ else
+ params[0] = GL_FALSE;
+ }
+ break;
+#endif
default:
ctx->dispatcher().glGetProgramiv(globalProgramName,pname,params);
}