rsdRuntimeStubs.cpp revision cbdb6480528fc374144df1ae9c604c9100d33268
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 "rsdCore.h"
25#include "rsdBcc.h"
26
27#include "rsdPath.h"
28#include "rsdAllocation.h"
29#include "rsdShaderCache.h"
30#include "rsdVertexArray.h"
31
32#include <time.h>
33
34using namespace android;
35using namespace android::renderscript;
36
37typedef float float2 __attribute__((ext_vector_type(2)));
38typedef float float3 __attribute__((ext_vector_type(3)));
39typedef float float4 __attribute__((ext_vector_type(4)));
40typedef double double2 __attribute__((ext_vector_type(2)));
41typedef double double3 __attribute__((ext_vector_type(3)));
42typedef double double4 __attribute__((ext_vector_type(4)));
43typedef char char2 __attribute__((ext_vector_type(2)));
44typedef char char3 __attribute__((ext_vector_type(3)));
45typedef char char4 __attribute__((ext_vector_type(4)));
46typedef unsigned char uchar2 __attribute__((ext_vector_type(2)));
47typedef unsigned char uchar3 __attribute__((ext_vector_type(3)));
48typedef unsigned char uchar4 __attribute__((ext_vector_type(4)));
49typedef int16_t short2 __attribute__((ext_vector_type(2)));
50typedef int16_t short3 __attribute__((ext_vector_type(3)));
51typedef int16_t short4 __attribute__((ext_vector_type(4)));
52typedef uint16_t ushort2 __attribute__((ext_vector_type(2)));
53typedef uint16_t ushort3 __attribute__((ext_vector_type(3)));
54typedef uint16_t ushort4 __attribute__((ext_vector_type(4)));
55typedef int32_t int2 __attribute__((ext_vector_type(2)));
56typedef int32_t int3 __attribute__((ext_vector_type(3)));
57typedef int32_t int4 __attribute__((ext_vector_type(4)));
58typedef uint32_t uint2 __attribute__((ext_vector_type(2)));
59typedef uint32_t uint3 __attribute__((ext_vector_type(3)));
60typedef uint32_t uint4 __attribute__((ext_vector_type(4)));
61typedef int64_t long2 __attribute__((ext_vector_type(2)));
62typedef int64_t long3 __attribute__((ext_vector_type(3)));
63typedef int64_t long4 __attribute__((ext_vector_type(4)));
64typedef uint64_t ulong2 __attribute__((ext_vector_type(2)));
65typedef uint64_t ulong3 __attribute__((ext_vector_type(3)));
66typedef uint64_t ulong4 __attribute__((ext_vector_type(4)));
67
68typedef uint8_t uchar;
69typedef uint16_t ushort;
70typedef uint32_t uint;
71#ifndef RS_SERVER
72typedef uint64_t ulong;
73#endif
74
75#ifdef RS_COMPATIBILITY_LIB
76#define OPAQUETYPE(t) \
77    typedef struct { const int* const p; } __attribute__((packed, aligned(4))) t;
78
79OPAQUETYPE(rs_element)
80OPAQUETYPE(rs_type)
81OPAQUETYPE(rs_allocation)
82OPAQUETYPE(rs_sampler)
83OPAQUETYPE(rs_script)
84OPAQUETYPE(rs_script_call)
85#undef OPAQUETYPE
86
87typedef enum {
88    // Empty to avoid conflicting definitions with RsAllocationCubemapFace
89} rs_allocation_cubemap_face;
90
91typedef struct {
92    int tm_sec;     ///< seconds
93    int tm_min;     ///< minutes
94    int tm_hour;    ///< hours
95    int tm_mday;    ///< day of the month
96    int tm_mon;     ///< month
97    int tm_year;    ///< year
98    int tm_wday;    ///< day of the week
99    int tm_yday;    ///< day of the year
100    int tm_isdst;   ///< daylight savings time
101} rs_tm;
102#endif
103
104//////////////////////////////////////////////////////////////////////////////
105// Allocation
106//////////////////////////////////////////////////////////////////////////////
107
108
109static void SC_AllocationSyncAll2(android::renderscript::rs_allocation a, RsAllocationUsageType source) {
110    Context *rsc = RsdCpuReference::getTlsContext();
111    rsrAllocationSyncAll(rsc, (Allocation*)a.p, source);
112}
113
114static void SC_AllocationSyncAll(android::renderscript::rs_allocation a) {
115    Context *rsc = RsdCpuReference::getTlsContext();
116    rsrAllocationSyncAll(rsc, (Allocation*)a.p, RS_ALLOCATION_USAGE_SCRIPT);
117}
118
119#ifndef RS_COMPATIBILITY_LIB
120
121static void SC_AllocationCopy1DRange(android::renderscript::rs_allocation dstAlloc,
122                                     uint32_t dstOff,
123                                     uint32_t dstMip,
124                                     uint32_t count,
125                                     android::renderscript::rs_allocation srcAlloc,
126                                     uint32_t srcOff, uint32_t srcMip) {
127    Context *rsc = RsdCpuReference::getTlsContext();
128    rsrAllocationCopy1DRange(rsc, (Allocation*)dstAlloc.p, dstOff, dstMip, count,
129                             (Allocation*)srcAlloc.p, srcOff, srcMip);
130}
131
132static void SC_AllocationCopy2DRange(android::renderscript::rs_allocation dstAlloc,
133                                     uint32_t dstXoff, uint32_t dstYoff,
134                                     uint32_t dstMip, uint32_t dstFace,
135                                     uint32_t width, uint32_t height,
136                                     android::renderscript::rs_allocation srcAlloc,
137                                     uint32_t srcXoff, uint32_t srcYoff,
138                                     uint32_t srcMip, uint32_t srcFace) {
139    Context *rsc = RsdCpuReference::getTlsContext();
140    rsrAllocationCopy2DRange(rsc, (Allocation*)dstAlloc.p,
141                             dstXoff, dstYoff, dstMip, dstFace,
142                             width, height,
143                             (Allocation*)srcAlloc.p,
144                             srcXoff, srcYoff, srcMip, srcFace);
145}
146
147static void SC_AllocationIoSend(android::renderscript::rs_allocation alloc) {
148    Context *rsc = RsdCpuReference::getTlsContext();
149    rsrAllocationIoSend(rsc, (Allocation*)alloc.p);
150}
151
152
153static void SC_AllocationIoReceive(android::renderscript::rs_allocation alloc) {
154    Context *rsc = RsdCpuReference::getTlsContext();
155    rsrAllocationIoReceive(rsc, (Allocation*)alloc.p);
156}
157
158#else
159
160static void SC_AllocationCopy1DRange(::rs_allocation dstAlloc,
161                                     uint32_t dstOff,
162                                     uint32_t dstMip,
163                                     uint32_t count,
164                                     ::rs_allocation srcAlloc,
165                                     uint32_t srcOff, uint32_t srcMip) {
166    Context *rsc = RsdCpuReference::getTlsContext();
167    rsrAllocationCopy1DRange(rsc, (Allocation*)dstAlloc.p, dstOff, dstMip, count,
168                             (Allocation*)srcAlloc.p, srcOff, srcMip);
169}
170
171static void SC_AllocationCopy2DRange(::rs_allocation dstAlloc,
172                                     uint32_t dstXoff, uint32_t dstYoff,
173                                     uint32_t dstMip, uint32_t dstFace,
174                                     uint32_t width, uint32_t height,
175                                     ::rs_allocation srcAlloc,
176                                     uint32_t srcXoff, uint32_t srcYoff,
177                                     uint32_t srcMip, uint32_t srcFace) {
178    Context *rsc = RsdCpuReference::getTlsContext();
179    rsrAllocationCopy2DRange(rsc, (Allocation*)dstAlloc.p,
180                             dstXoff, dstYoff, dstMip, dstFace,
181                             width, height,
182                             (Allocation*)srcAlloc.p,
183                             srcXoff, srcYoff, srcMip, srcFace);
184}
185
186static void SC_AllocationIoSend(Allocation* alloc) {
187    Context *rsc = RsdCpuReference::getTlsContext();
188    rsrAllocationIoSend(rsc, alloc);
189}
190
191
192static void SC_AllocationIoReceive(Allocation* alloc) {
193    Context *rsc = RsdCpuReference::getTlsContext();
194    rsrAllocationIoReceive(rsc, alloc);
195}
196
197#endif
198
199#ifndef RS_COMPATIBILITY_LIB
200
201//////////////////////////////////////////////////////////////////////////////
202// Context
203//////////////////////////////////////////////////////////////////////////////
204
205static void SC_BindTexture(ProgramFragment *pf, uint32_t slot, Allocation *a) {
206    Context *rsc = RsdCpuReference::getTlsContext();
207    rsrBindTexture(rsc, pf, slot, a);
208}
209
210static void SC_BindVertexConstant(ProgramVertex *pv, uint32_t slot, Allocation *a) {
211    Context *rsc = RsdCpuReference::getTlsContext();
212    rsrBindConstant(rsc, pv, slot, a);
213}
214
215static void SC_BindFragmentConstant(ProgramFragment *pf, uint32_t slot, Allocation *a) {
216    Context *rsc = RsdCpuReference::getTlsContext();
217    rsrBindConstant(rsc, pf, slot, a);
218}
219
220static void SC_BindSampler(ProgramFragment *pf, uint32_t slot, Sampler *s) {
221    Context *rsc = RsdCpuReference::getTlsContext();
222    rsrBindSampler(rsc, pf, slot, s);
223}
224
225static void SC_BindProgramStore(ProgramStore *ps) {
226    Context *rsc = RsdCpuReference::getTlsContext();
227    rsrBindProgramStore(rsc, ps);
228}
229
230static void SC_BindProgramFragment(ProgramFragment *pf) {
231    Context *rsc = RsdCpuReference::getTlsContext();
232    rsrBindProgramFragment(rsc, pf);
233}
234
235static void SC_BindProgramVertex(ProgramVertex *pv) {
236    Context *rsc = RsdCpuReference::getTlsContext();
237    rsrBindProgramVertex(rsc, pv);
238}
239
240static void SC_BindProgramRaster(ProgramRaster *pr) {
241    Context *rsc = RsdCpuReference::getTlsContext();
242    rsrBindProgramRaster(rsc, pr);
243}
244
245static void SC_BindFrameBufferObjectColorTarget(Allocation *a, uint32_t slot) {
246    Context *rsc = RsdCpuReference::getTlsContext();
247    rsrBindFrameBufferObjectColorTarget(rsc, a, slot);
248}
249
250static void SC_BindFrameBufferObjectDepthTarget(Allocation *a) {
251    Context *rsc = RsdCpuReference::getTlsContext();
252    rsrBindFrameBufferObjectDepthTarget(rsc, a);
253}
254
255static void SC_ClearFrameBufferObjectColorTarget(uint32_t slot) {
256    Context *rsc = RsdCpuReference::getTlsContext();
257    rsrClearFrameBufferObjectColorTarget(rsc, slot);
258}
259
260static void SC_ClearFrameBufferObjectDepthTarget(Context *, Script *) {
261    Context *rsc = RsdCpuReference::getTlsContext();
262    rsrClearFrameBufferObjectDepthTarget(rsc);
263}
264
265static void SC_ClearFrameBufferObjectTargets(Context *, Script *) {
266    Context *rsc = RsdCpuReference::getTlsContext();
267    rsrClearFrameBufferObjectTargets(rsc);
268}
269
270
271//////////////////////////////////////////////////////////////////////////////
272// VP
273//////////////////////////////////////////////////////////////////////////////
274
275static void SC_VpLoadProjectionMatrix(const rsc_Matrix *m) {
276    Context *rsc = RsdCpuReference::getTlsContext();
277    rsrVpLoadProjectionMatrix(rsc, m);
278}
279
280static void SC_VpLoadModelMatrix(const rsc_Matrix *m) {
281    Context *rsc = RsdCpuReference::getTlsContext();
282    rsrVpLoadModelMatrix(rsc, m);
283}
284
285static void SC_VpLoadTextureMatrix(const rsc_Matrix *m) {
286    Context *rsc = RsdCpuReference::getTlsContext();
287    rsrVpLoadTextureMatrix(rsc, m);
288}
289
290static void SC_PfConstantColor(ProgramFragment *pf, float r, float g, float b, float a) {
291    Context *rsc = RsdCpuReference::getTlsContext();
292    rsrPfConstantColor(rsc, pf, r, g, b, a);
293}
294
295static void SC_VpGetProjectionMatrix(rsc_Matrix *m) {
296    Context *rsc = RsdCpuReference::getTlsContext();
297    rsrVpGetProjectionMatrix(rsc, m);
298}
299
300
301//////////////////////////////////////////////////////////////////////////////
302// Drawing
303//////////////////////////////////////////////////////////////////////////////
304
305static void SC_DrawQuadTexCoords(float x1, float y1, float z1, float u1, float v1,
306                                 float x2, float y2, float z2, float u2, float v2,
307                                 float x3, float y3, float z3, float u3, float v3,
308                                 float x4, float y4, float z4, float u4, float v4) {
309    Context *rsc = RsdCpuReference::getTlsContext();
310
311    if (!rsc->setupCheck()) {
312        return;
313    }
314
315    RsdHal *dc = (RsdHal *)rsc->mHal.drv;
316    if (!dc->gl.shaderCache->setup(rsc)) {
317        return;
318    }
319
320    //ALOGE("Quad");
321    //ALOGE("%4.2f, %4.2f, %4.2f", x1, y1, z1);
322    //ALOGE("%4.2f, %4.2f, %4.2f", x2, y2, z2);
323    //ALOGE("%4.2f, %4.2f, %4.2f", x3, y3, z3);
324    //ALOGE("%4.2f, %4.2f, %4.2f", x4, y4, z4);
325
326    float vtx[] = {x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4};
327    const float tex[] = {u1,v1, u2,v2, u3,v3, u4,v4};
328
329    RsdVertexArray::Attrib attribs[2];
330    attribs[0].set(GL_FLOAT, 3, 12, false, (size_t)vtx, "ATTRIB_position");
331    attribs[1].set(GL_FLOAT, 2, 8, false, (size_t)tex, "ATTRIB_texture0");
332
333    RsdVertexArray va(attribs, 2);
334    va.setup(rsc);
335
336    RSD_CALL_GL(glDrawArrays, GL_TRIANGLE_FAN, 0, 4);
337}
338
339static void SC_DrawQuad(float x1, float y1, float z1,
340                        float x2, float y2, float z2,
341                        float x3, float y3, float z3,
342                        float x4, float y4, float z4) {
343    SC_DrawQuadTexCoords(x1, y1, z1, 0, 1,
344                         x2, y2, z2, 1, 1,
345                         x3, y3, z3, 1, 0,
346                         x4, y4, z4, 0, 0);
347}
348
349static void SC_DrawSpriteScreenspace(float x, float y, float z, float w, float h) {
350    Context *rsc = RsdCpuReference::getTlsContext();
351
352    ObjectBaseRef<const ProgramVertex> tmp(rsc->getProgramVertex());
353    rsc->setProgramVertex(rsc->getDefaultProgramVertex());
354    //rsc->setupCheck();
355
356    //GLint crop[4] = {0, h, w, -h};
357
358    float sh = rsc->getHeight();
359
360    SC_DrawQuad(x,   sh - y,     z,
361                x+w, sh - y,     z,
362                x+w, sh - (y+h), z,
363                x,   sh - (y+h), z);
364    rsc->setProgramVertex((ProgramVertex *)tmp.get());
365}
366
367static void SC_DrawRect(float x1, float y1, float x2, float y2, float z) {
368    SC_DrawQuad(x1, y2, z, x2, y2, z, x2, y1, z, x1, y1, z);
369}
370
371static void SC_DrawPath(Path *p) {
372    Context *rsc = RsdCpuReference::getTlsContext();
373    rsdPathDraw(rsc, p);
374}
375
376static void SC_DrawMesh(Mesh *m) {
377    Context *rsc = RsdCpuReference::getTlsContext();
378    rsrDrawMesh(rsc, m);
379}
380
381static void SC_DrawMeshPrimitive(Mesh *m, uint32_t primIndex) {
382    Context *rsc = RsdCpuReference::getTlsContext();
383    rsrDrawMeshPrimitive(rsc, m, primIndex);
384}
385
386static void SC_DrawMeshPrimitiveRange(Mesh *m, uint32_t primIndex, uint32_t start, uint32_t len) {
387    Context *rsc = RsdCpuReference::getTlsContext();
388    rsrDrawMeshPrimitiveRange(rsc, m, primIndex, start, len);
389}
390
391static void SC_MeshComputeBoundingBox(Mesh *m,
392                               float *minX, float *minY, float *minZ,
393                               float *maxX, float *maxY, float *maxZ) {
394    Context *rsc = RsdCpuReference::getTlsContext();
395    rsrMeshComputeBoundingBox(rsc, m, minX, minY, minZ, maxX, maxY, maxZ);
396}
397
398
399
400//////////////////////////////////////////////////////////////////////////////
401//
402//////////////////////////////////////////////////////////////////////////////
403
404
405static void SC_Color(float r, float g, float b, float a) {
406    Context *rsc = RsdCpuReference::getTlsContext();
407    rsrColor(rsc, r, g, b, a);
408}
409
410static void SC_Finish() {
411    Context *rsc = RsdCpuReference::getTlsContext();
412    rsdGLFinish(rsc);
413}
414
415static void SC_ClearColor(float r, float g, float b, float a) {
416    Context *rsc = RsdCpuReference::getTlsContext();
417    rsrPrepareClear(rsc);
418    rsdGLClearColor(rsc, r, g, b, a);
419}
420
421static void SC_ClearDepth(float v) {
422    Context *rsc = RsdCpuReference::getTlsContext();
423    rsrPrepareClear(rsc);
424    rsdGLClearDepth(rsc, v);
425}
426
427static uint32_t SC_GetWidth() {
428    Context *rsc = RsdCpuReference::getTlsContext();
429    return rsrGetWidth(rsc);
430}
431
432static uint32_t SC_GetHeight() {
433    Context *rsc = RsdCpuReference::getTlsContext();
434    return rsrGetHeight(rsc);
435}
436
437static void SC_DrawTextAlloc(Allocation *a, int x, int y) {
438    Context *rsc = RsdCpuReference::getTlsContext();
439    rsrDrawTextAlloc(rsc, a, x, y);
440}
441
442static void SC_DrawText(const char *text, int x, int y) {
443    Context *rsc = RsdCpuReference::getTlsContext();
444    rsrDrawText(rsc, text, x, y);
445}
446
447static void SC_MeasureTextAlloc(Allocation *a,
448                         int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
449    Context *rsc = RsdCpuReference::getTlsContext();
450    rsrMeasureTextAlloc(rsc, a, left, right, top, bottom);
451}
452
453static void SC_MeasureText(const char *text,
454                    int32_t *left, int32_t *right, int32_t *top, int32_t *bottom) {
455    Context *rsc = RsdCpuReference::getTlsContext();
456    rsrMeasureText(rsc, text, left, right, top, bottom);
457}
458
459static void SC_BindFont(Font *f) {
460    Context *rsc = RsdCpuReference::getTlsContext();
461    rsrBindFont(rsc, f);
462}
463
464static void SC_FontColor(float r, float g, float b, float a) {
465    Context *rsc = RsdCpuReference::getTlsContext();
466    rsrFontColor(rsc, r, g, b, a);
467}
468#endif
469
470
471//////////////////////////////////////////////////////////////////////////////
472//
473//////////////////////////////////////////////////////////////////////////////
474
475static void SC_ClearObject(rs_object_base *dst) {
476    Context *rsc = RsdCpuReference::getTlsContext();
477    rsrClearObject(rsc, dst);
478}
479#ifndef RS_COMPATIBILITY_LIB
480static void SC_SetObject(rs_object_base *dst, rs_object_base  src) {
481    //    ALOGE("SC_SetObject: dst = %p, src = %p", dst, src.p);
482    //    ALOGE("SC_SetObject: dst[0] = %p", dst[0]);
483    Context *rsc = RsdCpuReference::getTlsContext();
484    rsrSetObject(rsc, dst, (ObjectBase*)src.p);
485}
486
487#ifdef __LP64__
488static void SC_SetObject_ByRef(rs_object_base *dst, rs_object_base *src) {
489    //    ALOGE("SC_SetObject2: dst = %p, src = %p", dst, src->p);
490    Context *rsc = RsdCpuReference::getTlsContext();
491    rsrSetObject(rsc, dst, (ObjectBase*)src->p);
492}
493#endif
494
495static bool SC_IsObject(rs_object_base o) {
496    Context *rsc = RsdCpuReference::getTlsContext();
497    return rsrIsObject(rsc, o);
498}
499
500#ifdef __LP64__
501static bool SC_IsObject_ByRef(rs_object_base *o) {
502    Context *rsc = RsdCpuReference::getTlsContext();
503    return rsrIsObject(rsc, *o);
504}
505#endif
506
507#else
508static void SC_SetObject(rs_object_base *dst, ObjectBase*  src) {
509    //    ALOGE("SC_SetObject: dst = %p, src = %p", dst, src.p);
510    //    ALOGE("SC_SetObject: dst[0] = %p", dst[0]);
511    Context *rsc = RsdCpuReference::getTlsContext();
512    rsrSetObject(rsc, dst, src);
513}
514
515static bool SC_IsObject(ObjectBase* o) {
516    Context *rsc = RsdCpuReference::getTlsContext();
517    return rsrIsObject(rsc, o);
518}
519#endif
520
521
522#ifndef RS_COMPATIBILITY_LIB
523#ifndef __LP64__
524
525// i386 has different struct return passing to ARM; emulate with void*
526#ifdef __i386__
527static const void* SC_GetAllocation(const void *ptr) {
528    Context *rsc = RsdCpuReference::getTlsContext();
529    const Script *sc = RsdCpuReference::getTlsScript();
530    Allocation* alloc = rsdScriptGetAllocationForPointer(rsc, sc, ptr);
531    android::renderscript::rs_allocation obj = {0};
532    alloc->callUpdateCacheObject(rsc, &obj);
533    return (void*)obj.p;
534}
535#else
536// ARMv7/MIPS
537static const android::renderscript::rs_allocation SC_GetAllocation(const void *ptr) {
538    Context *rsc = RsdCpuReference::getTlsContext();
539    const Script *sc = RsdCpuReference::getTlsScript();
540    Allocation* alloc = rsdScriptGetAllocationForPointer(rsc, sc, ptr);
541    android::renderscript::rs_allocation obj = {0};
542    alloc->callUpdateCacheObject(rsc, &obj);
543    return obj;
544}
545#endif
546#else
547// AArch64/x86_64/MIPS64
548static const android::renderscript::rs_allocation SC_GetAllocation(const void *ptr) {
549    Context *rsc = RsdCpuReference::getTlsContext();
550    const Script *sc = RsdCpuReference::getTlsScript();
551    Allocation* alloc = rsdScriptGetAllocationForPointer(rsc, sc, ptr);
552    android::renderscript::rs_allocation obj = {0, 0, 0, 0};
553    alloc->callUpdateCacheObject(rsc, &obj);
554    return obj;
555}
556#endif
557#endif
558
559#ifndef RS_COMPATIBILITY_LIB
560#ifndef __LP64__
561static void SC_ForEach_SAA(android::renderscript::rs_script target,
562                            android::renderscript::rs_allocation in,
563                            android::renderscript::rs_allocation out) {
564    Context *rsc = RsdCpuReference::getTlsContext();
565    rsrForEach(rsc, (Script*)target.p, (Allocation*)in.p, (Allocation*)out.p, NULL, 0, NULL);
566}
567#else
568static void SC_ForEach_SAA(android::renderscript::rs_script *target,
569                            android::renderscript::rs_allocation *in,
570                            android::renderscript::rs_allocation *out) {
571    Context *rsc = RsdCpuReference::getTlsContext();
572    rsrForEach(rsc, (Script*)target->p, (Allocation*)in->p, (Allocation*)out->p, NULL, 0, NULL);
573}
574#endif
575
576#ifndef __LP64__
577static void SC_ForEach_SAAU(android::renderscript::rs_script target,
578                            android::renderscript::rs_allocation in,
579                            android::renderscript::rs_allocation out,
580                            const void *usr) {
581    Context *rsc = RsdCpuReference::getTlsContext();
582    rsrForEach(rsc, (Script*)target.p, (Allocation*)in.p, (Allocation*)out.p, usr, 0, NULL);
583}
584#else
585static void SC_ForEach_SAAU(android::renderscript::rs_script *target,
586                            android::renderscript::rs_allocation *in,
587                            android::renderscript::rs_allocation *out,
588                            const void *usr) {
589    Context *rsc = RsdCpuReference::getTlsContext();
590    rsrForEach(rsc, (Script*)target->p, (Allocation*)in->p, (Allocation*)out->p, usr, 0, NULL);
591}
592#endif
593
594#ifndef __LP64__
595static void SC_ForEach_SAAUS(android::renderscript::rs_script target,
596                             android::renderscript::rs_allocation in,
597                             android::renderscript::rs_allocation out,
598                             const void *usr,
599                             const RsScriptCall *call) {
600    Context *rsc = RsdCpuReference::getTlsContext();
601    rsrForEach(rsc, (Script*)target.p, (Allocation*)in.p, (Allocation*)out.p, usr, 0, call);
602}
603#else
604static void SC_ForEach_SAAUS(android::renderscript::rs_script *target,
605                             android::renderscript::rs_allocation *in,
606                             android::renderscript::rs_allocation *out,
607                             const void *usr,
608                             const RsScriptCall *call) {
609    Context *rsc = RsdCpuReference::getTlsContext();
610    rsrForEach(rsc, (Script*)target->p, (Allocation*)in->p, (Allocation*)out->p, usr, 0, call);
611}
612#endif
613
614#ifndef __LP64__
615static void SC_ForEach_SAAUL(android::renderscript::rs_script target,
616                             android::renderscript::rs_allocation in,
617                             android::renderscript::rs_allocation out,
618                             const void *usr,
619                             uint32_t usrLen) {
620    Context *rsc = RsdCpuReference::getTlsContext();
621    rsrForEach(rsc, (Script*)target.p, (Allocation*)in.p, (Allocation*)out.p, usr, usrLen, NULL);
622}
623#else
624static void SC_ForEach_SAAUL(android::renderscript::rs_script *target,
625                             android::renderscript::rs_allocation *in,
626                             android::renderscript::rs_allocation *out,
627                             const void *usr,
628                             uint32_t usrLen) {
629    Context *rsc = RsdCpuReference::getTlsContext();
630    rsrForEach(rsc, (Script*)target->p, (Allocation*)in->p, (Allocation*)out->p, usr, usrLen, NULL);
631}
632#endif
633
634#ifndef __LP64__
635static void SC_ForEach_SAAULS(android::renderscript::rs_script target,
636                              android::renderscript::rs_allocation in,
637                              android::renderscript::rs_allocation out,
638                              const void *usr,
639                              uint32_t usrLen,
640                              const RsScriptCall *call) {
641    Context *rsc = RsdCpuReference::getTlsContext();
642    rsrForEach(rsc, (Script*)target.p, (Allocation*)in.p, (Allocation*)out.p, usr, usrLen, call);
643}
644#else
645static void SC_ForEach_SAAULS(android::renderscript::rs_script *target,
646                              android::renderscript::rs_allocation *in,
647                              android::renderscript::rs_allocation *out,
648                              const void *usr,
649                              uint32_t usrLen,
650                              const RsScriptCall *call) {
651    Context *rsc = RsdCpuReference::getTlsContext();
652    rsrForEach(rsc, (Script*)target->p, (Allocation*)in->p, (Allocation*)out->p, usr, usrLen, call);
653}
654#endif
655#endif
656
657
658//////////////////////////////////////////////////////////////////////////////
659// Time routines
660//////////////////////////////////////////////////////////////////////////////
661
662static float SC_GetDt() {
663    Context *rsc = RsdCpuReference::getTlsContext();
664    const Script *sc = RsdCpuReference::getTlsScript();
665    return rsrGetDt(rsc, sc);
666}
667
668#ifndef RS_COMPATIBILITY_LIB
669time_t SC_Time(time_t *timer) {
670    Context *rsc = RsdCpuReference::getTlsContext();
671    return rsrTime(rsc, timer);
672}
673#else
674static int SC_Time(int *timer) {
675    Context *rsc = RsdCpuReference::getTlsContext();
676    return rsrTime(rsc, (long*)timer);
677}
678#endif
679
680tm* SC_LocalTime(tm *local, time_t *timer) {
681    Context *rsc = RsdCpuReference::getTlsContext();
682    return rsrLocalTime(rsc, local, timer);
683}
684
685int64_t SC_UptimeMillis() {
686    Context *rsc = RsdCpuReference::getTlsContext();
687    return rsrUptimeMillis(rsc);
688}
689
690int64_t SC_UptimeNanos() {
691    Context *rsc = RsdCpuReference::getTlsContext();
692    return rsrUptimeNanos(rsc);
693}
694
695//////////////////////////////////////////////////////////////////////////////
696// Message routines
697//////////////////////////////////////////////////////////////////////////////
698
699static uint32_t SC_ToClient2(int cmdID, const void *data, uint32_t len) {
700    Context *rsc = RsdCpuReference::getTlsContext();
701    return rsrToClient(rsc, cmdID, data, len);
702}
703
704static uint32_t SC_ToClient(int cmdID) {
705    Context *rsc = RsdCpuReference::getTlsContext();
706    return rsrToClient(rsc, cmdID, (const void *)NULL, 0);
707}
708
709static uint32_t SC_ToClientBlocking2(int cmdID, const void *data, uint32_t len) {
710    Context *rsc = RsdCpuReference::getTlsContext();
711    return rsrToClientBlocking(rsc, cmdID, data, len);
712}
713
714static uint32_t SC_ToClientBlocking(int cmdID) {
715    Context *rsc = RsdCpuReference::getTlsContext();
716    return rsrToClientBlocking(rsc, cmdID, (const void *)NULL, 0);
717}
718
719
720static void * ElementAt1D(Allocation *a, RsDataType dt, uint32_t vecSize, uint32_t x) {
721    Context *rsc = RsdCpuReference::getTlsContext();
722    const Type *t = a->getType();
723    const Element *e = t->getElement();
724
725    char buf[256];
726    if (x >= t->getLODDimX(0)) {
727        sprintf(buf, "Out range ElementAt X %i of %i", x, t->getLODDimX(0));
728        rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
729        return NULL;
730    }
731
732    if (vecSize > 0) {
733        if (vecSize != e->getVectorSize()) {
734            sprintf(buf, "Vector size mismatch for ElementAt %i of %i", vecSize, e->getVectorSize());
735            rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
736            return NULL;
737        }
738
739        if (dt != e->getType()) {
740            sprintf(buf, "Data type mismatch for ElementAt %i of %i", dt, e->getType());
741            rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
742            return NULL;
743        }
744    }
745
746    uint8_t *p = (uint8_t *)a->mHal.drvState.lod[0].mallocPtr;
747    const uint32_t eSize = e->getSizeBytes();
748    return &p[(eSize * x)];
749}
750
751static void * ElementAt2D(Allocation *a, RsDataType dt, uint32_t vecSize, uint32_t x, uint32_t y) {
752    Context *rsc = RsdCpuReference::getTlsContext();
753    const Type *t = a->getType();
754    const Element *e = t->getElement();
755
756    char buf[256];
757    if (x >= t->getLODDimX(0)) {
758        sprintf(buf, "Out range ElementAt X %i of %i", x, t->getLODDimX(0));
759        rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
760        return NULL;
761    }
762
763    if (y >= t->getLODDimY(0)) {
764        sprintf(buf, "Out range ElementAt Y %i of %i", y, t->getLODDimY(0));
765        rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
766        return NULL;
767    }
768
769    if (vecSize > 0) {
770        if (vecSize != e->getVectorSize()) {
771            sprintf(buf, "Vector size mismatch for ElementAt %i of %i", vecSize, e->getVectorSize());
772            rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
773            return NULL;
774        }
775
776        if (dt != e->getType()) {
777            sprintf(buf, "Data type mismatch for ElementAt %i of %i", dt, e->getType());
778            rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
779            return NULL;
780        }
781    }
782
783    uint8_t *p = (uint8_t *)a->mHal.drvState.lod[0].mallocPtr;
784    const uint32_t eSize = e->getSizeBytes();
785    const uint32_t stride = a->mHal.drvState.lod[0].stride;
786    return &p[(eSize * x) + (y * stride)];
787}
788
789static void * ElementAt3D(Allocation *a, RsDataType dt, uint32_t vecSize, uint32_t x, uint32_t y, uint32_t z) {
790    Context *rsc = RsdCpuReference::getTlsContext();
791    const Type *t = a->getType();
792    const Element *e = t->getElement();
793
794    char buf[256];
795    if (x >= t->getLODDimX(0)) {
796        sprintf(buf, "Out range ElementAt X %i of %i", x, t->getLODDimX(0));
797        rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
798        return NULL;
799    }
800
801    if (y >= t->getLODDimY(0)) {
802        sprintf(buf, "Out range ElementAt Y %i of %i", y, t->getLODDimY(0));
803        rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
804        return NULL;
805    }
806
807    if (z >= t->getLODDimZ(0)) {
808        sprintf(buf, "Out range ElementAt Z %i of %i", z, t->getLODDimZ(0));
809        rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
810        return NULL;
811    }
812
813    if (vecSize > 0) {
814        if (vecSize != e->getVectorSize()) {
815            sprintf(buf, "Vector size mismatch for ElementAt %i of %i", vecSize, e->getVectorSize());
816            rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
817            return NULL;
818        }
819
820        if (dt != e->getType()) {
821            sprintf(buf, "Data type mismatch for ElementAt %i of %i", dt, e->getType());
822            rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
823            return NULL;
824        }
825    }
826
827    uint8_t *p = (uint8_t *)a->mHal.drvState.lod[0].mallocPtr;
828    const uint32_t eSize = e->getSizeBytes();
829    const uint32_t stride = a->mHal.drvState.lod[0].stride;
830    return &p[(eSize * x) + (y * stride)];
831}
832
833static const void * SC_GetElementAt1D(android::renderscript::rs_allocation a, uint32_t x) {
834    return ElementAt1D((Allocation*)a.p, RS_TYPE_UNSIGNED_8, 0, x);
835}
836static const void * SC_GetElementAt2D(android::renderscript::rs_allocation a, uint32_t x, uint32_t y) {
837    return ElementAt2D((Allocation*)a.p, RS_TYPE_UNSIGNED_8, 0, x, y);
838}
839static const void * SC_GetElementAt3D(android::renderscript::rs_allocation a, uint32_t x, uint32_t y, uint32_t z) {
840    return ElementAt3D((Allocation*)a.p, RS_TYPE_UNSIGNED_8, 0, x, y, z);
841}
842
843static void SC_SetElementAt1D(android::renderscript::rs_allocation a, const void *ptr, uint32_t x) {
844    const Type *t = ((Allocation*)a.p)->getType();
845    const Element *e = t->getElement();
846    void *tmp = ElementAt1D((Allocation*)a.p, RS_TYPE_UNSIGNED_8, 0, x);
847    if (tmp != NULL) {
848        memcpy(tmp, ptr, e->getSizeBytes());
849    }
850}
851static void SC_SetElementAt2D(android::renderscript::rs_allocation a, const void *ptr, uint32_t x, uint32_t y) {
852    const Type *t = ((Allocation*)a.p)->getType();
853    const Element *e = t->getElement();
854    void *tmp = ElementAt2D((Allocation*)a.p, RS_TYPE_UNSIGNED_8, 0, x, y);
855    if (tmp != NULL) {
856        memcpy(tmp, ptr, e->getSizeBytes());
857    }
858}
859static void SC_SetElementAt3D(android::renderscript::rs_allocation a, const void *ptr, uint32_t x, uint32_t y, uint32_t z) {
860    const Type *t = ((Allocation*)a.p)->getType();
861    const Element *e = t->getElement();
862    void *tmp = ElementAt3D((Allocation*)a.p, RS_TYPE_UNSIGNED_8, 0, x, y, z);
863    if (tmp != NULL) {
864        memcpy(tmp, ptr, e->getSizeBytes());
865    }
866}
867
868#define ELEMENT_AT(T, DT, VS)                                               \
869    static void SC_SetElementAt1_##T(android::renderscript::rs_allocation a, const T *val, uint32_t x) { \
870        void *r = ElementAt1D((Allocation*)a.p, DT, VS, x);               \
871        if (r != NULL) ((T *)r)[0] = *val;                               \
872        else ALOGE("Error from %s", __PRETTY_FUNCTION__);               \
873    }                                                                   \
874    static void SC_SetElementAt2_##T(android::renderscript::rs_allocation a, const T * val, uint32_t x, uint32_t y) { \
875        void *r = ElementAt2D((Allocation*)a.p, DT, VS, x, y);            \
876        if (r != NULL) ((T *)r)[0] = *val;                               \
877        else ALOGE("Error from %s", __PRETTY_FUNCTION__);               \
878    }                                                                   \
879    static void SC_SetElementAt3_##T(android::renderscript::rs_allocation a, const T * val, uint32_t x, uint32_t y, uint32_t z) { \
880        void *r = ElementAt3D((Allocation*)a.p, DT, VS, x, y, z);         \
881        if (r != NULL) ((T *)r)[0] = *val;                               \
882        else ALOGE("Error from %s", __PRETTY_FUNCTION__);               \
883    }                                                                   \
884    static void SC_GetElementAt1_##T(android::renderscript::rs_allocation a, T *val, uint32_t x) {                  \
885        void *r = ElementAt1D((Allocation*)a.p, DT, VS, x);               \
886        if (r != NULL) *val = ((T *)r)[0];                              \
887        else ALOGE("Error from %s", __PRETTY_FUNCTION__);                    \
888    }                                                                   \
889    static void SC_GetElementAt2_##T(android::renderscript::rs_allocation a, T *val, uint32_t x, uint32_t y) {      \
890        void *r = ElementAt2D((Allocation*)a.p, DT, VS, x, y);            \
891        if (r != NULL) *val = ((T *)r)[0];                              \
892        else ALOGE("Error from %s", __PRETTY_FUNCTION__);                    \
893    }                                                                   \
894    static void SC_GetElementAt3_##T(android::renderscript::rs_allocation a, T *val, uint32_t x, uint32_t y, uint32_t z) { \
895        void *r = ElementAt3D((Allocation*)a.p, DT, VS, x, y, z);         \
896        if (r != NULL) *val = ((T *)r)[0];                              \
897        else ALOGE("Error from %s", __PRETTY_FUNCTION__);                    \
898    }
899
900ELEMENT_AT(char, RS_TYPE_SIGNED_8, 1)
901ELEMENT_AT(char2, RS_TYPE_SIGNED_8, 2)
902ELEMENT_AT(char3, RS_TYPE_SIGNED_8, 3)
903ELEMENT_AT(char4, RS_TYPE_SIGNED_8, 4)
904ELEMENT_AT(uchar, RS_TYPE_UNSIGNED_8, 1)
905ELEMENT_AT(uchar2, RS_TYPE_UNSIGNED_8, 2)
906ELEMENT_AT(uchar3, RS_TYPE_UNSIGNED_8, 3)
907ELEMENT_AT(uchar4, RS_TYPE_UNSIGNED_8, 4)
908ELEMENT_AT(short, RS_TYPE_SIGNED_16, 1)
909ELEMENT_AT(short2, RS_TYPE_SIGNED_16, 2)
910ELEMENT_AT(short3, RS_TYPE_SIGNED_16, 3)
911ELEMENT_AT(short4, RS_TYPE_SIGNED_16, 4)
912ELEMENT_AT(ushort, RS_TYPE_UNSIGNED_16, 1)
913ELEMENT_AT(ushort2, RS_TYPE_UNSIGNED_16, 2)
914ELEMENT_AT(ushort3, RS_TYPE_UNSIGNED_16, 3)
915ELEMENT_AT(ushort4, RS_TYPE_UNSIGNED_16, 4)
916ELEMENT_AT(int, RS_TYPE_SIGNED_32, 1)
917ELEMENT_AT(int2, RS_TYPE_SIGNED_32, 2)
918ELEMENT_AT(int3, RS_TYPE_SIGNED_32, 3)
919ELEMENT_AT(int4, RS_TYPE_SIGNED_32, 4)
920ELEMENT_AT(uint, RS_TYPE_UNSIGNED_32, 1)
921ELEMENT_AT(uint2, RS_TYPE_UNSIGNED_32, 2)
922ELEMENT_AT(uint3, RS_TYPE_UNSIGNED_32, 3)
923ELEMENT_AT(uint4, RS_TYPE_UNSIGNED_32, 4)
924ELEMENT_AT(long, RS_TYPE_SIGNED_64, 1)
925ELEMENT_AT(long2, RS_TYPE_SIGNED_64, 2)
926ELEMENT_AT(long3, RS_TYPE_SIGNED_64, 3)
927ELEMENT_AT(long4, RS_TYPE_SIGNED_64, 4)
928ELEMENT_AT(ulong, RS_TYPE_UNSIGNED_64, 1)
929ELEMENT_AT(ulong2, RS_TYPE_UNSIGNED_64, 2)
930ELEMENT_AT(ulong3, RS_TYPE_UNSIGNED_64, 3)
931ELEMENT_AT(ulong4, RS_TYPE_UNSIGNED_64, 4)
932ELEMENT_AT(float, RS_TYPE_FLOAT_32, 1)
933ELEMENT_AT(float2, RS_TYPE_FLOAT_32, 2)
934ELEMENT_AT(float3, RS_TYPE_FLOAT_32, 3)
935ELEMENT_AT(float4, RS_TYPE_FLOAT_32, 4)
936ELEMENT_AT(double, RS_TYPE_FLOAT_64, 1)
937ELEMENT_AT(double2, RS_TYPE_FLOAT_64, 2)
938ELEMENT_AT(double3, RS_TYPE_FLOAT_64, 3)
939ELEMENT_AT(double4, RS_TYPE_FLOAT_64, 4)
940
941#undef ELEMENT_AT
942
943//////////////////////////////////////////////////////////////////////////////
944// Stub implementation
945//////////////////////////////////////////////////////////////////////////////
946
947// llvm name mangling ref
948//  <builtin-type> ::= v  # void
949//                 ::= b  # bool
950//                 ::= c  # char
951//                 ::= a  # signed char
952//                 ::= h  # unsigned char
953//                 ::= s  # short
954//                 ::= t  # unsigned short
955//                 ::= i  # int
956//                 ::= j  # unsigned int
957//                 ::= l  # long
958//                 ::= m  # unsigned long
959//                 ::= x  # long long, __int64
960//                 ::= y  # unsigned long long, __int64
961//                 ::= f  # float
962//                 ::= d  # double
963
964static RsdCpuReference::CpuSymbol gSyms[] = {
965    // Debug runtime
966    { "_Z14rsGetElementAt13rs_allocationj", (void *)&SC_GetElementAt1D, true },
967    { "_Z14rsGetElementAt13rs_allocationjj", (void *)&SC_GetElementAt2D, true },
968    { "_Z14rsGetElementAt13rs_allocationjjj", (void *)&SC_GetElementAt3D, true },
969    { "_Z14rsSetElementAt13rs_allocationPKvj", (void *)&SC_SetElementAt1D, true },
970    { "_Z14rsSetElementAt13rs_allocationPKvjj", (void *)&SC_SetElementAt2D, true },
971    { "_Z14rsSetElementAt13rs_allocationPKvjjj", (void *)&SC_SetElementAt3D, true },
972
973
974    { "_Z20rsGetElementAt_uchar13rs_allocationPhj", (void *)&SC_GetElementAt1_uchar, true },
975    { "_Z21rsGetElementAt_uchar213rs_allocationPDv2_hj", (void *)&SC_GetElementAt1_uchar2, true },
976    { "_Z21rsGetElementAt_uchar313rs_allocationPDv3_hj", (void *)&SC_GetElementAt1_uchar3, true },
977    { "_Z21rsGetElementAt_uchar413rs_allocationPDv4_hj", (void *)&SC_GetElementAt1_uchar4, true },
978    { "_Z20rsGetElementAt_uchar13rs_allocationPhjj", (void *)&SC_GetElementAt2_uchar, true },
979    { "_Z21rsGetElementAt_uchar213rs_allocationPDv2_hjj", (void *)&SC_GetElementAt2_uchar2, true },
980    { "_Z21rsGetElementAt_uchar313rs_allocationPDv3_hjj", (void *)&SC_GetElementAt2_uchar3, true },
981    { "_Z21rsGetElementAt_uchar413rs_allocationPDv4_hjj", (void *)&SC_GetElementAt2_uchar4, true },
982    { "_Z20rsGetElementAt_uchar13rs_allocationPhjjj", (void *)&SC_GetElementAt3_uchar, true },
983    { "_Z21rsGetElementAt_uchar213rs_allocationPDv2_hjjj", (void *)&SC_GetElementAt3_uchar2, true },
984    { "_Z21rsGetElementAt_uchar313rs_allocationPDv3_hjjj", (void *)&SC_GetElementAt3_uchar3, true },
985    { "_Z21rsGetElementAt_uchar413rs_allocationPDv4_hjjj", (void *)&SC_GetElementAt3_uchar4, true },
986
987    { "_Z19rsGetElementAt_char13rs_allocationPcj", (void *)&SC_GetElementAt1_char, true },
988    { "_Z20rsGetElementAt_char213rs_allocationPDv2_cj", (void *)&SC_GetElementAt1_char2, true },
989    { "_Z20rsGetElementAt_char313rs_allocationPDv3_cj", (void *)&SC_GetElementAt1_char3, true },
990    { "_Z20rsGetElementAt_char413rs_allocationPDv4_cj", (void *)&SC_GetElementAt1_char4, true },
991    { "_Z19rsGetElementAt_char13rs_allocationPcjj", (void *)&SC_GetElementAt2_char, true },
992    { "_Z20rsGetElementAt_char213rs_allocationPDv2_cjj", (void *)&SC_GetElementAt2_char2, true },
993    { "_Z20rsGetElementAt_char313rs_allocationPDv3_cjj", (void *)&SC_GetElementAt2_char3, true },
994    { "_Z20rsGetElementAt_char413rs_allocationPDv4_cjj", (void *)&SC_GetElementAt2_char4, true },
995    { "_Z19rsGetElementAt_char13rs_allocationPcjjj", (void *)&SC_GetElementAt3_char, true },
996    { "_Z20rsGetElementAt_char213rs_allocationPDv2_cjjj", (void *)&SC_GetElementAt3_char2, true },
997    { "_Z20rsGetElementAt_char313rs_allocationPDv3_cjjj", (void *)&SC_GetElementAt3_char3, true },
998    { "_Z20rsGetElementAt_char413rs_allocationPDv4_cjjj", (void *)&SC_GetElementAt3_char4, true },
999
1000    { "_Z21rsGetElementAt_ushort13rs_allocationPtj", (void *)&SC_GetElementAt1_ushort, true },
1001    { "_Z22rsGetElementAt_ushort213rs_allocationPDv2_tj", (void *)&SC_GetElementAt1_ushort2, true },
1002    { "_Z22rsGetElementAt_ushort313rs_allocationPDv3_tj", (void *)&SC_GetElementAt1_ushort3, true },
1003    { "_Z22rsGetElementAt_ushort413rs_allocationPDv4_tj", (void *)&SC_GetElementAt1_ushort4, true },
1004    { "_Z21rsGetElementAt_ushort13rs_allocationPtjj", (void *)&SC_GetElementAt2_ushort, true },
1005    { "_Z22rsGetElementAt_ushort213rs_allocationPDv2_tjj", (void *)&SC_GetElementAt2_ushort2, true },
1006    { "_Z22rsGetElementAt_ushort313rs_allocationPDv3_tjj", (void *)&SC_GetElementAt2_ushort3, true },
1007    { "_Z22rsGetElementAt_ushort413rs_allocationPDv4_tjj", (void *)&SC_GetElementAt2_ushort4, true },
1008    { "_Z21rsGetElementAt_ushort13rs_allocationPtjjj", (void *)&SC_GetElementAt3_ushort, true },
1009    { "_Z22rsGetElementAt_ushort213rs_allocationPDv2_tjjj", (void *)&SC_GetElementAt3_ushort2, true },
1010    { "_Z22rsGetElementAt_ushort313rs_allocationPDv3_tjjj", (void *)&SC_GetElementAt3_ushort3, true },
1011    { "_Z22rsGetElementAt_ushort413rs_allocationPDv4_tjjj", (void *)&SC_GetElementAt3_ushort4, true },
1012
1013    { "_Z20rsGetElementAt_short13rs_allocationPsj", (void *)&SC_GetElementAt1_short, true },
1014    { "_Z21rsGetElementAt_short213rs_allocationPDv2_sj", (void *)&SC_GetElementAt1_short2, true },
1015    { "_Z21rsGetElementAt_short313rs_allocationPDv3_sj", (void *)&SC_GetElementAt1_short3, true },
1016    { "_Z21rsGetElementAt_short413rs_allocationPDv4_sj", (void *)&SC_GetElementAt1_short4, true },
1017    { "_Z20rsGetElementAt_short13rs_allocationPsjj", (void *)&SC_GetElementAt2_short, true },
1018    { "_Z21rsGetElementAt_short213rs_allocationPDv2_sjj", (void *)&SC_GetElementAt2_short2, true },
1019    { "_Z21rsGetElementAt_short313rs_allocationPDv3_sjj", (void *)&SC_GetElementAt2_short3, true },
1020    { "_Z21rsGetElementAt_short413rs_allocationPDv4_sjj", (void *)&SC_GetElementAt2_short4, true },
1021    { "_Z20rsGetElementAt_short13rs_allocationPsjjj", (void *)&SC_GetElementAt3_short, true },
1022    { "_Z21rsGetElementAt_short213rs_allocationPDv2_sjjj", (void *)&SC_GetElementAt3_short2, true },
1023    { "_Z21rsGetElementAt_short313rs_allocationPDv3_sjjj", (void *)&SC_GetElementAt3_short3, true },
1024    { "_Z21rsGetElementAt_short413rs_allocationPDv4_sjjj", (void *)&SC_GetElementAt3_short4, true },
1025
1026    { "_Z19rsGetElementAt_uint13rs_allocationPjj", (void *)&SC_GetElementAt1_uint, true },
1027    { "_Z20rsGetElementAt_uint213rs_allocationPDv2_jj", (void *)&SC_GetElementAt1_uint2, true },
1028    { "_Z20rsGetElementAt_uint313rs_allocationPDv3_jj", (void *)&SC_GetElementAt1_uint3, true },
1029    { "_Z20rsGetElementAt_uint413rs_allocationPDv4_jj", (void *)&SC_GetElementAt1_uint4, true },
1030    { "_Z19rsGetElementAt_uint13rs_allocationPjjj", (void *)&SC_GetElementAt2_uint, true },
1031    { "_Z20rsGetElementAt_uint213rs_allocationPDv2_jjj", (void *)&SC_GetElementAt2_uint2, true },
1032    { "_Z20rsGetElementAt_uint313rs_allocationPDv3_jjj", (void *)&SC_GetElementAt2_uint3, true },
1033    { "_Z20rsGetElementAt_uint413rs_allocationPDv4_jjj", (void *)&SC_GetElementAt2_uint4, true },
1034    { "_Z19rsGetElementAt_uint13rs_allocationPjjjj", (void *)&SC_GetElementAt3_uint, true },
1035    { "_Z20rsGetElementAt_uint213rs_allocationPDv2_jjjj", (void *)&SC_GetElementAt3_uint2, true },
1036    { "_Z20rsGetElementAt_uint313rs_allocationPDv3_jjjj", (void *)&SC_GetElementAt3_uint3, true },
1037    { "_Z20rsGetElementAt_uint413rs_allocationPDv4_jjjj", (void *)&SC_GetElementAt3_uint4, true },
1038
1039    { "_Z18rsGetElementAt_int13rs_allocationPij", (void *)&SC_GetElementAt1_int, true },
1040    { "_Z19rsGetElementAt_int213rs_allocationPDv2_ij", (void *)&SC_GetElementAt1_int2, true },
1041    { "_Z19rsGetElementAt_int313rs_allocationPDv3_ij", (void *)&SC_GetElementAt1_int3, true },
1042    { "_Z19rsGetElementAt_int413rs_allocationPDv4_ij", (void *)&SC_GetElementAt1_int4, true },
1043    { "_Z18rsGetElementAt_int13rs_allocationPijj", (void *)&SC_GetElementAt2_int, true },
1044    { "_Z19rsGetElementAt_int213rs_allocationPDv2_ijj", (void *)&SC_GetElementAt2_int2, true },
1045    { "_Z19rsGetElementAt_int313rs_allocationPDv3_ijj", (void *)&SC_GetElementAt2_int3, true },
1046    { "_Z19rsGetElementAt_int413rs_allocationPDv4_ijj", (void *)&SC_GetElementAt2_int4, true },
1047    { "_Z18rsGetElementAt_int13rs_allocationPijjj", (void *)&SC_GetElementAt3_int, true },
1048    { "_Z19rsGetElementAt_int213rs_allocationPDv2_ijjj", (void *)&SC_GetElementAt3_int2, true },
1049    { "_Z19rsGetElementAt_int313rs_allocationPDv3_ijjj", (void *)&SC_GetElementAt3_int3, true },
1050    { "_Z19rsGetElementAt_int413rs_allocationPDv4_ijjj", (void *)&SC_GetElementAt3_int4, true },
1051
1052    { "_Z20rsGetElementAt_ulong13rs_allocationPmj", (void *)&SC_GetElementAt1_ulong, true },
1053    { "_Z21rsGetElementAt_ulong213rs_allocationPDv2_mj", (void *)&SC_GetElementAt1_ulong2, true },
1054    { "_Z21rsGetElementAt_ulong313rs_allocationPDv3_mj", (void *)&SC_GetElementAt1_ulong3, true },
1055    { "_Z21rsGetElementAt_ulong413rs_allocationPDv4_mj", (void *)&SC_GetElementAt1_ulong4, true },
1056    { "_Z20rsGetElementAt_ulong13rs_allocationPmjj", (void *)&SC_GetElementAt2_ulong, true },
1057    { "_Z21rsGetElementAt_ulong213rs_allocationPDv2_mjj", (void *)&SC_GetElementAt2_ulong2, true },
1058    { "_Z21rsGetElementAt_ulong313rs_allocationPDv3_mjj", (void *)&SC_GetElementAt2_ulong3, true },
1059    { "_Z21rsGetElementAt_ulong413rs_allocationPDv4_mjj", (void *)&SC_GetElementAt2_ulong4, true },
1060    { "_Z20rsGetElementAt_ulong13rs_allocationPmjjj", (void *)&SC_GetElementAt3_ulong, true },
1061    { "_Z21rsGetElementAt_ulong213rs_allocationPDv2_mjjj", (void *)&SC_GetElementAt3_ulong2, true },
1062    { "_Z21rsGetElementAt_ulong313rs_allocationPDv3_mjjj", (void *)&SC_GetElementAt3_ulong3, true },
1063    { "_Z21rsGetElementAt_ulong413rs_allocationPDv4_mjjj", (void *)&SC_GetElementAt3_ulong4, true },
1064
1065    { "_Z19rsGetElementAt_long13rs_allocationPlj", (void *)&SC_GetElementAt1_long, true },
1066    { "_Z20rsGetElementAt_long213rs_allocationPDv2_lj", (void *)&SC_GetElementAt1_long2, true },
1067    { "_Z20rsGetElementAt_long313rs_allocationPDv3_lj", (void *)&SC_GetElementAt1_long3, true },
1068    { "_Z20rsGetElementAt_long413rs_allocationPDv4_lj", (void *)&SC_GetElementAt1_long4, true },
1069    { "_Z19rsGetElementAt_long13rs_allocationPljj", (void *)&SC_GetElementAt2_long, true },
1070    { "_Z20rsGetElementAt_long213rs_allocationPDv2_ljj", (void *)&SC_GetElementAt2_long2, true },
1071    { "_Z20rsGetElementAt_long313rs_allocationPDv3_ljj", (void *)&SC_GetElementAt2_long3, true },
1072    { "_Z20rsGetElementAt_long413rs_allocationPDv4_ljj", (void *)&SC_GetElementAt2_long4, true },
1073    { "_Z19rsGetElementAt_long13rs_allocationPljjj", (void *)&SC_GetElementAt3_long, true },
1074    { "_Z20rsGetElementAt_long213rs_allocationPDv2_ljjj", (void *)&SC_GetElementAt3_long2, true },
1075    { "_Z20rsGetElementAt_long313rs_allocationPDv3_ljjj", (void *)&SC_GetElementAt3_long3, true },
1076    { "_Z20rsGetElementAt_long413rs_allocationPDv4_ljjj", (void *)&SC_GetElementAt3_long4, true },
1077
1078    { "_Z20rsGetElementAt_float13rs_allocationPfj", (void *)&SC_GetElementAt1_float, true },
1079    { "_Z21rsGetElementAt_float213rs_allocationPDv2_fj", (void *)&SC_GetElementAt1_float2, true },
1080    { "_Z21rsGetElementAt_float313rs_allocationPDv3_fj", (void *)&SC_GetElementAt1_float3, true },
1081    { "_Z21rsGetElementAt_float413rs_allocationPDv4_fj", (void *)&SC_GetElementAt1_float4, true },
1082    { "_Z20rsGetElementAt_float13rs_allocationPfjj", (void *)&SC_GetElementAt2_float, true },
1083    { "_Z21rsGetElementAt_float213rs_allocationPDv2_fjj", (void *)&SC_GetElementAt2_float2, true },
1084    { "_Z21rsGetElementAt_float313rs_allocationPDv3_fjj", (void *)&SC_GetElementAt2_float3, true },
1085    { "_Z21rsGetElementAt_float413rs_allocationPDv4_fjj", (void *)&SC_GetElementAt2_float4, true },
1086    { "_Z20rsGetElementAt_float13rs_allocationPfjjj", (void *)&SC_GetElementAt3_float, true },
1087    { "_Z21rsGetElementAt_float213rs_allocationPDv2_fjjj", (void *)&SC_GetElementAt3_float2, true },
1088    { "_Z21rsGetElementAt_float313rs_allocationPDv3_fjjj", (void *)&SC_GetElementAt3_float3, true },
1089    { "_Z21rsGetElementAt_float413rs_allocationPDv4_fjjj", (void *)&SC_GetElementAt3_float4, true },
1090
1091    { "_Z21rsGetElementAt_double13rs_allocationPdj", (void *)&SC_GetElementAt1_double, true },
1092    { "_Z22rsGetElementAt_double213rs_allocationPDv2_dj", (void *)&SC_GetElementAt1_double2, true },
1093    { "_Z22rsGetElementAt_double313rs_allocationPDv3_dj", (void *)&SC_GetElementAt1_double3, true },
1094    { "_Z22rsGetElementAt_double413rs_allocationPDv4_dj", (void *)&SC_GetElementAt1_double4, true },
1095    { "_Z21rsGetElementAt_double13rs_allocationPdjj", (void *)&SC_GetElementAt2_double, true },
1096    { "_Z22rsGetElementAt_double213rs_allocationPDv2_djj", (void *)&SC_GetElementAt2_double2, true },
1097    { "_Z22rsGetElementAt_double313rs_allocationPDv3_djj", (void *)&SC_GetElementAt2_double3, true },
1098    { "_Z22rsGetElementAt_double413rs_allocationPDv4_djj", (void *)&SC_GetElementAt2_double4, true },
1099    { "_Z21rsGetElementAt_double13rs_allocationPdjjj", (void *)&SC_GetElementAt3_double, true },
1100    { "_Z22rsGetElementAt_double213rs_allocationPDv2_djjj", (void *)&SC_GetElementAt3_double2, true },
1101    { "_Z22rsGetElementAt_double313rs_allocationPDv3_djjj", (void *)&SC_GetElementAt3_double3, true },
1102    { "_Z22rsGetElementAt_double413rs_allocationPDv4_djjj", (void *)&SC_GetElementAt3_double4, true },
1103
1104
1105
1106    { "_Z20rsSetElementAt_uchar13rs_allocationPKhj", (void *)&SC_SetElementAt1_uchar, true },
1107    { "_Z21rsSetElementAt_uchar213rs_allocationPKDv2_hj", (void *)&SC_SetElementAt1_uchar2, true },
1108    { "_Z21rsSetElementAt_uchar313rs_allocationPKDv3_hj", (void *)&SC_SetElementAt1_uchar3, true },
1109    { "_Z21rsSetElementAt_uchar413rs_allocationPKDv4_hj", (void *)&SC_SetElementAt1_uchar4, true },
1110    { "_Z20rsSetElementAt_uchar13rs_allocationPKhjj", (void *)&SC_SetElementAt2_uchar, true },
1111    { "_Z21rsSetElementAt_uchar213rs_allocationPKDv2_hjj", (void *)&SC_SetElementAt2_uchar2, true },
1112    { "_Z21rsSetElementAt_uchar313rs_allocationPKDv3_hjj", (void *)&SC_SetElementAt2_uchar3, true },
1113    { "_Z21rsSetElementAt_uchar413rs_allocationPKDv4_hjj", (void *)&SC_SetElementAt2_uchar4, true },
1114    { "_Z20rsSetElementAt_uchar13rs_allocationPKhjjj", (void *)&SC_SetElementAt3_uchar, true },
1115    { "_Z21rsSetElementAt_uchar213rs_allocationPKDv2_hjjj", (void *)&SC_SetElementAt3_uchar2, true },
1116    { "_Z21rsSetElementAt_uchar313rs_allocationPKDv3_hjjj", (void *)&SC_SetElementAt3_uchar3, true },
1117    { "_Z21rsSetElementAt_uchar413rs_allocationPKDv4_hjjj", (void *)&SC_SetElementAt3_uchar4, true },
1118
1119    { "_Z19rsSetElementAt_char13rs_allocationPKcj", (void *)&SC_SetElementAt1_char, true },
1120    { "_Z20rsSetElementAt_char213rs_allocationPKDv2_cj", (void *)&SC_SetElementAt1_char2, true },
1121    { "_Z20rsSetElementAt_char313rs_allocationPKDv3_cj", (void *)&SC_SetElementAt1_char3, true },
1122    { "_Z20rsSetElementAt_char413rs_allocationPKDv4_cj", (void *)&SC_SetElementAt1_char4, true },
1123    { "_Z19rsSetElementAt_char13rs_allocationPKcjj", (void *)&SC_SetElementAt2_char, true },
1124    { "_Z20rsSetElementAt_char213rs_allocationPKDv2_cjj", (void *)&SC_SetElementAt2_char2, true },
1125    { "_Z20rsSetElementAt_char313rs_allocationPKDv3_cjj", (void *)&SC_SetElementAt2_char3, true },
1126    { "_Z20rsSetElementAt_char413rs_allocationPKDv4_cjj", (void *)&SC_SetElementAt2_char4, true },
1127    { "_Z19rsSetElementAt_char13rs_allocationPKcjjj", (void *)&SC_SetElementAt3_char, true },
1128    { "_Z20rsSetElementAt_char213rs_allocationPKDv2_cjjj", (void *)&SC_SetElementAt3_char2, true },
1129    { "_Z20rsSetElementAt_char313rs_allocationPKDv3_cjjj", (void *)&SC_SetElementAt3_char3, true },
1130    { "_Z20rsSetElementAt_char413rs_allocationPKDv4_cjjj", (void *)&SC_SetElementAt3_char4, true },
1131
1132    { "_Z21rsSetElementAt_ushort13rs_allocationPKht", (void *)&SC_SetElementAt1_ushort, true },
1133    { "_Z22rsSetElementAt_ushort213rs_allocationPKDv2_tj", (void *)&SC_SetElementAt1_ushort2, true },
1134    { "_Z22rsSetElementAt_ushort313rs_allocationPKDv3_tj", (void *)&SC_SetElementAt1_ushort3, true },
1135    { "_Z22rsSetElementAt_ushort413rs_allocationPKDv4_tj", (void *)&SC_SetElementAt1_ushort4, true },
1136    { "_Z21rsSetElementAt_ushort13rs_allocationPKtjj", (void *)&SC_SetElementAt2_ushort, true },
1137    { "_Z22rsSetElementAt_ushort213rs_allocationPKDv2_tjj", (void *)&SC_SetElementAt2_ushort2, true },
1138    { "_Z22rsSetElementAt_ushort313rs_allocationPKDv3_tjj", (void *)&SC_SetElementAt2_ushort3, true },
1139    { "_Z22rsSetElementAt_ushort413rs_allocationPKDv4_tjj", (void *)&SC_SetElementAt2_ushort4, true },
1140    { "_Z21rsSetElementAt_ushort13rs_allocationPKtjjj", (void *)&SC_SetElementAt3_ushort, true },
1141    { "_Z22rsSetElementAt_ushort213rs_allocationPKDv2_tjjj", (void *)&SC_SetElementAt3_ushort2, true },
1142    { "_Z22rsSetElementAt_ushort313rs_allocationPKDv3_tjjj", (void *)&SC_SetElementAt3_ushort3, true },
1143    { "_Z22rsSetElementAt_ushort413rs_allocationPKDv4_tjjj", (void *)&SC_SetElementAt3_ushort4, true },
1144
1145    { "_Z20rsSetElementAt_short13rs_allocationPKsj", (void *)&SC_SetElementAt1_short, true },
1146    { "_Z21rsSetElementAt_short213rs_allocationPKDv2_sj", (void *)&SC_SetElementAt1_short2, true },
1147    { "_Z21rsSetElementAt_short313rs_allocationPKDv3_sj", (void *)&SC_SetElementAt1_short3, true },
1148    { "_Z21rsSetElementAt_short413rs_allocationPKDv4_sj", (void *)&SC_SetElementAt1_short4, true },
1149    { "_Z20rsSetElementAt_short13rs_allocationPKsjj", (void *)&SC_SetElementAt2_short, true },
1150    { "_Z21rsSetElementAt_short213rs_allocationPKDv2_sjj", (void *)&SC_SetElementAt2_short2, true },
1151    { "_Z21rsSetElementAt_short313rs_allocationPKDv3_sjj", (void *)&SC_SetElementAt2_short3, true },
1152    { "_Z21rsSetElementAt_short413rs_allocationPKDv4_sjj", (void *)&SC_SetElementAt2_short4, true },
1153    { "_Z20rsSetElementAt_short13rs_allocationPKsjjj", (void *)&SC_SetElementAt3_short, true },
1154    { "_Z21rsSetElementAt_short213rs_allocationPKDv2_sjjj", (void *)&SC_SetElementAt3_short2, true },
1155    { "_Z21rsSetElementAt_short313rs_allocationPKDv3_sjjj", (void *)&SC_SetElementAt3_short3, true },
1156    { "_Z21rsSetElementAt_short413rs_allocationPKDv4_sjjj", (void *)&SC_SetElementAt3_short4, true },
1157
1158    { "_Z19rsSetElementAt_uint13rs_allocationPKjj", (void *)&SC_SetElementAt1_uint, true },
1159    { "_Z20rsSetElementAt_uint213rs_allocationPKDv2_jj", (void *)&SC_SetElementAt1_uint2, true },
1160    { "_Z20rsSetElementAt_uint313rs_allocationPKDv3_jj", (void *)&SC_SetElementAt1_uint3, true },
1161    { "_Z20rsSetElementAt_uint413rs_allocationPKDv4_jj", (void *)&SC_SetElementAt1_uint4, true },
1162    { "_Z19rsSetElementAt_uint13rs_allocationPKjjj", (void *)&SC_SetElementAt2_uint, true },
1163    { "_Z20rsSetElementAt_uint213rs_allocationPKDv2_jjj", (void *)&SC_SetElementAt2_uint2, true },
1164    { "_Z20rsSetElementAt_uint313rs_allocationPKDv3_jjj", (void *)&SC_SetElementAt2_uint3, true },
1165    { "_Z20rsSetElementAt_uint413rs_allocationPKDv4_jjj", (void *)&SC_SetElementAt2_uint4, true },
1166    { "_Z19rsSetElementAt_uint13rs_allocationPKjjjj", (void *)&SC_SetElementAt3_uint, true },
1167    { "_Z20rsSetElementAt_uint213rs_allocationPKDv2_jjjj", (void *)&SC_SetElementAt3_uint2, true },
1168    { "_Z20rsSetElementAt_uint313rs_allocationPKDv3_jjjj", (void *)&SC_SetElementAt3_uint3, true },
1169    { "_Z20rsSetElementAt_uint413rs_allocationPKDv4_jjjj", (void *)&SC_SetElementAt3_uint4, true },
1170
1171    { "_Z18rsSetElementAt_int13rs_allocationPKij", (void *)&SC_SetElementAt1_int, true },
1172    { "_Z19rsSetElementAt_int213rs_allocationPKDv2_ij", (void *)&SC_SetElementAt1_int2, true },
1173    { "_Z19rsSetElementAt_int313rs_allocationPKDv3_ij", (void *)&SC_SetElementAt1_int3, true },
1174    { "_Z19rsSetElementAt_int413rs_allocationPKDv4_ij", (void *)&SC_SetElementAt1_int4, true },
1175    { "_Z18rsSetElementAt_int13rs_allocationPKijj", (void *)&SC_SetElementAt2_int, true },
1176    { "_Z19rsSetElementAt_int213rs_allocationPKDv2_ijj", (void *)&SC_SetElementAt2_int2, true },
1177    { "_Z19rsSetElementAt_int313rs_allocationPKDv3_ijj", (void *)&SC_SetElementAt2_int3, true },
1178    { "_Z19rsSetElementAt_int413rs_allocationPKDv4_ijj", (void *)&SC_SetElementAt2_int4, true },
1179    { "_Z18rsSetElementAt_int13rs_allocationPKijjj", (void *)&SC_SetElementAt3_int, true },
1180    { "_Z19rsSetElementAt_int213rs_allocationPKDv2_ijjj", (void *)&SC_SetElementAt3_int2, true },
1181    { "_Z19rsSetElementAt_int313rs_allocationPKDv3_ijjj", (void *)&SC_SetElementAt3_int3, true },
1182    { "_Z19rsSetElementAt_int413rs_allocationPKDv4_ijjj", (void *)&SC_SetElementAt3_int4, true },
1183
1184    { "_Z20rsSetElementAt_ulong13rs_allocationPKmj", (void *)&SC_SetElementAt1_ulong, true },
1185    { "_Z21rsSetElementAt_ulong213rs_allocationPKDv2_mj", (void *)&SC_SetElementAt1_ulong2, true },
1186    { "_Z21rsSetElementAt_ulong313rs_allocationPKDv3_mj", (void *)&SC_SetElementAt1_ulong3, true },
1187    { "_Z21rsSetElementAt_ulong413rs_allocationPKDv4_mj", (void *)&SC_SetElementAt1_ulong4, true },
1188    { "_Z20rsSetElementAt_ulong13rs_allocationPKmjj", (void *)&SC_SetElementAt2_ulong, true },
1189    { "_Z21rsSetElementAt_ulong213rs_allocationPKDv2_mjj", (void *)&SC_SetElementAt2_ulong2, true },
1190    { "_Z21rsSetElementAt_ulong313rs_allocationPKDv3_mjj", (void *)&SC_SetElementAt2_ulong3, true },
1191    { "_Z21rsSetElementAt_ulong413rs_allocationPKDv4_mjj", (void *)&SC_SetElementAt2_ulong4, true },
1192    { "_Z20rsSetElementAt_ulong13rs_allocationPKmjjj", (void *)&SC_SetElementAt3_ulong, true },
1193    { "_Z21rsSetElementAt_ulong213rs_allocationPKDv2_mjjj", (void *)&SC_SetElementAt3_ulong2, true },
1194    { "_Z21rsSetElementAt_ulong313rs_allocationPKDv3_mjjj", (void *)&SC_SetElementAt3_ulong3, true },
1195    { "_Z21rsSetElementAt_ulong413rs_allocationPKDv4_mjjj", (void *)&SC_SetElementAt3_ulong4, true },
1196
1197    // Pre-21 compatibility path
1198    { "_Z20rsSetElementAt_ulong13rs_allocationPKyj", (void *)&SC_SetElementAt1_ulong, true },
1199    { "_Z21rsSetElementAt_ulong213rs_allocationPKDv2_yj", (void *)&SC_SetElementAt1_ulong2, true },
1200    { "_Z21rsSetElementAt_ulong313rs_allocationPKDv3_yj", (void *)&SC_SetElementAt1_ulong3, true },
1201    { "_Z21rsSetElementAt_ulong413rs_allocationPKDv4_yj", (void *)&SC_SetElementAt1_ulong4, true },
1202    { "_Z20rsSetElementAt_ulong13rs_allocationPKyjj", (void *)&SC_SetElementAt2_ulong, true },
1203    { "_Z21rsSetElementAt_ulong213rs_allocationPKDv2_yjj", (void *)&SC_SetElementAt2_ulong2, true },
1204    { "_Z21rsSetElementAt_ulong313rs_allocationPKDv3_yjj", (void *)&SC_SetElementAt2_ulong3, true },
1205    { "_Z21rsSetElementAt_ulong413rs_allocationPKDv4_yjj", (void *)&SC_SetElementAt2_ulong4, true },
1206    { "_Z20rsSetElementAt_ulong13rs_allocationPKyjjj", (void *)&SC_SetElementAt3_ulong, true },
1207    { "_Z21rsSetElementAt_ulong213rs_allocationPKDv2_yjjj", (void *)&SC_SetElementAt3_ulong2, true },
1208    { "_Z21rsSetElementAt_ulong313rs_allocationPKDv3_yjjj", (void *)&SC_SetElementAt3_ulong3, true },
1209    { "_Z21rsSetElementAt_ulong413rs_allocationPKDv4_yjjj", (void *)&SC_SetElementAt3_ulong4, true },
1210
1211    { "_Z19rsSetElementAt_long13rs_allocationPKlj", (void *)&SC_SetElementAt1_long, true },
1212    { "_Z20rsSetElementAt_long213rs_allocationPKDv2_lj", (void *)&SC_SetElementAt1_long2, true },
1213    { "_Z20rsSetElementAt_long313rs_allocationPKDv3_lj", (void *)&SC_SetElementAt1_long3, true },
1214    { "_Z20rsSetElementAt_long413rs_allocationPKDv4_lj", (void *)&SC_SetElementAt1_long4, true },
1215    { "_Z19rsSetElementAt_long13rs_allocationPKljj", (void *)&SC_SetElementAt2_long, true },
1216    { "_Z20rsSetElementAt_long213rs_allocationPKDv2_ljj", (void *)&SC_SetElementAt2_long2, true },
1217    { "_Z20rsSetElementAt_long313rs_allocationPKDv3_ljj", (void *)&SC_SetElementAt2_long3, true },
1218    { "_Z20rsSetElementAt_long413rs_allocationPKDv4_ljj", (void *)&SC_SetElementAt2_long4, true },
1219    { "_Z19rsSetElementAt_long13rs_allocationPKljjj", (void *)&SC_SetElementAt3_long, true },
1220    { "_Z20rsSetElementAt_long213rs_allocationPKDv2_ljjj", (void *)&SC_SetElementAt3_long2, true },
1221    { "_Z20rsSetElementAt_long313rs_allocationPKDv3_ljjj", (void *)&SC_SetElementAt3_long3, true },
1222    { "_Z20rsSetElementAt_long413rs_allocationPKDv4_ljjj", (void *)&SC_SetElementAt3_long4, true },
1223
1224    // Pre-21 compatibility path
1225    { "_Z19rsSetElementAt_long13rs_allocationPKxj", (void *)&SC_SetElementAt1_long, true },
1226    { "_Z20rsSetElementAt_long213rs_allocationPKDv2_xj", (void *)&SC_SetElementAt1_long2, true },
1227    { "_Z20rsSetElementAt_long313rs_allocationPKDv3_xj", (void *)&SC_SetElementAt1_long3, true },
1228    { "_Z20rsSetElementAt_long413rs_allocationPKDv4_xj", (void *)&SC_SetElementAt1_long4, true },
1229    { "_Z19rsSetElementAt_long13rs_allocationPKxjj", (void *)&SC_SetElementAt2_long, true },
1230    { "_Z20rsSetElementAt_long213rs_allocationPKDv2_xjj", (void *)&SC_SetElementAt2_long2, true },
1231    { "_Z20rsSetElementAt_long313rs_allocationPKDv3_xjj", (void *)&SC_SetElementAt2_long3, true },
1232    { "_Z20rsSetElementAt_long413rs_allocationPKDv4_xjj", (void *)&SC_SetElementAt2_long4, true },
1233    { "_Z19rsSetElementAt_long13rs_allocationPKxjjj", (void *)&SC_SetElementAt3_long, true },
1234    { "_Z20rsSetElementAt_long213rs_allocationPKDv2_xjjj", (void *)&SC_SetElementAt3_long2, true },
1235    { "_Z20rsSetElementAt_long313rs_allocationPKDv3_xjjj", (void *)&SC_SetElementAt3_long3, true },
1236    { "_Z20rsSetElementAt_long413rs_allocationPKDv4_xjjj", (void *)&SC_SetElementAt3_long4, true },
1237
1238    { "_Z20rsSetElementAt_float13rs_allocationPKft", (void *)&SC_SetElementAt1_float, true },
1239    { "_Z21rsSetElementAt_float213rs_allocationPKDv2_fj", (void *)&SC_SetElementAt1_float2, true },
1240    { "_Z21rsSetElementAt_float313rs_allocationPKDv3_fj", (void *)&SC_SetElementAt1_float3, true },
1241    { "_Z21rsSetElementAt_float413rs_allocationPKDv4_fj", (void *)&SC_SetElementAt1_float4, true },
1242    { "_Z20rsSetElementAt_float13rs_allocationPKfjj", (void *)&SC_SetElementAt2_float, true },
1243    { "_Z21rsSetElementAt_float213rs_allocationPKDv2_fjj", (void *)&SC_SetElementAt2_float2, true },
1244    { "_Z21rsSetElementAt_float313rs_allocationPKDv3_fjj", (void *)&SC_SetElementAt2_float3, true },
1245    { "_Z21rsSetElementAt_float413rs_allocationPKDv4_fjj", (void *)&SC_SetElementAt2_float4, true },
1246    { "_Z20rsSetElementAt_float13rs_allocationPKfjjj", (void *)&SC_SetElementAt3_float, true },
1247    { "_Z21rsSetElementAt_float213rs_allocationPKDv2_fjjj", (void *)&SC_SetElementAt3_float2, true },
1248    { "_Z21rsSetElementAt_float313rs_allocationPKDv3_fjjj", (void *)&SC_SetElementAt3_float3, true },
1249    { "_Z21rsSetElementAt_float413rs_allocationPKDv4_fjjj", (void *)&SC_SetElementAt3_float4, true },
1250
1251    { "_Z21rsSetElementAt_double13rs_allocationPKdt", (void *)&SC_SetElementAt1_double, true },
1252    { "_Z22rsSetElementAt_double213rs_allocationPKDv2_dj", (void *)&SC_SetElementAt1_double2, true },
1253    { "_Z22rsSetElementAt_double313rs_allocationPKDv3_dj", (void *)&SC_SetElementAt1_double3, true },
1254    { "_Z22rsSetElementAt_double413rs_allocationPKDv4_dj", (void *)&SC_SetElementAt1_double4, true },
1255    { "_Z21rsSetElementAt_double13rs_allocationPKdjj", (void *)&SC_SetElementAt2_double, true },
1256    { "_Z22rsSetElementAt_double213rs_allocationPKDv2_djj", (void *)&SC_SetElementAt2_double2, true },
1257    { "_Z22rsSetElementAt_double313rs_allocationPKDv3_djj", (void *)&SC_SetElementAt2_double3, true },
1258    { "_Z22rsSetElementAt_double413rs_allocationPKDv4_djj", (void *)&SC_SetElementAt2_double4, true },
1259    { "_Z21rsSetElementAt_double13rs_allocationPKdjjj", (void *)&SC_SetElementAt3_double, true },
1260    { "_Z22rsSetElementAt_double213rs_allocationPKDv2_djjj", (void *)&SC_SetElementAt3_double2, true },
1261    { "_Z22rsSetElementAt_double313rs_allocationPKDv3_djjj", (void *)&SC_SetElementAt3_double3, true },
1262    { "_Z22rsSetElementAt_double413rs_allocationPKDv4_djjj", (void *)&SC_SetElementAt3_double4, true },
1263
1264
1265    // Refcounting
1266#ifndef __LP64__
1267    { "_Z11rsSetObjectP10rs_elementS_", (void *)&SC_SetObject, true },
1268    { "_Z10rsIsObject10rs_element", (void *)&SC_IsObject, true },
1269
1270    { "_Z11rsSetObjectP7rs_typeS_", (void *)&SC_SetObject, true },
1271    { "_Z10rsIsObject7rs_type", (void *)&SC_IsObject, true },
1272
1273    { "_Z11rsSetObjectP13rs_allocationS_", (void *)&SC_SetObject, true },
1274    { "_Z10rsIsObject13rs_allocation", (void *)&SC_IsObject, true },
1275
1276    { "_Z11rsSetObjectP10rs_samplerS_", (void *)&SC_SetObject, true },
1277    { "_Z10rsIsObject10rs_sampler", (void *)&SC_IsObject, true },
1278
1279    { "_Z11rsSetObjectP9rs_scriptS_", (void *)&SC_SetObject, true },
1280    { "_Z10rsIsObject9rs_script", (void *)&SC_IsObject, true },
1281#else
1282    { "_Z11rsSetObjectP10rs_elementS_", (void *)&SC_SetObject_ByRef, true },
1283    { "_Z10rsIsObject10rs_element", (void *)&SC_IsObject_ByRef, true },
1284
1285    { "_Z11rsSetObjectP7rs_typeS_", (void *)&SC_SetObject_ByRef, true },
1286    { "_Z10rsIsObject7rs_type", (void *)&SC_IsObject_ByRef, true },
1287
1288    { "_Z11rsSetObjectP13rs_allocationS_", (void *)&SC_SetObject_ByRef, true },
1289    { "_Z10rsIsObject13rs_allocation", (void *)&SC_IsObject_ByRef, true },
1290
1291    { "_Z11rsSetObjectP10rs_samplerS_", (void *)&SC_SetObject_ByRef, true },
1292    { "_Z10rsIsObject10rs_sampler", (void *)&SC_IsObject_ByRef, true },
1293
1294    { "_Z11rsSetObjectP9rs_scriptS_", (void *)&SC_SetObject_ByRef, true },
1295    { "_Z10rsIsObject9rs_script", (void *)&SC_IsObject_ByRef, true },
1296#endif
1297    { "_Z13rsClearObjectP10rs_element", (void *)&SC_ClearObject, true },
1298    { "_Z13rsClearObjectP7rs_type", (void *)&SC_ClearObject, true },
1299    { "_Z13rsClearObjectP13rs_allocation", (void *)&SC_ClearObject, true },
1300    { "_Z13rsClearObjectP10rs_sampler", (void *)&SC_ClearObject, true },
1301    { "_Z13rsClearObjectP9rs_script", (void *)&SC_ClearObject, true },
1302
1303    { "_Z11rsSetObjectP7rs_pathS_", (void *)&SC_SetObject, true },
1304    { "_Z13rsClearObjectP7rs_path", (void *)&SC_ClearObject, true },
1305    { "_Z10rsIsObject7rs_path", (void *)&SC_IsObject, true },
1306
1307    { "_Z11rsSetObjectP7rs_meshS_", (void *)&SC_SetObject, true },
1308    { "_Z13rsClearObjectP7rs_mesh", (void *)&SC_ClearObject, true },
1309    { "_Z10rsIsObject7rs_mesh", (void *)&SC_IsObject, true },
1310
1311    { "_Z11rsSetObjectP19rs_program_fragmentS_", (void *)&SC_SetObject, true },
1312    { "_Z13rsClearObjectP19rs_program_fragment", (void *)&SC_ClearObject, true },
1313    { "_Z10rsIsObject19rs_program_fragment", (void *)&SC_IsObject, true },
1314
1315    { "_Z11rsSetObjectP17rs_program_vertexS_", (void *)&SC_SetObject, true },
1316    { "_Z13rsClearObjectP17rs_program_vertex", (void *)&SC_ClearObject, true },
1317    { "_Z10rsIsObject17rs_program_vertex", (void *)&SC_IsObject, true },
1318
1319    { "_Z11rsSetObjectP17rs_program_rasterS_", (void *)&SC_SetObject, true },
1320    { "_Z13rsClearObjectP17rs_program_raster", (void *)&SC_ClearObject, true },
1321    { "_Z10rsIsObject17rs_program_raster", (void *)&SC_IsObject, true },
1322
1323    { "_Z11rsSetObjectP16rs_program_storeS_", (void *)&SC_SetObject, true },
1324    { "_Z13rsClearObjectP16rs_program_store", (void *)&SC_ClearObject, true },
1325    { "_Z10rsIsObject16rs_program_store", (void *)&SC_IsObject, true },
1326
1327    { "_Z11rsSetObjectP7rs_fontS_", (void *)&SC_SetObject, true },
1328    { "_Z13rsClearObjectP7rs_font", (void *)&SC_ClearObject, true },
1329    { "_Z10rsIsObject7rs_font", (void *)&SC_IsObject, true },
1330
1331    // Allocation ops
1332    { "_Z21rsAllocationMarkDirty13rs_allocation", (void *)&SC_AllocationSyncAll, true },
1333    { "_Z20rsgAllocationSyncAll13rs_allocation", (void *)&SC_AllocationSyncAll, false },
1334    { "_Z20rsgAllocationSyncAll13rs_allocationj", (void *)&SC_AllocationSyncAll2, false },
1335    { "_Z20rsgAllocationSyncAll13rs_allocation24rs_allocation_usage_type", (void *)&SC_AllocationSyncAll2, false },
1336#ifndef RS_COMPATIBILITY_LIB
1337    { "_Z15rsGetAllocationPKv", (void *)&SC_GetAllocation, true },
1338    { "_Z18rsAllocationIoSend13rs_allocation", (void *)&SC_AllocationIoSend, false },
1339    { "_Z21rsAllocationIoReceive13rs_allocation", (void *)&SC_AllocationIoReceive, false },
1340#endif
1341    { "_Z23rsAllocationCopy1DRange13rs_allocationjjjS_jj", (void *)&SC_AllocationCopy1DRange, false },
1342    { "_Z23rsAllocationCopy2DRange13rs_allocationjjj26rs_allocation_cubemap_facejjS_jjjS0_", (void *)&SC_AllocationCopy2DRange, false },
1343
1344    // Messaging
1345
1346    { "_Z14rsSendToClienti", (void *)&SC_ToClient, false },
1347    { "_Z14rsSendToClientiPKvj", (void *)&SC_ToClient2, false },
1348    { "_Z22rsSendToClientBlockingi", (void *)&SC_ToClientBlocking, false },
1349    { "_Z22rsSendToClientBlockingiPKvj", (void *)&SC_ToClientBlocking2, false },
1350#ifndef RS_COMPATIBILITY_LIB
1351    { "_Z22rsgBindProgramFragment19rs_program_fragment", (void *)&SC_BindProgramFragment, false },
1352    { "_Z19rsgBindProgramStore16rs_program_store", (void *)&SC_BindProgramStore, false },
1353    { "_Z20rsgBindProgramVertex17rs_program_vertex", (void *)&SC_BindProgramVertex, false },
1354    { "_Z20rsgBindProgramRaster17rs_program_raster", (void *)&SC_BindProgramRaster, false },
1355    { "_Z14rsgBindSampler19rs_program_fragmentj10rs_sampler", (void *)&SC_BindSampler, false },
1356    { "_Z14rsgBindTexture19rs_program_fragmentj13rs_allocation", (void *)&SC_BindTexture, false },
1357    { "_Z15rsgBindConstant19rs_program_fragmentj13rs_allocation", (void *)&SC_BindFragmentConstant, false },
1358    { "_Z15rsgBindConstant17rs_program_vertexj13rs_allocation", (void *)&SC_BindVertexConstant, false },
1359
1360    { "_Z36rsgProgramVertexLoadProjectionMatrixPK12rs_matrix4x4", (void *)&SC_VpLoadProjectionMatrix, false },
1361    { "_Z31rsgProgramVertexLoadModelMatrixPK12rs_matrix4x4", (void *)&SC_VpLoadModelMatrix, false },
1362    { "_Z33rsgProgramVertexLoadTextureMatrixPK12rs_matrix4x4", (void *)&SC_VpLoadTextureMatrix, false },
1363
1364    { "_Z35rsgProgramVertexGetProjectionMatrixP12rs_matrix4x4", (void *)&SC_VpGetProjectionMatrix, false },
1365
1366    { "_Z31rsgProgramFragmentConstantColor19rs_program_fragmentffff", (void *)&SC_PfConstantColor, false },
1367
1368    { "_Z11rsgGetWidthv", (void *)&SC_GetWidth, false },
1369    { "_Z12rsgGetHeightv", (void *)&SC_GetHeight, false },
1370
1371
1372    { "_Z11rsgDrawRectfffff", (void *)&SC_DrawRect, false },
1373    { "_Z11rsgDrawQuadffffffffffff", (void *)&SC_DrawQuad, false },
1374    { "_Z20rsgDrawQuadTexCoordsffffffffffffffffffff", (void *)&SC_DrawQuadTexCoords, false },
1375    { "_Z24rsgDrawSpriteScreenspacefffff", (void *)&SC_DrawSpriteScreenspace, false },
1376
1377    { "_Z11rsgDrawMesh7rs_mesh", (void *)&SC_DrawMesh, false },
1378    { "_Z11rsgDrawMesh7rs_meshj", (void *)&SC_DrawMeshPrimitive, false },
1379    { "_Z11rsgDrawMesh7rs_meshjjj", (void *)&SC_DrawMeshPrimitiveRange, false },
1380    { "_Z25rsgMeshComputeBoundingBox7rs_meshPfS0_S0_S0_S0_S0_", (void *)&SC_MeshComputeBoundingBox, false },
1381
1382    { "_Z11rsgDrawPath7rs_path", (void *)&SC_DrawPath, false },
1383
1384    { "_Z13rsgClearColorffff", (void *)&SC_ClearColor, false },
1385    { "_Z13rsgClearDepthf", (void *)&SC_ClearDepth, false },
1386
1387    { "_Z11rsgDrawTextPKcii", (void *)&SC_DrawText, false },
1388    { "_Z11rsgDrawText13rs_allocationii", (void *)&SC_DrawTextAlloc, false },
1389    { "_Z14rsgMeasureTextPKcPiS1_S1_S1_", (void *)&SC_MeasureText, false },
1390    { "_Z14rsgMeasureText13rs_allocationPiS0_S0_S0_", (void *)&SC_MeasureTextAlloc, false },
1391
1392    { "_Z11rsgBindFont7rs_font", (void *)&SC_BindFont, false },
1393    { "_Z12rsgFontColorffff", (void *)&SC_FontColor, false },
1394
1395    { "_Z18rsgBindColorTarget13rs_allocationj", (void *)&SC_BindFrameBufferObjectColorTarget, false },
1396    { "_Z18rsgBindDepthTarget13rs_allocation", (void *)&SC_BindFrameBufferObjectDepthTarget, false },
1397    { "_Z19rsgClearColorTargetj", (void *)&SC_ClearFrameBufferObjectColorTarget, false },
1398    { "_Z19rsgClearDepthTargetv", (void *)&SC_ClearFrameBufferObjectDepthTarget, false },
1399    { "_Z24rsgClearAllRenderTargetsv", (void *)&SC_ClearFrameBufferObjectTargets, false },
1400
1401
1402    { "_Z9rsForEach9rs_script13rs_allocationS0_", (void *)&SC_ForEach_SAA, true },
1403    { "_Z9rsForEach9rs_script13rs_allocationS0_PKv", (void *)&SC_ForEach_SAAU, true },
1404    { "_Z9rsForEach9rs_script13rs_allocationS0_PKvPK14rs_script_call", (void *)&SC_ForEach_SAAUS, true },
1405    { "_Z9rsForEach9rs_script13rs_allocationS0_PKvj", (void *)&SC_ForEach_SAAUL, true },
1406    { "_Z9rsForEach9rs_script13rs_allocationS0_PKvjPK14rs_script_call", (void *)&SC_ForEach_SAAULS, true },
1407#endif // RS_COMPATIBILITY_LIB
1408
1409#ifndef __LP64__
1410    // time
1411    { "_Z6rsTimePi", (void *)&SC_Time, true },
1412    { "_Z11rsLocaltimeP5rs_tmPKi", (void *)&SC_LocalTime, true },
1413#else
1414    // time
1415    { "_Z6rsTimePl", (void *)&SC_Time, true },
1416    { "_Z11rsLocaltimeP5rs_tmPKl", (void *)&SC_LocalTime, true },
1417#endif
1418    { "_Z14rsUptimeMillisv", (void*)&SC_UptimeMillis, true },
1419    { "_Z13rsUptimeNanosv", (void*)&SC_UptimeNanos, true },
1420    { "_Z7rsGetDtv", (void*)&SC_GetDt, false },
1421
1422    // misc
1423#ifndef RS_COMPATIBILITY_LIB
1424    { "_Z5colorffff", (void *)&SC_Color, false },
1425    { "_Z9rsgFinishv", (void *)&SC_Finish, false },
1426#endif
1427
1428    { NULL, NULL, false }
1429};
1430
1431#ifdef RS_COMPATIBILITY_LIB
1432
1433//////////////////////////////////////////////////////////////////////////////
1434// Compatibility Library entry points
1435//////////////////////////////////////////////////////////////////////////////
1436
1437#define IS_CLEAR_SET_OBJ(t) \
1438    bool rsIsObject(t src) { \
1439        return src.p != NULL; \
1440    } \
1441    void __attribute__((overloadable)) rsClearObject(t *dst) { \
1442        return SC_ClearObject(reinterpret_cast<rs_object_base *>(dst)); \
1443    } \
1444    void __attribute__((overloadable)) rsSetObject(t *dst, t src) { \
1445        return SC_SetObject(reinterpret_cast<rs_object_base *>(dst), (ObjectBase*)src.p); \
1446    }
1447
1448IS_CLEAR_SET_OBJ(::rs_element)
1449IS_CLEAR_SET_OBJ(::rs_type)
1450IS_CLEAR_SET_OBJ(::rs_allocation)
1451IS_CLEAR_SET_OBJ(::rs_sampler)
1452IS_CLEAR_SET_OBJ(::rs_script)
1453#undef IS_CLEAR_SET_OBJ
1454
1455static void SC_ForEach_SAA(::rs_script target,
1456                           ::rs_allocation in,
1457                           ::rs_allocation out) {
1458    Context *rsc = RsdCpuReference::getTlsContext();
1459    rsrForEach(rsc, (Script*)target.p, (Allocation*)in.p, (Allocation*)out.p, NULL, 0, NULL);
1460}
1461
1462static void SC_ForEach_SAAUS(::rs_script target,
1463                             ::rs_allocation in,
1464                             ::rs_allocation out,
1465                             const void *usr,
1466                             const RsScriptCall *call) {
1467    Context *rsc = RsdCpuReference::getTlsContext();
1468    rsrForEach(rsc, (Script*)target.p, (Allocation*)in.p, (Allocation*)out.p, usr, 0, call);
1469}
1470
1471static void SC_ForEach_SAAUL(::rs_script target,
1472                             ::rs_allocation in,
1473                             ::rs_allocation out,
1474                             const void *usr,
1475                             uint32_t usrLen) {
1476    Context *rsc = RsdCpuReference::getTlsContext();
1477    rsrForEach(rsc, (Script*)target.p, (Allocation*)in.p, (Allocation*)out.p, usr, usrLen, NULL);
1478}
1479
1480static void SC_ForEach_SAAULS(::rs_script target,
1481                              ::rs_allocation in,
1482                              ::rs_allocation out,
1483                              const void *usr,
1484                              uint32_t usrLen,
1485                              const RsScriptCall *call) {
1486    Context *rsc = RsdCpuReference::getTlsContext();
1487    rsrForEach(rsc, (Script*)target.p, (Allocation*)in.p, (Allocation*)out.p, usr, usrLen, call);
1488}
1489
1490static const Allocation * SC_GetAllocation(const void *ptr) {
1491    Context *rsc = RsdCpuReference::getTlsContext();
1492    const Script *sc = RsdCpuReference::getTlsScript();
1493    return rsdScriptGetAllocationForPointer(rsc, sc, ptr);
1494}
1495
1496const Allocation * rsGetAllocation(const void *ptr) {
1497    return SC_GetAllocation(ptr);
1498}
1499
1500void __attribute__((overloadable)) rsAllocationIoSend(::rs_allocation a) {
1501    SC_AllocationIoSend((Allocation *)a.p);
1502}
1503
1504void __attribute__((overloadable)) rsAllocationIoReceive(::rs_allocation a) {
1505    SC_AllocationIoReceive((Allocation *)a.p);
1506}
1507
1508
1509void __attribute__((overloadable)) rsAllocationCopy1DRange(
1510        ::rs_allocation dstAlloc,
1511        uint32_t dstOff, uint32_t dstMip, uint32_t count,
1512        ::rs_allocation srcAlloc,
1513        uint32_t srcOff, uint32_t srcMip) {
1514    SC_AllocationCopy1DRange(dstAlloc, dstOff, dstMip, count,
1515                             srcAlloc, srcOff, srcMip);
1516}
1517
1518void __attribute__((overloadable)) rsAllocationCopy2DRange(
1519        ::rs_allocation dstAlloc,
1520        uint32_t dstXoff, uint32_t dstYoff,
1521        uint32_t dstMip, rs_allocation_cubemap_face dstFace,
1522        uint32_t width, uint32_t height,
1523        ::rs_allocation srcAlloc,
1524        uint32_t srcXoff, uint32_t srcYoff,
1525        uint32_t srcMip, rs_allocation_cubemap_face srcFace) {
1526    SC_AllocationCopy2DRange(dstAlloc, dstXoff, dstYoff,
1527                             dstMip, dstFace, width, height,
1528                             srcAlloc, srcXoff, srcYoff,
1529                             srcMip, srcFace);
1530}
1531
1532void __attribute__((overloadable)) rsForEach(::rs_script script,
1533                                             ::rs_allocation in,
1534                                             ::rs_allocation out,
1535                                             const void *usr,
1536                                             const rs_script_call *call) {
1537    return SC_ForEach_SAAUS(script, in, out, usr, (RsScriptCall*)call);
1538}
1539
1540void __attribute__((overloadable)) rsForEach(::rs_script script,
1541                                             ::rs_allocation in,
1542                                             ::rs_allocation out) {
1543    return SC_ForEach_SAA(script, in, out);
1544}
1545
1546void __attribute__((overloadable)) rsForEach(::rs_script script,
1547                                             ::rs_allocation in,
1548                                             ::rs_allocation out,
1549                                             const void *usr,
1550                                             uint32_t usrLen) {
1551    return SC_ForEach_SAAUL(script, in, out, usr, usrLen);
1552}
1553
1554void __attribute__((overloadable)) rsForEach(::rs_script script,
1555                                             ::rs_allocation in,
1556                                             ::rs_allocation out,
1557                                             const void *usr,
1558                                             uint32_t usrLen,
1559                                             const rs_script_call *call) {
1560    return SC_ForEach_SAAULS(script, in, out, usr, usrLen, (RsScriptCall*)call);
1561}
1562
1563int rsTime(int *timer) {
1564    return SC_Time(timer);
1565}
1566
1567rs_tm* rsLocaltime(rs_tm* local, const int *timer) {
1568    return (rs_tm*)(SC_LocalTime((tm*)local, (long*)timer));
1569}
1570
1571int64_t rsUptimeMillis() {
1572    Context *rsc = RsdCpuReference::getTlsContext();
1573    return rsrUptimeMillis(rsc);
1574}
1575
1576int64_t rsUptimeNanos() {
1577    return SC_UptimeNanos();
1578}
1579
1580float rsGetDt() {
1581    return SC_GetDt();
1582}
1583
1584uint32_t rsSendToClient(int cmdID) {
1585    return SC_ToClient(cmdID);
1586}
1587
1588uint32_t rsSendToClient(int cmdID, const void *data, uint32_t len) {
1589    return SC_ToClient2(cmdID, data, len);
1590}
1591
1592uint32_t rsSendToClientBlocking(int cmdID) {
1593    return SC_ToClientBlocking(cmdID);
1594}
1595
1596uint32_t rsSendToClientBlocking(int cmdID, const void *data, uint32_t len) {
1597    return SC_ToClientBlocking2(cmdID, data, len);
1598}
1599
1600static void SC_debugF(const char *s, float f) {
1601    ALOGD("%s %f, 0x%08x", s, f, *((int *) (&f)));
1602}
1603static void SC_debugFv2(const char *s, float f1, float f2) {
1604    ALOGD("%s {%f, %f}", s, f1, f2);
1605}
1606static void SC_debugFv3(const char *s, float f1, float f2, float f3) {
1607    ALOGD("%s {%f, %f, %f}", s, f1, f2, f3);
1608}
1609static void SC_debugFv4(const char *s, float f1, float f2, float f3, float f4) {
1610    ALOGD("%s {%f, %f, %f, %f}", s, f1, f2, f3, f4);
1611}
1612static void SC_debugF2(const char *s, float2 f) {
1613    ALOGD("%s {%f, %f}", s, f.x, f.y);
1614}
1615static void SC_debugF3(const char *s, float3 f) {
1616    ALOGD("%s {%f, %f, %f}", s, f.x, f.y, f.z);
1617}
1618static void SC_debugF4(const char *s, float4 f) {
1619    ALOGD("%s {%f, %f, %f, %f}", s, f.x, f.y, f.z, f.w);
1620}
1621static void SC_debugD(const char *s, double d) {
1622    ALOGD("%s %f, 0x%08llx", s, d, *((long long *) (&d)));
1623}
1624static void SC_debugFM4v4(const char *s, const float *f) {
1625    ALOGD("%s {%f, %f, %f, %f", s, f[0], f[4], f[8], f[12]);
1626    ALOGD("%s  %f, %f, %f, %f", s, f[1], f[5], f[9], f[13]);
1627    ALOGD("%s  %f, %f, %f, %f", s, f[2], f[6], f[10], f[14]);
1628    ALOGD("%s  %f, %f, %f, %f}", s, f[3], f[7], f[11], f[15]);
1629}
1630static void SC_debugFM3v3(const char *s, const float *f) {
1631    ALOGD("%s {%f, %f, %f", s, f[0], f[3], f[6]);
1632    ALOGD("%s  %f, %f, %f", s, f[1], f[4], f[7]);
1633    ALOGD("%s  %f, %f, %f}",s, f[2], f[5], f[8]);
1634}
1635static void SC_debugFM2v2(const char *s, const float *f) {
1636    ALOGD("%s {%f, %f", s, f[0], f[2]);
1637    ALOGD("%s  %f, %f}",s, f[1], f[3]);
1638}
1639static void SC_debugI8(const char *s, char c) {
1640    ALOGD("%s %hhd  0x%hhx", s, c, (unsigned char)c);
1641}
1642static void SC_debugC2(const char *s, char2 c) {
1643    ALOGD("%s {%hhd, %hhd}  0x%hhx 0x%hhx", s, c.x, c.y, (unsigned char)c.x, (unsigned char)c.y);
1644}
1645static void SC_debugC3(const char *s, char3 c) {
1646    ALOGD("%s {%hhd, %hhd, %hhd}  0x%hhx 0x%hhx 0x%hhx", s, c.x, c.y, c.z, (unsigned char)c.x, (unsigned char)c.y, (unsigned char)c.z);
1647}
1648static void SC_debugC4(const char *s, char4 c) {
1649    ALOGD("%s {%hhd, %hhd, %hhd, %hhd}  0x%hhx 0x%hhx 0x%hhx 0x%hhx", s, c.x, c.y, c.z, c.w, (unsigned char)c.x, (unsigned char)c.y, (unsigned char)c.z, (unsigned char)c.w);
1650}
1651static void SC_debugU8(const char *s, unsigned char c) {
1652    ALOGD("%s %hhu  0x%hhx", s, c, c);
1653}
1654static void SC_debugUC2(const char *s, uchar2 c) {
1655    ALOGD("%s {%hhu, %hhu}  0x%hhx 0x%hhx", s, c.x, c.y, c.x, c.y);
1656}
1657static void SC_debugUC3(const char *s, uchar3 c) {
1658    ALOGD("%s {%hhu, %hhu, %hhu}  0x%hhx 0x%hhx 0x%hhx", s, c.x, c.y, c.z, c.x, c.y, c.z);
1659}
1660static void SC_debugUC4(const char *s, uchar4 c) {
1661    ALOGD("%s {%hhu, %hhu, %hhu, %hhu}  0x%hhx 0x%hhx 0x%hhx 0x%hhx", s, c.x, c.y, c.z, c.w, c.x, c.y, c.z, c.w);
1662}
1663static void SC_debugI16(const char *s, short c) {
1664    ALOGD("%s %hd  0x%hx", s, c, c);
1665}
1666static void SC_debugS2(const char *s, short2 c) {
1667    ALOGD("%s {%hd, %hd}  0x%hx 0x%hx", s, c.x, c.y, c.x, c.y);
1668}
1669static void SC_debugS3(const char *s, short3 c) {
1670    ALOGD("%s {%hd, %hd, %hd}  0x%hx 0x%hx 0x%hx", s, c.x, c.y, c.z, c.x, c.y, c.z);
1671}
1672static void SC_debugS4(const char *s, short4 c) {
1673    ALOGD("%s {%hd, %hd, %hd, %hd}  0x%hx 0x%hx 0x%hx 0x%hx", s, c.x, c.y, c.z, c.w, c.x, c.y, c.z, c.w);
1674}
1675static void SC_debugU16(const char *s, unsigned short c) {
1676    ALOGD("%s %hu  0x%hx", s, c, c);
1677}
1678static void SC_debugUS2(const char *s, ushort2 c) {
1679    ALOGD("%s {%hu, %hu}  0x%hx 0x%hx", s, c.x, c.y, c.x, c.y);
1680}
1681static void SC_debugUS3(const char *s, ushort3 c) {
1682    ALOGD("%s {%hu, %hu, %hu}  0x%hx 0x%hx 0x%hx", s, c.x, c.y, c.z, c.x, c.y, c.z);
1683}
1684static void SC_debugUS4(const char *s, ushort4 c) {
1685    ALOGD("%s {%hu, %hu, %hu, %hu}  0x%hx 0x%hx 0x%hx 0x%hx", s, c.x, c.y, c.z, c.w, c.x, c.y, c.z, c.w);
1686}
1687static void SC_debugI32(const char *s, int32_t i) {
1688    ALOGD("%s %d  0x%x", s, i, i);
1689}
1690static void SC_debugI2(const char *s, int2 i) {
1691    ALOGD("%s {%d, %d}  0x%x 0x%x", s, i.x, i.y, i.x, i.y);
1692}
1693static void SC_debugI3(const char *s, int3 i) {
1694    ALOGD("%s {%d, %d, %d}  0x%x 0x%x 0x%x", s, i.x, i.y, i.z, i.x, i.y, i.z);
1695}
1696static void SC_debugI4(const char *s, int4 i) {
1697    ALOGD("%s {%d, %d, %d, %d}  0x%x 0x%x 0x%x 0x%x", s, i.x, i.y, i.z, i.w, i.x, i.y, i.z, i.w);
1698}
1699static void SC_debugU32(const char *s, uint32_t i) {
1700    ALOGD("%s %u  0x%x", s, i, i);
1701}
1702static void SC_debugUI2(const char *s, uint2 i) {
1703    ALOGD("%s {%u, %u}  0x%x 0x%x", s, i.x, i.y, i.x, i.y);
1704}
1705static void SC_debugUI3(const char *s, uint3 i) {
1706    ALOGD("%s {%u, %u, %u}  0x%x 0x%x 0x%x", s, i.x, i.y, i.z, i.x, i.y, i.z);
1707}
1708static void SC_debugUI4(const char *s, uint4 i) {
1709    ALOGD("%s {%u, %u, %u, %u}  0x%x 0x%x 0x%x 0x%x", s, i.x, i.y, i.z, i.w, i.x, i.y, i.z, i.w);
1710}
1711static void SC_debugLL64(const char *s, long long ll) {
1712    ALOGD("%s %lld  0x%llx", s, ll, ll);
1713}
1714static void SC_debugL2(const char *s, long2 ll) {
1715    ALOGD("%s {%lld, %lld}  0x%llx 0x%llx", s, ll.x, ll.y, ll.x, ll.y);
1716}
1717static void SC_debugL3(const char *s, long3 ll) {
1718    ALOGD("%s {%lld, %lld, %lld}  0x%llx 0x%llx 0x%llx", s, ll.x, ll.y, ll.z, ll.x, ll.y, ll.z);
1719}
1720static void SC_debugL4(const char *s, long4 ll) {
1721    ALOGD("%s {%lld, %lld, %lld, %lld}  0x%llx 0x%llx 0x%llx 0x%llx", s, ll.x, ll.y, ll.z, ll.w, ll.x, ll.y, ll.z, ll.w);
1722}
1723static void SC_debugULL64(const char *s, unsigned long long ll) {
1724    ALOGD("%s %llu  0x%llx", s, ll, ll);
1725}
1726static void SC_debugUL2(const char *s, ulong2 ll) {
1727    ALOGD("%s {%llu, %llu}  0x%llx 0x%llx", s, ll.x, ll.y, ll.x, ll.y);
1728}
1729static void SC_debugUL3(const char *s, ulong3 ll) {
1730    ALOGD("%s {%llu, %llu, %llu}  0x%llx 0x%llx 0x%llx", s, ll.x, ll.y, ll.z, ll.x, ll.y, ll.z);
1731}
1732static void SC_debugUL4(const char *s, ulong4 ll) {
1733    ALOGD("%s {%llu, %llu, %llu, %llu}  0x%llx 0x%llx 0x%llx 0x%llx", s, ll.x, ll.y, ll.z, ll.w, ll.x, ll.y, ll.z, ll.w);
1734}
1735static void SC_debugP(const char *s, const void *p) {
1736    ALOGD("%s %p", s, p);
1737}
1738
1739// TODO: allocation ops, messaging, time
1740
1741void rsDebug(const char *s, float f) {
1742    SC_debugF(s, f);
1743}
1744
1745void rsDebug(const char *s, float f1, float f2) {
1746    SC_debugFv2(s, f1, f2);
1747}
1748
1749void rsDebug(const char *s, float f1, float f2, float f3) {
1750    SC_debugFv3(s, f1, f2, f3);
1751}
1752
1753void rsDebug(const char *s, float f1, float f2, float f3, float f4) {
1754    SC_debugFv4(s, f1, f2, f3, f4);
1755}
1756
1757void rsDebug(const char *s, const float2 *f) {
1758    SC_debugF2(s, *f);
1759}
1760
1761void rsDebug(const char *s, const float3 *f) {
1762    SC_debugF3(s, *f);
1763}
1764
1765void rsDebug(const char *s, const float4 *f) {
1766    SC_debugF4(s, *f);
1767}
1768
1769void rsDebug(const char *s, double d) {
1770    SC_debugD(s, d);
1771}
1772
1773void rsDebug(const char *s, const rs_matrix4x4 *m) {
1774    SC_debugFM4v4(s, (float *) m);
1775}
1776
1777void rsDebug(const char *s, const rs_matrix3x3 *m) {
1778    SC_debugFM3v3(s, (float *) m);
1779}
1780
1781void rsDebug(const char *s, const rs_matrix2x2 *m) {
1782    SC_debugFM2v2(s, (float *) m);
1783}
1784
1785void rsDebug(const char *s, char c) {
1786    SC_debugI8(s, c);
1787}
1788
1789void rsDebug(const char *s, const char2 *c) {
1790    SC_debugC2(s, *c);
1791}
1792
1793void rsDebug(const char *s, const char3 *c) {
1794    SC_debugC3(s, *c);
1795}
1796
1797void rsDebug(const char *s, const char4 *c) {
1798    SC_debugC4(s, *c);
1799}
1800
1801void rsDebug(const char *s, unsigned char c) {
1802    SC_debugU8(s, c);
1803}
1804
1805void rsDebug(const char *s, const uchar2 *c) {
1806    SC_debugUC2(s, *c);
1807}
1808
1809void rsDebug(const char *s, const uchar3 *c) {
1810    SC_debugUC3(s, *c);
1811}
1812
1813void rsDebug(const char *s, const uchar4 *c) {
1814    SC_debugUC4(s, *c);
1815}
1816
1817void rsDebug(const char *s, short c) {
1818    SC_debugI16(s, c);
1819}
1820
1821void rsDebug(const char *s, const short2 *c) {
1822    SC_debugS2(s, *c);
1823}
1824
1825void rsDebug(const char *s, const short3 *c) {
1826    SC_debugS3(s, *c);
1827}
1828
1829void rsDebug(const char *s, const short4 *c) {
1830    SC_debugS4(s, *c);
1831}
1832
1833void rsDebug(const char *s, unsigned short c) {
1834    SC_debugU16(s, c);
1835}
1836
1837void rsDebug(const char *s, const ushort2 *c) {
1838    SC_debugUS2(s, *c);
1839}
1840
1841void rsDebug(const char *s, const ushort3 *c) {
1842    SC_debugUS3(s, *c);
1843}
1844
1845void rsDebug(const char *s, const ushort4 *c) {
1846    SC_debugUS4(s, *c);
1847}
1848
1849void rsDebug(const char *s, int c) {
1850    SC_debugI32(s, c);
1851}
1852
1853void rsDebug(const char *s, const int2 *c) {
1854    SC_debugI2(s, *c);
1855}
1856
1857void rsDebug(const char *s, const int3 *c) {
1858    SC_debugI3(s, *c);
1859}
1860
1861void rsDebug(const char *s, const int4 *c) {
1862    SC_debugI4(s, *c);
1863}
1864
1865void rsDebug(const char *s, unsigned int c) {
1866    SC_debugU32(s, c);
1867}
1868
1869void rsDebug(const char *s, const uint2 *c) {
1870    SC_debugUI2(s, *c);
1871}
1872
1873void rsDebug(const char *s, const uint3 *c) {
1874    SC_debugUI3(s, *c);
1875}
1876
1877void rsDebug(const char *s, const uint4 *c) {
1878    SC_debugUI4(s, *c);
1879}
1880
1881void rsDebug(const char *s, long c) {
1882    SC_debugLL64(s, c);
1883}
1884
1885void rsDebug(const char *s, long long c) {
1886    SC_debugLL64(s, c);
1887}
1888
1889void rsDebug(const char *s, const long2 *c) {
1890    SC_debugL2(s, *c);
1891}
1892
1893void rsDebug(const char *s, const long3 *c) {
1894    SC_debugL3(s, *c);
1895}
1896
1897void rsDebug(const char *s, const long4 *c) {
1898    SC_debugL4(s, *c);
1899}
1900
1901void rsDebug(const char *s, unsigned long c) {
1902    SC_debugULL64(s, c);
1903}
1904
1905void rsDebug(const char *s, unsigned long long c) {
1906    SC_debugULL64(s, c);
1907}
1908
1909void rsDebug(const char *s, const ulong2 *c) {
1910    SC_debugUL2(s, *c);
1911}
1912
1913void rsDebug(const char *s, const ulong3 *c) {
1914    SC_debugUL3(s, *c);
1915}
1916
1917void rsDebug(const char *s, const ulong4 *c) {
1918    SC_debugUL4(s, *c);
1919}
1920
1921// FIXME: We need to export these function signatures for the compatibility
1922// library. The C++ name mangling that LLVM uses for ext_vector_type requires
1923// different versions for "long" vs. "long long". Note that the called
1924// functions are still using the appropriate 64-bit sizes.
1925typedef long l2 __attribute__((ext_vector_type(2)));
1926typedef long l3 __attribute__((ext_vector_type(3)));
1927typedef long l4 __attribute__((ext_vector_type(4)));
1928typedef unsigned long ul2 __attribute__((ext_vector_type(2)));
1929typedef unsigned long ul3 __attribute__((ext_vector_type(3)));
1930typedef unsigned long ul4 __attribute__((ext_vector_type(4)));
1931
1932void rsDebug(const char *s, const l2 *c) {
1933    SC_debugL2(s, *(const long2 *)c);
1934}
1935
1936void rsDebug(const char *s, const l3 *c) {
1937    SC_debugL3(s, *(const long3 *)c);
1938}
1939
1940void rsDebug(const char *s, const l4 *c) {
1941    SC_debugL4(s, *(const long4 *)c);
1942}
1943
1944void rsDebug(const char *s, const ul2 *c) {
1945    SC_debugUL2(s, *(const ulong2 *)c);
1946}
1947
1948void rsDebug(const char *s, const ul3 *c) {
1949    SC_debugUL3(s, *(const ulong3 *)c);
1950}
1951
1952void rsDebug(const char *s, const ul4 *c) {
1953    SC_debugUL4(s, *(const ulong4 *)c);
1954}
1955
1956void rsDebug(const char *s, const void *p) {
1957    SC_debugP(s, p);
1958}
1959#endif // RS_COMPATIBILITY_LIB
1960
1961extern const RsdCpuReference::CpuSymbol * rsdLookupRuntimeStub(Context * pContext, char const* name) {
1962    ScriptC *s = (ScriptC *)pContext;
1963    const RsdCpuReference::CpuSymbol *syms = gSyms;
1964    const RsdCpuReference::CpuSymbol *sym = NULL;
1965
1966    if (!sym) {
1967        while (syms->fnPtr) {
1968            if (!strcmp(syms->name, name)) {
1969                return syms;
1970            }
1971            syms++;
1972        }
1973    }
1974
1975    return NULL;
1976}
1977