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