Making Program use the currently active context device.
Fixes bug swiftshader:73.

Change-Id: I6d36348996d22cf507a4badc3af90ce8d654eb71
Reviewed-on: https://swiftshader-review.googlesource.com/10510
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/OpenGL/libGLESv2/Context.cpp b/src/OpenGL/libGLESv2/Context.cpp
index dbb5cf2..2265aa6 100644
--- a/src/OpenGL/libGLESv2/Context.cpp
+++ b/src/OpenGL/libGLESv2/Context.cpp
@@ -2981,9 +2981,9 @@
 		mAppliedProgramSerial = programObject->getSerial();
 	}
 
-	programObject->applyTransformFeedback(getTransformFeedback());
-	programObject->applyUniformBuffers(mState.uniformBuffers);
-	programObject->applyUniforms();
+	programObject->applyTransformFeedback(device, getTransformFeedback());
+	programObject->applyUniformBuffers(device, mState.uniformBuffers);
+	programObject->applyUniforms(device);
 }
 
 void Context::applyTextures()
diff --git a/src/OpenGL/libGLESv2/Program.cpp b/src/OpenGL/libGLESv2/Program.cpp
index 400da5d..24d1f3c 100644
--- a/src/OpenGL/libGLESv2/Program.cpp
+++ b/src/OpenGL/libGLESv2/Program.cpp
@@ -151,8 +151,6 @@
 
 	Program::Program(ResourceManager *manager, GLuint handle) : serial(issueSerial()), resourceManager(manager), handle(handle)
 	{
-		device = getDevice();
-
 		fragmentShader = 0;
 		vertexShader = 0;
 		pixelBinary = 0;
@@ -1064,7 +1062,7 @@
 	}
 
 	// Applies all the uniforms set for this program object to the device
-	void Program::applyUniforms()
+	void Program::applyUniforms(Device *device)
 	{
 		GLint numUniforms = static_cast<GLint>(uniformIndex.size());
 		for(GLint location = 0; location < numUniforms; location++)
@@ -1086,23 +1084,23 @@
 
 				switch(targetUniform->type)
 				{
-				case GL_BOOL:       applyUniform1bv(location, size, b);       break;
-				case GL_BOOL_VEC2:  applyUniform2bv(location, size, b);       break;
-				case GL_BOOL_VEC3:  applyUniform3bv(location, size, b);       break;
-				case GL_BOOL_VEC4:  applyUniform4bv(location, size, b);       break;
-				case GL_FLOAT:      applyUniform1fv(location, size, f);       break;
-				case GL_FLOAT_VEC2: applyUniform2fv(location, size, f);       break;
-				case GL_FLOAT_VEC3: applyUniform3fv(location, size, f);       break;
-				case GL_FLOAT_VEC4: applyUniform4fv(location, size, f);       break;
-				case GL_FLOAT_MAT2:   applyUniformMatrix2fv(location, size, f);   break;
-				case GL_FLOAT_MAT2x3: applyUniformMatrix2x3fv(location, size, f); break;
-				case GL_FLOAT_MAT2x4: applyUniformMatrix2x4fv(location, size, f); break;
-				case GL_FLOAT_MAT3x2: applyUniformMatrix3x2fv(location, size, f); break;
-				case GL_FLOAT_MAT3:   applyUniformMatrix3fv(location, size, f);   break;
-				case GL_FLOAT_MAT3x4: applyUniformMatrix3x4fv(location, size, f); break;
-				case GL_FLOAT_MAT4x2: applyUniformMatrix4x2fv(location, size, f); break;
-				case GL_FLOAT_MAT4x3: applyUniformMatrix4x3fv(location, size, f); break;
-				case GL_FLOAT_MAT4:   applyUniformMatrix4fv(location, size, f);   break;
+				case GL_BOOL:       applyUniform1bv(device, location, size, b);       break;
+				case GL_BOOL_VEC2:  applyUniform2bv(device, location, size, b);       break;
+				case GL_BOOL_VEC3:  applyUniform3bv(device, location, size, b);       break;
+				case GL_BOOL_VEC4:  applyUniform4bv(device, location, size, b);       break;
+				case GL_FLOAT:      applyUniform1fv(device, location, size, f);       break;
+				case GL_FLOAT_VEC2: applyUniform2fv(device, location, size, f);       break;
+				case GL_FLOAT_VEC3: applyUniform3fv(device, location, size, f);       break;
+				case GL_FLOAT_VEC4: applyUniform4fv(device, location, size, f);       break;
+				case GL_FLOAT_MAT2:   applyUniformMatrix2fv(device, location, size, f);   break;
+				case GL_FLOAT_MAT2x3: applyUniformMatrix2x3fv(device, location, size, f); break;
+				case GL_FLOAT_MAT2x4: applyUniformMatrix2x4fv(device, location, size, f); break;
+				case GL_FLOAT_MAT3x2: applyUniformMatrix3x2fv(device, location, size, f); break;
+				case GL_FLOAT_MAT3:   applyUniformMatrix3fv(device, location, size, f);   break;
+				case GL_FLOAT_MAT3x4: applyUniformMatrix3x4fv(device, location, size, f); break;
+				case GL_FLOAT_MAT4x2: applyUniformMatrix4x2fv(device, location, size, f); break;
+				case GL_FLOAT_MAT4x3: applyUniformMatrix4x3fv(device, location, size, f); break;
+				case GL_FLOAT_MAT4:   applyUniformMatrix4fv(device, location, size, f);   break;
 				case GL_SAMPLER_2D:
 				case GL_SAMPLER_CUBE:
 				case GL_SAMPLER_EXTERNAL_OES:
@@ -1119,14 +1117,14 @@
 				case GL_UNSIGNED_INT_SAMPLER_3D:
 				case GL_INT_SAMPLER_2D_ARRAY:
 				case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
-				case GL_INT:        applyUniform1iv(location, size, i);       break;
-				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;
+				case GL_INT:        applyUniform1iv(device, location, size, i);       break;
+				case GL_INT_VEC2:   applyUniform2iv(device, location, size, i);       break;
+				case GL_INT_VEC3:   applyUniform3iv(device, location, size, i);       break;
+				case GL_INT_VEC4:   applyUniform4iv(device, location, size, i);       break;
+				case GL_UNSIGNED_INT:      applyUniform1uiv(device, location, size, ui); break;
+				case GL_UNSIGNED_INT_VEC2: applyUniform2uiv(device, location, size, ui); break;
+				case GL_UNSIGNED_INT_VEC3: applyUniform3uiv(device, location, size, ui); break;
+				case GL_UNSIGNED_INT_VEC4: applyUniform4uiv(device, location, size, ui); break;
 				default:
 					UNREACHABLE(targetUniform->type);
 				}
@@ -1136,7 +1134,7 @@
 		}
 	}
 
-	void Program::applyUniformBuffers(BufferBinding* uniformBuffers)
+	void Program::applyUniformBuffers(Device *device, BufferBinding* uniformBuffers)
 	{
 		GLint vertexUniformBuffers[MAX_UNIFORM_BUFFER_BINDINGS];
 		GLint fragmentUniformBuffers[MAX_UNIFORM_BUFFER_BINDINGS];
@@ -1189,7 +1187,7 @@
 		}
 	}
 
-	void Program::applyTransformFeedback(TransformFeedback* transformFeedback)
+	void Program::applyTransformFeedback(Device *device, TransformFeedback* transformFeedback)
 	{
 		// Make sure the flags will fit in a 64 bit unsigned int variable
 		ASSERT(sw::max<int>(MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS, sw::MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS) <= 64);
@@ -1930,7 +1928,7 @@
 		return true;
 	}
 
-	bool Program::applyUniform(GLint location, float* data)
+	bool Program::applyUniform(Device *device, GLint location, float* data)
 	{
 		Uniform *targetUniform = uniforms[uniformIndex[location].index];
 
@@ -1947,7 +1945,7 @@
 		return true;
 	}
 
-	bool Program::applyUniform1bv(GLint location, GLsizei count, const GLboolean *v)
+	bool Program::applyUniform1bv(Device *device, GLint location, GLsizei count, const GLboolean *v)
 	{
 		int vector[MAX_UNIFORM_VECTORS][4];
 
@@ -1961,10 +1959,10 @@
 			v += 1;
 		}
 
-		return applyUniform(location, (float*)vector);
+		return applyUniform(device, location, (float*)vector);
 	}
 
-	bool Program::applyUniform2bv(GLint location, GLsizei count, const GLboolean *v)
+	bool Program::applyUniform2bv(Device *device, GLint location, GLsizei count, const GLboolean *v)
 	{
 		int vector[MAX_UNIFORM_VECTORS][4];
 
@@ -1978,10 +1976,10 @@
 			v += 2;
 		}
 
-		return applyUniform(location, (float*)vector);
+		return applyUniform(device, location, (float*)vector);
 	}
 
-	bool Program::applyUniform3bv(GLint location, GLsizei count, const GLboolean *v)
+	bool Program::applyUniform3bv(Device *device, GLint location, GLsizei count, const GLboolean *v)
 	{
 		int vector[MAX_UNIFORM_VECTORS][4];
 
@@ -1995,10 +1993,10 @@
 			v += 3;
 		}
 
-		return applyUniform(location, (float*)vector);
+		return applyUniform(device, location, (float*)vector);
 	}
 
-	bool Program::applyUniform4bv(GLint location, GLsizei count, const GLboolean *v)
+	bool Program::applyUniform4bv(Device *device, GLint location, GLsizei count, const GLboolean *v)
 	{
 		int vector[MAX_UNIFORM_VECTORS][4];
 
@@ -2012,10 +2010,10 @@
 			v += 4;
 		}
 
-		return applyUniform(location, (float*)vector);
+		return applyUniform(device, location, (float*)vector);
 	}
 
-	bool Program::applyUniform1fv(GLint location, GLsizei count, const GLfloat *v)
+	bool Program::applyUniform1fv(Device *device, GLint location, GLsizei count, const GLfloat *v)
 	{
 		float vector[MAX_UNIFORM_VECTORS][4];
 
@@ -2029,10 +2027,10 @@
 			v += 1;
 		}
 
-		return applyUniform(location, (float*)vector);
+		return applyUniform(device, location, (float*)vector);
 	}
 
-	bool Program::applyUniform2fv(GLint location, GLsizei count, const GLfloat *v)
+	bool Program::applyUniform2fv(Device *device, GLint location, GLsizei count, const GLfloat *v)
 	{
 		float vector[MAX_UNIFORM_VECTORS][4];
 
@@ -2046,10 +2044,10 @@
 			v += 2;
 		}
 
-		return applyUniform(location, (float*)vector);
+		return applyUniform(device, location, (float*)vector);
 	}
 
-	bool Program::applyUniform3fv(GLint location, GLsizei count, const GLfloat *v)
+	bool Program::applyUniform3fv(Device *device, GLint location, GLsizei count, const GLfloat *v)
 	{
 		float vector[MAX_UNIFORM_VECTORS][4];
 
@@ -2063,15 +2061,15 @@
 			v += 3;
 		}
 
-		return applyUniform(location, (float*)vector);
+		return applyUniform(device, location, (float*)vector);
 	}
 
-	bool Program::applyUniform4fv(GLint location, GLsizei count, const GLfloat *v)
+	bool Program::applyUniform4fv(Device *device, GLint location, GLsizei count, const GLfloat *v)
 	{
-		return applyUniform(location, (float*)v);
+		return applyUniform(device, location, (float*)v);
 	}
 
-	bool Program::applyUniformMatrix2fv(GLint location, GLsizei count, const GLfloat *value)
+	bool Program::applyUniformMatrix2fv(Device *device, GLint location, GLsizei count, const GLfloat *value)
 	{
 		float matrix[(MAX_UNIFORM_VECTORS + 1) / 2][2][4];
 
@@ -2083,10 +2081,10 @@
 			value += 4;
 		}
 
-		return applyUniform(location, (float*)matrix);
+		return applyUniform(device, location, (float*)matrix);
 	}
 
-	bool Program::applyUniformMatrix2x3fv(GLint location, GLsizei count, const GLfloat *value)
+	bool Program::applyUniformMatrix2x3fv(Device *device, GLint location, GLsizei count, const GLfloat *value)
 	{
 		float matrix[(MAX_UNIFORM_VECTORS + 1) / 2][2][4];
 
@@ -2098,10 +2096,10 @@
 			value += 6;
 		}
 
-		return applyUniform(location, (float*)matrix);
+		return applyUniform(device, location, (float*)matrix);
 	}
 
-	bool Program::applyUniformMatrix2x4fv(GLint location, GLsizei count, const GLfloat *value)
+	bool Program::applyUniformMatrix2x4fv(Device *device, GLint location, GLsizei count, const GLfloat *value)
 	{
 		float matrix[(MAX_UNIFORM_VECTORS + 1) / 2][2][4];
 
@@ -2113,10 +2111,10 @@
 			value += 8;
 		}
 
-		return applyUniform(location, (float*)matrix);
+		return applyUniform(device, location, (float*)matrix);
 	}
 
-	bool Program::applyUniformMatrix3fv(GLint location, GLsizei count, const GLfloat *value)
+	bool Program::applyUniformMatrix3fv(Device *device, GLint location, GLsizei count, const GLfloat *value)
 	{
 		float matrix[(MAX_UNIFORM_VECTORS + 2) / 3][3][4];
 
@@ -2129,10 +2127,10 @@
 			value += 9;
 		}
 
-		return applyUniform(location, (float*)matrix);
+		return applyUniform(device, location, (float*)matrix);
 	}
 
-	bool Program::applyUniformMatrix3x2fv(GLint location, GLsizei count, const GLfloat *value)
+	bool Program::applyUniformMatrix3x2fv(Device *device, GLint location, GLsizei count, const GLfloat *value)
 	{
 		float matrix[(MAX_UNIFORM_VECTORS + 2) / 3][3][4];
 
@@ -2145,10 +2143,10 @@
 			value += 6;
 		}
 
-		return applyUniform(location, (float*)matrix);
+		return applyUniform(device, location, (float*)matrix);
 	}
 
-	bool Program::applyUniformMatrix3x4fv(GLint location, GLsizei count, const GLfloat *value)
+	bool Program::applyUniformMatrix3x4fv(Device *device, GLint location, GLsizei count, const GLfloat *value)
 	{
 		float matrix[(MAX_UNIFORM_VECTORS + 2) / 3][3][4];
 
@@ -2161,15 +2159,15 @@
 			value += 12;
 		}
 
-		return applyUniform(location, (float*)matrix);
+		return applyUniform(device, location, (float*)matrix);
 	}
 
-	bool Program::applyUniformMatrix4fv(GLint location, GLsizei count, const GLfloat *value)
+	bool Program::applyUniformMatrix4fv(Device *device, GLint location, GLsizei count, const GLfloat *value)
 	{
-		return applyUniform(location, (float*)value);
+		return applyUniform(device, location, (float*)value);
 	}
 
-	bool Program::applyUniformMatrix4x2fv(GLint location, GLsizei count, const GLfloat *value)
+	bool Program::applyUniformMatrix4x2fv(Device *device, GLint location, GLsizei count, const GLfloat *value)
 	{
 		float matrix[(MAX_UNIFORM_VECTORS + 3) / 4][4][4];
 
@@ -2183,10 +2181,10 @@
 			value += 8;
 		}
 
-		return applyUniform(location, (float*)matrix);
+		return applyUniform(device, location, (float*)matrix);
 	}
 
-	bool Program::applyUniformMatrix4x3fv(GLint location, GLsizei count, const GLfloat *value)
+	bool Program::applyUniformMatrix4x3fv(Device *device, GLint location, GLsizei count, const GLfloat *value)
 	{
 		float matrix[(MAX_UNIFORM_VECTORS + 3) / 4][4][4];
 
@@ -2200,10 +2198,10 @@
 			value += 12;
 		}
 
-		return applyUniform(location, (float*)matrix);
+		return applyUniform(device, location, (float*)matrix);
 	}
 
-	bool Program::applyUniform1iv(GLint location, GLsizei count, const GLint *v)
+	bool Program::applyUniform1iv(Device *device, GLint location, GLsizei count, const GLint *v)
 	{
 		GLint vector[MAX_UNIFORM_VECTORS][4];
 
@@ -2248,13 +2246,13 @@
 		}
 		else
 		{
-			return applyUniform(location, (float*)vector);
+			return applyUniform(device, location, (float*)vector);
 		}
 
 		return true;
 	}
 
-	bool Program::applyUniform2iv(GLint location, GLsizei count, const GLint *v)
+	bool Program::applyUniform2iv(Device *device, GLint location, GLsizei count, const GLint *v)
 	{
 		GLint vector[MAX_UNIFORM_VECTORS][4];
 
@@ -2268,10 +2266,10 @@
 			v += 2;
 		}
 
-		return applyUniform(location, (float*)vector);
+		return applyUniform(device, location, (float*)vector);
 	}
 
-	bool Program::applyUniform3iv(GLint location, GLsizei count, const GLint *v)
+	bool Program::applyUniform3iv(Device *device, GLint location, GLsizei count, const GLint *v)
 	{
 		GLint vector[MAX_UNIFORM_VECTORS][4];
 
@@ -2285,10 +2283,10 @@
 			v += 3;
 		}
 
-		return applyUniform(location, (float*)vector);
+		return applyUniform(device, location, (float*)vector);
 	}
 
-	bool Program::applyUniform4iv(GLint location, GLsizei count, const GLint *v)
+	bool Program::applyUniform4iv(Device *device, GLint location, GLsizei count, const GLint *v)
 	{
 		GLint vector[MAX_UNIFORM_VECTORS][4];
 
@@ -2302,10 +2300,10 @@
 			v += 4;
 		}
 
-		return applyUniform(location, (float*)vector);
+		return applyUniform(device, location, (float*)vector);
 	}
 
-	bool Program::applyUniform1uiv(GLint location, GLsizei count, const GLuint *v)
+	bool Program::applyUniform1uiv(Device *device, GLint location, GLsizei count, const GLuint *v)
 	{
 		GLuint vector[MAX_UNIFORM_VECTORS][4];
 
@@ -2350,13 +2348,13 @@
 		}
 		else
 		{
-			return applyUniform(location, (float*)vector);
+			return applyUniform(device, location, (float*)vector);
 		}
 
 		return true;
 	}
 
-	bool Program::applyUniform2uiv(GLint location, GLsizei count, const GLuint *v)
+	bool Program::applyUniform2uiv(Device *device, GLint location, GLsizei count, const GLuint *v)
 	{
 		GLuint vector[MAX_UNIFORM_VECTORS][4];
 
@@ -2370,10 +2368,10 @@
 			v += 2;
 		}
 
-		return applyUniform(location, (float*)vector);
+		return applyUniform(device, location, (float*)vector);
 	}
 
-	bool Program::applyUniform3uiv(GLint location, GLsizei count, const GLuint *v)
+	bool Program::applyUniform3uiv(Device *device, GLint location, GLsizei count, const GLuint *v)
 	{
 		GLuint vector[MAX_UNIFORM_VECTORS][4];
 
@@ -2387,10 +2385,10 @@
 			v += 3;
 		}
 
-		return applyUniform(location, (float*)vector);
+		return applyUniform(device, location, (float*)vector);
 	}
 
-	bool Program::applyUniform4uiv(GLint location, GLsizei count, const GLuint *v)
+	bool Program::applyUniform4uiv(Device *device, GLint location, GLsizei count, const GLuint *v)
 	{
 		GLuint vector[MAX_UNIFORM_VECTORS][4];
 
@@ -2404,7 +2402,7 @@
 			v += 4;
 		}
 
-		return applyUniform(location, (float*)vector);
+		return applyUniform(device, location, (float*)vector);
 	}
 
 	void Program::appendToInfoLog(const char *format, ...)
@@ -2875,7 +2873,7 @@
 		return orphaned;
 	}
 
-	void Program::validate()
+	void Program::validate(Device* device)
 	{
 		resetInfoLog();
 
@@ -2886,7 +2884,7 @@
 		}
 		else
 		{
-			applyUniforms();
+			applyUniforms(device);
 			if(!validateSamplers(true))
 			{
 				validated = false;
diff --git a/src/OpenGL/libGLESv2/Program.h b/src/OpenGL/libGLESv2/Program.h
index ff4bc5f..56f7df7 100644
--- a/src/OpenGL/libGLESv2/Program.h
+++ b/src/OpenGL/libGLESv2/Program.h
@@ -172,9 +172,9 @@
 		bool getUniformuiv(GLint location, GLsizei *bufSize, GLuint *params);
 
 		void dirtyAllUniforms();
-		void applyUniforms();
-		void applyUniformBuffers(BufferBinding* uniformBuffers);
-		void applyTransformFeedback(TransformFeedback* transformFeedback);
+		void applyUniforms(Device *device);
+		void applyUniformBuffers(Device *device, BufferBinding* uniformBuffers);
+		void applyTransformFeedback(Device *device, TransformFeedback* transformFeedback);
 
 		void link();
 		bool isLinked() const;
@@ -207,7 +207,7 @@
 		void flagForDeletion();
 		bool isFlaggedForDeletion() const;
 
-		void validate();
+		void validate(Device* device);
 		bool validateSamplers(bool logErrors);
 		bool isValidated() const;
 
@@ -232,32 +232,32 @@
 		bool areMatchingUniformBlocks(const glsl::UniformBlock &block1, const glsl::UniformBlock &block2, const Shader *shader1, const Shader *shader2);
 		bool defineUniform(GLenum shader, GLenum type, GLenum precision, const std::string &_name, unsigned int arraySize, int registerIndex, const Uniform::BlockInfo& blockInfo);
 		bool defineUniformBlock(const Shader *shader, const glsl::UniformBlock &block);
-		bool applyUniform(GLint location, float* data);
-		bool applyUniform1bv(GLint location, GLsizei count, const GLboolean *v);
-		bool applyUniform2bv(GLint location, GLsizei count, const GLboolean *v);
-		bool applyUniform3bv(GLint location, GLsizei count, const GLboolean *v);
-		bool applyUniform4bv(GLint location, GLsizei count, const GLboolean *v);
-		bool applyUniform1fv(GLint location, GLsizei count, const GLfloat *v);
-		bool applyUniform2fv(GLint location, GLsizei count, const GLfloat *v);
-		bool applyUniform3fv(GLint location, GLsizei count, const GLfloat *v);
-		bool applyUniform4fv(GLint location, GLsizei count, const GLfloat *v);
-		bool applyUniformMatrix2fv(GLint location, GLsizei count, const GLfloat *value);
-		bool applyUniformMatrix2x3fv(GLint location, GLsizei count, const GLfloat *value);
-		bool applyUniformMatrix2x4fv(GLint location, GLsizei count, const GLfloat *value);
-		bool applyUniformMatrix3fv(GLint location, GLsizei count, const GLfloat *value);
-		bool applyUniformMatrix3x2fv(GLint location, GLsizei count, const GLfloat *value);
-		bool applyUniformMatrix3x4fv(GLint location, GLsizei count, const GLfloat *value);
-		bool applyUniformMatrix4fv(GLint location, GLsizei count, const GLfloat *value);
-		bool applyUniformMatrix4x2fv(GLint location, GLsizei count, const GLfloat *value);
-		bool applyUniformMatrix4x3fv(GLint location, GLsizei count, const GLfloat *value);
-		bool applyUniform1iv(GLint location, GLsizei count, const GLint *v);
-		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 applyUniform(Device *device, GLint location, float* data);
+		bool applyUniform1bv(Device *device, GLint location, GLsizei count, const GLboolean *v);
+		bool applyUniform2bv(Device *device, GLint location, GLsizei count, const GLboolean *v);
+		bool applyUniform3bv(Device *device, GLint location, GLsizei count, const GLboolean *v);
+		bool applyUniform4bv(Device *device, GLint location, GLsizei count, const GLboolean *v);
+		bool applyUniform1fv(Device *device, GLint location, GLsizei count, const GLfloat *v);
+		bool applyUniform2fv(Device *device, GLint location, GLsizei count, const GLfloat *v);
+		bool applyUniform3fv(Device *device, GLint location, GLsizei count, const GLfloat *v);
+		bool applyUniform4fv(Device *device, GLint location, GLsizei count, const GLfloat *v);
+		bool applyUniformMatrix2fv(Device *device, GLint location, GLsizei count, const GLfloat *value);
+		bool applyUniformMatrix2x3fv(Device *device, GLint location, GLsizei count, const GLfloat *value);
+		bool applyUniformMatrix2x4fv(Device *device, GLint location, GLsizei count, const GLfloat *value);
+		bool applyUniformMatrix3fv(Device *device, GLint location, GLsizei count, const GLfloat *value);
+		bool applyUniformMatrix3x2fv(Device *device, GLint location, GLsizei count, const GLfloat *value);
+		bool applyUniformMatrix3x4fv(Device *device, GLint location, GLsizei count, const GLfloat *value);
+		bool applyUniformMatrix4fv(Device *device, GLint location, GLsizei count, const GLfloat *value);
+		bool applyUniformMatrix4x2fv(Device *device, GLint location, GLsizei count, const GLfloat *value);
+		bool applyUniformMatrix4x3fv(Device *device, GLint location, GLsizei count, const GLfloat *value);
+		bool applyUniform1iv(Device *device, GLint location, GLsizei count, const GLint *v);
+		bool applyUniform2iv(Device *device, GLint location, GLsizei count, const GLint *v);
+		bool applyUniform3iv(Device *device, GLint location, GLsizei count, const GLint *v);
+		bool applyUniform4iv(Device *device, GLint location, GLsizei count, const GLint *v);
+		bool applyUniform1uiv(Device *device, GLint location, GLsizei count, const GLuint *v);
+		bool applyUniform2uiv(Device *device, GLint location, GLsizei count, const GLuint *v);
+		bool applyUniform3uiv(Device *device, GLint location, GLsizei count, const GLuint *v);
+		bool applyUniform4uiv(Device *device, GLint location, GLsizei count, const GLuint *v);
 
 		bool setUniformfv(GLint location, GLsizei count, const GLfloat *v, int numElements);
 		bool setUniformMatrixfv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value, GLenum type);
@@ -270,7 +270,6 @@
 		static unsigned int issueSerial();
 
 	private:
-		es2::Device *device;
 		FragmentShader *fragmentShader;
 		VertexShader *vertexShader;
 
diff --git a/src/OpenGL/libGLESv2/libGLESv2.cpp b/src/OpenGL/libGLESv2/libGLESv2.cpp
index 8be9056..920e1a0 100644
--- a/src/OpenGL/libGLESv2/libGLESv2.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv2.cpp
@@ -5970,7 +5970,7 @@
 			}
 		}
 
-		programObject->validate();
+		programObject->validate(context->getDevice());
 	}
 }