rsdRuntimeStubs.cpp revision d8b8f8a16415496acc9844a89599ce7f377bd04d
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
523static const Allocation * SC_GetAllocation(const void *ptr) {
524    Context *rsc = RsdCpuReference::getTlsContext();
525    const Script *sc = RsdCpuReference::getTlsScript();
526    return rsdScriptGetAllocationForPointer(rsc, sc, ptr);
527}
528
529#ifndef RS_COMPATIBILITY_LIB
530#ifndef __LP64__
531static void SC_ForEach_SAA(android::renderscript::rs_script target,
532                            android::renderscript::rs_allocation in,
533                            android::renderscript::rs_allocation out) {
534    Context *rsc = RsdCpuReference::getTlsContext();
535    rsrForEach(rsc, (Script*)target.p, (Allocation*)in.p, (Allocation*)out.p, NULL, 0, NULL);
536}
537#else
538static void SC_ForEach_SAA(android::renderscript::rs_script *target,
539                            android::renderscript::rs_allocation *in,
540                            android::renderscript::rs_allocation *out) {
541    Context *rsc = RsdCpuReference::getTlsContext();
542    rsrForEach(rsc, (Script*)target->p, (Allocation*)in->p, (Allocation*)out->p, NULL, 0, NULL);
543}
544#endif
545
546#ifndef __LP64__
547static void SC_ForEach_SAAU(android::renderscript::rs_script target,
548                            android::renderscript::rs_allocation in,
549                            android::renderscript::rs_allocation out,
550                            const void *usr) {
551    Context *rsc = RsdCpuReference::getTlsContext();
552    rsrForEach(rsc, (Script*)target.p, (Allocation*)in.p, (Allocation*)out.p, usr, 0, NULL);
553}
554#else
555static void SC_ForEach_SAAU(android::renderscript::rs_script *target,
556                            android::renderscript::rs_allocation *in,
557                            android::renderscript::rs_allocation *out,
558                            const void *usr) {
559    Context *rsc = RsdCpuReference::getTlsContext();
560    rsrForEach(rsc, (Script*)target->p, (Allocation*)in->p, (Allocation*)out->p, usr, 0, NULL);
561}
562#endif
563
564#ifndef __LP64__
565static void SC_ForEach_SAAUS(android::renderscript::rs_script target,
566                             android::renderscript::rs_allocation in,
567                             android::renderscript::rs_allocation out,
568                             const void *usr,
569                             const RsScriptCall *call) {
570    Context *rsc = RsdCpuReference::getTlsContext();
571    rsrForEach(rsc, (Script*)target.p, (Allocation*)in.p, (Allocation*)out.p, usr, 0, call);
572}
573#else
574static void SC_ForEach_SAAUS(android::renderscript::rs_script *target,
575                             android::renderscript::rs_allocation *in,
576                             android::renderscript::rs_allocation *out,
577                             const void *usr,
578                             const RsScriptCall *call) {
579    Context *rsc = RsdCpuReference::getTlsContext();
580    rsrForEach(rsc, (Script*)target->p, (Allocation*)in->p, (Allocation*)out->p, usr, 0, call);
581}
582#endif
583
584#ifndef __LP64__
585static void SC_ForEach_SAAUL(android::renderscript::rs_script target,
586                             android::renderscript::rs_allocation in,
587                             android::renderscript::rs_allocation out,
588                             const void *usr,
589                             uint32_t usrLen) {
590    Context *rsc = RsdCpuReference::getTlsContext();
591    rsrForEach(rsc, (Script*)target.p, (Allocation*)in.p, (Allocation*)out.p, usr, usrLen, NULL);
592}
593#else
594static void SC_ForEach_SAAUL(android::renderscript::rs_script *target,
595                             android::renderscript::rs_allocation *in,
596                             android::renderscript::rs_allocation *out,
597                             const void *usr,
598                             uint32_t usrLen) {
599    Context *rsc = RsdCpuReference::getTlsContext();
600    rsrForEach(rsc, (Script*)target->p, (Allocation*)in->p, (Allocation*)out->p, usr, usrLen, NULL);
601}
602#endif
603
604#ifndef __LP64__
605static void SC_ForEach_SAAULS(android::renderscript::rs_script target,
606                              android::renderscript::rs_allocation in,
607                              android::renderscript::rs_allocation out,
608                              const void *usr,
609                              uint32_t usrLen,
610                              const RsScriptCall *call) {
611    Context *rsc = RsdCpuReference::getTlsContext();
612    rsrForEach(rsc, (Script*)target.p, (Allocation*)in.p, (Allocation*)out.p, usr, usrLen, call);
613}
614#else
615static void SC_ForEach_SAAULS(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                              const RsScriptCall *call) {
621    Context *rsc = RsdCpuReference::getTlsContext();
622    rsrForEach(rsc, (Script*)target->p, (Allocation*)in->p, (Allocation*)out->p, usr, usrLen, call);
623}
624#endif
625#endif
626
627
628//////////////////////////////////////////////////////////////////////////////
629// Time routines
630//////////////////////////////////////////////////////////////////////////////
631
632static float SC_GetDt() {
633    Context *rsc = RsdCpuReference::getTlsContext();
634    const Script *sc = RsdCpuReference::getTlsScript();
635    return rsrGetDt(rsc, sc);
636}
637
638#ifndef RS_COMPATIBILITY_LIB
639time_t SC_Time(time_t *timer) {
640    Context *rsc = RsdCpuReference::getTlsContext();
641    return rsrTime(rsc, timer);
642}
643#else
644static int SC_Time(int *timer) {
645    Context *rsc = RsdCpuReference::getTlsContext();
646    return rsrTime(rsc, (long*)timer);
647}
648#endif
649
650tm* SC_LocalTime(tm *local, time_t *timer) {
651    Context *rsc = RsdCpuReference::getTlsContext();
652    return rsrLocalTime(rsc, local, timer);
653}
654
655int64_t SC_UptimeMillis() {
656    Context *rsc = RsdCpuReference::getTlsContext();
657    return rsrUptimeMillis(rsc);
658}
659
660int64_t SC_UptimeNanos() {
661    Context *rsc = RsdCpuReference::getTlsContext();
662    return rsrUptimeNanos(rsc);
663}
664
665//////////////////////////////////////////////////////////////////////////////
666// Message routines
667//////////////////////////////////////////////////////////////////////////////
668
669static uint32_t SC_ToClient2(int cmdID, const void *data, uint32_t len) {
670    Context *rsc = RsdCpuReference::getTlsContext();
671    return rsrToClient(rsc, cmdID, data, len);
672}
673
674static uint32_t SC_ToClient(int cmdID) {
675    Context *rsc = RsdCpuReference::getTlsContext();
676    return rsrToClient(rsc, cmdID, (const void *)NULL, 0);
677}
678
679static uint32_t SC_ToClientBlocking2(int cmdID, const void *data, uint32_t len) {
680    Context *rsc = RsdCpuReference::getTlsContext();
681    return rsrToClientBlocking(rsc, cmdID, data, len);
682}
683
684static uint32_t SC_ToClientBlocking(int cmdID) {
685    Context *rsc = RsdCpuReference::getTlsContext();
686    return rsrToClientBlocking(rsc, cmdID, (const void *)NULL, 0);
687}
688
689
690static void * ElementAt1D(Allocation *a, RsDataType dt, uint32_t vecSize, uint32_t x) {
691    Context *rsc = RsdCpuReference::getTlsContext();
692    const Type *t = a->getType();
693    const Element *e = t->getElement();
694
695    char buf[256];
696    if (x >= t->getLODDimX(0)) {
697        sprintf(buf, "Out range ElementAt X %i of %i", x, t->getLODDimX(0));
698        rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
699        return NULL;
700    }
701
702    if (vecSize > 0) {
703        if (vecSize != e->getVectorSize()) {
704            sprintf(buf, "Vector size mismatch for ElementAt %i of %i", vecSize, e->getVectorSize());
705            rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
706            return NULL;
707        }
708
709        if (dt != e->getType()) {
710            sprintf(buf, "Data type mismatch for ElementAt %i of %i", dt, e->getType());
711            rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
712            return NULL;
713        }
714    }
715
716    uint8_t *p = (uint8_t *)a->mHal.drvState.lod[0].mallocPtr;
717    const uint32_t eSize = e->getSizeBytes();
718    return &p[(eSize * x)];
719}
720
721static void * ElementAt2D(Allocation *a, RsDataType dt, uint32_t vecSize, uint32_t x, uint32_t y) {
722    Context *rsc = RsdCpuReference::getTlsContext();
723    const Type *t = a->getType();
724    const Element *e = t->getElement();
725
726    char buf[256];
727    if (x >= t->getLODDimX(0)) {
728        sprintf(buf, "Out range ElementAt X %i of %i", x, t->getLODDimX(0));
729        rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
730        return NULL;
731    }
732
733    if (y >= t->getLODDimY(0)) {
734        sprintf(buf, "Out range ElementAt Y %i of %i", y, t->getLODDimY(0));
735        rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
736        return NULL;
737    }
738
739    if (vecSize > 0) {
740        if (vecSize != e->getVectorSize()) {
741            sprintf(buf, "Vector size mismatch for ElementAt %i of %i", vecSize, e->getVectorSize());
742            rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
743            return NULL;
744        }
745
746        if (dt != e->getType()) {
747            sprintf(buf, "Data type mismatch for ElementAt %i of %i", dt, e->getType());
748            rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
749            return NULL;
750        }
751    }
752
753    uint8_t *p = (uint8_t *)a->mHal.drvState.lod[0].mallocPtr;
754    const uint32_t eSize = e->getSizeBytes();
755    const uint32_t stride = a->mHal.drvState.lod[0].stride;
756    return &p[(eSize * x) + (y * stride)];
757}
758
759static void * ElementAt3D(Allocation *a, RsDataType dt, uint32_t vecSize, uint32_t x, uint32_t y, uint32_t z) {
760    Context *rsc = RsdCpuReference::getTlsContext();
761    const Type *t = a->getType();
762    const Element *e = t->getElement();
763
764    char buf[256];
765    if (x >= t->getLODDimX(0)) {
766        sprintf(buf, "Out range ElementAt X %i of %i", x, t->getLODDimX(0));
767        rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
768        return NULL;
769    }
770
771    if (y >= t->getLODDimY(0)) {
772        sprintf(buf, "Out range ElementAt Y %i of %i", y, t->getLODDimY(0));
773        rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
774        return NULL;
775    }
776
777    if (z >= t->getLODDimZ(0)) {
778        sprintf(buf, "Out range ElementAt Z %i of %i", z, t->getLODDimZ(0));
779        rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
780        return NULL;
781    }
782
783    if (vecSize > 0) {
784        if (vecSize != e->getVectorSize()) {
785            sprintf(buf, "Vector size mismatch for ElementAt %i of %i", vecSize, e->getVectorSize());
786            rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
787            return NULL;
788        }
789
790        if (dt != e->getType()) {
791            sprintf(buf, "Data type mismatch for ElementAt %i of %i", dt, e->getType());
792            rsc->setError(RS_ERROR_FATAL_DEBUG, buf);
793            return NULL;
794        }
795    }
796
797    uint8_t *p = (uint8_t *)a->mHal.drvState.lod[0].mallocPtr;
798    const uint32_t eSize = e->getSizeBytes();
799    const uint32_t stride = a->mHal.drvState.lod[0].stride;
800    return &p[(eSize * x) + (y * stride)];
801}
802
803static const void * SC_GetElementAt1D(android::renderscript::rs_allocation a, uint32_t x) {
804    return ElementAt1D((Allocation*)a.p, RS_TYPE_UNSIGNED_8, 0, x);
805}
806static const void * SC_GetElementAt2D(android::renderscript::rs_allocation a, uint32_t x, uint32_t y) {
807    return ElementAt2D((Allocation*)a.p, RS_TYPE_UNSIGNED_8, 0, x, y);
808}
809static const void * SC_GetElementAt3D(android::renderscript::rs_allocation a, uint32_t x, uint32_t y, uint32_t z) {
810    return ElementAt3D((Allocation*)a.p, RS_TYPE_UNSIGNED_8, 0, x, y, z);
811}
812
813static void SC_SetElementAt1D(android::renderscript::rs_allocation a, const void *ptr, uint32_t x) {
814    const Type *t = ((Allocation*)a.p)->getType();
815    const Element *e = t->getElement();
816    void *tmp = ElementAt1D((Allocation*)a.p, RS_TYPE_UNSIGNED_8, 0, x);
817    if (tmp != NULL) {
818        memcpy(tmp, ptr, e->getSizeBytes());
819    }
820}
821static void SC_SetElementAt2D(android::renderscript::rs_allocation a, const void *ptr, uint32_t x, uint32_t y) {
822    const Type *t = ((Allocation*)a.p)->getType();
823    const Element *e = t->getElement();
824    void *tmp = ElementAt2D((Allocation*)a.p, RS_TYPE_UNSIGNED_8, 0, x, y);
825    if (tmp != NULL) {
826        memcpy(tmp, ptr, e->getSizeBytes());
827    }
828}
829static void SC_SetElementAt3D(android::renderscript::rs_allocation a, const void *ptr, uint32_t x, uint32_t y, uint32_t z) {
830    const Type *t = ((Allocation*)a.p)->getType();
831    const Element *e = t->getElement();
832    void *tmp = ElementAt3D((Allocation*)a.p, RS_TYPE_UNSIGNED_8, 0, x, y, z);
833    if (tmp != NULL) {
834        memcpy(tmp, ptr, e->getSizeBytes());
835    }
836}
837
838#define ELEMENT_AT(T, DT, VS)                                               \
839    static void SC_SetElementAt1_##T(android::renderscript::rs_allocation a, const T *val, uint32_t x) { \
840        void *r = ElementAt1D((Allocation*)a.p, DT, VS, x);               \
841        if (r != NULL) ((T *)r)[0] = *val;                               \
842        else ALOGE("Error from %s", __PRETTY_FUNCTION__);               \
843    }                                                                   \
844    static void SC_SetElementAt2_##T(android::renderscript::rs_allocation a, const T * val, uint32_t x, uint32_t y) { \
845        void *r = ElementAt2D((Allocation*)a.p, DT, VS, x, y);            \
846        if (r != NULL) ((T *)r)[0] = *val;                               \
847        else ALOGE("Error from %s", __PRETTY_FUNCTION__);               \
848    }                                                                   \
849    static void SC_SetElementAt3_##T(android::renderscript::rs_allocation a, const T * val, uint32_t x, uint32_t y, uint32_t z) { \
850        void *r = ElementAt3D((Allocation*)a.p, DT, VS, x, y, z);         \
851        if (r != NULL) ((T *)r)[0] = *val;                               \
852        else ALOGE("Error from %s", __PRETTY_FUNCTION__);               \
853    }                                                                   \
854    static void SC_GetElementAt1_##T(android::renderscript::rs_allocation a, T *val, uint32_t x) {                  \
855        void *r = ElementAt1D((Allocation*)a.p, DT, VS, x);               \
856        if (r != NULL) *val = ((T *)r)[0];                              \
857        else ALOGE("Error from %s", __PRETTY_FUNCTION__);                    \
858    }                                                                   \
859    static void SC_GetElementAt2_##T(android::renderscript::rs_allocation a, T *val, uint32_t x, uint32_t y) {      \
860        void *r = ElementAt2D((Allocation*)a.p, DT, VS, x, y);            \
861        if (r != NULL) *val = ((T *)r)[0];                              \
862        else ALOGE("Error from %s", __PRETTY_FUNCTION__);                    \
863    }                                                                   \
864    static void SC_GetElementAt3_##T(android::renderscript::rs_allocation a, T *val, uint32_t x, uint32_t y, uint32_t z) { \
865        void *r = ElementAt3D((Allocation*)a.p, DT, VS, x, y, z);         \
866        if (r != NULL) *val = ((T *)r)[0];                              \
867        else ALOGE("Error from %s", __PRETTY_FUNCTION__);                    \
868    }
869
870ELEMENT_AT(char, RS_TYPE_SIGNED_8, 1)
871ELEMENT_AT(char2, RS_TYPE_SIGNED_8, 2)
872ELEMENT_AT(char3, RS_TYPE_SIGNED_8, 3)
873ELEMENT_AT(char4, RS_TYPE_SIGNED_8, 4)
874ELEMENT_AT(uchar, RS_TYPE_UNSIGNED_8, 1)
875ELEMENT_AT(uchar2, RS_TYPE_UNSIGNED_8, 2)
876ELEMENT_AT(uchar3, RS_TYPE_UNSIGNED_8, 3)
877ELEMENT_AT(uchar4, RS_TYPE_UNSIGNED_8, 4)
878ELEMENT_AT(short, RS_TYPE_SIGNED_16, 1)
879ELEMENT_AT(short2, RS_TYPE_SIGNED_16, 2)
880ELEMENT_AT(short3, RS_TYPE_SIGNED_16, 3)
881ELEMENT_AT(short4, RS_TYPE_SIGNED_16, 4)
882ELEMENT_AT(ushort, RS_TYPE_UNSIGNED_16, 1)
883ELEMENT_AT(ushort2, RS_TYPE_UNSIGNED_16, 2)
884ELEMENT_AT(ushort3, RS_TYPE_UNSIGNED_16, 3)
885ELEMENT_AT(ushort4, RS_TYPE_UNSIGNED_16, 4)
886ELEMENT_AT(int, RS_TYPE_SIGNED_32, 1)
887ELEMENT_AT(int2, RS_TYPE_SIGNED_32, 2)
888ELEMENT_AT(int3, RS_TYPE_SIGNED_32, 3)
889ELEMENT_AT(int4, RS_TYPE_SIGNED_32, 4)
890ELEMENT_AT(uint, RS_TYPE_UNSIGNED_32, 1)
891ELEMENT_AT(uint2, RS_TYPE_UNSIGNED_32, 2)
892ELEMENT_AT(uint3, RS_TYPE_UNSIGNED_32, 3)
893ELEMENT_AT(uint4, RS_TYPE_UNSIGNED_32, 4)
894ELEMENT_AT(long, RS_TYPE_SIGNED_64, 1)
895ELEMENT_AT(long2, RS_TYPE_SIGNED_64, 2)
896ELEMENT_AT(long3, RS_TYPE_SIGNED_64, 3)
897ELEMENT_AT(long4, RS_TYPE_SIGNED_64, 4)
898ELEMENT_AT(ulong, RS_TYPE_UNSIGNED_64, 1)
899ELEMENT_AT(ulong2, RS_TYPE_UNSIGNED_64, 2)
900ELEMENT_AT(ulong3, RS_TYPE_UNSIGNED_64, 3)
901ELEMENT_AT(ulong4, RS_TYPE_UNSIGNED_64, 4)
902ELEMENT_AT(float, RS_TYPE_FLOAT_32, 1)
903ELEMENT_AT(float2, RS_TYPE_FLOAT_32, 2)
904ELEMENT_AT(float3, RS_TYPE_FLOAT_32, 3)
905ELEMENT_AT(float4, RS_TYPE_FLOAT_32, 4)
906ELEMENT_AT(double, RS_TYPE_FLOAT_64, 1)
907ELEMENT_AT(double2, RS_TYPE_FLOAT_64, 2)
908ELEMENT_AT(double3, RS_TYPE_FLOAT_64, 3)
909ELEMENT_AT(double4, RS_TYPE_FLOAT_64, 4)
910
911#undef ELEMENT_AT
912
913//////////////////////////////////////////////////////////////////////////////
914// Stub implementation
915//////////////////////////////////////////////////////////////////////////////
916
917// llvm name mangling ref
918//  <builtin-type> ::= v  # void
919//                 ::= b  # bool
920//                 ::= c  # char
921//                 ::= a  # signed char
922//                 ::= h  # unsigned char
923//                 ::= s  # short
924//                 ::= t  # unsigned short
925//                 ::= i  # int
926//                 ::= j  # unsigned int
927//                 ::= l  # long
928//                 ::= m  # unsigned long
929//                 ::= x  # long long, __int64
930//                 ::= y  # unsigned long long, __int64
931//                 ::= f  # float
932//                 ::= d  # double
933
934static RsdCpuReference::CpuSymbol gSyms[] = {
935    // Debug runtime
936    { "_Z14rsGetElementAt13rs_allocationj", (void *)&SC_GetElementAt1D, true },
937    { "_Z14rsGetElementAt13rs_allocationjj", (void *)&SC_GetElementAt2D, true },
938    { "_Z14rsGetElementAt13rs_allocationjjj", (void *)&SC_GetElementAt3D, true },
939    { "_Z14rsSetElementAt13rs_allocationPKvj", (void *)&SC_SetElementAt1D, true },
940    { "_Z14rsSetElementAt13rs_allocationPKvjj", (void *)&SC_SetElementAt2D, true },
941    { "_Z14rsSetElementAt13rs_allocationPKvjjj", (void *)&SC_SetElementAt3D, true },
942
943
944    { "_Z20rsGetElementAt_uchar13rs_allocationPhj", (void *)&SC_GetElementAt1_uchar, true },
945    { "_Z21rsGetElementAt_uchar213rs_allocationPDv2_hj", (void *)&SC_GetElementAt1_uchar2, true },
946    { "_Z21rsGetElementAt_uchar313rs_allocationPDv3_hj", (void *)&SC_GetElementAt1_uchar3, true },
947    { "_Z21rsGetElementAt_uchar413rs_allocationPDv4_hj", (void *)&SC_GetElementAt1_uchar4, true },
948    { "_Z20rsGetElementAt_uchar13rs_allocationPhjj", (void *)&SC_GetElementAt2_uchar, true },
949    { "_Z21rsGetElementAt_uchar213rs_allocationPDv2_hjj", (void *)&SC_GetElementAt2_uchar2, true },
950    { "_Z21rsGetElementAt_uchar313rs_allocationPDv3_hjj", (void *)&SC_GetElementAt2_uchar3, true },
951    { "_Z21rsGetElementAt_uchar413rs_allocationPDv4_hjj", (void *)&SC_GetElementAt2_uchar4, true },
952    { "_Z20rsGetElementAt_uchar13rs_allocationPhjjj", (void *)&SC_GetElementAt3_uchar, true },
953    { "_Z21rsGetElementAt_uchar213rs_allocationPDv2_hjjj", (void *)&SC_GetElementAt3_uchar2, true },
954    { "_Z21rsGetElementAt_uchar313rs_allocationPDv3_hjjj", (void *)&SC_GetElementAt3_uchar3, true },
955    { "_Z21rsGetElementAt_uchar413rs_allocationPDv4_hjjj", (void *)&SC_GetElementAt3_uchar4, true },
956
957    { "_Z19rsGetElementAt_char13rs_allocationPcj", (void *)&SC_GetElementAt1_char, true },
958    { "_Z20rsGetElementAt_char213rs_allocationPDv2_cj", (void *)&SC_GetElementAt1_char2, true },
959    { "_Z20rsGetElementAt_char313rs_allocationPDv3_cj", (void *)&SC_GetElementAt1_char3, true },
960    { "_Z20rsGetElementAt_char413rs_allocationPDv4_cj", (void *)&SC_GetElementAt1_char4, true },
961    { "_Z19rsGetElementAt_char13rs_allocationPcjj", (void *)&SC_GetElementAt2_char, true },
962    { "_Z20rsGetElementAt_char213rs_allocationPDv2_cjj", (void *)&SC_GetElementAt2_char2, true },
963    { "_Z20rsGetElementAt_char313rs_allocationPDv3_cjj", (void *)&SC_GetElementAt2_char3, true },
964    { "_Z20rsGetElementAt_char413rs_allocationPDv4_cjj", (void *)&SC_GetElementAt2_char4, true },
965    { "_Z19rsGetElementAt_char13rs_allocationPcjjj", (void *)&SC_GetElementAt3_char, true },
966    { "_Z20rsGetElementAt_char213rs_allocationPDv2_cjjj", (void *)&SC_GetElementAt3_char2, true },
967    { "_Z20rsGetElementAt_char313rs_allocationPDv3_cjjj", (void *)&SC_GetElementAt3_char3, true },
968    { "_Z20rsGetElementAt_char413rs_allocationPDv4_cjjj", (void *)&SC_GetElementAt3_char4, true },
969
970    { "_Z21rsGetElementAt_ushort13rs_allocationPtj", (void *)&SC_GetElementAt1_ushort, true },
971    { "_Z22rsGetElementAt_ushort213rs_allocationPDv2_tj", (void *)&SC_GetElementAt1_ushort2, true },
972    { "_Z22rsGetElementAt_ushort313rs_allocationPDv3_tj", (void *)&SC_GetElementAt1_ushort3, true },
973    { "_Z22rsGetElementAt_ushort413rs_allocationPDv4_tj", (void *)&SC_GetElementAt1_ushort4, true },
974    { "_Z21rsGetElementAt_ushort13rs_allocationPtjj", (void *)&SC_GetElementAt2_ushort, true },
975    { "_Z22rsGetElementAt_ushort213rs_allocationPDv2_tjj", (void *)&SC_GetElementAt2_ushort2, true },
976    { "_Z22rsGetElementAt_ushort313rs_allocationPDv3_tjj", (void *)&SC_GetElementAt2_ushort3, true },
977    { "_Z22rsGetElementAt_ushort413rs_allocationPDv4_tjj", (void *)&SC_GetElementAt2_ushort4, true },
978    { "_Z21rsGetElementAt_ushort13rs_allocationPtjjj", (void *)&SC_GetElementAt3_ushort, true },
979    { "_Z22rsGetElementAt_ushort213rs_allocationPDv2_tjjj", (void *)&SC_GetElementAt3_ushort2, true },
980    { "_Z22rsGetElementAt_ushort313rs_allocationPDv3_tjjj", (void *)&SC_GetElementAt3_ushort3, true },
981    { "_Z22rsGetElementAt_ushort413rs_allocationPDv4_tjjj", (void *)&SC_GetElementAt3_ushort4, true },
982
983    { "_Z20rsGetElementAt_short13rs_allocationPsj", (void *)&SC_GetElementAt1_short, true },
984    { "_Z21rsGetElementAt_short213rs_allocationPDv2_sj", (void *)&SC_GetElementAt1_short2, true },
985    { "_Z21rsGetElementAt_short313rs_allocationPDv3_sj", (void *)&SC_GetElementAt1_short3, true },
986    { "_Z21rsGetElementAt_short413rs_allocationPDv4_sj", (void *)&SC_GetElementAt1_short4, true },
987    { "_Z20rsGetElementAt_short13rs_allocationPsjj", (void *)&SC_GetElementAt2_short, true },
988    { "_Z21rsGetElementAt_short213rs_allocationPDv2_sjj", (void *)&SC_GetElementAt2_short2, true },
989    { "_Z21rsGetElementAt_short313rs_allocationPDv3_sjj", (void *)&SC_GetElementAt2_short3, true },
990    { "_Z21rsGetElementAt_short413rs_allocationPDv4_sjj", (void *)&SC_GetElementAt2_short4, true },
991    { "_Z20rsGetElementAt_short13rs_allocationPsjjj", (void *)&SC_GetElementAt3_short, true },
992    { "_Z21rsGetElementAt_short213rs_allocationPDv2_sjjj", (void *)&SC_GetElementAt3_short2, true },
993    { "_Z21rsGetElementAt_short313rs_allocationPDv3_sjjj", (void *)&SC_GetElementAt3_short3, true },
994    { "_Z21rsGetElementAt_short413rs_allocationPDv4_sjjj", (void *)&SC_GetElementAt3_short4, true },
995
996    { "_Z19rsGetElementAt_uint13rs_allocationPjj", (void *)&SC_GetElementAt1_uint, true },
997    { "_Z20rsGetElementAt_uint213rs_allocationPDv2_jj", (void *)&SC_GetElementAt1_uint2, true },
998    { "_Z20rsGetElementAt_uint313rs_allocationPDv3_jj", (void *)&SC_GetElementAt1_uint3, true },
999    { "_Z20rsGetElementAt_uint413rs_allocationPDv4_jj", (void *)&SC_GetElementAt1_uint4, true },
1000    { "_Z19rsGetElementAt_uint13rs_allocationPjjj", (void *)&SC_GetElementAt2_uint, true },
1001    { "_Z20rsGetElementAt_uint213rs_allocationPDv2_jjj", (void *)&SC_GetElementAt2_uint2, true },
1002    { "_Z20rsGetElementAt_uint313rs_allocationPDv3_jjj", (void *)&SC_GetElementAt2_uint3, true },
1003    { "_Z20rsGetElementAt_uint413rs_allocationPDv4_jjj", (void *)&SC_GetElementAt2_uint4, true },
1004    { "_Z19rsGetElementAt_uint13rs_allocationPjjjj", (void *)&SC_GetElementAt3_uint, true },
1005    { "_Z20rsGetElementAt_uint213rs_allocationPDv2_jjjj", (void *)&SC_GetElementAt3_uint2, true },
1006    { "_Z20rsGetElementAt_uint313rs_allocationPDv3_jjjj", (void *)&SC_GetElementAt3_uint3, true },
1007    { "_Z20rsGetElementAt_uint413rs_allocationPDv4_jjjj", (void *)&SC_GetElementAt3_uint4, true },
1008
1009    { "_Z18rsGetElementAt_int13rs_allocationPij", (void *)&SC_GetElementAt1_int, true },
1010    { "_Z19rsGetElementAt_int213rs_allocationPDv2_ij", (void *)&SC_GetElementAt1_int2, true },
1011    { "_Z19rsGetElementAt_int313rs_allocationPDv3_ij", (void *)&SC_GetElementAt1_int3, true },
1012    { "_Z19rsGetElementAt_int413rs_allocationPDv4_ij", (void *)&SC_GetElementAt1_int4, true },
1013    { "_Z18rsGetElementAt_int13rs_allocationPijj", (void *)&SC_GetElementAt2_int, true },
1014    { "_Z19rsGetElementAt_int213rs_allocationPDv2_ijj", (void *)&SC_GetElementAt2_int2, true },
1015    { "_Z19rsGetElementAt_int313rs_allocationPDv3_ijj", (void *)&SC_GetElementAt2_int3, true },
1016    { "_Z19rsGetElementAt_int413rs_allocationPDv4_ijj", (void *)&SC_GetElementAt2_int4, true },
1017    { "_Z18rsGetElementAt_int13rs_allocationPijjj", (void *)&SC_GetElementAt3_int, true },
1018    { "_Z19rsGetElementAt_int213rs_allocationPDv2_ijjj", (void *)&SC_GetElementAt3_int2, true },
1019    { "_Z19rsGetElementAt_int313rs_allocationPDv3_ijjj", (void *)&SC_GetElementAt3_int3, true },
1020    { "_Z19rsGetElementAt_int413rs_allocationPDv4_ijjj", (void *)&SC_GetElementAt3_int4, true },
1021
1022    { "_Z20rsGetElementAt_ulong13rs_allocationPmj", (void *)&SC_GetElementAt1_ulong, true },
1023    { "_Z21rsGetElementAt_ulong213rs_allocationPDv2_mj", (void *)&SC_GetElementAt1_ulong2, true },
1024    { "_Z21rsGetElementAt_ulong313rs_allocationPDv3_mj", (void *)&SC_GetElementAt1_ulong3, true },
1025    { "_Z21rsGetElementAt_ulong413rs_allocationPDv4_mj", (void *)&SC_GetElementAt1_ulong4, true },
1026    { "_Z20rsGetElementAt_ulong13rs_allocationPmjj", (void *)&SC_GetElementAt2_ulong, true },
1027    { "_Z21rsGetElementAt_ulong213rs_allocationPDv2_mjj", (void *)&SC_GetElementAt2_ulong2, true },
1028    { "_Z21rsGetElementAt_ulong313rs_allocationPDv3_mjj", (void *)&SC_GetElementAt2_ulong3, true },
1029    { "_Z21rsGetElementAt_ulong413rs_allocationPDv4_mjj", (void *)&SC_GetElementAt2_ulong4, true },
1030    { "_Z20rsGetElementAt_ulong13rs_allocationPmjjj", (void *)&SC_GetElementAt3_ulong, true },
1031    { "_Z21rsGetElementAt_ulong213rs_allocationPDv2_mjjj", (void *)&SC_GetElementAt3_ulong2, true },
1032    { "_Z21rsGetElementAt_ulong313rs_allocationPDv3_mjjj", (void *)&SC_GetElementAt3_ulong3, true },
1033    { "_Z21rsGetElementAt_ulong413rs_allocationPDv4_mjjj", (void *)&SC_GetElementAt3_ulong4, true },
1034
1035    { "_Z19rsGetElementAt_long13rs_allocationPlj", (void *)&SC_GetElementAt1_long, true },
1036    { "_Z20rsGetElementAt_long213rs_allocationPDv2_lj", (void *)&SC_GetElementAt1_long2, true },
1037    { "_Z20rsGetElementAt_long313rs_allocationPDv3_lj", (void *)&SC_GetElementAt1_long3, true },
1038    { "_Z20rsGetElementAt_long413rs_allocationPDv4_lj", (void *)&SC_GetElementAt1_long4, true },
1039    { "_Z19rsGetElementAt_long13rs_allocationPljj", (void *)&SC_GetElementAt2_long, true },
1040    { "_Z20rsGetElementAt_long213rs_allocationPDv2_ljj", (void *)&SC_GetElementAt2_long2, true },
1041    { "_Z20rsGetElementAt_long313rs_allocationPDv3_ljj", (void *)&SC_GetElementAt2_long3, true },
1042    { "_Z20rsGetElementAt_long413rs_allocationPDv4_ljj", (void *)&SC_GetElementAt2_long4, true },
1043    { "_Z19rsGetElementAt_long13rs_allocationPljjj", (void *)&SC_GetElementAt3_long, true },
1044    { "_Z20rsGetElementAt_long213rs_allocationPDv2_ljjj", (void *)&SC_GetElementAt3_long2, true },
1045    { "_Z20rsGetElementAt_long313rs_allocationPDv3_ljjj", (void *)&SC_GetElementAt3_long3, true },
1046    { "_Z20rsGetElementAt_long413rs_allocationPDv4_ljjj", (void *)&SC_GetElementAt3_long4, true },
1047
1048    { "_Z20rsGetElementAt_float13rs_allocationPfj", (void *)&SC_GetElementAt1_float, true },
1049    { "_Z21rsGetElementAt_float213rs_allocationPDv2_fj", (void *)&SC_GetElementAt1_float2, true },
1050    { "_Z21rsGetElementAt_float313rs_allocationPDv3_fj", (void *)&SC_GetElementAt1_float3, true },
1051    { "_Z21rsGetElementAt_float413rs_allocationPDv4_fj", (void *)&SC_GetElementAt1_float4, true },
1052    { "_Z20rsGetElementAt_float13rs_allocationPfjj", (void *)&SC_GetElementAt2_float, true },
1053    { "_Z21rsGetElementAt_float213rs_allocationPDv2_fjj", (void *)&SC_GetElementAt2_float2, true },
1054    { "_Z21rsGetElementAt_float313rs_allocationPDv3_fjj", (void *)&SC_GetElementAt2_float3, true },
1055    { "_Z21rsGetElementAt_float413rs_allocationPDv4_fjj", (void *)&SC_GetElementAt2_float4, true },
1056    { "_Z20rsGetElementAt_float13rs_allocationPfjjj", (void *)&SC_GetElementAt3_float, true },
1057    { "_Z21rsGetElementAt_float213rs_allocationPDv2_fjjj", (void *)&SC_GetElementAt3_float2, true },
1058    { "_Z21rsGetElementAt_float313rs_allocationPDv3_fjjj", (void *)&SC_GetElementAt3_float3, true },
1059    { "_Z21rsGetElementAt_float413rs_allocationPDv4_fjjj", (void *)&SC_GetElementAt3_float4, true },
1060
1061    { "_Z21rsGetElementAt_double13rs_allocationPdj", (void *)&SC_GetElementAt1_double, true },
1062    { "_Z22rsGetElementAt_double213rs_allocationPDv2_dj", (void *)&SC_GetElementAt1_double2, true },
1063    { "_Z22rsGetElementAt_double313rs_allocationPDv3_dj", (void *)&SC_GetElementAt1_double3, true },
1064    { "_Z22rsGetElementAt_double413rs_allocationPDv4_dj", (void *)&SC_GetElementAt1_double4, true },
1065    { "_Z21rsGetElementAt_double13rs_allocationPdjj", (void *)&SC_GetElementAt2_double, true },
1066    { "_Z22rsGetElementAt_double213rs_allocationPDv2_djj", (void *)&SC_GetElementAt2_double2, true },
1067    { "_Z22rsGetElementAt_double313rs_allocationPDv3_djj", (void *)&SC_GetElementAt2_double3, true },
1068    { "_Z22rsGetElementAt_double413rs_allocationPDv4_djj", (void *)&SC_GetElementAt2_double4, true },
1069    { "_Z21rsGetElementAt_double13rs_allocationPdjjj", (void *)&SC_GetElementAt3_double, true },
1070    { "_Z22rsGetElementAt_double213rs_allocationPDv2_djjj", (void *)&SC_GetElementAt3_double2, true },
1071    { "_Z22rsGetElementAt_double313rs_allocationPDv3_djjj", (void *)&SC_GetElementAt3_double3, true },
1072    { "_Z22rsGetElementAt_double413rs_allocationPDv4_djjj", (void *)&SC_GetElementAt3_double4, true },
1073
1074
1075
1076    { "_Z20rsSetElementAt_uchar13rs_allocationPKhj", (void *)&SC_SetElementAt1_uchar, true },
1077    { "_Z21rsSetElementAt_uchar213rs_allocationPKDv2_hj", (void *)&SC_SetElementAt1_uchar2, true },
1078    { "_Z21rsSetElementAt_uchar313rs_allocationPKDv3_hj", (void *)&SC_SetElementAt1_uchar3, true },
1079    { "_Z21rsSetElementAt_uchar413rs_allocationPKDv4_hj", (void *)&SC_SetElementAt1_uchar4, true },
1080    { "_Z20rsSetElementAt_uchar13rs_allocationPKhjj", (void *)&SC_SetElementAt2_uchar, true },
1081    { "_Z21rsSetElementAt_uchar213rs_allocationPKDv2_hjj", (void *)&SC_SetElementAt2_uchar2, true },
1082    { "_Z21rsSetElementAt_uchar313rs_allocationPKDv3_hjj", (void *)&SC_SetElementAt2_uchar3, true },
1083    { "_Z21rsSetElementAt_uchar413rs_allocationPKDv4_hjj", (void *)&SC_SetElementAt2_uchar4, true },
1084    { "_Z20rsSetElementAt_uchar13rs_allocationPKhjjj", (void *)&SC_SetElementAt3_uchar, true },
1085    { "_Z21rsSetElementAt_uchar213rs_allocationPKDv2_hjjj", (void *)&SC_SetElementAt3_uchar2, true },
1086    { "_Z21rsSetElementAt_uchar313rs_allocationPKDv3_hjjj", (void *)&SC_SetElementAt3_uchar3, true },
1087    { "_Z21rsSetElementAt_uchar413rs_allocationPKDv4_hjjj", (void *)&SC_SetElementAt3_uchar4, true },
1088
1089    { "_Z19rsSetElementAt_char13rs_allocationPKcj", (void *)&SC_SetElementAt1_char, true },
1090    { "_Z20rsSetElementAt_char213rs_allocationPKDv2_cj", (void *)&SC_SetElementAt1_char2, true },
1091    { "_Z20rsSetElementAt_char313rs_allocationPKDv3_cj", (void *)&SC_SetElementAt1_char3, true },
1092    { "_Z20rsSetElementAt_char413rs_allocationPKDv4_cj", (void *)&SC_SetElementAt1_char4, true },
1093    { "_Z19rsSetElementAt_char13rs_allocationPKcjj", (void *)&SC_SetElementAt2_char, true },
1094    { "_Z20rsSetElementAt_char213rs_allocationPKDv2_cjj", (void *)&SC_SetElementAt2_char2, true },
1095    { "_Z20rsSetElementAt_char313rs_allocationPKDv3_cjj", (void *)&SC_SetElementAt2_char3, true },
1096    { "_Z20rsSetElementAt_char413rs_allocationPKDv4_cjj", (void *)&SC_SetElementAt2_char4, true },
1097    { "_Z19rsSetElementAt_char13rs_allocationPKcjjj", (void *)&SC_SetElementAt3_char, true },
1098    { "_Z20rsSetElementAt_char213rs_allocationPKDv2_cjjj", (void *)&SC_SetElementAt3_char2, true },
1099    { "_Z20rsSetElementAt_char313rs_allocationPKDv3_cjjj", (void *)&SC_SetElementAt3_char3, true },
1100    { "_Z20rsSetElementAt_char413rs_allocationPKDv4_cjjj", (void *)&SC_SetElementAt3_char4, true },
1101
1102    { "_Z21rsSetElementAt_ushort13rs_allocationPKht", (void *)&SC_SetElementAt1_ushort, true },
1103    { "_Z22rsSetElementAt_ushort213rs_allocationPKDv2_tj", (void *)&SC_SetElementAt1_ushort2, true },
1104    { "_Z22rsSetElementAt_ushort313rs_allocationPKDv3_tj", (void *)&SC_SetElementAt1_ushort3, true },
1105    { "_Z22rsSetElementAt_ushort413rs_allocationPKDv4_tj", (void *)&SC_SetElementAt1_ushort4, true },
1106    { "_Z21rsSetElementAt_ushort13rs_allocationPKtjj", (void *)&SC_SetElementAt2_ushort, true },
1107    { "_Z22rsSetElementAt_ushort213rs_allocationPKDv2_tjj", (void *)&SC_SetElementAt2_ushort2, true },
1108    { "_Z22rsSetElementAt_ushort313rs_allocationPKDv3_tjj", (void *)&SC_SetElementAt2_ushort3, true },
1109    { "_Z22rsSetElementAt_ushort413rs_allocationPKDv4_tjj", (void *)&SC_SetElementAt2_ushort4, true },
1110    { "_Z21rsSetElementAt_ushort13rs_allocationPKtjjj", (void *)&SC_SetElementAt3_ushort, true },
1111    { "_Z22rsSetElementAt_ushort213rs_allocationPKDv2_tjjj", (void *)&SC_SetElementAt3_ushort2, true },
1112    { "_Z22rsSetElementAt_ushort313rs_allocationPKDv3_tjjj", (void *)&SC_SetElementAt3_ushort3, true },
1113    { "_Z22rsSetElementAt_ushort413rs_allocationPKDv4_tjjj", (void *)&SC_SetElementAt3_ushort4, true },
1114
1115    { "_Z20rsSetElementAt_short13rs_allocationPKsj", (void *)&SC_SetElementAt1_short, true },
1116    { "_Z21rsSetElementAt_short213rs_allocationPKDv2_sj", (void *)&SC_SetElementAt1_short2, true },
1117    { "_Z21rsSetElementAt_short313rs_allocationPKDv3_sj", (void *)&SC_SetElementAt1_short3, true },
1118    { "_Z21rsSetElementAt_short413rs_allocationPKDv4_sj", (void *)&SC_SetElementAt1_short4, true },
1119    { "_Z20rsSetElementAt_short13rs_allocationPKsjj", (void *)&SC_SetElementAt2_short, true },
1120    { "_Z21rsSetElementAt_short213rs_allocationPKDv2_sjj", (void *)&SC_SetElementAt2_short2, true },
1121    { "_Z21rsSetElementAt_short313rs_allocationPKDv3_sjj", (void *)&SC_SetElementAt2_short3, true },
1122    { "_Z21rsSetElementAt_short413rs_allocationPKDv4_sjj", (void *)&SC_SetElementAt2_short4, true },
1123    { "_Z20rsSetElementAt_short13rs_allocationPKsjjj", (void *)&SC_SetElementAt3_short, true },
1124    { "_Z21rsSetElementAt_short213rs_allocationPKDv2_sjjj", (void *)&SC_SetElementAt3_short2, true },
1125    { "_Z21rsSetElementAt_short313rs_allocationPKDv3_sjjj", (void *)&SC_SetElementAt3_short3, true },
1126    { "_Z21rsSetElementAt_short413rs_allocationPKDv4_sjjj", (void *)&SC_SetElementAt3_short4, true },
1127
1128    { "_Z19rsSetElementAt_uint13rs_allocationPKjj", (void *)&SC_SetElementAt1_uint, true },
1129    { "_Z20rsSetElementAt_uint213rs_allocationPKDv2_jj", (void *)&SC_SetElementAt1_uint2, true },
1130    { "_Z20rsSetElementAt_uint313rs_allocationPKDv3_jj", (void *)&SC_SetElementAt1_uint3, true },
1131    { "_Z20rsSetElementAt_uint413rs_allocationPKDv4_jj", (void *)&SC_SetElementAt1_uint4, true },
1132    { "_Z19rsSetElementAt_uint13rs_allocationPKjjj", (void *)&SC_SetElementAt2_uint, true },
1133    { "_Z20rsSetElementAt_uint213rs_allocationPKDv2_jjj", (void *)&SC_SetElementAt2_uint2, true },
1134    { "_Z20rsSetElementAt_uint313rs_allocationPKDv3_jjj", (void *)&SC_SetElementAt2_uint3, true },
1135    { "_Z20rsSetElementAt_uint413rs_allocationPKDv4_jjj", (void *)&SC_SetElementAt2_uint4, true },
1136    { "_Z19rsSetElementAt_uint13rs_allocationPKjjjj", (void *)&SC_SetElementAt3_uint, true },
1137    { "_Z20rsSetElementAt_uint213rs_allocationPKDv2_jjjj", (void *)&SC_SetElementAt3_uint2, true },
1138    { "_Z20rsSetElementAt_uint313rs_allocationPKDv3_jjjj", (void *)&SC_SetElementAt3_uint3, true },
1139    { "_Z20rsSetElementAt_uint413rs_allocationPKDv4_jjjj", (void *)&SC_SetElementAt3_uint4, true },
1140
1141    { "_Z18rsSetElementAt_int13rs_allocationPKij", (void *)&SC_SetElementAt1_int, true },
1142    { "_Z19rsSetElementAt_int213rs_allocationPKDv2_ij", (void *)&SC_SetElementAt1_int2, true },
1143    { "_Z19rsSetElementAt_int313rs_allocationPKDv3_ij", (void *)&SC_SetElementAt1_int3, true },
1144    { "_Z19rsSetElementAt_int413rs_allocationPKDv4_ij", (void *)&SC_SetElementAt1_int4, true },
1145    { "_Z18rsSetElementAt_int13rs_allocationPKijj", (void *)&SC_SetElementAt2_int, true },
1146    { "_Z19rsSetElementAt_int213rs_allocationPKDv2_ijj", (void *)&SC_SetElementAt2_int2, true },
1147    { "_Z19rsSetElementAt_int313rs_allocationPKDv3_ijj", (void *)&SC_SetElementAt2_int3, true },
1148    { "_Z19rsSetElementAt_int413rs_allocationPKDv4_ijj", (void *)&SC_SetElementAt2_int4, true },
1149    { "_Z18rsSetElementAt_int13rs_allocationPKijjj", (void *)&SC_SetElementAt3_int, true },
1150    { "_Z19rsSetElementAt_int213rs_allocationPKDv2_ijjj", (void *)&SC_SetElementAt3_int2, true },
1151    { "_Z19rsSetElementAt_int313rs_allocationPKDv3_ijjj", (void *)&SC_SetElementAt3_int3, true },
1152    { "_Z19rsSetElementAt_int413rs_allocationPKDv4_ijjj", (void *)&SC_SetElementAt3_int4, true },
1153
1154    { "_Z20rsSetElementAt_ulong13rs_allocationPKmt", (void *)&SC_SetElementAt1_ulong, true },
1155    { "_Z21rsSetElementAt_ulong213rs_allocationPKDv2_mj", (void *)&SC_SetElementAt1_ulong2, true },
1156    { "_Z21rsSetElementAt_ulong313rs_allocationPKDv3_mj", (void *)&SC_SetElementAt1_ulong3, true },
1157    { "_Z21rsSetElementAt_ulong413rs_allocationPKDv4_mj", (void *)&SC_SetElementAt1_ulong4, true },
1158    { "_Z20rsSetElementAt_ulong13rs_allocationPKmjj", (void *)&SC_SetElementAt2_ulong, true },
1159    { "_Z21rsSetElementAt_ulong213rs_allocationPKDv2_mjj", (void *)&SC_SetElementAt2_ulong2, true },
1160    { "_Z21rsSetElementAt_ulong313rs_allocationPKDv3_mjj", (void *)&SC_SetElementAt2_ulong3, true },
1161    { "_Z21rsSetElementAt_ulong413rs_allocationPKDv4_mjj", (void *)&SC_SetElementAt2_ulong4, true },
1162    { "_Z20rsSetElementAt_ulong13rs_allocationPKmjjj", (void *)&SC_SetElementAt3_ulong, true },
1163    { "_Z21rsSetElementAt_ulong213rs_allocationPKDv2_mjjj", (void *)&SC_SetElementAt3_ulong2, true },
1164    { "_Z21rsSetElementAt_ulong313rs_allocationPKDv3_mjjj", (void *)&SC_SetElementAt3_ulong3, true },
1165    { "_Z21rsSetElementAt_ulong413rs_allocationPKDv4_mjjj", (void *)&SC_SetElementAt3_ulong4, true },
1166
1167    { "_Z19rsSetElementAt_long13rs_allocationPKlj", (void *)&SC_SetElementAt1_long, true },
1168    { "_Z20rsSetElementAt_long213rs_allocationPKDv2_lj", (void *)&SC_SetElementAt1_long2, true },
1169    { "_Z20rsSetElementAt_long313rs_allocationPKDv3_lj", (void *)&SC_SetElementAt1_long3, true },
1170    { "_Z20rsSetElementAt_long413rs_allocationPKDv4_lj", (void *)&SC_SetElementAt1_long4, true },
1171    { "_Z19rsSetElementAt_long13rs_allocationPKljj", (void *)&SC_SetElementAt2_long, true },
1172    { "_Z20rsSetElementAt_long213rs_allocationPKDv2_ljj", (void *)&SC_SetElementAt2_long2, true },
1173    { "_Z20rsSetElementAt_long313rs_allocationPKDv3_ljj", (void *)&SC_SetElementAt2_long3, true },
1174    { "_Z20rsSetElementAt_long413rs_allocationPKDv4_ljj", (void *)&SC_SetElementAt2_long4, true },
1175    { "_Z19rsSetElementAt_long13rs_allocationPKljjj", (void *)&SC_SetElementAt3_long, true },
1176    { "_Z20rsSetElementAt_long213rs_allocationPKDv2_ljjj", (void *)&SC_SetElementAt3_long2, true },
1177    { "_Z20rsSetElementAt_long313rs_allocationPKDv3_ljjj", (void *)&SC_SetElementAt3_long3, true },
1178    { "_Z20rsSetElementAt_long413rs_allocationPKDv4_ljjj", (void *)&SC_SetElementAt3_long4, true },
1179
1180    { "_Z20rsSetElementAt_float13rs_allocationPKft", (void *)&SC_SetElementAt1_float, true },
1181    { "_Z21rsSetElementAt_float213rs_allocationPKDv2_fj", (void *)&SC_SetElementAt1_float2, true },
1182    { "_Z21rsSetElementAt_float313rs_allocationPKDv3_fj", (void *)&SC_SetElementAt1_float3, true },
1183    { "_Z21rsSetElementAt_float413rs_allocationPKDv4_fj", (void *)&SC_SetElementAt1_float4, true },
1184    { "_Z20rsSetElementAt_float13rs_allocationPKfjj", (void *)&SC_SetElementAt2_float, true },
1185    { "_Z21rsSetElementAt_float213rs_allocationPKDv2_fjj", (void *)&SC_SetElementAt2_float2, true },
1186    { "_Z21rsSetElementAt_float313rs_allocationPKDv3_fjj", (void *)&SC_SetElementAt2_float3, true },
1187    { "_Z21rsSetElementAt_float413rs_allocationPKDv4_fjj", (void *)&SC_SetElementAt2_float4, true },
1188    { "_Z20rsSetElementAt_float13rs_allocationPKfjjj", (void *)&SC_SetElementAt3_float, true },
1189    { "_Z21rsSetElementAt_float213rs_allocationPKDv2_fjjj", (void *)&SC_SetElementAt3_float2, true },
1190    { "_Z21rsSetElementAt_float313rs_allocationPKDv3_fjjj", (void *)&SC_SetElementAt3_float3, true },
1191    { "_Z21rsSetElementAt_float413rs_allocationPKDv4_fjjj", (void *)&SC_SetElementAt3_float4, true },
1192
1193    { "_Z21rsSetElementAt_double13rs_allocationPKdt", (void *)&SC_SetElementAt1_double, true },
1194    { "_Z22rsSetElementAt_double213rs_allocationPKDv2_dj", (void *)&SC_SetElementAt1_double2, true },
1195    { "_Z22rsSetElementAt_double313rs_allocationPKDv3_dj", (void *)&SC_SetElementAt1_double3, true },
1196    { "_Z22rsSetElementAt_double413rs_allocationPKDv4_dj", (void *)&SC_SetElementAt1_double4, true },
1197    { "_Z21rsSetElementAt_double13rs_allocationPKdjj", (void *)&SC_SetElementAt2_double, true },
1198    { "_Z22rsSetElementAt_double213rs_allocationPKDv2_djj", (void *)&SC_SetElementAt2_double2, true },
1199    { "_Z22rsSetElementAt_double313rs_allocationPKDv3_djj", (void *)&SC_SetElementAt2_double3, true },
1200    { "_Z22rsSetElementAt_double413rs_allocationPKDv4_djj", (void *)&SC_SetElementAt2_double4, true },
1201    { "_Z21rsSetElementAt_double13rs_allocationPKdjjj", (void *)&SC_SetElementAt3_double, true },
1202    { "_Z22rsSetElementAt_double213rs_allocationPKDv2_djjj", (void *)&SC_SetElementAt3_double2, true },
1203    { "_Z22rsSetElementAt_double313rs_allocationPKDv3_djjj", (void *)&SC_SetElementAt3_double3, true },
1204    { "_Z22rsSetElementAt_double413rs_allocationPKDv4_djjj", (void *)&SC_SetElementAt3_double4, true },
1205
1206
1207    // Refcounting
1208#ifndef __LP64__
1209    { "_Z11rsSetObjectP10rs_elementS_", (void *)&SC_SetObject, true },
1210    { "_Z10rsIsObject10rs_element", (void *)&SC_IsObject, true },
1211
1212    { "_Z11rsSetObjectP7rs_typeS_", (void *)&SC_SetObject, true },
1213    { "_Z10rsIsObject7rs_type", (void *)&SC_IsObject, true },
1214
1215    { "_Z11rsSetObjectP13rs_allocationS_", (void *)&SC_SetObject, true },
1216    { "_Z10rsIsObject13rs_allocation", (void *)&SC_IsObject, true },
1217
1218    { "_Z11rsSetObjectP10rs_samplerS_", (void *)&SC_SetObject, true },
1219    { "_Z10rsIsObject10rs_sampler", (void *)&SC_IsObject, true },
1220
1221    { "_Z11rsSetObjectP9rs_scriptS_", (void *)&SC_SetObject, true },
1222    { "_Z10rsIsObject9rs_script", (void *)&SC_IsObject, true },
1223#else
1224    { "_Z11rsSetObjectP10rs_elementS_", (void *)&SC_SetObject_ByRef, true },
1225    { "_Z10rsIsObject10rs_element", (void *)&SC_IsObject_ByRef, true },
1226
1227    { "_Z11rsSetObjectP7rs_typeS_", (void *)&SC_SetObject_ByRef, true },
1228    { "_Z10rsIsObject7rs_type", (void *)&SC_IsObject_ByRef, true },
1229
1230    { "_Z11rsSetObjectP13rs_allocationS_", (void *)&SC_SetObject_ByRef, true },
1231    { "_Z10rsIsObject13rs_allocation", (void *)&SC_IsObject_ByRef, true },
1232
1233    { "_Z11rsSetObjectP10rs_samplerS_", (void *)&SC_SetObject_ByRef, true },
1234    { "_Z10rsIsObject10rs_sampler", (void *)&SC_IsObject_ByRef, true },
1235
1236    { "_Z11rsSetObjectP9rs_scriptS_", (void *)&SC_SetObject_ByRef, true },
1237    { "_Z10rsIsObject9rs_script", (void *)&SC_IsObject_ByRef, true },
1238#endif
1239    { "_Z13rsClearObjectP10rs_element", (void *)&SC_ClearObject, true },
1240    { "_Z13rsClearObjectP7rs_type", (void *)&SC_ClearObject, true },
1241    { "_Z13rsClearObjectP13rs_allocation", (void *)&SC_ClearObject, true },
1242    { "_Z13rsClearObjectP10rs_sampler", (void *)&SC_ClearObject, true },
1243    { "_Z13rsClearObjectP9rs_script", (void *)&SC_ClearObject, true },
1244
1245    { "_Z11rsSetObjectP7rs_pathS_", (void *)&SC_SetObject, true },
1246    { "_Z13rsClearObjectP7rs_path", (void *)&SC_ClearObject, true },
1247    { "_Z10rsIsObject7rs_path", (void *)&SC_IsObject, true },
1248
1249    { "_Z11rsSetObjectP7rs_meshS_", (void *)&SC_SetObject, true },
1250    { "_Z13rsClearObjectP7rs_mesh", (void *)&SC_ClearObject, true },
1251    { "_Z10rsIsObject7rs_mesh", (void *)&SC_IsObject, true },
1252
1253    { "_Z11rsSetObjectP19rs_program_fragmentS_", (void *)&SC_SetObject, true },
1254    { "_Z13rsClearObjectP19rs_program_fragment", (void *)&SC_ClearObject, true },
1255    { "_Z10rsIsObject19rs_program_fragment", (void *)&SC_IsObject, true },
1256
1257    { "_Z11rsSetObjectP17rs_program_vertexS_", (void *)&SC_SetObject, true },
1258    { "_Z13rsClearObjectP17rs_program_vertex", (void *)&SC_ClearObject, true },
1259    { "_Z10rsIsObject17rs_program_vertex", (void *)&SC_IsObject, true },
1260
1261    { "_Z11rsSetObjectP17rs_program_rasterS_", (void *)&SC_SetObject, true },
1262    { "_Z13rsClearObjectP17rs_program_raster", (void *)&SC_ClearObject, true },
1263    { "_Z10rsIsObject17rs_program_raster", (void *)&SC_IsObject, true },
1264
1265    { "_Z11rsSetObjectP16rs_program_storeS_", (void *)&SC_SetObject, true },
1266    { "_Z13rsClearObjectP16rs_program_store", (void *)&SC_ClearObject, true },
1267    { "_Z10rsIsObject16rs_program_store", (void *)&SC_IsObject, true },
1268
1269    { "_Z11rsSetObjectP7rs_fontS_", (void *)&SC_SetObject, true },
1270    { "_Z13rsClearObjectP7rs_font", (void *)&SC_ClearObject, true },
1271    { "_Z10rsIsObject7rs_font", (void *)&SC_IsObject, true },
1272
1273    // Allocation ops
1274    { "_Z21rsAllocationMarkDirty13rs_allocation", (void *)&SC_AllocationSyncAll, true },
1275    { "_Z20rsgAllocationSyncAll13rs_allocation", (void *)&SC_AllocationSyncAll, false },
1276    { "_Z20rsgAllocationSyncAll13rs_allocationj", (void *)&SC_AllocationSyncAll2, false },
1277    { "_Z20rsgAllocationSyncAll13rs_allocation24rs_allocation_usage_type", (void *)&SC_AllocationSyncAll2, false },
1278    { "_Z15rsGetAllocationPKv", (void *)&SC_GetAllocation, true },
1279#ifndef RS_COMPATIBILITY_LIB
1280    { "_Z18rsAllocationIoSend13rs_allocation", (void *)&SC_AllocationIoSend, false },
1281    { "_Z21rsAllocationIoReceive13rs_allocation", (void *)&SC_AllocationIoReceive, false },
1282#endif
1283    { "_Z23rsAllocationCopy1DRange13rs_allocationjjjS_jj", (void *)&SC_AllocationCopy1DRange, false },
1284    { "_Z23rsAllocationCopy2DRange13rs_allocationjjj26rs_allocation_cubemap_facejjS_jjjS0_", (void *)&SC_AllocationCopy2DRange, false },
1285
1286    // Messaging
1287
1288    { "_Z14rsSendToClienti", (void *)&SC_ToClient, false },
1289    { "_Z14rsSendToClientiPKvj", (void *)&SC_ToClient2, false },
1290    { "_Z22rsSendToClientBlockingi", (void *)&SC_ToClientBlocking, false },
1291    { "_Z22rsSendToClientBlockingiPKvj", (void *)&SC_ToClientBlocking2, false },
1292#ifndef RS_COMPATIBILITY_LIB
1293    { "_Z22rsgBindProgramFragment19rs_program_fragment", (void *)&SC_BindProgramFragment, false },
1294    { "_Z19rsgBindProgramStore16rs_program_store", (void *)&SC_BindProgramStore, false },
1295    { "_Z20rsgBindProgramVertex17rs_program_vertex", (void *)&SC_BindProgramVertex, false },
1296    { "_Z20rsgBindProgramRaster17rs_program_raster", (void *)&SC_BindProgramRaster, false },
1297    { "_Z14rsgBindSampler19rs_program_fragmentj10rs_sampler", (void *)&SC_BindSampler, false },
1298    { "_Z14rsgBindTexture19rs_program_fragmentj13rs_allocation", (void *)&SC_BindTexture, false },
1299    { "_Z15rsgBindConstant19rs_program_fragmentj13rs_allocation", (void *)&SC_BindFragmentConstant, false },
1300    { "_Z15rsgBindConstant17rs_program_vertexj13rs_allocation", (void *)&SC_BindVertexConstant, false },
1301
1302    { "_Z36rsgProgramVertexLoadProjectionMatrixPK12rs_matrix4x4", (void *)&SC_VpLoadProjectionMatrix, false },
1303    { "_Z31rsgProgramVertexLoadModelMatrixPK12rs_matrix4x4", (void *)&SC_VpLoadModelMatrix, false },
1304    { "_Z33rsgProgramVertexLoadTextureMatrixPK12rs_matrix4x4", (void *)&SC_VpLoadTextureMatrix, false },
1305
1306    { "_Z35rsgProgramVertexGetProjectionMatrixP12rs_matrix4x4", (void *)&SC_VpGetProjectionMatrix, false },
1307
1308    { "_Z31rsgProgramFragmentConstantColor19rs_program_fragmentffff", (void *)&SC_PfConstantColor, false },
1309
1310    { "_Z11rsgGetWidthv", (void *)&SC_GetWidth, false },
1311    { "_Z12rsgGetHeightv", (void *)&SC_GetHeight, false },
1312
1313
1314    { "_Z11rsgDrawRectfffff", (void *)&SC_DrawRect, false },
1315    { "_Z11rsgDrawQuadffffffffffff", (void *)&SC_DrawQuad, false },
1316    { "_Z20rsgDrawQuadTexCoordsffffffffffffffffffff", (void *)&SC_DrawQuadTexCoords, false },
1317    { "_Z24rsgDrawSpriteScreenspacefffff", (void *)&SC_DrawSpriteScreenspace, false },
1318
1319    { "_Z11rsgDrawMesh7rs_mesh", (void *)&SC_DrawMesh, false },
1320    { "_Z11rsgDrawMesh7rs_meshj", (void *)&SC_DrawMeshPrimitive, false },
1321    { "_Z11rsgDrawMesh7rs_meshjjj", (void *)&SC_DrawMeshPrimitiveRange, false },
1322    { "_Z25rsgMeshComputeBoundingBox7rs_meshPfS0_S0_S0_S0_S0_", (void *)&SC_MeshComputeBoundingBox, false },
1323
1324    { "_Z11rsgDrawPath7rs_path", (void *)&SC_DrawPath, false },
1325
1326    { "_Z13rsgClearColorffff", (void *)&SC_ClearColor, false },
1327    { "_Z13rsgClearDepthf", (void *)&SC_ClearDepth, false },
1328
1329    { "_Z11rsgDrawTextPKcii", (void *)&SC_DrawText, false },
1330    { "_Z11rsgDrawText13rs_allocationii", (void *)&SC_DrawTextAlloc, false },
1331    { "_Z14rsgMeasureTextPKcPiS1_S1_S1_", (void *)&SC_MeasureText, false },
1332    { "_Z14rsgMeasureText13rs_allocationPiS0_S0_S0_", (void *)&SC_MeasureTextAlloc, false },
1333
1334    { "_Z11rsgBindFont7rs_font", (void *)&SC_BindFont, false },
1335    { "_Z12rsgFontColorffff", (void *)&SC_FontColor, false },
1336
1337    { "_Z18rsgBindColorTarget13rs_allocationj", (void *)&SC_BindFrameBufferObjectColorTarget, false },
1338    { "_Z18rsgBindDepthTarget13rs_allocation", (void *)&SC_BindFrameBufferObjectDepthTarget, false },
1339    { "_Z19rsgClearColorTargetj", (void *)&SC_ClearFrameBufferObjectColorTarget, false },
1340    { "_Z19rsgClearDepthTargetv", (void *)&SC_ClearFrameBufferObjectDepthTarget, false },
1341    { "_Z24rsgClearAllRenderTargetsv", (void *)&SC_ClearFrameBufferObjectTargets, false },
1342
1343
1344    { "_Z9rsForEach9rs_script13rs_allocationS0_", (void *)&SC_ForEach_SAA, true },
1345    { "_Z9rsForEach9rs_script13rs_allocationS0_PKv", (void *)&SC_ForEach_SAAU, true },
1346    { "_Z9rsForEach9rs_script13rs_allocationS0_PKvPK14rs_script_call", (void *)&SC_ForEach_SAAUS, true },
1347    { "_Z9rsForEach9rs_script13rs_allocationS0_PKvj", (void *)&SC_ForEach_SAAUL, true },
1348    { "_Z9rsForEach9rs_script13rs_allocationS0_PKvjPK14rs_script_call", (void *)&SC_ForEach_SAAULS, true },
1349#endif // RS_COMPATIBILITY_LIB
1350
1351#ifndef __LP64__
1352    // time
1353    { "_Z6rsTimePi", (void *)&SC_Time, true },
1354    { "_Z11rsLocaltimeP5rs_tmPKi", (void *)&SC_LocalTime, true },
1355#else
1356    // time
1357    { "_Z6rsTimePl", (void *)&SC_Time, true },
1358    { "_Z11rsLocaltimeP5rs_tmPKl", (void *)&SC_LocalTime, true },
1359#endif
1360    { "_Z14rsUptimeMillisv", (void*)&SC_UptimeMillis, true },
1361    { "_Z13rsUptimeNanosv", (void*)&SC_UptimeNanos, true },
1362    { "_Z7rsGetDtv", (void*)&SC_GetDt, false },
1363
1364    // misc
1365#ifndef RS_COMPATIBILITY_LIB
1366    { "_Z5colorffff", (void *)&SC_Color, false },
1367    { "_Z9rsgFinishv", (void *)&SC_Finish, false },
1368#endif
1369
1370    { NULL, NULL, false }
1371};
1372
1373#ifdef RS_COMPATIBILITY_LIB
1374
1375//////////////////////////////////////////////////////////////////////////////
1376// Compatibility Library entry points
1377//////////////////////////////////////////////////////////////////////////////
1378
1379#define IS_CLEAR_SET_OBJ(t) \
1380    bool rsIsObject(t src) { \
1381        return src.p != NULL; \
1382    } \
1383    void __attribute__((overloadable)) rsClearObject(t *dst) { \
1384        return SC_ClearObject(reinterpret_cast<rs_object_base *>(dst)); \
1385    } \
1386    void __attribute__((overloadable)) rsSetObject(t *dst, t src) { \
1387        return SC_SetObject(reinterpret_cast<rs_object_base *>(dst), (ObjectBase*)src.p); \
1388    }
1389
1390IS_CLEAR_SET_OBJ(::rs_element)
1391IS_CLEAR_SET_OBJ(::rs_type)
1392IS_CLEAR_SET_OBJ(::rs_allocation)
1393IS_CLEAR_SET_OBJ(::rs_sampler)
1394IS_CLEAR_SET_OBJ(::rs_script)
1395#undef IS_CLEAR_SET_OBJ
1396
1397static void SC_ForEach_SAA(::rs_script target,
1398                           ::rs_allocation in,
1399                           ::rs_allocation out) {
1400    Context *rsc = RsdCpuReference::getTlsContext();
1401    rsrForEach(rsc, (Script*)target.p, (Allocation*)in.p, (Allocation*)out.p, NULL, 0, NULL);
1402}
1403
1404static void SC_ForEach_SAAUS(::rs_script target,
1405                             ::rs_allocation in,
1406                             ::rs_allocation out,
1407                             const void *usr,
1408                             const RsScriptCall *call) {
1409    Context *rsc = RsdCpuReference::getTlsContext();
1410    rsrForEach(rsc, (Script*)target.p, (Allocation*)in.p, (Allocation*)out.p, usr, 0, call);
1411}
1412
1413static void SC_ForEach_SAAUL(::rs_script target,
1414                             ::rs_allocation in,
1415                             ::rs_allocation out,
1416                             const void *usr,
1417                             uint32_t usrLen) {
1418    Context *rsc = RsdCpuReference::getTlsContext();
1419    rsrForEach(rsc, (Script*)target.p, (Allocation*)in.p, (Allocation*)out.p, usr, usrLen, NULL);
1420}
1421
1422static void SC_ForEach_SAAULS(::rs_script target,
1423                              ::rs_allocation in,
1424                              ::rs_allocation out,
1425                              const void *usr,
1426                              uint32_t usrLen,
1427                              const RsScriptCall *call) {
1428    Context *rsc = RsdCpuReference::getTlsContext();
1429    rsrForEach(rsc, (Script*)target.p, (Allocation*)in.p, (Allocation*)out.p, usr, usrLen, call);
1430}
1431
1432const Allocation * rsGetAllocation(const void *ptr) {
1433    return SC_GetAllocation(ptr);
1434}
1435
1436void __attribute__((overloadable)) rsAllocationIoSend(::rs_allocation a) {
1437    SC_AllocationIoSend((Allocation *)a.p);
1438}
1439
1440void __attribute__((overloadable)) rsAllocationIoReceive(::rs_allocation a) {
1441    SC_AllocationIoReceive((Allocation *)a.p);
1442}
1443
1444
1445void __attribute__((overloadable)) rsAllocationCopy1DRange(
1446        ::rs_allocation dstAlloc,
1447        uint32_t dstOff, uint32_t dstMip, uint32_t count,
1448        ::rs_allocation srcAlloc,
1449        uint32_t srcOff, uint32_t srcMip) {
1450    SC_AllocationCopy1DRange(dstAlloc, dstOff, dstMip, count,
1451                             srcAlloc, srcOff, srcMip);
1452}
1453
1454void __attribute__((overloadable)) rsAllocationCopy2DRange(
1455        ::rs_allocation dstAlloc,
1456        uint32_t dstXoff, uint32_t dstYoff,
1457        uint32_t dstMip, rs_allocation_cubemap_face dstFace,
1458        uint32_t width, uint32_t height,
1459        ::rs_allocation srcAlloc,
1460        uint32_t srcXoff, uint32_t srcYoff,
1461        uint32_t srcMip, rs_allocation_cubemap_face srcFace) {
1462    SC_AllocationCopy2DRange(dstAlloc, dstXoff, dstYoff,
1463                             dstMip, dstFace, width, height,
1464                             srcAlloc, srcXoff, srcYoff,
1465                             srcMip, srcFace);
1466}
1467
1468void __attribute__((overloadable)) rsForEach(::rs_script script,
1469                                             ::rs_allocation in,
1470                                             ::rs_allocation out,
1471                                             const void *usr,
1472                                             const rs_script_call *call) {
1473    return SC_ForEach_SAAUS(script, in, out, usr, (RsScriptCall*)call);
1474}
1475
1476void __attribute__((overloadable)) rsForEach(::rs_script script,
1477                                             ::rs_allocation in,
1478                                             ::rs_allocation out) {
1479    return SC_ForEach_SAA(script, in, out);
1480}
1481
1482void __attribute__((overloadable)) rsForEach(::rs_script script,
1483                                             ::rs_allocation in,
1484                                             ::rs_allocation out,
1485                                             const void *usr,
1486                                             uint32_t usrLen) {
1487    return SC_ForEach_SAAUL(script, in, out, usr, usrLen);
1488}
1489
1490void __attribute__((overloadable)) rsForEach(::rs_script script,
1491                                             ::rs_allocation in,
1492                                             ::rs_allocation out,
1493                                             const void *usr,
1494                                             uint32_t usrLen,
1495                                             const rs_script_call *call) {
1496    return SC_ForEach_SAAULS(script, in, out, usr, usrLen, (RsScriptCall*)call);
1497}
1498
1499int rsTime(int *timer) {
1500    return SC_Time(timer);
1501}
1502
1503rs_tm* rsLocaltime(rs_tm* local, const int *timer) {
1504    return (rs_tm*)(SC_LocalTime((tm*)local, (long*)timer));
1505}
1506
1507int64_t rsUptimeMillis() {
1508    Context *rsc = RsdCpuReference::getTlsContext();
1509    return rsrUptimeMillis(rsc);
1510}
1511
1512int64_t rsUptimeNanos() {
1513    return SC_UptimeNanos();
1514}
1515
1516float rsGetDt() {
1517    return SC_GetDt();
1518}
1519
1520uint32_t rsSendToClient(int cmdID) {
1521    return SC_ToClient(cmdID);
1522}
1523
1524uint32_t rsSendToClient(int cmdID, const void *data, uint32_t len) {
1525    return SC_ToClient2(cmdID, data, len);
1526}
1527
1528uint32_t rsSendToClientBlocking(int cmdID) {
1529    return SC_ToClientBlocking(cmdID);
1530}
1531
1532uint32_t rsSendToClientBlocking(int cmdID, const void *data, uint32_t len) {
1533    return SC_ToClientBlocking2(cmdID, data, len);
1534}
1535
1536static void SC_debugF(const char *s, float f) {
1537    ALOGD("%s %f, 0x%08x", s, f, *((int *) (&f)));
1538}
1539static void SC_debugFv2(const char *s, float f1, float f2) {
1540    ALOGD("%s {%f, %f}", s, f1, f2);
1541}
1542static void SC_debugFv3(const char *s, float f1, float f2, float f3) {
1543    ALOGD("%s {%f, %f, %f}", s, f1, f2, f3);
1544}
1545static void SC_debugFv4(const char *s, float f1, float f2, float f3, float f4) {
1546    ALOGD("%s {%f, %f, %f, %f}", s, f1, f2, f3, f4);
1547}
1548static void SC_debugF2(const char *s, float2 f) {
1549    ALOGD("%s {%f, %f}", s, f.x, f.y);
1550}
1551static void SC_debugF3(const char *s, float3 f) {
1552    ALOGD("%s {%f, %f, %f}", s, f.x, f.y, f.z);
1553}
1554static void SC_debugF4(const char *s, float4 f) {
1555    ALOGD("%s {%f, %f, %f, %f}", s, f.x, f.y, f.z, f.w);
1556}
1557static void SC_debugD(const char *s, double d) {
1558    ALOGD("%s %f, 0x%08llx", s, d, *((long long *) (&d)));
1559}
1560static void SC_debugFM4v4(const char *s, const float *f) {
1561    ALOGD("%s {%f, %f, %f, %f", s, f[0], f[4], f[8], f[12]);
1562    ALOGD("%s  %f, %f, %f, %f", s, f[1], f[5], f[9], f[13]);
1563    ALOGD("%s  %f, %f, %f, %f", s, f[2], f[6], f[10], f[14]);
1564    ALOGD("%s  %f, %f, %f, %f}", s, f[3], f[7], f[11], f[15]);
1565}
1566static void SC_debugFM3v3(const char *s, const float *f) {
1567    ALOGD("%s {%f, %f, %f", s, f[0], f[3], f[6]);
1568    ALOGD("%s  %f, %f, %f", s, f[1], f[4], f[7]);
1569    ALOGD("%s  %f, %f, %f}",s, f[2], f[5], f[8]);
1570}
1571static void SC_debugFM2v2(const char *s, const float *f) {
1572    ALOGD("%s {%f, %f", s, f[0], f[2]);
1573    ALOGD("%s  %f, %f}",s, f[1], f[3]);
1574}
1575static void SC_debugI8(const char *s, char c) {
1576    ALOGD("%s %hhd  0x%hhx", s, c, (unsigned char)c);
1577}
1578static void SC_debugC2(const char *s, char2 c) {
1579    ALOGD("%s {%hhd, %hhd}  0x%hhx 0x%hhx", s, c.x, c.y, (unsigned char)c.x, (unsigned char)c.y);
1580}
1581static void SC_debugC3(const char *s, char3 c) {
1582    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);
1583}
1584static void SC_debugC4(const char *s, char4 c) {
1585    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);
1586}
1587static void SC_debugU8(const char *s, unsigned char c) {
1588    ALOGD("%s %hhu  0x%hhx", s, c, c);
1589}
1590static void SC_debugUC2(const char *s, uchar2 c) {
1591    ALOGD("%s {%hhu, %hhu}  0x%hhx 0x%hhx", s, c.x, c.y, c.x, c.y);
1592}
1593static void SC_debugUC3(const char *s, uchar3 c) {
1594    ALOGD("%s {%hhu, %hhu, %hhu}  0x%hhx 0x%hhx 0x%hhx", s, c.x, c.y, c.z, c.x, c.y, c.z);
1595}
1596static void SC_debugUC4(const char *s, uchar4 c) {
1597    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);
1598}
1599static void SC_debugI16(const char *s, short c) {
1600    ALOGD("%s %hd  0x%hx", s, c, c);
1601}
1602static void SC_debugS2(const char *s, short2 c) {
1603    ALOGD("%s {%hd, %hd}  0x%hx 0x%hx", s, c.x, c.y, c.x, c.y);
1604}
1605static void SC_debugS3(const char *s, short3 c) {
1606    ALOGD("%s {%hd, %hd, %hd}  0x%hx 0x%hx 0x%hx", s, c.x, c.y, c.z, c.x, c.y, c.z);
1607}
1608static void SC_debugS4(const char *s, short4 c) {
1609    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);
1610}
1611static void SC_debugU16(const char *s, unsigned short c) {
1612    ALOGD("%s %hu  0x%hx", s, c, c);
1613}
1614static void SC_debugUS2(const char *s, ushort2 c) {
1615    ALOGD("%s {%hu, %hu}  0x%hx 0x%hx", s, c.x, c.y, c.x, c.y);
1616}
1617static void SC_debugUS3(const char *s, ushort3 c) {
1618    ALOGD("%s {%hu, %hu, %hu}  0x%hx 0x%hx 0x%hx", s, c.x, c.y, c.z, c.x, c.y, c.z);
1619}
1620static void SC_debugUS4(const char *s, ushort4 c) {
1621    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);
1622}
1623static void SC_debugI32(const char *s, int32_t i) {
1624    ALOGD("%s %d  0x%x", s, i, i);
1625}
1626static void SC_debugI2(const char *s, int2 i) {
1627    ALOGD("%s {%d, %d}  0x%x 0x%x", s, i.x, i.y, i.x, i.y);
1628}
1629static void SC_debugI3(const char *s, int3 i) {
1630    ALOGD("%s {%d, %d, %d}  0x%x 0x%x 0x%x", s, i.x, i.y, i.z, i.x, i.y, i.z);
1631}
1632static void SC_debugI4(const char *s, int4 i) {
1633    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);
1634}
1635static void SC_debugU32(const char *s, uint32_t i) {
1636    ALOGD("%s %u  0x%x", s, i, i);
1637}
1638static void SC_debugUI2(const char *s, uint2 i) {
1639    ALOGD("%s {%u, %u}  0x%x 0x%x", s, i.x, i.y, i.x, i.y);
1640}
1641static void SC_debugUI3(const char *s, uint3 i) {
1642    ALOGD("%s {%u, %u, %u}  0x%x 0x%x 0x%x", s, i.x, i.y, i.z, i.x, i.y, i.z);
1643}
1644static void SC_debugUI4(const char *s, uint4 i) {
1645    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);
1646}
1647static void SC_debugLL64(const char *s, long long ll) {
1648    ALOGD("%s %lld  0x%llx", s, ll, ll);
1649}
1650static void SC_debugL2(const char *s, long2 ll) {
1651    ALOGD("%s {%lld, %lld}  0x%llx 0x%llx", s, ll.x, ll.y, ll.x, ll.y);
1652}
1653static void SC_debugL3(const char *s, long3 ll) {
1654    ALOGD("%s {%lld, %lld, %lld}  0x%llx 0x%llx 0x%llx", s, ll.x, ll.y, ll.z, ll.x, ll.y, ll.z);
1655}
1656static void SC_debugL4(const char *s, long4 ll) {
1657    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);
1658}
1659static void SC_debugULL64(const char *s, unsigned long long ll) {
1660    ALOGD("%s %llu  0x%llx", s, ll, ll);
1661}
1662static void SC_debugUL2(const char *s, ulong2 ll) {
1663    ALOGD("%s {%llu, %llu}  0x%llx 0x%llx", s, ll.x, ll.y, ll.x, ll.y);
1664}
1665static void SC_debugUL3(const char *s, ulong3 ll) {
1666    ALOGD("%s {%llu, %llu, %llu}  0x%llx 0x%llx 0x%llx", s, ll.x, ll.y, ll.z, ll.x, ll.y, ll.z);
1667}
1668static void SC_debugUL4(const char *s, ulong4 ll) {
1669    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);
1670}
1671static void SC_debugP(const char *s, const void *p) {
1672    ALOGD("%s %p", s, p);
1673}
1674
1675// TODO: allocation ops, messaging, time
1676
1677void rsDebug(const char *s, float f) {
1678    SC_debugF(s, f);
1679}
1680
1681void rsDebug(const char *s, float f1, float f2) {
1682    SC_debugFv2(s, f1, f2);
1683}
1684
1685void rsDebug(const char *s, float f1, float f2, float f3) {
1686    SC_debugFv3(s, f1, f2, f3);
1687}
1688
1689void rsDebug(const char *s, float f1, float f2, float f3, float f4) {
1690    SC_debugFv4(s, f1, f2, f3, f4);
1691}
1692
1693void rsDebug(const char *s, const float2 *f) {
1694    SC_debugF2(s, *f);
1695}
1696
1697void rsDebug(const char *s, const float3 *f) {
1698    SC_debugF3(s, *f);
1699}
1700
1701void rsDebug(const char *s, const float4 *f) {
1702    SC_debugF4(s, *f);
1703}
1704
1705void rsDebug(const char *s, double d) {
1706    SC_debugD(s, d);
1707}
1708
1709void rsDebug(const char *s, const rs_matrix4x4 *m) {
1710    SC_debugFM4v4(s, (float *) m);
1711}
1712
1713void rsDebug(const char *s, const rs_matrix3x3 *m) {
1714    SC_debugFM3v3(s, (float *) m);
1715}
1716
1717void rsDebug(const char *s, const rs_matrix2x2 *m) {
1718    SC_debugFM2v2(s, (float *) m);
1719}
1720
1721void rsDebug(const char *s, char c) {
1722    SC_debugI8(s, c);
1723}
1724
1725void rsDebug(const char *s, const char2 *c) {
1726    SC_debugC2(s, *c);
1727}
1728
1729void rsDebug(const char *s, const char3 *c) {
1730    SC_debugC3(s, *c);
1731}
1732
1733void rsDebug(const char *s, const char4 *c) {
1734    SC_debugC4(s, *c);
1735}
1736
1737void rsDebug(const char *s, unsigned char c) {
1738    SC_debugU8(s, c);
1739}
1740
1741void rsDebug(const char *s, const uchar2 *c) {
1742    SC_debugUC2(s, *c);
1743}
1744
1745void rsDebug(const char *s, const uchar3 *c) {
1746    SC_debugUC3(s, *c);
1747}
1748
1749void rsDebug(const char *s, const uchar4 *c) {
1750    SC_debugUC4(s, *c);
1751}
1752
1753void rsDebug(const char *s, short c) {
1754    SC_debugI16(s, c);
1755}
1756
1757void rsDebug(const char *s, const short2 *c) {
1758    SC_debugS2(s, *c);
1759}
1760
1761void rsDebug(const char *s, const short3 *c) {
1762    SC_debugS3(s, *c);
1763}
1764
1765void rsDebug(const char *s, const short4 *c) {
1766    SC_debugS4(s, *c);
1767}
1768
1769void rsDebug(const char *s, unsigned short c) {
1770    SC_debugU16(s, c);
1771}
1772
1773void rsDebug(const char *s, const ushort2 *c) {
1774    SC_debugUS2(s, *c);
1775}
1776
1777void rsDebug(const char *s, const ushort3 *c) {
1778    SC_debugUS3(s, *c);
1779}
1780
1781void rsDebug(const char *s, const ushort4 *c) {
1782    SC_debugUS4(s, *c);
1783}
1784
1785void rsDebug(const char *s, int c) {
1786    SC_debugI32(s, c);
1787}
1788
1789void rsDebug(const char *s, const int2 *c) {
1790    SC_debugI2(s, *c);
1791}
1792
1793void rsDebug(const char *s, const int3 *c) {
1794    SC_debugI3(s, *c);
1795}
1796
1797void rsDebug(const char *s, const int4 *c) {
1798    SC_debugI4(s, *c);
1799}
1800
1801void rsDebug(const char *s, unsigned int c) {
1802    SC_debugU32(s, c);
1803}
1804
1805void rsDebug(const char *s, const uint2 *c) {
1806    SC_debugUI2(s, *c);
1807}
1808
1809void rsDebug(const char *s, const uint3 *c) {
1810    SC_debugUI3(s, *c);
1811}
1812
1813void rsDebug(const char *s, const uint4 *c) {
1814    SC_debugUI4(s, *c);
1815}
1816
1817void rsDebug(const char *s, long c) {
1818    SC_debugLL64(s, c);
1819}
1820
1821void rsDebug(const char *s, long long c) {
1822    SC_debugLL64(s, c);
1823}
1824
1825void rsDebug(const char *s, const long2 *c) {
1826    SC_debugL2(s, *c);
1827}
1828
1829void rsDebug(const char *s, const long3 *c) {
1830    SC_debugL3(s, *c);
1831}
1832
1833void rsDebug(const char *s, const long4 *c) {
1834    SC_debugL4(s, *c);
1835}
1836
1837void rsDebug(const char *s, unsigned long c) {
1838    SC_debugULL64(s, c);
1839}
1840
1841void rsDebug(const char *s, unsigned long long c) {
1842    SC_debugULL64(s, c);
1843}
1844
1845void rsDebug(const char *s, const ulong2 *c) {
1846    SC_debugUL2(s, *c);
1847}
1848
1849void rsDebug(const char *s, const ulong3 *c) {
1850    SC_debugUL3(s, *c);
1851}
1852
1853void rsDebug(const char *s, const ulong4 *c) {
1854    SC_debugUL4(s, *c);
1855}
1856
1857// FIXME: We need to export these function signatures for the compatibility
1858// library. The C++ name mangling that LLVM uses for ext_vector_type requires
1859// different versions for "long" vs. "long long". Note that the called
1860// functions are still using the appropriate 64-bit sizes.
1861typedef long l2 __attribute__((ext_vector_type(2)));
1862typedef long l3 __attribute__((ext_vector_type(3)));
1863typedef long l4 __attribute__((ext_vector_type(4)));
1864typedef unsigned long ul2 __attribute__((ext_vector_type(2)));
1865typedef unsigned long ul3 __attribute__((ext_vector_type(3)));
1866typedef unsigned long ul4 __attribute__((ext_vector_type(4)));
1867
1868void rsDebug(const char *s, const l2 *c) {
1869    SC_debugL2(s, *(const long2 *)c);
1870}
1871
1872void rsDebug(const char *s, const l3 *c) {
1873    SC_debugL3(s, *(const long3 *)c);
1874}
1875
1876void rsDebug(const char *s, const l4 *c) {
1877    SC_debugL4(s, *(const long4 *)c);
1878}
1879
1880void rsDebug(const char *s, const ul2 *c) {
1881    SC_debugUL2(s, *(const ulong2 *)c);
1882}
1883
1884void rsDebug(const char *s, const ul3 *c) {
1885    SC_debugUL3(s, *(const ulong3 *)c);
1886}
1887
1888void rsDebug(const char *s, const ul4 *c) {
1889    SC_debugUL4(s, *(const ulong4 *)c);
1890}
1891
1892void rsDebug(const char *s, const void *p) {
1893    SC_debugP(s, p);
1894}
1895#endif // RS_COMPATIBILITY_LIB
1896
1897extern const RsdCpuReference::CpuSymbol * rsdLookupRuntimeStub(Context * pContext, char const* name) {
1898    ScriptC *s = (ScriptC *)pContext;
1899    const RsdCpuReference::CpuSymbol *syms = gSyms;
1900    const RsdCpuReference::CpuSymbol *sym = NULL;
1901
1902    if (!sym) {
1903        while (syms->fnPtr) {
1904            if (!strcmp(syms->name, name)) {
1905                return syms;
1906            }
1907            syms++;
1908        }
1909    }
1910
1911    return NULL;
1912}
1913