#pragma once #define VULKAN_HPP_NO_STRUCT_CONSTRUCTORS #include #include #include #include #include using namespace glsl; /* Uniform: * layout (set = 0, binding = 0) uniform Matrices { vec3 cam_pos; float time; vec4 viewport; vec3 cam_dir; uint n_objects; float rad; }; */ struct UniformData { vec3 cam_pos; float time; vec4 viewport; vec3 cam_dir; uint n_objects; float rad; }; struct UniformBuffer { UniformBuffer(vk::PhysicalDevice phys_dev, vk::Device dev); std::unique_ptr buffer; UniformData data_copy { 0.0 }; void upload(const UniformData& data); inline operator vk::Buffer& () const { return *buffer; } inline vk::DescriptorSetLayoutBinding binding(uint32_t binding, vk::ShaderStageFlags stages = vk::ShaderStageFlagBits::eAll) { return vk::DescriptorSetLayoutBinding { .binding = binding, .descriptorType = vk::DescriptorType::eUniformBuffer, .descriptorCount = 1, .stageFlags = stages, .pImmutableSamplers = nullptr, }; } };