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
diff --git a/src/libGLESv2/Texture.cpp b/src/libGLESv2/Texture.cpp
index 9e8f454..86a9874 100644
--- a/src/libGLESv2/Texture.cpp
+++ b/src/libGLESv2/Texture.cpp
@@ -1052,6 +1052,11 @@
void Texture::createSurface(Image *image)
{
+ if(image->surface)
+ {
+ return;
+ }
+
IDirect3DTexture9 *newTexture = NULL;
IDirect3DSurface9 *newSurface = NULL;
@@ -1090,11 +1095,6 @@
newTexture->Release();
}
- if (image->surface)
- {
- image->surface->Release();
- }
-
image->surface = newSurface;
}
@@ -1556,6 +1556,15 @@
mImageArray[level].format = format;
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)
{
return;
@@ -1565,16 +1574,11 @@
bool heightOkay = (textureHeight >> level == height) || (textureHeight >> level == 0 && height == 1);
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++)
{
- if (mImageArray[i].surface != NULL)
- {
- mImageArray[i].surface->Release();
- mImageArray[i].surface = NULL;
- mImageArray[i].dirty = true;
- }
+ mImageArray[i].dirty = true;
}
if (mTexture != NULL)
@@ -2493,6 +2497,15 @@
mImageArray[face][level].format = format;
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)
{
return;
@@ -2501,18 +2514,13 @@
bool sizeOkay = (textureWidth >> level == width);
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 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;
}
}