Add handling for camera intrinsics

This commit is contained in:
Georg Hagen
2024-07-07 16:53:48 +02:00
parent 5b2a2bbf72
commit aabc24616d
18 changed files with 447 additions and 213 deletions

View File

@@ -185,7 +185,7 @@ namespace OpenVulkano::Vulkan
}
}
void Copy(void* data, uint32_t size, uint32_t offset)
void Copy(const void* data, uint32_t size, uint32_t offset)
{
if(mapped) memcpy(static_cast<char*>(mapped) + offset, data, size);
else

View File

@@ -8,14 +8,16 @@
#include "Scene/Vertex.hpp"
#include "Scene/Geometry.hpp"
#include "Scene/Material.hpp"
#include "Scene/UniformBuffer.hpp"
#include "Math/ByteSize.hpp"
#include "Vulkan/Context.hpp"
#include "Vulkan/Image.hpp"
#include "Vulkan/Scene/VulkanShader.hpp"
#include "Vulkan/Scene/VulkanGeometry.hpp"
#include "Vulkan/Scene/VulkanNode.hpp"
#include "Vulkan/Scene/VulkanTexture.hpp"
#include "Vulkan/Image.hpp"
#include "Vulkan/Scene/VulkanCamera.hpp"
#include "Vulkan/Scene/VulkanUniformBuffer.hpp"
namespace OpenVulkano::Vulkan
{
@@ -287,10 +289,12 @@ namespace OpenVulkano::Vulkan
ManagedBuffer* uploadBuffer = CreateBuffer(size, vk::BufferUsageFlagBits::eTransferSrc, vk::MemoryPropertyFlagBits::eHostCoherent | vk::MemoryPropertyFlagBits::eHostVisible);
uploadBuffer->Copy(data, size, 0);
image->SetLayout(cmdBuffers[currentBuffer], vk::ImageAspectFlagBits::eColor, vk::ImageLayout::eTransferDstOptimal);
vk::BufferImageCopy region(0, 0, 0, { vk::ImageAspectFlagBits::eColor, 0, 0, 1 }, { 0, 0, 0 }, image->extent);
cmdBuffers[currentBuffer].copyBufferToImage(uploadBuffer->buffer, image->image, vk::ImageLayout::eTransferDstOptimal, 1, &region);
vk::ImageMemoryBarrier barrier {};
/*vk::ImageMemoryBarrier barrier {};
barrier.oldLayout = vk::ImageLayout::eUndefined;
barrier.newLayout = vk::ImageLayout::eShaderReadOnlyOptimal;
barrier.image = image->image;
@@ -300,15 +304,17 @@ namespace OpenVulkano::Vulkan
barrier.subresourceRange.baseArrayLayer = 0;
barrier.subresourceRange.layerCount = 1;
barrier.setSrcAccessMask({});
barrier.setDstAccessMask(vk::AccessFlagBits::eTransferWrite);
barrier.setDstAccessMask(vk::AccessFlagBits::eTransferWrite);*/
image->SetLayout(cmdBuffers[currentBuffer], vk::ImageAspectFlagBits::eColor, vk::ImageLayout::eShaderReadOnlyOptimal, vk::ImageLayout::eTransferDstOptimal);
// TODO set access masks for mip and array layers
cmdBuffers[currentBuffer].pipelineBarrier(vk::PipelineStageFlagBits::eTopOfPipe, vk::PipelineStageFlagBits::eTransfer, {}, 0, nullptr, 0, nullptr, 1, &barrier );
//cmdBuffers[currentBuffer].pipelineBarrier(vk::PipelineStageFlagBits::eTopOfPipe, vk::PipelineStageFlagBits::eTransfer, {}, 0, nullptr, 0, nullptr, 1, &barrier );
FreeBuffer(uploadBuffer);
}
ManagedBuffer* ResourceManager::CreateDeviceOnlyBufferWithData(vk::DeviceSize size, vk::BufferUsageFlagBits usage, void* data)
ManagedBuffer* ResourceManager::CreateDeviceOnlyBufferWithData(vk::DeviceSize size, vk::BufferUsageFlagBits usage, const void* data)
{
ManagedBuffer* target = CreateBuffer(size, usage | vk::BufferUsageFlagBits::eTransferDst, vk::MemoryPropertyFlagBits::eDeviceLocal);
ManagedBuffer* uploadBuffer = CreateBuffer(size, vk::BufferUsageFlagBits::eTransferSrc, vk::MemoryPropertyFlagBits::eHostCoherent | vk::MemoryPropertyFlagBits::eHostVisible);
@@ -389,4 +395,36 @@ namespace OpenVulkano::Vulkan
return vkTexture;
}
VulkanUniformBuffer* ResourceManager::PrepareUniformBuffer(Scene::UniformBuffer* buffer)
{
const std::unique_lock lock(mutex);
if (buffer->renderBuffer) return static_cast<VulkanUniformBuffer*>(buffer->renderBuffer);
VulkanUniformBuffer* vkBuffer;
ManagedBuffer* mBuffer;
const vk::DeviceSize allocSize = Utils::Align(buffer->size, uniformBufferAlignment);
vk::DeviceSize frameSize = 0;
if (buffer->GetUpdateFrequency() != Scene::UpdateFrequency::Never)
{
frameSize = allocSize;
vkBuffer = new VulkanUniformBufferDynamic();
const uint32_t imgs = context->swapChain.GetImageCount();
mBuffer = CreateBuffer(imgs * allocSize, vk::BufferUsageFlagBits::eUniformBuffer, vk::MemoryPropertyFlagBits::eHostCoherent | vk::MemoryPropertyFlagBits::eHostVisible);
mBuffer->Map();
}
else
{
vkBuffer = new VulkanUniformBuffer();
mBuffer = CreateDeviceOnlyBufferWithData(Scene::Node::SIZE, vk::BufferUsageFlagBits::eUniformBuffer, buffer->data);
buffer->updated = false;
}
UniformBuffer* uBuffer = new UniformBuffer();
uBuffer->Init(mBuffer, 0, mBuffer->size, GetDescriptorLayoutSet(buffer->binding), buffer->binding, buffer->setId);
vkBuffer->Init(buffer, uBuffer);
return vkBuffer;
}
}

View File

@@ -26,6 +26,7 @@ namespace OpenVulkano
class Material;
class Texture;
class Shader;
class UniformBuffer;
}
namespace Vulkan
@@ -35,6 +36,7 @@ namespace OpenVulkano
class VulkanTexture;
class VulkanCamera;
class VulkanNode;
class VulkanUniformBuffer;
class UniformBuffer;
class ResourceManager : public ICloseable, public IShaderOwner
@@ -84,6 +86,8 @@ namespace OpenVulkano
void PrepareMaterial(Scene::Material* material);
VulkanUniformBuffer* PrepareUniformBuffer(Scene::UniformBuffer* buffer);
VulkanNode* PrepareNode(Scene::Node* node);
VulkanTexture* PrepareTexture(Scene::Texture* texture);
@@ -109,7 +113,7 @@ namespace OpenVulkano
void FreeBuffers();
ManagedBuffer* CreateDeviceOnlyBufferWithData(vk::DeviceSize size, vk::BufferUsageFlagBits usage, void* data);
ManagedBuffer* CreateDeviceOnlyBufferWithData(vk::DeviceSize size, vk::BufferUsageFlagBits usage, const void* data);
inline void RecordCopy(vk::Buffer src, vk::Buffer dest, vk::DeviceSize size) const
{

View File

@@ -40,7 +40,7 @@ namespace OpenVulkano::Vulkan
drawContext->commandBuffer.bindDescriptorSets(vk::PipelineBindPoint::eGraphics, drawContext->GetShader()->pipelineLayout, m_setOffset, m_setCount, &m_descriptorSet, (m_dynamic) ? 1 : 0, &frameOffset);
}
void UniformBuffer::Update(void* data, uint32_t size, uint32_t bufferId) const
void UniformBuffer::Update(const void* data, uint32_t size, uint32_t bufferId) const
{
m_buffer->Copy(data, size, m_frameOffset * bufferId);
}

View File

@@ -33,6 +33,6 @@ namespace OpenVulkano::Vulkan
void Record(VulkanDrawContext* drawContext) override;
void Update(void* data, uint32_t size, uint32_t bufferId) const;
void Update(const void* data, uint32_t size, uint32_t bufferId) const;
};
}