Fix dirty texture state management.

TRAC #15703 Issue=86 Signed-off-by: Daniel Koch Author: Nicolas Capens git-svn-id: https://angleproject.googlecode.com/svn/trunk@579 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent 68076a07
...@@ -37,16 +37,15 @@ Texture::Image::~Image() ...@@ -37,16 +37,15 @@ Texture::Image::~Image()
Texture::Texture(GLuint id) : RefCountObject(id) Texture::Texture(GLuint id) : RefCountObject(id)
{ {
mWidth = 0;
mHeight = 0;
mMinFilter = GL_NEAREST_MIPMAP_LINEAR; mMinFilter = GL_NEAREST_MIPMAP_LINEAR;
mMagFilter = GL_LINEAR; mMagFilter = GL_LINEAR;
mWrapS = GL_REPEAT; mWrapS = GL_REPEAT;
mWrapT = GL_REPEAT; mWrapT = GL_REPEAT;
mDirtyParameters = true;
mWidth = 0;
mHeight = 0;
mDirtyMetaData = true;
mDirty = true;
mIsRenderable = false; mIsRenderable = false;
mType = GL_UNSIGNED_BYTE; mType = GL_UNSIGNED_BYTE;
} }
...@@ -76,7 +75,7 @@ bool Texture::setMinFilter(GLenum filter) ...@@ -76,7 +75,7 @@ bool Texture::setMinFilter(GLenum filter)
if (mMinFilter != filter) if (mMinFilter != filter)
{ {
mMinFilter = filter; mMinFilter = filter;
mDirty = true; mDirtyParameters = true;
} }
return true; return true;
} }
...@@ -96,7 +95,7 @@ bool Texture::setMagFilter(GLenum filter) ...@@ -96,7 +95,7 @@ bool Texture::setMagFilter(GLenum filter)
if (mMagFilter != filter) if (mMagFilter != filter)
{ {
mMagFilter = filter; mMagFilter = filter;
mDirty = true; mDirtyParameters = true;
} }
return true; return true;
} }
...@@ -117,7 +116,7 @@ bool Texture::setWrapS(GLenum wrap) ...@@ -117,7 +116,7 @@ bool Texture::setWrapS(GLenum wrap)
if (mWrapS != wrap) if (mWrapS != wrap)
{ {
mWrapS = wrap; mWrapS = wrap;
mDirty = true; mDirtyParameters = true;
} }
return true; return true;
} }
...@@ -138,7 +137,7 @@ bool Texture::setWrapT(GLenum wrap) ...@@ -138,7 +137,7 @@ bool Texture::setWrapT(GLenum wrap)
if (mWrapT != wrap) if (mWrapT != wrap)
{ {
mWrapT = wrap; mWrapT = wrap;
mDirty = true; mDirtyParameters = true;
} }
return true; return true;
} }
...@@ -864,8 +863,6 @@ void Texture::setImage(GLsizei width, GLsizei height, GLenum format, GLenum type ...@@ -864,8 +863,6 @@ void Texture::setImage(GLsizei width, GLsizei height, GLenum format, GLenum type
img->dirty = true; img->dirty = true;
} }
mDirtyMetaData = true;
} }
void Texture::setCompressedImage(GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels, Image *img) void Texture::setCompressedImage(GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *pixels, Image *img)
...@@ -889,8 +886,6 @@ void Texture::setCompressedImage(GLsizei width, GLsizei height, GLenum format, G ...@@ -889,8 +886,6 @@ void Texture::setCompressedImage(GLsizei width, GLsizei height, GLenum format, G
img->dirty = true; img->dirty = true;
} }
mDirtyMetaData = true;
} }
bool Texture::subImage(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels, Image *img) bool Texture::subImage(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels, Image *img)
...@@ -1136,7 +1131,6 @@ void Texture::copyNonRenderable(Image *image, GLenum internalFormat, GLint xoffs ...@@ -1136,7 +1131,6 @@ void Texture::copyNonRenderable(Image *image, GLenum internalFormat, GLint xoffs
} }
image->dirty = true; image->dirty = true;
mDirtyMetaData = true;
} }
image->surface->UnlockRect(); image->surface->UnlockRect();
...@@ -1156,18 +1150,16 @@ IDirect3DBaseTexture9 *Texture::getTexture() ...@@ -1156,18 +1150,16 @@ IDirect3DBaseTexture9 *Texture::getTexture()
return NULL; return NULL;
} }
if (mDirtyMetaData) if (!getBaseTexture())
{ {
createTexture(); createTexture();
mIsRenderable = false;
} }
if (mDirtyMetaData || dirtyImageData()) if (dirtyImageData())
{ {
updateTexture(); updateTexture();
} }
mDirtyMetaData = false;
ASSERT(!dirtyImageData()); ASSERT(!dirtyImageData());
return getBaseTexture(); return getBaseTexture();
...@@ -1175,7 +1167,7 @@ IDirect3DBaseTexture9 *Texture::getTexture() ...@@ -1175,7 +1167,7 @@ IDirect3DBaseTexture9 *Texture::getTexture()
bool Texture::isDirty() const bool Texture::isDirty() const
{ {
return (mDirty || mDirtyMetaData || dirtyImageData()); return true;//(mDirty || mDirtyMetaData || dirtyImageData());
} }
// Returns the top-level texture surface as a render target // Returns the top-level texture surface as a render target
...@@ -1184,15 +1176,12 @@ void Texture::needRenderTarget() ...@@ -1184,15 +1176,12 @@ void Texture::needRenderTarget()
if (!mIsRenderable) if (!mIsRenderable)
{ {
convertToRenderTarget(); convertToRenderTarget();
mIsRenderable = true;
} }
if (dirtyImageData()) if (dirtyImageData())
{ {
updateTexture(); updateTexture();
} }
mDirtyMetaData = false;
} }
GLint Texture::creationLevels(GLsizei width, GLsizei height, GLint maxlevel) const GLint Texture::creationLevels(GLsizei width, GLsizei height, GLint maxlevel) const
...@@ -1380,9 +1369,6 @@ void Texture2D::copyImage(GLint level, GLenum internalFormat, GLint x, GLint y, ...@@ -1380,9 +1369,6 @@ void Texture2D::copyImage(GLint level, GLenum internalFormat, GLint x, GLint y,
if (redefined) if (redefined)
{ {
convertToRenderTarget(); convertToRenderTarget();
mDirtyMetaData = false;
mIsRenderable = true;
mDirty = true;
} }
else else
{ {
...@@ -1436,9 +1422,6 @@ void Texture2D::copySubImage(GLenum target, GLint level, GLint xoffset, GLint yo ...@@ -1436,9 +1422,6 @@ void Texture2D::copySubImage(GLenum target, GLint level, GLint xoffset, GLint yo
if (redefined) if (redefined)
{ {
convertToRenderTarget(); convertToRenderTarget();
mDirtyMetaData = false;
mIsRenderable = true;
mDirty = true;
} }
else else
{ {
...@@ -1571,6 +1554,7 @@ void Texture2D::createTexture() ...@@ -1571,6 +1554,7 @@ void Texture2D::createTexture()
} }
mTexture = texture; mTexture = texture;
mIsRenderable = false;
} }
void Texture2D::updateTexture() void Texture2D::updateTexture()
...@@ -1675,6 +1659,7 @@ void Texture2D::convertToRenderTarget() ...@@ -1675,6 +1659,7 @@ void Texture2D::convertToRenderTarget()
} }
mTexture = texture; mTexture = texture;
mIsRenderable = true;
} }
bool Texture2D::dirtyImageData() const bool Texture2D::dirtyImageData() const
...@@ -1755,8 +1740,6 @@ void Texture2D::generateMipmaps() ...@@ -1755,8 +1740,6 @@ void Texture2D::generateMipmaps()
mImageArray[i].dirty = true; mImageArray[i].dirty = true;
} }
mDirtyMetaData = true;
} }
} }
...@@ -2011,6 +1994,7 @@ void TextureCubeMap::createTexture() ...@@ -2011,6 +1994,7 @@ void TextureCubeMap::createTexture()
} }
mTexture = texture; mTexture = texture;
mIsRenderable = false;
} }
void TextureCubeMap::updateTexture() void TextureCubeMap::updateTexture()
...@@ -2117,6 +2101,7 @@ void TextureCubeMap::convertToRenderTarget() ...@@ -2117,6 +2101,7 @@ void TextureCubeMap::convertToRenderTarget()
} }
mTexture = texture; mTexture = texture;
mIsRenderable = true;
} }
void TextureCubeMap::setImage(int face, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels) void TextureCubeMap::setImage(int face, GLint level, GLenum internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLint unpackAlignment, const void *pixels)
...@@ -2226,9 +2211,6 @@ void TextureCubeMap::copyImage(GLenum target, GLint level, GLenum internalFormat ...@@ -2226,9 +2211,6 @@ void TextureCubeMap::copyImage(GLenum target, GLint level, GLenum internalFormat
if (redefined) if (redefined)
{ {
convertToRenderTarget(); convertToRenderTarget();
mDirtyMetaData = false;
mIsRenderable = true;
mDirty = true;
} }
else else
{ {
...@@ -2301,9 +2283,6 @@ void TextureCubeMap::copySubImage(GLenum target, GLint level, GLint xoffset, GLi ...@@ -2301,9 +2283,6 @@ void TextureCubeMap::copySubImage(GLenum target, GLint level, GLint xoffset, GLi
if (redefined) if (redefined)
{ {
convertToRenderTarget(); convertToRenderTarget();
mDirtyMetaData = false;
mIsRenderable = true;
mDirty = true;
} }
else else
{ {
...@@ -2418,8 +2397,6 @@ void TextureCubeMap::generateMipmaps() ...@@ -2418,8 +2397,6 @@ void TextureCubeMap::generateMipmaps()
mImageArray[f][i].dirty = true; mImageArray[f][i].dirty = true;
} }
} }
mDirtyMetaData = true;
} }
} }
......
...@@ -124,15 +124,15 @@ class Texture : public RefCountObject ...@@ -124,15 +124,15 @@ class Texture : public RefCountObject
GLsizei mWidth; GLsizei mWidth;
GLsizei mHeight; GLsizei mHeight;
GLenum mMinFilter; GLenum mMinFilter;
GLenum mMagFilter; GLenum mMagFilter;
GLenum mWrapS; GLenum mWrapS;
GLenum mWrapT; GLenum mWrapT;
GLenum mType; bool mDirtyParameters;
bool mDirtyMetaData;
bool mIsRenderable; bool mIsRenderable;
bool mDirty; GLenum mType;
private: private:
DISALLOW_COPY_AND_ASSIGN(Texture); DISALLOW_COPY_AND_ASSIGN(Texture);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment