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;
8714ce007a633b10e3b9a3fae29d8f53a7e8c9b59fMatt Wala            size_t exportedForEachCount;
8814ce007a633b10e3b9a3fae29d8f53a7e8c9b59fMatt Wala            size_t exportedReduceCount;
89bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams            size_t exportedFunctionCount;
90bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams            size_t exportedPragmaCount;
91bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams            char const **exportedPragmaKeyList;
92bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams            char const **exportedPragmaValueList;
93c31585b8ca865bf2b35abc79c8a8ee42de27bee8Yang Ni            const Pair<const char *, uint32_t> *exportedForeachFuncList;
94bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
95bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams            int (* root)();
96bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams        };
97bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams        DriverInfo info;
98bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    };
99bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    Hal mHal;
100bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams
101e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    Script(Context *);
102326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    virtual ~Script();
103326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
104928b734b2fbba0800567c8b7e686bcf5f45483ccJason Sams    struct Enviroment_t {
105ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams        int64_t mStartTimeMillis;
106709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        mutable int64_t mLastDtTime;
10798e10fd7438f2e925e7fb5c2ec97c1f8cc583634Romain Guy
10893eacc7ce0aad4314b4cb41a281f59ce54bb3286Jason Sams#ifndef RS_COMPATIBILITY_LIB
109a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams        ObjectBaseRef<ProgramVertex> mVertex;
110a0a1b6fbece2eb8d72d788422ab3e5f58d5a9216Jason Sams        ObjectBaseRef<ProgramFragment> mFragment;
111b681c8af69ef6938c80dd5cc5fc920db94ee9f43Jason Sams        ObjectBaseRef<ProgramRaster> mRaster;
112ccc010bb7c0f89e162bf60033968a20be90a903aJason Sams        ObjectBaseRef<ProgramStore> mFragmentStore;
11393eacc7ce0aad4314b4cb41a281f59ce54bb3286Jason Sams#endif
114928b734b2fbba0800567c8b7e686bcf5f45483ccJason Sams    };
115928b734b2fbba0800567c8b7e686bcf5f45483ccJason Sams    Enviroment_t mEnviroment;
116326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
117700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk    void setSlot(uint32_t slot, Allocation *a);
118b81a0eb8180791e4eaab1253b59fa8bd562b046bAlex Sakhartchouk    void setVar(uint32_t slot, const void *val, size_t len);
1199c64239ebbfa4170190ede812e69150035e008e0Tim Murray    void getVar(uint32_t slot, const void *val, size_t len);
1202980f07d3dbbca727e8efe24ace7e7928a935648Stephen Hines    void setVar(uint32_t slot, const void *val, size_t len, Element *e,
121f0a5078aaf6426e5524a847a0b17d09570fc00b8Stephen Hines                const uint32_t *dims, size_t dimLen);
122a5eb6e17c08426deeedf989d6be280d89662ee82Jason Sams    void setVarObj(uint32_t slot, ObjectBase *val);
1238c6bc6930d4996b897de8e5113da4a4efae2310cJason Sams
1244ee16ffbd9d1d72e1757c9b26715597fdc044117Stephen Hines    virtual bool freeChildren();
1254ee16ffbd9d1d72e1757c9b26715597fdc044117Stephen Hines
1264b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes    virtual void runForEach(Context* rsc,
1274b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes                            uint32_t slot,
128f37121300217d3b39ab66dd9c8881bcbcad932dfChris Wailes                            const Allocation ** ains,
1294b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes                            size_t inLen,
1304b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes                            Allocation* aout,
1314b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes                            const void* usr,
1324b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes                            size_t usrBytes,
13344bef6fba6244292b751387f3d6c31cca96c28adChris Wailes                            const RsScriptCall *sc = nullptr) = 0;
1344b3c34e6833e39bc89c2128002806b654b8e623dChris Wailes
135ae2ec3febedfc29376b9104413fb4042028f1265David Gross    virtual void runReduce(Context *rsc, uint32_t slot,
136ae2ec3febedfc29376b9104413fb4042028f1265David Gross                           const Allocation **ains, size_t inLen,
13714ce007a633b10e3b9a3fae29d8f53a7e8c9b59fMatt Wala                           Allocation *aout, const RsScriptCall *sc) = 0;
13814ce007a633b10e3b9a3fae29d8f53a7e8c9b59fMatt Wala
139b81a0eb8180791e4eaab1253b59fa8bd562b046bAlex Sakhartchouk    virtual void Invoke(Context *rsc, uint32_t slot, const void *data, size_t len) = 0;
140c61346b91434307c5003029017b54ce9c49112beJason Sams    virtual void setupScript(Context *rsc) = 0;
141c61346b91434307c5003029017b54ce9c49112beJason Sams    virtual uint32_t run(Context *) = 0;
142da0f069871343119251d6b0586be356dc2146a62Yang Ni    virtual bool isIntrinsic() const { return false; }
143c78839b5bbcffae7d64a5a1c9aa60c9a4c5d3918Stephen Hines
144c78839b5bbcffae7d64a5a1c9aa60c9a4c5d3918Stephen Hines    bool hasObjectSlots() const {
145c78839b5bbcffae7d64a5a1c9aa60c9a4c5d3918Stephen Hines        return mHasObjectSlots;
146c78839b5bbcffae7d64a5a1c9aa60c9a4c5d3918Stephen Hines    }
147a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams    virtual void callUpdateCacheObject(const Context *rsc, void *dstObj) const;
148a36c50a6ab87f4c9049318d4c6c8ec7b0a1e6e12Jason Sams
1495d95a78ab5758c2625949d78bb67eb3c5d9701ccStephen Hines    uint32_t getApiLevel() const {
1505d95a78ab5758c2625949d78bb67eb3c5d9701ccStephen Hines        return mApiLevel;
1515d95a78ab5758c2625949d78bb67eb3c5d9701ccStephen Hines    }
1525d95a78ab5758c2625949d78bb67eb3c5d9701ccStephen Hines
153700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchoukprotected:
15477020c5248ca0921d7d24fb60dec5105ba39026cJason Sams    bool mInitialized;
155c78839b5bbcffae7d64a5a1c9aa60c9a4c5d3918Stephen Hines    bool mHasObjectSlots;
1565d95a78ab5758c2625949d78bb67eb3c5d9701ccStephen Hines    uint32_t mApiLevel;
157700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk    ObjectBaseRef<Allocation> *mSlots;
158700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk    ObjectBaseRef<const Type> *mTypes;
159700ba38f022208686523ab4280c4fc9f102aa273Alex Sakhartchouk
160326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams};
161326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
162326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
163326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
164326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
165326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#endif
166