|
|
|
|
@@ -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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|