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