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;