[WIP] ES 3.1 guestside changes

Change-Id: Ie4619ee6e161274383b9f6b0d2922344da20f62f
diff --git a/shared/OpenglCodecCommon/FixedBuffer.h b/shared/OpenglCodecCommon/FixedBuffer.h
index 7026396..9a908de 100644
--- a/shared/OpenglCodecCommon/FixedBuffer.h
+++ b/shared/OpenglCodecCommon/FixedBuffer.h
@@ -16,6 +16,8 @@
 #ifndef _FIXED_BUFFER_H
 #define _FIXED_BUFFER_H
 
+#include <cutils/log.h>
+
 class FixedBuffer {
 public:
     FixedBuffer(size_t initialSize = 0) {
diff --git a/shared/OpenglCodecCommon/GLClientState.cpp b/shared/OpenglCodecCommon/GLClientState.cpp
index 0cd2e8d..6e9c8f6 100644
--- a/shared/OpenglCodecCommon/GLClientState.cpp
+++ b/shared/OpenglCodecCommon/GLClientState.cpp
@@ -75,6 +75,7 @@
 
     m_activeTexture = 0;
     m_currentProgram = 0;
+    m_currentShaderProgram = 0;
 
     m_pixelStore.unpack_alignment = 4;
     m_pixelStore.pack_alignment = 4;
@@ -215,6 +216,12 @@
         attribState[i].size = 4; // 4 is the default size
         attribState[i].type = GL_FLOAT; // GL_FLOAT is the default type
     }
+
+    VertexAttribBindingVector& bindingState =
+        m_vaoMap.find(name)->second.bindingState;
+    for (int i = 0; i < bindingState.size(); i++) {
+        bindingState[i].effectiveStride = 16;
+    }
 }
 
 void GLClientState::removeVertexArrayObject(GLuint name) {
@@ -306,6 +313,31 @@
     return retval;
 }
 
+static void sClearIndexedBufferBinding(GLuint id, std::vector<GLClientState::BufferBinding>& bindings) {
+    for (size_t i = 0; i < bindings.size(); i++) {
+        if (bindings[i].buffer == id) {
+            bindings[i].offset = 0;
+            bindings[i].stride = 0;
+            bindings[i].effectiveStride = 16;
+            bindings[i].size = 0;
+            bindings[i].buffer = 0;
+            bindings[i].divisor = 0;
+        }
+    }
+}
+
+void GLClientState::addBuffer(GLuint id) {
+    mBufferIds.insert(id);
+}
+
+void GLClientState::removeBuffer(GLuint id) {
+    mBufferIds.erase(id);
+}
+
+bool GLClientState::bufferIdExists(GLuint id) const {
+    return mBufferIds.find(id) != mBufferIds.end();
+}
+
 void GLClientState::unBindBuffer(GLuint id) {
     if (m_arrayBuffer == id) m_arrayBuffer = 0;
     if (m_currVaoState.iboId() == id) m_currVaoState.iboId() = 0;
@@ -329,6 +361,12 @@
         m_drawIndirectBuffer = 0;
     if (m_shaderStorageBuffer == id)
         m_shaderStorageBuffer = 0;
+
+    sClearIndexedBufferBinding(id, m_indexedTransformFeedbackBuffers);
+    sClearIndexedBufferBinding(id, m_indexedUniformBuffers);
+    sClearIndexedBufferBinding(id, m_indexedAtomicCounterBuffers);
+    sClearIndexedBufferBinding(id, m_indexedShaderStorageBuffers);
+    sClearIndexedBufferBinding(id, m_currVaoState.bufferBindings());
 }
 
 int GLClientState::bindBuffer(GLenum target, GLuint id)
diff --git a/shared/OpenglCodecCommon/GLClientState.h b/shared/OpenglCodecCommon/GLClientState.h
index 4b24947..e41cf44 100644
--- a/shared/OpenglCodecCommon/GLClientState.h
+++ b/shared/OpenglCodecCommon/GLClientState.h
@@ -196,6 +196,10 @@
     const PixelStoreState *pixelStoreState() { return &m_pixelStore; }
     int setPixelStore(GLenum param, GLint value);
     GLuint currentVertexArrayObject() const { return m_currVaoState.vaoId(); }
+    const VertexAttribBindingVector& currentVertexBufferBindings() const {
+        return m_currVaoState.bufferBindings_const();
+    }
+
     GLuint currentArrayVbo() { return m_arrayBuffer; }
     GLuint currentIndexVbo() { return m_currVaoState.iboId(); }
     void enable(int location, int state);
@@ -221,6 +225,9 @@
         m_maxVertexAttribsDirty = false;
     }
 
+    void addBuffer(GLuint id);
+    void removeBuffer(GLuint id);
+    bool bufferIdExists(GLuint id) const;
     void unBindBuffer(GLuint id);
 
     int bindBuffer(GLenum target, GLuint id);
@@ -234,7 +241,9 @@
     size_t clearBufferNumElts(GLenum buffer) const;
 
     void setCurrentProgram(GLint program) { m_currentProgram = program; }
+    void setCurrentShaderProgram(GLint program) { m_currentShaderProgram = program; }
     GLint currentProgram() const { return m_currentProgram; }
+    GLint currentShaderProgram() const { return m_currentShaderProgram; }
 
     struct UniformBlockInfoKey {
         GLuint program;
@@ -416,6 +425,8 @@
     bool m_initialized;
     PixelStoreState m_pixelStore;
 
+    std::set<GLuint> mBufferIds;
+
     // GL_ARRAY_BUFFER_BINDING is separate from VAO state
     GLuint m_arrayBuffer;
     VAOStateMap m_vaoMap;
@@ -455,6 +466,7 @@
     int m_nLocations;
     int m_activeTexture;
     GLint m_currentProgram;
+    GLint m_currentShaderProgram;
     ProgramPipelineMap m_programPipelines;
 
     enum TextureTarget {
@@ -554,6 +566,14 @@
             m_currVaoState.bufferBindings_const()[vertexAttrib.bindingindex];
 
         switch(param) {
+#define GL_VERTEX_ATTRIB_BINDING 0x82D4
+        case GL_VERTEX_ATTRIB_BINDING:
+            *ptr = (T)vertexAttrib.bindingindex;
+            break;
+#define GL_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D5
+        case GL_VERTEX_ATTRIB_RELATIVE_OFFSET:
+            *ptr = (T)vertexAttrib.reloffset;
+            break;
         case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
             *ptr = (T)(vertexAttribBufferBinding.buffer);
             break;
diff --git a/shared/OpenglCodecCommon/GLSharedGroup.cpp b/shared/OpenglCodecCommon/GLSharedGroup.cpp
index beaf1e2..9da011a 100755
--- a/shared/OpenglCodecCommon/GLSharedGroup.cpp
+++ b/shared/OpenglCodecCommon/GLSharedGroup.cpp
@@ -584,6 +584,7 @@
     android::AutoMutex _lock(m_lock);
     ShaderProgramData* data = new ShaderProgramData;
     uint32_t currId = m_shaderProgramId;
+    ALOGD("%s: new data %p id %u", __FUNCTION__, data, currId);
     m_shaderPrograms.add(currId, data);
     m_shaderProgramId++;
     return currId;
@@ -596,12 +597,14 @@
 
 ShaderProgramData* GLSharedGroup::getShaderProgramDataById(uint32_t id) {
     android::AutoMutex _lock(m_lock);
-    return m_shaderPrograms.editValueAt(id);
+    ShaderProgramData* res = m_shaderPrograms.valueFor(id);
+    ALOGD("%s: id=%u res=%p", __FUNCTION__, id, res);
+    return res;
 }
 
 ShaderProgramData* GLSharedGroup::getShaderProgramData(GLuint shaderProgramName) {
     android::AutoMutex _lock(m_lock);
-    return m_shaderPrograms.editValueAt(m_shaderProgramIdMap[shaderProgramName]);
+    return m_shaderPrograms.valueFor(m_shaderProgramIdMap[shaderProgramName]);
 }
 
 void GLSharedGroup::deleteShaderProgramDataById(uint32_t id) {
diff --git a/shared/OpenglCodecCommon/glUtils.cpp b/shared/OpenglCodecCommon/glUtils.cpp
index 8342095..7e5e4a2 100644
--- a/shared/OpenglCodecCommon/glUtils.cpp
+++ b/shared/OpenglCodecCommon/glUtils.cpp
@@ -34,6 +34,8 @@
     case GL_HALF_FLOAT_OES:
         retval = 2;
         break;
+    case GL_IMAGE_2D:
+    case GL_IMAGE_3D:
     case GL_UNSIGNED_INT:
     case GL_INT:
     case GL_FLOAT:
@@ -84,6 +86,7 @@
         retval = 4 * 12;
         break;
     case GL_SAMPLER_2D:
+    case GL_SAMPLER_3D:
     case GL_SAMPLER_CUBE:
         retval = 4;
         break;
@@ -105,7 +108,8 @@
 		retval = 4 + 4;
         break;
     default:
-        ERR("**** ERROR unknown type 0x%x (%s,%d)\n", type, __FUNCTION__,__LINE__);
+        ALOGE("**** ERROR unknown type 0x%x (%s,%d)\n", type, __FUNCTION__,__LINE__);
+        retval = 4;
     }
     return retval;
 
@@ -295,16 +299,9 @@
     case GL_BLEND_SRC_ALPHA_OES:
     case GL_MAX_LIGHTS:
     case GL_SHADER_TYPE:
-    case GL_DELETE_STATUS:
     case GL_COMPILE_STATUS:
-    case GL_INFO_LOG_LENGTH:
     case GL_SHADER_SOURCE_LENGTH:
     case GL_CURRENT_PROGRAM:
-    case GL_LINK_STATUS:
-    case GL_VALIDATE_STATUS:
-    case GL_ATTACHED_SHADERS:
-    case GL_ACTIVE_UNIFORMS:
-    case GL_ACTIVE_ATTRIBUTES:
     case GL_SUBPIXEL_BITS:
     case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
     case GL_NUM_SHADER_BINARY_FORMATS:
@@ -333,6 +330,25 @@
     case GL_CURRENT_QUERY:
     case GL_QUERY_RESULT:
     case GL_QUERY_RESULT_AVAILABLE:
+    case GL_READ_BUFFER:
+
+    case GL_ACTIVE_ATOMIC_COUNTER_BUFFERS:
+    case GL_ACTIVE_ATTRIBUTES:
+    case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
+    case GL_ACTIVE_UNIFORM_BLOCKS:
+    case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
+    case GL_ACTIVE_UNIFORMS:
+    case GL_ACTIVE_UNIFORM_MAX_LENGTH:
+    case GL_ATTACHED_SHADERS:
+    case GL_DELETE_STATUS:
+    case GL_INFO_LOG_LENGTH:
+    case GL_LINK_STATUS:
+    case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
+    case GL_PROGRAM_SEPARABLE:
+    case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
+    case GL_TRANSFORM_FEEDBACK_VARYINGS:
+    case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
+    case GL_VALIDATE_STATUS:
         s = 1;
         break;
     case GL_ALIASED_LINE_WIDTH_RANGE:
@@ -347,6 +363,7 @@
     case GL_SPOT_DIRECTION:
     case GL_POINT_DISTANCE_ATTENUATION:
     case GL_CURRENT_NORMAL:
+    case GL_COMPUTE_WORK_GROUP_SIZE:
         s =  3;
         break;
     case GL_CURRENT_VERTEX_ATTRIB: