Renderer side code to lock/unlock transform feedback data

Added variables and function calls to lock/unlock transform
feedback data used for reading the selected transform
feedback varying variables out of the vertex shader.

Also fixed uniform buffer unlocking potential race condition.

Change-Id: I98790fc36fdf8674506d924b2f21b3e68892811a
Reviewed-on: https://swiftshader-review.googlesource.com/5060
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/Renderer/VertexProcessor.cpp b/src/Renderer/VertexProcessor.cpp
index 01f6f14..24f40cc 100644
--- a/src/Renderer/VertexProcessor.cpp
+++ b/src/Renderer/VertexProcessor.cpp
@@ -63,11 +63,6 @@
 
 	VertexProcessor::TransformFeedbackInfo::TransformFeedbackInfo()
 	{
-		clear();
-	}
-
-	void VertexProcessor::TransformFeedbackInfo::clear()
-	{
 		buffer = nullptr;
 		offset = 0;
 		reg = 0;
@@ -76,6 +71,12 @@
 		stride = 0;
 	}
 
+	VertexProcessor::UniformBufferInfo::UniformBufferInfo()
+	{
+		buffer = nullptr;
+		offset = 0;
+	}
+
 	VertexProcessor::VertexProcessor(Context *context) : context(context)
 	{
 		for(int i = 0; i < 12; i++)
@@ -116,11 +117,6 @@
 
 		routineCache = 0;
 		setRoutineCacheSize(1024);
-
-		for(int i = 0; i < MAX_UNIFORM_BUFFER_BINDINGS; i++)
-		{
-			uniformBuffer[i] = nullptr;
-		}
 	}
 
 	VertexProcessor::~VertexProcessor()
@@ -179,27 +175,16 @@
 
 	void VertexProcessor::setUniformBuffer(int index, sw::Resource* buffer, int offset)
 	{
-		uniformBuffer[index] = buffer;
-		uniformBufferOffset[index] = offset;
+		uniformBufferInfo[index].buffer = buffer;
+		uniformBufferInfo[index].offset = offset;
 	}
 
-	void VertexProcessor::lockUniformBuffers(byte** u)
+	void VertexProcessor::lockUniformBuffers(byte** u, sw::Resource* uniformBuffers[])
 	{
 		for(int i = 0; i < MAX_UNIFORM_BUFFER_BINDINGS; ++i)
 		{
-			u[i] = uniformBuffer[i] ? static_cast<byte*>(uniformBuffer[i]->lock(PUBLIC, PRIVATE)) + uniformBufferOffset[i] : nullptr;
-		}
-	}
-
-	void VertexProcessor::unlockUniformBuffers()
-	{
-		for(int i = 0; i < MAX_UNIFORM_BUFFER_BINDINGS; ++i)
-		{
-			if(uniformBuffer[i])
-			{
-				uniformBuffer[i]->unlock();
-				uniformBuffer[i] = nullptr;
-			}
+			u[i] = uniformBufferInfo[i].buffer ? static_cast<byte*>(uniformBufferInfo[i].buffer->lock(PUBLIC, PRIVATE)) + uniformBufferInfo[i].offset : nullptr;
+			uniformBuffers[i] = uniformBufferInfo[i].buffer;
 		}
 	}
 
@@ -213,11 +198,12 @@
 		transformFeedbackInfo[index].stride = stride;
 	}
 
-	void VertexProcessor::lockTransformFeedbackBuffers(byte** t, unsigned int* v, unsigned int* r, unsigned int* c, unsigned int* s)
+	void VertexProcessor::lockTransformFeedbackBuffers(byte** t, unsigned int* v, unsigned int* r, unsigned int* c, unsigned int* s, sw::Resource* transformFeedbackBuffers[])
 	{
 		for(int i = 0; i < MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS; ++i)
 		{
 			t[i] = transformFeedbackInfo[i].buffer ? static_cast<byte*>(transformFeedbackInfo[i].buffer->lock(PUBLIC, PRIVATE)) + transformFeedbackInfo[i].offset : nullptr;
+			transformFeedbackBuffers[i] = transformFeedbackInfo[i].buffer;
 			v[i] = transformFeedbackInfo[i].reg;
 			r[i] = transformFeedbackInfo[i].row;
 			c[i] = transformFeedbackInfo[i].col;
@@ -225,18 +211,6 @@
 		}
 	}
 
-	void VertexProcessor::unlockTransformFeedbackBuffers()
-	{
-		for(int i = 0; i < MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS; ++i)
-		{
-			if(transformFeedbackInfo[i].buffer)
-			{
-				transformFeedbackInfo[i].buffer->unlock();
-			}
-			transformFeedbackInfo[i].clear();
-		}
-	}
-
 	void VertexProcessor::setModelMatrix(const Matrix &M, int i)
 	{
 		if(i < 12)