Encapsulate D3D textures into Storage classes.

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

git-svn-id: https://angleproject.googlecode.com/svn/trunk@851 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/Texture.cpp b/src/libGLESv2/Texture.cpp
index affe6b8..b2d4800 100644
--- a/src/libGLESv2/Texture.cpp
+++ b/src/libGLESv2/Texture.cpp
@@ -1199,6 +1199,19 @@
     mDirty = true;
 }
 
+TextureStorage::TextureStorage(bool renderable) : mIsRenderable(renderable)
+{
+}
+
+TextureStorage::~TextureStorage()
+{
+}
+
+bool TextureStorage::isRenderable()
+{
+    return mIsRenderable;
+}
+
 Texture::Texture(GLuint id) : RefCountObject(id)
 {
     mSerial = 0;
@@ -1210,8 +1223,6 @@
     mDirtyParameters = true;
     
     mDirtyImages = true;
-    
-    mIsRenderable = false;
 }
 
 Texture::~Texture()
@@ -1508,6 +1519,34 @@
     return mCurrentSerial++;
 }
 
+TextureStorage2D::TextureStorage2D(IDirect3DTexture9 *texture, bool renderable) : TextureStorage(renderable)
+{
+    mTexture = texture;
+}
+
+TextureStorage2D::~TextureStorage2D()
+{
+    mTexture->Release();
+}
+
+IDirect3DSurface9 *TextureStorage2D::getSurfaceLevel(int level)
+{
+    IDirect3DSurface9 *surface = NULL;
+
+    if (mTexture)
+    {
+        HRESULT result = mTexture->GetSurfaceLevel(level, &surface);
+        ASSERT(SUCCEEDED(result));
+    }
+
+    return surface;
+}
+
+IDirect3DBaseTexture9 *TextureStorage2D::getBaseTexture() const
+{
+    return mTexture;
+}
+
 Texture2D::Texture2D(GLuint id) : Texture(id)
 {
     mTexture = NULL;
@@ -1518,12 +1557,9 @@
 {
     mColorbufferProxy.set(NULL);
 
-    if (mTexture)
-    {
-        mTexture->Release();
-        mTexture = NULL;
-    }
-
+    delete mTexture;
+    mTexture = NULL;
+    
     if (mSurface)
     {
         mSurface->setBoundTexture(NULL);
@@ -1574,7 +1610,7 @@
             mImageArray[i].markDirty();
         }
 
-        mTexture->Release();
+        delete mTexture;
         mTexture = NULL;
         mSerial = 0;
         mDirtyImages = true;
@@ -1610,11 +1646,11 @@
 
     mImageArray[0].redefine(format, surface->getWidth(), surface->getHeight(), GL_UNSIGNED_BYTE);
 
-    mTexture = surface->getOffscreenTexture();
+    delete mTexture;
+    mTexture = new TextureStorage2D(surface->getOffscreenTexture(), true);
     mSerial = issueSerial();
     mColorbufferProxy.set(NULL);
     mDirtyImages = true;
-    mIsRenderable = true;
     mSurface = surface;
     mSurface->setBoundTexture(this);
 }
@@ -1628,7 +1664,7 @@
 
         if (mTexture)
         {
-            mTexture->Release();
+            delete mTexture;
             mTexture = NULL;
             mSerial = 0;
             mColorbufferProxy.set(NULL);
@@ -1654,19 +1690,16 @@
 
     if (level < levelCount())
     {
-        IDirect3DSurface9 *destLevel = NULL;
-        HRESULT result = mTexture->GetSurfaceLevel(level, &destLevel);
+        IDirect3DSurface9 *destLevel = mTexture->getSurfaceLevel(level);
 
-        ASSERT(SUCCEEDED(result));
-
-        if (SUCCEEDED(result))
+        if (destLevel)
         {
             Image *image = &mImageArray[level];
 
-            RECT sourceRect = transformPixelRect(xoffset, yoffset, width, height, image->getHeight());;
+            RECT sourceRect = transformPixelRect(xoffset, yoffset, width, height, image->getHeight());
             POINT destPoint = {sourceRect.left, sourceRect.top};
 
-            result = getDevice()->UpdateSurface(image->getSurface(), &sourceRect, destLevel, &destPoint);
+            HRESULT result = getDevice()->UpdateSurface(image->getSurface(), &sourceRect, destLevel, &destPoint);
             ASSERT(SUCCEEDED(result));
 
             destLevel->Release();
@@ -1711,7 +1744,7 @@
     }
     else
     {
-        if (!mTexture || !mIsRenderable)
+        if (!mTexture || !mTexture->isRenderable())
         {
             convertToRenderTarget();
         }
@@ -1728,8 +1761,7 @@
 
             GLint destYOffset = transformPixelYOffset(0, height, mImageArray[level].getHeight());
             
-            IDirect3DSurface9 *dest;
-            HRESULT hr = mTexture->GetSurfaceLevel(level, &dest);
+            IDirect3DSurface9 *dest = mTexture->getSurfaceLevel(level);
 
             getBlitter()->copy(source->getRenderTarget(), sourceRect, format, 0, destYOffset, dest);
             dest->Release();
@@ -1759,7 +1791,7 @@
     }
     else
     {
-        if (!mTexture || !mIsRenderable)
+        if (!mTexture || !mTexture->isRenderable())
         {
             convertToRenderTarget();
         }
@@ -1776,8 +1808,7 @@
 
             GLint destYOffset = transformPixelYOffset(yoffset, height, mImageArray[level].getHeight());
 
-            IDirect3DSurface9 *dest;
-            HRESULT hr = mTexture->GetSurfaceLevel(level, &dest);
+            IDirect3DSurface9 *dest = mTexture->getSurfaceLevel(level);
 
             getBlitter()->copy(source->getRenderTarget(), sourceRect, mImageArray[0].getFormat(), xoffset, destYOffset, dest);
             dest->Release();
@@ -1879,7 +1910,7 @@
 
 IDirect3DBaseTexture9 *Texture2D::getBaseTexture() const
 {
-    return mTexture;
+    return mTexture ? mTexture->getBaseTexture() : NULL;
 }
 
 // Constructs a Direct3D 9 texture resource from the texture images
@@ -1898,16 +1929,11 @@
         return error(GL_OUT_OF_MEMORY);
     }
 
-    if (mTexture)
-    {
-        mTexture->Release();
-    }
-
-    mTexture = texture;
+    delete mTexture;
+    mTexture = new TextureStorage2D(texture, false);
     mSerial = issueSerial();
     mColorbufferProxy.set(NULL);
     mDirtyImages = true;
-    mIsRenderable = false;
 }
 
 void Texture2D::updateTexture()
@@ -1949,10 +1975,9 @@
             int levels = levelCount();
             for (int i = 0; i < levels; i++)
             {
-                IDirect3DSurface9 *source;
-                result = mTexture->GetSurfaceLevel(i, &source);
+                IDirect3DSurface9 *source = mTexture->getSurfaceLevel(i);
 
-                if (FAILED(result))
+                if (!source)
                 {
                     ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY);
 
@@ -1994,16 +2019,11 @@
         }
     }
 
-    if (mTexture != NULL)
-    {
-        mTexture->Release();
-    }
-
-    mTexture = texture;
+    delete mTexture;
+    mTexture = new TextureStorage2D(texture, true);
     mSerial = issueSerial();
     mColorbufferProxy.set(NULL);
     mDirtyImages = true;
-    mIsRenderable = true;
 }
 
 void Texture2D::generateMipmaps()
@@ -2026,15 +2046,12 @@
                          mImageArray[0].getType());
     }
 
-    if (mTexture && mIsRenderable)
+    if (mTexture && mTexture->isRenderable())
     {
         for (unsigned int i = 1; i <= q; i++)
         {
-            IDirect3DSurface9 *upper = NULL;
-            IDirect3DSurface9 *lower = NULL;
-
-            mTexture->GetSurfaceLevel(i-1, &upper);
-            mTexture->GetSurfaceLevel(i, &lower);
+            IDirect3DSurface9 *upper = mTexture->getSurfaceLevel(i - 1);
+            IDirect3DSurface9 *lower = mTexture->getSurfaceLevel(i);
 
             if (upper != NULL && lower != NULL)
             {
@@ -2085,7 +2102,7 @@
 {
     ASSERT(target == GL_TEXTURE_2D);
 
-    if (!mTexture || !mIsRenderable)
+    if (!mTexture || !mTexture->isRenderable())
     {
         convertToRenderTarget();
     }
@@ -2097,12 +2114,39 @@
 
     updateTexture();
     
-    IDirect3DSurface9 *renderTarget = NULL;
-    mTexture->GetSurfaceLevel(0, &renderTarget);
+    IDirect3DSurface9 *renderTarget = mTexture->getSurfaceLevel(0);
 
     return renderTarget;
 }
 
+TextureStorageCubeMap::TextureStorageCubeMap(IDirect3DCubeTexture9 *texture, bool renderable) : TextureStorage(renderable)
+{
+    mTexture = texture;
+}
+
+TextureStorageCubeMap::~TextureStorageCubeMap()
+{
+    mTexture->Release();
+}
+
+IDirect3DSurface9 *TextureStorageCubeMap::getCubeMapSurface(int face, int level)
+{
+    IDirect3DSurface9 *surface = NULL;
+
+    if (mTexture)
+    {
+        HRESULT result = mTexture->GetCubeMapSurface(static_cast<D3DCUBEMAP_FACES>(face), level, &surface);
+        ASSERT(SUCCEEDED(result));
+    }
+
+    return surface;
+}
+
+IDirect3DBaseTexture9 *TextureStorageCubeMap::getBaseTexture() const
+{
+    return mTexture;
+}
+
 TextureCubeMap::TextureCubeMap(GLuint id) : Texture(id)
 {
     mTexture = NULL;
@@ -2115,11 +2159,7 @@
         mFaceProxies[i].set(NULL);
     }
 
-    if (mTexture)
-    {
-        mTexture->Release();
-        mTexture = NULL;
-    }
+    delete mTexture;
 }
 
 GLenum TextureCubeMap::getTarget() const
@@ -2202,7 +2242,7 @@
         {
             Image *image = &mImageArray[face][level];
 
-            RECT sourceRect = transformPixelRect(xoffset, yoffset, width, height, image->getHeight());;
+            RECT sourceRect = transformPixelRect(xoffset, yoffset, width, height, image->getHeight());
             POINT destPoint = {sourceRect.left, sourceRect.top};
 
             HRESULT result = getDevice()->UpdateSurface(image->getSurface(), &sourceRect, destLevel, &destPoint);
@@ -2331,7 +2371,7 @@
 
 IDirect3DBaseTexture9 *TextureCubeMap::getBaseTexture() const
 {
-    return mTexture;
+    return mTexture ? mTexture->getBaseTexture() : NULL;
 }
 
 // Constructs a Direct3D 9 texture resource from the texture images, or returns an existing one
@@ -2350,16 +2390,11 @@
         return error(GL_OUT_OF_MEMORY);
     }
 
-    if (mTexture)
-    {
-        mTexture->Release();
-    }
-
-    mTexture = texture;
+    delete mTexture;
+    mTexture = new TextureStorageCubeMap(texture, false);
     mSerial = issueSerial();
     for(int face = 0; face < 6; face++) mFaceProxies[face].set(NULL);
     mDirtyImages = true;
-    mIsRenderable = false;
 }
 
 void TextureCubeMap::updateTexture()
@@ -2405,8 +2440,7 @@
             {
                 for (int i = 0; i < levels; i++)
                 {
-                    IDirect3DSurface9 *source;
-                    result = mTexture->GetCubeMapSurface(static_cast<D3DCUBEMAP_FACES>(f), i, &source);
+                    IDirect3DSurface9 *source = mTexture->getCubeMapSurface(static_cast<D3DCUBEMAP_FACES>(f), i);
 
                     if (FAILED(result))
                     {
@@ -2451,16 +2485,11 @@
         }
     }
 
-    if (mTexture != NULL)
-    {
-        mTexture->Release();
-    }
-
-    mTexture = texture;
+    delete mTexture;
+    mTexture = new TextureStorageCubeMap(texture, true);
     mSerial = issueSerial();
     for(int face = 0; face < 6; face++) mFaceProxies[face].set(NULL);
     mDirtyImages = true;
-    mIsRenderable = true;
 }
 
 void TextureCubeMap::setImage(int faceIndex, GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels)
@@ -2495,7 +2524,7 @@
             }
         }
 
-        mTexture->Release();
+        delete mTexture;
         mTexture = NULL;
         mSerial = 0;
         for(int face = 0; face < 6; face++) mFaceProxies[face].set(NULL);
@@ -2523,7 +2552,7 @@
     }
     else
     {
-        if (!mTexture || !mIsRenderable)
+        if (!mTexture || !mTexture->isRenderable())
         {
             convertToRenderTarget();
         }
@@ -2558,11 +2587,7 @@
         return NULL;
     }
 
-    IDirect3DSurface9 *surface = NULL;
-
-    HRESULT hr = mTexture->GetCubeMapSurface(es2dx::ConvertCubeFace(target), level, &surface);
-
-    return (SUCCEEDED(hr)) ? surface : 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)
@@ -2591,7 +2616,7 @@
     }
     else
     {
-        if (!mTexture || !mIsRenderable)
+        if (!mTexture || !mTexture->isRenderable())
         {
             convertToRenderTarget();
         }
@@ -2663,7 +2688,7 @@
         }
     }
 
-    if (mTexture && mIsRenderable)
+    if (mTexture && mTexture->isRenderable())
     {
         for (unsigned int f = 0; f < 6; f++)
         {
@@ -2727,7 +2752,7 @@
 {
     ASSERT(IsCubemapTextureTarget(target));
 
-    if (!mTexture || !mIsRenderable)
+    if (!mTexture || !mTexture->isRenderable())
     {
         convertToRenderTarget();
     }
@@ -2739,10 +2764,7 @@
 
     updateTexture();
     
-    IDirect3DSurface9 *renderTarget = NULL;
-    mTexture->GetCubeMapSurface(es2dx::ConvertCubeFace(target), 0, &renderTarget);
-
-    return renderTarget;
+    return mTexture->getCubeMapSurface(es2dx::ConvertCubeFace(target), 0);
 }
 
 }
\ No newline at end of file