diff options
Diffstat (limited to 'libs/hwui')
-rw-r--r-- | libs/hwui/Caches.h | 2 | ||||
-rw-r--r-- | libs/hwui/LayerRenderer.cpp | 56 | ||||
-rw-r--r-- | libs/hwui/OpenGLRenderer.cpp | 1 | ||||
-rw-r--r-- | libs/hwui/ShapeCache.h | 11 |
4 files changed, 46 insertions, 24 deletions
diff --git a/libs/hwui/Caches.h b/libs/hwui/Caches.h index 596781e..e64d8ac 100644 --- a/libs/hwui/Caches.h +++ b/libs/hwui/Caches.h @@ -74,7 +74,7 @@ static const GLsizei gMeshCount = 4; struct CacheLogger { CacheLogger() { - LOGD("Creating OpenGL renderer caches"); + INIT_LOGD("Creating OpenGL renderer caches"); } }; // struct CacheLogger diff --git a/libs/hwui/LayerRenderer.cpp b/libs/hwui/LayerRenderer.cpp index 146e789..77e63d7 100644 --- a/libs/hwui/LayerRenderer.cpp +++ b/libs/hwui/LayerRenderer.cpp @@ -326,12 +326,17 @@ bool LayerRenderer::copyLayer(Layer* layer, SkBitmap* bitmap) { return false; } + SkAutoLockPixels alp(*bitmap); + GLuint texture; GLuint previousFbo; GLenum format; GLenum type; + GLenum error = GL_NO_ERROR; + bool status = false; + switch (bitmap->config()) { case SkBitmap::kA8_Config: format = GL_ALPHA; @@ -352,10 +357,18 @@ bool LayerRenderer::copyLayer(Layer* layer, SkBitmap* bitmap) { break; } + float alpha = layer->alpha; + SkXfermode::Mode mode = layer->mode; + + layer->mode = SkXfermode::kSrc_Mode; + layer->alpha = 255; + layer->fbo = fbo; + glGetIntegerv(GL_FRAMEBUFFER_BINDING, (GLint*) &previousFbo); glBindFramebuffer(GL_FRAMEBUFFER, fbo); glGenTextures(1, &texture); + if ((error = glGetError()) != GL_NO_ERROR) goto error; glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, texture); @@ -368,39 +381,48 @@ bool LayerRenderer::copyLayer(Layer* layer, SkBitmap* bitmap) { glTexImage2D(GL_TEXTURE_2D, 0, format, bitmap->width(), bitmap->height(), 0, format, type, NULL); + if ((error = glGetError()) != GL_NO_ERROR) goto error; + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); + if ((error = glGetError()) != GL_NO_ERROR) goto error; - glBindTexture(GL_TEXTURE_2D, layer->texture); + { + LayerRenderer renderer(layer); + renderer.setViewport(bitmap->width(), bitmap->height()); + renderer.OpenGLRenderer::prepareDirty(0.0f, 0.0f, + bitmap->width(), bitmap->height(), !layer->blend); + if ((error = glGetError()) != GL_NO_ERROR) goto error; - float alpha = layer->alpha; - SkXfermode::Mode mode = layer->mode; + { + Rect bounds; + bounds.set(0.0f, 0.0f, bitmap->width(), bitmap->height()); + renderer.drawTextureLayer(layer, bounds); - layer->mode = SkXfermode::kSrc_Mode; - layer->alpha = 255; - layer->fbo = fbo; + glReadPixels(0, 0, bitmap->width(), bitmap->height(), format, + type, bitmap->getPixels()); - LayerRenderer renderer(layer); - renderer.setViewport(bitmap->width(), bitmap->height()); - renderer.OpenGLRenderer::prepareDirty(0.0f, 0.0f, - bitmap->width(), bitmap->height(), !layer->blend); + if ((error = glGetError()) != GL_NO_ERROR) goto error; + } - Rect bounds; - bounds.set(0.0f, 0.0f, bitmap->width(), bitmap->height()); - renderer.drawTextureLayer(layer, bounds); + status = true; + } - SkAutoLockPixels alp(*bitmap); - glReadPixels(0, 0, bitmap->width(), bitmap->height(), format, type, bitmap->getPixels()); +error: +#if DEBUG_OPENGL + if (error != GL_NO_ERROR) { + LOGD("GL error while copying layer into bitmap = 0x%x", error); + } +#endif glBindFramebuffer(GL_FRAMEBUFFER, previousFbo); - layer->mode = mode; layer->alpha = alpha; layer->fbo = 0; glDeleteTextures(1, &texture); caches.fboCache.put(fbo); - return true; + return status; } return false; } diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index 5343a05..88774c6 100644 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -151,7 +151,6 @@ void OpenGLRenderer::prepareDirty(float left, float top, float right, float bott mSaveCount = 1; glViewport(0, 0, mWidth, mHeight); - glDisable(GL_DITHER); glEnable(GL_SCISSOR_TEST); diff --git a/libs/hwui/ShapeCache.h b/libs/hwui/ShapeCache.h index b5cc29c..b048469 100644 --- a/libs/hwui/ShapeCache.h +++ b/libs/hwui/ShapeCache.h @@ -537,15 +537,16 @@ PathTexture* ShapeCache<Entry>::addTexture(const Entry& entry, const SkPath *pat const float pathWidth = fmax(bounds.width(), 1.0f); const float pathHeight = fmax(bounds.height(), 1.0f); - if (pathWidth > mMaxTextureSize || pathHeight > mMaxTextureSize) { - LOGW("Shape %s too large to be rendered into a texture", mName); - return NULL; - } + const float offset = fmax(paint->getStrokeWidth(), 1.0f) * 1.5f; - const float offset = paint->getStrokeWidth() * 1.5f; const uint32_t width = uint32_t(pathWidth + offset * 2.0 + 0.5); const uint32_t height = uint32_t(pathHeight + offset * 2.0 + 0.5); + if (width > mMaxTextureSize || height > mMaxTextureSize) { + LOGW("Shape %s too large to be rendered into a texture", mName); + return NULL; + } + const uint32_t size = width * height; // Don't even try to cache a bitmap that's bigger than the cache if (size < mMaxSize) { |