Commit 96748507 by Jamie Madill

Clear image descs on Impl errors.

This is a speculative fix for a possible crash, when we could get out-of-sync between the Impl and the GL state. BUG=485543 Change-Id: Id26475f1aae7da05b5ffd802c4a7600e21b40315 Reviewed-on: https://chromium-review.googlesource.com/270194Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Tested-by: 's avatarJamie Madill <jmadill@chromium.org>
parent 4b6945a4
...@@ -170,6 +170,8 @@ Error Texture::setImage(GLenum target, size_t level, GLenum internalFormat, cons ...@@ -170,6 +170,8 @@ Error Texture::setImage(GLenum target, size_t level, GLenum internalFormat, cons
Error error = mTexture->setImage(target, level, internalFormat, size, format, type, unpack, pixels); Error error = mTexture->setImage(target, level, internalFormat, size, format, type, unpack, pixels);
if (error.isError()) if (error.isError())
{ {
// May be broken at the impl level
clearImageDescs();
return error; return error;
} }
...@@ -196,6 +198,8 @@ Error Texture::setCompressedImage(GLenum target, size_t level, GLenum internalFo ...@@ -196,6 +198,8 @@ Error Texture::setCompressedImage(GLenum target, size_t level, GLenum internalFo
Error error = mTexture->setCompressedImage(target, level, internalFormat, size, unpack, pixels); Error error = mTexture->setCompressedImage(target, level, internalFormat, size, unpack, pixels);
if (error.isError()) if (error.isError())
{ {
// May be broken at the impl level
clearImageDescs();
return error; return error;
} }
...@@ -222,6 +226,8 @@ Error Texture::copyImage(GLenum target, size_t level, const Rectangle &sourceAre ...@@ -222,6 +226,8 @@ Error Texture::copyImage(GLenum target, size_t level, const Rectangle &sourceAre
Error error = mTexture->copyImage(target, level, sourceArea, internalFormat, source); Error error = mTexture->copyImage(target, level, sourceArea, internalFormat, source);
if (error.isError()) if (error.isError())
{ {
// May be broken at the impl level
clearImageDescs();
return error; return error;
} }
...@@ -248,6 +254,8 @@ Error Texture::setStorage(GLenum target, size_t levels, GLenum internalFormat, c ...@@ -248,6 +254,8 @@ Error Texture::setStorage(GLenum target, size_t levels, GLenum internalFormat, c
Error error = mTexture->setStorage(target, levels, internalFormat, size); Error error = mTexture->setStorage(target, levels, internalFormat, size);
if (error.isError()) if (error.isError())
{ {
// May be broken at the impl level
clearImageDescs();
return error; return error;
} }
...@@ -266,6 +274,8 @@ Error Texture::generateMipmaps() ...@@ -266,6 +274,8 @@ Error Texture::generateMipmaps()
Error error = mTexture->generateMipmaps(getSamplerState()); Error error = mTexture->generateMipmaps(getSamplerState());
if (error.isError()) if (error.isError())
{ {
// May be broken at the impl level
clearImageDescs();
return error; return error;
} }
......
...@@ -78,7 +78,8 @@ TextureD3D::TextureD3D(RendererD3D *renderer) ...@@ -78,7 +78,8 @@ TextureD3D::TextureD3D(RendererD3D *renderer)
mUsage(GL_NONE), mUsage(GL_NONE),
mDirtyImages(true), mDirtyImages(true),
mImmutable(false), mImmutable(false),
mTexStorage(NULL) mTexStorage(NULL),
mTriedToInitIncompleteStorage(false)
{ {
} }
...@@ -1073,6 +1074,8 @@ gl::Error TextureD3D_2D::initializeStorage(bool renderTarget) ...@@ -1073,6 +1074,8 @@ gl::Error TextureD3D_2D::initializeStorage(bool renderTarget)
// do not attempt to create storage for nonexistant data // do not attempt to create storage for nonexistant data
if (!isLevelComplete(0)) if (!isLevelComplete(0))
{ {
// TODO(jmadill): remove this debugging code after we fix the bug
mTriedToInitIncompleteStorage = true;
return gl::Error(GL_NO_ERROR); return gl::Error(GL_NO_ERROR);
} }
......
...@@ -103,6 +103,10 @@ class TextureD3D : public TextureImpl ...@@ -103,6 +103,10 @@ class TextureD3D : public TextureImpl
bool mImmutable; bool mImmutable;
TextureStorage *mTexStorage; TextureStorage *mTexStorage;
// TODO(jmadill): remove this debugging code after we fix the bug
friend class Renderer11;
bool mTriedToInitIncompleteStorage;
private: private:
virtual gl::Error initializeStorage(bool renderTarget) = 0; virtual gl::Error initializeStorage(bool renderTarget) = 0;
......
...@@ -791,7 +791,15 @@ gl::Error Renderer11::setSamplerState(gl::SamplerType type, int index, gl::Textu ...@@ -791,7 +791,15 @@ gl::Error Renderer11::setSamplerState(gl::SamplerType type, int index, gl::Textu
// Storage should exist, texture should be complete // Storage should exist, texture should be complete
ASSERT(storage); ASSERT(storage);
samplerStateInternal.baseLevel += storage->getTopLevel(); // TODO(jmadill): remove this debugging code after we fix the bug
if (!storage && textureD3D->mTriedToInitIncompleteStorage)
{
samplerStateInternal.baseLevel += storage->getTopLevel();
}
else
{
samplerStateInternal.baseLevel += storage->getTopLevel();
}
if (type == gl::SAMPLER_PIXEL) if (type == gl::SAMPLER_PIXEL)
{ {
......
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