From bd61d07998a3ece20d5237131263e6b804cbf931 Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 25 Apr 2014 20:02:23 +0200 Subject: [PATCH] Made Renderer use OpenGL::DeleteVertexArray Former-commit-id: 16619f9be146e3201350299ff6d288655c7c2130 --- src/Nazara/Renderer/Renderer.cpp | 74 ++++++++++++++++++++++---------- 1 file changed, 52 insertions(+), 22 deletions(-) diff --git a/src/Nazara/Renderer/Renderer.cpp b/src/Nazara/Renderer/Renderer.cpp index cdfb3fe32..c0b83f2c5 100644 --- a/src/Nazara/Renderer/Renderer.cpp +++ b/src/Nazara/Renderer/Renderer.cpp @@ -67,7 +67,8 @@ namespace }; using VAO_Key = std::tuple; - using VAO_Map = std::map; + using VAO_Map = std::map; + using Context_Map = std::unordered_map; Context_Map s_vaos; @@ -113,14 +114,25 @@ namespace const NzIndexBuffer* indexBuffer = static_cast(resource); for (auto& pair : s_vaos) { - auto it = pair.second.begin(); - while (it != pair.second.end()) + const NzContext* context = pair.first; + VAO_Map& vaos = pair.second; + + auto it = vaos.begin(); + while (it != vaos.end()) { const VAO_Key& key = it->first; const NzIndexBuffer* vaoIndexBuffer = std::get<0>(key); if (vaoIndexBuffer == indexBuffer) - pair.second.erase(it++); + { + // Suppression du VAO: + // Comme celui-ci est local à son contexte de création, sa suppression n'est possible que si + // son contexte d'origine est actif, sinon il faudra le mettre en file d'attente + // Ceci est géré par la méthode OpenGL::DeleteVertexArray + + NzOpenGL::DeleteVertexArray(context, it->second); + vaos.erase(it++); + } else ++it; } @@ -133,14 +145,25 @@ namespace const NzVertexBuffer* vertexBuffer = static_cast(resource); for (auto& pair : s_vaos) { - auto it = pair.second.begin(); - while (it != pair.second.end()) + const NzContext* context = pair.first; + VAO_Map& vaos = pair.second; + + auto it = vaos.begin(); + while (it != vaos.end()) { const VAO_Key& key = it->first; const NzVertexBuffer* vaoVertexBuffer = std::get<1>(key); if (vaoVertexBuffer == vertexBuffer) - pair.second.erase(it++); + { + // Suppression du VAO: + // Comme celui-ci est local à son contexte de création, sa suppression n'est possible que si + // son contexte d'origine est actif, sinon il faudra le mettre en file d'attente + // Ceci est géré par la méthode OpenGL::DeleteVertexArray + + NzOpenGL::DeleteVertexArray(context, it->second); + vaos.erase(it++); + } else ++it; } @@ -153,15 +176,26 @@ namespace const NzVertexDeclaration* vertexDeclaration = static_cast(resource); for (auto& pair : s_vaos) { - auto it = pair.second.begin(); - while (it != pair.second.end()) + const NzContext* context = pair.first; + VAO_Map& vaos = pair.second; + + auto it = vaos.begin(); + while (it != vaos.end()) { const VAO_Key& key = it->first; const NzVertexDeclaration* vaoVertexDeclaration = std::get<2>(key); const NzVertexDeclaration* vaoInstancingDeclaration = std::get<3>(key); if (vaoVertexDeclaration == vertexDeclaration || vaoInstancingDeclaration == vertexDeclaration) - pair.second.erase(it++); + { + // Suppression du VAO: + // Comme celui-ci est local à son contexte de création, sa suppression n'est possible que si + // son contexte d'origine est actif, sinon il faudra le mettre en file d'attente + // Ceci est géré par la méthode OpenGL::DeleteVertexArray + + NzOpenGL::DeleteVertexArray(context, it->second); + vaos.erase(it++); + } else ++it; } @@ -738,7 +772,7 @@ bool NzRenderer::Initialize() s_textureUnits.resize(s_maxTextureUnit); s_useSamplerObjects = NzOpenGL::IsSupported(nzOpenGLExtension_SamplerObjects); s_useVertexArrayObjects = NzOpenGL::IsSupported(nzOpenGLExtension_VertexArrayObjects); - s_updateFlags = (Update_Matrices | Update_Shader | Update_VAO); + s_updateFlags = Update_Matrices | Update_Shader | Update_VAO; s_vertexBuffer = nullptr; s_fullscreenQuadBuffer.Reset(NzVertexDeclaration::Get(nzVertexLayout_XY), 4, nzBufferStorage_Hardware, nzBufferUsage_Static); @@ -1455,7 +1489,6 @@ void NzRenderer::Uninitialize() for (auto& pair : s_vaos) { const NzContext* context = pair.first; - context->SetActive(true); for (auto& pair2 : pair.second) { @@ -1474,11 +1507,8 @@ void NzRenderer::Uninitialize() if (instancingDeclaration) instancingDeclaration->RemoveResourceListener(&s_listener); - GLuint vao = static_cast(pair2.second); - glDeleteVertexArrays(1, &vao); + NzOpenGL::DeleteVertexArray(context, pair2.second); } - - context->SetActive(false); } s_vaos.clear(); @@ -1666,7 +1696,7 @@ bool NzRenderer::EnsureStateUpdate() glBindVertexArray(s_currentVAO); // On l'ajoute à notre liste - vaos->insert(std::make_pair(key, static_cast(s_currentVAO))); + vaos->insert(std::make_pair(key, s_currentVAO)); if (s_indexBuffer) s_indexBuffer->AddResourceListener(&s_listener, ResourceType_IndexBuffer); @@ -1742,11 +1772,11 @@ bool NzRenderer::EnsureStateUpdate() { glEnableVertexAttribArray(NzOpenGL::AttributeIndex[i]); glVertexAttribPointer(NzOpenGL::AttributeIndex[i], - NzVertexDeclaration::GetAttributeSize(type), - NzOpenGL::AttributeType[type], - (type == nzAttributeType_Color) ? GL_TRUE : GL_FALSE, - stride, - reinterpret_cast(bufferOffset + offset)); + NzVertexDeclaration::GetAttributeSize(type), + NzOpenGL::AttributeType[type], + (type == nzAttributeType_Color) ? GL_TRUE : GL_FALSE, + stride, + reinterpret_cast(bufferOffset + offset)); glVertexAttribDivisor(NzOpenGL::AttributeIndex[i], 1); } else