1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-06-27 16:36:03 +00:00

Handle vertex & index VBOs separately in GL drivers

This commit is contained in:
sfan5 2024-08-28 19:35:28 +02:00
parent be9aa19208
commit 6b7fc1e9fe
7 changed files with 346 additions and 283 deletions

View file

@ -269,8 +269,18 @@ public:
const core::position2d<s32> &pos,
const core::dimension2d<u32> &size) override;
//! Draws a mesh buffer
void drawMeshBuffer(const scene::IMeshBuffer *mb) override;
void drawMeshBuffer(const scene::IMeshBuffer *mb) override
{
if (!mb)
return;
drawBuffers(mb->getVertexBuffer(), mb->getIndexBuffer(),
mb->getPrimitiveCount(), mb->getPrimitiveType());
}
// Note: this should handle hw buffers
virtual void drawBuffers(const scene::IVertexBuffer *vb,
const scene::IIndexBuffer *ib, u32 primCount,
scene::E_PRIMITIVE_TYPE pType = scene::EPT_TRIANGLES) override;
//! Draws the normals of a mesh buffer
virtual void drawMeshBufferNormals(const scene::IMeshBuffer *mb, f32 length = 10.f,
@ -283,53 +293,70 @@ public:
}
protected:
/// Links a hardware buffer to either a vertex or index buffer
struct SHWBufferLink
{
SHWBufferLink(const scene::IMeshBuffer *_MeshBuffer) :
MeshBuffer(_MeshBuffer),
ChangedID_Vertex(0), ChangedID_Index(0),
Mapped_Vertex(scene::EHM_NEVER), Mapped_Index(scene::EHM_NEVER)
SHWBufferLink(const scene::IVertexBuffer *vb) :
VertexBuffer(vb), ChangedID(0), IsVertex(true)
{
if (MeshBuffer) {
MeshBuffer->grab();
MeshBuffer->setHWBuffer(reinterpret_cast<void *>(this));
if (VertexBuffer) {
VertexBuffer->grab();
VertexBuffer->setHWBuffer(this);
}
}
SHWBufferLink(const scene::IIndexBuffer *ib) :
IndexBuffer(ib), ChangedID(0), IsVertex(false)
{
if (IndexBuffer) {
IndexBuffer->grab();
IndexBuffer->setHWBuffer(this);
}
}
virtual ~SHWBufferLink()
{
if (MeshBuffer) {
MeshBuffer->setHWBuffer(NULL);
MeshBuffer->drop();
if (IsVertex && VertexBuffer) {
VertexBuffer->setHWBuffer(nullptr);
VertexBuffer->drop();
} else if (!IsVertex && IndexBuffer) {
IndexBuffer->setHWBuffer(nullptr);
IndexBuffer->drop();
}
}
const scene::IMeshBuffer *MeshBuffer;
u32 ChangedID_Vertex;
u32 ChangedID_Index;
scene::E_HARDWARE_MAPPING Mapped_Vertex;
scene::E_HARDWARE_MAPPING Mapped_Index;
std::list<SHWBufferLink *>::iterator listPosition;
union {
const scene::IVertexBuffer *VertexBuffer;
const scene::IIndexBuffer *IndexBuffer;
};
u32 ChangedID;
bool IsVertex;
std::list<SHWBufferLink*>::iterator listPosition;
};
//! Gets hardware buffer link from a meshbuffer (may create or update buffer)
virtual SHWBufferLink *getBufferLink(const scene::IMeshBuffer *mb);
//! Gets hardware buffer link from a vertex buffer (may create or update buffer)
virtual SHWBufferLink *getBufferLink(const scene::IVertexBuffer *mb);
//! Gets hardware buffer link from a index buffer (may create or update buffer)
virtual SHWBufferLink *getBufferLink(const scene::IIndexBuffer *mb);
//! updates hardware buffer if needed (only some drivers can)
virtual bool updateHardwareBuffer(SHWBufferLink *HWBuffer) { return false; }
//! Draw hardware buffer (only some drivers can)
virtual void drawHardwareBuffer(SHWBufferLink *HWBuffer) {}
//! Delete hardware buffer
virtual void deleteHardwareBuffer(SHWBufferLink *HWBuffer);
//! Create hardware buffer from mesh (only some drivers can)
virtual SHWBufferLink *createHardwareBuffer(const scene::IMeshBuffer *mb) { return 0; }
//! Create hardware buffer from vertex buffer
virtual SHWBufferLink *createHardwareBuffer(const scene::IVertexBuffer *vb) { return 0; }
//! Create hardware buffer from index buffer
virtual SHWBufferLink *createHardwareBuffer(const scene::IIndexBuffer *ib) { return 0; }
public:
//! Remove hardware buffer
void removeHardwareBuffer(const scene::IMeshBuffer *mb) override;
void removeHardwareBuffer(const scene::IVertexBuffer *vb) override;
//! Remove hardware buffer
void removeHardwareBuffer(const scene::IIndexBuffer *ib) override;
//! Remove all hardware buffers
void removeAllHardwareBuffers() override;
@ -337,8 +364,11 @@ public:
//! Update all hardware buffers, remove unused ones
virtual void updateAllHardwareBuffers();
//! is vbo recommended on this mesh?
virtual bool isHardwareBufferRecommend(const scene::IMeshBuffer *mb);
//! is vbo recommended?
virtual bool isHardwareBufferRecommend(const scene::IVertexBuffer *mb);
//! is vbo recommended?
virtual bool isHardwareBufferRecommend(const scene::IIndexBuffer *mb);
//! Create occlusion query.
/** Use node for identification and mesh for occlusion test. */