RenderNode.h revision d0a0b2a3140bfb1819a116413ce9d81886697a07
1227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks/* 2227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Copyright (C) 2014 The Android Open Source Project 3227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * 4227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Licensed under the Apache License, Version 2.0 (the "License"); 5227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * you may not use this file except in compliance with the License. 6227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * You may obtain a copy of the License at 7227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * 8227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * http://www.apache.org/licenses/LICENSE-2.0 9227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * 10227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Unless required by applicable law or agreed to in writing, software 11227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * distributed under the License is distributed on an "AS IS" BASIS, 12227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * See the License for the specific language governing permissions and 14227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * limitations under the License. 15227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks */ 16227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#ifndef RENDERNODE_H 17227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#define RENDERNODE_H 18227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 19227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#ifndef LOG_TAG 20227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks #define LOG_TAG "OpenGLRenderer" 21227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#endif 22227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 23227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include <SkCamera.h> 24227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include <SkMatrix.h> 25227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 26227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include <private/hwui/DrawGlInfo.h> 27227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 28227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include <utils/KeyedVector.h> 29227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include <utils/LinearAllocator.h> 30227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include <utils/RefBase.h> 31227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include <utils/SortedVector.h> 32227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include <utils/String8.h> 33227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include <utils/Vector.h> 34227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 35227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include <cutils/compiler.h> 36227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 37227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include <androidfw/ResourceTypes.h> 38227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 39227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include "Debug.h" 40227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include "Matrix.h" 41227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include "DeferredDisplayList.h" 42227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include "DisplayList.h" 43227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks#include "RenderProperties.h" 44227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 45227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksclass SkBitmap; 46227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksclass SkPaint; 47227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksclass SkPath; 48227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksclass SkRegion; 49227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 50227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksnamespace android { 51227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksnamespace uirenderer { 52227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 53227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksclass DeferredDisplayList; 54227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksclass DisplayListOp; 55227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksclass DisplayListRenderer; 56227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksclass OpenGLRenderer; 57227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksclass Rect; 58227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksclass Layer; 59227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksclass SkiaShader; 60227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 61227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksclass ClipRectOp; 62227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksclass SaveLayerOp; 63227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksclass SaveOp; 64227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksclass RestoreToCountOp; 65227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksclass DrawDisplayListOp; 66227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 67227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks/** 68227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Primary class for storing recorded canvas commands, as well as per-View/ViewGroup display properties. 69227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * 70227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Recording of canvas commands is somewhat similar to SkPicture, except the canvas-recording 71227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * functionality is split between DisplayListRenderer (which manages the recording), DisplayListData 72227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * (which holds the actual data), and DisplayList (which holds properties and performs playback onto 73227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * a renderer). 74227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * 75227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Note that DisplayListData is swapped out from beneath an individual DisplayList when a view's 76227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * recorded stream of canvas operations is refreshed. The DisplayList (and its properties) stay 77227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * attached. 78227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks */ 79227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksclass RenderNode { 80227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendrickspublic: 81227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks ANDROID_API RenderNode(); 82227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks ANDROID_API ~RenderNode(); 83227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 84227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks // See flags defined in DisplayList.java 85227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks enum ReplayFlag { 86227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks kReplayFlag_ClipChildren = 0x1 87227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks }; 88227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 89227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks ANDROID_API static void destroyDisplayListDeferred(RenderNode* displayList); 90227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks ANDROID_API static void outputLogBuffer(int fd); 91227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 92227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks ANDROID_API void setData(DisplayListData* newData); 93227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 94227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks void computeOrdering(); 95227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks void defer(DeferStateStruct& deferStruct, const int level); 96227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks void replay(ReplayStateStruct& replayStruct, const int level); 97227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 98227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks ANDROID_API void output(uint32_t level = 1); 99227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 100227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks bool isRenderable() const { 101227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks return mDisplayListData && mDisplayListData->hasDrawOps; 102227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 103227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 104227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks void setName(const char* name) { 105227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks if (name) { 106227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks char* lastPeriod = strrchr(name, '.'); 107227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks if (lastPeriod) { 108227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks mName.setTo(lastPeriod + 1); 109227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } else { 110227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks mName.setTo(name); 111227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 112227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 113227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 114227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 115227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks const RenderProperties& properties() { 116227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks return mProperties; 117227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 118227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 119227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks const RenderProperties& stagingProperties() { 120227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks return mStagingProperties; 121227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 122227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 123227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks RenderProperties& mutateStagingProperties() { 124227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks mNeedsPropertiesSync = true; 125227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks return mStagingProperties; 126227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 127227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 128227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks bool isProjectionReceiver() { 129227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks return properties().isProjectionReceiver(); 130227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 131227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 132227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks int getWidth() { 133227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks return properties().getWidth(); 134227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 135227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 136227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks int getHeight() { 137227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks return properties().getHeight(); 138227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 139227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 140227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks void updateProperties(); 141227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 142227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksprivate: 143227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks typedef key_value_pair_t<float, DrawDisplayListOp*> ZDrawDisplayListOpPair; 144227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 145227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks static size_t findNonNegativeIndex(const Vector<ZDrawDisplayListOpPair>& nodes) { 146227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks for (size_t i = 0; i < nodes.size(); i++) { 147227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks if (nodes[i].key >= 0.0f) return i; 148227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 149227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks return nodes.size(); 150227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks } 151227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 152227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks enum ChildrenSelectMode { 153227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks kNegativeZChildren, 154227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks kPositiveZChildren 155227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks }; 156227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 157227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks void applyViewPropertyTransforms(mat4& matrix, bool true3dTransform = false); 158227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 159227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks void computeOrderingImpl(DrawDisplayListOp* opState, 160227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks Vector<DrawDisplayListOp*>* compositedChildrenOfProjectionSurface, 161227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks const mat4* transformFromProjectionSurface); 162227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 163227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks template <class T> 164227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks inline void setViewProperties(OpenGLRenderer& renderer, T& handler, const int level); 165227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 166227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks void buildZSortedChildList(Vector<ZDrawDisplayListOpPair>& zTranslatedNodes); 167227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 168227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks template <class T> 169227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks inline void iterate3dChildren(const Vector<ZDrawDisplayListOpPair>& zTranslatedNodes, 170227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks ChildrenSelectMode mode, OpenGLRenderer& renderer, T& handler); 171227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 172227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks template <class T> 173227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks inline void iterateProjectedChildren(OpenGLRenderer& renderer, T& handler, const int level); 174227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks 175 template <class T> 176 inline void iterate(OpenGLRenderer& renderer, T& handler, const int level); 177 178 class TextContainer { 179 public: 180 size_t length() const { 181 return mByteLength; 182 } 183 184 const char* text() const { 185 return (const char*) mText; 186 } 187 188 size_t mByteLength; 189 const char* mText; 190 }; 191 192 String8 mName; 193 bool mDestroyed; // used for debugging crash, TODO: remove once invalid state crash fixed 194 195 bool mNeedsPropertiesSync; 196 RenderProperties mProperties; 197 RenderProperties mStagingProperties; 198 199 DisplayListData* mDisplayListData; 200 201 /** 202 * Draw time state - these properties are only set and used during rendering 203 */ 204 205 // for projection surfaces, contains a list of all children items 206 Vector<DrawDisplayListOp*> mProjectedNodes; 207}; // class RenderNode 208 209} /* namespace uirenderer */ 210} /* namespace android */ 211 212#endif /* RENDERNODE_H */ 213