diff --git a/include/Nazara/OpenGLRenderer/Wrapper/EGL/EGLContextBase.hpp b/include/Nazara/OpenGLRenderer/Wrapper/EGL/EGLContextBase.hpp index 308ad3f27..569df90bd 100644 --- a/include/Nazara/OpenGLRenderer/Wrapper/EGL/EGLContextBase.hpp +++ b/include/Nazara/OpenGLRenderer/Wrapper/EGL/EGLContextBase.hpp @@ -71,6 +71,7 @@ namespace Nz::GL std::unordered_set m_supportedPlatformExtensions; EGLContext m_handle; + bool m_ownsDisplay; }; } diff --git a/include/Nazara/OpenGLRenderer/Wrapper/EGL/EGLContextBase.inl b/include/Nazara/OpenGLRenderer/Wrapper/EGL/EGLContextBase.inl index 2910f3ff9..9e1230a4a 100644 --- a/include/Nazara/OpenGLRenderer/Wrapper/EGL/EGLContextBase.inl +++ b/include/Nazara/OpenGLRenderer/Wrapper/EGL/EGLContextBase.inl @@ -12,7 +12,8 @@ namespace Nz::GL m_loader(loader), m_display(EGL_NO_DISPLAY), m_surface(EGL_NO_SURFACE), - m_handle(EGL_NO_CONTEXT) + m_handle(EGL_NO_CONTEXT), + m_ownsDisplay(false) { } diff --git a/include/Nazara/OpenGLRenderer/Wrapper/EGL/EGLLoader.hpp b/include/Nazara/OpenGLRenderer/Wrapper/EGL/EGLLoader.hpp index b33ab32be..ceba20bf8 100644 --- a/include/Nazara/OpenGLRenderer/Wrapper/EGL/EGLLoader.hpp +++ b/include/Nazara/OpenGLRenderer/Wrapper/EGL/EGLLoader.hpp @@ -20,11 +20,13 @@ namespace Nz::GL { public: EGLLoader(); - ~EGLLoader() = default; + ~EGLLoader(); std::unique_ptr CreateContext(const OpenGLDevice* device, const ContextParams& params, Context* shareContext) const override; std::unique_ptr CreateContext(const OpenGLDevice* device, const ContextParams& params, WindowHandle handle, Context* shareContext) const override; + inline EGLDisplay GetDefaultDisplay() const; + GLFunction LoadFunction(const char* name) const override; #define NAZARA_OPENGLRENDERER_FUNC(name, sig) sig name = nullptr; @@ -40,6 +42,7 @@ namespace Nz::GL static const char* TranslateError(EGLint errorId); private: + EGLDisplay m_defaultDisplay; DynLib m_eglLib; }; } diff --git a/include/Nazara/OpenGLRenderer/Wrapper/EGL/EGLLoader.inl b/include/Nazara/OpenGLRenderer/Wrapper/EGL/EGLLoader.inl index bcad238e8..04e189dec 100644 --- a/include/Nazara/OpenGLRenderer/Wrapper/EGL/EGLLoader.inl +++ b/include/Nazara/OpenGLRenderer/Wrapper/EGL/EGLLoader.inl @@ -5,8 +5,12 @@ #include #include -namespace Nz::Vk +namespace Nz::GL { + inline EGLDisplay EGLLoader::GetDefaultDisplay() const + { + return m_defaultDisplay; + } } #include diff --git a/src/Nazara/OpenGLRenderer/Wrapper/EGL/EGLContextBase.cpp b/src/Nazara/OpenGLRenderer/Wrapper/EGL/EGLContextBase.cpp index dcc1f8a51..a7d1b5914 100644 --- a/src/Nazara/OpenGLRenderer/Wrapper/EGL/EGLContextBase.cpp +++ b/src/Nazara/OpenGLRenderer/Wrapper/EGL/EGLContextBase.cpp @@ -27,15 +27,7 @@ namespace Nz::GL if (!BindAPI()) return false; - m_display = m_loader.eglGetDisplay(EGL_DEFAULT_DISPLAY); - if (!m_display) - { - NazaraError("failed to retrieve default EGL display"); - return false; - } - - if (!InitDisplay()) - return false; + m_display = m_loader.GetDefaultDisplay(); std::size_t configCount; std::array configs; @@ -67,26 +59,32 @@ namespace Nz::GL void EGLContextBase::Destroy() { - if (m_handle) + if (m_handle != EGL_NO_CONTEXT) { - assert(m_display); + assert(m_display != EGL_NO_DISPLAY); OnContextRelease(); NotifyContextDestruction(this); m_loader.eglDestroyContext(m_display, m_handle); - m_handle = nullptr; + m_handle = EGL_NO_CONTEXT; } - if (m_surface) + if (m_surface != EGL_NO_SURFACE) { - assert(m_display); + assert(m_display != EGL_NO_DISPLAY); m_loader.eglDestroySurface(m_display, m_surface); - m_surface = nullptr; + m_surface = EGL_NO_SURFACE; } if (m_display) - m_loader.eglTerminate(m_display); + { + if (m_ownsDisplay) + m_loader.eglTerminate(m_display); + + m_display = EGL_NO_DISPLAY; + m_ownsDisplay = false; + } } void EGLContextBase::EnableVerticalSync(bool enabled) @@ -97,7 +95,6 @@ namespace Nz::GL void EGLContextBase::SwapBuffers() { m_loader.eglSwapBuffers(m_display, m_surface); - // TODO } bool EGLContextBase::BindAPI() @@ -133,7 +130,7 @@ namespace Nz::GL EGLint configAttributes[] = { EGL_BUFFER_SIZE, EGLint(m_params.bitsPerPixel), - EGL_DEPTH_SIZE, m_params.depthBits, + EGL_DEPTH_SIZE, EGLint(m_params.depthBits), EGL_RENDERABLE_TYPE, (m_params.type == ContextType::OpenGL_ES) ? EGL_OPENGL_ES3_BIT : EGL_OPENGL_BIT, EGL_SAMPLE_BUFFERS, EGLint((m_params.sampleCount > 1) ? 1 : 0), EGL_SAMPLES, EGLint((m_params.sampleCount > 1) ? m_params.sampleCount : 0), @@ -264,6 +261,8 @@ namespace Nz::GL return false; } + m_ownsDisplay = true; + const char* vendor = m_loader.eglQueryString(m_display, EGL_VENDOR); NazaraNotice("Initialized EGL " + std::to_string(major) + "." + std::to_string(minor) + " display (" + vendor + ")"); diff --git a/src/Nazara/OpenGLRenderer/Wrapper/EGL/EGLLoader.cpp b/src/Nazara/OpenGLRenderer/Wrapper/EGL/EGLLoader.cpp index 07094bd4f..c9fb3ea75 100644 --- a/src/Nazara/OpenGLRenderer/Wrapper/EGL/EGLLoader.cpp +++ b/src/Nazara/OpenGLRenderer/Wrapper/EGL/EGLLoader.cpp @@ -4,6 +4,7 @@ #include #include +#include #include #ifdef NAZARA_PLATFORM_LINUX @@ -19,7 +20,8 @@ namespace Nz::GL { - EGLLoader::EGLLoader() + EGLLoader::EGLLoader() : + m_defaultDisplay(nullptr) { if (!m_eglLib.Load("libEGL")) throw std::runtime_error("failed to load gdi32.dll: " + m_eglLib.GetLastError()); @@ -45,14 +47,33 @@ namespace Nz::GL #undef NAZARA_OPENGLRENDERER_EXT_END #undef NAZARA_OPENGLRENDERER_EXT_FUNC + EGLDisplay defaultDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY); + if (!defaultDisplay) + throw std::runtime_error("failed to retrieve default EGL display"); + + EGLint major, minor; + if (eglInitialize(defaultDisplay, &major, &minor) != EGL_TRUE) + throw std::runtime_error("failed to initialize default EGL display"); + + m_defaultDisplay = defaultDisplay; + + const char* vendor = eglQueryString(m_defaultDisplay, EGL_VENDOR); + NazaraNotice("Initialized EGL " + std::to_string(major) + "." + std::to_string(minor) + " display (" + vendor + ")"); + // Try to create a dummy context in order to check EGL support (FIXME: is this really necessary?) - ContextParams params; + /*ContextParams params; EGLContextBase baseContext(nullptr, *this); if (!baseContext.Create(params)) throw std::runtime_error("failed to create load context"); if (!baseContext.Initialize(params)) - throw std::runtime_error("failed to load OpenGL functions"); + throw std::runtime_error("failed to load OpenGL functions");*/ + } + + EGLLoader::~EGLLoader() + { + if (m_defaultDisplay) + eglTerminate(m_defaultDisplay); } std::unique_ptr EGLLoader::CreateContext(const OpenGLDevice* device, const ContextParams& params, Context* shareContext) const diff --git a/src/Nazara/OpenGLRenderer/Wrapper/Linux/EGLContextX11.cpp b/src/Nazara/OpenGLRenderer/Wrapper/Linux/EGLContextX11.cpp index c6bf1e3f0..25cebf3d0 100644 --- a/src/Nazara/OpenGLRenderer/Wrapper/Linux/EGLContextX11.cpp +++ b/src/Nazara/OpenGLRenderer/Wrapper/Linux/EGLContextX11.cpp @@ -17,22 +17,7 @@ namespace Nz::GL if (!BindAPI()) return false; - m_xdisplay = XOpenDisplay(nullptr); - if (!m_xdisplay) - { - NazaraError("failed to connect to X server"); - return false; - } - - m_display = m_loader.eglGetDisplay(m_xdisplay); - if (!m_display) - { - NazaraError("failed to retrieve default EGL display"); - return false; - } - - if (!InitDisplay()) - return false; + m_display = m_loader.GetDefaultDisplay(); std::size_t configCount; std::array configs; @@ -67,9 +52,7 @@ namespace Nz::GL if (!BindAPI()) return false; - m_display = m_loader.eglGetDisplay(static_cast(window.x11.display)); - if (!InitDisplay()) - return false; + m_display = m_loader.GetDefaultDisplay(); std::size_t configCount; std::array configs; diff --git a/src/Nazara/OpenGLRenderer/Wrapper/Win32/EGLContextWin32.cpp b/src/Nazara/OpenGLRenderer/Wrapper/Win32/EGLContextWin32.cpp index b14afc3ab..0a200493f 100644 --- a/src/Nazara/OpenGLRenderer/Wrapper/Win32/EGLContextWin32.cpp +++ b/src/Nazara/OpenGLRenderer/Wrapper/Win32/EGLContextWin32.cpp @@ -44,16 +44,18 @@ namespace Nz::GL return false; HWND windowHandle = static_cast(window.windows.window); - HDC deviceContext = ::GetDC(windowHandle); + /*HDC deviceContext = ::GetDC(windowHandle); if (!deviceContext) { NazaraError("failed to retrieve window device context: " + Error::GetLastSystemError()); return false; } - m_display = m_loader.eglGetDisplay(deviceContext); + m_display = m_loader.GetDefaultDisplay(); if (!InitDisplay()) - return false; + return false;*/ + + m_display = m_loader.GetDefaultDisplay(); std::size_t configCount; std::array configs;