Yang Ni | 1ffd86b | 2015-01-07 09:16:40 -0800 | [diff] [blame] | 1 | #ifndef ANDROID_RENDERSCRIPT_CLOSURE_H_ |
| 2 | #define ANDROID_RENDERSCRIPT_CLOSURE_H_ |
| 3 | |
Yang Ni | 1ffd86b | 2015-01-07 09:16:40 -0800 | [diff] [blame] | 4 | #include "rsDefines.h" |
Yang Ni | ff2bb54 | 2015-02-02 14:33:47 -0800 | [diff] [blame] | 5 | #include "rsMap.h" |
Yang Ni | 1ffd86b | 2015-01-07 09:16:40 -0800 | [diff] [blame] | 6 | #include "rsObjectBase.h" |
| 7 | |
| 8 | namespace android { |
| 9 | namespace renderscript { |
| 10 | |
Yang Ni | 1ffd86b | 2015-01-07 09:16:40 -0800 | [diff] [blame] | 11 | class Allocation; |
| 12 | class Context; |
Yang Ni | 062c287 | 2015-02-20 15:20:00 -0800 | [diff] [blame] | 13 | class IDBase; |
Yang Ni | eb9aa67 | 2015-01-27 14:32:25 -0800 | [diff] [blame] | 14 | class ObjectBase; |
Yang Ni | 1ffd86b | 2015-01-07 09:16:40 -0800 | [diff] [blame] | 15 | class ScriptFieldID; |
Yang Ni | eb9aa67 | 2015-01-27 14:32:25 -0800 | [diff] [blame] | 16 | class ScriptInvokeID; |
Yang Ni | 1ffd86b | 2015-01-07 09:16:40 -0800 | [diff] [blame] | 17 | class ScriptKernelID; |
| 18 | class Type; |
| 19 | |
| 20 | class Closure : public ObjectBase { |
| 21 | public: |
Yang Ni | eb9aa67 | 2015-01-27 14:32:25 -0800 | [diff] [blame] | 22 | Closure(Context* context, |
| 23 | const ScriptKernelID* kernelID, |
| 24 | Allocation* returnValue, |
| 25 | const int numValues, |
| 26 | const ScriptFieldID** fieldIDs, |
| 27 | const void** values, // Allocations or primitive (numeric) types |
| 28 | const size_t* sizes, // size for data type. -1 indicates an allocation. |
| 29 | const Closure** depClosures, |
| 30 | const ScriptFieldID** depFieldIDs); |
| 31 | Closure(Context* context, |
| 32 | const ScriptInvokeID* invokeID, |
| 33 | const void* params, |
| 34 | const size_t paramLength, |
| 35 | const size_t numValues, |
| 36 | const ScriptFieldID** fieldIDs, |
| 37 | const void** values, // Allocations or primitive (numeric) types |
| 38 | const size_t* sizes); // size for data type. -1 indicates an allocation. |
Yang Ni | 1ffd86b | 2015-01-07 09:16:40 -0800 | [diff] [blame] | 39 | |
Yang Ni | eb9aa67 | 2015-01-27 14:32:25 -0800 | [diff] [blame] | 40 | virtual ~Closure(); |
Yang Ni | 1ffd86b | 2015-01-07 09:16:40 -0800 | [diff] [blame] | 41 | |
Yang Ni | eb9aa67 | 2015-01-27 14:32:25 -0800 | [diff] [blame] | 42 | virtual void serialize(Context *rsc, OStream *stream) const {} |
Yang Ni | 1ffd86b | 2015-01-07 09:16:40 -0800 | [diff] [blame] | 43 | |
Yang Ni | eb9aa67 | 2015-01-27 14:32:25 -0800 | [diff] [blame] | 44 | virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_CLOSURE; } |
Yang Ni | 1ffd86b | 2015-01-07 09:16:40 -0800 | [diff] [blame] | 45 | |
Yang Ni | eb9aa67 | 2015-01-27 14:32:25 -0800 | [diff] [blame] | 46 | void setArg(const uint32_t index, const void* value, const size_t size); |
| 47 | void setGlobal(const ScriptFieldID* fieldID, const void* value, |
| 48 | const size_t size); |
Yang Ni | 1ffd86b | 2015-01-07 09:16:40 -0800 | [diff] [blame] | 49 | |
Yang Ni | eb9aa67 | 2015-01-27 14:32:25 -0800 | [diff] [blame] | 50 | Context* mContext; |
Yang Ni | 1ffd86b | 2015-01-07 09:16:40 -0800 | [diff] [blame] | 51 | |
Yang Ni | 062c287 | 2015-02-20 15:20:00 -0800 | [diff] [blame] | 52 | // KernelId or InvokeID |
| 53 | const ObjectBaseRef<IDBase> mFunctionID; |
| 54 | // Flag indicating if this closure is for a kernel (true) or invocable |
| 55 | // function (false) |
| 56 | const bool mIsKernel; |
Yang Ni | 1ffd86b | 2015-01-07 09:16:40 -0800 | [diff] [blame] | 57 | |
Yang Ni | eb9aa67 | 2015-01-27 14:32:25 -0800 | [diff] [blame] | 58 | // Values referrenced in arguments and globals cannot be futures. They must be |
| 59 | // either a known value or unbound value. |
| 60 | // For now, all arguments should be Allocations. |
Yang Ni | ff2bb54 | 2015-02-02 14:33:47 -0800 | [diff] [blame] | 61 | const void** mArgs; |
| 62 | size_t mNumArg; |
Yang Ni | 1ffd86b | 2015-01-07 09:16:40 -0800 | [diff] [blame] | 63 | |
Yang Ni | ff2bb54 | 2015-02-02 14:33:47 -0800 | [diff] [blame] | 64 | // A global could be allocation or any primitive data type. |
| 65 | Map<const ScriptFieldID*, Pair<const void*, size_t>> mGlobals; |
Yang Ni | 1ffd86b | 2015-01-07 09:16:40 -0800 | [diff] [blame] | 66 | |
Yang Ni | eb9aa67 | 2015-01-27 14:32:25 -0800 | [diff] [blame] | 67 | Allocation* mReturnValue; |
Yang Ni | 1ffd86b | 2015-01-07 09:16:40 -0800 | [diff] [blame] | 68 | |
Yang Ni | eb9aa67 | 2015-01-27 14:32:25 -0800 | [diff] [blame] | 69 | // All the other closures which this closure depends on for one of its |
| 70 | // arguments, and the fields which it depends on. |
Yang Ni | ff2bb54 | 2015-02-02 14:33:47 -0800 | [diff] [blame] | 71 | Map<const Closure*, Map<int, const ObjectBaseRef<ScriptFieldID>*>*> mArgDeps; |
Yang Ni | eb9aa67 | 2015-01-27 14:32:25 -0800 | [diff] [blame] | 72 | |
| 73 | // All the other closures that this closure depends on for one of its fields, |
| 74 | // and the fields that it depends on. |
Yang Ni | ff2bb54 | 2015-02-02 14:33:47 -0800 | [diff] [blame] | 75 | Map<const Closure*, Map<const ObjectBaseRef<ScriptFieldID>*, |
Yang Ni | eb9aa67 | 2015-01-27 14:32:25 -0800 | [diff] [blame] | 76 | const ObjectBaseRef<ScriptFieldID>*>*> mGlobalDeps; |
| 77 | |
| 78 | const void* mParams; |
| 79 | const size_t mParamLength; |
Yang Ni | 1ffd86b | 2015-01-07 09:16:40 -0800 | [diff] [blame] | 80 | }; |
| 81 | |
| 82 | } // namespace renderscript |
| 83 | } // namespace android |
| 84 | |
| 85 | #endif // ANDROID_RENDERSCRIPT_CLOSURE_H_ |