Simplified cube face handling and render target conversion.

TRAC #18730
Signed-off-by: Daniel Koch
Author: Nicolas Capens

git-svn-id: https://angleproject.googlecode.com/svn/trunk@852 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/Texture.cpp b/src/libGLESv2/Texture.cpp
index b2d4800..c886745 100644
--- a/src/libGLESv2/Texture.cpp
+++ b/src/libGLESv2/Texture.cpp
@@ -1953,7 +1953,7 @@
 
 void Texture2D::convertToRenderTarget()
 {
-    IDirect3DTexture9 *texture = NULL;
+    TextureStorage2D *newTexture = NULL;
 
     if (mImageArray[0].getWidth() != 0 && mImageArray[0].getHeight() != 0)
     {
@@ -1962,7 +1962,8 @@
         D3DFORMAT format = mImageArray[0].getD3DFormat();
         GLint levels = creationLevels(mImageArray[0].getWidth(), mImageArray[0].getHeight());
 
-        HRESULT result = device->CreateTexture(mImageArray[0].getWidth(), mImageArray[0].getHeight(), levels, D3DUSAGE_RENDERTARGET, format, D3DPOOL_DEFAULT, &texture, NULL);
+        IDirect3DTexture9 *texture2D = NULL;
+        HRESULT result = device->CreateTexture(mImageArray[0].getWidth(), mImageArray[0].getHeight(), levels, D3DUSAGE_RENDERTARGET, format, D3DPOOL_DEFAULT, &texture2D, NULL);
 
         if (FAILED(result))
         {
@@ -1970,34 +1971,15 @@
             return error(GL_OUT_OF_MEMORY);
         }
 
+        newTexture = new TextureStorage2D(texture2D, true);
+
         if (mTexture != NULL)
         {
             int levels = levelCount();
             for (int i = 0; i < levels; i++)
             {
                 IDirect3DSurface9 *source = mTexture->getSurfaceLevel(i);
-
-                if (!source)
-                {
-                    ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
-
-                    texture->Release();
-
-                    return error(GL_OUT_OF_MEMORY);
-                }
-
-                IDirect3DSurface9 *dest;
-                result = texture->GetSurfaceLevel(i, &dest);
-
-                if (FAILED(result))
-                {
-                    ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
-
-                    texture->Release();
-                    source->Release();
-
-                    return error(GL_OUT_OF_MEMORY);
-                }
+                IDirect3DSurface9 *dest = newTexture->getSurfaceLevel(i);
 
                 display->endScene();
                 result = device->StretchRect(source, NULL, dest, NULL, D3DTEXF_NONE);
@@ -2006,7 +1988,7 @@
                 {
                     ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
 
-                    texture->Release();
+                    delete newTexture;
                     source->Release();
                     dest->Release();
 
@@ -2020,7 +2002,7 @@
     }
 
     delete mTexture;
-    mTexture = new TextureStorage2D(texture, true);
+    mTexture = newTexture;
     mSerial = issueSerial();
     mColorbufferProxy.set(NULL);
     mDirtyImages = true;
@@ -2129,13 +2111,13 @@
     mTexture->Release();
 }
 
-IDirect3DSurface9 *TextureStorageCubeMap::getCubeMapSurface(int face, int level)
+IDirect3DSurface9 *TextureStorageCubeMap::getCubeMapSurface(GLenum faceTarget, int level)
 {
     IDirect3DSurface9 *surface = NULL;
 
     if (mTexture)
     {
-        HRESULT result = mTexture->GetCubeMapSurface(static_cast<D3DCUBEMAP_FACES>(face), level, &surface);
+        HRESULT result = mTexture->GetCubeMapSurface(es2dx::ConvertCubeFace(faceTarget), level, &surface);
         ASSERT(SUCCEEDED(result));
     }
 
@@ -2235,7 +2217,7 @@
 
     if (level < levelCount())
     {
-        IDirect3DSurface9 *destLevel = getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, level);
+        IDirect3DSurface9 *destLevel = mTexture->getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, level);
         ASSERT(destLevel != NULL);
 
         if (destLevel != NULL)
@@ -2416,7 +2398,7 @@
 
 void TextureCubeMap::convertToRenderTarget()
 {
-    IDirect3DCubeTexture9 *texture = NULL;
+    TextureStorageCubeMap *newTexture = NULL;
 
     if (mImageArray[0][0].getWidth() != 0)
     {
@@ -2425,7 +2407,8 @@
         D3DFORMAT format = mImageArray[0][0].getD3DFormat();
         GLint levels = creationLevels(mImageArray[0][0].getWidth(), 0);
 
-        HRESULT result = device->CreateCubeTexture(mImageArray[0][0].getWidth(), levels, D3DUSAGE_RENDERTARGET, format, D3DPOOL_DEFAULT, &texture, NULL);
+        IDirect3DCubeTexture9 *cubeTexture = NULL;
+        HRESULT result = device->CreateCubeTexture(mImageArray[0][0].getWidth(), levels, D3DUSAGE_RENDERTARGET, format, D3DPOOL_DEFAULT, &cubeTexture, NULL);
 
         if (FAILED(result))
         {
@@ -2433,6 +2416,8 @@
             return error(GL_OUT_OF_MEMORY);
         }
 
+        newTexture = new TextureStorageCubeMap(cubeTexture, true);
+
         if (mTexture != NULL)
         {
             int levels = levelCount();
@@ -2440,29 +2425,8 @@
             {
                 for (int i = 0; i < levels; i++)
                 {
-                    IDirect3DSurface9 *source = mTexture->getCubeMapSurface(static_cast<D3DCUBEMAP_FACES>(f), i);
-
-                    if (FAILED(result))
-                    {
-                        ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
-
-                        texture->Release();
-
-                        return error(GL_OUT_OF_MEMORY);
-                    }
-
-                    IDirect3DSurface9 *dest;
-                    result = texture->GetCubeMapSurface(static_cast<D3DCUBEMAP_FACES>(f), i, &dest);
-
-                    if (FAILED(result))
-                    {
-                        ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
-
-                        texture->Release();
-                        source->Release();
-
-                        return error(GL_OUT_OF_MEMORY);
-                    }
+                    IDirect3DSurface9 *source = mTexture->getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + f, i);
+                    IDirect3DSurface9 *dest = newTexture->getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + f, i);
 
                     display->endScene();
                     result = device->StretchRect(source, NULL, dest, NULL, D3DTEXF_NONE);
@@ -2471,7 +2435,7 @@
                     {
                         ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
 
-                        texture->Release();
+                        delete newTexture;
                         source->Release();
                         dest->Release();
 
@@ -2486,7 +2450,7 @@
     }
 
     delete mTexture;
-    mTexture = new TextureStorageCubeMap(texture, true);
+    mTexture = newTexture;
     mSerial = issueSerial();
     for(int face = 0; face < 6; face++) mFaceProxies[face].set(NULL);
     mDirtyImages = true;
@@ -2571,7 +2535,7 @@
 
             GLint destYOffset = transformPixelYOffset(0, height, mImageArray[faceindex][level].getWidth());
 
-            IDirect3DSurface9 *dest = getCubeMapSurface(target, level);
+            IDirect3DSurface9 *dest = mTexture->getCubeMapSurface(target, level);
 
             getBlitter()->copy(source->getRenderTarget(), sourceRect, format, 0, destYOffset, dest);
             dest->Release();
@@ -2579,17 +2543,6 @@
     }
 }
 
-IDirect3DSurface9 *TextureCubeMap::getCubeMapSurface(GLenum target, unsigned int level)
-{
-    if (mTexture == NULL)
-    {
-        UNREACHABLE();
-        return NULL;
-    }
-
-    return mTexture->getCubeMapSurface(es2dx::ConvertCubeFace(target), level);
-}
-
 void TextureCubeMap::copySubImage(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source)
 {
     GLsizei size = mImageArray[faceIndex(target)][level].getWidth();
@@ -2633,7 +2586,7 @@
 
             GLint destYOffset = transformPixelYOffset(yoffset, height, mImageArray[faceindex][level].getWidth());
 
-            IDirect3DSurface9 *dest = getCubeMapSurface(target, level);
+            IDirect3DSurface9 *dest = mTexture->getCubeMapSurface(target, level);
 
             getBlitter()->copy(source->getRenderTarget(), sourceRect, mImageArray[0][0].getFormat(), xoffset, destYOffset, dest);
             dest->Release();
@@ -2694,8 +2647,8 @@
         {
             for (unsigned int i = 1; i <= q; i++)
             {
-                IDirect3DSurface9 *upper = getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + f, i-1);
-                IDirect3DSurface9 *lower = getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + f, i);
+                IDirect3DSurface9 *upper = mTexture->getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + f, i-1);
+                IDirect3DSurface9 *lower = mTexture->getCubeMapSurface(GL_TEXTURE_CUBE_MAP_POSITIVE_X + f, i);
 
                 if (upper != NULL && lower != NULL)
                 {
@@ -2764,7 +2717,7 @@
 
     updateTexture();
     
-    return mTexture->getCubeMapSurface(es2dx::ConvertCubeFace(target), 0);
+    return mTexture->getCubeMapSurface(target, 0);
 }
 
 }
\ No newline at end of file
diff --git a/src/libGLESv2/Texture.h b/src/libGLESv2/Texture.h
index d07f763..6c6677a 100644
--- a/src/libGLESv2/Texture.h
+++ b/src/libGLESv2/Texture.h
@@ -303,7 +303,7 @@
 
     virtual ~TextureStorageCubeMap();
 
-    IDirect3DSurface9 *getCubeMapSurface(int face, int level);
+    IDirect3DSurface9 *getCubeMapSurface(GLenum faceTarget, int level);
     IDirect3DBaseTexture9 *getBaseTexture() const;
 
   private:
@@ -357,10 +357,6 @@
     virtual void convertToRenderTarget();
     virtual IDirect3DSurface9 *getRenderTarget(GLenum target);
 
-    // target is one of the GL_TEXTURE_CUBE_MAP_* enumerants.
-    // Returns NULL if the call underlying Direct3D call fails.
-    IDirect3DSurface9 *getCubeMapSurface(GLenum target, unsigned int level);
-
     static unsigned int faceIndex(GLenum face);
 
     bool isCubeComplete() const;
@@ -377,4 +373,4 @@
 };
 }
 
-#endif   // LIBGLESV2_TEXTURE_H_
+#endif   // LIBGLESV2_TEXTURE_H_
\ No newline at end of file