rsDispatch.cpp revision 5abfd9b62b3173a371c42fc92ca8cf978420d694
1/*
2 * Copyright (C) 2011-2012 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#define LOG_TAG "libDispatch"
17#include <android/log.h>
18
19#include "rsDispatch.h"
20#include <dlfcn.h>
21#include <limits.h>
22
23#define LOG_ERR(...) __android_log_print(ANDROID_LOG_ERROR, "RS Dispatch", __VA_ARGS__);
24#define REDUCE_API_LEVEL INT_MAX
25
26bool loadSymbols(void* handle, dispatchTable& dispatchTab, int targetApiLevel) {
27#ifdef __LP64__
28    // Function to set the native lib path for 64bit compat lib.
29    dispatchTab.SetNativeLibDir = (SetNativeLibDirFnPtr)dlsym(handle, "rsaContextSetNativeLibDir");
30    if (dispatchTab.SetNativeLibDir == nullptr) {
31        LOG_ERR("Couldn't initialize dispatchTab.SetNativeLibDir");
32        return false;
33    }
34#endif
35
36    dispatchTab.Allocation1DData = (Allocation1DDataFnPtr)dlsym(handle, "rsAllocation1DData");
37    dispatchTab.Allocation1DElementData = (Allocation1DElementDataFnPtr)dlsym(handle, "rsAllocation1DElementData");
38    dispatchTab.Allocation1DRead = (Allocation1DReadFnPtr)dlsym(handle, "rsAllocation1DRead");
39    dispatchTab.Allocation2DData = (Allocation2DDataFnPtr)dlsym(handle, "rsAllocation2DData");
40    dispatchTab.Allocation2DRead = (Allocation2DReadFnPtr)dlsym(handle, "rsAllocation2DRead");
41    dispatchTab.Allocation3DData = (Allocation3DDataFnPtr)dlsym(handle, "rsAllocation3DData");
42    dispatchTab.Allocation3DRead = (Allocation3DReadFnPtr)dlsym(handle, "rsAllocation3DRead");
43    dispatchTab.AllocationCopy2DRange = (AllocationCopy2DRangeFnPtr)dlsym(handle, "rsAllocationCopy2DRange");
44    dispatchTab.AllocationCopy3DRange = (AllocationCopy3DRangeFnPtr)dlsym(handle, "rsAllocationCopy3DRange");
45    dispatchTab.AllocationCopyToBitmap = (AllocationCopyToBitmapFnPtr)dlsym(handle, "rsAllocationCopyToBitmap");
46    dispatchTab.AllocationCreateFromBitmap = (AllocationCreateFromBitmapFnPtr)dlsym(handle, "rsAllocationCreateFromBitmap");
47    dispatchTab.AllocationCreateTyped = (AllocationCreateTypedFnPtr)dlsym(handle, "rsAllocationCreateTyped");
48    dispatchTab.AllocationCubeCreateFromBitmap = (AllocationCubeCreateFromBitmapFnPtr)dlsym(handle, "rsAllocationCubeCreateFromBitmap");
49    dispatchTab.AllocationElementData = (AllocationElementDataFnPtr)dlsym(handle, "rsAllocationElementData");
50    dispatchTab.AllocationElementRead = (AllocationElementReadFnPtr)dlsym(handle, "rsAllocationElementRead");
51    dispatchTab.AllocationGenerateMipmaps = (AllocationGenerateMipmapsFnPtr)dlsym(handle, "rsAllocationGenerateMipmaps");
52    dispatchTab.AllocationGetPointer = (AllocationGetPointerFnPtr)dlsym(handle, "rsAllocationGetPointer");
53    dispatchTab.AllocationGetSurface = (AllocationGetSurfaceFnPtr)dlsym(handle, "rsAllocationGetSurface");
54    dispatchTab.AllocationGetType = (AllocationGetTypeFnPtr)dlsym(handle, "rsaAllocationGetType");
55    dispatchTab.AllocationIoReceive = (AllocationIoReceiveFnPtr)dlsym(handle, "rsAllocationIoReceive");
56    dispatchTab.AllocationIoSend = (AllocationIoSendFnPtr)dlsym(handle, "rsAllocationIoSend");
57    dispatchTab.AllocationRead = (AllocationReadFnPtr)dlsym(handle, "rsAllocationRead");
58    dispatchTab.AllocationResize1D = (AllocationResize1DFnPtr)dlsym(handle, "rsAllocationResize1D");
59    dispatchTab.AllocationSetSurface = (AllocationSetSurfaceFnPtr)dlsym(handle, "rsAllocationSetSurface");
60    dispatchTab.AllocationSyncAll = (AllocationSyncAllFnPtr)dlsym(handle, "rsAllocationSyncAll");
61    dispatchTab.AssignName = (AssignNameFnPtr)dlsym(handle, "rsAssignName");
62    dispatchTab.ClosureCreate = (ClosureCreateFnPtr)dlsym(handle, "rsClosureCreate");
63    dispatchTab.ClosureSetArg = (ClosureSetArgFnPtr)dlsym(handle, "rsClosureSetArg");
64    dispatchTab.ClosureSetGlobal = (ClosureSetGlobalFnPtr)dlsym(handle, "rsClosureSetGlobal");
65    dispatchTab.ContextCreate = (ContextCreateFnPtr)dlsym(handle, "rsContextCreate");;
66    dispatchTab.ContextDeinitToClient = (ContextDeinitToClientFnPtr)dlsym(handle, "rsContextDeinitToClient");
67    dispatchTab.ContextDestroy = (ContextDestroyFnPtr)dlsym(handle, "rsContextDestroy");
68    dispatchTab.ContextDump = (ContextDumpFnPtr)dlsym(handle, "rsContextDump");
69    dispatchTab.ContextFinish = (ContextFinishFnPtr)dlsym(handle, "rsContextFinish");
70    dispatchTab.ContextGetMessage = (ContextGetMessageFnPtr)dlsym(handle, "rsContextGetMessage");
71    dispatchTab.ContextInitToClient = (ContextInitToClientFnPtr)dlsym(handle, "rsContextInitToClient");
72    dispatchTab.ContextPeekMessage = (ContextPeekMessageFnPtr)dlsym(handle, "rsContextPeekMessage");
73    dispatchTab.ContextSendMessage = (ContextSendMessageFnPtr)dlsym(handle, "rsContextSendMessage");
74    dispatchTab.ContextSetPriority = (ContextSetPriorityFnPtr)dlsym(handle, "rsContextSetPriority");
75    dispatchTab.DeviceCreate = (DeviceCreateFnPtr)dlsym(handle, "rsDeviceCreate");
76    dispatchTab.DeviceDestroy = (DeviceDestroyFnPtr)dlsym(handle, "rsDeviceDestroy");
77    dispatchTab.DeviceSetConfig = (DeviceSetConfigFnPtr)dlsym(handle, "rsDeviceSetConfig");
78    dispatchTab.ElementCreate = (ElementCreateFnPtr)dlsym(handle, "rsElementCreate");
79    dispatchTab.ElementCreate2 = (ElementCreate2FnPtr)dlsym(handle, "rsElementCreate2");
80    dispatchTab.ElementGetNativeData = (ElementGetNativeDataFnPtr)dlsym(handle, "rsaElementGetNativeData");
81    dispatchTab.ElementGetSubElements = (ElementGetSubElementsFnPtr)dlsym(handle, "rsaElementGetSubElements");
82    dispatchTab.GetName = (GetNameFnPtr)dlsym(handle, "rsaGetName");;
83    dispatchTab.InvokeClosureCreate = (InvokeClosureCreateFnPtr)dlsym(handle, "rsInvokeClosureCreate");
84    dispatchTab.ObjDestroy = (ObjDestroyFnPtr)dlsym(handle, "rsObjDestroy");
85    dispatchTab.SamplerCreate = (SamplerCreateFnPtr)dlsym(handle, "rsSamplerCreate");
86    dispatchTab.ScriptBindAllocation = (ScriptBindAllocationFnPtr)dlsym(handle, "rsScriptBindAllocation");
87    dispatchTab.ScriptCCreate = (ScriptCCreateFnPtr)dlsym(handle, "rsScriptCCreate");
88    dispatchTab.ScriptFieldIDCreate = (ScriptFieldIDCreateFnPtr)dlsym(handle, "rsScriptFieldIDCreate");
89    dispatchTab.ScriptForEach = (ScriptForEachFnPtr)dlsym(handle, "rsScriptForEach");
90    dispatchTab.ScriptForEachMulti = (ScriptForEachMultiFnPtr)dlsym(handle, "rsScriptForEachMulti");
91    dispatchTab.ScriptGetVarV = (ScriptGetVarVFnPtr)dlsym(handle, "rsScriptGetVarV");
92    dispatchTab.ScriptGroup2Create = (ScriptGroup2CreateFnPtr)dlsym(handle, "rsScriptGroup2Create");
93    dispatchTab.ScriptGroupCreate = (ScriptGroupCreateFnPtr)dlsym(handle, "rsScriptGroupCreate");
94    dispatchTab.ScriptGroupExecute = (ScriptGroupExecuteFnPtr)dlsym(handle, "rsScriptGroupExecute");
95    dispatchTab.ScriptGroupSetInput = (ScriptGroupSetInputFnPtr)dlsym(handle, "rsScriptGroupSetInput");
96    dispatchTab.ScriptGroupSetOutput = (ScriptGroupSetOutputFnPtr)dlsym(handle, "rsScriptGroupSetOutput");
97    dispatchTab.ScriptIntrinsicCreate = (ScriptIntrinsicCreateFnPtr)dlsym(handle, "rsScriptIntrinsicCreate");
98    dispatchTab.ScriptInvoke = (ScriptInvokeFnPtr)dlsym(handle, "rsScriptInvoke");
99    dispatchTab.ScriptInvokeIDCreate = (ScriptInvokeIDCreateFnPtr)dlsym(handle, "rsScriptInvokeIDCreate");
100    dispatchTab.ScriptInvokeV = (ScriptInvokeVFnPtr)dlsym(handle, "rsScriptInvokeV");
101    dispatchTab.ScriptKernelIDCreate = (ScriptKernelIDCreateFnPtr)dlsym(handle, "rsScriptKernelIDCreate");
102    dispatchTab.ScriptReduce = (ScriptReduceFnPtr)dlsym(handle, "rsScriptReduce");
103    dispatchTab.ScriptSetTimeZone = (ScriptSetTimeZoneFnPtr)dlsym(handle, "rsScriptSetTimeZone");
104    dispatchTab.ScriptSetVarD = (ScriptSetVarDFnPtr)dlsym(handle, "rsScriptSetVarD");
105    dispatchTab.ScriptSetVarF = (ScriptSetVarFFnPtr)dlsym(handle, "rsScriptSetVarF");
106    dispatchTab.ScriptSetVarI = (ScriptSetVarIFnPtr)dlsym(handle, "rsScriptSetVarI");
107    dispatchTab.ScriptSetVarJ = (ScriptSetVarJFnPtr)dlsym(handle, "rsScriptSetVarJ");
108    dispatchTab.ScriptSetVarObj = (ScriptSetVarObjFnPtr)dlsym(handle, "rsScriptSetVarObj");
109    dispatchTab.ScriptSetVarV = (ScriptSetVarVFnPtr)dlsym(handle, "rsScriptSetVarV");
110    dispatchTab.ScriptSetVarVE = (ScriptSetVarVEFnPtr)dlsym(handle, "rsScriptSetVarVE");
111    dispatchTab.TypeCreate = (TypeCreateFnPtr)dlsym(handle, "rsTypeCreate");
112    dispatchTab.TypeGetNativeData = (TypeGetNativeDataFnPtr)dlsym(handle, "rsaTypeGetNativeData");
113
114    // Clear error buffer for later operations.
115    dlerror();
116
117    if (dispatchTab.AllocationGetType == nullptr) {
118        LOG_ERR("Couldn't initialize dispatchTab.AllocationGetType");
119        return false;
120    }
121    if (dispatchTab.TypeGetNativeData == nullptr) {
122        LOG_ERR("Couldn't initialize dispatchTab.TypeGetNativeData");
123        return false;
124    }
125    if (dispatchTab.ElementGetNativeData == nullptr) {
126        LOG_ERR("Couldn't initialize dispatchTab.ElementGetNativeData");
127        return false;
128    }
129    if (dispatchTab.ElementGetSubElements == nullptr) {
130        LOG_ERR("Couldn't initialize dispatchTab.ElementGetSubElements");
131        return false;
132    }
133    if (dispatchTab.DeviceCreate == nullptr) {
134        LOG_ERR("Couldn't initialize dispatchTab.DeviceCreate");
135        return false;
136    }
137    if (dispatchTab.DeviceDestroy == nullptr) {
138        LOG_ERR("Couldn't initialize dispatchTab.DeviceDestroy");
139        return false;
140    }
141    if (dispatchTab.DeviceSetConfig == nullptr) {
142        LOG_ERR("Couldn't initialize dispatchTab.DeviceSetConfig");
143        return false;
144    }
145    if (dispatchTab.ContextCreate == nullptr) {
146        LOG_ERR("Couldn't initialize dispatchTab.ContextCreate");
147        return false;
148    }
149    if (dispatchTab.GetName == nullptr) {
150        LOG_ERR("Couldn't initialize dispatchTab.GetName");
151        return false;
152    }
153    if (dispatchTab.ContextDestroy == nullptr) {
154        LOG_ERR("Couldn't initialize dispatchTab.ContextDestroy");
155        return false;
156    }
157    if (dispatchTab.ContextGetMessage == nullptr) {
158        LOG_ERR("Couldn't initialize dispatchTab.ContextGetMessage");
159        return false;
160    }
161    if (dispatchTab.ContextPeekMessage == nullptr) {
162        LOG_ERR("Couldn't initialize dispatchTab.ContextPeekMessage");
163        return false;
164    }
165    if (dispatchTab.ContextSendMessage == nullptr) {
166        LOG_ERR("Couldn't initialize dispatchTab.ContextSendMessage");
167        return false;
168    }
169    if (dispatchTab.ContextInitToClient == nullptr) {
170        LOG_ERR("Couldn't initialize dispatchTab.ContextInitToClient");
171        return false;
172    }
173    if (dispatchTab.ContextDeinitToClient == nullptr) {
174        LOG_ERR("Couldn't initialize dispatchTab.ContextDeinitToClient");
175        return false;
176    }
177    if (dispatchTab.TypeCreate == nullptr) {
178        LOG_ERR("Couldn't initialize dispatchTab.TypeCreate");
179        return false;
180    }
181    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    // TODO: Update the API level when reduce is added.
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