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 "vulkan/vk_renderdevice.h"
#include "vulkan/pipelines/vk_renderpass.h"
#include "vulkan/commands/vk_commandbuffer.h"
#include <zvulkan/vulkanbuilders.h>
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<uint32_t>((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;

View file

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

View file

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

View file

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

View file

@ -67,5 +67,5 @@ private:
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;
}
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(&copyptr[0], parmcnt, 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)
{
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