Fix double delete bug

This commit is contained in:
Magnus Norddahl 2019-12-26 01:09:31 +01:00
parent e68da4331a
commit 459742c840
8 changed files with 40 additions and 8 deletions

View file

@ -25,10 +25,17 @@
GLIndexBuffer::~GLIndexBuffer()
{
if (Device && mBuffer != 0)
Finalize();
}
void GLIndexBuffer::Finalize()
{
if (Device)
{
Device->mIndexBuffers.erase(ItBuffer);
Device = nullptr;
if (mBuffer != 0)
glDeleteBuffers(1, &mBuffer);
mBuffer = 0;
}

View file

@ -31,6 +31,8 @@ class GLIndexBuffer : public IndexBuffer
public:
~GLIndexBuffer();
void Finalize();
GLuint GetBuffer();
GLRenderDevice* Device = nullptr;

View file

@ -87,7 +87,7 @@ GLRenderDevice::~GLRenderDevice()
for (GLIndexBuffer* buffer : mIndexBuffers) mDeleteList.IndexBuffers.push_back(buffer);
for (GLVertexBuffer* buffer : mSharedVertexBuffers[0]->VertexBuffers) mDeleteList.VertexBuffers.push_back(buffer);
for (GLVertexBuffer* buffer : mSharedVertexBuffers[1]->VertexBuffers) mDeleteList.VertexBuffers.push_back(buffer);
ProcessDeleteList();
ProcessDeleteList(true);
glDeleteBuffers(1, &mStreamVertexBuffer);
glDeleteVertexArrays(1, &mStreamVAO);
@ -965,13 +965,22 @@ void GLRenderDevice::DeleteObject(GLTexture* texture)
delete texture;
}
void GLRenderDevice::ProcessDeleteList()
void GLRenderDevice::ProcessDeleteList(bool finalize)
{
std::unique_lock<std::mutex> lock(GLRenderDevice::GetMutex());
if (!finalize)
{
for (auto buffer : mDeleteList.IndexBuffers) delete buffer;
for (auto buffer : mDeleteList.VertexBuffers) delete buffer;
for (auto texture : mDeleteList.Textures) delete texture;
}
else
{
for (auto buffer : mDeleteList.IndexBuffers) buffer->Finalize();
for (auto buffer : mDeleteList.VertexBuffers) buffer->Finalize();
for (auto texture : mDeleteList.Textures) texture->Finalize();
}
mDeleteList.IndexBuffers.clear();
mDeleteList.VertexBuffers.clear();

View file

@ -106,7 +106,7 @@ public:
static void DeleteObject(GLIndexBuffer* buffer);
static void DeleteObject(GLTexture* texture);
void ProcessDeleteList();
void ProcessDeleteList(bool finalize = false);
std::unique_ptr<IOpenGLContext> Context;

View file

@ -29,6 +29,11 @@ GLTexture::GLTexture()
}
GLTexture::~GLTexture()
{
Finalize();
}
void GLTexture::Finalize()
{
if (Device)
Invalidate();

View file

@ -32,6 +32,8 @@ public:
GLTexture();
~GLTexture();
void Finalize();
void Set2DImage(int width, int height) override;
void SetCubeImage(int size) override;

View file

@ -72,6 +72,11 @@ void GLSharedVertexBuffer::SetupWorldVAO()
/////////////////////////////////////////////////////////////////////////////
GLVertexBuffer::~GLVertexBuffer()
{
Finalize();
}
void GLVertexBuffer::Finalize()
{
if (Device)
{

View file

@ -56,6 +56,8 @@ class GLVertexBuffer : public VertexBuffer
public:
~GLVertexBuffer();
void Finalize();
VertexFormat Format = VertexFormat::Flat;
GLRenderDevice* Device = nullptr;