LayerRenderer.cpp revision 57066eb64c9a190d1afc87bb060bbb2d31e5b86c
16c319ca1275c8db892c39b48fc54864c949f9171Romain Guy/*
26c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * Copyright (C) 2011 The Android Open Source Project
36c319ca1275c8db892c39b48fc54864c949f9171Romain Guy *
46c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * Licensed under the Apache License, Version 2.0 (the "License");
56c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * you may not use this file except in compliance with the License.
66c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * You may obtain a copy of the License at
76c319ca1275c8db892c39b48fc54864c949f9171Romain Guy *
86c319ca1275c8db892c39b48fc54864c949f9171Romain Guy *      http://www.apache.org/licenses/LICENSE-2.0
96c319ca1275c8db892c39b48fc54864c949f9171Romain Guy *
106c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * Unless required by applicable law or agreed to in writing, software
116c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * distributed under the License is distributed on an "AS IS" BASIS,
126c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * See the License for the specific language governing permissions and
146c319ca1275c8db892c39b48fc54864c949f9171Romain Guy * limitations under the License.
156c319ca1275c8db892c39b48fc54864c949f9171Romain Guy */
166c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
176c319ca1275c8db892c39b48fc54864c949f9171Romain Guy#define LOG_TAG "OpenGLRenderer"
186c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
196c319ca1275c8db892c39b48fc54864c949f9171Romain Guy#include "LayerRenderer.h"
206c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
216c319ca1275c8db892c39b48fc54864c949f9171Romain Guynamespace android {
226c319ca1275c8db892c39b48fc54864c949f9171Romain Guynamespace uirenderer {
236c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
246c319ca1275c8db892c39b48fc54864c949f9171Romain Guy///////////////////////////////////////////////////////////////////////////////
256c319ca1275c8db892c39b48fc54864c949f9171Romain Guy// Rendering
266c319ca1275c8db892c39b48fc54864c949f9171Romain Guy///////////////////////////////////////////////////////////////////////////////
276c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
286c319ca1275c8db892c39b48fc54864c949f9171Romain Guyvoid LayerRenderer::prepare(bool opaque) {
296c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    glGetIntegerv(GL_FRAMEBUFFER_BINDING, (GLint*) &mPreviousFbo);
306c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    glBindFramebuffer(GL_FRAMEBUFFER, mFbo);
316c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    OpenGLRenderer::prepare(opaque);
326c319ca1275c8db892c39b48fc54864c949f9171Romain Guy}
336c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
346c319ca1275c8db892c39b48fc54864c949f9171Romain Guyvoid LayerRenderer::finish() {
356c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    OpenGLRenderer::finish();
366c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    glBindFramebuffer(GL_FRAMEBUFFER, mPreviousFbo);
376c319ca1275c8db892c39b48fc54864c949f9171Romain Guy}
386c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
396c319ca1275c8db892c39b48fc54864c949f9171Romain Guy///////////////////////////////////////////////////////////////////////////////
406c319ca1275c8db892c39b48fc54864c949f9171Romain Guy// Static functions
416c319ca1275c8db892c39b48fc54864c949f9171Romain Guy///////////////////////////////////////////////////////////////////////////////
426c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
436c319ca1275c8db892c39b48fc54864c949f9171Romain GuyGLuint LayerRenderer::createLayer(uint32_t width, uint32_t height,
446c319ca1275c8db892c39b48fc54864c949f9171Romain Guy        uint32_t* layerWidth, uint32_t* layerHeight, GLuint* texture) {
456c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    GLuint previousFbo;
466c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    glGetIntegerv(GL_FRAMEBUFFER_BINDING, (GLint*) &previousFbo);
476c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
486c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    GLuint fbo = 0;
496c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    glGenFramebuffers(1, &fbo);
506c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    glBindFramebuffer(GL_FRAMEBUFFER, fbo);
516c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
526c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    glActiveTexture(GL_TEXTURE0);
536c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    glGenTextures(1, texture);
546c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    glBindTexture(GL_TEXTURE_2D, *texture);
556c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
566c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
576c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
586c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
596c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
606c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
616c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
626c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
636c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
646c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0,
656c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            GL_RGBA, GL_UNSIGNED_BYTE, NULL);
666c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
676c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    if (glGetError() != GL_NO_ERROR) {
686c319ca1275c8db892c39b48fc54864c949f9171Romain Guy        glDeleteBuffers(1, &fbo);
696c319ca1275c8db892c39b48fc54864c949f9171Romain Guy        glDeleteTextures(1, texture);
706c319ca1275c8db892c39b48fc54864c949f9171Romain Guy        glBindFramebuffer(GL_FRAMEBUFFER, previousFbo);
716c319ca1275c8db892c39b48fc54864c949f9171Romain Guy        return 0;
726c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    }
736c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
746c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
756c319ca1275c8db892c39b48fc54864c949f9171Romain Guy                *texture, 0);
766c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
776c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    if (glGetError() != GL_NO_ERROR) {
786c319ca1275c8db892c39b48fc54864c949f9171Romain Guy        glDeleteBuffers(1, &fbo);
796c319ca1275c8db892c39b48fc54864c949f9171Romain Guy        glDeleteTextures(1, texture);
806c319ca1275c8db892c39b48fc54864c949f9171Romain Guy        glBindFramebuffer(GL_FRAMEBUFFER, previousFbo);
816c319ca1275c8db892c39b48fc54864c949f9171Romain Guy        return 0;
826c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    }
836c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
846c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    glBindFramebuffer(GL_FRAMEBUFFER, previousFbo);
856c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
866c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    *layerWidth = width;
876c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    *layerHeight = height;
886c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
896c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    return fbo;
906c319ca1275c8db892c39b48fc54864c949f9171Romain Guy}
916c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
926c319ca1275c8db892c39b48fc54864c949f9171Romain Guyvoid LayerRenderer::resizeLayer(GLuint fbo, GLuint texture, uint32_t width, uint32_t height,
936c319ca1275c8db892c39b48fc54864c949f9171Romain Guy        uint32_t* layerWidth, uint32_t* layerHeight) {
946c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    glActiveTexture(GL_TEXTURE0);
956c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    glBindTexture(GL_TEXTURE_2D, texture);
966c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
976c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0,
986c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            GL_RGBA, GL_UNSIGNED_BYTE, NULL);
996c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
1006c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    if (glGetError() != GL_NO_ERROR) {
1016c319ca1275c8db892c39b48fc54864c949f9171Romain Guy        glDeleteBuffers(1, &fbo);
102a9d0711392689a94b9f76eb0c16d0718c005603eRomain Guy        glDeleteTextures(1, &texture);
1036c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
1046c319ca1275c8db892c39b48fc54864c949f9171Romain Guy        *layerWidth = 0;
1056c319ca1275c8db892c39b48fc54864c949f9171Romain Guy        *layerHeight = 0;
1066c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
1076c319ca1275c8db892c39b48fc54864c949f9171Romain Guy        return;
1086c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    }
1096c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
1106c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    *layerWidth = width;
1116c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    *layerHeight = height;
1126c319ca1275c8db892c39b48fc54864c949f9171Romain Guy}
1136c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
1146c319ca1275c8db892c39b48fc54864c949f9171Romain Guyvoid LayerRenderer::destroyLayer(GLuint fbo, GLuint texture) {
1156c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    if (fbo) glDeleteFramebuffers(1, &fbo);
1166c319ca1275c8db892c39b48fc54864c949f9171Romain Guy    if (texture) glDeleteTextures(1, &texture);
1176c319ca1275c8db892c39b48fc54864c949f9171Romain Guy}
1186c319ca1275c8db892c39b48fc54864c949f9171Romain Guy
11957066eb64c9a190d1afc87bb060bbb2d31e5b86cRomain Guyvoid LayerRenderer::destroyLayerDeferred(GLuint fbo, GLuint texture) {
12057066eb64c9a190d1afc87bb060bbb2d31e5b86cRomain Guy    Caches& caches = Caches::getInstance();
12157066eb64c9a190d1afc87bb060bbb2d31e5b86cRomain Guy    if (fbo) caches.deleteFboDeferred(fbo);
12257066eb64c9a190d1afc87bb060bbb2d31e5b86cRomain Guy    if (texture) caches.deleteTextureDeferred(texture);
12357066eb64c9a190d1afc87bb060bbb2d31e5b86cRomain Guy}
12457066eb64c9a190d1afc87bb060bbb2d31e5b86cRomain Guy
1256c319ca1275c8db892c39b48fc54864c949f9171Romain Guy}; // namespace uirenderer
1266c319ca1275c8db892c39b48fc54864c949f9171Romain Guy}; // namespace android
127