Skip to content

Commit

Permalink
VID_Restart: delete all GL textures before calling VID_SetMode. SDL2 …
Browse files Browse the repository at this point in the history
…reuses the gl context when changing modes, so the TexMgr_ReloadImages call after the mode change was leaking textures.

git-svn-id: svn+ssh://svn.code.sf.net/p/quakespasm/code/trunk@1156 af15c1b1-3010-417e-b628-4374ebc0bcbd
  • Loading branch information
ewasylishen committed Jan 26, 2015
1 parent 74f9ac2 commit 85879ba
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 2 deletions.
41 changes: 39 additions & 2 deletions quakespasm/Quake/gl_texmgr.c
Expand Up @@ -341,6 +341,8 @@ gltexture_t *TexMgr_NewTexture (void)
return glt;
}

static void GL_DeleteTexture (gltexture_t *texture);

/*
================
TexMgr_FreeTexture
Expand All @@ -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;
}
Expand All @@ -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;
}
Expand Down Expand Up @@ -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);
}
}

/*
================================================================================
Expand Down Expand Up @@ -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;
}
1 change: 1 addition & 0 deletions quakespasm/Quake/gl_texmgr.h
Expand Up @@ -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,
Expand Down
7 changes: 7 additions & 0 deletions quakespasm/Quake/gl_vidsdl.c
Expand Up @@ -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
Expand Down

0 comments on commit 85879ba

Please sign in to comment.