Add handling for camera intrinsics
This commit is contained in:
@@ -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, ®ion);
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user