Commit 3635a129 by Sean Risser

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: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <nicolascapens@google.com> Tested-by: 's avatarSean Risser <srisser@google.com> Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
parent 04dae5ec
...@@ -238,6 +238,7 @@ Context::~Context() ...@@ -238,6 +238,7 @@ Context::~Context()
mState.pixelPackBuffer = nullptr; mState.pixelPackBuffer = nullptr;
mState.pixelUnpackBuffer = nullptr; mState.pixelUnpackBuffer = nullptr;
mState.genericUniformBuffer = nullptr; mState.genericUniformBuffer = nullptr;
mState.genericTransformFeedbackBuffer = nullptr;
for(int i = 0; i < MAX_UNIFORM_BUFFER_BINDINGS; i++) { for(int i = 0; i < MAX_UNIFORM_BUFFER_BINDINGS; i++) {
mState.uniformBuffers[i].set(nullptr, 0, 0); mState.uniformBuffers[i].set(nullptr, 0, 0);
...@@ -1171,12 +1172,7 @@ void Context::bindTransformFeedbackBuffer(GLuint buffer) ...@@ -1171,12 +1172,7 @@ void Context::bindTransformFeedbackBuffer(GLuint buffer)
{ {
mResourceManager->checkBufferAllocation(buffer); mResourceManager->checkBufferAllocation(buffer);
TransformFeedback* transformFeedback = getTransformFeedback(mState.transformFeedback); mState.genericTransformFeedbackBuffer = getBuffer(buffer);
if(transformFeedback)
{
transformFeedback->setGenericBuffer(getBuffer(buffer));
}
} }
void Context::bindTexture(TextureType type, GLuint texture) void Context::bindTexture(TextureType type, GLuint texture)
...@@ -1259,7 +1255,7 @@ void Context::bindGenericTransformFeedbackBuffer(GLuint buffer) ...@@ -1259,7 +1255,7 @@ void Context::bindGenericTransformFeedbackBuffer(GLuint buffer)
{ {
mResourceManager->checkBufferAllocation(buffer); mResourceManager->checkBufferAllocation(buffer);
getTransformFeedback()->setGenericBuffer(getBuffer(buffer)); mState.genericTransformFeedbackBuffer = getBuffer(buffer);
} }
void Context::bindIndexedTransformFeedbackBuffer(GLuint buffer, GLuint index, GLintptr offset, GLsizeiptr size) void Context::bindIndexedTransformFeedbackBuffer(GLuint buffer, GLuint index, GLintptr offset, GLsizeiptr size)
...@@ -1268,6 +1264,7 @@ void Context::bindIndexedTransformFeedbackBuffer(GLuint buffer, GLuint index, GL ...@@ -1268,6 +1264,7 @@ void Context::bindIndexedTransformFeedbackBuffer(GLuint buffer, GLuint index, GL
Buffer* bufferObject = getBuffer(buffer); Buffer* bufferObject = getBuffer(buffer);
getTransformFeedback()->setBuffer(index, bufferObject, offset, size); getTransformFeedback()->setBuffer(index, bufferObject, offset, size);
mState.genericTransformFeedbackBuffer = bufferObject;
} }
void Context::bindTransformFeedback(GLuint id) void Context::bindTransformFeedback(GLuint id)
...@@ -1621,10 +1618,7 @@ bool Context::getBuffer(GLenum target, es2::Buffer **buffer) const ...@@ -1621,10 +1618,7 @@ bool Context::getBuffer(GLenum target, es2::Buffer **buffer) const
*buffer = getPixelUnpackBuffer(); *buffer = getPixelUnpackBuffer();
break; break;
case GL_TRANSFORM_FEEDBACK_BUFFER: case GL_TRANSFORM_FEEDBACK_BUFFER:
{ *buffer = static_cast<es2::Buffer*>(mState.genericTransformFeedbackBuffer);
TransformFeedback* transformFeedback = getTransformFeedback();
*buffer = transformFeedback ? static_cast<es2::Buffer*>(transformFeedback->getGenericBuffer()) : nullptr;
}
break; break;
case GL_UNIFORM_BUFFER: case GL_UNIFORM_BUFFER:
*buffer = getGenericUniformBuffer(); *buffer = getGenericUniformBuffer();
...@@ -2383,7 +2377,7 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const ...@@ -2383,7 +2377,7 @@ template<typename T> bool Context::getIntegerv(GLenum pname, T *params) const
TransformFeedback* transformFeedback = getTransformFeedback(mState.transformFeedback); TransformFeedback* transformFeedback = getTransformFeedback(mState.transformFeedback);
if(transformFeedback) if(transformFeedback)
{ {
*params = transformFeedback->getGenericBufferName(); *params = mState.genericTransformFeedbackBuffer.name();
} }
else else
{ {
...@@ -3861,6 +3855,10 @@ void Context::detachBuffer(GLuint buffer) ...@@ -3861,6 +3855,10 @@ void Context::detachBuffer(GLuint buffer)
{ {
mState.genericUniformBuffer = nullptr; mState.genericUniformBuffer = nullptr;
} }
if (mState.genericTransformFeedbackBuffer.name() == buffer)
{
mState.genericTransformFeedbackBuffer = nullptr;
}
if(getArrayBufferName() == buffer) if(getArrayBufferName() == buffer)
{ {
......
...@@ -410,6 +410,7 @@ struct State ...@@ -410,6 +410,7 @@ struct State
gl::BindingPointer<Buffer> pixelPackBuffer; gl::BindingPointer<Buffer> pixelPackBuffer;
gl::BindingPointer<Buffer> pixelUnpackBuffer; gl::BindingPointer<Buffer> pixelUnpackBuffer;
gl::BindingPointer<Buffer> genericUniformBuffer; gl::BindingPointer<Buffer> genericUniformBuffer;
gl::BindingPointer<Buffer> genericTransformFeedbackBuffer;
BufferBinding uniformBuffers[MAX_UNIFORM_BUFFER_BINDINGS]; BufferBinding uniformBuffers[MAX_UNIFORM_BUFFER_BINDINGS];
GLuint readFramebuffer; GLuint readFramebuffer;
......
...@@ -21,33 +21,21 @@ namespace es2 ...@@ -21,33 +21,21 @@ namespace es2
TransformFeedback::TransformFeedback(GLuint name) : NamedObject(name), mActive(false), mPaused(false), mVertexOffset(0) TransformFeedback::TransformFeedback(GLuint name) : NamedObject(name), mActive(false), mPaused(false), mVertexOffset(0)
{ {
mGenericBuffer = nullptr;
} }
TransformFeedback::~TransformFeedback() TransformFeedback::~TransformFeedback()
{ {
mGenericBuffer = nullptr;
for(int i = 0; i < MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS; ++i) for(int i = 0; i < MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS; ++i)
{ {
mBuffer[i].set(nullptr); mBuffer[i].set(nullptr);
} }
} }
Buffer* TransformFeedback::getGenericBuffer() const
{
return mGenericBuffer;
}
Buffer* TransformFeedback::getBuffer(GLuint index) const Buffer* TransformFeedback::getBuffer(GLuint index) const
{ {
return mBuffer[index].get(); return mBuffer[index].get();
} }
GLuint TransformFeedback::getGenericBufferName() const
{
return mGenericBuffer.name();
}
GLuint TransformFeedback::getBufferName(GLuint index) const GLuint TransformFeedback::getBufferName(GLuint index) const
{ {
return mBuffer[index].get().name(); return mBuffer[index].get().name();
...@@ -108,11 +96,6 @@ void TransformFeedback::setPaused(bool paused) ...@@ -108,11 +96,6 @@ void TransformFeedback::setPaused(bool paused)
mPaused = paused; mPaused = paused;
} }
void TransformFeedback::setGenericBuffer(Buffer* buffer)
{
mGenericBuffer = buffer;
}
void TransformFeedback::setBuffer(GLuint index, Buffer* buffer) void TransformFeedback::setBuffer(GLuint index, Buffer* buffer)
{ {
mBuffer[index].set(buffer); mBuffer[index].set(buffer);
...@@ -125,11 +108,6 @@ void TransformFeedback::setBuffer(GLuint index, Buffer* buffer, GLintptr offset, ...@@ -125,11 +108,6 @@ void TransformFeedback::setBuffer(GLuint index, Buffer* buffer, GLintptr offset,
void TransformFeedback::detachBuffer(GLuint buffer) void TransformFeedback::detachBuffer(GLuint buffer)
{ {
if(mGenericBuffer.name() == buffer)
{
mGenericBuffer = nullptr;
}
for(int i = 0; i < MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS; ++i) for(int i = 0; i < MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS; ++i)
{ {
if(mBuffer[i].get().name() == buffer) if(mBuffer[i].get().name() == buffer)
......
...@@ -35,9 +35,7 @@ public: ...@@ -35,9 +35,7 @@ public:
BufferBinding* getBuffers() { return mBuffer; } BufferBinding* getBuffers() { return mBuffer; }
Buffer* getGenericBuffer() const;
Buffer* getBuffer(GLuint index) const; Buffer* getBuffer(GLuint index) const;
GLuint getGenericBufferName() const;
GLuint getBufferName(GLuint index) const; GLuint getBufferName(GLuint index) const;
int getOffset(GLuint index) const; int getOffset(GLuint index) const;
int getSize(GLuint index) const; int getSize(GLuint index) const;
...@@ -46,7 +44,6 @@ public: ...@@ -46,7 +44,6 @@ public:
GLenum primitiveMode() const; GLenum primitiveMode() const;
int vertexOffset() const; int vertexOffset() const;
void setGenericBuffer(Buffer* buffer);
void setBuffer(GLuint index, Buffer* buffer); void setBuffer(GLuint index, Buffer* buffer);
void setBuffer(GLuint index, Buffer* buffer, GLintptr offset, GLsizeiptr size); void setBuffer(GLuint index, Buffer* buffer, GLintptr offset, GLsizeiptr size);
void detachBuffer(GLuint buffer); void detachBuffer(GLuint buffer);
...@@ -56,7 +53,6 @@ public: ...@@ -56,7 +53,6 @@ public:
void addVertexOffset(int count); void addVertexOffset(int count);
private: private:
gl::BindingPointer<Buffer> mGenericBuffer;
BufferBinding mBuffer[MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS]; BufferBinding mBuffer[MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS];
bool mActive; bool mActive;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment