Manage buffers in VkBufferManager

This commit is contained in:
Magnus Norddahl 2022-06-11 03:27:18 +02:00 committed by Christoph Oelckers
parent ef802b85e7
commit 69cfadf411
11 changed files with 190 additions and 154 deletions

View file

@ -31,6 +31,7 @@
#include "vulkan/system/vk_framebuffer.h"
#include "vulkan/system/vk_hwbuffer.h"
#include "vulkan/system/vk_commandbuffer.h"
#include "vulkan/system/vk_buffer.h"
#include "flatvertices.h"
#include "hw_viewpointuniforms.h"
#include "v_2ddrawer.h"
@ -75,9 +76,9 @@ void VkDescriptorSetManager::CreateDynamicSet()
void VkDescriptorSetManager::UpdateDynamicSet()
{
WriteDescriptors update;
update.addBuffer(DynamicSet.get(), 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, fb->ViewpointUBO->mBuffer.get(), 0, sizeof(HWViewpointUniforms));
update.addBuffer(DynamicSet.get(), 1, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, fb->MatrixBuffer->UniformBuffer->mBuffer.get(), 0, sizeof(MatricesUBO));
update.addBuffer(DynamicSet.get(), 2, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, fb->StreamBuffer->UniformBuffer->mBuffer.get(), 0, sizeof(StreamUBO));
update.addBuffer(DynamicSet.get(), 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, fb->GetBufferManager()->ViewpointUBO->mBuffer.get(), 0, sizeof(HWViewpointUniforms));
update.addBuffer(DynamicSet.get(), 1, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, fb->GetBufferManager()->MatrixBuffer->UniformBuffer->mBuffer.get(), 0, sizeof(MatricesUBO));
update.addBuffer(DynamicSet.get(), 2, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, fb->GetBufferManager()->StreamBuffer->UniformBuffer->mBuffer.get(), 0, sizeof(StreamUBO));
update.updateSets(fb->device);
}
@ -111,7 +112,7 @@ void VkDescriptorSetManager::UpdateFixedSet()
WriteDescriptors update;
update.addCombinedImageSampler(FixedSet.get(), 0, fb->GetBuffers()->Shadowmap.View.get(), fb->GetBuffers()->ShadowmapSampler.get(), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
update.addCombinedImageSampler(FixedSet.get(), 1, fb->GetBuffers()->Lightmap.View.get(), fb->GetBuffers()->LightmapSampler.get(), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
update.addBuffer(FixedSet.get(), 2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->LightBufferSSO->mBuffer.get());
update.addBuffer(FixedSet.get(), 2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetBufferManager()->LightBufferSSO->mBuffer.get());
if (fb->device->SupportsDeviceExtension(VK_KHR_RAY_QUERY_EXTENSION_NAME))
update.addAccelerationStructure(FixedSet.get(), 3, fb->GetRaytrace()->GetAccelStruct());
update.updateSets(fb->device);

View file

@ -25,6 +25,7 @@
#include "vulkan/system/vk_framebuffer.h"
#include "vulkan/system/vk_commandbuffer.h"
#include "vulkan/system/vk_swapchain.h"
#include "vulkan/system/vk_buffer.h"
#include "vulkan/shaders/vk_ppshader.h"
#include "vulkan/textures/vk_pptexture.h"
#include "vulkan/textures/vk_renderbuffers.h"
@ -155,9 +156,9 @@ VulkanDescriptorSet *VkPPRenderState::GetInput(VkPPRenderPassSetup *passSetup, c
if (bindShadowMapBuffers)
{
write.addBuffer(descriptors.get(), LIGHTNODES_BINDINGPOINT, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->LightNodes->mBuffer.get());
write.addBuffer(descriptors.get(), LIGHTLINES_BINDINGPOINT, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->LightLines->mBuffer.get());
write.addBuffer(descriptors.get(), LIGHTLIST_BINDINGPOINT, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->LightList->mBuffer.get());
write.addBuffer(descriptors.get(), LIGHTNODES_BINDINGPOINT, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetBufferManager()->LightNodes->mBuffer.get());
write.addBuffer(descriptors.get(), LIGHTLINES_BINDINGPOINT, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetBufferManager()->LightLines->mBuffer.get());
write.addBuffer(descriptors.get(), LIGHTLIST_BINDINGPOINT, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, fb->GetBufferManager()->LightList->mBuffer.get());
}
write.updateSets(fb->device);

View file

@ -24,6 +24,7 @@
#include "vulkan/system/vk_framebuffer.h"
#include "vulkan/system/vk_builders.h"
#include "vulkan/system/vk_commandbuffer.h"
#include "vulkan/system/vk_buffer.h"
#include "vulkan/renderer/vk_renderpass.h"
#include "vulkan/renderer/vk_descriptorset.h"
#include "vulkan/textures/vk_renderbuffers.h"
@ -586,7 +587,7 @@ void VkRenderStateMolten::Draw(int dt, int index, int count, bool apply)
if (dt == DT_TriangleFan)
{
IIndexBuffer *oldIndexBuffer = mIndexBuffer;
mIndexBuffer = fb->FanToTrisIndexBuffer.get();
mIndexBuffer = fb->GetBufferManager()->FanToTrisIndexBuffer.get();
if (apply || mNeedApply)
Apply(DT_Triangles);

View file

@ -23,37 +23,12 @@
#include "vk_renderstate.h"
#include "vulkan/system/vk_framebuffer.h"
#include "vulkan/system/vk_builders.h"
#include "vulkan/system/vk_buffer.h"
#include "vulkan/renderer/vk_streambuffer.h"
VkStreamBuffer::VkStreamBuffer(VulkanFrameBuffer* fb, size_t structSize, size_t count)
{
mBlockSize = static_cast<uint32_t>((structSize + screen->uniformblockalignment - 1) / screen->uniformblockalignment * screen->uniformblockalignment);
UniformBuffer = (VkHardwareDataBuffer*)fb->CreateDataBuffer(-1, false, false);
UniformBuffer->SetData(mBlockSize * count, nullptr, BufferUsageType::Persistent);
}
VkStreamBuffer::~VkStreamBuffer()
{
delete UniformBuffer;
}
uint32_t VkStreamBuffer::NextStreamDataBlock()
{
mStreamDataOffset += mBlockSize;
if (mStreamDataOffset + (size_t)mBlockSize >= UniformBuffer->Size())
{
mStreamDataOffset = 0;
return 0xffffffff;
}
return mStreamDataOffset;
}
/////////////////////////////////////////////////////////////////////////////
VkStreamBufferWriter::VkStreamBufferWriter(VulkanFrameBuffer* fb)
{
mBuffer = fb->StreamBuffer;
mBuffer = fb->GetBufferManager()->StreamBuffer;
}
bool VkStreamBufferWriter::Write(const StreamData& data)
@ -82,7 +57,7 @@ void VkStreamBufferWriter::Reset()
VkMatrixBufferWriter::VkMatrixBufferWriter(VulkanFrameBuffer* fb)
{
mBuffer = fb->MatrixBuffer;
mBuffer = fb->GetBufferManager()->MatrixBuffer;
mIdentityMatrix.loadIdentity();
}

View file

@ -40,19 +40,3 @@ private:
VSMatrix mIdentityMatrix;
uint32_t mOffset = 0;
};
class VkStreamBuffer
{
public:
VkStreamBuffer(VulkanFrameBuffer* fb, size_t structSize, size_t count);
~VkStreamBuffer();
uint32_t NextStreamDataBlock();
void Reset() { mStreamDataOffset = 0; }
VkHardwareDataBuffer* UniformBuffer = nullptr;
private:
uint32_t mBlockSize = 0;
uint32_t mStreamDataOffset = 0;
};

View file

@ -21,6 +21,9 @@
*/
#include "vk_buffer.h"
#include "vk_hwbuffer.h"
#include "vulkan/renderer/vk_streambuffer.h"
#include "hwrenderer/data/shaderuniforms.h"
VkBufferManager::VkBufferManager(VulkanFrameBuffer* fb) : fb(fb)
{
@ -28,4 +31,99 @@ VkBufferManager::VkBufferManager(VulkanFrameBuffer* fb) : fb(fb)
VkBufferManager::~VkBufferManager()
{
delete MatrixBuffer;
delete StreamBuffer;
}
void VkBufferManager::Init()
{
MatrixBuffer = new VkStreamBuffer(this, sizeof(MatricesUBO), 50000);
StreamBuffer = new VkStreamBuffer(this, sizeof(StreamUBO), 300);
CreateFanToTrisIndexBuffer();
}
void VkBufferManager::AddBuffer(VkHardwareBuffer* buffer)
{
buffer->it = Buffers.insert(Buffers.end(), buffer);
}
void VkBufferManager::RemoveBuffer(VkHardwareBuffer* buffer)
{
buffer->Reset();
buffer->fb = nullptr;
Buffers.erase(buffer->it);
for (VkHardwareDataBuffer** knownbuf : { &ViewpointUBO, &LightBufferSSO, &LightNodes, &LightLines, &LightList })
{
if (buffer == *knownbuf) *knownbuf = nullptr;
}
}
IVertexBuffer* VkBufferManager::CreateVertexBuffer()
{
return new VkHardwareVertexBuffer(fb);
}
IIndexBuffer* VkBufferManager::CreateIndexBuffer()
{
return new VkHardwareIndexBuffer(fb);
}
IDataBuffer* VkBufferManager::CreateDataBuffer(int bindingpoint, bool ssbo, bool needsresize)
{
auto buffer = new VkHardwareDataBuffer(fb, bindingpoint, ssbo, needsresize);
switch (bindingpoint)
{
case LIGHTBUF_BINDINGPOINT: LightBufferSSO = buffer; break;
case VIEWPOINT_BINDINGPOINT: ViewpointUBO = buffer; break;
case LIGHTNODES_BINDINGPOINT: LightNodes = buffer; break;
case LIGHTLINES_BINDINGPOINT: LightLines = buffer; break;
case LIGHTLIST_BINDINGPOINT: LightList = buffer; break;
case POSTPROCESS_BINDINGPOINT: break;
default: break;
}
return buffer;
}
void VkBufferManager::CreateFanToTrisIndexBuffer()
{
TArray<uint32_t> data;
for (int i = 2; i < 1000; i++)
{
data.Push(0);
data.Push(i - 1);
data.Push(i);
}
FanToTrisIndexBuffer.reset(CreateIndexBuffer());
FanToTrisIndexBuffer->SetData(sizeof(uint32_t) * data.Size(), data.Data(), BufferUsageType::Static);
}
/////////////////////////////////////////////////////////////////////////////
VkStreamBuffer::VkStreamBuffer(VkBufferManager* buffers, size_t structSize, size_t count)
{
mBlockSize = static_cast<uint32_t>((structSize + screen->uniformblockalignment - 1) / screen->uniformblockalignment * screen->uniformblockalignment);
UniformBuffer = (VkHardwareDataBuffer*)buffers->CreateDataBuffer(-1, false, false);
UniformBuffer->SetData(mBlockSize * count, nullptr, BufferUsageType::Persistent);
}
VkStreamBuffer::~VkStreamBuffer()
{
delete UniformBuffer;
}
uint32_t VkStreamBuffer::NextStreamDataBlock()
{
mStreamDataOffset += mBlockSize;
if (mStreamDataOffset + (size_t)mBlockSize >= UniformBuffer->Size())
{
mStreamDataOffset = 0;
return 0xffffffff;
}
return mStreamDataOffset;
}

View file

@ -2,8 +2,15 @@
#pragma once
#include "vulkan/system/vk_objects.h"
#include <list>
class VulkanFrameBuffer;
class VkHardwareBuffer;
class VkHardwareDataBuffer;
class VkStreamBuffer;
class IIndexBuffer;
class IVertexBuffer;
class IDataBuffer;
class VkBufferManager
{
@ -11,6 +18,46 @@ public:
VkBufferManager(VulkanFrameBuffer* fb);
~VkBufferManager();
void Init();
IVertexBuffer* CreateVertexBuffer();
IIndexBuffer* CreateIndexBuffer();
IDataBuffer* CreateDataBuffer(int bindingpoint, bool ssbo, bool needsresize);
void AddBuffer(VkHardwareBuffer* buffer);
void RemoveBuffer(VkHardwareBuffer* buffer);
VkHardwareDataBuffer* ViewpointUBO = nullptr;
VkHardwareDataBuffer* LightBufferSSO = nullptr;
VkHardwareDataBuffer* LightNodes = nullptr;
VkHardwareDataBuffer* LightLines = nullptr;
VkHardwareDataBuffer* LightList = nullptr;
VkStreamBuffer* MatrixBuffer = nullptr;
VkStreamBuffer* StreamBuffer = nullptr;
std::unique_ptr<IIndexBuffer> FanToTrisIndexBuffer;
private:
void CreateFanToTrisIndexBuffer();
VulkanFrameBuffer* fb = nullptr;
std::list<VkHardwareBuffer*> Buffers;
};
class VkStreamBuffer
{
public:
VkStreamBuffer(VkBufferManager* buffers, size_t structSize, size_t count);
~VkStreamBuffer();
uint32_t NextStreamDataBlock();
void Reset() { mStreamDataOffset = 0; }
VkHardwareDataBuffer* UniformBuffer = nullptr;
private:
uint32_t mBlockSize = 0;
uint32_t mStreamDataOffset = 0;
};

View file

@ -85,12 +85,6 @@ VulkanFrameBuffer::~VulkanFrameBuffer()
{
vkDeviceWaitIdle(device->device); // make sure the GPU is no longer using any objects before RAII tears them down
// All descriptors must be destroyed before the descriptor pool in renderpass manager is destroyed
VkHardwareBuffer::ResetAll();
PPResource::ResetAll();
delete MatrixBuffer;
delete StreamBuffer;
delete mVertexData;
delete mSkyData;
delete mViewpoints;
@ -128,6 +122,7 @@ void VulkanFrameBuffer::InitializeState()
mSamplerManager.reset(new VkSamplerManager(this));
mTextureManager.reset(new VkTextureManager(this));
mBufferManager.reset(new VkBufferManager(this));
mBufferManager->Init();
mScreenBuffers.reset(new VkRenderBuffers(this));
mSaveBuffers.reset(new VkRenderBuffers(this));
@ -143,12 +138,6 @@ void VulkanFrameBuffer::InitializeState()
mViewpoints = new HWViewpointBuffer;
mLights = new FLightBuffer();
CreateFanToTrisIndexBuffer();
// To do: move this to HW renderer interface maybe?
MatrixBuffer = new VkStreamBuffer(this, sizeof(MatricesUBO), 50000);
StreamBuffer = new VkStreamBuffer(this, sizeof(StreamUBO), 300);
mShaderManager.reset(new VkShaderManager(device));
mDescriptorSetManager->Init();
#ifdef __APPLE__
@ -231,11 +220,9 @@ const char* VulkanFrameBuffer::DeviceName() const
return props.deviceName;
}
void VulkanFrameBuffer::SetVSync(bool vsync)
{
// This is handled in VulkanSwapChain::AcquireImage.
cur_vsync = vsync;
mVSync = vsync;
}
void VulkanFrameBuffer::PrecacheMaterial(FMaterial *mat, int translation)
@ -267,30 +254,17 @@ FMaterial* VulkanFrameBuffer::CreateMaterial(FGameTexture* tex, int scaleflags)
IVertexBuffer *VulkanFrameBuffer::CreateVertexBuffer()
{
return new VkHardwareVertexBuffer();
return GetBufferManager()->CreateVertexBuffer();
}
IIndexBuffer *VulkanFrameBuffer::CreateIndexBuffer()
{
return new VkHardwareIndexBuffer();
return GetBufferManager()->CreateIndexBuffer();
}
IDataBuffer *VulkanFrameBuffer::CreateDataBuffer(int bindingpoint, bool ssbo, bool needsresize)
{
auto buffer = new VkHardwareDataBuffer(bindingpoint, ssbo, needsresize);
switch (bindingpoint)
{
case LIGHTBUF_BINDINGPOINT: LightBufferSSO = buffer; break;
case VIEWPOINT_BINDINGPOINT: ViewpointUBO = buffer; break;
case LIGHTNODES_BINDINGPOINT: LightNodes = buffer; break;
case LIGHTLINES_BINDINGPOINT: LightLines = buffer; break;
case LIGHTLIST_BINDINGPOINT: LightList = buffer; break;
case POSTPROCESS_BINDINGPOINT: break;
default: break;
}
return buffer;
return GetBufferManager()->CreateDataBuffer(bindingpoint, ssbo, needsresize);
}
void VulkanFrameBuffer::SetTextureFilterMode()
@ -556,20 +530,6 @@ void VulkanFrameBuffer::PrintStartupLog()
Printf("Min. uniform buffer offset alignment: %" PRIu64 "\n", limits.minUniformBufferOffsetAlignment);
}
void VulkanFrameBuffer::CreateFanToTrisIndexBuffer()
{
TArray<uint32_t> data;
for (int i = 2; i < 1000; i++)
{
data.Push(0);
data.Push(i - 1);
data.Push(i);
}
FanToTrisIndexBuffer.reset(CreateIndexBuffer());
FanToTrisIndexBuffer->SetData(sizeof(uint32_t) * data.Size(), data.Data(), BufferUsageType::Static);
}
void VulkanFrameBuffer::SetLevelMesh(hwrenderer::LevelMesh* mesh)
{
mRaytrace->SetLevelMesh(mesh);

View file

@ -44,17 +44,6 @@ public:
unsigned int GetLightBufferBlockSize() const;
VkHardwareDataBuffer *ViewpointUBO = nullptr;
VkHardwareDataBuffer *LightBufferSSO = nullptr;
VkStreamBuffer *MatrixBuffer = nullptr;
VkStreamBuffer *StreamBuffer = nullptr;
VkHardwareDataBuffer *LightNodes = nullptr;
VkHardwareDataBuffer *LightLines = nullptr;
VkHardwareDataBuffer *LightList = nullptr;
std::unique_ptr<IIndexBuffer> FanToTrisIndexBuffer;
VulkanFrameBuffer(void *hMonitor, bool fullscreen, VulkanDevice *dev);
~VulkanFrameBuffer();
bool IsVulkan() override { return true; }
@ -92,7 +81,7 @@ public:
TArray<uint8_t> GetScreenshotBuffer(int &pitch, ESSType &color_type, float &gamma) override;
bool GetVSync() { return cur_vsync; }
bool GetVSync() { return mVSync; }
void SetVSync(bool vsync) override;
void Draw2D() override;
@ -102,7 +91,6 @@ public:
private:
void RenderTextureView(FCanvasTexture* tex, std::function<void(IntRect &)> renderFunc) override;
void PrintStartupLog();
void CreateFanToTrisIndexBuffer();
void CopyScreenToBuffer(int w, int h, uint8_t *data) override;
std::unique_ptr<VkCommandBufferManager> mCommands;
@ -120,7 +108,7 @@ private:
VkRenderBuffers *mActiveRenderBuffers = nullptr;
bool cur_vsync = false;
bool mVSync = false;
};
inline VulkanFrameBuffer *GetVulkanFrameBuffer() { return static_cast<VulkanFrameBuffer*>(screen); }

View file

@ -24,31 +24,31 @@
#include "vk_builders.h"
#include "vk_framebuffer.h"
#include "vk_commandbuffer.h"
#include "vk_buffer.h"
#include "vulkan/renderer/vk_renderstate.h"
#include "vulkan/renderer/vk_descriptorset.h"
#include "engineerrors.h"
VkHardwareBuffer *VkHardwareBuffer::First = nullptr;
VkHardwareBuffer::VkHardwareBuffer()
VkHardwareBuffer::VkHardwareBuffer(VulkanFrameBuffer* fb) : fb(fb)
{
Next = First;
First = this;
if (Next) Next->Prev = this;
fb->GetBufferManager()->AddBuffer(this);
}
VkHardwareBuffer::~VkHardwareBuffer()
{
if (Next) Next->Prev = Prev;
if (Prev) Prev->Next = Next;
else First = Next;
if (fb)
fb->GetBufferManager()->RemoveBuffer(this);
}
if (mBuffer && map)
mBuffer->Unmap();
auto fb = GetVulkanFrameBuffer();
void VkHardwareBuffer::Reset()
{
if (fb)
{
if (mBuffer && map)
{
mBuffer->Unmap();
map = nullptr;
}
if (mBuffer)
fb->GetCommands()->FrameDeleteList.Buffers.push_back(std::move(mBuffer));
if (mStaging)
@ -56,24 +56,8 @@ VkHardwareBuffer::~VkHardwareBuffer()
}
}
void VkHardwareBuffer::ResetAll()
{
for (VkHardwareBuffer *cur = VkHardwareBuffer::First; cur; cur = cur->Next)
cur->Reset();
}
void VkHardwareBuffer::Reset()
{
if (mBuffer && map)
mBuffer->Unmap();
mBuffer.reset();
mStaging.reset();
}
void VkHardwareBuffer::SetData(size_t size, const void *data, BufferUsageType usage)
{
auto fb = GetVulkanFrameBuffer();
size_t bufsize = max(size, (size_t)16); // For supporting zero byte buffers
// If SetData is called multiple times we have to keep the old buffers alive as there might still be draw commands referencing them
@ -156,7 +140,6 @@ void VkHardwareBuffer::SetSubData(size_t offset, size_t size, const void *data)
{
size = max(size, (size_t)16); // For supporting zero byte buffers
auto fb = GetVulkanFrameBuffer();
if (mStaging)
{
void *dst = mStaging->Map(offset, size);
@ -177,8 +160,6 @@ void VkHardwareBuffer::Resize(size_t newsize)
{
newsize = max(newsize, (size_t)16); // For supporting zero byte buffers
auto fb = GetVulkanFrameBuffer();
// Grab old buffer
size_t oldsize = buffersize;
std::unique_ptr<VulkanBuffer> oldBuffer = std::move(mBuffer);
@ -256,7 +237,7 @@ void VkHardwareBuffer::Unlock()
void VkHardwareVertexBuffer::SetFormat(int numBindingPoints, int numAttributes, size_t stride, const FVertexBufferAttribute *attrs)
{
VertexFormat = GetVulkanFrameBuffer()->GetRenderPassManager()->GetVertexFormat(numBindingPoints, numAttributes, stride, attrs);
VertexFormat = fb->GetRenderPassManager()->GetVertexFormat(numBindingPoints, numAttributes, stride, attrs);
}
/////////////////////////////////////////////////////////////////////////////

View file

@ -3,6 +3,7 @@
#include "hwrenderer/data/buffers.h"
#include "vk_objects.h"
#include "tarray.h"
#include <list>
#ifdef _MSC_VER
// silence bogus warning C4250: 'VkHardwareVertexBuffer': inherits 'VkHardwareBuffer::VkHardwareBuffer::SetData' via dominance
@ -10,13 +11,14 @@
#pragma warning(disable:4250)
#endif
class VulkanFrameBuffer;
class VkHardwareBuffer : virtual public IBuffer
{
public:
VkHardwareBuffer();
VkHardwareBuffer(VulkanFrameBuffer* fb);
~VkHardwareBuffer();
static void ResetAll();
void Reset();
void SetData(size_t size, const void *data, BufferUsageType usage) override;
@ -29,22 +31,20 @@ public:
void *Lock(unsigned int size) override;
void Unlock() override;
VulkanFrameBuffer* fb = nullptr;
std::list<VkHardwareBuffer*>::iterator it;
VkBufferUsageFlags mBufferType = 0;
std::unique_ptr<VulkanBuffer> mBuffer;
std::unique_ptr<VulkanBuffer> mStaging;
bool mPersistent = false;
TArray<uint8_t> mStaticUpload;
private:
static VkHardwareBuffer *First;
VkHardwareBuffer *Prev = nullptr;
VkHardwareBuffer *Next = nullptr;
};
class VkHardwareVertexBuffer : public IVertexBuffer, public VkHardwareBuffer
{
public:
VkHardwareVertexBuffer() { mBufferType = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT; }
VkHardwareVertexBuffer(VulkanFrameBuffer* fb) : VkHardwareBuffer(fb) { mBufferType = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT; }
void SetFormat(int numBindingPoints, int numAttributes, size_t stride, const FVertexBufferAttribute *attrs) override;
int VertexFormat = -1;
@ -53,13 +53,13 @@ public:
class VkHardwareIndexBuffer : public IIndexBuffer, public VkHardwareBuffer
{
public:
VkHardwareIndexBuffer() { mBufferType = VK_BUFFER_USAGE_INDEX_BUFFER_BIT; }
VkHardwareIndexBuffer(VulkanFrameBuffer* fb) : VkHardwareBuffer(fb) { mBufferType = VK_BUFFER_USAGE_INDEX_BUFFER_BIT; }
};
class VkHardwareDataBuffer : public IDataBuffer, public VkHardwareBuffer
{
public:
VkHardwareDataBuffer(int bindingpoint, bool ssbo, bool needresize) : bindingpoint(bindingpoint)
VkHardwareDataBuffer(VulkanFrameBuffer* fb, int bindingpoint, bool ssbo, bool needresize) : VkHardwareBuffer(fb), bindingpoint(bindingpoint)
{
mBufferType = ssbo ? VK_BUFFER_USAGE_STORAGE_BUFFER_BIT : VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
if (needresize)