Graphics/Material: Add UpdateBuffers

This commit is contained in:
Jérôme Leclercq 2021-02-15 18:16:19 +01:00
parent d058a127e1
commit 08c2f711b0
3 changed files with 27 additions and 5 deletions

View File

@ -106,16 +106,12 @@ int main()
const Nz::BasicMaterial::UniformOffsets& materialSettingOffsets = Nz::BasicMaterial::GetOffsets();
std::vector<std::uint8_t> viewerDataBuffer(viewerUboOffsets.totalSize);
std::vector<std::uint8_t> materialSettings(materialSettingOffsets.totalSize);
Nz::Vector2ui windowSize = window.GetSize();
Nz::AccessByOffset<Nz::Matrix4f&>(viewerDataBuffer.data(), viewerUboOffsets.viewMatrixOffset) = Nz::Matrix4f::Translate(Nz::Vector3f::Backward() * 1);
Nz::AccessByOffset<Nz::Matrix4f&>(viewerDataBuffer.data(), viewerUboOffsets.projMatrixOffset) = Nz::Matrix4f::Perspective(70.f, float(windowSize.x) / windowSize.y, 0.1f, 1000.f);
Nz::AccessByOffset<float&>(materialSettings.data(), materialSettingOffsets.alphaThreshold) = 0.5f;
Nz::AccessByOffset<Nz::Vector4f&>(materialSettings.data(), materialSettingOffsets.diffuseColor) = Nz::Vector4f(1.f, 1.f, 1.f, 1.f);
std::vector<std::uint8_t> 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();

View File

@ -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<AbstractBuffer> uniformBuffer);
void UpdateBuffers(UploadPool& uploadPool, CommandBufferBuilder& builder);
void UpdateShaderBinding(ShaderBinding& shaderBinding) const;
// Signals:

View File

@ -5,7 +5,9 @@
#include <Nazara/Graphics/Material.hpp>
#include <Nazara/Core/ErrorFlags.hpp>
#include <Nazara/Graphics/BasicMaterial.hpp>
#include <Nazara/Renderer/CommandBufferBuilder.hpp>
#include <Nazara/Renderer/Renderer.hpp>
#include <Nazara/Renderer/UploadPool.hpp>
#include <Nazara/Utility/MaterialData.hpp>
#include <Nazara/Graphics/Debug.hpp>
@ -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