Proper record deletion and record parenting

This commit is contained in:
baldurk
2014-11-12 00:48:56 +00:00
parent d46b1bfdd0
commit c273073935
7 changed files with 196 additions and 27 deletions
+18
View File
@@ -79,6 +79,17 @@ class GLResourceManager : public ResourceManager<GLResource, GLResourceRecord>
return id;
}
using ResourceManager::HasCurrentResource;
bool HasCurrentResource(GLResource res)
{
auto it = m_CurrentResourceIds.find(res);
if(it != m_CurrentResourceIds.end())
return true;
return false;
}
void UnregisterResource(GLResource res)
{
auto it = m_CurrentResourceIds.find(res);
@@ -106,6 +117,13 @@ class GLResourceManager : public ResourceManager<GLResource, GLResourceRecord>
return ret;
}
using ResourceManager::HasResourceRecord;
bool HasResourceRecord(GLResource res)
{
return ResourceManager::HasResourceRecord(GetID(res));
}
using ResourceManager::GetResourceRecord;
@@ -1946,18 +1946,34 @@ void WrappedOpenGL::glVertexBindingDivisor(GLuint bindingindex, GLuint divisor)
void WrappedOpenGL::glDeleteBuffers(GLsizei n, const GLuint *buffers)
{
m_Real.glDeleteBuffers(n, buffers);
for(GLsizei i=0; i < n; i++)
GetResourceManager()->UnregisterResource(BufferRes(GetCtx(), buffers[i]));
{
GLResource res = BufferRes(GetCtx(), buffers[i]);
if(GetResourceManager()->HasCurrentResource(res))
{
if(GetResourceManager()->HasResourceRecord(res))
GetResourceManager()->GetResourceRecord(res)->Delete(GetResourceManager());
GetResourceManager()->UnregisterResource(res);
}
}
m_Real.glDeleteBuffers(n, buffers);
}
void WrappedOpenGL::glDeleteVertexArrays(GLsizei n, const GLuint *arrays)
{
m_Real.glDeleteVertexArrays(n, arrays);
for(GLsizei i=0; i < n; i++)
GetResourceManager()->UnregisterResource(VertexArrayRes(GetCtx(), arrays[i]));
{
GLResource res = VertexArrayRes(GetCtx(), arrays[i]);
if(GetResourceManager()->HasCurrentResource(res))
{
if(GetResourceManager()->HasResourceRecord(res))
GetResourceManager()->GetResourceRecord(res)->Delete(GetResourceManager());
GetResourceManager()->UnregisterResource(res);
}
}
m_Real.glDeleteVertexArrays(n, arrays);
}
#pragma endregion
@@ -117,7 +117,11 @@ void WrappedOpenGL::glNamedFramebufferTextureEXT(GLuint framebuffer, GLenum atta
Serialise_glNamedFramebufferTextureEXT(framebuffer, attachment, texture, level);
if(m_State == WRITING_IDLE)
{
if(texture != 0 && GetResourceManager()->HasResourceRecord(TextureRes(GetCtx(), texture)))
record->AddParent(GetResourceManager()->GetResourceRecord(TextureRes(GetCtx(), texture)));
record->AddChunk(scope.Get());
}
else
m_ContextRecord->AddChunk(scope.Get());
}
@@ -145,9 +149,15 @@ void WrappedOpenGL::glFramebufferTexture(GLenum target, GLenum attachment, GLuin
attachment, texture, level);
if(m_State == WRITING_IDLE)
{
if(texture != 0 && GetResourceManager()->HasResourceRecord(TextureRes(GetCtx(), texture)))
record->AddParent(GetResourceManager()->GetResourceRecord(TextureRes(GetCtx(), texture)));
record->AddChunk(scope.Get());
}
else
{
m_ContextRecord->AddChunk(scope.Get());
}
}
}
@@ -193,9 +203,15 @@ void WrappedOpenGL::glNamedFramebufferTexture1DEXT(GLuint framebuffer, GLenum at
Serialise_glNamedFramebufferTexture1DEXT(framebuffer, attachment, textarget, texture, level);
if(m_State == WRITING_IDLE)
{
if(texture != 0 && GetResourceManager()->HasResourceRecord(TextureRes(GetCtx(), texture)))
record->AddParent(GetResourceManager()->GetResourceRecord(TextureRes(GetCtx(), texture)));
record->AddChunk(scope.Get());
}
else
{
m_ContextRecord->AddChunk(scope.Get());
}
}
}
@@ -221,9 +237,15 @@ void WrappedOpenGL::glFramebufferTexture1D(GLenum target, GLenum attachment, GLe
attachment, textarget, texture, level);
if(m_State == WRITING_IDLE)
{
if(texture != 0 && GetResourceManager()->HasResourceRecord(TextureRes(GetCtx(), texture)))
record->AddParent(GetResourceManager()->GetResourceRecord(TextureRes(GetCtx(), texture)));
record->AddChunk(scope.Get());
}
else
{
m_ContextRecord->AddChunk(scope.Get());
}
}
}
@@ -269,9 +291,15 @@ void WrappedOpenGL::glNamedFramebufferTexture2DEXT(GLuint framebuffer, GLenum at
Serialise_glNamedFramebufferTexture2DEXT(framebuffer, attachment, textarget, texture, level);
if(m_State == WRITING_IDLE)
{
if(texture != 0 && GetResourceManager()->HasResourceRecord(TextureRes(GetCtx(), texture)))
record->AddParent(GetResourceManager()->GetResourceRecord(TextureRes(GetCtx(), texture)));
record->AddChunk(scope.Get());
}
else
{
m_ContextRecord->AddChunk(scope.Get());
}
}
}
@@ -297,9 +325,15 @@ void WrappedOpenGL::glFramebufferTexture2D(GLenum target, GLenum attachment, GLe
attachment, textarget, texture, level);
if(m_State == WRITING_IDLE)
{
if(texture != 0 && GetResourceManager()->HasResourceRecord(TextureRes(GetCtx(), texture)))
record->AddParent(GetResourceManager()->GetResourceRecord(TextureRes(GetCtx(), texture)));
record->AddChunk(scope.Get());
}
else
{
m_ContextRecord->AddChunk(scope.Get());
}
}
}
@@ -346,9 +380,15 @@ void WrappedOpenGL::glNamedFramebufferTexture3DEXT(GLuint framebuffer, GLenum at
Serialise_glNamedFramebufferTexture3DEXT(framebuffer, attachment, textarget, texture, level, zoffset);
if(m_State == WRITING_IDLE)
{
if(texture != 0 && GetResourceManager()->HasResourceRecord(TextureRes(GetCtx(), texture)))
record->AddParent(GetResourceManager()->GetResourceRecord(TextureRes(GetCtx(), texture)));
record->AddChunk(scope.Get());
}
else
{
m_ContextRecord->AddChunk(scope.Get());
}
}
}
@@ -374,9 +414,15 @@ void WrappedOpenGL::glFramebufferTexture3D(GLenum target, GLenum attachment, GLe
attachment, textarget, texture, level, zoffset);
if(m_State == WRITING_IDLE)
{
if(texture != 0 && GetResourceManager()->HasResourceRecord(TextureRes(GetCtx(), texture)))
record->AddParent(GetResourceManager()->GetResourceRecord(TextureRes(GetCtx(), texture)));
record->AddChunk(scope.Get());
}
else
{
m_ContextRecord->AddChunk(scope.Get());
}
}
}
bool WrappedOpenGL::Serialise_glNamedFramebufferRenderbufferEXT(GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
@@ -421,9 +467,15 @@ void WrappedOpenGL::glNamedFramebufferRenderbufferEXT(GLuint framebuffer, GLenum
Serialise_glNamedFramebufferRenderbufferEXT(framebuffer, attachment, renderbuffertarget, renderbuffer);
if(m_State == WRITING_IDLE)
{
if(renderbuffer != 0 && GetResourceManager()->HasResourceRecord(RenderbufferRes(GetCtx(), renderbuffer)))
record->AddParent(GetResourceManager()->GetResourceRecord(RenderbufferRes(GetCtx(), renderbuffer)));
record->AddChunk(scope.Get());
}
else
{
m_ContextRecord->AddChunk(scope.Get());
}
}
}
@@ -449,9 +501,15 @@ void WrappedOpenGL::glFramebufferRenderbuffer(GLenum target, GLenum attachment,
attachment, renderbuffertarget, renderbuffer);
if(m_State == WRITING_IDLE)
{
if(renderbuffer != 0 && GetResourceManager()->HasResourceRecord(RenderbufferRes(GetCtx(), renderbuffer)))
record->AddParent(GetResourceManager()->GetResourceRecord(RenderbufferRes(GetCtx(), renderbuffer)));
record->AddChunk(scope.Get());
}
else
{
m_ContextRecord->AddChunk(scope.Get());
}
}
}
@@ -497,9 +555,15 @@ void WrappedOpenGL::glNamedFramebufferTextureLayerEXT(GLuint framebuffer, GLenum
Serialise_glNamedFramebufferTextureLayerEXT(framebuffer, attachment, texture, level, layer);
if(m_State == WRITING_IDLE)
{
if(texture != 0 && GetResourceManager()->HasResourceRecord(TextureRes(GetCtx(), texture)))
record->AddParent(GetResourceManager()->GetResourceRecord(TextureRes(GetCtx(), texture)));
record->AddChunk(scope.Get());
}
else
{
m_ContextRecord->AddChunk(scope.Get());
}
}
}
@@ -525,9 +589,15 @@ void WrappedOpenGL::glFramebufferTextureLayer(GLenum target, GLenum attachment,
attachment, texture, level, layer);
if(m_State == WRITING_IDLE)
{
if(texture != 0 && GetResourceManager()->HasResourceRecord(TextureRes(GetCtx(), texture)))
record->AddParent(GetResourceManager()->GetResourceRecord(TextureRes(GetCtx(), texture)));
record->AddChunk(scope.Get());
}
else
{
m_ContextRecord->AddChunk(scope.Get());
}
}
}
@@ -754,10 +824,18 @@ void WrappedOpenGL::glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLi
void WrappedOpenGL::glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
{
m_Real.glDeleteFramebuffers(n, framebuffers);
for(GLsizei i=0; i < n; i++)
GetResourceManager()->UnregisterResource(FramebufferRes(GetCtx(), framebuffers[i]));
{
GLResource res = FramebufferRes(GetCtx(), framebuffers[i]);
if(GetResourceManager()->HasCurrentResource(res))
{
if(GetResourceManager()->HasResourceRecord(res))
GetResourceManager()->GetResourceRecord(res)->Delete(GetResourceManager());
GetResourceManager()->UnregisterResource(res);
}
}
m_Real.glDeleteFramebuffers(n, framebuffers);
}
bool WrappedOpenGL::Serialise_glGenRenderbuffers(GLsizei n, GLuint* renderbuffers)
@@ -823,10 +901,18 @@ void WrappedOpenGL::glBindRenderbuffer(GLenum target, GLuint renderbuffer)
void WrappedOpenGL::glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)
{
m_Real.glDeleteRenderbuffers(n, renderbuffers);
for(GLsizei i=0; i < n; i++)
GetResourceManager()->UnregisterResource(RenderbufferRes(GetCtx(), renderbuffers[i]));
{
GLResource res = RenderbufferRes(GetCtx(), renderbuffers[i]);
if(GetResourceManager()->HasCurrentResource(res))
{
if(GetResourceManager()->HasResourceRecord(res))
GetResourceManager()->GetResourceRecord(res)->Delete(GetResourceManager());
GetResourceManager()->UnregisterResource(res);
}
}
m_Real.glDeleteRenderbuffers(n, renderbuffers);
}
bool WrappedOpenGL::Serialise_glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
@@ -149,7 +149,8 @@ void WrappedOpenGL::glDeleteSync(GLsync sync)
ResourceId id = GetResourceManager()->GetSyncID(sync);
GetResourceManager()->UnregisterResource(GetResourceManager()->GetCurrentResource(id));
if(GetResourceManager()->HasCurrentResource(id))
GetResourceManager()->UnregisterResource(GetResourceManager()->GetCurrentResource(id));
}
bool WrappedOpenGL::Serialise_glGenQueries(GLsizei n, GLuint* ids)
@@ -281,8 +282,16 @@ void WrappedOpenGL::glQueryCounter(GLuint query, GLenum target)
void WrappedOpenGL::glDeleteQueries(GLsizei n, const GLuint *ids)
{
m_Real.glDeleteQueries(n, ids);
for(GLsizei i=0; i < n; i++)
GetResourceManager()->UnregisterResource(QueryRes(GetCtx(), ids[i]));
{
GLResource res = QueryRes(GetCtx(), ids[i]);
if(GetResourceManager()->HasCurrentResource(res))
{
if(GetResourceManager()->HasResourceRecord(res))
GetResourceManager()->GetResourceRecord(res)->Delete(GetResourceManager());
GetResourceManager()->UnregisterResource(res);
}
}
m_Real.glDeleteQueries(n, ids);
}
@@ -354,8 +354,16 @@ void WrappedOpenGL::glSamplerParameterIuiv(GLuint sampler, GLenum pname, const G
void WrappedOpenGL::glDeleteSamplers(GLsizei n, const GLuint *ids)
{
m_Real.glDeleteSamplers(n, ids);
for(GLsizei i=0; i < n; i++)
GetResourceManager()->UnregisterResource(SamplerRes(GetCtx(), ids[i]));
{
GLResource res = SamplerRes(GetCtx(), ids[i]);
if(GetResourceManager()->HasCurrentResource(res))
{
if(GetResourceManager()->HasResourceRecord(res))
GetResourceManager()->GetResourceRecord(res)->Delete(GetResourceManager());
GetResourceManager()->UnregisterResource(res);
}
}
m_Real.glDeleteSamplers(n, ids);
}
@@ -201,7 +201,13 @@ void WrappedOpenGL::glDeleteShader(GLuint shader)
{
m_Real.glDeleteShader(shader);
GetResourceManager()->UnregisterResource(ShaderRes(GetCtx(), shader));
GLResource res = ShaderRes(GetCtx(), shader);
if(GetResourceManager()->HasCurrentResource(res))
{
if(GetResourceManager()->HasResourceRecord(res))
GetResourceManager()->GetResourceRecord(res)->Delete(GetResourceManager());
GetResourceManager()->UnregisterResource(res);
}
}
bool WrappedOpenGL::Serialise_glAttachShader(GLuint program, GLuint shader)
@@ -638,7 +644,13 @@ void WrappedOpenGL::glDeleteProgram(GLuint program)
{
m_Real.glDeleteProgram(program);
GetResourceManager()->UnregisterResource(ProgramRes(GetCtx(), program));
GLResource res = ProgramRes(GetCtx(), program);
if(GetResourceManager()->HasCurrentResource(res))
{
if(GetResourceManager()->HasResourceRecord(res))
GetResourceManager()->GetResourceRecord(res)->Delete(GetResourceManager());
GetResourceManager()->UnregisterResource(res);
}
}
bool WrappedOpenGL::Serialise_glUseProgram(GLuint program)
@@ -825,10 +837,18 @@ void WrappedOpenGL::glBindProgramPipeline(GLuint pipeline)
void WrappedOpenGL::glDeleteProgramPipelines(GLsizei n, const GLuint *pipelines)
{
m_Real.glDeleteProgramPipelines(n, pipelines);
for(GLsizei i=0; i < n; i++)
GetResourceManager()->UnregisterResource(ProgramPipeRes(GetCtx(), pipelines[i]));
{
GLResource res = ProgramPipeRes(GetCtx(), pipelines[i]);
if(GetResourceManager()->HasCurrentResource(res))
{
if(GetResourceManager()->HasResourceRecord(res))
GetResourceManager()->GetResourceRecord(res)->Delete(GetResourceManager());
GetResourceManager()->UnregisterResource(res);
}
}
m_Real.glDeleteProgramPipelines(n, pipelines);
}
#pragma endregion
@@ -83,10 +83,18 @@ void WrappedOpenGL::glGenTextures(GLsizei n, GLuint* textures)
void WrappedOpenGL::glDeleteTextures(GLsizei n, const GLuint *textures)
{
m_Real.glDeleteTextures(n, textures);
for(GLsizei i=0; i < n; i++)
GetResourceManager()->UnregisterResource(TextureRes(GetCtx(), textures[i]));
{
GLResource res = TextureRes(GetCtx(), textures[i]);
if(GetResourceManager()->HasCurrentResource(res))
{
if(GetResourceManager()->HasResourceRecord(res))
GetResourceManager()->GetResourceRecord(res)->Delete(GetResourceManager());
GetResourceManager()->UnregisterResource(res);
}
}
m_Real.glDeleteTextures(n, textures);
}
bool WrappedOpenGL::Serialise_glBindTexture(GLenum target, GLuint texture)
@@ -2754,6 +2762,7 @@ void WrappedOpenGL::glTextureBufferRangeEXT(GLuint texture, GLenum target, GLenu
Serialise_glTextureBufferRangeEXT(texture, target, internalformat, buffer, offset, size);
record->AddChunk(scope.Get());
record->AddParent(GetResourceManager()->GetResourceRecord(BufferRes(GetCtx(), buffer)));
}
}
@@ -2771,6 +2780,7 @@ void WrappedOpenGL::glTexBufferRange(GLenum target, GLenum internalformat, GLuin
target, internalformat, buffer, offset, size);
record->AddChunk(scope.Get());
record->AddParent(GetResourceManager()->GetResourceRecord(BufferRes(GetCtx(), buffer)));
}
}
@@ -2811,6 +2821,7 @@ void WrappedOpenGL::glTextureBufferEXT(GLuint texture, GLenum target, GLenum int
Serialise_glTextureBufferEXT(texture, target, internalformat, buffer);
record->AddChunk(scope.Get());
record->AddParent(GetResourceManager()->GetResourceRecord(BufferRes(GetCtx(), buffer)));
}
}
@@ -2828,6 +2839,7 @@ void WrappedOpenGL::glTexBuffer(GLenum target, GLenum internalformat, GLuint buf
target, internalformat, buffer);
record->AddChunk(scope.Get());
record->AddParent(GetResourceManager()->GetResourceRecord(BufferRes(GetCtx(), buffer)));
}
}