From e4064997d8212fd2e528e25227893d9e7c9c5895 Mon Sep 17 00:00:00 2001 From: SirLynix Date: Sun, 25 Dec 2022 16:11:28 +0100 Subject: [PATCH] Renderer: Split OpenGL and OpenGL ES in two RenderAPI enums --- .../Nazara/OpenGLRenderer/OpenGLRenderer.hpp | 2 +- .../OpenGLRenderer/Wrapper/EGL/EGLLoader.hpp | 3 ++- .../OpenGLRenderer/Wrapper/WGL/WGLLoader.hpp | 3 ++- include/Nazara/Renderer/Enums.hpp | 13 ++++----- src/Nazara/OpenGLRenderer/OpenGLRenderer.cpp | 18 ++++++++----- .../OpenGLRenderer/Wrapper/EGL/EGLLoader.cpp | 27 ++++++++++++++----- .../OpenGLRenderer/Wrapper/WGL/WGLLoader.cpp | 27 ++++++++++++++----- src/Nazara/Renderer/Renderer.cpp | 10 +++++-- src/Nazara/VulkanRenderer/VulkanRenderer.cpp | 2 +- 9 files changed, 75 insertions(+), 30 deletions(-) diff --git a/include/Nazara/OpenGLRenderer/OpenGLRenderer.hpp b/include/Nazara/OpenGLRenderer/OpenGLRenderer.hpp index 642e1de40..8360268d0 100644 --- a/include/Nazara/OpenGLRenderer/OpenGLRenderer.hpp +++ b/include/Nazara/OpenGLRenderer/OpenGLRenderer.hpp @@ -35,7 +35,7 @@ namespace Nz bool Prepare(const Renderer::Config& config) override; private: - std::unique_ptr SelectLoader(); + std::unique_ptr SelectLoader(const Renderer::Config& config); std::shared_ptr m_device; std::unique_ptr m_loader; diff --git a/include/Nazara/OpenGLRenderer/Wrapper/EGL/EGLLoader.hpp b/include/Nazara/OpenGLRenderer/Wrapper/EGL/EGLLoader.hpp index 7663b4a33..fd271ec00 100644 --- a/include/Nazara/OpenGLRenderer/Wrapper/EGL/EGLLoader.hpp +++ b/include/Nazara/OpenGLRenderer/Wrapper/EGL/EGLLoader.hpp @@ -11,6 +11,7 @@ #include #include #include +#include #include namespace Nz::GL @@ -21,7 +22,7 @@ namespace Nz::GL friend SymbolLoader; public: - EGLLoader(); + EGLLoader(const Renderer::Config& config); ~EGLLoader(); std::unique_ptr CreateContext(const OpenGLDevice* device, const ContextParams& params, Context* shareContext) const override; diff --git a/include/Nazara/OpenGLRenderer/Wrapper/WGL/WGLLoader.hpp b/include/Nazara/OpenGLRenderer/Wrapper/WGL/WGLLoader.hpp index 492440bf9..13138ded9 100644 --- a/include/Nazara/OpenGLRenderer/Wrapper/WGL/WGLLoader.hpp +++ b/include/Nazara/OpenGLRenderer/Wrapper/WGL/WGLLoader.hpp @@ -13,6 +13,7 @@ #include #include #include +#include #include namespace Nz::GL @@ -20,7 +21,7 @@ namespace Nz::GL class NAZARA_OPENGLRENDERER_API WGLLoader : public Loader { public: - WGLLoader(); + WGLLoader(const Renderer::Config& config); ~WGLLoader() = default; std::unique_ptr CreateContext(const OpenGLDevice* device, const ContextParams& params, Context* shareContext) const override; diff --git a/include/Nazara/Renderer/Enums.hpp b/include/Nazara/Renderer/Enums.hpp index 4fc796938..8a58feff4 100644 --- a/include/Nazara/Renderer/Enums.hpp +++ b/include/Nazara/Renderer/Enums.hpp @@ -127,13 +127,14 @@ namespace Nz enum class RenderAPI { - Direct3D, ///< Microsoft Render API, only works on MS platforms - Mantle, ///< AMD Render API, Vulkan predecessor, only works on AMD GPUs - Metal, ///< Apple Render API, only works on OS X platforms - OpenGL, ///< Khronos Render API, works on Web/Desktop/Mobile and some consoles - Vulkan, ///< New Khronos Render API, made to replace OpenGL, works on desktop (Windows/Linux) and mobile (Android), and Apple platform using MoltenVK + Direct3D, //< Microsoft Render API, only works on MS platforms + Mantle, //< AMD Render API, Vulkan predecessor, only works on AMD GPUs + Metal, //< Apple Render API, only works on OS X platforms + OpenGL, //< Khronos Render API, works on Desktop and some consoles + OpenGL_ES, //< Khronos Render API, works on Web, Mobile and some consoles + Vulkan, //< New Khronos Render API, made to replace OpenGL, works on desktop (Windows/Linux) and mobile (Android), and Apple platform using MoltenVK - Unknown, ///< RenderAPI not corresponding to an entry of the enum, or result of a failed query + Unknown, //< RenderAPI not corresponding to an entry of the enum, or result of a failed query Max = Unknown }; diff --git a/src/Nazara/OpenGLRenderer/OpenGLRenderer.cpp b/src/Nazara/OpenGLRenderer/OpenGLRenderer.cpp index 827a01854..8c1afc1d3 100644 --- a/src/Nazara/OpenGLRenderer/OpenGLRenderer.cpp +++ b/src/Nazara/OpenGLRenderer/OpenGLRenderer.cpp @@ -55,7 +55,7 @@ namespace Nz bool OpenGLRenderer::Prepare(const Renderer::Config& config) { - std::unique_ptr loader = SelectLoader(); + std::unique_ptr loader = SelectLoader(config); if (!loader) { NazaraError("Failed to initialize OpenGL loader"); @@ -70,12 +70,12 @@ namespace Nz return true; } - std::unique_ptr OpenGLRenderer::SelectLoader() + std::unique_ptr OpenGLRenderer::SelectLoader(const Renderer::Config& config) { #ifdef NAZARA_PLATFORM_WINDOWS try { - return std::make_unique(); + return std::make_unique(config); } catch (const std::exception& e) { @@ -86,7 +86,7 @@ namespace Nz #if defined(NAZARA_PLATFORM_WINDOWS) || defined(NAZARA_PLATFORM_LINUX) try { - return std::make_unique(); + return std::make_unique(config); } catch (const std::exception& e) { @@ -99,13 +99,19 @@ namespace Nz RenderAPI OpenGLRenderer::QueryAPI() const { - return RenderAPI::OpenGL; + return (m_device->GetReferenceContext().GetParams().type == GL::ContextType::OpenGL) ? RenderAPI::OpenGL : RenderAPI::OpenGL_ES; } std::string OpenGLRenderer::QueryAPIString() const { + const auto& params = m_device->GetReferenceContext().GetParams(); + std::ostringstream ss; - ss << "OpenGL ES renderer 3.0"; + ss << "OpenGL"; + if (params.type == GL::ContextType::OpenGL_ES) + ss << " ES"; + + ss << " renderer " << params.glMajorVersion << "." << params.glMinorVersion; return ss.str(); } diff --git a/src/Nazara/OpenGLRenderer/Wrapper/EGL/EGLLoader.cpp b/src/Nazara/OpenGLRenderer/Wrapper/EGL/EGLLoader.cpp index f1ace3a42..d26606ce6 100644 --- a/src/Nazara/OpenGLRenderer/Wrapper/EGL/EGLLoader.cpp +++ b/src/Nazara/OpenGLRenderer/Wrapper/EGL/EGLLoader.cpp @@ -52,7 +52,7 @@ namespace Nz::GL EGLLoader& loader; }; - EGLLoader::EGLLoader() : + EGLLoader::EGLLoader(const Renderer::Config& config) : m_defaultDisplay(nullptr) { if (!m_eglLib.Load("libEGL")) @@ -80,14 +80,29 @@ namespace Nz::GL // Try to create a dummy context in order to check OpenGL / OpenGL ES support - // Favor OpenGL on desktop and OpenGL ES on mobile - std::array contextTypes = { + std::array contextTypes; + + RenderAPI preferredAPI = config.preferredAPI; + if (preferredAPI == RenderAPI::Unknown) + { + // Favor OpenGL on desktop and OpenGL ES on mobile #if defined(NAZARA_PLATFORM_DESKTOP) - GL::ContextType::OpenGL, GL::ContextType::OpenGL_ES + preferredAPI = RenderAPI::OpenGL; #else - GL::ContextType::OpenGL_ES, GL::ContextType::OpenGL + preferredAPI = RenderAPI::OpenGL_ES; #endif - }; + } + + if (config.preferredAPI == RenderAPI::OpenGL_ES) + { + contextTypes[0] = GL::ContextType::OpenGL_ES; + contextTypes[1] = GL::ContextType::OpenGL; + } + else + { + contextTypes[0] = GL::ContextType::OpenGL; + contextTypes[1] = GL::ContextType::OpenGL_ES; + } ContextParams params; diff --git a/src/Nazara/OpenGLRenderer/Wrapper/WGL/WGLLoader.cpp b/src/Nazara/OpenGLRenderer/Wrapper/WGL/WGLLoader.cpp index eb0137a4d..bf85c9233 100644 --- a/src/Nazara/OpenGLRenderer/Wrapper/WGL/WGLLoader.cpp +++ b/src/Nazara/OpenGLRenderer/Wrapper/WGL/WGLLoader.cpp @@ -9,7 +9,7 @@ namespace Nz::GL { - WGLLoader::WGLLoader() : + WGLLoader::WGLLoader(const Renderer::Config& config) : m_baseContext(nullptr, *this) { if (!m_opengl32Lib.Load("opengl32" NAZARA_DYNLIB_EXTENSION)) @@ -50,14 +50,29 @@ namespace Nz::GL throw std::runtime_error("failed to create load context"); ContextParams params; - // Favor OpenGL on desktop and OpenGL ES on mobile - std::array contextTypes = { + std::array contextTypes; + + RenderAPI preferredAPI = config.preferredAPI; + if (preferredAPI == RenderAPI::Unknown) + { + // Favor OpenGL on desktop and OpenGL ES on mobile #if defined(NAZARA_PLATFORM_DESKTOP) - GL::ContextType::OpenGL, GL::ContextType::OpenGL_ES + preferredAPI = RenderAPI::OpenGL; #else - GL::ContextType::OpenGL_ES, GL::ContextType::OpenGL + preferredAPI = RenderAPI::OpenGL_ES; #endif - }; + } + + if (config.preferredAPI == RenderAPI::OpenGL_ES) + { + contextTypes[0] = GL::ContextType::OpenGL_ES; + contextTypes[1] = GL::ContextType::OpenGL; + } + else + { + contextTypes[0] = GL::ContextType::OpenGL; + contextTypes[1] = GL::ContextType::OpenGL_ES; + } bool created = false; for (GL::ContextType contextType : contextTypes) diff --git a/src/Nazara/Renderer/Renderer.cpp b/src/Nazara/Renderer/Renderer.cpp index fbded67a7..a97baa511 100644 --- a/src/Nazara/Renderer/Renderer.cpp +++ b/src/Nazara/Renderer/Renderer.cpp @@ -82,6 +82,7 @@ namespace Nz NazaraRendererPrefix "NazaraMantleRenderer" NazaraRendererDebugSuffix, // Mantle NazaraRendererPrefix "NazaraMetalRenderer" NazaraRendererDebugSuffix, // Metal NazaraRendererPrefix "NazaraOpenGLRenderer" NazaraRendererDebugSuffix, // OpenGL + NazaraRendererPrefix "NazaraOpenGLRenderer" NazaraRendererDebugSuffix, // OpenGL_ES NazaraRendererPrefix "NazaraVulkanRenderer" NazaraRendererDebugSuffix, // Vulkan nullptr // Unknown @@ -98,6 +99,11 @@ namespace Nz }; std::vector implementations; + RenderAPI preferredAPI = config.preferredAPI; + // OpenGL and OpenGL ES are handled by the same implementation (OpenGLES will be handled in OpenGLRenderer code) + if (preferredAPI == RenderAPI::OpenGL_ES) + preferredAPI = RenderAPI::OpenGL; + #ifdef NAZARA_RENDERER_EMBEDDEDBACKENDS auto RegisterImpl = [&](RenderAPI api, auto ComputeScore, std::function()> factory) { @@ -112,7 +118,7 @@ namespace Nz { auto& impl = implementations.emplace_back(); impl.factory = std::move(factory); - impl.score = (config.preferredAPI == api) ? std::numeric_limits::max() : score; + impl.score = (preferredAPI == api) ? std::numeric_limits::max() : score; } }; @@ -132,7 +138,7 @@ namespace Nz { auto& impl = implementations.emplace_back(); impl.fileName = std::move(fileName); - impl.score = (config.preferredAPI == api) ? std::numeric_limits::max() : score; + impl.score = (preferredAPI == api) ? std::numeric_limits::max() : score; } }; diff --git a/src/Nazara/VulkanRenderer/VulkanRenderer.cpp b/src/Nazara/VulkanRenderer/VulkanRenderer.cpp index 8899b9b69..0cca1dfc6 100644 --- a/src/Nazara/VulkanRenderer/VulkanRenderer.cpp +++ b/src/Nazara/VulkanRenderer/VulkanRenderer.cpp @@ -60,7 +60,7 @@ namespace Nz std::string VulkanRenderer::QueryAPIString() const { std::ostringstream ss; - ss << "Vulkan renderer " << VK_VERSION_MAJOR(APIVersion) << '.' << VK_VERSION_MINOR(APIVersion) << '.' << VK_VERSION_PATCH(APIVersion); + ss << "Vulkan renderer " << VK_API_VERSION_MAJOR(APIVersion) << '.' << VK_API_VERSION_MINOR(APIVersion) << '.' << VK_API_VERSION_PATCH(APIVersion); return ss.str(); }