OSDN Git Service

Fix for glBindTransformFeedback and glDeleteTransformFeedbacks
authorAlexis Hetu <sugoi@google.com>
Tue, 14 Nov 2017 16:06:03 +0000 (11:06 -0500)
committerAlexis Hétu <sugoi@google.com>
Tue, 14 Nov 2017 18:27:03 +0000 (18:27 +0000)
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>
src/OpenGL/libGLESv2/Context.cpp
src/OpenGL/libGLESv2/Context.h
src/OpenGL/libGLESv2/libGLESv3.cpp

index 9eefb3f..360891a 100644 (file)
@@ -1511,6 +1511,11 @@ TransformFeedback *Context::getTransformFeedback(GLuint transformFeedback) const
        return mTransformFeedbackNameSpace.find(transformFeedback);
 }
 
+bool Context::isTransformFeedback(GLuint array) const
+{
+       return mTransformFeedbackNameSpace.isReserved(array);
+}
+
 Sampler *Context::getSampler(GLuint sampler) const
 {
        return mResourceManager->getSampler(sampler);
index d00f545..ac29824 100644 (file)
@@ -632,6 +632,7 @@ public:
        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;
index a300753..c4b1207 100644 (file)
@@ -3487,6 +3487,11 @@ GL_APICALL void GL_APIENTRY glBindTransformFeedback(GLenum target, GLuint id)
                        return error(GL_INVALID_OPERATION);
                }
 
+               if(!context->isTransformFeedback(id))
+               {
+                       return error(GL_INVALID_OPERATION);
+               }
+
                context->bindTransformFeedback(id);
        }
 }
@@ -3508,6 +3513,13 @@ GL_APICALL void GL_APIENTRY glDeleteTransformFeedbacks(GLsizei n, const GLuint *
                {
                        if(ids[i] != 0)
                        {
+                               es2::TransformFeedback *transformFeedbackObject = context->getTransformFeedback(ids[i]);
+
+                               if(transformFeedbackObject && transformFeedbackObject->isActive())
+                               {
+                                       return error(GL_INVALID_OPERATION);
+                               }
+
                                context->deleteTransformFeedback(ids[i]);
                        }
                }