Layer.cpp revision bfd1cd620991ac2fa9202fdce6c00ec47d071935
1d43daf361e993457e64eeeddab6d1a0ebc828c99Alan Viverette/* 2d43daf361e993457e64eeeddab6d1a0ebc828c99Alan Viverette * Copyright (C) 2012 The Android Open Source Project 3d43daf361e993457e64eeeddab6d1a0ebc828c99Alan Viverette * 4d43daf361e993457e64eeeddab6d1a0ebc828c99Alan Viverette * Licensed under the Apache License, Version 2.0 (the "License"); 5d43daf361e993457e64eeeddab6d1a0ebc828c99Alan Viverette * you may not use this file except in compliance with the License. 6d43daf361e993457e64eeeddab6d1a0ebc828c99Alan Viverette * You may obtain a copy of the License at 7d43daf361e993457e64eeeddab6d1a0ebc828c99Alan Viverette * 8d43daf361e993457e64eeeddab6d1a0ebc828c99Alan Viverette * http://www.apache.org/licenses/LICENSE-2.0 9d43daf361e993457e64eeeddab6d1a0ebc828c99Alan Viverette * 10d43daf361e993457e64eeeddab6d1a0ebc828c99Alan Viverette * Unless required by applicable law or agreed to in writing, software 11d43daf361e993457e64eeeddab6d1a0ebc828c99Alan Viverette * distributed under the License is distributed on an "AS IS" BASIS, 12d43daf361e993457e64eeeddab6d1a0ebc828c99Alan Viverette * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d43daf361e993457e64eeeddab6d1a0ebc828c99Alan Viverette * See the License for the specific language governing permissions and 14d43daf361e993457e64eeeddab6d1a0ebc828c99Alan Viverette * limitations under the License. 15d43daf361e993457e64eeeddab6d1a0ebc828c99Alan Viverette */ 16d43daf361e993457e64eeeddab6d1a0ebc828c99Alan Viverette 1776935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar#define LOG_TAG "OpenGLRenderer" 1876935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar 1976935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar#include <utils/Log.h> 207fe420f31b4de2bbd7a89194384d0c9ac6293226Alan Viverette 21d43daf361e993457e64eeeddab6d1a0ebc828c99Alan Viverette#include "Caches.h" 22d43daf361e993457e64eeeddab6d1a0ebc828c99Alan Viverette#include "DeferredDisplayList.h" 2376935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar#include "RenderState.h" 2476935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar#include "Layer.h" 25d43daf361e993457e64eeeddab6d1a0ebc828c99Alan Viverette#include "LayerRenderer.h" 2676935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar#include "OpenGLRenderer.h" 27d43daf361e993457e64eeeddab6d1a0ebc828c99Alan Viverette#include "RenderNode.h" 28d43daf361e993457e64eeeddab6d1a0ebc828c99Alan Viverette 29d43daf361e993457e64eeeddab6d1a0ebc828c99Alan Viverettenamespace android { 30d43daf361e993457e64eeeddab6d1a0ebc828c99Alan Viverettenamespace uirenderer { 31d43daf361e993457e64eeeddab6d1a0ebc828c99Alan Viverette 32d43daf361e993457e64eeeddab6d1a0ebc828c99Alan ViveretteLayer::Layer(Type layerType, RenderState& renderState, const uint32_t layerWidth, const uint32_t layerHeight) 33d43daf361e993457e64eeeddab6d1a0ebc828c99Alan Viverette : state(kState_Uncached) 3476935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar , caches(Caches::getInstance()) 35d43daf361e993457e64eeeddab6d1a0ebc828c99Alan Viverette , renderState(renderState) 3676935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar , texture(caches) 3776935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar , type(layerType) { 3876935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar mesh = NULL; 3976935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar meshElementCount = 0; 4076935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar cacheable = true; 4176935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar dirty = false; 4276935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar renderTarget = GL_TEXTURE_2D; 43d43daf361e993457e64eeeddab6d1a0ebc828c99Alan Viverette texture.width = layerWidth; 4476935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar texture.height = layerHeight; 45d43daf361e993457e64eeeddab6d1a0ebc828c99Alan Viverette colorFilter = NULL; 46d43daf361e993457e64eeeddab6d1a0ebc828c99Alan Viverette deferredUpdateScheduled = false; 47d43daf361e993457e64eeeddab6d1a0ebc828c99Alan Viverette renderer = NULL; 48d43daf361e993457e64eeeddab6d1a0ebc828c99Alan Viverette renderNode = NULL; 4976935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar fbo = 0; 5076935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar stencil = NULL; 5176935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar debugDrawUpdate = false; 5276935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar hasDrawnSinceUpdate = false; 5376935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar forceFilter = false; 5476935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar deferredList = NULL; 5576935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar convexMask = NULL; 5676935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar caches.resourceCache.incrementRefcount(this); 5776935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar rendererLightPosDirty = true; 5876935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar wasBuildLayered = false; 5976935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar if (!isTextureLayer()) { 6076935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar // track only non-texture layer lifecycles in renderstate, 61d43daf361e993457e64eeeddab6d1a0ebc828c99Alan Viverette // because texture layers are destroyed via finalizer 62d43daf361e993457e64eeeddab6d1a0ebc828c99Alan Viverette renderState.registerLayer(this); 63d43daf361e993457e64eeeddab6d1a0ebc828c99Alan Viverette } 6476935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar} 65d43daf361e993457e64eeeddab6d1a0ebc828c99Alan Viverette 6676935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos MolnarLayer::~Layer() { 6776935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar if (!isTextureLayer()) { 6876935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar renderState.unregisterLayer(this); 6976935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar } 7076935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar SkSafeUnref(colorFilter); 7176935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar removeFbo(); 7276935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar deleteTexture(); 7376935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar 7476935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar delete[] mesh; 7576935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar delete deferredList; 7676935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar delete renderer; 7776935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar} 7876935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar 7976935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnaruint32_t Layer::computeIdealWidth(uint32_t layerWidth) { 8076935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar return uint32_t(ceilf(layerWidth / float(LAYER_SIZE)) * LAYER_SIZE); 8176935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar} 8276935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar 8376935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnaruint32_t Layer::computeIdealHeight(uint32_t layerHeight) { 8476935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar return uint32_t(ceilf(layerHeight / float(LAYER_SIZE)) * LAYER_SIZE); 8576935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar} 8676935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar 8776935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnarvoid Layer::requireRenderer() { 8876935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar if (!renderer) { 8976935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar renderer = new LayerRenderer(renderState, this); 9076935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar renderer->initProperties(); 9176935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar } 9276935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar} 9376935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar 9476935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnarvoid Layer::updateLightPosFromRenderer(const OpenGLRenderer& rootRenderer) { 9576935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar if (renderer && rendererLightPosDirty) { 9676935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar // re-init renderer's light position, based upon last cached location in window 9776935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar Vector3 lightPos = rootRenderer.getLightCenter(); 9876935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar cachedInvTransformInWindow.mapPoint3d(lightPos); 9976935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar renderer->initLight(lightPos, rootRenderer.getLightRadius(), 10076935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar rootRenderer.getAmbientShadowAlpha(), rootRenderer.getSpotShadowAlpha()); 10176935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar rendererLightPosDirty = false; 10276935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar } 10376935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar} 10476935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar 10576935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnarbool Layer::resize(const uint32_t width, const uint32_t height) { 10676935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar uint32_t desiredWidth = computeIdealWidth(width); 10776935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar uint32_t desiredHeight = computeIdealWidth(height); 10876935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar 10976935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar if (desiredWidth <= getWidth() && desiredHeight <= getHeight()) { 11076935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar return true; 11176935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar } 11276935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar 11376935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar ATRACE_NAME("resizeLayer"); 11476935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar 11576935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar const uint32_t maxTextureSize = caches.maxTextureSize; 11676935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar if (desiredWidth > maxTextureSize || desiredHeight > maxTextureSize) { 11776935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar ALOGW("Layer exceeds max. dimensions supported by the GPU (%dx%d, max=%dx%d)", 11876935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar desiredWidth, desiredHeight, maxTextureSize, maxTextureSize); 11976935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar return false; 12076935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar } 12176935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar 12276935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar uint32_t oldWidth = getWidth(); 12376935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar uint32_t oldHeight = getHeight(); 12476935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar 12576935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar setSize(desiredWidth, desiredHeight); 12676935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar 12776935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar if (fbo) { 12876935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar caches.activeTexture(0); 12976935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar bindTexture(); 13076935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar allocateTexture(); 13176935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar 13276935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar if (glGetError() != GL_NO_ERROR) { 13376935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar setSize(oldWidth, oldHeight); 13476935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar return false; 13576935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar } 13676935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar } 13776935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar 13876935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar if (stencil) { 13976935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar stencil->bind(); 14076935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar stencil->resize(desiredWidth, desiredHeight); 14176935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar 14276935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar if (glGetError() != GL_NO_ERROR) { 14376935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar setSize(oldWidth, oldHeight); 14476935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar return false; 14576935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar } 14676935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar } 14776935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar 14876935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar return true; 14976935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar} 15076935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar 15176935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnarvoid Layer::removeFbo(bool flush) { 15276935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar if (stencil) { 15376935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar GLuint previousFbo = renderState.getFramebuffer(); 15476935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar renderState.bindFramebuffer(fbo); 15576935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, 0); 15676935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar renderState.bindFramebuffer(previousFbo); 15776935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar 15876935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar caches.renderBufferCache.put(stencil); 15976935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar stencil = NULL; 16076935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar } 16176935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar 16276935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar if (fbo) { 16376935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar if (flush) LayerRenderer::flushLayer(renderState, this); 16476935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar // If put fails the cache will delete the FBO 16576935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar caches.fboCache.put(fbo); 16676935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar fbo = 0; 16776935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar } 16876935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar} 16976935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar 17076935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnarvoid Layer::updateDeferred(RenderNode* renderNode, int left, int top, int right, int bottom) { 17176935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar requireRenderer(); 17276935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar this->renderNode = renderNode; 17376935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar const Rect r(left, top, right, bottom); 17476935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar dirtyRect.unionWith(r); 17576935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar deferredUpdateScheduled = true; 17676935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar} 17776935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar 17876935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnarvoid Layer::setPaint(const SkPaint* paint) { 17976935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar OpenGLRenderer::getAlphaAndModeDirect(paint, &alpha, &mode); 18076935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar setColorFilter((paint) ? paint->getColorFilter() : NULL); 18176935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar} 18276935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar 18376935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnarvoid Layer::setColorFilter(SkColorFilter* filter) { 18476935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar SkRefCnt_SafeAssign(colorFilter, filter); 18576935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar} 18676935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar 18776935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnarvoid Layer::bindTexture() const { 18876935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar if (texture.id) { 18976935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar caches.bindTexture(renderTarget, texture.id); 19076935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar } 19176935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar} 19276935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar 19376935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnarvoid Layer::bindStencilRenderBuffer() const { 19476935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar if (stencil) { 19576935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar stencil->bind(); 19676935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar } 19776935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar} 19876935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar 19976935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnarvoid Layer::generateTexture() { 20076935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar if (!texture.id) { 20176935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar glGenTextures(1, &texture.id); 20276935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar } 20376935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar} 20476935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar 20576935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnarvoid Layer::deleteTexture() { 20676935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar if (texture.id) { 20776935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar texture.deleteTexture(); 20876935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar texture.id = 0; 20976935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar } 21076935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar} 21176935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar 21276935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnarvoid Layer::clearTexture() { 21376935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar caches.unbindTexture(texture.id); 21476935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar texture.id = 0; 21576935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar} 21676935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar 21776935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnarvoid Layer::allocateTexture() { 21876935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar#if DEBUG_LAYERS 21976935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar ALOGD(" Allocate layer: %dx%d", getWidth(), getHeight()); 22076935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar#endif 22176935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar if (texture.id) { 22276935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar glPixelStorei(GL_UNPACK_ALIGNMENT, 4); 22376935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar glTexImage2D(renderTarget, 0, GL_RGBA, getWidth(), getHeight(), 0, 22476935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar GL_RGBA, GL_UNSIGNED_BYTE, NULL); 22576935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar } 22676935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar} 22776935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar 22876935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnarvoid Layer::defer(const OpenGLRenderer& rootRenderer) { 22976935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar updateLightPosFromRenderer(rootRenderer); 23076935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar const float width = layer.getWidth(); 23176935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar const float height = layer.getHeight(); 23276935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar 23376935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar if (dirtyRect.isEmpty() || (dirtyRect.left <= 0 && dirtyRect.top <= 0 && 23476935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar dirtyRect.right >= width && dirtyRect.bottom >= height)) { 23576935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar dirtyRect.set(0, 0, width, height); 23676935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar } 23776935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar 23876935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar delete deferredList; 23976935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar deferredList = new DeferredDisplayList(dirtyRect); 24076935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar 24176935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar DeferStateStruct deferredState(*deferredList, *renderer, 24276935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar RenderNode::kReplayFlag_ClipChildren); 24376935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar 24476935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar renderer->setViewport(width, height); 24576935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar renderer->setupFrameState(dirtyRect.left, dirtyRect.top, 24676935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar dirtyRect.right, dirtyRect.bottom, !isBlend()); 24776935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar 24876935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar renderNode->computeOrdering(); 24976935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar renderNode->defer(deferredState, 0); 25076935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar 25176935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar deferredUpdateScheduled = false; 25276935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar} 25376935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar 25476935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnarvoid Layer::cancelDefer() { 25576935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar renderNode = NULL; 25676935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar deferredUpdateScheduled = false; 25776935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar if (deferredList) { 25876935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar delete deferredList; 25976935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar deferredList = NULL; 26076935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar } 26176935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar} 26276935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar 26376935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnarvoid Layer::flush() { 26476935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar // renderer is checked as layer may be destroyed/put in layer cache with flush scheduled 26576935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar if (deferredList && renderer) { 26676935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar renderer->setViewport(layer.getWidth(), layer.getHeight()); 26776935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar renderer->prepareDirty(dirtyRect.left, dirtyRect.top, dirtyRect.right, dirtyRect.bottom, 26876935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar !isBlend()); 26976935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar 27076935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar deferredList->flush(*renderer, dirtyRect); 27176935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar 27276935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar renderer->finish(); 27376935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar 27476935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar dirtyRect.setEmpty(); 27576935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar renderNode = NULL; 27676935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar } 27776935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar} 27876935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar 27976935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnarvoid Layer::render(const OpenGLRenderer& rootRenderer) { 28076935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar updateLightPosFromRenderer(rootRenderer); 28176935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar renderer->setViewport(layer.getWidth(), layer.getHeight()); 28276935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar renderer->prepareDirty(dirtyRect.left, dirtyRect.top, dirtyRect.right, dirtyRect.bottom, 28376935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar !isBlend()); 28476935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar 28576935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar renderer->drawRenderNode(renderNode.get(), dirtyRect, RenderNode::kReplayFlag_ClipChildren); 28676935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar 28776935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar renderer->finish(); 28876935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar 28976935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar dirtyRect.setEmpty(); 29076935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar 29176935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar deferredUpdateScheduled = false; 29276935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar renderNode = NULL; 29376935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar} 29476935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar 29576935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar}; // namespace uirenderer 29676935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar}; // namespace android 29776935a5890ed8dd9d47f76f7593cc1c14c3844dbLajos Molnar