Move FieldOffsets class to Shader module and remove Utility dependency
This commit is contained in:
@@ -8,10 +8,11 @@
|
||||
#define NAZARA_SHADER_AST_EXPRESSIONTYPE_HPP
|
||||
|
||||
#include <Nazara/Prerequisites.hpp>
|
||||
#include <Nazara/Core/Enums.hpp>
|
||||
#include <Nazara/Shader/Enums.hpp>
|
||||
#include <Nazara/Shader/ShaderLangSourceLocation.hpp>
|
||||
#include <Nazara/Shader/Ast/Enums.hpp>
|
||||
#include <Nazara/Shader/Ast/ExpressionValue.hpp>
|
||||
#include <Nazara/Utility/Enums.hpp>
|
||||
#include <optional>
|
||||
#include <string>
|
||||
#include <variant>
|
||||
|
||||
70
include/Nazara/Shader/Enums.hpp
Normal file
70
include/Nazara/Shader/Enums.hpp
Normal file
@@ -0,0 +1,70 @@
|
||||
// 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
|
||||
|
||||
#pragma once
|
||||
|
||||
#ifndef NAZARA_SHADER_ENUMS_HPP
|
||||
#define NAZARA_SHADER_ENUMS_HPP
|
||||
|
||||
#include <Nazara/Core/Flags.hpp>
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
enum class ShaderStageType
|
||||
{
|
||||
Fragment,
|
||||
Vertex,
|
||||
|
||||
Max = Vertex
|
||||
};
|
||||
|
||||
constexpr std::size_t ShaderStageTypeCount = static_cast<std::size_t>(ShaderStageType::Max) + 1;
|
||||
|
||||
template<>
|
||||
struct EnumAsFlags<ShaderStageType>
|
||||
{
|
||||
static constexpr ShaderStageType max = ShaderStageType::Max;
|
||||
};
|
||||
|
||||
using ShaderStageTypeFlags = Flags<ShaderStageType>;
|
||||
|
||||
constexpr ShaderStageTypeFlags ShaderStageType_All = ShaderStageType::Fragment | ShaderStageType::Vertex;
|
||||
|
||||
enum class StructFieldType
|
||||
{
|
||||
Bool1,
|
||||
Bool2,
|
||||
Bool3,
|
||||
Bool4,
|
||||
Float1,
|
||||
Float2,
|
||||
Float3,
|
||||
Float4,
|
||||
Double1,
|
||||
Double2,
|
||||
Double3,
|
||||
Double4,
|
||||
Int1,
|
||||
Int2,
|
||||
Int3,
|
||||
Int4,
|
||||
UInt1,
|
||||
UInt2,
|
||||
UInt3,
|
||||
UInt4,
|
||||
|
||||
Max = UInt4
|
||||
};
|
||||
|
||||
enum class StructLayout
|
||||
{
|
||||
Packed,
|
||||
Std140,
|
||||
|
||||
Max = Std140
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // NAZARA_SHADER_ENUMS_HPP
|
||||
54
include/Nazara/Shader/FieldOffsets.hpp
Normal file
54
include/Nazara/Shader/FieldOffsets.hpp
Normal file
@@ -0,0 +1,54 @@
|
||||
// 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
|
||||
|
||||
#pragma once
|
||||
|
||||
#ifndef NAZARA_SHADER_FIELDOFFSETS_HPP
|
||||
#define NAZARA_SHADER_FIELDOFFSETS_HPP
|
||||
|
||||
#include <Nazara/Prerequisites.hpp>
|
||||
#include <Nazara/Shader/Config.hpp>
|
||||
#include <Nazara/Shader/Enums.hpp>
|
||||
#include <cstddef>
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
class NAZARA_SHADER_API FieldOffsets
|
||||
{
|
||||
public:
|
||||
inline FieldOffsets(StructLayout layout);
|
||||
FieldOffsets(const FieldOffsets&) = default;
|
||||
FieldOffsets(FieldOffsets&&) = default;
|
||||
~FieldOffsets() = default;
|
||||
|
||||
std::size_t AddField(StructFieldType type);
|
||||
std::size_t AddFieldArray(StructFieldType type, std::size_t arraySize);
|
||||
std::size_t AddMatrix(StructFieldType cellType, unsigned int columns, unsigned int rows, bool columnMajor);
|
||||
std::size_t AddMatrixArray(StructFieldType cellType, unsigned int columns, unsigned int rows, bool columnMajor, std::size_t arraySize);
|
||||
std::size_t AddStruct(const FieldOffsets& fieldStruct);
|
||||
std::size_t AddStructArray(const FieldOffsets& fieldStruct, std::size_t arraySize);
|
||||
|
||||
inline std::size_t GetAlignedSize() const;
|
||||
inline std::size_t GetLargestFieldAlignement() const;
|
||||
inline StructLayout GetLayout() const;
|
||||
inline std::size_t GetSize() const;
|
||||
|
||||
FieldOffsets& operator=(const FieldOffsets&) = default;
|
||||
FieldOffsets& operator=(FieldOffsets&&) = default;
|
||||
|
||||
static std::size_t GetAlignement(StructLayout layout, StructFieldType fieldType);
|
||||
static std::size_t GetCount(StructFieldType fieldType);
|
||||
static std::size_t GetSize(StructFieldType fieldType);
|
||||
|
||||
private:
|
||||
std::size_t m_largestFieldAlignment;
|
||||
std::size_t m_offsetRounding;
|
||||
std::size_t m_size;
|
||||
StructLayout m_layout;
|
||||
};
|
||||
}
|
||||
|
||||
#include <Nazara/Shader/FieldOffsets.inl>
|
||||
|
||||
#endif // NAZARA_SHADER_FIELDOFFSETS_HPP
|
||||
174
include/Nazara/Shader/FieldOffsets.inl
Normal file
174
include/Nazara/Shader/FieldOffsets.inl
Normal file
@@ -0,0 +1,174 @@
|
||||
// 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 <Nazara/Core/Algorithm.hpp>
|
||||
#include <cassert>
|
||||
#include <memory>
|
||||
#include <Nazara/Shader/Debug.hpp>
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
inline FieldOffsets::FieldOffsets(StructLayout layout) :
|
||||
m_largestFieldAlignment(1),
|
||||
m_offsetRounding(1),
|
||||
m_size(0),
|
||||
m_layout(layout)
|
||||
{
|
||||
}
|
||||
|
||||
inline std::size_t FieldOffsets::GetLargestFieldAlignement() const
|
||||
{
|
||||
return m_largestFieldAlignment;
|
||||
}
|
||||
|
||||
inline StructLayout FieldOffsets::GetLayout() const
|
||||
{
|
||||
return m_layout;
|
||||
}
|
||||
|
||||
inline std::size_t FieldOffsets::GetAlignedSize() const
|
||||
{
|
||||
if (m_layout == StructLayout::Std140)
|
||||
return Align(m_size, m_largestFieldAlignment);
|
||||
else
|
||||
return m_size;
|
||||
}
|
||||
|
||||
inline std::size_t FieldOffsets::GetSize() const
|
||||
{
|
||||
return m_size;
|
||||
}
|
||||
|
||||
inline std::size_t FieldOffsets::GetAlignement(StructLayout layout, StructFieldType fieldType)
|
||||
{
|
||||
switch (layout)
|
||||
{
|
||||
case StructLayout::Packed:
|
||||
return 1;
|
||||
|
||||
case StructLayout::Std140:
|
||||
{
|
||||
switch (fieldType)
|
||||
{
|
||||
case StructFieldType::Bool1:
|
||||
case StructFieldType::Float1:
|
||||
case StructFieldType::Int1:
|
||||
case StructFieldType::UInt1:
|
||||
return 4;
|
||||
|
||||
case StructFieldType::Bool2:
|
||||
case StructFieldType::Float2:
|
||||
case StructFieldType::Int2:
|
||||
case StructFieldType::UInt2:
|
||||
return 2 * 4;
|
||||
|
||||
case StructFieldType::Bool3:
|
||||
case StructFieldType::Float3:
|
||||
case StructFieldType::Int3:
|
||||
case StructFieldType::UInt3:
|
||||
case StructFieldType::Bool4:
|
||||
case StructFieldType::Float4:
|
||||
case StructFieldType::Int4:
|
||||
case StructFieldType::UInt4:
|
||||
return 4 * 4;
|
||||
|
||||
case StructFieldType::Double1:
|
||||
return 8;
|
||||
|
||||
case StructFieldType::Double2:
|
||||
return 2 * 8;
|
||||
|
||||
case StructFieldType::Double3:
|
||||
case StructFieldType::Double4:
|
||||
return 4 * 8;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
inline std::size_t FieldOffsets::GetCount(StructFieldType fieldType)
|
||||
{
|
||||
switch (fieldType)
|
||||
{
|
||||
case StructFieldType::Bool1:
|
||||
case StructFieldType::Double1:
|
||||
case StructFieldType::Float1:
|
||||
case StructFieldType::Int1:
|
||||
case StructFieldType::UInt1:
|
||||
return 1;
|
||||
|
||||
case StructFieldType::Bool2:
|
||||
case StructFieldType::Double2:
|
||||
case StructFieldType::Float2:
|
||||
case StructFieldType::Int2:
|
||||
case StructFieldType::UInt2:
|
||||
return 2;
|
||||
|
||||
case StructFieldType::Bool3:
|
||||
case StructFieldType::Double3:
|
||||
case StructFieldType::Float3:
|
||||
case StructFieldType::Int3:
|
||||
case StructFieldType::UInt3:
|
||||
return 3;
|
||||
|
||||
case StructFieldType::Bool4:
|
||||
case StructFieldType::Double4:
|
||||
case StructFieldType::Float4:
|
||||
case StructFieldType::Int4:
|
||||
case StructFieldType::UInt4:
|
||||
return 4;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
inline std::size_t FieldOffsets::GetSize(StructFieldType fieldType)
|
||||
{
|
||||
switch (fieldType)
|
||||
{
|
||||
case StructFieldType::Bool1:
|
||||
case StructFieldType::Float1:
|
||||
case StructFieldType::Int1:
|
||||
case StructFieldType::UInt1:
|
||||
return 4;
|
||||
|
||||
case StructFieldType::Bool2:
|
||||
case StructFieldType::Float2:
|
||||
case StructFieldType::Int2:
|
||||
case StructFieldType::UInt2:
|
||||
return 2 * 4;
|
||||
|
||||
case StructFieldType::Bool3:
|
||||
case StructFieldType::Float3:
|
||||
case StructFieldType::Int3:
|
||||
case StructFieldType::UInt3:
|
||||
return 3 * 4;
|
||||
|
||||
case StructFieldType::Bool4:
|
||||
case StructFieldType::Float4:
|
||||
case StructFieldType::Int4:
|
||||
case StructFieldType::UInt4:
|
||||
return 4 * 4;
|
||||
|
||||
case StructFieldType::Double1:
|
||||
return 8;
|
||||
|
||||
case StructFieldType::Double2:
|
||||
return 2 * 8;
|
||||
|
||||
case StructFieldType::Double3:
|
||||
return 3 * 8;
|
||||
|
||||
case StructFieldType::Double4:
|
||||
return 4 * 8;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
#include <Nazara/Shader/DebugOff.hpp>
|
||||
Reference in New Issue
Block a user