diff --git a/include/Nazara/OpenGLRenderer/Wrapper/EGL/EGLContextBase.hpp b/include/Nazara/OpenGLRenderer/Wrapper/EGL/EGLContextBase.hpp index 569df90bd..01f56006f 100644 --- a/include/Nazara/OpenGLRenderer/Wrapper/EGL/EGLContextBase.hpp +++ b/include/Nazara/OpenGLRenderer/Wrapper/EGL/EGLContextBase.hpp @@ -12,7 +12,8 @@ #include #include #include -#include +#include +#include #include #include #include diff --git a/include/Nazara/OpenGLRenderer/Wrapper/EGL/EGLFunctions.hpp b/include/Nazara/OpenGLRenderer/Wrapper/EGL/EGLFunctions.hpp index 0359c031f..cdebf4d88 100644 --- a/include/Nazara/OpenGLRenderer/Wrapper/EGL/EGLFunctions.hpp +++ b/include/Nazara/OpenGLRenderer/Wrapper/EGL/EGLFunctions.hpp @@ -2,30 +2,28 @@ // This file is part of the "Nazara Engine - OpenGL Renderer" // For conditions of distribution and use, see copyright notice in Config.hpp -#pragma once - -#ifndef NAZARA_OPENGLRENDERER_EGLFUNCTIONS_HPP -#define NAZARA_OPENGLRENDERER_EGLFUNCTIONS_HPP - -#include -#include -#include - -#define NAZARA_OPENGLRENDERER_FOREACH_EGL_FUNC(func, extBegin, extEnd, extFunc) \ - func(eglBindAPI, PFNEGLBINDAPIPROC) \ - func(eglChooseConfig, PFNEGLCHOOSECONFIGPROC) \ - func(eglCreateContext, PFNEGLCREATECONTEXTPROC) \ - func(eglCreatePbufferSurface, PFNEGLCREATEPBUFFERSURFACEPROC) \ - func(eglCreateWindowSurface, PFNEGLCREATEWINDOWSURFACEPROC) \ - func(eglDestroyContext, PFNEGLDESTROYCONTEXTPROC) \ - func(eglDestroySurface, PFNEGLDESTROYSURFACEPROC) \ - func(eglGetDisplay, PFNEGLGETDISPLAYPROC) \ - func(eglGetError, PFNEGLGETERRORPROC) \ - func(eglGetProcAddress, PFNEGLGETPROCADDRESSPROC) \ - func(eglInitialize, PFNEGLINITIALIZEPROC) \ - func(eglMakeCurrent, PFNEGLMAKECURRENTPROC) \ - func(eglQueryString, PFNEGLQUERYSTRINGPROC) \ - func(eglSwapBuffers, PFNEGLSWAPBUFFERSPROC) \ - func(eglTerminate, PFNEGLTERMINATEPROC) - +#if !defined(NAZARA_OPENGLRENDERER_EGL_FUNC) || !defined(NAZARA_OPENGLRENDERER_EGL_FUNC_OPT) +#error You must define NAZARA_OPENGLRENDERER_EGL_FUNC and NAZARA_OPENGLRENDERER_EGL_FUNC_OPT before including this file #endif + +NAZARA_OPENGLRENDERER_EGL_FUNC(eglBindAPI, PFNEGLBINDAPIPROC) +NAZARA_OPENGLRENDERER_EGL_FUNC(eglChooseConfig, PFNEGLCHOOSECONFIGPROC) +NAZARA_OPENGLRENDERER_EGL_FUNC(eglCreateContext, PFNEGLCREATECONTEXTPROC) +NAZARA_OPENGLRENDERER_EGL_FUNC(eglCreatePbufferSurface, PFNEGLCREATEPBUFFERSURFACEPROC) +NAZARA_OPENGLRENDERER_EGL_FUNC(eglCreateWindowSurface, PFNEGLCREATEWINDOWSURFACEPROC) +NAZARA_OPENGLRENDERER_EGL_FUNC(eglDestroyContext, PFNEGLDESTROYCONTEXTPROC) +NAZARA_OPENGLRENDERER_EGL_FUNC(eglDestroySurface, PFNEGLDESTROYSURFACEPROC) +NAZARA_OPENGLRENDERER_EGL_FUNC(eglGetDisplay, PFNEGLGETDISPLAYPROC) +NAZARA_OPENGLRENDERER_EGL_FUNC(eglGetError, PFNEGLGETERRORPROC) +NAZARA_OPENGLRENDERER_EGL_FUNC(eglGetProcAddress, PFNEGLGETPROCADDRESSPROC) +NAZARA_OPENGLRENDERER_EGL_FUNC(eglInitialize, PFNEGLINITIALIZEPROC) +NAZARA_OPENGLRENDERER_EGL_FUNC(eglMakeCurrent, PFNEGLMAKECURRENTPROC) +NAZARA_OPENGLRENDERER_EGL_FUNC(eglQueryString, PFNEGLQUERYSTRINGPROC) +NAZARA_OPENGLRENDERER_EGL_FUNC(eglSwapBuffers, PFNEGLSWAPBUFFERSPROC) +NAZARA_OPENGLRENDERER_EGL_FUNC(eglTerminate, PFNEGLTERMINATEPROC) + +NAZARA_OPENGLRENDERER_EGL_FUNC_OPT(eglCreatePlatformWindowSurface, PFNEGLCREATEPLATFORMWINDOWSURFACEPROC) +NAZARA_OPENGLRENDERER_EGL_FUNC_OPT(eglCreatePlatformWindowSurfaceEXT, PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC) + +#undef NAZARA_OPENGLRENDERER_EGL_FUNC +#undef NAZARA_OPENGLRENDERER_EGL_FUNC_OPT diff --git a/include/Nazara/OpenGLRenderer/Wrapper/EGL/EGLLoader.hpp b/include/Nazara/OpenGLRenderer/Wrapper/EGL/EGLLoader.hpp index ceba20bf8..1428bf01c 100644 --- a/include/Nazara/OpenGLRenderer/Wrapper/EGL/EGLLoader.hpp +++ b/include/Nazara/OpenGLRenderer/Wrapper/EGL/EGLLoader.hpp @@ -11,13 +11,15 @@ #include #include #include -#include #include namespace Nz::GL { class NAZARA_OPENGLRENDERER_API EGLLoader : public Loader { + struct SymbolLoader; + friend SymbolLoader; + public: EGLLoader(); ~EGLLoader(); @@ -29,19 +31,16 @@ namespace Nz::GL GLFunction LoadFunction(const char* name) const override; -#define NAZARA_OPENGLRENDERER_FUNC(name, sig) sig name = nullptr; -#define NAZARA_OPENGLRENDERER_EXT_BEGIN(ext) -#define NAZARA_OPENGLRENDERER_EXT_END() -#define NAZARA_OPENGLRENDERER_EXT_FUNC(name, sig) - NAZARA_OPENGLRENDERER_FOREACH_EGL_FUNC(NAZARA_OPENGLRENDERER_FUNC, NAZARA_OPENGLRENDERER_EXT_BEGIN, NAZARA_OPENGLRENDERER_EXT_END, NAZARA_OPENGLRENDERER_EXT_FUNC) -#undef NAZARA_OPENGLRENDERER_EXT_BEGIN -#undef NAZARA_OPENGLRENDERER_EXT_END -#undef NAZARA_OPENGLRENDERER_EXT_FUNC -#undef NAZARA_OPENGLRENDERER_FUNC +#define NAZARA_OPENGLRENDERER_EGL_FUNC(name, sig) sig name = nullptr; +#define NAZARA_OPENGLRENDERER_EGL_FUNC_OPT(name, sig) NAZARA_OPENGLRENDERER_EGL_FUNC(name, sig) + +#include static const char* TranslateError(EGLint errorId); private: + bool ImplementFallback(const std::string_view& function); + EGLDisplay m_defaultDisplay; DynLib m_eglLib; }; diff --git a/src/Nazara/OpenGLRenderer/Wrapper/EGL/EGLContextBase.cpp b/src/Nazara/OpenGLRenderer/Wrapper/EGL/EGLContextBase.cpp index a7d1b5914..8e7820c2d 100644 --- a/src/Nazara/OpenGLRenderer/Wrapper/EGL/EGLContextBase.cpp +++ b/src/Nazara/OpenGLRenderer/Wrapper/EGL/EGLContextBase.cpp @@ -321,7 +321,7 @@ namespace Nz::GL bool EGLContextBase::LoadEGLExt() { - if (!Activate()) + if (!SetCurrentContext(this)) return false; const char* extensionString = m_loader.eglQueryString(m_display, EGL_EXTENSIONS); diff --git a/src/Nazara/OpenGLRenderer/Wrapper/EGL/EGLLoader.cpp b/src/Nazara/OpenGLRenderer/Wrapper/EGL/EGLLoader.cpp index c9fb3ea75..a63697e5c 100644 --- a/src/Nazara/OpenGLRenderer/Wrapper/EGL/EGLLoader.cpp +++ b/src/Nazara/OpenGLRenderer/Wrapper/EGL/EGLLoader.cpp @@ -20,32 +20,53 @@ namespace Nz::GL { + struct EGLLoader::SymbolLoader + { + SymbolLoader(EGLLoader& parent) : + loader(parent) + { + } + + template + bool Load(Func& func, const char* funcName, bool mandatory, bool implementFallback = true) + { + FuncType funcPtr = LoadRaw(funcName); + if (funcPtr) + func = funcPtr; + + if (!func) + { + if (!implementFallback || (!loader.ImplementFallback(funcName) && !func)) //< double-check + { + if (mandatory) + throw std::runtime_error("failed to load core function " + std::string(funcName)); + } + } + + return func != nullptr; + } + + template + FuncType LoadRaw(const char* funcName) + { + return reinterpret_cast(loader.LoadFunction(funcName)); + } + + EGLLoader& loader; + }; + EGLLoader::EGLLoader() : m_defaultDisplay(nullptr) { if (!m_eglLib.Load("libEGL")) - throw std::runtime_error("failed to load gdi32.dll: " + m_eglLib.GetLastError()); + throw std::runtime_error("failed to load libEGL: " + m_eglLib.GetLastError()); - auto LoadSymbol = [](DynLib& lib, auto& func, const char* funcName) - { - func = reinterpret_cast>(lib.GetSymbol(funcName)); - if (!func) - throw std::runtime_error("failed to load core function " + std::string(funcName)); - }; + SymbolLoader loader(*this); - // Load gdi32 functions -#define NAZARA_OPENGLRENDERER_EXT_BEGIN(ext) -#define NAZARA_OPENGLRENDERER_EXT_END() -#define NAZARA_OPENGLRENDERER_EXT_FUNC(name, sig) //< Ignore extensions +#define NAZARA_OPENGLRENDERER_EGL_FUNC(name, sig) loader.Load(name, #name, true); +#define NAZARA_OPENGLRENDERER_EGL_FUNC_OPT(name, sig) loader.Load(name, #name, false); - // Load base WGL functions -#define NAZARA_OPENGLRENDERER_FUNC(name, sig) LoadSymbol(m_eglLib, name, #name); - NAZARA_OPENGLRENDERER_FOREACH_EGL_FUNC(NAZARA_OPENGLRENDERER_FUNC, NAZARA_OPENGLRENDERER_EXT_BEGIN, NAZARA_OPENGLRENDERER_EXT_END, NAZARA_OPENGLRENDERER_EXT_FUNC) -#undef NAZARA_OPENGLRENDERER_FUNC - -#undef NAZARA_OPENGLRENDERER_EXT_BEGIN -#undef NAZARA_OPENGLRENDERER_EXT_END -#undef NAZARA_OPENGLRENDERER_EXT_FUNC +#include EGLDisplay defaultDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY); if (!defaultDisplay) @@ -151,7 +172,11 @@ namespace Nz::GL GLFunction EGLLoader::LoadFunction(const char* name) const { - return eglGetProcAddress(name); + GLFunction func = reinterpret_cast(m_eglLib.GetSymbol(name)); + if (!func && eglGetProcAddress) + func = reinterpret_cast(eglGetProcAddress(name)); + + return func; } const char* EGLLoader::TranslateError(EGLint errorId) @@ -176,4 +201,9 @@ namespace Nz::GL default: return "Invalid or unknown error."; } } + + bool EGLLoader::ImplementFallback(const std::string_view& function) + { + return false; + } }