Home | History | Annotate | Download | only in rs
      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 
     42     virtual void serialize(Context *rsc, OStream *stream) const {}
     43 
     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