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/PixelProcessor.cpp b/src/Renderer/PixelProcessor.cpp
index f736233..02d4c56 100644
--- a/src/Renderer/PixelProcessor.cpp
+++ b/src/Renderer/PixelProcessor.cpp
@@ -58,6 +58,12 @@
 		return memcmp(static_cast<const States*>(this), static_cast<const States*>(&state), sizeof(States)) == 0;
 	}
 
+	PixelProcessor::UniformBufferInfo::UniformBufferInfo()
+	{
+		buffer = nullptr;
+		offset = 0;
+	}
+
 	PixelProcessor::PixelProcessor(Context *context) : context(context)
 	{
 		setGlobalMipmapBias(0.0f);   // Round to highest LOD [0.5, 1.0]: -0.5
@@ -66,11 +72,6 @@
 
 		routineCache = 0;
 		setRoutineCacheSize(1024);
-
-		for(int i = 0; i < MAX_UNIFORM_BUFFER_BINDINGS; i++)
-		{
-			uniformBuffer[i] = nullptr;
-		}
 	}
 
 	PixelProcessor::~PixelProcessor()
@@ -143,27 +144,16 @@
 
 	void PixelProcessor::setUniformBuffer(int index, sw::Resource* buffer, int offset)
 	{
-		uniformBuffer[index] = buffer;
-		uniformBufferOffset[index] = offset;
+		uniformBufferInfo[index].buffer = buffer;
+		uniformBufferInfo[index].offset = offset;
 	}
 
-	void PixelProcessor::lockUniformBuffers(byte** u)
+	void PixelProcessor::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 PixelProcessor::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;
 		}
 	}