From 66a98b234ff1cf2412730a5552bec90d15255d19 Mon Sep 17 00:00:00 2001 From: Lynix Date: Thu, 18 Jun 2020 20:03:22 +0200 Subject: [PATCH] Renderer/GlslWriter: Add environment --- include/Nazara/Renderer/GlslWriter.hpp | 15 +++++- src/Nazara/Renderer/GlslWriter.cpp | 73 +++++++++++++++++++++----- 2 files changed, 73 insertions(+), 15 deletions(-) diff --git a/include/Nazara/Renderer/GlslWriter.hpp b/include/Nazara/Renderer/GlslWriter.hpp index 22d6544f2..e0f9bf11e 100644 --- a/include/Nazara/Renderer/GlslWriter.hpp +++ b/include/Nazara/Renderer/GlslWriter.hpp @@ -23,6 +23,9 @@ namespace Nz class NAZARA_RENDERER_API GlslWriter : public ShaderWriter, public ShaderVarVisitor, public ShaderVisitor { public: + struct Environment; + using ExtSupportCallback = std::function; + GlslWriter(); GlslWriter(const GlslWriter&) = delete; GlslWriter(GlslWriter&&) = delete; @@ -30,7 +33,15 @@ namespace Nz std::string Generate(const ShaderAst& shader) override; - void SetGlslVersion(unsigned int version); + void SetEnv(Environment environment); + + struct Environment + { + ExtSupportCallback extCallback; + unsigned int glMajorVersion = 3; + unsigned int glMinorVersion = 0; + bool glES = false; + }; private: void Append(ShaderNodes::BuiltinEntry builtin); @@ -82,8 +93,8 @@ namespace Nz }; Context m_context; + Environment m_environment; State* m_currentState; - unsigned int m_glslVersion; }; } diff --git a/src/Nazara/Renderer/GlslWriter.cpp b/src/Nazara/Renderer/GlslWriter.cpp index 8617c522e..b60083f6f 100644 --- a/src/Nazara/Renderer/GlslWriter.cpp +++ b/src/Nazara/Renderer/GlslWriter.cpp @@ -11,8 +11,7 @@ namespace Nz { GlslWriter::GlslWriter() : - m_currentState(nullptr), - m_glslVersion(110) + m_currentState(nullptr) { } @@ -29,22 +28,67 @@ namespace Nz m_currentState = nullptr; }); + unsigned int glslVersion; + if (m_environment.glES) + { + if (m_environment.glMajorVersion >= 3 && m_environment.glMinorVersion >= 2) + glslVersion = 320; + else if (m_environment.glMajorVersion >= 3 && m_environment.glMinorVersion >= 1) + glslVersion = 310; + else if (m_environment.glMajorVersion >= 3 && m_environment.glMinorVersion >= 0) + glslVersion = 300; + else if (m_environment.glMajorVersion >= 2 && m_environment.glMinorVersion >= 0) + glslVersion = 100; + else + throw std::runtime_error("This version of OpenGL ES does not support shaders"); + } + else + { + if (m_environment.glMajorVersion >= 3 && m_environment.glMinorVersion >= 3) + glslVersion = m_environment.glMajorVersion * 100 + m_environment.glMinorVersion * 10; + else if (m_environment.glMajorVersion >= 3 && m_environment.glMinorVersion >= 2) + glslVersion = 150; + else if (m_environment.glMajorVersion >= 3 && m_environment.glMinorVersion >= 1) + glslVersion = 140; + else if (m_environment.glMajorVersion >= 3 && m_environment.glMinorVersion >= 0) + glslVersion = 130; + else if (m_environment.glMajorVersion >= 2 && m_environment.glMinorVersion >= 1) + glslVersion = 120; + else if (m_environment.glMajorVersion >= 2 && m_environment.glMinorVersion >= 0) + glslVersion = 110; + else + throw std::runtime_error("This version of OpenGL does not support shaders"); + } + // Header Append("#version "); - AppendLine(std::to_string(m_glslVersion)); + Append(glslVersion); + if (m_environment.glES) + Append(" es"); + + AppendLine(); AppendLine(); // Extensions std::vector requiredExtensions; - // GL_ARB_shading_language_420pack (required for layout(binding = X)) - if (m_glslVersion < 420 && HasExplicitBinding(shader)) - requiredExtensions.emplace_back("GL_ARB_shading_language_420pack"); + if (!m_environment.glES && m_environment.extCallback) + { + // GL_ARB_shading_language_420pack (required for layout(binding = X)) + if (glslVersion < 420 && HasExplicitBinding(shader)) + { + if (m_environment.extCallback("GL_ARB_shading_language_420pack")) + requiredExtensions.emplace_back("GL_ARB_shading_language_420pack"); + } - // GL_ARB_explicit_uniform_location (required for layout(location = X)) - if (m_glslVersion < 430 && HasExplicitLocation(shader)) - requiredExtensions.emplace_back("GL_ARB_explicit_uniform_location"); + // GL_ARB_separate_shader_objects (required for layout(location = X)) + if (glslVersion < 410 && HasExplicitLocation(shader)) + { + if (m_environment.extCallback("GL_ARB_separate_shader_objects")) + requiredExtensions.emplace_back("GL_ARB_separate_shader_objects"); + } + } if (!requiredExtensions.empty()) { @@ -55,9 +99,12 @@ namespace Nz } // Global variables (uniforms, input and outputs) + const char* inKeyword = (glslVersion >= 130) ? "in" : "varying"; + const char* outKeyword = (glslVersion >= 130) ? "out" : "varying"; + DeclareVariables(shader.GetUniforms(), "uniform", "Uniforms"); - DeclareVariables(shader.GetInputs(), "in", "Inputs"); - DeclareVariables(shader.GetOutputs(), "out", "Outputs"); + DeclareVariables(shader.GetInputs(), inKeyword, "Inputs"); + DeclareVariables(shader.GetOutputs(), outKeyword, "Outputs"); std::size_t functionCount = shader.GetFunctionCount(); if (functionCount > 1) @@ -79,9 +126,9 @@ namespace Nz return state.stream.str(); } - void GlslWriter::SetGlslVersion(unsigned int version) + void GlslWriter::SetEnv(Environment environment) { - m_glslVersion = version; + m_environment = std::move(environment); } void GlslWriter::Append(ShaderNodes::BuiltinEntry builtin)