1326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams/*
24419977d78018a9933c7f455fe001f644f2d638bStephen Hines * Copyright (C) 2009-2012 The Android Open Source Project
3326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *
4326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * you may not use this file except in compliance with the License.
6326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * You may obtain a copy of the License at
7326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *
8326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams *
10326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Unless required by applicable law or agreed to in writing, software
11326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * See the License for the specific language governing permissions and
14326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * limitations under the License.
15326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams */
16326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
17326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#ifndef ANDROID_RS_SCRIPT_H
18326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#define ANDROID_RS_SCRIPT_H
19326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
20326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#include "rsAllocation.h"
21c31585b8ca865bf2b35abc79c8a8ee42de27bee8Yang Ni#include "rsMap.h"
22326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
2347935ac8e3dd619f758abd576605a564e33bb59cTobias Grosser#include <utility>
24a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams
25326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams// ---------------------------------------------------------------------------
26326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android {
27326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript {
28326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
2993eacc7ce0aad4314b4cb41a281f59ce54bb3286Jason Sams#ifndef RS_COMPATIBILITY_LIB
30a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Samsclass ProgramVertex;
31a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Samsclass ProgramFragment;
32a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Samsclass ProgramRaster;
33ccc010bb7c0f89e162bf60033968a20be90a903aJason Samsclass ProgramStore;
3493eacc7ce0aad4314b4cb41a281f59ce54bb3286Jason Sams#endif
35326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
36eb9aa675754c49f613c6ad71d41472b30f38b007Yang Niclass IDBase : public ObjectBase {
37dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Samspublic:
38eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    IDBase(Context *rsc, Script *s, int slot) :
39eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni        ObjectBase(rsc), mScript(s), mSlot(slot) {}
40eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    virtual ~IDBase() {}
41dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
42eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    virtual void serialize(Context *rsc, OStream *stream) const {}
43dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    virtual RsA3DClassID getClassId() const;
44dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
45dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    Script *mScript;
46dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    int mSlot;
47eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni};
48eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni
49eb9aa675754c49f613c6ad71d41472b30f38b007Yang Niclass ScriptKernelID : public IDBase {
50eb9aa675754c49f613c6ad71d41472b30f38b007Yang Nipublic:
51eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    ScriptKernelID(Context *rsc, Script *s, int slot, int sig);
52eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    virtual ~ScriptKernelID() {}
53eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni
54eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    virtual RsA3DClassID getClassId() const;
55eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni
56dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    bool mHasKernelInput;
57dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    bool mHasKernelOutput;
58dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams};
59dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
60eb9aa675754c49f613c6ad71d41472b30f38b007Yang Niclass ScriptInvokeID : public IDBase {
61dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Samspublic:
62eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    ScriptInvokeID(Context *rsc, Script *s, int slot);
63eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    virtual ~ScriptInvokeID() {}
64dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
65dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams    virtual RsA3DClassID getClassId() const;
66eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni};
67dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
68eb9aa675754c49f613c6ad71d41472b30f38b007Yang Niclass ScriptFieldID : public IDBase {
69eb9aa675754c49f613c6ad71d41472b30f38b007Yang Nipublic:
70eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    ScriptFieldID(Context *rsc, Script *s, int slot);
71eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    virtual ~ScriptFieldID() {}
72eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni
73eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni    virtual RsA3DClassID getClassId() const;
74dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams};
75dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
76afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukclass Script : public ObjectBase {
77326e0ddf89e8df2837752fbfd7a014814b32082cJason Samspublic:
78dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams
79bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    struct Hal {
80bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams        void * drv;
81bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
82bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams        struct DriverInfo {
83bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams            int mVersionMajor;
84bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams            int mVersionMinor;
85bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
86bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams            size_t exportedVariableCount;
87bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams            size_t exportedFunctionCount;
88bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams            size_t exportedPragmaCount;
89bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams            char const **exportedPragmaKeyList;
90bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams            char const **exportedPragmaValueList;
91c31585b8ca865bf2b35abc79c8a8ee42de27bee8Yang Ni            const Pair<const char *, uint32_t> *exportedForeachFuncList;
92bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
93bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams            int (* root)();
94bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams        };
95bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams        DriverInfo info;
96bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    };
97bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    Hal mHal;
98bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
99e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    Script(Context *);
100326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    virtual ~Script();
101326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
102928b734b2fbba0800567c8b7e686bcf5f45483ccJason Sams    struct Enviroment_t {
103ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams        int64_t mStartTimeMillis;
104709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mutable int64_t mLastDtTime;
10598e10fd7438f2e925e7fb5c2ec97c1f8cc583634Romain Guy
10693eacc7ce0aad4314b4cb41a281f59ce54bb3286Jason Sams#ifndef RS_COMPATIBILITY_LIB
107a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams        ObjectBaseRef<ProgramVertex> mVertex;
108a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams        ObjectBaseRef<ProgramFragment> mFragment;
109b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams        ObjectBaseRef<ProgramRaster> mRaster;
110ccc010bb7c0f89e162bf60033968a20be90a903aJason Sams        ObjectBaseRef<ProgramStore> mFragmentStore;
11193eacc7ce0aad4314b4cb41a281f59ce54bb3286Jason Sams#endif
112928b734b2fbba0800567c8b7e686bcf5f45483ccJason Sams    };
113928b734b2fbba0800567c8b7e686bcf5f45483ccJason Sams    Enviroment_t mEnviroment;
114326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
115700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk    void setSlot(uint32_t slot, Allocation *a);
116b81a0eb8180791e4eaab1253b59fa8bd562b046bAlex Sakhartchouk    void setVar(uint32_t slot, const void *val, size_t len);
1179c64239ebbfa4170190ede812e69150035e008e0Tim Murray    void getVar(uint32_t slot, const void *val, size_t len);
1182980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines    void setVar(uint32_t slot, const void *val, size_t len, Element *e,
119f0a5078aaf6426e5524a847a0b17d09570fc00b8Stephen Hines                const uint32_t *dims, size_t dimLen);
120a5eb6e17c08426deeedf989d6be280d89662ee82Jason Sams    void setVarObj(uint32_t slot, ObjectBase *val);
1218c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams
1224ee16ffbd9d1d72e1757c9b26715597fdc044117Stephen Hines    virtual bool freeChildren();
1234ee16ffbd9d1d72e1757c9b26715597fdc044117Stephen Hines
1244b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes    virtual void runForEach(Context* rsc,
1254b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes                            uint32_t slot,
126f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes                            const Allocation ** ains,
1274b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes                            size_t inLen,
1284b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes                            Allocation* aout,
1294b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes                            const void* usr,
1304b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes                            size_t usrBytes,
13144bef6fba6244292b751387f3d6c31cca96c28adChris Wailes                            const RsScriptCall *sc = nullptr) = 0;
1324b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes
133b81a0eb8180791e4eaab1253b59fa8bd562b046bAlex Sakhartchouk    virtual void Invoke(Context *rsc, uint32_t slot, const void *data, size_t len) = 0;
134c61346b91434307c5003029017b54ce9c49112beJason Sams    virtual void setupScript(Context *rsc) = 0;
135c61346b91434307c5003029017b54ce9c49112beJason Sams    virtual uint32_t run(Context *) = 0;
136da0f069871343119251d6b0586be356dc2146a62Yang Ni    virtual bool isIntrinsic() const { return false; }
137c78839b5bbcffae7d64a5a1c9aa60c9a4c5d3918Stephen Hines
138c78839b5bbcffae7d64a5a1c9aa60c9a4c5d3918Stephen Hines    bool hasObjectSlots() const {
139c78839b5bbcffae7d64a5a1c9aa60c9a4c5d3918Stephen Hines        return mHasObjectSlots;
140c78839b5bbcffae7d64a5a1c9aa60c9a4c5d3918Stephen Hines    }
141a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams    virtual void callUpdateCacheObject(const Context *rsc, void *dstObj) const;
142a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams
1435d95a78ab5758c2625949d78bb67eb3c5d9701ccStephen Hines    uint32_t getApiLevel() const {
1445d95a78ab5758c2625949d78bb67eb3c5d9701ccStephen Hines        return mApiLevel;
1455d95a78ab5758c2625949d78bb67eb3c5d9701ccStephen Hines    }
1465d95a78ab5758c2625949d78bb67eb3c5d9701ccStephen Hines
147700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchoukprotected:
14877020c5248ca0921d7d24fb60dec5105ba39026cJason Sams    bool mInitialized;
149c78839b5bbcffae7d64a5a1c9aa60c9a4c5d3918Stephen Hines    bool mHasObjectSlots;
1505d95a78ab5758c2625949d78bb67eb3c5d9701ccStephen Hines    uint32_t mApiLevel;
151700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk    ObjectBaseRef<Allocation> *mSlots;
152700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk    ObjectBaseRef<const Type> *mTypes;
153700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk
154326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams};
155326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
156326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
157326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
158326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
159326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#endif
160