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 
serialize(Context * rsc,OStream * stream)42     virtual void serialize(Context *rsc, OStream *stream) const {}
43 
getClassId()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