Revert "Don't leak textures all over the place"

This causes textures to be deleted before they are no longer accessed,
resulting in a segmentation fault. This needs to be rewritten in such a way
that textures are deleted when the client disconnects from a server.

This reverts commit 41c00e87d4.
master
Perttu Ahola 2012-11-25 16:39:07 +02:00
parent bbd990f2cc
commit e02b95741b
2 changed files with 12 additions and 31 deletions

View File

@ -433,9 +433,6 @@ video::ITexture *generateTextureFromMesh(scene::IMesh *mesh,
} }
// Create render target texture // Create render target texture
video::ITexture *oldtexture = driver->findTexture(texture_name.c_str());
if(oldtexture)
driver->removeTexture(oldtexture);
video::ITexture *rtt = driver->addRenderTargetTexture( video::ITexture *rtt = driver->addRenderTargetTexture(
dim, texture_name.c_str(), video::ECF_A8R8G8B8); dim, texture_name.c_str(), video::ECF_A8R8G8B8);
if(rtt == NULL) if(rtt == NULL)

View File

@ -518,15 +518,6 @@ core::dimension2d<u32> imageTransformDimension(u32 transform, core::dimension2d<
// Apply transform to image data // Apply transform to image data
void imageTransform(u32 transform, video::IImage *src, video::IImage *dst); void imageTransform(u32 transform, video::IImage *src, video::IImage *dst);
/*
Adds a new texture to the video driver and returns a pointer to it.
This pointer should not be dropped. Any texture that was registered
with that name before is removed (this may invalidate some ITexture
pointers).
*/
video::ITexture* register_texture(video::IVideoDriver *driver,
std::string name, video::IImage *img);
/* /*
Generate image based on a string like "stone.png" or "[crack0". Generate image based on a string like "stone.png" or "[crack0".
if baseimg is NULL, it is created. Otherwise stuff is made on it. if baseimg is NULL, it is created. Otherwise stuff is made on it.
@ -695,9 +686,11 @@ u32 TextureSource::getTextureIdDirect(const std::string &name)
" create texture \""<<name<<"\""<<std::endl; " create texture \""<<name<<"\""<<std::endl;
} }
// Create texture from resulting image
if(baseimg != NULL) if(baseimg != NULL)
t = register_texture(driver, name, baseimg); {
// Create texture from resulting image
t = driver->addTexture(name.c_str(), baseimg);
}
/* /*
Add texture to caches (add NULL textures too) Add texture to caches (add NULL textures too)
@ -816,7 +809,7 @@ void TextureSource::rebuildImagesAndTextures()
// Create texture from resulting image // Create texture from resulting image
video::ITexture *t = NULL; video::ITexture *t = NULL;
if(img) if(img)
t = register_texture(driver, sap->name, img); t = driver->addTexture(sap->name.c_str(), img);
// Replace texture // Replace texture
sap->a.atlas = t; sap->a.atlas = t;
@ -1051,7 +1044,7 @@ void TextureSource::buildMainAtlas(class IGameDef *gamedef)
/* /*
Make texture Make texture
*/ */
video::ITexture *t = register_texture(driver, "__main_atlas__", atlas_img); video::ITexture *t = driver->addTexture("__main_atlas__", atlas_img);
assert(t); assert(t);
/* /*
@ -1142,15 +1135,6 @@ video::IImage* generate_image_from_scratch(std::string name,
return baseimg; return baseimg;
} }
video::ITexture* register_texture(video::IVideoDriver *driver,
std::string name, video::IImage *img)
{
video::ITexture *old_texture = driver->findTexture(name.c_str());
if(old_texture)
driver->removeTexture(old_texture);
return driver->addTexture(name.c_str(), img);
}
bool generate_image(std::string part_of_name, video::IImage *& baseimg, bool generate_image(std::string part_of_name, video::IImage *& baseimg,
IrrlichtDevice *device, SourceImageCache *sourcecache) IrrlichtDevice *device, SourceImageCache *sourcecache)
{ {
@ -1557,12 +1541,12 @@ bool generate_image(std::string part_of_name, video::IImage *& baseimg,
assert(img_top && img_left && img_right); assert(img_top && img_left && img_right);
// Create textures from images // Create textures from images
video::ITexture *texture_top = register_texture(driver, video::ITexture *texture_top = driver->addTexture(
imagename_top + "__temp1__", img_top); (imagename_top + "__temp__").c_str(), img_top);
video::ITexture *texture_left = register_texture(driver, video::ITexture *texture_left = driver->addTexture(
imagename_left + "__temp2__", img_left); (imagename_left + "__temp__").c_str(), img_left);
video::ITexture *texture_right = register_texture(driver, video::ITexture *texture_right = driver->addTexture(
imagename_right + "__temp3__", img_right); (imagename_right + "__temp__").c_str(), img_right);
assert(texture_top && texture_left && texture_right); assert(texture_top && texture_left && texture_right);
// Drop images // Drop images