16#define GLM_FORCE_RADIANS
17#define GLM_FORCE_DEPTH_ZERO_TO_ONE
19#include <glm/gtc/matrix_transform.hpp>
30#include"InputProvider.h"
37 this->pipeline = pipeline;
39 this->wrapper = wraps;
52 streamParams = input->enumerateStreamsParameters()[
inputView];
54 textureStreamImages = input->enumerateStreamImages(
inputView,
false);
55 depthStreamImages = input->enumerateStreamImages(
inputView,
true);
58 assert(textureStreamImages.size() == depthStreamImages.size());
60 memset(&rvsSynParam, 0,
sizeof(rvsSynParam));
61 memset(&rvsSynGeom, 0,
sizeof(rvsSynGeom));
62 memset(&rvsSynFrag, 0,
sizeof(rvsSynFrag));
64 if (streamParams.depthFormat == vk::Format::eR32Sfloat) {
78 createUniformBuffer(attachmentSize);
79 createDescriptorPool();
80 createDescriptorSets();
84void BuffersControllerWarping::createVertexBuffer()
86 auto res = streamParams.depthResolution;
87 const int size = res.x * res.y;
89 std::vector<uint8_t> vertices(size);
91 vk::DeviceSize bufferSize =
sizeof(uint8_t) * vertices.size();
93 vk::Buffer stagingBuffer;
94 vk::DeviceMemory stagingBufferMemory;
96 createBuffer(bufferSize, vk::BufferUsageFlagBits::eTransferSrc, vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent, stagingBuffer, stagingBufferMemory,
context->
device,
context->
physicalDevice);
100 context->
device.mapMemory(stagingBufferMemory, 0, bufferSize, {}, &data);
101 memcpy(data, vertices.data(), (
size_t)bufferSize);
104 createBuffer(bufferSize, vk::BufferUsageFlagBits::eTransferDst | vk::BufferUsageFlagBits::eVertexBuffer, vk::MemoryPropertyFlagBits::eDeviceLocal , vertexBuffer, vertexBufferMemory,
context->
device,
context->
physicalDevice);
106 copyBuffer(stagingBuffer, vertexBuffer, bufferSize);
113void BuffersControllerWarping::createIndexBuffer()
115 auto res = streamParams.depthResolution;
116 indices = generate_picture_EBO(glm::vec2(res.x,res.y));
117 indiceCount =
static_cast<uint32_t
>(
indices.size());
119 vk::Buffer stagingBuffer;
120 vk::DeviceMemory stagingBufferMemory;
121 createBuffer(bufferSize, vk::BufferUsageFlagBits::eTransferSrc, vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent, stagingBuffer, stagingBufferMemory,
context->
device,
context->
physicalDevice);
124 context->
device.mapMemory(stagingBufferMemory, 0, bufferSize, {}, &data);
125 memcpy(data,
indices.data(), (
size_t)bufferSize);
128 createBuffer(bufferSize, vk::BufferUsageFlagBits::eTransferDst | vk::BufferUsageFlagBits::eIndexBuffer, vk::MemoryPropertyFlagBits::eDeviceLocal, indexBuffer, indexBufferMemory,
context->
device,
context->
physicalDevice);
130 copyBuffer(stagingBuffer, indexBuffer, bufferSize);
136void BuffersControllerWarping::createUniformBuffer(
int size)
140 uniformBuffersCam.resize(size);
141 uniformBuffersCamMemory.resize(size);
143 for (
size_t i = 0; i < size; i++) {
144 createBuffer(bufferSizeCam, vk::BufferUsageFlagBits::eUniformBuffer, vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent, uniformBuffersCam[i], uniformBuffersCamMemory[i],
context->
device,
context->
physicalDevice);
149 uniformBuffers.resize(size);
150 uniformBuffersMemory.resize(size);
152 for (
size_t i = 0; i < size; i++) {
153 createBuffer(bufferSize, vk::BufferUsageFlagBits::eUniformBuffer, vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent, uniformBuffers[i], uniformBuffersMemory[i],
context->
device,
context->
physicalDevice);
156 VkDeviceSize bufferSizeGeom =
sizeof(
RvsSynGeom);
158 uniformBuffersGeom.resize(size);
159 uniformBuffersGeomMemory.resize(size);
161 for (
size_t i = 0; i < size; i++) {
162 createBuffer(bufferSizeGeom, vk::BufferUsageFlagBits::eUniformBuffer, vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent, uniformBuffersGeom[i], uniformBuffersGeomMemory[i],
context->
device,
context->
physicalDevice);
165 VkDeviceSize bufferSizeFrag =
sizeof(
RvsSynFrag);
166 uniformBuffersFrag.resize(size);
167 uniformBuffersFragMemory.resize(size);
169 for (
size_t i = 0; i < size; i++) {
170 createBuffer(bufferSizeFrag, vk::BufferUsageFlagBits::eUniformBuffer, vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent, uniformBuffersFrag[i], uniformBuffersFragMemory[i],
context->
device,
context->
physicalDevice);
174void BuffersControllerWarping::createDescriptorPool()
176 std::array<vk::DescriptorPoolSize, 6> poolSizes{};
177 poolSizes[0] = vk::DescriptorPoolSize(vk::DescriptorType::eUniformBuffer,
static_cast<uint32_t
> (attachmentSize));
178 poolSizes[1] = vk::DescriptorPoolSize(vk::DescriptorType::eUniformBuffer,
static_cast<uint32_t
> (attachmentSize));
179 poolSizes[2] = vk::DescriptorPoolSize(vk::DescriptorType::eUniformBuffer,
static_cast<uint32_t
> (attachmentSize));
180 poolSizes[3] = vk::DescriptorPoolSize(vk::DescriptorType::eUniformBuffer,
static_cast<uint32_t
> (attachmentSize));
181 poolSizes[4] = vk::DescriptorPoolSize(vk::DescriptorType::eCombinedImageSampler,
static_cast<uint32_t
> (textureStreamImages.size()));
182 poolSizes[5] = vk::DescriptorPoolSize(vk::DescriptorType::eCombinedImageSampler,
static_cast<uint32_t
> (depthStreamImages.size()));
185 auto slotSize = textureStreamImages.size();
187 vk::DescriptorPoolCreateInfo poolInfo(
188 vk::DescriptorPoolCreateFlags(),
189 static_cast<uint32_t
>((attachmentSize)*slotSize),
190 static_cast<uint32_t
>(poolSizes.size()),
194 descriptorPool =
context->
device.createDescriptorPool(poolInfo);
197void BuffersControllerWarping::createDescriptorSets()
199 auto slotSize = textureStreamImages.size();
200 std::vector<vk::DescriptorSetLayout> layouts(attachmentSize* slotSize, pipeline->
descriptorSetLayout);
203 vk::DescriptorSetAllocateInfo allocInfo(descriptorPool,
static_cast<uint32_t
>(attachmentSize * slotSize), layouts.data());
206 descriptorSets =
context->
device.allocateDescriptorSets(allocInfo);
208 for (
int slot = 0; slot < slotSize; slot++) {
209 for (
size_t i = 0; i < attachmentSize; i++) {
211 updateDescriptorSets(i,slot);
218void BuffersControllerWarping::updateDescriptorSets(
int attachment,
int slot)
220 vk::DescriptorBufferInfo bufferInfoCam(uniformBuffersCam[attachment], 0,
sizeof(
RVScamExtrinsics));
221 vk::DescriptorBufferInfo bufferInfoVert(uniformBuffers[attachment], 0,
sizeof(
RvsSynParam));
222 vk::DescriptorBufferInfo bufferInfoGeom(uniformBuffersGeom[attachment], 0,
sizeof(
RvsSynGeom));
223 vk::DescriptorBufferInfo bufferInfoFrag(uniformBuffersFrag[attachment], 0,
sizeof(
RvsSynFrag));
225 vk::DescriptorImageInfo imageInfo(streamParams.colorSampler, textureStreamImages[slot].view, vk::ImageLayout::eShaderReadOnlyOptimal);
226 vk::DescriptorImageInfo depthInfo(streamParams.depthSampler, depthStreamImages[slot].view, vk::ImageLayout::eShaderReadOnlyOptimal);
228 auto idDescriptorSet = attachment + slot * attachmentSize;
229 std::array<vk::WriteDescriptorSet, 6> descriptorWrites{};
230 descriptorWrites[0] = vk::WriteDescriptorSet(
231 descriptorSets[idDescriptorSet],
235 vk::DescriptorType::eUniformBuffer,
240 descriptorWrites[1] = vk::WriteDescriptorSet(
241 descriptorSets[idDescriptorSet],
245 vk::DescriptorType::eCombinedImageSampler,
250 descriptorWrites[2] = vk::WriteDescriptorSet(
251 descriptorSets[idDescriptorSet],
255 vk::DescriptorType::eUniformBuffer,
260 descriptorWrites[3] = vk::WriteDescriptorSet(
261 descriptorSets[idDescriptorSet],
265 vk::DescriptorType::eCombinedImageSampler,
270 descriptorWrites[4] = vk::WriteDescriptorSet(
271 descriptorSets[idDescriptorSet],
275 vk::DescriptorType::eUniformBuffer,
280 descriptorWrites[5] = vk::WriteDescriptorSet(
281 descriptorSets[idDescriptorSet],
285 vk::DescriptorType::eUniformBuffer,
292 context->
device.updateDescriptorSets(
static_cast<uint32_t
>(descriptorWrites.size()), descriptorWrites.data(), 0,
nullptr);
306 for (
size_t i = 0; i < uniformBuffersFrag.size(); i++) {
307 context->
device.destroyBuffer(uniformBuffersFrag[i],
nullptr);
308 context->
device.freeMemory(uniformBuffersFragMemory[i],
nullptr);
311 for (
size_t i = 0; i < uniformBuffersGeom.size(); i++) {
312 context->
device.destroyBuffer(uniformBuffersGeom[i],
nullptr);
313 context->
device.freeMemory(uniformBuffersGeomMemory[i],
nullptr);
316 for (
size_t i = 0; i < uniformBuffers.size(); i++) {
318 context->
device.freeMemory(uniformBuffersMemory[i],
nullptr);
321 for (
size_t i = 0; i < uniformBuffersCam.size(); i++) {
322 context->
device.destroyBuffer(uniformBuffersCam[i],
nullptr);
323 context->
device.freeMemory(uniformBuffersCamMemory[i],
nullptr);
326 uniformBuffers.clear();
327 uniformBuffersMemory.clear();
329 uniformBuffersCam.clear();
330 uniformBuffersCamMemory.clear();
332 uniformBuffersGeom.clear();
333 uniformBuffersGeomMemory.clear();
335 uniformBuffersFrag.clear();
336 uniformBuffersFragMemory.clear();
346 vk::Buffer vertexBuffers[] = { vertexBuffer };
347 vk::DeviceSize offsets[] = { 0 };
348 commandBuffer.bindVertexBuffers( 0, 1, vertexBuffers, offsets);
349 commandBuffer.bindIndexBuffer(indexBuffer, 0, vk::IndexType::eUint32);
351 auto idDescriptorSet = index + frameInfos.imageIndex * attachmentSize;
352 commandBuffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, pipeline->
pipelineLayout, 0, 1, &descriptorSets[idDescriptorSet], 0,
nullptr);
355void BuffersControllerWarping:: updateCameraBuffer(uint32_t bufferId)
359 context->
device.mapMemory(uniformBuffersCamMemory[bufferId], 0,
sizeof(uboCam), {}, &data);
360 memcpy(data, &uboCam,
sizeof(uboCam));
361 context->
device.unmapMemory(uniformBuffersCamMemory[bufferId]);
366 updateCameraBuffer(currentImage);
373 updateCameraBuffer(index);
380 context->
device.mapMemory(uniformBuffersMemory[index], 0,
sizeof(ubo), {}, &data);
381 memcpy(data, &ubo,
sizeof(ubo));
386 context->
device.mapMemory(uniformBuffersGeomMemory[index], 0,
sizeof(uboGeom), {}, &dataGeom);
387 memcpy(dataGeom, &uboGeom,
sizeof(uboGeom));
388 context->
device.unmapMemory(uniformBuffersGeomMemory[index]);
392 context->
device.mapMemory(uniformBuffersFragMemory[index], 0,
sizeof(uboFrag), {}, &dataFrag);
393 memcpy(dataFrag, &uboFrag,
sizeof(uboFrag));
394 context->
device.unmapMemory(uniformBuffersFragMemory[index]);
403 vk::VertexInputBindingDescription bindingDescription{
406 vk::VertexInputRate::eVertex
408 return bindingDescription;
413 std::vector<vk::VertexInputAttributeDescription> attributeDescriptions{
414 vk::VertexInputAttributeDescription(
417 vk::Format::eR32Sfloat,
420 return attributeDescriptions;
429void BuffersControllerWarping::copyBufferToImage(vk::Buffer buffer, vk::Image image, uint32_t width, uint32_t height)
433 vk::ImageSubresourceLayers subRessources(
434 vk::ImageAspectFlagBits::eColor,
439 vk::BufferImageCopy region(
447 commandBuffer.copyBufferToImage(buffer,image,vk::ImageLayout::eTransferDstOptimal, 1, ®ion);
462 auto R_from = glmEulerAnglesDegreeToRotationMatrix(frameInfo.extrinsics.rotation);
468 R_to = (R_start * R_to * glm::transpose(R_start)) * R_start ;
471 auto R = glm::transpose(R_to) * R_from;
473 rvsCamExtrinsics.
R = glm::mat4(R);
475 auto t_from = frameInfo.extrinsics.position;
478 t_to = t_start + R_start * t_to;
481 auto T = -glm::transpose(R_to) * (t_to - t_from);
483 rvsCamExtrinsics.
t = glm::vec4(T,1);
486 rvsSynParam.
w = streamParams.depthResolution.x;
488 rvsSynParam.
h = streamParams.depthResolution.y;
493 switch (streamParams.projectionType) {
494 case InputProvider::ProjectionType::PROJECTION_PERSPECTIVE: {
495 rvsSynParam.
erp_in =
false;
496 rvsSynParam.
f = std::get<InputProvider::PerspectiveIntrinsics>(frameInfo.intrinsics).focals / (float(streamParams.colorResolution.x)/ streamParams.depthResolution.x);
497 rvsSynParam.
p = std::get<InputProvider::PerspectiveIntrinsics>(frameInfo.intrinsics).principle / (float(streamParams.colorResolution.x) / streamParams.depthResolution.x);
501 case InputProvider::ProjectionType::PROJECTION_EQUIRECTANGULAR: {
502 rvsSynParam.
erp_in =
true;
503 auto hor_range = std::get<InputProvider::EquirectangularIntrinsics>(frameInfo.intrinsics).horizontalRange;
504 auto ver_range = std::get<InputProvider::EquirectangularIntrinsics>(frameInfo.intrinsics).verticalRange;
505 auto constexpr radperdeg = 0.01745329252f;
506 rvsSynParam.
phi0 = radperdeg * hor_range[1];
507 rvsSynParam.
theta0 = radperdeg * ver_range[1];
508 rvsSynParam.
dphi_du = -radperdeg * (hor_range[1] - hor_range[0]) / rvsSynParam.
w;
509 rvsSynParam.
dtheta_dv = -radperdeg * (ver_range[1] - ver_range[0]) / rvsSynParam.
h;
513 throw std::runtime_error(
"Unsupported projection type for input");
520 case InputProvider::ProjectionType::PROJECTION_PERSPECTIVE: {
526 case InputProvider::ProjectionType::PROJECTION_EQUIRECTANGULAR: {
528 auto ver_range = std::get < InputProvider::EquirectangularIntrinsics>(wrapper->
params.
getVirtualIntrinsics(view)).verticalRange;
529 auto hor_range = std::get < InputProvider::EquirectangularIntrinsics>(wrapper->
params.
getVirtualIntrinsics(view)).horizontalRange;
530 auto constexpr degperrad = 57.295779513f;
531 rvsSynParam.
u0 = (hor_range[0] + hor_range[1]) / (hor_range[1] - hor_range[0]);
532 rvsSynParam.
v0 = -(ver_range[0] + ver_range[1]) / (ver_range[1] - ver_range[0]);
533 rvsSynParam.
du_dphi = -2.f * degperrad / (hor_range[1] - hor_range[0]);
534 rvsSynParam.
dv_dtheta = +2.f * degperrad / (ver_range[1] - ver_range[0]);
538 throw std::runtime_error(
"Unsupported projection type for input");
543 rvsSynParam.
min_depth = streamParams.nearDepth;
544 rvsSynParam.
max_depth = streamParams.farDepth;
554 updateSettings(frameInfo, view, streamParams, wrapper, rvsCamExtrinsics, rvsSynParam);
558 rvsSynGeom.
w = streamParams.depthResolution.x;
559 rvsSynGeom.
h = streamParams.depthResolution.y;
561 rvsSynFrag.
max_depth = streamParams.farDepth;
Class that manages the buffer for the warping step.
File that contain the VulkanContext class to manage Vulkan Instance, Physical device,...
Class that contains helper functions for Vulkan.
Contains the class that manages the warping pipeline.
file that contains the VulkanWrapper class that manages the classes related to Vulkan code and ease t...
void copyBuffer(vk::Buffer srcBuffer, vk::Buffer dstBuffer, vk::DeviceSize size)
VulkanRenderPass * renderpass
void update(std::span< InputProvider::StreamFrameInfo > infos, int view) override
BuffersControllerWarping(VulkanContext *context, VulkanRenderPass *renderpass, VulkanPipelineWarping *pipeline, InputProvider *input, VulkanWrapper *wraps, int inputView)
static std::vector< uint32_t > indices
static void updateSettings(const InputProvider::StreamFrameInfo &infos, int view, const InputProvider::StreamParameters &streamParams, VulkanWrapper *wrapper, RVScamExtrinsics &extrinsics, RvsSynParam ¶ms)
void updateAllUniformBuffer(uint32_t currentImage, int view) override
vk::VertexInputBindingDescription getBindingDescription() override
uint32_t getIndiceCount() override
void bindBuffers(vk::CommandBuffer &commandBuffer, int index, InputProvider::StreamFrameInfo &frameInfos, int view) override
void updateUniformBuffer(uint32_t currentImage, int view) override
std::vector< vk::VertexInputAttributeDescription > getAttributeDescription() override
const InputProvider::Extrinsics getVirtualExtrinsics(int view)
const glm::mat3x3 conversionToOMAF
const glm::vec3 getStartingPosition()
const glm::vec3 getStartingRotation()
std::vector< glm::vec2 > virtualViewDef
InputProvider::ProjectionType projectionType
const InputProvider::Intrinsics getVirtualIntrinsics(int view)
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 the graphic pipeline for the warping.
vk::CommandPool commandPoolBuffer
Class that manage the renderPass containing the synthesis and blending steps.
Class that manages the classes related to Vulkan code and act as a wrapper around them.
const bool multiviewSetup
RenderingParameters params
std::vector< bool > getCameraActivation()
Struct that contains camera extrinsics values that must be sent to vertex shader of the warping pipel...
Struct that contains datas for the fragment shader of the warping pipeline.
Struct that contains datas for the geometry shader of the warping pipeline.
Struct that contains parameters for the vertex shader in the warping pipeline.