OpenGLRenderer.h revision 9b5a1a28c327e6113d68302b1f0eed1d1c6f6183
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 <androidfw/ResourceTypes.h>
38
39#include "Debug.h"
40#include "Extensions.h"
41#include "Matrix.h"
42#include "Program.h"
43#include "Rect.h"
44#include "Snapshot.h"
45#include "Vertex.h"
46#include "SkiaShader.h"
47#include "SkiaColorFilter.h"
48#include "UvMapper.h"
49#include "Caches.h"
50
51namespace android {
52namespace uirenderer {
53
54struct DrawModifiers {
55    DrawModifiers() {
56        reset();
57    }
58
59    void reset() {
60        memset(this, 0, sizeof(DrawModifiers));
61    }
62
63    SkiaShader* mShader;
64    SkiaColorFilter* mColorFilter;
65    float mOverrideLayerAlpha;
66
67    // Drop shadow
68    bool mHasShadow;
69    float mShadowRadius;
70    float mShadowDx;
71    float mShadowDy;
72    int mShadowColor;
73
74    // Draw filters
75    bool mHasDrawFilter;
76    int mPaintFilterClearBits;
77    int mPaintFilterSetBits;
78};
79
80enum StateDeferFlags {
81    kStateDeferFlag_Draw = 0x1,
82    kStateDeferFlag_Clip = 0x2
83};
84
85enum DrawOpMode {
86    kDrawOpMode_Immediate,
87    kDrawOpMode_Defer,
88    kDrawOpMode_Flush
89};
90
91enum ClipSideFlags {
92    kClipSide_None = 0x0,
93    kClipSide_Left = 0x1,
94    kClipSide_Top = 0x2,
95    kClipSide_Right = 0x4,
96    kClipSide_Bottom = 0x8,
97    kClipSide_Full = 0xF,
98    kClipSide_ConservativeFull = 0x1F
99};
100
101struct DeferredDisplayState {
102    // global op bounds, mapped by mMatrix to be in screen space coordinates, clipped
103    Rect mBounds;
104
105    // the below are set and used by the OpenGLRenderer at record and deferred playback
106    bool mClipValid;
107    Rect mClip;
108    int mClipSideFlags; // specifies which sides of the bounds are clipped, unclipped if cleared
109    bool mClipped;
110    mat4 mMatrix;
111    DrawModifiers mDrawModifiers;
112    float mAlpha;
113};
114
115///////////////////////////////////////////////////////////////////////////////
116// Renderer
117///////////////////////////////////////////////////////////////////////////////
118
119class DisplayList;
120class TextSetupFunctor;
121class VertexBuffer;
122
123/**
124 * OpenGL renderer used to draw accelerated 2D graphics. The API is a
125 * simplified version of Skia's Canvas API.
126 */
127class OpenGLRenderer {
128public:
129    ANDROID_API OpenGLRenderer();
130    virtual ~OpenGLRenderer();
131
132    /**
133     * Sets the name of this renderer. The name is optional and
134     * empty by default. If the pointer is null the name is set
135     * to the empty string.
136     */
137    ANDROID_API void setName(const char* name);
138
139    /**
140     * Returns the name of this renderer as UTF8 string.
141     * The returned pointer is never null.
142     */
143    ANDROID_API const char* getName() const;
144
145    /**
146     * Read externally defined properties to control the behavior
147     * of the renderer.
148     */
149    ANDROID_API void initProperties();
150
151    /**
152     * Indicates whether this renderer executes drawing commands immediately.
153     * If this method returns true, the drawing commands will be executed
154     * later.
155     */
156    virtual bool isDeferred();
157
158    /**
159     * Sets the dimension of the underlying drawing surface. This method must
160     * be called at least once every time the drawing surface changes size.
161     *
162     * @param width The width in pixels of the underlysing surface
163     * @param height The height in pixels of the underlysing surface
164     */
165    virtual void setViewport(int width, int height);
166
167    /**
168     * Prepares the renderer to draw a frame. This method must be invoked
169     * at the beginning of each frame. When this method is invoked, the
170     * entire drawing surface is assumed to be redrawn.
171     *
172     * @param opaque If true, the target surface is considered opaque
173     *               and will not be cleared. If false, the target surface
174     *               will be cleared
175     */
176    ANDROID_API status_t prepare(bool opaque);
177
178    /**
179     * Prepares the renderer to draw a frame. This method must be invoked
180     * at the beginning of each frame. Only the specified rectangle of the
181     * frame is assumed to be dirty. A clip will automatically be set to
182     * the specified rectangle.
183     *
184     * @param left The left coordinate of the dirty rectangle
185     * @param top The top coordinate of the dirty rectangle
186     * @param right The right coordinate of the dirty rectangle
187     * @param bottom The bottom coordinate of the dirty rectangle
188     * @param opaque If true, the target surface is considered opaque
189     *               and will not be cleared. If false, the target surface
190     *               will be cleared in the specified dirty rectangle
191     */
192    virtual status_t prepareDirty(float left, float top, float right, float bottom, bool opaque);
193
194    /**
195     * Indicates the end of a frame. This method must be invoked whenever
196     * the caller is done rendering a frame.
197     */
198    virtual void finish();
199
200    /**
201     * This method must be invoked before handing control over to a draw functor.
202     * See callDrawGLFunction() for instance.
203     *
204     * This command must not be recorded inside display lists.
205     */
206    virtual void interrupt();
207
208    /**
209     * This method must be invoked after getting control back from a draw functor.
210     *
211     * This command must not be recorded inside display lists.
212     */
213    virtual void resume();
214
215    ANDROID_API void setCountOverdrawEnabled(bool enabled) {
216        mCountOverdraw = enabled;
217    }
218
219    ANDROID_API float getOverdraw() {
220        return mCountOverdraw ? mOverdraw : 0.0f;
221    }
222
223    ANDROID_API status_t invokeFunctors(Rect& dirty);
224    ANDROID_API void detachFunctor(Functor* functor);
225    ANDROID_API void attachFunctor(Functor* functor);
226    virtual status_t callDrawGLFunction(Functor* functor, Rect& dirty);
227
228    ANDROID_API void pushLayerUpdate(Layer* layer);
229    ANDROID_API void cancelLayerUpdate(Layer* layer);
230    ANDROID_API void clearLayerUpdates();
231    ANDROID_API void flushLayerUpdates();
232
233    ANDROID_API int getSaveCount() const;
234    virtual int save(int flags);
235    virtual void restore();
236    virtual void restoreToCount(int saveCount);
237
238    ANDROID_API int saveLayer(float left, float top, float right, float bottom,
239            SkPaint* paint, int flags) {
240        SkXfermode::Mode mode = SkXfermode::kSrcOver_Mode;
241        if (paint) mode = getXfermode(paint->getXfermode());
242        return saveLayer(left, top, right, bottom, paint ? paint->getAlpha() : 255, mode, flags);
243    }
244    ANDROID_API int saveLayerAlpha(float left, float top, float right, float bottom,
245            int alpha, int flags) {
246        return saveLayer(left, top, right, bottom, alpha, SkXfermode::kSrcOver_Mode, flags);
247    }
248    virtual int saveLayer(float left, float top, float right, float bottom,
249            int alpha, SkXfermode::Mode mode, int flags);
250
251    int saveLayerDeferred(float left, float top, float right, float bottom,
252            int alpha, SkXfermode::Mode mode, int flags);
253
254    virtual void translate(float dx, float dy);
255    virtual void rotate(float degrees);
256    virtual void scale(float sx, float sy);
257    virtual void skew(float sx, float sy);
258
259    bool hasRectToRectTransform();
260    ANDROID_API void getMatrix(SkMatrix* matrix);
261    virtual void setMatrix(SkMatrix* matrix);
262    virtual void concatMatrix(SkMatrix* matrix);
263
264    ANDROID_API const Rect& getClipBounds();
265
266    /**
267     * Performs a quick reject but adjust the bounds to account for stroke width if necessary,
268     * and handling snapOut for AA geometry.
269     */
270    bool quickRejectPreStroke(float left, float top, float right, float bottom, SkPaint* paint);
271
272    /**
273     * Returns false and sets scissor based upon bounds if drawing won't be clipped out
274     */
275    bool quickReject(float left, float top, float right, float bottom, bool snapOut = false);
276    bool quickReject(const Rect& bounds) {
277        return quickReject(bounds.left, bounds.top, bounds.right, bounds.bottom);
278    }
279
280    /**
281     * Same as quickReject, without the scissor, instead returning clipRequired through pointer.
282     * clipRequired will be only set if not rejected
283     */
284    ANDROID_API bool quickRejectNoScissor(float left, float top, float right, float bottom,
285            bool snapOut = false, bool* clipRequired = NULL);
286    bool quickRejectNoScissor(const Rect& bounds, bool* clipRequired = NULL) {
287        return quickRejectNoScissor(bounds.left, bounds.top, bounds.right, bounds.bottom,
288                clipRequired);
289    }
290
291    virtual bool clipRect(float left, float top, float right, float bottom, SkRegion::Op op);
292    virtual bool clipPath(SkPath* path, SkRegion::Op op);
293    virtual bool clipRegion(SkRegion* region, SkRegion::Op op);
294    virtual Rect* getClipRect();
295
296    virtual status_t drawDisplayList(DisplayList* displayList, Rect& dirty, int32_t replayFlags);
297    virtual void outputDisplayList(DisplayList* displayList);
298    virtual status_t drawLayer(Layer* layer, float x, float y);
299    virtual status_t drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint);
300    status_t drawBitmaps(SkBitmap* bitmap, AssetAtlas::Entry* entry, int bitmapCount,
301            TextureVertex* vertices, bool transformed, const Rect& bounds, SkPaint* paint);
302    virtual status_t drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint);
303    virtual status_t drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
304            float srcRight, float srcBottom, float dstLeft, float dstTop,
305            float dstRight, float dstBottom, SkPaint* paint);
306    virtual status_t drawBitmapData(SkBitmap* bitmap, float left, float top, SkPaint* paint);
307    virtual status_t drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
308            float* vertices, int* colors, SkPaint* paint);
309    status_t drawPatches(SkBitmap* bitmap, AssetAtlas::Entry* entry,
310            TextureVertex* vertices, uint32_t indexCount, SkPaint* paint);
311    virtual status_t drawPatch(SkBitmap* bitmap, Res_png_9patch* patch,
312            float left, float top, float right, float bottom, SkPaint* paint);
313    status_t drawPatch(SkBitmap* bitmap, const Patch* mesh, AssetAtlas::Entry* entry,
314            float left, float top, float right, float bottom, SkPaint* paint);
315    virtual status_t drawColor(int color, SkXfermode::Mode mode);
316    virtual status_t drawRect(float left, float top, float right, float bottom, SkPaint* paint);
317    virtual status_t drawRoundRect(float left, float top, float right, float bottom,
318            float rx, float ry, SkPaint* paint);
319    virtual status_t drawCircle(float x, float y, float radius, SkPaint* paint);
320    virtual status_t drawOval(float left, float top, float right, float bottom, SkPaint* paint);
321    virtual status_t drawArc(float left, float top, float right, float bottom,
322            float startAngle, float sweepAngle, bool useCenter, SkPaint* paint);
323    virtual status_t drawPath(SkPath* path, SkPaint* paint);
324    virtual status_t drawLines(float* points, int count, SkPaint* paint);
325    virtual status_t drawPoints(float* points, int count, SkPaint* paint);
326    virtual status_t drawTextOnPath(const char* text, int bytesCount, int count, SkPath* path,
327            float hOffset, float vOffset, SkPaint* paint);
328    virtual status_t drawPosText(const char* text, int bytesCount, int count,
329            const float* positions, SkPaint* paint);
330    virtual status_t drawText(const char* text, int bytesCount, int count, float x, float y,
331            const float* positions, SkPaint* paint, float totalAdvance, const Rect& bounds,
332            DrawOpMode drawOpMode = kDrawOpMode_Immediate);
333    virtual status_t drawRects(const float* rects, int count, SkPaint* paint);
334
335    virtual void resetShader();
336    virtual void setupShader(SkiaShader* shader);
337
338    virtual void resetColorFilter();
339    virtual void setupColorFilter(SkiaColorFilter* filter);
340
341    virtual void resetShadow();
342    virtual void setupShadow(float radius, float dx, float dy, int color);
343
344    virtual void resetPaintFilter();
345    virtual void setupPaintFilter(int clearBits, int setBits);
346
347    // If this value is set to < 1.0, it overrides alpha set on layer (see drawBitmap, drawLayer)
348    void setOverrideLayerAlpha(float alpha) { mDrawModifiers.mOverrideLayerAlpha = alpha; }
349
350    SkPaint* filterPaint(SkPaint* paint);
351
352    /**
353     * Store the current display state (most importantly, the current clip and transform), and
354     * additionally map the state's bounds from local to window coordinates.
355     *
356     * Returns true if quick-rejected
357     */
358    bool storeDisplayState(DeferredDisplayState& state, int stateDeferFlags);
359    void restoreDisplayState(const DeferredDisplayState& state, bool skipClipRestore = false);
360    void setupMergedMultiDraw(const Rect* clipRect);
361
362    const DrawModifiers& getDrawModifiers() { return mDrawModifiers; }
363    void setDrawModifiers(const DrawModifiers& drawModifiers) { mDrawModifiers = drawModifiers; }
364
365    ANDROID_API bool isCurrentTransformSimple() {
366        return mSnapshot->transform->isSimple();
367    }
368
369    Caches& getCaches() {
370        return mCaches;
371    }
372
373    // simple rect clip
374    bool isCurrentClipSimple() {
375        return mSnapshot->clipRegion->isEmpty();
376    }
377
378    int getViewportWidth() { return getSnapshot()->viewport.getWidth(); }
379    int getViewportHeight() { return getSnapshot()->viewport.getHeight(); }
380
381    /**
382     * Scales the alpha on the current snapshot. This alpha value will be modulated
383     * with other alpha values when drawing primitives.
384     */
385    void scaleAlpha(float alpha) {
386        mSnapshot->alpha *= alpha;
387    }
388
389    /**
390     * Inserts a named event marker in the stream of GL commands.
391     */
392    void eventMark(const char* name) const;
393
394    /**
395     * Inserts a named group marker in the stream of GL commands. This marker
396     * can be used by tools to group commands into logical groups. A call to
397     * this method must always be followed later on by a call to endMark().
398     */
399    void startMark(const char* name) const;
400
401    /**
402     * Closes the last group marker opened by startMark().
403     */
404    void endMark() const;
405
406    /**
407     * Gets the alpha and xfermode out of a paint object. If the paint is null
408     * alpha will be 255 and the xfermode will be SRC_OVER. This method does
409     * not multiply the paint's alpha by the current snapshot's alpha, and does
410     * not replace the alpha with the overrideLayerAlpha
411     *
412     * @param paint The paint to extract values from
413     * @param alpha Where to store the resulting alpha
414     * @param mode Where to store the resulting xfermode
415     */
416    static inline void getAlphaAndModeDirect(SkPaint* paint, int* alpha, SkXfermode::Mode* mode) {
417        *mode = getXfermodeDirect(paint);
418        *alpha = getAlphaDirect(paint);
419    }
420
421    static inline SkXfermode::Mode getXfermodeDirect(SkPaint* paint) {
422        if (!paint) return SkXfermode::kSrcOver_Mode;
423        return getXfermode(paint->getXfermode());
424    }
425
426    static inline int getAlphaDirect(SkPaint* paint) {
427        if (!paint) return 255;
428        return paint->getAlpha();
429    }
430
431    /**
432     * Return the best transform to use to rasterize text given a full
433     * transform matrix.
434     */
435    mat4 findBestFontTransform(const mat4& transform) const;
436
437#if DEBUG_MERGE_BEHAVIOR
438    void drawScreenSpaceColorRect(float left, float top, float right, float bottom, int color) {
439        mCaches.setScissorEnabled(false);
440
441        // should only be called outside of other draw ops, so stencil can only be in test state
442        bool stencilWasEnabled = mCaches.stencil.isTestEnabled();
443        mCaches.stencil.disable();
444
445        drawColorRect(left, top, right, bottom, color, SkXfermode::kSrcOver_Mode, true);
446
447        if (stencilWasEnabled) mCaches.stencil.enableTest();
448    }
449#endif
450
451protected:
452    /**
453     * Computes the projection matrix, initialize the first snapshot
454     * and stores the dimensions of the render target.
455     */
456    void initViewport(int width, int height);
457
458    /**
459     * Perform the setup specific to a frame. This method does not
460     * issue any OpenGL commands.
461     */
462    void setupFrameState(float left, float top, float right, float bottom, bool opaque);
463
464    /**
465     * Indicates the start of rendering. This method will setup the
466     * initial OpenGL state (viewport, clearing the buffer, etc.)
467     */
468    status_t startFrame();
469
470    /**
471     * Clears the underlying surface if needed.
472     */
473    virtual status_t clear(float left, float top, float right, float bottom, bool opaque);
474
475    /**
476     * Call this method after updating a layer during a drawing pass.
477     */
478    void resumeAfterLayer();
479
480    /**
481     * This method is called whenever a stencil buffer is required. Subclasses
482     * should override this method and call attachStencilBufferToLayer() on the
483     * appropriate layer(s).
484     */
485    virtual void ensureStencilBuffer();
486
487    /**
488     * Obtains a stencil render buffer (allocating it if necessary) and
489     * attaches it to the specified layer.
490     */
491    void attachStencilBufferToLayer(Layer* layer);
492
493    /**
494     * Compose the layer defined in the current snapshot with the layer
495     * defined by the previous snapshot.
496     *
497     * The current snapshot *must* be a layer (flag kFlagIsLayer set.)
498     *
499     * @param curent The current snapshot containing the layer to compose
500     * @param previous The previous snapshot to compose the current layer with
501     */
502    virtual void composeLayer(sp<Snapshot> current, sp<Snapshot> previous);
503
504    /**
505     * Marks the specified region as dirty at the specified bounds.
506     */
507    void dirtyLayerUnchecked(Rect& bounds, Region* region);
508
509    /**
510     * Returns the current snapshot.
511     */
512    sp<Snapshot> getSnapshot() const {
513        return mSnapshot;
514    }
515
516    /**
517     * Returns the region of the current layer.
518     */
519    virtual Region* getRegion() const {
520        return mSnapshot->region;
521    }
522
523    /**
524     * Indicates whether rendering is currently targeted at a layer.
525     */
526    virtual bool hasLayer() const {
527        return (mSnapshot->flags & Snapshot::kFlagFboTarget) && mSnapshot->region;
528    }
529
530    /**
531     * Returns the name of the FBO this renderer is rendering into.
532     */
533    virtual GLint getTargetFbo() const {
534        return 0;
535    }
536
537    /**
538     * Renders the specified layer as a textured quad.
539     *
540     * @param layer The layer to render
541     * @param rect The bounds of the layer
542     */
543    void drawTextureLayer(Layer* layer, const Rect& rect);
544
545    /**
546     * Gets the alpha and xfermode out of a paint object. If the paint is null
547     * alpha will be 255 and the xfermode will be SRC_OVER. Accounts for both
548     * snapshot alpha, and overrideLayerAlpha
549     *
550     * @param paint The paint to extract values from
551     * @param alpha Where to store the resulting alpha
552     * @param mode Where to store the resulting xfermode
553     */
554    inline void getAlphaAndMode(SkPaint* paint, int* alpha, SkXfermode::Mode* mode) const;
555
556    /**
557     * Gets the alpha from a layer, accounting for snapshot alpha and overrideLayerAlpha
558     *
559     * @param layer The layer from which the alpha is extracted
560     */
561    inline float getLayerAlpha(Layer* layer) const;
562
563    /**
564     * Safely retrieves the mode from the specified xfermode. If the specified
565     * xfermode is null, the mode is assumed to be SkXfermode::kSrcOver_Mode.
566     */
567    static inline SkXfermode::Mode getXfermode(SkXfermode* mode) {
568        SkXfermode::Mode resultMode;
569        if (!SkXfermode::AsMode(mode, &resultMode)) {
570            resultMode = SkXfermode::kSrcOver_Mode;
571        }
572        return resultMode;
573    }
574
575    /**
576     * Set to true to suppress error checks at the end of a frame.
577     */
578    virtual bool suppressErrorChecks() const {
579        return false;
580    }
581
582private:
583    /**
584     * Discards the content of the framebuffer if supported by the driver.
585     * This method should be called at the beginning of a frame to optimize
586     * rendering on some tiler architectures.
587     */
588    void discardFramebuffer(float left, float top, float right, float bottom);
589
590    /**
591     * Ensures the state of the renderer is the same as the state of
592     * the GL context.
593     */
594    void syncState();
595
596    /**
597     * Tells the GPU what part of the screen is about to be redrawn.
598     * This method will use the clip rect that we started drawing the
599     * frame with.
600     * This method needs to be invoked every time getTargetFbo() is
601     * bound again.
602     */
603    void startTiling(const sp<Snapshot>& snapshot, bool opaque = false);
604
605    /**
606     * Tells the GPU what part of the screen is about to be redrawn.
607     * This method needs to be invoked every time getTargetFbo() is
608     * bound again.
609     */
610    void startTiling(const Rect& clip, int windowHeight, bool opaque = false);
611
612    /**
613     * Tells the GPU that we are done drawing the frame or that we
614     * are switching to another render target.
615     */
616    void endTiling();
617
618    /**
619     * Saves the current state of the renderer as a new snapshot.
620     * The new snapshot is saved in mSnapshot and the previous snapshot
621     * is linked from mSnapshot->previous.
622     *
623     * @param flags The save flags; see SkCanvas for more information
624     *
625     * @return The new save count. This value can be passed to #restoreToCount()
626     */
627    int saveSnapshot(int flags);
628
629    /**
630     * Restores the current snapshot; mSnapshot becomes mSnapshot->previous.
631     *
632     * @return True if the clip was modified.
633     */
634    bool restoreSnapshot();
635
636    /**
637     * Sets the clipping rectangle using glScissor. The clip is defined by
638     * the current snapshot's clipRect member.
639     */
640    void setScissorFromClip();
641
642    /**
643     * Sets the clipping region using the stencil buffer. The clip region
644     * is defined by the current snapshot's clipRegion member.
645     */
646    void setStencilFromClip();
647
648    /**
649     * Given the local bounds of the layer, calculates ...
650     */
651    void calculateLayerBoundsAndClip(Rect& bounds, Rect& clip, bool fboLayer);
652
653    /**
654     * Given the local bounds + clip of the layer, updates current snapshot's empty/invisible
655     */
656    void updateSnapshotIgnoreForLayer(const Rect& bounds, const Rect& clip,
657            bool fboLayer, int alpha);
658
659    /**
660     * Creates a new layer stored in the specified snapshot.
661     *
662     * @param snapshot The snapshot associated with the new layer
663     * @param left The left coordinate of the layer
664     * @param top The top coordinate of the layer
665     * @param right The right coordinate of the layer
666     * @param bottom The bottom coordinate of the layer
667     * @param alpha The translucency of the layer
668     * @param mode The blending mode of the layer
669     * @param flags The layer save flags
670     * @param previousFbo The name of the current framebuffer
671     *
672     * @return True if the layer was successfully created, false otherwise
673     */
674    bool createLayer(float left, float top, float right, float bottom,
675            int alpha, SkXfermode::Mode mode, int flags, GLuint previousFbo);
676
677    /**
678     * Creates a new layer stored in the specified snapshot as an FBO.
679     *
680     * @param layer The layer to store as an FBO
681     * @param snapshot The snapshot associated with the new layer
682     * @param bounds The bounds of the layer
683     * @param previousFbo The name of the current framebuffer
684     */
685    bool createFboLayer(Layer* layer, Rect& bounds, Rect& clip, GLuint previousFbo);
686
687    /**
688     * Compose the specified layer as a region.
689     *
690     * @param layer The layer to compose
691     * @param rect The layer's bounds
692     */
693    void composeLayerRegion(Layer* layer, const Rect& rect);
694
695    /**
696     * Compose the specified layer as a simple rectangle.
697     *
698     * @param layer The layer to compose
699     * @param rect The layer's bounds
700     * @param swap If true, the source and destination are swapped
701     */
702    void composeLayerRect(Layer* layer, const Rect& rect, bool swap = false);
703
704    /**
705     * Clears all the regions corresponding to the current list of layers.
706     * This method MUST be invoked before any drawing operation.
707     */
708    void clearLayerRegions();
709
710    /**
711     * Mark the layer as dirty at the specified coordinates. The coordinates
712     * are transformed with the supplied matrix.
713     */
714    void dirtyLayer(const float left, const float top,
715            const float right, const float bottom, const mat4 transform);
716
717    /**
718     * Mark the layer as dirty at the specified coordinates.
719     */
720    void dirtyLayer(const float left, const float top,
721            const float right, const float bottom);
722
723    /**
724     * Draws a colored rectangle with the specified color. The specified coordinates
725     * are transformed by the current snapshot's transform matrix unless specified
726     * otherwise.
727     *
728     * @param left The left coordinate of the rectangle
729     * @param top The top coordinate of the rectangle
730     * @param right The right coordinate of the rectangle
731     * @param bottom The bottom coordinate of the rectangle
732     * @param color The rectangle's ARGB color, defined as a packed 32 bits word
733     * @param mode The Skia xfermode to use
734     * @param ignoreTransform True if the current transform should be ignored
735     */
736    void drawColorRect(float left, float top, float right, float bottom,
737            int color, SkXfermode::Mode mode, bool ignoreTransform = false);
738
739    /**
740     * Draws a series of colored rectangles with the specified color. The specified
741     * coordinates are transformed by the current snapshot's transform matrix unless
742     * specified otherwise.
743     *
744     * @param rects A list of rectangles, 4 floats (left, top, right, bottom)
745     *              per rectangle
746     * @param color The rectangles' ARGB color, defined as a packed 32 bits word
747     * @param mode The Skia xfermode to use
748     * @param ignoreTransform True if the current transform should be ignored
749     * @param dirty True if calling this method should dirty the current layer
750     * @param clip True if the rects should be clipped, false otherwise
751     */
752    status_t drawColorRects(const float* rects, int count, int color,
753            SkXfermode::Mode mode, bool ignoreTransform = false,
754            bool dirty = true, bool clip = true);
755
756    /**
757     * Draws the shape represented by the specified path texture.
758     * This method invokes drawPathTexture() but takes into account
759     * the extra left/top offset and the texture offset to correctly
760     * position the final shape.
761     *
762     * @param left The left coordinate of the shape to render
763     * @param top The top coordinate of the shape to render
764     * @param texture The texture reprsenting the shape
765     * @param paint The paint to draw the shape with
766     */
767    status_t drawShape(float left, float top, const PathTexture* texture, SkPaint* paint);
768
769    /**
770     * Draws the specified texture as an alpha bitmap. Alpha bitmaps obey
771     * different compositing rules.
772     *
773     * @param texture The texture to draw with
774     * @param left The x coordinate of the bitmap
775     * @param top The y coordinate of the bitmap
776     * @param paint The paint to render with
777     */
778    void drawAlphaBitmap(Texture* texture, float left, float top, SkPaint* paint);
779
780    /**
781     * Renders a strip of polygons with the specified paint, used for tessellated geometry.
782     *
783     * @param vertexBuffer The VertexBuffer to be drawn
784     * @param paint The paint to render with
785     * @param useOffset Offset the vertexBuffer (used in drawing non-AA lines)
786     */
787    status_t drawVertexBuffer(const VertexBuffer& vertexBuffer, SkPaint* paint,
788            bool useOffset = false);
789
790    /**
791     * Renders the convex hull defined by the specified path as a strip of polygons.
792     *
793     * @param path The hull of the path to draw
794     * @param paint The paint to render with
795     */
796    status_t drawConvexPath(const SkPath& path, SkPaint* paint);
797
798    /**
799     * Draws a textured rectangle with the specified texture. The specified coordinates
800     * are transformed by the current snapshot's transform matrix.
801     *
802     * @param left The left coordinate of the rectangle
803     * @param top The top coordinate of the rectangle
804     * @param right The right coordinate of the rectangle
805     * @param bottom The bottom coordinate of the rectangle
806     * @param texture The texture name to map onto the rectangle
807     * @param alpha An additional translucency parameter, between 0.0f and 1.0f
808     * @param mode The blending mode
809     * @param blend True if the texture contains an alpha channel
810     */
811    void drawTextureRect(float left, float top, float right, float bottom, GLuint texture,
812            float alpha, SkXfermode::Mode mode, bool blend);
813
814    /**
815     * Draws a textured rectangle with the specified texture. The specified coordinates
816     * are transformed by the current snapshot's transform matrix.
817     *
818     * @param left The left coordinate of the rectangle
819     * @param top The top coordinate of the rectangle
820     * @param right The right coordinate of the rectangle
821     * @param bottom The bottom coordinate of the rectangle
822     * @param texture The texture to use
823     * @param paint The paint containing the alpha, blending mode, etc.
824     */
825    void drawTextureRect(float left, float top, float right, float bottom,
826            Texture* texture, SkPaint* paint);
827
828    /**
829     * Draws a textured mesh with the specified texture. If the indices are omitted,
830     * the mesh is drawn as a simple quad. The mesh pointers become offsets when a
831     * VBO is bound.
832     *
833     * @param left The left coordinate of the rectangle
834     * @param top The top coordinate of the rectangle
835     * @param right The right coordinate of the rectangle
836     * @param bottom The bottom coordinate of the rectangle
837     * @param texture The texture name to map onto the rectangle
838     * @param alpha An additional translucency parameter, between 0.0f and 1.0f
839     * @param mode The blending mode
840     * @param blend True if the texture contains an alpha channel
841     * @param vertices The vertices that define the mesh
842     * @param texCoords The texture coordinates of each vertex
843     * @param elementsCount The number of elements in the mesh, required by indices
844     * @param swapSrcDst Whether or not the src and dst blending operations should be swapped
845     * @param ignoreTransform True if the current transform should be ignored
846     * @param vbo The VBO used to draw the mesh
847     * @param ignoreScale True if the model view matrix should not be scaled
848     * @param dirty True if calling this method should dirty the current layer
849     */
850    void drawTextureMesh(float left, float top, float right, float bottom, GLuint texture,
851            float alpha, SkXfermode::Mode mode, bool blend,
852            GLvoid* vertices, GLvoid* texCoords, GLenum drawMode, GLsizei elementsCount,
853            bool swapSrcDst = false, bool ignoreTransform = false, GLuint vbo = 0,
854            bool ignoreScale = false, bool dirty = true);
855
856    void drawIndexedTextureMesh(float left, float top, float right, float bottom, GLuint texture,
857            float alpha, SkXfermode::Mode mode, bool blend,
858            GLvoid* vertices, GLvoid* texCoords, GLenum drawMode, GLsizei elementsCount,
859            bool swapSrcDst = false, bool ignoreTransform = false, GLuint vbo = 0,
860            bool ignoreScale = false, bool dirty = true);
861
862    void drawAlpha8TextureMesh(float left, float top, float right, float bottom,
863            GLuint texture, bool hasColor, int color, int alpha, SkXfermode::Mode mode,
864            GLvoid* vertices, GLvoid* texCoords, GLenum drawMode, GLsizei elementsCount,
865            bool ignoreTransform, bool ignoreScale = false, bool dirty = true);
866
867    /**
868     * Draws the specified list of vertices as quads using indexed GL_TRIANGLES.
869     * If the number of vertices to draw exceeds the number of indices we have
870     * pre-allocated, this method will generate several glDrawElements() calls.
871     */
872    void drawIndexedQuads(Vertex* mesh, GLsizei quadsCount);
873
874    /**
875     * Draws text underline and strike-through if needed.
876     *
877     * @param text The text to decor
878     * @param bytesCount The number of bytes in the text
879     * @param totalAdvance The total advance in pixels, defines underline/strikethrough length
880     * @param x The x coordinate where the text will be drawn
881     * @param y The y coordinate where the text will be drawn
882     * @param paint The paint to draw the text with
883     */
884    void drawTextDecorations(const char* text, int bytesCount, float totalAdvance,
885            float x, float y, SkPaint* paint);
886
887   /**
888     * Draws shadow layer on text (with optional positions).
889     *
890     * @param paint The paint to draw the shadow with
891     * @param text The text to draw
892     * @param bytesCount The number of bytes in the text
893     * @param count The number of glyphs in the text
894     * @param positions The x, y positions of individual glyphs (or NULL)
895     * @param fontRenderer The font renderer object
896     * @param alpha The alpha value for drawing the shadow
897     * @param mode The xfermode for drawing the shadow
898     * @param x The x coordinate where the shadow will be drawn
899     * @param y The y coordinate where the shadow will be drawn
900     */
901    void drawTextShadow(SkPaint* paint, const char* text, int bytesCount, int count,
902            const float* positions, FontRenderer& fontRenderer, int alpha, SkXfermode::Mode mode,
903            float x, float y);
904
905    /**
906     * Draws a path texture. Path textures are alpha8 bitmaps that need special
907     * compositing to apply colors/filters/etc.
908     *
909     * @param texture The texture to render
910     * @param x The x coordinate where the texture will be drawn
911     * @param y The y coordinate where the texture will be drawn
912     * @param paint The paint to draw the texture with
913     */
914     void drawPathTexture(const PathTexture* texture, float x, float y, SkPaint* paint);
915
916    /**
917     * Resets the texture coordinates stored in mMeshVertices. Setting the values
918     * back to default is achieved by calling:
919     *
920     * resetDrawTextureTexCoords(0.0f, 0.0f, 1.0f, 1.0f);
921     *
922     * @param u1 The left coordinate of the texture
923     * @param v1 The bottom coordinate of the texture
924     * @param u2 The right coordinate of the texture
925     * @param v2 The top coordinate of the texture
926     */
927    void resetDrawTextureTexCoords(float u1, float v1, float u2, float v2);
928
929    /**
930     * Returns true if the specified paint will draw invisible text.
931     */
932    bool canSkipText(const SkPaint* paint) const;
933
934    /**
935     * Binds the specified texture. The texture unit must have been selected
936     * prior to calling this method.
937     */
938    inline void bindTexture(GLuint texture) {
939        mCaches.bindTexture(texture);
940    }
941
942    /**
943     * Binds the specified EGLImage texture. The texture unit must have been selected
944     * prior to calling this method.
945     */
946    inline void bindExternalTexture(GLuint texture) {
947        mCaches.bindTexture(GL_TEXTURE_EXTERNAL_OES, texture);
948    }
949
950    /**
951     * Enable or disable blending as necessary. This function sets the appropriate
952     * blend function based on the specified xfermode.
953     */
954    inline void chooseBlending(bool blend, SkXfermode::Mode mode, ProgramDescription& description,
955            bool swapSrcDst = false);
956
957    /**
958     * Use the specified program with the current GL context. If the program is already
959     * in use, it will not be bound again. If it is not in use, the current program is
960     * marked unused and the specified program becomes used and becomes the new
961     * current program.
962     *
963     * @param program The program to use
964     *
965     * @return true If the specified program was already in use, false otherwise.
966     */
967    inline bool useProgram(Program* program);
968
969    /**
970     * Invoked before any drawing operation. This sets required state.
971     */
972    void setupDraw(bool clear = true);
973
974    /**
975     * Various methods to setup OpenGL rendering.
976     */
977    void setupDrawWithTexture(bool isAlpha8 = false);
978    void setupDrawWithTextureAndColor(bool isAlpha8 = false);
979    void setupDrawWithExternalTexture();
980    void setupDrawNoTexture();
981    void setupDrawAA();
982    void setupDrawColor(int color, int alpha);
983    void setupDrawColor(float r, float g, float b, float a);
984    void setupDrawAlpha8Color(int color, int alpha);
985    void setupDrawTextGamma(const SkPaint* paint);
986    void setupDrawShader();
987    void setupDrawColorFilter();
988    void setupDrawBlending(SkXfermode::Mode mode = SkXfermode::kSrcOver_Mode,
989            bool swapSrcDst = false);
990    void setupDrawBlending(bool blend = true, SkXfermode::Mode mode = SkXfermode::kSrcOver_Mode,
991            bool swapSrcDst = false);
992    void setupDrawProgram();
993    void setupDrawDirtyRegionsDisabled();
994    void setupDrawModelViewIdentity(bool offset = false);
995    void setupDrawModelView(float left, float top, float right, float bottom,
996            bool ignoreTransform = false, bool ignoreModelView = false);
997    void setupDrawModelViewTranslate(float left, float top, float right, float bottom,
998            bool ignoreTransform = false);
999    void setupDrawColorUniforms();
1000    void setupDrawPureColorUniforms();
1001    void setupDrawShaderIdentityUniforms();
1002    void setupDrawShaderUniforms(bool ignoreTransform = false);
1003    void setupDrawColorFilterUniforms();
1004    void setupDrawSimpleMesh();
1005    void setupDrawTexture(GLuint texture);
1006    void setupDrawExternalTexture(GLuint texture);
1007    void setupDrawTextureTransform();
1008    void setupDrawTextureTransformUniforms(mat4& transform);
1009    void setupDrawTextGammaUniforms();
1010    void setupDrawMesh(GLvoid* vertices, GLvoid* texCoords = NULL, GLuint vbo = 0);
1011    void setupDrawMesh(GLvoid* vertices, GLvoid* texCoords, GLvoid* colors);
1012    void setupDrawMeshIndices(GLvoid* vertices, GLvoid* texCoords, GLuint vbo = 0);
1013    void setupDrawIndexedVertices(GLvoid* vertices);
1014    void accountForClear(SkXfermode::Mode mode);
1015
1016    bool updateLayer(Layer* layer, bool inFrame);
1017    void updateLayers();
1018    void flushLayers();
1019
1020    /**
1021     * Renders the specified region as a series of rectangles. This method
1022     * is used for debugging only.
1023     */
1024    void drawRegionRects(const Region& region);
1025
1026    /**
1027     * Renders the specified region as a series of rectangles. The region
1028     * must be in screen-space coordinates.
1029     */
1030    void drawRegionRects(const SkRegion& region, int color, SkXfermode::Mode mode,
1031            bool dirty = false);
1032
1033    /**
1034     * Draws the current clip region if any. Only when DEBUG_CLIP_REGIONS
1035     * is turned on.
1036     */
1037    void debugClip();
1038
1039    void debugOverdraw(bool enable, bool clear);
1040    void renderOverdraw();
1041    void countOverdraw();
1042
1043    /**
1044     * Should be invoked every time the glScissor is modified.
1045     */
1046    inline void dirtyClip() {
1047        mDirtyClip = true;
1048    }
1049
1050    inline mat4& currentTransform() const {
1051        return *mSnapshot->transform;
1052    }
1053
1054    inline const UvMapper& getMapper(const Texture* texture) {
1055        return texture && texture->uvMapper ? *texture->uvMapper : mUvMapper;
1056    }
1057
1058    /**
1059     * Returns a texture object for the specified bitmap. The texture can
1060     * come from the texture cache or an atlas. If this method returns
1061     * NULL, the texture could not be found and/or allocated.
1062     */
1063    Texture* getTexture(SkBitmap* bitmap);
1064
1065    // Dimensions of the drawing surface
1066    int mWidth, mHeight;
1067
1068    // Matrix used for ortho projection in shaders
1069    mat4 mOrthoMatrix;
1070
1071    // Model-view matrix used to position/size objects
1072    mat4 mModelView;
1073
1074    // Number of saved states
1075    int mSaveCount;
1076    // Base state
1077    sp<Snapshot> mFirstSnapshot;
1078    // Current state
1079    sp<Snapshot> mSnapshot;
1080    // State used to define the clipping region
1081    Rect mTilingClip;
1082    // Is the target render surface opaque
1083    bool mOpaque;
1084    // Is a frame currently being rendered
1085    bool mFrameStarted;
1086
1087    // Used to draw textured quads
1088    TextureVertex mMeshVertices[4];
1089
1090    // Default UV mapper
1091    const UvMapper mUvMapper;
1092
1093    // shader, filters, and shadow
1094    DrawModifiers mDrawModifiers;
1095    SkPaint mFilteredPaint;
1096
1097    // Various caches
1098    Caches& mCaches;
1099    Extensions& mExtensions;
1100
1101    // List of rectangles to clear after saveLayer() is invoked
1102    Vector<Rect*> mLayers;
1103    // List of functors to invoke after a frame is drawn
1104    SortedVector<Functor*> mFunctors;
1105    // List of layers to update at the beginning of a frame
1106    Vector<Layer*> mLayerUpdates;
1107
1108    // Indicates whether the clip must be restored
1109    bool mDirtyClip;
1110
1111    // The following fields are used to setup drawing
1112    // Used to describe the shaders to generate
1113    ProgramDescription mDescription;
1114    // Color description
1115    bool mColorSet;
1116    float mColorA, mColorR, mColorG, mColorB;
1117    // Indicates that the shader should get a color
1118    bool mSetShaderColor;
1119    // Current texture unit
1120    GLuint mTextureUnit;
1121    // Track dirty regions, true by default
1122    bool mTrackDirtyRegions;
1123    // Indicate whether we are drawing an opaque frame
1124    bool mOpaqueFrame;
1125
1126    // See PROPERTY_DISABLE_SCISSOR_OPTIMIZATION in
1127    // Properties.h
1128    bool mScissorOptimizationDisabled;
1129
1130    // No-ops start/endTiling when set
1131    bool mSuppressTiling;
1132
1133    // If true, this renderer will setup drawing to emulate
1134    // an increment stencil buffer in the color buffer
1135    bool mCountOverdraw;
1136    float mOverdraw;
1137
1138    // Optional name of the renderer
1139    String8 mName;
1140
1141    friend class DisplayListRenderer;
1142    friend class Layer;
1143    friend class TextSetupFunctor;
1144    friend class DrawBitmapOp;
1145    friend class DrawPatchOp;
1146
1147}; // class OpenGLRenderer
1148
1149}; // namespace uirenderer
1150}; // namespace android
1151
1152#endif // ANDROID_HWUI_OPENGL_RENDERER_H
1153