xref: /aosp_15_r20/hardware/interfaces/renderscript/1.0/default/Device.cpp (revision 4d7e907c777eeecc4c5bd7cf640a754fac206ff7)
1*4d7e907cSAndroid Build Coastguard Worker /*
2*4d7e907cSAndroid Build Coastguard Worker  * Copyright (C) 2018 The Android Open Source Project
3*4d7e907cSAndroid Build Coastguard Worker  *
4*4d7e907cSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*4d7e907cSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*4d7e907cSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*4d7e907cSAndroid Build Coastguard Worker  *
8*4d7e907cSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*4d7e907cSAndroid Build Coastguard Worker  *
10*4d7e907cSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*4d7e907cSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*4d7e907cSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4d7e907cSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*4d7e907cSAndroid Build Coastguard Worker  * limitations under the License.
15*4d7e907cSAndroid Build Coastguard Worker  */
16*4d7e907cSAndroid Build Coastguard Worker 
17*4d7e907cSAndroid Build Coastguard Worker #include "Context.h"
18*4d7e907cSAndroid Build Coastguard Worker #include "Device.h"
19*4d7e907cSAndroid Build Coastguard Worker 
20*4d7e907cSAndroid Build Coastguard Worker #include <android-base/logging.h>
21*4d7e907cSAndroid Build Coastguard Worker #include <android/dlext.h>
22*4d7e907cSAndroid Build Coastguard Worker #include <dlfcn.h>
23*4d7e907cSAndroid Build Coastguard Worker 
24*4d7e907cSAndroid Build Coastguard Worker namespace android {
25*4d7e907cSAndroid Build Coastguard Worker namespace hardware {
26*4d7e907cSAndroid Build Coastguard Worker namespace renderscript {
27*4d7e907cSAndroid Build Coastguard Worker namespace V1_0 {
28*4d7e907cSAndroid Build Coastguard Worker namespace implementation {
29*4d7e907cSAndroid Build Coastguard Worker 
30*4d7e907cSAndroid Build Coastguard Worker 
31*4d7e907cSAndroid Build Coastguard Worker static dispatchTable loadHAL();
32*4d7e907cSAndroid Build Coastguard Worker dispatchTable Device::mDispatchHal = loadHAL();
33*4d7e907cSAndroid Build Coastguard Worker 
Device()34*4d7e907cSAndroid Build Coastguard Worker Device::Device() {
35*4d7e907cSAndroid Build Coastguard Worker }
36*4d7e907cSAndroid Build Coastguard Worker 
getHal()37*4d7e907cSAndroid Build Coastguard Worker dispatchTable& Device::getHal() {
38*4d7e907cSAndroid Build Coastguard Worker     return mDispatchHal;
39*4d7e907cSAndroid Build Coastguard Worker }
40*4d7e907cSAndroid Build Coastguard Worker 
41*4d7e907cSAndroid Build Coastguard Worker 
42*4d7e907cSAndroid Build Coastguard Worker // Methods from ::android::hardware::renderscript::V1_0::IDevice follow.
43*4d7e907cSAndroid Build Coastguard Worker 
contextCreate(uint32_t sdkVersion,ContextType ct,int32_t flags)44*4d7e907cSAndroid Build Coastguard Worker Return<sp<IContext>> Device::contextCreate(uint32_t sdkVersion, ContextType ct, int32_t flags) {
45*4d7e907cSAndroid Build Coastguard Worker     return new Context(sdkVersion, ct, flags);
46*4d7e907cSAndroid Build Coastguard Worker }
47*4d7e907cSAndroid Build Coastguard Worker 
48*4d7e907cSAndroid Build Coastguard Worker 
49*4d7e907cSAndroid Build Coastguard Worker // Methods from ::android::hidl::base::V1_0::IBase follow.
50*4d7e907cSAndroid Build Coastguard Worker 
HIDL_FETCH_IDevice(const char *)51*4d7e907cSAndroid Build Coastguard Worker IDevice* HIDL_FETCH_IDevice(const char* /* name */) {
52*4d7e907cSAndroid Build Coastguard Worker     return new Device();
53*4d7e907cSAndroid Build Coastguard Worker }
54*4d7e907cSAndroid Build Coastguard Worker 
55*4d7e907cSAndroid Build Coastguard Worker // Helper function
loadHAL()56*4d7e907cSAndroid Build Coastguard Worker dispatchTable loadHAL() {
57*4d7e907cSAndroid Build Coastguard Worker 
58*4d7e907cSAndroid Build Coastguard Worker     static_assert(sizeof(void*) <= sizeof(uint64_t), "RenderScript HIDL Error: sizeof(void*) > sizeof(uint64_t)");
59*4d7e907cSAndroid Build Coastguard Worker     static_assert(sizeof(size_t) <= sizeof(uint64_t), "RenderScript HIDL Error: sizeof(size_t) > sizeof(uint64_t)");
60*4d7e907cSAndroid Build Coastguard Worker 
61*4d7e907cSAndroid Build Coastguard Worker     const char* filename = "libRS_internal.so";
62*4d7e907cSAndroid Build Coastguard Worker     // Try to load libRS_internal.so from the "rs" namespace directly.
63*4d7e907cSAndroid Build Coastguard Worker     typedef struct android_namespace_t* (*GetExportedNamespaceFnPtr)(const char*);
64*4d7e907cSAndroid Build Coastguard Worker     GetExportedNamespaceFnPtr getExportedNamespace = reinterpret_cast<GetExportedNamespaceFnPtr>(
65*4d7e907cSAndroid Build Coastguard Worker         dlsym(RTLD_DEFAULT, "android_get_exported_namespace"));
66*4d7e907cSAndroid Build Coastguard Worker     void* handle = nullptr;
67*4d7e907cSAndroid Build Coastguard Worker     if (getExportedNamespace != nullptr) {
68*4d7e907cSAndroid Build Coastguard Worker         android_namespace_t* rsNamespace = getExportedNamespace("rs");
69*4d7e907cSAndroid Build Coastguard Worker         if (rsNamespace != nullptr) {
70*4d7e907cSAndroid Build Coastguard Worker             const android_dlextinfo dlextinfo = {
71*4d7e907cSAndroid Build Coastguard Worker                 .flags = ANDROID_DLEXT_USE_NAMESPACE, .library_namespace = rsNamespace,
72*4d7e907cSAndroid Build Coastguard Worker             };
73*4d7e907cSAndroid Build Coastguard Worker             handle = android_dlopen_ext(filename, RTLD_LAZY | RTLD_LOCAL, &dlextinfo);
74*4d7e907cSAndroid Build Coastguard Worker             if (handle == nullptr) {
75*4d7e907cSAndroid Build Coastguard Worker                 LOG(WARNING) << "android_dlopen_ext(" << filename << ") failed: " << dlerror();
76*4d7e907cSAndroid Build Coastguard Worker             }
77*4d7e907cSAndroid Build Coastguard Worker         }
78*4d7e907cSAndroid Build Coastguard Worker     }
79*4d7e907cSAndroid Build Coastguard Worker     if (handle == nullptr) {
80*4d7e907cSAndroid Build Coastguard Worker         // if there is no "rs" namespace (in case when this HAL impl is loaded
81*4d7e907cSAndroid Build Coastguard Worker         // into a vendor process), then use the plain dlopen.
82*4d7e907cSAndroid Build Coastguard Worker         handle = dlopen(filename, RTLD_LAZY | RTLD_LOCAL);
83*4d7e907cSAndroid Build Coastguard Worker         if (handle == nullptr) {
84*4d7e907cSAndroid Build Coastguard Worker             LOG(FATAL) << "dlopen(" << filename << ") failed: " << dlerror();
85*4d7e907cSAndroid Build Coastguard Worker         }
86*4d7e907cSAndroid Build Coastguard Worker     }
87*4d7e907cSAndroid Build Coastguard Worker 
88*4d7e907cSAndroid Build Coastguard Worker     dispatchTable dispatchHal = {
89*4d7e907cSAndroid Build Coastguard Worker             .SetNativeLibDir = (SetNativeLibDirFnPtr) nullptr,
90*4d7e907cSAndroid Build Coastguard Worker 
91*4d7e907cSAndroid Build Coastguard Worker             .Allocation1DData = (Allocation1DDataFnPtr)dlsym(handle, "rsAllocation1DData"),
92*4d7e907cSAndroid Build Coastguard Worker             .Allocation1DElementData = (Allocation1DElementDataFnPtr) nullptr,
93*4d7e907cSAndroid Build Coastguard Worker             .Allocation1DRead = (Allocation1DReadFnPtr)dlsym(handle, "rsAllocation1DRead"),
94*4d7e907cSAndroid Build Coastguard Worker             .Allocation2DData = (Allocation2DDataFnPtr)dlsym(handle, "rsAllocation2DData"),
95*4d7e907cSAndroid Build Coastguard Worker             .Allocation2DRead = (Allocation2DReadFnPtr)dlsym(handle, "rsAllocation2DRead"),
96*4d7e907cSAndroid Build Coastguard Worker             .Allocation3DData = (Allocation3DDataFnPtr)dlsym(handle, "rsAllocation3DData"),
97*4d7e907cSAndroid Build Coastguard Worker             .Allocation3DRead = (Allocation3DReadFnPtr)dlsym(handle, "rsAllocation3DRead"),
98*4d7e907cSAndroid Build Coastguard Worker             .AllocationAdapterCreate =
99*4d7e907cSAndroid Build Coastguard Worker                     (AllocationAdapterCreateFnPtr)dlsym(handle, "rsAllocationAdapterCreate"),
100*4d7e907cSAndroid Build Coastguard Worker             .AllocationAdapterOffset =
101*4d7e907cSAndroid Build Coastguard Worker                     (AllocationAdapterOffsetFnPtr)dlsym(handle, "rsAllocationAdapterOffset"),
102*4d7e907cSAndroid Build Coastguard Worker             .AllocationCopy2DRange =
103*4d7e907cSAndroid Build Coastguard Worker                     (AllocationCopy2DRangeFnPtr)dlsym(handle, "rsAllocationCopy2DRange"),
104*4d7e907cSAndroid Build Coastguard Worker             .AllocationCopy3DRange =
105*4d7e907cSAndroid Build Coastguard Worker                     (AllocationCopy3DRangeFnPtr)dlsym(handle, "rsAllocationCopy3DRange"),
106*4d7e907cSAndroid Build Coastguard Worker             .AllocationCopyToBitmap =
107*4d7e907cSAndroid Build Coastguard Worker                     (AllocationCopyToBitmapFnPtr)dlsym(handle, "rsAllocationCopyToBitmap"),
108*4d7e907cSAndroid Build Coastguard Worker             .AllocationCreateFromBitmap =
109*4d7e907cSAndroid Build Coastguard Worker                     (AllocationCreateFromBitmapFnPtr)dlsym(handle, "rsAllocationCreateFromBitmap"),
110*4d7e907cSAndroid Build Coastguard Worker             .AllocationCreateStrided =
111*4d7e907cSAndroid Build Coastguard Worker                     (AllocationCreateStridedFnPtr)dlsym(handle, "rsAllocationCreateStrided"),
112*4d7e907cSAndroid Build Coastguard Worker             .AllocationCreateTyped =
113*4d7e907cSAndroid Build Coastguard Worker                     (AllocationCreateTypedFnPtr)dlsym(handle, "rsAllocationCreateTyped"),
114*4d7e907cSAndroid Build Coastguard Worker             .AllocationCubeCreateFromBitmap = (AllocationCubeCreateFromBitmapFnPtr)dlsym(
115*4d7e907cSAndroid Build Coastguard Worker                     handle, "rsAllocationCubeCreateFromBitmap"),
116*4d7e907cSAndroid Build Coastguard Worker             .AllocationElementData =
117*4d7e907cSAndroid Build Coastguard Worker                     (AllocationElementDataFnPtr)dlsym(handle, "rsAllocationElementData"),
118*4d7e907cSAndroid Build Coastguard Worker             .AllocationElementRead =
119*4d7e907cSAndroid Build Coastguard Worker                     (AllocationElementReadFnPtr)dlsym(handle, "rsAllocationElementRead"),
120*4d7e907cSAndroid Build Coastguard Worker             .AllocationGenerateMipmaps =
121*4d7e907cSAndroid Build Coastguard Worker                     (AllocationGenerateMipmapsFnPtr)dlsym(handle, "rsAllocationGenerateMipmaps"),
122*4d7e907cSAndroid Build Coastguard Worker             .AllocationGetPointer =
123*4d7e907cSAndroid Build Coastguard Worker                     (AllocationGetPointerFnPtr)dlsym(handle, "rsAllocationGetPointer"),
124*4d7e907cSAndroid Build Coastguard Worker             .AllocationGetSurface =
125*4d7e907cSAndroid Build Coastguard Worker                     (AllocationGetSurfaceFnPtr)dlsym(handle, "rsAllocationGetSurface"),
126*4d7e907cSAndroid Build Coastguard Worker             .AllocationGetType = (AllocationGetTypeFnPtr)dlsym(handle, "rsaAllocationGetType"),
127*4d7e907cSAndroid Build Coastguard Worker             .AllocationIoReceive = (AllocationIoReceiveFnPtr)dlsym(handle, "rsAllocationIoReceive"),
128*4d7e907cSAndroid Build Coastguard Worker             .AllocationIoSend = (AllocationIoSendFnPtr)dlsym(handle, "rsAllocationIoSend"),
129*4d7e907cSAndroid Build Coastguard Worker             .AllocationRead = (AllocationReadFnPtr)dlsym(handle, "rsAllocationRead"),
130*4d7e907cSAndroid Build Coastguard Worker             .AllocationResize1D = (AllocationResize1DFnPtr)dlsym(handle, "rsAllocationResize1D"),
131*4d7e907cSAndroid Build Coastguard Worker             .AllocationSetSurface =
132*4d7e907cSAndroid Build Coastguard Worker                     (AllocationSetSurfaceFnPtr)dlsym(handle, "rsAllocationSetSurface"),
133*4d7e907cSAndroid Build Coastguard Worker             .AllocationSyncAll = (AllocationSyncAllFnPtr)dlsym(handle, "rsAllocationSyncAll"),
134*4d7e907cSAndroid Build Coastguard Worker             .AllocationSetupBufferQueue =
135*4d7e907cSAndroid Build Coastguard Worker                     (AllocationSetupBufferQueueFnPtr)dlsym(handle, "rsAllocationSetupBufferQueue"),
136*4d7e907cSAndroid Build Coastguard Worker             .AllocationShareBufferQueue =
137*4d7e907cSAndroid Build Coastguard Worker                     (AllocationShareBufferQueueFnPtr)dlsym(handle, "rsAllocationShareBufferQueue"),
138*4d7e907cSAndroid Build Coastguard Worker             .AssignName = (AssignNameFnPtr)dlsym(handle, "rsAssignName"),
139*4d7e907cSAndroid Build Coastguard Worker             .ClosureCreate = (ClosureCreateFnPtr)dlsym(handle, "rsClosureCreate"),
140*4d7e907cSAndroid Build Coastguard Worker             .ClosureSetArg = (ClosureSetArgFnPtr)dlsym(handle, "rsClosureSetArg"),
141*4d7e907cSAndroid Build Coastguard Worker             .ClosureSetGlobal = (ClosureSetGlobalFnPtr)dlsym(handle, "rsClosureSetGlobal"),
142*4d7e907cSAndroid Build Coastguard Worker             .ContextCreateVendor = (ContextCreateVendorFnPtr)dlsym(handle, "rsContextCreateVendor"),
143*4d7e907cSAndroid Build Coastguard Worker             .ContextDeinitToClient =
144*4d7e907cSAndroid Build Coastguard Worker                     (ContextDeinitToClientFnPtr)dlsym(handle, "rsContextDeinitToClient"),
145*4d7e907cSAndroid Build Coastguard Worker             .ContextDestroy = (ContextDestroyFnPtr)dlsym(handle, "rsContextDestroy"),
146*4d7e907cSAndroid Build Coastguard Worker             .ContextDump = (ContextDumpFnPtr)dlsym(handle, "rsContextDump"),
147*4d7e907cSAndroid Build Coastguard Worker             .ContextFinish = (ContextFinishFnPtr)dlsym(handle, "rsContextFinish"),
148*4d7e907cSAndroid Build Coastguard Worker             .ContextGetMessage = (ContextGetMessageFnPtr)dlsym(handle, "rsContextGetMessage"),
149*4d7e907cSAndroid Build Coastguard Worker             .ContextInitToClient = (ContextInitToClientFnPtr)dlsym(handle, "rsContextInitToClient"),
150*4d7e907cSAndroid Build Coastguard Worker             .ContextPeekMessage = (ContextPeekMessageFnPtr)dlsym(handle, "rsContextPeekMessage"),
151*4d7e907cSAndroid Build Coastguard Worker             .ContextSendMessage = (ContextSendMessageFnPtr)dlsym(handle, "rsContextSendMessage"),
152*4d7e907cSAndroid Build Coastguard Worker             .ContextSetPriority = (ContextSetPriorityFnPtr)dlsym(handle, "rsContextSetPriority"),
153*4d7e907cSAndroid Build Coastguard Worker             .ContextSetCacheDir = (ContextSetCacheDirFnPtr)dlsym(handle, "rsContextSetCacheDir"),
154*4d7e907cSAndroid Build Coastguard Worker             .DeviceCreate = (DeviceCreateFnPtr) nullptr,
155*4d7e907cSAndroid Build Coastguard Worker             .DeviceDestroy = (DeviceDestroyFnPtr) nullptr,
156*4d7e907cSAndroid Build Coastguard Worker             .DeviceSetConfig = (DeviceSetConfigFnPtr) nullptr,
157*4d7e907cSAndroid Build Coastguard Worker             .ElementCreate2 = (ElementCreate2FnPtr)dlsym(handle, "rsElementCreate2"),
158*4d7e907cSAndroid Build Coastguard Worker             .ElementCreate = (ElementCreateFnPtr)dlsym(handle, "rsElementCreate"),
159*4d7e907cSAndroid Build Coastguard Worker             .ElementGetNativeData =
160*4d7e907cSAndroid Build Coastguard Worker                     (ElementGetNativeDataFnPtr)dlsym(handle, "rsaElementGetNativeData"),
161*4d7e907cSAndroid Build Coastguard Worker             .ElementGetSubElements =
162*4d7e907cSAndroid Build Coastguard Worker                     (ElementGetSubElementsFnPtr)dlsym(handle, "rsaElementGetSubElements"),
163*4d7e907cSAndroid Build Coastguard Worker             .GetName = (GetNameFnPtr)dlsym(handle, "rsaGetName"),
164*4d7e907cSAndroid Build Coastguard Worker             .InvokeClosureCreate = (InvokeClosureCreateFnPtr)dlsym(handle, "rsInvokeClosureCreate"),
165*4d7e907cSAndroid Build Coastguard Worker             .ObjDestroy = (ObjDestroyFnPtr)dlsym(handle, "rsObjDestroy"),
166*4d7e907cSAndroid Build Coastguard Worker             .SamplerCreate = (SamplerCreateFnPtr)dlsym(handle, "rsSamplerCreate"),
167*4d7e907cSAndroid Build Coastguard Worker             .ScriptBindAllocation =
168*4d7e907cSAndroid Build Coastguard Worker                     (ScriptBindAllocationFnPtr)dlsym(handle, "rsScriptBindAllocation"),
169*4d7e907cSAndroid Build Coastguard Worker             .ScriptCCreate = (ScriptCCreateFnPtr)dlsym(handle, "rsScriptCCreate"),
170*4d7e907cSAndroid Build Coastguard Worker             .ScriptFieldIDCreate = (ScriptFieldIDCreateFnPtr)dlsym(handle, "rsScriptFieldIDCreate"),
171*4d7e907cSAndroid Build Coastguard Worker             .ScriptForEach = (ScriptForEachFnPtr) nullptr,
172*4d7e907cSAndroid Build Coastguard Worker             .ScriptForEachMulti = (ScriptForEachMultiFnPtr)dlsym(handle, "rsScriptForEachMulti"),
173*4d7e907cSAndroid Build Coastguard Worker             .ScriptGetVarV = (ScriptGetVarVFnPtr)dlsym(handle, "rsScriptGetVarV"),
174*4d7e907cSAndroid Build Coastguard Worker             .ScriptGroup2Create = (ScriptGroup2CreateFnPtr)dlsym(handle, "rsScriptGroup2Create"),
175*4d7e907cSAndroid Build Coastguard Worker             .ScriptGroupCreate = (ScriptGroupCreateFnPtr)dlsym(handle, "rsScriptGroupCreate"),
176*4d7e907cSAndroid Build Coastguard Worker             .ScriptGroupExecute = (ScriptGroupExecuteFnPtr)dlsym(handle, "rsScriptGroupExecute"),
177*4d7e907cSAndroid Build Coastguard Worker             .ScriptGroupSetInput = (ScriptGroupSetInputFnPtr)dlsym(handle, "rsScriptGroupSetInput"),
178*4d7e907cSAndroid Build Coastguard Worker             .ScriptGroupSetOutput =
179*4d7e907cSAndroid Build Coastguard Worker                     (ScriptGroupSetOutputFnPtr)dlsym(handle, "rsScriptGroupSetOutput"),
180*4d7e907cSAndroid Build Coastguard Worker             .ScriptIntrinsicCreate =
181*4d7e907cSAndroid Build Coastguard Worker                     (ScriptIntrinsicCreateFnPtr)dlsym(handle, "rsScriptIntrinsicCreate"),
182*4d7e907cSAndroid Build Coastguard Worker             .ScriptInvoke = (ScriptInvokeFnPtr)dlsym(handle, "rsScriptInvoke"),
183*4d7e907cSAndroid Build Coastguard Worker             .ScriptInvokeIDCreate =
184*4d7e907cSAndroid Build Coastguard Worker                     (ScriptInvokeIDCreateFnPtr)dlsym(handle, "rsScriptInvokeIDCreate"),
185*4d7e907cSAndroid Build Coastguard Worker             .ScriptInvokeV = (ScriptInvokeVFnPtr)dlsym(handle, "rsScriptInvokeV"),
186*4d7e907cSAndroid Build Coastguard Worker             .ScriptKernelIDCreate =
187*4d7e907cSAndroid Build Coastguard Worker                     (ScriptKernelIDCreateFnPtr)dlsym(handle, "rsScriptKernelIDCreate"),
188*4d7e907cSAndroid Build Coastguard Worker             .ScriptReduce = (ScriptReduceFnPtr)dlsym(handle, "rsScriptReduce"),
189*4d7e907cSAndroid Build Coastguard Worker             .ScriptSetTimeZone = (ScriptSetTimeZoneFnPtr)dlsym(handle, "rsScriptSetTimeZone"),
190*4d7e907cSAndroid Build Coastguard Worker             .ScriptSetVarD = (ScriptSetVarDFnPtr)dlsym(handle, "rsScriptSetVarD"),
191*4d7e907cSAndroid Build Coastguard Worker             .ScriptSetVarF = (ScriptSetVarFFnPtr)dlsym(handle, "rsScriptSetVarF"),
192*4d7e907cSAndroid Build Coastguard Worker             .ScriptSetVarI = (ScriptSetVarIFnPtr)dlsym(handle, "rsScriptSetVarI"),
193*4d7e907cSAndroid Build Coastguard Worker             .ScriptSetVarJ = (ScriptSetVarJFnPtr)dlsym(handle, "rsScriptSetVarJ"),
194*4d7e907cSAndroid Build Coastguard Worker             .ScriptSetVarObj = (ScriptSetVarObjFnPtr)dlsym(handle, "rsScriptSetVarObj"),
195*4d7e907cSAndroid Build Coastguard Worker             .ScriptSetVarVE = (ScriptSetVarVEFnPtr)dlsym(handle, "rsScriptSetVarVE"),
196*4d7e907cSAndroid Build Coastguard Worker             .ScriptSetVarV = (ScriptSetVarVFnPtr)dlsym(handle, "rsScriptSetVarV"),
197*4d7e907cSAndroid Build Coastguard Worker             .TypeCreate = (TypeCreateFnPtr)dlsym(handle, "rsTypeCreate"),
198*4d7e907cSAndroid Build Coastguard Worker             .TypeGetNativeData = (TypeGetNativeDataFnPtr)dlsym(handle, "rsaTypeGetNativeData"),
199*4d7e907cSAndroid Build Coastguard Worker     };
200*4d7e907cSAndroid Build Coastguard Worker 
201*4d7e907cSAndroid Build Coastguard Worker     return dispatchHal;
202*4d7e907cSAndroid Build Coastguard Worker }
203*4d7e907cSAndroid Build Coastguard Worker 
204*4d7e907cSAndroid Build Coastguard Worker }  // namespace implementation
205*4d7e907cSAndroid Build Coastguard Worker }  // namespace V1_0
206*4d7e907cSAndroid Build Coastguard Worker }  // namespace renderscript
207*4d7e907cSAndroid Build Coastguard Worker }  // namespace hardware
208*4d7e907cSAndroid Build Coastguard Worker }  // namespace android
209