Layer.cpp revision 3bbacf27c0be1bae4e4483577fc89ae3113abe5d
1d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase/* 2d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase * Copyright (C) 2012 The Android Open Source Project 3d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase * 4d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase * Licensed under the Apache License, Version 2.0 (the "License"); 5d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase * you may not use this file except in compliance with the License. 6d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase * You may obtain a copy of the License at 7d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase * 8d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase * http://www.apache.org/licenses/LICENSE-2.0 9d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase * 10d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase * Unless required by applicable law or agreed to in writing, software 11d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase * distributed under the License is distributed on an "AS IS" BASIS, 12d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase * See the License for the specific language governing permissions and 14d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase * limitations under the License. 15d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase */ 16d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase 17d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase#define LOG_TAG "OpenGLRenderer" 18d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase 19d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase#include <utils/Log.h> 20d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase 21d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase#include "Layer.h" 2298d3a64ffa13596e3ea9125bbff40c51ec96bd8dChet Haase#include "LayerRenderer.h" 23d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase#include "OpenGLRenderer.h" 24d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase#include "Caches.h" 25d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase 26d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haasenamespace android { 27d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haasenamespace uirenderer { 28d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase 29603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet HaaseLayer::Layer(const uint32_t layerWidth, const uint32_t layerHeight) { 30603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase mesh = NULL; 31603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase meshIndices = NULL; 32603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase meshElementCount = 0; 33603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase cacheable = true; 347c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guy dirty = false; 35603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase textureLayer = false; 36603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase renderTarget = GL_TEXTURE_2D; 37603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase texture.width = layerWidth; 38603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase texture.height = layerHeight; 39603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase colorFilter = NULL; 40603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase deferredUpdateScheduled = false; 41603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase renderer = NULL; 42603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase displayList = NULL; 43603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase fbo = 0; 443bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy stencil = NULL; 455bb3c730f5ebd2a0db1b02a8981c6fdbea6c1a2eRomain Guy debugDrawUpdate = false; 46603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase Caches::getInstance().resourceCache.incrementRefcount(this); 47603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase} 48603f6de35f21d74ae242d52d501f4f5c25ff4f4cChet Haase 49d15ebf25c595b855f6978d0600218e3ea5f31e92Chet HaaseLayer::~Layer() { 50d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase if (mesh) delete mesh; 51d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase if (meshIndices) delete meshIndices; 52d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase if (colorFilter) Caches::getInstance().resourceCache.decrementRefcount(colorFilter); 5398d3a64ffa13596e3ea9125bbff40c51ec96bd8dChet Haase removeFbo(); 548a1374946a928fcba7495c87ff6adda327fdfb9fRomain Guy deleteTexture(); 5597dc9172b0e58979c63de0dedbab656399a62281Romain Guy} 5697dc9172b0e58979c63de0dedbab656399a62281Romain Guy 572055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guyuint32_t Layer::computeIdealWidth(uint32_t layerWidth) { 582055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy return uint32_t(ceilf(layerWidth / float(LAYER_SIZE)) * LAYER_SIZE); 592055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy} 602055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy 612055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guyuint32_t Layer::computeIdealHeight(uint32_t layerHeight) { 622055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy return uint32_t(ceilf(layerHeight / float(LAYER_SIZE)) * LAYER_SIZE); 632055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy} 642055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy 652055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guybool Layer::resize(const uint32_t width, const uint32_t height) { 662055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy uint32_t desiredWidth = computeIdealWidth(width); 672055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy uint32_t desiredHeight = computeIdealWidth(height); 682055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy 692055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy if (desiredWidth <= getWidth() && desiredHeight <= getHeight()) { 702055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy return true; 712055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy } 722055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy 732055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy uint32_t oldWidth = getWidth(); 742055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy uint32_t oldHeight = getHeight(); 752055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy 762055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy setSize(desiredWidth, desiredHeight); 772055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy 782055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy if (fbo) { 792055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy Caches::getInstance().activeTexture(0); 802055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy bindTexture(); 812055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy allocateTexture(GL_RGBA, GL_UNSIGNED_BYTE); 822055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy 832055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy if (glGetError() != GL_NO_ERROR) { 842055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy setSize(oldWidth, oldHeight); 852055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy return false; 862055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy } 872055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy } 882055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy 892055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy if (stencil) { 903bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy stencil->bind(); 913bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy stencil->resize(desiredWidth, desiredHeight); 922055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy 932055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy if (glGetError() != GL_NO_ERROR) { 942055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy setSize(oldWidth, oldHeight); 952055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy return false; 962055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy } 972055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy } 982055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy 992055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy return true; 1002055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy} 1012055abaa0a590c35e27e1ae2e7d7cfccdfb98b59Romain Guy 1028ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guyvoid Layer::removeFbo(bool flush) { 1038ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy if (stencil) { 1048ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy // TODO: recycle & cache instead of simply deleting 1058ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy GLuint previousFbo; 1068ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy glGetIntegerv(GL_FRAMEBUFFER_BINDING, (GLint*) &previousFbo); 1078ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy if (fbo != previousFbo) glBindFramebuffer(GL_FRAMEBUFFER, fbo); 1088ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, 0); 1098ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy if (fbo != previousFbo) glBindFramebuffer(GL_FRAMEBUFFER, previousFbo); 1108ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy 1113bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy delete stencil; 1123bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy stencil = NULL; 1138ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy } 1148ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy 11598d3a64ffa13596e3ea9125bbff40c51ec96bd8dChet Haase if (fbo) { 1168ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy if (flush) LayerRenderer::flushLayer(this); 1178ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy // If put fails the cache will delete the FBO 11898d3a64ffa13596e3ea9125bbff40c51ec96bd8dChet Haase Caches::getInstance().fboCache.put(fbo); 11998d3a64ffa13596e3ea9125bbff40c51ec96bd8dChet Haase fbo = 0; 12056257aff8a55c847be72be9924c392033fd8151dDave Burke } 12156257aff8a55c847be72be9924c392033fd8151dDave Burke} 12256257aff8a55c847be72be9924c392033fd8151dDave Burke 123d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haasevoid Layer::setPaint(SkPaint* paint) { 124d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase OpenGLRenderer::getAlphaAndModeDirect(paint, &alpha, &mode); 125d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase} 126d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase 127d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haasevoid Layer::setColorFilter(SkiaColorFilter* filter) { 128d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase if (colorFilter) { 129d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase Caches::getInstance().resourceCache.decrementRefcount(colorFilter); 130d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase } 131d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase colorFilter = filter; 132d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase if (colorFilter) { 133d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase Caches::getInstance().resourceCache.incrementRefcount(colorFilter); 134d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase } 135d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase} 136d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase 137d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase}; // namespace uirenderer 138d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase}; // namespace android 139