5#include <unordered_map>
45#include <vulkan/vulkan.hpp>
49 vk::ShaderStageFlags flags;
52 flags |= vk::ShaderStageFlagBits::eVertex;
55 flags |= vk::ShaderStageFlagBits::eFragment;
58 flags |= vk::ShaderStageFlagBits::eCompute;
61 flags |= vk::ShaderStageFlagBits::eGeometry;
64 flags |= vk::ShaderStageFlagBits::eTessellationControl;
67 flags |= vk::ShaderStageFlagBits::eTessellationEvaluation;
70 flags |= vk::ShaderStageFlagBits::eTaskEXT;
73 flags |= vk::ShaderStageFlagBits::eMeshEXT;
76 flags |= vk::ShaderStageFlagBits::eRaygenKHR;
79 flags |= vk::ShaderStageFlagBits::eAnyHitKHR;
82 flags |= vk::ShaderStageFlagBits::eClosestHitKHR;
85 flags |= vk::ShaderStageFlagBits::eMissKHR;
88 flags |= vk::ShaderStageFlagBits::eIntersectionKHR;
91 flags |= vk::ShaderStageFlagBits::eCallableKHR;
94 flags = vk::ShaderStageFlagBits::eAll;
118 return sizeof(float);
192 return "modelMatrix";
196 return "projectionMatrix";
219 return "u_Texture2D";
222 return "u_TextureCube";
259 constexpr explicit operator bool() const noexcept {
279 template<
typename... Args>
280 constexpr ConstLayout(
const char* layoutName, Args&&... args) noexcept
295 size_t alignment = element.getAlignment();
306 size_t size = element.getSize();
311 m_size += element.getSize();
324 if (
m_elements[i].getType() != other.m_elements[i].getType()) {
350 return static_cast<int>(i);
359 return static_cast<int>(i);
371 return (index >= 0) ?
m_offsets[index] : 0;
376 return (index >= 0) ?
m_offsets[index] : 0;
384 template<
typename... Rest>
390 template<
typename... Rest>
396 template<
typename... Rest>
397 constexpr void processArgs(ShaderStages stages, Rest&&... rest)
noexcept {
455 int index =
m_layout.findElementIndex(name);
457 const auto& element =
m_layout.getElement(index);
458 size_t offset =
m_layout.getElementOffset(index);
459 if (element.isArray())
472 int index =
m_layout.findElementIndex(type);
474 size_t offset =
m_layout.getElementOffset(index);
475 size_t elementSize =
m_layout.getElement(index).getSize();
477 if (
sizeof(T) <= elementSize) {
478 std::memcpy(
m_data.data() + offset, &value,
sizeof(T));
487 int index =
m_layout.findElementIndex(name);
489 size_t offset =
m_layout.getElementOffset(index);
490 size_t elementSize =
m_layout.getElement(index).getSize();
492 if (
sizeof(T) <= elementSize) {
493 std::memcpy(&result,
m_data.data() + offset,
sizeof(T));
511 if constexpr (std::is_pointer_v<T>) {
513 }
else if constexpr (std::ranges::range<T>) {
523 static_assert(std::is_pointer_v<T>,
"Expected pointer type");
528 for (uint32_t i = 0; i < elementCount; ++i) {
530 if (currentOffset + baseElementSize <=
m_data.size()) {
531 std::memcpy(
m_data.data() + currentOffset, &value[i], baseElementSize);
541 uint32_t arrayIndex = 0;
543 for (
const auto& it : value) {
544 if (arrayIndex >= maxElements)
break;
547 if (currentOffset + baseElementSize <=
m_data.size()) {
548 std::memcpy(
m_data.data() + currentOffset, &it, baseElementSize);
556 size_t elementSize = element.
getSize();
557 if (
sizeof(T) <= elementSize) {
558 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)
constexpr size_t GetUniformSize(ConstType type)
constexpr size_t GetHLSLArrayElementSize(ConstType type)
constexpr const char * GetUniformDefaultName(ConstType type)