Commit 3f1d0b76 by Alexis Hetu Committed by Alexis Hétu

Fixed a few issues related to transform feedback buffers

- Transform feedback buffers are now properly cleared when the object is deleted - Transform feedback buffers are now properly detached when a buffer is deleted - Ending a transform feedback now properly sets its PAUSED state to false - Added missing enums to Context::getQueryParameterInfo. GL_READ_FRAMEBUFFER_BINDING_ANGLE was also missing, so it was also added in this cl. Change-Id: I286caec119d5ae3adde95c4cce7f0298b8f836c3 Reviewed-on: https://swiftshader-review.googlesource.com/3962Tested-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com>
parent e4795222
......@@ -2479,7 +2479,8 @@ bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *nu
case GL_NUM_SHADER_BINARY_FORMATS:
case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
case GL_ARRAY_BUFFER_BINDING:
case GL_FRAMEBUFFER_BINDING:
case GL_FRAMEBUFFER_BINDING: // Same as GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
case GL_RENDERBUFFER_BINDING:
case GL_CURRENT_PROGRAM:
case GL_PACK_ALIGNMENT:
......@@ -2634,6 +2635,8 @@ bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *nu
case GL_DITHER:
case GL_PRIMITIVE_RESTART_FIXED_INDEX:
case GL_RASTERIZER_DISCARD:
case GL_TRANSFORM_FEEDBACK_ACTIVE:
case GL_TRANSFORM_FEEDBACK_PAUSED:
{
*type = GL_BOOL;
*numParams = 1;
......@@ -3871,6 +3874,11 @@ void Context::detachBuffer(GLuint buffer)
mState.arrayBuffer = NULL;
}
for(auto tfIt = mTransformFeedbackMap.begin(); tfIt != mTransformFeedbackMap.end(); tfIt++)
{
tfIt->second->detachBuffer(buffer);
}
for(auto vaoIt = mVertexArrayMap.begin(); vaoIt != mVertexArrayMap.end(); vaoIt++)
{
vaoIt->second->detachBuffer(buffer);
......
......@@ -23,6 +23,15 @@ TransformFeedback::TransformFeedback(GLuint name) : NamedObject(name), mActive(f
mGenericBuffer = NULL;
}
TransformFeedback::~TransformFeedback()
{
mGenericBuffer = NULL;
for(int i = 0; i < MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS; ++i)
{
mBuffer[i] = NULL;
}
}
Buffer* TransformFeedback::getGenericBuffer() const
{
return mGenericBuffer;
......@@ -56,6 +65,7 @@ void TransformFeedback::begin(GLenum primitiveMode)
void TransformFeedback::end()
{
mActive = false;
mPaused = false;
}
void TransformFeedback::setPaused(bool paused)
......@@ -82,4 +92,20 @@ void TransformFeedback::setBuffer(GLuint index, Buffer* buffer, GLintptr offset,
}
}
void TransformFeedback::detachBuffer(GLuint buffer)
{
if(mGenericBuffer.name() == buffer)
{
mGenericBuffer = NULL;
}
for(int i = 0; i < MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS; ++i)
{
if(mBuffer[i].name() == buffer)
{
mBuffer[i] = NULL;
}
}
}
}
......@@ -28,6 +28,7 @@ class TransformFeedback : public gl::NamedObject
public:
// FIXME: Change this when implementing transform feedback
TransformFeedback(GLuint name);
~TransformFeedback();
Buffer* getGenericBuffer() const;
Buffer* getBuffer(GLuint index) const;
......@@ -38,6 +39,7 @@ public:
void setGenericBuffer(Buffer* buffer);
void setBuffer(GLuint index, Buffer* buffer);
void setBuffer(GLuint index, Buffer* buffer, GLintptr offset, GLsizeiptr size);
void detachBuffer(GLuint buffer);
void begin(GLenum primitiveMode);
void end();
void setPaused(bool paused);
......
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