diff --git a/GPU/GLES/TransformPipeline.cpp b/GPU/GLES/TransformPipeline.cpp index 243bb4845d35..ac3cb635745f 100644 --- a/GPU/GLES/TransformPipeline.cpp +++ b/GPU/GLES/TransformPipeline.cpp @@ -543,6 +543,7 @@ ReliableHashType TransformDrawEngine::ComputeHash() { void TransformDrawEngine::ClearTrackedVertexArrays() { for (auto vai = vai_.begin(); vai != vai_.end(); vai++) { + FreeVertexArray(vai->second); delete vai->second; } vai_.clear(); @@ -567,6 +568,7 @@ void TransformDrawEngine::DecimateTrackedVertexArrays() { kill = iter->second->lastFrame < threshold; } if (kill) { + FreeVertexArray(iter->second); delete iter->second; vai_.erase(iter++); } else { @@ -575,15 +577,6 @@ void TransformDrawEngine::DecimateTrackedVertexArrays() { } } -VertexArrayInfo::~VertexArrayInfo() { - glstate.arrayBuffer.unbind(); - glstate.elementArrayBuffer.unbind(); - if (vbo) - glDeleteBuffers(1, &vbo); - if (ebo) - glDeleteBuffers(1, &ebo); -} - GLuint TransformDrawEngine::AllocateBuffer(size_t sz) { GLuint unused = 0; for (GLuint buf : bufferNameCache_) { @@ -626,6 +619,17 @@ void TransformDrawEngine::FreeBuffer(GLuint buf) { } } +void TransformDrawEngine::FreeVertexArray(VertexArrayInfo *vai) { + if (vai->vbo) { + FreeBuffer(vai->vbo); + vai->vbo = 0; + } + if (vai->ebo) { + FreeBuffer(vai->ebo); + vai->ebo = 0; + } +} + void TransformDrawEngine::DoFlush() { PROFILE_THIS_SCOPE("flush"); gpuStats.numFlushes++; diff --git a/GPU/GLES/TransformPipeline.h b/GPU/GLES/TransformPipeline.h index c6b44e3bafe4..6a457497e1f7 100644 --- a/GPU/GLES/TransformPipeline.h +++ b/GPU/GLES/TransformPipeline.h @@ -77,7 +77,6 @@ class VertexArrayInfo { drawsUntilNextFullHash = 0; flags = 0; } - ~VertexArrayInfo(); enum Status { VAI_NEW, @@ -205,6 +204,7 @@ class TransformDrawEngine : public DrawEngineCommon, public GfxResourceHolder { GLuint AllocateBuffer(size_t sz); void FreeBuffer(GLuint buf); + void FreeVertexArray(VertexArrayInfo *vai); u32 ComputeMiniHash(); ReliableHashType ComputeHash(); // Reads deferred vertex data.