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]); } }