11ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni#ifndef ANDROID_RENDERSCRIPT_CLOSURE_H_ 21ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni#define ANDROID_RENDERSCRIPT_CLOSURE_H_ 31ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni 41ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni#include "rsDefines.h" 5ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni#include "rsMap.h" 61ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni#include "rsObjectBase.h" 71ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni 81ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ninamespace android { 91ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ninamespace renderscript { 101ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni 111ffd86b448d78366190c540f98f8b6d641cdb6cfYang Niclass Allocation; 121ffd86b448d78366190c540f98f8b6d641cdb6cfYang Niclass Context; 13062c287f573ecc06c38ee4295e5627e12c52ac3dYang Niclass IDBase; 14eb9aa675754c49f613c6ad71d41472b30f38b007Yang Niclass ObjectBase; 151ffd86b448d78366190c540f98f8b6d641cdb6cfYang Niclass ScriptFieldID; 16eb9aa675754c49f613c6ad71d41472b30f38b007Yang Niclass ScriptInvokeID; 171ffd86b448d78366190c540f98f8b6d641cdb6cfYang Niclass ScriptKernelID; 181ffd86b448d78366190c540f98f8b6d641cdb6cfYang Niclass Type; 191ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni 201ffd86b448d78366190c540f98f8b6d641cdb6cfYang Niclass Closure : public ObjectBase { 211ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni public: 22eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni Closure(Context* context, 23eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni const ScriptKernelID* kernelID, 24eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni Allocation* returnValue, 25eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni const int numValues, 26eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni const ScriptFieldID** fieldIDs, 27fef0cd45027f235126d4fb62bda5ea9037450d9cYang Ni const int64_t* values, // Allocations or primitive (numeric) types 28bd0af2d161e36e52e6782ccb2d15dd5a36467704Yang Ni const int* sizes, // size for data type. -1 indicates an allocation. 29eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni const Closure** depClosures, 30eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni const ScriptFieldID** depFieldIDs); 31eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni Closure(Context* context, 32eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni const ScriptInvokeID* invokeID, 33eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni const void* params, 34eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni const size_t paramLength, 35eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni const size_t numValues, 36eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni const ScriptFieldID** fieldIDs, 37fef0cd45027f235126d4fb62bda5ea9037450d9cYang Ni const int64_t* values, // Allocations or primitive (numeric) types 38bd0af2d161e36e52e6782ccb2d15dd5a36467704Yang Ni const int* sizes); // size for data type. -1 indicates an allocation. 39eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni 40eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni virtual ~Closure(); 41eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni 42eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni virtual void serialize(Context *rsc, OStream *stream) const {} 43eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni 44eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_CLOSURE; } 45eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni 46fef0cd45027f235126d4fb62bda5ea9037450d9cYang Ni // Set the value of an argument or a global. 47fef0cd45027f235126d4fb62bda5ea9037450d9cYang Ni // The special value -1 for the size indicates the value is an Allocation. 48fef0cd45027f235126d4fb62bda5ea9037450d9cYang Ni void setArg(const uint32_t index, const void* value, const int size); 49fef0cd45027f235126d4fb62bda5ea9037450d9cYang Ni void setGlobal(const ScriptFieldID* fieldID, const int64_t value, 50bd0af2d161e36e52e6782ccb2d15dd5a36467704Yang Ni const int size); 51eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni 52eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni Context* mContext; 53eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni 54062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni // KernelId or InvokeID 55062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni const ObjectBaseRef<IDBase> mFunctionID; 56062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni // Flag indicating if this closure is for a kernel (true) or invocable 57062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni // function (false) 58062c287f573ecc06c38ee4295e5627e12c52ac3dYang Ni const bool mIsKernel; 59eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni 60eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni // Values referrenced in arguments and globals cannot be futures. They must be 61eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni // either a known value or unbound value. 62eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni // For now, all arguments should be Allocations. 63ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni const void** mArgs; 64ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni size_t mNumArg; 65eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni 66ff2bb54ebf593b1d19d3a2e4cfa70a8ea4432c0dYang Ni // A global could be allocation or any primitive data type. 67fef0cd45027f235126d4fb62bda5ea9037450d9cYang Ni Map<const ScriptFieldID*, Pair<int64_t, int>> mGlobals; 68eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni 69eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni Allocation* mReturnValue; 70eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni 71eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni // All the other closures which this closure depends on for one of its 72eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni // arguments, and the fields which it depends on. 73bd0af2d161e36e52e6782ccb2d15dd5a36467704Yang Ni Map<const Closure*, Map<int, ObjectBaseRef<ScriptFieldID>>*> mArgDeps; 74eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni 75eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni // All the other closures that this closure depends on for one of its fields, 76eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni // and the fields that it depends on. 77bd0af2d161e36e52e6782ccb2d15dd5a36467704Yang Ni Map<const Closure*, Map<const ScriptFieldID*, 78bd0af2d161e36e52e6782ccb2d15dd5a36467704Yang Ni ObjectBaseRef<ScriptFieldID>>*> mGlobalDeps; 79eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni 8099bd4a4614d03e02bb4e07db15c7af5a736211a0Yang Ni uint8_t* mParams; 81eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni const size_t mParamLength; 821ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni}; 831ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni 841ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni} // namespace renderscript 851ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni} // namespace android 861ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni 871ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni#endif // ANDROID_RENDERSCRIPT_CLOSURE_H_ 88