diff --git a/src/common/rendering/vulkan/buffers/vk_buffer.cpp b/src/common/rendering/vulkan/buffers/vk_buffer.cpp index cab8cf460c..6edafcbfe3 100644 --- a/src/common/rendering/vulkan/buffers/vk_buffer.cpp +++ b/src/common/rendering/vulkan/buffers/vk_buffer.cpp @@ -25,6 +25,8 @@ #include "vk_streambuffer.h" #include "vulkan/vk_renderdevice.h" #include "vulkan/pipelines/vk_renderpass.h" +#include "vulkan/commands/vk_commandbuffer.h" +#include VkBufferManager::VkBufferManager(VulkanRenderDevice* fb) : fb(fb) { @@ -40,14 +42,39 @@ void VkBufferManager::Init() StreamBuffer.reset(new VkStreamBuffer(this, sizeof(StreamUBO), 300)); Viewpoint.BlockAlign = (sizeof(HWViewpointUniforms) + fb->uniformblockalignment - 1) / fb->uniformblockalignment * fb->uniformblockalignment; - Viewpoint.UBO.reset(new VkHardwareDataBuffer(fb, false, true)); - Viewpoint.UBO->SetData(Viewpoint.Count * Viewpoint.BlockAlign, nullptr, BufferUsageType::Persistent); - Lightbuffer.SSO.reset(new VkHardwareDataBuffer(fb, true, false)); - Lightbuffer.SSO->SetData(Lightbuffer.Count * 4 * sizeof(FVector4), nullptr, BufferUsageType::Persistent); + Viewpoint.UBO = BufferBuilder() + .Usage(VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VMA_MEMORY_USAGE_UNKNOWN, VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT | VMA_ALLOCATION_CREATE_MAPPED_BIT) + .MemoryType( + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) + .Size(Viewpoint.Count * Viewpoint.BlockAlign) + .DebugName("Viewpoint.UBO") + .Create(fb->GetDevice()); - Bonebuffer.SSO.reset(new VkHardwareDataBuffer(fb, true, false)); - Bonebuffer.SSO->SetData(Bonebuffer.Count * sizeof(VSMatrix), nullptr, BufferUsageType::Persistent); + Viewpoint.Data = Viewpoint.UBO->Map(0, Viewpoint.UBO->size); + + Lightbuffer.SSO = BufferBuilder() + .Usage(VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VMA_MEMORY_USAGE_UNKNOWN, VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT | VMA_ALLOCATION_CREATE_MAPPED_BIT) + .MemoryType( + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) + .Size(Lightbuffer.Count * 4 * sizeof(FVector4)) + .DebugName("Lightbuffer.SSO") + .Create(fb->GetDevice()); + + Lightbuffer.Data = Lightbuffer.SSO->Map(0, Lightbuffer.SSO->size); + + Bonebuffer.SSO = BufferBuilder() + .Usage(VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VMA_MEMORY_USAGE_UNKNOWN, VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT | VMA_ALLOCATION_CREATE_MAPPED_BIT) + .MemoryType( + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) + .Size(Bonebuffer.Count * sizeof(VSMatrix)) + .DebugName("Bonebuffer.SSO") + .Create(fb->GetDevice()); + + Bonebuffer.Data = Bonebuffer.SSO->Map(0, Bonebuffer.SSO->size); Shadowmap.Nodes.reset(new VkHardwareDataBuffer(fb, true, false)); Shadowmap.Lines.reset(new VkHardwareDataBuffer(fb, true, false)); @@ -58,9 +85,18 @@ void VkBufferManager::Init() void VkBufferManager::Deinit() { + if (Viewpoint.UBO) + Viewpoint.UBO->Unmap(); Viewpoint.UBO.reset(); + + if (Lightbuffer.SSO) + Lightbuffer.SSO->Unmap(); Lightbuffer.SSO.reset(); + + if (Bonebuffer.SSO) + Bonebuffer.SSO->Unmap(); Bonebuffer.SSO.reset(); + Shadowmap.Nodes.reset(); Shadowmap.Lines.reset(); Shadowmap.Lights.reset(); @@ -111,19 +147,27 @@ VkStreamBuffer::VkStreamBuffer(VkBufferManager* buffers, size_t structSize, size { mBlockSize = static_cast((structSize + buffers->fb->uniformblockalignment - 1) / buffers->fb->uniformblockalignment * buffers->fb->uniformblockalignment); - UniformBuffer = new VkHardwareDataBuffer(buffers->fb, false, false); - UniformBuffer->SetData(mBlockSize * count, nullptr, BufferUsageType::Persistent); + UBO = BufferBuilder() + .Usage(VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VMA_MEMORY_USAGE_UNKNOWN, VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT | VMA_ALLOCATION_CREATE_MAPPED_BIT) + .MemoryType( + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) + .Size(mBlockSize * count) + .DebugName("VkStreamBuffer") + .Create(buffers->fb->GetDevice()); + + Data = UBO->Map(0, UBO->size); } VkStreamBuffer::~VkStreamBuffer() { - delete UniformBuffer; + UBO->Unmap(); } uint32_t VkStreamBuffer::NextStreamDataBlock() { mStreamDataOffset += mBlockSize; - if (mStreamDataOffset + (size_t)mBlockSize >= UniformBuffer->Size()) + if (mStreamDataOffset + (size_t)mBlockSize >= UBO->size) { mStreamDataOffset = 0; return 0xffffffff; diff --git a/src/common/rendering/vulkan/buffers/vk_buffer.h b/src/common/rendering/vulkan/buffers/vk_buffer.h index 491dfbee63..e3d9772186 100644 --- a/src/common/rendering/vulkan/buffers/vk_buffer.h +++ b/src/common/rendering/vulkan/buffers/vk_buffer.h @@ -32,21 +32,24 @@ public: int UploadIndex = 0; int BlockAlign = 0; int Count = 1000; - std::unique_ptr UBO; + std::unique_ptr UBO; + void* Data = nullptr; } Viewpoint; struct { int UploadIndex = 0; int Count = 80000; - std::unique_ptr SSO; + std::unique_ptr SSO; + void* Data = nullptr; } Lightbuffer; struct { int UploadIndex = 0; int Count = 80000; - std::unique_ptr SSO; + std::unique_ptr SSO; + void* Data = nullptr; } Bonebuffer; struct @@ -80,7 +83,8 @@ public: uint32_t NextStreamDataBlock(); void Reset() { mStreamDataOffset = 0; } - VkHardwareDataBuffer* UniformBuffer = nullptr; + std::unique_ptr UBO; + void* Data = nullptr; private: uint32_t mBlockSize = 0; diff --git a/src/common/rendering/vulkan/buffers/vk_streambuffer.cpp b/src/common/rendering/vulkan/buffers/vk_streambuffer.cpp index 5432786aeb..af6789812b 100644 --- a/src/common/rendering/vulkan/buffers/vk_streambuffer.cpp +++ b/src/common/rendering/vulkan/buffers/vk_streambuffer.cpp @@ -41,7 +41,7 @@ bool VkStreamBufferWriter::Write(const StreamData& data) if (mStreamDataOffset == 0xffffffff) return false; } - uint8_t* ptr = (uint8_t*)mBuffer->UniformBuffer->Memory(); + uint8_t* ptr = (uint8_t*)mBuffer->Data; memcpy(ptr + mStreamDataOffset + sizeof(StreamData) * mDataIndex, &data, sizeof(StreamData)); return true; } @@ -109,7 +109,7 @@ bool VkMatrixBufferWriter::Write(const VSMatrix& modelMatrix, bool modelMatrixEn if (mOffset == 0xffffffff) return false; - uint8_t* ptr = (uint8_t*)mBuffer->UniformBuffer->Memory(); + uint8_t* ptr = (uint8_t*)mBuffer->Data; memcpy(ptr + mOffset, &mMatrices, sizeof(MatricesUBO)); } diff --git a/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp b/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp index b25ad41a50..60a876498c 100644 --- a/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp +++ b/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.cpp @@ -81,11 +81,11 @@ void VkDescriptorSetManager::UpdateHWBufferSet() } WriteDescriptors() - .AddBuffer(HWBufferSet.get(), 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, fb->GetBufferManager()->Viewpoint.UBO->mBuffer.get(), 0, sizeof(HWViewpointUniforms)) - .AddBuffer(HWBufferSet.get(), 1, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, fb->GetBufferManager()->MatrixBuffer->UniformBuffer->mBuffer.get(), 0, sizeof(MatricesUBO)) - .AddBuffer(HWBufferSet.get(), 2, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, fb->GetBufferManager()->StreamBuffer->UniformBuffer->mBuffer.get(), 0, sizeof(StreamUBO)) - .AddBuffer(HWBufferSet.get(), 3, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetBufferManager()->Lightbuffer.SSO->mBuffer.get()) - .AddBuffer(HWBufferSet.get(), 4, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetBufferManager()->Bonebuffer.SSO->mBuffer.get()) + .AddBuffer(HWBufferSet.get(), 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, fb->GetBufferManager()->Viewpoint.UBO.get(), 0, sizeof(HWViewpointUniforms)) + .AddBuffer(HWBufferSet.get(), 1, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, fb->GetBufferManager()->MatrixBuffer->UBO.get(), 0, sizeof(MatricesUBO)) + .AddBuffer(HWBufferSet.get(), 2, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, fb->GetBufferManager()->StreamBuffer->UBO.get(), 0, sizeof(StreamUBO)) + .AddBuffer(HWBufferSet.get(), 3, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetBufferManager()->Lightbuffer.SSO.get()) + .AddBuffer(HWBufferSet.get(), 4, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetBufferManager()->Bonebuffer.SSO.get()) .Execute(fb->GetDevice()); } diff --git a/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.h b/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.h index bbba2a9188..f9be16ca41 100644 --- a/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.h +++ b/src/common/rendering/vulkan/descriptorsets/vk_descriptorset.h @@ -67,5 +67,5 @@ private: std::list Materials; - static const int maxSets = 10; + static const int maxSets = 100; }; diff --git a/src/common/rendering/vulkan/vk_renderstate.cpp b/src/common/rendering/vulkan/vk_renderstate.cpp index fa394040d7..38d764622d 100644 --- a/src/common/rendering/vulkan/vk_renderstate.cpp +++ b/src/common/rendering/vulkan/vk_renderstate.cpp @@ -490,7 +490,7 @@ int VkRenderState::SetViewpoint(const HWViewpointUniforms& vp) { return buffers->Viewpoint.Count - 1; } - memcpy(((char*)buffers->Viewpoint.UBO->Memory()) + buffers->Viewpoint.UploadIndex * buffers->Viewpoint.BlockAlign, &vp, sizeof(HWViewpointUniforms)); + memcpy(((char*)buffers->Viewpoint.Data) + buffers->Viewpoint.UploadIndex * buffers->Viewpoint.BlockAlign, &vp, sizeof(HWViewpointUniforms)); int index = buffers->Viewpoint.UploadIndex++; mViewpointOffset = index * buffers->Viewpoint.BlockAlign; mNeedApply = true; @@ -540,7 +540,7 @@ int VkRenderState::UploadLights(const FDynLightData& data) if (thisindex + totalsize <= buffers->Lightbuffer.Count) { - float* copyptr = (float*)buffers->Lightbuffer.SSO->Memory() + thisindex * 4; + float* copyptr = (float*)buffers->Lightbuffer.Data + thisindex * 4; memcpy(©ptr[0], parmcnt, sizeof(FVector4)); memcpy(©ptr[4], &data.arrays[0][0], size0 * sizeof(FVector4)); @@ -569,7 +569,7 @@ int VkRenderState::UploadBones(const TArray& bones) if (thisindex + totalsize <= buffers->Bonebuffer.Count) { - memcpy((VSMatrix*)buffers->Bonebuffer.SSO->Memory() + thisindex, bones.Data(), bones.Size() * sizeof(VSMatrix)); + memcpy((VSMatrix*)buffers->Bonebuffer.Data + thisindex, bones.Data(), bones.Size() * sizeof(VSMatrix)); return thisindex; } else