From b254c242d98f4a9d98055726446351e52bece2c6 Mon Sep 17 00:00:00 2001 From: Romain Guy Date: Thu, 27 Jun 2013 17:15:24 -0700 Subject: 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 --- libs/hwui/OpenGLRenderer.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) (limited to 'libs/hwui/OpenGLRenderer.cpp') diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index ddb190e3fec1..7735819a20a0 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)); } -- cgit v1.2.3-59-g8ed1b