Fix for glBindTransformFeedback and glDeleteTransformFeedbacks
Added proper checks for invalid operations.
Fixes all remaining failures in dEQP-GLES3.functional.lifetime*
Change-Id: Ia91ffdb8ced53f1f787b82ada0de22caf9ee9206
Reviewed-on: https://swiftshader-review.googlesource.com/13748
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/OpenGL/libGLESv2/Context.cpp b/src/OpenGL/libGLESv2/Context.cpp
index 9eefb3f..360891a 100644
--- a/src/OpenGL/libGLESv2/Context.cpp
+++ b/src/OpenGL/libGLESv2/Context.cpp
@@ -1511,6 +1511,11 @@
return mTransformFeedbackNameSpace.find(transformFeedback);
}
+bool Context::isTransformFeedback(GLuint array) const
+{
+ return mTransformFeedbackNameSpace.isReserved(array);
+}
+
Sampler *Context::getSampler(GLuint sampler) const
{
return mResourceManager->getSampler(sampler);
diff --git a/src/OpenGL/libGLESv2/Context.h b/src/OpenGL/libGLESv2/Context.h
index d00f545..ac29824 100644
--- a/src/OpenGL/libGLESv2/Context.h
+++ b/src/OpenGL/libGLESv2/Context.h
@@ -632,6 +632,7 @@
VertexArray *getCurrentVertexArray() const;
bool isVertexArray(GLuint array) const;
TransformFeedback *getTransformFeedback(GLuint transformFeedback) const;
+ bool isTransformFeedback(GLuint transformFeedback) const;
TransformFeedback *getTransformFeedback() const;
Sampler *getSampler(GLuint sampler) const;
bool isSampler(GLuint sampler) const;
diff --git a/src/OpenGL/libGLESv2/libGLESv3.cpp b/src/OpenGL/libGLESv2/libGLESv3.cpp
index a300753..c4b1207 100644
--- a/src/OpenGL/libGLESv2/libGLESv3.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv3.cpp
@@ -3487,6 +3487,11 @@
return error(GL_INVALID_OPERATION);
}
+ if(!context->isTransformFeedback(id))
+ {
+ return error(GL_INVALID_OPERATION);
+ }
+
context->bindTransformFeedback(id);
}
}
@@ -3508,6 +3513,13 @@
{
if(ids[i] != 0)
{
+ es2::TransformFeedback *transformFeedbackObject = context->getTransformFeedback(ids[i]);
+
+ if(transformFeedbackObject && transformFeedbackObject->isActive())
+ {
+ return error(GL_INVALID_OPERATION);
+ }
+
context->deleteTransformFeedback(ids[i]);
}
}