Renderer/GlslWriter: Add environment
This commit is contained in:
parent
736ca1c409
commit
66a98b234f
|
|
@ -23,6 +23,9 @@ namespace Nz
|
||||||
class NAZARA_RENDERER_API GlslWriter : public ShaderWriter, public ShaderVarVisitor, public ShaderVisitor
|
class NAZARA_RENDERER_API GlslWriter : public ShaderWriter, public ShaderVarVisitor, public ShaderVisitor
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
struct Environment;
|
||||||
|
using ExtSupportCallback = std::function<bool(const std::string_view& name)>;
|
||||||
|
|
||||||
GlslWriter();
|
GlslWriter();
|
||||||
GlslWriter(const GlslWriter&) = delete;
|
GlslWriter(const GlslWriter&) = delete;
|
||||||
GlslWriter(GlslWriter&&) = delete;
|
GlslWriter(GlslWriter&&) = delete;
|
||||||
|
|
@ -30,7 +33,15 @@ namespace Nz
|
||||||
|
|
||||||
std::string Generate(const ShaderAst& shader) override;
|
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:
|
private:
|
||||||
void Append(ShaderNodes::BuiltinEntry builtin);
|
void Append(ShaderNodes::BuiltinEntry builtin);
|
||||||
|
|
@ -82,8 +93,8 @@ namespace Nz
|
||||||
};
|
};
|
||||||
|
|
||||||
Context m_context;
|
Context m_context;
|
||||||
|
Environment m_environment;
|
||||||
State* m_currentState;
|
State* m_currentState;
|
||||||
unsigned int m_glslVersion;
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,8 +11,7 @@
|
||||||
namespace Nz
|
namespace Nz
|
||||||
{
|
{
|
||||||
GlslWriter::GlslWriter() :
|
GlslWriter::GlslWriter() :
|
||||||
m_currentState(nullptr),
|
m_currentState(nullptr)
|
||||||
m_glslVersion(110)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -29,22 +28,67 @@ namespace Nz
|
||||||
m_currentState = nullptr;
|
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
|
// Header
|
||||||
Append("#version ");
|
Append("#version ");
|
||||||
AppendLine(std::to_string(m_glslVersion));
|
Append(glslVersion);
|
||||||
|
if (m_environment.glES)
|
||||||
|
Append(" es");
|
||||||
|
|
||||||
|
AppendLine();
|
||||||
AppendLine();
|
AppendLine();
|
||||||
|
|
||||||
// Extensions
|
// Extensions
|
||||||
|
|
||||||
std::vector<std::string> requiredExtensions;
|
std::vector<std::string> requiredExtensions;
|
||||||
|
|
||||||
// GL_ARB_shading_language_420pack (required for layout(binding = X))
|
if (!m_environment.glES && m_environment.extCallback)
|
||||||
if (m_glslVersion < 420 && HasExplicitBinding(shader))
|
{
|
||||||
requiredExtensions.emplace_back("GL_ARB_shading_language_420pack");
|
// 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))
|
// GL_ARB_separate_shader_objects (required for layout(location = X))
|
||||||
if (m_glslVersion < 430 && HasExplicitLocation(shader))
|
if (glslVersion < 410 && HasExplicitLocation(shader))
|
||||||
requiredExtensions.emplace_back("GL_ARB_explicit_uniform_location");
|
{
|
||||||
|
if (m_environment.extCallback("GL_ARB_separate_shader_objects"))
|
||||||
|
requiredExtensions.emplace_back("GL_ARB_separate_shader_objects");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!requiredExtensions.empty())
|
if (!requiredExtensions.empty())
|
||||||
{
|
{
|
||||||
|
|
@ -55,9 +99,12 @@ namespace Nz
|
||||||
}
|
}
|
||||||
|
|
||||||
// Global variables (uniforms, input and outputs)
|
// 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.GetUniforms(), "uniform", "Uniforms");
|
||||||
DeclareVariables(shader.GetInputs(), "in", "Inputs");
|
DeclareVariables(shader.GetInputs(), inKeyword, "Inputs");
|
||||||
DeclareVariables(shader.GetOutputs(), "out", "Outputs");
|
DeclareVariables(shader.GetOutputs(), outKeyword, "Outputs");
|
||||||
|
|
||||||
std::size_t functionCount = shader.GetFunctionCount();
|
std::size_t functionCount = shader.GetFunctionCount();
|
||||||
if (functionCount > 1)
|
if (functionCount > 1)
|
||||||
|
|
@ -79,9 +126,9 @@ namespace Nz
|
||||||
return state.stream.str();
|
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)
|
void GlslWriter::Append(ShaderNodes::BuiltinEntry builtin)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue