diff --git a/assets/shaders/bloom_bright.nzsl b/assets/shaders/bloom_bright.nzsl index 0e91b75e5..e1df793a5 100644 --- a/assets/shaders/bloom_bright.nzsl +++ b/assets/shaders/bloom_bright.nzsl @@ -11,7 +11,6 @@ external struct FragIn { - [builtin(fragcoord)] fragcoord: vec4[f32], [location(0)] uv: vec2[f32] } diff --git a/assets/shaders/lighting.nzsl b/assets/shaders/lighting.nzsl index 8417041fd..dd3577ebb 100644 --- a/assets/shaders/lighting.nzsl +++ b/assets/shaders/lighting.nzsl @@ -46,7 +46,7 @@ external struct FragIn { - [builtin(fragcoord)] fragcoord: vec4[f32] + [builtin(frag_coord)] fragcoord: vec4[f32] } struct FragOut diff --git a/assets/shaders/skybox.nzsl b/assets/shaders/skybox.nzsl index 4e406490e..6fcd8ddf2 100644 --- a/assets/shaders/skybox.nzsl +++ b/assets/shaders/skybox.nzsl @@ -18,7 +18,7 @@ struct VertOut struct FragOut { [location(0)] color: vec4[f32], - [builtin(fragdepth)] depth: f32 + [builtin(frag_depth)] depth: f32 } [entry(frag)] diff --git a/examples/DeferredShading/main.cpp b/examples/DeferredShading/main.cpp index 4f6ed1b1e..04c3d9c3e 100644 --- a/examples/DeferredShading/main.cpp +++ b/examples/DeferredShading/main.cpp @@ -5,7 +5,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/examples/RenderTest/main.cpp b/examples/RenderTest/main.cpp index 84ecaef29..ef50fc282 100644 --- a/examples/RenderTest/main.cpp +++ b/examples/RenderTest/main.cpp @@ -4,7 +4,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/include/Nazara/Graphics/UberShader.hpp b/include/Nazara/Graphics/UberShader.hpp index 2c8b16b0f..db5a8e23a 100644 --- a/include/Nazara/Graphics/UberShader.hpp +++ b/include/Nazara/Graphics/UberShader.hpp @@ -12,7 +12,7 @@ #include #include #include -#include +#include #include #include @@ -28,7 +28,7 @@ namespace Nz using ConfigCallback = std::function& vertexBuffers)>; UberShader(nzsl::ShaderStageTypeFlags shaderStages, std::string moduleName); - UberShader(nzsl::ShaderStageTypeFlags shaderStages, nzsl::ShaderModuleResolver& moduleResolver, std::string moduleName); + UberShader(nzsl::ShaderStageTypeFlags shaderStages, nzsl::ModuleResolver& moduleResolver, std::string moduleName); UberShader(nzsl::ShaderStageTypeFlags shaderStages, nzsl::Ast::ModulePtr shaderModule); ~UberShader() = default; @@ -66,7 +66,7 @@ namespace Nz private: nzsl::Ast::ModulePtr Validate(const nzsl::Ast::Module& module, std::unordered_map* options); - NazaraSlot(nzsl::ShaderModuleResolver, OnModuleUpdated, m_onShaderModuleUpdated); + NazaraSlot(nzsl::ModuleResolver, OnModuleUpdated, m_onShaderModuleUpdated); std::unordered_map, ConfigHasher, ConfigEqual> m_combinations; std::unordered_map m_optionIndexByName; diff --git a/include/Nazara/OpenGLRenderer/Wrapper/CoreFunctions.hpp b/include/Nazara/OpenGLRenderer/Wrapper/CoreFunctions.hpp index 372e230fd..12fef446a 100644 --- a/include/Nazara/OpenGLRenderer/Wrapper/CoreFunctions.hpp +++ b/include/Nazara/OpenGLRenderer/Wrapper/CoreFunctions.hpp @@ -160,6 +160,7 @@ typedef void (GL_APIENTRYP PFNGLSPECIALIZESHADERPROC) (GLuint shader, const GLch cb(glUniform3iv, PFNGLUNIFORM3IVPROC) \ cb(glUniform4fv, PFNGLUNIFORM4FVPROC) \ cb(glUniform4iv, PFNGLUNIFORM4IVPROC) \ + cb(glUniformBlockBinding, PFNGLUNIFORMBLOCKBINDINGPROC) \ cb(glUniformMatrix4fv, PFNGLUNIFORMMATRIX4FVPROC) \ cb(glUnmapBuffer, PFNGLUNMAPBUFFERPROC) \ cb(glUseProgram, PFNGLUSEPROGRAMPROC) \ diff --git a/include/Nazara/OpenGLRenderer/Wrapper/Program.hpp b/include/Nazara/OpenGLRenderer/Wrapper/Program.hpp index aba5003d7..e6f570b94 100644 --- a/include/Nazara/OpenGLRenderer/Wrapper/Program.hpp +++ b/include/Nazara/OpenGLRenderer/Wrapper/Program.hpp @@ -44,6 +44,7 @@ namespace Nz::GL inline void Link(); inline void Uniform(GLint uniformLocation, float value) const; + inline void UniformBlockBinding(GLuint uniformBlockIndex, GLuint uniformBlockBinding) const; Program& operator=(const Program&) = delete; Program& operator=(Program&&) noexcept = default; diff --git a/include/Nazara/OpenGLRenderer/Wrapper/Program.inl b/include/Nazara/OpenGLRenderer/Wrapper/Program.inl index da90fcf38..e5a417fb2 100644 --- a/include/Nazara/OpenGLRenderer/Wrapper/Program.inl +++ b/include/Nazara/OpenGLRenderer/Wrapper/Program.inl @@ -203,6 +203,14 @@ namespace Nz::GL context.glUniform1f(uniformLocation, value); } + inline void Program::UniformBlockBinding(GLuint uniformBlockIndex, GLuint uniformBlockBinding) const + { + assert(m_objectId); + + const Context& context = EnsureDeviceContext(); + context.glUniformBlockBinding(m_objectId, uniformBlockIndex, uniformBlockBinding); + } + inline GLuint Program::CreateHelper(OpenGLDevice& /*device*/, const Context& context) { return context.glCreateProgram(); diff --git a/src/Nazara/Graphics/BasicMaterial.cpp b/src/Nazara/Graphics/BasicMaterial.cpp index 830b0768f..dad5a9fc8 100644 --- a/src/Nazara/Graphics/BasicMaterial.cpp +++ b/src/Nazara/Graphics/BasicMaterial.cpp @@ -11,7 +11,7 @@ #include #include #include -#include +#include #include #include diff --git a/src/Nazara/Graphics/DepthMaterial.cpp b/src/Nazara/Graphics/DepthMaterial.cpp index b92b5c2ae..40034e045 100644 --- a/src/Nazara/Graphics/DepthMaterial.cpp +++ b/src/Nazara/Graphics/DepthMaterial.cpp @@ -4,7 +4,7 @@ #include #include -#include +#include #include namespace Nz diff --git a/src/Nazara/Graphics/PhongLightingMaterial.cpp b/src/Nazara/Graphics/PhongLightingMaterial.cpp index 1a1b9f5d4..5ffd2bd35 100644 --- a/src/Nazara/Graphics/PhongLightingMaterial.cpp +++ b/src/Nazara/Graphics/PhongLightingMaterial.cpp @@ -10,7 +10,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/src/Nazara/Graphics/UberShader.cpp b/src/Nazara/Graphics/UberShader.cpp index f86e7a813..77fad9f2d 100644 --- a/src/Nazara/Graphics/UberShader.cpp +++ b/src/Nazara/Graphics/UberShader.cpp @@ -19,7 +19,7 @@ namespace Nz { } - UberShader::UberShader(nzsl::ShaderStageTypeFlags shaderStages, nzsl::ShaderModuleResolver& moduleResolver, std::string moduleName) : + UberShader::UberShader(nzsl::ShaderStageTypeFlags shaderStages, nzsl::ModuleResolver& moduleResolver, std::string moduleName) : m_shaderStages(shaderStages) { m_shaderModule = moduleResolver.Resolve(moduleName); @@ -27,7 +27,7 @@ namespace Nz m_shaderModule = Validate(*m_shaderModule, &m_optionIndexByName); - m_onShaderModuleUpdated.Connect(moduleResolver.OnModuleUpdated, [this, name = std::move(moduleName)](nzsl::ShaderModuleResolver* resolver, const std::string& updatedModuleName) + m_onShaderModuleUpdated.Connect(moduleResolver.OnModuleUpdated, [this, name = std::move(moduleName)](nzsl::ModuleResolver* resolver, const std::string& updatedModuleName) { if (updatedModuleName != name) return; diff --git a/src/Nazara/OpenGLRenderer/OpenGLRenderPipeline.cpp b/src/Nazara/OpenGLRenderer/OpenGLRenderPipeline.cpp index 55ef5bb3f..e0e9c3e70 100644 --- a/src/Nazara/OpenGLRenderer/OpenGLRenderPipeline.cpp +++ b/src/Nazara/OpenGLRenderer/OpenGLRenderPipeline.cpp @@ -67,7 +67,7 @@ namespace Nz if (!m_program.GetLinkStatus(&errLog)) throw std::runtime_error("failed to link program: " + errLog); - m_flipYUniformLocation = m_program.GetUniformLocation(nzsl::GlslWriter::GetFlipYUniformName()); + m_flipYUniformLocation = m_program.GetUniformLocation(nzsl::GlslWriter::GetFlipYUniformName().data()); if (m_flipYUniformLocation != -1) m_program.Uniform(m_flipYUniformLocation, 1.f); } diff --git a/src/Nazara/OpenGLRenderer/OpenGLShaderModule.cpp b/src/Nazara/OpenGLRenderer/OpenGLShaderModule.cpp index ce5fa9317..e3b5fe589 100644 --- a/src/Nazara/OpenGLRenderer/OpenGLShaderModule.cpp +++ b/src/Nazara/OpenGLRenderer/OpenGLShaderModule.cpp @@ -5,8 +5,8 @@ #include #include #include -#include -#include +#include +#include #include #include #include @@ -117,8 +117,17 @@ namespace Nz shader.SetSource(arg.sourceCode.data(), GLint(arg.sourceCode.size())); else if constexpr (std::is_same_v) { - std::string code = writer.Generate(shaderEntry.stage, *arg.ast, bindingMapping, m_states); - shader.SetSource(code.data(), GLint(code.size())); + nzsl::GlslWriter::Output output = writer.Generate(shaderEntry.stage, *arg.ast, bindingMapping, m_states); + shader.SetSource(output.code.data(), GLint(output.code.size())); + + for (const auto& [name, bindingPoint] : output.explicitUniformBlockBinding) + { + GLuint blockIndex = program.GetUniformBlockIndex(name); + if (blockIndex == GL_INVALID_INDEX) + continue; + + program.UniformBlockBinding(blockIndex, bindingPoint); + } } else static_assert(AlwaysFalse::value, "non-exhaustive visitor"); diff --git a/src/Nazara/VulkanRenderer/VulkanShaderModule.cpp b/src/Nazara/VulkanRenderer/VulkanShaderModule.cpp index 07e782247..1f44c6d3d 100644 --- a/src/Nazara/VulkanRenderer/VulkanShaderModule.cpp +++ b/src/Nazara/VulkanRenderer/VulkanShaderModule.cpp @@ -3,8 +3,8 @@ // For conditions of distribution and use, see copyright notice in Config.hpp #include -#include -#include +#include +#include #include #include #include