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