diff options
author | 2010-07-08 11:48:34 -0700 | |
---|---|---|
committer | 2010-07-08 11:48:34 -0700 | |
commit | 818505aa3035c57b6b419343814135fdbb501bc2 (patch) | |
tree | b94525a8a1e84231b3683ee480d80ae2bedcbe19 /libs/hwui/OpenGLRenderer.cpp | |
parent | a3dcc4cc7e1ee78b270a4590d79c1ef7dafc705f (diff) | |
parent | f18fd99b5c182329cd8936a9611f0103d8ece44a (diff) |
Merge "Create FBOs in LayerCache."
Diffstat (limited to 'libs/hwui/OpenGLRenderer.cpp')
-rw-r--r-- | libs/hwui/OpenGLRenderer.cpp | 71 |
1 files changed, 10 insertions, 61 deletions
diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index ae7719c45cd5..027ed7911810 100644 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -34,9 +34,6 @@ namespace uirenderer { // Defines /////////////////////////////////////////////////////////////////////////////// -// Debug -#define DEBUG_LAYERS 0 - // These properties are defined in mega-bytes #define PROPERTY_TEXTURE_CACHE_SIZE "ro.hwui.texture_cache_size" #define PROPERTY_LAYER_CACHE_SIZE "ro.hwui.layer_cache_size" @@ -51,13 +48,6 @@ namespace uirenderer { #define SV(x, y) { { x, y } } #define FV(x, y, u, v) { { x, y }, { u, v } } -// Debug -#if DEBUG_LAYERS - #define LAYER_LOGD(...) LOGD(__VA_ARGS__) -#else - #define LAYER_LOGD(...) -#endif - /////////////////////////////////////////////////////////////////////////////// // Globals /////////////////////////////////////////////////////////////////////////////// @@ -253,6 +243,8 @@ void OpenGLRenderer::composeLayer(sp<Snapshot> current, sp<Snapshot> previous) { layer->texture, layer->alpha, layer->mode, layer->blend, true); LayerSize size(rect.getWidth(), rect.getHeight()); + // Failing to add the layer to the cache should happen only if the + // layer is too large if (!mLayerCache.put(size, layer)) { LAYER_LOGD("Deleting layer"); @@ -300,63 +292,20 @@ int OpenGLRenderer::saveLayerAlpha(float left, float top, float right, float bot bool OpenGLRenderer::createLayer(sp<Snapshot> snapshot, float left, float top, float right, float bottom, int alpha, SkXfermode::Mode mode,int flags) { - LayerSize size(right - left, bottom - top); - Layer* layer = mLayerCache.get(size); - LAYER_LOGD("Requesting layer %dx%d", size.width, size.height); LAYER_LOGD("Layer cache size = %d", mLayerCache.getSize()); - if (!layer) { - LAYER_LOGD("Creating new layer"); - - layer = new Layer; - layer->blend = true; - - // Generate the FBO and attach the texture - glGenFramebuffers(1, &layer->fbo); - glBindFramebuffer(GL_FRAMEBUFFER, layer->fbo); - - // Generate the texture in which the FBO will draw - glGenTextures(1, &layer->texture); - glBindTexture(GL_TEXTURE_2D, layer->texture); - - // The FBO will not be scaled, so we can use lower quality filtering - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - - // TODO VERY IMPORTANT: Fix TextView to not call saveLayer() all the time - - const GLsizei width = right - left; - const GLsizei height = bottom - top; - - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); - glBindTexture(GL_TEXTURE_2D, 0); - - // Bind texture to FBO - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, - layer->texture, 0); - - GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); - if (status != GL_FRAMEBUFFER_COMPLETE) { - LOGD("Framebuffer incomplete (GL error code 0x%x)", status); - - GLuint previousFbo = snapshot->previous.get() ? snapshot->previous->fbo : 0; - glBindFramebuffer(GL_FRAMEBUFFER, previousFbo); - - glDeleteFramebuffers(1, &layer->fbo); - glDeleteTextures(1, &layer->texture); - delete layer; + GLuint previousFbo = snapshot->previous.get() ? snapshot->previous->fbo : 0; + LayerSize size(right - left, bottom - top); - return false; - } - } else { - LAYER_LOGD("Reusing layer"); - glBindFramebuffer(GL_FRAMEBUFFER, layer->fbo); + // TODO VERY IMPORTANT: Fix TextView to not call saveLayer() all the time + Layer* layer = mLayerCache.get(size, previousFbo); + if (!layer) { + return false; } + glBindFramebuffer(GL_FRAMEBUFFER, layer->fbo); + // Clear the FBO glDisable(GL_SCISSOR_TEST); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); |