diff options
author | Romain Guy <romainguy@google.com> | 2013-06-27 17:15:24 -0700 |
---|---|---|
committer | Romain Guy <romainguy@google.com> | 2013-06-27 17:15:24 -0700 |
commit | b254c242d98f4a9d98055726446351e52bece2c6 (patch) | |
tree | 69df91645e499216cadb4e9ba11e57bc32b2d681 /libs/hwui | |
parent | e6cb43a1ea50681d2da30ce5e8cb5ac97e80e88a (diff) | |
download | frameworks_base-b254c242d98f4a9d98055726446351e52bece2c6.zip frameworks_base-b254c242d98f4a9d98055726446351e52bece2c6.tar.gz frameworks_base-b254c242d98f4a9d98055726446351e52bece2c6.tar.bz2 |
Fix out of range glCopyTexImage2D
Bug #9425270
A better solution would be to use glCopyTexImage2D whenever possible but
this change would be a little more dangerous.
Change-Id: Ib1aaceda39d838716285ef97f356721416822dbb
Diffstat (limited to 'libs/hwui')
-rw-r--r-- | libs/hwui/OpenGLRenderer.cpp | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index ddb190e..7735819 100644 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -882,15 +882,18 @@ bool OpenGLRenderer::createLayer(float left, float top, float right, float botto layer->bindTexture(); if (!bounds.isEmpty()) { if (layer->isEmpty()) { - glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, - bounds.left, mSnapshot->height - bounds.bottom, - layer->getWidth(), layer->getHeight(), 0); + // Workaround for some GL drivers. When reading pixels lying outside + // of the window we should get undefined values for those pixels. + // Unfortunately some drivers will turn the entire target texture black + // when reading outside of the window. + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, layer->getWidth(), layer->getHeight(), + 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); layer->setEmpty(false); - } else { - glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, bounds.left, - mSnapshot->height - bounds.bottom, bounds.getWidth(), bounds.getHeight()); } + glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, bounds.left, + mSnapshot->height - bounds.bottom, bounds.getWidth(), bounds.getHeight()); + // Enqueue the buffer coordinates to clear the corresponding region later mLayers.push(new Rect(bounds)); } |