Skip to content

Commit d5fc9a1

Browse files
authored
Irrlicht: expire unused hardware buffers (#17059)
1 parent 6289675 commit d5fc9a1

File tree

4 files changed

+11
-2
lines changed

4 files changed

+11
-2
lines changed

irr/src/CNullDriver.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -984,11 +984,17 @@ void CNullDriver::registerHardwareBuffer(SHWBufferLink *HWBuffer)
984984

985985
void CNullDriver::expireHardwareBuffers()
986986
{
987+
// 10 - 30s at usual framerates
988+
constexpr u16 DELETE_AFTER_UNUSED_FRAMES = 60 * 25;
989+
987990
for (size_t i = 0; i < HWBufferList.size(); ) {
988991
auto *link = HWBufferList[i];
989992

993+
bool del = link->UnusedCounter++ >= DELETE_AFTER_UNUSED_FRAMES ||
994+
!link->Buffer || link->Buffer->getReferenceCount() == 1;
995+
990996
// deleting can reorder, so don't advance in list
991-
if (!link->Buffer || link->Buffer->getReferenceCount() == 1)
997+
if (del)
992998
deleteHardwareBuffer(link);
993999
else
9941000
i++;

irr/src/CNullDriver.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -305,12 +305,13 @@ class CNullDriver : public IVideoDriver, public IGPUProgrammingServices
305305
const scene::HWBuffer *Buffer;
306306
size_t ListPosition = static_cast<size_t>(-1);
307307
u32 ChangedID = 0;
308+
u16 UnusedCounter = 0;
308309
};
309310

310311
//! Gets hardware buffer link from a buffer (may create or update buffer)
311312
virtual SHWBufferLink *getBufferLink(const scene::HWBuffer *buf);
312313

313-
//! updates hardware buffer if needed (only some drivers can)
314+
//! updates hardware buffer if needed
314315
virtual bool updateHardwareBuffer(SHWBufferLink *HWBuffer) { return false; }
315316

316317
//! Delete hardware buffer

irr/src/COpenGLDriver.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,7 @@ bool COpenGLDriver::updateHardwareBuffer(SHWBufferLink *_link)
374374

375375
auto *link = IRR_DOWN_CAST<SHWBufferLink_opengl *>(_link);
376376
auto *buf = link->Buffer;
377+
link->UnusedCounter = 0;
377378
if (link->vbo_ID && link->ChangedID == buf->getChangedID())
378379
return true;
379380

irr/src/OpenGL/Driver.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -537,6 +537,7 @@ bool COpenGL3DriverBase::updateHardwareBuffer(SHWBufferLink *HWBuffer)
537537

538538
auto *b = static_cast<SHWBufferLink_opengl *>(HWBuffer);
539539

540+
b->UnusedCounter = 0;
540541
assert(b->Buffer);
541542
if (b->ChangedID != b->Buffer->getChangedID() || !b->Vbo.exists()) {
542543
if (!_updateHardwareBuffer(b))

0 commit comments

Comments
 (0)