From 08c2f711b04adaef005adeb879d30a6d3ed4d91e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Mon, 15 Feb 2021 18:16:19 +0100 Subject: [PATCH] Graphics/Material: Add UpdateBuffers --- examples/GraphicsTest/main.cpp | 10 +++++----- include/Nazara/Graphics/Material.hpp | 4 ++++ src/Nazara/Graphics/Material.cpp | 18 ++++++++++++++++++ 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/examples/GraphicsTest/main.cpp b/examples/GraphicsTest/main.cpp index e967a930a..b5578fd88 100644 --- a/examples/GraphicsTest/main.cpp +++ b/examples/GraphicsTest/main.cpp @@ -106,16 +106,12 @@ int main() const Nz::BasicMaterial::UniformOffsets& materialSettingOffsets = Nz::BasicMaterial::GetOffsets(); std::vector viewerDataBuffer(viewerUboOffsets.totalSize); - std::vector materialSettings(materialSettingOffsets.totalSize); Nz::Vector2ui windowSize = window.GetSize(); Nz::AccessByOffset(viewerDataBuffer.data(), viewerUboOffsets.viewMatrixOffset) = Nz::Matrix4f::Translate(Nz::Vector3f::Backward() * 1); Nz::AccessByOffset(viewerDataBuffer.data(), viewerUboOffsets.projMatrixOffset) = Nz::Matrix4f::Perspective(70.f, float(windowSize.x) / windowSize.y, 0.1f, 1000.f); - Nz::AccessByOffset(materialSettings.data(), materialSettingOffsets.alphaThreshold) = 0.5f; - Nz::AccessByOffset(materialSettings.data(), materialSettingOffsets.diffuseColor) = Nz::Vector4f(1.f, 1.f, 1.f, 1.f); - std::vector instanceDataBuffer(instanceUboOffsets.totalSize); Nz::ModelInstance modelInstance(material->GetSettings()); @@ -283,7 +279,8 @@ int main() if (viewerUboUpdate) { - auto& allocation = frame.GetUploadPool().Allocate(viewerDataBuffer.size()); + Nz::UploadPool& uploadPool = frame.GetUploadPool(); + auto& allocation = uploadPool.Allocate(viewerDataBuffer.size()); std::memcpy(allocation.mappedPtr, viewerDataBuffer.data(), viewerDataBuffer.size()); @@ -293,6 +290,9 @@ int main() { builder.PreTransferBarrier(); builder.CopyBuffer(allocation, viewerDataUBO.get()); + + material->UpdateBuffers(uploadPool, builder); + builder.PostTransferBarrier(); } builder.EndDebugRegion(); diff --git a/include/Nazara/Graphics/Material.hpp b/include/Nazara/Graphics/Material.hpp index 7cfb01008..71a120f32 100644 --- a/include/Nazara/Graphics/Material.hpp +++ b/include/Nazara/Graphics/Material.hpp @@ -29,6 +29,9 @@ namespace Nz { + class CommandBufferBuilder; + class UploadPool; + class NAZARA_GRAPHICS_API Material : public RefCounted, public Resource { public: @@ -98,6 +101,7 @@ namespace Nz inline void SetTextureSampler(std::size_t textureIndex, TextureSamplerInfo samplerInfo); inline void SetUniformBuffer(std::size_t bufferIndex, std::shared_ptr uniformBuffer); + void UpdateBuffers(UploadPool& uploadPool, CommandBufferBuilder& builder); void UpdateShaderBinding(ShaderBinding& shaderBinding) const; // Signals: diff --git a/src/Nazara/Graphics/Material.cpp b/src/Nazara/Graphics/Material.cpp index 77ed2dd3c..f0170b1c2 100644 --- a/src/Nazara/Graphics/Material.cpp +++ b/src/Nazara/Graphics/Material.cpp @@ -5,7 +5,9 @@ #include #include #include +#include #include +#include #include #include @@ -53,6 +55,22 @@ namespace Nz } } + void Material::UpdateBuffers(UploadPool& uploadPool, CommandBufferBuilder& builder) + { + for (auto& ubo : m_uniformBuffers) + { + if (ubo.dataInvalidated) + { + auto& allocation = uploadPool.Allocate(ubo.data.size()); + std::memcpy(allocation.mappedPtr, ubo.data.data(), ubo.data.size()); + + builder.CopyBuffer(allocation, ubo.buffer.get()); + + ubo.dataInvalidated = false; + } + } + } + void Material::UpdateShaderBinding(ShaderBinding& shaderBinding) const { // TODO: Use StackVector