Implements GetVertexAttrib
TRAC #11653
Signed-off-by: Andrew Lewycky
Signed-off-by: Daniel Koch

Author:    Shannon Woods

git-svn-id: https://angleproject.googlecode.com/svn/trunk@152 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/libGLESv2.cpp b/src/libGLESv2/libGLESv2.cpp
index 2bf34b8..4032c75 100644
--- a/src/libGLESv2/libGLESv2.cpp
+++ b/src/libGLESv2/libGLESv2.cpp
@@ -2682,12 +2682,44 @@
 
     try
     {
-        if (index >= gl::MAX_VERTEX_ATTRIBS)
-        {
-            return error(GL_INVALID_VALUE);
-        }
+        gl::Context *context = gl::getContext();
 
-        UNIMPLEMENTED();   // FIXME
+        if (context)
+        {
+            if (index >= gl::MAX_VERTEX_ATTRIBS)
+            {
+                return error(GL_INVALID_VALUE);
+            }
+
+            switch (pname)
+            {
+              case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
+                *params = (GLfloat)(context->vertexAttribute[index].mEnabled ? GL_TRUE : GL_FALSE);
+                break;
+              case GL_VERTEX_ATTRIB_ARRAY_SIZE:
+                *params = (GLfloat)context->vertexAttribute[index].mSize;
+                break;
+              case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
+                *params = (GLfloat)context->vertexAttribute[index].mStride;
+                break;
+              case GL_VERTEX_ATTRIB_ARRAY_TYPE:
+                *params = (GLfloat)context->vertexAttribute[index].mType;
+                break;
+              case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
+                *params = (GLfloat)(context->vertexAttribute[index].mNormalized ? GL_TRUE : GL_FALSE);
+                break;
+              case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
+                *params = (GLfloat)context->vertexAttribute[index].mBoundBuffer;
+                break;
+              case GL_CURRENT_VERTEX_ATTRIB:
+                for (int i = 0; i < 4; ++i)
+                {
+                    params[i] = context->vertexAttribute[index].mCurrentValue[i];
+                }
+                break;
+              default: return error(GL_INVALID_ENUM);
+            }
+        }
     }
     catch(std::bad_alloc&)
     {
@@ -2701,12 +2733,45 @@
 
     try
     {
-        if (index >= gl::MAX_VERTEX_ATTRIBS)
-        {
-            return error(GL_INVALID_VALUE);
-        }
+        gl::Context *context = gl::getContext();
 
-        UNIMPLEMENTED();   // FIXME
+        if (context)
+        {
+            if (index >= gl::MAX_VERTEX_ATTRIBS)
+            {
+                return error(GL_INVALID_VALUE);
+            }
+
+            switch (pname)
+            {
+              case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
+                *params = (context->vertexAttribute[index].mEnabled ? GL_TRUE : GL_FALSE);
+                break;
+              case GL_VERTEX_ATTRIB_ARRAY_SIZE:
+                *params = context->vertexAttribute[index].mSize;
+                break;
+              case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
+                *params = context->vertexAttribute[index].mStride;
+                break;
+              case GL_VERTEX_ATTRIB_ARRAY_TYPE:
+                *params = context->vertexAttribute[index].mType;
+                break;
+              case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
+                *params = (context->vertexAttribute[index].mNormalized ? GL_TRUE : GL_FALSE);
+                break;
+              case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
+                *params = context->vertexAttribute[index].mBoundBuffer;
+                break;
+              case GL_CURRENT_VERTEX_ATTRIB:
+                for (int i = 0; i < 4; ++i)
+                {
+                    float currentValue = context->vertexAttribute[index].mCurrentValue[i];
+                    params[i] = (GLint)(currentValue > 0.0f ? floor(currentValue + 0.5f) : ceil(currentValue - 0.5f));
+                }
+                break;
+              default: return error(GL_INVALID_ENUM);
+            }
+        }
     }
     catch(std::bad_alloc&)
     {
@@ -2720,12 +2785,22 @@
 
     try
     {
-        if (index >= gl::MAX_VERTEX_ATTRIBS)
-        {
-            return error(GL_INVALID_VALUE);
-        }
+        gl::Context *context = gl::getContext();
 
-        UNIMPLEMENTED();   // FIXME
+        if (context)
+        {
+            if (index >= gl::MAX_VERTEX_ATTRIBS)
+            {
+                return error(GL_INVALID_VALUE);
+            }
+
+            if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
+            {
+                return error(GL_INVALID_ENUM);
+            }
+
+            *pointer = const_cast<GLvoid*>(context->vertexAttribute[index].mPointer);
+        }
     }
     catch(std::bad_alloc&)
     {