Move FieldOffsets class to Shader module and remove Utility dependency

This commit is contained in:
SirLynix
2022-04-04 19:22:18 +02:00
parent 998bcde2e2
commit 68d2dfcae6
21 changed files with 117 additions and 93 deletions

View File

@@ -0,0 +1,101 @@
// Copyright (C) 2022 Jérôme "Lynix" Leclercq (lynix680@gmail.com)
// This file is part of the "Nazara Engine - Shader module"
// For conditions of distribution and use, see copyright notice in Config.hpp
#include <Nazara/Shader/FieldOffsets.hpp>
#include <algorithm>
#include <cassert>
#include <Nazara/Shader/Debug.hpp>
namespace Nz
{
std::size_t FieldOffsets::AddField(StructFieldType type)
{
std::size_t fieldAlignement = GetAlignement(m_layout, type);
m_largestFieldAlignment = std::max(m_largestFieldAlignment, fieldAlignement);
std::size_t offset = Align(m_size, Align(fieldAlignement, m_offsetRounding));
m_size = offset + GetSize(type);
m_offsetRounding = 1;
return offset;
}
std::size_t FieldOffsets::AddFieldArray(StructFieldType type, std::size_t arraySize)
{
std::size_t fieldAlignement = GetAlignement(m_layout, type);
if (m_layout == StructLayout::Std140)
fieldAlignement = Align(fieldAlignement, GetAlignement(StructLayout::Std140, StructFieldType::Float4));
m_largestFieldAlignment = std::max(fieldAlignement, m_largestFieldAlignment);
std::size_t offset = Align(m_size, Align(fieldAlignement, m_offsetRounding));
m_size = offset + GetSize(type) * arraySize;
m_offsetRounding = 1;
return offset;
}
std::size_t FieldOffsets::AddMatrix(StructFieldType cellType, unsigned int columns, unsigned int rows, bool columnMajor)
{
assert(GetCount(cellType) == 1);
assert(columns >= 2 && columns <= 4);
assert(rows >= 2 && rows <= 4);
if (columnMajor)
return AddFieldArray(static_cast<StructFieldType>(UnderlyingCast(cellType) + rows - 1), columns);
else
return AddFieldArray(static_cast<StructFieldType>(UnderlyingCast(cellType) + columns - 1), rows);
}
std::size_t FieldOffsets::AddMatrixArray(StructFieldType cellType, unsigned int columns, unsigned int rows, bool columnMajor, std::size_t arraySize)
{
assert(GetCount(cellType) == 1);
assert(columns >= 2 && columns <= 4);
assert(rows >= 2 && rows <= 4);
if (columnMajor)
return AddFieldArray(static_cast<StructFieldType>(UnderlyingCast(cellType) + rows - 1), columns * arraySize);
else
return AddFieldArray(static_cast<StructFieldType>(UnderlyingCast(cellType) + columns - 1), rows * arraySize);
}
std::size_t FieldOffsets::AddStruct(const FieldOffsets& fieldStruct)
{
std::size_t fieldAlignement = fieldStruct.GetLargestFieldAlignement();
if (m_layout == StructLayout::Std140)
fieldAlignement = Align(fieldAlignement, GetAlignement(StructLayout::Std140, StructFieldType::Float4));
m_largestFieldAlignment = std::max(m_largestFieldAlignment, fieldAlignement);
std::size_t offset = Align(m_size, Align(fieldAlignement, m_offsetRounding));
m_size = offset + fieldStruct.GetSize();
m_offsetRounding = std::max<std::size_t>(Align(fieldStruct.GetSize(), fieldAlignement) - fieldStruct.GetSize(), 1);
return offset;
}
std::size_t FieldOffsets::AddStructArray(const FieldOffsets& fieldStruct, std::size_t arraySize)
{
assert(arraySize > 0);
std::size_t fieldAlignement = fieldStruct.GetLargestFieldAlignement();
if (m_layout == StructLayout::Std140)
fieldAlignement = Align(fieldAlignement, GetAlignement(StructLayout::Std140, StructFieldType::Float4));
m_largestFieldAlignment = std::max(m_largestFieldAlignment, fieldAlignement);
std::size_t offset = Align(m_size, Align(fieldAlignement, m_offsetRounding));
m_size = offset
+ fieldStruct.GetSize() * arraySize
+ (Align(fieldStruct.GetSize(), fieldAlignement) - fieldStruct.GetSize()) * (arraySize - 1);
m_offsetRounding = fieldAlignement;
return offset;
}
}

View File

@@ -7,6 +7,7 @@
#include <Nazara/Core/Bitset.hpp>
#include <Nazara/Core/CallOnExit.hpp>
#include <Nazara/Math/Algorithm.hpp>
#include <Nazara/Shader/Enums.hpp>
#include <Nazara/Shader/ShaderBuilder.hpp>
#include <Nazara/Shader/Ast/AstCloner.hpp>
#include <Nazara/Shader/Ast/AstConstantPropagationVisitor.hpp>

View File

@@ -6,6 +6,7 @@
#include <Nazara/Core/Algorithm.hpp>
#include <Nazara/Core/CallOnExit.hpp>
#include <Nazara/Math/Algorithm.hpp>
#include <Nazara/Shader/Enums.hpp>
#include <Nazara/Shader/ShaderBuilder.hpp>
#include <Nazara/Shader/Ast/AstCloner.hpp>
#include <Nazara/Shader/Ast/AstRecursiveVisitor.hpp>

View File

@@ -3,9 +3,9 @@
// For conditions of distribution and use, see copyright notice in Config.hpp
#include <Nazara/Shader/SpirvConstantCache.hpp>
#include <Nazara/Shader/FieldOffsets.hpp>
#include <Nazara/Shader/SpirvSection.hpp>
#include <Nazara/Shader/Ast/Nodes.hpp>
#include <Nazara/Utility/FieldOffsets.hpp>
#include <tsl/ordered_map.h>
#include <cassert>
#include <stdexcept>