mirror of
https://github.com/ZDoom/gzdoom.git
synced 2025-02-08 17:32:09 +00:00
Don't use VkHardwareDataBuffer for internal backend buffers
This commit is contained in:
parent
b413c80e49
commit
fd3febaf7a
6 changed files with 73 additions and 25 deletions
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
||||
|
|
|
@ -67,5 +67,5 @@ private:
|
|||
|
||||
std::list<VkMaterial*> Materials;
|
||||
|
||||
static const int maxSets = 10;
|
||||
static const int maxSets = 100;
|
||||
};
|
||||
|
|
|
@ -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<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
|
||||
|
|
Loading…
Reference in a new issue