VID_Restart: delete all GL textures before calling VID_SetMode. SDL2 reuses the gl context when changing modes, so the TexMgr_ReloadImages call after the mode change was leaking textures.

git-svn-id: svn://svn.code.sf.net/p/quakespasm/code/trunk/quakespasm@1156 af15c1b1-3010-417e-b628-4374ebc0bcbd
This commit is contained in:
Eric Wasylishen 2015-01-26 20:18:39 +00:00
parent 3b1c8a97ff
commit 1a5c428100
3 changed files with 47 additions and 2 deletions

View file

@ -341,6 +341,8 @@ gltexture_t *TexMgr_NewTexture (void)
return glt;
}
static void GL_DeleteTexture (gltexture_t *texture);
/*
================
TexMgr_FreeTexture
@ -362,7 +364,7 @@ void TexMgr_FreeTexture (gltexture_t *kill)
kill->next = free_gltextures;
free_gltextures = kill;
glDeleteTextures(1, &kill->texnum);
GL_DeleteTexture(kill);
numgltextures--;
return;
}
@ -375,7 +377,7 @@ void TexMgr_FreeTexture (gltexture_t *kill)
kill->next = free_gltextures;
free_gltextures = kill;
glDeleteTextures(1, &kill->texnum);
GL_DeleteTexture(kill);
numgltextures--;
return;
}
@ -420,6 +422,21 @@ void TexMgr_FreeTexturesForOwner (qmodel_t *owner)
}
}
/*
================
TexMgr_DeleteTextureObjects
================
*/
void TexMgr_DeleteTextureObjects (void)
{
gltexture_t *glt;
for (glt = active_gltextures; glt; glt = glt->next)
{
GL_DeleteTexture (glt);
}
}
/*
================================================================================
@ -1466,3 +1483,23 @@ void GL_Bind (gltexture_t *texture)
texture->visframe = r_framecount;
}
}
/*
================
GL_DeleteTexture -- ericw
Wrapper around glDeleteTextures that also updates our cached current texture
binding, if necessary.
================
*/
static void GL_DeleteTexture (gltexture_t *texture)
{
glDeleteTextures (1, &texture->texnum);
if (texture->texnum == currenttexture[currenttarget - GL_TEXTURE0_ARB])
{
currenttexture[currenttarget - GL_TEXTURE0_ARB] = 0;
}
texture->texnum = 0;
}

View file

@ -85,6 +85,7 @@ void TexMgr_FreeTextures (unsigned int flags, unsigned int mask);
void TexMgr_FreeTexturesForOwner (qmodel_t *owner);
void TexMgr_NewGame (void);
void TexMgr_Init (void);
void TexMgr_DeleteTextureObjects (void);
// IMAGE LOADING
gltexture_t *TexMgr_LoadImage (qmodel_t *owner, const char *name, int width, int height, enum srcformat format,

View file

@ -676,6 +676,13 @@ static void VID_Restart (void)
width, height, bpp, fullscreen? "fullscreen" : "windowed");
return;
}
// ericw -- depending on platform / SDL version, after a video mode change we
// can have a new context (all textures are already freed) or the same context
// as before, in which case we need to delete the old textures to avoid a
// memory leak.
TexMgr_DeleteTextureObjects ();
//
// set new mode