Remove virtual inheritance

This commit is contained in:
Magnus Norddahl 2023-04-16 21:49:05 +02:00 committed by Christoph Oelckers
parent ae72639853
commit ca7e5be6b4
23 changed files with 102 additions and 141 deletions

View file

@ -1216,15 +1216,14 @@ void F2DDrawer::OnFrameDone()
F2DVertexBuffer::F2DVertexBuffer() F2DVertexBuffer::F2DVertexBuffer()
{ {
mVertexBuffer = screen->CreateVertexBuffer();
mIndexBuffer = screen->CreateIndexBuffer();
static const FVertexBufferAttribute format[] = { static const FVertexBufferAttribute format[] = {
{ 0, VATTR_VERTEX, VFmt_Float3, (int)myoffsetof(F2DDrawer::TwoDVertex, x) }, { 0, VATTR_VERTEX, VFmt_Float3, (int)myoffsetof(F2DDrawer::TwoDVertex, x) },
{ 0, VATTR_TEXCOORD, VFmt_Float2, (int)myoffsetof(F2DDrawer::TwoDVertex, u) }, { 0, VATTR_TEXCOORD, VFmt_Float2, (int)myoffsetof(F2DDrawer::TwoDVertex, u) },
{ 0, VATTR_COLOR, VFmt_Byte4, (int)myoffsetof(F2DDrawer::TwoDVertex, color0) } { 0, VATTR_COLOR, VFmt_Byte4, (int)myoffsetof(F2DDrawer::TwoDVertex, color0) }
}; };
mVertexBuffer->SetFormat(1, 3, sizeof(F2DDrawer::TwoDVertex), format);
mVertexBuffer = screen->CreateVertexBuffer(1, 3, sizeof(F2DDrawer::TwoDVertex), format);
mIndexBuffer = screen->CreateIndexBuffer();
} }
//========================================================================== //==========================================================================

View file

@ -331,8 +331,8 @@ public:
class F2DVertexBuffer class F2DVertexBuffer
{ {
IVertexBuffer *mVertexBuffer; IBuffer* mVertexBuffer;
IIndexBuffer *mIndexBuffer; IBuffer* mIndexBuffer;
public: public:
@ -351,7 +351,7 @@ public:
mIndexBuffer->SetData(indexcount * sizeof(unsigned int), indices, BufferUsageType::Stream); mIndexBuffer->SetData(indexcount * sizeof(unsigned int), indices, BufferUsageType::Stream);
} }
std::pair<IVertexBuffer *, IIndexBuffer *> GetBufferObjects() const std::pair<IBuffer*, IBuffer*> GetBufferObjects() const
{ {
return std::make_pair(mVertexBuffer, mIndexBuffer); return std::make_pair(mVertexBuffer, mIndexBuffer);
} }

View file

@ -81,22 +81,3 @@ public:
void *Memory() { return map; } void *Memory() { return map; }
size_t Size() { return buffersize; } size_t Size() { return buffersize; }
}; };
class IVertexBuffer : virtual public IBuffer
{
public:
virtual void SetFormat(int numBindingPoints, int numAttributes, size_t stride, const FVertexBufferAttribute *attrs) = 0;
};
// This merely exists to have a dedicated type for index buffers to inherit from.
class IIndexBuffer : virtual public IBuffer
{
// Element size is fixed to 4, thanks to OpenGL requiring this info to be coded into the glDrawElements call.
// This mostly prohibits a more flexible buffer setup but GZDoom doesn't use any other format anyway.
// Ob Vulkam, element size is a buffer property and of no concern to the drawing functions (as it should be.)
};
class IDataBuffer : virtual public IBuffer
{
// Can be either uniform or shader storage buffer, depending on its needs.
};

View file

@ -85,18 +85,15 @@ FFlatVertexBuffer::FFlatVertexBuffer(DFrameBuffer* fb, int width, int height, in
for (int n = 0; n < mPipelineNbr; n++) for (int n = 0; n < mPipelineNbr; n++)
{ {
mVertexBufferPipeline[n] = fb->CreateVertexBuffer(); static const FVertexBufferAttribute format[] =
{
unsigned int bytesize = BUFFER_SIZE * sizeof(FFlatVertex);
mVertexBufferPipeline[n]->SetData(bytesize, nullptr, BufferUsageType::Persistent);
static const FVertexBufferAttribute format[] = {
{ 0, VATTR_VERTEX, VFmt_Float3, (int)myoffsetof(FFlatVertex, x) }, { 0, VATTR_VERTEX, VFmt_Float3, (int)myoffsetof(FFlatVertex, x) },
{ 0, VATTR_TEXCOORD, VFmt_Float2, (int)myoffsetof(FFlatVertex, u) }, { 0, VATTR_TEXCOORD, VFmt_Float2, (int)myoffsetof(FFlatVertex, u) },
{ 0, VATTR_LIGHTMAP, VFmt_Float3, (int)myoffsetof(FFlatVertex, lu) }, { 0, VATTR_LIGHTMAP, VFmt_Float3, (int)myoffsetof(FFlatVertex, lu) },
}; };
mVertexBufferPipeline[n]->SetFormat(1, 3, sizeof(FFlatVertex), format); mVertexBufferPipeline[n] = fb->CreateVertexBuffer(1, 3, sizeof(FFlatVertex), format);
mVertexBufferPipeline[n]->SetData(BUFFER_SIZE * sizeof(FFlatVertex), nullptr, BufferUsageType::Persistent);
} }
mVertexBuffer = mVertexBufferPipeline[mPipelinePos]; mVertexBuffer = mVertexBufferPipeline[mPipelinePos];
@ -165,7 +162,7 @@ std::pair<FFlatVertex *, unsigned int> FFlatVertexBuffer::AllocVertices(unsigned
void FFlatVertexBuffer::Copy(int start, int count) void FFlatVertexBuffer::Copy(int start, int count)
{ {
IVertexBuffer* old = mVertexBuffer; IBuffer* old = mVertexBuffer;
for (int n = 0; n < mPipelineNbr; n++) for (int n = 0; n < mPipelineNbr; n++)
{ {

View file

@ -65,9 +65,9 @@ public:
int mPipelineNbr; int mPipelineNbr;
int mPipelinePos = 0; int mPipelinePos = 0;
IVertexBuffer* mVertexBuffer; IBuffer* mVertexBuffer;
IVertexBuffer *mVertexBufferPipeline[HW_MAX_PIPELINE_BUFFERS]; IBuffer* mVertexBufferPipeline[HW_MAX_PIPELINE_BUFFERS];
IIndexBuffer *mIndexBuffer; IBuffer* mIndexBuffer;
@ -96,7 +96,7 @@ public:
~FFlatVertexBuffer(); ~FFlatVertexBuffer();
void OutputResized(int width, int height); void OutputResized(int width, int height);
std::pair<IVertexBuffer *, IIndexBuffer *> GetBufferObjects() const std::pair<IBuffer*, IBuffer*> GetBufferObjects() const
{ {
return std::make_pair(mVertexBuffer, mIndexBuffer); return std::make_pair(mVertexBuffer, mIndexBuffer);
} }

View file

@ -12,8 +12,8 @@ class FRenderState;
class BoneBuffer class BoneBuffer
{ {
DFrameBuffer* fb = nullptr; DFrameBuffer* fb = nullptr;
IDataBuffer *mBuffer; IBuffer *mBuffer;
IDataBuffer* mBufferPipeline[HW_MAX_PIPELINE_BUFFERS]; IBuffer* mBufferPipeline[HW_MAX_PIPELINE_BUFFERS];
int mPipelineNbr; int mPipelineNbr;
int mPipelinePos = 0; int mPipelinePos = 0;
@ -41,7 +41,7 @@ public:
int GetCurrentIndex() { return mIndex; }; int GetCurrentIndex() { return mIndex; };
// OpenGL needs the buffer to mess around with the binding. // OpenGL needs the buffer to mess around with the binding.
IDataBuffer* GetBuffer() const IBuffer* GetBuffer() const
{ {
return mBuffer; return mBuffer;
} }

View file

@ -13,8 +13,8 @@ class FRenderState;
class FLightBuffer class FLightBuffer
{ {
DFrameBuffer* fb = nullptr; DFrameBuffer* fb = nullptr;
IDataBuffer *mBuffer; IBuffer* mBuffer;
IDataBuffer* mBufferPipeline[HW_MAX_PIPELINE_BUFFERS]; IBuffer* mBufferPipeline[HW_MAX_PIPELINE_BUFFERS];
int mPipelineNbr; int mPipelineNbr;
int mPipelinePos = 0; int mPipelinePos = 0;
@ -41,7 +41,7 @@ public:
int GetBinding(unsigned int index, size_t* pOffset, size_t* pSize); int GetBinding(unsigned int index, size_t* pOffset, size_t* pSize);
// OpenGL needs the buffer to mess around with the binding. // OpenGL needs the buffer to mess around with the binding.
IDataBuffer* GetBuffer() const IBuffer* GetBuffer() const
{ {
return mBuffer; return mBuffer;
} }

View file

@ -39,10 +39,8 @@
FModelVertexBuffer::FModelVertexBuffer(bool needindex, bool singleframe) FModelVertexBuffer::FModelVertexBuffer(bool needindex, bool singleframe)
{ {
mVertexBuffer = screen->CreateVertexBuffer(); static const FVertexBufferAttribute format[] =
mIndexBuffer = needindex ? screen->CreateIndexBuffer() : nullptr; {
static const FVertexBufferAttribute format[] = {
{ 0, VATTR_VERTEX, VFmt_Float3, (int)myoffsetof(FModelVertex, x) }, { 0, VATTR_VERTEX, VFmt_Float3, (int)myoffsetof(FModelVertex, x) },
{ 0, VATTR_TEXCOORD, VFmt_Float2, (int)myoffsetof(FModelVertex, u) }, { 0, VATTR_TEXCOORD, VFmt_Float2, (int)myoffsetof(FModelVertex, u) },
{ 0, VATTR_NORMAL, VFmt_Packed_A2R10G10B10, (int)myoffsetof(FModelVertex, packedNormal) }, { 0, VATTR_NORMAL, VFmt_Packed_A2R10G10B10, (int)myoffsetof(FModelVertex, packedNormal) },
@ -52,7 +50,9 @@ FModelVertexBuffer::FModelVertexBuffer(bool needindex, bool singleframe)
{ 1, VATTR_VERTEX2, VFmt_Float3, (int)myoffsetof(FModelVertex, x) }, { 1, VATTR_VERTEX2, VFmt_Float3, (int)myoffsetof(FModelVertex, x) },
{ 1, VATTR_NORMAL2, VFmt_Packed_A2R10G10B10, (int)myoffsetof(FModelVertex, packedNormal) } { 1, VATTR_NORMAL2, VFmt_Packed_A2R10G10B10, (int)myoffsetof(FModelVertex, packedNormal) }
}; };
mVertexBuffer->SetFormat(2, 8, sizeof(FModelVertex), format);
mVertexBuffer = screen->CreateVertexBuffer(2, 8, sizeof(FModelVertex), format);
mIndexBuffer = needindex ? screen->CreateIndexBuffer() : nullptr;
} }
//=========================================================================== //===========================================================================

View file

@ -7,8 +7,8 @@ class FModelRenderer;
class FModelVertexBuffer : public IModelVertexBuffer class FModelVertexBuffer : public IModelVertexBuffer
{ {
IVertexBuffer *mVertexBuffer; IBuffer* mVertexBuffer;
IIndexBuffer *mIndexBuffer; IBuffer* mIndexBuffer;
public: public:
@ -21,6 +21,6 @@ public:
unsigned int *LockIndexBuffer(unsigned int size) override; unsigned int *LockIndexBuffer(unsigned int size) override;
void UnlockIndexBuffer() override; void UnlockIndexBuffer() override;
IVertexBuffer* vertexBuffer() const { return mVertexBuffer; } IBuffer* vertexBuffer() const { return mVertexBuffer; }
IIndexBuffer* indexBuffer() const { return mIndexBuffer; } IBuffer* indexBuffer() const { return mIndexBuffer; }
}; };

View file

@ -8,8 +8,7 @@
#include "i_interface.h" #include "i_interface.h"
struct FColormap; struct FColormap;
class IVertexBuffer; class IBuffer;
class IIndexBuffer;
enum EClearTarget enum EClearTarget
{ {
@ -240,9 +239,9 @@ protected:
FMaterialState mMaterial; FMaterialState mMaterial;
FDepthBiasState mBias; FDepthBiasState mBias;
IVertexBuffer *mVertexBuffer; IBuffer* mVertexBuffer;
int mVertexOffsets[2]; // one per binding point int mVertexOffsets[2]; // one per binding point
IIndexBuffer *mIndexBuffer; IBuffer* mIndexBuffer;
EPassType mPassType = NORMAL_PASS; EPassType mPassType = NORMAL_PASS;
@ -657,7 +656,7 @@ public:
mClipSplit[1] = 1000000.f; mClipSplit[1] = 1000000.f;
} }
void SetVertexBuffer(IVertexBuffer *vb, int offset0, int offset1) void SetVertexBuffer(IBuffer* vb, int offset0, int offset1)
{ {
assert(vb); assert(vb);
mVertexBuffer = vb; mVertexBuffer = vb;
@ -665,7 +664,7 @@ public:
mVertexOffsets[1] = offset1; mVertexOffsets[1] = offset1;
} }
void SetIndexBuffer(IIndexBuffer *ib) void SetIndexBuffer(IBuffer* ib)
{ {
mIndexBuffer = ib; mIndexBuffer = ib;
} }

View file

@ -6,7 +6,7 @@
#include <memory> #include <memory>
#include <functional> #include <functional>
class IDataBuffer; class IBuffer;
class DFrameBuffer; class DFrameBuffer;
class ShadowMap class ShadowMap
@ -84,11 +84,11 @@ protected:
// OpenGL storage buffer with the list of lights in the shadow map texture // OpenGL storage buffer with the list of lights in the shadow map texture
// These buffers need to be accessed by the OpenGL backend directly so that they can be bound. // These buffers need to be accessed by the OpenGL backend directly so that they can be bound.
public: public:
IDataBuffer *mLightList = nullptr; IBuffer* mLightList = nullptr;
// OpenGL storage buffers for the AABB tree // OpenGL storage buffers for the AABB tree
IDataBuffer *mNodesBuffer = nullptr; IBuffer* mNodesBuffer = nullptr;
IDataBuffer *mLinesBuffer = nullptr; IBuffer* mLinesBuffer = nullptr;
std::function<void()> CollectLights = nullptr; std::function<void()> CollectLights = nullptr;

View file

@ -122,7 +122,6 @@ std::pair<PalEntry, PalEntry>& R_GetSkyCapColor(FGameTexture* tex)
FSkyVertexBuffer::FSkyVertexBuffer(DFrameBuffer* fb) : fb(fb) FSkyVertexBuffer::FSkyVertexBuffer(DFrameBuffer* fb) : fb(fb)
{ {
CreateDome(); CreateDome();
mVertexBuffer = fb->CreateVertexBuffer();
static const FVertexBufferAttribute format[] = { static const FVertexBufferAttribute format[] = {
{ 0, VATTR_VERTEX, VFmt_Float3, (int)myoffsetof(FSkyVertex, x) }, { 0, VATTR_VERTEX, VFmt_Float3, (int)myoffsetof(FSkyVertex, x) },
@ -130,7 +129,7 @@ FSkyVertexBuffer::FSkyVertexBuffer(DFrameBuffer* fb) : fb(fb)
{ 0, VATTR_COLOR, VFmt_Byte4, (int)myoffsetof(FSkyVertex, color) }, { 0, VATTR_COLOR, VFmt_Byte4, (int)myoffsetof(FSkyVertex, color) },
{ 0, VATTR_LIGHTMAP, VFmt_Float3, (int)myoffsetof(FSkyVertex, lu) }, { 0, VATTR_LIGHTMAP, VFmt_Float3, (int)myoffsetof(FSkyVertex, lu) },
}; };
mVertexBuffer->SetFormat(1, 4, sizeof(FSkyVertex), format); mVertexBuffer = fb->CreateVertexBuffer(1, 4, sizeof(FSkyVertex), format);
mVertexBuffer->SetData(mVertices.Size() * sizeof(FSkyVertex), &mVertices[0], BufferUsageType::Static); mVertexBuffer->SetData(mVertices.Size() * sizeof(FSkyVertex), &mVertices[0], BufferUsageType::Static);
} }

View file

@ -8,7 +8,7 @@
class DFrameBuffer; class DFrameBuffer;
class FGameTexture; class FGameTexture;
class FRenderState; class FRenderState;
class IVertexBuffer; class IBuffer;
struct HWSkyPortal; struct HWSkyPortal;
struct HWDrawInfo; struct HWDrawInfo;
@ -63,7 +63,7 @@ public:
SKYMODE_FOGLAYER = 2 SKYMODE_FOGLAYER = 2
}; };
IVertexBuffer *mVertexBuffer; IBuffer* mVertexBuffer;
TArray<FSkyVertex> mVertices; TArray<FSkyVertex> mVertices;
TArray<unsigned int> mPrimStartDoom; TArray<unsigned int> mPrimStartDoom;
@ -86,7 +86,7 @@ public:
FSkyVertexBuffer(DFrameBuffer* fb); FSkyVertexBuffer(DFrameBuffer* fb);
~FSkyVertexBuffer(); ~FSkyVertexBuffer();
void SetupMatrices(FGameTexture *tex, float x_offset, float y_offset, bool mirror, int mode, VSMatrix &modelmatrix, VSMatrix &textureMatrix, bool tiled, float xscale = 0, float vertscale = 0); void SetupMatrices(FGameTexture *tex, float x_offset, float y_offset, bool mirror, int mode, VSMatrix &modelmatrix, VSMatrix &textureMatrix, bool tiled, float xscale = 0, float vertscale = 0);
std::pair<IVertexBuffer *, IIndexBuffer *> GetBufferObjects() const std::pair<IBuffer*, IBuffer*> GetBufferObjects() const
{ {
return std::make_pair(mVertexBuffer, nullptr); return std::make_pair(mVertexBuffer, nullptr);
} }

View file

@ -9,8 +9,8 @@ class FRenderState;
class HWViewpointBuffer class HWViewpointBuffer
{ {
DFrameBuffer* fb = nullptr; DFrameBuffer* fb = nullptr;
IDataBuffer *mBuffer; IBuffer* mBuffer;
IDataBuffer* mBufferPipeline[HW_MAX_PIPELINE_BUFFERS]; IBuffer* mBufferPipeline[HW_MAX_PIPELINE_BUFFERS];
int mPipelineNbr; int mPipelineNbr;
int mPipelinePos = 0; int mPipelinePos = 0;

View file

@ -50,9 +50,7 @@
struct FPortalSceneState; struct FPortalSceneState;
class FSkyVertexBuffer; class FSkyVertexBuffer;
class IIndexBuffer; class IBuffer;
class IVertexBuffer;
class IDataBuffer;
class FFlatVertexBuffer; class FFlatVertexBuffer;
class HWViewpointBuffer; class HWViewpointBuffer;
class FLightBuffer; class FLightBuffer;
@ -94,6 +92,7 @@ struct FColormap;
enum FTextureFormat : uint32_t; enum FTextureFormat : uint32_t;
class FModelRenderer; class FModelRenderer;
struct SamplerUniform; struct SamplerUniform;
struct FVertexBufferAttribute;
// //
// VIDEO // VIDEO
@ -236,17 +235,17 @@ public:
virtual void InitLightmap(int LMTextureSize, int LMTextureCount, TArray<uint16_t>& LMTextureData) {} virtual void InitLightmap(int LMTextureSize, int LMTextureCount, TArray<uint16_t>& LMTextureData) {}
// Interface to hardware rendering resources // Interface to hardware rendering resources
virtual IVertexBuffer* CreateVertexBuffer() { return nullptr; } virtual IBuffer* CreateVertexBuffer(int numBindingPoints, int numAttributes, size_t stride, const FVertexBufferAttribute* attrs) { return nullptr; }
virtual IIndexBuffer* CreateIndexBuffer() { return nullptr; } virtual IBuffer* CreateIndexBuffer() { return nullptr; }
bool BuffersArePersistent() { return !!(hwcaps & RFL_BUFFER_STORAGE); } bool BuffersArePersistent() { return !!(hwcaps & RFL_BUFFER_STORAGE); }
// To do: these buffers shouldn't be created by the hwrenderer layer - it will be simpler if the backend manages them completely // To do: these buffers shouldn't be created by the hwrenderer layer - it will be simpler if the backend manages them completely
virtual IDataBuffer* CreateLightBuffer() { return nullptr; } virtual IBuffer* CreateLightBuffer() { return nullptr; }
virtual IDataBuffer* CreateBoneBuffer() { return nullptr; } virtual IBuffer* CreateBoneBuffer() { return nullptr; }
virtual IDataBuffer* CreateViewpointBuffer() { return nullptr; } virtual IBuffer* CreateViewpointBuffer() { return nullptr; }
virtual IDataBuffer* CreateShadowmapNodesBuffer() { return nullptr; } virtual IBuffer* CreateShadowmapNodesBuffer() { return nullptr; }
virtual IDataBuffer* CreateShadowmapLinesBuffer() { return nullptr; } virtual IBuffer* CreateShadowmapLinesBuffer() { return nullptr; }
virtual IDataBuffer* CreateShadowmapLightsBuffer() { return nullptr; } virtual IBuffer* CreateShadowmapLightsBuffer() { return nullptr; }
// This is overridable in case Vulkan does it differently. // This is overridable in case Vulkan does it differently.
virtual bool RenderTextureIsFlipped() const virtual bool RenderTextureIsFlipped() const

View file

@ -24,6 +24,7 @@
#include "vk_hwbuffer.h" #include "vk_hwbuffer.h"
#include "vk_streambuffer.h" #include "vk_streambuffer.h"
#include "vulkan/vk_renderdevice.h" #include "vulkan/vk_renderdevice.h"
#include "vulkan/pipelines/vk_renderpass.h"
VkBufferManager::VkBufferManager(VulkanRenderDevice* fb) : fb(fb) VkBufferManager::VkBufferManager(VulkanRenderDevice* fb) : fb(fb)
{ {
@ -64,47 +65,47 @@ void VkBufferManager::RemoveBuffer(VkHardwareBuffer* buffer)
} }
} }
IVertexBuffer* VkBufferManager::CreateVertexBuffer() IBuffer* VkBufferManager::CreateVertexBuffer(int numBindingPoints, int numAttributes, size_t stride, const FVertexBufferAttribute* attrs)
{ {
return new VkHardwareVertexBuffer(fb); return new VkHardwareVertexBuffer(fb, fb->GetRenderPassManager()->GetVertexFormat(numBindingPoints, numAttributes, stride, attrs));
} }
IIndexBuffer* VkBufferManager::CreateIndexBuffer() IBuffer* VkBufferManager::CreateIndexBuffer()
{ {
return new VkHardwareIndexBuffer(fb); return new VkHardwareIndexBuffer(fb);
} }
IDataBuffer* VkBufferManager::CreateLightBuffer() IBuffer* VkBufferManager::CreateLightBuffer()
{ {
LightBufferSSO = new VkHardwareDataBuffer(fb, true, false); LightBufferSSO = new VkHardwareDataBuffer(fb, true, false);
return LightBufferSSO; return LightBufferSSO;
} }
IDataBuffer* VkBufferManager::CreateBoneBuffer() IBuffer* VkBufferManager::CreateBoneBuffer()
{ {
BoneBufferSSO = new VkHardwareDataBuffer(fb, true, false); BoneBufferSSO = new VkHardwareDataBuffer(fb, true, false);
return BoneBufferSSO; return BoneBufferSSO;
} }
IDataBuffer* VkBufferManager::CreateViewpointBuffer() IBuffer* VkBufferManager::CreateViewpointBuffer()
{ {
ViewpointUBO = new VkHardwareDataBuffer(fb, false, true); ViewpointUBO = new VkHardwareDataBuffer(fb, false, true);
return ViewpointUBO; return ViewpointUBO;
} }
IDataBuffer* VkBufferManager::CreateShadowmapNodesBuffer() IBuffer* VkBufferManager::CreateShadowmapNodesBuffer()
{ {
LightNodes = new VkHardwareDataBuffer(fb, true, false); LightNodes = new VkHardwareDataBuffer(fb, true, false);
return LightNodes; return LightNodes;
} }
IDataBuffer* VkBufferManager::CreateShadowmapLinesBuffer() IBuffer* VkBufferManager::CreateShadowmapLinesBuffer()
{ {
LightLines = new VkHardwareDataBuffer(fb, true, false); LightLines = new VkHardwareDataBuffer(fb, true, false);
return LightLines; return LightLines;
} }
IDataBuffer* VkBufferManager::CreateShadowmapLightsBuffer() IBuffer* VkBufferManager::CreateShadowmapLightsBuffer()
{ {
LightList = new VkHardwareDataBuffer(fb, true, false); LightList = new VkHardwareDataBuffer(fb, true, false);
return LightList; return LightList;

View file

@ -8,9 +8,8 @@ class VulkanRenderDevice;
class VkHardwareBuffer; class VkHardwareBuffer;
class VkHardwareDataBuffer; class VkHardwareDataBuffer;
class VkStreamBuffer; class VkStreamBuffer;
class IIndexBuffer; class IBuffer;
class IVertexBuffer; struct FVertexBufferAttribute;
class IDataBuffer;
class VkBufferManager class VkBufferManager
{ {
@ -21,15 +20,15 @@ public:
void Init(); void Init();
void Deinit(); void Deinit();
IVertexBuffer* CreateVertexBuffer(); IBuffer* CreateVertexBuffer(int numBindingPoints, int numAttributes, size_t stride, const FVertexBufferAttribute* attrs);
IIndexBuffer* CreateIndexBuffer(); IBuffer* CreateIndexBuffer();
IDataBuffer* CreateLightBuffer(); IBuffer* CreateLightBuffer();
IDataBuffer* CreateBoneBuffer(); IBuffer* CreateBoneBuffer();
IDataBuffer* CreateViewpointBuffer(); IBuffer* CreateViewpointBuffer();
IDataBuffer* CreateShadowmapNodesBuffer(); IBuffer* CreateShadowmapNodesBuffer();
IDataBuffer* CreateShadowmapLinesBuffer(); IBuffer* CreateShadowmapLinesBuffer();
IDataBuffer* CreateShadowmapLightsBuffer(); IBuffer* CreateShadowmapLightsBuffer();
void AddBuffer(VkHardwareBuffer* buffer); void AddBuffer(VkHardwareBuffer* buffer);
void RemoveBuffer(VkHardwareBuffer* buffer); void RemoveBuffer(VkHardwareBuffer* buffer);
@ -44,7 +43,7 @@ public:
std::unique_ptr<VkStreamBuffer> MatrixBuffer; std::unique_ptr<VkStreamBuffer> MatrixBuffer;
std::unique_ptr<VkStreamBuffer> StreamBuffer; std::unique_ptr<VkStreamBuffer> StreamBuffer;
std::unique_ptr<IIndexBuffer> FanToTrisIndexBuffer; std::unique_ptr<IBuffer> FanToTrisIndexBuffer;
private: private:
void CreateFanToTrisIndexBuffer(); void CreateFanToTrisIndexBuffer();

View file

@ -236,10 +236,3 @@ void VkHardwareBuffer::Unlock()
map = nullptr; map = nullptr;
} }
} }
/////////////////////////////////////////////////////////////////////////////
void VkHardwareVertexBuffer::SetFormat(int numBindingPoints, int numAttributes, size_t stride, const FVertexBufferAttribute *attrs)
{
VertexFormat = fb->GetRenderPassManager()->GetVertexFormat(numBindingPoints, numAttributes, stride, attrs);
}

View file

@ -5,15 +5,9 @@
#include "tarray.h" #include "tarray.h"
#include <list> #include <list>
#ifdef _MSC_VER
// silence bogus warning C4250: 'VkHardwareVertexBuffer': inherits 'VkHardwareBuffer::VkHardwareBuffer::SetData' via dominance
// According to internet infos, the warning is erroneously emitted in this case.
#pragma warning(disable:4250)
#endif
class VulkanRenderDevice; class VulkanRenderDevice;
class VkHardwareBuffer : virtual public IBuffer class VkHardwareBuffer : public IBuffer
{ {
public: public:
VkHardwareBuffer(VulkanRenderDevice* fb); VkHardwareBuffer(VulkanRenderDevice* fb);
@ -41,22 +35,21 @@ public:
TArray<uint8_t> mStaticUpload; TArray<uint8_t> mStaticUpload;
}; };
class VkHardwareVertexBuffer : public IVertexBuffer, public VkHardwareBuffer class VkHardwareVertexBuffer : public VkHardwareBuffer
{ {
public: public:
VkHardwareVertexBuffer(VulkanRenderDevice* fb) : VkHardwareBuffer(fb) { mBufferType = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT; } VkHardwareVertexBuffer(VulkanRenderDevice* fb, int vertexFormat) : VkHardwareBuffer(fb), VertexFormat(vertexFormat) { mBufferType = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT; }
void SetFormat(int numBindingPoints, int numAttributes, size_t stride, const FVertexBufferAttribute *attrs) override;
int VertexFormat = -1; int VertexFormat = -1;
}; };
class VkHardwareIndexBuffer : public IIndexBuffer, public VkHardwareBuffer class VkHardwareIndexBuffer : public VkHardwareBuffer
{ {
public: public:
VkHardwareIndexBuffer(VulkanRenderDevice* fb) : VkHardwareBuffer(fb) { mBufferType = VK_BUFFER_USAGE_INDEX_BUFFER_BIT; } VkHardwareIndexBuffer(VulkanRenderDevice* fb) : VkHardwareBuffer(fb) { mBufferType = VK_BUFFER_USAGE_INDEX_BUFFER_BIT; }
}; };
class VkHardwareDataBuffer : public IDataBuffer, public VkHardwareBuffer class VkHardwareDataBuffer : public VkHardwareBuffer
{ {
public: public:
VkHardwareDataBuffer(VulkanRenderDevice* fb, bool ssbo, bool needresize) : VkHardwareBuffer(fb) VkHardwareDataBuffer(VulkanRenderDevice* fb, bool ssbo, bool needresize) : VkHardwareBuffer(fb)

View file

@ -312,42 +312,42 @@ FMaterial* VulkanRenderDevice::CreateMaterial(FGameTexture* tex, int scaleflags)
return new VkMaterial(this, tex, scaleflags); return new VkMaterial(this, tex, scaleflags);
} }
IVertexBuffer *VulkanRenderDevice::CreateVertexBuffer() IBuffer*VulkanRenderDevice::CreateVertexBuffer(int numBindingPoints, int numAttributes, size_t stride, const FVertexBufferAttribute* attrs)
{ {
return GetBufferManager()->CreateVertexBuffer(); return GetBufferManager()->CreateVertexBuffer(numBindingPoints, numAttributes, stride, attrs);
} }
IIndexBuffer *VulkanRenderDevice::CreateIndexBuffer() IBuffer*VulkanRenderDevice::CreateIndexBuffer()
{ {
return GetBufferManager()->CreateIndexBuffer(); return GetBufferManager()->CreateIndexBuffer();
} }
IDataBuffer* VulkanRenderDevice::CreateLightBuffer() IBuffer* VulkanRenderDevice::CreateLightBuffer()
{ {
return GetBufferManager()->CreateLightBuffer(); return GetBufferManager()->CreateLightBuffer();
} }
IDataBuffer* VulkanRenderDevice::CreateBoneBuffer() IBuffer* VulkanRenderDevice::CreateBoneBuffer()
{ {
return GetBufferManager()->CreateBoneBuffer(); return GetBufferManager()->CreateBoneBuffer();
} }
IDataBuffer* VulkanRenderDevice::CreateViewpointBuffer() IBuffer* VulkanRenderDevice::CreateViewpointBuffer()
{ {
return GetBufferManager()->CreateViewpointBuffer(); return GetBufferManager()->CreateViewpointBuffer();
} }
IDataBuffer* VulkanRenderDevice::CreateShadowmapNodesBuffer() IBuffer* VulkanRenderDevice::CreateShadowmapNodesBuffer()
{ {
return GetBufferManager()->CreateShadowmapNodesBuffer(); return GetBufferManager()->CreateShadowmapNodesBuffer();
} }
IDataBuffer* VulkanRenderDevice::CreateShadowmapLinesBuffer() IBuffer* VulkanRenderDevice::CreateShadowmapLinesBuffer()
{ {
return GetBufferManager()->CreateShadowmapLinesBuffer(); return GetBufferManager()->CreateShadowmapLinesBuffer();
} }
IDataBuffer* VulkanRenderDevice::CreateShadowmapLightsBuffer() IBuffer* VulkanRenderDevice::CreateShadowmapLightsBuffer()
{ {
return GetBufferManager()->CreateShadowmapLightsBuffer(); return GetBufferManager()->CreateShadowmapLightsBuffer();
} }

View file

@ -72,15 +72,16 @@ public:
IHardwareTexture *CreateHardwareTexture(int numchannels) override; IHardwareTexture *CreateHardwareTexture(int numchannels) override;
FMaterial* CreateMaterial(FGameTexture* tex, int scaleflags) override; FMaterial* CreateMaterial(FGameTexture* tex, int scaleflags) override;
IVertexBuffer *CreateVertexBuffer() override;
IIndexBuffer *CreateIndexBuffer() override;
IDataBuffer* CreateLightBuffer() override; IBuffer* CreateVertexBuffer(int numBindingPoints, int numAttributes, size_t stride, const FVertexBufferAttribute* attrs) override;
IDataBuffer* CreateBoneBuffer() override; IBuffer* CreateIndexBuffer() override;
IDataBuffer* CreateViewpointBuffer() override;
IDataBuffer* CreateShadowmapNodesBuffer() override; IBuffer* CreateLightBuffer() override;
IDataBuffer* CreateShadowmapLinesBuffer() override; IBuffer* CreateBoneBuffer() override;
IDataBuffer* CreateShadowmapLightsBuffer() override; IBuffer* CreateViewpointBuffer() override;
IBuffer* CreateShadowmapNodesBuffer() override;
IBuffer* CreateShadowmapLinesBuffer() override;
IBuffer* CreateShadowmapLightsBuffer() override;
FTexture *WipeStartScreen() override; FTexture *WipeStartScreen() override;
FTexture *WipeEndScreen() override; FTexture *WipeEndScreen() override;

View file

@ -585,7 +585,7 @@ void VkRenderStateMolten::Draw(int dt, int index, int count, bool apply)
{ {
if (dt == DT_TriangleFan) if (dt == DT_TriangleFan)
{ {
IIndexBuffer *oldIndexBuffer = mIndexBuffer; IBuffer* oldIndexBuffer = mIndexBuffer;
mIndexBuffer = fb->GetBufferManager()->FanToTrisIndexBuffer.get(); mIndexBuffer = fb->GetBufferManager()->FanToTrisIndexBuffer.get();
if (apply || mNeedApply) if (apply || mNeedApply)

View file

@ -104,8 +104,8 @@ protected:
VkMatrixBufferWriter mMatrixBufferWriter; VkMatrixBufferWriter mMatrixBufferWriter;
int mLastVertexOffsets[2] = { 0, 0 }; int mLastVertexOffsets[2] = { 0, 0 };
IVertexBuffer *mLastVertexBuffer = nullptr; IBuffer* mLastVertexBuffer = nullptr;
IIndexBuffer *mLastIndexBuffer = nullptr; IBuffer* mLastIndexBuffer = nullptr;
bool mLastModelMatrixEnabled = true; bool mLastModelMatrixEnabled = true;
bool mLastTextureMatrixEnabled = true; bool mLastTextureMatrixEnabled = true;