Generic Transform Feedback buffer as global state

Moved the generic Transform Feedback buffer out of the local Transform
Feedback Object (TFO), and into global state.

Bug chromium:818098
Tests: dEQP-GLES3.functional.state_query.indexed.transform_feedback_switching_buffer
Change-id: Ife86cc82bd57c33b9daec4870610b5eaea5c2f52
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/28436
Presubmit-Ready: Sean Risser <srisser@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Tested-by: Sean Risser <srisser@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
diff --git a/src/OpenGL/libGLESv2/Context.cpp b/src/OpenGL/libGLESv2/Context.cpp
index 310209f..787b6d6 100644
--- a/src/OpenGL/libGLESv2/Context.cpp
+++ b/src/OpenGL/libGLESv2/Context.cpp
@@ -238,6 +238,7 @@
 	mState.pixelPackBuffer = nullptr;
 	mState.pixelUnpackBuffer = nullptr;
 	mState.genericUniformBuffer = nullptr;
+	mState.genericTransformFeedbackBuffer = nullptr;
 
 	for(int i = 0; i < MAX_UNIFORM_BUFFER_BINDINGS; i++) {
 		mState.uniformBuffers[i].set(nullptr, 0, 0);
@@ -1171,12 +1172,7 @@
 {
 	mResourceManager->checkBufferAllocation(buffer);
 
-	TransformFeedback* transformFeedback = getTransformFeedback(mState.transformFeedback);
-
-	if(transformFeedback)
-	{
-		transformFeedback->setGenericBuffer(getBuffer(buffer));
-	}
+	mState.genericTransformFeedbackBuffer = getBuffer(buffer);
 }
 
 void Context::bindTexture(TextureType type, GLuint texture)
@@ -1259,7 +1255,7 @@
 {
 	mResourceManager->checkBufferAllocation(buffer);
 
-	getTransformFeedback()->setGenericBuffer(getBuffer(buffer));
+	mState.genericTransformFeedbackBuffer = getBuffer(buffer);
 }
 
 void Context::bindIndexedTransformFeedbackBuffer(GLuint buffer, GLuint index, GLintptr offset, GLsizeiptr size)
@@ -1268,6 +1264,7 @@
 
 	Buffer* bufferObject = getBuffer(buffer);
 	getTransformFeedback()->setBuffer(index, bufferObject, offset, size);
+	mState.genericTransformFeedbackBuffer = bufferObject;
 }
 
 void Context::bindTransformFeedback(GLuint id)
@@ -1621,10 +1618,7 @@
 		*buffer = getPixelUnpackBuffer();
 		break;
 	case GL_TRANSFORM_FEEDBACK_BUFFER:
-		{
-			TransformFeedback* transformFeedback = getTransformFeedback();
-			*buffer = transformFeedback ? static_cast<es2::Buffer*>(transformFeedback->getGenericBuffer()) : nullptr;
-		}
+		*buffer = static_cast<es2::Buffer*>(mState.genericTransformFeedbackBuffer);
 		break;
 	case GL_UNIFORM_BUFFER:
 		*buffer = getGenericUniformBuffer();
@@ -2383,7 +2377,7 @@
 			TransformFeedback* transformFeedback = getTransformFeedback(mState.transformFeedback);
 			if(transformFeedback)
 			{
-				*params = transformFeedback->getGenericBufferName();
+				*params = mState.genericTransformFeedbackBuffer.name();
 			}
 			else
 			{
@@ -3861,6 +3855,10 @@
 	{
 		mState.genericUniformBuffer = nullptr;
 	}
+	if (mState.genericTransformFeedbackBuffer.name() == buffer)
+	{
+		mState.genericTransformFeedbackBuffer = nullptr;
+	}
 
 	if(getArrayBufferName() == buffer)
 	{
diff --git a/src/OpenGL/libGLESv2/Context.h b/src/OpenGL/libGLESv2/Context.h
index b41fbef..4b37709 100644
--- a/src/OpenGL/libGLESv2/Context.h
+++ b/src/OpenGL/libGLESv2/Context.h
@@ -410,6 +410,7 @@
 	gl::BindingPointer<Buffer> pixelPackBuffer;
 	gl::BindingPointer<Buffer> pixelUnpackBuffer;
 	gl::BindingPointer<Buffer> genericUniformBuffer;
+	gl::BindingPointer<Buffer> genericTransformFeedbackBuffer;
 	BufferBinding uniformBuffers[MAX_UNIFORM_BUFFER_BINDINGS];
 
 	GLuint readFramebuffer;
diff --git a/src/OpenGL/libGLESv2/TransformFeedback.cpp b/src/OpenGL/libGLESv2/TransformFeedback.cpp
index d44f16a..0ab6e95 100644
--- a/src/OpenGL/libGLESv2/TransformFeedback.cpp
+++ b/src/OpenGL/libGLESv2/TransformFeedback.cpp
@@ -21,33 +21,21 @@
 
 TransformFeedback::TransformFeedback(GLuint name) : NamedObject(name), mActive(false), mPaused(false), mVertexOffset(0)
 {
-	mGenericBuffer = nullptr;
 }
 
 TransformFeedback::~TransformFeedback()
 {
-	mGenericBuffer = nullptr;
 	for(int i = 0; i < MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS; ++i)
 	{
 		mBuffer[i].set(nullptr);
 	}
 }
 
-Buffer* TransformFeedback::getGenericBuffer() const
-{
-	return mGenericBuffer;
-}
-
 Buffer* TransformFeedback::getBuffer(GLuint index) const
 {
 	return mBuffer[index].get();
 }
 
-GLuint TransformFeedback::getGenericBufferName() const
-{
-	return mGenericBuffer.name();
-}
-
 GLuint TransformFeedback::getBufferName(GLuint index) const
 {
 	return mBuffer[index].get().name();
@@ -108,11 +96,6 @@
 	mPaused = paused;
 }
 
-void TransformFeedback::setGenericBuffer(Buffer* buffer)
-{
-	mGenericBuffer = buffer;
-}
-
 void TransformFeedback::setBuffer(GLuint index, Buffer* buffer)
 {
 	mBuffer[index].set(buffer);
@@ -125,11 +108,6 @@
 
 void TransformFeedback::detachBuffer(GLuint buffer)
 {
-	if(mGenericBuffer.name() == buffer)
-	{
-		mGenericBuffer = nullptr;
-	}
-
 	for(int i = 0; i < MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS; ++i)
 	{
 		if(mBuffer[i].get().name() == buffer)
diff --git a/src/OpenGL/libGLESv2/TransformFeedback.h b/src/OpenGL/libGLESv2/TransformFeedback.h
index c045a75..787de0e 100644
--- a/src/OpenGL/libGLESv2/TransformFeedback.h
+++ b/src/OpenGL/libGLESv2/TransformFeedback.h
@@ -35,9 +35,7 @@
 
 	BufferBinding* getBuffers() { return mBuffer; }
 
-	Buffer* getGenericBuffer() const;
 	Buffer* getBuffer(GLuint index) const;
-	GLuint getGenericBufferName() const;
 	GLuint getBufferName(GLuint index) const;
 	int getOffset(GLuint index) const;
 	int getSize(GLuint index) const;
@@ -46,7 +44,6 @@
 	GLenum primitiveMode() const;
 	int vertexOffset() const;
 
-	void setGenericBuffer(Buffer* buffer);
 	void setBuffer(GLuint index, Buffer* buffer);
 	void setBuffer(GLuint index, Buffer* buffer, GLintptr offset, GLsizeiptr size);
 	void detachBuffer(GLuint buffer);
@@ -56,7 +53,6 @@
 	void addVertexOffset(int count);
 
 private:
-	gl::BindingPointer<Buffer> mGenericBuffer;
 	BufferBinding mBuffer[MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS];
 
 	bool mActive;