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