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