OSDN Git Service

Fixed object destruction in context
authorAlexis Hetu <sugoi@google.com>
Thu, 9 Apr 2015 14:58:55 +0000 (10:58 -0400)
committerAlexis Hétu <sugoi@google.com>
Thu, 9 Apr 2015 20:45:47 +0000 (20:45 +0000)
Added proper destruction of new objects recently added to
the context (VerterArray, Sampler and TransformFeedback).

Change-Id: I45a741476d84b74469d5463653eb6a3bb04d501d
Reviewed-on: https://swiftshader-review.googlesource.com/2813
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
src/OpenGL/libGLESv2/Context.cpp
src/OpenGL/libGLESv2/Context.h

index a82b12f..1e9f84a 100644 (file)
@@ -141,9 +141,6 @@ Context::Context(const egl::Config *config, const Context *shareContext, EGLint
     mTextureCubeMapZero = new TextureCubeMap(0);\r
     mTextureExternalZero = new TextureExternal(0);\r
 \r
-       mState.transformFeedback = new TransformFeedback(0);\r
-       mTransformFeedbackMap[0] = mState.transformFeedback;\r
-\r
     mState.activeSampler = 0;\r
     bindArrayBuffer(0);\r
     bindElementArrayBuffer(0);\r
@@ -152,6 +149,7 @@ Context::Context(const egl::Config *config, const Context *shareContext, EGLint
     bindReadFramebuffer(0);\r
     bindDrawFramebuffer(0);\r
     bindRenderbuffer(0);\r
+    bindTransformFeedback(0);\r
 \r
     mState.currentProgram = 0;\r
 \r
@@ -174,52 +172,73 @@ Context::Context(const egl::Config *config, const Context *shareContext, EGLint
 \r
 Context::~Context()\r
 {\r
-    if(mState.currentProgram != 0)\r
-    {\r
-        Program *programObject = mResourceManager->getProgram(mState.currentProgram);\r
-        if(programObject)\r
-        {\r
-            programObject->release();\r
-        }\r
-        mState.currentProgram = 0;\r
-    }\r
+       if(mState.currentProgram != 0)\r
+       {\r
+               Program *programObject = mResourceManager->getProgram(mState.currentProgram);\r
+               if(programObject)\r
+               {\r
+                       programObject->release();\r
+               }\r
+               mState.currentProgram = 0;\r
+       }\r
 \r
-    while(!mFramebufferMap.empty())\r
-    {\r
-        deleteFramebuffer(mFramebufferMap.begin()->first);\r
-    }\r
+       while(!mFramebufferMap.empty())\r
+       {\r
+               deleteFramebuffer(mFramebufferMap.begin()->first);\r
+       }\r
 \r
-    while(!mFenceMap.empty())\r
-    {\r
-        deleteFence(mFenceMap.begin()->first);\r
-    }\r
+       while(!mFenceMap.empty())\r
+       {\r
+               deleteFence(mFenceMap.begin()->first);\r
+       }\r
 \r
        while(!mQueryMap.empty())\r
-    {\r
-        deleteQuery(mQueryMap.begin()->first);\r
-    }\r
+       {\r
+               deleteQuery(mQueryMap.begin()->first);\r
+       }\r
 \r
-    for(int type = 0; type < TEXTURE_TYPE_COUNT; type++)\r
-    {\r
-        for(int sampler = 0; sampler < MAX_COMBINED_TEXTURE_IMAGE_UNITS; sampler++)\r
-        {\r
-            mState.samplerTexture[type][sampler] = NULL;\r
-        }\r
-    }\r
+       while(!mVertexArrayMap.empty())\r
+       {\r
+               deleteVertexArray(mVertexArrayMap.begin()->first);\r
+       }\r
 \r
-    for(int i = 0; i < MAX_VERTEX_ATTRIBS; i++)\r
-    {\r
-        mState.vertexAttribute[i].mBoundBuffer = NULL;\r
-    }\r
+       while(!mTransformFeedbackMap.empty())\r
+       {\r
+               deleteTransformFeedback(mTransformFeedbackMap.begin()->first);\r
+       }\r
+\r
+       while(!mSamplerMap.empty())\r
+       {\r
+               deleteSampler(mSamplerMap.begin()->first);\r
+       }\r
+\r
+       for(int type = 0; type < TEXTURE_TYPE_COUNT; type++)\r
+       {\r
+               for(int sampler = 0; sampler < MAX_COMBINED_TEXTURE_IMAGE_UNITS; sampler++)\r
+               {\r
+                       mState.samplerTexture[type][sampler] = NULL;\r
+               }\r
+       }\r
+\r
+       for(int i = 0; i < MAX_VERTEX_ATTRIBS; i++)\r
+       {\r
+               mState.vertexAttribute[i].mBoundBuffer = NULL;\r
+       }\r
 \r
        for(int i = 0; i < QUERY_TYPE_COUNT; i++)\r
-    {\r
-        mState.activeQuery[i] = NULL;\r
-    }\r
+       {\r
+               mState.activeQuery[i] = NULL;\r
+       }\r
 \r
-    mState.arrayBuffer = NULL;\r
-    mState.elementArrayBuffer = NULL;\r
-    mState.renderbuffer = NULL;\r
+       mState.arrayBuffer = NULL;\r
+       mState.elementArrayBuffer = NULL;\r
+       mState.renderbuffer = NULL;\r
+\r
+       mState.vertexArray = NULL;\r
+       for(int i = 0; i < MAX_COMBINED_TEXTURE_IMAGE_UNITS; ++i)\r
+       {\r
+               mState.sampler[i] = NULL;\r
+       }\r
 \r
     mTexture2DZero = NULL;\r
        mTexture3DZero = NULL;\r
@@ -969,12 +988,7 @@ void Context::deleteTransformFeedback(GLuint transformFeedback)
        if(transformFeedbackObject != mTransformFeedbackMap.end())\r
        {\r
                mTransformFeedbackNameSpace.release(transformFeedbackObject->first);\r
-\r
-               if(transformFeedbackObject->second)\r
-               {\r
-                       transformFeedbackObject->second->release();\r
-               }\r
-\r
+               delete transformFeedbackObject->second;\r
                mTransformFeedbackMap.erase(transformFeedbackObject);\r
        }\r
 }\r
@@ -1112,15 +1126,14 @@ bool Context::bindVertexArray(GLuint array)
 \r
 bool Context::bindTransformFeedback(GLuint id)\r
 {\r
-       TransformFeedback* transformFeedback = getTransformFeedback(id);\r
-\r
-       if(transformFeedback)\r
+       if(!getTransformFeedback(id))\r
        {\r
-               mState.transformFeedback = transformFeedback;\r
-               return true;\r
+               mTransformFeedbackMap[id] = new TransformFeedback(id);\r
        }\r
 \r
-       return false;\r
+       mState.transformFeedback = id;\r
+\r
+       return true;\r
 }\r
 \r
 bool Context::bindSampler(GLuint unit, GLuint sampler)\r
@@ -1403,20 +1416,26 @@ bool Context::getBooleanv(GLenum pname, GLboolean *params)
       case GL_DITHER:                   *params = mState.dither;                    break;\r
       case GL_PRIMITIVE_RESTART_FIXED_INDEX: *params = mState.primitiveRestartFixedIndex; break;\r
       case GL_RASTERIZER_DISCARD:       *params = mState.rasterizerDiscard;         break;\r
-      case GL_TRANSFORM_FEEDBACK_ACTIVE:\r
-                 if(mState.transformFeedback)\r
+         case GL_TRANSFORM_FEEDBACK_ACTIVE:\r
+         {\r
+                 TransformFeedback* transformFeedback = getTransformFeedback(mState.transformFeedback);\r
+                 if(transformFeedback)\r
                  {\r
-                         *params = mState.transformFeedback->isActive();\r
+                         *params = transformFeedback->isActive();\r
                          break;\r
                  }\r
                  else return false;\r
+         }\r
       case GL_TRANSFORM_FEEDBACK_PAUSED:\r
-                 if(mState.transformFeedback)\r
+         {\r
+                 TransformFeedback* transformFeedback = getTransformFeedback(mState.transformFeedback);\r
+                 if(transformFeedback)\r
                  {\r
-                         *params = mState.transformFeedback->isPaused();\r
+                         *params = transformFeedback->isPaused();\r
                          break;\r
                  }\r
                  else return false;\r
+         }\r
       default:\r
         return false;\r
     }\r
@@ -1933,36 +1952,30 @@ bool Context::getTransformFeedbackiv(GLuint xfb, GLenum pname, GLint *param)
 {\r
        UNIMPLEMENTED();\r
 \r
+       TransformFeedback* transformFeedback = getTransformFeedback(mState.transformFeedback);\r
+       if(!transformFeedback)\r
+       {\r
+               return false;\r
+       }\r
+\r
        switch(pname)\r
        {\r
        case GL_TRANSFORM_FEEDBACK_BINDING: // GLint, initially 0\r
                *param = 0;\r
                break;\r
        case GL_TRANSFORM_FEEDBACK_ACTIVE: // boolean, initially GL_FALSE\r
-               if(mState.transformFeedback)\r
-               {\r
-                       *param = mState.transformFeedback->isActive();\r
-                       break;\r
-               }\r
-               else return false;\r
+               *param = transformFeedback->isActive();\r
+               break;\r
        case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING: // name, initially 0\r
-               if(mState.transformFeedback && mState.transformFeedback->getGenericBuffer())\r
-               {\r
-                       *param = mState.transformFeedback->getGenericBuffer()->name;\r
-                       break;\r
-               }\r
-               else return false;\r
+               *param = transformFeedback->name;\r
+               break;\r
        case GL_TRANSFORM_FEEDBACK_PAUSED: // boolean, initially GL_FALSE\r
-               if(mState.transformFeedback)\r
-               {\r
-                       *param = mState.transformFeedback->isPaused();\r
-                       break;\r
-               }\r
-               else return false;\r
+               *param = transformFeedback->isPaused();\r
+               break;\r
        case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE: // indexed[n] 64-bit integer, initially 0\r
-               if(mState.transformFeedback && mState.transformFeedback->getGenericBuffer())\r
+               if(transformFeedback->getGenericBuffer())\r
                {\r
-                       *param = mState.transformFeedback->getGenericBuffer()->size();\r
+                       *param = transformFeedback->getGenericBuffer()->size();\r
                        break;\r
                }\r
                else return false;\r
index 833315a..1ec194b 100644 (file)
@@ -258,7 +258,7 @@ struct State
     gl::BindingPointer<Renderbuffer> renderbuffer;\r
     GLuint currentProgram;\r
     gl::BindingPointer<VertexArray> vertexArray;\r
-       gl::BindingPointer<TransformFeedback> transformFeedback;\r
+       GLuint transformFeedback;\r
        gl::BindingPointer<Sampler> sampler[MAX_COMBINED_TEXTURE_IMAGE_UNITS];\r
 \r
     VertexAttribute vertexAttribute[MAX_VERTEX_ATTRIBS];\r