Fixed GL_VERTEX_ATTRIB_ARRAY_INTEGER queries

Added pureInteger member to VertexAttribute in order
to keep track of whether the attrib was set using
glVertexAttribIPointer or glVertexAttribPointer and
properly return that state when querying
GL_VERTEX_ATTRIB_ARRAY_INTEGER.

Fixes dEQP-GLES3.functional.state_query.shader.vertex_attrib_integer

Change-Id: Ie6cfcd2008f7abb61d457a41124600fe7cea229a
Reviewed-on: https://swiftshader-review.googlesource.com/14828
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/OpenGL/libGLESv2/Context.cpp b/src/OpenGL/libGLESv2/Context.cpp
index 15129d7..b2bc507 100644
--- a/src/OpenGL/libGLESv2/Context.cpp
+++ b/src/OpenGL/libGLESv2/Context.cpp
@@ -822,10 +822,10 @@
 	return getCurrentVertexArray()->getVertexAttribute(attribNum);
 }
 
-void Context::setVertexAttribState(unsigned int attribNum, Buffer *boundBuffer, GLint size, GLenum type, bool normalized,
-                                   GLsizei stride, const void *pointer)
+void Context::setVertexAttribState(unsigned int attribNum, Buffer *boundBuffer, GLint size, GLenum type,
+                                   bool normalized, bool pureInteger, GLsizei stride, const void *pointer)
 {
-	getCurrentVertexArray()->setAttributeState(attribNum, boundBuffer, size, type, normalized, stride, pointer);
+	getCurrentVertexArray()->setAttributeState(attribNum, boundBuffer, size, type, normalized, pureInteger, stride, pointer);
 }
 
 const void *Context::getVertexAttribPointer(unsigned int attribNum) const
diff --git a/src/OpenGL/libGLESv2/Context.h b/src/OpenGL/libGLESv2/Context.h
index a7d2773..e7484ff 100644
--- a/src/OpenGL/libGLESv2/Context.h
+++ b/src/OpenGL/libGLESv2/Context.h
@@ -194,7 +194,7 @@
 class VertexAttribute
 {
 public:
-	VertexAttribute() : mType(GL_FLOAT), mSize(4), mNormalized(false), mStride(0), mDivisor(0), mPointer(nullptr), mArrayEnabled(false)
+	VertexAttribute() : mType(GL_FLOAT), mSize(4), mNormalized(false), mPureInteger(false), mStride(0), mDivisor(0), mPointer(nullptr), mArrayEnabled(false)
 	{
 		mCurrentValue[0].f = 0.0f;
 		mCurrentValue[1].f = 0.0f;
@@ -301,6 +301,7 @@
 	GLenum mType;
 	GLint mSize;
 	bool mNormalized;
+	bool mPureInteger;
 	GLsizei mStride;   // 0 means natural stride
 	GLuint mDivisor;   // From glVertexAttribDivisor
 
@@ -525,7 +526,7 @@
 	void setVertexAttribDivisor(unsigned int attribNum, GLuint divisor);
 	const VertexAttribute &getVertexAttribState(unsigned int attribNum) const;
 	void setVertexAttribState(unsigned int attribNum, Buffer *boundBuffer, GLint size, GLenum type,
-	                          bool normalized, GLsizei stride, const void *pointer);
+	                          bool normalized, bool pureInteger, GLsizei stride, const void *pointer);
 	const void *getVertexAttribPointer(unsigned int attribNum) const;
 
 	const VertexAttributeArray &getVertexArrayAttributes();
diff --git a/src/OpenGL/libGLESv2/VertexArray.cpp b/src/OpenGL/libGLESv2/VertexArray.cpp
index d52e7ca..64ae221 100644
--- a/src/OpenGL/libGLESv2/VertexArray.cpp
+++ b/src/OpenGL/libGLESv2/VertexArray.cpp
@@ -65,13 +65,14 @@
 }
 
 void VertexArray::setAttributeState(unsigned int attributeIndex, Buffer *boundBuffer, GLint size, GLenum type,
-                                    bool normalized, GLsizei stride, const void *pointer)
+                                    bool normalized, bool pureInteger, GLsizei stride, const void *pointer)
 {
 	ASSERT(attributeIndex < MAX_VERTEX_ATTRIBS);
 	mVertexAttributes[attributeIndex].mBoundBuffer = boundBuffer;
 	mVertexAttributes[attributeIndex].mSize = size;
 	mVertexAttributes[attributeIndex].mType = type;
 	mVertexAttributes[attributeIndex].mNormalized = normalized;
+	mVertexAttributes[attributeIndex].mPureInteger = pureInteger;
 	mVertexAttributes[attributeIndex].mStride = stride;
 	mVertexAttributes[attributeIndex].mPointer = pointer;
 }
diff --git a/src/OpenGL/libGLESv2/VertexArray.h b/src/OpenGL/libGLESv2/VertexArray.h
index 363cf53..bb0f480 100644
--- a/src/OpenGL/libGLESv2/VertexArray.h
+++ b/src/OpenGL/libGLESv2/VertexArray.h
@@ -38,7 +38,7 @@
 	void setVertexAttribDivisor(GLuint index, GLuint divisor);
 	void enableAttribute(unsigned int attributeIndex, bool enabledState);
 	void setAttributeState(unsigned int attributeIndex, Buffer *boundBuffer, GLint size, GLenum type,
-	                       bool normalized, GLsizei stride, const void *pointer);
+	                       bool normalized, bool pureInteger, GLsizei stride, const void *pointer);
 
 	Buffer *getElementArrayBuffer() const { return mElementArrayBuffer; }
 	void setElementArrayBuffer(Buffer *buffer);
diff --git a/src/OpenGL/libGLESv2/libGLESv2.cpp b/src/OpenGL/libGLESv2/libGLESv2.cpp
index f2f6410..ddc23e8 100644
--- a/src/OpenGL/libGLESv2/libGLESv2.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv2.cpp
@@ -4084,22 +4084,7 @@
 		case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
 			if(clientVersion >= 3)
 			{
-				switch(attribState.mType)
-				{
-				case GL_BYTE:
-				case GL_UNSIGNED_BYTE:
-				case GL_SHORT:
-				case GL_UNSIGNED_SHORT:
-				case GL_INT:
-				case GL_INT_2_10_10_10_REV:
-				case GL_UNSIGNED_INT:
-				case GL_FIXED:
-					*params = (GLfloat)GL_TRUE;
-					break;
-				default:
-					*params = (GLfloat)GL_FALSE;
-					break;
-				}
+				*params = (GLfloat)(attribState.mPureInteger ? GL_TRUE : GL_FALSE);
 				break;
 			}
 			else return error(GL_INVALID_ENUM);
@@ -4158,22 +4143,7 @@
 		case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
 			if(clientVersion >= 3)
 			{
-				switch(attribState.mType)
-				{
-				case GL_BYTE:
-				case GL_UNSIGNED_BYTE:
-				case GL_SHORT:
-				case GL_UNSIGNED_SHORT:
-				case GL_INT:
-				case GL_INT_2_10_10_10_REV:
-				case GL_UNSIGNED_INT:
-				case GL_FIXED:
-					*params = GL_TRUE;
-					break;
-				default:
-					*params = GL_FALSE;
-					break;
-				}
+				*params = (attribState.mPureInteger ? GL_TRUE : GL_FALSE);
 				break;
 			}
 			else return error(GL_INVALID_ENUM);
@@ -6187,7 +6157,7 @@
 			return error(GL_INVALID_OPERATION);
 		}
 
-		context->setVertexAttribState(index, context->getArrayBuffer(), size, type, (normalized == GL_TRUE), stride, ptr);
+		context->setVertexAttribState(index, context->getArrayBuffer(), size, type, (normalized == GL_TRUE), false, stride, ptr);
 	}
 }
 
diff --git a/src/OpenGL/libGLESv2/libGLESv3.cpp b/src/OpenGL/libGLESv2/libGLESv3.cpp
index 0e006c3..6c7f7a8 100644
--- a/src/OpenGL/libGLESv2/libGLESv3.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv3.cpp
@@ -2154,7 +2154,7 @@
 			return error(GL_INVALID_OPERATION);
 		}
 
-		context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, stride, pointer);
+		context->setVertexAttribState(index, context->getArrayBuffer(), size, type, false, true, stride, pointer);
 	}
 }
 
@@ -2204,22 +2204,7 @@
 			}
 			break;
 		case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
-			switch(attribState.mType)
-			{
-			case GL_BYTE:
-			case GL_UNSIGNED_BYTE:
-			case GL_SHORT:
-			case GL_UNSIGNED_SHORT:
-			case GL_INT:
-			case GL_INT_2_10_10_10_REV:
-			case GL_UNSIGNED_INT:
-			case GL_FIXED:
-				*params = GL_TRUE;
-				break;
-			default:
-				*params = GL_FALSE;
-				break;
-			}
+			*params = (attribState.mPureInteger ? GL_TRUE : GL_FALSE);
 			break;
 		case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
 			*params = attribState.mDivisor;
@@ -2275,22 +2260,7 @@
 			}
 			break;
 		case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
-			switch(attribState.mType)
-			{
-			case GL_BYTE:
-			case GL_UNSIGNED_BYTE:
-			case GL_SHORT:
-			case GL_UNSIGNED_SHORT:
-			case GL_INT:
-			case GL_INT_2_10_10_10_REV:
-			case GL_UNSIGNED_INT:
-			case GL_FIXED:
-				*params = GL_TRUE;
-				break;
-			default:
-				*params = GL_FALSE;
-				break;
-			}
+			*params = (attribState.mPureInteger ? GL_TRUE : GL_FALSE);
 			break;
 		case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
 			*params = attribState.mDivisor;