Change Texture::convertToRenderTarget to ensureRenderTarget, which tries to convert a storage to a RT if it isn't already.

TRAC #23961

Signed-off-by: Geoff Lang
Signed-off-by: Shannon Woods
diff --git a/src/libGLESv2/Texture.cpp b/src/libGLESv2/Texture.cpp
index f35445a..ba0639b 100644
--- a/src/libGLESv2/Texture.cpp
+++ b/src/libGLESv2/Texture.cpp
@@ -572,11 +572,7 @@
     }
     else
     {
-        if (!mTexStorage || !mTexStorage->isRenderTarget())
-        {
-            convertToRenderTarget();
-        }
-        
+        ensureRenderTarget();
         mImageArray[level]->markClean();
 
         if (width != 0 && height != 0 && level < levelCount())
@@ -610,10 +606,7 @@
     }
     else
     {
-        if (!mTexStorage || !mTexStorage->isRenderTarget())
-        {
-            convertToRenderTarget();
-        }
+        ensureRenderTarget();
         
         if (level < levelCount())
         {
@@ -852,8 +845,13 @@
     }
 }
 
-void Texture2D::convertToRenderTarget()
+bool Texture2D::ensureRenderTarget()
 {
+    if (mTexStorage && mTexStorage->isRenderTarget())
+    {
+        return true;
+    }
+
     rx::TextureStorageInterface2D *newTexStorage = NULL;
 
     GLsizei width = getBaseLevelWidth();
@@ -870,7 +868,7 @@
             if (!mRenderer->copyToRenderTarget(newTexStorage, mTexStorage))
             {   
                 delete newTexStorage;
-                return gl::error(GL_OUT_OF_MEMORY);
+                return gl::error(GL_OUT_OF_MEMORY, false);
             }
         }
     }
@@ -879,6 +877,8 @@
     mTexStorage = newTexStorage;
 
     mDirtyImages = true;
+
+    return (mTexStorage && mTexStorage->isRenderTarget());
 }
 
 void Texture2D::generateMipmaps()
@@ -929,12 +929,7 @@
 
 unsigned int Texture2D::getRenderTargetSerial(GLint level)
 {
-    if (!mTexStorage || !mTexStorage->isRenderTarget())
-    {
-        convertToRenderTarget();
-    }
-
-    return mTexStorage ? mTexStorage->getRenderTargetSerial(level) : 0;
+    return (ensureRenderTarget() ? mTexStorage->getRenderTargetSerial(level) : 0);
 }
 
 rx::RenderTarget *Texture2D::getRenderTarget(GLint level)
@@ -986,7 +981,7 @@
     {
         if (renderTarget)
         {
-            convertToRenderTarget();
+            ensureRenderTarget();
         }
         else
         {
@@ -1324,8 +1319,13 @@
     }
 }
 
-void TextureCubeMap::convertToRenderTarget()
+bool TextureCubeMap::ensureRenderTarget()
 {
+    if (mTexStorage && mTexStorage->isRenderTarget())
+    {
+        return true;
+    }
+
     rx::TextureStorageInterfaceCube *newTexStorage = NULL;
 
     if (getBaseLevelWidth() != 0)
@@ -1341,7 +1341,7 @@
             if (!mRenderer->copyToRenderTarget(newTexStorage, mTexStorage))
             {
                 delete newTexStorage;
-                return gl::error(GL_OUT_OF_MEMORY);
+                return gl::error(GL_OUT_OF_MEMORY, false);
             }
         }
     }
@@ -1350,6 +1350,7 @@
     mTexStorage = newTexStorage;
 
     mDirtyImages = true;
+    return (mTexStorage && mTexStorage->isRenderTarget());
 }
 
 void TextureCubeMap::setImage(int faceIndex, GLint level, GLsizei width, GLsizei height, GLenum internalFormat, GLenum format, GLenum type, const PixelUnpackState &unpack, const void *pixels)
@@ -1423,11 +1424,7 @@
     }
     else
     {
-        if (!mTexStorage || !mTexStorage->isRenderTarget())
-        {
-            convertToRenderTarget();
-        }
-        
+        ensureRenderTarget();
         mImageArray[faceindex][level]->markClean();
 
         ASSERT(width == height);
@@ -1468,10 +1465,7 @@
     }
     else
     {
-        if (!mTexStorage || !mTexStorage->isRenderTarget())
-        {
-            convertToRenderTarget();
-        }
+        ensureRenderTarget();
         
         if (level < levelCount())
         {
@@ -1594,12 +1588,7 @@
 
 unsigned int TextureCubeMap::getRenderTargetSerial(GLenum faceTarget, GLint level)
 {
-    if (!mTexStorage || !mTexStorage->isRenderTarget())
-    {
-        convertToRenderTarget();
-    }
-
-    return mTexStorage ? mTexStorage->getRenderTargetSerial(faceTarget, level) : 0;
+    return (ensureRenderTarget() ? mTexStorage->getRenderTargetSerial(faceTarget, level) : 0);
 }
 
 rx::RenderTarget *TextureCubeMap::getRenderTarget(GLenum target, GLint level)
@@ -1655,7 +1644,7 @@
     {
         if (renderTarget)
         {
-            convertToRenderTarget();
+            ensureRenderTarget();
         }
         else
         {
@@ -1878,10 +1867,7 @@
     }
     else
     {
-        if (!mTexStorage || !mTexStorage->isRenderTarget())
-        {
-            convertToRenderTarget();
-        }
+        ensureRenderTarget();
 
         if (level < levelCount())
         {
@@ -2011,12 +1997,7 @@
 
 unsigned int Texture3D::getRenderTargetSerial(GLint level, GLint layer)
 {
-    if (!mTexStorage || !mTexStorage->isRenderTarget())
-    {
-        convertToRenderTarget();
-    }
-
-    return mTexStorage ? mTexStorage->getRenderTargetSerial(level, layer) : 0;
+    return (ensureRenderTarget() ? mTexStorage->getRenderTargetSerial(level, layer) : 0);
 }
 
 int Texture3D::levelCount()
@@ -2075,8 +2056,13 @@
     }
 }
 
-void Texture3D::convertToRenderTarget()
+bool Texture3D::ensureRenderTarget()
 {
+    if (mTexStorage && mTexStorage->isRenderTarget())
+    {
+        return true;
+    }
+
     rx::TextureStorageInterface3D *newTexStorage = NULL;
 
     if (getBaseLevelWidth() != 0 && getBaseLevelHeight() != 0 && getBaseLevelDepth() != 0)
@@ -2093,7 +2079,7 @@
             if (!mRenderer->copyToRenderTarget(newTexStorage, mTexStorage))
             {
                 delete newTexStorage;
-                return gl::error(GL_OUT_OF_MEMORY);
+                return gl::error(GL_OUT_OF_MEMORY, false);
             }
         }
     }
@@ -2102,6 +2088,7 @@
     mTexStorage = newTexStorage;
 
     mDirtyImages = true;
+    return (mTexStorage && mTexStorage->isRenderTarget());
 }
 
 rx::RenderTarget *Texture3D::getRenderTarget(GLint level)
@@ -2167,7 +2154,7 @@
     {
         if (renderTarget)
         {
-            convertToRenderTarget();
+            ensureRenderTarget();
         }
         else
         {
@@ -2458,10 +2445,7 @@
     }
     else
     {
-        if (!mTexStorage || !mTexStorage->isRenderTarget())
-        {
-            convertToRenderTarget();
-        }
+        ensureRenderTarget();
 
         if (level < levelCount())
         {
@@ -2585,14 +2569,9 @@
     return renderBuffer;
 }
 
-unsigned int Texture2DArray::getRenderTargetSerial( GLint level, GLint layer )
+unsigned int Texture2DArray::getRenderTargetSerial(GLint level, GLint layer)
 {
-    if (!mTexStorage || !mTexStorage->isRenderTarget())
-    {
-        convertToRenderTarget();
-    }
-
-    return mTexStorage ? mTexStorage->getRenderTargetSerial(level, layer) : 0;
+    return (ensureRenderTarget() ? mTexStorage->getRenderTargetSerial(level, layer) : 0);
 }
 
 int Texture2DArray::levelCount()
@@ -2660,8 +2639,13 @@
     }
 }
 
-void Texture2DArray::convertToRenderTarget()
+bool Texture2DArray::ensureRenderTarget()
 {
+    if (mTexStorage && mTexStorage->isRenderTarget())
+    {
+        return true;
+    }
+
     rx::TextureStorageInterface2DArray *newTexStorage = NULL;
 
     GLsizei width = getBaseLevelWidth();
@@ -2680,7 +2664,7 @@
             if (!mRenderer->copyToRenderTarget(newTexStorage, mTexStorage))
             {
                 delete newTexStorage;
-                return gl::error(GL_OUT_OF_MEMORY);
+                return gl::error(GL_OUT_OF_MEMORY, false);
             }
         }
     }
@@ -2689,6 +2673,7 @@
     mTexStorage = newTexStorage;
 
     mDirtyImages = true;
+    return (mTexStorage && mTexStorage->isRenderTarget());
 }
 
 rx::RenderTarget *Texture2DArray::getRenderTarget(GLint level, GLint layer)
@@ -2735,7 +2720,7 @@
     {
         if (renderTarget)
         {
-            convertToRenderTarget();
+            ensureRenderTarget();
         }
         else
         {
diff --git a/src/libGLESv2/Texture.h b/src/libGLESv2/Texture.h
index 67333bd..c28dc12 100644
--- a/src/libGLESv2/Texture.h
+++ b/src/libGLESv2/Texture.h
@@ -128,7 +128,7 @@
 
     virtual void createTexture() = 0;
     virtual void updateTexture() = 0;
-    virtual void convertToRenderTarget() = 0;
+    virtual bool ensureRenderTarget() = 0;
 
     rx::Renderer *mRenderer;
 
@@ -197,7 +197,7 @@
 
     virtual void createTexture();
     virtual void updateTexture();
-    virtual void convertToRenderTarget();
+    virtual bool ensureRenderTarget();
     virtual rx::TextureStorageInterface *getStorage(bool renderTarget);
     virtual const rx::Image *getBaseLevelImage() const;
 
@@ -264,7 +264,7 @@
 
     virtual void createTexture();
     virtual void updateTexture();
-    virtual void convertToRenderTarget();
+    virtual bool ensureRenderTarget();
     virtual rx::TextureStorageInterface *getStorage(bool renderTarget);
     virtual const rx::Image *getBaseLevelImage() const;
 
@@ -323,7 +323,8 @@
 
     virtual void createTexture();
     virtual void updateTexture();
-    virtual void convertToRenderTarget();
+    virtual bool ensureRenderTarget();
+
     virtual rx::TextureStorageInterface *getStorage(bool renderTarget);
     virtual const rx::Image *getBaseLevelImage() const;
 
@@ -379,7 +380,8 @@
 
     virtual void createTexture();
     virtual void updateTexture();
-    virtual void convertToRenderTarget();
+    virtual bool ensureRenderTarget();
+
     virtual rx::TextureStorageInterface *getStorage(bool renderTarget);
     virtual const rx::Image *getBaseLevelImage() const;
 
diff --git a/src/libGLESv2/renderer/d3d9/Renderer9.cpp b/src/libGLESv2/renderer/d3d9/Renderer9.cpp
index cb7c079..cf61588 100644
--- a/src/libGLESv2/renderer/d3d9/Renderer9.cpp
+++ b/src/libGLESv2/renderer/d3d9/Renderer9.cpp
@@ -249,7 +249,7 @@
     }
 
     // When DirectX9 is running with an older DirectX8 driver, a StretchRect from a regular texture to a render target texture is not supported.
-    // This is required by Texture2D::convertToRenderTarget.
+    // This is required by Texture2D::ensureRenderTarget.
     if ((mDeviceCaps.DevCaps2 & D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES) == 0)
     {
         ERR("Renderer does not support stretctrect from textures!\n");