From 0609a10c25e07afce8828ff234c2c3ba5644f147 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Thu, 3 Sep 2020 13:54:44 +0200 Subject: [PATCH] OpenGLRenderer: Get rid of std::function by using function indexes --- .../Nazara/OpenGLRenderer/Wrapper/Context.hpp | 21 ++++++---- .../Nazara/OpenGLRenderer/Wrapper/Context.inl | 6 +++ .../Nazara/OpenGLRenderer/Wrapper/Loader.hpp | 6 +-- src/Nazara/OpenGLRenderer/Wrapper/Context.cpp | 40 +++++++++++-------- 4 files changed, 45 insertions(+), 28 deletions(-) diff --git a/include/Nazara/OpenGLRenderer/Wrapper/Context.hpp b/include/Nazara/OpenGLRenderer/Wrapper/Context.hpp index ce41757ca..4f95b5c21 100644 --- a/include/Nazara/OpenGLRenderer/Wrapper/Context.hpp +++ b/include/Nazara/OpenGLRenderer/Wrapper/Context.hpp @@ -9,16 +9,16 @@ #include #include +#include #include #include #include +#include #include #include #include #include -#define NAZARA_OPENGLRENDERER_DEBUG 1 - namespace Nz { class OpenGLDevice; @@ -91,8 +91,6 @@ namespace Nz::GL unsigned int stencilBits = 8; }; - class Loader; - class NAZARA_OPENGLRENDERER_API Context { struct SymbolLoader; @@ -118,6 +116,7 @@ namespace Nz::GL inline const OpenGLDevice* GetDevice() const; inline ExtensionStatus GetExtensionStatus(Extension extension) const; + inline GLFunction GetFunctionByIndex(std::size_t funcIndex) const; inline const OpenGLVaoCache& GetVaoCache() const; inline const ContextParams& GetParams() const; @@ -142,11 +141,7 @@ namespace Nz::GL void UpdateStates(const RenderStates& renderStates) const; -#if NAZARA_OPENGLRENDERER_DEBUG -#define NAZARA_OPENGLRENDERER_FUNC(name, sig) std::function> name; -#else #define NAZARA_OPENGLRENDERER_FUNC(name, sig) sig name = nullptr; -#endif NAZARA_OPENGLRENDERER_FOREACH_GLES_FUNC(NAZARA_OPENGLRENDERER_FUNC, NAZARA_OPENGLRENDERER_FUNC) #undef NAZARA_OPENGLRENDERER_FUNC @@ -168,6 +163,15 @@ namespace Nz::GL private: void GL_APIENTRY HandleDebugMessage(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message) const; + enum class FunctionIndex + { +#define NAZARA_OPENGLRENDERER_FUNC(name, sig) name, + NAZARA_OPENGLRENDERER_FOREACH_GLES_FUNC(NAZARA_OPENGLRENDERER_FUNC, NAZARA_OPENGLRENDERER_FUNC) +#undef NAZARA_OPENGLRENDERER_FUNC + + Count + }; + struct State { struct Box @@ -203,6 +207,7 @@ namespace Nz::GL }; std::array m_extensionStatus; + std::array m_originalFunctionPointer; std::unordered_set m_supportedExtensions; OpenGLVaoCache m_vaoCache; const OpenGLDevice* m_device; diff --git a/include/Nazara/OpenGLRenderer/Wrapper/Context.inl b/include/Nazara/OpenGLRenderer/Wrapper/Context.inl index 59c44805b..8c675cea7 100644 --- a/include/Nazara/OpenGLRenderer/Wrapper/Context.inl +++ b/include/Nazara/OpenGLRenderer/Wrapper/Context.inl @@ -23,6 +23,12 @@ namespace Nz::GL return m_extensionStatus[UnderlyingCast(extension)]; } + inline GLFunction Context::GetFunctionByIndex(std::size_t funcIndex) const + { + assert(funcIndex < m_originalFunctionPointer.size()); + return m_originalFunctionPointer[funcIndex]; + } + inline const OpenGLVaoCache& Context::GetVaoCache() const { return m_vaoCache; diff --git a/include/Nazara/OpenGLRenderer/Wrapper/Loader.hpp b/include/Nazara/OpenGLRenderer/Wrapper/Loader.hpp index 8b0a73b62..17a5c69dc 100644 --- a/include/Nazara/OpenGLRenderer/Wrapper/Loader.hpp +++ b/include/Nazara/OpenGLRenderer/Wrapper/Loader.hpp @@ -10,7 +10,6 @@ #include #include #include -#include #include namespace Nz @@ -20,10 +19,11 @@ namespace Nz namespace Nz::GL { - class Context; - using GLFunction = void(*)(void); + class Context; + struct ContextParams; + class NAZARA_OPENGLRENDERER_API Loader { public: diff --git a/src/Nazara/OpenGLRenderer/Wrapper/Context.cpp b/src/Nazara/OpenGLRenderer/Wrapper/Context.cpp index 5ef0360c7..7a028282c 100644 --- a/src/Nazara/OpenGLRenderer/Wrapper/Context.cpp +++ b/src/Nazara/OpenGLRenderer/Wrapper/Context.cpp @@ -14,6 +14,8 @@ #include #include +#define NAZARA_OPENGLRENDERER_DEBUG 1 + namespace Nz::GL { thread_local const Context* s_currentContext = nullptr; @@ -26,14 +28,16 @@ namespace Nz::GL template struct GLWrapper { - template - static auto WrapErrorHandling(FuncType funcPtr) + template + static auto WrapErrorHandling() { - return [funcPtr](Args&&... args) -> Ret + return [](Args... args) -> Ret { const Context* context = s_currentContext; //< pay TLS cost once assert(context); + FuncType funcPtr = reinterpret_cast(context->GetFunctionByIndex(FuncIndex)); + context->ClearErrorStack(); if constexpr (std::is_same_v) @@ -62,21 +66,19 @@ namespace Nz::GL { } - template + template bool Load(Func& func, const char* funcName, bool mandatory, bool implementFallback = true) { - FuncType funcPtr = LoadRaw(funcName); - if (funcPtr) - { + FuncType originalFunc = LoadRaw(funcName); + func = originalFunc; + #if NAZARA_OPENGLRENDERER_DEBUG + if (originalFunc) + { if (std::strcmp(funcName, "glGetError") != 0) //< Prevent infinite recursion - func = GLWrapper>::template WrapErrorHandling(funcPtr); - else - func = funcPtr; -#else - func = funcPtr; -#endif + func = GLWrapper>::template WrapErrorHandling(); } +#endif if (!func) { @@ -87,6 +89,8 @@ namespace Nz::GL } } + context.m_originalFunctionPointer[FuncIndex] = reinterpret_cast(originalFunc); + return func != nullptr; } @@ -249,7 +253,7 @@ namespace Nz::GL try { -#define NAZARA_OPENGLRENDERER_FUNC(name, sig) loader.Load(name, #name, true); +#define NAZARA_OPENGLRENDERER_FUNC(name, sig) loader.Load(name, #name, true); #define NAZARA_OPENGLRENDERER_EXT_FUNC(name, sig) //< Do nothing NAZARA_OPENGLRENDERER_FOREACH_GLES_FUNC(NAZARA_OPENGLRENDERER_FUNC, NAZARA_OPENGLRENDERER_EXT_FUNC) #undef NAZARA_OPENGLRENDERER_EXT_FUNC @@ -299,7 +303,7 @@ namespace Nz::GL m_extensionStatus[UnderlyingCast(Extension::SpirV)] = ExtensionStatus::ARB; #define NAZARA_OPENGLRENDERER_FUNC(name, sig) -#define NAZARA_OPENGLRENDERER_EXT_FUNC(name, sig) loader.Load(name, #name, false); +#define NAZARA_OPENGLRENDERER_EXT_FUNC(name, sig) loader.Load(name, #name, false); NAZARA_OPENGLRENDERER_FOREACH_GLES_FUNC(NAZARA_OPENGLRENDERER_FUNC, NAZARA_OPENGLRENDERER_EXT_FUNC) #undef NAZARA_OPENGLRENDERER_EXT_FUNC #undef NAZARA_OPENGLRENDERER_FUNC @@ -665,8 +669,10 @@ namespace Nz::GL if (function == "glDebugMessageCallback") { - if (!loader.Load(glDebugMessageCallback, "glDebugMessageCallbackARB", false, false)) - return loader.Load(glDebugMessageCallback, "DebugMessageCallbackAMD", false, false); + constexpr std::size_t functionIndex = UnderlyingCast(FunctionIndex::glDebugMessageCallback); + + if (!loader.Load(glDebugMessageCallback, "glDebugMessageCallbackARB", false, false)) + return loader.Load(glDebugMessageCallback, "DebugMessageCallbackAMD", false, false); return true; }