rsDispatch.cpp revision ae2ec3febedfc29376b9104413fb4042028f1265
16ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets/*
26ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets * Copyright (C) 2011-2012 The Android Open Source Project
36ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets *
46ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets * Licensed under the Apache License, Version 2.0 (the "License");
56ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets * you may not use this file except in compliance with the License.
66ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets * You may obtain a copy of the License at
76ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets *
86ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets *      http://www.apache.org/licenses/LICENSE-2.0
96ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets *
106ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets * Unless required by applicable law or agreed to in writing, software
116ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets * distributed under the License is distributed on an "AS IS" BASIS,
126ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets * See the License for the specific language governing permissions and
146ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets * limitations under the License.
156ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets */
166ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets#define LOG_TAG "libDispatch"
176ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets#include <android/log.h>
186ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets
196ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets#include "rsDispatch.h"
206ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets#include <dlfcn.h>
216ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets#include <limits.h>
226ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets
236ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets#define LOG_ERR(...) __android_log_print(ANDROID_LOG_ERROR, "RS Dispatch", __VA_ARGS__);
246ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets#define REDUCE_API_LEVEL 24
256ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets
266ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinetsbool loadSymbols(void* handle, dispatchTable& dispatchTab, int targetApiLevel) {
276ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets#ifdef __LP64__
286ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    // Function to set the native lib path for 64bit compat lib.
296ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.SetNativeLibDir = (SetNativeLibDirFnPtr)dlsym(handle, "rsaContextSetNativeLibDir");
306ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    if (dispatchTab.SetNativeLibDir == nullptr) {
316ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets        LOG_ERR("Couldn't initialize dispatchTab.SetNativeLibDir");
326ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets        return false;
336ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    }
346ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets#endif
356ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets
366ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.Allocation1DData = (Allocation1DDataFnPtr)dlsym(handle, "rsAllocation1DData");
376ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.Allocation1DElementData = (Allocation1DElementDataFnPtr)dlsym(handle, "rsAllocation1DElementData");
386ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.Allocation1DRead = (Allocation1DReadFnPtr)dlsym(handle, "rsAllocation1DRead");
396ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.Allocation2DData = (Allocation2DDataFnPtr)dlsym(handle, "rsAllocation2DData");
406ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.Allocation2DRead = (Allocation2DReadFnPtr)dlsym(handle, "rsAllocation2DRead");
416ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.Allocation3DData = (Allocation3DDataFnPtr)dlsym(handle, "rsAllocation3DData");
426ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.Allocation3DRead = (Allocation3DReadFnPtr)dlsym(handle, "rsAllocation3DRead");
436ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.AllocationCopy2DRange = (AllocationCopy2DRangeFnPtr)dlsym(handle, "rsAllocationCopy2DRange");
446ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.AllocationCopy3DRange = (AllocationCopy3DRangeFnPtr)dlsym(handle, "rsAllocationCopy3DRange");
456ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.AllocationCopyToBitmap = (AllocationCopyToBitmapFnPtr)dlsym(handle, "rsAllocationCopyToBitmap");
466ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.AllocationCreateFromBitmap = (AllocationCreateFromBitmapFnPtr)dlsym(handle, "rsAllocationCreateFromBitmap");
476ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.AllocationCreateTyped = (AllocationCreateTypedFnPtr)dlsym(handle, "rsAllocationCreateTyped");
486ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.AllocationCubeCreateFromBitmap = (AllocationCubeCreateFromBitmapFnPtr)dlsym(handle, "rsAllocationCubeCreateFromBitmap");
496ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.AllocationElementData = (AllocationElementDataFnPtr)dlsym(handle, "rsAllocationElementData");
506ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.AllocationElementRead = (AllocationElementReadFnPtr)dlsym(handle, "rsAllocationElementRead");
516ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.AllocationGenerateMipmaps = (AllocationGenerateMipmapsFnPtr)dlsym(handle, "rsAllocationGenerateMipmaps");
526ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.AllocationGetPointer = (AllocationGetPointerFnPtr)dlsym(handle, "rsAllocationGetPointer");
536ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.AllocationGetSurface = (AllocationGetSurfaceFnPtr)dlsym(handle, "rsAllocationGetSurface");
546ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.AllocationGetType = (AllocationGetTypeFnPtr)dlsym(handle, "rsaAllocationGetType");
556ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.AllocationIoReceive = (AllocationIoReceiveFnPtr)dlsym(handle, "rsAllocationIoReceive");
566ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.AllocationIoSend = (AllocationIoSendFnPtr)dlsym(handle, "rsAllocationIoSend");
576ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.AllocationRead = (AllocationReadFnPtr)dlsym(handle, "rsAllocationRead");
586ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.AllocationResize1D = (AllocationResize1DFnPtr)dlsym(handle, "rsAllocationResize1D");
596ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.AllocationSetSurface = (AllocationSetSurfaceFnPtr)dlsym(handle, "rsAllocationSetSurface");
606ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.AllocationSyncAll = (AllocationSyncAllFnPtr)dlsym(handle, "rsAllocationSyncAll");
616ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.AssignName = (AssignNameFnPtr)dlsym(handle, "rsAssignName");
626ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.ClosureCreate = (ClosureCreateFnPtr)dlsym(handle, "rsClosureCreate");
636ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.ClosureSetArg = (ClosureSetArgFnPtr)dlsym(handle, "rsClosureSetArg");
646ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.ClosureSetGlobal = (ClosureSetGlobalFnPtr)dlsym(handle, "rsClosureSetGlobal");
656ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.ContextCreate = (ContextCreateFnPtr)dlsym(handle, "rsContextCreate");;
666ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.ContextDeinitToClient = (ContextDeinitToClientFnPtr)dlsym(handle, "rsContextDeinitToClient");
676ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.ContextDestroy = (ContextDestroyFnPtr)dlsym(handle, "rsContextDestroy");
686ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.ContextDump = (ContextDumpFnPtr)dlsym(handle, "rsContextDump");
696ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.ContextFinish = (ContextFinishFnPtr)dlsym(handle, "rsContextFinish");
706ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.ContextGetMessage = (ContextGetMessageFnPtr)dlsym(handle, "rsContextGetMessage");
716ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.ContextInitToClient = (ContextInitToClientFnPtr)dlsym(handle, "rsContextInitToClient");
726ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.ContextPeekMessage = (ContextPeekMessageFnPtr)dlsym(handle, "rsContextPeekMessage");
736ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.ContextSendMessage = (ContextSendMessageFnPtr)dlsym(handle, "rsContextSendMessage");
746ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.ContextSetPriority = (ContextSetPriorityFnPtr)dlsym(handle, "rsContextSetPriority");
756ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.DeviceCreate = (DeviceCreateFnPtr)dlsym(handle, "rsDeviceCreate");
766ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.DeviceDestroy = (DeviceDestroyFnPtr)dlsym(handle, "rsDeviceDestroy");
776ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.DeviceSetConfig = (DeviceSetConfigFnPtr)dlsym(handle, "rsDeviceSetConfig");
786ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.ElementCreate = (ElementCreateFnPtr)dlsym(handle, "rsElementCreate");
796ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.ElementCreate2 = (ElementCreate2FnPtr)dlsym(handle, "rsElementCreate2");
806ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.ElementGetNativeData = (ElementGetNativeDataFnPtr)dlsym(handle, "rsaElementGetNativeData");
816ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.ElementGetSubElements = (ElementGetSubElementsFnPtr)dlsym(handle, "rsaElementGetSubElements");
826ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.GetName = (GetNameFnPtr)dlsym(handle, "rsaGetName");;
836ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.InvokeClosureCreate = (InvokeClosureCreateFnPtr)dlsym(handle, "rsInvokeClosureCreate");
846ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.ObjDestroy = (ObjDestroyFnPtr)dlsym(handle, "rsObjDestroy");
856ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.SamplerCreate = (SamplerCreateFnPtr)dlsym(handle, "rsSamplerCreate");
866ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.ScriptBindAllocation = (ScriptBindAllocationFnPtr)dlsym(handle, "rsScriptBindAllocation");
876ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.ScriptCCreate = (ScriptCCreateFnPtr)dlsym(handle, "rsScriptCCreate");
886ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.ScriptFieldIDCreate = (ScriptFieldIDCreateFnPtr)dlsym(handle, "rsScriptFieldIDCreate");
896ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.ScriptForEach = (ScriptForEachFnPtr)dlsym(handle, "rsScriptForEach");
906ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.ScriptForEachMulti = (ScriptForEachMultiFnPtr)dlsym(handle, "rsScriptForEachMulti");
916ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.ScriptGetVarV = (ScriptGetVarVFnPtr)dlsym(handle, "rsScriptGetVarV");
926ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.ScriptGroup2Create = (ScriptGroup2CreateFnPtr)dlsym(handle, "rsScriptGroup2Create");
936ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.ScriptGroupCreate = (ScriptGroupCreateFnPtr)dlsym(handle, "rsScriptGroupCreate");
946ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.ScriptGroupExecute = (ScriptGroupExecuteFnPtr)dlsym(handle, "rsScriptGroupExecute");
956ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.ScriptGroupSetInput = (ScriptGroupSetInputFnPtr)dlsym(handle, "rsScriptGroupSetInput");
966ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.ScriptGroupSetOutput = (ScriptGroupSetOutputFnPtr)dlsym(handle, "rsScriptGroupSetOutput");
976ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.ScriptIntrinsicCreate = (ScriptIntrinsicCreateFnPtr)dlsym(handle, "rsScriptIntrinsicCreate");
986ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.ScriptInvoke = (ScriptInvokeFnPtr)dlsym(handle, "rsScriptInvoke");
996ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.ScriptInvokeIDCreate = (ScriptInvokeIDCreateFnPtr)dlsym(handle, "rsScriptInvokeIDCreate");
1006ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.ScriptInvokeV = (ScriptInvokeVFnPtr)dlsym(handle, "rsScriptInvokeV");
1016ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.ScriptKernelIDCreate = (ScriptKernelIDCreateFnPtr)dlsym(handle, "rsScriptKernelIDCreate");
1026ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.ScriptReduce = (ScriptReduceFnPtr)dlsym(handle, "rsScriptReduce");
1036ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.ScriptSetTimeZone = (ScriptSetTimeZoneFnPtr)dlsym(handle, "rsScriptSetTimeZone");
1046ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.ScriptSetVarD = (ScriptSetVarDFnPtr)dlsym(handle, "rsScriptSetVarD");
1056ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.ScriptSetVarF = (ScriptSetVarFFnPtr)dlsym(handle, "rsScriptSetVarF");
1066ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.ScriptSetVarI = (ScriptSetVarIFnPtr)dlsym(handle, "rsScriptSetVarI");
1076ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.ScriptSetVarJ = (ScriptSetVarJFnPtr)dlsym(handle, "rsScriptSetVarJ");
1086ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.ScriptSetVarObj = (ScriptSetVarObjFnPtr)dlsym(handle, "rsScriptSetVarObj");
1096ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.ScriptSetVarV = (ScriptSetVarVFnPtr)dlsym(handle, "rsScriptSetVarV");
1106ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.ScriptSetVarVE = (ScriptSetVarVEFnPtr)dlsym(handle, "rsScriptSetVarVE");
1116ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.TypeCreate = (TypeCreateFnPtr)dlsym(handle, "rsTypeCreate");
1126ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dispatchTab.TypeGetNativeData = (TypeGetNativeDataFnPtr)dlsym(handle, "rsaTypeGetNativeData");
1136ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets
1146ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    // Clear error buffer for later operations.
1156ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    dlerror();
1166ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets
1176ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    if (dispatchTab.AllocationGetType == nullptr) {
1186ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets        LOG_ERR("Couldn't initialize dispatchTab.AllocationGetType");
1196ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets        return false;
1206ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    }
1216ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    if (dispatchTab.TypeGetNativeData == nullptr) {
1226ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets        LOG_ERR("Couldn't initialize dispatchTab.TypeGetNativeData");
1236ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets        return false;
1246ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    }
1256ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    if (dispatchTab.ElementGetNativeData == nullptr) {
1266ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets        LOG_ERR("Couldn't initialize dispatchTab.ElementGetNativeData");
1276ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets        return false;
1286ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    }
1296ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    if (dispatchTab.ElementGetSubElements == nullptr) {
1306ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets        LOG_ERR("Couldn't initialize dispatchTab.ElementGetSubElements");
1316ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets        return false;
1326ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    }
1336ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    if (dispatchTab.DeviceCreate == nullptr) {
1346ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets        LOG_ERR("Couldn't initialize dispatchTab.DeviceCreate");
1356ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets        return false;
1366ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    }
1376ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    if (dispatchTab.DeviceDestroy == nullptr) {
1386ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets        LOG_ERR("Couldn't initialize dispatchTab.DeviceDestroy");
1396ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets        return false;
1406ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    }
1416ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    if (dispatchTab.DeviceSetConfig == nullptr) {
1426ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets        LOG_ERR("Couldn't initialize dispatchTab.DeviceSetConfig");
1436ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets        return false;
1446ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    }
1456ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    if (dispatchTab.ContextCreate == nullptr) {
1466ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets        LOG_ERR("Couldn't initialize dispatchTab.ContextCreate");
1476ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets        return false;
1486ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    }
1496ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    if (dispatchTab.GetName == nullptr) {
1506ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets        LOG_ERR("Couldn't initialize dispatchTab.GetName");
1516ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets        return false;
1526ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    }
1536ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    if (dispatchTab.ContextDestroy == nullptr) {
1546ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets        LOG_ERR("Couldn't initialize dispatchTab.ContextDestroy");
1556ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets        return false;
1566ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    }
1576ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    if (dispatchTab.ContextGetMessage == nullptr) {
1586ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets        LOG_ERR("Couldn't initialize dispatchTab.ContextGetMessage");
1596ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets        return false;
1606ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    }
1616ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    if (dispatchTab.ContextPeekMessage == nullptr) {
1626ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets        LOG_ERR("Couldn't initialize dispatchTab.ContextPeekMessage");
1636ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets        return false;
1646ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    }
1656ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    if (dispatchTab.ContextSendMessage == nullptr) {
1666ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets        LOG_ERR("Couldn't initialize dispatchTab.ContextSendMessage");
1676ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets        return false;
1686ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    }
1696ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    if (dispatchTab.ContextInitToClient == nullptr) {
1706ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets        LOG_ERR("Couldn't initialize dispatchTab.ContextInitToClient");
1716ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets        return false;
1726ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    }
1736ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    if (dispatchTab.ContextDeinitToClient == nullptr) {
1746ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets        LOG_ERR("Couldn't initialize dispatchTab.ContextDeinitToClient");
1756ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets        return false;
1766ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    }
1776ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    if (dispatchTab.TypeCreate == nullptr) {
1786ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets        LOG_ERR("Couldn't initialize dispatchTab.TypeCreate");
1796ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets        return false;
1806ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    }
1816ca8525782f16bcb4403dc692a1fefd77934aa31Sergey Vasilinets    if (dispatchTab.AllocationCreateTyped == nullptr) {
182        LOG_ERR("Couldn't initialize dispatchTab.AllocationCreateTyped");
183        return false;
184    }
185    if (dispatchTab.AllocationCreateFromBitmap == nullptr) {
186        LOG_ERR("Couldn't initialize dispatchTab.AllocationCreateFromBitmap");
187        return false;
188    }
189    if (dispatchTab.AllocationCubeCreateFromBitmap == nullptr) {
190        LOG_ERR("Couldn't initialize dispatchTab.AllocationCubeCreateFromBitmap");
191        return false;
192    }
193    if (dispatchTab.AllocationGetSurface == nullptr) {
194        LOG_ERR("Couldn't initialize dispatchTab.AllocationGetSurface");
195        return false;
196    }
197    if (dispatchTab.AllocationSetSurface == nullptr) {
198        LOG_ERR("Couldn't initialize dispatchTab.AllocationSetSurface");
199        return false;
200    }
201    if (dispatchTab.ContextFinish == nullptr) {
202        LOG_ERR("Couldn't initialize dispatchTab.ContextFinish");
203        return false;
204    }
205    if (dispatchTab.ContextDump == nullptr) {
206        LOG_ERR("Couldn't initialize dispatchTab.ContextDump");
207        return false;
208    }
209    if (dispatchTab.ContextSetPriority == nullptr) {
210        LOG_ERR("Couldn't initialize dispatchTab.ContextSetPriority");
211        return false;
212    }
213    if (dispatchTab.AssignName == nullptr) {
214        LOG_ERR("Couldn't initialize dispatchTab.AssignName");
215        return false;
216    }
217    if (dispatchTab.ObjDestroy == nullptr) {
218        LOG_ERR("Couldn't initialize dispatchTab.ObjDestroy");
219        return false;
220    }
221    if (dispatchTab.ElementCreate == nullptr) {
222        LOG_ERR("Couldn't initialize dispatchTab.ElementCreate");
223        return false;
224    }
225    if (dispatchTab.ElementCreate2 == nullptr) {
226        LOG_ERR("Couldn't initialize dispatchTab.ElementCreate2");
227        return false;
228    }
229    if (dispatchTab.AllocationCopyToBitmap == nullptr) {
230        LOG_ERR("Couldn't initialize dispatchTab.AllocationCopyToBitmap");
231        return false;
232    }
233    if (dispatchTab.Allocation1DData == nullptr) {
234        LOG_ERR("Couldn't initialize dispatchTab.Allocation1DData");
235        return false;
236    }
237    if (dispatchTab.Allocation1DElementData == nullptr) {
238        LOG_ERR("Couldn't initialize dispatchTab.Allocation1DElementData");
239        return false;
240    }
241    if (dispatchTab.Allocation2DData == nullptr) {
242        LOG_ERR("Couldn't initialize dispatchTab.Allocation2DData");
243        return false;
244    }
245    if (dispatchTab.Allocation3DData == nullptr) {
246        LOG_ERR("Couldn't initialize dispatchTab.Allocation3DData");
247        return false;
248    }
249    if (dispatchTab.AllocationGenerateMipmaps == nullptr) {
250        LOG_ERR("Couldn't initialize dispatchTab.AllocationGenerateMipmaps");
251        return false;
252    }
253    if (dispatchTab.AllocationRead == nullptr) {
254        LOG_ERR("Couldn't initialize dispatchTab.AllocationRead");
255        return false;
256    }
257    if (dispatchTab.Allocation1DRead == nullptr) {
258        LOG_ERR("Couldn't initialize dispatchTab.Allocation1DRead");
259        return false;
260    }
261    if (dispatchTab.Allocation2DRead == nullptr) {
262        LOG_ERR("Couldn't initialize dispatchTab.Allocation2DRead");
263        return false;
264    }
265    if (dispatchTab.AllocationSyncAll == nullptr) {
266        LOG_ERR("Couldn't initialize dispatchTab.AllocationSyncAll");
267        return false;
268    }
269    if (dispatchTab.AllocationResize1D == nullptr) {
270        LOG_ERR("Couldn't initialize dispatchTab.AllocationResize1D");
271        return false;
272    }
273    if (dispatchTab.AllocationCopy2DRange == nullptr) {
274        LOG_ERR("Couldn't initialize dispatchTab.AllocationCopy2DRange");
275        return false;
276    }
277    if (dispatchTab.AllocationCopy3DRange == nullptr) {
278        LOG_ERR("Couldn't initialize dispatchTab.AllocationCopy3DRange");
279        return false;
280    }
281    if (dispatchTab.SamplerCreate == nullptr) {
282        LOG_ERR("Couldn't initialize dispatchTab.SamplerCreate");
283        return false;
284    }
285    if (dispatchTab.ScriptBindAllocation == nullptr) {
286        LOG_ERR("Couldn't initialize dispatchTab.ScriptBindAllocation");
287        return false;
288    }
289    if (dispatchTab.ScriptSetTimeZone == nullptr) {
290        LOG_ERR("Couldn't initialize dispatchTab.ScriptSetTimeZone");
291        return false;
292    }
293    if (dispatchTab.ScriptInvoke == nullptr) {
294        LOG_ERR("Couldn't initialize dispatchTab.ScriptInvoke");
295        return false;
296    }
297    if (dispatchTab.ScriptInvokeV == nullptr) {
298        LOG_ERR("Couldn't initialize dispatchTab.ScriptInvokeV");
299        return false;
300    }
301    if (dispatchTab.ScriptForEach == nullptr) {
302        LOG_ERR("Couldn't initialize dispatchTab.ScriptForEach");
303        return false;
304    }
305    if (dispatchTab.ScriptSetVarI == nullptr) {
306        LOG_ERR("Couldn't initialize dispatchTab.ScriptSetVarI");
307        return false;
308    }
309    if (dispatchTab.ScriptSetVarObj == nullptr) {
310        LOG_ERR("Couldn't initialize dispatchTab.ScriptSetVarObj");
311        return false;
312    }
313    if (dispatchTab.ScriptSetVarJ == nullptr) {
314        LOG_ERR("Couldn't initialize dispatchTab.ScriptSetVarJ");
315        return false;
316    }
317    if (dispatchTab.ScriptSetVarF == nullptr) {
318        LOG_ERR("Couldn't initialize dispatchTab.ScriptSetVarF");
319        return false;
320    }
321    if (dispatchTab.ScriptSetVarD == nullptr) {
322        LOG_ERR("Couldn't initialize dispatchTab.ScriptSetVarD");
323        return false;
324    }
325    if (dispatchTab.ScriptSetVarV == nullptr) {
326        LOG_ERR("Couldn't initialize dispatchTab.ScriptSetVarV");
327        return false;
328    }
329    if (dispatchTab.ScriptGetVarV == nullptr) {
330        LOG_ERR("Couldn't initialize dispatchTab.ScriptGetVarV");
331        return false;
332    }
333    if (dispatchTab.ScriptSetVarVE == nullptr) {
334        LOG_ERR("Couldn't initialize dispatchTab.ScriptSetVarVE");
335        return false;
336    }
337    if (dispatchTab.ScriptCCreate == nullptr) {
338        LOG_ERR("Couldn't initialize dispatchTab.ScriptCCreate");
339        return false;
340    }
341    if (dispatchTab.ScriptIntrinsicCreate == nullptr) {
342        LOG_ERR("Couldn't initialize dispatchTab.ScriptIntrinsicCreate");
343        return false;
344    }
345    if (dispatchTab.ScriptKernelIDCreate == nullptr) {
346        LOG_ERR("Couldn't initialize dispatchTab.ScriptKernelIDCreate");
347        return false;
348    }
349    if (dispatchTab.ScriptFieldIDCreate == nullptr) {
350        LOG_ERR("Couldn't initialize dispatchTab.ScriptFieldIDCreate");
351        return false;
352    }
353    if (dispatchTab.ScriptGroupCreate == nullptr) {
354        LOG_ERR("Couldn't initialize dispatchTab.ScriptGroupCreate");
355        return false;
356    }
357    if (dispatchTab.ScriptGroupSetOutput == nullptr) {
358        LOG_ERR("Couldn't initialize dispatchTab.ScriptGroupSetOutput");
359        return false;
360    }
361    if (dispatchTab.ScriptGroupSetInput == nullptr) {
362        LOG_ERR("Couldn't initialize dispatchTab.ScriptGroupSetInput");
363        return false;
364    }
365    if (dispatchTab.ScriptGroupExecute == nullptr) {
366        LOG_ERR("Couldn't initialize dispatchTab.ScriptGroupExecute");
367        return false;
368    }
369    if (dispatchTab.AllocationIoSend == nullptr) {
370        LOG_ERR("Couldn't initialize dispatchTab.AllocationIoSend");
371        return false;
372    }
373    if (dispatchTab.AllocationIoReceive == nullptr) {
374        LOG_ERR("Couldn't initialize dispatchTab.AllocationIoReceive");
375        return false;
376    }
377    // API_21 functions
378    if (targetApiLevel >= 21) {
379        if (dispatchTab.AllocationGetPointer == nullptr) {
380            LOG_ERR("Couldn't initialize dispatchTab.AllocationGetPointer");
381            return false;
382        }
383    }
384    // API_23 functions
385    if (targetApiLevel >= 23) {
386        // ScriptGroup V2 functions
387        if (dispatchTab.ScriptInvokeIDCreate == nullptr) {
388            LOG_ERR("Couldn't initialize dispatchTab.ScriptInvokeIDCreate");
389            return false;
390        }
391        if (dispatchTab.ClosureCreate == nullptr) {
392            LOG_ERR("Couldn't initialize dispatchTab.ClosureCreate");
393            return false;
394        }
395        if (dispatchTab.InvokeClosureCreate == nullptr) {
396            LOG_ERR("Couldn't initialize dispatchTab.InvokeClosureCreate");
397            return false;
398        }
399        if (dispatchTab.ClosureSetArg == nullptr) {
400            LOG_ERR("Couldn't initialize dispatchTab.ClosureSetArg");
401            return false;
402        }
403        if (dispatchTab.ClosureSetGlobal == nullptr) {
404            LOG_ERR("Couldn't initialize dispatchTab.ClosureSetGlobal");
405            return false;
406        }
407        if (dispatchTab.ScriptGroup2Create == nullptr) {
408            LOG_ERR("Couldn't initialize dispatchTab.ScriptGroup2Create");
409            return false;
410        }
411        if (dispatchTab.AllocationElementData == nullptr) {
412            LOG_ERR("Couldn't initialize dispatchTab.AllocationElementData");
413            return false;
414        }
415        if (dispatchTab.AllocationElementRead == nullptr) {
416            LOG_ERR("Couldn't initialize dispatchTab.AllocationElementRead");
417            return false;
418        }
419        if (dispatchTab.Allocation3DRead == nullptr) {
420            LOG_ERR("Couldn't initialize dispatchTab.Allocation3DRead");
421            return false;
422        }
423        if (dispatchTab.ScriptForEachMulti == nullptr) {
424            LOG_ERR("Couldn't initialize dispatchTab.ScriptForEachMulti");
425            return false;
426        }
427    }
428
429    if (targetApiLevel >= REDUCE_API_LEVEL) {
430        if (dispatchTab.ScriptReduce == nullptr) {
431            LOG_ERR("Couldn't initialize dispatchTab.ScriptReduce");
432            return false;
433        }
434    }
435
436    return true;
437
438}
439
440
441bool loadIOSuppSyms(void* handleIO, ioSuppDT& ioDispatch){
442    ioDispatch.sAllocationSetSurface = (sAllocationSetSurfaceFnPtr)dlsym(handleIO, "AllocationSetSurface");
443    if (ioDispatch.sAllocationSetSurface == nullptr) {
444        LOG_ERR("Couldn't initialize ioDispatch.sAllocationSetSurface");
445        return false;
446    }
447    return true;
448}
449