rsCppStructs.h revision 729b6fe58aff47c4f666b22bbb7a6d6114ddefa9
1/*
2 * Copyright (C) 2012 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 "rsCppUtils.h"
21#ifndef RS_SERVER
22#include "utils/RefBase.h"
23#else
24#include "RefBase.h"
25#endif
26
27#include "rsDispatch.h"
28
29// Every row in an RS allocation is guaranteed to be aligned by this amount
30// Every row in a user-backed allocation must be aligned by this amount
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
48class RS : public android::LightRefBase<RS> {
49
50 public:
51    RS();
52    virtual ~RS();
53
54    bool init(bool forceCpu = false, bool synchronous = false);
55
56    void setErrorHandler(ErrorHandlerFunc_t func);
57    ErrorHandlerFunc_t getErrorHandler() { return mErrorFunc; }
58
59    void setMessageHandler(MessageHandlerFunc_t func);
60    MessageHandlerFunc_t getMessageHandler() { return mMessageFunc; }
61
62    void throwError(const char *err) const;
63
64    RsContext getContext() { return mContext; }
65
66    void finish();
67
68    static dispatchTable* dispatch;
69
70 private:
71    static bool usingNative;
72    static bool initDispatch(int targetApi);
73
74    bool init(int targetApi, bool forceCpu, bool synchronous);
75    static void * threadProc(void *);
76
77    static bool gInitialized;
78    static pthread_mutex_t gInitMutex;
79
80    pthread_t mMessageThreadId;
81    pid_t mNativeMessageThreadId;
82    bool mMessageRun;
83
84    RsDevice mDev;
85    RsContext mContext;
86
87    ErrorHandlerFunc_t mErrorFunc;
88    MessageHandlerFunc_t mMessageFunc;
89    bool mInit;
90
91    struct {
92        const Element *U8;
93        const Element *I8;
94        const Element *U16;
95        const Element *I16;
96        const Element *U32;
97        const Element *I32;
98        const Element *U64;
99        const Element *I64;
100        const Element *F32;
101        const Element *F64;
102        const Element *BOOLEAN;
103
104        const Element *ELEMENT;
105        const Element *TYPE;
106        const Element *ALLOCATION;
107        const Element *SAMPLER;
108        const Element *SCRIPT;
109        const Element *MESH;
110        const Element *PROGRAM_FRAGMENT;
111        const Element *PROGRAM_VERTEX;
112        const Element *PROGRAM_RASTER;
113        const Element *PROGRAM_STORE;
114
115        const Element *A_8;
116        const Element *RGB_565;
117        const Element *RGB_888;
118        const Element *RGBA_5551;
119        const Element *RGBA_4444;
120        const Element *RGBA_8888;
121
122        const Element *FLOAT_2;
123        const Element *FLOAT_3;
124        const Element *FLOAT_4;
125
126        const Element *DOUBLE_2;
127        const Element *DOUBLE_3;
128        const Element *DOUBLE_4;
129
130        const Element *UCHAR_2;
131        const Element *UCHAR_3;
132        const Element *UCHAR_4;
133
134        const Element *CHAR_2;
135        const Element *CHAR_3;
136        const Element *CHAR_4;
137
138        const Element *USHORT_2;
139        const Element *USHORT_3;
140        const Element *USHORT_4;
141
142        const Element *SHORT_2;
143        const Element *SHORT_3;
144        const Element *SHORT_4;
145
146        const Element *UINT_2;
147        const Element *UINT_3;
148        const Element *UINT_4;
149
150        const Element *INT_2;
151        const Element *INT_3;
152        const Element *INT_4;
153
154        const Element *ULONG_2;
155        const Element *ULONG_3;
156        const Element *ULONG_4;
157
158        const Element *LONG_2;
159        const Element *LONG_3;
160        const Element *LONG_4;
161
162        const Element *MATRIX_4X4;
163        const Element *MATRIX_3X3;
164        const Element *MATRIX_2X2;
165    } mElements;
166
167    struct {
168        const Sampler* CLAMP_NEAREST;
169        const Sampler* CLAMP_LINEAR;
170        const Sampler* CLAMP_LINEAR_MIP_LINEAR;
171        const Sampler* WRAP_NEAREST;
172        const Sampler* WRAP_LINEAR;
173        const Sampler* WRAP_LINEAR_MIP_LINEAR;
174        const Sampler* MIRRORED_REPEAT_NEAREST;
175        const Sampler* MIRRORED_REPEAT_LINEAR;
176        const Sampler* MIRRORED_REPEAT_LINEAR_MIP_LINEAR;
177    } mSamplers;
178    friend class Sampler;
179    friend class Element;
180};
181
182class BaseObj : public android::LightRefBase<BaseObj> {
183protected:
184    void *mID;
185    sp<RS> mRS;
186    String8 mName;
187
188    BaseObj(void *id, sp<RS> rs);
189    void checkValid();
190
191    static void * getObjID(sp<const BaseObj> o);
192
193public:
194
195    void * getID() const;
196    virtual ~BaseObj();
197    virtual void updateFromNative();
198    virtual bool equals(const BaseObj *obj);
199};
200
201
202class Allocation : public BaseObj {
203protected:
204    android::sp<const Type> mType;
205    uint32_t mUsage;
206    android::sp<Allocation> mAdaptedAllocation;
207
208    bool mConstrainedLOD;
209    bool mConstrainedFace;
210    bool mConstrainedY;
211    bool mConstrainedZ;
212    bool mReadAllowed;
213    bool mWriteAllowed;
214    uint32_t mSelectedY;
215    uint32_t mSelectedZ;
216    uint32_t mSelectedLOD;
217    RsAllocationCubemapFace mSelectedFace;
218
219    uint32_t mCurrentDimX;
220    uint32_t mCurrentDimY;
221    uint32_t mCurrentDimZ;
222    uint32_t mCurrentCount;
223
224    void * getIDSafe() const;
225    void updateCacheInfo(sp<const Type> t);
226
227    Allocation(void *id, sp<RS> rs, sp<const Type> t, uint32_t usage);
228
229    void validateIsInt32();
230    void validateIsInt16();
231    void validateIsInt8();
232    void validateIsFloat32();
233    void validateIsObject();
234
235    virtual void updateFromNative();
236
237    void validate2DRange(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h);
238
239public:
240    android::sp<const Type> getType() {
241        return mType;
242    }
243
244    void syncAll(RsAllocationUsageType srcLocation);
245    void ioSendOutput();
246    void ioGetInput();
247
248    void generateMipmaps();
249
250    void copy1DRangeFrom(uint32_t off, size_t count, const void *data);
251    void copy1DRangeFrom(uint32_t off, size_t count, sp<const Allocation> data, uint32_t dataOff);
252
253    void copy1DRangeTo(uint32_t off, size_t count, void *data);
254
255    void copy1DFrom(const void* data);
256    void copy1DTo(void* data);
257
258    void copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
259                         const void *data);
260
261    void copy2DRangeTo(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
262                       void *data);
263
264    void copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
265                         sp<const Allocation> data, uint32_t dataXoff, uint32_t dataYoff);
266
267    void copy2DStridedFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
268                           const void *data, size_t stride);
269    void copy2DStridedFrom(const void *data, size_t stride);
270
271    void copy2DStridedTo(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
272                         void *data, size_t stride);
273    void copy2DStridedTo(void *data, size_t stride);
274
275    void resize(int dimX);
276    void resize(int dimX, int dimY);
277
278    static sp<Allocation> createTyped(sp<RS> rs, sp<const Type> type,
279                                   RsAllocationMipmapControl mips, uint32_t usage);
280    static sp<Allocation> createTyped(sp<RS> rs, sp<const Type> type,
281                                   RsAllocationMipmapControl mips, uint32_t usage, void * pointer);
282
283    static sp<Allocation> createTyped(sp<RS> rs, sp<const Type> type,
284                                   uint32_t usage = RS_ALLOCATION_USAGE_SCRIPT);
285    static sp<Allocation> createSized(sp<RS> rs, sp<const Element> e, size_t count,
286                                   uint32_t usage = RS_ALLOCATION_USAGE_SCRIPT);
287    static sp<Allocation> createSized2D(sp<RS> rs, sp<const Element> e,
288                                        size_t x, size_t y,
289                                        uint32_t usage = RS_ALLOCATION_USAGE_SCRIPT);
290
291
292};
293
294class Element : public BaseObj {
295public:
296    bool isComplex();
297    size_t getSubElementCount() {
298        return mVisibleElementMap.size();
299    }
300
301    sp<const Element> getSubElement(uint32_t index);
302    const char * getSubElementName(uint32_t index);
303    size_t getSubElementArraySize(uint32_t index);
304    uint32_t getSubElementOffsetBytes(uint32_t index);
305    RsDataType getDataType() const {
306        return mType;
307    }
308
309    RsDataKind getDataKind() const {
310        return mKind;
311    }
312
313    size_t getSizeBytes() const {
314        return mSizeBytes;
315    }
316
317    static sp<const Element> BOOLEAN(sp<RS> rs);
318    static sp<const Element> U8(sp<RS> rs);
319    static sp<const Element> I8(sp<RS> rs);
320    static sp<const Element> U16(sp<RS> rs);
321    static sp<const Element> I16(sp<RS> rs);
322    static sp<const Element> U32(sp<RS> rs);
323    static sp<const Element> I32(sp<RS> rs);
324    static sp<const Element> U64(sp<RS> rs);
325    static sp<const Element> I64(sp<RS> rs);
326    static sp<const Element> F32(sp<RS> rs);
327    static sp<const Element> F64(sp<RS> rs);
328    static sp<const Element> ELEMENT(sp<RS> rs);
329    static sp<const Element> TYPE(sp<RS> rs);
330    static sp<const Element> ALLOCATION(sp<RS> rs);
331    static sp<const Element> SAMPLER(sp<RS> rs);
332    static sp<const Element> SCRIPT(sp<RS> rs);
333    static sp<const Element> MESH(sp<RS> rs);
334    static sp<const Element> PROGRAM_FRAGMENT(sp<RS> rs);
335    static sp<const Element> PROGRAM_VERTEX(sp<RS> rs);
336    static sp<const Element> PROGRAM_RASTER(sp<RS> rs);
337    static sp<const Element> PROGRAM_STORE(sp<RS> rs);
338
339    static sp<const Element> A_8(sp<RS> rs);
340    static sp<const Element> RGB_565(sp<RS> rs);
341    static sp<const Element> RGB_888(sp<RS> rs);
342    static sp<const Element> RGBA_5551(sp<RS> rs);
343    static sp<const Element> RGBA_4444(sp<RS> rs);
344    static sp<const Element> RGBA_8888(sp<RS> rs);
345
346    static sp<const Element> F32_2(sp<RS> rs);
347    static sp<const Element> F32_3(sp<RS> rs);
348    static sp<const Element> F32_4(sp<RS> rs);
349    static sp<const Element> F64_2(sp<RS> rs);
350    static sp<const Element> F64_3(sp<RS> rs);
351    static sp<const Element> F64_4(sp<RS> rs);
352    static sp<const Element> U8_2(sp<RS> rs);
353    static sp<const Element> U8_3(sp<RS> rs);
354    static sp<const Element> U8_4(sp<RS> rs);
355    static sp<const Element> I8_2(sp<RS> rs);
356    static sp<const Element> I8_3(sp<RS> rs);
357    static sp<const Element> I8_4(sp<RS> rs);
358    static sp<const Element> U16_2(sp<RS> rs);
359    static sp<const Element> U16_3(sp<RS> rs);
360    static sp<const Element> U16_4(sp<RS> rs);
361    static sp<const Element> I16_2(sp<RS> rs);
362    static sp<const Element> I16_3(sp<RS> rs);
363    static sp<const Element> I16_4(sp<RS> rs);
364    static sp<const Element> U32_2(sp<RS> rs);
365    static sp<const Element> U32_3(sp<RS> rs);
366    static sp<const Element> U32_4(sp<RS> rs);
367    static sp<const Element> I32_2(sp<RS> rs);
368    static sp<const Element> I32_3(sp<RS> rs);
369    static sp<const Element> I32_4(sp<RS> rs);
370    static sp<const Element> U64_2(sp<RS> rs);
371    static sp<const Element> U64_3(sp<RS> rs);
372    static sp<const Element> U64_4(sp<RS> rs);
373    static sp<const Element> I64_2(sp<RS> rs);
374    static sp<const Element> I64_3(sp<RS> rs);
375    static sp<const Element> I64_4(sp<RS> rs);
376    static sp<const Element> MATRIX_4X4(sp<RS> rs);
377    static sp<const Element> MATRIX_3X3(sp<RS> rs);
378    static sp<const Element> MATRIX_2X2(sp<RS> rs);
379
380    Element(void *id, sp<RS> rs,
381            android::Vector<sp<Element> > &elements,
382            android::Vector<android::String8> &elementNames,
383            android::Vector<uint32_t> &arraySizes);
384    Element(void *id, sp<RS> rs, RsDataType dt, RsDataKind dk, bool norm, uint32_t size);
385    Element(sp<RS> rs);
386    virtual ~Element();
387
388    void updateFromNative();
389    static sp<const Element> createUser(sp<RS> rs, RsDataType dt);
390    static sp<const Element> createVector(sp<RS> rs, RsDataType dt, uint32_t size);
391    static sp<const Element> createPixel(sp<RS> rs, RsDataType dt, RsDataKind dk);
392    bool isCompatible(sp<const Element>e);
393
394    class Builder {
395    private:
396        sp<RS> mRS;
397        android::Vector<sp<Element> > mElements;
398        android::Vector<android::String8> mElementNames;
399        android::Vector<uint32_t> mArraySizes;
400        bool mSkipPadding;
401
402    public:
403        Builder(sp<RS> rs);
404        ~Builder();
405        void add(sp<Element>, android::String8 &name, uint32_t arraySize = 1);
406        sp<const Element> create();
407    };
408
409private:
410    void updateVisibleSubElements();
411
412    android::Vector<sp</*const*/ Element> > mElements;
413    android::Vector<android::String8> mElementNames;
414    android::Vector<uint32_t> mArraySizes;
415    android::Vector<uint32_t> mVisibleElementMap;
416    android::Vector<uint32_t> mOffsetInBytes;
417
418    RsDataType mType;
419    RsDataKind mKind;
420    bool mNormalized;
421    size_t mSizeBytes;
422    size_t mVectorSize;
423};
424
425class FieldPacker {
426protected:
427    unsigned char* mData;
428    size_t mPos;
429    size_t mLen;
430
431public:
432    FieldPacker(size_t len)
433        : mPos(0),
434          mLen(len) {
435        mData = new unsigned char[len];
436    }
437
438    virtual ~FieldPacker() {
439        delete [] mData;
440    }
441
442    void align(size_t v) {
443        if ((v & (v - 1)) != 0) {
444            ALOGE("Non-power-of-two alignment: %zu", v);
445            return;
446        }
447
448        while ((mPos & (v - 1)) != 0) {
449            mData[mPos++] = 0;
450        }
451    }
452
453    void reset() {
454        mPos = 0;
455    }
456
457    void reset(size_t i) {
458        if (i >= mLen) {
459            ALOGE("Out of bounds: i (%zu) >= len (%zu)", i, mLen);
460            return;
461        }
462        mPos = i;
463    }
464
465    void skip(size_t i) {
466        size_t res = mPos + i;
467        if (res > mLen) {
468            ALOGE("Exceeded buffer length: i (%zu) > len (%zu)", i, mLen);
469            return;
470        }
471        mPos = res;
472    }
473
474    void* getData() const {
475        return mData;
476    }
477
478    size_t getLength() const {
479        return mLen;
480    }
481
482    template <typename T>
483    void add(T t) {
484        align(sizeof(t));
485        if (mPos + sizeof(t) <= mLen) {
486            memcpy(&mData[mPos], &t, sizeof(t));
487            mPos += sizeof(t);
488        }
489    }
490
491    /*
492    void add(rs_matrix4x4 m) {
493        for (size_t i = 0; i < 16; i++) {
494            add(m.m[i]);
495        }
496    }
497
498    void add(rs_matrix3x3 m) {
499        for (size_t i = 0; i < 9; i++) {
500            add(m.m[i]);
501        }
502    }
503
504    void add(rs_matrix2x2 m) {
505        for (size_t i = 0; i < 4; i++) {
506            add(m.m[i]);
507        }
508    }
509    */
510
511    void add(BaseObj* obj) {
512        if (obj != NULL) {
513            add((uint32_t) (uintptr_t) obj->getID());
514        } else {
515            add((uint32_t) 0);
516        }
517    }
518};
519
520class Type : public BaseObj {
521protected:
522    friend class Allocation;
523
524    uint32_t mDimX;
525    uint32_t mDimY;
526    uint32_t mDimZ;
527    bool mDimMipmaps;
528    bool mDimFaces;
529    size_t mElementCount;
530    sp<const Element> mElement;
531
532    void calcElementCount();
533    virtual void updateFromNative();
534
535public:
536
537    sp<const Element> getElement() const {
538        return mElement;
539    }
540
541    uint32_t getX() const {
542        return mDimX;
543    }
544
545    uint32_t getY() const {
546        return mDimY;
547    }
548
549    uint32_t getZ() const {
550        return mDimZ;
551    }
552
553    bool hasMipmaps() const {
554        return mDimMipmaps;
555    }
556
557    bool hasFaces() const {
558        return mDimFaces;
559    }
560
561    size_t getCount() const {
562        return mElementCount;
563    }
564
565    size_t getSizeBytes() const {
566        return mElementCount * mElement->getSizeBytes();
567    }
568
569    Type(void *id, sp<RS> rs);
570
571    static sp<const Type> create(sp<RS> rs, sp<const Element> e, uint32_t dimX, uint32_t dimY, uint32_t dimZ);
572
573    class Builder {
574    protected:
575        sp<RS> mRS;
576        uint32_t mDimX;
577        uint32_t mDimY;
578        uint32_t mDimZ;
579        bool mDimMipmaps;
580        bool mDimFaces;
581        sp<const Element> mElement;
582
583    public:
584        Builder(sp<RS> rs, sp<const Element> e);
585
586        void setX(uint32_t value);
587        void setY(int value);
588        void setMipmaps(bool value);
589        void setFaces(bool value);
590        sp<const Type> create();
591    };
592
593};
594
595class Script : public BaseObj {
596private:
597
598protected:
599    Script(void *id, sp<RS> rs);
600    void forEach(uint32_t slot, sp<const Allocation> in, sp<const Allocation> out,
601            const void *v, size_t) const;
602    void bindAllocation(sp<Allocation> va, uint32_t slot) const;
603    void setVar(uint32_t index, const void *, size_t len) const;
604    void setVar(uint32_t index, sp<const BaseObj> o) const;
605    void invoke(uint32_t slot, const void *v, size_t len) const;
606
607
608    void invoke(uint32_t slot) const {
609        invoke(slot, NULL, 0);
610    }
611    void setVar(uint32_t index, float v) const {
612        setVar(index, &v, sizeof(v));
613    }
614    void setVar(uint32_t index, double v) const {
615        setVar(index, &v, sizeof(v));
616    }
617    void setVar(uint32_t index, int32_t v) const {
618        setVar(index, &v, sizeof(v));
619    }
620    void setVar(uint32_t index, int64_t v) const {
621        setVar(index, &v, sizeof(v));
622    }
623    void setVar(uint32_t index, bool v) const {
624        setVar(index, &v, sizeof(v));
625    }
626
627public:
628    class FieldBase {
629    protected:
630        sp<const Element> mElement;
631        sp<Allocation> mAllocation;
632
633        void init(sp<RS> rs, uint32_t dimx, uint32_t usages = 0);
634
635    public:
636        sp<const Element> getElement() {
637            return mElement;
638        }
639
640        sp<const Type> getType() {
641            return mAllocation->getType();
642        }
643
644        sp<const Allocation> getAllocation() {
645            return mAllocation;
646        }
647
648        //void updateAllocation();
649    };
650};
651
652class ScriptC : public Script {
653protected:
654    ScriptC(sp<RS> rs,
655            const void *codeTxt, size_t codeLength,
656            const char *cachedName, size_t cachedNameLength,
657            const char *cacheDir, size_t cacheDirLength);
658
659};
660
661class ScriptIntrinsic : public Script {
662 protected:
663    ScriptIntrinsic(sp<RS> rs, int id, sp<const Element> e);
664};
665
666class ScriptIntrinsicBlend : public ScriptIntrinsic {
667 public:
668    ScriptIntrinsicBlend(sp<RS> rs, sp <const Element> e);
669    void blendClear(sp<Allocation> in, sp<Allocation> out);
670    void blendSrc(sp<Allocation> in, sp<Allocation> out);
671    void blendDst(sp<Allocation> in, sp<Allocation> out);
672    void blendSrcOver(sp<Allocation> in, sp<Allocation> out);
673    void blendDstOver(sp<Allocation> in, sp<Allocation> out);
674    void blendSrcIn(sp<Allocation> in, sp<Allocation> out);
675    void blendDstIn(sp<Allocation> in, sp<Allocation> out);
676    void blendSrcOut(sp<Allocation> in, sp<Allocation> out);
677    void blendDstOut(sp<Allocation> in, sp<Allocation> out);
678    void blendSrcAtop(sp<Allocation> in, sp<Allocation> out);
679    void blendDstAtop(sp<Allocation> in, sp<Allocation> out);
680    void blendXor(sp<Allocation> in, sp<Allocation> out);
681    void blendMultiply(sp<Allocation> in, sp<Allocation> out);
682    void blendAdd(sp<Allocation> in, sp<Allocation> out);
683    void blendSubtract(sp<Allocation> in, sp<Allocation> out);
684};
685
686class ScriptIntrinsicBlur : public ScriptIntrinsic {
687 public:
688    ScriptIntrinsicBlur(sp<RS> rs, sp <const Element> e);
689    void blur(sp<Allocation> in, sp<Allocation> out);
690    void setRadius(float radius);
691};
692
693 class Sampler : public BaseObj {
694 private:
695    Sampler(sp<RS> rs, void* id);
696    RsSamplerValue mMin;
697    RsSamplerValue mMag;
698    RsSamplerValue mWrapS;
699    RsSamplerValue mWrapT;
700    RsSamplerValue mWrapR;
701    float mAniso;
702
703 public:
704    static sp<Sampler> create(sp<RS> rs, RsSamplerValue min, RsSamplerValue mag, RsSamplerValue wrapS, RsSamplerValue wrapT, float anisotropy);
705
706    RsSamplerValue getMinification();
707    RsSamplerValue getMagnification();
708    RsSamplerValue getWrapS();
709    RsSamplerValue getWrapT();
710    float getAnisotropy();
711
712    sp<const Sampler> CLAMP_NEAREST(sp<RS> rs);
713    sp<const Sampler> CLAMP_LINEAR(sp<RS> rs);
714    sp<const Sampler> CLAMP_LINEAR_MIP_LINEAR(sp<RS> rs);
715    sp<const Sampler> WRAP_NEAREST(sp<RS> rs);
716    sp<const Sampler> WRAP_LINEAR(sp<RS> rs);
717    sp<const Sampler> WRAP_LINEAR_MIP_LINEAR(sp<RS> rs);
718    sp<const Sampler> MIRRORED_REPEAT_NEAREST(sp<RS> rs);
719    sp<const Sampler> MIRRORED_REPEAT_LINEAR(sp<RS> rs);
720    sp<const Sampler> MIRRORED_REPEAT_LINEAR_MIP_LINEAR(sp<RS> rs);
721
722};
723
724}
725
726}
727
728#endif
729