blob: 8cc027ae117a33d4f52ff7297eeeada3cf4d11d8 [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>
22
Romain Guydda57022010-07-06 11:39:32 -070023#include <GLES2/gl2.h>
24
Romain Guy5b3b3522010-10-27 18:57:51 -070025#include <ui/Region.h>
26
Derek Sollenbergerca79cf62012-08-14 16:44:52 -040027#include <SkPaint.h>
Romain Guydda57022010-07-06 11:39:32 -070028#include <SkXfermode.h>
29
Derek Sollenberger76d3a1b2013-12-10 12:28:58 -050030#include "Matrix.h"
Romain Guydda57022010-07-06 11:39:32 -070031#include "Rect.h"
Romain Guy3bbacf22013-02-06 16:51:04 -080032#include "RenderBuffer.h"
Romain Guy9ace8f52011-07-07 20:50:11 -070033#include "Texture.h"
Romain Guyf219da52011-01-16 12:54:25 -080034#include "Vertex.h"
Romain Guydda57022010-07-06 11:39:32 -070035
36namespace android {
37namespace uirenderer {
38
Romain Guy8550c4c2010-10-08 15:49:53 -070039///////////////////////////////////////////////////////////////////////////////
40// Layers
41///////////////////////////////////////////////////////////////////////////////
Romain Guydda57022010-07-06 11:39:32 -070042
Romain Guy2bf68f02012-03-02 13:37:47 -080043// Forward declarations
Romain Guy8aa195d2013-06-04 18:00:09 -070044class Caches;
Romain Guy2bf68f02012-03-02 13:37:47 -080045class OpenGLRenderer;
46class DisplayList;
Romain Guy96885eb2013-03-26 15:05:58 -070047class DeferredDisplayList;
48class DeferStateStruct;
Romain Guy2bf68f02012-03-02 13:37:47 -080049
Romain Guydda57022010-07-06 11:39:32 -070050/**
Romain Guyeb993562010-10-05 18:14:38 -070051 * A layer has dimensions and is backed by an OpenGL texture or FBO.
Romain Guydda57022010-07-06 11:39:32 -070052 */
Chris Craik564acf72014-01-02 16:46:18 -080053class Layer {
54public:
Chet Haase603f6de2012-09-14 15:31:25 -070055 Layer(const uint32_t layerWidth, const uint32_t layerHeight);
Chet Haased15ebf22012-09-05 11:40:29 -070056 ~Layer();
Romain Guy8550c4c2010-10-08 15:49:53 -070057
Romain Guy2055aba2013-01-18 16:42:51 -080058 static uint32_t computeIdealWidth(uint32_t layerWidth);
59 static uint32_t computeIdealHeight(uint32_t layerHeight);
60
Romain Guy8ce00302013-01-15 18:51:42 -080061 /**
62 * Calling this method will remove (either by recycling or
63 * destroying) the associated FBO, if present, and any render
64 * buffer (stencil for instance.)
65 */
66 void removeFbo(bool flush = true);
Dave Burke56257af2012-09-25 20:30:09 -070067
Romain Guydda57022010-07-06 11:39:32 -070068 /**
Romain Guy9fc27812011-04-27 14:21:41 -070069 * Sets this layer's region to a rectangle. Computes the appropriate
70 * texture coordinates.
71 */
72 void setRegionAsRect() {
73 const android::Rect& bounds = region.getBounds();
74 regionRect.set(bounds.leftTop().x, bounds.leftTop().y,
75 bounds.rightBottom().x, bounds.rightBottom().y);
76
Romain Guy9ace8f52011-07-07 20:50:11 -070077 const float texX = 1.0f / float(texture.width);
78 const float texY = 1.0f / float(texture.height);
Romain Guy9fc27812011-04-27 14:21:41 -070079 const float height = layer.getHeight();
80 texCoords.set(
81 regionRect.left * texX, (height - regionRect.top) * texY,
82 regionRect.right * texX, (height - regionRect.bottom) * texY);
Romain Guy9ace8f52011-07-07 20:50:11 -070083
84 regionRect.translate(layer.left, layer.top);
85 }
86
Romain Guy2bf68f02012-03-02 13:37:47 -080087 void updateDeferred(OpenGLRenderer* renderer, DisplayList* displayList,
88 int left, int top, int right, int bottom) {
89 this->renderer = renderer;
90 this->displayList = displayList;
91 const Rect r(left, top, right, bottom);
92 dirtyRect.unionWith(r);
93 deferredUpdateScheduled = true;
94 }
95
Romain Guy3bbacf22013-02-06 16:51:04 -080096 inline uint32_t getWidth() const {
Romain Guy9ace8f52011-07-07 20:50:11 -070097 return texture.width;
98 }
99
Romain Guy3bbacf22013-02-06 16:51:04 -0800100 inline uint32_t getHeight() const {
Romain Guy9ace8f52011-07-07 20:50:11 -0700101 return texture.height;
102 }
103
Romain Guy2055aba2013-01-18 16:42:51 -0800104 /**
105 * Resize the layer and its texture if needed.
106 *
107 * @param width The new width of the layer
108 * @param height The new height of the layer
109 *
110 * @return True if the layer was resized or nothing happened, false if
111 * a failure occurred during the resizing operation
112 */
113 bool resize(const uint32_t width, const uint32_t height);
114
Romain Guy9ace8f52011-07-07 20:50:11 -0700115 void setSize(uint32_t width, uint32_t height) {
116 texture.width = width;
117 texture.height = height;
118 }
119
Derek Sollenberger674554f2014-02-19 16:47:32 +0000120 ANDROID_API void setPaint(const SkPaint* paint);
Chet Haased15ebf22012-09-05 11:40:29 -0700121
Romain Guy9ace8f52011-07-07 20:50:11 -0700122 inline void setBlend(bool blend) {
123 texture.blend = blend;
124 }
125
Romain Guy3bbacf22013-02-06 16:51:04 -0800126 inline bool isBlend() const {
Romain Guy9ace8f52011-07-07 20:50:11 -0700127 return texture.blend;
128 }
129
130 inline void setAlpha(int alpha) {
131 this->alpha = alpha;
132 }
133
134 inline void setAlpha(int alpha, SkXfermode::Mode mode) {
135 this->alpha = alpha;
136 this->mode = mode;
137 }
138
Romain Guy3bbacf22013-02-06 16:51:04 -0800139 inline int getAlpha() const {
Romain Guy9ace8f52011-07-07 20:50:11 -0700140 return alpha;
141 }
142
Romain Guy3bbacf22013-02-06 16:51:04 -0800143 inline SkXfermode::Mode getMode() const {
Romain Guy9ace8f52011-07-07 20:50:11 -0700144 return mode;
145 }
146
147 inline void setEmpty(bool empty) {
148 this->empty = empty;
149 }
150
Romain Guy3bbacf22013-02-06 16:51:04 -0800151 inline bool isEmpty() const {
Romain Guy9ace8f52011-07-07 20:50:11 -0700152 return empty;
153 }
154
155 inline void setFbo(GLuint fbo) {
156 this->fbo = fbo;
157 }
158
Romain Guy3bbacf22013-02-06 16:51:04 -0800159 inline GLuint getFbo() const {
Romain Guy9ace8f52011-07-07 20:50:11 -0700160 return fbo;
161 }
162
Romain Guy3bbacf22013-02-06 16:51:04 -0800163 inline void setStencilRenderBuffer(RenderBuffer* renderBuffer) {
164 if (RenderBuffer::isStencilBuffer(renderBuffer->getFormat())) {
165 this->stencil = renderBuffer;
166 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
167 GL_RENDERBUFFER, stencil->getName());
168 } else {
169 ALOGE("The specified render buffer is not a stencil buffer");
170 }
Romain Guy8ce00302013-01-15 18:51:42 -0800171 }
172
Romain Guy3bbacf22013-02-06 16:51:04 -0800173 inline RenderBuffer* getStencilRenderBuffer() const {
Romain Guy8ce00302013-01-15 18:51:42 -0800174 return stencil;
175 }
176
Romain Guy3bbacf22013-02-06 16:51:04 -0800177 inline GLuint getTexture() const {
Romain Guy9ace8f52011-07-07 20:50:11 -0700178 return texture.id;
179 }
180
Romain Guy3bbacf22013-02-06 16:51:04 -0800181 inline GLenum getRenderTarget() const {
Romain Guy9ace8f52011-07-07 20:50:11 -0700182 return renderTarget;
183 }
184
185 inline void setRenderTarget(GLenum renderTarget) {
186 this->renderTarget = renderTarget;
187 }
188
Romain Guyd21b6e12011-11-30 20:21:23 -0800189 void setWrap(GLenum wrap, bool bindTexture = false, bool force = false) {
190 texture.setWrap(wrap, bindTexture, force, renderTarget);
Romain Guy9ace8f52011-07-07 20:50:11 -0700191 }
192
Romain Guyd21b6e12011-11-30 20:21:23 -0800193 void setFilter(GLenum filter, bool bindTexture = false, bool force = false) {
194 texture.setFilter(filter, bindTexture, force, renderTarget);
Romain Guy9ace8f52011-07-07 20:50:11 -0700195 }
196
Romain Guy3bbacf22013-02-06 16:51:04 -0800197 inline bool isCacheable() const {
Romain Guy9ace8f52011-07-07 20:50:11 -0700198 return cacheable;
199 }
200
201 inline void setCacheable(bool cacheable) {
202 this->cacheable = cacheable;
203 }
204
Romain Guy3bbacf22013-02-06 16:51:04 -0800205 inline bool isDirty() const {
Romain Guy7c25aab2012-10-18 15:05:02 -0700206 return dirty;
207 }
208
209 inline void setDirty(bool dirty) {
210 this->dirty = dirty;
211 }
212
Romain Guy3bbacf22013-02-06 16:51:04 -0800213 inline bool isTextureLayer() const {
Romain Guy9ace8f52011-07-07 20:50:11 -0700214 return textureLayer;
215 }
216
217 inline void setTextureLayer(bool textureLayer) {
218 this->textureLayer = textureLayer;
219 }
220
Derek Sollenberger76d3a1b2013-12-10 12:28:58 -0500221 inline SkColorFilter* getColorFilter() const {
Romain Guy9ace8f52011-07-07 20:50:11 -0700222 return colorFilter;
223 }
224
Derek Sollenberger76d3a1b2013-12-10 12:28:58 -0500225 ANDROID_API void setColorFilter(SkColorFilter* filter);
Romain Guy9ace8f52011-07-07 20:50:11 -0700226
Romain Guy8aa195d2013-06-04 18:00:09 -0700227 void bindStencilRenderBuffer() const;
Romain Guy9ace8f52011-07-07 20:50:11 -0700228
Romain Guy8aa195d2013-06-04 18:00:09 -0700229 void bindTexture() const;
230 void generateTexture();
231 void allocateTexture();
232 void deleteTexture();
Romain Guyef09a212012-09-25 12:17:14 -0700233
234 /**
235 * When the caller frees the texture itself, the caller
236 * must call this method to tell this layer that it lost
237 * the texture.
238 */
Romain Guy8aa195d2013-06-04 18:00:09 -0700239 ANDROID_API void clearTexture();
Romain Guy2055aba2013-01-18 16:42:51 -0800240
Romain Guy9ace8f52011-07-07 20:50:11 -0700241 inline mat4& getTexTransform() {
242 return texTransform;
Romain Guy9fc27812011-04-27 14:21:41 -0700243 }
244
Romain Guy302a9df2011-08-16 13:55:02 -0700245 inline mat4& getTransform() {
246 return transform;
247 }
248
Romain Guy96885eb2013-03-26 15:05:58 -0700249 void defer();
Romain Guye93482f2013-06-17 13:14:51 -0700250 void cancelDefer();
Romain Guy96885eb2013-03-26 15:05:58 -0700251 void flush();
Romain Guy02b49b72013-03-29 12:37:16 -0700252 void render();
Romain Guy96885eb2013-03-26 15:05:58 -0700253
Romain Guy9fc27812011-04-27 14:21:41 -0700254 /**
Romain Guy8550c4c2010-10-08 15:49:53 -0700255 * Bounds of the layer.
Romain Guydda57022010-07-06 11:39:32 -0700256 */
257 Rect layer;
258 /**
Romain Guy8550c4c2010-10-08 15:49:53 -0700259 * Texture coordinates of the layer.
Romain Guydda57022010-07-06 11:39:32 -0700260 */
Romain Guy8550c4c2010-10-08 15:49:53 -0700261 Rect texCoords;
Romain Guyc3fedaf2013-01-29 17:26:25 -0800262 /**
263 * Clipping rectangle.
264 */
265 Rect clipRect;
Romain Guy8550c4c2010-10-08 15:49:53 -0700266
Romain Guydda57022010-07-06 11:39:32 -0700267 /**
Romain Guy5b3b3522010-10-27 18:57:51 -0700268 * Dirty region indicating what parts of the layer
269 * have been drawn.
270 */
271 Region region;
Romain Guy40667672011-03-18 14:34:03 -0700272 /**
273 * If the region is a rectangle, coordinates of the
274 * region are stored here.
275 */
276 Rect regionRect;
Romain Guy171c5922011-01-06 10:04:23 -0800277
278 /**
Romain Guyf219da52011-01-16 12:54:25 -0800279 * If the layer can be rendered as a mesh, this is non-null.
280 */
281 TextureVertex* mesh;
Romain Guyf219da52011-01-16 12:54:25 -0800282 GLsizei meshElementCount;
Romain Guyaa6c24c2011-04-28 18:40:04 -0700283
Romain Guy2bf68f02012-03-02 13:37:47 -0800284 /**
285 * Used for deferred updates.
286 */
287 bool deferredUpdateScheduled;
288 OpenGLRenderer* renderer;
289 DisplayList* displayList;
290 Rect dirtyRect;
Romain Guy5bb3c732012-11-29 17:52:58 -0800291 bool debugDrawUpdate;
Chris Craik34416ea2013-04-15 16:08:28 -0700292 bool hasDrawnSinceUpdate;
Romain Guy2bf68f02012-03-02 13:37:47 -0800293
Romain Guy9ace8f52011-07-07 20:50:11 -0700294private:
Romain Guy8aa195d2013-06-04 18:00:09 -0700295 Caches& caches;
296
Romain Guy9ace8f52011-07-07 20:50:11 -0700297 /**
298 * Name of the FBO used to render the layer. If the name is 0
299 * this layer is not backed by an FBO, but a simple texture.
300 */
301 GLuint fbo;
302
303 /**
Romain Guy3bbacf22013-02-06 16:51:04 -0800304 * The render buffer used as the stencil buffer.
Romain Guy8ce00302013-01-15 18:51:42 -0800305 */
Romain Guy3bbacf22013-02-06 16:51:04 -0800306 RenderBuffer* stencil;
Romain Guy8ce00302013-01-15 18:51:42 -0800307
308 /**
Romain Guy9ace8f52011-07-07 20:50:11 -0700309 * Indicates whether this layer has been used already.
310 */
311 bool empty;
312
313 /**
314 * The texture backing this layer.
315 */
316 Texture texture;
317
Romain Guyaa6c24c2011-04-28 18:40:04 -0700318 /**
319 * If set to true (by default), the layer can be reused.
320 */
Romain Guy9ace8f52011-07-07 20:50:11 -0700321 bool cacheable;
Romain Guyaa6c24c2011-04-28 18:40:04 -0700322
323 /**
324 * When set to true, this layer must be treated as a texture
325 * layer.
326 */
Romain Guy9ace8f52011-07-07 20:50:11 -0700327 bool textureLayer;
328
329 /**
Romain Guy7c25aab2012-10-18 15:05:02 -0700330 * When set to true, this layer is dirty and should be cleared
331 * before any rendering occurs.
332 */
333 bool dirty;
334
335 /**
Romain Guy9ace8f52011-07-07 20:50:11 -0700336 * Indicates the render target.
337 */
338 GLenum renderTarget;
339
340 /**
341 * Color filter used to draw this layer. Optional.
342 */
Derek Sollenberger76d3a1b2013-12-10 12:28:58 -0500343 SkColorFilter* colorFilter;
Romain Guy9ace8f52011-07-07 20:50:11 -0700344
345 /**
346 * Opacity of the layer.
347 */
348 int alpha;
349 /**
350 * Blending mode of the layer.
351 */
352 SkXfermode::Mode mode;
Romain Guyaa6c24c2011-04-28 18:40:04 -0700353
354 /**
355 * Optional texture coordinates transform.
356 */
357 mat4 texTransform;
Romain Guy8f0095c2011-05-02 17:24:22 -0700358
Romain Guy302a9df2011-08-16 13:55:02 -0700359 /**
360 * Optional transform.
361 */
362 mat4 transform;
363
Romain Guy96885eb2013-03-26 15:05:58 -0700364 /**
365 * Used to defer display lists when the layer is updated with a
366 * display list.
367 */
368 DeferredDisplayList* deferredList;
369
Romain Guydda57022010-07-06 11:39:32 -0700370}; // struct Layer
371
372}; // namespace uirenderer
373}; // namespace android
374
Romain Guy5b3b3522010-10-27 18:57:51 -0700375#endif // ANDROID_HWUI_LAYER_H