From 0fa095e8f794c097b459a56d83ea3b17fe4a6fe4 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 19 Apr 2020 01:35:19 +0200 Subject: [PATCH] OpenGL: Rework contexts --- include/Nazara/OpenGLRenderer/Wrapper/.hpp | 39 ------------ include/Nazara/OpenGLRenderer/Wrapper/.inl | 12 ---- .../Nazara/OpenGLRenderer/Wrapper/Context.hpp | 59 +++++++++++++++---- .../Nazara/OpenGLRenderer/Wrapper/Context.inl | 9 +++ .../OpenGLRenderer/Wrapper/CoreFunctions.hpp | 3 + .../OpenGLRenderer/Wrapper/GLContext.hpp | 52 ---------------- .../OpenGLRenderer/Wrapper/GLContext.inl | 12 ---- .../Wrapper/Win32/WGLContext.hpp | 31 +++++++--- .../Wrapper/Win32/WGLContext.inl | 6 +- .../Wrapper/Win32/WGLLoader.hpp | 7 ++- 10 files changed, 93 insertions(+), 137 deletions(-) delete mode 100644 include/Nazara/OpenGLRenderer/Wrapper/.hpp delete mode 100644 include/Nazara/OpenGLRenderer/Wrapper/.inl delete mode 100644 include/Nazara/OpenGLRenderer/Wrapper/GLContext.hpp delete mode 100644 include/Nazara/OpenGLRenderer/Wrapper/GLContext.inl diff --git a/include/Nazara/OpenGLRenderer/Wrapper/.hpp b/include/Nazara/OpenGLRenderer/Wrapper/.hpp deleted file mode 100644 index 8315628db..000000000 --- a/include/Nazara/OpenGLRenderer/Wrapper/.hpp +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (C) 2020 Jérôme Leclercq -// 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_GLCONTEXT_HPP -#define NAZARA_OPENGLRENDERER_GLCONTEXT_HPP - -#include -#include -#include - -namespace Nz::GL -{ - struct ContextParams - { - - }; - - class GLContext - { - public: - GLContext() = default; - virtual ~GLContext(); - - virtual bool Activate() = 0; - - virtual bool Create(const ContextParams& params) = 0; - - virtual void EnableVerticalSync(bool enabled) = 0; - - virtual void SwapBuffers() = 0; - }; -} - -#include - -#endif diff --git a/include/Nazara/OpenGLRenderer/Wrapper/.inl b/include/Nazara/OpenGLRenderer/Wrapper/.inl deleted file mode 100644 index 4e6fe854b..000000000 --- a/include/Nazara/OpenGLRenderer/Wrapper/.inl +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (C) 2020 Jérôme Leclercq -// This file is part of the "Nazara Engine - OpenGL Renderer" -// For conditions of distribution and use, see copyright notice in Config.hpp - -#include -#include - -namespace Nz::Vk -{ -} - -#include diff --git a/include/Nazara/OpenGLRenderer/Wrapper/Context.hpp b/include/Nazara/OpenGLRenderer/Wrapper/Context.hpp index 44bef0b02..b2e0427ee 100644 --- a/include/Nazara/OpenGLRenderer/Wrapper/Context.hpp +++ b/include/Nazara/OpenGLRenderer/Wrapper/Context.hpp @@ -4,28 +4,65 @@ #pragma once -#ifndef NAZARA_OPENGLRENDERER_CONTEXT_HPP -#define NAZARA_OPENGLRENDERER_CONTEXT_HPP +#ifndef NAZARA_OPENGLRENDERER_CONTEXTIMPL_HPP +#define NAZARA_OPENGLRENDERER_CONTEXTIMPL_HPP #include -#include -#include +#include +#include +#include namespace Nz::GL { + enum class ContextType + { + OpenGL, + OpenGL_ES + }; + + struct ContextParams + { + ContextType type = ContextType::OpenGL_ES; + bool doubleBuffering = true; + unsigned int bitsPerPixel = 32; + unsigned int depthBits = 24; + unsigned int glMajorVersion = 0; + unsigned int glMinorVersion = 0; + unsigned int sampleCount = 1; + unsigned int stencilBits = 8; + }; + + class Loader; + class Context { public: Context() = default; - Context(const Context&) = delete; - Context(Context&& object) noexcept = default; - ~Context() = default; + virtual ~Context(); - Context& operator=(const Context&) = delete; - Context& operator=(Context&& object) noexcept = default; + virtual bool Activate() = 0; - private: - std::unique_ptr m_impl; + virtual void EnableVerticalSync(bool enabled) = 0; + + inline const ContextParams& GetParams() const; + + inline bool IsExtensionSupported(const std::string& extension) const; + + bool Initialize(const ContextParams& params); + + virtual void SwapBuffers() = 0; + +#define NAZARA_OPENGLRENDERER_FUNC(name, sig) sig name = nullptr; + NAZARA_OPENGLRENDERER_FOREACH_GLES_FUNC(NAZARA_OPENGLRENDERER_FUNC) +#undef NAZARA_OPENGLRENDERER_FUNC + + protected: + virtual const Loader& GetLoader() = 0; + + virtual bool ImplementFallback(const std::string_view& function) = 0; + + std::unordered_set m_supportedExtensions; + ContextParams m_params; }; } diff --git a/include/Nazara/OpenGLRenderer/Wrapper/Context.inl b/include/Nazara/OpenGLRenderer/Wrapper/Context.inl index b7ef5ca1b..440ef2d38 100644 --- a/include/Nazara/OpenGLRenderer/Wrapper/Context.inl +++ b/include/Nazara/OpenGLRenderer/Wrapper/Context.inl @@ -7,6 +7,15 @@ namespace Nz::GL { + inline const ContextParams& Context::GetParams() const + { + return m_params; + } + + inline bool Context::IsExtensionSupported(const std::string& extension) const + { + return m_supportedExtensions.find(extension) != m_supportedExtensions.end(); + } } #include diff --git a/include/Nazara/OpenGLRenderer/Wrapper/CoreFunctions.hpp b/include/Nazara/OpenGLRenderer/Wrapper/CoreFunctions.hpp index 81f8fbacd..b7794db79 100644 --- a/include/Nazara/OpenGLRenderer/Wrapper/CoreFunctions.hpp +++ b/include/Nazara/OpenGLRenderer/Wrapper/CoreFunctions.hpp @@ -7,6 +7,7 @@ #ifndef NAZARA_OPENGLRENDERER_COREFUNCTIONS_HPP #define NAZARA_OPENGLRENDERER_COREFUNCTIONS_HPP +#define GL_GLES_PROTOTYPES 0 #include // OpenGL core @@ -28,6 +29,7 @@ cb(glBufferSubData, PFNGLBUFFERSUBDATAPROC) \ cb(glClear, PFNGLCLEARPROC) \ cb(glClearColor, PFNGLCLEARCOLORPROC) \ + cb(glClearDepthf, PFNGLCLEARDEPTHFPROC) \ cb(glClearStencil, PFNGLCLEARSTENCILPROC) \ cb(glCreateProgram, PFNGLCREATEPROGRAMPROC) \ cb(glCreateShader, PFNGLCREATESHADERPROC) \ @@ -104,6 +106,7 @@ cb(glSamplerParameterf, PFNGLSAMPLERPARAMETERFPROC) \ cb(glSamplerParameteri, PFNGLSAMPLERPARAMETERIPROC) \ cb(glScissor, PFNGLSCISSORPROC) \ + cb(glShaderBinary, PFNGLSHADERBINARYPROC) \ cb(glShaderSource, PFNGLSHADERSOURCEPROC) \ cb(glStencilFunc, PFNGLSTENCILFUNCPROC) \ cb(glStencilFuncSeparate, PFNGLSTENCILFUNCSEPARATEPROC) \ diff --git a/include/Nazara/OpenGLRenderer/Wrapper/GLContext.hpp b/include/Nazara/OpenGLRenderer/Wrapper/GLContext.hpp deleted file mode 100644 index fba8d88ea..000000000 --- a/include/Nazara/OpenGLRenderer/Wrapper/GLContext.hpp +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright (C) 2020 Jérôme Leclercq -// 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_CONTEXTIMPL_HPP -#define NAZARA_OPENGLRENDERER_CONTEXTIMPL_HPP - -#include -#include -#include - -namespace Nz::GL -{ - struct ContextParams - { - bool doubleBuffering = true; - unsigned int sampleCount = 1; - unsigned int bitsPerPixel = 32; - unsigned int depthBits = 24; - unsigned int stencilBits = 8; - }; - - class Loader; - - class GLContext - { - public: - GLContext() = default; - virtual ~GLContext(); - - virtual bool Activate() = 0; - - virtual bool Create(const ContextParams& params) = 0; - - virtual void EnableVerticalSync(bool enabled) = 0; - - bool LoadCoreFunctions(Loader& loader); - - virtual void SwapBuffers() = 0; - - private: -#define NAZARA_OPENGLRENDERER_FUNC(name, sig) sig name = nullptr; - NAZARA_OPENGLRENDERER_FOREACH_GLES_FUNC(NAZARA_OPENGLRENDERER_FUNC) -#undef NAZARA_OPENGLRENDERER_FUNC - }; -} - -#include - -#endif diff --git a/include/Nazara/OpenGLRenderer/Wrapper/GLContext.inl b/include/Nazara/OpenGLRenderer/Wrapper/GLContext.inl deleted file mode 100644 index 4e6fe854b..000000000 --- a/include/Nazara/OpenGLRenderer/Wrapper/GLContext.inl +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (C) 2020 Jérôme Leclercq -// This file is part of the "Nazara Engine - OpenGL Renderer" -// For conditions of distribution and use, see copyright notice in Config.hpp - -#include -#include - -namespace Nz::Vk -{ -} - -#include diff --git a/include/Nazara/OpenGLRenderer/Wrapper/Win32/WGLContext.hpp b/include/Nazara/OpenGLRenderer/Wrapper/Win32/WGLContext.hpp index 553600ce4..3280f7a28 100644 --- a/include/Nazara/OpenGLRenderer/Wrapper/Win32/WGLContext.hpp +++ b/include/Nazara/OpenGLRenderer/Wrapper/Win32/WGLContext.hpp @@ -9,8 +9,8 @@ #include #include -#include -#include +#include +#include #include #include #include @@ -23,30 +23,37 @@ namespace Nz::GL { class WGLLoader; - class WGLContext : public GLContext + class WGLContext : public Context { public: - WGLContext(WGLLoader& loader); + WGLContext(const WGLLoader& loader); WGLContext(const WGLContext&) = delete; WGLContext(WGLContext&&) = delete; ~WGLContext(); bool Activate() override; - bool Create(const ContextParams& params) override; + bool Create(const WGLContext* baseContext, const ContextParams& params, const WGLContext* shareContext = nullptr); + bool Create(const WGLContext* baseContext, const ContextParams& params, WindowHandle window, const WGLContext* shareContext = nullptr); void Destroy(); void EnableVerticalSync(bool enabled) override; + inline bool HasPlatformExtension(const std::string& str) const; + void SwapBuffers() override; WGLContext& operator=(const WGLContext&) = delete; WGLContext& operator=(WGLContext&&) = delete; private: + bool CreateInternal(const WGLContext* baseContext, const ContextParams& params, const WGLContext* shareContext = nullptr); + bool ImplementFallback(const std::string_view& function) override; + void Desactivate(); + const Loader& GetLoader() override; bool LoadWGLExt(); - bool SetPixelFormat(const ContextParams& params); + bool SetPixelFormat(); #define NAZARA_OPENGLRENDERER_FUNC(name, sig) #define NAZARA_OPENGLRENDERER_EXT_BEGIN(ext) @@ -58,8 +65,16 @@ namespace Nz::GL #undef NAZARA_OPENGLRENDERER_EXT_FUNC #undef NAZARA_OPENGLRENDERER_FUNC - std::unordered_set m_supportedExtensions; - WGLLoader& m_loader; + struct Fallback + { + using glClearDepthProc = void(*)(double depth); + + glClearDepthProc glClearDepth; + }; + Fallback fallbacks; //< m_ omitted + + std::unordered_set m_supportedPlatformExtensions; + const WGLLoader& m_loader; HDC m_deviceContext; HGLRC m_handle; HWNDHandle m_window; diff --git a/include/Nazara/OpenGLRenderer/Wrapper/Win32/WGLContext.inl b/include/Nazara/OpenGLRenderer/Wrapper/Win32/WGLContext.inl index 70a9d82df..a4bdc6bda 100644 --- a/include/Nazara/OpenGLRenderer/Wrapper/Win32/WGLContext.inl +++ b/include/Nazara/OpenGLRenderer/Wrapper/Win32/WGLContext.inl @@ -5,8 +5,12 @@ #include #include -namespace Nz::Vk +namespace Nz::GL { + inline bool WGLContext::HasPlatformExtension(const std::string& str) const + { + return m_supportedPlatformExtensions.find(str) != m_supportedPlatformExtensions.end(); + } } #include diff --git a/include/Nazara/OpenGLRenderer/Wrapper/Win32/WGLLoader.hpp b/include/Nazara/OpenGLRenderer/Wrapper/Win32/WGLLoader.hpp index 4a5b6a57a..a733233af 100644 --- a/include/Nazara/OpenGLRenderer/Wrapper/Win32/WGLLoader.hpp +++ b/include/Nazara/OpenGLRenderer/Wrapper/Win32/WGLLoader.hpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #undef WIN32_LEAN_AND_MEAN //< Redefined by OpenGL header (ty Khronos) @@ -23,9 +24,10 @@ namespace Nz::GL WGLLoader(DynLib& openglLib); ~WGLLoader() = default; - std::unique_ptr CreateContext() override; + std::unique_ptr CreateContext(const ContextParams& params, Context* shareContext) const override; + std::unique_ptr CreateContext(const ContextParams& params, WindowHandle handle, Context* shareContext) const override; - GLFunction LoadFunction(const char* name) override; + GLFunction LoadFunction(const char* name) const override; #define NAZARA_OPENGLRENDERER_FUNC(name, sig) sig name = nullptr; #define NAZARA_OPENGLRENDERER_EXT_BEGIN(ext) @@ -41,6 +43,7 @@ namespace Nz::GL private: DynLib m_gdi32Lib; DynLib& m_opengl32Lib; + WGLContext m_baseContext; }; }