blob: 9a6d7ba9a47dd5fd9a2b0f741b00ca27a89b09a1 [file] [log] [blame]
/*
* Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "Context.h"
#include "Device.h"
#include <android-base/logging.h>
#include <android/dlext.h>
#include <dlfcn.h>
namespace android {
namespace hardware {
namespace renderscript {
namespace V1_0 {
namespace implementation {
static dispatchTable loadHAL();
dispatchTable Device::mDispatchHal = loadHAL();
Device::Device() {
}
dispatchTable& Device::getHal() {
return mDispatchHal;
}
// Methods from ::android::hardware::renderscript::V1_0::IDevice follow.
Return<sp<IContext>> Device::contextCreate(uint32_t sdkVersion, ContextType ct, int32_t flags) {
return new Context(sdkVersion, ct, flags);
}
// Methods from ::android::hidl::base::V1_0::IBase follow.
IDevice* HIDL_FETCH_IDevice(const char* /* name */) {
return new Device();
}
// Helper function
dispatchTable loadHAL() {
static_assert(sizeof(void*) <= sizeof(uint64_t), "RenderScript HIDL Error: sizeof(void*) > sizeof(uint64_t)");
static_assert(sizeof(size_t) <= sizeof(uint64_t), "RenderScript HIDL Error: sizeof(size_t) > sizeof(uint64_t)");
const char* filename = "libRS_internal.so";
// Try to load libRS_internal.so from the "rs" namespace directly.
typedef struct android_namespace_t* (*GetExportedNamespaceFnPtr)(const char*);
GetExportedNamespaceFnPtr getExportedNamespace = reinterpret_cast<GetExportedNamespaceFnPtr>(
dlsym(RTLD_DEFAULT, "android_get_exported_namespace"));
void* handle = nullptr;
if (getExportedNamespace != nullptr) {
android_namespace_t* rsNamespace = getExportedNamespace("rs");
if (rsNamespace != nullptr) {
const android_dlextinfo dlextinfo = {
.flags = ANDROID_DLEXT_USE_NAMESPACE, .library_namespace = rsNamespace,
};
handle = android_dlopen_ext(filename, RTLD_LAZY | RTLD_LOCAL, &dlextinfo);
if (handle == nullptr) {
LOG(WARNING) << "android_dlopen_ext(" << filename << ") failed: " << dlerror();
}
}
}
if (handle == nullptr) {
// if there is no "rs" namespace (in case when this HAL impl is loaded
// into a vendor process), then use the plain dlopen.
handle = dlopen(filename, RTLD_LAZY | RTLD_LOCAL);
if (handle == nullptr) {
LOG(FATAL) << "dlopen(" << filename << ") failed: " << dlerror();
}
}
dispatchTable dispatchHal = {
.SetNativeLibDir = (SetNativeLibDirFnPtr) nullptr,
.Allocation1DData = (Allocation1DDataFnPtr)dlsym(handle, "rsAllocation1DData"),
.Allocation1DElementData = (Allocation1DElementDataFnPtr) nullptr,
.Allocation1DRead = (Allocation1DReadFnPtr)dlsym(handle, "rsAllocation1DRead"),
.Allocation2DData = (Allocation2DDataFnPtr)dlsym(handle, "rsAllocation2DData"),
.Allocation2DRead = (Allocation2DReadFnPtr)dlsym(handle, "rsAllocation2DRead"),
.Allocation3DData = (Allocation3DDataFnPtr)dlsym(handle, "rsAllocation3DData"),
.Allocation3DRead = (Allocation3DReadFnPtr)dlsym(handle, "rsAllocation3DRead"),
.AllocationAdapterCreate =
(AllocationAdapterCreateFnPtr)dlsym(handle, "rsAllocationAdapterCreate"),
.AllocationAdapterOffset =
(AllocationAdapterOffsetFnPtr)dlsym(handle, "rsAllocationAdapterOffset"),
.AllocationCopy2DRange =
(AllocationCopy2DRangeFnPtr)dlsym(handle, "rsAllocationCopy2DRange"),
.AllocationCopy3DRange =
(AllocationCopy3DRangeFnPtr)dlsym(handle, "rsAllocationCopy3DRange"),
.AllocationCopyToBitmap =
(AllocationCopyToBitmapFnPtr)dlsym(handle, "rsAllocationCopyToBitmap"),
.AllocationCreateFromBitmap =
(AllocationCreateFromBitmapFnPtr)dlsym(handle, "rsAllocationCreateFromBitmap"),
.AllocationCreateStrided =
(AllocationCreateStridedFnPtr)dlsym(handle, "rsAllocationCreateStrided"),
.AllocationCreateTyped =
(AllocationCreateTypedFnPtr)dlsym(handle, "rsAllocationCreateTyped"),
.AllocationCubeCreateFromBitmap = (AllocationCubeCreateFromBitmapFnPtr)dlsym(
handle, "rsAllocationCubeCreateFromBitmap"),
.AllocationElementData =
(AllocationElementDataFnPtr)dlsym(handle, "rsAllocationElementData"),
.AllocationElementRead =
(AllocationElementReadFnPtr)dlsym(handle, "rsAllocationElementRead"),
.AllocationGenerateMipmaps =
(AllocationGenerateMipmapsFnPtr)dlsym(handle, "rsAllocationGenerateMipmaps"),
.AllocationGetPointer =
(AllocationGetPointerFnPtr)dlsym(handle, "rsAllocationGetPointer"),
.AllocationGetSurface =
(AllocationGetSurfaceFnPtr)dlsym(handle, "rsAllocationGetSurface"),
.AllocationGetType = (AllocationGetTypeFnPtr)dlsym(handle, "rsaAllocationGetType"),
.AllocationIoReceive = (AllocationIoReceiveFnPtr)dlsym(handle, "rsAllocationIoReceive"),
.AllocationIoSend = (AllocationIoSendFnPtr)dlsym(handle, "rsAllocationIoSend"),
.AllocationRead = (AllocationReadFnPtr)dlsym(handle, "rsAllocationRead"),
.AllocationResize1D = (AllocationResize1DFnPtr)dlsym(handle, "rsAllocationResize1D"),
.AllocationSetSurface =
(AllocationSetSurfaceFnPtr)dlsym(handle, "rsAllocationSetSurface"),
.AllocationSyncAll = (AllocationSyncAllFnPtr)dlsym(handle, "rsAllocationSyncAll"),
.AllocationSetupBufferQueue =
(AllocationSetupBufferQueueFnPtr)dlsym(handle, "rsAllocationSetupBufferQueue"),
.AllocationShareBufferQueue =
(AllocationShareBufferQueueFnPtr)dlsym(handle, "rsAllocationShareBufferQueue"),
.AssignName = (AssignNameFnPtr)dlsym(handle, "rsAssignName"),
.ClosureCreate = (ClosureCreateFnPtr)dlsym(handle, "rsClosureCreate"),
.ClosureSetArg = (ClosureSetArgFnPtr)dlsym(handle, "rsClosureSetArg"),
.ClosureSetGlobal = (ClosureSetGlobalFnPtr)dlsym(handle, "rsClosureSetGlobal"),
.ContextCreateVendor = (ContextCreateVendorFnPtr)dlsym(handle, "rsContextCreateVendor"),
.ContextDeinitToClient =
(ContextDeinitToClientFnPtr)dlsym(handle, "rsContextDeinitToClient"),
.ContextDestroy = (ContextDestroyFnPtr)dlsym(handle, "rsContextDestroy"),
.ContextDump = (ContextDumpFnPtr)dlsym(handle, "rsContextDump"),
.ContextFinish = (ContextFinishFnPtr)dlsym(handle, "rsContextFinish"),
.ContextGetMessage = (ContextGetMessageFnPtr)dlsym(handle, "rsContextGetMessage"),
.ContextInitToClient = (ContextInitToClientFnPtr)dlsym(handle, "rsContextInitToClient"),
.ContextPeekMessage = (ContextPeekMessageFnPtr)dlsym(handle, "rsContextPeekMessage"),
.ContextSendMessage = (ContextSendMessageFnPtr)dlsym(handle, "rsContextSendMessage"),
.ContextSetPriority = (ContextSetPriorityFnPtr)dlsym(handle, "rsContextSetPriority"),
.ContextSetCacheDir = (ContextSetCacheDirFnPtr)dlsym(handle, "rsContextSetCacheDir"),
.DeviceCreate = (DeviceCreateFnPtr) nullptr,
.DeviceDestroy = (DeviceDestroyFnPtr) nullptr,
.DeviceSetConfig = (DeviceSetConfigFnPtr) nullptr,
.ElementCreate2 = (ElementCreate2FnPtr)dlsym(handle, "rsElementCreate2"),
.ElementCreate = (ElementCreateFnPtr)dlsym(handle, "rsElementCreate"),
.ElementGetNativeData =
(ElementGetNativeDataFnPtr)dlsym(handle, "rsaElementGetNativeData"),
.ElementGetSubElements =
(ElementGetSubElementsFnPtr)dlsym(handle, "rsaElementGetSubElements"),
.GetName = (GetNameFnPtr)dlsym(handle, "rsaGetName"),
.InvokeClosureCreate = (InvokeClosureCreateFnPtr)dlsym(handle, "rsInvokeClosureCreate"),
.ObjDestroy = (ObjDestroyFnPtr)dlsym(handle, "rsObjDestroy"),
.SamplerCreate = (SamplerCreateFnPtr)dlsym(handle, "rsSamplerCreate"),
.ScriptBindAllocation =
(ScriptBindAllocationFnPtr)dlsym(handle, "rsScriptBindAllocation"),
.ScriptCCreate = (ScriptCCreateFnPtr)dlsym(handle, "rsScriptCCreate"),
.ScriptFieldIDCreate = (ScriptFieldIDCreateFnPtr)dlsym(handle, "rsScriptFieldIDCreate"),
.ScriptForEach = (ScriptForEachFnPtr) nullptr,
.ScriptForEachMulti = (ScriptForEachMultiFnPtr)dlsym(handle, "rsScriptForEachMulti"),
.ScriptGetVarV = (ScriptGetVarVFnPtr)dlsym(handle, "rsScriptGetVarV"),
.ScriptGroup2Create = (ScriptGroup2CreateFnPtr)dlsym(handle, "rsScriptGroup2Create"),
.ScriptGroupCreate = (ScriptGroupCreateFnPtr)dlsym(handle, "rsScriptGroupCreate"),
.ScriptGroupExecute = (ScriptGroupExecuteFnPtr)dlsym(handle, "rsScriptGroupExecute"),
.ScriptGroupSetInput = (ScriptGroupSetInputFnPtr)dlsym(handle, "rsScriptGroupSetInput"),
.ScriptGroupSetOutput =
(ScriptGroupSetOutputFnPtr)dlsym(handle, "rsScriptGroupSetOutput"),
.ScriptIntrinsicCreate =
(ScriptIntrinsicCreateFnPtr)dlsym(handle, "rsScriptIntrinsicCreate"),
.ScriptInvoke = (ScriptInvokeFnPtr)dlsym(handle, "rsScriptInvoke"),
.ScriptInvokeIDCreate =
(ScriptInvokeIDCreateFnPtr)dlsym(handle, "rsScriptInvokeIDCreate"),
.ScriptInvokeV = (ScriptInvokeVFnPtr)dlsym(handle, "rsScriptInvokeV"),
.ScriptKernelIDCreate =
(ScriptKernelIDCreateFnPtr)dlsym(handle, "rsScriptKernelIDCreate"),
.ScriptReduce = (ScriptReduceFnPtr)dlsym(handle, "rsScriptReduce"),
.ScriptSetTimeZone = (ScriptSetTimeZoneFnPtr)dlsym(handle, "rsScriptSetTimeZone"),
.ScriptSetVarD = (ScriptSetVarDFnPtr)dlsym(handle, "rsScriptSetVarD"),
.ScriptSetVarF = (ScriptSetVarFFnPtr)dlsym(handle, "rsScriptSetVarF"),
.ScriptSetVarI = (ScriptSetVarIFnPtr)dlsym(handle, "rsScriptSetVarI"),
.ScriptSetVarJ = (ScriptSetVarJFnPtr)dlsym(handle, "rsScriptSetVarJ"),
.ScriptSetVarObj = (ScriptSetVarObjFnPtr)dlsym(handle, "rsScriptSetVarObj"),
.ScriptSetVarVE = (ScriptSetVarVEFnPtr)dlsym(handle, "rsScriptSetVarVE"),
.ScriptSetVarV = (ScriptSetVarVFnPtr)dlsym(handle, "rsScriptSetVarV"),
.TypeCreate = (TypeCreateFnPtr)dlsym(handle, "rsTypeCreate"),
.TypeGetNativeData = (TypeGetNativeDataFnPtr)dlsym(handle, "rsaTypeGetNativeData"),
};
return dispatchHal;
}
} // namespace implementation
} // namespace V1_0
} // namespace renderscript
} // namespace hardware
} // namespace android