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 void** 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 void** 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     void setArg(const uint32_t index, const void* value, const size_t size);
47     void setGlobal(const ScriptFieldID* fieldID, const void* value,
48                    const int size);
49 
50     Context* mContext;
51 
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;
57 
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.
61     const void** mArgs;
62     size_t mNumArg;
63 
64     // A global could be allocation or any primitive data type.
65     Map<const ScriptFieldID*, Pair<const void*, int>> mGlobals;
66 
67     Allocation* mReturnValue;
68 
69     // All the other closures which this closure depends on for one of its
70     // arguments, and the fields which it depends on.
71     Map<const Closure*, Map<int, ObjectBaseRef<ScriptFieldID>>*> mArgDeps;
72 
73     // All the other closures that this closure depends on for one of its fields,
74     // and the fields that it depends on.
75     Map<const Closure*, Map<const ScriptFieldID*,
76             ObjectBaseRef<ScriptFieldID>>*> mGlobalDeps;
77 
78     uint8_t* mParams;
79     const size_t mParamLength;
80 };
81 
82 }  // namespace renderscript
83 }  // namespace android
84 
85 #endif  // ANDROID_RENDERSCRIPT_CLOSURE_H_
86