mirror of
https://github.com/Shpoike/Quakespasm.git
synced 2025-02-02 22:11:22 +00:00
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:
parent
3b1c8a97ff
commit
1a5c428100
3 changed files with 47 additions and 2 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue