Graphics: Replace runtime structs offsets by compile-time struct offsets

now that nzsl::FieldOffsets is constexpr this is possible
This commit is contained in:
SirLynix
2023-09-06 13:13:47 +02:00
committed by Jérôme Leclercq
parent 929b599337
commit e10f15243d
8 changed files with 287 additions and 171 deletions

View File

@@ -0,0 +1,139 @@
// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com)
// This file is part of the "Nazara Engine - Graphics module"
// For conditions of distribution and use, see copyright notice in Config.hpp
#pragma once
#ifndef NAZARA_GRAPHICS_PREDEFINEDSHADERSTRUCTBUILDER_HPP
#define NAZARA_GRAPHICS_PREDEFINEDSHADERSTRUCTBUILDER_HPP
#include <Nazara/Graphics/Config.hpp>
#include <NZSL/Math/FieldOffsets.hpp>
namespace Nz
{
struct NAZARA_GRAPHICS_API PredefinedDirectionalLightData
{
nzsl::FieldOffsets fieldOffsets;
std::size_t colorOffset;
std::size_t directionOffset;
std::size_t invShadowMapSizeOffset;
std::size_t ambientFactorOffset;
std::size_t diffuseFactorOffset;
std::size_t cascadeCountOffset;
std::size_t cascadeFarPlanesOffset;
std::size_t cascadeViewProjMatricesOffset;
std::size_t totalSize;
static constexpr std::size_t MaxLightCascadeCount = 4;
static constexpr PredefinedDirectionalLightData Build();
};
struct NAZARA_GRAPHICS_API PredefinedPointLightData
{
nzsl::FieldOffsets fieldOffsets;
std::size_t colorOffset;
std::size_t positionOffset;
std::size_t invShadowMapSizeOffset;
std::size_t ambientFactorOffset;
std::size_t diffuseFactorOffset;
std::size_t radiusOffset;
std::size_t invRadiusOffset;
std::size_t totalSize;
static constexpr PredefinedPointLightData Build();
};
struct NAZARA_GRAPHICS_API PredefinedSpotLightData
{
nzsl::FieldOffsets fieldOffsets;
std::size_t colorOffset;
std::size_t directionOffset;
std::size_t positionOffset;
std::size_t invShadowMapSizeOffset;
std::size_t ambientFactorOffset;
std::size_t diffuseFactorOffset;
std::size_t innerAngleOffset;
std::size_t outerAngleOffset;
std::size_t invRadiusOffset;
std::size_t viewProjMatrixOffset;
std::size_t totalSize;
static constexpr PredefinedSpotLightData Build();
};
struct NAZARA_GRAPHICS_API PredefinedLightData
{
nzsl::FieldOffsets fieldOffsets;
std::size_t directionalLightsOffset;
std::size_t pointLightsOffset;
std::size_t spotLightsOffset;
std::size_t directionalLightCountOffset;
std::size_t pointLightCountOffset;
std::size_t spotLightCountOffset;
std::size_t totalSize;
static constexpr std::size_t MaxLightCount = 3;
static constexpr PredefinedLightData Build();
};
struct NAZARA_GRAPHICS_API PredefinedInstanceData
{
nzsl::FieldOffsets fieldOffsets;
std::size_t invWorldMatrixOffset;
std::size_t worldMatrixOffset;
std::size_t totalSize;
static constexpr PredefinedInstanceData Build();
};
struct NAZARA_GRAPHICS_API PredefinedSkeletalData
{
nzsl::FieldOffsets fieldOffsets;
std::size_t jointMatricesOffset;
std::size_t totalSize;
static constexpr std::size_t MaxMatricesCount = 256;
static constexpr PredefinedSkeletalData Build();
};
struct NAZARA_GRAPHICS_API PredefinedViewerData
{
nzsl::FieldOffsets fieldOffsets;
std::size_t eyePositionOffset;
std::size_t invProjMatrixOffset;
std::size_t invTargetSizeOffset;
std::size_t invViewMatrixOffset;
std::size_t invViewProjMatrixOffset;
std::size_t projMatrixOffset;
std::size_t targetSizeOffset;
std::size_t viewMatrixOffset;
std::size_t viewProjMatrixOffset;
std::size_t nearPlaneOffset;
std::size_t farPlaneOffset;
std::size_t totalSize;
static constexpr PredefinedViewerData Build();
};
}
#include <Nazara/Graphics/PredefinedShaderStructBuilder.inl>
#endif // NAZARA_GRAPHICS_PREDEFINEDSHADERSTRUCTBUILDER_HPP

View File

@@ -0,0 +1,130 @@
// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com)
// This file is part of the "Nazara Engine - Graphics module"
// For conditions of distribution and use, see copyright notice in Config.hpp
#include <Nazara/Graphics/Debug.hpp>
namespace Nz
{
// PredefinedDirectionalLightData
constexpr PredefinedDirectionalLightData PredefinedDirectionalLightData::Build()
{
PredefinedDirectionalLightData lightData = { nzsl::FieldOffsets(nzsl::StructLayout::Std140) };
lightData.colorOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::Float3);
lightData.directionOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::Float3);
lightData.invShadowMapSizeOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::Float2);
lightData.ambientFactorOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::Float1);
lightData.diffuseFactorOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::Float1);
lightData.cascadeCountOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::UInt1);
lightData.cascadeFarPlanesOffset = lightData.fieldOffsets.AddFieldArray(nzsl::StructFieldType::Float1, MaxLightCascadeCount);
lightData.cascadeViewProjMatricesOffset = lightData.fieldOffsets.AddMatrixArray(nzsl::StructFieldType::Float1, 4, 4, true, MaxLightCascadeCount);
lightData.totalSize = lightData.fieldOffsets.GetAlignedSize();
return lightData;
}
// PredefinedPointLightData
constexpr PredefinedPointLightData PredefinedPointLightData::Build()
{
PredefinedPointLightData lightData = { nzsl::FieldOffsets(nzsl::StructLayout::Std140) };
lightData.colorOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::Float3);
lightData.positionOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::Float3);
lightData.invShadowMapSizeOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::Float2);
lightData.ambientFactorOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::Float1);
lightData.diffuseFactorOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::Float1);
lightData.radiusOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::Float1);
lightData.invRadiusOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::Float1);
lightData.totalSize = lightData.fieldOffsets.GetAlignedSize();
return lightData;
}
// PredefinedSpotLightData
constexpr PredefinedSpotLightData PredefinedSpotLightData::Build()
{
PredefinedSpotLightData lightData = { nzsl::FieldOffsets(nzsl::StructLayout::Std140) };
lightData.colorOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::Float3);
lightData.directionOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::Float3);
lightData.positionOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::Float3);
lightData.invShadowMapSizeOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::Float2);
lightData.ambientFactorOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::Float1);
lightData.diffuseFactorOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::Float1);
lightData.innerAngleOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::Float1);
lightData.outerAngleOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::Float1);
lightData.invRadiusOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::Float1);
lightData.viewProjMatrixOffset = lightData.fieldOffsets.AddMatrix(nzsl::StructFieldType::Float1, 4, 4, true);
lightData.totalSize = lightData.fieldOffsets.GetAlignedSize();
return lightData;
}
// PredefinedSpotLightData
constexpr PredefinedLightData PredefinedLightData::Build()
{
constexpr PredefinedDirectionalLightData DirectionalLight = PredefinedDirectionalLightData::Build();
constexpr PredefinedPointLightData PointLight = PredefinedPointLightData::Build();
constexpr PredefinedSpotLightData SpotLight = PredefinedSpotLightData::Build();
PredefinedLightData lightData = { nzsl::FieldOffsets(nzsl::StructLayout::Std140) };
lightData.directionalLightsOffset = lightData.fieldOffsets.AddStructArray(DirectionalLight.fieldOffsets, MaxLightCount);
lightData.pointLightsOffset = lightData.fieldOffsets.AddStructArray(PointLight.fieldOffsets, MaxLightCount);
lightData.spotLightsOffset = lightData.fieldOffsets.AddStructArray(SpotLight.fieldOffsets, MaxLightCount);
lightData.directionalLightCountOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::UInt1);
lightData.pointLightCountOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::UInt1);
lightData.spotLightCountOffset = lightData.fieldOffsets.AddField(nzsl::StructFieldType::UInt1);
lightData.totalSize = lightData.fieldOffsets.GetAlignedSize();
return lightData;
}
// PredefinedSkeletalData
constexpr PredefinedInstanceData PredefinedInstanceData::Build()
{
PredefinedInstanceData instanceData = { nzsl::FieldOffsets(nzsl::StructLayout::Std140) };
instanceData.worldMatrixOffset = instanceData.fieldOffsets.AddMatrix(nzsl::StructFieldType::Float1, 4, 4, true);
instanceData.invWorldMatrixOffset = instanceData.fieldOffsets.AddMatrix(nzsl::StructFieldType::Float1, 4, 4, true);
instanceData.totalSize = instanceData.fieldOffsets.GetAlignedSize();
return instanceData;
}
// PredefinedSkeletalData
constexpr PredefinedSkeletalData PredefinedSkeletalData::Build()
{
PredefinedSkeletalData skeletalData = { nzsl::FieldOffsets(nzsl::StructLayout::Std140) };
skeletalData.jointMatricesOffset = skeletalData.fieldOffsets.AddMatrixArray(nzsl::StructFieldType::Float1, 4, 4, true, MaxMatricesCount);
skeletalData.totalSize = skeletalData.fieldOffsets.GetAlignedSize();
return skeletalData;
}
// PredefinedViewerData
constexpr PredefinedViewerData PredefinedViewerData::Build()
{
PredefinedViewerData viewerData = { nzsl::FieldOffsets(nzsl::StructLayout::Std140) };
viewerData.projMatrixOffset = viewerData.fieldOffsets.AddMatrix(nzsl::StructFieldType::Float1, 4, 4, true);
viewerData.invProjMatrixOffset = viewerData.fieldOffsets.AddMatrix(nzsl::StructFieldType::Float1, 4, 4, true);
viewerData.viewMatrixOffset = viewerData.fieldOffsets.AddMatrix(nzsl::StructFieldType::Float1, 4, 4, true);
viewerData.invViewMatrixOffset = viewerData.fieldOffsets.AddMatrix(nzsl::StructFieldType::Float1, 4, 4, true);
viewerData.viewProjMatrixOffset = viewerData.fieldOffsets.AddMatrix(nzsl::StructFieldType::Float1, 4, 4, true);
viewerData.invViewProjMatrixOffset = viewerData.fieldOffsets.AddMatrix(nzsl::StructFieldType::Float1, 4, 4, true);
viewerData.targetSizeOffset = viewerData.fieldOffsets.AddField(nzsl::StructFieldType::Float2);
viewerData.invTargetSizeOffset = viewerData.fieldOffsets.AddField(nzsl::StructFieldType::Float2);
viewerData.eyePositionOffset = viewerData.fieldOffsets.AddField(nzsl::StructFieldType::Float3);
viewerData.nearPlaneOffset = viewerData.fieldOffsets.AddField(nzsl::StructFieldType::Float1);
viewerData.farPlaneOffset = viewerData.fieldOffsets.AddField(nzsl::StructFieldType::Float1);
viewerData.totalSize = viewerData.fieldOffsets.GetAlignedSize();
return viewerData;
}
}
#include <Nazara/Graphics/DebugOff.hpp>

View File

@@ -7,73 +7,17 @@
#ifndef NAZARA_GRAPHICS_PREDEFINEDSHADERSTRUCTS_HPP
#define NAZARA_GRAPHICS_PREDEFINEDSHADERSTRUCTS_HPP
#include <Nazara/Graphics/Config.hpp>
#include <Nazara/Graphics/MaterialSettings.hpp>
#include <array>
#include <Nazara/Graphics/PredefinedShaderStructBuilder.hpp>
namespace Nz
{
struct NAZARA_GRAPHICS_API PredefinedLightData
{
struct Light
{
std::size_t type;
std::size_t color;
std::size_t factor;
std::size_t parameter1;
std::size_t parameter2;
std::size_t parameter3;
std::size_t shadowMapSize;
std::size_t viewProjMatrix;
};
std::size_t lightsOffset;
std::size_t lightCountOffset;
std::size_t lightSize;
std::size_t totalSize;
Light lightMemberOffsets;
static constexpr std::size_t MaxLightCount = 3;
static PredefinedLightData GetOffsets();
};
struct NAZARA_GRAPHICS_API PredefinedInstanceData
{
std::size_t invWorldMatrixOffset;
std::size_t totalSize;
std::size_t worldMatrixOffset;
static PredefinedInstanceData GetOffsets();
};
struct NAZARA_GRAPHICS_API PredefinedSkeletalData
{
std::size_t totalSize;
std::size_t jointMatricesOffset;
static constexpr std::size_t MaxMatricesCount = 256;
static PredefinedSkeletalData GetOffsets();
};
struct NAZARA_GRAPHICS_API PredefinedViewerData
{
std::size_t eyePositionOffset;
std::size_t invProjMatrixOffset;
std::size_t invTargetSizeOffset;
std::size_t invViewMatrixOffset;
std::size_t invViewProjMatrixOffset;
std::size_t projMatrixOffset;
std::size_t targetSizeOffset;
std::size_t totalSize;
std::size_t viewMatrixOffset;
std::size_t viewProjMatrixOffset;
static PredefinedViewerData GetOffsets();
};
static constexpr PredefinedDirectionalLightData PredefinedDirectionalLightOffsets = PredefinedDirectionalLightData::Build();
static constexpr PredefinedPointLightData PredefinedPointLightOffsets = PredefinedPointLightData::Build();
static constexpr PredefinedSpotLightData PredefinedSpotLightOffsets = PredefinedSpotLightData::Build();
static constexpr PredefinedLightData PredefinedLightOffsets = PredefinedLightData::Build();
static constexpr PredefinedInstanceData PredefinedInstanceOffsets = PredefinedInstanceData::Build();
static constexpr PredefinedSkeletalData PredefinedSkeletalOffsets = PredefinedSkeletalData::Build();
static constexpr PredefinedViewerData PredefinedViewerOffsets = PredefinedViewerData::Build();
}
#include <Nazara/Graphics/PredefinedShaderStructs.inl>
#endif // NAZARA_GRAPHICS_PREDEFINEDSHADERSTRUCTS_HPP

View File

@@ -1,11 +0,0 @@
// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com)
// This file is part of the "Nazara Engine - Graphics module"
// For conditions of distribution and use, see copyright notice in Config.hpp
#include <Nazara/Graphics/Debug.hpp>
namespace Nz
{
}
#include <Nazara/Graphics/DebugOff.hpp>