rsdRuntimeStubs.cpp revision 110f181b7966212a36ef18016f9b81c7322d0a2f
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
17#include "rsContext.h"
18#include "rsScriptC.h"
19#include "rsMatrix4x4.h"
20#include "rsMatrix3x3.h"
21#include "rsMatrix2x2.h"
22#include "rsRuntime.h"
23
24#include "utils/Timers.h"
25#include "rsdCore.h"
26#include "rsdBcc.h"
27
28#include "rsdPath.h"
29#include "rsdAllocation.h"
30#include "rsdShaderCache.h"
31#include "rsdVertexArray.h"
32
33#include <time.h>
34
35using namespace android;
36using namespace android::renderscript;
37
38typedef float float2 __attribute__((ext_vector_type(2)));
39typedef float float3 __attribute__((ext_vector_type(3)));
40typedef float float4 __attribute__((ext_vector_type(4)));
41typedef double double2 __attribute__((ext_vector_type(2)));
42typedef double double3 __attribute__((ext_vector_type(3)));
43typedef double double4 __attribute__((ext_vector_type(4)));
44typedef char char2 __attribute__((ext_vector_type(2)));
45typedef char char3 __attribute__((ext_vector_type(3)));
46typedef char char4 __attribute__((ext_vector_type(4)));
47typedef unsigned char uchar2 __attribute__((ext_vector_type(2)));
48typedef unsigned char uchar3 __attribute__((ext_vector_type(3)));
49typedef unsigned char uchar4 __attribute__((ext_vector_type(4)));
50typedef short short2 __attribute__((ext_vector_type(2)));
51typedef short short3 __attribute__((ext_vector_type(3)));
52typedef short short4 __attribute__((ext_vector_type(4)));
53typedef unsigned short ushort2 __attribute__((ext_vector_type(2)));
54typedef unsigned short ushort3 __attribute__((ext_vector_type(3)));
55typedef unsigned short ushort4 __attribute__((ext_vector_type(4)));
56typedef int32_t int2 __attribute__((ext_vector_type(2)));
57typedef int32_t int3 __attribute__((ext_vector_type(3)));
58typedef int32_t int4 __attribute__((ext_vector_type(4)));
59typedef uint32_t uint2 __attribute__((ext_vector_type(2)));
60typedef uint32_t uint3 __attribute__((ext_vector_type(3)));
61typedef uint32_t uint4 __attribute__((ext_vector_type(4)));
62typedef long long long2 __attribute__((ext_vector_type(2)));
63typedef long long long3 __attribute__((ext_vector_type(3)));
64typedef long long long4 __attribute__((ext_vector_type(4)));
65typedef unsigned long long ulong2 __attribute__((ext_vector_type(2)));
66typedef unsigned long long ulong3 __attribute__((ext_vector_type(3)));
67typedef unsigned long long ulong4 __attribute__((ext_vector_type(4)));
68
69typedef uint8_t uchar;
70typedef uint16_t ushort;
71typedef uint32_t uint;
72typedef uint64_t ulong;
73
74//////////////////////////////////////////////////////////////////////////////
75// Allocation
76//////////////////////////////////////////////////////////////////////////////
77
78
79static void SC_AllocationSyncAll2(Allocation *a, RsAllocationUsageType source) {
80    Context *rsc = RsdCpuReference::getTlsContext();
81    rsrAllocationSyncAll(rsc, a, source);
82}
83
84static void SC_AllocationSyncAll(Allocation *a) {
85    Context *rsc = RsdCpuReference::getTlsContext();
86    rsrAllocationSyncAll(rsc, a, RS_ALLOCATION_USAGE_SCRIPT);
87}
88
89static void SC_AllocationCopy1DRange(Allocation *dstAlloc,
90                                     uint32_t dstOff,
91                                     uint32_t dstMip,
92                                     uint32_t count,
93                                     Allocation *srcAlloc,
94                                     uint32_t srcOff, uint32_t srcMip) {
95    Context *rsc = RsdCpuReference::getTlsContext();
96    rsrAllocationCopy1DRange(rsc, dstAlloc, dstOff, dstMip, count,
97                             srcAlloc, srcOff, srcMip);
98}
99
100static void SC_AllocationCopy2DRange(Allocation *dstAlloc,
101                                     uint32_t dstXoff, uint32_t dstYoff,
102                                     uint32_t dstMip, uint32_t dstFace,
103                                     uint32_t width, uint32_t height,
104                                     Allocation *srcAlloc,
105                                     uint32_t srcXoff, uint32_t srcYoff,
106                                     uint32_t srcMip, uint32_t srcFace) {
107    Context *rsc = RsdCpuReference::getTlsContext();
108    rsrAllocationCopy2DRange(rsc, dstAlloc,
109                             dstXoff, dstYoff, dstMip, dstFace,
110                             width, height,
111                             srcAlloc,
112                             srcXoff, srcYoff, srcMip, srcFace);
113}
114
115#ifndef RS_COMPATIBILITY_LIB
116static void SC_AllocationIoSend(Allocation *alloc) {
117    Context *rsc = RsdCpuReference::getTlsContext();
118    rsdAllocationIoSend(rsc, alloc);
119}
120
121
122static void SC_AllocationIoReceive(Allocation *alloc) {
123    Context *rsc = RsdCpuReference::getTlsContext();
124    rsdAllocationIoReceive(rsc, alloc);
125}
126
127
128
129//////////////////////////////////////////////////////////////////////////////
130// Context
131//////////////////////////////////////////////////////////////////////////////
132
133static void SC_BindTexture(ProgramFragment *pf, uint32_t slot, Allocation *a) {
134    Context *rsc = RsdCpuReference::getTlsContext();
135    rsrBindTexture(rsc, pf, slot, a);
136}
137
138static void SC_BindVertexConstant(ProgramVertex *pv, uint32_t slot, Allocation *a) {
139    Context *rsc = RsdCpuReference::getTlsContext();
140    rsrBindConstant(rsc, pv, slot, a);
141}
142
143static void SC_BindFragmentConstant(ProgramFragment *pf, uint32_t slot, Allocation *a) {
144    Context *rsc = RsdCpuReference::getTlsContext();
145    rsrBindConstant(rsc, pf, slot, a);
146}
147
148static void SC_BindSampler(ProgramFragment *pf, uint32_t slot, Sampler *s) {
149    Context *rsc = RsdCpuReference::getTlsContext();
150    rsrBindSampler(rsc, pf, slot, s);
151}
152
153static void SC_BindProgramStore(ProgramStore *ps) {
154    Context *rsc = RsdCpuReference::getTlsContext();
155    rsrBindProgramStore(rsc, ps);
156}
157
158static void SC_BindProgramFragment(ProgramFragment *pf) {
159    Context *rsc = RsdCpuReference::getTlsContext();
160    rsrBindProgramFragment(rsc, pf);
161}
162
163static void SC_BindProgramVertex(ProgramVertex *pv) {
164    Context *rsc = RsdCpuReference::getTlsContext();
165    rsrBindProgramVertex(rsc, pv);
166}
167
168static void SC_BindProgramRaster(ProgramRaster *pr) {
169    Context *rsc = RsdCpuReference::getTlsContext();
170    rsrBindProgramRaster(rsc, pr);
171}
172
173static void SC_BindFrameBufferObjectColorTarget(Allocation *a, uint32_t slot) {
174    Context *rsc = RsdCpuReference::getTlsContext();
175    rsrBindFrameBufferObjectColorTarget(rsc, a, slot);
176}
177
178static void SC_BindFrameBufferObjectDepthTarget(Allocation *a) {
179    Context *rsc = RsdCpuReference::getTlsContext();
180    rsrBindFrameBufferObjectDepthTarget(rsc, a);
181}
182
183static void SC_ClearFrameBufferObjectColorTarget(uint32_t slot) {
184    Context *rsc = RsdCpuReference::getTlsContext();
185    rsrClearFrameBufferObjectColorTarget(rsc, slot);
186}
187
188static void SC_ClearFrameBufferObjectDepthTarget(Context *, Script *) {
189    Context *rsc = RsdCpuReference::getTlsContext();
190    rsrClearFrameBufferObjectDepthTarget(rsc);
191}
192
193static void SC_ClearFrameBufferObjectTargets(Context *, Script *) {
194    Context *rsc = RsdCpuReference::getTlsContext();
195    rsrClearFrameBufferObjectTargets(rsc);
196}
197
198
199//////////////////////////////////////////////////////////////////////////////
200// VP
201//////////////////////////////////////////////////////////////////////////////
202
203static void SC_VpLoadProjectionMatrix(const rsc_Matrix *m) {
204    Context *rsc = RsdCpuReference::getTlsContext();
205    rsrVpLoadProjectionMatrix(rsc, m);
206}
207
208static void SC_VpLoadModelMatrix(const rsc_Matrix *m) {
209    Context *rsc = RsdCpuReference::getTlsContext();
210    rsrVpLoadModelMatrix(rsc, m);
211}
212
213static void SC_VpLoadTextureMatrix(const rsc_Matrix *m) {
214    Context *rsc = RsdCpuReference::getTlsContext();
215    rsrVpLoadTextureMatrix(rsc, m);
216}
217
218static void SC_PfConstantColor(ProgramFragment *pf, float r, float g, float b, float a) {
219    Context *rsc = RsdCpuReference::getTlsContext();
220    rsrPfConstantColor(rsc, pf, r, g, b, a);
221}
222
223static void SC_VpGetProjectionMatrix(rsc_Matrix *m) {
224    Context *rsc = RsdCpuReference::getTlsContext();
225    rsrVpGetProjectionMatrix(rsc, m);
226}
227
228
229//////////////////////////////////////////////////////////////////////////////
230// Drawing
231//////////////////////////////////////////////////////////////////////////////
232
233static void SC_DrawQuadTexCoords(float x1, float y1, float z1, float u1, float v1,
234                                 float x2, float y2, float z2, float u2, float v2,
235                                 float x3, float y3, float z3, float u3, float v3,
236                                 float x4, float y4, float z4, float u4, float v4) {
237    Context *rsc = RsdCpuReference::getTlsContext();
238
239    if (!rsc->setupCheck()) {
240        return;
241    }
242
243    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
244    if (!dc->gl.shaderCache->setup(rsc)) {
245        return;
246    }
247
248    //ALOGE("Quad");
249    //ALOGE("%4.2f, %4.2f, %4.2f", x1, y1, z1);
250    //ALOGE("%4.2f, %4.2f, %4.2f", x2, y2, z2);
251    //ALOGE("%4.2f, %4.2f, %4.2f", x3, y3, z3);
252    //ALOGE("%4.2f, %4.2f, %4.2f", x4, y4, z4);
253
254    float vtx[] = {x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4};
255    const float tex[] = {u1,v1, u2,v2, u3,v3, u4,v4};
256
257    RsdVertexArray::Attrib attribs[2];
258    attribs[0].set(GL_FLOAT, 3, 12, false, (uint32_t)vtx, "ATTRIB_position");
259    attribs[1].set(GL_FLOAT, 2, 8, false, (uint32_t)tex, "ATTRIB_texture0");
260
261    RsdVertexArray va(attribs, 2);
262    va.setup(rsc);
263
264    RSD_CALL_GL(glDrawArrays, GL_TRIANGLE_FAN, 0, 4);
265}
266
267static void SC_DrawQuad(float x1, float y1, float z1,
268                        float x2, float y2, float z2,
269                        float x3, float y3, float z3,
270                        float x4, float y4, float z4) {
271    SC_DrawQuadTexCoords(x1, y1, z1, 0, 1,
272                         x2, y2, z2, 1, 1,
273                         x3, y3, z3, 1, 0,
274                         x4, y4, z4, 0, 0);
275}
276
277static void SC_DrawSpriteScreenspace(float x, float y, float z, float w, float h) {
278    Context *rsc = RsdCpuReference::getTlsContext();
279
280    ObjectBaseRef<const ProgramVertex> tmp(rsc->getProgramVertex());
281    rsc->setProgramVertex(rsc->getDefaultProgramVertex());
282    //rsc->setupCheck();
283
284    //GLint crop[4] = {0, h, w, -h};
285
286    float sh = rsc->getHeight();
287
288    SC_DrawQuad(x,   sh - y,     z,
289                x+w, sh - y,     z,
290                x+w, sh - (y+h), z,
291                x,   sh - (y+h), z);
292    rsc->setProgramVertex((ProgramVertex *)tmp.get());
293}
294
295static void SC_DrawRect(float x1, float y1, float x2, float y2, float z) {
296    SC_DrawQuad(x1, y2, z, x2, y2, z, x2, y1, z, x1, y1, z);
297}
298
299static void SC_DrawPath(Path *p) {
300    Context *rsc = RsdCpuReference::getTlsContext();
301    rsdPathDraw(rsc, p);
302}
303
304static void SC_DrawMesh(Mesh *m) {
305    Context *rsc = RsdCpuReference::getTlsContext();
306    rsrDrawMesh(rsc, m);
307}
308
309static void SC_DrawMeshPrimitive(Mesh *m, uint32_t primIndex) {
310    Context *rsc = RsdCpuReference::getTlsContext();
311    rsrDrawMeshPrimitive(rsc, m, primIndex);
312}
313
314static void SC_DrawMeshPrimitiveRange(Mesh *m, uint32_t primIndex, uint32_t start, uint32_t len) {
315    Context *rsc = RsdCpuReference::getTlsContext();
316    rsrDrawMeshPrimitiveRange(rsc, m, primIndex, start, len);
317}
318
319static void SC_MeshComputeBoundingBox(Mesh *m,
320                               float *minX, float *minY, float *minZ,
321                               float *maxX, float *maxY, float *maxZ) {
322    Context *rsc = RsdCpuReference::getTlsContext();
323    rsrMeshComputeBoundingBox(rsc, m, minX, minY, minZ, maxX, maxY, maxZ);
324}
325
326
327
328//////////////////////////////////////////////////////////////////////////////
329//
330//////////////////////////////////////////////////////////////////////////////
331
332
333static void SC_Color(float r, float g, float b, float a) {
334    Context *rsc = RsdCpuReference::getTlsContext();
335    rsrColor(rsc, r, g, b, a);
336}
337
338static void SC_Finish() {
339    Context *rsc = RsdCpuReference::getTlsContext();
340    rsdGLFinish(rsc);
341}
342
343static void SC_ClearColor(float r, float g, float b, float a) {
344    Context *rsc = RsdCpuReference::getTlsContext();
345    rsrPrepareClear(rsc);
346    rsdGLClearColor(rsc, r, g, b, a);
347}
348
349static void SC_ClearDepth(float v) {
350    Context *rsc = RsdCpuReference::getTlsContext();
351    rsrPrepareClear(rsc);
352    rsdGLClearDepth(rsc, v);
353}
354
355static uint32_t SC_GetWidth() {
356    Context *rsc = RsdCpuReference::getTlsContext();
357    return rsrGetWidth(rsc);
358}
359
360static uint32_t SC_GetHeight() {
361    Context *rsc = RsdCpuReference::getTlsContext();
362    return rsrGetHeight(rsc);
363}
364
365static void SC_DrawTextAlloc(Allocation *a, int x, int y) {
366    Context *rsc = RsdCpuReference::getTlsContext();
367    rsrDrawTextAlloc(rsc, a, x, y);
368}
369
370static void SC_DrawText(const char *text, int x, int y) {
371    Context *rsc = RsdCpuReference::getTlsContext();
372    rsrDrawText(rsc, text, x, y);
373}
374
375static void SC_MeasureTextAlloc(Allocation *a,
376                         int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
377    Context *rsc = RsdCpuReference::getTlsContext();
378    rsrMeasureTextAlloc(rsc, a, left, right, top, bottom);
379}
380
381static void SC_MeasureText(const char *text,
382                    int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
383    Context *rsc = RsdCpuReference::getTlsContext();
384    rsrMeasureText(rsc, text, left, right, top, bottom);
385}
386
387static void SC_BindFont(Font *f) {
388    Context *rsc = RsdCpuReference::getTlsContext();
389    rsrBindFont(rsc, f);
390}
391
392static void SC_FontColor(float r, float g, float b, float a) {
393    Context *rsc = RsdCpuReference::getTlsContext();
394    rsrFontColor(rsc, r, g, b, a);
395}
396#endif
397
398
399//////////////////////////////////////////////////////////////////////////////
400//
401//////////////////////////////////////////////////////////////////////////////
402
403static void SC_SetObject(ObjectBase **dst, ObjectBase * src) {
404    Context *rsc = RsdCpuReference::getTlsContext();
405    rsrSetObject(rsc, dst, src);
406}
407
408static void SC_ClearObject(ObjectBase **dst) {
409    Context *rsc = RsdCpuReference::getTlsContext();
410    rsrClearObject(rsc, dst);
411}
412
413static bool SC_IsObject(const ObjectBase *src) {
414    Context *rsc = RsdCpuReference::getTlsContext();
415    return rsrIsObject(rsc, src);
416}
417
418
419
420
421static const Allocation * SC_GetAllocation(const void *ptr) {
422    Context *rsc = RsdCpuReference::getTlsContext();
423    const Script *sc = RsdCpuReference::getTlsScript();
424    return rsdScriptGetAllocationForPointer(rsc, sc, ptr);
425}
426
427static void SC_ForEach_SAA(Script *target,
428                            Allocation *in,
429                            Allocation *out) {
430    Context *rsc = RsdCpuReference::getTlsContext();
431    rsrForEach(rsc, target, in, out, NULL, 0, NULL);
432}
433
434static void SC_ForEach_SAAU(Script *target,
435                            Allocation *in,
436                            Allocation *out,
437                            const void *usr) {
438    Context *rsc = RsdCpuReference::getTlsContext();
439    rsrForEach(rsc, target, in, out, usr, 0, NULL);
440}
441
442static void SC_ForEach_SAAUS(Script *target,
443                             Allocation *in,
444                             Allocation *out,
445                             const void *usr,
446                             const RsScriptCall *call) {
447    Context *rsc = RsdCpuReference::getTlsContext();
448    rsrForEach(rsc, target, in, out, usr, 0, call);
449}
450
451static void SC_ForEach_SAAUL(Script *target,
452                             Allocation *in,
453                             Allocation *out,
454                             const void *usr,
455                             uint32_t usrLen) {
456    Context *rsc = RsdCpuReference::getTlsContext();
457    rsrForEach(rsc, target, in, out, usr, usrLen, NULL);
458}
459
460static void SC_ForEach_SAAULS(Script *target,
461                              Allocation *in,
462                              Allocation *out,
463                              const void *usr,
464                              uint32_t usrLen,
465                              const RsScriptCall *call) {
466    Context *rsc = RsdCpuReference::getTlsContext();
467    rsrForEach(rsc, target, in, out, usr, usrLen, call);
468}
469
470
471
472//////////////////////////////////////////////////////////////////////////////
473// Time routines
474//////////////////////////////////////////////////////////////////////////////
475
476static float SC_GetDt() {
477    Context *rsc = RsdCpuReference::getTlsContext();
478    const Script *sc = RsdCpuReference::getTlsScript();
479    return rsrGetDt(rsc, sc);
480}
481
482time_t SC_Time(time_t *timer) {
483    Context *rsc = RsdCpuReference::getTlsContext();
484    return rsrTime(rsc, timer);
485}
486
487tm* SC_LocalTime(tm *local, time_t *timer) {
488    Context *rsc = RsdCpuReference::getTlsContext();
489    return rsrLocalTime(rsc, local, timer);
490}
491
492int64_t SC_UptimeMillis() {
493    Context *rsc = RsdCpuReference::getTlsContext();
494    return rsrUptimeMillis(rsc);
495}
496
497int64_t SC_UptimeNanos() {
498    Context *rsc = RsdCpuReference::getTlsContext();
499    return rsrUptimeNanos(rsc);
500}
501
502//////////////////////////////////////////////////////////////////////////////
503// Message routines
504//////////////////////////////////////////////////////////////////////////////
505
506static uint32_t SC_ToClient2(int cmdID, void *data, int len) {
507    Context *rsc = RsdCpuReference::getTlsContext();
508    return rsrToClient(rsc, cmdID, data, len);
509}
510
511static uint32_t SC_ToClient(int cmdID) {
512    Context *rsc = RsdCpuReference::getTlsContext();
513    return rsrToClient(rsc, cmdID, NULL, 0);
514}
515
516static uint32_t SC_ToClientBlocking2(int cmdID, void *data, int len) {
517    Context *rsc = RsdCpuReference::getTlsContext();
518    return rsrToClientBlocking(rsc, cmdID, data, len);
519}
520
521static uint32_t SC_ToClientBlocking(int cmdID) {
522    Context *rsc = RsdCpuReference::getTlsContext();
523    return rsrToClientBlocking(rsc, cmdID, NULL, 0);
524}
525
526
527static void * ElementAt1D(Allocation *a, RsDataType dt, uint32_t vecSize, uint32_t x) {
528    Context *rsc = RsdCpuReference::getTlsContext();
529    const Type *t = a->getType();
530    const Element *e = t->getElement();
531
532    char buf[256];
533    if (x >= t->getLODDimX(0)) {
534        sprintf(buf, "Out range ElementAt X %i of %i", x, t->getLODDimX(0));
535        rsc->setError(RS_ERROR_FATAL_UNKNOWN, buf);
536        return NULL;
537    }
538
539    if (vecSize != e->getVectorSize()) {
540        sprintf(buf, "Vector size mismatch for ElementAt %i of %i", vecSize, e->getVectorSize());
541        rsc->setError(RS_ERROR_FATAL_UNKNOWN, buf);
542        return NULL;
543    }
544
545    if (dt != e->getType()) {
546        sprintf(buf, "Data type mismatch for ElementAt %i of %i", dt, e->getType());
547        rsc->setError(RS_ERROR_FATAL_UNKNOWN, buf);
548        return NULL;
549    }
550
551    uint8_t *p = (uint8_t *)a->mHal.drvState.lod[0].mallocPtr;
552    const uint32_t eSize = e->getSizeBytes();
553    return &p[(eSize * x)];
554}
555
556static void * ElementAt2D(Allocation *a, RsDataType dt, uint32_t vecSize, uint32_t x, uint32_t y) {
557    Context *rsc = RsdCpuReference::getTlsContext();
558    const Type *t = a->getType();
559    const Element *e = t->getElement();
560
561    char buf[256];
562    if (x >= t->getLODDimX(0)) {
563        sprintf(buf, "Out range ElementAt X %i of %i", x, t->getLODDimX(0));
564        rsc->setError(RS_ERROR_FATAL_UNKNOWN, buf);
565        return NULL;
566    }
567
568    if (y >= t->getLODDimY(0)) {
569        sprintf(buf, "Out range ElementAt Y %i of %i", y, t->getLODDimY(0));
570        rsc->setError(RS_ERROR_FATAL_UNKNOWN, buf);
571        return NULL;
572    }
573
574    if (vecSize != e->getVectorSize()) {
575        sprintf(buf, "Vector size mismatch for ElementAt %i of %i", vecSize, e->getVectorSize());
576        rsc->setError(RS_ERROR_FATAL_UNKNOWN, buf);
577        return NULL;
578    }
579
580    if (dt != e->getType()) {
581        sprintf(buf, "Data type mismatch for ElementAt %i of %i", dt, e->getType());
582        rsc->setError(RS_ERROR_FATAL_UNKNOWN, buf);
583        return NULL;
584    }
585
586    uint8_t *p = (uint8_t *)a->mHal.drvState.lod[0].mallocPtr;
587    const uint32_t eSize = e->getSizeBytes();
588    const uint32_t stride = a->mHal.drvState.lod[0].stride;
589    return &p[(eSize * x) + (y * stride)];
590}
591
592static void * ElementAt3D(Allocation *a, RsDataType dt, uint32_t vecSize, uint32_t x, uint32_t y, uint32_t z) {
593    Context *rsc = RsdCpuReference::getTlsContext();
594    const Type *t = a->getType();
595    const Element *e = t->getElement();
596
597    char buf[256];
598    if (x >= t->getLODDimX(0)) {
599        sprintf(buf, "Out range ElementAt X %i of %i", x, t->getLODDimX(0));
600        rsc->setError(RS_ERROR_FATAL_UNKNOWN, buf);
601        return NULL;
602    }
603
604    if (y >= t->getLODDimY(0)) {
605        sprintf(buf, "Out range ElementAt Y %i of %i", y, t->getLODDimY(0));
606        rsc->setError(RS_ERROR_FATAL_UNKNOWN, buf);
607        return NULL;
608    }
609
610    if (z >= t->getLODDimZ(0)) {
611        sprintf(buf, "Out range ElementAt Z %i of %i", z, t->getLODDimZ(0));
612        rsc->setError(RS_ERROR_FATAL_UNKNOWN, buf);
613        return NULL;
614    }
615
616    if (vecSize != e->getVectorSize()) {
617        sprintf(buf, "Vector size mismatch for ElementAt %i of %i", vecSize, e->getVectorSize());
618        rsc->setError(RS_ERROR_FATAL_UNKNOWN, buf);
619        return NULL;
620    }
621
622    if (dt != e->getType()) {
623        sprintf(buf, "Data type mismatch for ElementAt %i of %i", dt, e->getType());
624        rsc->setError(RS_ERROR_FATAL_UNKNOWN, buf);
625        return NULL;
626    }
627
628    uint8_t *p = (uint8_t *)a->mHal.drvState.lod[0].mallocPtr;
629    const uint32_t eSize = e->getSizeBytes();
630    const uint32_t stride = a->mHal.drvState.lod[0].stride;
631    return &p[(eSize * x) + (y * stride)];
632}
633
634#define ELEMENT_AT(T, DT, VS)                                               \
635    static void SC_SetElementAt1_##T(Allocation *a, T val, uint32_t x) {           \
636        void *r = ElementAt1D(a, DT, VS, x);                            \
637        if (r != NULL) ((T *)r)[0] = val;                               \
638        else ALOGE("Error from %s", __PRETTY_FUNCTION__);               \
639    }                                                                   \
640    static void SC_SetElementAt2_##T(Allocation * a, T val, uint32_t x, uint32_t y) { \
641        void *r = ElementAt2D(a, DT, VS, x, y);            \
642        if (r != NULL) ((T *)r)[0] = val;                               \
643        else ALOGE("Error from %s", __PRETTY_FUNCTION__);               \
644    }                                                                   \
645    static void SC_SetElementAt3_##T(Allocation * a, T val, uint32_t x, uint32_t y, uint32_t z) { \
646        void *r = ElementAt3D(a, DT, VS, x, y, z);         \
647        if (r != NULL) ((T *)r)[0] = val;                               \
648        else ALOGE("Error from %s", __PRETTY_FUNCTION__);               \
649    }                                                                   \
650    static T SC_GetElementAt1_##T(Allocation * a, uint32_t x) {                  \
651        void *r = ElementAt1D(a, DT, VS, x);               \
652        if (r != NULL) return ((T *)r)[0];                              \
653        ALOGE("Error from %s", __PRETTY_FUNCTION__);                    \
654        return 0;                                                       \
655    }                                                                   \
656    static T SC_GetElementAt2_##T(Allocation * a, uint32_t x, uint32_t y) {      \
657        void *r = ElementAt2D(a, DT, VS, x, y);            \
658        if (r != NULL) return ((T *)r)[0];                              \
659        ALOGE("Error from %s", __PRETTY_FUNCTION__);                    \
660        return 0;                                                       \
661    }                                                                   \
662    static T SC_GetElementAt3_##T(Allocation * a, uint32_t x, uint32_t y, uint32_t z) { \
663        void *r = ElementAt3D(a, DT, VS, x, y, z);         \
664        if (r != NULL) return ((T *)r)[0];                              \
665        ALOGE("Error from %s", __PRETTY_FUNCTION__);                    \
666        return 0;                                                       \
667    }
668
669ELEMENT_AT(char, RS_TYPE_SIGNED_8, 1)
670ELEMENT_AT(char2, RS_TYPE_SIGNED_8, 2)
671ELEMENT_AT(char3, RS_TYPE_SIGNED_8, 3)
672ELEMENT_AT(char4, RS_TYPE_SIGNED_8, 4)
673ELEMENT_AT(uchar, RS_TYPE_UNSIGNED_8, 1)
674ELEMENT_AT(uchar2, RS_TYPE_UNSIGNED_8, 2)
675ELEMENT_AT(uchar3, RS_TYPE_UNSIGNED_8, 3)
676ELEMENT_AT(uchar4, RS_TYPE_UNSIGNED_8, 4)
677ELEMENT_AT(short, RS_TYPE_SIGNED_16, 1)
678ELEMENT_AT(short2, RS_TYPE_SIGNED_16, 2)
679ELEMENT_AT(short3, RS_TYPE_SIGNED_16, 3)
680ELEMENT_AT(short4, RS_TYPE_SIGNED_16, 4)
681ELEMENT_AT(ushort, RS_TYPE_UNSIGNED_16, 1)
682ELEMENT_AT(ushort2, RS_TYPE_UNSIGNED_16, 2)
683ELEMENT_AT(ushort3, RS_TYPE_UNSIGNED_16, 3)
684ELEMENT_AT(ushort4, RS_TYPE_UNSIGNED_16, 4)
685ELEMENT_AT(int, RS_TYPE_SIGNED_32, 1)
686ELEMENT_AT(int2, RS_TYPE_SIGNED_32, 2)
687ELEMENT_AT(int3, RS_TYPE_SIGNED_32, 3)
688ELEMENT_AT(int4, RS_TYPE_SIGNED_32, 4)
689ELEMENT_AT(uint, RS_TYPE_UNSIGNED_32, 1)
690ELEMENT_AT(uint2, RS_TYPE_UNSIGNED_32, 2)
691ELEMENT_AT(uint3, RS_TYPE_UNSIGNED_32, 3)
692ELEMENT_AT(uint4, RS_TYPE_UNSIGNED_32, 4)
693ELEMENT_AT(long, RS_TYPE_SIGNED_64, 1)
694ELEMENT_AT(long2, RS_TYPE_SIGNED_64, 2)
695ELEMENT_AT(long3, RS_TYPE_SIGNED_64, 3)
696ELEMENT_AT(long4, RS_TYPE_SIGNED_64, 4)
697ELEMENT_AT(ulong, RS_TYPE_UNSIGNED_64, 1)
698ELEMENT_AT(ulong2, RS_TYPE_UNSIGNED_64, 2)
699ELEMENT_AT(ulong3, RS_TYPE_UNSIGNED_64, 3)
700ELEMENT_AT(ulong4, RS_TYPE_UNSIGNED_64, 4)
701ELEMENT_AT(float, RS_TYPE_FLOAT_32, 1)
702ELEMENT_AT(float2, RS_TYPE_FLOAT_32, 2)
703ELEMENT_AT(float3, RS_TYPE_FLOAT_32, 3)
704ELEMENT_AT(float4, RS_TYPE_FLOAT_32, 4)
705ELEMENT_AT(double, RS_TYPE_FLOAT_64, 1)
706ELEMENT_AT(double2, RS_TYPE_FLOAT_64, 2)
707ELEMENT_AT(double3, RS_TYPE_FLOAT_64, 3)
708ELEMENT_AT(double4, RS_TYPE_FLOAT_64, 4)
709
710#undef ELEMENT_AT
711
712//////////////////////////////////////////////////////////////////////////////
713// Stub implementation
714//////////////////////////////////////////////////////////////////////////////
715
716// llvm name mangling ref
717//  <builtin-type> ::= v  # void
718//                 ::= b  # bool
719//                 ::= c  # char
720//                 ::= a  # signed char
721//                 ::= h  # unsigned char
722//                 ::= s  # short
723//                 ::= t  # unsigned short
724//                 ::= i  # int
725//                 ::= j  # unsigned int
726//                 ::= l  # long
727//                 ::= m  # unsigned long
728//                 ::= x  # long long, __int64
729//                 ::= y  # unsigned long long, __int64
730//                 ::= f  # float
731//                 ::= d  # double
732
733static RsdCpuReference::CpuSymbol gSyms[] = {
734    // Debug runtime
735    { "_Z20rsGetElementAt_uchar13rs_allocationcj", (void *)&SC_GetElementAt1_uchar, true },
736    { "_Z21rsGetElementAt_uchar213rs_allocationj", (void *)&SC_GetElementAt1_uchar2, true },
737    { "_Z21rsGetElementAt_uchar313rs_allocationj", (void *)&SC_GetElementAt1_uchar3, true },
738    { "_Z21rsGetElementAt_uchar413rs_allocationj", (void *)&SC_GetElementAt1_uchar4, true },
739    { "_Z20rsGetElementAt_uchar13rs_allocationjj", (void *)&SC_GetElementAt2_uchar, true },
740    { "_Z21rsGetElementAt_uchar213rs_allocationjj", (void *)&SC_GetElementAt2_uchar2, true },
741    { "_Z21rsGetElementAt_uchar313rs_allocationjj", (void *)&SC_GetElementAt2_uchar3, true },
742    { "_Z21rsGetElementAt_uchar413rs_allocationjj", (void *)&SC_GetElementAt2_uchar4, true },
743    { "_Z20rsGetElementAt_uchar13rs_allocationjjj", (void *)&SC_GetElementAt3_uchar, true },
744    { "_Z21rsGetElementAt_uchar213rs_allocationjjj", (void *)&SC_GetElementAt3_uchar2, true },
745    { "_Z21rsGetElementAt_uchar313rs_allocationjjj", (void *)&SC_GetElementAt3_uchar3, true },
746    { "_Z21rsGetElementAt_uchar413rs_allocationjjj", (void *)&SC_GetElementAt3_uchar4, true },
747
748    { "_Z19rsGetElementAt_char13rs_allocationj", (void *)&SC_GetElementAt1_char, true },
749    { "_Z20rsGetElementAt_char213rs_allocationj", (void *)&SC_GetElementAt1_char2, true },
750    { "_Z20rsGetElementAt_char313rs_allocationj", (void *)&SC_GetElementAt1_char3, true },
751    { "_Z20rsGetElementAt_char413rs_allocationj", (void *)&SC_GetElementAt1_char4, true },
752    { "_Z19rsGetElementAt_char13rs_allocationjj", (void *)&SC_GetElementAt2_char, true },
753    { "_Z20rsGetElementAt_char213rs_allocationjj", (void *)&SC_GetElementAt2_char2, true },
754    { "_Z20rsGetElementAt_char313rs_allocationjj", (void *)&SC_GetElementAt2_char3, true },
755    { "_Z20rsGetElementAt_char413rs_allocationjj", (void *)&SC_GetElementAt2_char4, true },
756    { "_Z19rsGetElementAt_char13rs_allocationjjj", (void *)&SC_GetElementAt3_char, true },
757    { "_Z20rsGetElementAt_char213rs_allocationjjj", (void *)&SC_GetElementAt3_char2, true },
758    { "_Z20rsGetElementAt_char313rs_allocationjjj", (void *)&SC_GetElementAt3_char3, true },
759    { "_Z20rsGetElementAt_char413rs_allocationjjj", (void *)&SC_GetElementAt3_char4, true },
760
761    { "_Z21rsGetElementAt_ushort13rs_allocationcj", (void *)&SC_GetElementAt1_ushort, true },
762    { "_Z22rsGetElementAt_ushort213rs_allocationj", (void *)&SC_GetElementAt1_ushort2, true },
763    { "_Z22rsGetElementAt_ushort313rs_allocationj", (void *)&SC_GetElementAt1_ushort3, true },
764    { "_Z22rsGetElementAt_ushort413rs_allocationj", (void *)&SC_GetElementAt1_ushort4, true },
765    { "_Z21rsGetElementAt_ushort13rs_allocationjj", (void *)&SC_GetElementAt2_ushort, true },
766    { "_Z22rsGetElementAt_ushort213rs_allocationjj", (void *)&SC_GetElementAt2_ushort2, true },
767    { "_Z22rsGetElementAt_ushort313rs_allocationjj", (void *)&SC_GetElementAt2_ushort3, true },
768    { "_Z22rsGetElementAt_ushort413rs_allocationjj", (void *)&SC_GetElementAt2_ushort4, true },
769    { "_Z21rsGetElementAt_ushort13rs_allocationjjj", (void *)&SC_GetElementAt3_ushort, true },
770    { "_Z22rsGetElementAt_ushort213rs_allocationjjj", (void *)&SC_GetElementAt3_ushort2, true },
771    { "_Z22rsGetElementAt_ushort313rs_allocationjjj", (void *)&SC_GetElementAt3_ushort3, true },
772    { "_Z22rsGetElementAt_ushort413rs_allocationjjj", (void *)&SC_GetElementAt3_ushort4, true },
773
774    { "_Z20rsGetElementAt_short13rs_allocationj", (void *)&SC_GetElementAt1_short, true },
775    { "_Z21rsGetElementAt_short213rs_allocationj", (void *)&SC_GetElementAt1_short2, true },
776    { "_Z21rsGetElementAt_short313rs_allocationj", (void *)&SC_GetElementAt1_short3, true },
777    { "_Z21rsGetElementAt_short413rs_allocationj", (void *)&SC_GetElementAt1_short4, true },
778    { "_Z20rsGetElementAt_short13rs_allocationjj", (void *)&SC_GetElementAt2_short, true },
779    { "_Z21rsGetElementAt_short213rs_allocationjj", (void *)&SC_GetElementAt2_short2, true },
780    { "_Z21rsGetElementAt_short313rs_allocationjj", (void *)&SC_GetElementAt2_short3, true },
781    { "_Z21rsGetElementAt_short413rs_allocationjj", (void *)&SC_GetElementAt2_short4, true },
782    { "_Z20rsGetElementAt_short13rs_allocationjjj", (void *)&SC_GetElementAt3_short, true },
783    { "_Z21rsGetElementAt_short213rs_allocationjjj", (void *)&SC_GetElementAt3_short2, true },
784    { "_Z21rsGetElementAt_short313rs_allocationjjj", (void *)&SC_GetElementAt3_short3, true },
785    { "_Z21rsGetElementAt_short413rs_allocationjjj", (void *)&SC_GetElementAt3_short4, true },
786
787    { "_Z19rsGetElementAt_uint13rs_allocationcj", (void *)&SC_GetElementAt1_uint, true },
788    { "_Z20rsGetElementAt_uint213rs_allocationj", (void *)&SC_GetElementAt1_uint2, true },
789    { "_Z20rsGetElementAt_uint313rs_allocationj", (void *)&SC_GetElementAt1_uint3, true },
790    { "_Z20rsGetElementAt_uint413rs_allocationj", (void *)&SC_GetElementAt1_uint4, true },
791    { "_Z19rsGetElementAt_uint13rs_allocationjj", (void *)&SC_GetElementAt2_uint, true },
792    { "_Z20rsGetElementAt_uint213rs_allocationjj", (void *)&SC_GetElementAt2_uint2, true },
793    { "_Z20rsGetElementAt_uint313rs_allocationjj", (void *)&SC_GetElementAt2_uint3, true },
794    { "_Z20rsGetElementAt_uint413rs_allocationjj", (void *)&SC_GetElementAt2_uint4, true },
795    { "_Z19rsGetElementAt_uint13rs_allocationjjj", (void *)&SC_GetElementAt3_uint, true },
796    { "_Z20rsGetElementAt_uint213rs_allocationjjj", (void *)&SC_GetElementAt3_uint2, true },
797    { "_Z20rsGetElementAt_uint313rs_allocationjjj", (void *)&SC_GetElementAt3_uint3, true },
798    { "_Z20rsGetElementAt_uint413rs_allocationjjj", (void *)&SC_GetElementAt3_uint4, true },
799
800    { "_Z18rsGetElementAt_int13rs_allocationj", (void *)&SC_GetElementAt1_int, true },
801    { "_Z19rsGetElementAt_int213rs_allocationj", (void *)&SC_GetElementAt1_int2, true },
802    { "_Z19rsGetElementAt_int313rs_allocationj", (void *)&SC_GetElementAt1_int3, true },
803    { "_Z19rsGetElementAt_int413rs_allocationj", (void *)&SC_GetElementAt1_int4, true },
804    { "_Z18rsGetElementAt_int13rs_allocationjj", (void *)&SC_GetElementAt2_int, true },
805    { "_Z19rsGetElementAt_int213rs_allocationjj", (void *)&SC_GetElementAt2_int2, true },
806    { "_Z19rsGetElementAt_int313rs_allocationjj", (void *)&SC_GetElementAt2_int3, true },
807    { "_Z19rsGetElementAt_int413rs_allocationjj", (void *)&SC_GetElementAt2_int4, true },
808    { "_Z18rsGetElementAt_int13rs_allocationjjj", (void *)&SC_GetElementAt3_int, true },
809    { "_Z19rsGetElementAt_int213rs_allocationjjj", (void *)&SC_GetElementAt3_int2, true },
810    { "_Z19rsGetElementAt_int313rs_allocationjjj", (void *)&SC_GetElementAt3_int3, true },
811    { "_Z19rsGetElementAt_int413rs_allocationjjj", (void *)&SC_GetElementAt3_int4, true },
812
813    { "_Z20rsGetElementAt_ulong13rs_allocationcj", (void *)&SC_GetElementAt1_ulong, true },
814    { "_Z21rsGetElementAt_ulong213rs_allocationj", (void *)&SC_GetElementAt1_ulong2, true },
815    { "_Z21rsGetElementAt_ulong313rs_allocationj", (void *)&SC_GetElementAt1_ulong3, true },
816    { "_Z21rsGetElementAt_ulong413rs_allocationj", (void *)&SC_GetElementAt1_ulong4, true },
817    { "_Z20rsGetElementAt_ulong13rs_allocationjj", (void *)&SC_GetElementAt2_ulong, true },
818    { "_Z21rsGetElementAt_ulong213rs_allocationjj", (void *)&SC_GetElementAt2_ulong2, true },
819    { "_Z21rsGetElementAt_ulong313rs_allocationjj", (void *)&SC_GetElementAt2_ulong3, true },
820    { "_Z21rsGetElementAt_ulong413rs_allocationjj", (void *)&SC_GetElementAt2_ulong4, true },
821    { "_Z20rsGetElementAt_ulong13rs_allocationjjj", (void *)&SC_GetElementAt3_ulong, true },
822    { "_Z21rsGetElementAt_ulong213rs_allocationjjj", (void *)&SC_GetElementAt3_ulong2, true },
823    { "_Z21rsGetElementAt_ulong313rs_allocationjjj", (void *)&SC_GetElementAt3_ulong3, true },
824    { "_Z21rsGetElementAt_ulong413rs_allocationjjj", (void *)&SC_GetElementAt3_ulong4, true },
825
826    { "_Z19rsGetElementAt_long13rs_allocationj", (void *)&SC_GetElementAt1_long, true },
827    { "_Z20rsGetElementAt_long213rs_allocationj", (void *)&SC_GetElementAt1_long2, true },
828    { "_Z20rsGetElementAt_long313rs_allocationj", (void *)&SC_GetElementAt1_long3, true },
829    { "_Z20rsGetElementAt_long413rs_allocationj", (void *)&SC_GetElementAt1_long4, true },
830    { "_Z19rsGetElementAt_long13rs_allocationjj", (void *)&SC_GetElementAt2_long, true },
831    { "_Z20rsGetElementAt_long213rs_allocationjj", (void *)&SC_GetElementAt2_long2, true },
832    { "_Z20rsGetElementAt_long313rs_allocationjj", (void *)&SC_GetElementAt2_long3, true },
833    { "_Z20rsGetElementAt_long413rs_allocationjj", (void *)&SC_GetElementAt2_long4, true },
834    { "_Z19rsGetElementAt_long13rs_allocationjjj", (void *)&SC_GetElementAt3_long, true },
835    { "_Z20rsGetElementAt_long213rs_allocationjjj", (void *)&SC_GetElementAt3_long2, true },
836    { "_Z20rsGetElementAt_long313rs_allocationjjj", (void *)&SC_GetElementAt3_long3, true },
837    { "_Z20rsGetElementAt_long413rs_allocationjjj", (void *)&SC_GetElementAt3_long4, true },
838
839    { "_Z20rsGetElementAt_float13rs_allocationcj", (void *)&SC_GetElementAt1_float, true },
840    { "_Z21rsGetElementAt_float213rs_allocationj", (void *)&SC_GetElementAt1_float2, true },
841    { "_Z21rsGetElementAt_float313rs_allocationj", (void *)&SC_GetElementAt1_float3, true },
842    { "_Z21rsGetElementAt_float413rs_allocationj", (void *)&SC_GetElementAt1_float4, true },
843    { "_Z20rsGetElementAt_float13rs_allocationjj", (void *)&SC_GetElementAt2_float, true },
844    { "_Z21rsGetElementAt_float213rs_allocationjj", (void *)&SC_GetElementAt2_float2, true },
845    { "_Z21rsGetElementAt_float313rs_allocationjj", (void *)&SC_GetElementAt2_float3, true },
846    { "_Z21rsGetElementAt_float413rs_allocationjj", (void *)&SC_GetElementAt2_float4, true },
847    { "_Z20rsGetElementAt_float13rs_allocationjjj", (void *)&SC_GetElementAt3_float, true },
848    { "_Z21rsGetElementAt_float213rs_allocationjjj", (void *)&SC_GetElementAt3_float2, true },
849    { "_Z21rsGetElementAt_float313rs_allocationjjj", (void *)&SC_GetElementAt3_float3, true },
850    { "_Z21rsGetElementAt_float413rs_allocationjjj", (void *)&SC_GetElementAt3_float4, true },
851
852    { "_Z21rsGetElementAt_double13rs_allocationcj", (void *)&SC_GetElementAt1_double, true },
853    { "_Z22rsGetElementAt_double213rs_allocationj", (void *)&SC_GetElementAt1_double2, true },
854    { "_Z22rsGetElementAt_double313rs_allocationj", (void *)&SC_GetElementAt1_double3, true },
855    { "_Z22rsGetElementAt_double413rs_allocationj", (void *)&SC_GetElementAt1_double4, true },
856    { "_Z21rsGetElementAt_double13rs_allocationjj", (void *)&SC_GetElementAt2_double, true },
857    { "_Z22rsGetElementAt_double213rs_allocationjj", (void *)&SC_GetElementAt2_double2, true },
858    { "_Z22rsGetElementAt_double313rs_allocationjj", (void *)&SC_GetElementAt2_double3, true },
859    { "_Z22rsGetElementAt_double413rs_allocationjj", (void *)&SC_GetElementAt2_double4, true },
860    { "_Z21rsGetElementAt_double13rs_allocationjjj", (void *)&SC_GetElementAt3_double, true },
861    { "_Z22rsGetElementAt_double213rs_allocationjjj", (void *)&SC_GetElementAt3_double2, true },
862    { "_Z22rsGetElementAt_double313rs_allocationjjj", (void *)&SC_GetElementAt3_double3, true },
863    { "_Z22rsGetElementAt_double413rs_allocationjjj", (void *)&SC_GetElementAt3_double4, true },
864
865
866
867    { "_Z20rsSetElementAt_uchar13rs_allocationhj", (void *)&SC_SetElementAt1_uchar, true },
868    { "_Z21rsSetElementAt_uchar213rs_allocationDv2_hj", (void *)&SC_SetElementAt1_uchar2, true },
869    { "_Z21rsSetElementAt_uchar313rs_allocationDv3_hj", (void *)&SC_SetElementAt1_uchar3, true },
870    { "_Z21rsSetElementAt_uchar413rs_allocationDv4_hj", (void *)&SC_SetElementAt1_uchar4, true },
871    { "_Z20rsSetElementAt_uchar13rs_allocationhjj", (void *)&SC_SetElementAt2_uchar, true },
872    { "_Z21rsSetElementAt_uchar213rs_allocationDv2_hjj", (void *)&SC_SetElementAt2_uchar2, true },
873    { "_Z21rsSetElementAt_uchar313rs_allocationDv3_hjj", (void *)&SC_SetElementAt2_uchar3, true },
874    { "_Z21rsSetElementAt_uchar413rs_allocationDv4_hjj", (void *)&SC_SetElementAt2_uchar4, true },
875    { "_Z20rsSetElementAt_uchar13rs_allocationhjjj", (void *)&SC_SetElementAt3_uchar, true },
876    { "_Z21rsSetElementAt_uchar213rs_allocationDv2_hjjj", (void *)&SC_SetElementAt3_uchar2, true },
877    { "_Z21rsSetElementAt_uchar313rs_allocationDv3_hjjj", (void *)&SC_SetElementAt3_uchar3, true },
878    { "_Z21rsSetElementAt_uchar413rs_allocationDv4_hjjj", (void *)&SC_SetElementAt3_uchar4, true },
879
880    { "_Z19rsSetElementAt_char13rs_allocationcj", (void *)&SC_SetElementAt1_char, true },
881    { "_Z20rsSetElementAt_char213rs_allocationDv2_cj", (void *)&SC_SetElementAt1_char2, true },
882    { "_Z20rsSetElementAt_char313rs_allocationDv3_cj", (void *)&SC_SetElementAt1_char3, true },
883    { "_Z20rsSetElementAt_char413rs_allocationDv4_cj", (void *)&SC_SetElementAt1_char4, true },
884    { "_Z19rsSetElementAt_char13rs_allocationcjj", (void *)&SC_SetElementAt2_char, true },
885    { "_Z20rsSetElementAt_char213rs_allocationDv2_cjj", (void *)&SC_SetElementAt2_char2, true },
886    { "_Z20rsSetElementAt_char313rs_allocationDv3_cjj", (void *)&SC_SetElementAt2_char3, true },
887    { "_Z20rsSetElementAt_char413rs_allocationDv4_cjj", (void *)&SC_SetElementAt2_char4, true },
888    { "_Z19rsSetElementAt_char13rs_allocationcjjj", (void *)&SC_SetElementAt3_char, true },
889    { "_Z20rsSetElementAt_char213rs_allocationDv2_cjjj", (void *)&SC_SetElementAt3_char2, true },
890    { "_Z20rsSetElementAt_char313rs_allocationDv3_cjjj", (void *)&SC_SetElementAt3_char3, true },
891    { "_Z20rsSetElementAt_char413rs_allocationDv4_cjjj", (void *)&SC_SetElementAt3_char4, true },
892
893    { "_Z21rsSetElementAt_ushort13rs_allocationht", (void *)&SC_SetElementAt1_ushort, true },
894    { "_Z22rsSetElementAt_ushort213rs_allocationDv2_tj", (void *)&SC_SetElementAt1_ushort2, true },
895    { "_Z22rsSetElementAt_ushort313rs_allocationDv3_tj", (void *)&SC_SetElementAt1_ushort3, true },
896    { "_Z22rsSetElementAt_ushort413rs_allocationDv4_tj", (void *)&SC_SetElementAt1_ushort4, true },
897    { "_Z21rsSetElementAt_ushort13rs_allocationtjj", (void *)&SC_SetElementAt2_ushort, true },
898    { "_Z22rsSetElementAt_ushort213rs_allocationDv2_tjj", (void *)&SC_SetElementAt2_ushort2, true },
899    { "_Z22rsSetElementAt_ushort313rs_allocationDv3_tjj", (void *)&SC_SetElementAt2_ushort3, true },
900    { "_Z22rsSetElementAt_ushort413rs_allocationDv4_tjj", (void *)&SC_SetElementAt2_ushort4, true },
901    { "_Z21rsSetElementAt_ushort13rs_allocationtjjj", (void *)&SC_SetElementAt3_ushort, true },
902    { "_Z22rsSetElementAt_ushort213rs_allocationDv2_tjjj", (void *)&SC_SetElementAt3_ushort2, true },
903    { "_Z22rsSetElementAt_ushort313rs_allocationDv3_tjjj", (void *)&SC_SetElementAt3_ushort3, true },
904    { "_Z22rsSetElementAt_ushort413rs_allocationDv4_tjjj", (void *)&SC_SetElementAt3_ushort4, true },
905
906    { "_Z20rsSetElementAt_short13rs_allocationsj", (void *)&SC_SetElementAt1_short, true },
907    { "_Z21rsSetElementAt_short213rs_allocationDv2_sj", (void *)&SC_SetElementAt1_short2, true },
908    { "_Z21rsSetElementAt_short313rs_allocationDv3_sj", (void *)&SC_SetElementAt1_short3, true },
909    { "_Z21rsSetElementAt_short413rs_allocationDv4_sj", (void *)&SC_SetElementAt1_short4, true },
910    { "_Z20rsSetElementAt_short13rs_allocationsjj", (void *)&SC_SetElementAt2_short, true },
911    { "_Z21rsSetElementAt_short213rs_allocationDv2_sjj", (void *)&SC_SetElementAt2_short2, true },
912    { "_Z21rsSetElementAt_short313rs_allocationDv3_sjj", (void *)&SC_SetElementAt2_short3, true },
913    { "_Z21rsSetElementAt_short413rs_allocationDv4_sjj", (void *)&SC_SetElementAt2_short4, true },
914    { "_Z20rsSetElementAt_short13rs_allocationsjjj", (void *)&SC_SetElementAt3_short, true },
915    { "_Z21rsSetElementAt_short213rs_allocationDv2_sjjj", (void *)&SC_SetElementAt3_short2, true },
916    { "_Z21rsSetElementAt_short313rs_allocationDv3_sjjj", (void *)&SC_SetElementAt3_short3, true },
917    { "_Z21rsSetElementAt_short413rs_allocationDv4_sjjj", (void *)&SC_SetElementAt3_short4, true },
918
919    { "_Z19rsSetElementAt_uint13rs_allocationjj", (void *)&SC_SetElementAt1_uint, true },
920    { "_Z20rsSetElementAt_uint213rs_allocationDv2_jj", (void *)&SC_SetElementAt1_uint2, true },
921    { "_Z20rsSetElementAt_uint313rs_allocationDv3_jj", (void *)&SC_SetElementAt1_uint3, true },
922    { "_Z20rsSetElementAt_uint413rs_allocationDv4_jj", (void *)&SC_SetElementAt1_uint4, true },
923    { "_Z19rsSetElementAt_uint13rs_allocationjjj", (void *)&SC_SetElementAt2_uint, true },
924    { "_Z20rsSetElementAt_uint213rs_allocationDv2_jjj", (void *)&SC_SetElementAt2_uint2, true },
925    { "_Z20rsSetElementAt_uint313rs_allocationDv3_jjj", (void *)&SC_SetElementAt2_uint3, true },
926    { "_Z20rsSetElementAt_uint413rs_allocationDv4_jjj", (void *)&SC_SetElementAt2_uint4, true },
927    { "_Z19rsSetElementAt_uint13rs_allocationjjjj", (void *)&SC_SetElementAt3_uint, true },
928    { "_Z20rsSetElementAt_uint213rs_allocationDv2_jjjj", (void *)&SC_SetElementAt3_uint2, true },
929    { "_Z20rsSetElementAt_uint313rs_allocationDv3_jjjj", (void *)&SC_SetElementAt3_uint3, true },
930    { "_Z20rsSetElementAt_uint413rs_allocationDv4_jjjj", (void *)&SC_SetElementAt3_uint4, true },
931
932    { "_Z19rsSetElementAt_int13rs_allocationij", (void *)&SC_SetElementAt1_int, true },
933    { "_Z19rsSetElementAt_int213rs_allocationDv2_ij", (void *)&SC_SetElementAt1_int2, true },
934    { "_Z19rsSetElementAt_int313rs_allocationDv3_ij", (void *)&SC_SetElementAt1_int3, true },
935    { "_Z19rsSetElementAt_int413rs_allocationDv4_ij", (void *)&SC_SetElementAt1_int4, true },
936    { "_Z18rsSetElementAt_int13rs_allocationijj", (void *)&SC_SetElementAt2_int, true },
937    { "_Z19rsSetElementAt_int213rs_allocationDv2_ijj", (void *)&SC_SetElementAt2_int2, true },
938    { "_Z19rsSetElementAt_int313rs_allocationDv3_ijj", (void *)&SC_SetElementAt2_int3, true },
939    { "_Z19rsSetElementAt_int413rs_allocationDv4_ijj", (void *)&SC_SetElementAt2_int4, true },
940    { "_Z18rsSetElementAt_int13rs_allocationijjj", (void *)&SC_SetElementAt3_int, true },
941    { "_Z19rsSetElementAt_int213rs_allocationDv2_ijjj", (void *)&SC_SetElementAt3_int2, true },
942    { "_Z19rsSetElementAt_int313rs_allocationDv3_ijjj", (void *)&SC_SetElementAt3_int3, true },
943    { "_Z19rsSetElementAt_int413rs_allocationDv4_ijjj", (void *)&SC_SetElementAt3_int4, true },
944
945    { "_Z20rsSetElementAt_ulong13rs_allocationmt", (void *)&SC_SetElementAt1_ulong, true },
946    { "_Z21rsSetElementAt_ulong213rs_allocationDv2_mj", (void *)&SC_SetElementAt1_ulong2, true },
947    { "_Z21rsSetElementAt_ulong313rs_allocationDv3_mj", (void *)&SC_SetElementAt1_ulong3, true },
948    { "_Z21rsSetElementAt_ulong413rs_allocationDv4_mj", (void *)&SC_SetElementAt1_ulong4, true },
949    { "_Z20rsSetElementAt_ulong13rs_allocationmjj", (void *)&SC_SetElementAt2_ulong, true },
950    { "_Z21rsSetElementAt_ulong213rs_allocationDv2_mjj", (void *)&SC_SetElementAt2_ulong2, true },
951    { "_Z21rsSetElementAt_ulong313rs_allocationDv3_mjj", (void *)&SC_SetElementAt2_ulong3, true },
952    { "_Z21rsSetElementAt_ulong413rs_allocationDv4_mjj", (void *)&SC_SetElementAt2_ulong4, true },
953    { "_Z20rsSetElementAt_ulong13rs_allocationmjjj", (void *)&SC_SetElementAt3_ulong, true },
954    { "_Z21rsSetElementAt_ulong213rs_allocationDv2_mjjj", (void *)&SC_SetElementAt3_ulong2, true },
955    { "_Z21rsSetElementAt_ulong313rs_allocationDv3_mjjj", (void *)&SC_SetElementAt3_ulong3, true },
956    { "_Z21rsSetElementAt_ulong413rs_allocationDv4_mjjj", (void *)&SC_SetElementAt3_ulong4, true },
957
958    { "_Z19rsSetElementAt_long13rs_allocationlj", (void *)&SC_SetElementAt1_long, true },
959    { "_Z20rsSetElementAt_long213rs_allocationDv2_lj", (void *)&SC_SetElementAt1_long2, true },
960    { "_Z20rsSetElementAt_long313rs_allocationDv3_lj", (void *)&SC_SetElementAt1_long3, true },
961    { "_Z20rsSetElementAt_long413rs_allocationDv4_lj", (void *)&SC_SetElementAt1_long4, true },
962    { "_Z19rsSetElementAt_long13rs_allocationljj", (void *)&SC_SetElementAt2_long, true },
963    { "_Z20rsSetElementAt_long213rs_allocationDv2_ljj", (void *)&SC_SetElementAt2_long2, true },
964    { "_Z20rsSetElementAt_long313rs_allocationDv3_ljj", (void *)&SC_SetElementAt2_long3, true },
965    { "_Z20rsSetElementAt_long413rs_allocationDv4_ljj", (void *)&SC_SetElementAt2_long4, true },
966    { "_Z19rsSetElementAt_long13rs_allocationljjj", (void *)&SC_SetElementAt3_long, true },
967    { "_Z20rsSetElementAt_long213rs_allocationDv2_ljjj", (void *)&SC_SetElementAt3_long2, true },
968    { "_Z20rsSetElementAt_long313rs_allocationDv3_ljjj", (void *)&SC_SetElementAt3_long3, true },
969    { "_Z20rsSetElementAt_long413rs_allocationDv4_ljjj", (void *)&SC_SetElementAt3_long4, true },
970
971    { "_Z20rsSetElementAt_float13rs_allocationft", (void *)&SC_SetElementAt1_float, true },
972    { "_Z21rsSetElementAt_float213rs_allocationDv2_fj", (void *)&SC_SetElementAt1_float2, true },
973    { "_Z21rsSetElementAt_float313rs_allocationDv3_fj", (void *)&SC_SetElementAt1_float3, true },
974    { "_Z21rsSetElementAt_float413rs_allocationDv4_fj", (void *)&SC_SetElementAt1_float4, true },
975    { "_Z20rsSetElementAt_float13rs_allocationfjj", (void *)&SC_SetElementAt2_float, true },
976    { "_Z21rsSetElementAt_float213rs_allocationDv2_fjj", (void *)&SC_SetElementAt2_float2, true },
977    { "_Z21rsSetElementAt_float313rs_allocationDv3_fjj", (void *)&SC_SetElementAt2_float3, true },
978    { "_Z21rsSetElementAt_float413rs_allocationDv4_fjj", (void *)&SC_SetElementAt2_float4, true },
979    { "_Z20rsSetElementAt_float13rs_allocationfjjj", (void *)&SC_SetElementAt3_float, true },
980    { "_Z21rsSetElementAt_float213rs_allocationDv2_fjjj", (void *)&SC_SetElementAt3_float2, true },
981    { "_Z21rsSetElementAt_float313rs_allocationDv3_fjjj", (void *)&SC_SetElementAt3_float3, true },
982    { "_Z21rsSetElementAt_float413rs_allocationDv4_fjjj", (void *)&SC_SetElementAt3_float4, true },
983
984    { "_Z21rsSetElementAt_double13rs_allocationdt", (void *)&SC_SetElementAt1_double, true },
985    { "_Z22rsSetElementAt_double213rs_allocationDv2_dj", (void *)&SC_SetElementAt1_double2, true },
986    { "_Z22rsSetElementAt_double313rs_allocationDv3_dj", (void *)&SC_SetElementAt1_double3, true },
987    { "_Z22rsSetElementAt_double413rs_allocationDv4_dj", (void *)&SC_SetElementAt1_double4, true },
988    { "_Z21rsSetElementAt_double13rs_allocationdjj", (void *)&SC_SetElementAt2_double, true },
989    { "_Z22rsSetElementAt_double213rs_allocationDv2_djj", (void *)&SC_SetElementAt2_double2, true },
990    { "_Z22rsSetElementAt_double313rs_allocationDv3_djj", (void *)&SC_SetElementAt2_double3, true },
991    { "_Z22rsSetElementAt_double413rs_allocationDv4_djj", (void *)&SC_SetElementAt2_double4, true },
992    { "_Z21rsSetElementAt_double13rs_allocationdjjj", (void *)&SC_SetElementAt3_double, true },
993    { "_Z22rsSetElementAt_double213rs_allocationDv2_djjj", (void *)&SC_SetElementAt3_double2, true },
994    { "_Z22rsSetElementAt_double313rs_allocationDv3_djjj", (void *)&SC_SetElementAt3_double3, true },
995    { "_Z22rsSetElementAt_double413rs_allocationDv4_djjj", (void *)&SC_SetElementAt3_double4, true },
996
997
998    // Refcounting
999    { "_Z11rsSetObjectP10rs_elementS_", (void *)&SC_SetObject, true },
1000    { "_Z13rsClearObjectP10rs_element", (void *)&SC_ClearObject, true },
1001    { "_Z10rsIsObject10rs_element", (void *)&SC_IsObject, true },
1002
1003    { "_Z11rsSetObjectP7rs_typeS_", (void *)&SC_SetObject, true },
1004    { "_Z13rsClearObjectP7rs_type", (void *)&SC_ClearObject, true },
1005    { "_Z10rsIsObject7rs_type", (void *)&SC_IsObject, true },
1006
1007    { "_Z11rsSetObjectP13rs_allocationS_", (void *)&SC_SetObject, true },
1008    { "_Z13rsClearObjectP13rs_allocation", (void *)&SC_ClearObject, true },
1009    { "_Z10rsIsObject13rs_allocation", (void *)&SC_IsObject, true },
1010
1011    { "_Z11rsSetObjectP10rs_samplerS_", (void *)&SC_SetObject, true },
1012    { "_Z13rsClearObjectP10rs_sampler", (void *)&SC_ClearObject, true },
1013    { "_Z10rsIsObject10rs_sampler", (void *)&SC_IsObject, true },
1014
1015    { "_Z11rsSetObjectP9rs_scriptS_", (void *)&SC_SetObject, true },
1016    { "_Z13rsClearObjectP9rs_script", (void *)&SC_ClearObject, true },
1017    { "_Z10rsIsObject9rs_script", (void *)&SC_IsObject, true },
1018
1019    { "_Z11rsSetObjectP7rs_pathS_", (void *)&SC_SetObject, true },
1020    { "_Z13rsClearObjectP7rs_path", (void *)&SC_ClearObject, true },
1021    { "_Z10rsIsObject7rs_path", (void *)&SC_IsObject, true },
1022
1023    { "_Z11rsSetObjectP7rs_meshS_", (void *)&SC_SetObject, true },
1024    { "_Z13rsClearObjectP7rs_mesh", (void *)&SC_ClearObject, true },
1025    { "_Z10rsIsObject7rs_mesh", (void *)&SC_IsObject, true },
1026
1027    { "_Z11rsSetObjectP19rs_program_fragmentS_", (void *)&SC_SetObject, true },
1028    { "_Z13rsClearObjectP19rs_program_fragment", (void *)&SC_ClearObject, true },
1029    { "_Z10rsIsObject19rs_program_fragment", (void *)&SC_IsObject, true },
1030
1031    { "_Z11rsSetObjectP17rs_program_vertexS_", (void *)&SC_SetObject, true },
1032    { "_Z13rsClearObjectP17rs_program_vertex", (void *)&SC_ClearObject, true },
1033    { "_Z10rsIsObject17rs_program_vertex", (void *)&SC_IsObject, true },
1034
1035    { "_Z11rsSetObjectP17rs_program_rasterS_", (void *)&SC_SetObject, true },
1036    { "_Z13rsClearObjectP17rs_program_raster", (void *)&SC_ClearObject, true },
1037    { "_Z10rsIsObject17rs_program_raster", (void *)&SC_IsObject, true },
1038
1039    { "_Z11rsSetObjectP16rs_program_storeS_", (void *)&SC_SetObject, true },
1040    { "_Z13rsClearObjectP16rs_program_store", (void *)&SC_ClearObject, true },
1041    { "_Z10rsIsObject16rs_program_store", (void *)&SC_IsObject, true },
1042
1043    { "_Z11rsSetObjectP7rs_fontS_", (void *)&SC_SetObject, true },
1044    { "_Z13rsClearObjectP7rs_font", (void *)&SC_ClearObject, true },
1045    { "_Z10rsIsObject7rs_font", (void *)&SC_IsObject, true },
1046
1047    // Allocation ops
1048    { "_Z21rsAllocationMarkDirty13rs_allocation", (void *)&SC_AllocationSyncAll, true },
1049    { "_Z20rsgAllocationSyncAll13rs_allocation", (void *)&SC_AllocationSyncAll, false },
1050    { "_Z20rsgAllocationSyncAll13rs_allocationj", (void *)&SC_AllocationSyncAll2, false },
1051    { "_Z20rsgAllocationSyncAll13rs_allocation24rs_allocation_usage_type", (void *)&SC_AllocationSyncAll2, false },
1052    { "_Z15rsGetAllocationPKv", (void *)&SC_GetAllocation, true },
1053    { "_Z18rsAllocationIoSend13rs_allocation", (void *)&SC_AllocationIoSend, false },
1054    { "_Z21rsAllocationIoReceive13rs_allocation", (void *)&SC_AllocationIoReceive, false },
1055    { "_Z23rsAllocationCopy1DRange13rs_allocationjjjS_jj", (void *)&SC_AllocationCopy1DRange, false },
1056    { "_Z23rsAllocationCopy2DRange13rs_allocationjjj26rs_allocation_cubemap_facejjS_jjjS0_", (void *)&SC_AllocationCopy2DRange, false },
1057
1058    // Messaging
1059
1060    { "_Z14rsSendToClienti", (void *)&SC_ToClient, false },
1061    { "_Z14rsSendToClientiPKvj", (void *)&SC_ToClient2, false },
1062    { "_Z22rsSendToClientBlockingi", (void *)&SC_ToClientBlocking, false },
1063    { "_Z22rsSendToClientBlockingiPKvj", (void *)&SC_ToClientBlocking2, false },
1064
1065    { "_Z22rsgBindProgramFragment19rs_program_fragment", (void *)&SC_BindProgramFragment, false },
1066    { "_Z19rsgBindProgramStore16rs_program_store", (void *)&SC_BindProgramStore, false },
1067    { "_Z20rsgBindProgramVertex17rs_program_vertex", (void *)&SC_BindProgramVertex, false },
1068    { "_Z20rsgBindProgramRaster17rs_program_raster", (void *)&SC_BindProgramRaster, false },
1069    { "_Z14rsgBindSampler19rs_program_fragmentj10rs_sampler", (void *)&SC_BindSampler, false },
1070    { "_Z14rsgBindTexture19rs_program_fragmentj13rs_allocation", (void *)&SC_BindTexture, false },
1071    { "_Z15rsgBindConstant19rs_program_fragmentj13rs_allocation", (void *)&SC_BindFragmentConstant, false },
1072    { "_Z15rsgBindConstant17rs_program_vertexj13rs_allocation", (void *)&SC_BindVertexConstant, false },
1073
1074    { "_Z36rsgProgramVertexLoadProjectionMatrixPK12rs_matrix4x4", (void *)&SC_VpLoadProjectionMatrix, false },
1075    { "_Z31rsgProgramVertexLoadModelMatrixPK12rs_matrix4x4", (void *)&SC_VpLoadModelMatrix, false },
1076    { "_Z33rsgProgramVertexLoadTextureMatrixPK12rs_matrix4x4", (void *)&SC_VpLoadTextureMatrix, false },
1077
1078    { "_Z35rsgProgramVertexGetProjectionMatrixP12rs_matrix4x4", (void *)&SC_VpGetProjectionMatrix, false },
1079
1080    { "_Z31rsgProgramFragmentConstantColor19rs_program_fragmentffff", (void *)&SC_PfConstantColor, false },
1081
1082    { "_Z11rsgGetWidthv", (void *)&SC_GetWidth, false },
1083    { "_Z12rsgGetHeightv", (void *)&SC_GetHeight, false },
1084
1085
1086    { "_Z11rsgDrawRectfffff", (void *)&SC_DrawRect, false },
1087    { "_Z11rsgDrawQuadffffffffffff", (void *)&SC_DrawQuad, false },
1088    { "_Z20rsgDrawQuadTexCoordsffffffffffffffffffff", (void *)&SC_DrawQuadTexCoords, false },
1089    { "_Z24rsgDrawSpriteScreenspacefffff", (void *)&SC_DrawSpriteScreenspace, false },
1090
1091    { "_Z11rsgDrawMesh7rs_mesh", (void *)&SC_DrawMesh, false },
1092    { "_Z11rsgDrawMesh7rs_meshj", (void *)&SC_DrawMeshPrimitive, false },
1093    { "_Z11rsgDrawMesh7rs_meshjjj", (void *)&SC_DrawMeshPrimitiveRange, false },
1094    { "_Z25rsgMeshComputeBoundingBox7rs_meshPfS0_S0_S0_S0_S0_", (void *)&SC_MeshComputeBoundingBox, false },
1095
1096    { "_Z11rsgDrawPath7rs_path", (void *)&SC_DrawPath, false },
1097
1098    { "_Z13rsgClearColorffff", (void *)&SC_ClearColor, false },
1099    { "_Z13rsgClearDepthf", (void *)&SC_ClearDepth, false },
1100
1101    { "_Z11rsgDrawTextPKcii", (void *)&SC_DrawText, false },
1102    { "_Z11rsgDrawText13rs_allocationii", (void *)&SC_DrawTextAlloc, false },
1103    { "_Z14rsgMeasureTextPKcPiS1_S1_S1_", (void *)&SC_MeasureText, false },
1104    { "_Z14rsgMeasureText13rs_allocationPiS0_S0_S0_", (void *)&SC_MeasureTextAlloc, false },
1105
1106    { "_Z11rsgBindFont7rs_font", (void *)&SC_BindFont, false },
1107    { "_Z12rsgFontColorffff", (void *)&SC_FontColor, false },
1108
1109    { "_Z18rsgBindColorTarget13rs_allocationj", (void *)&SC_BindFrameBufferObjectColorTarget, false },
1110    { "_Z18rsgBindDepthTarget13rs_allocation", (void *)&SC_BindFrameBufferObjectDepthTarget, false },
1111    { "_Z19rsgClearColorTargetj", (void *)&SC_ClearFrameBufferObjectColorTarget, false },
1112    { "_Z19rsgClearDepthTargetv", (void *)&SC_ClearFrameBufferObjectDepthTarget, false },
1113    { "_Z24rsgClearAllRenderTargetsv", (void *)&SC_ClearFrameBufferObjectTargets, false },
1114
1115    { "_Z9rsForEach9rs_script13rs_allocationS0_", (void *)&SC_ForEach_SAA, true },
1116    { "_Z9rsForEach9rs_script13rs_allocationS0_PKv", (void *)&SC_ForEach_SAAU, true },
1117    { "_Z9rsForEach9rs_script13rs_allocationS0_PKvPK14rs_script_call", (void *)&SC_ForEach_SAAUS, true },
1118    { "_Z9rsForEach9rs_script13rs_allocationS0_PKvj", (void *)&SC_ForEach_SAAUL, true },
1119    { "_Z9rsForEach9rs_script13rs_allocationS0_PKvjPK14rs_script_call", (void *)&SC_ForEach_SAAULS, true },
1120
1121    // time
1122    { "_Z6rsTimePi", (void *)&SC_Time, true },
1123    { "_Z11rsLocaltimeP5rs_tmPKi", (void *)&SC_LocalTime, true },
1124    { "_Z14rsUptimeMillisv", (void*)&SC_UptimeMillis, true },
1125    { "_Z13rsUptimeNanosv", (void*)&SC_UptimeNanos, true },
1126    { "_Z7rsGetDtv", (void*)&SC_GetDt, false },
1127
1128    // misc
1129    { "_Z5colorffff", (void *)&SC_Color, false },
1130    { "_Z9rsgFinishv", (void *)&SC_Finish, false },
1131
1132    { NULL, NULL, false }
1133};
1134
1135
1136extern const RsdCpuReference::CpuSymbol * rsdLookupRuntimeStub(Context * pContext, char const* name) {
1137    ScriptC *s = (ScriptC *)pContext;
1138    const RsdCpuReference::CpuSymbol *syms = gSyms;
1139    const RsdCpuReference::CpuSymbol *sym = NULL;
1140
1141    if (!sym) {
1142        while (syms->fnPtr) {
1143            if (!strcmp(syms->name, name)) {
1144                return syms;
1145            }
1146            syms++;
1147        }
1148    }
1149
1150    return NULL;
1151}
1152
1153
1154