rsCppStructs.h revision 2acce99bd7d6bb97d8a4d4778107968aa09d6e02
184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray/*
289daad6bae798779e57f252e9da4fe4e62337124Tim Murray * Copyright (C) 2013 The Android Open Source Project
384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray *
484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray * Licensed under the Apache License, Version 2.0 (the "License");
584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray * you may not use this file except in compliance with the License.
684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray * You may obtain a copy of the License at
784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray *
884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray *      http://www.apache.org/licenses/LICENSE-2.0
984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray *
1084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray * Unless required by applicable law or agreed to in writing, software
1184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray * distributed under the License is distributed on an "AS IS" BASIS,
1284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray * See the License for the specific language governing permissions and
1484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray * limitations under the License.
1584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray */
1684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
1784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray#ifndef ANDROID_RSCPPSTRUCTS_H
1884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray#define ANDROID_RSCPPSTRUCTS_H
1984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
2089daad6bae798779e57f252e9da4fe4e62337124Tim Murray#include "rsDefines.h"
21f9e077a531c6a83e978d55f427b5d8ff6d2c943fJason Sams#include "rsCppUtils.h"
2289daad6bae798779e57f252e9da4fe4e62337124Tim Murray#include "util/RefBase.h"
23a423096c0d49e5cfe13a400b4323a76f89c6885cTim Murray#include "rsDispatch.h"
24a423096c0d49e5cfe13a400b4323a76f89c6885cTim Murray
2589daad6bae798779e57f252e9da4fe4e62337124Tim Murray#include <vector>
26ab71636b50db242cead6a3787620d6340156684cTim Murray#include <string>
2789daad6bae798779e57f252e9da4fe4e62337124Tim Murray
2896267c2ff0133c20cc5643419a3ed3b1e75fe568Tim Murray// Every row in an RS allocation is guaranteed to be aligned by this amount
2996267c2ff0133c20cc5643419a3ed3b1e75fe568Tim Murray// Every row in a user-backed allocation must be aligned by this amount
3096267c2ff0133c20cc5643419a3ed3b1e75fe568Tim Murray#define RS_CPU_ALLOCATION_ALIGNMENT 16
3196267c2ff0133c20cc5643419a3ed3b1e75fe568Tim Murray
3284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murraynamespace android {
339eb7f4b90120ebe4be74343856e86b46495f72dfTim Murraynamespace RSC {
3484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
3584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murraytypedef void (*ErrorHandlerFunc_t)(uint32_t errorNum, const char *errorText);
3684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murraytypedef void (*MessageHandlerFunc_t)(uint32_t msgNum, const void *msgData, size_t msgLen);
3784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
3884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayclass RS;
3984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayclass BaseObj;
4084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayclass Element;
4184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayclass Type;
4284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayclass Allocation;
4384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayclass Script;
4484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayclass ScriptC;
45729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murrayclass Sampler;
4684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
4721fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray enum RSError {
4821fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray     RS_SUCCESS = 0,
4921fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray     RS_ERROR_INVALID_PARAMETER = 1,
5021fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray     RS_ERROR_RUNTIME_ERROR = 2,
5110913a5c37ba119bef335320d3e8be25212c05adTim Murray     RS_ERROR_INVALID_ELEMENT = 3,
5221fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray     RS_ERROR_MAX = 9999
5321fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray
5421fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray };
5521fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray
56eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray enum RSYuvFormat {
57eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray     RS_YUV_NONE = 0,
58eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray     RS_YUV_YV12 = 1,
59eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray     RS_YUV_NV21 = 2,
60eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray     RS_YUV_MAX = 3
61eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray };
62eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray
6389daad6bae798779e57f252e9da4fe4e62337124Tim Murray class RS : public android::RSC::LightRefBase<RS> {
6484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
6584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray public:
6684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    RS();
6784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    virtual ~RS();
6884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
694d252d6e807b89764dad123ac845df298c52ca97Tim Murray    bool init(bool forceCpu = false, bool synchronous = false);
7084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
7184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void setErrorHandler(ErrorHandlerFunc_t func);
7284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    ErrorHandlerFunc_t getErrorHandler() { return mErrorFunc; }
7384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
7484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void setMessageHandler(MessageHandlerFunc_t func);
7584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    MessageHandlerFunc_t getMessageHandler() { return mMessageFunc; }
7684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
7721fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray    void throwError(RSError error, const char *errMsg);
7810913a5c37ba119bef335320d3e8be25212c05adTim Murray    RSError getError();
7984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
8084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    RsContext getContext() { return mContext; }
8184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
82baca6c3c3d79a324c7976ba873afdded0b6bcfb5Tim Murray    void finish();
83baca6c3c3d79a324c7976ba873afdded0b6bcfb5Tim Murray
84a423096c0d49e5cfe13a400b4323a76f89c6885cTim Murray    static dispatchTable* dispatch;
85a423096c0d49e5cfe13a400b4323a76f89c6885cTim Murray
8684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray private:
874a92d1268983edaf329f73c8a5b8860cdbb11596Tim Murray    static bool usingNative;
88a423096c0d49e5cfe13a400b4323a76f89c6885cTim Murray    static bool initDispatch(int targetApi);
89a423096c0d49e5cfe13a400b4323a76f89c6885cTim Murray
904d252d6e807b89764dad123ac845df298c52ca97Tim Murray    bool init(int targetApi, bool forceCpu, bool synchronous);
9184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static void * threadProc(void *);
9284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
9384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static bool gInitialized;
9484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static pthread_mutex_t gInitMutex;
9584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
9684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    pthread_t mMessageThreadId;
9784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    pid_t mNativeMessageThreadId;
9884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    bool mMessageRun;
9984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
10084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    RsDevice mDev;
10184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    RsContext mContext;
10221fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray    RSError mCurrentError;
10384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
10484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    ErrorHandlerFunc_t mErrorFunc;
10584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    MessageHandlerFunc_t mMessageFunc;
106a423096c0d49e5cfe13a400b4323a76f89c6885cTim Murray    bool mInit;
10784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
10884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    struct {
10989daad6bae798779e57f252e9da4fe4e62337124Tim Murray        sp<const Element> U8;
110eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray        sp<const Element> U8_2;
111eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray        sp<const Element> U8_3;
112eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray        sp<const Element> U8_4;
11389daad6bae798779e57f252e9da4fe4e62337124Tim Murray        sp<const Element> I8;
114eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray        sp<const Element> I8_2;
115eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray        sp<const Element> I8_3;
116eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray        sp<const Element> I8_4;
11789daad6bae798779e57f252e9da4fe4e62337124Tim Murray        sp<const Element> U16;
118eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray        sp<const Element> U16_2;
119eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray        sp<const Element> U16_3;
120eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray        sp<const Element> U16_4;
12189daad6bae798779e57f252e9da4fe4e62337124Tim Murray        sp<const Element> I16;
122eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray        sp<const Element> I16_2;
123eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray        sp<const Element> I16_3;
124eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray        sp<const Element> I16_4;
12589daad6bae798779e57f252e9da4fe4e62337124Tim Murray        sp<const Element> U32;
126eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray        sp<const Element> U32_2;
127eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray        sp<const Element> U32_3;
128eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray        sp<const Element> U32_4;
12989daad6bae798779e57f252e9da4fe4e62337124Tim Murray        sp<const Element> I32;
130eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray        sp<const Element> I32_2;
131eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray        sp<const Element> I32_3;
132eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray        sp<const Element> I32_4;
13389daad6bae798779e57f252e9da4fe4e62337124Tim Murray        sp<const Element> U64;
134eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray        sp<const Element> U64_2;
135eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray        sp<const Element> U64_3;
136eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray        sp<const Element> U64_4;
13789daad6bae798779e57f252e9da4fe4e62337124Tim Murray        sp<const Element> I64;
138eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray        sp<const Element> I64_2;
139eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray        sp<const Element> I64_3;
140eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray        sp<const Element> I64_4;
14189daad6bae798779e57f252e9da4fe4e62337124Tim Murray        sp<const Element> F32;
142eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray        sp<const Element> F32_2;
143eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray        sp<const Element> F32_3;
144eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray        sp<const Element> F32_4;
14589daad6bae798779e57f252e9da4fe4e62337124Tim Murray        sp<const Element> F64;
146eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray        sp<const Element> F64_2;
147eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray        sp<const Element> F64_3;
148eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray        sp<const Element> F64_4;
14989daad6bae798779e57f252e9da4fe4e62337124Tim Murray        sp<const Element> BOOLEAN;
15089daad6bae798779e57f252e9da4fe4e62337124Tim Murray
15189daad6bae798779e57f252e9da4fe4e62337124Tim Murray        sp<const Element> ELEMENT;
15289daad6bae798779e57f252e9da4fe4e62337124Tim Murray        sp<const Element> TYPE;
15389daad6bae798779e57f252e9da4fe4e62337124Tim Murray        sp<const Element> ALLOCATION;
15489daad6bae798779e57f252e9da4fe4e62337124Tim Murray        sp<const Element> SAMPLER;
15589daad6bae798779e57f252e9da4fe4e62337124Tim Murray        sp<const Element> SCRIPT;
15689daad6bae798779e57f252e9da4fe4e62337124Tim Murray        sp<const Element> MESH;
15789daad6bae798779e57f252e9da4fe4e62337124Tim Murray        sp<const Element> PROGRAM_FRAGMENT;
15889daad6bae798779e57f252e9da4fe4e62337124Tim Murray        sp<const Element> PROGRAM_VERTEX;
15989daad6bae798779e57f252e9da4fe4e62337124Tim Murray        sp<const Element> PROGRAM_RASTER;
16089daad6bae798779e57f252e9da4fe4e62337124Tim Murray        sp<const Element> PROGRAM_STORE;
16189daad6bae798779e57f252e9da4fe4e62337124Tim Murray
16289daad6bae798779e57f252e9da4fe4e62337124Tim Murray        sp<const Element> A_8;
16389daad6bae798779e57f252e9da4fe4e62337124Tim Murray        sp<const Element> RGB_565;
16489daad6bae798779e57f252e9da4fe4e62337124Tim Murray        sp<const Element> RGB_888;
16589daad6bae798779e57f252e9da4fe4e62337124Tim Murray        sp<const Element> RGBA_5551;
16689daad6bae798779e57f252e9da4fe4e62337124Tim Murray        sp<const Element> RGBA_4444;
16789daad6bae798779e57f252e9da4fe4e62337124Tim Murray        sp<const Element> RGBA_8888;
16889daad6bae798779e57f252e9da4fe4e62337124Tim Murray
169eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray        sp<const Element> YUV;
17089daad6bae798779e57f252e9da4fe4e62337124Tim Murray
17189daad6bae798779e57f252e9da4fe4e62337124Tim Murray        sp<const Element> MATRIX_4X4;
17289daad6bae798779e57f252e9da4fe4e62337124Tim Murray        sp<const Element> MATRIX_3X3;
17389daad6bae798779e57f252e9da4fe4e62337124Tim Murray        sp<const Element> MATRIX_2X2;
17484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    } mElements;
17584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
176729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray    struct {
17789daad6bae798779e57f252e9da4fe4e62337124Tim Murray        sp<const Sampler> CLAMP_NEAREST;
17889daad6bae798779e57f252e9da4fe4e62337124Tim Murray        sp<const Sampler> CLAMP_LINEAR;
17989daad6bae798779e57f252e9da4fe4e62337124Tim Murray        sp<const Sampler> CLAMP_LINEAR_MIP_LINEAR;
18089daad6bae798779e57f252e9da4fe4e62337124Tim Murray        sp<const Sampler> WRAP_NEAREST;
18189daad6bae798779e57f252e9da4fe4e62337124Tim Murray        sp<const Sampler> WRAP_LINEAR;
18289daad6bae798779e57f252e9da4fe4e62337124Tim Murray        sp<const Sampler> WRAP_LINEAR_MIP_LINEAR;
18389daad6bae798779e57f252e9da4fe4e62337124Tim Murray        sp<const Sampler> MIRRORED_REPEAT_NEAREST;
18489daad6bae798779e57f252e9da4fe4e62337124Tim Murray        sp<const Sampler> MIRRORED_REPEAT_LINEAR;
18589daad6bae798779e57f252e9da4fe4e62337124Tim Murray        sp<const Sampler> MIRRORED_REPEAT_LINEAR_MIP_LINEAR;
186729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray    } mSamplers;
187729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray    friend class Sampler;
188729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray    friend class Element;
18984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray};
19084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
19189daad6bae798779e57f252e9da4fe4e62337124Tim Murrayclass BaseObj : public android::RSC::LightRefBase<BaseObj> {
19289daad6bae798779e57f252e9da4fe4e62337124Tim Murraypublic:
19389daad6bae798779e57f252e9da4fe4e62337124Tim Murray    void * getID() const;
19489daad6bae798779e57f252e9da4fe4e62337124Tim Murray    virtual ~BaseObj();
19589daad6bae798779e57f252e9da4fe4e62337124Tim Murray    virtual void updateFromNative();
19689daad6bae798779e57f252e9da4fe4e62337124Tim Murray    virtual bool equals(sp<const BaseObj> obj);
19789daad6bae798779e57f252e9da4fe4e62337124Tim Murray
19884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayprotected:
19984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void *mID;
20084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    sp<RS> mRS;
201ab71636b50db242cead6a3787620d6340156684cTim Murray    std::string mName;
20284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
20384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    BaseObj(void *id, sp<RS> rs);
20484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void checkValid();
20584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
20684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static void * getObjID(sp<const BaseObj> o);
20784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
20884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray};
20984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
21084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
21184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayclass Allocation : public BaseObj {
21284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayprotected:
21389daad6bae798779e57f252e9da4fe4e62337124Tim Murray    sp<const Type> mType;
21484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    uint32_t mUsage;
21589daad6bae798779e57f252e9da4fe4e62337124Tim Murray    sp<Allocation> mAdaptedAllocation;
21684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
21784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    bool mConstrainedLOD;
21884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    bool mConstrainedFace;
21984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    bool mConstrainedY;
22084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    bool mConstrainedZ;
22184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    bool mReadAllowed;
22284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    bool mWriteAllowed;
22384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    uint32_t mSelectedY;
22484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    uint32_t mSelectedZ;
22584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    uint32_t mSelectedLOD;
22684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    RsAllocationCubemapFace mSelectedFace;
22784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
22884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    uint32_t mCurrentDimX;
22984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    uint32_t mCurrentDimY;
23084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    uint32_t mCurrentDimZ;
23184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    uint32_t mCurrentCount;
23284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
23384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void * getIDSafe() const;
23484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void updateCacheInfo(sp<const Type> t);
23584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
23684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    Allocation(void *id, sp<RS> rs, sp<const Type> t, uint32_t usage);
23784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
23884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void validateIsInt32();
23984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void validateIsInt16();
24084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void validateIsInt8();
24184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void validateIsFloat32();
24284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void validateIsObject();
24384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
24484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    virtual void updateFromNative();
24584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
24684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void validate2DRange(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h);
24784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
24884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murraypublic:
249a180b7d58ac6da9d6da866e43aa8c1fa83923dc5Stephen Hines    sp<const Type> getType() const {
25084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        return mType;
25184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    }
25284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
25384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void syncAll(RsAllocationUsageType srcLocation);
25484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void ioSendOutput();
25584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void ioGetInput();
25684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
25784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void generateMipmaps();
258509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray
2590b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray    void copy1DRangeFrom(uint32_t off, size_t count, const void *data);
260a4cbc2b0cf0f6fbdb21e84a3e17585eda1885e3eTim Murray    void copy1DRangeFrom(uint32_t off, size_t count, sp<const Allocation> data, uint32_t dataOff);
26184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
2620b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray    void copy1DRangeTo(uint32_t off, size_t count, void *data);
263a4cbc2b0cf0f6fbdb21e84a3e17585eda1885e3eTim Murray
2640b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray    void copy1DFrom(const void* data);
2650b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray    void copy1DTo(void* data);
2660b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray
2670b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray    void copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
2680b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray                         const void *data);
2697b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murray
2707b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murray    void copy2DRangeTo(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
2717b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murray                       void *data);
2727b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murray
27384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
2740b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray                         sp<const Allocation> data, uint32_t dataXoff, uint32_t dataYoff);
27584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
276358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    void copy2DStridedFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
277358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray                           const void *data, size_t stride);
278358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    void copy2DStridedFrom(const void *data, size_t stride);
279358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray
280358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    void copy2DStridedTo(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
281358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray                         void *data, size_t stride);
282358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    void copy2DStridedTo(void *data, size_t stride);
283358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray
28484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void resize(int dimX);
28584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void resize(int dimX, int dimY);
28684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
28784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<Allocation> createTyped(sp<RS> rs, sp<const Type> type,
28884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray                                   RsAllocationMipmapControl mips, uint32_t usage);
28984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<Allocation> createTyped(sp<RS> rs, sp<const Type> type,
29084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray                                   RsAllocationMipmapControl mips, uint32_t usage, void * pointer);
29184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
29284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<Allocation> createTyped(sp<RS> rs, sp<const Type> type,
29384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray                                   uint32_t usage = RS_ALLOCATION_USAGE_SCRIPT);
29484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<Allocation> createSized(sp<RS> rs, sp<const Element> e, size_t count,
29584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray                                   uint32_t usage = RS_ALLOCATION_USAGE_SCRIPT);
296684726cbbd177ee4ee9000e9422058547acd237fTim Murray    static sp<Allocation> createSized2D(sp<RS> rs, sp<const Element> e,
297684726cbbd177ee4ee9000e9422058547acd237fTim Murray                                        size_t x, size_t y,
298684726cbbd177ee4ee9000e9422058547acd237fTim Murray                                        uint32_t usage = RS_ALLOCATION_USAGE_SCRIPT);
299684726cbbd177ee4ee9000e9422058547acd237fTim Murray
30084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
30184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray};
30284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
30384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayclass Element : public BaseObj {
30484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murraypublic:
30584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    bool isComplex();
30684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    size_t getSubElementCount() {
30784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        return mVisibleElementMap.size();
30884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    }
30984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
31084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    sp<const Element> getSubElement(uint32_t index);
31184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    const char * getSubElementName(uint32_t index);
31284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    size_t getSubElementArraySize(uint32_t index);
31384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    uint32_t getSubElementOffsetBytes(uint32_t index);
31484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    RsDataType getDataType() const {
31584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        return mType;
31684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    }
31784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
31884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    RsDataKind getDataKind() const {
31984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        return mKind;
32084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    }
32184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
32284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    size_t getSizeBytes() const {
32384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        return mSizeBytes;
32484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    }
32584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
32610913a5c37ba119bef335320d3e8be25212c05adTim Murray    uint32_t getVectorSize() const {
32710913a5c37ba119bef335320d3e8be25212c05adTim Murray        return mVectorSize;
32810913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
32910913a5c37ba119bef335320d3e8be25212c05adTim Murray
33084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> BOOLEAN(sp<RS> rs);
33184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> U8(sp<RS> rs);
33284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> I8(sp<RS> rs);
33384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> U16(sp<RS> rs);
33484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> I16(sp<RS> rs);
33584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> U32(sp<RS> rs);
33684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> I32(sp<RS> rs);
33784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> U64(sp<RS> rs);
33884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> I64(sp<RS> rs);
33984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> F32(sp<RS> rs);
34084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> F64(sp<RS> rs);
34184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> ELEMENT(sp<RS> rs);
34284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> TYPE(sp<RS> rs);
34384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> ALLOCATION(sp<RS> rs);
34484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> SAMPLER(sp<RS> rs);
34584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> SCRIPT(sp<RS> rs);
34684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> MESH(sp<RS> rs);
34784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> PROGRAM_FRAGMENT(sp<RS> rs);
34884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> PROGRAM_VERTEX(sp<RS> rs);
34984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> PROGRAM_RASTER(sp<RS> rs);
35084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> PROGRAM_STORE(sp<RS> rs);
35184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
35284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> A_8(sp<RS> rs);
35384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> RGB_565(sp<RS> rs);
35484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> RGB_888(sp<RS> rs);
35584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> RGBA_5551(sp<RS> rs);
35684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> RGBA_4444(sp<RS> rs);
35784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> RGBA_8888(sp<RS> rs);
35884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
35984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> F32_2(sp<RS> rs);
36084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> F32_3(sp<RS> rs);
36184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> F32_4(sp<RS> rs);
36284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> F64_2(sp<RS> rs);
36384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> F64_3(sp<RS> rs);
36484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> F64_4(sp<RS> rs);
36584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> U8_2(sp<RS> rs);
36684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> U8_3(sp<RS> rs);
36784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> U8_4(sp<RS> rs);
36884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> I8_2(sp<RS> rs);
36984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> I8_3(sp<RS> rs);
37084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> I8_4(sp<RS> rs);
37184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> U16_2(sp<RS> rs);
37284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> U16_3(sp<RS> rs);
37384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> U16_4(sp<RS> rs);
37484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> I16_2(sp<RS> rs);
37584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> I16_3(sp<RS> rs);
37684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> I16_4(sp<RS> rs);
37784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> U32_2(sp<RS> rs);
37884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> U32_3(sp<RS> rs);
37984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> U32_4(sp<RS> rs);
38084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> I32_2(sp<RS> rs);
38184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> I32_3(sp<RS> rs);
38284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> I32_4(sp<RS> rs);
38384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> U64_2(sp<RS> rs);
38484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> U64_3(sp<RS> rs);
38584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> U64_4(sp<RS> rs);
38684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> I64_2(sp<RS> rs);
38784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> I64_3(sp<RS> rs);
38884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> I64_4(sp<RS> rs);
389eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray    static sp<const Element> YUV(sp<RS> rs);
39084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> MATRIX_4X4(sp<RS> rs);
39184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> MATRIX_3X3(sp<RS> rs);
39284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> MATRIX_2X2(sp<RS> rs);
39384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
39484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void updateFromNative();
39584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> createUser(sp<RS> rs, RsDataType dt);
39684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> createVector(sp<RS> rs, RsDataType dt, uint32_t size);
39784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> createPixel(sp<RS> rs, RsDataType dt, RsDataKind dk);
39810913a5c37ba119bef335320d3e8be25212c05adTim Murray    bool isCompatible(sp<const Element>e) const;
39984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
40084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    class Builder {
40184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    private:
40284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        sp<RS> mRS;
40389daad6bae798779e57f252e9da4fe4e62337124Tim Murray        std::vector<sp<Element> > mElements;
404ab71636b50db242cead6a3787620d6340156684cTim Murray        std::vector<std::string> mElementNames;
40589daad6bae798779e57f252e9da4fe4e62337124Tim Murray        std::vector<uint32_t> mArraySizes;
40684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        bool mSkipPadding;
40784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
40884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    public:
40984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Builder(sp<RS> rs);
41084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        ~Builder();
411ab71636b50db242cead6a3787620d6340156684cTim Murray        void add(sp<Element> e, std::string &name, uint32_t arraySize = 1);
41284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        sp<const Element> create();
41384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    };
41484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
4157d1b757c0be2622b72b3d3a10826752adb3e5182Stephen Hinesprotected:
4167d1b757c0be2622b72b3d3a10826752adb3e5182Stephen Hines    Element(void *id, sp<RS> rs,
4177d1b757c0be2622b72b3d3a10826752adb3e5182Stephen Hines            std::vector<sp<Element> > &elements,
4187d1b757c0be2622b72b3d3a10826752adb3e5182Stephen Hines            std::vector<std::string> &elementNames,
4197d1b757c0be2622b72b3d3a10826752adb3e5182Stephen Hines            std::vector<uint32_t> &arraySizes);
4207d1b757c0be2622b72b3d3a10826752adb3e5182Stephen Hines    Element(void *id, sp<RS> rs, RsDataType dt, RsDataKind dk, bool norm, uint32_t size);
4217d1b757c0be2622b72b3d3a10826752adb3e5182Stephen Hines    Element(sp<RS> rs);
4227d1b757c0be2622b72b3d3a10826752adb3e5182Stephen Hines    virtual ~Element();
4237d1b757c0be2622b72b3d3a10826752adb3e5182Stephen Hines
42484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayprivate:
42584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void updateVisibleSubElements();
42684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
42789daad6bae798779e57f252e9da4fe4e62337124Tim Murray    std::vector<sp<Element> > mElements;
428ab71636b50db242cead6a3787620d6340156684cTim Murray    std::vector<std::string> mElementNames;
42989daad6bae798779e57f252e9da4fe4e62337124Tim Murray    std::vector<uint32_t> mArraySizes;
43089daad6bae798779e57f252e9da4fe4e62337124Tim Murray    std::vector<uint32_t> mVisibleElementMap;
43189daad6bae798779e57f252e9da4fe4e62337124Tim Murray    std::vector<uint32_t> mOffsetInBytes;
43284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
43384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    RsDataType mType;
43484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    RsDataKind mKind;
43584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    bool mNormalized;
43684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    size_t mSizeBytes;
43784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    size_t mVectorSize;
43884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray};
43984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
4402c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hinesclass FieldPacker {
4412c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hinesprotected:
4422c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines    unsigned char* mData;
4432c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines    size_t mPos;
4442c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines    size_t mLen;
4452c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines
4462c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hinespublic:
4472c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines    FieldPacker(size_t len)
44889daad6bae798779e57f252e9da4fe4e62337124Tim Murray        : mPos(0), mLen(len) {
44989daad6bae798779e57f252e9da4fe4e62337124Tim Murray            mData = new unsigned char[len];
45089daad6bae798779e57f252e9da4fe4e62337124Tim Murray        }
4512c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines
4522c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines    virtual ~FieldPacker() {
4532c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines        delete [] mData;
4542c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines    }
4552c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines
4562c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines    void align(size_t v) {
4572c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines        if ((v & (v - 1)) != 0) {
458ab71636b50db242cead6a3787620d6340156684cTim Murray            //            ALOGE("Non-power-of-two alignment: %zu", v);
4592c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines            return;
4602c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines        }
4612c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines
4622c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines        while ((mPos & (v - 1)) != 0) {
4632c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines            mData[mPos++] = 0;
4642c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines        }
4652c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines    }
4662c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines
4672c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines    void reset() {
4682c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines        mPos = 0;
4692c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines    }
4702c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines
4712c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines    void reset(size_t i) {
4722c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines        if (i >= mLen) {
473ab71636b50db242cead6a3787620d6340156684cTim Murray            //            ALOGE("Out of bounds: i (%zu) >= len (%zu)", i, mLen);
4742c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines            return;
4752c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines        }
4762c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines        mPos = i;
4772c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines    }
4782c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines
4792c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines    void skip(size_t i) {
4802c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines        size_t res = mPos + i;
4812c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines        if (res > mLen) {
482ab71636b50db242cead6a3787620d6340156684cTim Murray            //            ALOGE("Exceeded buffer length: i (%zu) > len (%zu)", i, mLen);
4832c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines            return;
4842c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines        }
4852c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines        mPos = res;
4862c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines    }
4872c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines
4882c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines    void* getData() const {
4892c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines        return mData;
4902c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines    }
4912c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines
4922c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines    size_t getLength() const {
4932c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines        return mLen;
4942c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines    }
4952c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines
4962c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines    template <typename T>
49789daad6bae798779e57f252e9da4fe4e62337124Tim Murray        void add(T t) {
4982c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines        align(sizeof(t));
4992c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines        if (mPos + sizeof(t) <= mLen) {
5002c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines            memcpy(&mData[mPos], &t, sizeof(t));
5012c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines            mPos += sizeof(t);
5022c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines        }
5032c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines    }
50443514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines
50543514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines    /*
50689daad6bae798779e57f252e9da4fe4e62337124Tim Murray      void add(rs_matrix4x4 m) {
50789daad6bae798779e57f252e9da4fe4e62337124Tim Murray      for (size_t i = 0; i < 16; i++) {
50889daad6bae798779e57f252e9da4fe4e62337124Tim Murray      add(m.m[i]);
50989daad6bae798779e57f252e9da4fe4e62337124Tim Murray      }
51089daad6bae798779e57f252e9da4fe4e62337124Tim Murray      }
51189daad6bae798779e57f252e9da4fe4e62337124Tim Murray
51289daad6bae798779e57f252e9da4fe4e62337124Tim Murray      void add(rs_matrix3x3 m) {
51389daad6bae798779e57f252e9da4fe4e62337124Tim Murray      for (size_t i = 0; i < 9; i++) {
51489daad6bae798779e57f252e9da4fe4e62337124Tim Murray      add(m.m[i]);
51589daad6bae798779e57f252e9da4fe4e62337124Tim Murray      }
51689daad6bae798779e57f252e9da4fe4e62337124Tim Murray      }
51789daad6bae798779e57f252e9da4fe4e62337124Tim Murray
51889daad6bae798779e57f252e9da4fe4e62337124Tim Murray      void add(rs_matrix2x2 m) {
51989daad6bae798779e57f252e9da4fe4e62337124Tim Murray      for (size_t i = 0; i < 4; i++) {
52089daad6bae798779e57f252e9da4fe4e62337124Tim Murray      add(m.m[i]);
52189daad6bae798779e57f252e9da4fe4e62337124Tim Murray      }
52289daad6bae798779e57f252e9da4fe4e62337124Tim Murray      }
52343514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines    */
52443514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines
52589daad6bae798779e57f252e9da4fe4e62337124Tim Murray    void add(sp<BaseObj> obj) {
52643514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines        if (obj != NULL) {
52743514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines            add((uint32_t) (uintptr_t) obj->getID());
52843514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines        } else {
52943514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines            add((uint32_t) 0);
53043514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines        }
53143514cde7e9b4869ffba6ba759d1e31f22d936f7Stephen Hines    }
5322c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines};
5332c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines
53489daad6bae798779e57f252e9da4fe4e62337124Tim Murray
53584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayclass Type : public BaseObj {
53684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayprotected:
53784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    friend class Allocation;
53884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
53984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    uint32_t mDimX;
54084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    uint32_t mDimY;
54184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    uint32_t mDimZ;
542eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray    RSYuvFormat mYuvFormat;
54384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    bool mDimMipmaps;
54484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    bool mDimFaces;
54584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    size_t mElementCount;
54684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    sp<const Element> mElement;
54784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
5487d1b757c0be2622b72b3d3a10826752adb3e5182Stephen Hines    Type(void *id, sp<RS> rs);
5497d1b757c0be2622b72b3d3a10826752adb3e5182Stephen Hines
55084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void calcElementCount();
55184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    virtual void updateFromNative();
55284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
55384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murraypublic:
55484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
555eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray    RSYuvFormat getYuvFormat() const {
556eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray        return mYuvFormat;
557eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray    }
558eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray
55984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    sp<const Element> getElement() const {
56084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        return mElement;
56184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    }
56284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
56384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    uint32_t getX() const {
56484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        return mDimX;
56584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    }
56684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
56784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    uint32_t getY() const {
56884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        return mDimY;
56984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    }
57084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
57184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    uint32_t getZ() const {
57284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        return mDimZ;
57384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    }
57484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
57584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    bool hasMipmaps() const {
57684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        return mDimMipmaps;
57784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    }
57884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
57984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    bool hasFaces() const {
58084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        return mDimFaces;
58184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    }
58284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
58384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    size_t getCount() const {
58484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        return mElementCount;
58584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    }
58684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
58784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    size_t getSizeBytes() const {
58884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        return mElementCount * mElement->getSizeBytes();
58984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    }
59084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
59196267c2ff0133c20cc5643419a3ed3b1e75fe568Tim Murray    static sp<const Type> create(sp<RS> rs, sp<const Element> e, uint32_t dimX, uint32_t dimY, uint32_t dimZ);
59284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
59384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    class Builder {
59484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    protected:
59584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        sp<RS> mRS;
59684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        uint32_t mDimX;
59784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        uint32_t mDimY;
59884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        uint32_t mDimZ;
599eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray        RSYuvFormat mYuvFormat;
60084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        bool mDimMipmaps;
60184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        bool mDimFaces;
60284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        sp<const Element> mElement;
60384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
60484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    public:
60584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Builder(sp<RS> rs, sp<const Element> e);
60684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
60784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        void setX(uint32_t value);
6087d1b757c0be2622b72b3d3a10826752adb3e5182Stephen Hines        void setY(uint32_t value);
609eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray        void setZ(uint32_t value);
610eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray        void setYuvFormat(RSYuvFormat format);
61184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        void setMipmaps(bool value);
61284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        void setFaces(bool value);
61384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        sp<const Type> create();
61484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    };
61584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
61684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray};
61784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
61884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayclass Script : public BaseObj {
61984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayprivate:
62084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
62184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayprotected:
62284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    Script(void *id, sp<RS> rs);
62384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void forEach(uint32_t slot, sp<const Allocation> in, sp<const Allocation> out,
62484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray            const void *v, size_t) const;
62584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void bindAllocation(sp<Allocation> va, uint32_t slot) const;
62684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void setVar(uint32_t index, const void *, size_t len) const;
62784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void setVar(uint32_t index, sp<const BaseObj> o) const;
62884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void invoke(uint32_t slot, const void *v, size_t len) const;
62984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
63084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
63184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void invoke(uint32_t slot) const {
63284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        invoke(slot, NULL, 0);
63384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    }
63484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void setVar(uint32_t index, float v) const {
63584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        setVar(index, &v, sizeof(v));
63684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    }
63784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void setVar(uint32_t index, double v) const {
63884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        setVar(index, &v, sizeof(v));
63984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    }
64084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void setVar(uint32_t index, int32_t v) const {
64184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        setVar(index, &v, sizeof(v));
64284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    }
64384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void setVar(uint32_t index, int64_t v) const {
64484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        setVar(index, &v, sizeof(v));
64584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    }
64684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void setVar(uint32_t index, bool v) const {
64784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        setVar(index, &v, sizeof(v));
64884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    }
64984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
65084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murraypublic:
65184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    class FieldBase {
65284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    protected:
65384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        sp<const Element> mElement;
65484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        sp<Allocation> mAllocation;
65584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
65684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        void init(sp<RS> rs, uint32_t dimx, uint32_t usages = 0);
65784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
65884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    public:
65984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        sp<const Element> getElement() {
66084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray            return mElement;
66184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        }
66284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
66384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        sp<const Type> getType() {
66484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray            return mAllocation->getType();
66584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        }
66684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
66784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        sp<const Allocation> getAllocation() {
66884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray            return mAllocation;
66984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        }
67084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
67184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        //void updateAllocation();
67284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    };
67384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray};
67484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
67584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayclass ScriptC : public Script {
67684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayprotected:
67784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    ScriptC(sp<RS> rs,
67884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray            const void *codeTxt, size_t codeLength,
67984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray            const char *cachedName, size_t cachedNameLength,
68084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray            const char *cacheDir, size_t cacheDirLength);
68184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
68284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray};
68384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
6847f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murrayclass ScriptIntrinsic : public Script {
6857f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray protected:
68610913a5c37ba119bef335320d3e8be25212c05adTim Murray    sp<const Element> mElement;
6873cd44af22622898d3000b2b3c4c408cede294152Tim Murray    ScriptIntrinsic(sp<RS> rs, int id, sp<const Element> e);
688b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    virtual ~ScriptIntrinsic();
6897f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray};
6907f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray
69189daad6bae798779e57f252e9da4fe4e62337124Tim Murrayclass ScriptIntrinsic3DLUT : public ScriptIntrinsic {
69221fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray private:
69389daad6bae798779e57f252e9da4fe4e62337124Tim Murray    ScriptIntrinsic3DLUT(sp<RS> rs, sp<const Element> e);
69421fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray public:
69521fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray    static sp<ScriptIntrinsic3DLUT> create(sp<RS> rs, sp<const Element> e);
69689daad6bae798779e57f252e9da4fe4e62337124Tim Murray    void forEach(sp<Allocation> ain, sp<Allocation> aout);
69789daad6bae798779e57f252e9da4fe4e62337124Tim Murray    void setLUT(sp<Allocation> lut);
69889daad6bae798779e57f252e9da4fe4e62337124Tim Murray};
69989daad6bae798779e57f252e9da4fe4e62337124Tim Murray
7007f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murrayclass ScriptIntrinsicBlend : public ScriptIntrinsic {
70121fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray private:
70289daad6bae798779e57f252e9da4fe4e62337124Tim Murray    ScriptIntrinsicBlend(sp<RS> rs, sp<const Element> e);
70321fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray public:
70421fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray    static sp<ScriptIntrinsicBlend> create(sp<RS> rs, sp<const Element> e);
7057f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    void blendClear(sp<Allocation> in, sp<Allocation> out);
7067f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    void blendSrc(sp<Allocation> in, sp<Allocation> out);
7077f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    void blendDst(sp<Allocation> in, sp<Allocation> out);
7087f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    void blendSrcOver(sp<Allocation> in, sp<Allocation> out);
7097f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    void blendDstOver(sp<Allocation> in, sp<Allocation> out);
7107f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    void blendSrcIn(sp<Allocation> in, sp<Allocation> out);
7117f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    void blendDstIn(sp<Allocation> in, sp<Allocation> out);
7127f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    void blendSrcOut(sp<Allocation> in, sp<Allocation> out);
7137f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    void blendDstOut(sp<Allocation> in, sp<Allocation> out);
7147f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    void blendSrcAtop(sp<Allocation> in, sp<Allocation> out);
7157f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    void blendDstAtop(sp<Allocation> in, sp<Allocation> out);
7167f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    void blendXor(sp<Allocation> in, sp<Allocation> out);
7177f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    void blendMultiply(sp<Allocation> in, sp<Allocation> out);
7187f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    void blendAdd(sp<Allocation> in, sp<Allocation> out);
7197f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    void blendSubtract(sp<Allocation> in, sp<Allocation> out);
7207f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray};
72184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
7228f1e60c42e0a819f389594f5d2f38fb2e024c9c9Tim Murrayclass ScriptIntrinsicBlur : public ScriptIntrinsic {
72321fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray private:
72489daad6bae798779e57f252e9da4fe4e62337124Tim Murray    ScriptIntrinsicBlur(sp<RS> rs, sp<const Element> e);
72521fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray public:
72621fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray    static sp<ScriptIntrinsicBlur> create(sp<RS> rs, sp<const Element> e);
72721fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray    void setInput(sp<Allocation> in);
72821fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray    void forEach(sp<Allocation> out);
7298f1e60c42e0a819f389594f5d2f38fb2e024c9c9Tim Murray    void setRadius(float radius);
7308f1e60c42e0a819f389594f5d2f38fb2e024c9c9Tim Murray};
7318f1e60c42e0a819f389594f5d2f38fb2e024c9c9Tim Murray
73289daad6bae798779e57f252e9da4fe4e62337124Tim Murrayclass ScriptIntrinsicColorMatrix : public ScriptIntrinsic {
73321fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray private:
73489daad6bae798779e57f252e9da4fe4e62337124Tim Murray    ScriptIntrinsicColorMatrix(sp<RS> rs, sp<const Element> e);
73521fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray public:
73621fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray    static sp<ScriptIntrinsicColorMatrix> create(sp<RS> rs, sp<const Element> e);
73789daad6bae798779e57f252e9da4fe4e62337124Tim Murray    void forEach(sp<Allocation> in, sp<Allocation> out);
73810913a5c37ba119bef335320d3e8be25212c05adTim Murray    void setAdd(float* add);
73989daad6bae798779e57f252e9da4fe4e62337124Tim Murray    void setColorMatrix3(float* m);
74089daad6bae798779e57f252e9da4fe4e62337124Tim Murray    void setColorMatrix4(float* m);
74189daad6bae798779e57f252e9da4fe4e62337124Tim Murray    void setGreyscale();
74289daad6bae798779e57f252e9da4fe4e62337124Tim Murray    void setRGBtoYUV();
74389daad6bae798779e57f252e9da4fe4e62337124Tim Murray    void setYUVtoRGB();
74489daad6bae798779e57f252e9da4fe4e62337124Tim Murray};
74589daad6bae798779e57f252e9da4fe4e62337124Tim Murray
74689daad6bae798779e57f252e9da4fe4e62337124Tim Murrayclass ScriptIntrinsicConvolve3x3 : public ScriptIntrinsic {
74721fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray private:
74889daad6bae798779e57f252e9da4fe4e62337124Tim Murray    ScriptIntrinsicConvolve3x3(sp<RS> rs, sp<const Element> e);
74921fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray public:
75021fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray    static sp<ScriptIntrinsicConvolve3x3> create(sp<RS> rs, sp<const Element> e);
75189daad6bae798779e57f252e9da4fe4e62337124Tim Murray    void setInput(sp<Allocation> in);
75289daad6bae798779e57f252e9da4fe4e62337124Tim Murray    void forEach(sp<Allocation> out);
75389daad6bae798779e57f252e9da4fe4e62337124Tim Murray    void setCoefficients(float* v);
75489daad6bae798779e57f252e9da4fe4e62337124Tim Murray};
75589daad6bae798779e57f252e9da4fe4e62337124Tim Murray
75689daad6bae798779e57f252e9da4fe4e62337124Tim Murrayclass ScriptIntrinsicConvolve5x5 : public ScriptIntrinsic {
75721fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray private:
75889daad6bae798779e57f252e9da4fe4e62337124Tim Murray    ScriptIntrinsicConvolve5x5(sp<RS> rs, sp<const Element> e);
75921fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray public:
76021fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray    static sp<ScriptIntrinsicConvolve5x5> create(sp<RS> rs, sp<const Element> e);
76189daad6bae798779e57f252e9da4fe4e62337124Tim Murray    void setInput(sp<Allocation> in);
76289daad6bae798779e57f252e9da4fe4e62337124Tim Murray    void forEach(sp<Allocation> out);
76389daad6bae798779e57f252e9da4fe4e62337124Tim Murray    void setCoefficients(float* v);
76489daad6bae798779e57f252e9da4fe4e62337124Tim Murray};
76589daad6bae798779e57f252e9da4fe4e62337124Tim Murray
766b27b18130d0772203799ba0f2d27783b640dc891Tim Murrayclass ScriptIntrinsicHistogram : public ScriptIntrinsic {
76721fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray private:
768b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    ScriptIntrinsicHistogram(sp<RS> rs, sp<const Element> e);
76910913a5c37ba119bef335320d3e8be25212c05adTim Murray    sp<Allocation> mOut;
77021fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray public:
77110913a5c37ba119bef335320d3e8be25212c05adTim Murray    static sp<ScriptIntrinsicHistogram> create(sp<RS> rs);
772b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    void setOutput(sp<Allocation> aout);
773b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    void setDotCoefficients(float r, float g, float b, float a);
774b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    void forEach(sp<Allocation> ain);
775b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    void forEach_dot(sp<Allocation> ain);
776b27b18130d0772203799ba0f2d27783b640dc891Tim Murray};
777b27b18130d0772203799ba0f2d27783b640dc891Tim Murray
778b27b18130d0772203799ba0f2d27783b640dc891Tim Murrayclass ScriptIntrinsicLUT : public ScriptIntrinsic {
779b27b18130d0772203799ba0f2d27783b640dc891Tim Murray private:
780b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    sp<Allocation> LUT;
781b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    bool mDirty;
782b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    unsigned char mCache[1024];
7832acce99bd7d6bb97d8a4d4778107968aa09d6e02Tim Murray    void setTable(unsigned int offset, unsigned char base, unsigned int length, unsigned char* lutValues);
78421fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray    ScriptIntrinsicLUT(sp<RS> rs, sp<const Element> e);
785b27b18130d0772203799ba0f2d27783b640dc891Tim Murray
78689daad6bae798779e57f252e9da4fe4e62337124Tim Murray public:
78721fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray    static sp<ScriptIntrinsicLUT> create(sp<RS> rs, sp<const Element> e);
78889daad6bae798779e57f252e9da4fe4e62337124Tim Murray    void forEach(sp<Allocation> ain, sp<Allocation> aout);
7892acce99bd7d6bb97d8a4d4778107968aa09d6e02Tim Murray    void setRed(unsigned char base, unsigned int length, unsigned char* lutValues);
7902acce99bd7d6bb97d8a4d4778107968aa09d6e02Tim Murray    void setGreen(unsigned char base, unsigned int length, unsigned char* lutValues);
7912acce99bd7d6bb97d8a4d4778107968aa09d6e02Tim Murray    void setBlue(unsigned char base, unsigned int length, unsigned char* lutValues);
7922acce99bd7d6bb97d8a4d4778107968aa09d6e02Tim Murray    void setAlpha(unsigned char base, unsigned int length, unsigned char* lutValues);
793b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    virtual ~ScriptIntrinsicLUT();
794b27b18130d0772203799ba0f2d27783b640dc891Tim Murray};
795b27b18130d0772203799ba0f2d27783b640dc891Tim Murray
79689daad6bae798779e57f252e9da4fe4e62337124Tim Murrayclass ScriptIntrinsicYuvToRGB : public ScriptIntrinsic {
79721fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray private:
798b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    ScriptIntrinsicYuvToRGB(sp<RS> rs, sp<const Element> e);
79921fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray public:
80021fa7a0a23eddab88ff261017f6d7a2548b4d89aTim Murray    static sp<ScriptIntrinsicYuvToRGB> create(sp<RS> rs, sp<const Element> e);
801b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    void setInput(sp<Allocation> in);
802b27b18130d0772203799ba0f2d27783b640dc891Tim Murray    void forEach(sp<Allocation> out);
80389daad6bae798779e57f252e9da4fe4e62337124Tim Murray
80489daad6bae798779e57f252e9da4fe4e62337124Tim Murray};
805b27b18130d0772203799ba0f2d27783b640dc891Tim Murray
80689daad6bae798779e57f252e9da4fe4e62337124Tim Murray
807729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray class Sampler : public BaseObj {
808729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray private:
809729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray    Sampler(sp<RS> rs, void* id);
810729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray    RsSamplerValue mMin;
811729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray    RsSamplerValue mMag;
812729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray    RsSamplerValue mWrapS;
813729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray    RsSamplerValue mWrapT;
814729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray    RsSamplerValue mWrapR;
815729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray    float mAniso;
816729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray
817729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray public:
818729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray    static sp<Sampler> create(sp<RS> rs, RsSamplerValue min, RsSamplerValue mag, RsSamplerValue wrapS, RsSamplerValue wrapT, float anisotropy);
819729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray
820729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray    RsSamplerValue getMinification();
821729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray    RsSamplerValue getMagnification();
822729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray    RsSamplerValue getWrapS();
823729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray    RsSamplerValue getWrapT();
824729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray    float getAnisotropy();
825729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray
826729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray    sp<const Sampler> CLAMP_NEAREST(sp<RS> rs);
827729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray    sp<const Sampler> CLAMP_LINEAR(sp<RS> rs);
828729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray    sp<const Sampler> CLAMP_LINEAR_MIP_LINEAR(sp<RS> rs);
829729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray    sp<const Sampler> WRAP_NEAREST(sp<RS> rs);
830729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray    sp<const Sampler> WRAP_LINEAR(sp<RS> rs);
831729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray    sp<const Sampler> WRAP_LINEAR_MIP_LINEAR(sp<RS> rs);
832729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray    sp<const Sampler> MIRRORED_REPEAT_NEAREST(sp<RS> rs);
833729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray    sp<const Sampler> MIRRORED_REPEAT_LINEAR(sp<RS> rs);
834729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray    sp<const Sampler> MIRRORED_REPEAT_LINEAR_MIP_LINEAR(sp<RS> rs);
835729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray
836729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray};
837729b6fe58aff47c4f666b22bbb7a6d6114ddefa9Tim Murray
83884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray}
8397f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray
84084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray}
84184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
84284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray#endif
843