5#include <unordered_map>
46#include <vulkan/vulkan.hpp>
50 vk::ShaderStageFlags flags;
53 flags |= vk::ShaderStageFlagBits::eVertex;
56 flags |= vk::ShaderStageFlagBits::eFragment;
59 flags |= vk::ShaderStageFlagBits::eCompute;
62 flags |= vk::ShaderStageFlagBits::eGeometry;
65 flags |= vk::ShaderStageFlagBits::eTessellationControl;
68 flags |= vk::ShaderStageFlagBits::eTessellationEvaluation;
71 flags |= vk::ShaderStageFlagBits::eTaskEXT;
74 flags |= vk::ShaderStageFlagBits::eMeshEXT;
77 flags |= vk::ShaderStageFlagBits::eRaygenKHR;
80 flags |= vk::ShaderStageFlagBits::eAnyHitKHR;
83 flags |= vk::ShaderStageFlagBits::eClosestHitKHR;
86 flags |= vk::ShaderStageFlagBits::eMissKHR;
89 flags |= vk::ShaderStageFlagBits::eIntersectionKHR;
92 flags |= vk::ShaderStageFlagBits::eCallableKHR;
95 flags = vk::ShaderStageFlagBits::eAll;
119 return sizeof(float);
193 return "modelMatrix";
197 return "projectionMatrix";
220 return "u_Texture2D";
223 return "u_TextureCube";
260 constexpr explicit operator bool() const noexcept {
280 template<
typename... Args>
281 constexpr ConstLayout(
const char* layoutName, Args&&... args) noexcept
296 size_t alignment = element.getAlignment();
307 size_t size = element.getSize();
312 m_size += element.getSize();
325 if (
m_elements[i].getType() != other.m_elements[i].getType()) {
351 return static_cast<int>(i);
360 return static_cast<int>(i);
372 return (index >= 0) ?
m_offsets[index] : 0;
377 return (index >= 0) ?
m_offsets[index] : 0;
385 template<
typename... Rest>
391 template<
typename... Rest>
397 template<
typename... Rest>
398 constexpr void processArgs(ShaderStages stages, Rest&&... rest)
noexcept {
456 int index =
m_layout.findElementIndex(name);
458 const auto& element =
m_layout.getElement(index);
459 size_t offset =
m_layout.getElementOffset(index);
460 if (element.isArray())
473 int index =
m_layout.findElementIndex(type);
475 size_t offset =
m_layout.getElementOffset(index);
476 size_t elementSize =
m_layout.getElement(index).getSize();
478 if (
sizeof(T) <= elementSize) {
479 std::memcpy(
m_data.data() + offset, &value,
sizeof(T));
488 int index =
m_layout.findElementIndex(name);
490 size_t offset =
m_layout.getElementOffset(index);
491 size_t elementSize =
m_layout.getElement(index).getSize();
493 if (
sizeof(T) <= elementSize) {
494 std::memcpy(&result,
m_data.data() + offset,
sizeof(T));
512 if constexpr (std::is_pointer_v<T>) {
514 }
else if constexpr (std::ranges::range<T>) {
524 static_assert(std::is_pointer_v<T>,
"Expected pointer type");
529 for (uint32_t i = 0; i < elementCount; ++i) {
531 if (currentOffset + baseElementSize <=
m_data.size()) {
532 std::memcpy(
m_data.data() + currentOffset, &value[i], baseElementSize);
542 uint32_t arrayIndex = 0;
544 for (
const auto& it : value) {
545 if (arrayIndex >= maxElements)
break;
548 if (currentOffset + baseElementSize <=
m_data.size()) {
549 std::memcpy(
m_data.data() + currentOffset, &it, baseElementSize);
557 size_t elementSize = element.
getSize();
558 if (
sizeof(T) <= elementSize) {
559 std::memcpy(
m_data.data() + offset, &value,
sizeof(T));
constexpr ConstElement(ConstType type, const char *name) noexcept
constexpr size_t getSize() const noexcept
constexpr ConstElement() noexcept
constexpr bool isArray() const noexcept
constexpr ConstElement(ConstType type, const char *name, size_t arraySize) noexcept
constexpr size_t getAlignment() const noexcept
constexpr size_t getElementCount() const noexcept
constexpr ConstType getType() const noexcept
constexpr ConstElement(ConstType type) noexcept
constexpr const char * getName() const noexcept
constexpr const ConstElement & getElement(ConstType type) const noexcept
constexpr size_t getElementOffset(size_t index) const noexcept
constexpr ConstLayout() noexcept
constexpr void processArgs(const ConstElement &element, Rest &&... rest) noexcept
size_t m_offsets[MaxElements]
constexpr ShaderStages getShaderStages() const noexcept
constexpr int findElementIndex(ConstType type) const noexcept
ShaderStages m_shaderStages
constexpr size_t getTotalSize() const noexcept
constexpr int findElementIndex(const char *name) const noexcept
constexpr void processArgs(UpdateFrequency frequency, Rest &&... rest) noexcept
constexpr void addElement(const ConstElement &element) noexcept
constexpr size_t getElementOffset(ConstType type) const noexcept
ConstElement m_elements[MaxElements]
static constexpr size_t MaxElements
constexpr UpdateFrequency getUpdateFrequency() const noexcept
constexpr void processArgs(ShaderStages stages, Rest &&... rest) noexcept
constexpr void processArgs() noexcept
constexpr const char * getName() const noexcept
bool operator==(const ConstLayout &other) const noexcept
constexpr size_t getElementOffset(const char *name) const noexcept
constexpr const ConstElement & getElement(size_t index) const noexcept
constexpr size_t getElementCount() const noexcept
UpdateFrequency m_updateFrequency
constexpr ConstLayout(const char *layoutName, Args &&... args) noexcept
constexpr bool StringEquals(const char *a, const char *b) noexcept
constexpr size_t GetUniformAlignment(ConstType type)
vk::ShaderStageFlags ConvertToVkShaderStageFlags(ShaderStages stages)
FCT::ConstType UniformType
constexpr size_t GetUniformSize(ConstType type)
constexpr size_t GetHLSLArrayElementSize(ConstType type)
constexpr const char * GetUniformDefaultName(ConstType type)