rsCppStructs.h revision 60498fe9679ea25a260a503d6dfd27cbc0a0c079
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 * Intrinsic for VP9InterPrediction
1440 */
1441class ScriptIntrinsicVP9InterPred : public ScriptIntrinsic {
1442 private:
1443    ScriptIntrinsicVP9InterPred(sp<RS> rs, sp<const Element> e);
1444 public:
1445    static sp<ScriptIntrinsicVP9InterPred> create(sp<RS> rs, sp<const Element> e);
1446
1447    void forEach(sp<Allocation> asize);
1448    void setRef(sp<Allocation> ref);
1449    void setParamCount(int fri, int sec, int offset);
1450    void setParam(sp<Allocation> param);
1451};
1452
1453/**
1454 * Intrinsic kernel for blending two Allocations.
1455 */
1456class ScriptIntrinsicBlend : public ScriptIntrinsic {
1457 private:
1458    ScriptIntrinsicBlend(sp<RS> rs, sp<const Element> e);
1459 public:
1460    /**
1461     * Supported Element types are U8_4.
1462     * @param[in] rs RenderScript context
1463     * @param[in] e Element
1464     * @return new ScriptIntrinsicBlend
1465     */
1466    static sp<ScriptIntrinsicBlend> create(sp<RS> rs, sp<const Element> e);
1467    /**
1468     * sets dst = {0, 0, 0, 0}
1469     * @param[in] in input Allocation
1470     * @param[in] out output Allocation
1471     */
1472    void forEachClear(sp<Allocation> in, sp<Allocation> out);
1473    /**
1474     * Sets dst = src
1475     * @param[in] in input Allocation
1476     * @param[in] out output Allocation
1477     */
1478    void forEachSrc(sp<Allocation> in, sp<Allocation> out);
1479    /**
1480     * Sets dst = dst (NOP)
1481     * @param[in] in input Allocation
1482     * @param[in] out output Allocation
1483     */
1484    void forEachDst(sp<Allocation> in, sp<Allocation> out);
1485    /**
1486     * Sets dst = src + dst * (1.0 - src.a)
1487     * @param[in] in input Allocation
1488     * @param[in] out output Allocation
1489     */
1490    void forEachSrcOver(sp<Allocation> in, sp<Allocation> out);
1491    /**
1492     * Sets dst = dst + src * (1.0 - dst.a)
1493     * @param[in] in input Allocation
1494     * @param[in] out output Allocation
1495     */
1496    void forEachDstOver(sp<Allocation> in, sp<Allocation> out);
1497    /**
1498     * Sets dst = src * dst.a
1499     * @param[in] in input Allocation
1500     * @param[in] out output Allocation
1501     */
1502    void forEachSrcIn(sp<Allocation> in, sp<Allocation> out);
1503    /**
1504     * Sets dst = dst * src.a
1505     * @param[in] in input Allocation
1506     * @param[in] out output Allocation
1507     */
1508    void forEachDstIn(sp<Allocation> in, sp<Allocation> out);
1509    /**
1510     * Sets dst = src * (1.0 - dst.a)
1511     * @param[in] in input Allocation
1512     * @param[in] out output Allocation
1513     */
1514    void forEachSrcOut(sp<Allocation> in, sp<Allocation> out);
1515    /**
1516     * Sets dst = dst * (1.0 - src.a)
1517     * @param[in] in input Allocation
1518     * @param[in] out output Allocation
1519     */
1520    void forEachDstOut(sp<Allocation> in, sp<Allocation> out);
1521    /**
1522     * Sets dst.rgb = src.rgb * dst.a + (1.0 - src.a) * dst.rgb
1523     * @param[in] in input Allocation
1524     * @param[in] out output Allocation
1525     */
1526    void forEachSrcAtop(sp<Allocation> in, sp<Allocation> out);
1527    /**
1528     * Sets dst.rgb = dst.rgb * src.a + (1.0 - dst.a) * src.rgb
1529     * @param[in] in input Allocation
1530     * @param[in] out output Allocation
1531     */
1532    void forEachDstAtop(sp<Allocation> in, sp<Allocation> out);
1533    /**
1534     * Sets dst = {src.r ^ dst.r, src.g ^ dst.g, src.b ^ dst.b, src.a ^ dst.a}
1535     * @param[in] in input Allocation
1536     * @param[in] out output Allocation
1537     */
1538    void forEachXor(sp<Allocation> in, sp<Allocation> out);
1539    /**
1540     * Sets dst = src * dst
1541     * @param[in] in input Allocation
1542     * @param[in] out output Allocation
1543     */
1544    void forEachMultiply(sp<Allocation> in, sp<Allocation> out);
1545    /**
1546     * Sets dst = min(src + dst, 1.0)
1547     * @param[in] in input Allocation
1548     * @param[in] out output Allocation
1549     */
1550    void forEachAdd(sp<Allocation> in, sp<Allocation> out);
1551    /**
1552     * Sets dst = max(dst - src, 0.0)
1553     * @param[in] in input Allocation
1554     * @param[in] out output Allocation
1555     */
1556    void forEachSubtract(sp<Allocation> in, sp<Allocation> out);
1557};
1558
1559/**
1560 * Intrinsic Gausian blur filter. Applies a Gaussian blur of the specified
1561 * radius to all elements of an Allocation.
1562 */
1563class ScriptIntrinsicBlur : public ScriptIntrinsic {
1564 private:
1565    ScriptIntrinsicBlur(sp<RS> rs, sp<const Element> e);
1566 public:
1567    /**
1568     * Supported Element types are U8 and U8_4.
1569     * @param[in] rs RenderScript context
1570     * @param[in] e Element
1571     * @return new ScriptIntrinsicBlur
1572     */
1573    static sp<ScriptIntrinsicBlur> create(sp<RS> rs, sp<const Element> e);
1574    /**
1575     * Sets the input of the blur.
1576     * @param[in] in input Allocation
1577     */
1578    void setInput(sp<Allocation> in);
1579    /**
1580     * Runs the intrinsic.
1581     * @param[in] output Allocation
1582     */
1583    void forEach(sp<Allocation> out);
1584    /**
1585     * Sets the radius of the blur. The supported range is 0 < radius <= 25.
1586     * @param[in] radius radius of the blur
1587     */
1588    void setRadius(float radius);
1589};
1590
1591/**
1592 * Intrinsic for applying a color matrix to allocations. This has the
1593 * same effect as loading each element and converting it to a
1594 * F32_N, multiplying the result by the 4x4 color matrix
1595 * as performed by rsMatrixMultiply() and writing it to the output
1596 * after conversion back to U8_N or F32_N.
1597 */
1598class ScriptIntrinsicColorMatrix : public ScriptIntrinsic {
1599 private:
1600    ScriptIntrinsicColorMatrix(sp<RS> rs, sp<const Element> e);
1601 public:
1602    /**
1603     * Creates a new intrinsic.
1604     * @param[in] rs RenderScript context
1605     * @return new ScriptIntrinsicColorMatrix
1606     */
1607    static sp<ScriptIntrinsicColorMatrix> create(sp<RS> rs);
1608    /**
1609     * Applies the color matrix. Supported types are U8 and F32 with
1610     * vector lengths between 1 and 4.
1611     * @param[in] in input Allocation
1612     * @param[out] out output Allocation
1613     */
1614    void forEach(sp<Allocation> in, sp<Allocation> out);
1615    /**
1616     * Set the value to be added after the color matrix has been
1617     * applied. The default value is {0, 0, 0, 0}.
1618     * @param[in] add float[4] of values
1619     */
1620    void setAdd(float* add);
1621
1622    /**
1623     * Set the color matrix which will be applied to each cell of the
1624     * image. The alpha channel will be copied.
1625     *
1626     * @param[in] m float[9] of values
1627     */
1628    void setColorMatrix3(float* m);
1629    /**
1630     * Set the color matrix which will be applied to each cell of the
1631     * image.
1632     *
1633     * @param[in] m float[16] of values
1634     */
1635    void setColorMatrix4(float* m);
1636    /**
1637     * Set a color matrix to convert from RGB to luminance. The alpha
1638     * channel will be a copy.
1639     */
1640    void setGreyscale();
1641    /**
1642     * Set the matrix to convert from RGB to YUV with a direct copy of
1643     * the 4th channel.
1644     */
1645    void setRGBtoYUV();
1646    /**
1647     * Set the matrix to convert from YUV to RGB with a direct copy of
1648     * the 4th channel.
1649     */
1650    void setYUVtoRGB();
1651};
1652
1653/**
1654 * Intrinsic for applying a 3x3 convolve to an allocation.
1655 */
1656class ScriptIntrinsicConvolve3x3 : public ScriptIntrinsic {
1657 private:
1658    ScriptIntrinsicConvolve3x3(sp<RS> rs, sp<const Element> e);
1659 public:
1660    /**
1661     * Supported types U8 and F32 with vector lengths between 1 and
1662     * 4. The default convolution kernel is the identity.
1663     * @param[in] rs RenderScript context
1664     * @param[in] e Element
1665     * @return new ScriptIntrinsicConvolve3x3
1666     */
1667    static sp<ScriptIntrinsicConvolve3x3> create(sp<RS> rs, sp<const Element> e);
1668    /**
1669     * Sets input for intrinsic.
1670     * @param[in] in input Allocation
1671     */
1672    void setInput(sp<Allocation> in);
1673    /**
1674     * Launches the intrinsic.
1675     * @param[in] out output Allocation
1676     */
1677    void forEach(sp<Allocation> out);
1678    /**
1679     * Sets convolution kernel.
1680     * @param[in] v float[9] of values
1681     */
1682    void setCoefficients(float* v);
1683};
1684
1685/**
1686 * Intrinsic for applying a 5x5 convolve to an allocation.
1687 */
1688class ScriptIntrinsicConvolve5x5 : public ScriptIntrinsic {
1689 private:
1690    ScriptIntrinsicConvolve5x5(sp<RS> rs, sp<const Element> e);
1691 public:
1692    /**
1693     * Supported types U8 and F32 with vector lengths between 1 and
1694     * 4. The default convolution kernel is the identity.
1695     * @param[in] rs RenderScript context
1696     * @param[in] e Element
1697     * @return new ScriptIntrinsicConvolve5x5
1698     */
1699    static sp<ScriptIntrinsicConvolve5x5> create(sp<RS> rs, sp<const Element> e);
1700    /**
1701     * Sets input for intrinsic.
1702     * @param[in] in input Allocation
1703     */
1704    void setInput(sp<Allocation> in);
1705    /**
1706     * Launches the intrinsic.
1707     * @param[in] out output Allocation
1708     */
1709    void forEach(sp<Allocation> out);
1710    /**
1711     * Sets convolution kernel.
1712     * @param[in] v float[25] of values
1713     */
1714    void setCoefficients(float* v);
1715};
1716
1717/**
1718 * Intrinsic for computing a histogram.
1719 */
1720class ScriptIntrinsicHistogram : public ScriptIntrinsic {
1721 private:
1722    ScriptIntrinsicHistogram(sp<RS> rs, sp<const Element> e);
1723    sp<Allocation> mOut;
1724 public:
1725    /**
1726     * Create an intrinsic for calculating the histogram of an uchar
1727     * or uchar4 image.
1728     *
1729     * Supported elements types are U8_4, U8_3, U8_2, and U8.
1730     *
1731     * @param[in] rs The RenderScript context
1732     * @param[in] e Element type for inputs
1733     *
1734     * @return ScriptIntrinsicHistogram
1735     */
1736    static sp<ScriptIntrinsicHistogram> create(sp<RS> rs);
1737    /**
1738     * Set the output of the histogram.  32 bit integer types are
1739     * supported.
1740     *
1741     * @param[in] aout The output allocation
1742     */
1743    void setOutput(sp<Allocation> aout);
1744    /**
1745     * Set the coefficients used for the dot product calculation. The
1746     * default is {0.299f, 0.587f, 0.114f, 0.f}.
1747     *
1748     * Coefficients must be >= 0 and sum to 1.0 or less.
1749     *
1750     * @param[in] r Red coefficient
1751     * @param[in] g Green coefficient
1752     * @param[in] b Blue coefficient
1753     * @param[in] a Alpha coefficient
1754     */
1755    void setDotCoefficients(float r, float g, float b, float a);
1756    /**
1757     * Process an input buffer and place the histogram into the output
1758     * allocation. The output allocation may be a narrower vector size
1759     * than the input. In this case the vector size of the output is
1760     * used to determine how many of the input channels are used in
1761     * the computation. This is useful if you have an RGBA input
1762     * buffer but only want the histogram for RGB.
1763     *
1764     * 1D and 2D input allocations are supported.
1765     *
1766     * @param[in] ain The input image
1767     */
1768    void forEach(sp<Allocation> ain);
1769    /**
1770     * Process an input buffer and place the histogram into the output
1771     * allocation. The dot product of the input channel and the
1772     * coefficients from 'setDotCoefficients' are used to calculate
1773     * the output values.
1774     *
1775     * 1D and 2D input allocations are supported.
1776     *
1777     * @param ain The input image
1778     */
1779    void forEach_dot(sp<Allocation> ain);
1780};
1781
1782/**
1783 * Intrinsic for applying a per-channel lookup table. Each channel of
1784 * the input has an independant lookup table. The tables are 256
1785 * entries in size and can cover the full value range of U8_4.
1786 **/
1787class ScriptIntrinsicLUT : public ScriptIntrinsic {
1788 private:
1789    sp<Allocation> LUT;
1790    bool mDirty;
1791    unsigned char mCache[1024];
1792    void setTable(unsigned int offset, unsigned char base, unsigned int length, unsigned char* lutValues);
1793    ScriptIntrinsicLUT(sp<RS> rs, sp<const Element> e);
1794
1795 public:
1796    /**
1797     * Supported elements types are U8_4.
1798     *
1799     * The defaults tables are identity.
1800     *
1801     * @param[in] rs The RenderScript context
1802     * @param[in] e Element type for intputs and outputs
1803     *
1804     * @return ScriptIntrinsicLUT
1805     */
1806    static sp<ScriptIntrinsicLUT> create(sp<RS> rs, sp<const Element> e);
1807    /**
1808     * Invoke the kernel and apply the lookup to each cell of ain and
1809     * copy to aout.
1810     *
1811     * @param[in] ain Input allocation
1812     * @param[in] aout Output allocation
1813     */
1814    void forEach(sp<Allocation> ain, sp<Allocation> aout);
1815    /**
1816     * Sets entries in LUT for the red 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 setRed(unsigned char base, unsigned int length, unsigned char* lutValues);
1822    /**
1823     * Sets entries in LUT for the green 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 setGreen(unsigned char base, unsigned int length, unsigned char* lutValues);
1829    /**
1830     * Sets entries in LUT for the blue channel.
1831     * @param[in] base base of region to update
1832     * @param[in] length length of region to update
1833     * @param[in] lutValues LUT values to use
1834     */
1835    void setBlue(unsigned char base, unsigned int length, unsigned char* lutValues);
1836    /**
1837     * Sets entries in LUT for the alpha channel.
1838     * @param[in] base base of region to update
1839     * @param[in] length length of region to update
1840     * @param[in] lutValues LUT values to use
1841     */
1842    void setAlpha(unsigned char base, unsigned int length, unsigned char* lutValues);
1843    virtual ~ScriptIntrinsicLUT();
1844};
1845
1846/**
1847 * Intrinsic for converting an Android YUV buffer to RGB.
1848 *
1849 * The input allocation should be supplied in a supported YUV format
1850 * as a YUV element Allocation. The output is RGBA; the alpha channel
1851 * will be set to 255.
1852 */
1853class ScriptIntrinsicYuvToRGB : public ScriptIntrinsic {
1854 private:
1855    ScriptIntrinsicYuvToRGB(sp<RS> rs, sp<const Element> e);
1856 public:
1857    /**
1858     * Create an intrinsic for converting YUV to RGB.
1859     *
1860     * Supported elements types are U8_4.
1861     *
1862     * @param[in] rs The RenderScript context
1863     * @param[in] e Element type for output
1864     *
1865     * @return ScriptIntrinsicYuvToRGB
1866     */
1867    static sp<ScriptIntrinsicYuvToRGB> create(sp<RS> rs, sp<const Element> e);
1868    /**
1869     * Set the input YUV allocation.
1870     *
1871     * @param[in] ain The input allocation.
1872     */
1873    void setInput(sp<Allocation> in);
1874
1875    /**
1876     * Convert the image to RGB.
1877     *
1878     * @param[in] aout Output allocation. Must match creation element
1879     *                 type.
1880     */
1881    void forEach(sp<Allocation> out);
1882
1883};
1884
1885/**
1886 * Sampler object that defines how Allocations can be read as textures
1887 * within a kernel. Samplers are used in conjunction with the rsSample
1888 * runtime function to return values from normalized coordinates.
1889 *
1890 * Any Allocation used with a Sampler must have been created with
1891 * RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE; using a Sampler on an
1892 * Allocation that was not created with
1893 * RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE is undefined.
1894 **/
1895 class Sampler : public BaseObj {
1896 private:
1897    Sampler(sp<RS> rs, void* id);
1898    RsSamplerValue mMin;
1899    RsSamplerValue mMag;
1900    RsSamplerValue mWrapS;
1901    RsSamplerValue mWrapT;
1902    RsSamplerValue mWrapR;
1903    float mAniso;
1904
1905 public:
1906    /**
1907     * Creates a non-standard Sampler.
1908     * @param[in] rs RenderScript context
1909     * @param[in] min minification
1910     * @param[in] mag magnification
1911     * @param[in] wrapS S wrapping mode
1912     * @param[in] wrapT T wrapping mode
1913     * @param[in] anisotropy anisotropy setting
1914     */
1915    static sp<Sampler> create(sp<RS> rs, RsSamplerValue min, RsSamplerValue mag, RsSamplerValue wrapS, RsSamplerValue wrapT, float anisotropy);
1916
1917    /**
1918     * @return minification setting for the sampler
1919     */
1920    RsSamplerValue getMinification();
1921    /**
1922     * @return magnification setting for the sampler
1923     */
1924    RsSamplerValue getMagnification();
1925    /**
1926     * @return S wrapping mode for the sampler
1927     */
1928    RsSamplerValue getWrapS();
1929    /**
1930     * @return T wrapping mode for the sampler
1931     */
1932    RsSamplerValue getWrapT();
1933    /**
1934     * @return anisotropy setting for the sampler
1935     */
1936    float getAnisotropy();
1937
1938    /**
1939     * Retrieve a sampler with min and mag set to nearest and wrap modes set to
1940     * clamp.
1941     *
1942     * @param rs Context to which the sampler will belong.
1943     *
1944     * @return Sampler
1945     */
1946    static sp<const Sampler> CLAMP_NEAREST(sp<RS> rs);
1947    /**
1948     * Retrieve a sampler with min and mag set to linear and wrap modes set to
1949     * clamp.
1950     *
1951     * @param rs Context to which the sampler will belong.
1952     *
1953     * @return Sampler
1954     */
1955    static sp<const Sampler> CLAMP_LINEAR(sp<RS> rs);
1956    /**
1957     * Retrieve a sampler with mag set to linear, min linear mipmap linear, and
1958     * wrap modes set to clamp.
1959     *
1960     * @param rs Context to which the sampler will belong.
1961     *
1962     * @return Sampler
1963     */
1964    static sp<const Sampler> CLAMP_LINEAR_MIP_LINEAR(sp<RS> rs);
1965    /**
1966     * Retrieve a sampler with min and mag set to nearest and wrap modes set to
1967     * wrap.
1968     *
1969     * @param rs Context to which the sampler will belong.
1970     *
1971     * @return Sampler
1972     */
1973    static sp<const Sampler> WRAP_NEAREST(sp<RS> rs);
1974    /**
1975     * Retrieve a sampler with min and mag set to linear and wrap modes set to
1976     * wrap.
1977     *
1978     * @param rs Context to which the sampler will belong.
1979     *
1980     * @return Sampler
1981     */
1982    static sp<const Sampler> WRAP_LINEAR(sp<RS> rs);
1983    /**
1984     * Retrieve a sampler with mag set to linear, min linear mipmap linear, and
1985     * wrap modes set to wrap.
1986     *
1987     * @param rs Context to which the sampler will belong.
1988     *
1989     * @return Sampler
1990     */
1991    static sp<const Sampler> WRAP_LINEAR_MIP_LINEAR(sp<RS> rs);
1992    /**
1993     * Retrieve a sampler with min and mag set to nearest and wrap modes set to
1994     * mirrored repeat.
1995     *
1996     * @param rs Context to which the sampler will belong.
1997     *
1998     * @return Sampler
1999     */
2000    static sp<const Sampler> MIRRORED_REPEAT_NEAREST(sp<RS> rs);
2001    /**
2002     * Retrieve a sampler with min and mag set to linear and wrap modes set to
2003     * mirrored repeat.
2004     *
2005     * @param rs Context to which the sampler will belong.
2006     *
2007     * @return Sampler
2008     */
2009    static sp<const Sampler> MIRRORED_REPEAT_LINEAR(sp<RS> rs);
2010    /**
2011     * Retrieve a sampler with min and mag set to linear and wrap modes set to
2012     * mirrored repeat.
2013     *
2014     * @param rs Context to which the sampler will belong.
2015     *
2016     * @return Sampler
2017     */
2018    static sp<const Sampler> MIRRORED_REPEAT_LINEAR_MIP_LINEAR(sp<RS> rs);
2019
2020};
2021
2022class Byte2 {
2023 public:
2024  int8_t x, y;
2025
2026  Byte2(int8_t initX, int8_t initY)
2027    : x(initX), y(initY) {}
2028  Byte2() : x(0), y(0) {}
2029};
2030
2031class Byte3 {
2032 public:
2033  int8_t x, y, z;
2034
2035  Byte3(int8_t initX, int8_t initY, int8_t initZ)
2036    : x(initX), y(initY), z(initZ) {}
2037  Byte3() : x(0), y(0), z(0) {}
2038};
2039
2040class Byte4 {
2041 public:
2042  int8_t x, y, z, w;
2043
2044  Byte4(int8_t initX, int8_t initY, int8_t initZ, int8_t initW)
2045    : x(initX), y(initY), z(initZ), w(initW) {}
2046  Byte4() : x(0), y(0), z(0), w(0) {}
2047};
2048
2049class UByte2 {
2050 public:
2051  uint8_t x, y;
2052
2053  UByte2(uint8_t initX, uint8_t initY)
2054    : x(initX), y(initY) {}
2055  UByte2() : x(0), y(0) {}
2056};
2057
2058class UByte3 {
2059 public:
2060  uint8_t x, y, z;
2061
2062  UByte3(uint8_t initX, uint8_t initY, uint8_t initZ)
2063    : x(initX), y(initY), z(initZ) {}
2064  UByte3() : x(0), y(0), z(0) {}
2065};
2066
2067class UByte4 {
2068 public:
2069  uint8_t x, y, z, w;
2070
2071  UByte4(uint8_t initX, uint8_t initY, uint8_t initZ, uint8_t initW)
2072    : x(initX), y(initY), z(initZ), w(initW) {}
2073  UByte4() : x(0), y(0), z(0), w(0) {}
2074};
2075
2076class Short2 {
2077 public:
2078  short x, y;
2079
2080  Short2(short initX, short initY)
2081    : x(initX), y(initY) {}
2082  Short2() : x(0), y(0) {}
2083};
2084
2085class Short3 {
2086 public:
2087  short x, y, z;
2088
2089  Short3(short initX, short initY, short initZ)
2090    : x(initX), y(initY), z(initZ) {}
2091  Short3() : x(0), y(0), z(0) {}
2092};
2093
2094class Short4 {
2095 public:
2096  short x, y, z, w;
2097
2098  Short4(short initX, short initY, short initZ, short initW)
2099    : x(initX), y(initY), z(initZ), w(initW) {}
2100  Short4() : x(0), y(0), z(0), w(0) {}
2101};
2102
2103class UShort2 {
2104 public:
2105  uint16_t x, y;
2106
2107  UShort2(uint16_t initX, uint16_t initY)
2108    : x(initX), y(initY) {}
2109  UShort2() : x(0), y(0) {}
2110};
2111
2112class UShort3 {
2113 public:
2114  uint16_t x, y, z;
2115
2116  UShort3(uint16_t initX, uint16_t initY, uint16_t initZ)
2117    : x(initX), y(initY), z(initZ) {}
2118  UShort3() : x(0), y(0), z(0) {}
2119};
2120
2121class UShort4 {
2122 public:
2123  uint16_t x, y, z, w;
2124
2125  UShort4(uint16_t initX, uint16_t initY, uint16_t initZ, uint16_t initW)
2126    : x(initX), y(initY), z(initZ), w(initW) {}
2127  UShort4() : x(0), y(0), z(0), w(0) {}
2128};
2129
2130class Int2 {
2131 public:
2132  int x, y;
2133
2134  Int2(int initX, int initY)
2135    : x(initX), y(initY) {}
2136  Int2() : x(0), y(0) {}
2137};
2138
2139class Int3 {
2140 public:
2141  int x, y, z;
2142
2143  Int3(int initX, int initY, int initZ)
2144    : x(initX), y(initY), z(initZ) {}
2145  Int3() : x(0), y(0), z(0) {}
2146};
2147
2148class Int4 {
2149 public:
2150  int x, y, z, w;
2151
2152  Int4(int initX, int initY, int initZ, int initW)
2153    : x(initX), y(initY), z(initZ), w(initW) {}
2154  Int4() : x(0), y(0), z(0), w(0) {}
2155};
2156
2157class UInt2 {
2158 public:
2159  uint32_t x, y;
2160
2161  UInt2(uint32_t initX, uint32_t initY)
2162    : x(initX), y(initY) {}
2163  UInt2() : x(0), y(0) {}
2164};
2165
2166class UInt3 {
2167 public:
2168  uint32_t x, y, z;
2169
2170  UInt3(uint32_t initX, uint32_t initY, uint32_t initZ)
2171    : x(initX), y(initY), z(initZ) {}
2172  UInt3() : x(0), y(0), z(0) {}
2173};
2174
2175class UInt4 {
2176 public:
2177  uint32_t x, y, z, w;
2178
2179  UInt4(uint32_t initX, uint32_t initY, uint32_t initZ, uint32_t initW)
2180    : x(initX), y(initY), z(initZ), w(initW) {}
2181  UInt4() : x(0), y(0), z(0), w(0) {}
2182};
2183
2184class Long2 {
2185 public:
2186  int64_t x, y;
2187
2188  Long2(int64_t initX, int64_t initY)
2189    : x(initX), y(initY) {}
2190  Long2() : x(0), y(0) {}
2191};
2192
2193class Long3 {
2194 public:
2195  int64_t x, y, z;
2196
2197  Long3(int64_t initX, int64_t initY, int64_t initZ)
2198    : x(initX), y(initY), z(initZ) {}
2199  Long3() : x(0), y(0), z(0) {}
2200};
2201
2202class Long4 {
2203 public:
2204  int64_t x, y, z, w;
2205
2206  Long4(int64_t initX, int64_t initY, int64_t initZ, int64_t initW)
2207    : x(initX), y(initY), z(initZ), w(initW) {}
2208  Long4() : x(0), y(0), z(0), w(0) {}
2209};
2210
2211class ULong2 {
2212 public:
2213  uint64_t x, y;
2214
2215  ULong2(uint64_t initX, uint64_t initY)
2216    : x(initX), y(initY) {}
2217  ULong2() : x(0), y(0) {}
2218};
2219
2220class ULong3 {
2221 public:
2222  uint64_t x, y, z;
2223
2224  ULong3(uint64_t initX, uint64_t initY, uint64_t initZ)
2225    : x(initX), y(initY), z(initZ) {}
2226  ULong3() : x(0), y(0), z(0) {}
2227};
2228
2229class ULong4 {
2230 public:
2231  uint64_t x, y, z, w;
2232
2233  ULong4(uint64_t initX, uint64_t initY, uint64_t initZ, uint64_t initW)
2234    : x(initX), y(initY), z(initZ), w(initW) {}
2235  ULong4() : x(0), y(0), z(0), w(0) {}
2236};
2237
2238class Float2 {
2239 public:
2240  float x, y;
2241
2242  Float2(float initX, float initY)
2243    : x(initX), y(initY) {}
2244  Float2() : x(0), y(0) {}
2245};
2246
2247class Float3 {
2248 public:
2249  float x, y, z;
2250
2251  Float3(float initX, float initY, float initZ)
2252    : x(initX), y(initY), z(initZ) {}
2253  Float3() : x(0.f), y(0.f), z(0.f) {}
2254};
2255
2256class Float4 {
2257 public:
2258  float x, y, z, w;
2259
2260  Float4(float initX, float initY, float initZ, float initW)
2261    : x(initX), y(initY), z(initZ), w(initW) {}
2262  Float4() : x(0.f), y(0.f), z(0.f), w(0.f) {}
2263};
2264
2265class Double2 {
2266 public:
2267  double x, y;
2268
2269  Double2(double initX, double initY)
2270    : x(initX), y(initY) {}
2271  Double2() : x(0), y(0) {}
2272};
2273
2274class Double3 {
2275 public:
2276  double x, y, z;
2277
2278  Double3(double initX, double initY, double initZ)
2279    : x(initX), y(initY), z(initZ) {}
2280  Double3() : x(0), y(0), z(0) {}
2281};
2282
2283class Double4 {
2284 public:
2285  double x, y, z, w;
2286
2287  Double4(double initX, double initY, double initZ, double initW)
2288    : x(initX), y(initY), z(initZ), w(initW) {}
2289  Double4() : x(0), y(0), z(0), w(0) {}
2290};
2291
2292}
2293
2294}
2295
2296#endif
2297