rsCppStructs.h revision ee0f4835e065ef08a6283e3f86cdc671a5a156c7
1/*
2 * Copyright (C) 2013 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_RSCPPSTRUCTS_H
18#define ANDROID_RSCPPSTRUCTS_H
19
20#include "rsDefines.h"
21#include "util/RefBase.h"
22#include "rsDispatch.h"
23
24#include <vector>
25#include <string>
26
27/**
28 * Every row in an RS allocation is guaranteed to be aligned by this amount, and
29 * every row in a user-backed allocation must be aligned by this amount.
30 */
31#define RS_CPU_ALLOCATION_ALIGNMENT 16
32
33namespace android {
34namespace RSC {
35
36typedef void (*ErrorHandlerFunc_t)(uint32_t errorNum, const char *errorText);
37typedef void (*MessageHandlerFunc_t)(uint32_t msgNum, const void *msgData, size_t msgLen);
38
39class RS;
40class BaseObj;
41class Element;
42class Type;
43class Allocation;
44class Script;
45class ScriptC;
46class Sampler;
47
48/**
49 * Possible error codes used by RenderScript. Once a status other than RS_SUCCESS
50 * is returned, the RenderScript context is considered dead and cannot perform any
51 * additional work.
52 */
53 enum RSError {
54     RS_SUCCESS = 0,                 ///< No error
55     RS_ERROR_INVALID_PARAMETER = 1, ///< An invalid parameter was passed to a function
56     RS_ERROR_RUNTIME_ERROR = 2,     ///< The RenderScript driver returned an error; this is
57                                     ///< often indicative of a kernel that crashed
58     RS_ERROR_INVALID_ELEMENT = 3,   ///< An invalid Element was passed to a function
59     RS_ERROR_MAX = 9999
60
61 };
62
63 /**
64  * YUV formats supported by the RenderScript API.
65  */
66 enum RSYuvFormat {
67     RS_YUV_NONE = 0, ///< No YUV data
68     RS_YUV_YV12 = 1, ///< YUV data in YV12 format
69     RS_YUV_NV21 = 2, ///< YUV data in NV21 format
70     RS_YUV_MAX = 3
71 };
72
73 /**
74  * Flags that can control RenderScript behavior on a per-context level.
75  */
76 enum RSInitFlags {
77     RS_INIT_SYNCHRONOUS = 1, ///< All RenderScript calls will be synchronous. May reduce latency.
78     RS_INIT_LOW_LATENCY = 2, ///< Prefer low latency devices over potentially higher throughput devices.
79     RS_INIT_MAX = 4
80 };
81
82 /**
83  * The RenderScript context. This class controls initialization, resource management, and teardown.
84  */
85 class RS : public android::RSC::LightRefBase<RS> {
86
87 public:
88    RS();
89    virtual ~RS();
90
91    /**
92     * Initializes a RenderScript context. A context must be initialized before it can be used.
93     * @param[in] name Directory name to be used by this context. This should be equivalent to
94     * Context.getCacheDir().
95     * @param[in] flags Optional flags for this context.
96     * @return true on success
97     */
98    bool init(std::string name, uint32_t flags = 0);
99
100    /**
101     * Sets the error handler function for this context. This error handler is
102     * called whenever an error is set.
103     *
104     * @param[in] func Error handler function
105     */
106    void setErrorHandler(ErrorHandlerFunc_t func);
107
108    /**
109     * Returns the current error handler function for this context.
110     *
111     * @return pointer to current error handler function or NULL if not set
112     */
113    ErrorHandlerFunc_t getErrorHandler() { return mErrorFunc; }
114
115    /**
116     * Sets the message handler function for this context. This message handler
117     * is called whenever a message is sent from a RenderScript kernel.
118     *
119     *  @param[in] func Message handler function
120     */
121    void setMessageHandler(MessageHandlerFunc_t func);
122
123    /**
124     * Returns the current message handler function for this context.
125     *
126     * @return pointer to current message handler function or NULL if not set
127     */
128    MessageHandlerFunc_t getMessageHandler() { return mMessageFunc; }
129
130    /**
131     * Returns current status for the context.
132     *
133     * @return current error
134     */
135    RSError getError();
136
137    /**
138     * Waits for any currently running asynchronous operations to finish. This
139     * should only be used for performance testing and timing.
140     */
141    void finish();
142
143    RsContext getContext() { return mContext; }
144    void throwError(RSError error, const char *errMsg);
145
146    static dispatchTable* dispatch;
147
148 private:
149    static bool usingNative;
150    static bool initDispatch(int targetApi);
151
152    bool init(std::string &name, int targetApi, uint32_t flags);
153    static void * threadProc(void *);
154
155    static bool gInitialized;
156    static pthread_mutex_t gInitMutex;
157
158    pthread_t mMessageThreadId;
159    pid_t mNativeMessageThreadId;
160    bool mMessageRun;
161
162    RsDevice mDev;
163    RsContext mContext;
164    RSError mCurrentError;
165
166    ErrorHandlerFunc_t mErrorFunc;
167    MessageHandlerFunc_t mMessageFunc;
168    bool mInit;
169
170    std::string mCacheDir;
171
172    struct {
173        sp<const Element> U8;
174        sp<const Element> U8_2;
175        sp<const Element> U8_3;
176        sp<const Element> U8_4;
177        sp<const Element> I8;
178        sp<const Element> I8_2;
179        sp<const Element> I8_3;
180        sp<const Element> I8_4;
181        sp<const Element> U16;
182        sp<const Element> U16_2;
183        sp<const Element> U16_3;
184        sp<const Element> U16_4;
185        sp<const Element> I16;
186        sp<const Element> I16_2;
187        sp<const Element> I16_3;
188        sp<const Element> I16_4;
189        sp<const Element> U32;
190        sp<const Element> U32_2;
191        sp<const Element> U32_3;
192        sp<const Element> U32_4;
193        sp<const Element> I32;
194        sp<const Element> I32_2;
195        sp<const Element> I32_3;
196        sp<const Element> I32_4;
197        sp<const Element> U64;
198        sp<const Element> U64_2;
199        sp<const Element> U64_3;
200        sp<const Element> U64_4;
201        sp<const Element> I64;
202        sp<const Element> I64_2;
203        sp<const Element> I64_3;
204        sp<const Element> I64_4;
205        sp<const Element> F32;
206        sp<const Element> F32_2;
207        sp<const Element> F32_3;
208        sp<const Element> F32_4;
209        sp<const Element> F64;
210        sp<const Element> F64_2;
211        sp<const Element> F64_3;
212        sp<const Element> F64_4;
213        sp<const Element> BOOLEAN;
214
215        sp<const Element> ELEMENT;
216        sp<const Element> TYPE;
217        sp<const Element> ALLOCATION;
218        sp<const Element> SAMPLER;
219        sp<const Element> SCRIPT;
220        sp<const Element> MESH;
221        sp<const Element> PROGRAM_FRAGMENT;
222        sp<const Element> PROGRAM_VERTEX;
223        sp<const Element> PROGRAM_RASTER;
224        sp<const Element> PROGRAM_STORE;
225
226        sp<const Element> A_8;
227        sp<const Element> RGB_565;
228        sp<const Element> RGB_888;
229        sp<const Element> RGBA_5551;
230        sp<const Element> RGBA_4444;
231        sp<const Element> RGBA_8888;
232
233        sp<const Element> YUV;
234
235        sp<const Element> MATRIX_4X4;
236        sp<const Element> MATRIX_3X3;
237        sp<const Element> MATRIX_2X2;
238    } mElements;
239
240    struct {
241        sp<const Sampler> CLAMP_NEAREST;
242        sp<const Sampler> CLAMP_LINEAR;
243        sp<const Sampler> CLAMP_LINEAR_MIP_LINEAR;
244        sp<const Sampler> WRAP_NEAREST;
245        sp<const Sampler> WRAP_LINEAR;
246        sp<const Sampler> WRAP_LINEAR_MIP_LINEAR;
247        sp<const Sampler> MIRRORED_REPEAT_NEAREST;
248        sp<const Sampler> MIRRORED_REPEAT_LINEAR;
249        sp<const Sampler> MIRRORED_REPEAT_LINEAR_MIP_LINEAR;
250    } mSamplers;
251    friend class Sampler;
252    friend class Element;
253    friend class ScriptC;
254};
255
256 /**
257  * Base class for all RenderScript objects. Not for direct use by developers.
258  */
259class BaseObj : public android::RSC::LightRefBase<BaseObj> {
260public:
261    void * getID() const;
262    virtual ~BaseObj();
263    virtual void updateFromNative();
264    virtual bool equals(sp<const BaseObj> obj);
265
266protected:
267    void *mID;
268    RS* mRS;
269    std::string mName;
270
271    BaseObj(void *id, sp<RS> rs);
272    void checkValid();
273
274    static void * getObjID(sp<const BaseObj> o);
275
276};
277
278 /**
279  * This class provides the primary method through which data is passed to and
280  * from RenderScript kernels. An Allocation provides the backing store for a
281  * given Type.
282  *
283  * An Allocation also contains a set of usage flags that denote how the
284  * Allocation could be used. For example, an Allocation may have usage flags
285  * specifying that it can be used from a script as well as input to a
286  * Sampler. A developer must synchronize across these different usages using
287  * syncAll(int) in order to ensure that different users of the Allocation have
288  * a consistent view of memory. For example, in the case where an Allocation is
289  * used as the output of one kernel and as Sampler input in a later kernel, a
290  * developer must call syncAll(RS_ALLOCATION_USAGE_SCRIPT) prior to launching the
291  * second kernel to ensure correctness.
292  */
293class Allocation : public BaseObj {
294protected:
295    sp<const Type> mType;
296    uint32_t mUsage;
297    sp<Allocation> mAdaptedAllocation;
298
299    bool mConstrainedLOD;
300    bool mConstrainedFace;
301    bool mConstrainedY;
302    bool mConstrainedZ;
303    bool mReadAllowed;
304    bool mWriteAllowed;
305    uint32_t mSelectedY;
306    uint32_t mSelectedZ;
307    uint32_t mSelectedLOD;
308    RsAllocationCubemapFace mSelectedFace;
309
310    uint32_t mCurrentDimX;
311    uint32_t mCurrentDimY;
312    uint32_t mCurrentDimZ;
313    uint32_t mCurrentCount;
314
315    void * getIDSafe() const;
316    void updateCacheInfo(sp<const Type> t);
317
318    Allocation(void *id, sp<RS> rs, sp<const Type> t, uint32_t usage);
319
320    void validateIsInt32();
321    void validateIsInt16();
322    void validateIsInt8();
323    void validateIsFloat32();
324    void validateIsObject();
325
326    virtual void updateFromNative();
327
328    void validate2DRange(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h);
329    void validate3DRange(uint32_t xoff, uint32_t yoff, uint32_t zoff,
330                         uint32_t w, uint32_t h, uint32_t d);
331
332public:
333
334    /**
335     * Return Type for the allocation.
336     * @return pointer to underlying Type
337     */
338    sp<const Type> getType() const {
339        return mType;
340    }
341
342    /**
343     * Propagate changes from one usage of the Allocation to other usages of the Allocation.
344     * @param[in] srcLocation source location with changes to propagate elsewhere
345     */
346    void syncAll(RsAllocationUsageType srcLocation);
347    void ioSendOutput();
348    void ioGetInput();
349
350    /**
351     * Generate a mipmap chain. This is only valid if the Type of the Allocation
352     * includes mipmaps. This function will generate a complete set of mipmaps
353     * from the top level LOD and place them into the script memory space. If
354     * the Allocation is also using other memory spaces, a call to
355     * syncAll(Allocation.USAGE_SCRIPT) is required.
356     */
357    void generateMipmaps();
358
359    /**
360     * Copy an array into part of this Allocation.
361     * @param[in] off offset of first Element to be overwritten
362     * @param[in] count number of Elements to copy
363     * @param[in] data array from which to copy
364     */
365    void copy1DRangeFrom(uint32_t off, size_t count, const void *data);
366
367    /**
368     * Copy part of an Allocation into part of this Allocation.
369     * @param[in] off offset of first Element to be overwritten
370     * @param[in] count number of Elements to copy
371     * @param[in] data Allocation from which to copy
372     * @param[in] dataOff offset of first Element in data to copy
373     */
374    void copy1DRangeFrom(uint32_t off, size_t count, sp<const Allocation> data, uint32_t dataOff);
375
376    /**
377     * Copy an array into part of this Allocation.
378     * @param[in] off offset of first Element to be overwritten
379     * @param[in] count number of Elements to copy
380     * @param[in] data array from which to copy
381     */
382    void copy1DRangeTo(uint32_t off, size_t count, void *data);
383
384    /**
385     * Copy entire array to an Allocation.
386     * @param[in] data array from which to copy
387     */
388    void copy1DFrom(const void* data);
389
390    /**
391     * Copy entire Allocation to an array.
392     * @param[in] data destination array
393     */
394    void copy1DTo(void* data);
395
396    /**
397     * Copy from an array into a rectangular region in this Allocation. The
398     * array is assumed to be tightly packed.
399     * @param[in] xoff X offset of region to update in this Allocation
400     * @param[in] yoff Y offset of region to update in this Allocation
401     * @param[in] w Width of region to update
402     * @param[in] h Height of region to update
403     * @param[in] data Array from which to copy
404     */
405    void copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
406                         const void *data);
407
408    /**
409     * Copy from this Allocation into a rectangular region in an array. The
410     * array is assumed to be tightly packed.
411     * @param[in] xoff X offset of region to copy from this Allocation
412     * @param[in] yoff Y offset of region to copy from this Allocation
413     * @param[in] w Width of region to update
414     * @param[in] h Height of region to update
415     * @param[in] data destination array
416     */
417    void copy2DRangeTo(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
418                       void *data);
419
420    /**
421     * Copy from an Allocation into a rectangular region in this Allocation.
422     * @param[in] xoff X offset of region to update in this Allocation
423     * @param[in] yoff Y offset of region to update in this Allocation
424     * @param[in] w Width of region to update
425     * @param[in] h Height of region to update
426     * @param[in] data Allocation from which to copy
427     * @param[in] dataXoff X offset of region to copy from in data
428     * @param[in] dataYoff Y offset of region to copy from in data
429     */
430    void copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
431                         sp<const Allocation> data, uint32_t dataXoff, uint32_t dataYoff);
432
433    /**
434     * Copy from a strided array into a rectangular region in this Allocation.
435     * @param[in] xoff X offset of region to update in this Allocation
436     * @param[in] yoff Y offset of region to update in this Allocation
437     * @param[in] w Width of region to update
438     * @param[in] h Height of region to update
439     * @param[in] data array from which to copy
440     * @param[in] stride stride of data in bytes
441     */
442    void copy2DStridedFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
443                           const void *data, size_t stride);
444
445    /**
446     * Copy from a strided array into this Allocation.
447     * @param[in] data array from which to copy
448     * @param[in] stride stride of data in bytes
449     */
450    void copy2DStridedFrom(const void *data, size_t stride);
451
452    /**
453     * Copy from a rectangular region in this Allocation into a strided array.
454     * @param[in] xoff X offset of region to update in this Allocation
455     * @param[in] yoff Y offset of region to update in this Allocation
456     * @param[in] w Width of region to update
457     * @param[in] h Height of region to update
458     * @param[in] data destination array
459     * @param[in] stride stride of data in bytes
460     */
461    void copy2DStridedTo(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
462                         void *data, size_t stride);
463
464    /**
465     * Copy this Allocation into a strided array.
466     * @param[in] data destination array
467     * @param[in] stride stride of data in bytes
468     */
469    void copy2DStridedTo(void *data, size_t stride);
470
471
472    /**
473     * Copy from an array into a 3D region in this Allocation. The
474     * array is assumed to be tightly packed.
475     * @param[in] xoff X offset of region to update in this Allocation
476     * @param[in] yoff Y offset of region to update in this Allocation
477     * @param[in] zoff Z offset of region to update in this Allocation
478     * @param[in] w Width of region to update
479     * @param[in] h Height of region to update
480     * @param[in] d Depth of region to update
481     * @param[in] data Array from which to copy
482     */
483    void copy3DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t zoff, uint32_t w,
484                         uint32_t h, uint32_t d, const void* data);
485
486    /**
487     * Copy from an Allocation into a 3D region in this Allocation.
488     * @param[in] xoff X offset of region to update in this Allocation
489     * @param[in] yoff Y offset of region to update in this Allocation
490     * @param[in] zoff Z offset of region to update in this Allocation
491     * @param[in] w Width of region to update
492     * @param[in] h Height of region to update
493     * @param[in] d Depth of region to update
494     * @param[in] data Allocation from which to copy
495     * @param[in] dataXoff X offset of region in data to copy from
496     * @param[in] dataYoff Y offset of region in data to copy from
497     * @param[in] dataZoff Z offset of region in data to copy from
498     */
499    void copy3DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t zoff,
500                         uint32_t w, uint32_t h, uint32_t d,
501                         sp<const Allocation> data,
502                         uint32_t dataXoff, uint32_t dataYoff, uint32_t dataZoff);
503
504    /**
505     * Creates an Allocation for use by scripts with a given Type.
506     * @param[in] rs Context to which the Allocation will belong
507     * @param[in] type Type of the Allocation
508     * @param[in] mipmaps desired mipmap behavior for the Allocation
509     * @param[in] usage usage for the Allocation
510     * @return new Allocation
511     */
512    static sp<Allocation> createTyped(sp<RS> rs, sp<const Type> type,
513                                   RsAllocationMipmapControl mipmaps, uint32_t usage);
514
515    /**
516     * Creates an Allocation for use by scripts with a given Type and a backing pointer. For use
517     * with RS_ALLOCATION_USAGE_SHARED.
518     * @param[in] rs Context to which the Allocation will belong
519     * @param[in] type Type of the Allocation
520     * @param[in] mipmaps desired mipmap behavior for the Allocation
521     * @param[in] usage usage for the Allocation
522     * @param[in] pointer existing backing store to use for this Allocation if possible
523     * @return new Allocation
524     */
525    static sp<Allocation> createTyped(sp<RS> rs, sp<const Type> type,
526                                   RsAllocationMipmapControl mipmaps, uint32_t usage, void * pointer);
527
528    /**
529     * Creates an Allocation for use by scripts with a given Type with no mipmaps.
530     * @param[in] rs Context to which the Allocation will belong
531     * @param[in] type Type of the Allocation
532     * @param[in] usage usage for the Allocation
533     * @return new Allocation
534     */
535    static sp<Allocation> createTyped(sp<RS> rs, sp<const Type> type,
536                                   uint32_t usage = RS_ALLOCATION_USAGE_SCRIPT);
537    /**
538     * Creates an Allocation with a specified number of given elements.
539     * @param[in] rs Context to which the Allocation will belong
540     * @param[in] e Element used in the Allocation
541     * @param[in] count Number of elements of the Allocation
542     * @param[in] usage usage for the Allocation
543     * @return new Allocation
544     */
545    static sp<Allocation> createSized(sp<RS> rs, sp<const Element> e, size_t count,
546                                   uint32_t usage = RS_ALLOCATION_USAGE_SCRIPT);
547
548    /**
549     * Creates a 2D Allocation with a specified number of given elements.
550     * @param[in] rs Context to which the Allocation will belong
551     * @param[in] e Element used in the Allocation
552     * @param[in] x Width in Elements of the Allocation
553     * @param[in] y Height of the Allocation
554     * @param[in] usage usage for the Allocation
555     * @return new Allocation
556     */
557    static sp<Allocation> createSized2D(sp<RS> rs, sp<const Element> e,
558                                        size_t x, size_t y,
559                                        uint32_t usage = RS_ALLOCATION_USAGE_SCRIPT);
560
561
562    /**
563     * Get the backing pointer for a USAGE_SHARED allocation.
564     * @param[in] stride optional parameter. when non-NULL, will contain
565     *   stride in bytes of a 2D Allocation
566     * @return pointer to data
567     */
568    void * getPointer(size_t *stride = NULL);
569};
570
571 /**
572  * An Element represents one item within an Allocation. An Element is roughly
573  * equivalent to a C type in a RenderScript kernel. Elements may be basic
574  * or complex. Some basic elements are:
575
576  * - A single float value (equivalent to a float in a kernel)
577  * - A four-element float vector (equivalent to a float4 in a kernel)
578  * - An unsigned 32-bit integer (equivalent to an unsigned int in a kernel)
579  * - A single signed 8-bit integer (equivalent to a char in a kernel)
580
581  * Basic Elements are comprised of a Element.DataType and a
582  * Element.DataKind. The DataType encodes C type information of an Element,
583  * while the DataKind encodes how that Element should be interpreted by a
584  * Sampler. Note that Allocation objects with DataKind USER cannot be used as
585  * input for a Sampler. In general, Allocation objects that are intended for
586  * use with a Sampler should use bitmap-derived Elements such as
587  * Element::RGBA_8888.
588 */
589
590
591class Element : public BaseObj {
592public:
593    bool isComplex();
594
595    /**
596     * Elements could be simple, such as an int or a float, or a structure with
597     * multiple sub-elements, such as a collection of floats, float2,
598     * float4. This function returns zero for simple elements or the number of
599     * sub-elements otherwise.
600     * @return number of sub-elements
601     */
602    size_t getSubElementCount() {
603        return mVisibleElementMap.size();
604    }
605
606    /**
607     * For complex Elements, this returns the sub-element at a given index.
608     * @param[in] index index of sub-element
609     * @return sub-element
610     */
611    sp<const Element> getSubElement(uint32_t index);
612
613    /**
614     * For complex Elements, this returns the name of the sub-element at a given
615     * index.
616     * @param[in] index index of sub-element
617     * @return name of sub-element
618     */
619    const char * getSubElementName(uint32_t index);
620
621    /**
622     * For complex Elements, this returns the size of the sub-element at a given
623     * index.
624     * @param[in] index index of sub-element
625     * @return size of sub-element
626     */
627    size_t getSubElementArraySize(uint32_t index);
628
629    /**
630     * Returns the location of a sub-element within a complex Element.
631     * @param[in] index index of sub-element
632     * @return offset in bytes
633     */
634    uint32_t getSubElementOffsetBytes(uint32_t index);
635
636    /**
637     * Returns the data type used for the Element.
638     * @return data type
639     */
640    RsDataType getDataType() const {
641        return mType;
642    }
643
644    /**
645     * Returns the data kind used for the Element.
646     * @return data kind
647     */
648    RsDataKind getDataKind() const {
649        return mKind;
650    }
651
652    /**
653     * Returns the size in bytes of the Element.
654     * @return size in bytes
655     */
656    size_t getSizeBytes() const {
657        return mSizeBytes;
658    }
659
660    /**
661     * Returns the number of vector components for this Element.
662     * @return number of vector components
663     */
664    uint32_t getVectorSize() const {
665        return mVectorSize;
666    }
667
668    /**
669     * Utility function for returning an Element containing a single bool.
670     * @param[in] rs RenderScript context
671     * @return Element
672     */
673    static sp<const Element> BOOLEAN(sp<RS> rs);
674    /**
675     * Utility function for returning an Element containing a single unsigned char.
676     * @param[in] rs RenderScript context
677     * @return Element
678     */
679    static sp<const Element> U8(sp<RS> rs);
680    /**
681     * Utility function for returning an Element containing a single signed char.
682     * @param[in] rs RenderScript context
683     * @return Element
684     */
685    static sp<const Element> I8(sp<RS> rs);
686    /**
687     * Utility function for returning an Element containing a single unsigned short.
688     * @param[in] rs RenderScript context
689     * @return Element
690     */
691    static sp<const Element> U16(sp<RS> rs);
692    /**
693     * Utility function for returning an Element containing a single signed short.
694     * @param[in] rs RenderScript context
695     * @return Element
696     */
697    static sp<const Element> I16(sp<RS> rs);
698    /**
699     * Utility function for returning an Element containing a single unsigned int.
700     * @param[in] rs RenderScript context
701     * @return Element
702     */
703    static sp<const Element> U32(sp<RS> rs);
704    /**
705     * Utility function for returning an Element containing a single signed int.
706     * @param[in] rs RenderScript context
707     * @return Element
708     */
709    static sp<const Element> I32(sp<RS> rs);
710    /**
711     * Utility function for returning an Element containing a single unsigned long long.
712     * @param[in] rs RenderScript context
713     * @return Element
714     */
715    static sp<const Element> U64(sp<RS> rs);
716    /**
717     * Utility function for returning an Element containing a single signed long long.
718     * @param[in] rs RenderScript context
719     * @return Element
720     */
721    static sp<const Element> I64(sp<RS> rs);
722    /**
723     * Utility function for returning an Element containing a single float.
724     * @param[in] rs RenderScript context
725     * @return Element
726     */
727    static sp<const Element> F32(sp<RS> rs);
728    /**
729     * Utility function for returning an Element containing a single double.
730     * @param[in] rs RenderScript context
731     * @return Element
732     */
733    static sp<const Element> F64(sp<RS> rs);
734    /**
735     * Utility function for returning an Element containing a single Element.
736     * @param[in] rs RenderScript context
737     * @return Element
738     */
739    static sp<const Element> ELEMENT(sp<RS> rs);
740    /**
741     * Utility function for returning an Element containing a single Type.
742     * @param[in] rs RenderScript context
743     * @return Element
744     */
745    static sp<const Element> TYPE(sp<RS> rs);
746    /**
747     * Utility function for returning an Element containing a single Allocation.
748     * @param[in] rs RenderScript context
749     * @return Element
750     */
751    static sp<const Element> ALLOCATION(sp<RS> rs);
752    /**
753     * Utility function for returning an Element containing a single Sampler.
754     * @param[in] rs RenderScript context
755     * @return Element
756     */
757    static sp<const Element> SAMPLER(sp<RS> rs);
758    /**
759     * Utility function for returning an Element containing a single Script.
760     * @param[in] rs RenderScript context
761     * @return Element
762     */
763    static sp<const Element> SCRIPT(sp<RS> rs);
764    /**
765     * Utility function for returning an Element containing an ALPHA_8 pixel.
766     * @param[in] rs RenderScript context
767     * @return Element
768     */
769    static sp<const Element> A_8(sp<RS> rs);
770    /**
771     * Utility function for returning an Element containing an RGB_565 pixel.
772     * @param[in] rs RenderScript context
773     * @return Element
774     */
775    static sp<const Element> RGB_565(sp<RS> rs);
776    /**
777     * Utility function for returning an Element containing an RGB_888 pixel.
778     * @param[in] rs RenderScript context
779     * @return Element
780     */
781    static sp<const Element> RGB_888(sp<RS> rs);
782    /**
783     * Utility function for returning an Element containing an RGBA_5551 pixel.
784     * @param[in] rs RenderScript context
785     * @return Element
786     */
787    static sp<const Element> RGBA_5551(sp<RS> rs);
788    /**
789     * Utility function for returning an Element containing an RGBA_4444 pixel.
790     * @param[in] rs RenderScript context
791     * @return Element
792     */
793    static sp<const Element> RGBA_4444(sp<RS> rs);
794    /**
795     * Utility function for returning an Element containing an RGBA_8888 pixel.
796     * @param[in] rs RenderScript context
797     * @return Element
798     */
799    static sp<const Element> RGBA_8888(sp<RS> rs);
800
801    /**
802     * Utility function for returning an Element containing a float2.
803     * @param[in] rs RenderScript context
804     * @return Element
805     */
806    static sp<const Element> F32_2(sp<RS> rs);
807    /**
808     * Utility function for returning an Element containing a float3.
809     * @param[in] rs RenderScript context
810     * @return Element
811     */
812    static sp<const Element> F32_3(sp<RS> rs);
813    /**
814     * Utility function for returning an Element containing a float4.
815     * @param[in] rs RenderScript context
816     * @return Element
817     */
818    static sp<const Element> F32_4(sp<RS> rs);
819    /**
820     * Utility function for returning an Element containing a double2.
821     * @param[in] rs RenderScript context
822     * @return Element
823     */
824    static sp<const Element> F64_2(sp<RS> rs);
825    /**
826     * Utility function for returning an Element containing a double3.
827     * @param[in] rs RenderScript context
828     * @return Element
829     */
830    static sp<const Element> F64_3(sp<RS> rs);
831    /**
832     * Utility function for returning an Element containing a double4.
833     * @param[in] rs RenderScript context
834     * @return Element
835     */
836    static sp<const Element> F64_4(sp<RS> rs);
837    /**
838     * Utility function for returning an Element containing a uchar2.
839     * @param[in] rs RenderScript context
840     * @return Element
841     */
842    static sp<const Element> U8_2(sp<RS> rs);
843    /**
844     * Utility function for returning an Element containing a uchar3.
845     * @param[in] rs RenderScript context
846     * @return Element
847     */
848    static sp<const Element> U8_3(sp<RS> rs);
849    /**
850     * Utility function for returning an Element containing a uchar4.
851     * @param[in] rs RenderScript context
852     * @return Element
853     */
854    static sp<const Element> U8_4(sp<RS> rs);
855    /**
856     * Utility function for returning an Element containing a char2.
857     * @param[in] rs RenderScript context
858     * @return Element
859     */
860    static sp<const Element> I8_2(sp<RS> rs);
861    /**
862     * Utility function for returning an Element containing a char3.
863     * @param[in] rs RenderScript context
864     * @return Element
865     */
866    static sp<const Element> I8_3(sp<RS> rs);
867    /**
868     * Utility function for returning an Element containing a char4.
869     * @param[in] rs RenderScript context
870     * @return Element
871     */
872    static sp<const Element> I8_4(sp<RS> rs);
873    /**
874     * Utility function for returning an Element containing a ushort2.
875     * @param[in] rs RenderScript context
876     * @return Element
877     */
878    static sp<const Element> U16_2(sp<RS> rs);
879    /**
880     * Utility function for returning an Element containing a ushort3.
881     * @param[in] rs RenderScript context
882     * @return Element
883     */
884    static sp<const Element> U16_3(sp<RS> rs);
885    /**
886     * Utility function for returning an Element containing a ushort4.
887     * @param[in] rs RenderScript context
888     * @return Element
889     */
890    static sp<const Element> U16_4(sp<RS> rs);
891    /**
892     * Utility function for returning an Element containing a short2.
893     * @param[in] rs RenderScript context
894     * @return Element
895     */
896    static sp<const Element> I16_2(sp<RS> rs);
897    /**
898     * Utility function for returning an Element containing a short3.
899     * @param[in] rs RenderScript context
900     * @return Element
901     */
902    static sp<const Element> I16_3(sp<RS> rs);
903    /**
904     * Utility function for returning an Element containing a short4.
905     * @param[in] rs RenderScript context
906     * @return Element
907     */
908    static sp<const Element> I16_4(sp<RS> rs);
909    /**
910     * Utility function for returning an Element containing a uint2.
911     * @param[in] rs RenderScript context
912     * @return Element
913     */
914    static sp<const Element> U32_2(sp<RS> rs);
915    /**
916     * Utility function for returning an Element containing a uint3.
917     * @param[in] rs RenderScript context
918     * @return Element
919     */
920    static sp<const Element> U32_3(sp<RS> rs);
921    /**
922     * Utility function for returning an Element containing a uint4.
923     * @param[in] rs RenderScript context
924     * @return Element
925     */
926    static sp<const Element> U32_4(sp<RS> rs);
927    /**
928     * Utility function for returning an Element containing an int2.
929     * @param[in] rs RenderScript context
930     * @return Element
931     */
932    static sp<const Element> I32_2(sp<RS> rs);
933    /**
934     * Utility function for returning an Element containing an int3.
935     * @param[in] rs RenderScript context
936     * @return Element
937     */
938    static sp<const Element> I32_3(sp<RS> rs);
939    /**
940     * Utility function for returning an Element containing an int4.
941     * @param[in] rs RenderScript context
942     * @return Element
943     */
944    static sp<const Element> I32_4(sp<RS> rs);
945    /**
946     * Utility function for returning an Element containing a ulong2.
947     * @param[in] rs RenderScript context
948     * @return Element
949     */
950    static sp<const Element> U64_2(sp<RS> rs);
951    /**
952     * Utility function for returning an Element containing a ulong3.
953     * @param[in] rs RenderScript context
954     * @return Element
955     */
956    static sp<const Element> U64_3(sp<RS> rs);
957    /**
958     * Utility function for returning an Element containing a ulong4.
959     * @param[in] rs RenderScript context
960     * @return Element
961     */
962    static sp<const Element> U64_4(sp<RS> rs);
963    /**
964     * Utility function for returning an Element containing a long2.
965     * @param[in] rs RenderScript context
966     * @return Element
967     */
968    static sp<const Element> I64_2(sp<RS> rs);
969    /**
970     * Utility function for returning an Element containing a long3.
971     * @param[in] rs RenderScript context
972     * @return Element
973     */
974    static sp<const Element> I64_3(sp<RS> rs);
975    /**
976     * Utility function for returning an Element containing a long4.
977     * @param[in] rs RenderScript context
978     * @return Element
979     */
980    static sp<const Element> I64_4(sp<RS> rs);
981    /**
982     * Utility function for returning an Element containing a YUV pixel.
983     * @param[in] rs RenderScript context
984     * @return Element
985     */
986    static sp<const Element> YUV(sp<RS> rs);
987    /**
988     * Utility function for returning an Element containing an rs_matrix_4x4.
989     * @param[in] rs RenderScript context
990     * @return Element
991     */
992    static sp<const Element> MATRIX_4X4(sp<RS> rs);
993    /**
994     * Utility function for returning an Element containing an rs_matrix_3x3.
995     * @param[in] rs RenderScript context
996     * @return Element
997     */
998    static sp<const Element> MATRIX_3X3(sp<RS> rs);
999    /**
1000     * Utility function for returning an Element containing an rs_matrix_2x2.
1001     * @param[in] rs RenderScript context
1002     * @return Element
1003     */
1004    static sp<const Element> MATRIX_2X2(sp<RS> rs);
1005
1006    void updateFromNative();
1007
1008    /**
1009     * Create an Element with a given DataType.
1010     * @param[in] rs RenderScript context
1011     * @param[in] dt data type
1012     * @return Element
1013     */
1014    static sp<const Element> createUser(sp<RS> rs, RsDataType dt);
1015    /**
1016     * Create a vector Element with the given DataType
1017     * @param[in] rs RenderScript
1018     * @param[in] dt DataType
1019     * @param[in] size vector size
1020     * @return Element
1021     */
1022    static sp<const Element> createVector(sp<RS> rs, RsDataType dt, uint32_t size);
1023    /**
1024     * Create an Element with a given DataType and DataKind.
1025     * @param[in] rs RenderScript context
1026     * @param[in] dt DataType
1027     * @param[in] dk DataKind
1028     * @return Element
1029     */
1030    static sp<const Element> createPixel(sp<RS> rs, RsDataType dt, RsDataKind dk);
1031
1032    /**
1033     * Returns true if the Element can interoperate with this Element.
1034     * @param[in] e Element to compare
1035     * @return true if Elements can interoperate
1036     */
1037    bool isCompatible(sp<const Element>e) const;
1038
1039    /**
1040     * Builder class for producing complex elements with matching field and name
1041     * pairs. The builder starts empty. The order in which elements are added is
1042     * retained for the layout in memory.
1043     */
1044    class Builder {
1045    private:
1046        RS* mRS;
1047        std::vector<sp<Element> > mElements;
1048        std::vector<std::string> mElementNames;
1049        std::vector<uint32_t> mArraySizes;
1050        bool mSkipPadding;
1051
1052    public:
1053        Builder(sp<RS> rs);
1054        ~Builder();
1055        void add(sp<Element> e, std::string &name, uint32_t arraySize = 1);
1056        sp<const Element> create();
1057    };
1058
1059protected:
1060    Element(void *id, sp<RS> rs,
1061            std::vector<sp<Element> > &elements,
1062            std::vector<std::string> &elementNames,
1063            std::vector<uint32_t> &arraySizes);
1064    Element(void *id, sp<RS> rs, RsDataType dt, RsDataKind dk, bool norm, uint32_t size);
1065    Element(sp<RS> rs);
1066    virtual ~Element();
1067
1068private:
1069    void updateVisibleSubElements();
1070
1071    std::vector<sp<Element> > mElements;
1072    std::vector<std::string> mElementNames;
1073    std::vector<uint32_t> mArraySizes;
1074    std::vector<uint32_t> mVisibleElementMap;
1075    std::vector<uint32_t> mOffsetInBytes;
1076
1077    RsDataType mType;
1078    RsDataKind mKind;
1079    bool mNormalized;
1080    size_t mSizeBytes;
1081    size_t mVectorSize;
1082};
1083
1084class FieldPacker {
1085protected:
1086    unsigned char* mData;
1087    size_t mPos;
1088    size_t mLen;
1089
1090public:
1091    FieldPacker(size_t len)
1092        : mPos(0), mLen(len) {
1093            mData = new unsigned char[len];
1094        }
1095
1096    virtual ~FieldPacker() {
1097        delete [] mData;
1098    }
1099
1100    void align(size_t v) {
1101        if ((v & (v - 1)) != 0) {
1102            //            ALOGE("Non-power-of-two alignment: %zu", v);
1103            return;
1104        }
1105
1106        while ((mPos & (v - 1)) != 0) {
1107            mData[mPos++] = 0;
1108        }
1109    }
1110
1111    void reset() {
1112        mPos = 0;
1113    }
1114
1115    void reset(size_t i) {
1116        if (i >= mLen) {
1117            //            ALOGE("Out of bounds: i (%zu) >= len (%zu)", i, mLen);
1118            return;
1119        }
1120        mPos = i;
1121    }
1122
1123    void skip(size_t i) {
1124        size_t res = mPos + i;
1125        if (res > mLen) {
1126            //            ALOGE("Exceeded buffer length: i (%zu) > len (%zu)", i, mLen);
1127            return;
1128        }
1129        mPos = res;
1130    }
1131
1132    void* getData() const {
1133        return mData;
1134    }
1135
1136    size_t getLength() const {
1137        return mLen;
1138    }
1139
1140    template <typename T>
1141        void add(T t) {
1142        align(sizeof(t));
1143        if (mPos + sizeof(t) <= mLen) {
1144            memcpy(&mData[mPos], &t, sizeof(t));
1145            mPos += sizeof(t);
1146        }
1147    }
1148
1149    /*
1150      void add(rs_matrix4x4 m) {
1151      for (size_t i = 0; i < 16; i++) {
1152      add(m.m[i]);
1153      }
1154      }
1155
1156      void add(rs_matrix3x3 m) {
1157      for (size_t i = 0; i < 9; i++) {
1158      add(m.m[i]);
1159      }
1160      }
1161
1162      void add(rs_matrix2x2 m) {
1163      for (size_t i = 0; i < 4; i++) {
1164      add(m.m[i]);
1165      }
1166      }
1167    */
1168
1169    void add(sp<BaseObj> obj) {
1170        if (obj != NULL) {
1171            add((uint32_t) (uintptr_t) obj->getID());
1172        } else {
1173            add((uint32_t) 0);
1174        }
1175    }
1176};
1177
1178/**
1179 * A Type describes the Element and dimensions used for an Allocation or a
1180 * parallel operation.
1181 *
1182 * A Type always includes an Element and an X dimension. A Type may be
1183 * multidimensional, up to three dimensions. A nonzero value in the Y or Z
1184 * dimensions indicates that the dimension is present. Note that a Type with
1185 * only a given X dimension and a Type with the same X dimension but Y = 1 are
1186 * not equivalent.
1187 *
1188 * A Type also supports inclusion of level of detail (LOD) or cube map
1189 * faces. LOD and cube map faces are booleans to indicate present or not
1190 * present.
1191 *
1192 * A Type also supports YUV format information to support an Allocation in a YUV
1193 * format. The YUV formats supported are YV12 and NV21.
1194 */
1195class Type : public BaseObj {
1196protected:
1197    friend class Allocation;
1198
1199    uint32_t mDimX;
1200    uint32_t mDimY;
1201    uint32_t mDimZ;
1202    RSYuvFormat mYuvFormat;
1203    bool mDimMipmaps;
1204    bool mDimFaces;
1205    size_t mElementCount;
1206    sp<const Element> mElement;
1207
1208    Type(void *id, sp<RS> rs);
1209
1210    void calcElementCount();
1211    virtual void updateFromNative();
1212
1213public:
1214
1215    /**
1216     * Returns the YUV format.
1217     * @return YUV format of the Allocation
1218     */
1219    RSYuvFormat getYuvFormat() const {
1220        return mYuvFormat;
1221    }
1222
1223    /**
1224     * Returns the Element of the Allocation.
1225     * @return YUV format of the Allocation
1226     */
1227    sp<const Element> getElement() const {
1228        return mElement;
1229    }
1230
1231    /**
1232     * Returns the X dimension of the Allocation.
1233     * @return X dimension of the allocation
1234     */
1235    uint32_t getX() const {
1236        return mDimX;
1237    }
1238
1239    /**
1240     * Returns the Y dimension of the Allocation.
1241     * @return Y dimension of the allocation
1242     */
1243    uint32_t getY() const {
1244        return mDimY;
1245    }
1246
1247    /**
1248     * Returns the Z dimension of the Allocation.
1249     * @return Z dimension of the allocation
1250     */
1251    uint32_t getZ() const {
1252        return mDimZ;
1253    }
1254
1255    /**
1256     * Returns true if the Allocation has mipmaps.
1257     * @return true if the Allocation has mipmaps
1258     */
1259    bool hasMipmaps() const {
1260        return mDimMipmaps;
1261    }
1262
1263    /**
1264     * Returns true if the Allocation is a cube map
1265     * @return true if the Allocation is a cube map
1266     */
1267    bool hasFaces() const {
1268        return mDimFaces;
1269    }
1270
1271    /**
1272     * Returns number of accessible Elements in the Allocation
1273     * @return number of accessible Elements in the Allocation
1274     */
1275    size_t getCount() const {
1276        return mElementCount;
1277    }
1278
1279    /**
1280     * Returns size in bytes of all Elements in the Allocation
1281     * @return size in bytes of all Elements in the Allocation
1282     */
1283    size_t getSizeBytes() const {
1284        return mElementCount * mElement->getSizeBytes();
1285    }
1286
1287    /**
1288     * Creates a new Type with the given Element and dimensions.
1289     * @param[in] rs RenderScript context
1290     * @param[in] e Element
1291     * @param[in] dimX X dimension
1292     * @param[in] dimY Y dimension
1293     * @param[in] dimZ Z dimension
1294     * @return new Type
1295     */
1296    static sp<const Type> create(sp<RS> rs, sp<const Element> e, uint32_t dimX, uint32_t dimY, uint32_t dimZ);
1297
1298    class Builder {
1299    protected:
1300        RS* mRS;
1301        uint32_t mDimX;
1302        uint32_t mDimY;
1303        uint32_t mDimZ;
1304        RSYuvFormat mYuvFormat;
1305        bool mDimMipmaps;
1306        bool mDimFaces;
1307        sp<const Element> mElement;
1308
1309    public:
1310        Builder(sp<RS> rs, sp<const Element> e);
1311
1312        void setX(uint32_t value);
1313        void setY(uint32_t value);
1314        void setZ(uint32_t value);
1315        void setYuvFormat(RSYuvFormat format);
1316        void setMipmaps(bool value);
1317        void setFaces(bool value);
1318        sp<const Type> create();
1319    };
1320
1321};
1322
1323/**
1324 * The parent class for all executable Scripts. This should not be used by applications.
1325 */
1326class Script : public BaseObj {
1327private:
1328
1329protected:
1330    Script(void *id, sp<RS> rs);
1331    void forEach(uint32_t slot, sp<const Allocation> in, sp<const Allocation> out,
1332            const void *v, size_t) const;
1333    void bindAllocation(sp<Allocation> va, uint32_t slot) const;
1334    void setVar(uint32_t index, const void *, size_t len) const;
1335    void setVar(uint32_t index, sp<const BaseObj> o) const;
1336    void invoke(uint32_t slot, const void *v, size_t len) const;
1337
1338
1339    void invoke(uint32_t slot) const {
1340        invoke(slot, NULL, 0);
1341    }
1342    void setVar(uint32_t index, float v) const {
1343        setVar(index, &v, sizeof(v));
1344    }
1345    void setVar(uint32_t index, double v) const {
1346        setVar(index, &v, sizeof(v));
1347    }
1348    void setVar(uint32_t index, int32_t v) const {
1349        setVar(index, &v, sizeof(v));
1350    }
1351    void setVar(uint32_t index, int64_t v) const {
1352        setVar(index, &v, sizeof(v));
1353    }
1354    void setVar(uint32_t index, bool v) const {
1355        setVar(index, &v, sizeof(v));
1356    }
1357
1358public:
1359    class FieldBase {
1360    protected:
1361        sp<const Element> mElement;
1362        sp<Allocation> mAllocation;
1363
1364        void init(sp<RS> rs, uint32_t dimx, uint32_t usages = 0);
1365
1366    public:
1367        sp<const Element> getElement() {
1368            return mElement;
1369        }
1370
1371        sp<const Type> getType() {
1372            return mAllocation->getType();
1373        }
1374
1375        sp<const Allocation> getAllocation() {
1376            return mAllocation;
1377        }
1378
1379        //void updateAllocation();
1380    };
1381};
1382
1383/**
1384 * The parent class for all user-defined scripts. This is intended to be used by auto-generated code only.
1385 */
1386class ScriptC : public Script {
1387protected:
1388    ScriptC(sp<RS> rs,
1389            const void *codeTxt, size_t codeLength,
1390            const char *cachedName, size_t cachedNameLength,
1391            const char *cacheDir, size_t cacheDirLength);
1392
1393};
1394
1395/**
1396 * The parent class for all script intrinsics. Intrinsics provide highly optimized implementations of
1397 * basic functions. This is not intended to be used directly.
1398 */
1399class ScriptIntrinsic : public Script {
1400 protected:
1401    sp<const Element> mElement;
1402    ScriptIntrinsic(sp<RS> rs, int id, sp<const Element> e);
1403    virtual ~ScriptIntrinsic();
1404};
1405
1406/**
1407 * Intrinsic for converting RGB to RGBA by using a 3D lookup table. The incoming
1408 * r,g,b values are use as normalized x,y,z coordinates into a 3D
1409 * allocation. The 8 nearest values are sampled and linearly interpolated. The
1410 * result is placed in the output.
1411 */
1412class ScriptIntrinsic3DLUT : public ScriptIntrinsic {
1413 private:
1414    ScriptIntrinsic3DLUT(sp<RS> rs, sp<const Element> e);
1415 public:
1416    /**
1417     * Supported Element types are U8_4. Default lookup table is identity.
1418     * @param[in] rs RenderScript context
1419     * @param[in] e Element
1420     * @return new ScriptIntrinsic
1421     */
1422    static sp<ScriptIntrinsic3DLUT> create(sp<RS> rs, sp<const Element> e);
1423
1424    /**
1425     * Launch the intrinsic.
1426     * @param[in] ain input Allocation
1427     * @param[in] aout output Allocation
1428     */
1429    void forEach(sp<Allocation> ain, sp<Allocation> aout);
1430
1431    /**
1432     * Sets the lookup table. The lookup table must use the same Element as the
1433     * intrinsic.
1434     * @param[in] lut new lookup table
1435     */
1436    void setLUT(sp<Allocation> lut);
1437};
1438
1439/**
1440 * Intrinsic kernel for blending two Allocations.
1441 */
1442class ScriptIntrinsicBlend : public ScriptIntrinsic {
1443 private:
1444    ScriptIntrinsicBlend(sp<RS> rs, sp<const Element> e);
1445 public:
1446    /**
1447     * Supported Element types are U8_4.
1448     * @param[in] rs RenderScript context
1449     * @param[in] e Element
1450     * @return new ScriptIntrinsicBlend
1451     */
1452    static sp<ScriptIntrinsicBlend> create(sp<RS> rs, sp<const Element> e);
1453    /**
1454     * sets dst = {0, 0, 0, 0}
1455     * @param[in] in input Allocation
1456     * @param[in] out output Allocation
1457     */
1458    void forEachClear(sp<Allocation> in, sp<Allocation> out);
1459    /**
1460     * Sets dst = src
1461     * @param[in] in input Allocation
1462     * @param[in] out output Allocation
1463     */
1464    void forEachSrc(sp<Allocation> in, sp<Allocation> out);
1465    /**
1466     * Sets dst = dst (NOP)
1467     * @param[in] in input Allocation
1468     * @param[in] out output Allocation
1469     */
1470    void forEachDst(sp<Allocation> in, sp<Allocation> out);
1471    /**
1472     * Sets dst = src + dst * (1.0 - src.a)
1473     * @param[in] in input Allocation
1474     * @param[in] out output Allocation
1475     */
1476    void forEachSrcOver(sp<Allocation> in, sp<Allocation> out);
1477    /**
1478     * Sets dst = dst + src * (1.0 - dst.a)
1479     * @param[in] in input Allocation
1480     * @param[in] out output Allocation
1481     */
1482    void forEachDstOver(sp<Allocation> in, sp<Allocation> out);
1483    /**
1484     * Sets dst = src * dst.a
1485     * @param[in] in input Allocation
1486     * @param[in] out output Allocation
1487     */
1488    void forEachSrcIn(sp<Allocation> in, sp<Allocation> out);
1489    /**
1490     * Sets dst = dst * src.a
1491     * @param[in] in input Allocation
1492     * @param[in] out output Allocation
1493     */
1494    void forEachDstIn(sp<Allocation> in, sp<Allocation> out);
1495    /**
1496     * Sets dst = src * (1.0 - dst.a)
1497     * @param[in] in input Allocation
1498     * @param[in] out output Allocation
1499     */
1500    void forEachSrcOut(sp<Allocation> in, sp<Allocation> out);
1501    /**
1502     * Sets dst = dst * (1.0 - src.a)
1503     * @param[in] in input Allocation
1504     * @param[in] out output Allocation
1505     */
1506    void forEachDstOut(sp<Allocation> in, sp<Allocation> out);
1507    /**
1508     * Sets dst.rgb = src.rgb * dst.a + (1.0 - src.a) * dst.rgb
1509     * @param[in] in input Allocation
1510     * @param[in] out output Allocation
1511     */
1512    void forEachSrcAtop(sp<Allocation> in, sp<Allocation> out);
1513    /**
1514     * Sets dst.rgb = dst.rgb * src.a + (1.0 - dst.a) * src.rgb
1515     * @param[in] in input Allocation
1516     * @param[in] out output Allocation
1517     */
1518    void forEachDstAtop(sp<Allocation> in, sp<Allocation> out);
1519    /**
1520     * Sets dst = {src.r ^ dst.r, src.g ^ dst.g, src.b ^ dst.b, src.a ^ dst.a}
1521     * @param[in] in input Allocation
1522     * @param[in] out output Allocation
1523     */
1524    void forEachXor(sp<Allocation> in, sp<Allocation> out);
1525    /**
1526     * Sets dst = src * dst
1527     * @param[in] in input Allocation
1528     * @param[in] out output Allocation
1529     */
1530    void forEachMultiply(sp<Allocation> in, sp<Allocation> out);
1531    /**
1532     * Sets dst = min(src + dst, 1.0)
1533     * @param[in] in input Allocation
1534     * @param[in] out output Allocation
1535     */
1536    void forEachAdd(sp<Allocation> in, sp<Allocation> out);
1537    /**
1538     * Sets dst = max(dst - src, 0.0)
1539     * @param[in] in input Allocation
1540     * @param[in] out output Allocation
1541     */
1542    void forEachSubtract(sp<Allocation> in, sp<Allocation> out);
1543};
1544
1545/**
1546 * Intrinsic Gausian blur filter. Applies a Gaussian blur of the specified
1547 * radius to all elements of an Allocation.
1548 */
1549class ScriptIntrinsicBlur : public ScriptIntrinsic {
1550 private:
1551    ScriptIntrinsicBlur(sp<RS> rs, sp<const Element> e);
1552 public:
1553    /**
1554     * Supported Element types are U8 and U8_4.
1555     * @param[in] rs RenderScript context
1556     * @param[in] e Element
1557     * @return new ScriptIntrinsicBlur
1558     */
1559    static sp<ScriptIntrinsicBlur> create(sp<RS> rs, sp<const Element> e);
1560    /**
1561     * Sets the input of the blur.
1562     * @param[in] in input Allocation
1563     */
1564    void setInput(sp<Allocation> in);
1565    /**
1566     * Runs the intrinsic.
1567     * @param[in] output Allocation
1568     */
1569    void forEach(sp<Allocation> out);
1570    /**
1571     * Sets the radius of the blur. The supported range is 0 < radius <= 25.
1572     * @param[in] radius radius of the blur
1573     */
1574    void setRadius(float radius);
1575};
1576
1577/**
1578 * Intrinsic for applying a color matrix to allocations. This has the
1579 * same effect as loading each element and converting it to a
1580 * F32_N, multiplying the result by the 4x4 color matrix
1581 * as performed by rsMatrixMultiply() and writing it to the output
1582 * after conversion back to U8_N or F32_N.
1583 */
1584class ScriptIntrinsicColorMatrix : public ScriptIntrinsic {
1585 private:
1586    ScriptIntrinsicColorMatrix(sp<RS> rs, sp<const Element> e);
1587 public:
1588    /**
1589     * Creates a new intrinsic.
1590     * @param[in] rs RenderScript context
1591     * @return new ScriptIntrinsicColorMatrix
1592     */
1593    static sp<ScriptIntrinsicColorMatrix> create(sp<RS> rs);
1594    /**
1595     * Applies the color matrix. Supported types are U8 and F32 with
1596     * vector lengths between 1 and 4.
1597     * @param[in] in input Allocation
1598     * @param[out] out output Allocation
1599     */
1600    void forEach(sp<Allocation> in, sp<Allocation> out);
1601    /**
1602     * Set the value to be added after the color matrix has been
1603     * applied. The default value is {0, 0, 0, 0}.
1604     * @param[in] add float[4] of values
1605     */
1606    void setAdd(float* add);
1607
1608    /**
1609     * Set the color matrix which will be applied to each cell of the
1610     * image. The alpha channel will be copied.
1611     *
1612     * @param[in] m float[9] of values
1613     */
1614    void setColorMatrix3(float* m);
1615    /**
1616     * Set the color matrix which will be applied to each cell of the
1617     * image.
1618     *
1619     * @param[in] m float[16] of values
1620     */
1621    void setColorMatrix4(float* m);
1622    /**
1623     * Set a color matrix to convert from RGB to luminance. The alpha
1624     * channel will be a copy.
1625     */
1626    void setGreyscale();
1627    /**
1628     * Set the matrix to convert from RGB to YUV with a direct copy of
1629     * the 4th channel.
1630     */
1631    void setRGBtoYUV();
1632    /**
1633     * Set the matrix to convert from YUV to RGB with a direct copy of
1634     * the 4th channel.
1635     */
1636    void setYUVtoRGB();
1637};
1638
1639/**
1640 * Intrinsic for applying a 3x3 convolve to an allocation.
1641 */
1642class ScriptIntrinsicConvolve3x3 : public ScriptIntrinsic {
1643 private:
1644    ScriptIntrinsicConvolve3x3(sp<RS> rs, sp<const Element> e);
1645 public:
1646    /**
1647     * Supported types U8 and F32 with vector lengths between 1 and
1648     * 4. The default convolution kernel is the identity.
1649     * @param[in] rs RenderScript context
1650     * @param[in] e Element
1651     * @return new ScriptIntrinsicConvolve3x3
1652     */
1653    static sp<ScriptIntrinsicConvolve3x3> create(sp<RS> rs, sp<const Element> e);
1654    /**
1655     * Sets input for intrinsic.
1656     * @param[in] in input Allocation
1657     */
1658    void setInput(sp<Allocation> in);
1659    /**
1660     * Launches the intrinsic.
1661     * @param[in] out output Allocation
1662     */
1663    void forEach(sp<Allocation> out);
1664    /**
1665     * Sets convolution kernel.
1666     * @param[in] v float[9] of values
1667     */
1668    void setCoefficients(float* v);
1669};
1670
1671/**
1672 * Intrinsic for applying a 5x5 convolve to an allocation.
1673 */
1674class ScriptIntrinsicConvolve5x5 : public ScriptIntrinsic {
1675 private:
1676    ScriptIntrinsicConvolve5x5(sp<RS> rs, sp<const Element> e);
1677 public:
1678    /**
1679     * Supported types U8 and F32 with vector lengths between 1 and
1680     * 4. The default convolution kernel is the identity.
1681     * @param[in] rs RenderScript context
1682     * @param[in] e Element
1683     * @return new ScriptIntrinsicConvolve5x5
1684     */
1685    static sp<ScriptIntrinsicConvolve5x5> create(sp<RS> rs, sp<const Element> e);
1686    /**
1687     * Sets input for intrinsic.
1688     * @param[in] in input Allocation
1689     */
1690    void setInput(sp<Allocation> in);
1691    /**
1692     * Launches the intrinsic.
1693     * @param[in] out output Allocation
1694     */
1695    void forEach(sp<Allocation> out);
1696    /**
1697     * Sets convolution kernel.
1698     * @param[in] v float[25] of values
1699     */
1700    void setCoefficients(float* v);
1701};
1702
1703/**
1704 * Intrinsic for computing a histogram.
1705 */
1706class ScriptIntrinsicHistogram : public ScriptIntrinsic {
1707 private:
1708    ScriptIntrinsicHistogram(sp<RS> rs, sp<const Element> e);
1709    sp<Allocation> mOut;
1710 public:
1711    /**
1712     * Create an intrinsic for calculating the histogram of an uchar
1713     * or uchar4 image.
1714     *
1715     * Supported elements types are U8_4, U8_3, U8_2, and U8.
1716     *
1717     * @param[in] rs The RenderScript context
1718     * @param[in] e Element type for inputs
1719     *
1720     * @return ScriptIntrinsicHistogram
1721     */
1722    static sp<ScriptIntrinsicHistogram> create(sp<RS> rs);
1723    /**
1724     * Set the output of the histogram.  32 bit integer types are
1725     * supported.
1726     *
1727     * @param[in] aout The output allocation
1728     */
1729    void setOutput(sp<Allocation> aout);
1730    /**
1731     * Set the coefficients used for the dot product calculation. The
1732     * default is {0.299f, 0.587f, 0.114f, 0.f}.
1733     *
1734     * Coefficients must be >= 0 and sum to 1.0 or less.
1735     *
1736     * @param[in] r Red coefficient
1737     * @param[in] g Green coefficient
1738     * @param[in] b Blue coefficient
1739     * @param[in] a Alpha coefficient
1740     */
1741    void setDotCoefficients(float r, float g, float b, float a);
1742    /**
1743     * Process an input buffer and place the histogram into the output
1744     * allocation. The output allocation may be a narrower vector size
1745     * than the input. In this case the vector size of the output is
1746     * used to determine how many of the input channels are used in
1747     * the computation. This is useful if you have an RGBA input
1748     * buffer but only want the histogram for RGB.
1749     *
1750     * 1D and 2D input allocations are supported.
1751     *
1752     * @param[in] ain The input image
1753     */
1754    void forEach(sp<Allocation> ain);
1755    /**
1756     * Process an input buffer and place the histogram into the output
1757     * allocation. The dot product of the input channel and the
1758     * coefficients from 'setDotCoefficients' are used to calculate
1759     * the output values.
1760     *
1761     * 1D and 2D input allocations are supported.
1762     *
1763     * @param ain The input image
1764     */
1765    void forEach_dot(sp<Allocation> ain);
1766};
1767
1768/**
1769 * Intrinsic for applying a per-channel lookup table. Each channel of
1770 * the input has an independant lookup table. The tables are 256
1771 * entries in size and can cover the full value range of U8_4.
1772 **/
1773class ScriptIntrinsicLUT : public ScriptIntrinsic {
1774 private:
1775    sp<Allocation> LUT;
1776    bool mDirty;
1777    unsigned char mCache[1024];
1778    void setTable(unsigned int offset, unsigned char base, unsigned int length, unsigned char* lutValues);
1779    ScriptIntrinsicLUT(sp<RS> rs, sp<const Element> e);
1780
1781 public:
1782    /**
1783     * Supported elements types are U8_4.
1784     *
1785     * The defaults tables are identity.
1786     *
1787     * @param[in] rs The RenderScript context
1788     * @param[in] e Element type for intputs and outputs
1789     *
1790     * @return ScriptIntrinsicLUT
1791     */
1792    static sp<ScriptIntrinsicLUT> create(sp<RS> rs, sp<const Element> e);
1793    /**
1794     * Invoke the kernel and apply the lookup to each cell of ain and
1795     * copy to aout.
1796     *
1797     * @param[in] ain Input allocation
1798     * @param[in] aout Output allocation
1799     */
1800    void forEach(sp<Allocation> ain, sp<Allocation> aout);
1801    /**
1802     * Sets entries in LUT for the red channel.
1803     * @param[in] base base of region to update
1804     * @param[in] length length of region to update
1805     * @param[in] lutValues LUT values to use
1806     */
1807    void setRed(unsigned char base, unsigned int length, unsigned char* lutValues);
1808    /**
1809     * Sets entries in LUT for the green channel.
1810     * @param[in] base base of region to update
1811     * @param[in] length length of region to update
1812     * @param[in] lutValues LUT values to use
1813     */
1814    void setGreen(unsigned char base, unsigned int length, unsigned char* lutValues);
1815    /**
1816     * Sets entries in LUT for the blue channel.
1817     * @param[in] base base of region to update
1818     * @param[in] length length of region to update
1819     * @param[in] lutValues LUT values to use
1820     */
1821    void setBlue(unsigned char base, unsigned int length, unsigned char* lutValues);
1822    /**
1823     * Sets entries in LUT for the alpha channel.
1824     * @param[in] base base of region to update
1825     * @param[in] length length of region to update
1826     * @param[in] lutValues LUT values to use
1827     */
1828    void setAlpha(unsigned char base, unsigned int length, unsigned char* lutValues);
1829    virtual ~ScriptIntrinsicLUT();
1830};
1831
1832/**
1833 * Intrinsic for converting an Android YUV buffer to RGB.
1834 *
1835 * The input allocation should be supplied in a supported YUV format
1836 * as a YUV element Allocation. The output is RGBA; the alpha channel
1837 * will be set to 255.
1838 */
1839class ScriptIntrinsicYuvToRGB : public ScriptIntrinsic {
1840 private:
1841    ScriptIntrinsicYuvToRGB(sp<RS> rs, sp<const Element> e);
1842 public:
1843    /**
1844     * Create an intrinsic for converting YUV to RGB.
1845     *
1846     * Supported elements types are U8_4.
1847     *
1848     * @param[in] rs The RenderScript context
1849     * @param[in] e Element type for output
1850     *
1851     * @return ScriptIntrinsicYuvToRGB
1852     */
1853    static sp<ScriptIntrinsicYuvToRGB> create(sp<RS> rs, sp<const Element> e);
1854    /**
1855     * Set the input YUV allocation.
1856     *
1857     * @param[in] ain The input allocation.
1858     */
1859    void setInput(sp<Allocation> in);
1860
1861    /**
1862     * Convert the image to RGB.
1863     *
1864     * @param[in] aout Output allocation. Must match creation element
1865     *                 type.
1866     */
1867    void forEach(sp<Allocation> out);
1868
1869};
1870
1871/**
1872 * Intrinsic for vp9 loopfilter.
1873 */
1874#if (defined(__GNUC__) && __GNUC__) || defined(__SUNPRO_C)
1875#define DECLARE_ALIGNED(n,typ,val)  typ val __attribute__ ((aligned (n)))
1876#elif defined(_MSC_VER)
1877#define DECLARE_ALIGNED(n,typ,val)  __declspec(align(n)) typ val
1878#else
1879#warning No alignment directives known for this compiler.
1880#define DECLARE_ALIGNED(n,typ,val)  typ val
1881#endif
1882
1883#define TX_SIZES            4
1884#define SIMD_WIDTH          16
1885#define MAX_LOOP_FILTER     63
1886#define MAX_SEGMENTS        8
1887#define MAX_REF_FRAMES      4
1888#define MAX_MODE_LF_DELTAS  2
1889#define MB_MODE_COUNT       14
1890
1891/**
1892 * Intrinsic for VP9 loop filter
1893 */
1894class ScriptIntrinsicVP9LoopFilter : public ScriptIntrinsic {
1895 private:
1896    ScriptIntrinsicVP9LoopFilter(sp<RS> rs, sp<const Element> e);
1897    sp<Allocation> mPadAlloc;
1898
1899 public:
1900    // This structure holds bit masks for all 8x8 blocks in a 64x64 region.
1901    // Each 1 bit represents a position in which we want to apply the loop filter.
1902    // Left_ entries refer to whether we apply a filter on the border to the
1903    // left of the block.   Above_ entries refer to whether or not to apply a
1904    // filter on the above border.   Int_ entries refer to whether or not to
1905    // apply borders on the 4x4 edges within the 8x8 block that each bit
1906    // represents.
1907    // Since each transform is accompanied by a potentially different type of
1908    // loop filter there is a different entry in the array for each transform size.
1909    struct LoopFilterMask {
1910        uint64_t left_y[TX_SIZES];
1911        uint64_t above_y[TX_SIZES];
1912        uint64_t int_4x4_y;
1913        uint16_t left_uv[TX_SIZES];
1914        uint16_t above_uv[TX_SIZES];
1915        uint16_t int_4x4_uv;
1916        uint8_t lfl_y[64];
1917        uint8_t lfl_uv[16];
1918    };
1919    // Need to align this structure so when it is declared and
1920    // passed it can be loaded into vector registers.
1921    struct LoopFilterThresh {
1922        DECLARE_ALIGNED(SIMD_WIDTH, uint8_t, mblim[SIMD_WIDTH]);
1923        DECLARE_ALIGNED(SIMD_WIDTH, uint8_t, lim[SIMD_WIDTH]);
1924        DECLARE_ALIGNED(SIMD_WIDTH, uint8_t, hev_thr[SIMD_WIDTH]);
1925    };
1926    struct LoopFilterInfoN {
1927        LoopFilterThresh lfthr[MAX_LOOP_FILTER + 1];
1928        uint8_t lvl[MAX_SEGMENTS][MAX_REF_FRAMES][MAX_MODE_LF_DELTAS];
1929        uint8_t mode_lf_lut[MB_MODE_COUNT];
1930    };
1931    struct BufferInfo {
1932        int y_offset;
1933        int u_offset;
1934        int v_offset;
1935        int y_stride;
1936        int uv_stride;
1937    };
1938
1939    /**
1940     * Create an intrinsic for LoopFilter.
1941     *
1942     * Supported elements types are U8.
1943     *
1944     * @param[in] rs The RenderScript context
1945     * @param[in] e Element type for output
1946     *
1947     * @return ScriptIntrinsicVP9LoopFilter
1948     */
1949    static sp<ScriptIntrinsicVP9LoopFilter> create(sp<RS> rs, sp<const Element> e);
1950    /**
1951     * Set loop filter domain.
1952     *
1953     * @param[in] start The start mi(mode info) row
1954     * @param[in] stop The stop mi row
1955     * @param[in] numPlanes The number of planes
1956     * @param[in] miRows The number of mi rows
1957     * @param[in] miCols The number of mi columns
1958     */
1959    void setLoopFilterDomain(int start, int stop, int numPlanes, int miRows, int miCols);
1960    /**
1961     * Set the layout info of the frame buffer(the parameter passed to forEach).
1962     *
1963     * @param[in] bufInfo The BufferInfo pointer contains the frame layout info
1964     */
1965    void setBufferInfo(const BufferInfo *bufInfo);
1966    /**
1967     * Set the loop filter info, including infomation like high edge variance thresholds
1968     * and loop filter levels that apply to the whole frame.
1969     *
1970     * @param[in] lfInfo The Allocation obj that contains the LoopFilterInfoN object
1971     */
1972    void setLoopFilterInfo(sp<Allocation> lfInfo);
1973    /**
1974     * Set loop filter masks.
1975     *
1976     * @param[in] lfMasks The Allocation obj that contains the masks for each 64*64
1977     * super block within the loop filter domain
1978     */
1979    void setLoopFilterMasks(sp<Allocation> lfMasks);
1980
1981    /**
1982     * Apply loop filter on the frame.
1983     *
1984     * @param[in] frameBuffer The Allocation obj that contains the frame
1985     */
1986    void forEach(sp<Allocation> frameBuffer);
1987};
1988
1989#undef DECLARE_ALIGNED
1990
1991#undef TX_SIZES
1992#undef SIMD_WIDTH
1993#undef MAX_LOOP_FILTER
1994#undef MAX_SEGMENTS
1995#undef MAX_REF_FRAMES
1996#undef MAX_MODE_LF_DELTAS
1997#undef MB_MODE_COUNT
1998
1999/**
2000 * Sampler object that defines how Allocations can be read as textures
2001 * within a kernel. Samplers are used in conjunction with the rsSample
2002 * runtime function to return values from normalized coordinates.
2003 *
2004 * Any Allocation used with a Sampler must have been created with
2005 * RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE; using a Sampler on an
2006 * Allocation that was not created with
2007 * RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE is undefined.
2008 **/
2009 class Sampler : public BaseObj {
2010 private:
2011    Sampler(sp<RS> rs, void* id);
2012    RsSamplerValue mMin;
2013    RsSamplerValue mMag;
2014    RsSamplerValue mWrapS;
2015    RsSamplerValue mWrapT;
2016    RsSamplerValue mWrapR;
2017    float mAniso;
2018
2019 public:
2020    /**
2021     * Creates a non-standard Sampler.
2022     * @param[in] rs RenderScript context
2023     * @param[in] min minification
2024     * @param[in] mag magnification
2025     * @param[in] wrapS S wrapping mode
2026     * @param[in] wrapT T wrapping mode
2027     * @param[in] anisotropy anisotropy setting
2028     */
2029    static sp<Sampler> create(sp<RS> rs, RsSamplerValue min, RsSamplerValue mag, RsSamplerValue wrapS, RsSamplerValue wrapT, float anisotropy);
2030
2031    /**
2032     * @return minification setting for the sampler
2033     */
2034    RsSamplerValue getMinification();
2035    /**
2036     * @return magnification setting for the sampler
2037     */
2038    RsSamplerValue getMagnification();
2039    /**
2040     * @return S wrapping mode for the sampler
2041     */
2042    RsSamplerValue getWrapS();
2043    /**
2044     * @return T wrapping mode for the sampler
2045     */
2046    RsSamplerValue getWrapT();
2047    /**
2048     * @return anisotropy setting for the sampler
2049     */
2050    float getAnisotropy();
2051
2052    /**
2053     * Retrieve a sampler with min and mag set to nearest and wrap modes set to
2054     * clamp.
2055     *
2056     * @param rs Context to which the sampler will belong.
2057     *
2058     * @return Sampler
2059     */
2060    static sp<const Sampler> CLAMP_NEAREST(sp<RS> rs);
2061    /**
2062     * Retrieve a sampler with min and mag set to linear and wrap modes set to
2063     * clamp.
2064     *
2065     * @param rs Context to which the sampler will belong.
2066     *
2067     * @return Sampler
2068     */
2069    static sp<const Sampler> CLAMP_LINEAR(sp<RS> rs);
2070    /**
2071     * Retrieve a sampler with mag set to linear, min linear mipmap linear, and
2072     * wrap modes set to clamp.
2073     *
2074     * @param rs Context to which the sampler will belong.
2075     *
2076     * @return Sampler
2077     */
2078    static sp<const Sampler> CLAMP_LINEAR_MIP_LINEAR(sp<RS> rs);
2079    /**
2080     * Retrieve a sampler with min and mag set to nearest and wrap modes set to
2081     * wrap.
2082     *
2083     * @param rs Context to which the sampler will belong.
2084     *
2085     * @return Sampler
2086     */
2087    static sp<const Sampler> WRAP_NEAREST(sp<RS> rs);
2088    /**
2089     * Retrieve a sampler with min and mag set to linear and wrap modes set to
2090     * wrap.
2091     *
2092     * @param rs Context to which the sampler will belong.
2093     *
2094     * @return Sampler
2095     */
2096    static sp<const Sampler> WRAP_LINEAR(sp<RS> rs);
2097    /**
2098     * Retrieve a sampler with mag set to linear, min linear mipmap linear, and
2099     * wrap modes set to wrap.
2100     *
2101     * @param rs Context to which the sampler will belong.
2102     *
2103     * @return Sampler
2104     */
2105    static sp<const Sampler> WRAP_LINEAR_MIP_LINEAR(sp<RS> rs);
2106    /**
2107     * Retrieve a sampler with min and mag set to nearest and wrap modes set to
2108     * mirrored repeat.
2109     *
2110     * @param rs Context to which the sampler will belong.
2111     *
2112     * @return Sampler
2113     */
2114    static sp<const Sampler> MIRRORED_REPEAT_NEAREST(sp<RS> rs);
2115    /**
2116     * Retrieve a sampler with min and mag set to linear and wrap modes set to
2117     * mirrored repeat.
2118     *
2119     * @param rs Context to which the sampler will belong.
2120     *
2121     * @return Sampler
2122     */
2123    static sp<const Sampler> MIRRORED_REPEAT_LINEAR(sp<RS> rs);
2124    /**
2125     * Retrieve a sampler with min and mag set to linear and wrap modes set to
2126     * mirrored repeat.
2127     *
2128     * @param rs Context to which the sampler will belong.
2129     *
2130     * @return Sampler
2131     */
2132    static sp<const Sampler> MIRRORED_REPEAT_LINEAR_MIP_LINEAR(sp<RS> rs);
2133
2134};
2135
2136class Byte2 {
2137 public:
2138  int8_t x, y;
2139
2140  Byte2(int8_t initX, int8_t initY)
2141    : x(initX), y(initY) {}
2142  Byte2() : x(0), y(0) {}
2143};
2144
2145class Byte3 {
2146 public:
2147  int8_t x, y, z;
2148
2149  Byte3(int8_t initX, int8_t initY, int8_t initZ)
2150    : x(initX), y(initY), z(initZ) {}
2151  Byte3() : x(0), y(0), z(0) {}
2152};
2153
2154class Byte4 {
2155 public:
2156  int8_t x, y, z, w;
2157
2158  Byte4(int8_t initX, int8_t initY, int8_t initZ, int8_t initW)
2159    : x(initX), y(initY), z(initZ), w(initW) {}
2160  Byte4() : x(0), y(0), z(0), w(0) {}
2161};
2162
2163class UByte2 {
2164 public:
2165  uint8_t x, y;
2166
2167  UByte2(uint8_t initX, uint8_t initY)
2168    : x(initX), y(initY) {}
2169  UByte2() : x(0), y(0) {}
2170};
2171
2172class UByte3 {
2173 public:
2174  uint8_t x, y, z;
2175
2176  UByte3(uint8_t initX, uint8_t initY, uint8_t initZ)
2177    : x(initX), y(initY), z(initZ) {}
2178  UByte3() : x(0), y(0), z(0) {}
2179};
2180
2181class UByte4 {
2182 public:
2183  uint8_t x, y, z, w;
2184
2185  UByte4(uint8_t initX, uint8_t initY, uint8_t initZ, uint8_t initW)
2186    : x(initX), y(initY), z(initZ), w(initW) {}
2187  UByte4() : x(0), y(0), z(0), w(0) {}
2188};
2189
2190class Short2 {
2191 public:
2192  short x, y;
2193
2194  Short2(short initX, short initY)
2195    : x(initX), y(initY) {}
2196  Short2() : x(0), y(0) {}
2197};
2198
2199class Short3 {
2200 public:
2201  short x, y, z;
2202
2203  Short3(short initX, short initY, short initZ)
2204    : x(initX), y(initY), z(initZ) {}
2205  Short3() : x(0), y(0), z(0) {}
2206};
2207
2208class Short4 {
2209 public:
2210  short x, y, z, w;
2211
2212  Short4(short initX, short initY, short initZ, short initW)
2213    : x(initX), y(initY), z(initZ), w(initW) {}
2214  Short4() : x(0), y(0), z(0), w(0) {}
2215};
2216
2217class UShort2 {
2218 public:
2219  uint16_t x, y;
2220
2221  UShort2(uint16_t initX, uint16_t initY)
2222    : x(initX), y(initY) {}
2223  UShort2() : x(0), y(0) {}
2224};
2225
2226class UShort3 {
2227 public:
2228  uint16_t x, y, z;
2229
2230  UShort3(uint16_t initX, uint16_t initY, uint16_t initZ)
2231    : x(initX), y(initY), z(initZ) {}
2232  UShort3() : x(0), y(0), z(0) {}
2233};
2234
2235class UShort4 {
2236 public:
2237  uint16_t x, y, z, w;
2238
2239  UShort4(uint16_t initX, uint16_t initY, uint16_t initZ, uint16_t initW)
2240    : x(initX), y(initY), z(initZ), w(initW) {}
2241  UShort4() : x(0), y(0), z(0), w(0) {}
2242};
2243
2244class Int2 {
2245 public:
2246  int x, y;
2247
2248  Int2(int initX, int initY)
2249    : x(initX), y(initY) {}
2250  Int2() : x(0), y(0) {}
2251};
2252
2253class Int3 {
2254 public:
2255  int x, y, z;
2256
2257  Int3(int initX, int initY, int initZ)
2258    : x(initX), y(initY), z(initZ) {}
2259  Int3() : x(0), y(0), z(0) {}
2260};
2261
2262class Int4 {
2263 public:
2264  int x, y, z, w;
2265
2266  Int4(int initX, int initY, int initZ, int initW)
2267    : x(initX), y(initY), z(initZ), w(initW) {}
2268  Int4() : x(0), y(0), z(0), w(0) {}
2269};
2270
2271class UInt2 {
2272 public:
2273  uint32_t x, y;
2274
2275  UInt2(uint32_t initX, uint32_t initY)
2276    : x(initX), y(initY) {}
2277  UInt2() : x(0), y(0) {}
2278};
2279
2280class UInt3 {
2281 public:
2282  uint32_t x, y, z;
2283
2284  UInt3(uint32_t initX, uint32_t initY, uint32_t initZ)
2285    : x(initX), y(initY), z(initZ) {}
2286  UInt3() : x(0), y(0), z(0) {}
2287};
2288
2289class UInt4 {
2290 public:
2291  uint32_t x, y, z, w;
2292
2293  UInt4(uint32_t initX, uint32_t initY, uint32_t initZ, uint32_t initW)
2294    : x(initX), y(initY), z(initZ), w(initW) {}
2295  UInt4() : x(0), y(0), z(0), w(0) {}
2296};
2297
2298class Long2 {
2299 public:
2300  int64_t x, y;
2301
2302  Long2(int64_t initX, int64_t initY)
2303    : x(initX), y(initY) {}
2304  Long2() : x(0), y(0) {}
2305};
2306
2307class Long3 {
2308 public:
2309  int64_t x, y, z;
2310
2311  Long3(int64_t initX, int64_t initY, int64_t initZ)
2312    : x(initX), y(initY), z(initZ) {}
2313  Long3() : x(0), y(0), z(0) {}
2314};
2315
2316class Long4 {
2317 public:
2318  int64_t x, y, z, w;
2319
2320  Long4(int64_t initX, int64_t initY, int64_t initZ, int64_t initW)
2321    : x(initX), y(initY), z(initZ), w(initW) {}
2322  Long4() : x(0), y(0), z(0), w(0) {}
2323};
2324
2325class ULong2 {
2326 public:
2327  uint64_t x, y;
2328
2329  ULong2(uint64_t initX, uint64_t initY)
2330    : x(initX), y(initY) {}
2331  ULong2() : x(0), y(0) {}
2332};
2333
2334class ULong3 {
2335 public:
2336  uint64_t x, y, z;
2337
2338  ULong3(uint64_t initX, uint64_t initY, uint64_t initZ)
2339    : x(initX), y(initY), z(initZ) {}
2340  ULong3() : x(0), y(0), z(0) {}
2341};
2342
2343class ULong4 {
2344 public:
2345  uint64_t x, y, z, w;
2346
2347  ULong4(uint64_t initX, uint64_t initY, uint64_t initZ, uint64_t initW)
2348    : x(initX), y(initY), z(initZ), w(initW) {}
2349  ULong4() : x(0), y(0), z(0), w(0) {}
2350};
2351
2352class Float2 {
2353 public:
2354  float x, y;
2355
2356  Float2(float initX, float initY)
2357    : x(initX), y(initY) {}
2358  Float2() : x(0), y(0) {}
2359};
2360
2361class Float3 {
2362 public:
2363  float x, y, z;
2364
2365  Float3(float initX, float initY, float initZ)
2366    : x(initX), y(initY), z(initZ) {}
2367  Float3() : x(0.f), y(0.f), z(0.f) {}
2368};
2369
2370class Float4 {
2371 public:
2372  float x, y, z, w;
2373
2374  Float4(float initX, float initY, float initZ, float initW)
2375    : x(initX), y(initY), z(initZ), w(initW) {}
2376  Float4() : x(0.f), y(0.f), z(0.f), w(0.f) {}
2377};
2378
2379class Double2 {
2380 public:
2381  double x, y;
2382
2383  Double2(double initX, double initY)
2384    : x(initX), y(initY) {}
2385  Double2() : x(0), y(0) {}
2386};
2387
2388class Double3 {
2389 public:
2390  double x, y, z;
2391
2392  Double3(double initX, double initY, double initZ)
2393    : x(initX), y(initY), z(initZ) {}
2394  Double3() : x(0), y(0), z(0) {}
2395};
2396
2397class Double4 {
2398 public:
2399  double x, y, z, w;
2400
2401  Double4(double initX, double initY, double initZ, double initW)
2402    : x(initX), y(initY), z(initZ), w(initW) {}
2403  Double4() : x(0), y(0), z(0), w(0) {}
2404};
2405
2406}
2407
2408}
2409
2410#endif
2411