rsCppStructs.h revision b8a94e26c0a5e8f58d5b6ed04e46b411e95b77a4
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 * Sampler object that defines how Allocations can be read as textures
1873 * within a kernel. Samplers are used in conjunction with the rsSample
1874 * runtime function to return values from normalized coordinates.
1875 *
1876 * Any Allocation used with a Sampler must have been created with
1877 * RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE; using a Sampler on an
1878 * Allocation that was not created with
1879 * RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE is undefined.
1880 **/
1881 class Sampler : public BaseObj {
1882 private:
1883    Sampler(sp<RS> rs, void* id);
1884    RsSamplerValue mMin;
1885    RsSamplerValue mMag;
1886    RsSamplerValue mWrapS;
1887    RsSamplerValue mWrapT;
1888    RsSamplerValue mWrapR;
1889    float mAniso;
1890
1891 public:
1892    /**
1893     * Creates a non-standard Sampler.
1894     * @param[in] rs RenderScript context
1895     * @param[in] min minification
1896     * @param[in] mag magnification
1897     * @param[in] wrapS S wrapping mode
1898     * @param[in] wrapT T wrapping mode
1899     * @param[in] anisotropy anisotropy setting
1900     */
1901    static sp<Sampler> create(sp<RS> rs, RsSamplerValue min, RsSamplerValue mag, RsSamplerValue wrapS, RsSamplerValue wrapT, float anisotropy);
1902
1903    /**
1904     * @return minification setting for the sampler
1905     */
1906    RsSamplerValue getMinification();
1907    /**
1908     * @return magnification setting for the sampler
1909     */
1910    RsSamplerValue getMagnification();
1911    /**
1912     * @return S wrapping mode for the sampler
1913     */
1914    RsSamplerValue getWrapS();
1915    /**
1916     * @return T wrapping mode for the sampler
1917     */
1918    RsSamplerValue getWrapT();
1919    /**
1920     * @return anisotropy setting for the sampler
1921     */
1922    float getAnisotropy();
1923
1924    /**
1925     * Retrieve a sampler with min and mag set to nearest and wrap modes set to
1926     * clamp.
1927     *
1928     * @param rs Context to which the sampler will belong.
1929     *
1930     * @return Sampler
1931     */
1932    static sp<const Sampler> CLAMP_NEAREST(sp<RS> rs);
1933    /**
1934     * Retrieve a sampler with min and mag set to linear and wrap modes set to
1935     * clamp.
1936     *
1937     * @param rs Context to which the sampler will belong.
1938     *
1939     * @return Sampler
1940     */
1941    static sp<const Sampler> CLAMP_LINEAR(sp<RS> rs);
1942    /**
1943     * Retrieve a sampler with mag set to linear, min linear mipmap linear, and
1944     * wrap modes set to clamp.
1945     *
1946     * @param rs Context to which the sampler will belong.
1947     *
1948     * @return Sampler
1949     */
1950    static sp<const Sampler> CLAMP_LINEAR_MIP_LINEAR(sp<RS> rs);
1951    /**
1952     * Retrieve a sampler with min and mag set to nearest and wrap modes set to
1953     * wrap.
1954     *
1955     * @param rs Context to which the sampler will belong.
1956     *
1957     * @return Sampler
1958     */
1959    static sp<const Sampler> WRAP_NEAREST(sp<RS> rs);
1960    /**
1961     * Retrieve a sampler with min and mag set to linear and wrap modes set to
1962     * wrap.
1963     *
1964     * @param rs Context to which the sampler will belong.
1965     *
1966     * @return Sampler
1967     */
1968    static sp<const Sampler> WRAP_LINEAR(sp<RS> rs);
1969    /**
1970     * Retrieve a sampler with mag set to linear, min linear mipmap linear, and
1971     * wrap modes set to wrap.
1972     *
1973     * @param rs Context to which the sampler will belong.
1974     *
1975     * @return Sampler
1976     */
1977    static sp<const Sampler> WRAP_LINEAR_MIP_LINEAR(sp<RS> rs);
1978    /**
1979     * Retrieve a sampler with min and mag set to nearest and wrap modes set to
1980     * mirrored repeat.
1981     *
1982     * @param rs Context to which the sampler will belong.
1983     *
1984     * @return Sampler
1985     */
1986    static sp<const Sampler> MIRRORED_REPEAT_NEAREST(sp<RS> rs);
1987    /**
1988     * Retrieve a sampler with min and mag set to linear and wrap modes set to
1989     * mirrored repeat.
1990     *
1991     * @param rs Context to which the sampler will belong.
1992     *
1993     * @return Sampler
1994     */
1995    static sp<const Sampler> MIRRORED_REPEAT_LINEAR(sp<RS> rs);
1996    /**
1997     * Retrieve a sampler with min and mag set to linear and wrap modes set to
1998     * mirrored repeat.
1999     *
2000     * @param rs Context to which the sampler will belong.
2001     *
2002     * @return Sampler
2003     */
2004    static sp<const Sampler> MIRRORED_REPEAT_LINEAR_MIP_LINEAR(sp<RS> rs);
2005
2006};
2007
2008class Byte2 {
2009 public:
2010  int8_t x, y;
2011
2012  Byte2(int8_t initX, int8_t initY)
2013    : x(initX), y(initY) {}
2014  Byte2() : x(0), y(0) {}
2015};
2016
2017class Byte3 {
2018 public:
2019  int8_t x, y, z;
2020
2021  Byte3(int8_t initX, int8_t initY, int8_t initZ)
2022    : x(initX), y(initY), z(initZ) {}
2023  Byte3() : x(0), y(0), z(0) {}
2024};
2025
2026class Byte4 {
2027 public:
2028  int8_t x, y, z, w;
2029
2030  Byte4(int8_t initX, int8_t initY, int8_t initZ, int8_t initW)
2031    : x(initX), y(initY), z(initZ), w(initW) {}
2032  Byte4() : x(0), y(0), z(0), w(0) {}
2033};
2034
2035class UByte2 {
2036 public:
2037  uint8_t x, y;
2038
2039  UByte2(uint8_t initX, uint8_t initY)
2040    : x(initX), y(initY) {}
2041  UByte2() : x(0), y(0) {}
2042};
2043
2044class UByte3 {
2045 public:
2046  uint8_t x, y, z;
2047
2048  UByte3(uint8_t initX, uint8_t initY, uint8_t initZ)
2049    : x(initX), y(initY), z(initZ) {}
2050  UByte3() : x(0), y(0), z(0) {}
2051};
2052
2053class UByte4 {
2054 public:
2055  uint8_t x, y, z, w;
2056
2057  UByte4(uint8_t initX, uint8_t initY, uint8_t initZ, uint8_t initW)
2058    : x(initX), y(initY), z(initZ), w(initW) {}
2059  UByte4() : x(0), y(0), z(0), w(0) {}
2060};
2061
2062class Short2 {
2063 public:
2064  short x, y;
2065
2066  Short2(short initX, short initY)
2067    : x(initX), y(initY) {}
2068  Short2() : x(0), y(0) {}
2069};
2070
2071class Short3 {
2072 public:
2073  short x, y, z;
2074
2075  Short3(short initX, short initY, short initZ)
2076    : x(initX), y(initY), z(initZ) {}
2077  Short3() : x(0), y(0), z(0) {}
2078};
2079
2080class Short4 {
2081 public:
2082  short x, y, z, w;
2083
2084  Short4(short initX, short initY, short initZ, short initW)
2085    : x(initX), y(initY), z(initZ), w(initW) {}
2086  Short4() : x(0), y(0), z(0), w(0) {}
2087};
2088
2089class UShort2 {
2090 public:
2091  uint16_t x, y;
2092
2093  UShort2(uint16_t initX, uint16_t initY)
2094    : x(initX), y(initY) {}
2095  UShort2() : x(0), y(0) {}
2096};
2097
2098class UShort3 {
2099 public:
2100  uint16_t x, y, z;
2101
2102  UShort3(uint16_t initX, uint16_t initY, uint16_t initZ)
2103    : x(initX), y(initY), z(initZ) {}
2104  UShort3() : x(0), y(0), z(0) {}
2105};
2106
2107class UShort4 {
2108 public:
2109  uint16_t x, y, z, w;
2110
2111  UShort4(uint16_t initX, uint16_t initY, uint16_t initZ, uint16_t initW)
2112    : x(initX), y(initY), z(initZ), w(initW) {}
2113  UShort4() : x(0), y(0), z(0), w(0) {}
2114};
2115
2116class Int2 {
2117 public:
2118  int x, y;
2119
2120  Int2(int initX, int initY)
2121    : x(initX), y(initY) {}
2122  Int2() : x(0), y(0) {}
2123};
2124
2125class Int3 {
2126 public:
2127  int x, y, z;
2128
2129  Int3(int initX, int initY, int initZ)
2130    : x(initX), y(initY), z(initZ) {}
2131  Int3() : x(0), y(0), z(0) {}
2132};
2133
2134class Int4 {
2135 public:
2136  int x, y, z, w;
2137
2138  Int4(int initX, int initY, int initZ, int initW)
2139    : x(initX), y(initY), z(initZ), w(initW) {}
2140  Int4() : x(0), y(0), z(0), w(0) {}
2141};
2142
2143class UInt2 {
2144 public:
2145  uint32_t x, y;
2146
2147  UInt2(uint32_t initX, uint32_t initY)
2148    : x(initX), y(initY) {}
2149  UInt2() : x(0), y(0) {}
2150};
2151
2152class UInt3 {
2153 public:
2154  uint32_t x, y, z;
2155
2156  UInt3(uint32_t initX, uint32_t initY, uint32_t initZ)
2157    : x(initX), y(initY), z(initZ) {}
2158  UInt3() : x(0), y(0), z(0) {}
2159};
2160
2161class UInt4 {
2162 public:
2163  uint32_t x, y, z, w;
2164
2165  UInt4(uint32_t initX, uint32_t initY, uint32_t initZ, uint32_t initW)
2166    : x(initX), y(initY), z(initZ), w(initW) {}
2167  UInt4() : x(0), y(0), z(0), w(0) {}
2168};
2169
2170class Long2 {
2171 public:
2172  int64_t x, y;
2173
2174  Long2(int64_t initX, int64_t initY)
2175    : x(initX), y(initY) {}
2176  Long2() : x(0), y(0) {}
2177};
2178
2179class Long3 {
2180 public:
2181  int64_t x, y, z;
2182
2183  Long3(int64_t initX, int64_t initY, int64_t initZ)
2184    : x(initX), y(initY), z(initZ) {}
2185  Long3() : x(0), y(0), z(0) {}
2186};
2187
2188class Long4 {
2189 public:
2190  int64_t x, y, z, w;
2191
2192  Long4(int64_t initX, int64_t initY, int64_t initZ, int64_t initW)
2193    : x(initX), y(initY), z(initZ), w(initW) {}
2194  Long4() : x(0), y(0), z(0), w(0) {}
2195};
2196
2197class ULong2 {
2198 public:
2199  uint64_t x, y;
2200
2201  ULong2(uint64_t initX, uint64_t initY)
2202    : x(initX), y(initY) {}
2203  ULong2() : x(0), y(0) {}
2204};
2205
2206class ULong3 {
2207 public:
2208  uint64_t x, y, z;
2209
2210  ULong3(uint64_t initX, uint64_t initY, uint64_t initZ)
2211    : x(initX), y(initY), z(initZ) {}
2212  ULong3() : x(0), y(0), z(0) {}
2213};
2214
2215class ULong4 {
2216 public:
2217  uint64_t x, y, z, w;
2218
2219  ULong4(uint64_t initX, uint64_t initY, uint64_t initZ, uint64_t initW)
2220    : x(initX), y(initY), z(initZ), w(initW) {}
2221  ULong4() : x(0), y(0), z(0), w(0) {}
2222};
2223
2224class Float2 {
2225 public:
2226  float x, y;
2227
2228  Float2(float initX, float initY)
2229    : x(initX), y(initY) {}
2230  Float2() : x(0), y(0) {}
2231};
2232
2233class Float3 {
2234 public:
2235  float x, y, z;
2236
2237  Float3(float initX, float initY, float initZ)
2238    : x(initX), y(initY), z(initZ) {}
2239  Float3() : x(0.f), y(0.f), z(0.f) {}
2240};
2241
2242class Float4 {
2243 public:
2244  float x, y, z, w;
2245
2246  Float4(float initX, float initY, float initZ, float initW)
2247    : x(initX), y(initY), z(initZ), w(initW) {}
2248  Float4() : x(0.f), y(0.f), z(0.f), w(0.f) {}
2249};
2250
2251class Double2 {
2252 public:
2253  double x, y;
2254
2255  Double2(double initX, double initY)
2256    : x(initX), y(initY) {}
2257  Double2() : x(0), y(0) {}
2258};
2259
2260class Double3 {
2261 public:
2262  double x, y, z;
2263
2264  Double3(double initX, double initY, double initZ)
2265    : x(initX), y(initY), z(initZ) {}
2266  Double3() : x(0), y(0), z(0) {}
2267};
2268
2269class Double4 {
2270 public:
2271  double x, y, z, w;
2272
2273  Double4(double initX, double initY, double initZ, double initW)
2274    : x(initX), y(initY), z(initZ), w(initW) {}
2275  Double4() : x(0), y(0), z(0), w(0) {}
2276};
2277
2278}
2279
2280}
2281
2282#endif
2283