summaryrefslogtreecommitdiff
path: root/libs/hwui/LayerRenderer.cpp
diff options
context:
space:
mode:
author Romain Guy <romainguy@google.com> 2011-01-13 12:13:20 -0800
committer Romain Guy <romainguy@google.com> 2011-01-13 12:13:20 -0800
commitada830f639591b99c3e40de22b07296c7932a33f (patch)
tree308f469469e96ce7f99d2ec5135e7d44eb858a35 /libs/hwui/LayerRenderer.cpp
parent4f6aff386045000c2c03b903c7109cb42092b7ea (diff)
Cleanup implementation of hardware layers.
The new implementation relies on OpenGLRenderer's existing layer code instead of duplicating it. The new code is much cleaner, with simpler and better APIs and allows tracking of drawn regions inside layers. Region tracking is not yet enabled but this will be done in a future CL. Change-Id: Ie826121a2227de8252c77b992a61218defea5143
Diffstat (limited to 'libs/hwui/LayerRenderer.cpp')
-rw-r--r--libs/hwui/LayerRenderer.cpp103
1 files changed, 59 insertions, 44 deletions
diff --git a/libs/hwui/LayerRenderer.cpp b/libs/hwui/LayerRenderer.cpp
index b838764a54de..a25c95ed6614 100644
--- a/libs/hwui/LayerRenderer.cpp
+++ b/libs/hwui/LayerRenderer.cpp
@@ -27,10 +27,10 @@ namespace uirenderer {
///////////////////////////////////////////////////////////////////////////////
void LayerRenderer::prepare(bool opaque) {
- LAYER_RENDERER_LOGD("Rendering into layer, fbo = %d", mFbo);
+ LAYER_RENDERER_LOGD("Rendering into layer, fbo = %d", mLayer->fbo);
glGetIntegerv(GL_FRAMEBUFFER_BINDING, (GLint*) &mPreviousFbo);
- glBindFramebuffer(GL_FRAMEBUFFER, mFbo);
+ glBindFramebuffer(GL_FRAMEBUFFER, mLayer->fbo);
OpenGLRenderer::prepare(opaque);
}
@@ -39,33 +39,33 @@ void LayerRenderer::finish() {
OpenGLRenderer::finish();
glBindFramebuffer(GL_FRAMEBUFFER, mPreviousFbo);
- LAYER_RENDERER_LOGD("Finished rendering into layer, fbo = %d", mFbo);
+ LAYER_RENDERER_LOGD("Finished rendering into layer, fbo = %d", mLayer->mFbo);
}
///////////////////////////////////////////////////////////////////////////////
// Static functions
///////////////////////////////////////////////////////////////////////////////
-GLuint LayerRenderer::createLayer(uint32_t width, uint32_t height,
- uint32_t* layerWidth, uint32_t* layerHeight, GLuint* texture) {
+Layer* LayerRenderer::createLayer(uint32_t width, uint32_t height, bool isOpaque) {
LAYER_RENDERER_LOGD("Creating new layer %dx%d", width, height);
+ Layer* layer = new Layer(width, height);
+
GLuint previousFbo;
glGetIntegerv(GL_FRAMEBUFFER_BINDING, (GLint*) &previousFbo);
- GLuint fbo = 0;
- glGenFramebuffers(1, &fbo);
- glBindFramebuffer(GL_FRAMEBUFFER, fbo);
+ glGenFramebuffers(1, &layer->fbo);
+ glBindFramebuffer(GL_FRAMEBUFFER, layer->fbo);
if (glGetError() != GL_NO_ERROR) {
glBindFramebuffer(GL_FRAMEBUFFER, previousFbo);
- glDeleteBuffers(1, &fbo);
+ glDeleteBuffers(1, &layer->fbo);
return 0;
}
glActiveTexture(GL_TEXTURE0);
- glGenTextures(1, texture);
- glBindTexture(GL_TEXTURE_2D, *texture);
+ glGenTextures(1, &layer->texture);
+ glBindTexture(GL_TEXTURE_2D, layer->texture);
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
@@ -80,66 +80,81 @@ GLuint LayerRenderer::createLayer(uint32_t width, uint32_t height,
if (glGetError() != GL_NO_ERROR) {
glBindFramebuffer(GL_FRAMEBUFFER, previousFbo);
- glDeleteBuffers(1, &fbo);
- glDeleteTextures(1, texture);
+ glDeleteBuffers(1, &layer->fbo);
+ glDeleteTextures(1, &layer->texture);
+ delete layer;
return 0;
}
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
- *texture, 0);
+ layer->texture, 0);
if (glGetError() != GL_NO_ERROR) {
glBindFramebuffer(GL_FRAMEBUFFER, previousFbo);
- glDeleteBuffers(1, &fbo);
- glDeleteTextures(1, texture);
+ glDeleteBuffers(1, &layer->fbo);
+ glDeleteTextures(1, &layer->texture);
+ delete layer;
return 0;
}
glBindFramebuffer(GL_FRAMEBUFFER, previousFbo);
- *layerWidth = width;
- *layerHeight = height;
+ layer->layer.set(0.0f, 0.0f, width, height);
+ layer->texCoords.set(0.0f, 1.0f, 1.0f, 0.0f);
+ layer->alpha = 255;
+ layer->mode = SkXfermode::kSrcOver_Mode;
+ layer->blend = !isOpaque;
+ layer->empty = false;
+ layer->colorFilter = NULL;
- return fbo;
+ return layer;
}
-void LayerRenderer::resizeLayer(GLuint fbo, GLuint texture, uint32_t width, uint32_t height,
- uint32_t* layerWidth, uint32_t* layerHeight) {
- LAYER_RENDERER_LOGD("Resizing layer fbo = %d to %dx%d", fbo, width, height);
+bool LayerRenderer::resizeLayer(Layer* layer, uint32_t width, uint32_t height) {
+ if (layer) {
+ LAYER_RENDERER_LOGD("Resizing layer fbo = %d to %dx%d", layer->fbo, width, height);
- glActiveTexture(GL_TEXTURE0);
- glBindTexture(GL_TEXTURE_2D, texture);
+ glActiveTexture(GL_TEXTURE0);
+ glBindTexture(GL_TEXTURE_2D, layer->texture);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0,
- GL_RGBA, GL_UNSIGNED_BYTE, NULL);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, NULL);
- if (glGetError() != GL_NO_ERROR) {
- glDeleteBuffers(1, &fbo);
- glDeleteTextures(1, &texture);
+ if (glGetError() != GL_NO_ERROR) {
+ glDeleteBuffers(1, &layer->fbo);
+ glDeleteTextures(1, &layer->texture);
- *layerWidth = 0;
- *layerHeight = 0;
+ layer->width = 0;
+ layer->height = 0;
+ layer->fbo = 0;
+ layer->texture = 0;
- return;
- }
+ return false;
+ }
- *layerWidth = width;
- *layerHeight = height;
+ layer->width = width;
+ layer->height = height;
+ }
+ return true;
}
-void LayerRenderer::destroyLayer(GLuint fbo, GLuint texture) {
- LAYER_RENDERER_LOGD("Destroying layer, fbo = %d", fbo);
+void LayerRenderer::destroyLayer(Layer* layer) {
+ if (layer) {
+ LAYER_RENDERER_LOGD("Destroying layer, fbo = %d", layer->fbo);
+
+ if (layer->fbo) glDeleteFramebuffers(1, &layer->fbo);
+ if (layer->texture) glDeleteTextures(1, &layer->texture);
- if (fbo) glDeleteFramebuffers(1, &fbo);
- if (texture) glDeleteTextures(1, &texture);
+ delete layer;
+ }
}
-void LayerRenderer::destroyLayerDeferred(GLuint fbo, GLuint texture) {
- LAYER_RENDERER_LOGD("Deferring layer destruction, fbo = %d", fbo);
+void LayerRenderer::destroyLayerDeferred(Layer* layer) {
+ if (layer) {
+ LAYER_RENDERER_LOGD("Deferring layer destruction, fbo = %d", layer->fbo);
- Caches& caches = Caches::getInstance();
- if (fbo) caches.deleteFboDeferred(fbo);
- if (texture) caches.deleteTextureDeferred(texture);
+ Caches::getInstance().deleteLayerDeferred(layer);
+ }
}
}; // namespace uirenderer