Transform Feedback buffer locking utility functions

Similarly to what had been done for uniform buffers,
transform feedback buffers require locking/unlocking
functions so that the Renderer can access these resources.

Change-Id: I909ccda4f30534290ebd4a575c082b5475786080
Reviewed-on: https://swiftshader-review.googlesource.com/5041
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 eaaf3e2..01f6f14 100644
--- a/src/Renderer/VertexProcessor.cpp
+++ b/src/Renderer/VertexProcessor.cpp
@@ -61,6 +61,21 @@
 		return memcmp(static_cast<const States*>(this), static_cast<const States*>(&state), sizeof(States)) == 0;
 	}
 
+	VertexProcessor::TransformFeedbackInfo::TransformFeedbackInfo()
+	{
+		clear();
+	}
+
+	void VertexProcessor::TransformFeedbackInfo::clear()
+	{
+		buffer = nullptr;
+		offset = 0;
+		reg = 0;
+		row = 0;
+		col = 0;
+		stride = 0;
+	}
+
 	VertexProcessor::VertexProcessor(Context *context) : context(context)
 	{
 		for(int i = 0; i < 12; i++)
@@ -188,6 +203,40 @@
 		}
 	}
 
+	void VertexProcessor::setTransformFeedbackBuffer(int index, sw::Resource* buffer, int offset, unsigned int reg, unsigned int row, unsigned int col, size_t stride)
+	{
+		transformFeedbackInfo[index].buffer = buffer;
+		transformFeedbackInfo[index].offset = offset;
+		transformFeedbackInfo[index].reg = reg;
+		transformFeedbackInfo[index].row = row;
+		transformFeedbackInfo[index].col = col;
+		transformFeedbackInfo[index].stride = stride;
+	}
+
+	void VertexProcessor::lockTransformFeedbackBuffers(byte** t, unsigned int* v, unsigned int* r, unsigned int* c, unsigned int* s)
+	{
+		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;
+			v[i] = transformFeedbackInfo[i].reg;
+			r[i] = transformFeedbackInfo[i].row;
+			c[i] = transformFeedbackInfo[i].col;
+			s[i] = transformFeedbackInfo[i].stride;
+		}
+	}
+
+	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)