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;
...@@ -199,6 +197,21 @@ Context::~Context() ...@@ -199,6 +197,21 @@ Context::~Context()
deleteQuery(mQueryMap.begin()->first); deleteQuery(mQueryMap.begin()->first);
} }
while(!mVertexArrayMap.empty())
{
deleteVertexArray(mVertexArrayMap.begin()->first);
}
while(!mTransformFeedbackMap.empty())
{
deleteTransformFeedback(mTransformFeedbackMap.begin()->first);
}
while(!mSamplerMap.empty())
{
deleteSampler(mSamplerMap.begin()->first);
}
for(int type = 0; type < TEXTURE_TYPE_COUNT; type++) for(int type = 0; type < TEXTURE_TYPE_COUNT; type++)
{ {
for(int sampler = 0; sampler < MAX_COMBINED_TEXTURE_IMAGE_UNITS; sampler++) for(int sampler = 0; sampler < MAX_COMBINED_TEXTURE_IMAGE_UNITS; sampler++)
...@@ -221,6 +234,12 @@ Context::~Context() ...@@ -221,6 +234,12 @@ Context::~Context()
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;
mTextureCubeMapZero = NULL; mTextureCubeMapZero = 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)
...@@ -1404,19 +1417,25 @@ bool Context::getBooleanv(GLenum pname, GLboolean *params) ...@@ -1404,19 +1417,25 @@ bool Context::getBooleanv(GLenum pname, GLboolean *params)
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)
{ {
*params = mState.transformFeedback->isActive(); TransformFeedback* transformFeedback = getTransformFeedback(mState.transformFeedback);
if(transformFeedback)
{
*params = transformFeedback->isActive();
break; break;
} }
else return false; else return false;
}
case GL_TRANSFORM_FEEDBACK_PAUSED: case GL_TRANSFORM_FEEDBACK_PAUSED:
if(mState.transformFeedback)
{ {
*params = mState.transformFeedback->isPaused(); TransformFeedback* transformFeedback = getTransformFeedback(mState.transformFeedback);
if(transformFeedback)
{
*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();
{
*param = mState.transformFeedback->isActive();
break; 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;
{
*param = mState.transformFeedback->getGenericBuffer()->name;
break; 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();
{
*param = mState.transformFeedback->isPaused();
break; 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