1*e1eccf28SAndroid Build Coastguard Worker /* 2*e1eccf28SAndroid Build Coastguard Worker * Copyright(C) 2017 The Android Open Source Project 3*e1eccf28SAndroid Build Coastguard Worker * 4*e1eccf28SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*e1eccf28SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*e1eccf28SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*e1eccf28SAndroid Build Coastguard Worker * 8*e1eccf28SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*e1eccf28SAndroid Build Coastguard Worker * 10*e1eccf28SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*e1eccf28SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*e1eccf28SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*e1eccf28SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*e1eccf28SAndroid Build Coastguard Worker * limitations under the License. 15*e1eccf28SAndroid Build Coastguard Worker */ 16*e1eccf28SAndroid Build Coastguard Worker 17*e1eccf28SAndroid Build Coastguard Worker #ifndef ANDROID_RS_HIDL_ADAPTATION_H 18*e1eccf28SAndroid Build Coastguard Worker #define ANDROID_RS_HIDL_ADAPTATION_H 19*e1eccf28SAndroid Build Coastguard Worker 20*e1eccf28SAndroid Build Coastguard Worker #include <android/hardware/renderscript/1.0/IDevice.h> 21*e1eccf28SAndroid Build Coastguard Worker #include <set> 22*e1eccf28SAndroid Build Coastguard Worker #include <mutex> 23*e1eccf28SAndroid Build Coastguard Worker 24*e1eccf28SAndroid Build Coastguard Worker struct dispatchTable; 25*e1eccf28SAndroid Build Coastguard Worker 26*e1eccf28SAndroid Build Coastguard Worker using ::android::hardware::renderscript::V1_0::IContext; 27*e1eccf28SAndroid Build Coastguard Worker 28*e1eccf28SAndroid Build Coastguard Worker /* 29*e1eccf28SAndroid Build Coastguard Worker * RsHidlAdaptation is a singleton class. 30*e1eccf28SAndroid Build Coastguard Worker * 31*e1eccf28SAndroid Build Coastguard Worker * RsHidlAdaptation is used for the following purposes: 32*e1eccf28SAndroid Build Coastguard Worker * 1. Load the dispatch table with HIDL implementation or CPU fallback. 33*e1eccf28SAndroid Build Coastguard Worker * 2. Convert input paramters to HIDL types, when using HIDL path. 34*e1eccf28SAndroid Build Coastguard Worker * 3. Convert output parameters from HIDL types to RS types, when using HIDL path. 35*e1eccf28SAndroid Build Coastguard Worker * 36*e1eccf28SAndroid Build Coastguard Worker * Access of static member objects is protected by global teardown flag. 37*e1eccf28SAndroid Build Coastguard Worker * https://goto.google.com/rs-static-destructor 38*e1eccf28SAndroid Build Coastguard Worker * 39*e1eccf28SAndroid Build Coastguard Worker */ 40*e1eccf28SAndroid Build Coastguard Worker class RsHidlAdaptation 41*e1eccf28SAndroid Build Coastguard Worker { 42*e1eccf28SAndroid Build Coastguard Worker public: 43*e1eccf28SAndroid Build Coastguard Worker static RsHidlAdaptation& GetInstance(); 44*e1eccf28SAndroid Build Coastguard Worker static const dispatchTable* GetEntryFuncs(); 45*e1eccf28SAndroid Build Coastguard Worker 46*e1eccf28SAndroid Build Coastguard Worker private: 47*e1eccf28SAndroid Build Coastguard Worker RsHidlAdaptation(); 48*e1eccf28SAndroid Build Coastguard Worker void InitializeHalDeviceContext(); 49*e1eccf28SAndroid Build Coastguard Worker void LoadDispatchForHidl(); 50*e1eccf28SAndroid Build Coastguard Worker static IContext *GetIContextHandle(RsContext con); 51*e1eccf28SAndroid Build Coastguard Worker 52*e1eccf28SAndroid Build Coastguard Worker // HAL entries 53*e1eccf28SAndroid Build Coastguard Worker static RsContext ContextCreate(RsDevice vdev, uint32_t version, uint32_t sdkVersion, RsContextType ct, uint32_t flags); 54*e1eccf28SAndroid Build Coastguard Worker static void ContextDestroy(RsContext); 55*e1eccf28SAndroid Build Coastguard Worker static void ContextFinish(RsContext); 56*e1eccf28SAndroid Build Coastguard Worker static void ContextDump(RsContext, int32_t); 57*e1eccf28SAndroid Build Coastguard Worker static void ContextSetCacheDir(RsContext rsc, const char *cacheDir, size_t cacheDir_length); 58*e1eccf28SAndroid Build Coastguard Worker static void ContextSetPriority(RsContext, int32_t); 59*e1eccf28SAndroid Build Coastguard Worker static RsMessageToClientType ContextGetMessage(RsContext, void*, size_t, size_t*, size_t, uint32_t*, size_t); 60*e1eccf28SAndroid Build Coastguard Worker static RsMessageToClientType ContextPeekMessage(RsContext, size_t*, size_t, uint32_t*, size_t); 61*e1eccf28SAndroid Build Coastguard Worker static void ContextSendMessage(RsContext, uint32_t, const uint8_t*, size_t); 62*e1eccf28SAndroid Build Coastguard Worker static void ContextInitToClient(RsContext); 63*e1eccf28SAndroid Build Coastguard Worker static void ContextDeinitToClient(RsContext); 64*e1eccf28SAndroid Build Coastguard Worker 65*e1eccf28SAndroid Build Coastguard Worker static void AssignName(RsContext, RsObjectBase, const char*, size_t); 66*e1eccf28SAndroid Build Coastguard Worker static void GetName(RsContext, void * obj, const char **name); 67*e1eccf28SAndroid Build Coastguard Worker static void ObjDestroy(RsContext, RsAsyncVoidPtr); 68*e1eccf28SAndroid Build Coastguard Worker 69*e1eccf28SAndroid Build Coastguard Worker static RsElement ElementCreate(RsContext, RsDataType, RsDataKind, bool, uint32_t); 70*e1eccf28SAndroid Build Coastguard Worker static RsElement ElementCreate2(RsContext, const RsElement*, size_t, const char**, size_t, const size_t*, const uint32_t*, size_t); 71*e1eccf28SAndroid Build Coastguard Worker static void ElementGetNativeData(RsContext, RsElement, uint32_t *elemData, uint32_t elemDataSize); 72*e1eccf28SAndroid Build Coastguard Worker static void ElementGetSubElements(RsContext, RsElement, uintptr_t *ids, const char **names, size_t *arraySizes, uint32_t dataSize); 73*e1eccf28SAndroid Build Coastguard Worker 74*e1eccf28SAndroid Build Coastguard Worker static RsType TypeCreate(RsContext, RsElement, uint32_t, uint32_t, uint32_t, bool, bool, uint32_t); 75*e1eccf28SAndroid Build Coastguard Worker static void TypeGetNativeData(RsContext, RsType, uintptr_t *typeData, uint32_t typeDataSize); 76*e1eccf28SAndroid Build Coastguard Worker 77*e1eccf28SAndroid Build Coastguard Worker static RsAllocation AllocationCreateTyped(RsContext, RsType, RsAllocationMipmapControl, uint32_t, uintptr_t); 78*e1eccf28SAndroid Build Coastguard Worker static RsAllocation AllocationCreateFromBitmap(RsContext, RsType, RsAllocationMipmapControl, const void*, size_t, uint32_t); 79*e1eccf28SAndroid Build Coastguard Worker static RsAllocation AllocationCubeCreateFromBitmap(RsContext, RsType, RsAllocationMipmapControl, const void*, size_t, uint32_t); 80*e1eccf28SAndroid Build Coastguard Worker static const void* AllocationGetType(RsContext con, RsAllocation va); 81*e1eccf28SAndroid Build Coastguard Worker static RsNativeWindow AllocationGetSurface(RsContext, RsAllocation); 82*e1eccf28SAndroid Build Coastguard Worker static void AllocationSetSurface(RsContext, RsAllocation, RsNativeWindow); 83*e1eccf28SAndroid Build Coastguard Worker static void AllocationCopyToBitmap(RsContext, RsAllocation, void*, size_t); 84*e1eccf28SAndroid Build Coastguard Worker static void Allocation1DData(RsContext, RsAllocation, uint32_t, uint32_t, uint32_t, const void*, size_t); 85*e1eccf28SAndroid Build Coastguard Worker static void Allocation1DElementData(RsContext, RsAllocation, uint32_t, uint32_t, const void*, size_t, size_t); 86*e1eccf28SAndroid Build Coastguard Worker static void AllocationElementData(RsContext, RsAllocation, uint32_t, uint32_t, uint32_t, uint32_t, const void*, size_t, size_t); 87*e1eccf28SAndroid Build Coastguard Worker static void Allocation2DData(RsContext, RsAllocation, uint32_t, uint32_t, uint32_t, RsAllocationCubemapFace, uint32_t, uint32_t, const void*, size_t, size_t); 88*e1eccf28SAndroid Build Coastguard Worker static void Allocation3DData(RsContext, RsAllocation, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, const void*, size_t, size_t); 89*e1eccf28SAndroid Build Coastguard Worker static void AllocationGenerateMipmaps(RsContext, RsAllocation); 90*e1eccf28SAndroid Build Coastguard Worker static void AllocationRead(RsContext, RsAllocation, void*, size_t); 91*e1eccf28SAndroid Build Coastguard Worker static void Allocation1DRead(RsContext, RsAllocation, uint32_t, uint32_t, uint32_t, void*, size_t); 92*e1eccf28SAndroid Build Coastguard Worker static void AllocationElementRead(RsContext, RsAllocation, uint32_t, uint32_t, uint32_t, uint32_t, void*, size_t, size_t); 93*e1eccf28SAndroid Build Coastguard Worker static void Allocation2DRead(RsContext, RsAllocation, uint32_t, uint32_t, uint32_t, RsAllocationCubemapFace, uint32_t, uint32_t, void*, size_t, size_t); 94*e1eccf28SAndroid Build Coastguard Worker static void Allocation3DRead(RsContext, RsAllocation, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, void*, size_t, size_t); 95*e1eccf28SAndroid Build Coastguard Worker static void AllocationSyncAll(RsContext, RsAllocation, RsAllocationUsageType); 96*e1eccf28SAndroid Build Coastguard Worker static void AllocationResize1D(RsContext, RsAllocation, uint32_t); 97*e1eccf28SAndroid Build Coastguard Worker static void AllocationCopy2DRange(RsContext, RsAllocation, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, RsAllocation, uint32_t, uint32_t, uint32_t, uint32_t); 98*e1eccf28SAndroid Build Coastguard Worker static void AllocationCopy3DRange(RsContext, RsAllocation, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, RsAllocation, uint32_t, uint32_t, uint32_t, uint32_t); 99*e1eccf28SAndroid Build Coastguard Worker static void AllocationIoSend(RsContext, RsAllocation); 100*e1eccf28SAndroid Build Coastguard Worker static int64_t AllocationIoReceive(RsContext, RsAllocation); 101*e1eccf28SAndroid Build Coastguard Worker static void *AllocationGetPointer(RsContext, RsAllocation, uint32_t lod, RsAllocationCubemapFace face, uint32_t z, uint32_t array, size_t *stride, size_t stride_len); 102*e1eccf28SAndroid Build Coastguard Worker static void AllocationSetupBufferQueue(RsContext context, RsAllocation valloc, uint32_t numAlloc); 103*e1eccf28SAndroid Build Coastguard Worker static void AllocationShareBufferQueue(RsContext context, RsAllocation valloc1, RsAllocation valloc2); 104*e1eccf28SAndroid Build Coastguard Worker static RsAllocation AllocationAdapterCreate(RsContext rsc, RsType vtype, RsAllocation baseAlloc); 105*e1eccf28SAndroid Build Coastguard Worker static void AllocationAdapterOffset(RsContext rsc, RsAllocation alloc, const uint32_t * offsets, size_t offsets_length); 106*e1eccf28SAndroid Build Coastguard Worker 107*e1eccf28SAndroid Build Coastguard Worker static RsScript ScriptCCreate(RsContext, const char*, size_t, const char*, size_t, const char*, size_t); 108*e1eccf28SAndroid Build Coastguard Worker static RsScript ScriptIntrinsicCreate(RsContext, uint32_t id, RsElement); 109*e1eccf28SAndroid Build Coastguard Worker static void ScriptBindAllocation(RsContext, RsScript, RsAllocation, uint32_t); 110*e1eccf28SAndroid Build Coastguard Worker static void ScriptSetTimeZone(RsContext, RsScript, const char*, size_t); 111*e1eccf28SAndroid Build Coastguard Worker static void ScriptInvoke(RsContext, RsScript, uint32_t); 112*e1eccf28SAndroid Build Coastguard Worker static void ScriptInvokeV(RsContext, RsScript, uint32_t, const void*, size_t); 113*e1eccf28SAndroid Build Coastguard Worker static void ScriptForEach(RsContext, RsScript, uint32_t, RsAllocation, RsAllocation, const void*, size_t, const RsScriptCall*, size_t); 114*e1eccf28SAndroid Build Coastguard Worker static void ScriptForEachMulti(RsContext, RsScript, uint32_t, RsAllocation*, size_t, RsAllocation, const void*, size_t, const RsScriptCall*, size_t); 115*e1eccf28SAndroid Build Coastguard Worker static void ScriptReduce(RsContext, RsScript, uint32_t, RsAllocation*, size_t, RsAllocation, const RsScriptCall*, size_t); 116*e1eccf28SAndroid Build Coastguard Worker static void ScriptSetVarI(RsContext, RsScript, uint32_t, int); 117*e1eccf28SAndroid Build Coastguard Worker static void ScriptSetVarObj(RsContext, RsScript, uint32_t, RsObjectBase); 118*e1eccf28SAndroid Build Coastguard Worker static void ScriptSetVarJ(RsContext, RsScript, uint32_t, int64_t); 119*e1eccf28SAndroid Build Coastguard Worker static void ScriptSetVarF(RsContext, RsScript, uint32_t, float); 120*e1eccf28SAndroid Build Coastguard Worker static void ScriptSetVarD(RsContext, RsScript, uint32_t, double); 121*e1eccf28SAndroid Build Coastguard Worker static void ScriptSetVarV(RsContext, RsScript, uint32_t, const void*, size_t); 122*e1eccf28SAndroid Build Coastguard Worker static void ScriptGetVarV(RsContext, RsScript, uint32_t, void*, size_t); 123*e1eccf28SAndroid Build Coastguard Worker static void ScriptSetVarVE(RsContext, RsScript, uint32_t, const void*, size_t, RsElement, const uint32_t*, size_t); 124*e1eccf28SAndroid Build Coastguard Worker 125*e1eccf28SAndroid Build Coastguard Worker static RsScriptGroup ScriptGroupCreate(RsContext, RsScriptKernelID*, size_t, RsScriptKernelID*, size_t, RsScriptKernelID*, size_t, RsScriptFieldID*, size_t, const RsType*, size_t); 126*e1eccf28SAndroid Build Coastguard Worker static RsScriptGroup2 ScriptGroup2Create(RsContext, const char*, size_t, const char*, size_t, RsClosure*, size_t); 127*e1eccf28SAndroid Build Coastguard Worker static RsScriptKernelID ScriptKernelIDCreate(RsContext, RsScript, int, int); 128*e1eccf28SAndroid Build Coastguard Worker static RsScriptInvokeID ScriptInvokeIDCreate(RsContext, RsScript, int); 129*e1eccf28SAndroid Build Coastguard Worker static RsScriptFieldID ScriptFieldIDCreate(RsContext, RsScript, int); 130*e1eccf28SAndroid Build Coastguard Worker static void ScriptGroupSetOutput(RsContext, RsScriptGroup, RsScriptKernelID, RsAllocation); 131*e1eccf28SAndroid Build Coastguard Worker static void ScriptGroupSetInput(RsContext, RsScriptGroup, RsScriptKernelID, RsAllocation); 132*e1eccf28SAndroid Build Coastguard Worker static void ScriptGroupExecute(RsContext, RsScriptGroup); 133*e1eccf28SAndroid Build Coastguard Worker static RsClosure ClosureCreate(RsContext context, RsScriptKernelID kernelID, RsAllocation returnValue, RsScriptFieldID* fieldIDs, size_t fieldIDs_length, int64_t* values, size_t values_length, int* sizes, size_t sizes_length, RsClosure* depClosures, size_t depClosures_length, RsScriptFieldID* depFieldIDs, size_t depFieldIDs_length); 134*e1eccf28SAndroid Build Coastguard Worker static RsClosure InvokeClosureCreate(RsContext, RsScriptInvokeID, const void*, const size_t, const RsScriptFieldID*, const size_t, const int64_t*, const size_t, const int*, const size_t); 135*e1eccf28SAndroid Build Coastguard Worker static void ClosureSetArg(RsContext, RsClosure, uint32_t, uintptr_t, int); 136*e1eccf28SAndroid Build Coastguard Worker static void ClosureSetGlobal(RsContext, RsClosure, RsScriptFieldID, int64_t, int); 137*e1eccf28SAndroid Build Coastguard Worker 138*e1eccf28SAndroid Build Coastguard Worker static RsSampler SamplerCreate(RsContext, RsSamplerValue, RsSamplerValue, RsSamplerValue, RsSamplerValue, RsSamplerValue, float); 139*e1eccf28SAndroid Build Coastguard Worker 140*e1eccf28SAndroid Build Coastguard Worker // Dispatch table entries for HIDL. The dispatch table is initialized by the 141*e1eccf28SAndroid Build Coastguard Worker // constructor of this singleton class, to avoid concurrency issues. 142*e1eccf28SAndroid Build Coastguard Worker static dispatchTable mEntryFuncs; 143*e1eccf28SAndroid Build Coastguard Worker 144*e1eccf28SAndroid Build Coastguard Worker // HIDL instance. This is a singleton HIDL instance, providing a handle for 145*e1eccf28SAndroid Build Coastguard Worker // RenderScript HIDL implementation (driver). The handle is created by the 146*e1eccf28SAndroid Build Coastguard Worker // constructor of this singleton class. 147*e1eccf28SAndroid Build Coastguard Worker static android::sp<android::hardware::renderscript::V1_0::IDevice> mHidl; 148*e1eccf28SAndroid Build Coastguard Worker 149*e1eccf28SAndroid Build Coastguard Worker // mContexts keeps Treble returned sp<IContext>s alive. 150*e1eccf28SAndroid Build Coastguard Worker static std::set<android::sp<IContext> > mContexts; 151*e1eccf28SAndroid Build Coastguard Worker 152*e1eccf28SAndroid Build Coastguard Worker // mMutex is used to protect concurrent modification to the mContexts set. 153*e1eccf28SAndroid Build Coastguard Worker // std::mutex is safe for pthreads on Android. Since other threading model 154*e1eccf28SAndroid Build Coastguard Worker // supported on Android are built on top of pthread, std::mutex is safe for them. 155*e1eccf28SAndroid Build Coastguard Worker static std::mutex mContextsMutex; 156*e1eccf28SAndroid Build Coastguard Worker }; 157*e1eccf28SAndroid Build Coastguard Worker 158*e1eccf28SAndroid Build Coastguard Worker #endif // ANDROID_RS_HIDL_ADAPTATION_H 159