Work around some arrays being mistakenly enabled

... by cherry-picking aosp/1554722 and aosp/1621957
from aemu.

Bug: b/198321237
Test: boot
Change-Id: I4dcc468117f3dae2c1a7a5b2076f4e6b983524f6
diff --git a/stream-servers/glestranslator/GLES_CM/GLEScmContext.cpp b/stream-servers/glestranslator/GLES_CM/GLEScmContext.cpp
index 2c021f3..62a93f6 100644
--- a/stream-servers/glestranslator/GLES_CM/GLEScmContext.cpp
+++ b/stream-servers/glestranslator/GLES_CM/GLEScmContext.cpp
@@ -454,7 +454,8 @@
         }
 }
 
-void GLEScmContext::setupArraysPointers(GLESConversionArrays& cArrs,GLint first,GLsizei count,GLenum type,const GLvoid* indices,bool direct) {
+void GLEScmContext::setupArraysPointers(GLESConversionArrays& cArrs,GLint first,GLsizei count,GLenum type,const GLvoid* indices,bool direct, bool* needEnablingPostDraw) {
+    (void)needEnablingPostDraw;
     ArraysMap::iterator it;
     m_pointsIndex = -1;
 
@@ -1854,7 +1855,7 @@
     } else {
         GLESConversionArrays tmpArrs;
 
-        setupArraysPointers(tmpArrs,first,count,0,NULL,true);
+        setupArraysPointers(tmpArrs,first,count,0,NULL,true,nullptr);
 
         if (mode == GL_POINTS && isArrEnabled(GL_POINT_SIZE_ARRAY_OES)){
             drawPointsArrs(tmpArrs,first,count);
@@ -1910,7 +1911,7 @@
     } else {
         GLESConversionArrays tmpArrs;
 
-        setupArraysPointers(tmpArrs,0,count,type,indices,false);
+        setupArraysPointers(tmpArrs,0,count,type,indices,false,nullptr);
         if(mode == GL_POINTS && isArrEnabled(GL_POINT_SIZE_ARRAY_OES)){
             drawPointsElems(tmpArrs,count,type,indices);
         }
diff --git a/stream-servers/glestranslator/GLES_CM/GLEScmContext.h b/stream-servers/glestranslator/GLES_CM/GLEScmContext.h
index 30b8c3a..b313952 100644
--- a/stream-servers/glestranslator/GLES_CM/GLEScmContext.h
+++ b/stream-servers/glestranslator/GLES_CM/GLEScmContext.h
@@ -46,7 +46,7 @@
     GLenum  getActiveTexture() { return GL_TEXTURE0 + m_activeTexture;};
     GLenum  getClientActiveTexture() { return GL_TEXTURE0 + m_clientActiveTexture;};
     void setBindedTexture(GLenum target, unsigned int texture, unsigned int globalTexName);
-    void setupArraysPointers(GLESConversionArrays& fArrs,GLint first,GLsizei count,GLenum type,const GLvoid* indices,bool direct) override;
+    void setupArraysPointers(GLESConversionArrays& fArrs,GLint first,GLsizei count,GLenum type,const GLvoid* indices,bool direct, bool* needEnablingPostDraw) override;
     void drawPointsArrs(GLESConversionArrays& arrs,GLint first,GLsizei count);
     void drawPointsElems(GLESConversionArrays& arrs,GLsizei count,GLenum type,const GLvoid* indices);
     virtual const GLESpointer* getPointer(GLenum arrType) override;
diff --git a/stream-servers/glestranslator/GLES_V2/GLESv2Context.cpp b/stream-servers/glestranslator/GLES_V2/GLESv2Context.cpp
index 505428c..bec3b53 100644
--- a/stream-servers/glestranslator/GLES_V2/GLESv2Context.cpp
+++ b/stream-servers/glestranslator/GLES_V2/GLESv2Context.cpp
@@ -536,9 +536,12 @@
         }
     }
 
+    bool needEnablingPostDraw[kMaxVertexAttributes];
+    memset(needEnablingPostDraw, 0, sizeof(needEnablingPostDraw));
+
     if (needClientVBOSetup) {
         GLESConversionArrays tmpArrs;
-        setupArraysPointers(tmpArrs, 0, count, type, indices, false);
+        setupArraysPointers(tmpArrs, 0, count, type, indices, false, needEnablingPostDraw);
         if (needAtt0PreDrawValidation()) {
             if (indices) {
                 validateAtt0PreDraw(findMaxIndex(count, type, indices));
@@ -611,9 +614,15 @@
             s_glDispatch.glDisable(GL_POINT_SPRITE);
         }
     }
+
+    for (int i = 0; i < kMaxVertexAttributes; ++i) {
+        if (needEnablingPostDraw[i]) {
+            s_glDispatch.glEnableVertexAttribArray(i);
+        }
+    }
 }
 
-void GLESv2Context::setupArraysPointers(GLESConversionArrays& cArrs,GLint first,GLsizei count,GLenum type,const GLvoid* indices,bool direct) {
+void GLESv2Context::setupArraysPointers(GLESConversionArrays& cArrs,GLint first,GLsizei count,GLenum type,const GLvoid* indices,bool direct, bool* needEnablingPostDraw) {
     //going over all clients arrays Pointers
     for (uint32_t i = 0; i < kMaxVertexAttributes; ++i) {
         GLESpointer* p = m_currVaoState.attribInfo().data() + i;
@@ -630,16 +639,28 @@
             p->getStride(),
             p->getNormalized(),
             -1,
-            p->isIntPointer());
+            p->isIntPointer(),
+            p->getBufferName(),
+            needEnablingPostDraw);
     }
 }
 
 //setting client side arr
 void GLESv2Context::setupArrWithDataSize(GLsizei datasize, const GLvoid* arr,
                                          GLenum arrayType, GLenum dataType,
-                                         GLint size, GLsizei stride, GLboolean normalized, int index, bool isInt){
+                                         GLint size, GLsizei stride, GLboolean normalized, int index, bool isInt, GLuint ptrBufferName, bool* needEnablingPostDraw){
     // is not really a client side arr.
-    if (arr == NULL) return;
+    if (arr == NULL) {
+        GLint isEnabled;
+        s_glDispatch.glGetVertexAttribiv((int)arrayType, GL_VERTEX_ATTRIB_ARRAY_ENABLED, &isEnabled);
+        if (isEnabled && !ptrBufferName) {
+            s_glDispatch.glDisableVertexAttribArray(arrayType);
+            if (needEnablingPostDraw)
+                needEnablingPostDraw[arrayType] = true;
+        }
+
+        return;
+    }
 
     GLuint prevArrayBuffer;
     s_glDispatch.glGetIntegerv(GL_ARRAY_BUFFER_BINDING, (GLint*)&prevArrayBuffer);
diff --git a/stream-servers/glestranslator/GLES_V2/GLESv2Context.h b/stream-servers/glestranslator/GLES_V2/GLESv2Context.h
index d794bd3..87ed77a 100644
--- a/stream-servers/glestranslator/GLES_V2/GLESv2Context.h
+++ b/stream-servers/glestranslator/GLES_V2/GLESv2Context.h
@@ -1,4 +1,4 @@
-/*
+    /*
 * Copyright 2011 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
@@ -58,7 +58,7 @@
         GLuint start,
         GLuint end);
 
-    void setupArraysPointers(GLESConversionArrays& fArrs,GLint first,GLsizei count,GLenum type,const GLvoid* indices,bool direct);
+    void setupArraysPointers(GLESConversionArrays& fArrs,GLint first,GLsizei count,GLenum type,const GLvoid* indices,bool direct, bool* needEnablingPostDraw);
     void setVertexAttribDivisor(GLuint bindingindex, GLuint divisor);
     void setVertexAttribBindingIndex(GLuint attribindex, GLuint bindingindex);
     void setVertexAttribFormat(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint reloffset, bool isInt = false);
@@ -127,7 +127,7 @@
 private:
     void setupArrWithDataSize(GLsizei datasize, const GLvoid* arr,
                               GLenum arrayType, GLenum dataType,
-                              GLint size, GLsizei stride, GLboolean normalized, int index, bool isInt);
+                              GLint size, GLsizei stride, GLboolean normalized, int index, bool isInt, GLuint ptrBufferName, bool* needEnablingPostDraw);
     void initExtensionString();
 
     float m_attribute0value[4] = {};
diff --git a/stream-servers/glestranslator/include/GLcommon/GLEScontext.h b/stream-servers/glestranslator/include/GLcommon/GLEScontext.h
index 6f7878c..e5809e5 100644
--- a/stream-servers/glestranslator/include/GLcommon/GLEScontext.h
+++ b/stream-servers/glestranslator/include/GLcommon/GLEScontext.h
@@ -250,7 +250,7 @@
     bool vertexAttributesBufferBacked();
     const GLvoid* setPointer(GLenum arrType,GLint size,GLenum type,GLsizei stride,const GLvoid* data, GLsizei dataSize, bool normalize = false, bool isInt = false);
     virtual const GLESpointer* getPointer(GLenum arrType);
-    virtual void setupArraysPointers(GLESConversionArrays& fArrs,GLint first,GLsizei count,GLenum type,const GLvoid* indices,bool direct) = 0;
+    virtual void setupArraysPointers(GLESConversionArrays& fArrs,GLint first,GLsizei count,GLenum type,const GLvoid* indices,bool direct, bool* needEnablingPostDraw) = 0;
 
     static void prepareCoreProfileEmulatedTexture(TextureData* texData, bool is3d, GLenum target,
                                                   GLenum format, GLenum type,