From 25b37944197d5ebaf956f97a03e8745144180462 Mon Sep 17 00:00:00 2001 From: Amit Feller Date: Mon, 25 Jul 2011 17:21:39 +0300 Subject: [PATCH] 2.0 translator: link only if both shaders compile A program should be linked only if both vertex and fragment shaders compiled succesfully. Change-Id: I9793da85847fd606883e1e3bef05485ce6037c21 --- .../host/libs/Translator/GLES_V2/GLESv2Imp.cpp | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) 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 b2b290eae..5329556db 100644 --- a/tools/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp +++ b/tools/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp @@ -1257,9 +1257,21 @@ GL_APICALL void GL_APIENTRY glLinkProgram(GLuint 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->getAttachedVertexShader()!=0 && programData->getAttachedFragmentShader()!=0) { - ctx->dispatcher().glLinkProgram(globalProgramName); - ctx->dispatcher().glGetProgramiv(globalProgramName,GL_LINK_STATUS,&linkStatus); + GLint fragmentShader = programData->getAttachedFragmentShader(); + GLint vertexShader = programData->getAttachedVertexShader(); + if (vertexShader != 0 && fragmentShader!=0) { + /* validating that the fragment & vertex shaders were compiled successfuly*/ + GLint fCompileStatus = GL_FALSE; + GLint vCompileStatus = GL_FALSE; + GLuint fragmentShaderGlobal = thrd->shareGroup->getGlobalName(SHADER,fragmentShader); + GLuint vertexShaderGlobal = thrd->shareGroup->getGlobalName(SHADER,vertexShader); + ctx->dispatcher().glGetShaderiv(fragmentShaderGlobal,GL_COMPILE_STATUS,&fCompileStatus); + ctx->dispatcher().glGetShaderiv(vertexShaderGlobal,GL_COMPILE_STATUS,&vCompileStatus); + + if(fCompileStatus != 0 && vCompileStatus != 0){ + ctx->dispatcher().glLinkProgram(globalProgramName); + ctx->dispatcher().glGetProgramiv(globalProgramName,GL_LINK_STATUS,&linkStatus); + } } programData->setLinkStatus(linkStatus); }