• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
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 
17 #ifndef ANDROID_HWUI_OPENGL_RENDERER_H
18 #define ANDROID_HWUI_OPENGL_RENDERER_H
19 
20 #include <GLES2/gl2.h>
21 #include <GLES2/gl2ext.h>
22 
23 #include <SkBitmap.h>
24 #include <SkMatrix.h>
25 #include <SkPaint.h>
26 #include <SkRegion.h>
27 #include <SkShader.h>
28 #include <SkXfermode.h>
29 
30 #include <utils/Functor.h>
31 #include <utils/RefBase.h>
32 #include <utils/SortedVector.h>
33 #include <utils/Vector.h>
34 
35 #include <cutils/compiler.h>
36 
37 #include "Debug.h"
38 #include "Extensions.h"
39 #include "Matrix.h"
40 #include "Program.h"
41 #include "Rect.h"
42 #include "Snapshot.h"
43 #include "Vertex.h"
44 #include "SkiaShader.h"
45 #include "SkiaColorFilter.h"
46 #include "Caches.h"
47 
48 namespace android {
49 namespace uirenderer {
50 
51 ///////////////////////////////////////////////////////////////////////////////
52 // Renderer
53 ///////////////////////////////////////////////////////////////////////////////
54 
55 class DisplayList;
56 
57 /**
58  * OpenGL renderer used to draw accelerated 2D graphics. The API is a
59  * simplified version of Skia's Canvas API.
60  */
61 class OpenGLRenderer {
62 public:
63     ANDROID_API OpenGLRenderer();
64     virtual ~OpenGLRenderer();
65 
66     /**
67      * Read externally defined properties to control the behavior
68      * of the renderer.
69      */
70     ANDROID_API void initProperties();
71 
72     /**
73      * Indicates whether this renderer executes drawing commands immediately.
74      * If this method returns true, the drawing commands will be executed
75      * later.
76      */
77     virtual bool isDeferred();
78 
79     /**
80      * Sets the dimension of the underlying drawing surface. This method must
81      * be called at least once every time the drawing surface changes size.
82      *
83      * @param width The width in pixels of the underlysing surface
84      * @param height The height in pixels of the underlysing surface
85      */
86     virtual void setViewport(int width, int height);
87 
88     /**
89      * Prepares the renderer to draw a frame. This method must be invoked
90      * at the beginning of each frame. When this method is invoked, the
91      * entire drawing surface is assumed to be redrawn.
92      *
93      * @param opaque If true, the target surface is considered opaque
94      *               and will not be cleared. If false, the target surface
95      *               will be cleared
96      */
97     ANDROID_API status_t prepare(bool opaque);
98 
99     /**
100      * Prepares the renderer to draw a frame. This method must be invoked
101      * at the beginning of each frame. Only the specified rectangle of the
102      * frame is assumed to be dirty. A clip will automatically be set to
103      * the specified rectangle.
104      *
105      * @param left The left coordinate of the dirty rectangle
106      * @param top The top coordinate of the dirty rectangle
107      * @param right The right coordinate of the dirty rectangle
108      * @param bottom The bottom coordinate of the dirty rectangle
109      * @param opaque If true, the target surface is considered opaque
110      *               and will not be cleared. If false, the target surface
111      *               will be cleared in the specified dirty rectangle
112      */
113     virtual status_t prepareDirty(float left, float top, float right, float bottom, bool opaque);
114 
115     /**
116      * Indicates the end of a frame. This method must be invoked whenever
117      * the caller is done rendering a frame.
118      */
119     virtual void finish();
120 
121     /**
122      * This method must be invoked before handing control over to a draw functor.
123      * See callDrawGLFunction() for instance.
124      *
125      * This command must not be recorded inside display lists.
126      */
127     virtual void interrupt();
128 
129     /**
130      * This method must be invoked after getting control back from a draw functor.
131      *
132      * This command must not be recorded inside display lists.
133      */
134     virtual void resume();
135 
136     ANDROID_API status_t invokeFunctors(Rect& dirty);
137     ANDROID_API void detachFunctor(Functor* functor);
138     ANDROID_API void attachFunctor(Functor* functor);
139     virtual status_t callDrawGLFunction(Functor* functor, Rect& dirty);
140 
141     ANDROID_API void pushLayerUpdate(Layer* layer);
142     ANDROID_API void clearLayerUpdates();
143 
144     ANDROID_API int getSaveCount() const;
145     virtual int save(int flags);
146     virtual void restore();
147     virtual void restoreToCount(int saveCount);
148 
149     virtual int saveLayer(float left, float top, float right, float bottom,
150             SkPaint* p, int flags);
151     virtual int saveLayerAlpha(float left, float top, float right, float bottom,
152             int alpha, int flags);
153 
154     virtual void translate(float dx, float dy);
155     virtual void rotate(float degrees);
156     virtual void scale(float sx, float sy);
157     virtual void skew(float sx, float sy);
158 
159     ANDROID_API void getMatrix(SkMatrix* matrix);
160     virtual void setMatrix(SkMatrix* matrix);
161     virtual void concatMatrix(SkMatrix* matrix);
162 
163     ANDROID_API const Rect& getClipBounds();
164     ANDROID_API bool quickReject(float left, float top, float right, float bottom);
165     bool quickRejectNoScissor(float left, float top, float right, float bottom);
166     virtual bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op);
167     virtual Rect* getClipRect();
168 
169     virtual status_t drawDisplayList(DisplayList* displayList, Rect& dirty, int32_t flags,
170             uint32_t level = 0);
171     virtual void outputDisplayList(DisplayList* displayList, uint32_t level = 0);
172     virtual status_t drawLayer(Layer* layer, float x, float y, SkPaint* paint);
173     virtual status_t drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint);
174     virtual status_t drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint);
175     virtual status_t drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
176             float srcRight, float srcBottom, float dstLeft, float dstTop,
177             float dstRight, float dstBottom, SkPaint* paint);
178     virtual status_t drawBitmapData(SkBitmap* bitmap, float left, float top, SkPaint* paint);
179     virtual status_t drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
180             float* vertices, int* colors, SkPaint* paint);
181     virtual status_t drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
182             const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors,
183             float left, float top, float right, float bottom, SkPaint* paint);
184     status_t drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
185             const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors,
186             float left, float top, float right, float bottom, int alpha, SkXfermode::Mode mode);
187     virtual status_t drawColor(int color, SkXfermode::Mode mode);
188     virtual status_t drawRect(float left, float top, float right, float bottom, SkPaint* paint);
189     virtual status_t drawRoundRect(float left, float top, float right, float bottom,
190             float rx, float ry, SkPaint* paint);
191     virtual status_t drawCircle(float x, float y, float radius, SkPaint* paint);
192     virtual status_t drawOval(float left, float top, float right, float bottom, SkPaint* paint);
193     virtual status_t drawArc(float left, float top, float right, float bottom,
194             float startAngle, float sweepAngle, bool useCenter, SkPaint* paint);
195     virtual status_t drawPath(SkPath* path, SkPaint* paint);
196     virtual status_t drawLines(float* points, int count, SkPaint* paint);
197     virtual status_t drawPoints(float* points, int count, SkPaint* paint);
198     virtual status_t drawTextOnPath(const char* text, int bytesCount, int count, SkPath* path,
199             float hOffset, float vOffset, SkPaint* paint);
200     virtual status_t drawPosText(const char* text, int bytesCount, int count,
201             const float* positions, SkPaint* paint);
202     virtual status_t drawText(const char* text, int bytesCount, int count, float x, float y,
203             const float* positions, SkPaint* paint, float length = -1.0f);
204 
205     virtual void resetShader();
206     virtual void setupShader(SkiaShader* shader);
207 
208     virtual void resetColorFilter();
209     virtual void setupColorFilter(SkiaColorFilter* filter);
210 
211     virtual void resetShadow();
212     virtual void setupShadow(float radius, float dx, float dy, int color);
213 
214     virtual void resetPaintFilter();
215     virtual void setupPaintFilter(int clearBits, int setBits);
216 
217     SkPaint* filterPaint(SkPaint* paint);
218 
219     /**
220      * Sets the alpha on the current snapshot. This alpha value will be modulated
221      * with other alpha values when drawing primitives.
222      */
setAlpha(float alpha)223     void setAlpha(float alpha) {
224         mSnapshot->alpha = alpha;
225     }
226 
227     /**
228      * Inserts a named group marker in the stream of GL commands. This marker
229      * can be used by tools to group commands into logical groups. A call to
230      * this method must always be followed later on by a call to endMark().
231      */
232     void startMark(const char* name) const;
233 
234     /**
235      * Closes the last group marker opened by startMark().
236      */
237     void endMark() const;
238 
239     /**
240      * Gets the alpha and xfermode out of a paint object. If the paint is null
241      * alpha will be 255 and the xfermode will be SRC_OVER. This method does
242      * not multiply the paint's alpha by the current snapshot's alpha.
243      *
244      * @param paint The paint to extract values from
245      * @param alpha Where to store the resulting alpha
246      * @param mode Where to store the resulting xfermode
247      */
getAlphaAndModeDirect(SkPaint * paint,int * alpha,SkXfermode::Mode * mode)248     static inline void getAlphaAndModeDirect(SkPaint* paint, int* alpha, SkXfermode::Mode* mode) {
249         if (paint) {
250             *mode = getXfermode(paint->getXfermode());
251 
252             // Skia draws using the color's alpha channel if < 255
253             // Otherwise, it uses the paint's alpha
254             int color = paint->getColor();
255             *alpha = (color >> 24) & 0xFF;
256             if (*alpha == 255) {
257                 *alpha = paint->getAlpha();
258             }
259         } else {
260             *mode = SkXfermode::kSrcOver_Mode;
261             *alpha = 255;
262         }
263     }
264 
265 protected:
266     /**
267      * Computes the projection matrix, initialize the first snapshot
268      * and stores the dimensions of the render target.
269      */
270     void initViewport(int width, int height);
271 
272     /**
273      * Clears the underlying surface if needed.
274      */
275     virtual status_t clear(float left, float top, float right, float bottom, bool opaque);
276 
277     /**
278      * Call this method after updating a layer during a drawing pass.
279      */
280     void resumeAfterLayer();
281 
282     /**
283      * Compose the layer defined in the current snapshot with the layer
284      * defined by the previous snapshot.
285      *
286      * The current snapshot *must* be a layer (flag kFlagIsLayer set.)
287      *
288      * @param curent The current snapshot containing the layer to compose
289      * @param previous The previous snapshot to compose the current layer with
290      */
291     virtual void composeLayer(sp<Snapshot> current, sp<Snapshot> previous);
292 
293     /**
294      * Marks the specified region as dirty at the specified bounds.
295      */
296     void dirtyLayerUnchecked(Rect& bounds, Region* region);
297 
298     /**
299      * Returns the current snapshot.
300      */
getSnapshot()301     sp<Snapshot> getSnapshot() {
302         return mSnapshot;
303     }
304 
305     /**
306      * Returns the region of the current layer.
307      */
getRegion()308     virtual Region* getRegion() {
309         return mSnapshot->region;
310     }
311 
312     /**
313      * Indicates whether rendering is currently targeted at a layer.
314      */
hasLayer()315     virtual bool hasLayer() {
316         return (mSnapshot->flags & Snapshot::kFlagFboTarget) && mSnapshot->region;
317     }
318 
319     /**
320      * Returns the name of the FBO this renderer is rendering into.
321      */
getTargetFbo()322     virtual GLint getTargetFbo() {
323         return 0;
324     }
325 
326     /**
327      * Renders the specified layer as a textured quad.
328      *
329      * @param layer The layer to render
330      * @param rect The bounds of the layer
331      */
332     void drawTextureLayer(Layer* layer, const Rect& rect);
333 
334     /**
335      * Gets the alpha and xfermode out of a paint object. If the paint is null
336      * alpha will be 255 and the xfermode will be SRC_OVER.
337      *
338      * @param paint The paint to extract values from
339      * @param alpha Where to store the resulting alpha
340      * @param mode Where to store the resulting xfermode
341      */
342     inline void getAlphaAndMode(SkPaint* paint, int* alpha, SkXfermode::Mode* mode);
343 
344     /**
345      * Safely retrieves the mode from the specified xfermode. If the specified
346      * xfermode is null, the mode is assumed to be SkXfermode::kSrcOver_Mode.
347      */
getXfermode(SkXfermode * mode)348     static inline SkXfermode::Mode getXfermode(SkXfermode* mode) {
349         SkXfermode::Mode resultMode;
350         if (!SkXfermode::AsMode(mode, &resultMode)) {
351             resultMode = SkXfermode::kSrcOver_Mode;
352         }
353         return resultMode;
354     }
355 
356     /**
357      * Set to true to suppress error checks at the end of a frame.
358      */
suppressErrorChecks()359     virtual bool suppressErrorChecks() {
360         return false;
361     }
362 
getCaches()363     Caches& getCaches() {
364         return mCaches;
365     }
366 
367 private:
368     /**
369      * Ensures the state of the renderer is the same as the state of
370      * the GL context.
371      */
372     void syncState();
373 
374     /**
375      * Tells the GPU what part of the screen is about to be redrawn.
376      * This method needs to be invoked every time getTargetFbo() is
377      * bound again.
378      */
379     void startTiling(const sp<Snapshot>& snapshot, bool opaque = false);
380 
381     /**
382      * Tells the GPU that we are done drawing the frame or that we
383      * are switching to another render target.
384      */
385     void endTiling();
386 
387     /**
388      * Saves the current state of the renderer as a new snapshot.
389      * The new snapshot is saved in mSnapshot and the previous snapshot
390      * is linked from mSnapshot->previous.
391      *
392      * @param flags The save flags; see SkCanvas for more information
393      *
394      * @return The new save count. This value can be passed to #restoreToCount()
395      */
396     int saveSnapshot(int flags);
397 
398     /**
399      * Restores the current snapshot; mSnapshot becomes mSnapshot->previous.
400      *
401      * @return True if the clip was modified.
402      */
403     bool restoreSnapshot();
404 
405     /**
406      * Sets the clipping rectangle using glScissor. The clip is defined by
407      * the current snapshot's clipRect member.
408      */
409     void setScissorFromClip();
410 
411     /**
412      * Performs a quick reject but does not affect the scissor. Returns
413      * the transformed rect to test and the current clip.
414      */
415     bool quickRejectNoScissor(float left, float top, float right, float bottom,
416             Rect& transformed, Rect& clip);
417 
418     /**
419      * Performs a quick reject but adjust the bounds to account for stroke width if necessary
420      */
421     bool quickRejectPreStroke(float left, float top, float right, float bottom, SkPaint* paint);
422 
423     /**
424      * Creates a new layer stored in the specified snapshot.
425      *
426      * @param snapshot The snapshot associated with the new layer
427      * @param left The left coordinate of the layer
428      * @param top The top coordinate of the layer
429      * @param right The right coordinate of the layer
430      * @param bottom The bottom coordinate of the layer
431      * @param alpha The translucency of the layer
432      * @param mode The blending mode of the layer
433      * @param flags The layer save flags
434      * @param previousFbo The name of the current framebuffer
435      *
436      * @return True if the layer was successfully created, false otherwise
437      */
438     bool createLayer(float left, float top, float right, float bottom,
439             int alpha, SkXfermode::Mode mode, int flags, GLuint previousFbo);
440 
441     /**
442      * Creates a new layer stored in the specified snapshot as an FBO.
443      *
444      * @param layer The layer to store as an FBO
445      * @param snapshot The snapshot associated with the new layer
446      * @param bounds The bounds of the layer
447      * @param previousFbo The name of the current framebuffer
448      */
449     bool createFboLayer(Layer* layer, Rect& bounds, Rect& clip, GLuint previousFbo);
450 
451     /**
452      * Compose the specified layer as a region.
453      *
454      * @param layer The layer to compose
455      * @param rect The layer's bounds
456      */
457     void composeLayerRegion(Layer* layer, const Rect& rect);
458 
459     /**
460      * Compose the specified layer as a simple rectangle.
461      *
462      * @param layer The layer to compose
463      * @param rect The layer's bounds
464      * @param swap If true, the source and destination are swapped
465      */
466     void composeLayerRect(Layer* layer, const Rect& rect, bool swap = false);
467 
468     /**
469      * Clears all the regions corresponding to the current list of layers.
470      * This method MUST be invoked before any drawing operation.
471      */
472     void clearLayerRegions();
473 
474     /**
475      * Mark the layer as dirty at the specified coordinates. The coordinates
476      * are transformed with the supplied matrix.
477      */
478     void dirtyLayer(const float left, const float top,
479             const float right, const float bottom, const mat4 transform);
480 
481     /**
482      * Mark the layer as dirty at the specified coordinates.
483      */
484     void dirtyLayer(const float left, const float top,
485             const float right, const float bottom);
486 
487     /**
488      * Draws a colored rectangle with the specified color. The specified coordinates
489      * are transformed by the current snapshot's transform matrix.
490      *
491      * @param left The left coordinate of the rectangle
492      * @param top The top coordinate of the rectangle
493      * @param right The right coordinate of the rectangle
494      * @param bottom The bottom coordinate of the rectangle
495      * @param color The rectangle's ARGB color, defined as a packed 32 bits word
496      * @param mode The Skia xfermode to use
497      * @param ignoreTransform True if the current transform should be ignored
498      */
499     void drawColorRect(float left, float top, float right, float bottom,
500             int color, SkXfermode::Mode mode, bool ignoreTransform = false);
501 
502     /**
503      * Draws the shape represented by the specified path texture.
504      * This method invokes drawPathTexture() but takes into account
505      * the extra left/top offset and the texture offset to correctly
506      * position the final shape.
507      *
508      * @param left The left coordinate of the shape to render
509      * @param top The top coordinate of the shape to render
510      * @param texture The texture reprsenting the shape
511      * @param paint The paint to draw the shape with
512      */
513     status_t drawShape(float left, float top, const PathTexture* texture, SkPaint* paint);
514 
515     /**
516      * Draws the specified texture as an alpha bitmap. Alpha bitmaps obey
517      * different compositing rules.
518      *
519      * @param texture The texture to draw with
520      * @param left The x coordinate of the bitmap
521      * @param top The y coordinate of the bitmap
522      * @param paint The paint to render with
523      */
524     void drawAlphaBitmap(Texture* texture, float left, float top, SkPaint* paint);
525 
526     /**
527      * Renders the convex hull defined by the specified path as a strip of polygons.
528      *
529      * @param path The hull of the path to draw
530      * @param paint The paint to render with
531      */
532     void drawConvexPath(const SkPath& path, SkPaint* paint);
533 
534     /**
535      * Draws a textured rectangle with the specified texture. The specified coordinates
536      * are transformed by the current snapshot's transform matrix.
537      *
538      * @param left The left coordinate of the rectangle
539      * @param top The top coordinate of the rectangle
540      * @param right The right coordinate of the rectangle
541      * @param bottom The bottom coordinate of the rectangle
542      * @param texture The texture name to map onto the rectangle
543      * @param alpha An additional translucency parameter, between 0.0f and 1.0f
544      * @param mode The blending mode
545      * @param blend True if the texture contains an alpha channel
546      */
547     void drawTextureRect(float left, float top, float right, float bottom, GLuint texture,
548             float alpha, SkXfermode::Mode mode, bool blend);
549 
550     /**
551      * Draws a textured rectangle with the specified texture. The specified coordinates
552      * are transformed by the current snapshot's transform matrix.
553      *
554      * @param left The left coordinate of the rectangle
555      * @param top The top coordinate of the rectangle
556      * @param right The right coordinate of the rectangle
557      * @param bottom The bottom coordinate of the rectangle
558      * @param texture The texture to use
559      * @param paint The paint containing the alpha, blending mode, etc.
560      */
561     void drawTextureRect(float left, float top, float right, float bottom,
562             Texture* texture, SkPaint* paint);
563 
564     /**
565      * Draws a textured mesh with the specified texture. If the indices are omitted,
566      * the mesh is drawn as a simple quad. The mesh pointers become offsets when a
567      * VBO is bound.
568      *
569      * @param left The left coordinate of the rectangle
570      * @param top The top coordinate of the rectangle
571      * @param right The right coordinate of the rectangle
572      * @param bottom The bottom coordinate of the rectangle
573      * @param texture The texture name to map onto the rectangle
574      * @param alpha An additional translucency parameter, between 0.0f and 1.0f
575      * @param mode The blending mode
576      * @param blend True if the texture contains an alpha channel
577      * @param vertices The vertices that define the mesh
578      * @param texCoords The texture coordinates of each vertex
579      * @param elementsCount The number of elements in the mesh, required by indices
580      * @param swapSrcDst Whether or not the src and dst blending operations should be swapped
581      * @param ignoreTransform True if the current transform should be ignored
582      * @param vbo The VBO used to draw the mesh
583      * @param ignoreScale True if the model view matrix should not be scaled
584      * @param dirty True if calling this method should dirty the current layer
585      */
586     void drawTextureMesh(float left, float top, float right, float bottom, GLuint texture,
587             float alpha, SkXfermode::Mode mode, bool blend,
588             GLvoid* vertices, GLvoid* texCoords, GLenum drawMode, GLsizei elementsCount,
589             bool swapSrcDst = false, bool ignoreTransform = false, GLuint vbo = 0,
590             bool ignoreScale = false, bool dirty = true);
591 
592     /**
593      * Draws text underline and strike-through if needed.
594      *
595      * @param text The text to decor
596      * @param bytesCount The number of bytes in the text
597      * @param length The length in pixels of the text, can be <= 0.0f to force a measurement
598      * @param x The x coordinate where the text will be drawn
599      * @param y The y coordinate where the text will be drawn
600      * @param paint The paint to draw the text with
601      */
602     void drawTextDecorations(const char* text, int bytesCount, float length,
603             float x, float y, SkPaint* paint);
604 
605    /**
606      * Draws shadow layer on text (with optional positions).
607      *
608      * @param paint The paint to draw the shadow with
609      * @param text The text to draw
610      * @param bytesCount The number of bytes in the text
611      * @param count The number of glyphs in the text
612      * @param positions The x, y positions of individual glyphs (or NULL)
613      * @param fontRenderer The font renderer object
614      * @param alpha The alpha value for drawing the shadow
615      * @param mode The xfermode for drawing the shadow
616      * @param x The x coordinate where the shadow will be drawn
617      * @param y The y coordinate where the shadow will be drawn
618      */
619     void drawTextShadow(SkPaint* paint, const char* text, int bytesCount, int count,
620             const float* positions, FontRenderer& fontRenderer, int alpha, SkXfermode::Mode mode,
621             float x, float y);
622 
623     /**
624      * Draws a path texture. Path textures are alpha8 bitmaps that need special
625      * compositing to apply colors/filters/etc.
626      *
627      * @param texture The texture to render
628      * @param x The x coordinate where the texture will be drawn
629      * @param y The y coordinate where the texture will be drawn
630      * @param paint The paint to draw the texture with
631      */
632      void drawPathTexture(const PathTexture* texture, float x, float y, SkPaint* paint);
633 
634     /**
635      * Resets the texture coordinates stored in mMeshVertices. Setting the values
636      * back to default is achieved by calling:
637      *
638      * resetDrawTextureTexCoords(0.0f, 0.0f, 1.0f, 1.0f);
639      *
640      * @param u1 The left coordinate of the texture
641      * @param v1 The bottom coordinate of the texture
642      * @param u2 The right coordinate of the texture
643      * @param v2 The top coordinate of the texture
644      */
645     void resetDrawTextureTexCoords(float u1, float v1, float u2, float v2);
646 
647     /**
648      * Binds the specified texture. The texture unit must have been selected
649      * prior to calling this method.
650      */
bindTexture(GLuint texture)651     inline void bindTexture(GLuint texture) {
652         glBindTexture(GL_TEXTURE_2D, texture);
653     }
654 
655     /**
656      * Binds the specified EGLImage texture. The texture unit must have been selected
657      * prior to calling this method.
658      */
bindExternalTexture(GLuint texture)659     inline void bindExternalTexture(GLuint texture) {
660         glBindTexture(GL_TEXTURE_EXTERNAL_OES, texture);
661     }
662 
663     /**
664      * Enable or disable blending as necessary. This function sets the appropriate
665      * blend function based on the specified xfermode.
666      */
667     inline void chooseBlending(bool blend, SkXfermode::Mode mode, ProgramDescription& description,
668             bool swapSrcDst = false);
669 
670     /**
671      * Use the specified program with the current GL context. If the program is already
672      * in use, it will not be bound again. If it is not in use, the current program is
673      * marked unused and the specified program becomes used and becomes the new
674      * current program.
675      *
676      * @param program The program to use
677      *
678      * @return true If the specified program was already in use, false otherwise.
679      */
680     inline bool useProgram(Program* program);
681 
682     /**
683      * Invoked before any drawing operation. This sets required state.
684      */
685     void setupDraw(bool clear = true);
686 
687     /**
688      * Various methods to setup OpenGL rendering.
689      */
690     void setupDrawWithTexture(bool isAlpha8 = false);
691     void setupDrawWithExternalTexture();
692     void setupDrawNoTexture();
693     void setupDrawAA();
694     void setupDrawVertexShape();
695     void setupDrawPoint(float pointSize);
696     void setupDrawColor(int color);
697     void setupDrawColor(int color, int alpha);
698     void setupDrawColor(float r, float g, float b, float a);
699     void setupDrawAlpha8Color(int color, int alpha);
700     void setupDrawTextGamma(const SkPaint* paint);
701     void setupDrawShader();
702     void setupDrawColorFilter();
703     void setupDrawBlending(SkXfermode::Mode mode = SkXfermode::kSrcOver_Mode,
704             bool swapSrcDst = false);
705     void setupDrawBlending(bool blend = true, SkXfermode::Mode mode = SkXfermode::kSrcOver_Mode,
706             bool swapSrcDst = false);
707     void setupDrawProgram();
708     void setupDrawDirtyRegionsDisabled();
709     void setupDrawModelViewIdentity(bool offset = false);
710     void setupDrawModelView(float left, float top, float right, float bottom,
711             bool ignoreTransform = false, bool ignoreModelView = false);
712     void setupDrawModelViewTranslate(float left, float top, float right, float bottom,
713             bool ignoreTransform = false);
714     void setupDrawPointUniforms();
715     void setupDrawColorUniforms();
716     void setupDrawPureColorUniforms();
717     void setupDrawShaderIdentityUniforms();
718     void setupDrawShaderUniforms(bool ignoreTransform = false);
719     void setupDrawColorFilterUniforms();
720     void setupDrawSimpleMesh();
721     void setupDrawTexture(GLuint texture);
722     void setupDrawExternalTexture(GLuint texture);
723     void setupDrawTextureTransform();
724     void setupDrawTextureTransformUniforms(mat4& transform);
725     void setupDrawTextGammaUniforms();
726     void setupDrawMesh(GLvoid* vertices, GLvoid* texCoords = NULL, GLuint vbo = 0);
727     void setupDrawMeshIndices(GLvoid* vertices, GLvoid* texCoords);
728     void setupDrawVertices(GLvoid* vertices);
729     void setupDrawAALine(GLvoid* vertices, GLvoid* distanceCoords, GLvoid* lengthCoords,
730             float strokeWidth, int& widthSlot, int& lengthSlot);
731     void finishDrawAALine(const int widthSlot, const int lengthSlot);
732     void finishDrawTexture();
733     void accountForClear(SkXfermode::Mode mode);
734 
735     bool updateLayer(Layer* layer, bool inFrame);
736     void updateLayers();
737 
738     /**
739      * Renders the specified region as a series of rectangles. This method
740      * is used for debugging only.
741      */
742     void drawRegionRects(const Region& region);
743 
744     void debugOverdraw(bool enable, bool clear);
745     void renderOverdraw();
746 
747     /**
748      * Should be invoked every time the glScissor is modified.
749      */
dirtyClip()750     inline void dirtyClip() {
751         mDirtyClip = true;
752     }
753 
754     // Dimensions of the drawing surface
755     int mWidth, mHeight;
756 
757     // Matrix used for ortho projection in shaders
758     mat4 mOrthoMatrix;
759 
760     // Model-view matrix used to position/size objects
761     mat4 mModelView;
762 
763     // Number of saved states
764     int mSaveCount;
765     // Base state
766     sp<Snapshot> mFirstSnapshot;
767     // Current state
768     sp<Snapshot> mSnapshot;
769     // State used to define the clipping region
770     sp<Snapshot> mTilingSnapshot;
771 
772     // Shaders
773     SkiaShader* mShader;
774 
775     // Color filters
776     SkiaColorFilter* mColorFilter;
777 
778     // Used to draw textured quads
779     TextureVertex mMeshVertices[4];
780 
781     // Drop shadow
782     bool mHasShadow;
783     float mShadowRadius;
784     float mShadowDx;
785     float mShadowDy;
786     int mShadowColor;
787 
788     // Draw filters
789     bool mHasDrawFilter;
790     int mPaintFilterClearBits;
791     int mPaintFilterSetBits;
792     SkPaint mFilteredPaint;
793 
794     // Various caches
795     Caches& mCaches;
796 
797     // List of rectangles to clear after saveLayer() is invoked
798     Vector<Rect*> mLayers;
799     // List of functors to invoke after a frame is drawn
800     SortedVector<Functor*> mFunctors;
801     // List of layers to update at the beginning of a frame
802     Vector<Layer*> mLayerUpdates;
803 
804     // Indentity matrix
805     const mat4 mIdentity;
806 
807     // Indicates whether the clip must be restored
808     bool mDirtyClip;
809 
810     // The following fields are used to setup drawing
811     // Used to describe the shaders to generate
812     ProgramDescription mDescription;
813     // Color description
814     bool mColorSet;
815     float mColorA, mColorR, mColorG, mColorB;
816     // Indicates that the shader should get a color
817     bool mSetShaderColor;
818     // Current texture unit
819     GLuint mTextureUnit;
820     // Track dirty regions, true by default
821     bool mTrackDirtyRegions;
822     // Indicate whether we are drawing an opaque frame
823     bool mOpaqueFrame;
824 
825     // See PROPERTY_DISABLE_SCISSOR_OPTIMIZATION in
826     // Properties.h
827     bool mScissorOptimizationDisabled;
828 
829     // No-ops start/endTiling when set
830     bool mSuppressTiling;
831 
832     friend class DisplayListRenderer;
833 
834 }; // class OpenGLRenderer
835 
836 }; // namespace uirenderer
837 }; // namespace android
838 
839 #endif // ANDROID_HWUI_OPENGL_RENDERER_H
840