| 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_ |