diff options
Diffstat (limited to 'libs/hwui/LayerRenderer.cpp')
| -rw-r--r-- | libs/hwui/LayerRenderer.cpp | 103 | 
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  |