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