Adding unsigned int support for uniforms

Added unsigned int uniforms related
functions and entries where appropriate
to enable it.

Change-Id: Ia3086817a25e6736cee9ba3d58d97bc8eaf520a3
Reviewed-on: https://swiftshader-review.googlesource.com/3101
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/OpenGL/libGLESv2/Program.cpp b/src/OpenGL/libGLESv2/Program.cpp
index cf7a47a..ba1ed3e 100644
--- a/src/OpenGL/libGLESv2/Program.cpp
+++ b/src/OpenGL/libGLESv2/Program.cpp
@@ -517,6 +517,7 @@
 	bool Program::setUniformiv(GLint location, GLsizei count, const GLint *v, int numElements)

 	{

 		static GLenum intType[] = { GL_INT, GL_INT_VEC2, GL_INT_VEC3, GL_INT_VEC4 };

+		static GLenum uintType[] = { GL_UNSIGNED_INT, GL_UNSIGNED_INT_VEC2, GL_UNSIGNED_INT_VEC3, GL_UNSIGNED_INT_VEC4 };

 		static GLenum boolType[] = { GL_BOOL, GL_BOOL_VEC2, GL_BOOL_VEC3, GL_BOOL_VEC4 };

 

 		if(location < 0 || location >= (int)uniformIndex.size())

@@ -537,7 +538,7 @@
 		count = std::min(size - (int)uniformIndex[location].element, count);

 

 		int index = numElements - 1;

-		if(targetUniform->type == intType[index])

+		if(targetUniform->type == intType[index] || targetUniform->type == uintType[index])

 		{

 			memcpy(targetUniform->data + uniformIndex[location].element * sizeof(GLint)* numElements,

 				   v, numElements * sizeof(GLint)* count);

@@ -639,6 +640,7 @@
 	bool Program::setUniformuiv(GLint location, GLsizei count, const GLuint *v, int numElements)

 	{

 		static GLenum intType[] = { GL_INT, GL_INT_VEC2, GL_INT_VEC3, GL_INT_VEC4 };

+		static GLenum uintType[] = { GL_UNSIGNED_INT, GL_UNSIGNED_INT_VEC2, GL_UNSIGNED_INT_VEC3, GL_UNSIGNED_INT_VEC4 };

 		static GLenum boolType[] = { GL_BOOL, GL_BOOL_VEC2, GL_BOOL_VEC3, GL_BOOL_VEC4 };

 

 		if(location < 0 || location >= (int)uniformIndex.size())

@@ -659,7 +661,7 @@
 		count = std::min(size - (int)uniformIndex[location].element, count);

 

 		int index = numElements - 1;

-		if(targetUniform->type == intType[index])

+		if(targetUniform->type == uintType[index] || targetUniform->type == intType[index])

 		{

 			memcpy(targetUniform->data + uniformIndex[location].element * sizeof(GLuint)* numElements,

 				   v, numElements * sizeof(GLuint)* count);

@@ -743,6 +745,17 @@
 				}

 			}

 			break;

+			case GL_UNSIGNED_INT:

+			{

+				GLuint *uintParams = (GLuint*)targetUniform->data + uniformIndex[location].element * count;

+

+				for(unsigned int i = 0; i < count; i++)

+				{

+					params[i] = (float)uintParams[i];

+				}

+			}

+			break;

+

 		  default: UNREACHABLE();

 		}

 

@@ -788,6 +801,7 @@
 			}

 			break;

 		  case GL_INT:

+		  case GL_UNSIGNED_INT:

 			memcpy(params, targetUniform->data + uniformIndex[location].element * count * sizeof(GLint),

 				   count * sizeof(GLint));

 			break;

@@ -836,6 +850,7 @@
 		}

 			break;

 		case GL_INT:

+		case GL_UNSIGNED_INT:

 			memcpy(params, targetUniform->data + uniformIndex[location].element * count * sizeof(GLuint),

 				   count * sizeof(GLuint));

 			break;

@@ -872,6 +887,7 @@
 				int size = targetUniform->size();

 				GLfloat *f = (GLfloat*)targetUniform->data;

 				GLint *i = (GLint*)targetUniform->data;

+				GLuint *ui = (GLuint*)targetUniform->data;

 				GLboolean *b = (GLboolean*)targetUniform->data;

 

 				switch(targetUniform->type)

@@ -901,6 +917,10 @@
 				  case GL_INT_VEC2:   applyUniform2iv(location, size, i);       break;

 				  case GL_INT_VEC3:   applyUniform3iv(location, size, i);       break;

 				  case GL_INT_VEC4:   applyUniform4iv(location, size, i);       break;

+				  case GL_UNSIGNED_INT:      applyUniform1uiv(location, size, ui); break;

+				  case GL_UNSIGNED_INT_VEC2: applyUniform2uiv(location, size, ui); break;

+				  case GL_UNSIGNED_INT_VEC3: applyUniform3uiv(location, size, ui); break;

+				  case GL_UNSIGNED_INT_VEC4: applyUniform4uiv(location, size, ui); break;

 				  default:

 					UNREACHABLE();

 				}

@@ -1882,6 +1902,158 @@
 		return true;

 	}

 

+	bool Program::applyUniform1uiv(GLint location, GLsizei count, const GLuint *v)

+	{

+		float vector[MAX_UNIFORM_VECTORS][4];

+

+		for(int i = 0; i < count; i++)

+		{

+			vector[i][0] = (float)v[i];

+			vector[i][1] = 0;

+			vector[i][2] = 0;

+			vector[i][3] = 0;

+		}

+

+		Uniform *targetUniform = uniforms[uniformIndex[location].index];

+

+		if(targetUniform->psRegisterIndex != -1)

+		{

+			if(targetUniform->type == GL_SAMPLER_2D ||

+			   targetUniform->type == GL_SAMPLER_CUBE ||

+			   targetUniform->type == GL_SAMPLER_EXTERNAL_OES ||

+			   targetUniform->type == GL_SAMPLER_3D_OES)

+			{

+				for(int i = 0; i < count; i++)

+				{

+					unsigned int samplerIndex = targetUniform->psRegisterIndex + i;

+

+					if(samplerIndex < MAX_TEXTURE_IMAGE_UNITS)

+					{

+						ASSERT(samplersPS[samplerIndex].active);

+						samplersPS[samplerIndex].logicalTextureUnit = v[i];

+					}

+				}

+			}

+			else

+			{

+				device->setPixelShaderConstantF(targetUniform->psRegisterIndex, (float*)vector, targetUniform->registerCount());

+			}

+		}

+

+		if(targetUniform->vsRegisterIndex != -1)

+		{

+			if(targetUniform->type == GL_SAMPLER_2D ||

+			   targetUniform->type == GL_SAMPLER_CUBE ||

+			   targetUniform->type == GL_SAMPLER_EXTERNAL_OES ||

+			   targetUniform->type == GL_SAMPLER_3D_OES)

+			{

+				for(int i = 0; i < count; i++)

+				{

+					unsigned int samplerIndex = targetUniform->vsRegisterIndex + i;

+

+					if(samplerIndex < MAX_VERTEX_TEXTURE_IMAGE_UNITS)

+					{

+						ASSERT(samplersVS[samplerIndex].active);

+						samplersVS[samplerIndex].logicalTextureUnit = v[i];

+					}

+				}

+			}

+			else

+			{

+				device->setVertexShaderConstantF(targetUniform->vsRegisterIndex, (float*)vector, targetUniform->registerCount());

+			}

+		}

+

+		return true;

+	}

+

+	bool Program::applyUniform2uiv(GLint location, GLsizei count, const GLuint *v)

+	{

+		float vector[MAX_UNIFORM_VECTORS][4];

+

+		for(int i = 0; i < count; i++)

+		{

+			vector[i][0] = (float)v[0];

+			vector[i][1] = (float)v[1];

+			vector[i][2] = 0;

+			vector[i][3] = 0;

+

+			v += 2;

+		}

+

+		Uniform *targetUniform = uniforms[uniformIndex[location].index];

+

+		if(targetUniform->psRegisterIndex != -1)

+		{

+			device->setPixelShaderConstantF(targetUniform->psRegisterIndex, (float*)vector, targetUniform->registerCount());

+		}

+

+		if(targetUniform->vsRegisterIndex != -1)

+		{

+			device->setVertexShaderConstantF(targetUniform->vsRegisterIndex, (float*)vector, targetUniform->registerCount());

+		}

+

+		return true;

+	}

+

+	bool Program::applyUniform3uiv(GLint location, GLsizei count, const GLuint *v)

+	{

+		float vector[MAX_UNIFORM_VECTORS][4];

+

+		for(int i = 0; i < count; i++)

+		{

+			vector[i][0] = (float)v[0];

+			vector[i][1] = (float)v[1];

+			vector[i][2] = (float)v[2];

+			vector[i][3] = 0;

+

+			v += 3;

+		}

+

+		Uniform *targetUniform = uniforms[uniformIndex[location].index];

+

+		if(targetUniform->psRegisterIndex != -1)

+		{

+			device->setPixelShaderConstantF(targetUniform->psRegisterIndex, (float*)vector, targetUniform->registerCount());

+		}

+

+		if(targetUniform->vsRegisterIndex != -1)

+		{

+			device->setVertexShaderConstantF(targetUniform->vsRegisterIndex, (float*)vector, targetUniform->registerCount());

+		}

+

+		return true;

+	}

+

+	bool Program::applyUniform4uiv(GLint location, GLsizei count, const GLuint *v)

+	{

+		float vector[MAX_UNIFORM_VECTORS][4];

+

+		for(int i = 0; i < count; i++)

+		{

+			vector[i][0] = (float)v[0];

+			vector[i][1] = (float)v[1];

+			vector[i][2] = (float)v[2];

+			vector[i][3] = (float)v[3];

+

+			v += 4;

+		}

+

+		Uniform *targetUniform = uniforms[uniformIndex[location].index];

+

+		if(targetUniform->psRegisterIndex != -1)

+		{

+			device->setPixelShaderConstantF(targetUniform->psRegisterIndex, (float*)vector, targetUniform->registerCount());

+		}

+

+		if(targetUniform->vsRegisterIndex != -1)

+		{

+			device->setVertexShaderConstantF(targetUniform->vsRegisterIndex, (float*)vector, targetUniform->registerCount());

+		}

+

+		return true;

+	}

+

 	void Program::appendToInfoLog(const char *format, ...)

 	{

 		if(!format)

diff --git a/src/OpenGL/libGLESv2/Program.h b/src/OpenGL/libGLESv2/Program.h
index db9aafa..f12be2c 100644
--- a/src/OpenGL/libGLESv2/Program.h
+++ b/src/OpenGL/libGLESv2/Program.h
@@ -172,6 +172,10 @@
 		bool applyUniform2iv(GLint location, GLsizei count, const GLint *v);

 		bool applyUniform3iv(GLint location, GLsizei count, const GLint *v);

 		bool applyUniform4iv(GLint location, GLsizei count, const GLint *v);

+		bool applyUniform1uiv(GLint location, GLsizei count, const GLuint *v);

+		bool applyUniform2uiv(GLint location, GLsizei count, const GLuint *v);

+		bool applyUniform3uiv(GLint location, GLsizei count, const GLuint *v);

+		bool applyUniform4uiv(GLint location, GLsizei count, const GLuint *v);

 

 		bool setUniformfv(GLint location, GLsizei count, const GLfloat *v, int numElements);

 		bool setUniformMatrixfv(GLint location, GLsizei count, const GLfloat *value, GLenum type);

diff --git a/src/OpenGL/libGLESv2/utilities.cpp b/src/OpenGL/libGLESv2/utilities.cpp
index 58c0e17..c8381e1 100644
--- a/src/OpenGL/libGLESv2/utilities.cpp
+++ b/src/OpenGL/libGLESv2/utilities.cpp
@@ -29,6 +29,7 @@
 		case GL_BOOL:

 		case GL_FLOAT:

 		case GL_INT:

+		case GL_UNSIGNED_INT:

 		case GL_SAMPLER_2D:

 		case GL_SAMPLER_CUBE:

         case GL_SAMPLER_EXTERNAL_OES:

@@ -37,14 +38,17 @@
 		case GL_BOOL_VEC2:

 		case GL_FLOAT_VEC2:

 		case GL_INT_VEC2:

+		case GL_UNSIGNED_INT_VEC2:

 			return 2;

 		case GL_INT_VEC3:

+		case GL_UNSIGNED_INT_VEC3:

 		case GL_FLOAT_VEC3:

 		case GL_BOOL_VEC3:

 			return 3;

 		case GL_BOOL_VEC4:

 		case GL_FLOAT_VEC4:

 		case GL_INT_VEC4:

+		case GL_UNSIGNED_INT_VEC4:

 		case GL_FLOAT_MAT2:

 			return 4;

 		case GL_FLOAT_MAT2x3:

@@ -99,6 +103,11 @@
 		case GL_INT_VEC3:

 		case GL_INT_VEC4:

 			return GL_INT;

+		case GL_UNSIGNED_INT:

+		case GL_UNSIGNED_INT_VEC2:

+		case GL_UNSIGNED_INT_VEC3:

+		case GL_UNSIGNED_INT_VEC4:

+			return GL_UNSIGNED_INT;

 		default:

 			UNREACHABLE();

 		}

@@ -113,6 +122,7 @@
 		case GL_BOOL:  return sizeof(GLboolean);

 		case GL_FLOAT: return sizeof(GLfloat);

 		case GL_INT:   return sizeof(GLint);

+		case GL_UNSIGNED_INT: return sizeof(GLuint);

 		}

 

 		return UniformTypeSize(UniformComponentType(type)) * UniformComponentCount(type);

@@ -127,15 +137,19 @@
 		case GL_BOOL:

 		case GL_FLOAT:

 		case GL_INT:

+		case GL_UNSIGNED_INT:

 		case GL_BOOL_VEC2:

 		case GL_FLOAT_VEC2:

 		case GL_INT_VEC2:

+		case GL_UNSIGNED_INT_VEC2:

 		case GL_INT_VEC3:

+		case GL_UNSIGNED_INT_VEC3:

 		case GL_FLOAT_VEC3:

 		case GL_BOOL_VEC3:

 		case GL_BOOL_VEC4:

 		case GL_FLOAT_VEC4:

 		case GL_INT_VEC4:

+		case GL_UNSIGNED_INT_VEC4:

 		case GL_SAMPLER_2D:

 		case GL_SAMPLER_CUBE:

         case GL_SAMPLER_EXTERNAL_OES:

@@ -169,15 +183,18 @@
 		case GL_BOOL:

 		case GL_FLOAT:

 		case GL_INT:

+		case GL_UNSIGNED_INT:

 			return 1;

 		case GL_BOOL_VEC2:

 		case GL_FLOAT_VEC2:

 		case GL_INT_VEC2:

+		case GL_UNSIGNED_INT_VEC2:

 		case GL_FLOAT_MAT2:

 		case GL_FLOAT_MAT2x3:

 		case GL_FLOAT_MAT2x4:

 			return 2;

 		case GL_INT_VEC3:

+		case GL_UNSIGNED_INT_VEC3:

 		case GL_FLOAT_VEC3:

 		case GL_BOOL_VEC3:

 		case GL_FLOAT_MAT3:

@@ -187,6 +204,7 @@
 		case GL_BOOL_VEC4:

 		case GL_FLOAT_VEC4:

 		case GL_INT_VEC4:

+		case GL_UNSIGNED_INT_VEC4:

 		case GL_FLOAT_MAT4:

 		case GL_FLOAT_MAT4x2:

 		case GL_FLOAT_MAT4x3: