#pragma once #include #include #include using namespace glsl; /* Wrapper for SSBO */ struct ShaderBuffer { ShaderBuffer(vk::PhysicalDevice phys_dev, vk::Device dev, const size_t n_objects = 0x1000) : phys_dev(phys_dev), dev(dev), n_objects(n_objects) { buffer = std::make_unique( phys_dev, dev, n_objects * sizeof(Object), vk::BufferUsageFlagBits::eStorageBuffer, vk::MemoryPropertyFlagBits::eHostCoherent | vk::MemoryPropertyFlagBits::eHostVisible ); objects = reinterpret_cast(buffer->p); } vk::PhysicalDevice phys_dev; vk::Device dev; size_t n_objects; Object* objects; std::unique_ptr buffer; operator vk::Buffer&() const { return *buffer; } inline vk::DescriptorSetLayoutBinding binding(uint32_t binding, vk::ShaderStageFlags stages = vk::ShaderStageFlagBits::eFragment) { return vk::DescriptorSetLayoutBinding { .binding = binding, .descriptorType = vk::DescriptorType::eStorageBuffer, .descriptorCount = 1, .stageFlags = stages, .pImmutableSamplers = nullptr, }; } inline void upload(const std::vector& scene) { buffer->upload(reinterpret_cast(scene.data())); } ~ShaderBuffer() { buffer.reset(); } };