Always release pbuffer surfaces on redefine.
TRAC #18714
Signed-off-by: Daniel Koch
Author: Nicolas Capens
git-svn-id: https://angleproject.googlecode.com/svn/trunk@836 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/Texture.cpp b/src/libGLESv2/Texture.cpp
index 4363104..6e8cf5f 100644
--- a/src/libGLESv2/Texture.cpp
+++ b/src/libGLESv2/Texture.cpp
@@ -1555,13 +1555,15 @@
return mImageArray[0].getD3DFormat();
}
-void Texture2D::redefineImage(GLint level, GLenum format, GLsizei width, GLsizei height, GLenum type, bool forceRedefine)
+void Texture2D::redefineImage(GLint level, GLenum format, GLsizei width, GLsizei height, GLenum type)
{
GLsizei textureWidth = mImageArray[0].getWidth();
GLsizei textureHeight = mImageArray[0].getHeight();
GLenum textureFormat = mImageArray[0].getFormat();
GLenum textureType = mImageArray[0].getType();
+ releaseTexImage();
+
mImageArray[level].redefine(format, width, height, type);
if (!mTexture)
@@ -1573,7 +1575,7 @@
bool heightOkay = (textureHeight >> level == height) || (textureHeight >> level == 0 && height == 1);
bool textureOkay = (widthOkay && heightOkay && textureFormat == format && textureType == type);
- if (!textureOkay || forceRedefine || mSurface)
+ if (!textureOkay)
{
for (int i = 0; i < IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
{
@@ -1583,26 +1585,21 @@
mTexture->Release();
mTexture = NULL;
mDirtyImages = true;
-
- if (mSurface)
- {
- mSurface->setBoundTexture(NULL);
- mSurface = NULL;
- }
-
mColorbufferProxy.set(NULL);
}
}
void Texture2D::setImage(GLint level, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels)
{
- redefineImage(level, format, width, height, type, false);
+ redefineImage(level, format, width, height, type);
Texture::setImage(unpackAlignment, pixels, &mImageArray[level]);
}
void Texture2D::bindTexImage(egl::Surface *surface)
{
+ releaseTexImage();
+
GLenum format;
switch(surface->getFormat())
@@ -1618,11 +1615,9 @@
return;
}
- redefineImage(0, format, surface->getWidth(), surface->getHeight(), GL_UNSIGNED_BYTE, true);
+ mImageArray[0].redefine(format, surface->getWidth(), surface->getHeight(), GL_UNSIGNED_BYTE);
- IDirect3DTexture9 *texture = surface->getOffscreenTexture();
-
- mTexture = texture;
+ mTexture = surface->getOffscreenTexture();
mDirtyImages = true;
mIsRenderable = true;
mSurface = surface;
@@ -1631,12 +1626,27 @@
void Texture2D::releaseTexImage()
{
- redefineImage(0, GL_RGB, 0, 0, GL_UNSIGNED_BYTE, true);
+ if (mSurface)
+ {
+ mSurface->setBoundTexture(NULL);
+ mSurface = NULL;
+
+ if (mTexture)
+ {
+ mTexture->Release();
+ mTexture = NULL;
+ }
+
+ for (int i = 0; i < IMPLEMENTATION_MAX_TEXTURE_LEVELS; i++)
+ {
+ mImageArray[i].redefine(GL_RGBA, 0, 0, GL_UNSIGNED_BYTE);
+ }
+ }
}
void Texture2D::setCompressedImage(GLint level, GLenum format, GLsizei width, GLsizei height, GLsizei imageSize, const void *pixels)
{
- redefineImage(level, format, width, height, GL_UNSIGNED_BYTE, false);
+ redefineImage(level, format, width, height, GL_UNSIGNED_BYTE);
Texture::setCompressedImage(imageSize, pixels, &mImageArray[level]);
}
@@ -1695,7 +1705,7 @@
return error(GL_OUT_OF_MEMORY);
}
- redefineImage(level, format, width, height, GL_UNSIGNED_BYTE, false);
+ redefineImage(level, format, width, height, GL_UNSIGNED_BYTE);
if (!mImageArray[level].isRenderable())
{
@@ -2009,10 +2019,10 @@
unsigned int q = log2(std::max(mImageArray[0].getWidth(), mImageArray[0].getHeight()));
for (unsigned int i = 1; i <= q; i++)
{
- mImageArray[i].redefine(mImageArray[0].getFormat(),
- std::max(mImageArray[0].getWidth() >> i, 1),
- std::max(mImageArray[0].getHeight() >> i, 1),
- mImageArray[0].getType());
+ redefineImage(i, mImageArray[0].getFormat(),
+ std::max(mImageArray[0].getWidth() >> i, 1),
+ std::max(mImageArray[0].getHeight() >> i, 1),
+ mImageArray[0].getType());
}
if (mTexture && mIsRenderable)
@@ -2652,10 +2662,10 @@
{
for (unsigned int i = 1; i <= q; i++)
{
- mImageArray[f][i].redefine(mImageArray[f][0].getFormat(),
- std::max(mImageArray[f][0].getWidth() >> i, 1),
- std::max(mImageArray[f][0].getWidth() >> i, 1),
- mImageArray[f][0].getType());
+ redefineImage(f, i, mImageArray[f][0].getFormat(),
+ std::max(mImageArray[f][0].getWidth() >> i, 1),
+ std::max(mImageArray[f][0].getWidth() >> i, 1),
+ mImageArray[f][0].getType());
}
}
diff --git a/src/libGLESv2/Texture.h b/src/libGLESv2/Texture.h
index db7e80d..013fb30 100644
--- a/src/libGLESv2/Texture.h
+++ b/src/libGLESv2/Texture.h
@@ -257,7 +257,7 @@
virtual void convertToRenderTarget();
virtual IDirect3DSurface9 *getRenderTarget(GLenum target);
- void redefineImage(GLint level, GLenum format, GLsizei width, GLsizei height, GLenum type, bool force);
+ void redefineImage(GLint level, GLenum format, GLsizei width, GLsizei height, GLenum type);
void commitRect(GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height);
Image mImageArray[IMPLEMENTATION_MAX_TEXTURE_LEVELS];