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