From b4093c12f8a8cf73f869419904c60e953f5725ee Mon Sep 17 00:00:00 2001 From: Fred Fettinger Date: Fri, 29 Aug 2014 14:02:31 -0500 Subject: hwui: Caches: use mBoundTextures only for GL_TEXTURE_2D - DO NOT MERGE Cherry-picked into klp-modular-dev. bug:17441218 GLConsumer uses glBindTexture() directly instead of going through Caches::bindTexture(). This can cause libhwui to draw with the wrong texture bound in the following case which involves 2 TextureViews: Frame 1: GLConsumer::updateTexImage() calls glBindTexture(GL_TEXTURE_EXTERNAL_OES, 1) HWUI renders TextureView A: calls Caches::bindTexture(GL_TEXTURE_EXTERNAL_OES, 1) and draws Frame 2: GLConsumer::updateTexImage() calls glBindTexture(GL_TEXTURE_EXTERNAL_OES, 1) GLConsumer::updateTexImage() calls glBindTexture(GL_TEXTURE_EXTERNAL_OES, 2) HWUI renders TextureView A: calls Caches::bindTexture(GL_TEXTURE_EXTERNAL_OES, 1) and draws HWUI renders TextureView B: calls Caches::bindTexture(GL_TEXTURE_EXTERNAL_OES, 2) and draws In this case, HWUI will incorrectly draw TextureView A using texture 2 on frame 2, because mBoundTextures[0]=1, even though the texture currently bound to GL_TEXTURE_EXTERNAL_OES is 2. Since GLConsumer is always used with a target of GL_TEXTURE_EXTERNAL_OES, work around this problem by having mBoundTextures[] store only the textures bound to the target GL_TEXTURE_2D. This is the common case where the extra performance is needed. Since it's legal to have different textures bound to GL_TEXTURE_2D and GL_TEXTURE_EXTERNAL_OES on one texture unit, Caches::bindTexture() does not need to clear mBoundTextures[mTextureUnit] when target != GL_TEXTURE_2D. Change-Id: I8bc54ab8adcfacad7f3ed17a31236dc7a86c967a Signed-off-by: Fred Fettinger (cherry picked from commit e4de36bbc2baf13206deb53ced39f0befadb1861) --- libs/hwui/Caches.cpp | 8 ++++++-- libs/hwui/Caches.h | 1 + 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/libs/hwui/Caches.cpp b/libs/hwui/Caches.cpp index f8d3589168b6..64853bd73a16 100644 --- a/libs/hwui/Caches.cpp +++ b/libs/hwui/Caches.cpp @@ -534,9 +534,13 @@ void Caches::bindTexture(GLuint texture) { } void Caches::bindTexture(GLenum target, GLuint texture) { - if (mBoundTextures[mTextureUnit] != texture) { + if (target == GL_TEXTURE_2D) { + bindTexture(texture); + } else { + // GLConsumer directly calls glBindTexture() with + // target=GL_TEXTURE_EXTERNAL_OES, don't cache this target + // since the cached state could be stale glBindTexture(target, texture); - mBoundTextures[mTextureUnit] = texture; } } diff --git a/libs/hwui/Caches.h b/libs/hwui/Caches.h index 282aee901006..bddb021882a1 100644 --- a/libs/hwui/Caches.h +++ b/libs/hwui/Caches.h @@ -410,6 +410,7 @@ private: uint32_t mFunctorsCount; + // Caches texture bindings for the GL_TEXTURE_2D target GLuint mBoundTextures[REQUIRED_TEXTURE_UNITS_COUNT]; OverdrawColorSet mOverdrawDebugColorSet; -- cgit v1.2.3-59-g8ed1b