xref: /aosp_15_r20/frameworks/rs/rsHidlAdaptation.h (revision e1eccf28f96817838ad6867f7f39d2351ec11f56)
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