rsCppStructs.h revision 7b3e3093f745134345dadf89498ad16e1f9c0e71
184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray/*
284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray * Copyright (C) 2012 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
2084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray#include <utils/String8.h>
2184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray#include <utils/Vector.h>
2284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray#include "utils/RefBase.h"
2384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
2484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray#include <rs.h>
2584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
2684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murraynamespace android {
279eb7f4b90120ebe4be74343856e86b46495f72dfTim Murraynamespace RSC {
2884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
2984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murraytypedef void (*ErrorHandlerFunc_t)(uint32_t errorNum, const char *errorText);
3084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murraytypedef void (*MessageHandlerFunc_t)(uint32_t msgNum, const void *msgData, size_t msgLen);
3184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
3284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayclass RS;
3384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayclass BaseObj;
3484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayclass Element;
3584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayclass Type;
3684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayclass Allocation;
3784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayclass Script;
3884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayclass ScriptC;
3984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
4084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayclass RS : public android::LightRefBase<RS> {
4184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
4284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray public:
4384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    RS();
4484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    virtual ~RS();
4584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
467e0acabf072cda5bdff63e502c1e8e4c2727676bTim Murray    bool init() { return init(false); }
477e0acabf072cda5bdff63e502c1e8e4c2727676bTim Murray    bool init(bool forceCpu);
4884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
4984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void setErrorHandler(ErrorHandlerFunc_t func);
5084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    ErrorHandlerFunc_t getErrorHandler() { return mErrorFunc; }
5184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
5284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void setMessageHandler(MessageHandlerFunc_t func);
5384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    MessageHandlerFunc_t getMessageHandler() { return mMessageFunc; }
5484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
5584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void throwError(const char *err) const;
5684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
5784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    RsContext getContext() { return mContext; }
5884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
59baca6c3c3d79a324c7976ba873afdded0b6bcfb5Tim Murray    void finish();
60baca6c3c3d79a324c7976ba873afdded0b6bcfb5Tim Murray
6184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray private:
627e0acabf072cda5bdff63e502c1e8e4c2727676bTim Murray    bool init(int targetApi, bool forceCpu);
6384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static void * threadProc(void *);
6484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
6584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static bool gInitialized;
6684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static pthread_mutex_t gInitMutex;
6784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
6884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    pthread_t mMessageThreadId;
6984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    pid_t mNativeMessageThreadId;
7084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    bool mMessageRun;
7184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
7284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    RsDevice mDev;
7384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    RsContext mContext;
7484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
7584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    ErrorHandlerFunc_t mErrorFunc;
7684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    MessageHandlerFunc_t mMessageFunc;
7784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
7884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    struct {
7984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *U8;
8084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *I8;
8184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *U16;
8284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *I16;
8384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *U32;
8484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *I32;
8584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *U64;
8684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *I64;
8784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *F32;
8884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *F64;
8984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *BOOLEAN;
9084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
9184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *ELEMENT;
9284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *TYPE;
9384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *ALLOCATION;
9484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *SAMPLER;
9584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *SCRIPT;
9684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *MESH;
9784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *PROGRAM_FRAGMENT;
9884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *PROGRAM_VERTEX;
9984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *PROGRAM_RASTER;
10084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *PROGRAM_STORE;
10184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
10284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *A_8;
10384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *RGB_565;
10484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *RGB_888;
10584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *RGBA_5551;
10684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *RGBA_4444;
10784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *RGBA_8888;
10884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
10984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *FLOAT_2;
11084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *FLOAT_3;
11184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *FLOAT_4;
11284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
11384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *DOUBLE_2;
11484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *DOUBLE_3;
11584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *DOUBLE_4;
11684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
11784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *UCHAR_2;
11884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *UCHAR_3;
11984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *UCHAR_4;
12084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
12184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *CHAR_2;
12284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *CHAR_3;
12384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *CHAR_4;
12484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
12584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *USHORT_2;
12684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *USHORT_3;
12784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *USHORT_4;
12884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
12984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *SHORT_2;
13084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *SHORT_3;
13184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *SHORT_4;
13284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
13384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *UINT_2;
13484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *UINT_3;
13584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *UINT_4;
13684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
13784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *INT_2;
13884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *INT_3;
13984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *INT_4;
14084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
14184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *ULONG_2;
14284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *ULONG_3;
14384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *ULONG_4;
14484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
14584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *LONG_2;
14684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *LONG_3;
14784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *LONG_4;
14884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
14984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *MATRIX_4X4;
15084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *MATRIX_3X3;
15184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Element *MATRIX_2X2;
15284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    } mElements;
15384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
15484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray};
15584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
15684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayclass BaseObj : public android::LightRefBase<BaseObj> {
15784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayprotected:
15884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void *mID;
15984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    sp<RS> mRS;
16084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    String8 mName;
16184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
16284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    BaseObj(void *id, sp<RS> rs);
16384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void checkValid();
16484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
16584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static void * getObjID(sp<const BaseObj> o);
16684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
16784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murraypublic:
16884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
16984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void * getID() const;
17084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    virtual ~BaseObj();
17184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    virtual void updateFromNative();
17284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    virtual bool equals(const BaseObj *obj);
17384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray};
17484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
17584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
17684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayclass Allocation : public BaseObj {
17784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayprotected:
17884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    android::sp<const Type> mType;
17984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    uint32_t mUsage;
18084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    android::sp<Allocation> mAdaptedAllocation;
18184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
18284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    bool mConstrainedLOD;
18384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    bool mConstrainedFace;
18484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    bool mConstrainedY;
18584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    bool mConstrainedZ;
18684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    bool mReadAllowed;
18784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    bool mWriteAllowed;
18884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    uint32_t mSelectedY;
18984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    uint32_t mSelectedZ;
19084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    uint32_t mSelectedLOD;
19184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    RsAllocationCubemapFace mSelectedFace;
19284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
19384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    uint32_t mCurrentDimX;
19484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    uint32_t mCurrentDimY;
19584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    uint32_t mCurrentDimZ;
19684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    uint32_t mCurrentCount;
19784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
19884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void * getIDSafe() const;
19984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void updateCacheInfo(sp<const Type> t);
20084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
20184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    Allocation(void *id, sp<RS> rs, sp<const Type> t, uint32_t usage);
20284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
20384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void validateIsInt32();
20484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void validateIsInt16();
20584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void validateIsInt8();
20684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void validateIsFloat32();
20784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void validateIsObject();
20884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
20984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    virtual void updateFromNative();
21084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
21184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void validate2DRange(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h);
21284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
21384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murraypublic:
21484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    android::sp<const Type> getType() {
21584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        return mType;
21684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    }
21784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
21884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void syncAll(RsAllocationUsageType srcLocation);
21984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void ioSendOutput();
22084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void ioGetInput();
22184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
22284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void generateMipmaps();
223509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray
2240b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray    void copy1DRangeFrom(uint32_t off, size_t count, const void *data);
225a4cbc2b0cf0f6fbdb21e84a3e17585eda1885e3eTim Murray    void copy1DRangeFrom(uint32_t off, size_t count, sp<const Allocation> data, uint32_t dataOff);
22684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
2270b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray    void copy1DRangeTo(uint32_t off, size_t count, void *data);
228a4cbc2b0cf0f6fbdb21e84a3e17585eda1885e3eTim Murray
2290b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray    void copy1DFrom(const void* data);
2300b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray    void copy1DTo(void* data);
2310b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray
2320b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray    void copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
2330b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray                         const void *data);
2347b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murray
2357b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murray    void copy2DRangeTo(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
2367b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murray                       void *data);
2377b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murray
23884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
2390b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray                         sp<const Allocation> data, uint32_t dataXoff, uint32_t dataYoff);
24084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
24184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void resize(int dimX);
24284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void resize(int dimX, int dimY);
24384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
24484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<Allocation> createTyped(sp<RS> rs, sp<const Type> type,
24584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray                                   RsAllocationMipmapControl mips, uint32_t usage);
24684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<Allocation> createTyped(sp<RS> rs, sp<const Type> type,
24784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray                                   RsAllocationMipmapControl mips, uint32_t usage, void * pointer);
24884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
24984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<Allocation> createTyped(sp<RS> rs, sp<const Type> type,
25084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray                                   uint32_t usage = RS_ALLOCATION_USAGE_SCRIPT);
25184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<Allocation> createSized(sp<RS> rs, sp<const Element> e, size_t count,
25284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray                                   uint32_t usage = RS_ALLOCATION_USAGE_SCRIPT);
253684726cbbd177ee4ee9000e9422058547acd237fTim Murray    static sp<Allocation> createSized2D(sp<RS> rs, sp<const Element> e,
254684726cbbd177ee4ee9000e9422058547acd237fTim Murray                                        size_t x, size_t y,
255684726cbbd177ee4ee9000e9422058547acd237fTim Murray                                        uint32_t usage = RS_ALLOCATION_USAGE_SCRIPT);
256684726cbbd177ee4ee9000e9422058547acd237fTim Murray
25784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
25884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray};
25984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
26084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayclass Element : public BaseObj {
26184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murraypublic:
26284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    bool isComplex();
26384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    size_t getSubElementCount() {
26484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        return mVisibleElementMap.size();
26584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    }
26684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
26784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    sp<const Element> getSubElement(uint32_t index);
26884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    const char * getSubElementName(uint32_t index);
26984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    size_t getSubElementArraySize(uint32_t index);
27084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    uint32_t getSubElementOffsetBytes(uint32_t index);
27184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    RsDataType getDataType() const {
27284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        return mType;
27384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    }
27484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
27584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    RsDataKind getDataKind() const {
27684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        return mKind;
27784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    }
27884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
27984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    size_t getSizeBytes() const {
28084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        return mSizeBytes;
28184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    }
28284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
28384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> BOOLEAN(sp<RS> rs);
28484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> U8(sp<RS> rs);
28584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> I8(sp<RS> rs);
28684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> U16(sp<RS> rs);
28784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> I16(sp<RS> rs);
28884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> U32(sp<RS> rs);
28984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> I32(sp<RS> rs);
29084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> U64(sp<RS> rs);
29184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> I64(sp<RS> rs);
29284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> F32(sp<RS> rs);
29384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> F64(sp<RS> rs);
29484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> ELEMENT(sp<RS> rs);
29584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> TYPE(sp<RS> rs);
29684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> ALLOCATION(sp<RS> rs);
29784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> SAMPLER(sp<RS> rs);
29884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> SCRIPT(sp<RS> rs);
29984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> MESH(sp<RS> rs);
30084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> PROGRAM_FRAGMENT(sp<RS> rs);
30184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> PROGRAM_VERTEX(sp<RS> rs);
30284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> PROGRAM_RASTER(sp<RS> rs);
30384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> PROGRAM_STORE(sp<RS> rs);
30484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
30584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> A_8(sp<RS> rs);
30684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> RGB_565(sp<RS> rs);
30784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> RGB_888(sp<RS> rs);
30884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> RGBA_5551(sp<RS> rs);
30984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> RGBA_4444(sp<RS> rs);
31084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> RGBA_8888(sp<RS> rs);
31184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
31284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> F32_2(sp<RS> rs);
31384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> F32_3(sp<RS> rs);
31484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> F32_4(sp<RS> rs);
31584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> F64_2(sp<RS> rs);
31684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> F64_3(sp<RS> rs);
31784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> F64_4(sp<RS> rs);
31884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> U8_2(sp<RS> rs);
31984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> U8_3(sp<RS> rs);
32084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> U8_4(sp<RS> rs);
32184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> I8_2(sp<RS> rs);
32284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> I8_3(sp<RS> rs);
32384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> I8_4(sp<RS> rs);
32484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> U16_2(sp<RS> rs);
32584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> U16_3(sp<RS> rs);
32684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> U16_4(sp<RS> rs);
32784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> I16_2(sp<RS> rs);
32884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> I16_3(sp<RS> rs);
32984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> I16_4(sp<RS> rs);
33084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> U32_2(sp<RS> rs);
33184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> U32_3(sp<RS> rs);
33284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> U32_4(sp<RS> rs);
33384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> I32_2(sp<RS> rs);
33484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> I32_3(sp<RS> rs);
33584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> I32_4(sp<RS> rs);
33684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> U64_2(sp<RS> rs);
33784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> U64_3(sp<RS> rs);
33884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> U64_4(sp<RS> rs);
33984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> I64_2(sp<RS> rs);
34084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> I64_3(sp<RS> rs);
34184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> I64_4(sp<RS> rs);
34284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> MATRIX_4X4(sp<RS> rs);
34384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> MATRIX_3X3(sp<RS> rs);
34484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> MATRIX_2X2(sp<RS> rs);
34584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
34684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    Element(void *id, sp<RS> rs,
34784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray            android::Vector<sp<Element> > &elements,
34884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray            android::Vector<android::String8> &elementNames,
34984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray            android::Vector<uint32_t> &arraySizes);
35084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    Element(void *id, sp<RS> rs, RsDataType dt, RsDataKind dk, bool norm, uint32_t size);
35184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    Element(sp<RS> rs);
35284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    virtual ~Element();
35384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
35484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void updateFromNative();
35584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> createUser(sp<RS> rs, RsDataType dt);
35684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> createVector(sp<RS> rs, RsDataType dt, uint32_t size);
35784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    static sp<const Element> createPixel(sp<RS> rs, RsDataType dt, RsDataKind dk);
35884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    bool isCompatible(sp<const Element>e);
35984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
36084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    class Builder {
36184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    private:
36284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        sp<RS> mRS;
36384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        android::Vector<sp<Element> > mElements;
36484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        android::Vector<android::String8> mElementNames;
36584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        android::Vector<uint32_t> mArraySizes;
36684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        bool mSkipPadding;
36784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
36884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    public:
36984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Builder(sp<RS> rs);
37084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        ~Builder();
37184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        void add(sp<Element>, android::String8 &name, uint32_t arraySize = 1);
37284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        sp<const Element> create();
37384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    };
37484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
37584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayprivate:
37684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void updateVisibleSubElements();
37784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
37884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    android::Vector<sp</*const*/ Element> > mElements;
37984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    android::Vector<android::String8> mElementNames;
38084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    android::Vector<uint32_t> mArraySizes;
38184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    android::Vector<uint32_t> mVisibleElementMap;
38284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    android::Vector<uint32_t> mOffsetInBytes;
38384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
38484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    RsDataType mType;
38584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    RsDataKind mKind;
38684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    bool mNormalized;
38784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    size_t mSizeBytes;
38884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    size_t mVectorSize;
38984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray};
39084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
3912c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hinesclass FieldPacker {
3922c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hinesprotected:
3932c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines    unsigned char* mData;
3942c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines    size_t mPos;
3952c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines    size_t mLen;
3962c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines
3972c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hinespublic:
3982c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines    FieldPacker(size_t len)
3992c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines        : mPos(0),
4002c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines          mLen(len) {
4012c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines        mData = new unsigned char[len];
4022c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines    }
4032c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines
4042c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines    virtual ~FieldPacker() {
4052c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines        delete [] mData;
4062c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines    }
4072c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines
4082c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines    void align(size_t v) {
4092c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines        if ((v & (v - 1)) != 0) {
4102c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines            ALOGE("Non-power-of-two alignment: %zu", v);
4112c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines            return;
4122c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines        }
4132c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines
4142c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines        while ((mPos & (v - 1)) != 0) {
4152c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines            mData[mPos++] = 0;
4162c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines        }
4172c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines    }
4182c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines
4192c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines    void reset() {
4202c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines        mPos = 0;
4212c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines    }
4222c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines
4232c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines    void reset(size_t i) {
4242c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines        if (i >= mLen) {
4252c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines            ALOGE("Out of bounds: i (%zu) >= len (%zu)", i, mLen);
4262c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines            return;
4272c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines        }
4282c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines        mPos = i;
4292c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines    }
4302c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines
4312c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines    void skip(size_t i) {
4322c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines        size_t res = mPos + i;
4332c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines        if (res > mLen) {
4342c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines            ALOGE("Exceeded buffer length: i (%zu) > len (%zu)", i, mLen);
4352c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines            return;
4362c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines        }
4372c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines        mPos = res;
4382c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines    }
4392c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines
4402c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines    void* getData() const {
4412c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines        return mData;
4422c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines    }
4432c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines
4442c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines    size_t getLength() const {
4452c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines        return mLen;
4462c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines    }
4472c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines
4482c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines    template <typename T>
4492c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines    void add(T t) {
4502c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines        align(sizeof(t));
4512c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines        if (mPos + sizeof(t) <= mLen) {
4522c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines            memcpy(&mData[mPos], &t, sizeof(t));
4532c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines            mPos += sizeof(t);
4542c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines        }
4552c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines    }
4562c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines};
4572c7206e7e19c23fdaa2dd5843f0597624a5e7341Stephen Hines
45884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayclass Type : public BaseObj {
45984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayprotected:
46084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    friend class Allocation;
46184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
46284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    uint32_t mDimX;
46384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    uint32_t mDimY;
46484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    uint32_t mDimZ;
46584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    bool mDimMipmaps;
46684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    bool mDimFaces;
46784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    size_t mElementCount;
46884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    sp<const Element> mElement;
46984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
47084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void calcElementCount();
47184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    virtual void updateFromNative();
47284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
47384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murraypublic:
47484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
47584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    sp<const Element> getElement() const {
47684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        return mElement;
47784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    }
47884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
47984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    uint32_t getX() const {
48084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        return mDimX;
48184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    }
48284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
48384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    uint32_t getY() const {
48484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        return mDimY;
48584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    }
48684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
48784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    uint32_t getZ() const {
48884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        return mDimZ;
48984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    }
49084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
49184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    bool hasMipmaps() const {
49284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        return mDimMipmaps;
49384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    }
49484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
49584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    bool hasFaces() const {
49684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        return mDimFaces;
49784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    }
49884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
49984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    size_t getCount() const {
50084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        return mElementCount;
50184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    }
50284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
50384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    size_t getSizeBytes() const {
50484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        return mElementCount * mElement->getSizeBytes();
50584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    }
50684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
50784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    Type(void *id, sp<RS> rs);
50884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
50984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
51084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    class Builder {
51184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    protected:
51284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        sp<RS> mRS;
51384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        uint32_t mDimX;
51484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        uint32_t mDimY;
51584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        uint32_t mDimZ;
51684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        bool mDimMipmaps;
51784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        bool mDimFaces;
51884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        sp<const Element> mElement;
51984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
52084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    public:
52184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        Builder(sp<RS> rs, sp<const Element> e);
52284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
52384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        void setX(uint32_t value);
52484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        void setY(int value);
52584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        void setMipmaps(bool value);
52684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        void setFaces(bool value);
52784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        sp<const Type> create();
52884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    };
52984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
53084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray};
53184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
53284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayclass Script : public BaseObj {
53384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayprivate:
53484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
53584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayprotected:
53684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    Script(void *id, sp<RS> rs);
53784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void forEach(uint32_t slot, sp<const Allocation> in, sp<const Allocation> out,
53884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray            const void *v, size_t) const;
53984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void bindAllocation(sp<Allocation> va, uint32_t slot) const;
54084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void setVar(uint32_t index, const void *, size_t len) const;
54184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void setVar(uint32_t index, sp<const BaseObj> o) const;
54284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void invoke(uint32_t slot, const void *v, size_t len) const;
54384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
54484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
54584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void invoke(uint32_t slot) const {
54684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        invoke(slot, NULL, 0);
54784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    }
54884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void setVar(uint32_t index, float v) const {
54984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        setVar(index, &v, sizeof(v));
55084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    }
55184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void setVar(uint32_t index, double v) const {
55284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        setVar(index, &v, sizeof(v));
55384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    }
55484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void setVar(uint32_t index, int32_t v) const {
55584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        setVar(index, &v, sizeof(v));
55684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    }
55784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void setVar(uint32_t index, int64_t v) const {
55884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        setVar(index, &v, sizeof(v));
55984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    }
56084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void setVar(uint32_t index, bool v) const {
56184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        setVar(index, &v, sizeof(v));
56284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    }
56384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
56484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murraypublic:
56584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    class FieldBase {
56684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    protected:
56784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        sp<const Element> mElement;
56884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        sp<Allocation> mAllocation;
56984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
57084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        void init(sp<RS> rs, uint32_t dimx, uint32_t usages = 0);
57184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
57284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    public:
57384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        sp<const Element> getElement() {
57484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray            return mElement;
57584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        }
57684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
57784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        sp<const Type> getType() {
57884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray            return mAllocation->getType();
57984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        }
58084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
58184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        sp<const Allocation> getAllocation() {
58284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray            return mAllocation;
58384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        }
58484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
58584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray        //void updateAllocation();
58684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    };
58784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray};
58884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
58984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayclass ScriptC : public Script {
59084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayprotected:
59184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    ScriptC(sp<RS> rs,
59284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray            const void *codeTxt, size_t codeLength,
59384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray            const char *cachedName, size_t cachedNameLength,
59484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray            const char *cacheDir, size_t cacheDirLength);
59584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
59684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray};
59784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
5987f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murrayclass ScriptIntrinsic : public Script {
5997f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray protected:
6003cd44af22622898d3000b2b3c4c408cede294152Tim Murray    ScriptIntrinsic(sp<RS> rs, int id, sp<const Element> e);
6017f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray};
6027f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray
6037f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murrayclass ScriptIntrinsicBlend : public ScriptIntrinsic {
6047f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray public:
6053cd44af22622898d3000b2b3c4c408cede294152Tim Murray    ScriptIntrinsicBlend(sp<RS> rs, sp <const Element> e);
6067f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    void blendClear(sp<Allocation> in, sp<Allocation> out);
6077f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    void blendSrc(sp<Allocation> in, sp<Allocation> out);
6087f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    void blendDst(sp<Allocation> in, sp<Allocation> out);
6097f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    void blendSrcOver(sp<Allocation> in, sp<Allocation> out);
6107f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    void blendDstOver(sp<Allocation> in, sp<Allocation> out);
6117f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    void blendSrcIn(sp<Allocation> in, sp<Allocation> out);
6127f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    void blendDstIn(sp<Allocation> in, sp<Allocation> out);
6137f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    void blendSrcOut(sp<Allocation> in, sp<Allocation> out);
6147f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    void blendDstOut(sp<Allocation> in, sp<Allocation> out);
6157f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    void blendSrcAtop(sp<Allocation> in, sp<Allocation> out);
6167f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    void blendDstAtop(sp<Allocation> in, sp<Allocation> out);
6177f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    void blendXor(sp<Allocation> in, sp<Allocation> out);
6187f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    void blendMultiply(sp<Allocation> in, sp<Allocation> out);
6197f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    void blendAdd(sp<Allocation> in, sp<Allocation> out);
6207f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray    void blendSubtract(sp<Allocation> in, sp<Allocation> out);
6217f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray};
62284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
6238f1e60c42e0a819f389594f5d2f38fb2e024c9c9Tim Murrayclass ScriptIntrinsicBlur : public ScriptIntrinsic {
6248f1e60c42e0a819f389594f5d2f38fb2e024c9c9Tim Murray public:
6253cd44af22622898d3000b2b3c4c408cede294152Tim Murray    ScriptIntrinsicBlur(sp<RS> rs, sp <const Element> e);
6268f1e60c42e0a819f389594f5d2f38fb2e024c9c9Tim Murray    void blur(sp<Allocation> in, sp<Allocation> out);
6278f1e60c42e0a819f389594f5d2f38fb2e024c9c9Tim Murray    void setRadius(float radius);
6288f1e60c42e0a819f389594f5d2f38fb2e024c9c9Tim Murray};
6298f1e60c42e0a819f389594f5d2f38fb2e024c9c9Tim Murray
63084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray}
6317f0d56899840f071c81bbbcbebfbd880ac31c043Tim Murray
63284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray}
63384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray
63484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray#endif
635