diff --git a/examples/VulkanTest/main.cpp b/examples/VulkanTest/main.cpp index bfda1e2b2..e42aa41ac 100644 --- a/examples/VulkanTest/main.cpp +++ b/examples/VulkanTest/main.cpp @@ -3,7 +3,7 @@ #include #include -#define SPIRV 1 +#define SPIRV 0 int main() { @@ -44,7 +44,7 @@ int main() return __LINE__; } #else - auto fragmentShader = device->InstantiateShaderStage(Nz::ShaderStageType::Fragment, Nz::ShaderLanguage::GLSL, "resources/shaders/triangle.frag"); + auto fragmentShader = device->InstantiateShaderStage(Nz::ShaderStageType::Fragment, Nz::ShaderLanguage::NazaraBinary, "shader.shader"); if (!fragmentShader) { std::cout << "Failed to instantiate fragment shader" << std::endl; diff --git a/examples/bin/shader.shader b/examples/bin/shader.shader new file mode 100644 index 000000000..7828e1b47 Binary files /dev/null and b/examples/bin/shader.shader differ diff --git a/include/Nazara/Renderer/Enums.hpp b/include/Nazara/Renderer/Enums.hpp index a9b33ba5f..05daee7a5 100644 --- a/include/Nazara/Renderer/Enums.hpp +++ b/include/Nazara/Renderer/Enums.hpp @@ -49,6 +49,7 @@ namespace Nz GLSL, HLSL, MSL, + NazaraBinary, SpirV }; diff --git a/src/Nazara/OpenGLRenderer/OpenGLShaderStage.cpp b/src/Nazara/OpenGLRenderer/OpenGLShaderStage.cpp index 3364e4f11..561a1d196 100644 --- a/src/Nazara/OpenGLRenderer/OpenGLShaderStage.cpp +++ b/src/Nazara/OpenGLRenderer/OpenGLShaderStage.cpp @@ -4,7 +4,11 @@ #include #include +#include #include +#include +#include +#include #include #include @@ -22,6 +26,34 @@ namespace Nz m_shader.Compile(); break; + case ShaderLanguage::NazaraBinary: + { + ByteStream byteStream(source, sourceSize); + auto shader = Nz::UnserializeShader(byteStream); + + const auto& context = device.GetReferenceContext(); + const auto& contextParams = context.GetParams(); + + GlslWriter::Environment env; + env.glES = false; + //env.glES = (contextParams.type == GL::ContextType::OpenGL_ES); + env.glMajorVersion = contextParams.glMajorVersion; + env.glMinorVersion = contextParams.glMinorVersion; + env.extCallback = [&](const std::string_view& ext) + { + return context.IsExtensionSupported(std::string(ext)); + }; + + GlslWriter writer; + writer.SetEnv(env); + + std::string code = writer.Generate(shader); + + m_shader.SetSource(code.data(), code.size()); + m_shader.Compile(); + break; + } + case ShaderLanguage::SpirV: { if (!device.GetReferenceContext().IsExtensionSupported(GL::Extension::SpirV))