29 this->pipeline = pipeline;
31 this->wrapper = wraps;
42 createUniformBuffer(attachmentCount);
43 createDescriptorPool();
44 createDescriptorSets();
47void BufferControllerBlending::createVertexBuffer()
49 std::vector<glm::vec4> vert = {
50 {-1.0f, 1.0f, 0.0f, 1.0f},
51 {-1.0f, -1.0f, 0.0f, 0.0f},
52 {1.0f, -1.0f, 1.0f, 0.0f},
53 {1.0f, 1.0f, 1.0f, 1.0f}};
55 vk::DeviceSize bufferSize =
sizeof(glm::vec4) * vert.size();
57 vk::Buffer stagingBuffer;
58 vk::DeviceMemory stagingBufferMemory;
60 createBuffer(bufferSize, vk::BufferUsageFlagBits::eTransferSrc, vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent, stagingBuffer, stagingBufferMemory,
context->
device,
context->
physicalDevice);
64 context->
device.mapMemory(stagingBufferMemory, 0, bufferSize, {}, &data);
65 memcpy(data, vert.data(), (
size_t)bufferSize);
68 createBuffer(bufferSize, vk::BufferUsageFlagBits::eTransferDst | vk::BufferUsageFlagBits::eVertexBuffer, vk::MemoryPropertyFlagBits::eDeviceLocal, vertexBuffer, vertexBufferMemory,
context->
device,
context->
physicalDevice);
70 copyBuffer(stagingBuffer, vertexBuffer, bufferSize);
76void BufferControllerBlending::createIndexBuffer()
78 indices = std::vector<uint32_t>{
82 indiceCount =
static_cast<uint32_t
>(
indices.size());
85 vk::Buffer stagingBuffer;
86 vk::DeviceMemory stagingBufferMemory;
87 createBuffer(bufferSize, vk::BufferUsageFlagBits::eTransferSrc, vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent, stagingBuffer, stagingBufferMemory,
context->
device,
context->
physicalDevice);
90 context->
device.mapMemory(stagingBufferMemory, 0, bufferSize, {}, &data);
91 memcpy(data,
indices.data(), (
size_t)bufferSize);
94 createBuffer(bufferSize, vk::BufferUsageFlagBits::eTransferDst | vk::BufferUsageFlagBits::eIndexBuffer, vk::MemoryPropertyFlagBits::eDeviceLocal, indexBuffer, indexBufferMemory,
context->
device,
context->
physicalDevice);
96 copyBuffer(stagingBuffer, indexBuffer, bufferSize);
102void BufferControllerBlending::createUniformBuffer(
int size)
106 uniformBuffers.resize(size);
107 uniformBuffersMemory.resize(size);
109 for (
size_t i = 0; i < size; i++) {
110 createBuffer(bufferSize, vk::BufferUsageFlagBits::eUniformBuffer, vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent, uniformBuffers[i], uniformBuffersMemory[i],
context->
device,
context->
physicalDevice);
114void BufferControllerBlending::createDescriptorPool()
116 std::array<vk::DescriptorPoolSize, 6> poolSizes{};
117 poolSizes[0] = vk::DescriptorPoolSize(vk::DescriptorType::eUniformBuffer,
static_cast<uint32_t
> (attachmentCount));
118 poolSizes[1] = vk::DescriptorPoolSize(vk::DescriptorType::eInputAttachment,
static_cast<uint32_t
> (attachmentCount));
119 poolSizes[2] = vk::DescriptorPoolSize(vk::DescriptorType::eInputAttachment,
static_cast<uint32_t
> (attachmentCount));
120 poolSizes[3] = vk::DescriptorPoolSize(vk::DescriptorType::eInputAttachment,
static_cast<uint32_t
> (attachmentCount));
121 poolSizes[4] = vk::DescriptorPoolSize(vk::DescriptorType::eInputAttachment,
static_cast<uint32_t
> (attachmentCount));
122 poolSizes[5] = vk::DescriptorPoolSize(vk::DescriptorType::eInputAttachment,
static_cast<uint32_t
> (attachmentCount));
124 vk::DescriptorPoolCreateInfo poolInfo(
125 vk::DescriptorPoolCreateFlags(),
126 static_cast<uint32_t
>(attachmentCount),
127 static_cast<uint32_t
>(poolSizes.size()),
131 descriptorPool =
context->
device.createDescriptorPool(poolInfo);
134void BufferControllerBlending::createDescriptorSets()
136 std::vector<vk::DescriptorSetLayout> layouts(attachmentCount, pipeline->
descriptorSetLayout);
138 vk::DescriptorSetAllocateInfo allocInfo(descriptorPool,
static_cast<uint32_t
>(attachmentCount), layouts.data());
140 descriptorSets =
context->
device.allocateDescriptorSets(allocInfo);
142 for (
size_t i = 0; i < attachmentCount; i++) {
143 vk::DescriptorBufferInfo bufferInfo(uniformBuffers[i], 0,
sizeof(
BlendingParameters));
145 vk::DescriptorImageInfo imageInfo(
nullptr,
renderpass->
attachementColor[i].imageView, vk::ImageLayout::eShaderReadOnlyOptimal);
152 vk::DescriptorImageInfo accuDepthInfo;
156 accuImageInfo.imageLayout = vk::ImageLayout::eShaderReadOnlyOptimal;
159 accuQualityInfo.imageLayout = vk::ImageLayout::eShaderReadOnlyOptimal;
172 std::vector<vk::WriteDescriptorSet> descriptorWrites{};
176 descriptorWrites.resize(7);
179 descriptorWrites.resize(6);
181 descriptorWrites[0] = vk::WriteDescriptorSet(
186 vk::DescriptorType::eUniformBuffer,
191 descriptorWrites[1] = vk::WriteDescriptorSet(
196 vk::DescriptorType::eInputAttachment,
201 descriptorWrites[2] = vk::WriteDescriptorSet(
206 vk::DescriptorType::eInputAttachment,
211 descriptorWrites[3] = vk::WriteDescriptorSet(
216 vk::DescriptorType::eInputAttachment,
221 descriptorWrites[4] = vk::WriteDescriptorSet(
226 vk::DescriptorType::eInputAttachment,
231 descriptorWrites[5] = vk::WriteDescriptorSet(
236 vk::DescriptorType::eInputAttachment,
243 descriptorWrites[6] = vk::WriteDescriptorSet(
248 vk::DescriptorType::eInputAttachment,
254 context->
device.updateDescriptorSets(
static_cast<uint32_t
>(descriptorWrites.size()), descriptorWrites.data(), 0,
nullptr);
262 vk::Buffer vertexBuffers[] = { vertexBuffer };
263 vk::DeviceSize offsets[] = { 0 };
264 commandBuffer.bindVertexBuffers(0, 1, vertexBuffers, offsets);
265 commandBuffer.bindIndexBuffer(indexBuffer, 0, vk::IndexType::eUint32);
267 commandBuffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, pipeline->
pipelineLayout, 0, 1, &descriptorSets[index], 0,
nullptr);
294 for (
size_t i = 0; i < uniformBuffers.size(); i++) {
296 context->
device.freeMemory(uniformBuffersMemory[i],
nullptr);
312 vk::VertexInputBindingDescription bindingDescription{
315 vk::VertexInputRate::eVertex
317 return bindingDescription;
322 std::vector<vk::VertexInputAttributeDescription> attributeDescriptions{
323 vk::VertexInputAttributeDescription(
326 vk::Format::eR32G32B32A32Sfloat,
329 return attributeDescriptions;
337 auto R_from = glmEulerAnglesDegreeToRotationMatrix(frameInfo[view].extrinsics.rotation);
343 R_to = (R_start * R_to * glm::transpose(R_start)) * R_start;
346 auto R = glm::transpose(R_to) * R_from;
348 auto t_from = frameInfo[view].extrinsics.position;
351 t_to = t_start + R_start * t_to;
354 glm::vec3 T = -glm::transpose(R_to) * (t_to - t_from);
355 this->blendingParam.inputDistance = std::max(0.01f, glm::length(T));
File that contains class and struct for the management of the ressources for the blending pipeline.
File that contain the VulkanContext class to manage Vulkan Instance, Physical device,...
Class that contains helper functions for Vulkan.
file that conthains a class that manages the pipeline for the blending
file that contains the class that manage the renderPass containing the synthesis and blending steps
file that contains the VulkanWrapper class that manages the classes related to Vulkan code and ease t...
void updateAllUniformBuffer(uint32_t currentImage, int view) override
uint32_t getIndiceCount() override
void update(std::span< InputProvider::StreamFrameInfo > infos, int view) override
void bindBuffers(vk::CommandBuffer &commandBuffer, int index, InputProvider::StreamFrameInfo &frameInfo, int view) override
BufferControllerBlending(VulkanContext *context, VulkanRenderPass *renderpass, VulkanPipelineBlending *pipeline, VulkanWrapper *wraps, int inputView)
vk::VertexInputBindingDescription getBindingDescription() override
void updateUniformBuffer(uint32_t currentImage, int view) override
std::vector< vk::VertexInputAttributeDescription > getAttributeDescription() override
static std::vector< uint32_t > indices
void copyBuffer(vk::Buffer srcBuffer, vk::Buffer dstBuffer, vk::DeviceSize size)
VulkanRenderPass * renderpass
const InputProvider::Extrinsics getVirtualExtrinsics(int view)
const glm::mat3x3 conversionToOMAF
const glm::vec3 getStartingPosition()
const glm::vec3 getStartingRotation()
class that manages tasks related to Vulkan context (Vulkan Instance, Vulkan Physical device,...
vk::PhysicalDevice physicalDevice
vk::DescriptorSetLayout descriptorSetLayout
vk::PipelineLayout pipelineLayout
Class that manages a graphics pipeline for the blending.
Class that manage the renderPass containing the synthesis and blending steps.
std::vector< ImageStruct > attachementAccuQuality2
std::vector< ImageStruct > attachementAccuColor2
std::vector< ImageStruct > attachementDepthFloat
std::vector< ImageStruct > attachementAccuDepth2
std::vector< ImageStruct > attachementQualityFloat
std::vector< ImageStruct > attachementAccuDepth
std::vector< ImageStruct > attachementAccuColor
std::vector< ImageStruct > attachementAccuQuality
std::vector< ImageStruct > attachementColor
Class that manages the classes related to Vulkan code and act as a wrapper around them.
bool isDepthOutputRecquired()
const bool multiviewSetup
RenderingParameters params
Struct that contains value to be sent to the fragment shader of the blending pipeline.