Commit 8ea8784d by Alexis Hetu Committed by Alexis Hétu

Fixed object destruction in context

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