Don't use VkHardwareDataBuffer for internal backend buffers

This commit is contained in:
Magnus Norddahl 2023-05-05 22:04:11 +02:00 committed by Christoph Oelckers
parent b413c80e49
commit fd3febaf7a
6 changed files with 73 additions and 25 deletions

View file

@ -25,6 +25,8 @@
#include "vk_streambuffer.h" #include "vk_streambuffer.h"
#include "vulkan/vk_renderdevice.h" #include "vulkan/vk_renderdevice.h"
#include "vulkan/pipelines/vk_renderpass.h" #include "vulkan/pipelines/vk_renderpass.h"
#include "vulkan/commands/vk_commandbuffer.h"
#include <zvulkan/vulkanbuilders.h>
VkBufferManager::VkBufferManager(VulkanRenderDevice* fb) : fb(fb) VkBufferManager::VkBufferManager(VulkanRenderDevice* fb) : fb(fb)
{ {
@ -40,14 +42,39 @@ void VkBufferManager::Init()
StreamBuffer.reset(new VkStreamBuffer(this, sizeof(StreamUBO), 300)); StreamBuffer.reset(new VkStreamBuffer(this, sizeof(StreamUBO), 300));
Viewpoint.BlockAlign = (sizeof(HWViewpointUniforms) + fb->uniformblockalignment - 1) / fb->uniformblockalignment * fb->uniformblockalignment; 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)); Viewpoint.UBO = BufferBuilder()
Lightbuffer.SSO->SetData(Lightbuffer.Count * 4 * sizeof(FVector4), nullptr, BufferUsageType::Persistent); .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)); Viewpoint.Data = Viewpoint.UBO->Map(0, Viewpoint.UBO->size);
Bonebuffer.SSO->SetData(Bonebuffer.Count * sizeof(VSMatrix), nullptr, BufferUsageType::Persistent);
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.Nodes.reset(new VkHardwareDataBuffer(fb, true, false));
Shadowmap.Lines.reset(new VkHardwareDataBuffer(fb, true, false)); Shadowmap.Lines.reset(new VkHardwareDataBuffer(fb, true, false));
@ -58,9 +85,18 @@ void VkBufferManager::Init()
void VkBufferManager::Deinit() void VkBufferManager::Deinit()
{ {
if (Viewpoint.UBO)
Viewpoint.UBO->Unmap();
Viewpoint.UBO.reset(); Viewpoint.UBO.reset();
if (Lightbuffer.SSO)
Lightbuffer.SSO->Unmap();
Lightbuffer.SSO.reset(); Lightbuffer.SSO.reset();
if (Bonebuffer.SSO)
Bonebuffer.SSO->Unmap();
Bonebuffer.SSO.reset(); Bonebuffer.SSO.reset();
Shadowmap.Nodes.reset(); Shadowmap.Nodes.reset();
Shadowmap.Lines.reset(); Shadowmap.Lines.reset();
Shadowmap.Lights.reset(); Shadowmap.Lights.reset();
@ -111,19 +147,27 @@ VkStreamBuffer::VkStreamBuffer(VkBufferManager* buffers, size_t structSize, size
{ {
mBlockSize = static_cast<uint32_t>((structSize + buffers->fb->uniformblockalignment - 1) / buffers->fb->uniformblockalignment * buffers->fb->uniformblockalignment); mBlockSize = static_cast<uint32_t>((structSize + buffers->fb->uniformblockalignment - 1) / buffers->fb->uniformblockalignment * buffers->fb->uniformblockalignment);
UniformBuffer = new VkHardwareDataBuffer(buffers->fb, false, false); UBO = BufferBuilder()
UniformBuffer->SetData(mBlockSize * count, nullptr, BufferUsageType::Persistent); .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() VkStreamBuffer::~VkStreamBuffer()
{ {
delete UniformBuffer; UBO->Unmap();
} }
uint32_t VkStreamBuffer::NextStreamDataBlock() uint32_t VkStreamBuffer::NextStreamDataBlock()
{ {
mStreamDataOffset += mBlockSize; mStreamDataOffset += mBlockSize;
if (mStreamDataOffset + (size_t)mBlockSize >= UniformBuffer->Size()) if (mStreamDataOffset + (size_t)mBlockSize >= UBO->size)
{ {
mStreamDataOffset = 0; mStreamDataOffset = 0;
return 0xffffffff; return 0xffffffff;

View file

@ -32,21 +32,24 @@ public:
int UploadIndex = 0; int UploadIndex = 0;
int BlockAlign = 0; int BlockAlign = 0;
int Count = 1000; int Count = 1000;
std::unique_ptr<VkHardwareDataBuffer> UBO; std::unique_ptr<VulkanBuffer> UBO;
void* Data = nullptr;
} Viewpoint; } Viewpoint;
struct struct
{ {
int UploadIndex = 0; int UploadIndex = 0;
int Count = 80000; int Count = 80000;
std::unique_ptr<VkHardwareDataBuffer> SSO; std::unique_ptr<VulkanBuffer> SSO;
void* Data = nullptr;
} Lightbuffer; } Lightbuffer;
struct struct
{ {
int UploadIndex = 0; int UploadIndex = 0;
int Count = 80000; int Count = 80000;
std::unique_ptr<VkHardwareDataBuffer> SSO; std::unique_ptr<VulkanBuffer> SSO;
void* Data = nullptr;
} Bonebuffer; } Bonebuffer;
struct struct
@ -80,7 +83,8 @@ public:
uint32_t NextStreamDataBlock(); uint32_t NextStreamDataBlock();
void Reset() { mStreamDataOffset = 0; } void Reset() { mStreamDataOffset = 0; }
VkHardwareDataBuffer* UniformBuffer = nullptr; std::unique_ptr<VulkanBuffer> UBO;
void* Data = nullptr;
private: private:
uint32_t mBlockSize = 0; uint32_t mBlockSize = 0;

View file

@ -41,7 +41,7 @@ bool VkStreamBufferWriter::Write(const StreamData& data)
if (mStreamDataOffset == 0xffffffff) if (mStreamDataOffset == 0xffffffff)
return false; 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)); memcpy(ptr + mStreamDataOffset + sizeof(StreamData) * mDataIndex, &data, sizeof(StreamData));
return true; return true;
} }
@ -109,7 +109,7 @@ bool VkMatrixBufferWriter::Write(const VSMatrix& modelMatrix, bool modelMatrixEn
if (mOffset == 0xffffffff) if (mOffset == 0xffffffff)
return false; return false;
uint8_t* ptr = (uint8_t*)mBuffer->UniformBuffer->Memory(); uint8_t* ptr = (uint8_t*)mBuffer->Data;
memcpy(ptr + mOffset, &mMatrices, sizeof(MatricesUBO)); memcpy(ptr + mOffset, &mMatrices, sizeof(MatricesUBO));
} }

View file

@ -81,11 +81,11 @@ void VkDescriptorSetManager::UpdateHWBufferSet()
} }
WriteDescriptors() WriteDescriptors()
.AddBuffer(HWBufferSet.get(), 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, fb->GetBufferManager()->Viewpoint.UBO->mBuffer.get(), 0, sizeof(HWViewpointUniforms)) .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->UniformBuffer->mBuffer.get(), 0, sizeof(MatricesUBO)) .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->UniformBuffer->mBuffer.get(), 0, sizeof(StreamUBO)) .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->mBuffer.get()) .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->mBuffer.get()) .AddBuffer(HWBufferSet.get(), 4, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetBufferManager()->Bonebuffer.SSO.get())
.Execute(fb->GetDevice()); .Execute(fb->GetDevice());
} }

View file

@ -67,5 +67,5 @@ private:
std::list<VkMaterial*> Materials; std::list<VkMaterial*> Materials;
static const int maxSets = 10; static const int maxSets = 100;
}; };

View file

@ -490,7 +490,7 @@ int VkRenderState::SetViewpoint(const HWViewpointUniforms& vp)
{ {
return buffers->Viewpoint.Count - 1; 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++; int index = buffers->Viewpoint.UploadIndex++;
mViewpointOffset = index * buffers->Viewpoint.BlockAlign; mViewpointOffset = index * buffers->Viewpoint.BlockAlign;
mNeedApply = true; mNeedApply = true;
@ -540,7 +540,7 @@ int VkRenderState::UploadLights(const FDynLightData& data)
if (thisindex + totalsize <= buffers->Lightbuffer.Count) if (thisindex + totalsize <= buffers->Lightbuffer.Count)
{ {
float* copyptr = (float*)buffers->Lightbuffer.SSO->Memory() + thisindex * 4; float* copyptr = (float*)buffers->Lightbuffer.Data + thisindex * 4;
memcpy(&copyptr[0], parmcnt, sizeof(FVector4)); memcpy(&copyptr[0], parmcnt, sizeof(FVector4));
memcpy(&copyptr[4], &data.arrays[0][0], size0 * sizeof(FVector4)); memcpy(&copyptr[4], &data.arrays[0][0], size0 * sizeof(FVector4));
@ -569,7 +569,7 @@ int VkRenderState::UploadBones(const TArray<VSMatrix>& bones)
if (thisindex + totalsize <= buffers->Bonebuffer.Count) 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; return thisindex;
} }
else else