pleascach/Renderer/UniformBuffer.hpp
2024-02-06 11:58:49 -05:00

65 lines
1.2 KiB
C++

#pragma once
#define VULKAN_HPP_NO_STRUCT_CONSTRUCTORS
#include <vulkan/vulkan.hpp>
#include <Memory/Buffer.hpp>
#include <glm/glm.hpp>
#include <memory>
/* Uniform:
*
* layout (set = 0, binding = 0) uniform Matrices {
* mat4 view;
* mat4 proj;
* float time;
* vec3 cam_pos;
* vec3 cam_dir;
* vec4 frustum[6];
* vec2 viewport;
* float tess_factor;
* float tess_edge_size;
* };
*
*/
struct UniformData {
glm::mat4 view;
glm::mat4 proj;
float time;
float pad0;
float pad1;
float pad2;
glm::vec3 cam_pos;
float pad3;
glm::vec3 cam_dir;
float pad4;
glm::vec4 frustum[6];
glm::vec2 viewport;
float tess_factor;
float tess_edge_size;
};
struct UniformBuffer {
UniformBuffer(vk::PhysicalDevice phys_dev, vk::Device dev);
std::unique_ptr<Buffer> buffer;
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,
};
}
};