blob: 741f4c30af94d9edde620368a41bf4f1569d9907 [file] [log] [blame]
Romain Guydda57022010-07-06 11:39:32 -07001/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Romain Guy5b3b3522010-10-27 18:57:51 -070017#ifndef ANDROID_HWUI_LAYER_H
18#define ANDROID_HWUI_LAYER_H
Romain Guydda57022010-07-06 11:39:32 -070019
Derek Sollenberger76d3a1b2013-12-10 12:28:58 -050020#include <cutils/compiler.h>
Romain Guyf7f93552010-07-08 19:17:03 -070021#include <sys/types.h>
John Reck087bc0c2014-04-04 16:20:08 -070022#include <utils/StrongPointer.h>
Romain Guyf7f93552010-07-08 19:17:03 -070023
Romain Guydda57022010-07-06 11:39:32 -070024#include <GLES2/gl2.h>
25
Romain Guy5b3b3522010-10-27 18:57:51 -070026#include <ui/Region.h>
27
Derek Sollenbergerca79cf62012-08-14 16:44:52 -040028#include <SkPaint.h>
Romain Guydda57022010-07-06 11:39:32 -070029#include <SkXfermode.h>
30
Derek Sollenberger76d3a1b2013-12-10 12:28:58 -050031#include "Matrix.h"
Romain Guydda57022010-07-06 11:39:32 -070032#include "Rect.h"
Romain Guy3bbacf22013-02-06 16:51:04 -080033#include "RenderBuffer.h"
Romain Guy9ace8f52011-07-07 20:50:11 -070034#include "Texture.h"
Romain Guyf219da52011-01-16 12:54:25 -080035#include "Vertex.h"
Romain Guydda57022010-07-06 11:39:32 -070036
37namespace android {
38namespace uirenderer {
39
Romain Guy8550c4c2010-10-08 15:49:53 -070040///////////////////////////////////////////////////////////////////////////////
41// Layers
42///////////////////////////////////////////////////////////////////////////////
Romain Guydda57022010-07-06 11:39:32 -070043
Romain Guy2bf68f02012-03-02 13:37:47 -080044// Forward declarations
Romain Guy8aa195d2013-06-04 18:00:09 -070045class Caches;
Romain Guy2bf68f02012-03-02 13:37:47 -080046class OpenGLRenderer;
John Recke18264b2014-03-12 13:56:30 -070047class RenderNode;
Romain Guy96885eb2013-03-26 15:05:58 -070048class DeferredDisplayList;
49class DeferStateStruct;
Romain Guy2bf68f02012-03-02 13:37:47 -080050
Romain Guydda57022010-07-06 11:39:32 -070051/**
Romain Guyeb993562010-10-05 18:14:38 -070052 * A layer has dimensions and is backed by an OpenGL texture or FBO.
Romain Guydda57022010-07-06 11:39:32 -070053 */
Chris Craik564acf72014-01-02 16:46:18 -080054class Layer {
55public:
Chet Haase603f6de2012-09-14 15:31:25 -070056 Layer(const uint32_t layerWidth, const uint32_t layerHeight);
Chet Haased15ebf22012-09-05 11:40:29 -070057 ~Layer();
Romain Guy8550c4c2010-10-08 15:49:53 -070058
Romain Guy2055aba2013-01-18 16:42:51 -080059 static uint32_t computeIdealWidth(uint32_t layerWidth);
60 static uint32_t computeIdealHeight(uint32_t layerHeight);
61
Romain Guy8ce00302013-01-15 18:51:42 -080062 /**
63 * Calling this method will remove (either by recycling or
64 * destroying) the associated FBO, if present, and any render
65 * buffer (stencil for instance.)
66 */
67 void removeFbo(bool flush = true);
Dave Burke56257af2012-09-25 20:30:09 -070068
Romain Guydda57022010-07-06 11:39:32 -070069 /**
Romain Guy9fc27812011-04-27 14:21:41 -070070 * Sets this layer's region to a rectangle. Computes the appropriate
71 * texture coordinates.
72 */
73 void setRegionAsRect() {
74 const android::Rect& bounds = region.getBounds();
75 regionRect.set(bounds.leftTop().x, bounds.leftTop().y,
76 bounds.rightBottom().x, bounds.rightBottom().y);
77
Romain Guy9ace8f52011-07-07 20:50:11 -070078 const float texX = 1.0f / float(texture.width);
79 const float texY = 1.0f / float(texture.height);
Romain Guy9fc27812011-04-27 14:21:41 -070080 const float height = layer.getHeight();
81 texCoords.set(
82 regionRect.left * texX, (height - regionRect.top) * texY,
83 regionRect.right * texX, (height - regionRect.bottom) * texY);
Romain Guy9ace8f52011-07-07 20:50:11 -070084
85 regionRect.translate(layer.left, layer.top);
86 }
87
Chris Craika7090e02014-06-20 16:01:00 -070088 void updateDeferred(RenderNode* renderNode, int left, int top, int right, int bottom);
Romain Guy2bf68f02012-03-02 13:37:47 -080089
Romain Guy3bbacf22013-02-06 16:51:04 -080090 inline uint32_t getWidth() const {
Romain Guy9ace8f52011-07-07 20:50:11 -070091 return texture.width;
92 }
93
Romain Guy3bbacf22013-02-06 16:51:04 -080094 inline uint32_t getHeight() const {
Romain Guy9ace8f52011-07-07 20:50:11 -070095 return texture.height;
96 }
97
Romain Guy2055aba2013-01-18 16:42:51 -080098 /**
99 * Resize the layer and its texture if needed.
100 *
101 * @param width The new width of the layer
102 * @param height The new height of the layer
103 *
104 * @return True if the layer was resized or nothing happened, false if
105 * a failure occurred during the resizing operation
106 */
107 bool resize(const uint32_t width, const uint32_t height);
108
Romain Guy9ace8f52011-07-07 20:50:11 -0700109 void setSize(uint32_t width, uint32_t height) {
110 texture.width = width;
111 texture.height = height;
112 }
113
Derek Sollenberger674554f2014-02-19 16:47:32 +0000114 ANDROID_API void setPaint(const SkPaint* paint);
Chet Haased15ebf22012-09-05 11:40:29 -0700115
Romain Guy9ace8f52011-07-07 20:50:11 -0700116 inline void setBlend(bool blend) {
117 texture.blend = blend;
118 }
119
Romain Guy3bbacf22013-02-06 16:51:04 -0800120 inline bool isBlend() const {
Romain Guy9ace8f52011-07-07 20:50:11 -0700121 return texture.blend;
122 }
123
Chris Craik9757ac02014-02-25 18:50:17 -0800124 inline void setForceFilter(bool forceFilter) {
125 this->forceFilter = forceFilter;
126 }
127
128 inline bool getForceFilter() const {
129 return forceFilter;
130 }
131
Romain Guy9ace8f52011-07-07 20:50:11 -0700132 inline void setAlpha(int alpha) {
133 this->alpha = alpha;
134 }
135
136 inline void setAlpha(int alpha, SkXfermode::Mode mode) {
137 this->alpha = alpha;
138 this->mode = mode;
139 }
140
Romain Guy3bbacf22013-02-06 16:51:04 -0800141 inline int getAlpha() const {
Romain Guy9ace8f52011-07-07 20:50:11 -0700142 return alpha;
143 }
144
Romain Guy3bbacf22013-02-06 16:51:04 -0800145 inline SkXfermode::Mode getMode() const {
Romain Guy9ace8f52011-07-07 20:50:11 -0700146 return mode;
147 }
148
149 inline void setEmpty(bool empty) {
150 this->empty = empty;
151 }
152
Romain Guy3bbacf22013-02-06 16:51:04 -0800153 inline bool isEmpty() const {
Romain Guy9ace8f52011-07-07 20:50:11 -0700154 return empty;
155 }
156
157 inline void setFbo(GLuint fbo) {
158 this->fbo = fbo;
159 }
160
Romain Guy3bbacf22013-02-06 16:51:04 -0800161 inline GLuint getFbo() const {
Romain Guy9ace8f52011-07-07 20:50:11 -0700162 return fbo;
163 }
164
Romain Guy3bbacf22013-02-06 16:51:04 -0800165 inline void setStencilRenderBuffer(RenderBuffer* renderBuffer) {
166 if (RenderBuffer::isStencilBuffer(renderBuffer->getFormat())) {
167 this->stencil = renderBuffer;
168 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
169 GL_RENDERBUFFER, stencil->getName());
170 } else {
171 ALOGE("The specified render buffer is not a stencil buffer");
172 }
Romain Guy8ce00302013-01-15 18:51:42 -0800173 }
174
Romain Guy3bbacf22013-02-06 16:51:04 -0800175 inline RenderBuffer* getStencilRenderBuffer() const {
Romain Guy8ce00302013-01-15 18:51:42 -0800176 return stencil;
177 }
178
Romain Guy3bbacf22013-02-06 16:51:04 -0800179 inline GLuint getTexture() const {
Romain Guy9ace8f52011-07-07 20:50:11 -0700180 return texture.id;
181 }
182
Romain Guy3bbacf22013-02-06 16:51:04 -0800183 inline GLenum getRenderTarget() const {
Romain Guy9ace8f52011-07-07 20:50:11 -0700184 return renderTarget;
185 }
186
187 inline void setRenderTarget(GLenum renderTarget) {
188 this->renderTarget = renderTarget;
189 }
190
Romain Guyd21b6e12011-11-30 20:21:23 -0800191 void setWrap(GLenum wrap, bool bindTexture = false, bool force = false) {
192 texture.setWrap(wrap, bindTexture, force, renderTarget);
Romain Guy9ace8f52011-07-07 20:50:11 -0700193 }
194
Romain Guyd21b6e12011-11-30 20:21:23 -0800195 void setFilter(GLenum filter, bool bindTexture = false, bool force = false) {
196 texture.setFilter(filter, bindTexture, force, renderTarget);
Romain Guy9ace8f52011-07-07 20:50:11 -0700197 }
198
Romain Guy3bbacf22013-02-06 16:51:04 -0800199 inline bool isCacheable() const {
Romain Guy9ace8f52011-07-07 20:50:11 -0700200 return cacheable;
201 }
202
203 inline void setCacheable(bool cacheable) {
204 this->cacheable = cacheable;
205 }
206
Romain Guy3bbacf22013-02-06 16:51:04 -0800207 inline bool isDirty() const {
Romain Guy7c25aab2012-10-18 15:05:02 -0700208 return dirty;
209 }
210
211 inline void setDirty(bool dirty) {
212 this->dirty = dirty;
213 }
214
Romain Guy3bbacf22013-02-06 16:51:04 -0800215 inline bool isTextureLayer() const {
Romain Guy9ace8f52011-07-07 20:50:11 -0700216 return textureLayer;
217 }
218
219 inline void setTextureLayer(bool textureLayer) {
220 this->textureLayer = textureLayer;
221 }
222
Derek Sollenberger76d3a1b2013-12-10 12:28:58 -0500223 inline SkColorFilter* getColorFilter() const {
Romain Guy9ace8f52011-07-07 20:50:11 -0700224 return colorFilter;
225 }
226
Derek Sollenberger76d3a1b2013-12-10 12:28:58 -0500227 ANDROID_API void setColorFilter(SkColorFilter* filter);
Romain Guy9ace8f52011-07-07 20:50:11 -0700228
Chris Craik3f085422014-04-15 16:18:08 -0700229 inline void setConvexMask(const SkPath* convexMask) {
230 this->convexMask = convexMask;
231 }
232
233 inline const SkPath* getConvexMask() {
234 return convexMask;
235 }
236
Romain Guy8aa195d2013-06-04 18:00:09 -0700237 void bindStencilRenderBuffer() const;
Romain Guy9ace8f52011-07-07 20:50:11 -0700238
Romain Guy8aa195d2013-06-04 18:00:09 -0700239 void bindTexture() const;
240 void generateTexture();
241 void allocateTexture();
242 void deleteTexture();
Romain Guyef09a212012-09-25 12:17:14 -0700243
244 /**
245 * When the caller frees the texture itself, the caller
246 * must call this method to tell this layer that it lost
247 * the texture.
248 */
Romain Guy8aa195d2013-06-04 18:00:09 -0700249 ANDROID_API void clearTexture();
Romain Guy2055aba2013-01-18 16:42:51 -0800250
Romain Guy9ace8f52011-07-07 20:50:11 -0700251 inline mat4& getTexTransform() {
252 return texTransform;
Romain Guy9fc27812011-04-27 14:21:41 -0700253 }
254
Romain Guy302a9df2011-08-16 13:55:02 -0700255 inline mat4& getTransform() {
256 return transform;
257 }
258
Romain Guy96885eb2013-03-26 15:05:58 -0700259 void defer();
Romain Guye93482f2013-06-17 13:14:51 -0700260 void cancelDefer();
Romain Guy96885eb2013-03-26 15:05:58 -0700261 void flush();
Romain Guy02b49b72013-03-29 12:37:16 -0700262 void render();
Romain Guy96885eb2013-03-26 15:05:58 -0700263
Romain Guy9fc27812011-04-27 14:21:41 -0700264 /**
Romain Guy8550c4c2010-10-08 15:49:53 -0700265 * Bounds of the layer.
Romain Guydda57022010-07-06 11:39:32 -0700266 */
267 Rect layer;
268 /**
Romain Guy8550c4c2010-10-08 15:49:53 -0700269 * Texture coordinates of the layer.
Romain Guydda57022010-07-06 11:39:32 -0700270 */
Romain Guy8550c4c2010-10-08 15:49:53 -0700271 Rect texCoords;
Romain Guyc3fedaf2013-01-29 17:26:25 -0800272 /**
273 * Clipping rectangle.
274 */
275 Rect clipRect;
Romain Guy8550c4c2010-10-08 15:49:53 -0700276
Romain Guydda57022010-07-06 11:39:32 -0700277 /**
Romain Guy5b3b3522010-10-27 18:57:51 -0700278 * Dirty region indicating what parts of the layer
279 * have been drawn.
280 */
281 Region region;
Romain Guy40667672011-03-18 14:34:03 -0700282 /**
283 * If the region is a rectangle, coordinates of the
284 * region are stored here.
285 */
286 Rect regionRect;
Romain Guy171c5922011-01-06 10:04:23 -0800287
288 /**
Romain Guyf219da52011-01-16 12:54:25 -0800289 * If the layer can be rendered as a mesh, this is non-null.
290 */
291 TextureVertex* mesh;
Romain Guyf219da52011-01-16 12:54:25 -0800292 GLsizei meshElementCount;
Romain Guyaa6c24c2011-04-28 18:40:04 -0700293
Romain Guy2bf68f02012-03-02 13:37:47 -0800294 /**
295 * Used for deferred updates.
296 */
297 bool deferredUpdateScheduled;
298 OpenGLRenderer* renderer;
Chris Craika7090e02014-06-20 16:01:00 -0700299 sp<RenderNode> renderNode;
Romain Guy2bf68f02012-03-02 13:37:47 -0800300 Rect dirtyRect;
Romain Guy5bb3c732012-11-29 17:52:58 -0800301 bool debugDrawUpdate;
Chris Craik34416ea2013-04-15 16:08:28 -0700302 bool hasDrawnSinceUpdate;
Romain Guy2bf68f02012-03-02 13:37:47 -0800303
Romain Guy9ace8f52011-07-07 20:50:11 -0700304private:
John Reck668f0e32014-03-26 15:10:40 -0700305 void requireRenderer();
306
Romain Guy8aa195d2013-06-04 18:00:09 -0700307 Caches& caches;
308
Romain Guy9ace8f52011-07-07 20:50:11 -0700309 /**
310 * Name of the FBO used to render the layer. If the name is 0
311 * this layer is not backed by an FBO, but a simple texture.
312 */
313 GLuint fbo;
314
315 /**
Romain Guy3bbacf22013-02-06 16:51:04 -0800316 * The render buffer used as the stencil buffer.
Romain Guy8ce00302013-01-15 18:51:42 -0800317 */
Romain Guy3bbacf22013-02-06 16:51:04 -0800318 RenderBuffer* stencil;
Romain Guy8ce00302013-01-15 18:51:42 -0800319
320 /**
Romain Guy9ace8f52011-07-07 20:50:11 -0700321 * Indicates whether this layer has been used already.
322 */
323 bool empty;
324
325 /**
326 * The texture backing this layer.
327 */
328 Texture texture;
329
Romain Guyaa6c24c2011-04-28 18:40:04 -0700330 /**
331 * If set to true (by default), the layer can be reused.
332 */
Romain Guy9ace8f52011-07-07 20:50:11 -0700333 bool cacheable;
Romain Guyaa6c24c2011-04-28 18:40:04 -0700334
335 /**
336 * When set to true, this layer must be treated as a texture
337 * layer.
338 */
Romain Guy9ace8f52011-07-07 20:50:11 -0700339 bool textureLayer;
340
341 /**
Romain Guy7c25aab2012-10-18 15:05:02 -0700342 * When set to true, this layer is dirty and should be cleared
343 * before any rendering occurs.
344 */
345 bool dirty;
346
347 /**
Romain Guy9ace8f52011-07-07 20:50:11 -0700348 * Indicates the render target.
349 */
350 GLenum renderTarget;
351
352 /**
353 * Color filter used to draw this layer. Optional.
354 */
Derek Sollenberger76d3a1b2013-12-10 12:28:58 -0500355 SkColorFilter* colorFilter;
Romain Guy9ace8f52011-07-07 20:50:11 -0700356
357 /**
Chris Craik9757ac02014-02-25 18:50:17 -0800358 * Indicates raster data backing the layer is scaled, requiring filtration.
359 */
360 bool forceFilter;
361
362 /**
Romain Guy9ace8f52011-07-07 20:50:11 -0700363 * Opacity of the layer.
364 */
365 int alpha;
Chris Craik9757ac02014-02-25 18:50:17 -0800366
Romain Guy9ace8f52011-07-07 20:50:11 -0700367 /**
368 * Blending mode of the layer.
369 */
370 SkXfermode::Mode mode;
Romain Guyaa6c24c2011-04-28 18:40:04 -0700371
372 /**
373 * Optional texture coordinates transform.
374 */
375 mat4 texTransform;
Romain Guy8f0095c2011-05-02 17:24:22 -0700376
Romain Guy302a9df2011-08-16 13:55:02 -0700377 /**
378 * Optional transform.
379 */
380 mat4 transform;
381
Romain Guy96885eb2013-03-26 15:05:58 -0700382 /**
383 * Used to defer display lists when the layer is updated with a
384 * display list.
385 */
386 DeferredDisplayList* deferredList;
387
Chris Craik3f085422014-04-15 16:18:08 -0700388 /**
389 * This convex path should be used to mask the layer's draw to the screen.
390 *
391 * Data not owned/managed by layer object.
392 */
393 const SkPath* convexMask;
394
Romain Guydda57022010-07-06 11:39:32 -0700395}; // struct Layer
396
397}; // namespace uirenderer
398}; // namespace android
399
Romain Guy5b3b3522010-10-27 18:57:51 -0700400#endif // ANDROID_HWUI_LAYER_H