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;
             }
         }