diff --git a/include/Nazara/Renderer/Context.hpp b/include/Nazara/Renderer/Context.hpp index 608bcec00..217680934 100644 --- a/include/Nazara/Renderer/Context.hpp +++ b/include/Nazara/Renderer/Context.hpp @@ -11,6 +11,8 @@ #include #include #include +#include +#include class NzContext; @@ -48,7 +50,8 @@ class NAZARA_API NzContext : public NzResource NzContextParameters m_parameters; NzContextImpl* m_impl = nullptr; - static NzContext* s_reference; + static std::unique_ptr s_reference; + static std::vector> s_contexts; }; #endif // NAZARA_CONTEXT_HPP diff --git a/src/Nazara/Renderer/Context.cpp b/src/Nazara/Renderer/Context.cpp index 0e49be56f..c8a6da370 100644 --- a/src/Nazara/Renderer/Context.cpp +++ b/src/Nazara/Renderer/Context.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #if defined(NAZARA_PLATFORM_WINDOWS) @@ -22,10 +23,8 @@ namespace { - thread_local const NzContext* currentContext = nullptr; - thread_local const NzContext* threadContext = nullptr; - - std::vector contexts; + thread_local const NzContext* s_currentContext = nullptr; + thread_local const NzContext* s_threadContext = nullptr; void CALLBACK DebugCallback(unsigned int source, unsigned int type, unsigned int id, unsigned int severity, int length, const char* message, const void* userParam) { @@ -141,15 +140,12 @@ bool NzContext::Create(const NzContextParameters& parameters) m_parameters = parameters; if (m_parameters.shared && !m_parameters.shareContext) - m_parameters.shareContext = s_reference; + m_parameters.shareContext = s_reference.get(); - m_impl = new NzContextImpl; - if (!m_impl->Create(m_parameters)) + std::unique_ptr impl(new NzContextImpl); + if (!impl->Create(m_parameters)) { NazaraError("Failed to create context implementation"); - delete m_impl; - m_impl = nullptr; - return false; } @@ -216,7 +212,7 @@ bool NzContext::IsActive() const } #endif - return currentContext == this; + return s_currentContext == this; } bool NzContext::SetActive(bool active) const @@ -230,7 +226,7 @@ bool NzContext::SetActive(bool active) const #endif // Si le contexte est déjà activé/désactivé - if ((currentContext == this) == active) + if ((s_currentContext == this) == active) return true; if (active) @@ -238,17 +234,17 @@ bool NzContext::SetActive(bool active) const if (!m_impl->Activate()) return false; - currentContext = this; + s_currentContext = this; } else { if (!NzContextImpl::Desactivate()) return false; - currentContext = nullptr; + s_currentContext = nullptr; } - NzOpenGL::OnContextChanged(currentContext); + NzOpenGL::OnContextChanged(s_currentContext); return true; } @@ -274,25 +270,23 @@ void NzContext::SwapBuffers() bool NzContext::EnsureContext() { - if (!currentContext) + if (!s_currentContext) { - if (!threadContext) + if (!s_threadContext) { - NzContext* context = new NzContext; + std::unique_ptr context(new NzContext); if (!context->Create()) { NazaraError("Failed to create context"); - delete context; - return false; } - contexts.push_back(context); + s_threadContext = context.get(); - threadContext = context; + s_contexts.emplace_back(std::move(context)); } - if (!threadContext->SetActive(true)) + if (!s_threadContext->SetActive(true)) { NazaraError("Failed to active thread context"); return false; @@ -304,19 +298,19 @@ bool NzContext::EnsureContext() const NzContext* NzContext::GetCurrent() { - return currentContext; + return s_currentContext; } const NzContext* NzContext::GetReference() { - return s_reference; + return s_reference.get(); } const NzContext* NzContext::GetThreadContext() { EnsureContext(); - return threadContext; + return s_threadContext; } bool NzContext::Initialize() @@ -324,32 +318,32 @@ bool NzContext::Initialize() NzContextParameters parameters; parameters.shared = false; // Difficile de partager le contexte de référence avec lui-même - s_reference = new NzContext; - if (!s_reference->Create(parameters)) + std::unique_ptr reference(new NzContext); + if (!reference->Create(parameters)) { - delete s_reference; - s_reference = nullptr; - + NazaraError("Failed to create reference context"); return false; } // Le contexte de référence doit rester désactivé pour le partage - s_reference->SetActive(false); + if (!reference->SetActive(false)) + { + NazaraError("Failed to desactive reference context"); + return false; + } - NzContextParameters::defaultShareContext = s_reference; + s_reference = std::move(reference); + // Le contexte de référence est partagé par défaut avec les autres contextes + NzContextParameters::defaultShareContext = s_reference.get(); return true; } void NzContext::Uninitialize() { - for (NzContext* context : contexts) - delete context; - - contexts.clear(); // On supprime tous les contextes créés - - delete s_reference; - s_reference = nullptr; + s_contexts.clear(); // On supprime tous les contextes créés + s_reference.reset(); } -NzContext* NzContext::s_reference = nullptr; +std::unique_ptr NzContext::s_reference; +std::vector> NzContext::s_contexts;