summaryrefslogtreecommitdiff
path: root/libs/hwui/OpenGLRenderer.cpp
diff options
context:
space:
mode:
author Romain Guy <romainguy@google.com> 2010-07-08 11:48:34 -0700
committer Android (Google) Code Review <android-gerrit@google.com> 2010-07-08 11:48:34 -0700
commit818505aa3035c57b6b419343814135fdbb501bc2 (patch)
treeb94525a8a1e84231b3683ee480d80ae2bedcbe19 /libs/hwui/OpenGLRenderer.cpp
parenta3dcc4cc7e1ee78b270a4590d79c1ef7dafc705f (diff)
parentf18fd99b5c182329cd8936a9611f0103d8ece44a (diff)
Merge "Create FBOs in LayerCache."
Diffstat (limited to 'libs/hwui/OpenGLRenderer.cpp')
-rw-r--r--libs/hwui/OpenGLRenderer.cpp71
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);