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");