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,