Only destroy the redefined image level.

TRAC #18495 Signed-off-by: Daniel Koch Author: Nicolas Capens git-svn-id: https://angleproject.googlecode.com/svn/trunk@819 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent b612f88b
...@@ -1052,6 +1052,11 @@ void Texture::loadDXT5ImageData(GLint xoffset, GLint yoffset, GLsizei width, GLs ...@@ -1052,6 +1052,11 @@ void Texture::loadDXT5ImageData(GLint xoffset, GLint yoffset, GLsizei width, GLs
void Texture::createSurface(Image *image) void Texture::createSurface(Image *image)
{ {
if(image->surface)
{
return;
}
IDirect3DTexture9 *newTexture = NULL; IDirect3DTexture9 *newTexture = NULL;
IDirect3DSurface9 *newSurface = NULL; IDirect3DSurface9 *newSurface = NULL;
...@@ -1090,11 +1095,6 @@ void Texture::createSurface(Image *image) ...@@ -1090,11 +1095,6 @@ void Texture::createSurface(Image *image)
newTexture->Release(); newTexture->Release();
} }
if (image->surface)
{
image->surface->Release();
}
image->surface = newSurface; image->surface = newSurface;
} }
...@@ -1556,6 +1556,15 @@ void Texture2D::redefineTexture(GLint level, GLenum format, GLsizei width, GLsiz ...@@ -1556,6 +1556,15 @@ void Texture2D::redefineTexture(GLint level, GLenum format, GLsizei width, GLsiz
mImageArray[level].format = format; mImageArray[level].format = format;
mImageArray[level].type = type; mImageArray[level].type = type;
if (mImageArray[level].surface != NULL)
{
mImageArray[level].surface->Release();
mImageArray[level].surface = NULL;
mImageArray[level].dirty = true;
}
createSurface(&mImageArray[level]);
if (!mTexture) if (!mTexture)
{ {
return; return;
...@@ -1565,17 +1574,12 @@ void Texture2D::redefineTexture(GLint level, GLenum format, GLsizei width, GLsiz ...@@ -1565,17 +1574,12 @@ void Texture2D::redefineTexture(GLint level, GLenum format, GLsizei width, GLsiz
bool heightOkay = (textureHeight >> level == height) || (textureHeight >> level == 0 && height == 1); bool heightOkay = (textureHeight >> level == height) || (textureHeight >> level == 0 && height == 1);
bool textureOkay = (widthOkay && heightOkay && textureFormat == format && textureType == type); bool textureOkay = (widthOkay && heightOkay && textureFormat == format && textureType == type);
if (!textureOkay || forceRedefine || mSurface) // Purge all the levels and the texture. if (!textureOkay || forceRedefine || mSurface)
{ {
for (int i = 0; i < IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++) for (int i = 0; i < IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
{ {
if (mImageArray[i].surface != NULL)
{
mImageArray[i].surface->Release();
mImageArray[i].surface = NULL;
mImageArray[i].dirty = true; mImageArray[i].dirty = true;
} }
}
if (mTexture != NULL) if (mTexture != NULL)
{ {
...@@ -2493,6 +2497,15 @@ void TextureCubeMap::redefineTexture(int face, GLint level, GLenum format, GLsiz ...@@ -2493,6 +2497,15 @@ void TextureCubeMap::redefineTexture(int face, GLint level, GLenum format, GLsiz
mImageArray[face][level].format = format; mImageArray[face][level].format = format;
mImageArray[face][level].type = type; mImageArray[face][level].type = type;
if (mImageArray[face][level].surface != NULL)
{
mImageArray[face][level].surface->Release();
mImageArray[face][level].surface = NULL;
mImageArray[face][level].dirty = true;
}
createSurface(&mImageArray[face][level]);
if (!mTexture) if (!mTexture)
{ {
return; return;
...@@ -2501,20 +2514,15 @@ void TextureCubeMap::redefineTexture(int face, GLint level, GLenum format, GLsiz ...@@ -2501,20 +2514,15 @@ void TextureCubeMap::redefineTexture(int face, GLint level, GLenum format, GLsiz
bool sizeOkay = (textureWidth >> level == width); bool sizeOkay = (textureWidth >> level == width);
bool textureOkay = (sizeOkay && textureFormat == format && textureType == type); bool textureOkay = (sizeOkay && textureFormat == format && textureType == type);
if (!textureOkay) // Purge all the levels and the texture. if (!textureOkay)
{ {
for (int i = 0; i < IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++) for (int i = 0; i < IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
{ {
for (int f = 0; f < 6; f++) for (int f = 0; f < 6; f++)
{ {
if (mImageArray[f][i].surface != NULL)
{
mImageArray[f][i].surface->Release();
mImageArray[f][i].surface = NULL;
mImageArray[f][i].dirty = true; mImageArray[f][i].dirty = true;
} }
} }
}
if (mTexture != NULL) if (mTexture != NULL)
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment