Program related validation

Added some validation for uniforms and uniform blocks.

Fixes some failures in (only 1 failure left):
dEQP-GLES3.functional.negative_api.state*

Change-Id: I507c7e8784230f85b0d312d162e5ff82bdbd15ed
Reviewed-on: https://swiftshader-review.googlesource.com/14428
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/OpenGL/libGLESv2/Context.cpp b/src/OpenGL/libGLESv2/Context.cpp
index 2a80871..b32e792 100644
--- a/src/OpenGL/libGLESv2/Context.cpp
+++ b/src/OpenGL/libGLESv2/Context.cpp
@@ -2423,6 +2423,20 @@
 
 template<typename T> bool Context::getUniformBufferiv(GLuint index, GLenum pname, T *param) const
 {
+	switch(pname)
+	{
+	case GL_UNIFORM_BUFFER_BINDING:
+	case GL_UNIFORM_BUFFER_SIZE:
+	case GL_UNIFORM_BUFFER_START:
+		if(index >= MAX_UNIFORM_BUFFER_BINDINGS)
+		{
+			return error(GL_INVALID_VALUE, true);
+		}
+		break;
+	default:
+		break;
+	}
+
 	const BufferBinding& uniformBuffer = mState.uniformBuffers[index];
 
 	switch(pname)
diff --git a/src/OpenGL/libGLESv2/Program.cpp b/src/OpenGL/libGLESv2/Program.cpp
index 37c294f..58a3ac9 100644
--- a/src/OpenGL/libGLESv2/Program.cpp
+++ b/src/OpenGL/libGLESv2/Program.cpp
@@ -499,6 +499,10 @@
 
 	GLuint Program::getUniformBlockBinding(GLuint uniformBlockIndex) const
 	{
+		if(uniformBlockIndex >= getActiveUniformBlockCount())
+		{
+			return error(GL_INVALID_VALUE, GL_INVALID_INDEX);
+		}
 		return uniformBlockBindings[uniformBlockIndex];
 	}
 
@@ -2776,7 +2780,10 @@
 
 	void Program::getActiveUniformBlockName(GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name) const
 	{
-		ASSERT(index < getActiveUniformBlockCount());
+		if(index >= getActiveUniformBlockCount())
+		{
+			return error(GL_INVALID_VALUE);
+		}
 
 		const UniformBlock &uniformBlock = *uniformBlocks[index];
 
diff --git a/src/OpenGL/libGLESv2/libGLESv3.cpp b/src/OpenGL/libGLESv2/libGLESv3.cpp
index 76381e1..2d646ec 100644
--- a/src/OpenGL/libGLESv2/libGLESv3.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv3.cpp
@@ -2382,19 +2382,21 @@
 
 	if(context)
 	{
-		if(program == 0)
-		{
-			return error(GL_INVALID_VALUE);
-		}
-
 		es2::Program *programObject = context->getProgram(program);
 
-		if(!programObject || !programObject->isLinked())
+		if(!programObject)
 		{
-			return error(GL_INVALID_OPERATION);
+			if(context->getShader(program))
+			{
+				return error(GL_INVALID_OPERATION);
+			}
+			else
+			{
+				return error(GL_INVALID_VALUE);
+			}
 		}
 
-		if(!programObject)
+		if(!programObject->isLinked())
 		{
 			return error(GL_INVALID_OPERATION);
 		}
@@ -2814,7 +2816,14 @@
 
 		if(!programObject)
 		{
-			return error(GL_INVALID_OPERATION);
+			if(context->getShader(program))
+			{
+				return error(GL_INVALID_OPERATION);
+			}
+			else
+			{
+				return error(GL_INVALID_VALUE);
+			}
 		}
 
 		if(!programObject->isLinked())
@@ -2867,7 +2876,14 @@
 
 		if(!programObject)
 		{
-			return error(GL_INVALID_OPERATION);
+			if(context->getShader(program))
+			{
+				return error(GL_INVALID_OPERATION);
+			}
+			else
+			{
+				return error(GL_INVALID_VALUE);
+			}
 		}
 
 		for(int uniformId = 0; uniformId < uniformCount; uniformId++)
@@ -2901,7 +2917,14 @@
 
 		if(!programObject)
 		{
-			return error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
+			if(context->getShader(program))
+			{
+				return error(GL_INVALID_OPERATION, GL_INVALID_INDEX);
+			}
+			else
+			{
+				return error(GL_INVALID_VALUE, GL_INVALID_INDEX);
+			}
 		}
 
 		return programObject->getUniformBlockIndex(uniformBlockName);