Added OpenGL::Delete[FrameBuffer|VertexArray]

Also renamed OpenGL::OnContextChange to OnContextChanged (since it
happens after the context change)
Also improved RenderTexture implementation


Former-commit-id: d845b1405294dd3aa134d392585069bbb28a77a3
This commit is contained in:
Lynix
2014-04-25 12:38:53 +02:00
parent a3f877daf1
commit 7ac3fee3a5
4 changed files with 70 additions and 27 deletions

View File

@@ -63,8 +63,15 @@ namespace
#endif
}
enum GarbageResourceType
{
GarbageResourceType_FrameBuffer,
GarbageResourceType_VertexArray
};
struct ContextStates
{
std::vector<std::pair<GarbageResourceType, GLuint>> garbage; // Les ressources à supprimer dès que possible
GLuint buffersBinding[nzBufferType_Max+1] = {0};
GLuint currentProgram = 0;
GLuint samplers[32] = {0}; // 32 est pour l'instant la plus haute limite (GL_TEXTURE31)
@@ -496,6 +503,15 @@ void NzOpenGL::DeleteBuffer(nzBufferType type, GLuint id)
s_contextStates->buffersBinding[type] = 0;
}
void NzOpenGL::DeleteFrameBuffer(const NzContext* context, GLuint id)
{
// Si le contexte est actif, ne nous privons pas
if (NzContext::GetCurrent() == context)
glDeleteFramebuffers(1, &id);
else
s_contexts[context].garbage.emplace_back(GarbageResourceType_FrameBuffer, id);
}
void NzOpenGL::DeleteProgram(GLuint id)
{
#ifdef NAZARA_DEBUG
@@ -555,6 +571,15 @@ void NzOpenGL::DeleteTexture(GLuint id)
}
}
void NzOpenGL::DeleteVertexArray(const NzContext* context, GLuint id)
{
// Si le contexte est actif, ne nous privons pas
if (NzContext::GetCurrent() == context)
glDeleteFramebuffers(1, &id);
else
s_contexts[context].garbage.emplace_back(GarbageResourceType_VertexArray, id);
}
GLuint NzOpenGL::GetCurrentBuffer(nzBufferType type)
{
#ifdef NAZARA_DEBUG
@@ -1778,9 +1803,27 @@ void NzOpenGL::Uninitialize()
}
}
void NzOpenGL::OnContextChange(const NzContext* newContext)
void NzOpenGL::OnContextChanged(const NzContext* newContext)
{
s_contextStates = (newContext) ? &s_contexts[newContext] : nullptr;
if (s_contextStates)
{
// On supprime les éventuelles ressources mortes-vivantes (Qui ne peuvent être libérées que dans notre contexte)
for (std::pair<GarbageResourceType, GLuint>& pair : s_contextStates->garbage)
{
switch (pair.first)
{
case GarbageResourceType_FrameBuffer:
glDeleteFramebuffers(1, &pair.second);
break;
case GarbageResourceType_VertexArray:
glDeleteVertexArrays(1, &pair.second);
break;
}
}
s_contextStates->garbage.clear();
}
}
void NzOpenGL::OnContextDestruction(const NzContext* context)