Merge "Update link status in glProgramBinary" into main
diff --git a/host/gl/glestranslator/GLES_V2/GLESv30Imp.cpp b/host/gl/glestranslator/GLES_V2/GLESv30Imp.cpp
index 5903eeb..fea7f60 100644
--- a/host/gl/glestranslator/GLES_V2/GLESv30Imp.cpp
+++ b/host/gl/glestranslator/GLES_V2/GLESv30Imp.cpp
@@ -1,8 +1,3 @@
-// Auto-generated with: android/scripts/gen-entries.py --mode=translator_passthrough android/android-emugl/host/libs/libOpenGLESDispatch/gles3_only.entries --output=android/android-emugl/host/libs/Translator/GLES_V2/GLESv30Imp.cpp
-// This file is best left unedited.
-// Try to make changes through gen_translator in gen-entries.py,
-// and/or parcel out custom functionality in separate code.
-
 EXTERN_PART GL_APICALL GLconstubyteptr GL_APIENTRY glGetStringi(GLenum name, GLint index) {
     GET_CTX_V2_RET(0);
     GLconstubyteptr glGetStringiRET = ctx->dispatcher().glGetStringi(name, index);
@@ -988,7 +983,36 @@
     GET_CTX_V2();
     if (ctx->shareGroup().get()) {
         const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(NamedObjectType::SHADER_OR_PROGRAM, program);
+        SET_ERROR_IF(globalProgramName == 0, GL_INVALID_VALUE);
+
+        auto objData =
+            ctx->shareGroup()->getObjectData(NamedObjectType::SHADER_OR_PROGRAM, program);
+        SET_ERROR_IF(!objData, GL_INVALID_OPERATION);
+        SET_ERROR_IF(objData->getDataType() != PROGRAM_DATA, GL_INVALID_OPERATION);
+
+        ProgramData* programData = (ProgramData*)objData;
+
         ctx->dispatcher().glProgramBinary(globalProgramName, binaryFormat, binary, length);
+
+        GLint linkStatus = GL_FALSE;
+        ctx->dispatcher().glGetProgramiv(globalProgramName, GL_LINK_STATUS, &linkStatus);
+
+        programData->setHostLinkStatus(linkStatus);
+        programData->setLinkStatus(linkStatus);
+
+        GLsizei infoLogLength = 0;
+        ctx->dispatcher().glGetProgramiv(globalProgramName, GL_INFO_LOG_LENGTH, &infoLogLength);
+
+        if (infoLogLength > 0) {
+            std::vector<GLchar> infoLog(infoLogLength);
+            ctx->dispatcher().glGetProgramInfoLog(globalProgramName, infoLogLength, &infoLogLength,
+                                                  infoLog.data());
+
+            if (infoLogLength) {
+                infoLog.resize(infoLogLength);
+                programData->setInfoLog(infoLog.data());
+            }
+        }
     }
 }